bmad-module-skill-forge 0.9.0 → 0.10.1-alpha.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 +39 -0
- package/.gitattributes +16 -0
- package/README.md +105 -38
- package/docs/404.md +13 -10
- package/docs/RELEASING.md +185 -0
- package/docs/STABILITY.md +123 -0
- package/docs/_data/pinned.yaml +98 -0
- package/docs/agents.md +16 -11
- package/docs/architecture.md +221 -0
- package/docs/bmad-synergy.md +11 -13
- package/docs/concepts.md +18 -108
- package/docs/examples.md +121 -80
- package/docs/getting-started.md +85 -147
- package/docs/how-it-works.md +25 -536
- package/docs/index.md +44 -27
- package/docs/skill-model.md +328 -0
- package/docs/troubleshooting.md +39 -0
- package/docs/verifying-a-skill.md +232 -0
- package/docs/why-skf.md +93 -0
- package/docs/workflows.md +119 -13
- package/package.json +25 -4
- package/src/README.md +23 -25
- package/src/forger/forge-tier.yaml +4 -2
- package/src/forger/preferences.yaml +7 -1
- package/src/knowledge/agentskills-spec.md +1 -1
- package/src/knowledge/architecture-verification.md +1 -1
- package/src/knowledge/ccc-bridge.md +16 -15
- package/src/knowledge/overview.md +11 -11
- package/src/knowledge/progressive-capability.md +3 -3
- package/src/knowledge/provenance-tracking.md +9 -3
- package/src/knowledge/qmd-registry.md +8 -8
- package/src/knowledge/skf-knowledge-index.csv +2 -2
- package/src/knowledge/skill-lifecycle.md +16 -1
- package/src/knowledge/split-body-strategy.md +1 -1
- package/src/knowledge/version-paths.md +17 -12
- package/src/module-help.csv +18 -17
- package/src/module.yaml +4 -0
- package/src/shared/health-check.md +372 -0
- package/src/shared/references/feasibility-report-schema.md +86 -0
- package/src/shared/references/headless-gate-convention.md +62 -0
- package/src/shared/references/output-contract-schema.md +35 -0
- package/src/shared/references/pipeline-contracts.md +102 -0
- package/src/shared/scripts/skf-atomic-write.py +370 -0
- package/src/shared/scripts/skf-manifest-ops.py +236 -0
- package/src/shared/scripts/skf-preflight.py +164 -0
- package/src/shared/scripts/skf-rebuild-managed-sections.py +201 -0
- package/src/shared/scripts/skf-severity-classify.py +163 -0
- package/src/shared/scripts/skf-skill-inventory.py +210 -0
- package/src/shared/scripts/skf-structural-diff.py +257 -0
- package/src/shared/scripts/skf-validate-frontmatter.py +318 -0
- package/src/shared/scripts/skf-validate-output.py +247 -0
- package/src/skf-analyze-source/SKILL.md +57 -0
- package/src/skf-analyze-source/assets/skill-brief-schema.md +125 -0
- package/src/skf-analyze-source/references/unit-detection-heuristics.md +124 -0
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-01-init.md +6 -66
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-01b-continue.md +4 -59
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-02-scan-project.md +7 -68
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-03-identify-units.md +6 -66
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-04-map-and-detect.md +7 -68
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-05-recommend.md +6 -66
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-06-generate-briefs.md +14 -66
- package/src/skf-analyze-source/steps-c/step-07-health-check.md +22 -0
- package/src/skf-audit-skill/SKILL.md +59 -0
- package/src/{workflows/audit-skill/data → skf-audit-skill/assets}/drift-report-template.md +7 -7
- package/src/{workflows/audit-skill/data → skf-audit-skill/references}/severity-rules.md +11 -11
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-01-init.md +24 -68
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-02-re-index.md +36 -71
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-03-structural-diff.md +21 -63
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-04-semantic-diff.md +6 -65
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-05-severity-classify.md +5 -63
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-06-report.md +10 -59
- package/src/skf-audit-skill/steps-c/step-07-health-check.md +22 -0
- package/src/skf-brief-skill/SKILL.md +53 -0
- package/src/{workflows/brief-skill/data → skf-brief-skill/assets}/scope-templates.md +23 -0
- package/src/skf-brief-skill/assets/skill-brief-schema.md +206 -0
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-01-gather-intent.md +6 -67
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-02-analyze-target.md +6 -66
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-03-scope-definition.md +12 -68
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-04-confirm-brief.md +5 -63
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-05-write-brief.md +10 -69
- package/src/skf-brief-skill/steps-c/step-06-health-check.md +22 -0
- package/src/skf-create-skill/SKILL.md +63 -0
- package/src/{workflows/create-skill/data → skf-create-skill/assets}/compile-assembly-rules.md +60 -0
- package/src/{workflows/create-skill/data → skf-create-skill/assets}/skill-sections.md +92 -23
- package/src/skf-create-skill/assets/tessl-dismissal-rules.md +102 -0
- package/src/{workflows/create-skill/data → skf-create-skill/references}/extraction-patterns-tracing.md +13 -13
- package/src/{workflows/create-skill/data → skf-create-skill/references}/extraction-patterns.md +8 -3
- package/src/skf-create-skill/references/source-resolution-protocols.md +239 -0
- package/src/{workflows/create-skill/data → skf-create-skill/references}/tier-degradation-rules.md +8 -7
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-01-load-brief.md +25 -63
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-02-ecosystem-check.md +8 -64
- package/src/skf-create-skill/steps-c/step-03-extract.md +379 -0
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-03d-component-extraction.md +18 -35
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-04-enrich.md +12 -69
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-05-compile.md +71 -75
- package/src/skf-create-skill/steps-c/step-06-validate.md +267 -0
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-07-generate-artifacts.md +30 -74
- package/src/skf-create-skill/steps-c/step-08-report.md +145 -0
- package/src/skf-create-skill/steps-c/step-09-health-check.md +23 -0
- package/src/{workflows/create-skill/steps-c → skf-create-skill/steps-c/sub}/step-02b-ccc-discover.md +8 -66
- package/src/skf-create-skill/steps-c/sub/step-03b-fetch-temporal.md +229 -0
- package/src/{workflows/create-skill/steps-c → skf-create-skill/steps-c/sub}/step-03c-fetch-docs.md +18 -42
- package/src/skf-create-stack-skill/SKILL.md +64 -0
- package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/assets}/stack-skill-template.md +2 -1
- package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/references}/compose-mode-rules.md +19 -5
- package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/references}/integration-patterns.md +1 -1
- package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/references}/manifest-patterns.md +10 -10
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-01-init.md +14 -55
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-02-detect-manifests.md +29 -63
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-03-rank-and-confirm.md +9 -59
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-04-parallel-extract.md +29 -64
- package/src/skf-create-stack-skill/steps-c/step-05-detect-integrations.md +164 -0
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-06-compile-stack.md +7 -60
- package/src/skf-create-stack-skill/steps-c/step-07-generate-output.md +328 -0
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-08-validate.md +17 -63
- package/src/skf-create-stack-skill/steps-c/step-09-report.md +128 -0
- package/src/skf-create-stack-skill/steps-c/step-10-health-check.md +22 -0
- package/src/skf-drop-skill/SKILL.md +57 -0
- package/src/{workflows/drop-skill → skf-drop-skill}/steps-c/step-01-select.md +9 -69
- package/src/{workflows/drop-skill → skf-drop-skill}/steps-c/step-02-execute.md +30 -106
- package/src/skf-drop-skill/steps-c/step-03-report.md +83 -0
- package/src/skf-drop-skill/steps-c/step-04-health-check.md +22 -0
- package/src/skf-export-skill/SKILL.md +57 -0
- package/src/skf-export-skill/assets/managed-section-format.md +138 -0
- package/src/{workflows/export-skill/data → skf-export-skill/assets}/snippet-format.md +8 -12
- package/src/skf-export-skill/steps-c/step-01-load-skill.md +247 -0
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-02-package.md +5 -58
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-03-generate-snippet.md +15 -77
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-04-update-context.md +59 -133
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-05-token-report.md +4 -58
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-06-summary.md +20 -64
- package/src/skf-export-skill/steps-c/step-07-health-check.md +22 -0
- package/src/skf-forger/SKILL.md +110 -0
- package/src/skf-forger/bmad-skill-manifest.yaml +11 -0
- package/src/skf-quick-skill/SKILL.md +56 -0
- package/src/{workflows/quick-skill/data → skf-quick-skill/references}/registry-resolution.md +6 -6
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-01-resolve-target.md +9 -62
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-02-ecosystem-check.md +5 -59
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-03-quick-extract.md +18 -61
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-04-compile.md +6 -60
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-05-validate.md +58 -78
- package/src/skf-quick-skill/steps-c/step-06-write.md +73 -0
- package/src/skf-quick-skill/steps-c/step-07-health-check.md +22 -0
- package/src/skf-refine-architecture/SKILL.md +57 -0
- package/src/{workflows/refine-architecture/data → skf-refine-architecture/references}/refinement-rules.md +16 -16
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-01-init.md +6 -63
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-02-gap-analysis.md +29 -71
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-03-issue-detection.md +5 -65
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-04-improvements.md +5 -64
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-05-compile.md +5 -56
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-06-report.md +14 -64
- package/src/skf-refine-architecture/steps-c/step-07-health-check.md +22 -0
- package/src/skf-rename-skill/SKILL.md +58 -0
- package/src/{workflows/rename-skill → skf-rename-skill}/steps-c/step-01-select.md +12 -73
- package/src/{workflows/rename-skill → skf-rename-skill}/steps-c/step-02-execute.md +32 -113
- package/src/skf-rename-skill/steps-c/step-03-report.md +83 -0
- package/src/skf-rename-skill/steps-c/step-04-health-check.md +22 -0
- package/src/skf-setup/SKILL.md +55 -0
- package/src/{workflows/setup-forge → skf-setup}/steps-c/step-01-detect-and-tier.md +6 -62
- package/src/{workflows/setup-forge → skf-setup}/steps-c/step-01b-ccc-index.md +9 -65
- package/src/{workflows/setup-forge → skf-setup}/steps-c/step-02-write-config.md +15 -60
- package/src/{workflows/setup-forge → skf-setup}/steps-c/step-03-auto-index.md +7 -66
- package/src/skf-setup/steps-c/step-04-report.md +92 -0
- package/src/skf-setup/steps-c/step-05-health-check.md +22 -0
- package/src/skf-test-skill/SKILL.md +59 -0
- package/src/skf-test-skill/references/migration-section-rules.md +114 -0
- package/src/skf-test-skill/references/scoring-rules.md +207 -0
- package/src/skf-test-skill/references/source-access-protocol.md +109 -0
- package/src/skf-test-skill/scripts/compute-score.py +310 -0
- package/src/skf-test-skill/steps-c/step-01-init.md +238 -0
- package/src/{workflows/test-skill → skf-test-skill}/steps-c/step-02-detect-mode.md +4 -62
- package/src/skf-test-skill/steps-c/step-03-coverage-check.md +347 -0
- package/src/skf-test-skill/steps-c/step-04-coherence-check.md +239 -0
- package/src/{workflows/test-skill → skf-test-skill}/steps-c/step-04b-external-validators.md +42 -77
- package/src/skf-test-skill/steps-c/step-05-score.md +266 -0
- package/src/skf-test-skill/steps-c/step-06-report.md +290 -0
- package/src/skf-test-skill/steps-c/step-07-health-check.md +25 -0
- package/src/skf-test-skill/templates/test-report-template.md +58 -0
- package/src/skf-update-skill/SKILL.md +58 -0
- package/src/{workflows/update-skill/data → skf-update-skill/references}/manual-section-rules.md +6 -6
- package/src/{workflows/update-skill/data → skf-update-skill/references}/merge-conflict-rules.md +5 -5
- package/src/skf-update-skill/references/remote-source-resolution.md +94 -0
- package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-01-init.md +22 -69
- package/src/skf-update-skill/steps-c/step-02-detect-changes.md +255 -0
- package/src/skf-update-skill/steps-c/step-03-re-extract.md +336 -0
- package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-04-merge.md +60 -72
- package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-05-validate.md +5 -62
- package/src/skf-update-skill/steps-c/step-06-write.md +278 -0
- package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-07-report.md +11 -66
- package/src/skf-update-skill/steps-c/step-08-health-check.md +22 -0
- package/src/skf-verify-stack/SKILL.md +60 -0
- package/src/skf-verify-stack/assets/feasibility-report-template.md +76 -0
- package/src/{workflows/verify-stack/data → skf-verify-stack/references}/coverage-patterns.md +12 -4
- package/src/skf-verify-stack/references/integration-verification-rules.md +78 -0
- package/src/skf-verify-stack/steps-c/step-01-init.md +178 -0
- package/src/{workflows/verify-stack → skf-verify-stack}/steps-c/step-02-coverage.md +27 -72
- package/src/skf-verify-stack/steps-c/step-03-integrations.md +179 -0
- package/src/{workflows/verify-stack → skf-verify-stack}/steps-c/step-04-requirements.md +14 -67
- package/src/skf-verify-stack/steps-c/step-05-synthesize.md +147 -0
- package/src/skf-verify-stack/steps-c/step-06-report.md +156 -0
- package/src/skf-verify-stack/steps-c/step-07-health-check.md +25 -0
- package/tools/cli/commands/install.js +1 -1
- package/tools/cli/commands/status.js +21 -23
- package/tools/cli/commands/uninstall.js +11 -19
- package/tools/cli/commands/update.js +2 -2
- package/tools/cli/lib/ide-skills.js +216 -0
- package/tools/cli/lib/installer.js +29 -52
- package/tools/cli/lib/manifest.js +11 -5
- package/tools/cli/lib/platform-codes.yaml +223 -0
- package/tools/cli/lib/ui.js +76 -47
- package/tools/validate-docs-drift.js +193 -0
- package/src/agents/forger.agent.yaml +0 -114
- package/src/workflows/README.md +0 -174
- package/src/workflows/analyze-source/data/skill-brief-schema.md +0 -125
- package/src/workflows/analyze-source/data/unit-detection-heuristics.md +0 -124
- package/src/workflows/analyze-source/workflow.md +0 -61
- package/src/workflows/audit-skill/workflow.md +0 -64
- package/src/workflows/brief-skill/data/skill-brief-schema.md +0 -159
- package/src/workflows/brief-skill/workflow.md +0 -58
- package/src/workflows/create-skill/data/source-resolution-protocols.md +0 -200
- package/src/workflows/create-skill/steps-c/step-03-extract.md +0 -301
- package/src/workflows/create-skill/steps-c/step-03b-fetch-temporal.md +0 -253
- package/src/workflows/create-skill/steps-c/step-06-validate.md +0 -254
- package/src/workflows/create-skill/steps-c/step-08-report.md +0 -176
- package/src/workflows/create-skill/workflow.md +0 -53
- package/src/workflows/create-stack-skill/steps-c/step-05-detect-integrations.md +0 -196
- package/src/workflows/create-stack-skill/steps-c/step-07-generate-output.md +0 -270
- package/src/workflows/create-stack-skill/steps-c/step-09-report.md +0 -145
- package/src/workflows/create-stack-skill/workflow.md +0 -59
- package/src/workflows/drop-skill/steps-c/step-03-report.md +0 -135
- package/src/workflows/drop-skill/workflow.md +0 -63
- package/src/workflows/export-skill/data/managed-section-format.md +0 -103
- package/src/workflows/export-skill/steps-c/step-01-load-skill.md +0 -237
- package/src/workflows/export-skill/workflow.md +0 -58
- package/src/workflows/quick-skill/steps-c/step-06-write.md +0 -179
- package/src/workflows/quick-skill/workflow.md +0 -58
- package/src/workflows/refine-architecture/workflow.md +0 -61
- package/src/workflows/rename-skill/steps-c/step-03-report.md +0 -132
- package/src/workflows/rename-skill/workflow.md +0 -64
- package/src/workflows/setup-forge/steps-c/step-04-report.md +0 -156
- package/src/workflows/setup-forge/workflow.md +0 -51
- package/src/workflows/test-skill/data/scoring-rules.md +0 -123
- package/src/workflows/test-skill/data/source-access-protocol.md +0 -51
- package/src/workflows/test-skill/steps-c/step-01-init.md +0 -217
- package/src/workflows/test-skill/steps-c/step-03-coverage-check.md +0 -280
- package/src/workflows/test-skill/steps-c/step-04-coherence-check.md +0 -271
- package/src/workflows/test-skill/steps-c/step-05-score.md +0 -222
- package/src/workflows/test-skill/steps-c/step-06-report.md +0 -207
- package/src/workflows/test-skill/templates/test-report-template.md +0 -28
- package/src/workflows/test-skill/workflow.md +0 -57
- package/src/workflows/update-skill/data/remote-source-resolution.md +0 -57
- package/src/workflows/update-skill/steps-c/step-02-detect-changes.md +0 -221
- package/src/workflows/update-skill/steps-c/step-03-re-extract.md +0 -256
- package/src/workflows/update-skill/steps-c/step-06-write.md +0 -265
- package/src/workflows/update-skill/workflow.md +0 -56
- package/src/workflows/verify-stack/data/feasibility-report-template.md +0 -63
- package/src/workflows/verify-stack/data/integration-verification-rules.md +0 -73
- package/src/workflows/verify-stack/steps-c/step-01-init.md +0 -179
- package/src/workflows/verify-stack/steps-c/step-03-integrations.md +0 -195
- package/src/workflows/verify-stack/steps-c/step-05-synthesize.md +0 -191
- package/src/workflows/verify-stack/steps-c/step-06-report.md +0 -197
- package/src/workflows/verify-stack/workflow.md +0 -61
- package/tools/cli/lib/compiler.js +0 -306
- package/tools/cli/lib/ide-commands.js +0 -244
- /package/src/{workflows/analyze-source → skf-analyze-source}/templates/analysis-report-template.md +0 -0
- /package/src/{workflows/quick-skill/data → skf-quick-skill/assets}/skill-template.md +0 -0
- /package/src/{workflows/setup-forge/data → skf-setup/references}/tier-rules.md +0 -0
- /package/src/{workflows/test-skill/data → skf-test-skill/assets}/output-section-formats.md +0 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Verifying a Skill
|
|
3
|
+
description: How to audit any SKF-compiled skill — walk every instruction back to an upstream commit and line number in under 60 seconds.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
**Nothing is made up.** Every instruction in every skill traces back to a specific file, a specific line, and a specific commit in the upstream source. If a skill claims a function exists, you can open the real source tree at the pinned commit and see it with your own eyes. If the claim and the source disagree — that's a bug, and SKF treats it as one.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## The three-step audit
|
|
11
|
+
|
|
12
|
+
Pick any symbol in any SKF-compiled skill. You can trace it to the exact line of upstream source in under 60 seconds.
|
|
13
|
+
|
|
14
|
+
### 1. Open the skill's `metadata.json`
|
|
15
|
+
|
|
16
|
+
Every skill ships a `metadata.json` next to its `SKILL.md`. Note two fields:
|
|
17
|
+
|
|
18
|
+
- `source_commit` — the exact commit SHA the skill was compiled from
|
|
19
|
+
- `source_repo` — the upstream repository
|
|
20
|
+
|
|
21
|
+
This is the anchor. Everything else traces back to this commit.
|
|
22
|
+
|
|
23
|
+
### 2. Open the skill's `provenance-map.json`
|
|
24
|
+
|
|
25
|
+
Provenance maps live in `forge-data/{skill}/{version}/provenance-map.json` alongside each compiled skill. Find your symbol. Every entry carries its own `source_file` and `source_line`:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"export_name": "search",
|
|
30
|
+
"export_type": "function",
|
|
31
|
+
"params": ["query_text: str", "query_type: SearchType = GRAPH_COMPLETION", "top_k: int = 10"],
|
|
32
|
+
"return_type": "List[SearchResult]",
|
|
33
|
+
"source_file": "cognee/api/v1/search/search.py",
|
|
34
|
+
"source_line": 27,
|
|
35
|
+
"confidence": "T1",
|
|
36
|
+
"extraction_method": "ast-grep"
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The snippet above is a real entry from [`forge-data/oms-cognee/1.0.0/provenance-map.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/forge-data/oms-cognee/1.0.0/provenance-map.json). Line number is not rounded. Confidence tier is explicit. Extraction method is named. Nothing is paraphrased.
|
|
41
|
+
|
|
42
|
+
### 3. Visit the upstream repo at the pinned commit
|
|
43
|
+
|
|
44
|
+
Open `{source_repo}` at `{source_commit}`, jump to `{source_file}` line `{source_line}`. The signature in `SKILL.md` should match what you see in the source.
|
|
45
|
+
|
|
46
|
+
If it doesn't, **that's a bug**. [Open an issue](https://github.com/armelhbobdad/bmad-module-skill-forge/issues/new/choose). SKF will republish the skill with a new commit SHA and a new provenance map. Falsifiability isn't a feature — it's the whole deal.
|
|
47
|
+
|
|
48
|
+
### Workflow-time enforcement
|
|
49
|
+
|
|
50
|
+
The same anchor is enforced automatically by `skf-test-skill` and by gap-driven `skf-update-skill`. Before either workflow reads source at a recorded `source_line`, it runs `git rev-parse HEAD` on the local workspace and compares it to `metadata.source_commit`. If the workspace has drifted, the workflow halts with a `halted-for-workspace-drift` status and tells you the exact `git checkout {source_ref}` to re-sync — so spot-checks can never silently verify against the wrong tree. Pass `--allow-workspace-drift` to opt in to reading the current HEAD anyway; the override is recorded in the final report rather than hidden.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Where to look for what
|
|
55
|
+
|
|
56
|
+
Every file in the per-skill output carries a specific job. Here's the lookup table for the really skeptical:
|
|
57
|
+
|
|
58
|
+
| Question | File |
|
|
59
|
+
|---|---|
|
|
60
|
+
| What commit was the source pinned to? | `skills/{name}/{version}/{name}/metadata.json` → `source_commit` |
|
|
61
|
+
| Which symbols are documented and where did each come from? | `forge-data/{name}/{version}/provenance-map.json` |
|
|
62
|
+
| What AST patterns were used for extraction? | `forge-data/{name}/{version}/extraction-rules.yaml` |
|
|
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` |
|
|
65
|
+
| How was the skill scoped, and what was deliberately left out? | `forge-data/{name}/skill-brief.yaml` |
|
|
66
|
+
|
|
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.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## The scores, including the ones we lose
|
|
72
|
+
|
|
73
|
+
Completeness scoring is never 100%. The [scoring formula](#how-the-score-is-computed) is deterministic and the pass threshold is **80%** — but every test report also logs the specific edges where a skill falls short, so the numbers aren't marketing.
|
|
74
|
+
|
|
75
|
+
Take oh-my-skills' four reference skills as an example. Their scores range from **99.0% to 99.49%** — none are perfect, and every test report names the specific drift it found:
|
|
76
|
+
|
|
77
|
+
| Skill | Score | What the report discloses |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| [oms-cocoindex](https://github.com/armelhbobdad/oh-my-skills/blob/main/forge-data/oms-cocoindex/0.3.37/test-report-oms-cocoindex.md) | **99.0%** | 114/114 provenance entries; 55 public-API denominator from `__init__.py` `__all__`; 20/20 sampled signatures matched. Two denominators (barrel vs. full surface) both disclosed with rationale. |
|
|
80
|
+
| [oms-cognee](https://github.com/armelhbobdad/oh-my-skills/blob/main/forge-data/oms-cognee/1.0.0/test-report-oms-cognee.md) | **99.0%** | 34/34 exports documented; denominator is the `cognee/__init__.py` barrel (61 lines, 34 public re-exports) at pinned commit `3c048aa4` (v1.0.0). |
|
|
81
|
+
| [oms-storybook-react-vite](https://github.com/armelhbobdad/oh-my-skills/blob/main/forge-data/oms-storybook-react-vite/10.3.5/test-report-oms-storybook-react-vite.md) | **99.49%** | 215/216 documented — the missing 1 entry is logged openly as **GAP-004**, a canonical surface count drift from the stated denominator. |
|
|
82
|
+
| [oms-uitripled](https://github.com/armelhbobdad/oh-my-skills/blob/main/forge-data/oms-uitripled/0.1.0/test-report-oms-uitripled.md) | **99.45%** | 34-entry denominator (not 11, not 25) with the full reconciliation reasoning in the report. |
|
|
83
|
+
|
|
84
|
+
Perfection is suspicious. Visible fallibility is trustworthy. SKF writes down the edges it can't score cleanly — so you can read them and decide for yourself whether the remaining coverage is enough for your use case.
|
|
85
|
+
|
|
86
|
+
### GAP-004: a worked example of the 1% that fails
|
|
87
|
+
|
|
88
|
+
The [`oms-storybook-react-vite` test report](https://github.com/armelhbobdad/oh-my-skills/blob/main/forge-data/oms-storybook-react-vite/10.3.5/test-report-oms-storybook-react-vite.md) scores **215/216** — not 216/216. The missing 1 entry is logged as **GAP-004**: a canonical export surface count (via the provenance map) diverges from the stated denominator in metadata.json. The report names the gap, shows the math, and leaves the drift visible for the next recompilation pass. Nothing was hidden.
|
|
89
|
+
|
|
90
|
+
That's the pattern SKF asks you to trust: when scoring can't reach 100%, the report says so, cites the line, and leaves a fingerprint for the next audit.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## How the Score Is Computed
|
|
95
|
+
|
|
96
|
+
The Test Skill workflow (`@Ferris TS`) calculates the completeness score — a weighted measure of how thoroughly and accurately a skill documents its target. This score is the quality gate: pass and the skill is ready for export; fail and it routes to update-skill for remediation.
|
|
97
|
+
|
|
98
|
+
### Categories and weights
|
|
99
|
+
|
|
100
|
+
The score is the weighted sum of five categories:
|
|
101
|
+
|
|
102
|
+
| Category | Weight | What it measures |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| **Export Coverage** | 36% | Percentage of source exports documented in `SKILL.md` |
|
|
105
|
+
| **Signature Accuracy** | 22% | Documented function signatures match actual source signatures (parameter names, types, order, return types) |
|
|
106
|
+
| **Type Coverage** | 14% | Types and interfaces referenced in exports are fully documented |
|
|
107
|
+
| **Coherence** | 18% | Cross-references resolve, integration patterns are complete (contextual mode only) |
|
|
108
|
+
| **External Validation** | 10% | Average of skill-check quality score (0–100) and tessl content score (0–100%) |
|
|
109
|
+
|
|
110
|
+
### Formula
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
total_score = sum(category_weight × category_score)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Each category score is a percentage: `(items_passing / items_total) × 100`.
|
|
117
|
+
|
|
118
|
+
**Coherence** (contextual mode) combines two sub-scores:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
coherence = (reference_validity × 0.6) + (integration_completeness × 0.4)
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
If no integration patterns exist, coherence equals reference validity alone.
|
|
125
|
+
|
|
126
|
+
**External validation** averages the two tools when both are available. When only one tool is available, that tool's score is used. When neither is available, the 10% weight is redistributed proportionally to the other active categories.
|
|
127
|
+
|
|
128
|
+
### Deterministic scoring
|
|
129
|
+
|
|
130
|
+
The weight redistribution and score aggregation are computed by a deterministic Python script ([`compute-score.py`](https://github.com/armelhbobdad/bmad-module-skill-forge/blob/main/src/skf-test-skill/scripts/compute-score.py)). The LLM extracts category scores from the test report, constructs a JSON input, invokes the script, and uses its output for the final score. Same inputs always produce the same score. If the script is unavailable, the LLM falls back to manual calculation using the same formulas.
|
|
131
|
+
|
|
132
|
+
### Naive vs contextual mode
|
|
133
|
+
|
|
134
|
+
Test Skill runs in one of two modes, detected automatically:
|
|
135
|
+
|
|
136
|
+
- **Contextual mode** (stack skills) — all five categories scored with the default weights above.
|
|
137
|
+
- **Naive mode** (individual skills) — Coherence is not scored. Its 18% weight is redistributed:
|
|
138
|
+
|
|
139
|
+
| Category | Naive Weight |
|
|
140
|
+
|---|---|
|
|
141
|
+
| Export Coverage | 45% |
|
|
142
|
+
| Signature Accuracy | 25% |
|
|
143
|
+
| Type Coverage | 20% |
|
|
144
|
+
| External Validation | 10% |
|
|
145
|
+
|
|
146
|
+
### Tier adjustments
|
|
147
|
+
|
|
148
|
+
Your forge tier determines which categories can be scored:
|
|
149
|
+
|
|
150
|
+
| Tier | Skipped Categories | Reason |
|
|
151
|
+
|---|---|---|
|
|
152
|
+
| **Quick** | Signature Accuracy, Type Coverage | No AST parsing available |
|
|
153
|
+
| **Docs-only** | Signature Accuracy, Type Coverage | No source code to compare against |
|
|
154
|
+
| **Provenance-map** (State 2) | Signature Accuracy, Type Coverage | String comparison only, no semantic AST verification |
|
|
155
|
+
| **Forge / Forge+ / Deep** | None | Full AST-backed scoring |
|
|
156
|
+
|
|
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
|
+
|
|
159
|
+
### Pass/fail
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
threshold = custom_threshold OR 80% (default)
|
|
163
|
+
|
|
164
|
+
score >= threshold → PASS → Recommend export-skill
|
|
165
|
+
score < threshold → FAIL → Recommend update-skill
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
The default is 80%. You can override it by specifying a custom threshold when invoking the workflow (e.g., "test this skill with a 70% threshold").
|
|
169
|
+
|
|
170
|
+
### Gap severities
|
|
171
|
+
|
|
172
|
+
When the score is calculated, each finding is classified by severity to guide remediation:
|
|
173
|
+
|
|
174
|
+
| Severity | Examples |
|
|
175
|
+
|---|---|
|
|
176
|
+
| **Critical** | Missing exported function/class documentation |
|
|
177
|
+
| **High** | Signature mismatch between source and `SKILL.md` |
|
|
178
|
+
| **Medium** | Missing type/interface documentation; scripts/assets directory inconsistencies |
|
|
179
|
+
| **Low** | Missing optional metadata or examples; description optimization opportunities |
|
|
180
|
+
| **Info** | Style suggestions; discovery testing recommendations |
|
|
181
|
+
|
|
182
|
+
### Score report output
|
|
183
|
+
|
|
184
|
+
The test report includes a score breakdown table showing each category's raw score, weight, and weighted contribution:
|
|
185
|
+
|
|
186
|
+
| Category | Score | Weight | Weighted |
|
|
187
|
+
|---|---|---|---|
|
|
188
|
+
| Export Coverage | 92% | 36% | 33.1% |
|
|
189
|
+
| Signature Accuracy | 85% | 22% | 18.7% |
|
|
190
|
+
| Type Coverage | 100% | 14% | 14.0% |
|
|
191
|
+
| Coherence | 80% | 18% | 14.4% |
|
|
192
|
+
| External Validation | 78% | 10% | 7.8% |
|
|
193
|
+
| **Total** | | **100%** | **88.0%** |
|
|
194
|
+
|
|
195
|
+
The report also records `analysisConfidence` (full, provenance-map, metadata-only, remote-only, or docs-only) and includes a degradation notice when source access was limited.
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Build-time drift detection (for docs themselves)
|
|
200
|
+
|
|
201
|
+
The SKF docs you're reading right now are themselves verified against oh-my-skills. A `docs/_data/pinned.yaml` anchor file records the exact version, commit SHA, and confidence tier of every reference skill. A Node validator (`tools/validate-docs-drift.js`) runs as part of `npm run quality` and:
|
|
202
|
+
|
|
203
|
+
1. **Confirms canonical truth** — every anchor in `pinned.yaml` is cross-checked against the actual `metadata.json` in oh-my-skills. Version, commit, tier, and authority must match.
|
|
204
|
+
2. **Scans docs for stale prose** — every `.md` file is grepped for `<library> v?<x.y.z>` patterns and any version that disagrees with `pinned.yaml` is flagged with file + line number.
|
|
205
|
+
|
|
206
|
+
If the validator flags drift, the CI fails before the docs get merged. It's the same "nothing is made up" contract SKF applies to skills, applied to the docs that describe SKF. When the anchor file is updated to reflect a new oh-my-skills release, the prose must update too — otherwise `npm run docs:validate-drift` blocks the merge.
|
|
207
|
+
|
|
208
|
+
You can run it yourself from the SKF repo root:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
npm run docs:validate-drift
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Or point it at a different local copy of oh-my-skills:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
OMS=/path/to/your/oh-my-skills npm run docs:validate-drift
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Clean output looks like this:
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
OK: 4 skills checked against /home/you/oh-my-skills, no drift.
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Dirty output cites exact file:line locations so the fix is mechanical.
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Reference output: oh-my-skills
|
|
231
|
+
|
|
232
|
+
Every example in this page points at [**oh-my-skills**](https://github.com/armelhbobdad/oh-my-skills), the SKF reference portfolio. Four Deep-tier skills (cocoindex, cognee, Storybook v10, uitripled), each shipping its full audit trail alongside the compiled skill. Both the worked example for this page and the continuing proof that the pipeline does what it says. If you want to see what SKF produces when you run it on real libraries, that's the answer.
|
package/docs/why-skf.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Why Skill Forge?
|
|
3
|
+
description: The strategic case for SKF — the problem it solves, how it compares to alternatives, who it's for, and who it isn't.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Skill Forge is the only AI-skills toolchain where every claim your agent reads cites a file, a line, and a commit SHA. Not "sourced from training data." Not "retrieved from context." **Cited.** You can open the upstream repo at the pinned commit and see the function exists — in under a minute. That's the wedge. This page explains why it matters, how SKF compares to alternatives, and who it's for.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## The problem you're hiring SKF to solve
|
|
11
|
+
|
|
12
|
+
Your AI agents read your codebase through the lens of whatever happened to be in their training data. When that training data is wrong, stale, or incomplete, your agent invents — function names that don't exist, parameter types that don't match, config options removed two versions ago. You catch some of it in review. You ship some of it by accident. Every sprint, your team spends hours untangling code that only compiles in the AI's imagination.
|
|
13
|
+
|
|
14
|
+
SKF treats this as a citation problem, not a model problem. If a skill claims `cognee.search()` takes `query_text` as its first parameter, SKF points to `cognee/api/v1/search/search.py:L26` at commit `3c048aa4` in the upstream repo. That's the whole pitch: **nothing is made up, and everything is falsifiable in 60 seconds.**
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## How SKF compares
|
|
19
|
+
|
|
20
|
+
<div class="comparison-table">
|
|
21
|
+
|
|
22
|
+
| Approach | What it does well | Where it falls short |
|
|
23
|
+
|----------|-------------------|----------------------|
|
|
24
|
+
| Skill scaffolding (`npx skills init`) | Generates a spec-compliant skill file | The file is empty — you still have to write every instruction by hand |
|
|
25
|
+
| LLM summarization | Understands context and intent | Generates plausible-sounding content that may not match the actual API |
|
|
26
|
+
| RAG / context stuffing | Retrieves relevant code snippets | Returns fragments without synthesis — no coherent skill output |
|
|
27
|
+
| Manual authoring | High initial accuracy | Drifts as the source code changes, doesn't scale across dependencies |
|
|
28
|
+
| IDE built-in context (Copilot, Cursor) | Convenient, zero setup | Uses generic training data, not your project's specific integration patterns |
|
|
29
|
+
| **Skill Forge** | **Every instruction cites upstream `file:line` at a pinned commit. Falsifiable in 60 seconds.** | **Coverage depends on which tools you've installed (Quick / Forge / Forge+ / Deep tiers).** |
|
|
30
|
+
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## What "falsifiable in 60 seconds" actually means
|
|
36
|
+
|
|
37
|
+
Pick any symbol in any SKF-compiled skill. Three clicks:
|
|
38
|
+
|
|
39
|
+
1. Open the skill's `metadata.json` — it names the upstream repo and the exact commit SHA.
|
|
40
|
+
2. Open the skill's `provenance-map.json` — find your symbol; it lists the file and line.
|
|
41
|
+
3. Visit the upstream repo at that commit and that line. The signature in the skill should match.
|
|
42
|
+
|
|
43
|
+
If it doesn't, **that's a bug.** [Open an issue](https://github.com/armelhbobdad/bmad-module-skill-forge/issues/new/choose) and SKF republishes the skill with a new commit SHA and a new provenance map. No other AI-skills tool treats disagreement between claim and source as a defect. SKF does.
|
|
44
|
+
|
|
45
|
+
See the [Verifying a Skill](../verifying-a-skill/) page for the full three-step audit on real skills, the test reports that log *exactly* where coverage falls short, and the scoring formula behind the 80% pass threshold.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Who's this for?
|
|
50
|
+
|
|
51
|
+
### The curious developer
|
|
52
|
+
|
|
53
|
+
Your agent just hallucinated a method that doesn't exist, again. You want this to stop, and you don't want to read a 569-line architecture page before running your first command.
|
|
54
|
+
→ Start with [Getting Started](../getting-started/).
|
|
55
|
+
|
|
56
|
+
### The BMAD user
|
|
57
|
+
|
|
58
|
+
You already use BMAD Method, BMM phases, TEA, or BMB, and you want to know where SKF fits.
|
|
59
|
+
→ Read [BMAD Synergy](../bmad-synergy/) for the phase-by-phase integration playbook.
|
|
60
|
+
|
|
61
|
+
### The skeptic
|
|
62
|
+
|
|
63
|
+
"AI docs for AI" sounds like the problem pretending to be the solution. You want receipts before you install anything.
|
|
64
|
+
→ Start with [Verifying a Skill](../verifying-a-skill/) — the three-step audit on real skills, including the 1% that fails.
|
|
65
|
+
|
|
66
|
+
### The OSS maintainer
|
|
67
|
+
|
|
68
|
+
You want to ship verified skills alongside your library releases — `npx skills publish`-ready, drift-detectable, version-pinned.
|
|
69
|
+
→ See [Examples → OSS Maintainer Publishing Official Skills](../examples/#scenario-h-oss-maintainer-publishing-official-skills).
|
|
70
|
+
|
|
71
|
+
### The team lead evaluating adoption
|
|
72
|
+
|
|
73
|
+
You're considering running SKF across a brownfield platform. You need to know about rollback safety, `[MANUAL]` section preservation, and the health-check feedback loop before committing.
|
|
74
|
+
→ Start with [Architecture](../architecture/), then [Workflows → Workflow Health Check](../workflows/#terminal-step-health-check).
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Not for you if…
|
|
79
|
+
|
|
80
|
+
- You want docs that hand-hold through every happy path with screenshots and emojis. SKF is a citation machine, not a tutorial series.
|
|
81
|
+
- You need perfect coverage of every private implementation detail. SKF extracts public APIs; if you want internals, read the code directly.
|
|
82
|
+
- You don't have Node.js ≥ 22 and Python ≥ 3.10 installed. SKF is a Node/Python toolchain at its core.
|
|
83
|
+
- You're looking for something that generates skills from natural-language descriptions alone. SKF compiles from source code and documentation — not prompts.
|
|
84
|
+
|
|
85
|
+
Everything else is downstream of one question: *are the instructions your AI reads provably true?* If yes, SKF isn't adding value. If you can't be sure, SKF is the tool.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Next
|
|
90
|
+
|
|
91
|
+
- **[Install SKF](../getting-started/#install)** — Node ≥ 22, Python ≥ 3.10, `uv`, one `npx` command
|
|
92
|
+
- **[Audit a skill in 60 seconds](../verifying-a-skill/)** — see the receipts before you install
|
|
93
|
+
- **[Browse real skills](https://github.com/armelhbobdad/oh-my-skills)** — four Deep-tier skills, all shipping their audit trails
|
package/docs/workflows.md
CHANGED
|
@@ -3,9 +3,7 @@ title: Workflows
|
|
|
3
3
|
description: All 14 SKF workflows with commands, steps, and connection diagram
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
SKF has 14 workflows. You trigger them by typing commands to [Ferris](../agents/), the AI agent that runs everything. Each workflow handles a specific part of the skill lifecycle — from analyzing source code to packaging for distribution, plus management operations for renaming and dropping skills. If any terms are unfamiliar, see the [Concepts](../concepts/) page for definitions.
|
|
6
|
+
Trigger workflows by typing commands to [Ferris](../agents/). See [Concepts](../concepts/) for definitions.
|
|
9
7
|
|
|
10
8
|
> Already using BMAD? See [BMAD Synergy](../bmad-synergy/) for when to invoke each SKF workflow during BMM phases and alongside TEA, BMB, and GDS.
|
|
11
9
|
|
|
@@ -59,7 +57,7 @@ SKF has 14 workflows. You trigger them by typing commands to [Ferris](../agents/
|
|
|
59
57
|
|
|
60
58
|
**Command:** `@Ferris US`
|
|
61
59
|
|
|
62
|
-
**Purpose:**
|
|
60
|
+
**Purpose:** Regenerates the skill while preserving `[MANUAL]` sections. Detects individual vs stack internally.
|
|
63
61
|
|
|
64
62
|
**When to Use:** After source code changes when an existing skill needs updating.
|
|
65
63
|
|
|
@@ -77,7 +75,7 @@ SKF has 14 workflows. You trigger them by typing commands to [Ferris](../agents/
|
|
|
77
75
|
|
|
78
76
|
**Purpose:** Brief-less fast skill with package-to-repo resolution.
|
|
79
77
|
|
|
80
|
-
**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@0.
|
|
78
|
+
**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`).
|
|
81
79
|
|
|
82
80
|
**Key Steps:** Resolve target → Ecosystem check → Quick extract → Compile → Validate → Write
|
|
83
81
|
|
|
@@ -105,7 +103,7 @@ SKF has 14 workflows. You trigger them by typing commands to [Ferris](../agents/
|
|
|
105
103
|
|
|
106
104
|
**Command:** `@Ferris AN`
|
|
107
105
|
|
|
108
|
-
**Purpose:**
|
|
106
|
+
**Purpose:** Decomposes a repo to discover what's worth skilling, and recommends a stack skill.
|
|
109
107
|
|
|
110
108
|
**When to Use:** Brownfield onboarding of large repos or multi-service projects.
|
|
111
109
|
|
|
@@ -123,10 +121,12 @@ SKF has 14 workflows. You trigger them by typing commands to [Ferris](../agents/
|
|
|
123
121
|
|
|
124
122
|
**Purpose:** Drift detection between skill and current source.
|
|
125
123
|
|
|
126
|
-
**When to Use:** To check if a skill has fallen out of date with its source code.
|
|
124
|
+
**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.
|
|
127
125
|
|
|
128
126
|
**Key Steps:** Load skill → Re-index source → Structural diff (incl. script/asset drift) → Semantic diff (Deep) → Classify severity → Report
|
|
129
127
|
|
|
128
|
+
**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).
|
|
129
|
+
|
|
130
130
|
**Agent:** Ferris (Audit mode)
|
|
131
131
|
|
|
132
132
|
---
|
|
@@ -135,13 +135,13 @@ SKF has 14 workflows. You trigger them by typing commands to [Ferris](../agents/
|
|
|
135
135
|
|
|
136
136
|
**Command:** `@Ferris TS`
|
|
137
137
|
|
|
138
|
-
**Purpose:**
|
|
138
|
+
**Purpose:** Verifies whether a skill covers its target completely and accurately. Naive and contextual modes. Quality gate before export.
|
|
139
139
|
|
|
140
140
|
**When to Use:** After creating or updating a skill, before exporting.
|
|
141
141
|
|
|
142
142
|
**Key Steps:** Load skill → Detect mode → Coverage check → Coherence check → External validation (skill-check, tessl) → Score → Gap report
|
|
143
143
|
|
|
144
|
-
**Scored Categories:** Export Coverage (36%), Signature Accuracy (22%), Type Coverage (14%), Coherence (18%), External Validation (10%). Default pass threshold: **80%**. Pass routes to Export Skill; fail routes to Update Skill with a gap report. See [Completeness Scoring](../
|
|
144
|
+
**Scored Categories:** Export Coverage (36%), Signature Accuracy (22%), Type Coverage (14%), Coherence (18%), External Validation (10%). Default pass threshold: **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.
|
|
145
145
|
|
|
146
146
|
**Agent:** Ferris (Audit mode)
|
|
147
147
|
|
|
@@ -167,7 +167,7 @@ SKF has 14 workflows. You trigger them by typing commands to [Ferris](../agents/
|
|
|
167
167
|
|
|
168
168
|
**Command:** `@Ferris RA`
|
|
169
169
|
|
|
170
|
-
**Purpose:**
|
|
170
|
+
**Purpose:** Improves an architecture document using verified skill data as evidence. Takes the original architecture doc + generated skills + optional VS report, fills gaps, flags contradictions, and suggests improvements — all citing specific APIs.
|
|
171
171
|
|
|
172
172
|
**When to Use:** After VS confirms feasibility, before running SS in compose-mode. Produces a refined architecture ready for stack skill composition.
|
|
173
173
|
|
|
@@ -217,7 +217,7 @@ SKF has 14 workflows. You trigger them by typing commands to [Ferris](../agents/
|
|
|
217
217
|
|
|
218
218
|
**Purpose:** Drop a specific skill version or an entire skill. Soft drop (default) marks the version as deprecated in the manifest and keeps files on disk. Hard drop (`--purge`) also deletes the files.
|
|
219
219
|
|
|
220
|
-
**When to Use:** Retire a deprecated version (e.g., drop
|
|
220
|
+
**When to Use:** Retire a deprecated version (e.g., drop an older cognee skill version because it's obsolete), free disk space, or remove a skill you no longer need.
|
|
221
221
|
|
|
222
222
|
**Key Steps:** Select skill → Select version(s) + mode → Update manifest → Rebuild context files → Delete files (if purge)
|
|
223
223
|
|
|
@@ -262,7 +262,7 @@ flowchart TD
|
|
|
262
262
|
TS --> EX[Export Skill]
|
|
263
263
|
```
|
|
264
264
|
|
|
265
|
-
> **One workflow per session
|
|
265
|
+
> **One workflow per session** (unless using pipeline mode). Each arrow in the diagrams above represents a new conversation session. Clear your context between workflows for best results — or use pipeline mode to chain them automatically. See [Pipeline Mode](#pipeline-mode) below.
|
|
266
266
|
|
|
267
267
|
---
|
|
268
268
|
|
|
@@ -272,7 +272,113 @@ flowchart TD
|
|
|
272
272
|
|----------|-----------|-------------|
|
|
273
273
|
| Core | SF, BS, CS, US | Setup, brief, create, and update skills |
|
|
274
274
|
| Feature | QS, SS, AN | Quick skill, stack skill, and analyze source |
|
|
275
|
-
| Quality | AS, TS |
|
|
275
|
+
| Quality | AS, TS | Detect skill drift (AS) and verify skill completeness (TS) |
|
|
276
276
|
| Architecture Verification | VS, RA | Pre-code architecture feasibility and refinement |
|
|
277
|
+
| Management | RS, DS | Rename and drop skill versions with transactional safety |
|
|
277
278
|
| Utility | EX | Package and export for consumption |
|
|
278
279
|
| In-Agent | WS, KI | WS: show lifecycle position, active briefs, and forge tier; KI: list knowledge fragments (both in-agent, no file-based workflow) |
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## Pipeline Mode
|
|
284
|
+
|
|
285
|
+
Instead of running one workflow per session, you can chain multiple workflows in a single command. Ferris executes them left to right, passing data (brief path, skill name) between each workflow automatically.
|
|
286
|
+
|
|
287
|
+
### Syntax
|
|
288
|
+
|
|
289
|
+
```
|
|
290
|
+
@Ferris BS CS TS EX — space-separated codes
|
|
291
|
+
@Ferris QS[cocoindex] TS EX — with target argument in brackets
|
|
292
|
+
@Ferris CS TS[min:80] EX — with circuit breaker threshold override
|
|
293
|
+
@Ferris forge-quick cognee — named alias with target
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Pipeline Aliases
|
|
297
|
+
|
|
298
|
+
| Alias | Expands To | First Workflow | Required Target |
|
|
299
|
+
|-------|-----------|----------------|-----------------|
|
|
300
|
+
| `forge` | `BS CS TS EX` | BS | GitHub URL or local path **+** skill name |
|
|
301
|
+
| `forge-quick` | `QS TS EX` | QS | GitHub URL **or** package name |
|
|
302
|
+
| `onboard` | `AN CS TS EX` | AN | Project path (defaults to current directory) |
|
|
303
|
+
| `maintain` | `AS US TS EX` | AS | Existing skill name |
|
|
304
|
+
|
|
305
|
+
**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.
|
|
306
|
+
|
|
307
|
+
### How It Works
|
|
308
|
+
|
|
309
|
+
- Pipelines **automatically activate headless mode** — all confirmation gates auto-proceed with their default action
|
|
310
|
+
- **Data flows automatically** — once the first workflow completes, the brief path or skill name becomes the input for downstream workflows
|
|
311
|
+
- **Circuit breakers** halt the pipeline if quality drops below a threshold (e.g., test score < 60 blocks export)
|
|
312
|
+
- **Anti-pattern warnings** — Ferris warns if you chain workflows in a problematic order (e.g., exporting before testing)
|
|
313
|
+
- **Progress reporting** — Ferris reports completion of each workflow before starting the next
|
|
314
|
+
- **Safe halt on ambiguity** — headless mode won't guess. If the initial target doesn't satisfy the first workflow's contract (e.g., `forge cognee` — ambiguous, not a URL or path), the pipeline halts at step 1 before any work happens and suggests concrete next steps.
|
|
315
|
+
|
|
316
|
+
### Examples
|
|
317
|
+
|
|
318
|
+
```
|
|
319
|
+
@Ferris forge-quick @tanstack/query — QS + TS + EX for TanStack Query
|
|
320
|
+
@Ferris forge https://github.com/topoteretes/cognee cognee — BS + CS + TS + EX, explicit URL + name
|
|
321
|
+
@Ferris forge https://github.com/topoteretes/cognee cognee "public API only" — with scope hint
|
|
322
|
+
@Ferris maintain cocoindex — AS + US + TS + EX for an existing cocoindex skill
|
|
323
|
+
@Ferris onboard — AN + CS + TS + EX on the current project
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Headless Mode
|
|
329
|
+
|
|
330
|
+
Add `--headless` or `-H` to any workflow command to skip all confirmation gates. Ferris auto-proceeds with default actions (typically "Continue") and logs each auto-decision. Progress output is still shown — headless skips interaction, not reporting.
|
|
331
|
+
|
|
332
|
+
```
|
|
333
|
+
@Ferris QS cocoindex --headless — quick skill with no interaction gates
|
|
334
|
+
@Ferris TS --headless — test a skill without the review pause
|
|
335
|
+
@Ferris EX -H — export with auto-approved context update
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
You can also set `headless_mode: true` in your forge preferences (`_bmad/_memory/forger-sidecar/preferences.yaml`) to make headless the default for all workflows.
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## Terminal Step: Health Check
|
|
343
|
+
|
|
344
|
+
All 14 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:
|
|
345
|
+
|
|
346
|
+
- Did any step instruction lead the agent astray or cause unnecessary back-and-forth?
|
|
347
|
+
- Was any step ambiguous, forcing the agent to guess?
|
|
348
|
+
- Did a scenario arise that the workflow didn't account for?
|
|
349
|
+
- Were any instructions wrong or contradictory?
|
|
350
|
+
|
|
351
|
+
If the answer to all of these is "no", the health check exits in one line (`Clean run. No workflow issues to report.`). If real friction was observed, Ferris presents structured findings, waits for your review, and — on your approval — routes them to this repo.
|
|
352
|
+
|
|
353
|
+
**Zero overhead for clean runs. High leverage when something breaks.** The health check is honest-by-default: zero findings is the expected outcome. Fabricated issues would hurt the signal, so Ferris only reports what the agent actually experienced.
|
|
354
|
+
|
|
355
|
+
### How findings are routed
|
|
356
|
+
|
|
357
|
+
- **Severity gate.** Only `bug` findings submit live as GitHub issues by default. `friction` and `gap` findings — the most subjective categories — go to a **local queue** at `{output_folder}/improvement-queue/` unless you explicitly opt in to submit them live during the review gate. This keeps the high-signal reports (real defects) flowing to maintainers while the softer observations sit safely on your disk for you to batch or revisit.
|
|
358
|
+
- **Fingerprint dedup.** Every finding gets a deterministic 7-hex fingerprint computed from `sha1(severity|workflow|step_file|section)` — no LLM similarity judgment, just a tuple hash. Before Ferris opens a new issue, it searches the repo for an existing open issue with the same `fp-*` label. If one exists, you're offered a choice: add a 👍 reaction (silent upvote), react + post a one-sentence environment delta, open a new issue anyway (if you're certain it's distinct), or skip. Re-reporting the same fingerprint is safe — it just adds to the signal-count on the canonical issue.
|
|
359
|
+
- **Global seen-cache.** Once you've submitted or reacted for a given fingerprint, it's recorded at `~/.skf/health-check-seen.json` so the same user never re-reports the same defect across sessions or across different projects on the same machine.
|
|
360
|
+
- **Server-side safety net.** If two users race past the client-side search and both open issues with the same fingerprint, a GitHub Action on this repo catches it: the later issue is auto-closed as a duplicate, linked to the canonical (lowest-numbered) issue, and a 👍 is added there to preserve the signal-count. Manual filers using the [issue template](https://github.com/armelhbobdad/bmad-module-skill-forge/issues/new/choose) feed the same pipeline.
|
|
361
|
+
|
|
362
|
+
**Net effect:** 1,000 users hitting the same bug produce **one canonical issue** with a reaction-count of roughly 1,000 — not 1,000 duplicate issues or a 1,000-comment thread. The maintainer sees population impact at a glance, and your report is never lost.
|
|
363
|
+
|
|
364
|
+
### Please let workflows run to completion
|
|
365
|
+
|
|
366
|
+
If you cancel a workflow early, or interrupt the agent before the terminal step, the health check doesn't run — and any friction from that session is lost. When you have time, let each workflow reach its natural end. The health check is how SKF learns to do better.
|
|
367
|
+
|
|
368
|
+
### If the health check didn't run
|
|
369
|
+
|
|
370
|
+
You have two recovery options:
|
|
371
|
+
|
|
372
|
+
1. **Ask Ferris to run it now** — while the session context is still fresh:
|
|
373
|
+
|
|
374
|
+
```
|
|
375
|
+
@Ferris please run the workflow health check for this session
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
Ferris will load `shared/health-check.md` and reflect on what just happened, exactly as if the workflow had reached its natural end.
|
|
379
|
+
|
|
380
|
+
2. **Open an issue directly** — use the [Workflow Health Check issue template](https://github.com/armelhbobdad/bmad-module-skill-forge/issues/new/choose) on this repo. Any concrete, evidence-based report helps — cite the specific step file and section where the friction occurred, and describe what you actually observed (not what you think the problem is).
|
|
381
|
+
|
|
382
|
+
Both paths feed the same improvement queue.
|
|
383
|
+
|
|
384
|
+
> **Note:** Some gates cannot be skipped even in headless mode — for example, merge conflicts in Update Skill always require human judgment.
|
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": "0.
|
|
4
|
+
"version": "0.10.1-alpha.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",
|
|
@@ -9,9 +9,15 @@
|
|
|
9
9
|
"bmad-module",
|
|
10
10
|
"agent-skills",
|
|
11
11
|
"agentskills",
|
|
12
|
+
"agents",
|
|
13
|
+
"skills",
|
|
12
14
|
"skill-forge",
|
|
15
|
+
"compilation",
|
|
16
|
+
"forge",
|
|
13
17
|
"ast-grep",
|
|
14
18
|
"qmd",
|
|
19
|
+
"cocoindex",
|
|
20
|
+
"cocoindex-code",
|
|
15
21
|
"provenance",
|
|
16
22
|
"code-analysis"
|
|
17
23
|
],
|
|
@@ -30,6 +36,7 @@
|
|
|
30
36
|
"docs:dev": "npm run --prefix website docs:dev",
|
|
31
37
|
"docs:fix-links": "node tools/fix-doc-links.js --write",
|
|
32
38
|
"docs:preview": "npm run --prefix website preview",
|
|
39
|
+
"docs:validate-drift": "node tools/validate-docs-drift.js",
|
|
33
40
|
"docs:validate-links": "node tools/validate-doc-links.js",
|
|
34
41
|
"format:check": "prettier --check \"**/*.{js,cjs,mjs,json,yaml}\"",
|
|
35
42
|
"format:fix": "prettier --write \"**/*.{js,cjs,mjs,json,yaml}\"",
|
|
@@ -37,17 +44,26 @@
|
|
|
37
44
|
"lint:fix": "eslint . --ext .js,.cjs,.mjs,.yaml --fix",
|
|
38
45
|
"lint:md": "markdownlint-cli2 \"**/*.md\"",
|
|
39
46
|
"prepare": "husky || exit 0",
|
|
47
|
+
"quality": "npm run format:check && npm run lint && npm run lint:md && npm run test:schemas && npm run test:install && npm run test:cli && npm run test:workflow && npm run test:python && npm run test:knowledge && npm run validate:schemas && npm run validate:skills && npm run validate:refs && npm run docs:validate-drift",
|
|
40
48
|
"release": "npm run release:patch",
|
|
41
49
|
"release:major": "npm version major && git push --follow-tags",
|
|
42
50
|
"release:minor": "npm version minor && git push --follow-tags",
|
|
43
51
|
"release:patch": "npm version patch && git push --follow-tags",
|
|
44
52
|
"release:prerelease": "npm version prerelease && git push --follow-tags",
|
|
45
|
-
"
|
|
53
|
+
"skf:install": "node tools/cli/skf-cli.js install",
|
|
54
|
+
"skf:status": "node tools/cli/skf-cli.js status",
|
|
55
|
+
"skf:uninstall": "node tools/cli/skf-cli.js uninstall",
|
|
56
|
+
"skf:update": "node tools/cli/skf-cli.js update",
|
|
57
|
+
"test": "npm run test:schemas && npm run test:install && npm run test:cli && npm run test:workflow && npm run test:python && npm run test:knowledge && npm run validate:schemas && npm run validate:skills && npm run validate:refs && npm run lint && npm run lint:md && npm run format:check",
|
|
46
58
|
"test:cli": "node test/test-cli-integration.js",
|
|
47
59
|
"test:install": "node test/test-installation-components.js",
|
|
48
60
|
"test:knowledge": "node test/test-knowledge-base.js",
|
|
61
|
+
"test:python": "uv run --with pytest --with pyyaml 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-severity-classify.py test/test-skf-structural-diff.py -v",
|
|
49
62
|
"test:schemas": "node test/test-agent-schema.js",
|
|
50
|
-
"
|
|
63
|
+
"test:workflow": "node test/test-workflow-state.js",
|
|
64
|
+
"validate:refs": "node tools/validate-file-refs.js --strict",
|
|
65
|
+
"validate:schemas": "node test/validate-agent-schema.js",
|
|
66
|
+
"validate:skills": "node tools/validate-skills.js --strict"
|
|
51
67
|
},
|
|
52
68
|
"lint-staged": {
|
|
53
69
|
"*.{js,cjs,mjs}": [
|
|
@@ -63,6 +79,9 @@
|
|
|
63
79
|
],
|
|
64
80
|
"*.md": [
|
|
65
81
|
"markdownlint-cli2"
|
|
82
|
+
],
|
|
83
|
+
"*.astro": [
|
|
84
|
+
"prettier --write --ignore-unknown"
|
|
66
85
|
]
|
|
67
86
|
},
|
|
68
87
|
"dependencies": {
|
|
@@ -80,6 +99,7 @@
|
|
|
80
99
|
"archiver": "^7.0.1",
|
|
81
100
|
"astro": "^5.16.0",
|
|
82
101
|
"c8": "^10.1.3",
|
|
102
|
+
"conventional-changelog-cli": "^5.0.0",
|
|
83
103
|
"csv-parse": "^6.1.0",
|
|
84
104
|
"eslint": "^9.33.0",
|
|
85
105
|
"eslint-config-prettier": "^10.1.8",
|
|
@@ -100,7 +120,8 @@
|
|
|
100
120
|
"xml2js": "^0.6.2",
|
|
101
121
|
"yaml": "^2.7.0",
|
|
102
122
|
"yaml-eslint-parser": "^1.2.3",
|
|
103
|
-
"yaml-lint": "^1.7.0"
|
|
123
|
+
"yaml-lint": "^1.7.0",
|
|
124
|
+
"zod": "^3.25.0"
|
|
104
125
|
},
|
|
105
126
|
"engines": {
|
|
106
127
|
"node": ">=22.0.0"
|