skills/boilersync-template/SKILL.md
Use this skill when users ask about BoilerSync template creation, template syntax, .starter or .boilersync files, template inheritance, or BoilerSync init/pull/push workflows.
npx skillsauth add montaguegabe/boilersync-skills boilersync-templateInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
BoilerSync scaffolds projects from templates and keeps template and project evolution in sync with init, pull, and push.
# Clone template source repo into local cache
boilersync templates init https://github.com/your-org/your-templates.git
# Initialize a project from a source-qualified template
boilersync init your-org/your-templates#python/service-template
# Initialize a well-defaulted template without prompts
mkdir my-app-workspace
cd my-app-workspace
boilersync init your-org/your-templates#python/service-template --non-interactive
# Pull template updates later
boilersync pull
# Push committed project changes back to template source
boilersync push
boilersync init TEMPLATE_REF: first-time project generation (empty target directory)boilersync init TEMPLATE_REF --non-interactive: generate without prompts when the template supplies defaults for every required variableboilersync pull [TEMPLATE_REF]: apply template changes to an existing projectboilersync push: promote committed project changes back to template sourceboilersync templates init: clone/register template source repos into local cacheboilersync templates details TEMPLATE_REF [--json]: inspect effective template inputs after inheritance is resolvedboilersync init supports non-interactive mode via --non-interactive (alias: --no-input).
Before unattended init, inspect the template inputs:
boilersync templates details your-org/your-templates#python/service-template --json
Use this pattern when an AI agent or CI job must never block on prompts:
boilersync init your-org/your-templates#python/service-template \
--non-interactive \
--var name_snake=my_service \
--var name_pretty="My Service" \
--var author_name="Jane Doe" \
--var author_email="[email protected]"
Rules:
--non-interactive for unattended execution.name_snake and name_pretty.--var KEY=VALUE flags.template.json defaults for values that can be derived from project naming, so agents and CI can use fewer --var flags.Preferred source-qualified references:
org/repo#subdirhttps://github.com/org/repo#subdirhttps://github.com/org/repo.git#subdirTemplate cache root defaults to ~/.boilersync/templates (or BOILERSYNC_TEMPLATE_DIR).
GitHub is the only supported host for URL references.
BoilerSync writes .boilersync metadata in project roots after scaffold/pull so future operations can resolve template provenance.
Canonical .boilersync shape:
{
"template": "https://github.com/org/repo.git#subdir",
"name_snake": "project_name",
"name_pretty": "Project Name",
"variables": {},
"children": []
}
source metadata is no longer used.
This directory contains project templates for generating new codebases with boilersync.
To create a new boilersync template, create a template directory here with your template files. There is no required structure, but the files in the template directory can contain interpolation slots using the template syntax explained in the following section.
./my-template/
├── ... (template files) ...
├── README.starter.md
└── template.json # Required template metadata
Use $${variable_name} for variable substitution in file contents:
from $${name_snake}.cli import main
class $${name_pascal}Config(AppConfig):
"""$${name_pretty} - $${description}"""
Common variables:
$${name_snake}, $${name_kebab}, $${name_pascal}, $${name_pretty} - Project name in various formats$${author_name}, $${author_email}, $${author_github_name} - Author info$${description} - Project description$${python_version} - Python version requirementBrowse existing templates for other available variables before adding a new one - an existing template may already include the variable you are looking for. If it does not exist already, you may simply add a new one by using it; boilersync will adapt, and there is no need to declare it elsewhere.
To use a variable in a filename or directory name, convert it to ALL CAPS:
| Variable | Filename Form |
|----------|---------------|
| $${name_snake} | NAME_SNAKE |
| $${name_kebab} | NAME_KEBAB |
Example:
/cli/NAME_SNAKE/__init__.py → /my_project/__init__.py
.starterTemplate files with .starter in the extension are included in the initial boilersync generation but are not kept in sync with the template afterwards. Use this for files the user is expected to modify:
cli.starter.py → cli.py (generated once, then user-owned)README.starter.md → README.md (user is expected to add more details to the README later)Files without .starter remain linked to the template. When you run boilersync push, modifications to these files can update the template.
.boilersyncAdding .boilersync to any filename prevents auto-formatters from corrupting template syntax. The extension is stripped during processing:
pyproject.toml.boilersync → pyproject.tomlUse template.json to extend another template:
{
"extends": "pip-package"
}
Child templates inherit all files from the parent.
template.json)In addition to inheritance, template.json can define defaults and runtime behavior:
defaults: default values for interpolation variables, applied before missing-variable collectionchildren: initialize child templates during boilersync inithooks: run shell commands with pre_init and post_initgithub: optional GitHub repository creation settingsskip_git: skip local git initialization when trueTemplate defaults may be literal values or $${...} / Jinja-rendered strings. Existing values win, so explicit --var values, saved project metadata, and earlier inherited-template defaults are not overwritten. Defaults are saved into generated project .boilersync metadata after init or pull.
Useful default patterns:
{
"defaults": {
"api_package_name": "$${name_snake}_api",
"django_app_name": "$${name_snake}",
"web_package_name": "$${name_kebab}-web",
"api_client_package_name": "$${name_kebab}-api-client",
"api_client_export_name": "$${name_camel}",
"cdn_base_url": "https://cdn.openbase.app/$${name_kebab}/",
"with_frontend": true
}
}
BoilerSync infers the default project name from the target folder. A trailing -workspace / _workspace suffix is stripped, so woo-score-workspace defaults to name_snake=woo_score. Override with --var name_snake=... when needed.
If a template references github_user and the value is not supplied, BoilerSync tries gh api user --jq .login. If the GitHub CLI is unavailable or unauthenticated, github_user remains a required variable and interactive prompting or --var github_user=... is still needed.
Hook step fields:
id (optional): log identifierrun (required): shell command to executecondition (optional): boolean expression to gate executioncwd (optional): working directory relative to target directoryenv (optional): env var map; values support $${...} interpolationallow_failure (optional): continue on non-zero exit code when trueExample:
{
"hooks": {
"pre_init": [
{
"id": "deps",
"run": "uv sync"
}
],
"post_init": [
{
"id": "format",
"run": "uv run ruff format .",
"allow_failure": true
}
]
}
}
Templates support Jinja2-style blocks for composable inheritance:
$${% block scripts %}
$${ super() }
$${cli_command} = "$${name_snake}.cli:main"
$${% endblock %}
$${% block name %}...$${% endblock %} - Define overridable blocks in the parent template.$${ super() } - Include parent block content$${% if condition %}...$${% endif %} - Conditional contenttools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.