@tenkara/afm-linux-arm64 0.0.0-stage → 4.0.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/afm +4 -0
- package/content/.coupling-baseline.tsv +1 -0
- package/content/.pending-commands.txt +2 -0
- package/content/CHANGELOG-archive.md +806 -0
- package/content/CHANGELOG.md +4256 -0
- package/content/PRINCIPLES.md +121 -0
- package/content/README-light.md +160 -0
- package/content/README.md +152 -0
- package/content/code-style/_any/file-size.md +62 -0
- package/content/code-style/_any/imports.md +68 -0
- package/content/code-style/_any/naming.md +72 -0
- package/content/code-style/_any/test-placement.md +57 -0
- package/content/code-style/nextjs-app-router/imports.md +50 -0
- package/content/code-style/nextjs-app-router/naming.md +50 -0
- package/content/code-style/prisma-postgres/error-boundary.md +55 -0
- package/content/code-style/prisma-postgres/imports.md +61 -0
- package/content/code-style/shadcn-ui/naming.md +48 -0
- package/content/code-style/stripe-billing/naming.md +76 -0
- package/content/code-style/trigger-dev-v4/imports.md +58 -0
- package/content/code-style/trigger-dev-v4/naming.md +49 -0
- package/content/code-style/trigger-dev-v4/test-placement.md +61 -0
- package/content/code-style/trpc-v11/error-boundary.md +51 -0
- package/content/code-style/trpc-v11/file-size.md +44 -0
- package/content/code-style/trpc-v11/naming.md +60 -0
- package/content/code-style/trpc-v11/test-placement.md +52 -0
- package/content/core/ach.md +265 -0
- package/content/core/afm.md +496 -0
- package/content/core/gotchas.md +18 -0
- package/content/core/prd.md +143 -0
- package/content/core/protocol.md +160 -0
- package/content/core/ust.md +65 -0
- package/content/guardrails/README.md +55 -0
- package/content/guardrails/dsl-com-ordem-obrigatoria.md +47 -0
- package/content/guardrails/exaustividade-de-union.md +48 -0
- package/content/guardrails/fronteira-de-import.md +57 -0
- package/content/hooks/README.md +72 -0
- package/content/interview/bootstrap.md +415 -0
- package/content/interview/promotion.md +117 -0
- package/content/interview/refactor.md +381 -0
- package/content/interview/triggers.md +109 -0
- package/content/modules/nextjs-app-router/ach.patch.md +44 -0
- package/content/modules/nextjs-app-router/gotchas.seed.md +78 -0
- package/content/modules/nextjs-app-router/rules.patch.md +35 -0
- package/content/modules/prisma-postgres/ach.patch.md +65 -0
- package/content/modules/prisma-postgres/rules.patch.md +28 -0
- package/content/modules/shadcn-ui/ach.patch.md +42 -0
- package/content/modules/stripe-billing/ach.patch.md +46 -0
- package/content/modules/stripe-billing/gotchas.seed.md +73 -0
- package/content/modules/stripe-billing/rules.patch.md +30 -0
- package/content/modules/trigger-dev-v4/ach.patch.md +64 -0
- package/content/modules/trigger-dev-v4/gotchas.seed.md +53 -0
- package/content/modules/trigger-dev-v4/rules.patch.md +35 -0
- package/content/modules/trpc-v11/ach.patch.md +56 -0
- package/content/modules/trpc-v11/rules.patch.md +34 -0
- package/content/modules/vireya-ui/ach.patch.md +85 -0
- package/content/modules/vireya-ui/gotchas.seed.md +98 -0
- package/content/modules/vireya-ui/rules.patch.md +36 -0
- package/content/ops/adr.md +54 -0
- package/content/ops/analyze.md +129 -0
- package/content/ops/clarify.md +86 -0
- package/content/ops/deliver.md +211 -0
- package/content/ops/diagnose.md +146 -0
- package/content/ops/evolve.md +317 -0
- package/content/ops/export-template.md +97 -0
- package/content/ops/generalize.md +120 -0
- package/content/ops/gotcha.md +46 -0
- package/content/ops/plan.md +61 -0
- package/content/ops/policy.md +63 -0
- package/content/ops/promote.md +72 -0
- package/content/ops/protocol.md +51 -0
- package/content/ops/reconcile.md +44 -0
- package/content/ops/reflect.md +180 -0
- package/content/ops/remediate.md +146 -0
- package/content/ops/restructure.md +145 -0
- package/content/ops/rule.md +165 -0
- package/content/ops/specify.md +62 -0
- package/content/ops/tasks.md +67 -0
- package/content/ops/update.md +223 -0
- package/content/ops/verify.md +69 -0
- package/content/patterns/adapter.md +46 -0
- package/content/patterns/facade.md +47 -0
- package/content/patterns/factory.md +46 -0
- package/content/patterns/null-object.md +55 -0
- package/content/patterns/result-vs-exception.md +52 -0
- package/content/patterns/strategy.md +45 -0
- package/content/patterns/template-method-vs-composition.md +50 -0
- package/content/questions/adr.questions.yaml +14 -0
- package/content/questions/analyze.questions.yaml +12 -0
- package/content/questions/bootstrap-mapping.questions.yaml +14 -0
- package/content/questions/bootstrap-rules.questions.yaml +10 -0
- package/content/questions/bootstrap-stack.questions.yaml +23 -0
- package/content/questions/clarify.questions.yaml +10 -0
- package/content/questions/code-style.questions.yaml +12 -0
- package/content/questions/confirm.questions.yaml +12 -0
- package/content/questions/deliver.questions.yaml +23 -0
- package/content/questions/evolve.questions.yaml +15 -0
- package/content/questions/export-template-apply.questions.yaml +11 -0
- package/content/questions/export-template.questions.yaml +23 -0
- package/content/questions/gates.questions.yaml +27 -0
- package/content/questions/generalize.questions.yaml +13 -0
- package/content/questions/gotcha.questions.yaml +11 -0
- package/content/questions/init-template.questions.yaml +10 -0
- package/content/questions/init.questions.yaml +28 -0
- package/content/questions/plan.questions.yaml +14 -0
- package/content/questions/refactor.questions.yaml +23 -0
- package/content/questions/reflect.questions.yaml +13 -0
- package/content/questions/remediate.questions.yaml +27 -0
- package/content/questions/restructure.questions.yaml +15 -0
- package/content/questions/rf-mapping.questions.yaml +12 -0
- package/content/questions/rule-scope.questions.yaml +12 -0
- package/content/questions/rule.questions.yaml +12 -0
- package/content/questions/specify.questions.yaml +23 -0
- package/content/questions/update-artifacts.questions.yaml +10 -0
- package/content/questions/update-strings.questions.yaml +14 -0
- package/content/questions/update.questions.yaml +10 -0
- package/content/questions/verify.questions.yaml +9 -0
- package/content/roles/executor.md +18 -0
- package/content/roles/explorer.md +22 -0
- package/content/roles/reviewer.md +23 -0
- package/content/rubrics/enum-vs-union-vs-branded.md +40 -0
- package/content/rubrics/episodic-vs-semantic-boundary.md +37 -0
- package/content/rubrics/error-classification.md +98 -0
- package/content/rubrics/failure-classification.md +113 -0
- package/content/rubrics/negative-filters.md +38 -0
- package/content/rubrics/solid-triggers.md +121 -0
- package/content/rubrics/template-vs-streaming-precedence.md +34 -0
- package/content/rubrics/validation-boundary.md +94 -0
- package/content/rubrics/when-to-create-dsl.md +65 -0
- package/content/rubrics/when-to-create-lib.md +49 -0
- package/content/rubrics/when-to-create-module.md +39 -0
- package/content/rubrics/when-to-evolve-methodology.md +62 -0
- package/content/skills/adr.md +42 -0
- package/content/skills/analyze.md +34 -0
- package/content/skills/clarify.md +34 -0
- package/content/skills/deliver.md +42 -0
- package/content/skills/diagnose.md +50 -0
- package/content/skills/evolve.md +67 -0
- package/content/skills/export-template.md +40 -0
- package/content/skills/generalize.md +47 -0
- package/content/skills/gotcha.md +40 -0
- package/content/skills/init.md +82 -0
- package/content/skills/plan.md +34 -0
- package/content/skills/policy.md +31 -0
- package/content/skills/promote.md +41 -0
- package/content/skills/protocol.md +42 -0
- package/content/skills/reconcile.md +49 -0
- package/content/skills/refactor.md +84 -0
- package/content/skills/reflect.md +53 -0
- package/content/skills/remediate.md +39 -0
- package/content/skills/restructure.md +52 -0
- package/content/skills/rule.md +44 -0
- package/content/skills/specify.md +34 -0
- package/content/skills/tasks.md +34 -0
- package/content/skills/update.md +56 -0
- package/content/skills/verify.md +31 -0
- package/content/templates/adr.template.md +51 -0
- package/content/templates/evolution-report.template.md +129 -0
- package/content/templates/feature-plan.template.md +86 -0
- package/content/templates/feature-research.template.md +57 -0
- package/content/templates/feature-spec.template.md +86 -0
- package/content/templates/feature-tasks.induced.template.md +67 -0
- package/content/templates/feature-tasks.template.md +60 -0
- package/content/templates/focus.template.md +30 -0
- package/content/templates/gotcha.template.md +31 -0
- package/content/templates/guardrail-runner.template.md +81 -0
- package/content/templates/guardrail.template.md +63 -0
- package/content/templates/learning.template.md +40 -0
- package/content/templates/procedure.template.md +47 -0
- package/content/templates/protocols/p1.md +29 -0
- package/content/templates/protocols/p2.md +28 -0
- package/content/templates/protocols/p3.md +47 -0
- package/content/templates/research.template.md +50 -0
- package/content/templates/session-handoff.template.md +58 -0
- package/content/templates/us.template.md +39 -0
- package/content/tools/gate/core-rules/PLUGIN-13-secrets.sh +36 -0
- package/content/tools/gate/core-rules/PLUGIN-21-code-language.sh +27 -0
- package/content/tools/gate/core-rules/PLUGIN-35-gate-complete.sh +19 -0
- package/content/tools/gate/core-rules/PLUGIN-36-absolute-path.sh +38 -0
- package/content/tools/gate/core-rules/PLUGIN-37-prose-language.sh +56 -0
- package/content/tools/gate/core-rules/PLUGIN-38-parser-marker.sh +82 -0
- package/content/tools/gate/core-rules/PLUGIN-39-frontmatter-ops.sh +325 -0
- package/content/tools/gate/core-rules/PLUGIN-40-dead-reference.sh +74 -0
- package/content/tools/gate/core-rules/README.md +55 -0
- package/content/tools/gate/guardrails.sh +740 -0
- package/content/tools/gate/lib/ratchet.sh +119 -0
- package/content/tools/gate/lib/scope.sh +85 -0
- package/content/tools/gate/ratchet.seed.tsv +1 -0
- package/content/tools/gate/rules/README.md +50 -0
- package/package.json +19 -5
- package/plugin/agy/hooks.json +29 -0
- package/plugin/agy/mcp_config.json +7 -0
- package/plugin/agy/plugin.json +6 -0
- package/plugin/agy/skills/afm-adr/SKILL.md +44 -0
- package/plugin/agy/skills/afm-analyze/SKILL.md +36 -0
- package/plugin/agy/skills/afm-clarify/SKILL.md +36 -0
- package/plugin/agy/skills/afm-deliver/SKILL.md +44 -0
- package/plugin/agy/skills/afm-diagnose/SKILL.md +50 -0
- package/plugin/agy/skills/afm-evolve/SKILL.md +69 -0
- package/plugin/agy/skills/afm-export-template/SKILL.md +42 -0
- package/plugin/agy/skills/afm-generalize/SKILL.md +49 -0
- package/plugin/agy/skills/afm-gotcha/SKILL.md +42 -0
- package/plugin/agy/skills/afm-init/SKILL.md +84 -0
- package/plugin/agy/skills/afm-plan/SKILL.md +36 -0
- package/plugin/agy/skills/afm-policy/SKILL.md +31 -0
- package/plugin/agy/skills/afm-promote/SKILL.md +41 -0
- package/plugin/agy/skills/afm-protocol/SKILL.md +42 -0
- package/plugin/agy/skills/afm-reconcile/SKILL.md +49 -0
- package/plugin/agy/skills/afm-refactor/SKILL.md +86 -0
- package/plugin/agy/skills/afm-reflect/SKILL.md +55 -0
- package/plugin/agy/skills/afm-remediate/SKILL.md +41 -0
- package/plugin/agy/skills/afm-restructure/SKILL.md +54 -0
- package/plugin/agy/skills/afm-rule/SKILL.md +46 -0
- package/plugin/agy/skills/afm-specify/SKILL.md +36 -0
- package/plugin/agy/skills/afm-tasks/SKILL.md +34 -0
- package/plugin/agy/skills/afm-update/SKILL.md +58 -0
- package/plugin/agy/skills/afm-verify/SKILL.md +33 -0
- package/plugin/claude-code/.claude-plugin/marketplace.json +15 -0
- package/plugin/claude-code/.claude-plugin/plugin.json +9 -0
- package/plugin/claude-code/.mcp.json +7 -0
- package/plugin/claude-code/agents/afm-executor.md +18 -0
- package/plugin/claude-code/agents/afm-explorer.md +20 -0
- package/plugin/claude-code/agents/afm-reviewer.md +21 -0
- package/plugin/claude-code/hooks/hooks.json +85 -0
- package/plugin/claude-code/skills/adr/SKILL.md +44 -0
- package/plugin/claude-code/skills/analyze/SKILL.md +36 -0
- package/plugin/claude-code/skills/clarify/SKILL.md +36 -0
- package/plugin/claude-code/skills/deliver/SKILL.md +44 -0
- package/plugin/claude-code/skills/diagnose/SKILL.md +50 -0
- package/plugin/claude-code/skills/evolve/SKILL.md +69 -0
- package/plugin/claude-code/skills/export-template/SKILL.md +42 -0
- package/plugin/claude-code/skills/generalize/SKILL.md +49 -0
- package/plugin/claude-code/skills/gotcha/SKILL.md +42 -0
- package/plugin/claude-code/skills/init/SKILL.md +84 -0
- package/plugin/claude-code/skills/plan/SKILL.md +36 -0
- package/plugin/claude-code/skills/policy/SKILL.md +31 -0
- package/plugin/claude-code/skills/promote/SKILL.md +41 -0
- package/plugin/claude-code/skills/protocol/SKILL.md +42 -0
- package/plugin/claude-code/skills/reconcile/SKILL.md +49 -0
- package/plugin/claude-code/skills/refactor/SKILL.md +86 -0
- package/plugin/claude-code/skills/reflect/SKILL.md +55 -0
- package/plugin/claude-code/skills/remediate/SKILL.md +41 -0
- package/plugin/claude-code/skills/restructure/SKILL.md +54 -0
- package/plugin/claude-code/skills/rule/SKILL.md +46 -0
- package/plugin/claude-code/skills/specify/SKILL.md +36 -0
- package/plugin/claude-code/skills/tasks/SKILL.md +34 -0
- package/plugin/claude-code/skills/update/SKILL.md +58 -0
- package/plugin/claude-code/skills/verify/SKILL.md +33 -0
- package/plugin/opencode/afm.js +173 -0
- package/plugin/opencode/agents/afm-executor.md +31 -0
- package/plugin/opencode/agents/afm-explorer.md +47 -0
- package/plugin/opencode/agents/afm-reviewer.md +48 -0
- package/plugin/opencode/skills/afm-adr/SKILL.md +44 -0
- package/plugin/opencode/skills/afm-analyze/SKILL.md +36 -0
- package/plugin/opencode/skills/afm-clarify/SKILL.md +36 -0
- package/plugin/opencode/skills/afm-deliver/SKILL.md +44 -0
- package/plugin/opencode/skills/afm-diagnose/SKILL.md +50 -0
- package/plugin/opencode/skills/afm-evolve/SKILL.md +69 -0
- package/plugin/opencode/skills/afm-export-template/SKILL.md +42 -0
- package/plugin/opencode/skills/afm-generalize/SKILL.md +49 -0
- package/plugin/opencode/skills/afm-gotcha/SKILL.md +42 -0
- package/plugin/opencode/skills/afm-init/SKILL.md +84 -0
- package/plugin/opencode/skills/afm-plan/SKILL.md +36 -0
- package/plugin/opencode/skills/afm-policy/SKILL.md +31 -0
- package/plugin/opencode/skills/afm-promote/SKILL.md +41 -0
- package/plugin/opencode/skills/afm-protocol/SKILL.md +42 -0
- package/plugin/opencode/skills/afm-reconcile/SKILL.md +49 -0
- package/plugin/opencode/skills/afm-refactor/SKILL.md +86 -0
- package/plugin/opencode/skills/afm-reflect/SKILL.md +55 -0
- package/plugin/opencode/skills/afm-remediate/SKILL.md +41 -0
- package/plugin/opencode/skills/afm-restructure/SKILL.md +54 -0
- package/plugin/opencode/skills/afm-rule/SKILL.md +46 -0
- package/plugin/opencode/skills/afm-specify/SKILL.md +36 -0
- package/plugin/opencode/skills/afm-tasks/SKILL.md +34 -0
- package/plugin/opencode/skills/afm-update/SKILL.md +58 -0
- package/plugin/opencode/skills/afm-verify/SKILL.md +33 -0
- package/README.md +0 -3
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-restructure
|
|
3
|
+
description: |
|
|
4
|
+
Checks the context architecture of the local docs. It looks at staleness against the code, findability across layers, and the hot versus on-demand partition. It relocates content that already exists and writes no new content.
|
|
5
|
+
Activates: `afm-restructure`, "the doc is stale versus the code", "this should load only on demand", "the guidance exists but I cannot find it in the doc".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# AFM — Restructure (context architecture health)
|
|
10
|
+
|
|
11
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and your shell tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with the host's question tool when it has one, and otherwise in chat as a numbered list: the `prompt`, then the `options` with their descriptions, the recommended one first and marked. Wait for the answer. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
12
|
+
|
|
13
|
+
This is a mechanism skill of AFM. The canonical procedure is the op file that `afm path ops/restructure.md` prints.
|
|
14
|
+
|
|
15
|
+
> **Carve-out (does not overlap existing ops):** `diagnose` A1 finds a **dead reference** (the path does not exist). `restructure` staleness finds a path that **exists but changed** while the doc did not. `reconcile` adds **missing** information. `restructure` relocates information that **exists but sits in the wrong place**. `reflect` targets **clarity**. `restructure` targets **location and freshness**. `evolve` is the **orchestrator** that composes this skill when `diagnose` flags staleness or bloat.
|
|
16
|
+
>
|
|
17
|
+
> **Maturity (honest YAGNI):** the actionable core today is **staleness** (from git) plus **findability**. **Temperature tiering** (always-hot vs on-demand) is an **opt-in** ADR proposal, only for a doc that has actually outgrown its size. Small docs do not need it.
|
|
18
|
+
|
|
19
|
+
## When NOT to activate
|
|
20
|
+
|
|
21
|
+
This is a disambiguation guide for a skill that has already activated. It does not gate activation, so it stays in the body, not in the resident listing.
|
|
22
|
+
|
|
23
|
+
A path that does not exist belongs to `afm-diagnose` (A1). Staleness means the path exists but changed. Information never documented belongs to `reconcile` → `afm-gotcha` or `afm-rule`. An ambiguous doc belongs to `afm-reflect`. Merging gotchas belongs to `afm-generalize`. The full cycle belongs to `afm-evolve`.
|
|
24
|
+
|
|
25
|
+
## Pre-check
|
|
26
|
+
|
|
27
|
+
1. **Does `<consumer>/docs/.afm-version` exist?** If not, stop. Suggest `afm-init` (greenfield) or `afm-refactor` (brownfield) first.
|
|
28
|
+
2. **Does `afm preflight` exit 0?** A non-zero exit says why (docs not bootstrapped, content unresolved, pin mismatch). Report it to the user. Do not fall back silently.
|
|
29
|
+
3. **Is git available?** The staleness scan needs the git history. Without git, `afm doctor` marks this axis "not covered: no git". Never omit it.
|
|
30
|
+
|
|
31
|
+
## Procedure
|
|
32
|
+
|
|
33
|
+
Read the op (`afm path ops/restructure.md`) end to end. Follow it literally. Use these five steps.
|
|
34
|
+
|
|
35
|
+
1. **Staleness scan.** `afm doctor --json` runs it (findings with axis `staleness` and `dead-gotcha`); read them. The git trigger fires in two cases. First case: a path cited in the doc has a later last commit than the doc. Second case: the doc has been stale for more than N commits. A hit is a candidate, not a verdict. The scan never rewrites the doc on its own.
|
|
36
|
+
2. **Findability.** Relocate or cross-reference information that exists but sits buried or in the wrong doc. Cite both locations. Route information that is genuinely missing to `reconcile`.
|
|
37
|
+
3. **Temperature partition.** Propose a hot/on-demand loading strategy as an opt-in ADR. Do this only when a doc has outgrown its size. Preserve 100% of the content.
|
|
38
|
+
4. **Its own gate.** This gate is load-bearing and earned, one `afm ask restructure --scope <item-slug>` per finding. It follows the **shared-proposal discipline** in `evolve.md` (`afm path ops/evolve.md`), instead of a duplicate copy of that discipline. `evolve` suppresses this gate when it runs.
|
|
39
|
+
5. **Record.** Write the result to `docs/evolution/NNN-<date>.md`. Suggest `promote` if the finding generalizes.
|
|
40
|
+
|
|
41
|
+
## Invariant principles
|
|
42
|
+
|
|
43
|
+
The single canonical source is `PRINCIPLES.md` (`afm path PRINCIPLES.md`). Universal principles §1-8 apply here. Four principles matter most for this skill.
|
|
44
|
+
|
|
45
|
+
- #2: get git evidence before you propose a change.
|
|
46
|
+
- #3: staleness needs an executable git trigger.
|
|
47
|
+
- #4/#5: missing product content becomes `[TBD]` or goes to `reconcile`. Never invent it.
|
|
48
|
+
- #6/#8: self-check the work, then pass an earned gate.
|
|
49
|
+
|
|
50
|
+
**No new principle here.** `restructure` is a composed materialization. The doctrine lives in the op file.
|
|
51
|
+
|
|
52
|
+
## Version
|
|
53
|
+
|
|
54
|
+
Content version: `afm version` prints it.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-rule
|
|
3
|
+
description: |
|
|
4
|
+
Adds a hard rule to `<consumer>/docs/afm.md § 3`. A mechanical trigger is mandatory and must return 0 or 1, such as `grep`, `wc -l`, `git diff` or `tsc`. A code review or a PR template is not a trigger. Without a trigger the entry becomes a principle in § 1.3.
|
|
5
|
+
Activates: `afm-rule`, "new hard rule", "this should be a rule".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Rule
|
|
9
|
+
|
|
10
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and your shell tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with the host's question tool when it has one, and otherwise in chat as a numbered list: the `prompt`, then the `options` with their descriptions, the recommended one first and marked. Wait for the answer. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
11
|
+
|
|
12
|
+
Atomic skill of `afm`. The canonical procedure is the op `afm path ops/rule`. The CLI owns the number, the
|
|
13
|
+
rule file, the index line and the runner skeleton, and refuses a rule with no honest trigger form. This
|
|
14
|
+
skill keeps only the judgment.
|
|
15
|
+
|
|
16
|
+
## When NOT to activate
|
|
17
|
+
|
|
18
|
+
This is a disambiguation for a skill that already activated. Use `afm-adr` for a one-off architectural
|
|
19
|
+
decision. Use `afm-gotcha` for a counterintuitive surprise. Use `afm-generalize` to merge rules or gotchas
|
|
20
|
+
that already exist.
|
|
21
|
+
|
|
22
|
+
## Pre-check
|
|
23
|
+
|
|
24
|
+
`afm preflight`. Exit 3 means there is no instance: stop and suggest `afm-init` or `afm-refactor` first.
|
|
25
|
+
|
|
26
|
+
## Procedure (judgment only)
|
|
27
|
+
|
|
28
|
+
1. Confirm the mechanical trigger as free text, and push back hard: no trigger means a principle in § 1.3.
|
|
29
|
+
Run the anti-Goodhart test: can a diff pass the trigger while it breaks the rule's intent? If yes, rewrite
|
|
30
|
+
or downgrade it.
|
|
31
|
+
2. Measure the repo for any constant and propose the value with the measurement. An unanswered constant is
|
|
32
|
+
`[TBD]`. Check for an existing versioned script and cite it.
|
|
33
|
+
3. Choose the surface: `afm ask rule`. Run `afm rule new <slug> --trigger '<command>' --surface <surface>` and
|
|
34
|
+
report the paths (#6). For `pre-commit` or `ci`, follow "Install the gate" in the op: `afm gate --baseline`
|
|
35
|
+
before the gate goes on.
|
|
36
|
+
4. In a refactored project only, ask where the rule enters: `afm ask rule-scope` (universal § 3 or
|
|
37
|
+
forward-only § 3.1). The scope decision reflects intent, so it stays fixed once made.
|
|
38
|
+
|
|
39
|
+
## Invariant principles
|
|
40
|
+
|
|
41
|
+
Single canonical source: `afm path PRINCIPLES`. Universals §1-8 apply. Note especially #3 (a hard rule needs
|
|
42
|
+
a mechanical trigger, or it is a principle instead) and #6 (autonomy-first: materialize the change and
|
|
43
|
+
report it).
|
|
44
|
+
|
|
45
|
+
Passive mode (`afm-reconcile`) is always on and can propose `afm-rule` when it detects the signal "the user
|
|
46
|
+
corrected an approach with a reusable rule".
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-specify
|
|
3
|
+
description: |
|
|
4
|
+
Opens a feature folder at `docs/features/NNN-slug/spec.md`, linked to a user story. A mechanical heuristic decides first, because a feature folder for a trivial change is overhead.
|
|
5
|
+
Activates: `afm-specify <slug>`, "open a feature", "start a new feature", "create a feature folder".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Specify
|
|
9
|
+
|
|
10
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and your shell tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with the host's question tool when it has one, and otherwise in chat as a numbered list: the `prompt`, then the `options` with their descriptions, the recommended one first and marked. Wait for the answer. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
11
|
+
|
|
12
|
+
An atomic skill. The procedure lives in the op: read it with `afm path ops/specify.md`, end to end, and follow it literally.
|
|
13
|
+
|
|
14
|
+
## When NOT to activate
|
|
15
|
+
|
|
16
|
+
A trivial change (no feature folder needed) goes straight to the `afm.md § 2` loop. A full end-to-end delivery is `deliver`, which composes this op.
|
|
17
|
+
|
|
18
|
+
## Pre-check
|
|
19
|
+
|
|
20
|
+
Run `afm preflight`. Exit 3 means no `docs/.afm-version`: stop and suggest `afm-init` or `afm-refactor`. Exit 4 or 5: report the line it printed.
|
|
21
|
+
|
|
22
|
+
## Procedure
|
|
23
|
+
|
|
24
|
+
The number comes from `afm next-id feature`, never by hand. What is left to you is judgment: compute the trigger heuristic from the scan (ask the `heuristic` question only when borderline), find the linked US in `docs/ust.md` before asking (`afm ask specify`), create the spec with `afm new feature-spec <slug>` (the generator writes the frontmatter the template names) and fill its body, update the `Spec:` line of the US, and report the open `[NEEDS CLARIFICATION:]` items. Autonomy-first: write and report, review through `git diff`.
|
|
25
|
+
|
|
26
|
+
## Invariant principles
|
|
27
|
+
|
|
28
|
+
Single canonical source: `afm path PRINCIPLES.md`. Universals §1-8 apply. In particular #2 (discover-first: compute the heuristic and the US from the scan), #5 (never invent a success criterion) and #6 (autonomy-first).
|
|
29
|
+
|
|
30
|
+
## Continuous doctrine
|
|
31
|
+
|
|
32
|
+
Passive mode is the always-on `reconcile` skill. This skill covers only the opening of the feature.
|
|
33
|
+
|
|
34
|
+
## Version
|
|
35
|
+
|
|
36
|
+
`afm version`. History: `afm path CHANGELOG.md`.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-tasks
|
|
3
|
+
description: |
|
|
4
|
+
Generates `tasks.md` in TDD order, and marks the parallel tasks with `[P]`. Every task references a user story or a requirement. It hard-blocks on an open `[NEEDS CLARIFICATION:]` in the plan.
|
|
5
|
+
Activates: `afm-tasks [<feature>]`, "generate the tasks", "break the feature into tasks".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Tasks
|
|
9
|
+
|
|
10
|
+
An atomic skill. The procedure lives in the op: read it with `afm path ops/tasks.md`, end to end, and follow it literally.
|
|
11
|
+
|
|
12
|
+
## When NOT to activate
|
|
13
|
+
|
|
14
|
+
There is no `plan.md` yet: run `afm-plan` first. An end-to-end delivery is `deliver`, which composes this op.
|
|
15
|
+
|
|
16
|
+
## Pre-check
|
|
17
|
+
|
|
18
|
+
Run `afm preflight` (exit 3: stop and suggest `afm-init` or `afm-refactor`). Run `afm feature status <NNN> --json`: a non-empty `blockers` is an open `[NEEDS CLARIFICATION:]` in the plan. That is a hard refusal with no override, not a question.
|
|
19
|
+
|
|
20
|
+
## Procedure
|
|
21
|
+
|
|
22
|
+
Break the plan into four phases (Setup, Foundation RED/GREEN, Boundary, Reconciliation) from the generator (`afm new feature-tasks --feature NNN-slug`). Mark `[P]` only where a task does not depend on the one before it; a GREEN never is. Give every task a `US-NNN` or `RF-NN`. Then run `afm feature lint <NNN>` and fix what it reports until it exits 0. The last task closes the `status:` keys. Autonomy-first: write and report.
|
|
23
|
+
|
|
24
|
+
## Invariant principles
|
|
25
|
+
|
|
26
|
+
Single canonical source: `afm path PRINCIPLES.md`. Universals §1-8 apply. In particular #5 (every task traces to a US or RF) and rule 1 (TDD: no GREEN without the RED before it).
|
|
27
|
+
|
|
28
|
+
## Continuous doctrine
|
|
29
|
+
|
|
30
|
+
Passive mode is the always-on `reconcile` skill. This skill covers only the task list.
|
|
31
|
+
|
|
32
|
+
## Version
|
|
33
|
+
|
|
34
|
+
`afm version`. History: `afm path CHANGELOG.md`.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-update
|
|
3
|
+
description: |
|
|
4
|
+
Syncs `<consumer>/docs/` with the current plugin version. It materializes the consumer-facing deltas between the pinned version and the shipped version, then moves the pin. It reads the plugin and never edits it.
|
|
5
|
+
Activates: `afm-update`, "bump the methodology version", "sync docs with the new plugin", "my `.afm-version` is behind".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Update (sync instance-plugin)
|
|
9
|
+
|
|
10
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and your shell tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with the host's question tool when it has one, and otherwise in chat as a numbered list: the `prompt`, then the `options` with their descriptions, the recommended one first and marked. Wait for the answer. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
11
|
+
|
|
12
|
+
This is the sync skill of `afm`. The canonical procedure is the op `afm path ops/update`. The CLI runs the
|
|
13
|
+
codemod registry, proves each op and moves the pin. This skill keeps the judgment.
|
|
14
|
+
|
|
15
|
+
> **Carve-out (does not overlap existing ops):** `afm-init` and `afm-refactor` **create** the instance
|
|
16
|
+
> (bootstrap). `update` brings an **existing** instance forward, the path that `afm-refactor` refuses.
|
|
17
|
+
> `afm-diagnose` only **detects** drift on axis A3 (read-only). `update` **resolves** it. `afm-promote`
|
|
18
|
+
> **records** a finding meant for the plugin. `update` reads the plugin and materializes it into the
|
|
19
|
+
> instance, and neither touches the shipped content: an absolute boundary (#7). `afm-evolve` is the
|
|
20
|
+
> **cycle** that composes `update` on axis A3.
|
|
21
|
+
|
|
22
|
+
## When NOT to activate
|
|
23
|
+
|
|
24
|
+
This is a disambiguation for a skill that already activated. Use `afm-init` or `afm-refactor` if no instance
|
|
25
|
+
is bootstrapped yet. Skip `update` if the pinned version already equals the shipped version (no drift). Use
|
|
26
|
+
`afm-promote` to carry a learning from the instance TO the plugin (the opposite direction). Use
|
|
27
|
+
`afm-diagnose` to only CHECK for drift. Use `afm-evolve` for the full cycle.
|
|
28
|
+
|
|
29
|
+
## Pre-check
|
|
30
|
+
|
|
31
|
+
`afm update --dry-run` does it: exit 3 means no instance (suggest `afm-init` or `afm-refactor`), exit 4 means
|
|
32
|
+
the shipped content does not resolve (report it, do not fall back silently), and "already up to date" ends
|
|
33
|
+
the run. A pin **ahead** of the binary is an anomaly: report it, never roll it back.
|
|
34
|
+
|
|
35
|
+
## Procedure (judgment only)
|
|
36
|
+
|
|
37
|
+
1. Read the dry run as one package and show it as evidence. Ask `afm ask update`. Under `afm-evolve` this gate
|
|
38
|
+
is suppressed.
|
|
39
|
+
2. Run `afm update`. It moves the pin only at the end, and keeps it where it was when a codemod fails.
|
|
40
|
+
3. Exit 6 means agent tasks are pending: do each one inside its scope (`afm lint --fix <path>` fixes the
|
|
41
|
+
frontmatter findings), then run `afm-update` again. `afm update --accept <path>` closes a sync on a file
|
|
42
|
+
you merged by hand. An opt-in delta is reported and never applied. Exit 5 (a major crossing) is
|
|
43
|
+
`afm migrate`.
|
|
44
|
+
4. **Language migration** (when the instance is not English): read `prd.md` § 11.1 FIRST and derive the
|
|
45
|
+
excluded scope from it, and only then read a file. `[TBD]` there stops the step and asks
|
|
46
|
+
`afm ask update-strings`. It never picks a language. The artifacts question is
|
|
47
|
+
`afm ask update-artifacts`.
|
|
48
|
+
5. Post-conditions: `afm index --check` returns 0 and the plugin boundary stays clean. Report in chat what
|
|
49
|
+
migrated and what stayed pending. Under `afm-evolve`, feed it to `docs/evolution/`.
|
|
50
|
+
|
|
51
|
+
## Invariant principles
|
|
52
|
+
|
|
53
|
+
Single canonical source: `afm path PRINCIPLES`. Universals §1-8 apply. Follow #2 (discover-first): the proof of
|
|
54
|
+
need is the grep that shows what is missing. Follow #4/#5: materialize only what the plugin already provides
|
|
55
|
+
ready-made, and never invent missing product content. Follow #6 (autonomy-first with a gate). Bright line
|
|
56
|
+
#7 applies: only **read** the plugin, and write only to the instance.
|
|
57
|
+
|
|
58
|
+
**No new principle here.** `update` is composed materialization. The doctrine lives in the op file.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-verify
|
|
3
|
+
description: |
|
|
4
|
+
Stamps a human verification on one doc under `docs/`. It writes the OKF `verified` field and is the only writer of that field. Use it when a person states they reviewed a document.
|
|
5
|
+
Activates: `afm-verify <path>`, "I reviewed this rule", "mark this gotcha as verified", "sign off on this ADR".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Verify (stamp a human review)
|
|
9
|
+
|
|
10
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and your shell tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with the host's question tool when it has one, and otherwise in chat as a numbered list: the `prompt`, then the `options` with their descriptions, the recommended one first and marked. Wait for the answer. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
11
|
+
|
|
12
|
+
Atomic skill of `afm`. The canonical procedure is the op `afm path ops/verify`.
|
|
13
|
+
|
|
14
|
+
## When not to activate
|
|
15
|
+
|
|
16
|
+
Never on ordinary work, and never on your own output. This skill records that a PERSON read a document. An
|
|
17
|
+
agent stamping its own writing produces a lie the trust tier cannot detect.
|
|
18
|
+
|
|
19
|
+
## Pre-check
|
|
20
|
+
|
|
21
|
+
1. `afm preflight`. Exit 3 means there is no instance: stop.
|
|
22
|
+
2. **Did a person state they reviewed the file?** If not, stop and ask: `afm ask verify`. Inference is not
|
|
23
|
+
review.
|
|
24
|
+
3. The file must carry a frontmatter block, or there is no contract to stamp.
|
|
25
|
+
|
|
26
|
+
## Procedure (judgment only)
|
|
27
|
+
|
|
28
|
+
Run `afm verify <path under docs/>` (add `--as <id>` when no git user name is set). The command refuses an
|
|
29
|
+
agent actor. Report the tier that resulted and what it means.
|
|
30
|
+
|
|
31
|
+
## Invariant principles
|
|
32
|
+
|
|
33
|
+
Single canonical source: `afm path PRINCIPLES`. Universals §1-8 apply. #5 is load-bearing here.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
|
3
|
+
"name": "afm",
|
|
4
|
+
"description": "The AFM plugin for Claude Code, installed by `afm install claude-code`.",
|
|
5
|
+
"owner": {
|
|
6
|
+
"name": "Mapree"
|
|
7
|
+
},
|
|
8
|
+
"plugins": [
|
|
9
|
+
{
|
|
10
|
+
"name": "afm",
|
|
11
|
+
"description": "Agent Flow Methodology: autonomous discovery, a strict TDD delivery loop, and documentation that evolves from measured evidence. The CLI owns state, ids, gates and lint; the skills carry the judgment.",
|
|
12
|
+
"source": "./"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "afm",
|
|
3
|
+
"description": "Agent Flow Methodology: autonomous discovery, a strict TDD delivery loop, and documentation that evolves from measured evidence. The CLI owns state, ids, gates and lint; the skills carry the judgment.",
|
|
4
|
+
"version": "4.0.0-alpha.6",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Mapree"
|
|
7
|
+
},
|
|
8
|
+
"license": "UNLICENSED"
|
|
9
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-executor
|
|
3
|
+
description: Writer of one bounded change. Makes the edit its brief names, test first, inside the files the brief grants, and reports what changed; dispatched with a brief.
|
|
4
|
+
tools: mcp__plugin_afm_afm, Read, Grep, Glob, Edit, Write, Bash
|
|
5
|
+
---
|
|
6
|
+
You are an executor. The message that dispatched you is your brief: follow it.
|
|
7
|
+
|
|
8
|
+
You make the change the brief names, and only that change.
|
|
9
|
+
|
|
10
|
+
- Touch only the files the brief grants. Another file you need is a question for the caller, not an edit.
|
|
11
|
+
- Test first: a failing test (or a type that does not compile yet), then the smallest change that
|
|
12
|
+
makes it pass, then the refactor. Run the tests and the type check before you report.
|
|
13
|
+
- Reuse what exists before you add a helper. Add no option, hook or abstraction the brief did not ask for.
|
|
14
|
+
- Never print, write or commit a secret.
|
|
15
|
+
- Never push, and never commit unless the brief says to.
|
|
16
|
+
|
|
17
|
+
Reply with the files you changed, the checks you ran with their exact result, and anything you left
|
|
18
|
+
undone or doubt.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-explorer
|
|
3
|
+
description: Read-only investigator. Answers one question from the code, the docs or the web, cites what it read, and changes nothing; dispatched with a brief.
|
|
4
|
+
tools: mcp__plugin_afm_afm__approve, mcp__plugin_afm_afm__config, mcp__plugin_afm_afm__detect, mcp__plugin_afm_afm__doctor, mcp__plugin_afm_afm__failures_promotable, mcp__plugin_afm_afm__feature_lint, mcp__plugin_afm_afm__feature_status, mcp__plugin_afm_afm__gate, mcp__plugin_afm_afm__index, mcp__plugin_afm_afm__lang, mcp__plugin_afm_afm__next_id, mcp__plugin_afm_afm__path, mcp__plugin_afm_afm__policy, mcp__plugin_afm_afm__preflight, mcp__plugin_afm_afm__version, Read, Grep, Glob, WebFetch, WebSearch
|
|
5
|
+
maxTurns: 60
|
|
6
|
+
---
|
|
7
|
+
You are an explorer. The message that dispatched you is your brief: follow it.
|
|
8
|
+
|
|
9
|
+
You only read. You never edit a file, run a command that changes state, or commit.
|
|
10
|
+
|
|
11
|
+
- Read only what the question needs: the sections you are about to use, not whole trees.
|
|
12
|
+
- Cite every claim: a path with the line, or a source URL with the literal quote. A claim with no
|
|
13
|
+
citation is a guess, and you label it a guess.
|
|
14
|
+
- Never invent a path, a line number, a URL or a quote. If you did not read it, you do not cite it.
|
|
15
|
+
- Say what you could not find. Absence is a result.
|
|
16
|
+
|
|
17
|
+
You have at most 60 steps. Write the answer whole, not a step at a time. If you run out, reply with
|
|
18
|
+
what you have and what is still missing.
|
|
19
|
+
|
|
20
|
+
Reply with the answer first, then the evidence, then the gaps.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-reviewer
|
|
3
|
+
description: Blind auditor. Checks one piece of work it did not write against its sources and rules, and returns a verdict with evidence; dispatched with a brief.
|
|
4
|
+
tools: mcp__plugin_afm_afm__approve, mcp__plugin_afm_afm__config, mcp__plugin_afm_afm__detect, mcp__plugin_afm_afm__doctor, mcp__plugin_afm_afm__failures_promotable, mcp__plugin_afm_afm__feature_lint, mcp__plugin_afm_afm__feature_status, mcp__plugin_afm_afm__gate, mcp__plugin_afm_afm__index, mcp__plugin_afm_afm__lang, mcp__plugin_afm_afm__next_id, mcp__plugin_afm_afm__path, mcp__plugin_afm_afm__policy, mcp__plugin_afm_afm__preflight, mcp__plugin_afm_afm__version, Read, Grep, Glob, WebFetch, WebSearch
|
|
5
|
+
---
|
|
6
|
+
You are a reviewer. The message that dispatched you is your brief: follow it.
|
|
7
|
+
|
|
8
|
+
You audit work you did not write. You read it and the sources or rules it answers to. You never
|
|
9
|
+
write a fix.
|
|
10
|
+
|
|
11
|
+
- Judge against the rules and sources the brief names, not against taste.
|
|
12
|
+
- Verify, do not trust: open each cited path, line or quote and confirm it says what the work claims.
|
|
13
|
+
- Run the checks the brief lists that the `afm` tools offer (the gate, the doctor, the index), alone and one
|
|
14
|
+
at a time, and report their exact output. You have no shell: a check that needs one is a check you did
|
|
15
|
+
not run, and you say so.
|
|
16
|
+
- Report a finding only with its evidence: the path and line, the rule it breaks, and the concrete
|
|
17
|
+
input or state that fails. A suspicion with no evidence is not a finding.
|
|
18
|
+
- Say what you did not check.
|
|
19
|
+
|
|
20
|
+
End with one verdict line: PASS when no finding stands, FAIL otherwise, followed by the findings
|
|
21
|
+
most severe first.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "AFM: injects the rules, gotchas and doctrine of /docs into the session, gates a commit and a doc edit before they run, and records the work. Silent outside an AFM project; a bug in a hook never stops the session.",
|
|
3
|
+
"hooks": {
|
|
4
|
+
"SessionStart": [
|
|
5
|
+
{
|
|
6
|
+
"matcher": "startup|clear|compact",
|
|
7
|
+
"hooks": [
|
|
8
|
+
{
|
|
9
|
+
"type": "command",
|
|
10
|
+
"command": "afm hook SessionStart",
|
|
11
|
+
"timeout": 10
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"PreToolUse": [
|
|
17
|
+
{
|
|
18
|
+
"matcher": "Write|Edit|MultiEdit",
|
|
19
|
+
"hooks": [
|
|
20
|
+
{
|
|
21
|
+
"type": "command",
|
|
22
|
+
"command": "afm hook PreToolUse",
|
|
23
|
+
"timeout": 5
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"matcher": "Bash",
|
|
29
|
+
"hooks": [
|
|
30
|
+
{
|
|
31
|
+
"type": "command",
|
|
32
|
+
"command": "afm hook PreToolUse",
|
|
33
|
+
"timeout": 20
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"PostToolUse": [
|
|
39
|
+
{
|
|
40
|
+
"matcher": "Write|Edit|MultiEdit|Bash|Skill",
|
|
41
|
+
"hooks": [
|
|
42
|
+
{
|
|
43
|
+
"type": "command",
|
|
44
|
+
"command": "afm hook PostToolUse",
|
|
45
|
+
"timeout": 5
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"PostToolUseFailure": [
|
|
51
|
+
{
|
|
52
|
+
"matcher": "Bash",
|
|
53
|
+
"hooks": [
|
|
54
|
+
{
|
|
55
|
+
"type": "command",
|
|
56
|
+
"command": "afm hook PostToolUseFailure",
|
|
57
|
+
"timeout": 5
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"SubagentStart": [
|
|
63
|
+
{
|
|
64
|
+
"hooks": [
|
|
65
|
+
{
|
|
66
|
+
"type": "command",
|
|
67
|
+
"command": "afm hook SubagentStart",
|
|
68
|
+
"timeout": 5
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"Stop": [
|
|
74
|
+
{
|
|
75
|
+
"hooks": [
|
|
76
|
+
{
|
|
77
|
+
"type": "command",
|
|
78
|
+
"command": "afm hook Stop",
|
|
79
|
+
"timeout": 10
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: adr
|
|
3
|
+
description: |
|
|
4
|
+
Writes an Architecture Decision Record to `<consumer>/docs/adr/NNNN-slug.md`. It records context, decision, alternatives and consequence. In a refactored project, write a retroactive ADR only when it is load-bearing.
|
|
5
|
+
Activates: `/afm:adr`, "create ADR", "architectural decision", "record this architecture choice".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — ADR
|
|
9
|
+
|
|
10
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and the Bash tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with `AskUserQuestion`: its `header`, `prompt` and `options` as they come, the recommended option first, `multiSelect` as given. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
11
|
+
|
|
12
|
+
Atomic skill of `afm`. The canonical procedure is the op `afm path ops/adr`. The CLI owns the number, the
|
|
13
|
+
template, the frontmatter, the supersede link and the index. This skill keeps only the judgment.
|
|
14
|
+
|
|
15
|
+
## When NOT to activate
|
|
16
|
+
|
|
17
|
+
This is a disambiguation for a skill that already activated. It does not control activation itself. A
|
|
18
|
+
counterintuitive surprise belongs in `/afm:gotcha`. A rule with an executable trigger belongs in `/afm:rule`.
|
|
19
|
+
|
|
20
|
+
## Pre-check
|
|
21
|
+
|
|
22
|
+
`afm preflight`. Exit 3 means there is no instance: stop and suggest `/afm:init` (greenfield) or
|
|
23
|
+
`/afm:refactor` (brownfield) first. Exit 4 means the shipped content does not resolve: report it, do not
|
|
24
|
+
fall back silently.
|
|
25
|
+
|
|
26
|
+
## Procedure (judgment only)
|
|
27
|
+
|
|
28
|
+
1. Ask the status: `afm ask adr`. Collect the title, context, decision, alternatives, consequence and refs
|
|
29
|
+
as free text, because these fields carry intent.
|
|
30
|
+
2. Run `afm adr new <slug> --title "<title>" --description "<one sentence>"`, with `--supersedes N` when
|
|
31
|
+
the decision replaces ADR N.
|
|
32
|
+
3. Fill the sections of the printed file with what the operator said, and leave the rest `[TBD]`. Report the
|
|
33
|
+
path (#6).
|
|
34
|
+
|
|
35
|
+
The "Additional step in a refactored project" in the op applies ONLY when `/afm:refactor` adopted the
|
|
36
|
+
project (signal: `afm.md` § 3.1 forward-only exists). A greenfield project forbids a retroactive ADR.
|
|
37
|
+
|
|
38
|
+
## Invariant principles
|
|
39
|
+
|
|
40
|
+
Single canonical source: `afm path PRINCIPLES`. Universals §1-8 apply. Additional #9 (a retroactive ADR is
|
|
41
|
+
load-bearing-only) applies ONLY in a refactored project.
|
|
42
|
+
|
|
43
|
+
Passive mode (`/afm:reconcile`) is always on and can propose `/afm:adr` when it detects a "novel structural
|
|
44
|
+
decision" signal. This skill covers only the active creation.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: analyze
|
|
3
|
+
description: |
|
|
4
|
+
Cross-checks one feature against the instance. It compares `docs/features/NNN-*/{spec,plan,tasks}.md` with prd, ust, ach, afm § 3 and PRINCIPLES. It reports findings by severity in chat and writes no file.
|
|
5
|
+
Activates: `/afm:analyze [<feature>]`, "audit feature", "check coverage", "validate consistency before implementation".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Analyze
|
|
9
|
+
|
|
10
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and the Bash tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with `AskUserQuestion`: its `header`, `prompt` and `options` as they come, the recommended option first, `multiSelect` as given. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
11
|
+
|
|
12
|
+
An atomic skill. The procedure lives in the op: read it with `afm path ops/analyze.md`, end to end, and follow it exactly.
|
|
13
|
+
|
|
14
|
+
## When NOT to activate
|
|
15
|
+
|
|
16
|
+
Use `/afm:clarify` to resolve markers interactively. Use `/afm:deliver` for end-to-end delivery: it runs analyze underneath, in gating mode. Use `/afm:diagnose` for the health of the whole doc set.
|
|
17
|
+
|
|
18
|
+
## Pre-check
|
|
19
|
+
|
|
20
|
+
Run `afm preflight` (exit 3: no `docs/.afm-version`, stop and suggest `/afm:init` or `/afm:refactor`).
|
|
21
|
+
|
|
22
|
+
## Procedure
|
|
23
|
+
|
|
24
|
+
Start from the mechanical findings: `afm feature lint <NNN> --json` covers the passes A, C, D, E and the structure of `tasks.md`. Add the judgment on top (constitution violations, duplication, the semantic side of inconsistency and ambiguity), build the coverage table, assign severities by the matrix, and report in chat with metrics. Close with the `remediation` question (`afm ask analyze`). Gating mode sorts findings into buckets instead of reporting.
|
|
25
|
+
|
|
26
|
+
## Invariant principles
|
|
27
|
+
|
|
28
|
+
Single canonical source: `afm path PRINCIPLES.md`. Universals §1-8 apply, especially #2 (detection is an autonomous scan, not a question), #5 (no finding without evidence) and #6 (analyze is read-only: it reports in chat, writes no file, and remediates only on request).
|
|
29
|
+
|
|
30
|
+
## Continuous doctrine
|
|
31
|
+
|
|
32
|
+
Passive mode is the always-on `reconcile` skill. This skill covers only active auditing.
|
|
33
|
+
|
|
34
|
+
## Version
|
|
35
|
+
|
|
36
|
+
`afm version`. History: `afm path CHANGELOG.md`.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: clarify
|
|
3
|
+
description: |
|
|
4
|
+
Scans one feature for ambiguity. It asks the irreducible questions, recommendation first, and writes the answers to `spec.md § 7 Clarifications`.
|
|
5
|
+
Activates: `/afm:clarify [<feature>]`, "resolve markers", "clear up ambiguity in feature X", "clarify the spec".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Clarify
|
|
9
|
+
|
|
10
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and the Bash tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with `AskUserQuestion`: its `header`, `prompt` and `options` as they come, the recommended option first, `multiSelect` as given. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
11
|
+
|
|
12
|
+
An atomic skill. The procedure lives in the op: read it with `afm path ops/clarify.md`, end to end, and follow it literally.
|
|
13
|
+
|
|
14
|
+
## When NOT to activate
|
|
15
|
+
|
|
16
|
+
Use `/afm:analyze` for a read-only, multi-artifact validation that does not resolve markers. Use `/afm:deliver` for end-to-end delivery: it calls clarify underneath when needed.
|
|
17
|
+
|
|
18
|
+
## Pre-check
|
|
19
|
+
|
|
20
|
+
Run `afm preflight` (exit 3: no `docs/.afm-version`, stop and suggest `/afm:init` or `/afm:refactor`). `afm feature status <NNN> --json` lists the open markers of a feature in `blockers`.
|
|
21
|
+
|
|
22
|
+
## Procedure
|
|
23
|
+
|
|
24
|
+
Judgment only: a 9-category scan of the spec, a prioritized queue (at most 5 questions), auto-resolution from the code and docs before any question, then one recommendation-first question per turn. The questions come from the spec, so they are dynamic; the one fixed decision (`underspecified`) is in `afm ask clarify`. Integrate each answer into `spec.md` at once, remove the marker, and finish with the coverage summary.
|
|
25
|
+
|
|
26
|
+
## Invariant principles
|
|
27
|
+
|
|
28
|
+
Single canonical source: `afm path PRINCIPLES.md`. Universals §1-8 apply. #2 is discover-first: resolve each question yourself through the scan or the docs, then ask. #4 says `[TBD]` beats invention, and a recommendation is a rejectable hypothesis, not a guess. #6 is autonomy-first: write the integration into spec § 7 and report. #8 is recommendation-first questions.
|
|
29
|
+
|
|
30
|
+
## Continuous doctrine
|
|
31
|
+
|
|
32
|
+
Passive mode is the always-on `reconcile` skill. This skill covers only the active resolution of ambiguity.
|
|
33
|
+
|
|
34
|
+
## Version
|
|
35
|
+
|
|
36
|
+
`afm version`. History: `afm path CHANGELOG.md`.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deliver
|
|
3
|
+
description: |
|
|
4
|
+
Delivers one feature from discovery to reconciliation. It takes one recorded approval (`afm approve`), writes spec, plan and tasks, then runs each task as RED, GREEN, REFACTOR, COMMIT. It resumes from the correct phase when those files exist. Orchestrator: it composes specify, plan, tasks, clarify, analyze and reconcile. External research is not an AFM op; it routes to nasca.
|
|
5
|
+
Activates: `/afm:deliver [<feature>]`, "build feature X", "implement X end to end", "the tasks already exist, run them", "continue the delivery of feature N".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Deliver (orchestrated autonomous delivery)
|
|
9
|
+
|
|
10
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and the Bash tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with `AskUserQuestion`: its `header`, `prompt` and `options` as they come, the recommended option first, `multiSelect` as given. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
11
|
+
|
|
12
|
+
The **orchestrator** of the delivery loop. One request takes "build feature X" from discovery to a delivered feature. The procedure lives in the op: read it with `afm path ops/deliver.md`, end to end, and follow it literally. It does not duplicate the sub-steps: it reads and follows `specify`, `plan`, `tasks`, `clarify`, `analyze` and `reconcile` through a suppression contract.
|
|
13
|
+
|
|
14
|
+
## When NOT to activate
|
|
15
|
+
|
|
16
|
+
An isolated step ("just open the spec", "just generate the tasks") is the matching atomic skill. A trivial change goes straight to the `afm.md § 2` loop.
|
|
17
|
+
|
|
18
|
+
## Pre-check
|
|
19
|
+
|
|
20
|
+
Run `afm preflight`. Exit 0 continues. Exit 3 means no `docs/.afm-version`: stop and suggest `/afm:init` (greenfield) or `/afm:refactor` (brownfield). Exit 4 or 5: report the line it printed. Do not fall back silently.
|
|
21
|
+
|
|
22
|
+
## Procedure
|
|
23
|
+
|
|
24
|
+
The CLI holds the state; the skill keeps only the judgment. Drive the loop with `afm feature status <NNN> --json`, which returns the phase to resume at, the next task and the blockers.
|
|
25
|
+
|
|
26
|
+
- **Discovery:** scan scoped to the feature, external unknowns through the nasca research flow (`nasca-research`, or `nasca-campaign` for a deep study; ask the operator if nasca is missing), unknowns sorted into resolved-by-scan, researchable and irreducible. One batched, recommendation-first round, capped by the protocol (`/afm:protocol`).
|
|
27
|
+
- **Draft:** spec, plan and tasks, verified with `afm feature lint <NNN>` plus the judgment passes of `analyze`.
|
|
28
|
+
- **Gate:** the earned questions plus the `outcome` question (`afm ask deliver`), then `afm approve <NNN>`. An explicit "go" skips the questions, never the record.
|
|
29
|
+
- **Execute:** each task is one `core/afm.md` § 2 cycle, checked with `afm gate --staged`, then `afm task done <NNN> <Txxx>`. Halt on a non-`[P]` failure after the capped retry.
|
|
30
|
+
- **Reconcile:** § 8.5 plus a passive sweep.
|
|
31
|
+
|
|
32
|
+
If artifacts already exist, resume from the correct phase, including "tasks already exist, run from the first `[ ]`".
|
|
33
|
+
|
|
34
|
+
## Invariant principles
|
|
35
|
+
|
|
36
|
+
Single canonical source: `afm path PRINCIPLES.md`. Universals §1-8 apply. The backbone is **#2** (discover-first: resolve unknowns by scan and research, ask only the irreducible part, never guess product or criteria) and **#6** (autonomy-first: approval at checkpoint granularity, the consolidated plan IS the proposal).
|
|
37
|
+
|
|
38
|
+
## Continuous doctrine
|
|
39
|
+
|
|
40
|
+
Passive mode is the always-on `reconcile` skill. It runs in parallel with `deliver` and takes the closing turn of Phase 4.
|
|
41
|
+
|
|
42
|
+
## Version
|
|
43
|
+
|
|
44
|
+
`afm version`. History: `afm path CHANGELOG.md`.
|