Agent skill

Template Dev

by lbedner in lbedner/aegis-stack

A skill your agent uses when developing or modifying Copier templates in aegis/templates, or backporting a change from a generated project (e.g.

MITAuto-check passedDevelopment

Install Template Dev

skills CLI
$ npx skills add lbedner/aegis-stack --skill template-dev -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install lbedner/aegis-stack template-dev --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/lbedner/aegis-stack.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/template-dev .claude/skills/template-dev && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
template-dev
GitHub stars
143
Token cost
~2.9k tokens
SKILL.md length
1,456 words
Files
1
Skills in repo
9
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when developing or modifying Copier templates in aegis/templates, or backporting a change from a generated project (e.g.

  • Works in 4 steps: Edit the file(s) directly under → Generate a test project with aegis init… → Verify the generated project behaves as… → …
  • Modifying Copier templates in aegis/templates
  • SKILL.md covers When to use, Files that change, Who owns a template file and Procedure, plus 2 more sections
  • Calls make and uv

What it does

Template Dev is an agent skill from lbedner/aegis-stack. Use when developing or modifying Copier templates in aegis/templates, or backporting a change from a generated project (e.g. a prototype scratch project) back into the templates. Covers the two development workflows, the three rendering modes that resolve where Copier reads template content from, and the template-specific gotchas that silently break generation or update.

Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Project scaffolding. It works with Docker and FastAPI. The repository describes itself as: A production-ready FastAPI platform with modular components and a built-in control plane. The licence is MIT.

When your agent uses it

  • Modifying Copier templates in aegis/templates
  • Backporting a change from a generated project (e.g

Example prompts

  • “/template-dev”

Requirements

  • Python 3
  • Docker

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. Edit the file(s) directly under
  2. Generate a test project with aegis init test-project --dev (working
  3. Verify the generated project behaves as expected.
  4. Clean up with make clean-test-projects.

What it can do on your machine

Read from SKILL.md and the folder at commit c8cbfad. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • make
    • uv

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use uv, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Template Dev loads about 2.9k tokens when it runs. Until then it costs about 97 tokens; SKILL.md has 1,456 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~97
When it runs · the whole SKILL.md, loaded when a task matches
~2.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from lbedner/aegis-stack at commit c8cbfad, republished under its MIT licence (© lbedner). 1,456 words, ~2,946 tokens.

Download SKILL.mdSave it as .claude/skills/template-dev/SKILL.md (or your agent's skills folder).
name
template-dev
description
Use when developing or modifying Copier templates in aegis/templates, or backporting a change from a generated project (e.g. a prototype scratch project) back into the templates. Covers the two development workflows, the three rendering modes that resolve where Copier reads template content from, and the template-specific gotchas that silently break generation or update.

Template dev

Develops and backports changes to the Copier templates that every generated Aegis Stack project is rendered from. This is the general template-editing workflow: how to iterate, how rendering picks up (or ignores) your edits, and the traps that only show up on aegis update, not on a fresh aegis init.

When to use

Use when the task touches template content directly (docker-compose.yml.jinja, Makefile.jinja, any file under app/, pyproject.toml.jinja, copier.yml, etc.) or when a fix was made inside a generated project and needs to be carried back into the templates.

Do NOT use this skill for adding a brand-new component or service (a ComponentSpec/ServiceSpec entry, its FileManifest, and its generation/update plumbing) - use the add-component or add-service skill instead; they cover the plugin-spec registry work this skill assumes is already done. Do NOT use for ordinary feature work inside the CLI tool itself (aegis/commands/, aegis/core/ logic unrelated to rendering) unless that work is specifically about how templates render or update.

Files that change

Source-of-truth law: templates ship, generated projects are prototypes. The templates live under:

  • aegis/templates/copier-aegis-project/{{ project_slug }}/: every file a generated project contains, one-to-one. A plain file with no Jinja logic ships as-is (e.g. app/components/worker/registry.py); a file with conditional content ships with a .jinja suffix (e.g. app/components/worker/events.py.jinja).
  • copier.yml (repo root, not under templates/): the question set Copier prompts for or reads answers from.
  • aegis/templates/copier-aegis-project/{{ project_slug }}/.copier-answers.yml.jinja: the answers file template; see Pitfalls for which fields belong here.
  • aegis/core/copier_manager.py: renders a new project (aegis init), including the dev-mode/git-mode source selection and the post-generation answers backfill.
  • aegis/core/copier_updater.py: resolves the template source and version ref for aegis update.
  • aegis/core/manual_updater.py: adds/removes a single component or service on an existing project without a full Copier update.
  • aegis/core/render_diff.py: the engine manual_updater uses to decide what a shared file needs on add/remove. Reads the file's policy annotation; you rarely edit this, but its module docstring is the reference for the decision table below.
  • Makefile (repo root): the test-template* and test-stacks* targets used to validate template changes.

Backport target mapping: any file you edit inside a generated project at <project>/<path> has its template source at aegis/templates/copier-aegis-project/{{ project_slug }}/<path> (or <path>.jinja if that file needs Jinja conditionals). Backport with:

bash
cp my-app/app/components/worker/registry.py \
  "aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/registry.py"

Quote the destination path; the directory name contains the literal {{ project_slug }} placeholder, which a shell would otherwise try to expand.

Who owns a template file

Every file in the tree is governed by exactly one mechanism, and which one is derived, not declared — there is no registration list. Adding a new template file requires no bookkeeping anywhere.

  • Component/service-owned — the path appears in some spec's FileManifest (aegis/core/components.py / services.py). Its existence is decided by manifest membership: aegis add copies it, aegis remove deletes it. Most of a component's own files.
  • Shared — nothing claims it. On add/remove the render-diff engine renders the tree at the old answers and the new answers and diffs; a file whose output changed gets written. This is where {% if include_x %} conditionals belong.

Consequence worth internalising: a {% if include_worker %} block inside a file the auth manifest owns will never re-render when worker is added, because owned files are invisible to the engine by design. Cross-cutting conditionals go in shared files.

Per-file policy annotations

A shared file can override the default handling with a comment on its very first line, read and stripped before rendering:

jinja
{#- aegis: user-owned -#}        create once, then never touch (README, docs/)
{#- aegis: warn-if-diverged -#}  overwrite while pristine, else preserve + report
{#- aegis: no-backup -#}         overwrite without writing a .backup

No annotation means the default: overwrite while pristine (with a .backup), 3-way merge once the user has edited it.

The -# / #- trim markers are required, not stylistic. aegis init and aegis update render through Copier, which knows nothing about these annotations; without the trim markers the comment leaves a blank line at the top of every generated file. A recognised word missing its markers raises rather than silently degrading.

Whole-file gates leave a stub

{%- if include_x -%}...{%- endif -%} wrapping an entire file still emits a newline when the gate is off, so Copier writes a 1-byte file. That stub is what the template currently produces, so it counts as pristine and gets populated when the gate flips on. Don't "tidy" it by making the engine treat existing-but-empty as user content — that is the exact bug that once left docker-compose.prod.yml empty forever after aegis add ingress.

Procedure

Pick one of two workflows, then apply the rendering mode that matches it.

Template-first (the change is already known):

  1. Edit the file(s) directly under aegis/templates/copier-aegis-project/{{ project_slug }}/....
  2. Generate a test project with aegis init test-project --dev (working tree, no commit needed) or make test-template-quick/make test-template (committed state, see rendering modes below).
  3. Verify the generated project behaves as expected.
  4. Clean up with make clean-test-projects.

Prototype-first (exploratory, the fix is easier to find by iterating directly on generated code):

  1. Generate a test project (aegis init <name> --dev, or any make test-template* target).
  2. Iterate directly in the generated project until it works.
  3. Backport immediately, in the same session, using the cp pattern above for every file you touched. Do not defer this; changes left only in a generated project are lost on the next aegis init.
  4. Regenerate a fresh project from the templates to confirm the backport is correct, then clean up.

Rendering modes (this resolves which template content Copier actually reads):

  • Default (installed package, or local git repo without --dev): Copier renders the COMMITTED git state, either via a GitHub URL (pip/uvx install) or a git+file:// URL pointing at the local repo (aegis/core/copier_manager.py, the is_git_repo(template_root) branch). Uncommitted template edits are invisible even though the files look changed locally.
  • aegis init --dev: renders the WORKING TREE. aegis/core/copier_manager.py's dev_mode branch copies copier.yml and aegis/templates/copier-aegis-project from the working tree into a temporary directory and generates from that plain path, so uncommitted edits show up immediately. Use this for local iteration; no commit required. Projects generated this way have no _commit pin and cannot run aegis update later.
  • External project update: aegis update -y -p <project> -t <aegis-stack repo> --to-version HEAD. -p/--project-path points at the target project, -t/--template-path points Copier at a local aegis-stack checkout instead of the installed package, and --to-version HEAD resolves to the latest commit on the current branch instead of a version tag. This still reads the COMMITTED state of that checkout, not its working tree, so template changes must be committed first.
Show full SKILL.md (429 more words)Show less

Gates

Start with the fast ones. These run in under a second against rendered output and catch the two mistakes template edits actually make:

  • uv run pytest tests/core/test_template_tree_hygiene.py — every template parses, and no file is shadowed by a .jinja twin.
  • uv run pytest tests/core/test_shared_scope_completeness.py tests/core/test_render_diff_transition_coverage.py — a new stack-dependent file is handled by something, and every add/remove transition writes the files it needs.

Run those before generating a project; a template that fails to parse wastes a 40-second aegis init to tell you so.

Then the generation gates:

  • make test-template after any template edit (generates a project and runs its full validation, including make check inside the generated project).
  • Whichever narrower target matches the touched component or service, for faster iteration: make test-template-quick (no validation), make test-template-with-components, make test-template-auth, make test-template-worker, make test-template-database, make test-template-full, make test-template-ai, make test-template-ai-memory, make test-template-ai-sqlite.
  • make test-stacks-quick while iterating on a cross-cutting template change (fast feedback against a representative subset: base, everything, insights).
  • make test-stacks-full before calling multi-component template work done (generation-only pass, the slow build/validation pass, and the kitchen-sink everything stack).
  • make check for any non-template Python change made along the way (for example, editing copier_manager.py or manual_updater.py).
  • make clean-test-projects to remove generated test project directories once verification is done.

Pitfalls

  • Gate conditional content with a full-body {% if %}...{% endif %} wrap only. Never use Copier conditional filenames; that convention broke on Windows and is banned outright.
  • Carry no inline comments in docker-compose.yml.jinja or its .dev/.prod variants. Which components a given project selects varies per stack, so a comment written for one combination misleads for another; state conditions through the Jinja gate itself.
  • Every new copier.yml question needs a matching line in .copier-answers.yml.jinja, except fields gated by a when: clause. Copier itself drops when-gated answers from the rendered answers file (observed for worker_backend, scheduler_backend, include_oauth), so the actual persistence path for those is copier_manager.py's post-generation backfill loop, which patches any copier_data key Copier dropped directly into the written .copier-answers.yml. Adding a when-gated field to the .jinja list anyway is harmless but is not what makes it survive.
  • copier is pinned below 9.15 in pyproject.toml (9.15+ relocates .copier-answers.yml out of the generated project directory, breaking aegis update). A dependabot ignore rule blocks upgrade PRs past that ceiling; do not bump the pin even if a bot proposes it.
  • uv.lock hides fresh-install dependency drift. Validate a template dependency change (new pyproject.toml.jinja gates, new packages) with uvx or a fresh uv sync inside a freshly generated project, not the locally locked dev environment, since the lock file can mask a resolution that only fails on a clean install.

© lbedner, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/template-dev of lbedner/aegis-stack.

Open the folder on GitHubat commit c8cbfad

Compare with similar skills

Template Dev next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Template Dev compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Template Dev this skilllbedner/aegis-stack143—~2.9kAutomated safety check: PassMIT
AWS Harnesshoodini/ai-agents-skills282—~4.2kAutomated safety check: NotesNone
Deps Bumplkmeta/txtify135—~585Automated safety check: PassApache-2.0
Flowfile Debugging PlaybookEdwardvaneechoud/Flowfile370—~6.3kAutomated safety check: PassMIT
Senior Fullstackalirezarezvani/claude-skills28k1 repos~3.7kAutomated safety check: NotesMIT
Senior Fullstackborghei/Claude-Skills874—~1.7kAutomated safety check: PassMIT

Similar skills

  • AWS Harness

    hoodini/ai-agents-skills

    Build a new AI agent on AWS and deploy it easily, OR wrap and deploy an agent you already have, using the Amazon Bedrock AgentCore harness.

    282 GitHub stars~4.2k tokensUpdated 2 mo ago
    DevOps & CloudAuto-check: notes
  • Deps Bump

    lkmeta/txtify

    Safely update Txtify dependencies or resolve Dependabot alerts.

    135 GitHub stars~585 tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • Flowfile Debugging Playbook

    Edwardvaneechoud/Flowfile

    Symptom-to-cause triage playbook for Flowfile (core/worker/kernel/frontend/AI) — covers "no such table" DB cascades (two distinct causes), import-time Alembic migration corruption, silent…

    370 GitHub stars~6.3k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Senior Fullstack

    alirezarezvani/claude-skills

    Fullstack development toolkit with project scaffolding for Next.js, FastAPI, MERN, and Django stacks, code quality analysis with security and complexity scoring, and stack selection guidance.

    28k GitHub starsUsed in 1 repo~3.7k tokens
    DevelopmentAuto-check: notes
  • Senior Fullstack

    borghei/Claude-Skills

    Fullstack development toolkit with project scaffolding for Next.js/FastAPI/MERN/Django stacks and code quality analysis.

    874 GitHub stars~1.7k tokensUpdated today
    DevelopmentAuto-check passed
  • Clean Code Refactorer

    fike/fastapi-blog

    Skill for identifying code smells and refactoring code using Clean Code, SOLID, and DRY principles.

    101 GitHub stars~402 tokensUpdated 2 days ago
    DevelopmentAuto-check passed

More from lbedner/aegis-stack

All 9 skills in this repo
  • Release

    lbedner/aegis-stack

    A skill your agent uses when cutting a release of the aegis-stack package.

    143 GitHub stars~2k tokensUpdated today
    Auto-check passed
  • Add CLI Command

    lbedner/aegis-stack

    A skill your agent uses when adding a command to the aegis tool CLI (the framework's own aegis ...

    143 GitHub stars~2.4k tokensUpdated today
    Auto-check passed
  • Create Plugin

    lbedner/aegis-stack

    A skill your agent uses when building an Aegis Stack plugin, a separate package (aegis-stack-<name) that renders files into a project through aegis add <name.

    143 GitHub stars~1.3k tokensUpdated today
    Auto-check passed
  • Execute Issue

    lbedner/aegis-stack

    A skill your agent uses when handed a GitHub issue (number or URL) to execute end to end.

    143 GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • I18n

    lbedner/aegis-stack

    A skill your agent uses when a code or template change introduces a new translation message key, in either the framework CLI (aegis/i18n/locales/) or a generated project's CLI (the app/i18n/locales/…

    143 GitHub stars~1.8k tokensUpdated today
    Auto-check passed
  • Squash Branch

    lbedner/aegis-stack

    A skill your agent uses when collapsing a feature branch into a single commit before opening or merging a PR.

    143 GitHub stars~660 tokensUpdated today
    Auto-check passed

Works with

Questions about Template Dev

What does Template Dev do?

A skill your agent uses when developing or modifying Copier templates in aegis/templates, or backporting a change from a generated project (e.g. Template Dev is an agent skill from lbedner/aegis-stack.g.

When should I use Template Dev?

Template Dev fits situations like: modifying Copier templates in aegis/templates; backporting a change from a generated project (e.g.

How do I install Template Dev in Claude Code?

Run `npx skills add lbedner/aegis-stack --skill template-dev -a claude-code`. Or copy the skill folder (.claude/skills/template-dev in lbedner/aegis-stack) into .claude/skills/template-dev in your project. Claude Code loads it when a task matches its description.

How do I install Template Dev in Codex?

Run `npx skills add lbedner/aegis-stack --skill template-dev -a codex`. Or copy the skill folder (.claude/skills/template-dev in lbedner/aegis-stack) into .agents/skills/template-dev in your project. Codex loads it when a task matches its description.

Can I use Template Dev in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add lbedner/aegis-stack --skill template-dev -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/template-dev, .gemini/skills/template-dev, .github/skills/template-dev and .opencode/skills/template-dev in your project.

What does Template Dev need to run?

Going by SKILL.md and its folder, Template Dev needs the command-line tools its instructions call (make and uv). Our summary lists: Python 3; Docker.

Does Template Dev access the network?

SKILL.md contains no URLs. Its commands use uv, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Template Dev safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Template Dev use?

Template Dev is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Template Dev use?

About 2.9k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Template Dev?

Skills that share tags, products or a category with Template Dev: AWS Harness (hoodini/ai-agents-skills, 282 stars), Deps Bump (lkmeta/txtify, 135 stars), Flowfile Debugging Playbook (Edwardvaneechoud/Flowfile, 370 stars) and Senior Fullstack (alirezarezvani/claude-skills, 28k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Template Dev?

lbedner (a GitHub user) maintains it in lbedner/aegis-stack, which has 143 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 7, 2026.

Source: lbedner/aegis-stack on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.