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
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
# Skill Brief Schema
|
|
2
|
-
|
|
3
|
-
## Required Fields
|
|
4
|
-
|
|
5
|
-
| Field | Type | Constraint | Description |
|
|
6
|
-
|-------|------|------------|-------------|
|
|
7
|
-
| name | string | kebab-case `[a-z0-9-]+` | Unique skill identifier |
|
|
8
|
-
| version | string | Semantic version (`X.Y.Z` or `X.Y.Z-prerelease`) | Auto-detect from source (see Version Detection below), fall back to `1.0.0` |
|
|
9
|
-
| source_repo | string | GitHub URL or local path | Repository or project root (optional when `source_type: "docs-only"`) |
|
|
10
|
-
| language | string | Recognized language | Primary programming language |
|
|
11
|
-
| scope | object | See Scope Object below | Boundary definition |
|
|
12
|
-
| description | string | 1-3 sentences | What the skill covers |
|
|
13
|
-
| forge_tier | string | `Quick` / `Forge` / `Forge+` / `Deep` | Inherited from forge-tier.yaml (Title Case) |
|
|
14
|
-
| created | string | ISO date `YYYY-MM-DD` | Generation date |
|
|
15
|
-
| created_by | string | user_name from config | Who generated the brief |
|
|
16
|
-
|
|
17
|
-
## Optional Fields
|
|
18
|
-
|
|
19
|
-
| Field | Type | Constraint | Description |
|
|
20
|
-
|-------|------|------------|-------------|
|
|
21
|
-
| source_type | string | `source` or `docs-only` | Default `source`. When `docs-only`: `source_repo` optional, `doc_urls` required |
|
|
22
|
-
| doc_urls | array | `{url, label}` objects | Documentation URLs for T3 content. Required when `source_type: "docs-only"` |
|
|
23
|
-
| `scripts_intent` | string | `detect` / `none` / free-text | Describes whether scripts should be extracted. Values: `detect` (auto-detect from source — default when absent), `none` (skip scripts), or a free-text description of expected scripts (e.g., "CLI validation tools in bin/"). |
|
|
24
|
-
| `assets_intent` | string | `detect` / `none` / free-text | Describes whether assets should be extracted. Values: `detect` (auto-detect from source — default when absent), `none` (skip assets), or a free-text description of expected assets (e.g., "JSON schemas in schemas/"). |
|
|
25
|
-
| `target_version` | string | Semantic version (`X.Y.Z` or `X.Y.Z-prerelease`) | User-specified target version. When present, overrides auto-detection and becomes the skill's version. Recommended for docs-only skills where auto-detection is unavailable. |
|
|
26
|
-
| `source_authority` | string | `official` / `community` / `internal` | Default `community`. Set to `official` only when the skill creator is the library maintainer. Forced to `community` when `source_type: "docs-only"`. |
|
|
27
|
-
| `source_ref` | string | Git ref (tag/branch/HEAD) | Resolved git ref used for source access. Set automatically during tag resolution — do not set manually. |
|
|
28
|
-
|
|
29
|
-
When `source_type: "docs-only"`:
|
|
30
|
-
- `source_repo` becomes optional (set to doc site URL for reference)
|
|
31
|
-
- `doc_urls` must have at least one entry
|
|
32
|
-
- `source_authority` is forced to `community` (T3 external documentation cannot be `official`)
|
|
33
|
-
- All extracted content gets `[EXT:{url}]` citations
|
|
34
|
-
|
|
35
|
-
## Version Detection
|
|
36
|
-
|
|
37
|
-
During brief creation, attempt to auto-detect the source version before defaulting to `"1.0.0"`. Check the first matching file in the source:
|
|
38
|
-
|
|
39
|
-
- **Python:** `pyproject.toml` `[project] version` (static) → if `dynamic = ["version"]`, check `__init__.py` for `__version__` → `_version.py` if exists → `setup.py` `version=` → `git describe --tags --abbrev=0`
|
|
40
|
-
- **JavaScript/TypeScript:** `package.json` (`"version"`)
|
|
41
|
-
- **Rust:** `Cargo.toml` `[package] version` (static) → if `version = { workspace = true }`, resolve from workspace root `Cargo.toml` → `git describe --tags --abbrev=0`
|
|
42
|
-
- **Go:** version tag from `go.mod` or `git describe --tags --abbrev=0`
|
|
43
|
-
|
|
44
|
-
If the source is a remote GitHub repo, use `gh api repos/{owner}/{repo}/contents/{file}` to read the version file. If the source is local, read the file directly.
|
|
45
|
-
|
|
46
|
-
If detection succeeds, use the detected version. If it fails or returns a non-semver value, fall back to `"1.0.0"`.
|
|
47
|
-
|
|
48
|
-
The create-skill workflow (step-03-extract) also performs version reconciliation at extraction time — if the source version has changed since the brief was created, the extraction step warns and uses the source version.
|
|
49
|
-
|
|
50
|
-
**Target version override:** When `target_version` is present in the brief, it takes precedence over auto-detection. Auto-detection still runs for informational purposes (displayed as "Detected version" alongside the user-specified "Target version"), but the `target_version` value is used as the brief's `version` field. This is particularly useful for docs-only skills (where no package manifest exists) and when the user wants to compile a skill for a specific older version.
|
|
51
|
-
|
|
52
|
-
**Pre-release handling:** If the detected version contains a pre-release tag (e.g., `1.0.0-beta.0`, `2.0.0-rc.1`), preserve it as-is. Pre-release tags are valid semver and must not be stripped. When comparing versions during reconciliation, use semver-aware comparison that respects pre-release ordering.
|
|
53
|
-
|
|
54
|
-
## Scope Object Structure
|
|
55
|
-
|
|
56
|
-
```yaml
|
|
57
|
-
scope:
|
|
58
|
-
type: full-library | specific-modules | public-api | component-library | docs-only
|
|
59
|
-
include:
|
|
60
|
-
- "src/**/*.ts" # Glob patterns for included files/directories
|
|
61
|
-
exclude:
|
|
62
|
-
- "**/*.test.*" # Glob patterns for excluded files
|
|
63
|
-
- "**/node_modules/**"
|
|
64
|
-
notes: "Optional notes about scope decisions"
|
|
65
|
-
# Additional fields when scope.type is "component-library":
|
|
66
|
-
# registry_path: "path/to/registry.ts" # Optional — auto-detected if omitted
|
|
67
|
-
# ui_variants: # Optional — design system variants
|
|
68
|
-
# - name: "shadcnui"
|
|
69
|
-
# package: "packages/components/react-shadcn"
|
|
70
|
-
# demo_patterns: # Optional — auto-detected if omitted
|
|
71
|
-
# - "**/demo/**"
|
|
72
|
-
# - "**/*.stories.*"
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
## YAML Template
|
|
76
|
-
|
|
77
|
-
```yaml
|
|
78
|
-
---
|
|
79
|
-
name: "{skill-name}"
|
|
80
|
-
version: "{detected-version or 1.0.0}" # Auto-detect from source, fall back to 1.0.0
|
|
81
|
-
source_type: "source" # "source" (default) or "docs-only"
|
|
82
|
-
source_repo: "{github-url-or-local-path}"
|
|
83
|
-
language: "{detected-language}"
|
|
84
|
-
description: "{brief-description}"
|
|
85
|
-
forge_tier: "{Quick|Forge|Forge+|Deep}"
|
|
86
|
-
created: "{date}"
|
|
87
|
-
created_by: "{user_name}"
|
|
88
|
-
scope:
|
|
89
|
-
type: "{full-library|specific-modules|public-api|component-library|docs-only}"
|
|
90
|
-
include:
|
|
91
|
-
- "{pattern}"
|
|
92
|
-
exclude:
|
|
93
|
-
- "{pattern}"
|
|
94
|
-
notes: "{optional-scope-notes}"
|
|
95
|
-
# target_version: "X.Y.Z" # Optional: overrides auto-detection when specified
|
|
96
|
-
# source_ref: "v0.5.0" # Auto-resolved — do not set manually
|
|
97
|
-
# Optional: documentation URLs for T3 content (required when source_type: "docs-only")
|
|
98
|
-
# doc_urls:
|
|
99
|
-
# - url: "https://docs.example.com/api"
|
|
100
|
-
# label: "API Reference"
|
|
101
|
-
# scripts_intent: detect # Optional: detect | none | description
|
|
102
|
-
# assets_intent: detect # Optional: detect | none | description
|
|
103
|
-
# source_authority: community # Optional: official | community | internal
|
|
104
|
-
---
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Human-Readable Presentation Format
|
|
108
|
-
|
|
109
|
-
When presenting the brief for confirmation (brief-skill step 04 only — not applicable to analyze-source batch generation), display as:
|
|
110
|
-
|
|
111
|
-
```
|
|
112
|
-
Skill Brief: {name}
|
|
113
|
-
====================
|
|
114
|
-
|
|
115
|
-
Target: {source_repo}
|
|
116
|
-
Language: {language}
|
|
117
|
-
Forge Tier: {forge_tier}
|
|
118
|
-
Description: {description}
|
|
119
|
-
|
|
120
|
-
Scope: {scope.type}
|
|
121
|
-
Include: {scope.include patterns, one per line}
|
|
122
|
-
Exclude: {scope.exclude patterns, one per line}
|
|
123
|
-
Notes: {scope.notes}
|
|
124
|
-
|
|
125
|
-
{If source_type is "docs-only":}
|
|
126
|
-
Source Type: docs-only
|
|
127
|
-
Doc URLs:
|
|
128
|
-
{doc_urls, one per line with labels}
|
|
129
|
-
|
|
130
|
-
{If source_type is "source" AND supplemental doc_urls collected:}
|
|
131
|
-
Supplemental Docs:
|
|
132
|
-
{doc_urls, one per line with labels}
|
|
133
|
-
|
|
134
|
-
{If scripts_intent or assets_intent was explicitly set (not default "detect"):}
|
|
135
|
-
Scripts: {scripts_intent}
|
|
136
|
-
Assets: {assets_intent}
|
|
137
|
-
|
|
138
|
-
Source Authority: {source_authority}
|
|
139
|
-
|
|
140
|
-
{If target_version is set:}
|
|
141
|
-
Target Version: {target_version} (user-specified)
|
|
142
|
-
Detected Version: {detected_version or "N/A"}
|
|
143
|
-
{Else:}
|
|
144
|
-
Version: {version}
|
|
145
|
-
{End if}
|
|
146
|
-
Created: {created}
|
|
147
|
-
Created by: {created_by}
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
## Validation Rules
|
|
151
|
-
|
|
152
|
-
1. `name` must be unique within {forge_data_folder}
|
|
153
|
-
2. `source_repo` must be accessible (gh api for GitHub, path exists for local)
|
|
154
|
-
3. `language` must be a recognized programming language
|
|
155
|
-
4. `scope.type` must be one of the five defined types
|
|
156
|
-
5. `scope.include` must have at least one pattern (exception: `docs-only` scope, where include patterns are optional since no source code is available)
|
|
157
|
-
6. `forge_tier` must be one of: Quick, Forge, Forge+, Deep (Title Case, must match the tier from forge-tier.yaml, or default to Quick)
|
|
158
|
-
7. When `source_type: "docs-only"`: `doc_urls` must have >= 1 entry, `source_repo` becomes optional
|
|
159
|
-
8. Each `doc_urls` entry must have a valid `url` field
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: brief-skill
|
|
3
|
-
description: Scope and design a skill through guided discovery
|
|
4
|
-
web_bundle: true
|
|
5
|
-
installed_path: '{project-root}/_bmad/skf/workflows/skillforge/brief-skill'
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Brief Skill
|
|
9
|
-
|
|
10
|
-
**Goal:** Help the user define what to skill — target repo, scope, language, inclusion/exclusion patterns — and produce a skill-brief.yaml that drives create-skill.
|
|
11
|
-
|
|
12
|
-
**Your Role:** In addition to your name, communication_style, and persona, you are also a skill scoping architect collaborating with a developer who wants to create an agent skill. This is a partnership, not a client-vendor relationship. You bring expertise in source code analysis, API surface identification, and skill boundary design, while the user brings their domain knowledge and specific use case for the skill. Work together as equals.
|
|
13
|
-
|
|
14
|
-
**Meta-Context:** This workflow is the first step in the skill creation pipeline. The skill-brief.yaml you produce together becomes the input contract for create-skill, which performs the actual compilation. Your job is to ensure the brief is well-scoped, accurate, and actionable — not to build the skill itself.
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## WORKFLOW ARCHITECTURE
|
|
19
|
-
|
|
20
|
-
### Core Principles
|
|
21
|
-
|
|
22
|
-
- **Micro-file Design**: Each step of the overall goal is a self contained instruction file that you will adhere to 1 file as directed at a time
|
|
23
|
-
- **Just-In-Time Loading**: Only 1 current step file will be loaded, read, and executed to completion - never load future step files until told to do so
|
|
24
|
-
- **Sequential Enforcement**: Sequence within the step files must be completed in order, no skipping or optimization allowed
|
|
25
|
-
- **State Tracking**: Data is accumulated conversationally across steps and written as skill-brief.yaml in the final step
|
|
26
|
-
- **Append-Only Building**: Each step builds on information gathered in previous steps
|
|
27
|
-
|
|
28
|
-
### Step Processing Rules
|
|
29
|
-
|
|
30
|
-
1. **READ COMPLETELY**: Always read the entire step file before taking any action
|
|
31
|
-
2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate
|
|
32
|
-
3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection
|
|
33
|
-
4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue)
|
|
34
|
-
5. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file
|
|
35
|
-
|
|
36
|
-
### Critical Rules (NO EXCEPTIONS)
|
|
37
|
-
|
|
38
|
-
- 🛑 **NEVER** load multiple step files simultaneously
|
|
39
|
-
- 📖 **ALWAYS** read entire step file before execution
|
|
40
|
-
- 🚫 **NEVER** skip steps or optimize the sequence
|
|
41
|
-
- 🎯 **ALWAYS** follow the exact instructions in the step file
|
|
42
|
-
- ⏸️ **ALWAYS** halt at menus and wait for user input
|
|
43
|
-
- 📋 **NEVER** create mental todo lists from future steps
|
|
44
|
-
- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}`
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## INITIALIZATION SEQUENCE
|
|
49
|
-
|
|
50
|
-
### 1. Module Configuration Loading
|
|
51
|
-
|
|
52
|
-
Load and read full config from {project-root}/_bmad/skf/config.yaml and resolve:
|
|
53
|
-
|
|
54
|
-
- `project_name`, `output_folder`, `user_name`, `communication_language`, `forge_data_folder`, `sidecar_path`
|
|
55
|
-
|
|
56
|
-
### 2. First Step Execution
|
|
57
|
-
|
|
58
|
-
Load, read the full file and then execute `./steps-c/step-01-gather-intent.md` to begin the workflow.
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
# Source Resolution Protocols
|
|
2
|
-
|
|
3
|
-
## Tag Resolution (when target_version is set)
|
|
4
|
-
|
|
5
|
-
When `brief.target_version` is present AND `source_repo` is a remote URL, resolve the target version to a git tag before cloning:
|
|
6
|
-
|
|
7
|
-
1. **List available tags:**
|
|
8
|
-
- `gh api repos/{owner}/{repo}/tags --paginate --jq '.[].name'`
|
|
9
|
-
- Fallback: `git ls-remote --tags {source_repo} | sed 's|.*refs/tags/||'`
|
|
10
|
-
|
|
11
|
-
2. **Match `target_version` against tags** in priority order:
|
|
12
|
-
- **Exact match:** `{target_version}` (e.g., `0.5.0`)
|
|
13
|
-
- **With `v` prefix:** `v{target_version}` (e.g., `v0.5.0`)
|
|
14
|
-
- **With package scope (monorepos):** `{brief.name}@{target_version}` or `@{scope}/{brief.name}@{target_version}`
|
|
15
|
-
|
|
16
|
-
3. **Resolution outcomes:**
|
|
17
|
-
- **Single match:** Store the matched tag as `source_ref`. Use it as `{branch}` in all subsequent clone/API commands.
|
|
18
|
-
- **Multiple matches:** Present the matching tags to the user — "Multiple tags match version {target_version}: {list}. Which one should I use?" Wait for selection.
|
|
19
|
-
- **Zero matches:** ⚠️ Warn: "No git tag found matching version {target_version}. Closest available tags: {list 5 nearest by semver sort}. Falling back to default branch — **extracted code may not match target version.**" Set `source_ref` to `HEAD` and proceed with default branch.
|
|
20
|
-
|
|
21
|
-
4. **Store `source_ref`** in context. This value is written to metadata.json and provenance-map.json for downstream workflows (update-skill, audit-skill) to re-clone from the same ref.
|
|
22
|
-
|
|
23
|
-
When `brief.target_version` is NOT set: skip tag resolution. Set `source_ref` to `HEAD` (default branch behavior, unchanged from before).
|
|
24
|
-
|
|
25
|
-
### Local Source Warning
|
|
26
|
-
|
|
27
|
-
When `brief.target_version` is set AND `source_repo` is a local path:
|
|
28
|
-
|
|
29
|
-
⚠️ "**Local source may not match target version {target_version}.** Ensure you've checked out the correct version locally, or use a remote GitHub URL so SKF can clone from the git tag automatically."
|
|
30
|
-
|
|
31
|
-
Proceed with local files as-is. Set `source_ref` to `"local"`.
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## Remote Source Resolution (Forge/Deep only)
|
|
36
|
-
|
|
37
|
-
If `source_repo` is a local path: proceed with the tier-appropriate strategy as normal.
|
|
38
|
-
|
|
39
|
-
If `source_repo` is a remote URL (GitHub URL or owner/repo format) AND tier is Forge or Deep:
|
|
40
|
-
|
|
41
|
-
1. **Check `git` availability:** Verify `git` is functional (`git --version`). If `git` is not available, skip to the fallback warning below.
|
|
42
|
-
|
|
43
|
-
2. **Ephemeral shallow clone:** Clone the repository to a system temp path for AST access. Use `source_ref` from tag resolution (or `{branch}` for the default branch if no tag was resolved):
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
temp_path = {system_temp}/skf-ephemeral-{skill-name}-{timestamp}/
|
|
47
|
-
git clone --depth 1 --branch {source_ref} --single-branch --filter=blob:none {source_repo} {temp_path}
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
**If `include_patterns` are NOT specified:**
|
|
51
|
-
|
|
52
|
-
```
|
|
53
|
-
git clone --depth 1 --branch {source_ref} --single-branch --filter=blob:none {source_repo} {temp_path}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
**If `include_patterns` ARE specified**, use sparse-checkout to limit the clone scope:
|
|
57
|
-
|
|
58
|
-
```
|
|
59
|
-
git clone --depth 1 --branch {branch} --single-branch --filter=blob:none --sparse {source_repo} {temp_path}
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
**Mode selection:** Choose sparse-checkout mode based on whether `exclude_patterns` exist:
|
|
63
|
-
|
|
64
|
-
- **No `exclude_patterns`:** Use default **cone mode** (faster). Convert `include_patterns` to directory roots.
|
|
65
|
-
- **`exclude_patterns` present:** Use **`--no-cone` mode** which supports gitignore-style negation patterns (`!` prefix). This applies both include and exclude at the git level, avoiding unnecessary blob downloads.
|
|
66
|
-
|
|
67
|
-
**Cone mode (no exclude patterns):**
|
|
68
|
-
|
|
69
|
-
**IMPORTANT:** `git sparse-checkout set` expects **directories**, not glob patterns. Convert `include_patterns` before passing them:
|
|
70
|
-
|
|
71
|
-
**Classification rule:** A pattern is an **individual file** if it contains no glob characters (`*`, `?`, `[`) AND does not end with `/`. Everything else is a glob — strip it to its directory root (the path prefix before the first glob character or wildcard segment).
|
|
72
|
-
|
|
73
|
-
- Strip glob suffixes to directory roots (e.g., `src/core/**/*.py` → `src/core`, `src/api/*.ts` → `src/api`)
|
|
74
|
-
- Deduplicate the resulting directory list
|
|
75
|
-
- Individual files (e.g., `pyproject.toml`, `src/utils/helpers.py`) are kept as-is
|
|
76
|
-
|
|
77
|
-
**If only directory roots (no individual files):**
|
|
78
|
-
|
|
79
|
-
```
|
|
80
|
-
git -C {temp_path} sparse-checkout set {converted_directory_roots}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
**If any individual files are present (or mixed):**
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
git -C {temp_path} sparse-checkout set --skip-checks {converted_directory_roots} {individual_files}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Example transformation:
|
|
90
|
-
```
|
|
91
|
-
Brief include_patterns: sparse-checkout args:
|
|
92
|
-
src/core/**/*.py → src/core (directory root)
|
|
93
|
-
src/api/*.ts → src/api (directory root)
|
|
94
|
-
examples/**/*.py → examples (directory root)
|
|
95
|
-
pyproject.toml → pyproject.toml (individual file, needs --skip-checks)
|
|
96
|
-
src/utils/helpers.py → src/utils/helpers.py (individual file, needs --skip-checks)
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
**No-cone mode (exclude patterns present):**
|
|
100
|
-
|
|
101
|
-
When `exclude_patterns` exist, use `--no-cone` mode to pass both include and exclude patterns directly as gitignore-style rules:
|
|
102
|
-
|
|
103
|
-
1. Convert `include_patterns` to gitignore-style patterns. For patterns without glob characters (`*`, `?`, `[`) that do not end with `/`, apply the **file-detection heuristic**: if the last path segment contains a `.` (file extension), it is an **individual file** — prepend `/` and keep as-is (e.g., `packages/registry/registry.json` → `/packages/registry/registry.json`). If the last path segment has no extension, it is a **bare directory name** — append `/**` (e.g., `cognee` → `cognee/**`). Patterns that already contain glob characters are kept as-is (e.g., `cognee/**` → kept as-is).
|
|
104
|
-
2. Convert `exclude_patterns` to negation patterns by prepending `!`. Apply the same file-detection heuristic: individual files (last segment has `.` extension) get `!/` prefix only (e.g., `src/internal/config.json` → `!/src/internal/config.json`); bare directory names get `/**` appended (e.g., `cognee/tests` → `!cognee/tests/**`). Patterns with globs are kept as-is with `!` prefix (e.g., `cognee/tests/**` → `!cognee/tests/**`; `**/test_*` → `!**/test_*`).
|
|
105
|
-
3. **CRITICAL:** List all include patterns BEFORE negated exclude patterns — git processes patterns in order and a negation can only suppress a prior inclusion.
|
|
106
|
-
4. Pass to sparse-checkout — include patterns first, then negated exclude patterns:
|
|
107
|
-
|
|
108
|
-
```
|
|
109
|
-
git -C {temp_path} sparse-checkout set --no-cone {include_gitignore_patterns} {negated_exclude_patterns}
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
Example transformation:
|
|
113
|
-
```
|
|
114
|
-
Brief include_patterns: Brief exclude_patterns:
|
|
115
|
-
cognee/** cognee/tests/**
|
|
116
|
-
packages/registry/registry.json cognee/alembic/**
|
|
117
|
-
**/test_*
|
|
118
|
-
|
|
119
|
-
sparse-checkout args (--no-cone):
|
|
120
|
-
'cognee/**' '/packages/registry/registry.json' '!cognee/tests/**' '!cognee/alembic/**' '!**/test_*'
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
Note: `registry.json` is an individual file (has `.json` extension), so it gets `/` prefix instead of `/**` suffix.
|
|
124
|
-
|
|
125
|
-
**Note:** `--no-cone` mode is slower than cone mode for very large repositories but eliminates downloading excluded blobs entirely.
|
|
126
|
-
|
|
127
|
-
**Always-included root files:**
|
|
128
|
-
|
|
129
|
-
Regardless of `include_patterns`, always add these root-level version/manifest files to the sparse-checkout pattern list. These are needed for version reconciliation and must not require a fallback to `gh api`:
|
|
130
|
-
|
|
131
|
-
`pyproject.toml`, `package.json`, `Cargo.toml`, `go.mod`, `setup.py`, `setup.cfg`, `VERSION`
|
|
132
|
-
|
|
133
|
-
In cone mode, always use the `--skip-checks` command form when adding these files — even if `include_patterns` resolved to only directory roots (which would normally use the form without `--skip-checks`). The command becomes: `git -C {temp_path} sparse-checkout set --skip-checks {directory_roots} pyproject.toml package.json Cargo.toml go.mod setup.py setup.cfg VERSION`. In no-cone mode, list them as explicit include patterns before any negation patterns. Do not flag them as extraneous inclusions during post-checkout filtering.
|
|
134
|
-
|
|
135
|
-
**Post-checkout filtering:**
|
|
136
|
-
|
|
137
|
-
After checkout, apply the original glob `include_patterns` as file-level filters when building the extraction file list — sparse-checkout gets the right directories, glob filtering narrows to the exact files. When `--no-cone` mode was used, most exclude filtering is already done at the git level, but apply `exclude_patterns` as a final pass to catch any edge cases where gitignore pattern matching diverges from the brief's glob semantics. Always-included root files (see above) are exempt from post-checkout filtering.
|
|
138
|
-
|
|
139
|
-
3. **If clone succeeds:** Update the working source path to `{temp_path}` for all subsequent AST operations in this step. Capture the source commit: `git -C {temp_path} rev-parse HEAD` — store as `source_commit` in context. Proceed with the **Forge/Deep Tier** extraction strategy below. Mark `ephemeral_clone_active = true` for cleanup.
|
|
140
|
-
|
|
141
|
-
4. **If clone fails (network error, auth failure, timeout):**
|
|
142
|
-
|
|
143
|
-
⚠️ **Warn the user explicitly:**
|
|
144
|
-
|
|
145
|
-
"Ephemeral clone of `{source_repo}` failed: {error}. Degrading to source reading (T1-low) for this run. For T1 (AST-verified) confidence, clone the repository locally and update `source_repo` in your brief to the local path."
|
|
146
|
-
|
|
147
|
-
Proceed with Quick tier extraction strategy below. Note the degradation reason in context for the evidence report.
|
|
148
|
-
|
|
149
|
-
**Ephemeral clone cleanup:** After extraction is complete for all files in scope (whether successful or partially failed), before presenting the Gate 2 summary (Section 6), if `ephemeral_clone_active`:
|
|
150
|
-
|
|
151
|
-
1. **Reset working directory first:** Before deleting the clone, ensure the shell working directory is not inside the temp path. Run `cd {project-root}` using the **absolute path** captured at workflow start (not a relative path). This prevents `getcwd` errors when the temp directory is deleted while it is the shell's cwd — which happens if `cd {temp_path}` was used during CCC init or extraction operations.
|
|
152
|
-
2. **Delete the clone:** `rm -rf {temp_path}`
|
|
153
|
-
3. **Log:** "Ephemeral source clone cleaned up."
|
|
154
|
-
|
|
155
|
-
This ensures cleanup runs even if some extractions failed, as long as the step itself is still executing. **If any error halts the extraction step before Gate 2 is reached**, cleanup must still occur: reset cwd to `{project-root}` and attempt to delete `{temp_path}` before halting. Log the cleanup attempt regardless of success.
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## Source Commit Capture (all tiers, source mode only)
|
|
160
|
-
|
|
161
|
-
**If `source_type: "docs-only"`:** skip — set `source_commit: null`.
|
|
162
|
-
|
|
163
|
-
After the source path is accessible, capture the current commit hash for provenance tracking:
|
|
164
|
-
|
|
165
|
-
- **Local path:** `git -C {source_root} rev-parse HEAD` — if the path is a git repo
|
|
166
|
-
- **Ephemeral clone (Forge/Deep):** already captured during clone (step 3 above)
|
|
167
|
-
- **Quick tier (remote, no clone):** `gh api repos/{owner}/{repo}/commits/{source_ref} --jq '.sha'`
|
|
168
|
-
|
|
169
|
-
Store the result as `source_commit` in context. If capture fails (not a git repo, API unavailable), set `source_commit: null` — this is not an error.
|
|
170
|
-
|
|
171
|
-
Also store `source_ref` in context (from tag resolution above, or `HEAD` if no tag was resolved, or `"local"` for local sources). This value is persisted to metadata.json and provenance-map.json so downstream workflows (update-skill, audit-skill) can re-access the same source ref.
|
|
172
|
-
|
|
173
|
-
---
|
|
174
|
-
|
|
175
|
-
## Version Reconciliation (all tiers, source mode only)
|
|
176
|
-
|
|
177
|
-
**Target version override:** If `brief.target_version` is present, use it as the authoritative version for the skill. Do NOT warn about a brief-vs-source version mismatch — the user intentionally specified this version. Set the working version to `brief.target_version` and skip the rest of this reconciliation section. The `target_version` field indicates deliberate user intent (e.g., targeting an older version, or providing the version for a docs-only skill).
|
|
178
|
-
|
|
179
|
-
**If `source_type: "docs-only"`:** skip this section — no source files exist to reconcile.
|
|
180
|
-
|
|
181
|
-
After the source path is accessible (local path from step-01, or ephemeral clone from above), check whether the source contains a version identifier and reconcile it with `brief.version`. Look for the first matching version file in the resolved source path:
|
|
182
|
-
|
|
183
|
-
- Python: `pyproject.toml` (`[project] version`), `setup.py` (`version=`), `__version__` in `__init__.py`
|
|
184
|
-
- JavaScript/TypeScript: `package.json` (`"version"`). **Monorepo resolution:** When multiple `package.json` files exist (workspace root + packages), resolve version using this priority:
|
|
185
|
-
1. Package whose `name` field matches `brief.name` (e.g., the skill's target library name)
|
|
186
|
-
2. Package with a `bin` field (CLI entry point — represents the published version)
|
|
187
|
-
3. Root workspace `package.json` version (if present)
|
|
188
|
-
4. Fall back to `brief.version` if no version found. For monorepos using workspace protocols (pnpm, yarn, npm workspaces), the root `package.json` often has no `version` field — this is expected, not an error.
|
|
189
|
-
- Rust: `Cargo.toml` (`[package] version`)
|
|
190
|
-
- Go: `go.mod` (module version if tagged)
|
|
191
|
-
|
|
192
|
-
**If a source version is found AND it differs from `brief.version`:**
|
|
193
|
-
|
|
194
|
-
⚠️ Warn the user: "Brief version ({brief.version}) differs from source version ({source_version}). Using source version ({source_version})."
|
|
195
|
-
|
|
196
|
-
Update the working version in context to the source version. Record the mismatch in context for the evidence report (step-08).
|
|
197
|
-
|
|
198
|
-
**If no version file is found or version cannot be extracted:** keep `brief.version` as-is. No warning needed.
|
|
199
|
-
|
|
200
|
-
**If source is remote and accessed via Quick tier (gh_bridge, no local files):** attempt to read the version file via `gh_bridge.read_file(owner, repo, "{version_file}")` — resolved as `gh api repos/{owner}/{repo}/contents/{version_file}` or direct file read if local (see [knowledge/tool-resolution.md](../../../knowledge/tool-resolution.md)) — for the primary version file of the detected language. If the read fails, keep `brief.version`.
|