bmad-module-skill-forge 1.8.0 → 2.0.0
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/.claude-plugin/marketplace.json +1 -1
- package/README.md +10 -5
- package/docs/_data/pinned.yaml +2 -2
- package/docs/agents.md +11 -2
- package/docs/architecture.md +5 -4
- package/docs/bmad-synergy.md +42 -3
- package/docs/campaign.md +172 -0
- package/docs/examples.md +7 -3
- package/docs/forge-auto.md +90 -0
- package/docs/getting-started.md +9 -0
- package/docs/how-it-works.md +6 -4
- package/docs/index.md +4 -3
- package/docs/skill-model.md +1 -1
- package/docs/troubleshooting.md +17 -1
- package/docs/verifying-a-skill.md +9 -3
- package/docs/why-skf.md +1 -1
- package/docs/workflows.md +73 -27
- package/package.json +2 -2
- package/src/module-help.csv +2 -1
- package/src/shared/_known-workarounds.yaml +155 -0
- package/src/shared/data/language-corpora.json +32 -0
- package/src/shared/references/pipeline-contracts.md +14 -2
- package/src/shared/scripts/schemas/skf-brief-result-envelope.v1.json +6 -1
- package/src/shared/scripts/schemas/skill-brief.v1.json +6 -1
- package/src/shared/scripts/skf-derive-assembly-shape.py +107 -0
- package/src/shared/scripts/skf-detect-docs.py +417 -0
- package/src/shared/scripts/skf-detect-language.py +5 -3
- package/src/shared/scripts/skf-emit-brief-result-envelope.py +12 -1
- package/src/shared/scripts/skf-emit-result-envelope.py +17 -0
- package/src/shared/scripts/skf-extract-public-api.py +53 -0
- package/src/shared/scripts/skf-language-corpora.py +100 -0
- package/src/shared/scripts/skf-merge-doc-urls.py +244 -0
- package/src/shared/scripts/skf-preapply.py +192 -0
- package/src/shared/scripts/skf-shape-detect.py +1114 -0
- package/src/shared/scripts/skf-validate-brief-schema.py +2 -5
- package/src/shared/scripts/skf-validate-pins.py +368 -0
- package/src/shared/scripts/skf-write-skill-brief.py +21 -5
- package/src/skf-analyze-source/SKILL.md +26 -20
- package/src/skf-analyze-source/assets/skill-brief-schema.md +1 -1
- package/src/skf-analyze-source/references/init.md +30 -0
- package/src/skf-analyze-source/references/step-auto-scope.md +677 -0
- package/src/skf-analyze-source/references/step-shape-detect.md +86 -0
- package/src/skf-audit-skill/SKILL.md +1 -0
- package/src/skf-audit-skill/assets/drift-report-template.md +6 -0
- package/src/skf-audit-skill/references/init.md +1 -1
- package/src/skf-audit-skill/references/report.md +4 -0
- package/src/skf-audit-skill/references/severity-classify.md +1 -1
- package/src/skf-audit-skill/references/step-doc-drift.md +147 -0
- package/src/skf-brief-skill/SKILL.md +7 -3
- package/src/skf-brief-skill/assets/skill-brief-schema.md +1 -1
- package/src/skf-brief-skill/references/analyze-target.md +7 -4
- package/src/skf-brief-skill/references/confirm-brief.md +0 -1
- package/src/skf-brief-skill/references/gather-intent.md +22 -2
- package/src/skf-brief-skill/references/scope-definition.md +2 -1
- package/src/skf-brief-skill/references/step-auto-brief.md +188 -0
- package/src/skf-brief-skill/references/step-auto-validate.md +209 -0
- package/src/skf-brief-skill/references/write-brief.md +2 -3
- package/src/skf-campaign/SKILL.md +190 -0
- package/src/skf-campaign/assets/campaign-state-schema.json +191 -0
- package/src/skf-campaign/customize.toml +73 -0
- package/src/skf-campaign/manifest.yaml +11 -0
- package/src/skf-campaign/references/campaign-directive-spec.md +121 -0
- package/src/skf-campaign/references/health-check.md +35 -0
- package/src/skf-campaign/references/step-01-setup.md +122 -0
- package/src/skf-campaign/references/step-02-strategy.md +97 -0
- package/src/skf-campaign/references/step-03-pins.md +56 -0
- package/src/skf-campaign/references/step-04-provenance.md +63 -0
- package/src/skf-campaign/references/step-05-skill-loop.md +103 -0
- package/src/skf-campaign/references/step-06-batch.md +87 -0
- package/src/skf-campaign/references/step-07-capstone.md +63 -0
- package/src/skf-campaign/references/step-08-verify.md +75 -0
- package/src/skf-campaign/references/step-09-refine.md +83 -0
- package/src/skf-campaign/references/step-10-export.md +106 -0
- package/src/skf-campaign/references/step-11-maintenance.md +84 -0
- package/src/skf-campaign/references/step-resume.md +114 -0
- package/src/skf-campaign/scripts/.gitkeep +0 -0
- package/src/skf-campaign/scripts/campaign-deps.py +235 -0
- package/src/skf-campaign/scripts/campaign-parse-manifest.py +119 -0
- package/src/skf-campaign/scripts/campaign-provenance.py +247 -0
- package/src/skf-campaign/scripts/campaign-render-kickoff.py +158 -0
- package/src/skf-campaign/scripts/campaign-report.py +249 -0
- package/src/skf-campaign/scripts/campaign-validate-pins.py +174 -0
- package/src/skf-campaign/scripts/campaign-validate-state.py +207 -0
- package/src/skf-campaign/templates/campaign-brief-template.yaml +34 -0
- package/src/skf-campaign/templates/campaign-report-template.md +54 -0
- package/src/skf-campaign/templates/kickoff-template.md +48 -0
- package/src/skf-create-skill/SKILL.md +4 -1
- package/src/skf-create-skill/assets/compile-assembly-rules.md +22 -0
- package/src/skf-create-skill/assets/skill-sections.md +2 -0
- package/src/skf-create-skill/references/compile.md +5 -2
- package/src/skf-create-skill/references/extract.md +9 -1
- package/src/skf-create-skill/references/extraction-patterns.md +3 -1
- package/src/skf-create-skill/references/generate-artifacts.md +11 -2
- package/src/skf-create-skill/references/health-check.md +2 -2
- package/src/skf-create-skill/references/report.md +17 -1
- package/src/skf-create-skill/references/source-resolution-protocols.md +1 -1
- package/src/skf-create-skill/references/step-auto-shard.md +110 -0
- package/src/skf-create-skill/references/step-doc-rot.md +109 -0
- package/src/skf-create-skill/references/step-doc-sources.md +123 -0
- package/src/skf-create-skill/references/sub/fetch-docs.md +29 -0
- package/src/skf-create-skill/references/validate.md +12 -3
- package/src/skf-drop-skill/SKILL.md +2 -2
- package/src/skf-drop-skill/references/execute.md +20 -9
- package/src/skf-drop-skill/references/report.md +2 -0
- package/src/skf-drop-skill/references/select.md +7 -2
- package/src/skf-forger/SKILL.md +15 -4
- package/src/skf-refine-architecture/SKILL.md +2 -1
- package/src/skf-refine-architecture/references/compile.md +1 -1
- package/src/skf-refine-architecture/references/report.md +1 -1
- package/src/skf-rename-skill/SKILL.md +2 -2
- package/src/skf-rename-skill/references/execute.md +5 -4
- package/src/skf-rename-skill/references/rebuild-context.md +2 -2
- package/src/skf-rename-skill/references/select.md +3 -3
- package/src/skf-setup/SKILL.md +1 -1
- package/src/skf-setup/references/auto-index.md +3 -1
- package/src/skf-setup/references/detect-and-tier.md +4 -0
- package/src/skf-setup/references/report.md +4 -1
- package/src/skf-setup/references/tier-rules.md +1 -1
- package/src/skf-test-skill/SKILL.md +8 -7
- package/src/skf-test-skill/customize.toml +2 -1
- package/src/skf-test-skill/references/coverage-check.md +10 -0
- package/src/skf-test-skill/references/external-validators.md +1 -1
- package/src/skf-test-skill/references/init.md +16 -1
- package/src/skf-test-skill/references/report.md +5 -1
- package/src/skf-test-skill/references/score.md +95 -6
- package/src/skf-test-skill/references/source-access-protocol.md +13 -3
- package/src/skf-test-skill/references/step-hard-gate.md +73 -0
- package/src/skf-test-skill/scripts/compute-score.py +4 -3
- package/src/skf-test-skill/templates/test-report-template.md +1 -0
- package/src/skf-update-skill/customize.toml +0 -9
- package/src/skf-update-skill/references/detect-changes.md +33 -3
- package/src/skf-update-skill/references/health-check.md +2 -2
- package/src/skf-update-skill/references/init.md +1 -0
- package/src/skf-update-skill/references/re-extract.md +15 -1
- package/src/skf-verify-stack/references/report.md +1 -1
- package/tools/cli/lib/ui.js +3 -2
package/docs/index.md
CHANGED
|
@@ -60,8 +60,9 @@ npx bmad-module-skill-forge install
|
|
|
60
60
|
Then generate your first skill:
|
|
61
61
|
|
|
62
62
|
```
|
|
63
|
-
@Ferris SF
|
|
64
|
-
@Ferris
|
|
63
|
+
@Ferris SF # Set up your forge
|
|
64
|
+
@Ferris forge-auto <repo-or-url> # Zero-ceremony: a repo or doc URL → verified skill
|
|
65
|
+
@Ferris QS <package> # Or a fast skill from a package name in under a minute
|
|
65
66
|
```
|
|
66
67
|
|
|
67
|
-
See [Getting Started](./getting-started/) for platform support, tier selection, and troubleshooting.
|
|
68
|
+
[forge-auto](./forge-auto/) is the recommended starting point — one command, no configuration. See [Getting Started](./getting-started/) for platform support, tier selection, and troubleshooting.
|
package/docs/skill-model.md
CHANGED
|
@@ -92,7 +92,7 @@ This is useful for comparing skill quality across tiers for the same target:
|
|
|
92
92
|
# 4. Reset to tier_override: ~ (auto-detect)
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
-
Set `tier_override` to `Quick`, `Forge`, `Forge+`, or `Deep`. Set to `~` (null) to return to auto-detection. The override is respected by all tier-aware workflows (CS, SS, US, AS, TS).
|
|
95
|
+
Set `tier_override` to `Quick`, `Forge`, `Forge+`, or `Deep`. Set to `~` (null) to return to auto-detection. The override is respected by all tier-aware workflows (AN, BS, CS, SS, US, AS, TS).
|
|
96
96
|
|
|
97
97
|
---
|
|
98
98
|
|
package/docs/troubleshooting.md
CHANGED
|
@@ -27,7 +27,7 @@ If setup reports that ast-grep was not detected, install it to unlock the Forge
|
|
|
27
27
|
|
|
28
28
|
### "No skill brief found"
|
|
29
29
|
|
|
30
|
-
Run `@Ferris BS` first to create a skill brief, or use `@Ferris QS` for brief-less generation. `CS` requires either a brief or
|
|
30
|
+
Run `@Ferris BS` first to create a skill brief, or use `@Ferris QS` for brief-less generation. `CS` always requires a brief — either a `skill-brief.yaml` produced by `BS` (or `AN`), or pass the skill name so it resolves one from your forge-data folder. For brief-less generation use `QS`.
|
|
31
31
|
|
|
32
32
|
### "Ecosystem check: official skill exists"
|
|
33
33
|
|
|
@@ -41,6 +41,22 @@ Quick tier reads source without AST analysis, so signatures are read directly fr
|
|
|
41
41
|
|
|
42
42
|
Install [cocoindex-code](https://github.com/cocoindex-io/cocoindex-code) to unlock the Forge+ tier. CCC indexes your codebase and pre-ranks files by semantic relevance before AST extraction, improving coverage on projects with 500+ files.
|
|
43
43
|
|
|
44
|
+
### `@Ferris deepwiki` shows a deprecation notice
|
|
45
|
+
|
|
46
|
+
The auto pipeline was briefly named `deepwiki`; it's now [`forge-auto`](../forge-auto/) — renamed to avoid confusion with the DeepWiki MCP, since the pipeline compiles a verified skill from source and does **not** call that MCP. `deepwiki` still works (it resolves to `forge-auto`) but prints a one-time notice. Switch your commands to `@Ferris forge-auto <repo-or-doc-url>`.
|
|
47
|
+
|
|
48
|
+
### `@Ferris onboard` returns an error
|
|
49
|
+
|
|
50
|
+
The `onboard` alias was removed. Its replacement is [`forge-auto`](../forge-auto/), which does everything `onboard` did plus auto-scope, auto-brief, and a stricter 90% quality gate. Run `@Ferris forge-auto <repo-or-doc-url>` instead.
|
|
51
|
+
|
|
52
|
+
### forge-auto halted at the Test stage
|
|
53
|
+
|
|
54
|
+
forge-auto runs Test Skill with a stricter **90% quality threshold** (vs the default 80%), so a skill that scores below 90% halts at TS with a gap report rather than exporting a weak skill. Run `@Ferris US` to address the gaps it lists, then `@Ferris TS EX` to re-test and export. If 90% is stricter than you need, run the individual workflows or `forge` instead, which use the default threshold.
|
|
55
|
+
|
|
56
|
+
### My campaign stopped partway — how do I resume?
|
|
57
|
+
|
|
58
|
+
Campaign is designed for exactly this. State lives in `_campaign-state.yaml` on disk, so context death, a session timeout, or a machine restart loses nothing. Run `@Ferris campaign resume` — Ferris validates the state file, skips completed skills, and picks up from the next incomplete skill in dependency order. If the state file is corrupted, Ferris falls back to the `.bak` copy automatically. To re-process one specific skill, use `@Ferris campaign resume --from=<skill>`.
|
|
59
|
+
|
|
44
60
|
---
|
|
45
61
|
|
|
46
62
|
## Still stuck?
|
|
@@ -61,7 +61,7 @@ Every file in the per-skill output carries a specific job. Here's the lookup tab
|
|
|
61
61
|
| Which symbols are documented and where did each come from? | `forge-data/{name}/{version}/provenance-map.json` |
|
|
62
62
|
| What AST patterns were used for extraction? | `forge-data/{name}/{version}/extraction-rules.yaml` |
|
|
63
63
|
| What signatures, types, and examples did the extractor actually capture? | `forge-data/{name}/{version}/evidence-report.md` |
|
|
64
|
-
| How was the skill scored? Show me the math. | `forge-data/{name}/{version}/test-report-{name}.md` |
|
|
64
|
+
| How was the skill scored? Show me the math. | `forge-data/{name}/{version}/test-report-{name}-{run_id}.md` (per-run, run-id-suffixed — newest wins) |
|
|
65
65
|
| How was the skill scoped, and what was deliberately left out? | `forge-data/{name}/skill-brief.yaml` |
|
|
66
66
|
|
|
67
67
|
Everything a reader needs to reconstruct the compilation is in the two sibling directories: `skills/` ships to consumers, `forge-data/` is the audit trail.
|
|
@@ -156,16 +156,22 @@ Your forge tier determines which categories can be scored:
|
|
|
156
156
|
|
|
157
157
|
When categories are skipped, their combined weight is redistributed proportionally to the remaining active categories. A Quick-tier skill and a Deep-tier skill both pass at the same 80% threshold — the score reflects what your tier can actually measure.
|
|
158
158
|
|
|
159
|
+
### Hard gate
|
|
160
|
+
|
|
161
|
+
Before scoring, a hard gate scans all findings for **Critical** and **High** severity. If any are present, the pipeline blocks immediately — no score is computed and the skill cannot pass regardless of coverage percentage. Medium, Low, and Info findings pass through to scoring.
|
|
162
|
+
|
|
159
163
|
### Pass/fail
|
|
160
164
|
|
|
161
165
|
```
|
|
162
|
-
threshold = custom_threshold OR 80% (default)
|
|
166
|
+
threshold = pipeline_default OR custom_threshold OR 80% (default)
|
|
163
167
|
|
|
164
168
|
score >= threshold → PASS → Recommend export-skill
|
|
165
169
|
score < threshold → FAIL → Recommend update-skill
|
|
166
170
|
```
|
|
167
171
|
|
|
168
|
-
The default is 80
|
|
172
|
+
The default threshold is **80%**. Pipeline aliases declare their own defaults: `forge-auto` targets **90%**, `forge` and `forge-quick` target **80%**. You can override any default with a custom threshold (e.g., `TS[min:85]`).
|
|
173
|
+
|
|
174
|
+
When a skill scores between 80% and its target threshold (e.g., 82% against a 90% target), the soft gate falls back to the 80% floor — the skill passes, but an evidence report is written to `forge-data/{skill}/{version}/evidence-report-fallback.md` documenting the quality compromise.
|
|
169
175
|
|
|
170
176
|
### Gap severities
|
|
171
177
|
|
package/docs/why-skf.md
CHANGED
|
@@ -52,7 +52,7 @@ See the [Verifying a Skill](../verifying-a-skill/) page for the full three-step
|
|
|
52
52
|
|
|
53
53
|
### The curious developer
|
|
54
54
|
|
|
55
|
-
Your agent just hallucinated a method that doesn't exist, again. You want this to stop, and you don't want to read a
|
|
55
|
+
Your agent just hallucinated a method that doesn't exist, again. You want this to stop, and you don't want to read a long architecture reference before running your first command.
|
|
56
56
|
→ Start with [Getting Started](../getting-started/).
|
|
57
57
|
|
|
58
58
|
### The BMAD user
|
package/docs/workflows.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Workflows
|
|
3
|
-
description: All
|
|
3
|
+
description: All 15 SKF workflows with commands, steps, and connection diagram
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Trigger workflows by typing commands to [Ferris](../agents/). See [Concepts](../concepts/) for definitions.
|
|
@@ -24,7 +24,10 @@ Trigger workflows by typing commands to [Ferris](../agents/). See [Concepts](../
|
|
|
24
24
|
**Flags:**
|
|
25
25
|
|
|
26
26
|
- `--require-tier=<Quick|Forge|Forge+|Deep>` — fail-fast for CI: if the calculated tier does not satisfy the requested tier (tool-prerequisite check, not a name comparison — Deep does NOT subsume Forge+ because Deep does not require ccc), the workflow halts with a "REQUIRED TIER NOT MET" block and exits without chaining to the health check. Pipelines branch on the JSON envelope's `require_tier_satisfied` field.
|
|
27
|
-
- `--
|
|
27
|
+
- `--orphan-action=<keep|remove>` — resolve the orphan QMD-collection removal gate non-interactively, even outside `--headless`.
|
|
28
|
+
- `--ccc-skip-index` — skip CCC indexing (envelope `ccc_index.status` becomes `"skipped"`) — the fast re-probe lane to refresh the detected tier without paying the full re-index cost.
|
|
29
|
+
- `--quiet` — suppress the human-readable FORGE STATUS banner and emit the envelope only.
|
|
30
|
+
- `--headless` / `-H` — see [Headless Mode](#headless-mode) below. For `/skf-setup` specifically, headless mode emits a single-line `SKF_SETUP_RESULT_JSON: {…}` envelope to stdout (schema-locked, includes `status` — the primary branch field — plus `tier`, `previous_tier`, `tier_changed`, `tools`, `tools_added`/`removed`, `files_written`, `warnings`, `error`) and SUPPRESSES the human-readable banner — the entire payload pipelines need is on one parseable line.
|
|
28
31
|
|
|
29
32
|
**Agent:** Ferris (Architect mode)
|
|
30
33
|
|
|
@@ -52,7 +55,7 @@ Trigger workflows by typing commands to [Ferris](../agents/). See [Concepts](../
|
|
|
52
55
|
|
|
53
56
|
**When to Use:** After Brief Skill, or with an existing skill-brief.yaml.
|
|
54
57
|
|
|
55
|
-
**Key Steps:** Load brief → Ecosystem check → Extract (AST + scripts/assets) → QMD enrich (Deep) → Compile → Validate → Generate
|
|
58
|
+
**Key Steps:** Load brief → Ecosystem check → Extract (AST + scripts/assets) → QMD enrich (Deep) → Compile → Doc sources → Auto-shard → Doc-rot → Validate → Generate
|
|
56
59
|
|
|
57
60
|
**Agent:** Ferris (Architect mode)
|
|
58
61
|
|
|
@@ -80,6 +83,8 @@ Trigger workflows by typing commands to [Ferris](../agents/). See [Concepts](../
|
|
|
80
83
|
|
|
81
84
|
**Purpose:** Brief-less fast skill with package-to-repo resolution.
|
|
82
85
|
|
|
86
|
+
**Note:** QS is **tier-unaware** — it always runs at community tier and does not use ast-grep, CCC, or QMD even when your forge is configured at Forge+/Deep. For tier-aware compilation, use `BS → CS`, `forge`, or `forge-auto`. See [Skill Model](../skill-model/).
|
|
87
|
+
|
|
83
88
|
**When to Use:** When you need a skill quickly — no brief needed. Accepts package names or GitHub URLs. Append `@version` to target a specific version (e.g., `@Ferris QS cognee@1.0.0`).
|
|
84
89
|
|
|
85
90
|
**Key Steps:** Resolve target → Ecosystem check → Quick extract → Compile → Validate → Write
|
|
@@ -141,7 +146,7 @@ Trigger workflows by typing commands to [Ferris](../agents/). See [Concepts](../
|
|
|
141
146
|
|
|
142
147
|
**When to Use:** To check if a skill has fallen out of date with its source code. Works for both individual skills and stack skills.
|
|
143
148
|
|
|
144
|
-
**Key Steps:** Load skill → Re-index source → Structural diff (incl. script/asset drift) → Semantic diff (Deep) → Classify severity → Report
|
|
149
|
+
**Key Steps:** Load skill → Re-index source → Structural diff (incl. script/asset drift) → Semantic diff (Deep) → Classify severity → Doc drift → Report
|
|
145
150
|
|
|
146
151
|
**Stack skill support:** Code-mode stacks are audited per-library against their sources. Compose-mode stacks check constituent freshness via metadata hash comparison — if a constituent skill was updated after the stack was composed, audit flags it as constituent drift. Stack skills that need updating are redirected to `@Ferris SS` for re-composition (surgical update is not supported for stacks).
|
|
147
152
|
|
|
@@ -157,9 +162,9 @@ Trigger workflows by typing commands to [Ferris](../agents/). See [Concepts](../
|
|
|
157
162
|
|
|
158
163
|
**When to Use:** After creating or updating a skill, before exporting.
|
|
159
164
|
|
|
160
|
-
**Key Steps:** Load skill → Detect mode → Coverage check → Coherence check → External validation (skill-check, tessl) → Score → Gap report
|
|
165
|
+
**Key Steps:** Load skill → Detect mode → Coverage check → Coherence check → External validation (skill-check, tessl) → Hard gate → Score → Gap report
|
|
161
166
|
|
|
162
|
-
**Scored Categories:** Export Coverage (36%), Signature Accuracy (22%), Type Coverage (14%), Coherence (18%), External Validation (10%). Default pass threshold: **80
|
|
167
|
+
**Scored Categories:** Export Coverage (36%), Signature Accuracy (22%), Type Coverage (14%), Coherence (18%), External Validation (10%). Default pass threshold: **80%** (per-pipeline defaults: forge-auto 90%, forge 80%). Pass routes to Export Skill; fail routes to Update Skill with a gap report. See [Completeness Scoring](../verifying-a-skill/#how-the-score-is-computed) for the full formula and tier adjustments.
|
|
163
168
|
|
|
164
169
|
**Agent:** Ferris (Audit mode)
|
|
165
170
|
|
|
@@ -211,6 +216,22 @@ Trigger workflows by typing commands to [Ferris](../agents/). See [Concepts](../
|
|
|
211
216
|
|
|
212
217
|
---
|
|
213
218
|
|
|
219
|
+
## Orchestration Workflows
|
|
220
|
+
|
|
221
|
+
### Campaign Orchestration
|
|
222
|
+
|
|
223
|
+
**Command:** `@Ferris campaign`
|
|
224
|
+
|
|
225
|
+
**Purpose:** Orchestrate multi-library skill production across sessions with dependency tracking and resume.
|
|
226
|
+
|
|
227
|
+
**When to Use:** When you need to produce 15+ coordinated skills with dependency ordering — too many for manual one-at-a-time pipeline runs.
|
|
228
|
+
|
|
229
|
+
**Key Steps:** Setup → Strategy → Pin Validation → Provenance → Skill Loop → Tier B Batch → Capstone → Verify → Refine → Export → Maintenance
|
|
230
|
+
|
|
231
|
+
**Agent:** Ferris (Management mode)
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
214
235
|
## Management Workflows
|
|
215
236
|
|
|
216
237
|
### Rename Skill (RS)
|
|
@@ -280,21 +301,36 @@ flowchart TD
|
|
|
280
301
|
TS --> EX[Export Skill]
|
|
281
302
|
```
|
|
282
303
|
|
|
283
|
-
|
|
304
|
+
**Campaign orchestration path:**
|
|
305
|
+
|
|
306
|
+
```mermaid
|
|
307
|
+
flowchart TD
|
|
308
|
+
CAMPAIGN[Campaign Orchestration] --> SETUP[Setup + Strategy]
|
|
309
|
+
SETUP --> PINS[Pin Validation + Provenance]
|
|
310
|
+
PINS --> LOOP["Skill Loop<br/>(BS → CS → TS → EX per skill)"]
|
|
311
|
+
LOOP --> BATCH[Tier B Batch]
|
|
312
|
+
BATCH --> CAP[Capstone — Stack Skill]
|
|
313
|
+
CAP --> VER[Verify + Refine]
|
|
314
|
+
VER --> EXPORT[Export — write-gate HALT]
|
|
315
|
+
EXPORT --> MAINT[Maintenance + Campaign Report]
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
> **One workflow per session** (unless using pipeline mode or campaign). Each arrow in the standard and compose-mode diagrams represents a new conversation session. Campaign manages its own multi-session orchestration internally — see [Campaign Orchestration](../campaign/). Clear your context between workflows for best results — or use pipeline mode to chain them automatically. See [Pipeline Mode](#pipeline-mode) below.
|
|
284
319
|
|
|
285
320
|
---
|
|
286
321
|
|
|
287
322
|
## Workflow Categories
|
|
288
323
|
|
|
289
|
-
| Category | Workflows
|
|
290
|
-
| ------------------------- |
|
|
291
|
-
| Core | SF, BS, CS, US
|
|
292
|
-
| Feature | QS, SS, AN
|
|
293
|
-
| Quality | AS, TS
|
|
294
|
-
| Architecture Verification | VS, RA
|
|
295
|
-
|
|
|
296
|
-
|
|
|
297
|
-
|
|
|
324
|
+
| Category | Workflows | Description |
|
|
325
|
+
| ------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
|
326
|
+
| Core | SF, BS, CS, US | Setup, brief, create, and update skills |
|
|
327
|
+
| Feature | QS, SS, AN | Quick skill, stack skill, and analyze source |
|
|
328
|
+
| Quality | AS, TS | Detect skill drift (AS) and verify skill completeness (TS) |
|
|
329
|
+
| Architecture Verification | VS, RA | Pre-code architecture feasibility and refinement |
|
|
330
|
+
| Orchestration | Campaign | Multi-library skill production with dependency tracking and resume |
|
|
331
|
+
| Management | RS, DS | Rename and drop skill versions with transactional safety |
|
|
332
|
+
| Utility | EX | Package and export for consumption |
|
|
333
|
+
| In-Agent | WS, KI | WS: show lifecycle position, active briefs, and forge tier; KI: list knowledge fragments (both in-agent, no file-based workflow) |
|
|
298
334
|
|
|
299
335
|
---
|
|
300
336
|
|
|
@@ -313,12 +349,14 @@ Instead of running one workflow per session, you can chain multiple workflows in
|
|
|
313
349
|
|
|
314
350
|
### Pipeline Aliases
|
|
315
351
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
|
319
|
-
|
|
|
320
|
-
| `
|
|
321
|
-
| `
|
|
352
|
+
The `forge-auto` alias is the recommended way to create skills — one command, zero configuration. It chains five workflows with auto-mode flags so you get a verified skill without touching a brief or scope file.
|
|
353
|
+
|
|
354
|
+
| Alias | Expands To | First Workflow | Required Target |
|
|
355
|
+
| ------------- | -------------------------------------- | -------------- | -------------------------------------------- |
|
|
356
|
+
| `forge-auto` | `AN[auto] BS[auto] CS TS[min:90] EX` | AN | GitHub URL, doc URL, or `--pin <version>` |
|
|
357
|
+
| `forge` | `BS CS TS EX` | BS | GitHub URL or local path **+** skill name |
|
|
358
|
+
| `forge-quick` | `QS TS EX` | QS | GitHub URL **or** package name |
|
|
359
|
+
| `maintain` | `AS US TS EX` | AS | Existing skill name |
|
|
322
360
|
|
|
323
361
|
**The first workflow's input contract defines what arguments the pipeline needs.** A bare package name works for `forge-quick` (QS resolves packages via the registry) but **not** for `forge` — BS requires both an unambiguous target (URL or path) and a skill name.
|
|
324
362
|
|
|
@@ -334,11 +372,13 @@ Instead of running one workflow per session, you can chain multiple workflows in
|
|
|
334
372
|
### Examples
|
|
335
373
|
|
|
336
374
|
```
|
|
375
|
+
@Ferris forge-auto https://github.com/honojs/hono — zero-ceremony skill
|
|
376
|
+
@Ferris forge-auto https://docs.example.com — docs-only skill
|
|
377
|
+
@Ferris forge-auto https://github.com/honojs/hono --pin v4.6.0 — pinned version
|
|
337
378
|
@Ferris forge-quick @tanstack/query — QS + TS + EX for TanStack Query
|
|
338
379
|
@Ferris forge https://github.com/topoteretes/cognee cognee — BS + CS + TS + EX, explicit URL + name
|
|
339
380
|
@Ferris forge https://github.com/topoteretes/cognee cognee "public API only" — with scope hint
|
|
340
381
|
@Ferris maintain cocoindex — AS + US + TS + EX for an existing cocoindex skill
|
|
341
|
-
@Ferris onboard — AN + CS + TS + EX on the current project
|
|
342
382
|
```
|
|
343
383
|
|
|
344
384
|
---
|
|
@@ -358,10 +398,10 @@ You can also set `headless_mode: true` in your forge preferences (`_bmad/_memory
|
|
|
358
398
|
**Exception — `/skf-setup` headless emits a single-line JSON envelope.** Unlike other workflows, headless `/skf-setup` SUPPRESSES the human-readable status banner entirely and emits exactly one prefixed line on stdout:
|
|
359
399
|
|
|
360
400
|
```
|
|
361
|
-
SKF_SETUP_RESULT_JSON: {"skf_setup":{"tier":"Deep","previous_tier":"Forge","tier_changed":true,"tools":{...},"tools_added":[...],"tools_removed":[],"config_path":"...","ccc_index":{...},"files_written":[...],"tier_override_active":false,"tier_override_invalid":false,"require_tier_satisfied":null,"warnings":[],"error":null}}
|
|
401
|
+
SKF_SETUP_RESULT_JSON: {"skf_setup":{"status":"success","tier":"Deep","previous_tier":"Forge","tier_changed":true,"tools":{...},"tools_added":[...],"tools_removed":[],"config_path":"...","ccc_index":{...},"files_written":[...],"tier_override_active":false,"tier_override_invalid":false,"require_tier_satisfied":null,"warnings":[],"error":null}}
|
|
362
402
|
```
|
|
363
403
|
|
|
364
|
-
Parent skills and CI pipelines `grep` one line out of the workflow log to learn the outcome — no ASCII-art parsing, no race against the [`forge-tier.yaml`](https://github.com/armelhbobdad/bmad-module-skill-forge/blob/main/src/skf-setup/references/write-config.md) writer. The envelope schema is versioned at [`src/shared/scripts/schemas/skf-setup-result-envelope.v1.json`](https://github.com/armelhbobdad/bmad-module-skill-forge/blob/main/src/shared/scripts/schemas/skf-setup-result-envelope.v1.json) and asserted against on every emit.
|
|
404
|
+
Parent skills and CI pipelines `grep` one line out of the workflow log to learn the outcome — no ASCII-art parsing, no race against the [`forge-tier.yaml`](https://github.com/armelhbobdad/bmad-module-skill-forge/blob/main/src/skf-setup/references/write-config.md) writer. Branch on the top-level `status` field (`success`, `tier_failure`, `write_failure`, or `blocked`) rather than composing the outcome from `require_tier_satisfied` + `error`. The envelope schema is versioned at [`src/shared/scripts/schemas/skf-setup-result-envelope.v1.json`](https://github.com/armelhbobdad/bmad-module-skill-forge/blob/main/src/shared/scripts/schemas/skf-setup-result-envelope.v1.json) and asserted against on every emit.
|
|
365
405
|
|
|
366
406
|
**Exception — `/skf-quick-skill` headless emits structured progress + result envelopes.** Headless `/skf-quick-skill` runs are first-class building blocks for batch automators. Three operational contracts beyond per-gate auto-proceed:
|
|
367
407
|
|
|
@@ -383,7 +423,7 @@ Parent skills and CI pipelines `grep` one line out of the workflow log to learn
|
|
|
383
423
|
| 3 | resolution-failure |
|
|
384
424
|
| 4 | write-failure |
|
|
385
425
|
| 5 | overwrite-cancelled |
|
|
386
|
-
| 6 |
|
|
426
|
+
| 6 | user-cancelled |
|
|
387
427
|
| 7 | finalize-blocked |
|
|
388
428
|
|
|
389
429
|
3. **Error-variant result contract on every HARD HALT.** A `SKF_QUICK_SKILL_RESULT_JSON: {…}` envelope is emitted on `stderr` (always) and copied to `{skill_package}/quick-skill-result-latest.json` when the skill package is known (HALTs at step 5 §1 onward). The schema and full population rules live in [`src/skf-quick-skill/SKILL.md`](https://github.com/armelhbobdad/bmad-module-skill-forge/blob/main/src/skf-quick-skill/SKILL.md) § "Result Contract on HARD HALT".
|
|
@@ -409,11 +449,17 @@ Parent skills and CI pipelines `grep` one line out of the workflow log to learn
|
|
|
409
449
|
|
|
410
450
|
**Presets (`--preset <name>`).** Loads `{sidecar_path}/brief-presets/{name}.yaml` and merges its keys as defaults at step 1 §8; explicit headless args override preset values. The preset file is YAML containing any subset of the headless args above; unknown fields are ignored with a warning. Useful for repeated patterns — e.g. briefing 5 SaaS SDKs that all share `source_authority=community`, `scope_type=full-library`, `scripts_intent=skip`.
|
|
411
451
|
|
|
452
|
+
**Exception — the management and verification workflows emit structured result envelopes too.** Beyond per-gate auto-proceed, Drop Skill, Rename Skill, and Refine Architecture each emit a single-line `SKF_*_RESULT_JSON: {…}` envelope on every terminal exit (`status: "success"` on the happy path, `status: "error"` with a typed `halt_reason` on any HARD HALT) and exit with a stable code so automators branch on the failure class without grepping message text. All three honour the universal `cancel`/`exit`/`:q` affordance at any prompt (exit `6`, `halt_reason: "user-cancelled"`).
|
|
453
|
+
|
|
454
|
+
- **`/skf-drop-skill` (DS)** — exit `2` `input-missing`/`input-invalid`, `4` `write-failure` (covers manifest-write, context-rebuild, and full-purge `delete-failed`), `5` state-conflict (active-version guard). Schema and `halt_reason` list in [`src/skf-drop-skill/SKILL.md`](https://github.com/armelhbobdad/bmad-module-skill-forge/blob/main/src/skf-drop-skill/SKILL.md) § "Exit Codes" / "Result Contract (Headless)".
|
|
455
|
+
- **`/skf-rename-skill` (RS)** — exit `2` `input-missing`/`input-invalid`, `4` `write-failure` (`copy-failed`, `write-failed`, `manifest-write-failed`; the §7 context rebuild is best-effort and never halts), `5` state-conflict (name-collision, source-authority, concurrent-run lock). Schema in [`src/skf-rename-skill/SKILL.md`](https://github.com/armelhbobdad/bmad-module-skill-forge/blob/main/src/skf-rename-skill/SKILL.md) § "Exit Codes" / "Result Contract (Headless)".
|
|
456
|
+
- **`/skf-refine-architecture` (RA)** — exit `2` `input-missing`/`input-invalid`, `4` `write-failure`, `7` `inventory-unreliable`, `8` `recovery-failed` (durability state insufficient to reconstruct findings, or the compiled doc is missing its `## Refinement Summary`). Schema in [`src/skf-refine-architecture/SKILL.md`](https://github.com/armelhbobdad/bmad-module-skill-forge/blob/main/src/skf-refine-architecture/SKILL.md) § "Exit Codes" / "Result Contract (Headless)".
|
|
457
|
+
|
|
412
458
|
---
|
|
413
459
|
|
|
414
460
|
## Terminal Step: Health Check
|
|
415
461
|
|
|
416
|
-
All
|
|
462
|
+
All 15 workflows above share the same final step — a **health check** defined in [`src/shared/health-check.md`](https://github.com/armelhbobdad/bmad-module-skill-forge/blob/main/src/shared/health-check.md). This isn't a workflow you invoke directly; there's no command code and no menu entry. Each workflow ends with a dedicated local `step-NN-health-check.md` whose `nextStepFile` points at the shared file, so the health check fires automatically once the main work is done. After the main work is done, Ferris reflects internally on the execution:
|
|
417
463
|
|
|
418
464
|
- Did any step instruction lead the agent astray or cause unnecessary back-and-forth?
|
|
419
465
|
- Was any step ambiguous, forcing the agent to guess?
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "bmad-module-skill-forge",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "2.0.0",
|
|
5
5
|
"description": "BMAD module — Turn code and docs into instructions AI agents can actually follow. Progressive capability tiers (Quick/Forge/Forge+/Deep).",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"bmad",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"test:cli": "node test/test-cli-integration.js",
|
|
54
54
|
"test:install": "node test/test-installation-components.js",
|
|
55
55
|
"test:knowledge": "node test/test-knowledge-base.js",
|
|
56
|
-
"test:python": "uv run --with pytest --with pyyaml --with jsonschema pytest test/test-compute-score-contract.py test/test-skf-preflight.py test/test-skf-skill-inventory.py test/test-skf-validate-output.py test/test-skf-validate-frontmatter.py test/test-skf-manifest-ops.py test/test-skf-rebuild-managed-sections.py test/test-skf-atomic-write.py test/test-skf-severity-classify.py test/test-skf-structural-diff.py test/test-skf-detect-tools.py test/test-skf-forge-tier-rw.py test/test-skf-emit-result-envelope.py test/test-skf-qmd-classify-collections.py test/test-skf-merge-ccc-exclusions.py test/test-skf-resolve-package.py test/test-skf-extract-public-api.py test/test-skf-render-quick-metadata.py test/test-skf-validate-brief-inputs.py test/test-skf-emit-brief-result-envelope.py test/test-skf-write-skill-brief.py test/test-skf-detect-workspaces.py test/test-skf-recommend-scope-type.py test/test-skf-detect-language.py test/test-skf-description-guard.py test/test-skf-detect-scripts-assets.py test/test-skf-hash-content.py test/test-skf-validate-brief-schema.py test/test-skf-check-workspace-drift.py test/test-skf-update-active-symlink.py test/test-skf-build-change-manifest.py test/test-skf-provenance-gap-dispatch.py test/test-skf-resolve-authoritative-files.py test/test-skf-scan-manifests.py test/test-skf-pair-intersect.py test/test-skf-enumerate-stack-skills.py test/test-skf-compare-file-hashes.py test/test-skf-load-provenance.py test/test-skf-scan-skill-md-structure.py test/test-skf-disqualify-candidates.py test/test-skf-chain-reachability.py -v",
|
|
56
|
+
"test:python": "uv run --with pytest --with pyyaml --with jsonschema pytest test/test-compute-score-contract.py test/test-skf-preflight.py test/test-skf-skill-inventory.py test/test-skf-validate-output.py test/test-skf-validate-frontmatter.py test/test-skf-manifest-ops.py test/test-skf-rebuild-managed-sections.py test/test-skf-atomic-write.py test/test-skf-severity-classify.py test/test-skf-structural-diff.py test/test-skf-detect-tools.py test/test-skf-forge-tier-rw.py test/test-skf-emit-result-envelope.py test/test-skf-qmd-classify-collections.py test/test-skf-merge-ccc-exclusions.py test/test-skf-resolve-package.py test/test-skf-extract-public-api.py test/test-skf-render-quick-metadata.py test/test-skf-validate-brief-inputs.py test/test-skf-emit-brief-result-envelope.py test/test-skf-write-skill-brief.py test/test-skf-detect-workspaces.py test/test-skf-recommend-scope-type.py test/test-skf-detect-language.py test/test-skf-language-corpora.py test/test-skf-merge-doc-urls.py test/test-skf-derive-assembly-shape.py test/test-skf-description-guard.py test/test-skf-detect-scripts-assets.py test/test-skf-hash-content.py test/test-skf-validate-brief-schema.py test/test-skf-check-workspace-drift.py test/test-skf-update-active-symlink.py test/test-skf-build-change-manifest.py test/test-skf-provenance-gap-dispatch.py test/test-skf-resolve-authoritative-files.py test/test-skf-scan-manifests.py test/test-skf-pair-intersect.py test/test-skf-enumerate-stack-skills.py test/test-skf-compare-file-hashes.py test/test-skf-load-provenance.py test/test-skf-scan-skill-md-structure.py test/test-skf-disqualify-candidates.py test/test-skf-chain-reachability.py test/test-skf-shape-detect.py test/test-skf-detect-docs.py test/test-skf-step-doc-sources.py test/test-skf-step-doc-drift.py test/test-skf-step-hard-gate.py test/test-skf-per-pipeline-thresholds.py test/test-skf-evidence-report-fallback.py test/test-skf-validate-pins.py test/test-skf-auto-shard.py test/test-skf-preapply.py test/test-skf-step-doc-rot.py test/test-skf-campaign-state.py test/test-skf-campaign-pins.py test/test-skf-campaign-deps.py test/test-skf-campaign-report.py test/test-skf-campaign-stepfiles.py test/test-skf-campaign-validate-state.py test/test-skf-campaign-provenance.py test/test-skf-campaign-parse-manifest.py test/test-skf-campaign-render-kickoff.py -v",
|
|
57
57
|
"test:schemas": "node test/test-agent-schema.js",
|
|
58
58
|
"test:workflow": "node test/test-workflow-state.js",
|
|
59
59
|
"validate:refs": "node tools/validate-file-refs.js --strict",
|
package/src/module-help.csv
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
module,skill,display-name,menu-code,description,action,args,phase,after,before,required,output-location,outputs
|
|
2
2
|
skf,skf-forger,Ferris — Skill Forge Agent,FF,"Skill compilation specialist — the forge master. Invoke to access all SKF workflows via guided menu.",,,anytime,,,false,,
|
|
3
|
-
skf,skf-setup,Setup Forge,SF,"Initialize forge environment — detect tools and set capability tier (Quick/Forge/Forge+/Deep)",,,anytime,,"skf-analyze-source,skf-brief-skill,skf-quick-skill,skf-verify-stack",false,,forge-tier.yaml
|
|
3
|
+
skf,skf-setup,Setup Forge,SF,"Initialize forge environment — detect tools and set capability tier (Quick/Forge/Forge+/Deep)",,,anytime,,"skf-analyze-source,skf-brief-skill,skf-quick-skill,skf-verify-stack,skf-campaign",false,,forge-tier.yaml
|
|
4
|
+
skf,skf-campaign,Campaign,CA,"Orchestrate multi-library skill production across sessions — dependency tracking, file-based state, and resume",,resume [--from=<skill>],anytime,skf-setup,,false,forge_data_folder,_campaign-state.yaml
|
|
4
5
|
skf,skf-analyze-source,Analyze Source,AN,"Discover what to skill in a large repo — produces recommended skill briefs",,,anytime,skf-setup,skf-brief-skill,false,forge_data_folder,skill-brief.yaml
|
|
5
6
|
skf,skf-brief-skill,Brief Skill,BS,"Design a skill scope through guided discovery",,,anytime,"skf-setup,skf-analyze-source",skf-create-skill,false,forge_data_folder,skill-brief.yaml
|
|
6
7
|
skf,skf-create-skill,Create Skill,CS,"Compile a skill from a brief — supports --batch for multiple briefs",,--batch,anytime,skf-brief-skill,"skf-test-skill,skf-create-stack-skill",false,skills_output_folder,SKILL.md
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
workarounds:
|
|
3
|
+
- fingerprint: "```api\nGET /api/v1/skills/compile"
|
|
4
|
+
fix: "```\nskf compile --target <skill-dir>"
|
|
5
|
+
source: gmc-batch-2024-q4
|
|
6
|
+
severity: high
|
|
7
|
+
description: Hallucinated REST API endpoint replaced with correct CLI invocation
|
|
8
|
+
|
|
9
|
+
- fingerprint: 'requires-python = ">=3.8"'
|
|
10
|
+
fix: 'requires-python = ">=3.9"'
|
|
11
|
+
source: gmc-batch-2024-q4
|
|
12
|
+
severity: medium
|
|
13
|
+
description: Stale Python 3.8 minimum version updated to 3.9 baseline
|
|
14
|
+
|
|
15
|
+
- fingerprint: "## outputs\n\n## steps"
|
|
16
|
+
fix: "## Outputs\n\n## Steps"
|
|
17
|
+
source: gmc-batch-2025-q1
|
|
18
|
+
severity: high
|
|
19
|
+
description: Lowercase heading violates skill-sections spec capitalization rules
|
|
20
|
+
|
|
21
|
+
- fingerprint: "confidence: unverified"
|
|
22
|
+
fix: "confidence: T1-inferred"
|
|
23
|
+
source: gmc-batch-2025-q1
|
|
24
|
+
severity: medium
|
|
25
|
+
description: Missing provenance tier replaced with correct T1 annotation
|
|
26
|
+
|
|
27
|
+
- fingerprint: "[source: unknown]"
|
|
28
|
+
fix: "[source: repo-readme]"
|
|
29
|
+
source: gmc-batch-2024-q4
|
|
30
|
+
severity: low
|
|
31
|
+
description: Placeholder source attribution replaced with actual provenance
|
|
32
|
+
|
|
33
|
+
- fingerprint: "See [API Reference](./api-reference.md)"
|
|
34
|
+
fix: "See the API reference in the repository documentation."
|
|
35
|
+
source: gmc-batch-2025-q1
|
|
36
|
+
severity: high
|
|
37
|
+
description: Broken cross-reference to non-existent api-reference.md file
|
|
38
|
+
|
|
39
|
+
- fingerprint: "## Steps\n## Outputs"
|
|
40
|
+
fix: "## Steps\n\n## Outputs"
|
|
41
|
+
source: gmc-batch-2024-q4
|
|
42
|
+
severity: low
|
|
43
|
+
description: Missing blank line between heading sections fails markdown lint
|
|
44
|
+
|
|
45
|
+
- fingerprint: "(v1.0.0+)"
|
|
46
|
+
fix: ""
|
|
47
|
+
source: gmc-batch-2025-q1
|
|
48
|
+
severity: low
|
|
49
|
+
description: Inline version stamp removed per documentation conventions
|
|
50
|
+
|
|
51
|
+
- fingerprint: "tier: gold"
|
|
52
|
+
fix: "tier: verified"
|
|
53
|
+
source: gmc-batch-2024-q4
|
|
54
|
+
severity: medium
|
|
55
|
+
description: Non-standard tier label replaced with canonical tier vocabulary
|
|
56
|
+
|
|
57
|
+
- fingerprint: "```javascript\nfetch('/api/skill"
|
|
58
|
+
fix: "```bash\nskf"
|
|
59
|
+
source: gmc-batch-2025-q1
|
|
60
|
+
severity: high
|
|
61
|
+
description: Hallucinated JavaScript fetch call replaced with CLI command
|
|
62
|
+
|
|
63
|
+
- fingerprint: "## References\n## Steps"
|
|
64
|
+
fix: "## Steps"
|
|
65
|
+
source: gmc-batch-2024-q4
|
|
66
|
+
severity: high
|
|
67
|
+
description: References section misplaced before Steps violates section ordering
|
|
68
|
+
|
|
69
|
+
- fingerprint: "source: (generated)"
|
|
70
|
+
fix: "source: compilation-output"
|
|
71
|
+
source: gmc-batch-2025-q1
|
|
72
|
+
severity: low
|
|
73
|
+
description: Vague generated marker replaced with specific compilation-output source
|
|
74
|
+
|
|
75
|
+
- fingerprint: "# Skill Name\n# Overview"
|
|
76
|
+
fix: "# Skill Name\n\n## Overview"
|
|
77
|
+
source: gmc-batch-2024-q4
|
|
78
|
+
severity: high
|
|
79
|
+
description: Duplicate H1 heading replaced with correct H2 for Overview section
|
|
80
|
+
|
|
81
|
+
- fingerprint: "[ref: SKILL-SPEC-2.0](./spec.md)"
|
|
82
|
+
fix: "See the skill specification."
|
|
83
|
+
source: gmc-batch-2025-q1
|
|
84
|
+
severity: medium
|
|
85
|
+
description: Broken spec reference link to non-existent file
|
|
86
|
+
|
|
87
|
+
- fingerprint: "version: 0.9-draft"
|
|
88
|
+
fix: "version: 1"
|
|
89
|
+
source: gmc-batch-2024-q4
|
|
90
|
+
severity: medium
|
|
91
|
+
description: Draft version string replaced with release version
|
|
92
|
+
|
|
93
|
+
- fingerprint: "\\bconfidence:\\s*(?:none|n/a|unset)\\b"
|
|
94
|
+
fix: "confidence: T1-inferred"
|
|
95
|
+
source: gmc-batch-2025-q1
|
|
96
|
+
severity: medium
|
|
97
|
+
description: Empty or null confidence values normalized to T1-inferred
|
|
98
|
+
regex: true
|
|
99
|
+
|
|
100
|
+
- fingerprint: " - tool: compile-skill\n endpoint: /compile"
|
|
101
|
+
fix: " - tool: skf-compile\n invocation: CLI"
|
|
102
|
+
source: gmc-batch-2024-q4
|
|
103
|
+
severity: high
|
|
104
|
+
description: Hallucinated tool entry with REST endpoint replaced with correct CLI tool
|
|
105
|
+
|
|
106
|
+
- fingerprint: "## setup\n"
|
|
107
|
+
fix: "## Setup\n"
|
|
108
|
+
source: gmc-batch-2025-q1
|
|
109
|
+
severity: low
|
|
110
|
+
description: Lowercase Setup heading fails skill-check validation
|
|
111
|
+
|
|
112
|
+
- fingerprint: "\\[citation needed\\]"
|
|
113
|
+
fix: ""
|
|
114
|
+
source: gmc-batch-2024-q4
|
|
115
|
+
severity: low
|
|
116
|
+
description: Wikipedia-style citation placeholder removed from compiled output
|
|
117
|
+
regex: true
|
|
118
|
+
|
|
119
|
+
- fingerprint: "Last updated: 2023"
|
|
120
|
+
fix: ""
|
|
121
|
+
source: gmc-batch-2025-q1
|
|
122
|
+
severity: low
|
|
123
|
+
description: Stale 2023 date stamp removed from compiled skill content
|
|
124
|
+
|
|
125
|
+
- fingerprint: "## Inputs\n## inputs"
|
|
126
|
+
fix: "## Inputs"
|
|
127
|
+
source: gmc-batch-2024-q4
|
|
128
|
+
severity: medium
|
|
129
|
+
description: Duplicate Inputs section with inconsistent casing collapsed
|
|
130
|
+
|
|
131
|
+
- fingerprint: "\\bsee also:\\s*\\[.*\\]\\(https?://internal\\..*\\)"
|
|
132
|
+
fix: ""
|
|
133
|
+
source: gmc-batch-2025-q1
|
|
134
|
+
severity: high
|
|
135
|
+
description: Internal-only URL references removed from public skill output
|
|
136
|
+
regex: true
|
|
137
|
+
|
|
138
|
+
- fingerprint: "provenance: []\n"
|
|
139
|
+
fix: "provenance:\n - source: compilation-output\n confidence: T1-inferred\n"
|
|
140
|
+
source: gmc-batch-2024-q4
|
|
141
|
+
severity: medium
|
|
142
|
+
description: Empty provenance array populated with minimal compilation metadata
|
|
143
|
+
|
|
144
|
+
- fingerprint: "## Steps\n\n\n\n## Outputs"
|
|
145
|
+
fix: "## Steps\n\n## Outputs"
|
|
146
|
+
source: gmc-batch-2025-q1
|
|
147
|
+
severity: low
|
|
148
|
+
description: Excessive blank lines between sections reduced to standard single blank
|
|
149
|
+
|
|
150
|
+
- fingerprint: "\\|\\s*Step\\s*\\|\\s*Status\\s*\\|\\n\\|[-\\s|]+\\|\\n(?=\\|\\s*Step)"
|
|
151
|
+
fix: ""
|
|
152
|
+
source: gmc-batch-2024-q4
|
|
153
|
+
severity: medium
|
|
154
|
+
description: Duplicated markdown table header removed from compiled output
|
|
155
|
+
regex: true
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Canonical companion prose corpora for whole-language skills (issue #427). A language-reference repo (a compiler/interpreter such as rust-lang/rust) carries the language's CODE; its value as a skill comes from the language's PROSE — the guide/Book, the standard/library API docs, and idioms. README detection (skf-detect-docs.py) is the primary source; this registry guarantees the canonical corpora for well-known languages even when the repo's README does not link them. Keyed by lowercase language id (as emitted by skf-detect-language.py / step-auto-scope.md). URLs are version-agnostic, point at maintained latest-stable aliases, and were verified live. Consumed by skf-language-corpora.py, which emits the brief doc_urls contract {url, label, source} with source fixed to 'language-registry' (issue #432).",
|
|
3
|
+
"rust": [
|
|
4
|
+
{ "url": "https://doc.rust-lang.org/book/", "label": "The Rust Programming Language (Book)" },
|
|
5
|
+
{ "url": "https://doc.rust-lang.org/std/", "label": "Rust Standard Library" },
|
|
6
|
+
{ "url": "https://doc.rust-lang.org/reference/", "label": "The Rust Reference" }
|
|
7
|
+
],
|
|
8
|
+
"python": [
|
|
9
|
+
{ "url": "https://docs.python.org/3/tutorial/", "label": "The Python Tutorial" },
|
|
10
|
+
{ "url": "https://docs.python.org/3/library/", "label": "Python Standard Library" },
|
|
11
|
+
{ "url": "https://docs.python.org/3/reference/", "label": "Python Language Reference" },
|
|
12
|
+
{ "url": "https://docs.python.org/3/howto/", "label": "Python HOWTOs (idioms)" }
|
|
13
|
+
],
|
|
14
|
+
"go": [
|
|
15
|
+
{ "url": "https://go.dev/tour/", "label": "A Tour of Go" },
|
|
16
|
+
{ "url": "https://go.dev/doc/effective_go", "label": "Effective Go" },
|
|
17
|
+
{ "url": "https://go.dev/ref/spec", "label": "The Go Language Specification" },
|
|
18
|
+
{ "url": "https://pkg.go.dev/std", "label": "Go Standard Library" }
|
|
19
|
+
],
|
|
20
|
+
"typescript": [
|
|
21
|
+
{ "url": "https://www.typescriptlang.org/docs/handbook/intro.html", "label": "TypeScript Handbook" },
|
|
22
|
+
{ "url": "https://www.typescriptlang.org/docs/", "label": "TypeScript Documentation (Reference)" }
|
|
23
|
+
],
|
|
24
|
+
"javascript": [
|
|
25
|
+
{ "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide", "label": "MDN JavaScript Guide" },
|
|
26
|
+
{ "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference", "label": "MDN JavaScript Reference" }
|
|
27
|
+
],
|
|
28
|
+
"ruby": [
|
|
29
|
+
{ "url": "https://www.ruby-lang.org/en/documentation/quickstart/", "label": "Ruby in Twenty Minutes" },
|
|
30
|
+
{ "url": "https://docs.ruby-lang.org/en/master/", "label": "Ruby Core & Standard Library API" }
|
|
31
|
+
]
|
|
32
|
+
}
|
|
@@ -19,11 +19,15 @@ The forger also accepts common pipeline aliases:
|
|
|
19
19
|
|
|
20
20
|
| Alias | Expands To | Description |
|
|
21
21
|
|-------|-----------|-------------|
|
|
22
|
+
| `forge-auto` | `AN[auto] BS[auto] CS TS[min:90] EX` | Zero-ceremony auto-compile pipeline (bare repo/doc URL → verified skill) |
|
|
22
23
|
| `forge` | `BS CS TS EX` | Full skill creation pipeline (brief through export) |
|
|
23
24
|
| `forge-quick` | `QS TS EX` | Quick skill pipeline |
|
|
24
|
-
| `onboard` | `AN CS TS EX` | Full brownfield onboarding (AN generates briefs, CS consumes them directly) |
|
|
25
25
|
| `maintain` | `AS US TS EX` | Maintenance cycle (audit → update → test → export) |
|
|
26
26
|
|
|
27
|
+
**Deprecated alias:** `deepwiki` resolves to `forge-auto` (renamed to avoid collision with the DeepWiki MCP — the pipeline auto-forges a verified skill and does not call that MCP). It still works but emits a one-time deprecation notice.
|
|
28
|
+
|
|
29
|
+
**Note:** `campaign` is a standalone workflow invoked via `@Ferris campaign`, not a pipeline alias. It orchestrates its own multi-stage pipeline internally with dependency tracking and resume.
|
|
30
|
+
|
|
27
31
|
## Pipeline Rules
|
|
28
32
|
|
|
29
33
|
1. **Left to right execution** — each workflow completes before the next begins
|
|
@@ -33,12 +37,17 @@ The forger also accepts common pipeline aliases:
|
|
|
33
37
|
5. **Error halts propagate** — if any workflow hard-halts, the pipeline stops immediately
|
|
34
38
|
6. **Progress reporting** — the forger reports completion of each workflow before starting the next
|
|
35
39
|
|
|
40
|
+
## Pipeline Arguments
|
|
41
|
+
|
|
42
|
+
Pipeline-level arguments (e.g., `--pin <version>`) are passed to the first workflow's data context. The workflow decides how to consume them. For the `forge-auto` pipeline, `--pin` flows to AN, where `step-auto-scope.md §0b` uses it for pin resolution.
|
|
43
|
+
|
|
36
44
|
## Data Flow
|
|
37
45
|
|
|
38
46
|
How outputs from one workflow become inputs to the next:
|
|
39
47
|
|
|
40
48
|
| From | To | Data Passed | How |
|
|
41
49
|
|------|-----|------------|-----|
|
|
50
|
+
| AN | BS | `brief_path` from generated brief | Forger passes the `brief_path` from AN's output to BS[auto], which loads and enriches the brief |
|
|
42
51
|
| AN | CS | `skill-brief.yaml` paths from generated briefs | Forger passes each `brief_path` written by AN to CS; in batch mode, CS processes all sequentially |
|
|
43
52
|
| BS | CS | `skill-brief.yaml` path | Forger passes the brief path written by BS as `brief_path` to CS |
|
|
44
53
|
| CS | TS | skill name (derived from brief) | Forger passes the `skill_name` from the completed CS to TS |
|
|
@@ -57,7 +66,7 @@ Circuit breakers halt the pipeline when a workflow's output doesn't meet a quali
|
|
|
57
66
|
|----------|-------|-------------------|----------------|
|
|
58
67
|
| AN | recommended units count | min: 1 | Zero skillable units found |
|
|
59
68
|
| CS | compilation success | must complete | Hard error during compilation |
|
|
60
|
-
| TS | completeness score | min: 60 | Score below threshold |
|
|
69
|
+
| TS | completeness score | min: 60 (per-pipeline defaults apply — see init.md §1b) | Score below 80% floor (scores between 80% and per-pipeline threshold produce a fallback PASS with evidence report — pipeline continues) |
|
|
61
70
|
| AS | drift score | not CRITICAL | Critical drift found |
|
|
62
71
|
| VS | feasibility verdict | not BLOCKED | All integrations blocked |
|
|
63
72
|
|
|
@@ -68,6 +77,7 @@ Override syntax: `TS[min:80]` sets the test-skill threshold to 80 for this pipel
|
|
|
68
77
|
Brackets after a workflow code (`CODE[value]`) are parsed as follows:
|
|
69
78
|
|
|
70
79
|
- **Circuit breaker override**: `min:N` where N is a number — e.g., `TS[min:80]` sets the threshold for that workflow
|
|
80
|
+
- **Mode flag**: `auto` — e.g., `AN[auto]` activates auto mode for that workflow. The workflow's first step reads the flag from pipeline data context and routes to the appropriate auto-mode step file.
|
|
71
81
|
- **Target argument**: any other value — e.g., `CS[cocoindex]` passes "cocoindex" as the target to CS
|
|
72
82
|
|
|
73
83
|
Only workflows with a circuit breaker entry (AN, CS, TS, AS, VS) accept `min:N` overrides. All other workflows ignore `min:N` brackets. Target arguments are valid for any workflow that accepts a named input (CS, QS, BS, US, etc.).
|
|
@@ -78,12 +88,14 @@ The forger tracks pipeline state in memory during execution:
|
|
|
78
88
|
|
|
79
89
|
```yaml
|
|
80
90
|
pipeline:
|
|
91
|
+
alias: "forge" # pipeline alias name, or null for ad-hoc sequences
|
|
81
92
|
workflows: [AN, CS, TS, EX]
|
|
82
93
|
current_index: 1
|
|
83
94
|
completed:
|
|
84
95
|
- {code: AN, status: ok, output: {units: 3, briefs: [...]}}
|
|
85
96
|
pending: [CS, TS, EX]
|
|
86
97
|
data:
|
|
98
|
+
pipeline_alias: "forge" # forwarded to each workflow's data context (consumed by TS init.md §1b for per-pipeline threshold lookup)
|
|
87
99
|
skill_name: "cocoindex"
|
|
88
100
|
brief_path: "/path/to/skill-brief.yaml"
|
|
89
101
|
target: "cocoindex"
|