Declarative Agent Developer
microsoft/work-iq
Create, build, deploy, and localize declarative agents for M365 Copilot and Teams.
A skill your agent uses when adding a new service (a business capability like auth, AI, blog, or finance) to the Aegis Stack framework itself.
$ npx skills add lbedner/aegis-stack --skill add-service -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install lbedner/aegis-stack add-service --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/lbedner/aegis-stack.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/add-service .claude/skills/add-service && rm -rf skills-srcUse ~/.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/
Install the "add-service" agent skill from https://github.com/lbedner/aegis-stack/tree/main/.claude/skills/add-service into .claude/skills/add-service/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-service", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/lbedner/aegis-stack/tree/main/.claude/skills/add-serviceType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add lbedner/aegis-stack --skill add-service -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install lbedner/aegis-stack add-service --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lbedner/aegis-stack.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/add-service .agents/skills/add-service && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "add-service" agent skill from https://github.com/lbedner/aegis-stack/tree/main/.claude/skills/add-service into .agents/skills/add-service/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-service", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add lbedner/aegis-stack --skill add-service -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install lbedner/aegis-stack add-service --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lbedner/aegis-stack.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/add-service .cursor/skills/add-service && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "add-service" agent skill from https://github.com/lbedner/aegis-stack/tree/main/.claude/skills/add-service into .cursor/skills/add-service/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-service", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/lbedner/aegis-stack.git --path .claude/skills/add-service--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add lbedner/aegis-stack --skill add-service -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install lbedner/aegis-stack add-service --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lbedner/aegis-stack.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/add-service .gemini/skills/add-service && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "add-service" agent skill from https://github.com/lbedner/aegis-stack/tree/main/.claude/skills/add-service into .gemini/skills/add-service/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-service", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install lbedner/aegis-stack add-serviceInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add lbedner/aegis-stack --skill add-service -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/lbedner/aegis-stack.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/add-service .github/skills/add-service && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "add-service" agent skill from https://github.com/lbedner/aegis-stack/tree/main/.claude/skills/add-service into .github/skills/add-service/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-service", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add lbedner/aegis-stack --skill add-service -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install lbedner/aegis-stack add-service --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lbedner/aegis-stack.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/add-service .opencode/skills/add-service && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "add-service" agent skill from https://github.com/lbedner/aegis-stack/tree/main/.claude/skills/add-service into .opencode/skills/add-service/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-service", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
add-serviceA skill your agent uses when adding a new service (a business capability like auth, AI, blog, or finance) to the Aegis Stack framework itself.
Add Service is an agent skill from lbedner/aegis-stack. Use when adding a new service (a business capability like auth, AI, blog, or finance) to the Aegis Stack framework itself. Covers the plugin-spec registry, migrations, CLI, template, dashboard, test, docs, and i18n files that must change together.
Its SKILL.md is about 5.2k 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 Frontend & Design, covering Project scaffolding and Internationalization. It works with FastAPI. The repository describes itself as: A production-ready FastAPI platform with modular components and a built-in control plane. The licence is MIT.
12 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit fb708b7. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
makeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Add Service loads about 5.2k tokens when it runs. Until then it costs about 65 tokens; SKILL.md has 2,313 words of instructions outside code blocks.
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.
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.
The full file from lbedner/aegis-stack at commit fb708b7, republished under its MIT licence (© lbedner). 2,313 words, ~5,176 tokens.
.claude/skills/add-service/SKILL.md (or your agent's skills folder).Adds a new service (business logic, e.g. blog, finance, auth) to the framework
so generated projects can select it via aegis init --services or add it
later via aegis add-service. Traced from the two most recent services,
blog and finance.
Use when the task is "add a new service to Aegis Stack" (a business
capability under app/services/<name>/, selected via include_<name> in
copier.yml).
Do NOT use for adding a component (infrastructure: worker, scheduler,
database, redis, ingress, observability) - components live in
aegis/core/components.py and share the same PluginSpec shape but a
different file footprint. Do NOT use for changing behavior inside an
existing service; that is ordinary feature work, not this skill.
Registry (ServiceSpec is a thin alias of PluginSpec pinned to
kind=SERVICE; see aegis/core/plugins/spec.py):
aegis/core/services.py: add a ServiceSpec entry to the SERVICES dict.
Set type (add a new ServiceType member only if none fit),
description/long_description, required_components,
recommended_components, pyproject_deps, template_files (display list),
marker_path (the path aegis update uses to detect the service on disk),
and docs_path (leave "" until the docs page ships - a non-empty value
is pinned by tests/core/test_spec_docs_paths.py).aegis/core/services.py: wiring=PluginWiring(...) on the spec - declares
routers (RouterWiring), dashboard_cards/dashboard_modals
(FrontendWidgetWiring), and deps_providers (SymbolWiring). This
metadata mirrors, and must stay in sync with, the hand-written Jinja
conditionals in the template files below - it does not currently drive
their rendering for in-tree services.aegis/core/services.py: files=FileManifest(primary=[...], extras={...})primary is the add/init base;
compute_file_mapping() derives post_gen_tasks.get_component_file_mapping()
from this, so there is no separate hand-maintained mapping to edit.aegis/core/migration_generator.py: only if the service owns tables, add a
ServiceMigrationSpec and reference it from the spec's migrations=[...]
list in services.py. The spec has no tables in it: a revision's contents
are derived from the SQLModel classes by the generated project's
app/cli/migrate_gen.py (run by init/add inside the project venv), so a
column is declared in exactly one place, the model. The spec carries only
what models cannot express - service_name, description, the Postgres
schema its tables live in, and data_sql for a row a schema change makes
mandatory. MIGRATION_SPECS is derived lazily from every spec's
.migrations via collect_migrations() - no dict entry to hand-maintain.aegis/constants.py: AnswerKeys - add <NAME> = "include_<name>" and
SERVICE_<NAME> = "<name>". Add any sub-flag keys the service needs (see
FINANCE_PLAID, FINANCE_SNAPTRADE, FINANCE_IMPORT).copier.yml (repo root, not under templates/): add the include_<name>
bool question, plus any per-service config questions gated with
when: "{{ include_<name> }}" (model on finance_plaid). Extend
get_services_needing_migrations (aegis/core/migration_generator.py) if
the service owns tables, and the two template mirrors of that rule
(pyproject.toml.jinja's alembic dependency, database_init.py.jinja);
tests/core/test_alembic_dependency_matches_migrations.py fails until they
agree.aegis/core/<name>_service_parser.py: only if the service takes bracket
syntax like <name>[option] (model on ai_service_parser.py,
auth_service_parser.py, insights_service_parser.py; blog and finance
need none of this - they have no options= on their spec). Wire it into
aegis/core/service_resolver.py if it introduces a cross-service
dependency check (see the insights[per_user] requires auth[org] block).aegis/cli/interactive.py: interactive_<name>_service_config() only if
the service needs an interactive config prompt during aegis add-service --interactive (model on interactive_ai_service_config; not needed for
blog/finance).Generation and update plumbing (thread the new AnswerKeys.<NAME> answer key
through the generate and update flows; a table-owning service that skips these
generates fine but breaks migrations on aegis update):
aegis/core/template_generator.py: add an AnswerKeys.<NAME>: "yes"/"no"
entry to the answer dict built from selected_services (model on the
existing per-service entries using extract_base_service_name).aegis/core/copier_manager.py: add AnswerKeys.<NAME> to the template
context booleans, and if the service owns tables include it in the
needs_migration_files detection.aegis/core/copier_updater.py and aegis/commands/update.py: add
include_<name> = answers.get(AnswerKeys.<NAME>, False) and OR it into the
aggregate migration/needs check used during update.aegis/core/manual_updater.py: add AnswerKeys.<NAME> to the answer-keys
list it threads through add/remove.CLI (framework commands, not the generated project's CLI):
aegis/commands/add_service.py: resolves service deps to components,
prompts for config, calls ManualUpdater.add_component, generates
migrations via generate_migration/bootstrap_alembic. Only add a
service-specific branch here if the service needs bracket-syntax parsing
or extra answer keys threaded through (auth, ai, insights do; blog and
finance need none).aegis/commands/remove_service.py: calls ManualUpdater.remove_component;
no per-service branch needed unless the service needs a custom warning
(see the auth-specific data-loss warning block).aegis/commands/services.py: the aegis services list command reads
SERVICES/ServiceType automatically; no edit needed unless a new
ServiceType header is required.Template (aegis/templates/copier-aegis-project/{{ project_slug }}/):
app/services/<name>/: the service package (business logic, deps.py for
the FastAPI dependency provider referenced by wiring.deps_providers).app/components/backend/api/<name>/: routes, registered in
app/components/backend/api/routing.py.jinja behind a full-body
{%- if include_<name> %} import + app.include_router(...) block.app/cli/<name>.py.jinja: the project's <name> subcommand. Register it
in app/cli/main.py.jinja with the existing
try: importlib.import_module(...) / except ImportError: pass pattern.app/components/frontend/dashboard/cards/<name>_card.py,
exported from cards/__init__.py.jinja behind {%- if include_<name> %},
and added to the aggregate {%- if include_auth or ... or include_<name> or _plugins %} gate in that same file (guards ServicesCard's import).app/components/frontend/dashboard/modals/<name>_modal.py,
exported from modals/__init__.py.jinja, and added to the modal_map and
import block in dashboard/cards/card_utils.py.jinja (key convention:
"service_<name>", matching wiring.dashboard_cards[0].modal_id).{%- if include_<name> %}: dashboard/status_overview.py.jinja (the
status grid), app/components/frontend/main.py.jinja (the frontend app that
mounts the card), app/services/system/ui.py.jinja (dashboard registry), and
app/components/backend/api/deps.py.jinja if the service's routes need a
shared dependency. Trace how blog appears in each before adding <name>.app/components/backend/startup/component_health.py.jinja: register the
service's health check behind {%- if include_<name> %} with
register_service_health_check("<name>", check_<name>_service_health).app/components/backend/startup/database_init.py.jinja (table-owning
services only): import the service's SQLModel models behind
{%- if include_<name> %} (with # noqa: F401), add include_<name> to the
needs_migrations set expression, and add a "<name>": ("table", "<table>") entry to the existing-table stamp map. Skipping this means the
service's tables are never created or stamped.alembic/env.py.jinja (table-owning services only): import the models behind
{%- if include_<name> %} so Alembic autogenerate sees them.pyproject.toml.jinja: gate service-specific dependencies behind
{%- if include_<name> %}. If the service owns tables, add it to the
shared alembic==1.16.5 gate condition (the big {%- if include_auth or ... or include_<name> %} line).docs/services/<name>/ under the template tree is a separate, optional
convention (ships docs inside the generated project itself); only comms
has it today. Do not treat it as required.Framework docs (this repo's own /docs, published via the root mkdocs.yml
distinct from the template docs above, and what ServiceSpec.docs_path
points at):
docs/services/<name>/index.md (+ cli.md, api.md, dashboard.md,
examples.md, setup.md as applicable - see docs/services/blog/ and
docs/services/payment/ for the current shape).
mkdocs.yml (repo root): add a Services: - <Name>: nav block pointing at
the new pages (see the blog/payment/insights entries).
aegis/core/services.py: set docs_path="services/<name>" on the spec
once the pages exist (leave "" until then, per above).
Tests (generated-project template tests, under
aegis/templates/copier-aegis-project/{{ project_slug }}/):
tests/services/<name>/test_<name>_service.py (or
tests/services/test_<name>_service.py for a small service): unit tests
for the service's business logic (write first, TDD).tests/api/test_<name>_endpoints.py: only if the service exposes routes.tests/core/test_<name>_template_render.py that renders the .jinja file
directly via Environment(loader=FileSystemLoader(get_template_path()))
and asserts on the rendered source (see tests/core/test_blog_template_render.py).Tests (this repo's own CLI/core test suite):
tests/core/test_services.py: add a spec-shape test class (name, type,
required/recommended components, pyproject_deps) and a
test_<name>_service_wiring test asserting spec.wiring.routers[0].module,
.alias, and the dashboard modal_ids (mirrors test_blog_service_wiring).tests/cli/test_services_cli.py: extend the aegis services list-command
coverage tables with the new service's expected inclusion/exclusion flags.tests/cli/conftest.py: add a <name>_with_database (or similarly named)
entry to NAMED_PROJECT_SPECS so downstream tests copy a cached project
instead of regenerating one (tests/CLAUDE.md explains the cache; skipping
this entry costs 10+ minutes of CI time). Also add the new stack to
tests/cli/test_stack_generation.py's STACK_COMBINATIONS and to the
everything entry in NAMED_PROJECT_SPECS.tests/cli/test_add_service_importable.py: add the service name (with
bracket options if it would otherwise prompt interactively) to
SERVICE_INVOCATIONS. This is the regen-gap guard: it runs
aegis add-service <name> against a cached base project and imports the
webserver/CLI/routing entry chains in the generated project's own venv,
catching files that render fine at init time but are missing from the
add/remove file mapping.tests/cli/test_add_service_migrations.py
if the service owns tables (asserts aegis add-service <name> bootstraps
alembic and writes the migration file).SERVICES shifts the service list that
several existing tests assert against. Expect to update
tests/cli/test_guided.py, tests/cli/test_interactive_project_selection.py,
tests/cli/test_interactive_scheduler.py, tests/cli/test_ai_configuration.py,
and tests/cli/test_scheduler_persistence.py when they fail on counts or
expected-option lists. These are not new files; run the gates and fix what
goes red.i18n:
aegis/i18n/locales/en.py: add "service.<name>" (short description, used
by aegis services) and "projectmap.<name>" (label used by the project map
renderer) with the real English strings.aegis/i18n/locales/{de,es,fr,ja,ko,ru,zh,zh_hant}.py: add the SAME two keys
to every other locale, using the English string as a placeholder. This is
required for parity: tests/core/test_i18n.py asserts every locale carries
the same keys as English and fails naming the missing key otherwise. Real
translation of the placeholders is a separate translator-reviewed pass; do
not attempt it here, but the keys must exist now.Cross-cutting:
FileManifest claims; aegis add/remove finds it
by rendering the tree at the old and new answers and diffing. Add
{% if include_<name> %} conditionals to routing.py.jinja,
component_health.py.jinja, cards/__init__.py.jinja — or to a brand-new
shared file — and it is handled automatically. There is no list to add it
to. tests/core/test_shared_scope_completeness.py fails, naming the file,
if a stack-dependent file somehow ends up handled by nothing.tests/services/<name>/test_<name>_service.py
(template side) for business logic, and tests/api/test_<name>_endpoints.py
if the service exposes routes. Confirm they fail for the right reason.AnswerKeys.<NAME> / AnswerKeys.SERVICE_<NAME> in
aegis/constants.py.ServiceMigrationSpec (name, schema;
no table bodies) to aegis/core/migration_generator.py.ServiceSpec entry in aegis/core/services.py: identity fields,
required_components, pyproject_deps, wiring=PluginWiring(...),
migrations=[...], and files=FileManifest(primary=[...]).include_<name> question (and any config questions) to
copier.yml; table-owning services go in get_services_needing_migrations
and its template mirrors (see above). Thread the new
AnswerKeys.<NAME> through the generation/update plumbing:
template_generator.py, copier_manager.py, copier_updater.py,
manual_updater.py, and commands/update.py (see Files that change).app/services/<name>/, the API router plus
routing.py.jinja registration, the CLI module plus main.py.jinja
registration, and the health check registration in
component_health.py.jinja.__init__.py.jinja
files, the modal_map/import block in card_utils.py.jinja, plus
status_overview.py.jinja, frontend/main.py.jinja, and
system/ui.py.jinja. If the service owns tables, also register its models
in database_init.py.jinja (import + needs_migrations + stamp map) and
alembic/env.py.jinja.pyproject.toml.jinja deps (and the shared alembic condition if the
service owns tables).service.<name> and projectmap.<name> to en.py with
real strings, and stub the same two keys into every other locale for parity
(see i18n above); tests/core/test_i18n.py fails otherwise.tests/core/test_services.py spec-shape + wiring tests, the
tests/cli/conftest.py cache entry, and the STACK_COMBINATIONS /
everything entries.SERVICE_INVOCATIONS in
tests/cli/test_add_service_importable.py and, if it owns tables, add a
migration test in the style of test_add_service_migrations.py. This
verifies the add path on an EXISTING project (aegis add-service <name>
against a cached base), not just fresh aegis init - the only way to
catch files that render at init time but are missing from the FileManifest.aegis/templates/ before finishing - templates are the source of truth.docs/services/<name>/ pages, wire them
into the root mkdocs.yml nav, and set docs_path on the spec.make check (lint, typecheck, test) must pass.make test-stacks-quick while iterating (fast feedback: runs the full
validation phase against a representative subset - base, everything,
insights).make test-stacks-full before calling the work done (runs test-stacks
generation-only pass, the slow test-stacks-build validation pass, and
the kitchen-sink everything stack across every combination).aegis init --dev (working tree) or commit first; testing a template edit
with plain aegis init on an uncommitted change silently uses stale
content.FileManifest.primary on the spec is the single source
get_component_file_mapping() derives from (via compute_file_mapping()).
A file present in the template but missing from primary renders
correctly on fresh init (Copier just includes it) but is silently
skipped by add-service/remove-service on an existing project - the gap
only shows up when tests/cli/test_add_service_importable.py exercises
the add path, which is why that test's SERVICE_INVOCATIONS list must
include the new service.FileManifest
(the service owns it outright) or nowhere (it is shared, and the
render-diff engine handles it). Putting an owned file's path in a shared
file's conditionals, or vice versa, is the mistake to watch for — a file
the manifest claims is invisible to the engine by design, so a
{% if include_<name> %} block inside it will never be re-rendered on
add/remove of a different component.tests/test_model_registry.py replays the revisions onto a
scratch database and asserts they rebuild the models exactly, and
tests/cli/test_migrations_match_models.py does the same on Postgres.ServiceSpec.wiring (routers, dashboard cards/modals, deps providers) is
metadata that currently only mirrors what's hand-wired into the shared
Jinja template files - it does not yet drive their rendering for in-tree
services. Editing one without the other leaves the spec's self-description
(used by aegis services, tests, and future plugin tooling) inconsistent
with what the generated project actually does.docs_path on the spec is pinned by tests/core/test_spec_docs_paths.py
to a real file under this repo's root /docs - setting it before the docs
page exists (or pointing it at the template's docs/services/<name>/
instead of the root one) fails that test.app/services/<name>/models (module or package). app/core/model_registry.py
imports that path for alembic, the tests, startup and migrate-fix; a
table defined anywhere else is invisible to all four, and
tests/core/test_model_registry_is_the_only_registrar.py fails on it.AnswerKeys.<NAME> into services.py and copier.yml is not
enough: the generate/update plumbing (template_generator.py,
copier_manager.py, copier_updater.py, manual_updater.py,
commands/update.py) also reads it, and copier_manager.py gates
needs_migration_files on it, so a table-owning service that skips them
breaks migrations on aegis update while passing a fresh aegis init.en.py only fails tests/core/test_i18n.py, which
requires every locale to carry the same keys; stub the key into all locales
now and leave real translation to the separate translator pass.{% if %} gating only inside a shared file; never use Copier
conditional filenames (breaks on Windows).© lbedner, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/add-service of lbedner/aegis-stack.
Open the folder on GitHubat commit fb708b7
Add Service 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Add Service this skilllbedner/aegis-stack | 143 | — | ~5.2k | Automated safety check: Pass | MIT | |
| Declarative Agent Developermicrosoft/work-iq | 1k | — | ~3.2k | Automated safety check: Pass | Custom licence | |
| Rtdfany-tdf/any-tdf | 779 | — | ~1.1k | Automated safety check: Pass | MIT | |
| Stdfany-tdf/any-tdf | 779 | — | ~1.1k | Automated safety check: Pass | MIT | |
| Vtdfany-tdf/any-tdf | 779 | — | ~1.1k | Automated safety check: Pass | MIT | |
| Admin Template Project Initializersouthliu/south-admin-react | 580 | — | ~519 | Automated safety check: Pass | MIT |
microsoft/work-iq
Create, build, deploy, and localize declarative agents for M365 Copilot and Teams.
any-tdf/any-tdf
Build, review, and troubleshoot RTDF React applications using exact component APIs, themes, icons, localization, and scaffolding.
any-tdf/any-tdf
Build, review, and troubleshoot STDF Svelte 5 applications using exact component APIs, themes, icons, localization, and scaffolding.
any-tdf/any-tdf
Build, review, and troubleshoot VTDF Vue 3 applications using exact component APIs, themes, icons, localization, and scaffolding.
southliu/south-admin-react
Removes the south-admin-react template's demo pages, components and menu entries, after a dry-run preview and your confirmation, and cleans up the matching imports.
liriliri/licia
Create a new Licia utility module following project conventions.
lbedner/aegis-stack
A skill your agent uses when cutting a release of the aegis-stack package.
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.
lbedner/aegis-stack
A skill your agent uses when adding a command to the aegis tool CLI (the framework's own aegis ...
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.
lbedner/aegis-stack
A skill your agent uses when handed a GitHub issue (number or URL) to execute end to end.
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/…
Works with
Categories
A skill your agent uses when adding a new service (a business capability like auth, AI, blog, or finance) to the Aegis Stack framework itself. Add Service is an agent skill from lbedner/aegis-stack. Use when adding a new service (a business capability like auth, AI, blog, or finance) to the Aegis Stack framework itself.
Add Service fits situations like: adding a new service (a business capability like auth; finance) to the Aegis Stack framework itself.
Run `npx skills add lbedner/aegis-stack --skill add-service -a claude-code`. Or copy the skill folder (.claude/skills/add-service in lbedner/aegis-stack) into .claude/skills/add-service in your project. Claude Code loads it when a task matches its description.
Run `npx skills add lbedner/aegis-stack --skill add-service -a codex`. Or copy the skill folder (.claude/skills/add-service in lbedner/aegis-stack) into .agents/skills/add-service in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add lbedner/aegis-stack --skill add-service -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-service, .gemini/skills/add-service, .github/skills/add-service and .opencode/skills/add-service in your project.
Going by SKILL.md and its folder, Add Service needs the command-line tools its instructions call (make).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
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.
Add Service is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.2k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Add Service: Declarative Agent Developer (microsoft/work-iq, 1k stars), Rtdf (any-tdf/any-tdf, 779 stars), Stdf (any-tdf/any-tdf, 779 stars) and Vtdf (any-tdf/any-tdf, 779 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
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 8, 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.