bmad-module-skill-forge 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/README.md +0 -8
- package/docs/_data/pinned.yaml +1 -1
- package/docs/_internal/STABILITY.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/examples.md +1 -1
- package/docs/workflows.md +5 -5
- package/package.json +2 -2
- package/src/README.md +1 -1
- package/src/knowledge/ccc-bridge.md +12 -12
- package/src/knowledge/qmd-registry.md +5 -5
- package/src/shared/health-check.md +5 -5
- package/src/shared/references/description-guard-protocol.md +100 -0
- package/src/shared/references/output-contract-schema.md +1 -1
- package/src/shared/scripts/schemas/skf-brief-result-envelope.v1.json +6 -6
- package/src/shared/scripts/schemas/skf-setup-result-envelope.v1.json +9 -3
- package/src/shared/scripts/schemas/skf-update-result-envelope.v1.json +149 -0
- package/src/shared/scripts/schemas/skill-brief.v1.json +22 -2
- package/src/shared/scripts/skf-build-change-manifest.py +420 -0
- package/src/shared/scripts/skf-check-workspace-drift.py +321 -0
- package/src/shared/scripts/skf-compare-file-hashes.py +357 -0
- package/src/shared/scripts/skf-description-guard.py +359 -0
- package/src/shared/scripts/skf-detect-language.py +2 -2
- package/src/shared/scripts/skf-detect-scripts-assets.py +613 -0
- package/src/shared/scripts/skf-detect-tools.py +97 -8
- package/src/shared/scripts/skf-detect-workspaces.py +1 -1
- package/src/shared/scripts/skf-disqualify-candidates.py +576 -0
- package/src/shared/scripts/skf-emit-brief-result-envelope.py +3 -3
- package/src/shared/scripts/skf-emit-result-envelope.py +93 -9
- package/src/shared/scripts/skf-enumerate-stack-skills.py +514 -0
- package/src/shared/scripts/skf-forge-tier-rw.py +11 -11
- package/src/shared/scripts/skf-hash-content.py +284 -0
- package/src/shared/scripts/skf-load-provenance.py +295 -0
- package/src/shared/scripts/skf-merge-ccc-exclusions.py +45 -1
- package/src/shared/scripts/skf-pair-intersect.py +250 -0
- package/src/shared/scripts/skf-provenance-gap-dispatch.py +433 -0
- package/src/shared/scripts/skf-qmd-classify-collections.py +42 -8
- package/src/shared/scripts/skf-recommend-scope-type.py +2 -2
- package/src/shared/scripts/skf-render-quick-metadata.py +2 -2
- package/src/shared/scripts/skf-resolve-authoritative-files.py +504 -0
- package/src/shared/scripts/skf-scan-manifests.py +738 -0
- package/src/shared/scripts/skf-scan-skill-md-structure.py +375 -0
- package/src/shared/scripts/skf-update-active-symlink.py +315 -0
- package/src/shared/scripts/skf-validate-brief-inputs.py +5 -5
- package/src/shared/scripts/skf-validate-brief-schema.py +348 -0
- package/src/shared/scripts/skf-write-skill-brief.py +61 -5
- package/src/skf-analyze-source/SKILL.md +69 -16
- package/src/skf-analyze-source/assets/skill-brief-schema.md +1 -1
- package/src/skf-analyze-source/customize.toml +55 -0
- package/src/skf-analyze-source/{steps-c/step-01b-continue.md → references/continue.md} +12 -12
- package/src/skf-analyze-source/{steps-c/step-06-generate-briefs.md → references/generate-briefs.md} +29 -10
- package/src/skf-analyze-source/{steps-c/step-07-health-check.md → references/health-check.md} +5 -3
- package/src/skf-analyze-source/{steps-c/step-03-identify-units.md → references/identify-units.md} +44 -14
- package/src/skf-analyze-source/{steps-c/step-01-init.md → references/init.md} +27 -6
- package/src/skf-analyze-source/{steps-c/step-04-map-and-detect.md → references/map-and-detect.md} +52 -25
- package/src/skf-analyze-source/{steps-c/step-05-recommend.md → references/recommend.md} +15 -8
- package/src/skf-analyze-source/{steps-c/step-02-scan-project.md → references/scan-project.md} +12 -10
- package/src/skf-analyze-source/references/unit-detection-heuristics.md +2 -0
- package/src/skf-analyze-source/templates/analysis-report-template.md +6 -6
- package/src/skf-audit-skill/SKILL.md +66 -15
- package/src/skf-audit-skill/assets/drift-report-template.md +6 -5
- package/src/skf-audit-skill/customize.toml +49 -0
- package/src/skf-audit-skill/{steps-c/step-07-health-check.md → references/health-check.md} +5 -3
- package/src/skf-audit-skill/references/init.md +305 -0
- package/src/skf-audit-skill/{steps-c/step-02-re-index.md → references/re-index.md} +11 -11
- package/src/skf-audit-skill/{steps-c/step-06-report.md → references/report.md} +25 -7
- package/src/skf-audit-skill/{steps-c/step-04-semantic-diff.md → references/semantic-diff.md} +6 -6
- package/src/skf-audit-skill/{steps-c/step-05-severity-classify.md → references/severity-classify.md} +5 -5
- package/src/skf-audit-skill/references/severity-rules.md +2 -0
- package/src/skf-audit-skill/{steps-c/step-03-structural-diff.md → references/structural-diff.md} +29 -16
- package/src/skf-brief-skill/SKILL.md +48 -18
- package/src/skf-brief-skill/assets/description-voice-examples.md +1 -1
- package/src/skf-brief-skill/assets/skill-brief-schema.md +32 -2
- package/src/skf-brief-skill/customize.toml +44 -0
- package/src/skf-brief-skill/{steps-c/step-02-analyze-target.md → references/analyze-target.md} +5 -5
- package/src/skf-brief-skill/{steps-c/step-04-confirm-brief.md → references/confirm-brief.md} +13 -10
- package/src/skf-brief-skill/references/draft-checkpoint.md +4 -4
- package/src/skf-brief-skill/{steps-c/step-01-gather-intent.md → references/gather-intent.md} +24 -24
- package/src/skf-brief-skill/references/headless-args.md +9 -9
- package/src/skf-brief-skill/references/headless-source-authority-detection.md +1 -1
- package/src/skf-brief-skill/{steps-c/step-06-health-check.md → references/health-check.md} +4 -2
- package/src/skf-brief-skill/references/portfolio-similarity-check.md +2 -2
- package/src/skf-brief-skill/references/qmd-collection-registration.md +1 -1
- package/src/skf-brief-skill/{steps-c/step-03-scope-definition.md → references/scope-definition.md} +19 -16
- package/src/skf-brief-skill/references/version-resolution.md +2 -2
- package/src/skf-brief-skill/{steps-c/step-05-write-brief.md → references/write-brief.md} +11 -10
- package/src/skf-create-skill/SKILL.md +25 -19
- package/src/skf-create-skill/assets/compile-assembly-rules.md +3 -3
- package/src/skf-create-skill/assets/skill-sections.md +5 -5
- package/src/skf-create-skill/assets/tessl-dismissal-rules.md +11 -11
- package/src/skf-create-skill/customize.toml +35 -0
- package/src/skf-create-skill/references/authoritative-files-protocol.md +142 -0
- package/src/skf-create-skill/{steps-c/step-05-compile.md → references/compile.md} +16 -16
- package/src/skf-create-skill/{steps-c/step-03d-component-extraction.md → references/component-extraction.md} +16 -16
- package/src/skf-create-skill/{steps-c/step-02-ecosystem-check.md → references/ecosystem-check.md} +4 -4
- package/src/skf-create-skill/{steps-c/step-04-enrich.md → references/enrich.md} +3 -3
- package/src/skf-create-skill/{steps-c/step-03-extract.md → references/extract.md} +52 -120
- package/src/skf-create-skill/references/extraction-patterns.md +8 -8
- package/src/skf-create-skill/{steps-c/step-07-generate-artifacts.md → references/generate-artifacts.md} +17 -9
- package/src/skf-create-skill/{steps-c/step-09-health-check.md → references/health-check.md} +4 -2
- package/src/skf-create-skill/{steps-c/step-01-load-brief.md → references/load-brief.md} +40 -32
- package/src/skf-create-skill/{steps-c/step-08-report.md → references/report.md} +8 -8
- package/src/skf-create-skill/references/source-resolution-protocols.md +6 -6
- package/src/skf-create-skill/{steps-c/sub/step-02b-ccc-discover.md → references/sub/ccc-discover.md} +5 -5
- package/src/skf-create-skill/{steps-c/sub/step-03c-fetch-docs.md → references/sub/fetch-docs.md} +28 -12
- package/src/skf-create-skill/{steps-c/sub/step-03b-fetch-temporal.md → references/sub/fetch-temporal.md} +81 -50
- package/src/skf-create-skill/{steps-c/step-06-validate.md → references/validate.md} +46 -26
- package/src/skf-create-stack-skill/SKILL.md +76 -17
- package/src/skf-create-stack-skill/assets/provenance-map-schema.md +102 -0
- package/src/skf-create-stack-skill/assets/stack-skill-template.md +1 -1
- package/src/skf-create-stack-skill/customize.toml +46 -0
- package/src/skf-create-stack-skill/{steps-c/step-06-compile-stack.md → references/compile-stack.md} +6 -5
- package/src/skf-create-stack-skill/references/compose-mode-rules.md +3 -1
- package/src/skf-create-stack-skill/{steps-c/step-05-detect-integrations.md → references/detect-integrations.md} +32 -11
- package/src/skf-create-stack-skill/{steps-c/step-02-detect-manifests.md → references/detect-manifests.md} +28 -28
- package/src/skf-create-stack-skill/{steps-c/step-07-generate-output.md → references/generate-output.md} +11 -85
- package/src/skf-create-stack-skill/{steps-c/step-10-health-check.md → references/health-check.md} +4 -2
- package/src/skf-create-stack-skill/{steps-c/step-01-init.md → references/init.md} +70 -4
- package/src/skf-create-stack-skill/references/integration-patterns.md +2 -0
- package/src/skf-create-stack-skill/references/manifest-patterns.md +2 -0
- package/src/skf-create-stack-skill/{steps-c/step-04-parallel-extract.md → references/parallel-extract.md} +40 -17
- package/src/skf-create-stack-skill/{steps-c/step-03-rank-and-confirm.md → references/rank-and-confirm.md} +5 -4
- package/src/skf-create-stack-skill/{steps-c/step-09-report.md → references/report.md} +3 -3
- package/src/skf-create-stack-skill/{steps-c/step-08-validate.md → references/validate.md} +6 -6
- package/src/skf-drop-skill/SKILL.md +84 -12
- package/src/skf-drop-skill/customize.toml +57 -0
- package/src/skf-drop-skill/{steps-c/step-02-execute.md → references/execute.md} +49 -34
- package/src/skf-drop-skill/{steps-c/step-04-health-check.md → references/health-check.md} +6 -4
- package/src/skf-drop-skill/{steps-c/step-03-report.md → references/report.md} +13 -5
- package/src/skf-drop-skill/{steps-c/step-01-select.md → references/select.md} +63 -15
- package/src/skf-export-skill/SKILL.md +85 -16
- package/src/skf-export-skill/assets/managed-section-format.md +3 -3
- package/src/skf-export-skill/assets/snippet-format.md +2 -2
- package/src/skf-export-skill/customize.toml +49 -0
- package/src/skf-export-skill/{steps-c/step-03-generate-snippet.md → references/generate-snippet.md} +18 -12
- package/src/skf-export-skill/{steps-c/step-07-health-check.md → references/health-check.md} +6 -4
- package/src/skf-export-skill/{steps-c/step-01-load-skill.md → references/load-skill.md} +21 -51
- package/src/skf-export-skill/references/manifest-rebuild.md +68 -0
- package/src/skf-export-skill/references/multi-skill-mode.md +38 -0
- package/src/skf-export-skill/references/orphan-context-detection.md +75 -0
- package/src/skf-export-skill/references/orphan-row-detection.md +102 -0
- package/src/skf-export-skill/{steps-c/step-02-package.md → references/package.md} +7 -7
- package/src/skf-export-skill/references/preflight-snippet-root-probe.md +74 -0
- package/src/skf-export-skill/{steps-c/step-06-summary.md → references/summary.md} +30 -6
- package/src/skf-export-skill/{steps-c/step-05-token-report.md → references/token-report.md} +5 -5
- package/src/skf-export-skill/{steps-c/step-04-update-context.md → references/update-context.md} +116 -91
- package/src/skf-quick-skill/SKILL.md +63 -123
- package/src/skf-quick-skill/customize.toml +44 -0
- package/src/skf-quick-skill/references/batch-mode.md +102 -0
- package/src/skf-quick-skill/{steps-c/step-04-compile.md → references/compile.md} +10 -10
- package/src/skf-quick-skill/{steps-c/step-02-ecosystem-check.md → references/ecosystem-check.md} +5 -5
- package/src/skf-quick-skill/{steps-c/step-06-finalize.md → references/finalize.md} +7 -7
- package/src/skf-quick-skill/{steps-c/step-07-health-check.md → references/health-check.md} +3 -3
- package/src/skf-quick-skill/{steps-c/step-03-quick-extract.md → references/quick-extract.md} +5 -5
- package/src/skf-quick-skill/references/registry-resolution.md +2 -0
- package/src/skf-quick-skill/{steps-c/step-01-resolve-target.md → references/resolve-target.md} +14 -10
- package/src/skf-quick-skill/{steps-c/step-05-write-and-validate.md → references/write-and-validate.md} +4 -4
- package/src/skf-refine-architecture/SKILL.md +86 -16
- package/src/skf-refine-architecture/customize.toml +49 -0
- package/src/skf-refine-architecture/{steps-c/step-05-compile.md → references/compile.md} +4 -4
- package/src/skf-refine-architecture/{steps-c/step-02-gap-analysis.md → references/gap-analysis.md} +5 -5
- package/src/skf-refine-architecture/{steps-c/step-07-health-check.md → references/health-check.md} +6 -4
- package/src/skf-refine-architecture/{steps-c/step-04-improvements.md → references/improvements.md} +5 -5
- package/src/skf-refine-architecture/references/init.md +144 -0
- package/src/skf-refine-architecture/{steps-c/step-03-issue-detection.md → references/issue-detection.md} +5 -5
- package/src/skf-refine-architecture/references/refinement-rules.md +2 -0
- package/src/skf-refine-architecture/{steps-c/step-06-report.md → references/report.md} +14 -5
- package/src/skf-rename-skill/SKILL.md +82 -12
- package/src/skf-rename-skill/customize.toml +52 -0
- package/src/skf-rename-skill/{steps-c/step-02-execute.md → references/execute.md} +94 -99
- package/src/skf-rename-skill/references/health-check.md +30 -0
- package/src/skf-rename-skill/references/rebuild-context.md +110 -0
- package/src/skf-rename-skill/{steps-c/step-03-report.md → references/report.md} +13 -5
- package/src/skf-rename-skill/{steps-c/step-01-select.md → references/select.md} +59 -20
- package/src/skf-setup/SKILL.md +35 -35
- package/src/skf-setup/customize.toml +33 -0
- package/src/skf-setup/{steps-c/step-03-auto-index.md → references/auto-index.md} +10 -18
- package/src/skf-setup/{steps-c/step-01b-ccc-index.md → references/ccc-index.md} +14 -22
- package/src/skf-setup/{steps-c/step-01-detect-and-tier.md → references/detect-and-tier.md} +23 -10
- package/src/skf-setup/{steps-c/step-05-health-check.md → references/health-check.md} +1 -1
- package/src/skf-setup/{steps-c/step-04-report.md → references/report.md} +21 -19
- package/src/skf-setup/references/tier-rules.md +1 -1
- package/src/skf-setup/{steps-c/step-02-write-config.md → references/write-config.md} +14 -13
- package/src/skf-test-skill/SKILL.md +77 -15
- package/src/skf-test-skill/customize.toml +54 -0
- package/src/skf-test-skill/{steps-c/step-04-coherence-check.md → references/coherence-check.md} +28 -71
- package/src/skf-test-skill/{steps-c/step-03-coverage-check.md → references/coverage-check.md} +16 -39
- package/src/skf-test-skill/{steps-c/step-02-detect-mode.md → references/detect-mode.md} +4 -26
- package/src/skf-test-skill/{steps-c/step-04b-external-validators.md → references/external-validators.md} +6 -28
- package/src/skf-test-skill/references/health-check.md +14 -0
- package/src/skf-test-skill/{steps-c/step-01-init.md → references/init.md} +21 -37
- package/src/skf-test-skill/references/migration-section-rules.md +4 -2
- package/src/skf-test-skill/{steps-c/step-06-report.md → references/report.md} +41 -51
- package/src/skf-test-skill/{steps-c/step-05-score.md → references/score.md} +26 -43
- package/src/skf-test-skill/references/scoring-rules.md +8 -6
- package/src/skf-test-skill/references/source-access-protocol.md +7 -5
- package/src/skf-test-skill/scripts/compute-score.py +88 -17
- package/src/skf-test-skill/templates/test-report-template.md +13 -13
- package/src/skf-update-skill/SKILL.md +23 -14
- package/src/skf-update-skill/customize.toml +44 -0
- package/src/skf-update-skill/{steps-c/step-02-detect-changes.md → references/detect-changes.md} +176 -68
- package/src/skf-update-skill/references/health-check.md +32 -0
- package/src/skf-update-skill/{steps-c/step-01-init.md → references/init.md} +56 -8
- package/src/skf-update-skill/references/manual-section-rules.md +4 -0
- package/src/skf-update-skill/references/merge-conflict-rules.md +4 -0
- package/src/skf-update-skill/{steps-c/step-04-merge.md → references/merge.md} +8 -8
- package/src/skf-update-skill/{steps-c/step-03-re-extract.md → references/re-extract.md} +53 -44
- package/src/skf-update-skill/references/remote-source-resolution.md +5 -1
- package/src/skf-update-skill/references/report.md +214 -0
- package/src/skf-update-skill/{steps-c/step-05-validate.md → references/validate.md} +5 -5
- package/src/skf-update-skill/{steps-c/step-06-write.md → references/write.md} +73 -51
- package/src/skf-verify-stack/SKILL.md +89 -17
- package/src/skf-verify-stack/assets/feasibility-report-template.md +4 -4
- package/src/skf-verify-stack/customize.toml +50 -0
- package/src/skf-verify-stack/references/coverage-patterns.md +2 -2
- package/src/skf-verify-stack/{steps-c/step-02-coverage.md → references/coverage.md} +7 -7
- package/src/skf-verify-stack/{steps-c/step-07-health-check.md → references/health-check.md} +7 -5
- package/src/skf-verify-stack/references/init.md +166 -0
- package/src/skf-verify-stack/references/integration-verification-rules.md +1 -1
- package/src/skf-verify-stack/{steps-c/step-03-integrations.md → references/integrations.md} +12 -12
- package/src/skf-verify-stack/{steps-c/step-06-report.md → references/report.md} +22 -41
- package/src/skf-verify-stack/{steps-c/step-04-requirements.md → references/requirements.md} +7 -7
- package/src/skf-verify-stack/{steps-c/step-05-synthesize.md → references/synthesize.md} +8 -8
- package/tools/validate-docs-drift.js +1 -1
- package/src/skf-audit-skill/steps-c/step-01-init.md +0 -221
- package/src/skf-refine-architecture/steps-c/step-01-init.md +0 -136
- package/src/skf-rename-skill/steps-c/step-04-health-check.md +0 -22
- package/src/skf-test-skill/steps-c/step-07-health-check.md +0 -25
- package/src/skf-update-skill/steps-c/step-07-report.md +0 -148
- package/src/skf-update-skill/steps-c/step-08-health-check.md +0 -22
- package/src/skf-verify-stack/steps-c/step-01-init.md +0 -178
package/src/skf-brief-skill/{steps-c/step-01-gather-intent.md → references/gather-intent.md}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
nextStepFile: '
|
|
2
|
+
nextStepFile: 'analyze-target.md'
|
|
3
3
|
forgeTierFile: '{sidecar_path}/forge-tier.yaml'
|
|
4
4
|
descriptionVoiceExamplesFile: 'assets/description-voice-examples.md'
|
|
5
5
|
headlessArgsFile: 'references/headless-args.md'
|
|
@@ -10,6 +10,8 @@ validateBriefInputsScript: '{project-root}/src/shared/scripts/skf-validate-brief
|
|
|
10
10
|
emitBriefEnvelopeScript: '{project-root}/src/shared/scripts/skf-emit-brief-result-envelope.py'
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
+
<!-- Config: communicate in {communication_language}. -->
|
|
14
|
+
|
|
13
15
|
# Step 1: Gather Intent
|
|
14
16
|
|
|
15
17
|
## STEP GOAL:
|
|
@@ -25,11 +27,9 @@ To initialize the brief-skill workflow by discovering the forge tier configurati
|
|
|
25
27
|
|
|
26
28
|
## MANDATORY SEQUENCE
|
|
27
29
|
|
|
28
|
-
**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change.
|
|
29
|
-
|
|
30
30
|
### 1. Discover Forge Tier
|
|
31
31
|
|
|
32
|
-
**Pre-flight write probe.** Before any conversational state accumulates, verify `{forge_data_folder}` is writable. A read-only mount, full disk, or permissions-denied path otherwise only surfaces at step
|
|
32
|
+
**Pre-flight write probe.** Before any conversational state accumulates, verify `{forge_data_folder}` is writable. A read-only mount, full disk, or permissions-denied path otherwise only surfaces at step 5's atomic write — by then the user has invested 5–15 minutes. Run a single-byte write-and-remove probe:
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
35
|
mkdir -p "{forge_data_folder}" && \
|
|
@@ -37,7 +37,7 @@ mkdir -p "{forge_data_folder}" && \
|
|
|
37
37
|
rm "{forge_data_folder}/.skf-write-probe"
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
`mkdir -p` succeeds on a pre-existing read-only mount, but the `printf > file` redirect actually attempts a write — that catches read-only, disk-full, and permissions-denied uniformly. **On any non-zero exit:** HALT (exit code 4, `halt_reason: "write-failed"`) — `"**Error:** {forge_data_folder} is not writable: {captured stderr}. Verify the path exists, the mount is writable, and there is free disk space, then re-run."` In headless mode, emit the error envelope per **step
|
|
40
|
+
`mkdir -p` succeeds on a pre-existing read-only mount, but the `printf > file` redirect actually attempts a write — that catches read-only, disk-full, and permissions-denied uniformly. **On any non-zero exit:** HALT (exit code 4, `halt_reason: "write-failed"`) — `"**Error:** {forge_data_folder} is not writable: {captured stderr}. Verify the path exists, the mount is writable, and there is free disk space, then re-run."` In headless mode, emit the error envelope per **step 5 §4b** with `halt_reason: "write-failed"` (skill_name is not yet resolved here — use the placeholder convention documented in §4b). On success, continue silently to the forge-tier load below.
|
|
41
41
|
|
|
42
42
|
Attempt to load `{forgeTierFile}`:
|
|
43
43
|
|
|
@@ -59,6 +59,8 @@ Attempt to load `{forgeTierFile}`:
|
|
|
59
59
|
|
|
60
60
|
"**Welcome to Brief Skill — the skill scoping workflow.**
|
|
61
61
|
|
|
62
|
+
**Wanted something different?** This workflow *creates* a new brief — a YAML scoping document for a skill that doesn't yet exist. If you meant to compile an existing brief into a skill (`/skf-create-skill`), package one for distribution (`/skf-export-skill`), or just ask SKF a question, type `cancel` at any prompt and run that workflow instead.
|
|
63
|
+
|
|
62
64
|
I'll help you define exactly what to skill and produce a `skill-brief.yaml` that drives the create-skill compilation workflow.
|
|
63
65
|
|
|
64
66
|
We'll work through this together:
|
|
@@ -74,8 +76,6 @@ We'll work through this together:
|
|
|
74
76
|
|
|
75
77
|
(Substitute `{tier_gloss}` with the matching one-liner so the user knows what the tier label means: `Quick` → "text-only extraction"; `Forge` → "AST-grep on, semantic discovery off"; `Forge+` → "AST-grep + ccc semantic discovery"; `Deep` → "full pipeline — AST + ccc + qmd portfolio search + LLM re-ranking". The tier sets the ceiling for what the downstream create-skill workflow can do; you can re-run setup later to change it.)
|
|
76
78
|
|
|
77
|
-
**Wanted something different?** This workflow *creates* a new brief — a YAML scoping document for a skill that doesn't yet exist. If you meant to compile an existing brief into a skill (`/skf-create-skill`), package one for distribution (`/skf-export-skill`), or just ask SKF a question, type `cancel` at any prompt and run that workflow instead.
|
|
78
|
-
|
|
79
79
|
Let's get started."
|
|
80
80
|
|
|
81
81
|
### 3. Gather Target Repository
|
|
@@ -97,7 +97,7 @@ Or type `cancel` / `exit` / `[X]` to leave without writing anything.
|
|
|
97
97
|
|
|
98
98
|
Wait for user response. Branch on the response:
|
|
99
99
|
|
|
100
|
-
- Empty input, `cancel`, `exit`, `[X]`, `q`, or `:q` → Display `"Cancelled — no brief was written."` and HALT (exit code 6, `halt_reason: "user-cancelled"`). Cancellation here is non-destructive — no files have been written yet by step
|
|
100
|
+
- Empty input, `cancel`, `exit`, `[X]`, `q`, or `:q` → Display `"Cancelled — no brief was written."` and HALT (exit code 6, `halt_reason: "user-cancelled"`). Cancellation here is non-destructive — no files have been written yet by step 1. Headless mode never reaches this branch (the GATE in §8 short-circuits the interactive sub-flows).
|
|
101
101
|
- Documentation URLs only (no source location) → §3.2
|
|
102
102
|
- GitHub URL or local filesystem path → §3.3
|
|
103
103
|
- Any other free-form question (e.g. "what is this?", "show me an example", "how does SKF work?") → answer briefly, re-display the prompt
|
|
@@ -119,8 +119,8 @@ Skip §3.3 and continue at "Confirm the target" below.
|
|
|
119
119
|
- Set `source_type: "source"` (default)
|
|
120
120
|
- **Pre-validate the target before continuing.** Issue these probes in a single message with parallel Bash calls:
|
|
121
121
|
- **GitHub URL:** `curl -sI --max-time 5 {url}`. On a 4xx (typically 404 for a typo'd repo or org), warn `"GitHub returned {status} for {url} — confirm the URL is correct."` and re-prompt. On 2xx, accept.
|
|
122
|
-
- **GitHub URL, in parallel:** `gh api repos/{owner}/{repo} --jq .name` (5-second timeout via `gh api --hostname github.com --method GET ... ` or just rely on default). On 403/404, warn `"GitHub API returned {status} for {owner}/{repo} — the repo may be private or your token may not have access. Step-02 will HALT here if this is not resolved. Continue anyway, or fix and re-prompt?"` and offer `[K] Keep anyway` / re-prompt for a corrected URL. Do not HALT — the canonical HALT still happens in step
|
|
123
|
-
- **GitHub URL, in parallel:** `gh auth status` — if it reports unauthenticated or the binary is missing, warn `"GitHub CLI not authenticated; step
|
|
122
|
+
- **GitHub URL, in parallel:** `gh api repos/{owner}/{repo} --jq .name` (5-second timeout via `gh api --hostname github.com --method GET ... ` or just rely on default). On 403/404, warn `"GitHub API returned {status} for {owner}/{repo} — the repo may be private or your token may not have access. Step-02 will HALT here if this is not resolved. Continue anyway, or fix and re-prompt?"` and offer `[K] Keep anyway` / re-prompt for a corrected URL. Do not HALT — the canonical HALT still happens in step 2 §1, but surfacing access failures at URL-entry time prevents 5+ minutes of intent investment getting lost. On any other error (network failure, missing binary), log silently and let `gh auth status` below catch it. On 2xx, accept silently.
|
|
123
|
+
- **GitHub URL, in parallel:** `gh auth status` — if it reports unauthenticated or the binary is missing, warn `"GitHub CLI not authenticated; step 2 will HALT when it tries to fetch the tree. Run 'gh auth login' before continuing, or supply a local clone path instead."` (Do not HALT here — let the user choose to fix or proceed; the canonical HALT still happens in step 2 §1's failure-class triage.)
|
|
124
124
|
- **Local path:** verify the directory exists (`test -d {path}`). If not, warn `"Local path {path} does not exist."` and re-prompt.
|
|
125
125
|
- Optionally ask: "Are there any documentation URLs you'd like to include for supplemental context? (These will be fetched as T3 external references.)"
|
|
126
126
|
- If yes: collect doc URLs into `doc_urls`
|
|
@@ -142,7 +142,7 @@ Confirm the target.
|
|
|
142
142
|
|
|
143
143
|
### 3b. Gather Target Version
|
|
144
144
|
|
|
145
|
-
This step only collects `target_version` and validates its shape with the regex below — auto-detection runs in step
|
|
145
|
+
This step only collects `target_version` and validates its shape with the regex below — auto-detection runs in step 2 and precedence/invariant resolution lands in step 5's writer script. The canonical precedence rules live in `references/version-resolution.md`; load it from step 2 / step 5 only when the relevant section needs it.
|
|
146
146
|
|
|
147
147
|
**Headless:** if `target_version` was supplied as an argument, store it and skip the interactive prompt below. If `doc_urls` were also supplied, treat the version-vs-doc-URL confirmation prompt as auto-confirmed (Y).
|
|
148
148
|
|
|
@@ -154,7 +154,7 @@ This step only collects `target_version` and validates its shape with the regex
|
|
|
154
154
|
|
|
155
155
|
Wait for user response.
|
|
156
156
|
|
|
157
|
-
**If user provides a version:** Validate the shape against `^v?\d+\.\d+\.\d+([.\-+][0-9A-Za-z][0-9A-Za-z.\-+]*)?$` (full X.Y.Z form, with optional `v` prefix and pre-release / build suffix; CalVer like `2024.04.01` accepted; partial forms like `1`, `1.2`, `v2`, `latest` rejected). On a match, store as `target_version` and set `version` to this value. On a non-match, warn `"'{value}' doesn't look like semver — write the explicit triple (e.g. 1.0.0). Fix it now or skip auto-detection?"` and re-prompt for a corrected value or blank to fall through to step
|
|
157
|
+
**If user provides a version:** Validate the shape against `^v?\d+\.\d+\.\d+([.\-+][0-9A-Za-z][0-9A-Za-z.\-+]*)?$` (full X.Y.Z form, with optional `v` prefix and pre-release / build suffix; CalVer like `2024.04.01` accepted; partial forms like `1`, `1.2`, `v2`, `latest` rejected). On a match, store as `target_version` and set `version` to this value. On a non-match, warn `"'{value}' doesn't look like semver — write the explicit triple (e.g. 1.0.0). Fix it now or skip auto-detection?"` and re-prompt for a corrected value or blank to fall through to step 2 auto-detection.
|
|
158
158
|
**If blank:** Proceed without `target_version` — version will be auto-detected in step 02.
|
|
159
159
|
|
|
160
160
|
{If target_version was set AND doc_urls are being collected (either docs-only primary or supplemental):}
|
|
@@ -176,7 +176,7 @@ If the command produces any output, skip this rail silently — repeat users don
|
|
|
176
176
|
|
|
177
177
|
"**Want to see a few example descriptions first?** [Y/N] (Helpful if this is your first time — I'll show the voices we use so you have an anchor for what 'good intent' produces.)"
|
|
178
178
|
|
|
179
|
-
On `[Y]`: load `{
|
|
179
|
+
On `[Y]`: load `{descriptionVoiceExamplesPath}` and present the five examples verbatim with a one-line preface (`"Each example shows a different voice — yours doesn't have to match any specific one."`). On `[N]` or empty: proceed silently.
|
|
180
180
|
|
|
181
181
|
"**What's your intent for this skill?**
|
|
182
182
|
|
|
@@ -227,12 +227,12 @@ Wait for confirmation or alternative.
|
|
|
227
227
|
{if a second alternate was produced:} [2] {alternate-2}
|
|
228
228
|
{if a third alternate was produced:} [3] {alternate-3}
|
|
229
229
|
|
|
230
|
-
Pick a number to use that name, type a different name, or press Enter to keep `{name}` and let step
|
|
230
|
+
Pick a number to use that name, type a different name, or press Enter to keep `{name}` and let step 5 §2b handle the overwrite prompt.
|
|
231
231
|
```
|
|
232
232
|
|
|
233
|
-
On a numbered choice, replace `{name}` with the chosen alternate. On Enter, fall through to step
|
|
233
|
+
On a numbered choice, replace `{name}` with the chosen alternate. On Enter, fall through to step 5's overwrite gate. On any other input, treat as a new candidate name and re-run the collision check against it.
|
|
234
234
|
|
|
235
|
-
- Headless: log `"warn: skill name '{name}' collides with existing brief at {path}"` and proceed; the existing-brief overwrite policy in step
|
|
235
|
+
- Headless: log `"warn: skill name '{name}' collides with existing brief at {path}"` and proceed; the existing-brief overwrite policy in step 5 §2b is the canonical gate (HALT with `overwrite-cancelled` unless `force` was supplied).
|
|
236
236
|
|
|
237
237
|
**Portfolio-similarity check.** When the flow is interactive AND forge tier is `Deep` AND `tools.qmd` is true in `forge-tier.yaml`, load `{portfolioSimilarityCheckFile}` and follow the procedure there to catch semantic near-duplicates that exact-name collision misses. Otherwise (headless, or tier below Deep, or qmd unavailable) skip the load — the check does not run.
|
|
238
238
|
|
|
@@ -260,11 +260,11 @@ Ready to analyze the target repository?"
|
|
|
260
260
|
|
|
261
261
|
### 7b. Synthesize Skill Description
|
|
262
262
|
|
|
263
|
-
The schema's `description` field is 1-3 sentences and surfaces in skill registries — it must exist by the time step
|
|
263
|
+
The schema's `description` field is 1-3 sentences and surfaces in skill registries — it must exist by the time step 4 presents the brief. Synthesize it explicitly here, while the user's intent is fresh, instead of letting it fall out implicitly later.
|
|
264
264
|
|
|
265
265
|
Compose a candidate 1-3 sentence description from the gathered material. **Write like a human library maintainer would** — what does an agent get from this skill, and when should it route here? Two facts must come through (what the skill is, when to use it); everything else is voice. Resist filling in the same skeleton every time.
|
|
266
266
|
|
|
267
|
-
Load `{
|
|
267
|
+
Load `{descriptionVoiceExamplesPath}` for the five voice examples (range of acceptable leads, structures, and trigger phrasings) and the "do not template-stamp" guidance, then compose in that spirit. The asset documents what "in that spirit" means; the gathered material to draw on is the target repo, the user's intent, the version if set, and any scope hints.
|
|
268
268
|
|
|
269
269
|
Present:
|
|
270
270
|
|
|
@@ -282,11 +282,11 @@ Wait for user confirmation or alternative.
|
|
|
282
282
|
|
|
283
283
|
On `tighten` or a fresh edit: re-prompt for the description. On `accept` or any non-edit response: store the accepted text and proceed. Counts of 1-3 store silently.
|
|
284
284
|
|
|
285
|
-
Store the accepted text as the brief's `description` field. The same field is re-presented in step
|
|
285
|
+
Store the accepted text as the brief's `description` field. The same field is re-presented in step 4 §3 for a final review pass — refinements there flow back to this value.
|
|
286
286
|
|
|
287
|
-
**Headless:** if the `intent` argument was supplied, load `{
|
|
287
|
+
**Headless:** if the `intent` argument was supplied, load `{descriptionVoiceExamplesPath}` and run the same synthesis against it (in `{document_output_language}`), then store the result. If `intent` was not supplied, fall back in priority order:
|
|
288
288
|
|
|
289
|
-
1. **GitHub repo description** — when `target_repo` is a GitHub URL, fetch `gh api repos/{owner}/{repo} --jq .description` (5-second timeout). If a non-empty description comes back, load `{
|
|
289
|
+
1. **GitHub repo description** — when `target_repo` is a GitHub URL, fetch `gh api repos/{owner}/{repo} --jq .description` (5-second timeout). If a non-empty description comes back, load `{descriptionVoiceExamplesPath}` and synthesize using the GitHub description as the seed in place of `intent`. Write the synthesized description in `{document_output_language}` regardless of the seed's language (the seed may be in any language; the output's language is dictated by the workflow's document-output configuration). Log `"info: description seeded from GitHub repo description"`. (The full `gh api repos` response is fetched again in step 2 §1; this lightweight `--jq .description` call only retrieves the one field.)
|
|
290
290
|
2. **Generic stub** — when no GitHub description is available (local-path target, GitHub repo with empty description, or `gh api` fails): derive from `target_repo` + `skill_name` (`"Use the {skill_name} skill to work with code or content from {target_repo}."`) — the generic fallback does not need the asset — and log `"warn: description synthesized without intent or repo description — narrow registry text."`
|
|
291
291
|
|
|
292
292
|
### 8. Present MENU OPTIONS
|
|
@@ -296,7 +296,7 @@ Display: "**Select:** [C] Continue to Target Analysis · [X] Cancel and exit"
|
|
|
296
296
|
#### Menu Handling Logic:
|
|
297
297
|
|
|
298
298
|
- IF C: Load, read entire file, then execute {nextStepFile}
|
|
299
|
-
- IF X: Treat as user-cancellation. Display `"Cancelled — no brief was written."` and HALT (exit code 6, `halt_reason: "user-cancelled"`). When `{headless_mode}` is true the GATE auto-proceeds and never reaches this branch — `[X]` is interactive-only. Cancellation here is non-destructive: no files have been written yet by step
|
|
299
|
+
- IF X: Treat as user-cancellation. Display `"Cancelled — no brief was written."` and HALT (exit code 6, `halt_reason: "user-cancelled"`). When `{headless_mode}` is true the GATE auto-proceeds and never reaches this branch — `[X]` is interactive-only. Cancellation here is non-destructive: no files have been written yet by step 1.
|
|
300
300
|
- IF Any other: Help user, then [Redisplay Menu Options](#8-present-menu-options)
|
|
301
301
|
|
|
302
302
|
#### EXECUTION RULES:
|
|
@@ -314,7 +314,7 @@ Display: "**Select:** [C] Continue to Target Analysis · [X] Cancel and exit"
|
|
|
314
314
|
|
|
315
315
|
The script returns a JSON envelope: `{valid, errors[], warnings[], normalized, halt_reason}`. Apply the result deterministically:
|
|
316
316
|
|
|
317
|
-
- **`valid: false`** — emit the error envelope per **step
|
|
317
|
+
- **`valid: false`** — emit the error envelope per **step 5 §4b** with the script's `halt_reason` (`"input-missing"` for absent required args / docs-only without doc_urls; `"input-invalid"` for enum violations, malformed semver, malformed kebab-case skill_name). Surface `errors[]` to the operator log so the failure is debuggable. HALT.
|
|
318
318
|
- **`valid: true`** — consume the `normalized` object as the source of truth (it has defaults applied per the table). Surface `warnings[]` to the operator log but do not HALT. Auto-proceed.
|
|
319
319
|
|
|
320
320
|
The script's `KNOWN_FIELDS` set must stay in sync with the table in `{headlessArgsFile}`.
|
|
@@ -325,5 +325,5 @@ Display: "**Select:** [C] Continue to Target Analysis · [X] Cancel and exit"
|
|
|
325
325
|
|
|
326
326
|
## CRITICAL STEP COMPLETION NOTE
|
|
327
327
|
|
|
328
|
-
ONLY WHEN C is selected and target repository is confirmed will you load and read fully
|
|
328
|
+
ONLY WHEN C is selected and target repository is confirmed will you load and read fully `analyze-target.md` to execute target analysis.
|
|
329
329
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Headless Argument Table
|
|
2
2
|
|
|
3
|
-
Loaded by step
|
|
3
|
+
Loaded by step 1 §8 only when `{headless_mode}` is true. Canonical operator-facing documentation for the argument set consumed at step 1's GATE; the `{validateBriefInputsScript}` enforces these rules deterministically (its `KNOWN_FIELDS` set must stay in sync with this table).
|
|
4
4
|
|
|
5
5
|
| Argument | Required | Default | Notes |
|
|
6
6
|
|----------|----------|---------|-------|
|
|
@@ -8,15 +8,15 @@ Loaded by step-01 §8 only when `{headless_mode}` is true. Canonical operator-fa
|
|
|
8
8
|
| `skill_name` | yes | — | HALT (exit 2, `halt_reason: "input-missing"`) if absent; HALT (exit 2, `halt_reason: "input-invalid"`) if non-kebab |
|
|
9
9
|
| `source_type` | no | `source` | If `docs-only`, `doc_urls` becomes required |
|
|
10
10
|
| `doc_urls` | conditional | — | Required when `source_type=docs-only` (HALT exit 2, `halt_reason: "input-missing"` if empty). List of `url` or `url,label` |
|
|
11
|
-
| `source_authority` | no | detected | `official` / `community` / `internal`. When absent and `target_repo` is a GitHub URL, step
|
|
12
|
-
| `target_version` | no | — | Auto-detected in step
|
|
11
|
+
| `source_authority` | no | detected | `official` / `community` / `internal`. When absent and `target_repo` is a GitHub URL, step 1 §8 GATE probes `gh api user` and compares its login to the URL owner — match → `official`, otherwise → `community`. Local-path or `gh api user` failure → `community`. Forced to `community` when `source_type=docs-only` |
|
|
12
|
+
| `target_version` | no | — | Auto-detected in step 2 if absent. Full X.Y.Z semver required (HALT exit 2, `halt_reason: "input-invalid"` on partial forms like `1`, `1.2`, `v2`) |
|
|
13
13
|
| `scope_hint` | no | — | Free-text steering for §5 |
|
|
14
|
-
| `language_hint` | no | — | Overrides language detection in step
|
|
15
|
-
| `scope_type` | no | heuristic | `full-library` / `specific-modules` / `public-api` / `component-library` / `reference-app` / `docs-only`. When absent and `source_type=source`, step
|
|
16
|
-
| `include` | no | — | Comma-separated globs (used by step
|
|
17
|
-
| `exclude` | no | — | Comma-separated globs (used by step
|
|
14
|
+
| `language_hint` | no | — | Overrides language detection in step 2/03 |
|
|
15
|
+
| `scope_type` | no | heuristic | `full-library` / `specific-modules` / `public-api` / `component-library` / `reference-app` / `docs-only`. When absent and `source_type=source`, step 3 §2c runs five signal-driven heuristics (component-registry presence, reference-app keywords, specific-module intent, narrow public API) and uses the first match; falls back to `full-library` only if no heuristic fires. `source_type=docs-only` always short-circuits to `docs-only` |
|
|
16
|
+
| `include` | no | — | Comma-separated globs (used by step 3 §3) |
|
|
17
|
+
| `exclude` | no | — | Comma-separated globs (used by step 3 §3) |
|
|
18
18
|
| `scripts_intent` | no | `detect` | `detect` / `none` / free-text |
|
|
19
19
|
| `assets_intent` | no | `detect` | `detect` / `none` / free-text |
|
|
20
20
|
| `intent` | no | — | Free-text used to derive `description` in §7b |
|
|
21
|
-
| `force` | no | — | Overwrite existing brief without prompting (consumed in step
|
|
22
|
-
| `preset` | no | — | Name of a preset YAML file at `{sidecar_path}/brief-presets/{preset}.yaml`. Loaded at step
|
|
21
|
+
| `force` | no | — | Overwrite existing brief without prompting (consumed in step 5 §2b) |
|
|
22
|
+
| `preset` | no | — | Name of a preset YAML file at `{sidecar_path}/brief-presets/{preset}.yaml`. Loaded at step 1 §8 GATE and merged as defaults; explicit args override preset values. Useful for repeated patterns (e.g. briefing 5 SaaS API SDKs with the same `source_authority`/`scope_type`/`scripts_intent`). The preset file is YAML containing any subset of the headless args above; unknown fields are ignored with a warning |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Headless Source-Authority Detection
|
|
2
2
|
|
|
3
|
-
Loaded by step
|
|
3
|
+
Loaded by step 1 §8 only when **all three** preconditions hold:
|
|
4
4
|
|
|
5
5
|
1. `{headless_mode}` is true
|
|
6
6
|
2. `source_authority` is absent from the validator's `normalized` output (the validator intentionally leaves it absent so detection can run here — when it was supplied in args, the supplied value wins and detection does not run)
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
nextStepFile: 'shared/health-check.md'
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
+
<!-- Config: communicate in {communication_language}. -->
|
|
9
|
+
|
|
8
10
|
# Step 6: Workflow Health Check
|
|
9
11
|
|
|
10
12
|
## STEP GOAL:
|
|
@@ -13,7 +15,7 @@ Chain to the shared workflow self-improvement health check at `{nextStepFile}`.
|
|
|
13
15
|
|
|
14
16
|
## Rules
|
|
15
17
|
|
|
16
|
-
- No user-facing reports, file writes, or result contracts in this step — those belong in step
|
|
18
|
+
- No user-facing reports, file writes, or result contracts in this step — those belong in step 5
|
|
17
19
|
- Delegate directly to `{nextStepFile}` with no additional commentary
|
|
18
20
|
- Do not attempt any other action between loading this step and executing `{nextStepFile}`
|
|
19
21
|
- All user-facing output in `{communication_language}`
|
|
@@ -28,4 +30,4 @@ This is the terminal step of brief-skill. The workflow is complete when `{nextSt
|
|
|
28
30
|
|
|
29
31
|
## CRITICAL STEP COMPLETION NOTE
|
|
30
32
|
|
|
31
|
-
Step 06 is the terminal stage of brief-skill. After `{nextStepFile}` returns control, the brief-skill workflow is fully complete — do not re-enter step
|
|
33
|
+
Step 06 is the terminal stage of brief-skill. After `{nextStepFile}` returns control, the brief-skill workflow is fully complete — do not re-enter step 5 or step 6, do not load any further step file, and do not loop back into the workflow.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Portfolio-Similarity Check
|
|
2
2
|
|
|
3
|
-
Loaded by step
|
|
3
|
+
Loaded by step 1 §6 only when **all three** preconditions hold:
|
|
4
4
|
|
|
5
5
|
1. Forge tier is `Deep`
|
|
6
6
|
2. `tools.qmd` is true in `forge-tier.yaml`
|
|
@@ -10,7 +10,7 @@ This check catches **semantic near-duplicates** that exact-name collision misses
|
|
|
10
10
|
|
|
11
11
|
## Procedure
|
|
12
12
|
|
|
13
|
-
The brief portfolio is already indexed in QMD collections — one `{skill-name}-brief` collection per existing brief, registered by step
|
|
13
|
+
The brief portfolio is already indexed in QMD collections — one `{skill-name}-brief` collection per existing brief, registered by step 5 §5 of every prior Deep-tier run. The qmd CLI does not support glob-style collection selection, so enumerate first then query per collection in **a single message with N parallel Bash calls**:
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
16
|
# 1. Enumerate brief collections (one per existing brief)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# QMD Collection Registration (Deep Tier)
|
|
2
2
|
|
|
3
|
-
Loaded by step
|
|
3
|
+
Loaded by step 5 §5 only when forge tier is Deep AND QMD is available. Skipped silently otherwise.
|
|
4
4
|
|
|
5
5
|
Index the skill brief into a QMD collection so portfolio-level searches can find existing briefs and avoid duplicate skill creation across large monorepos.
|
|
6
6
|
|
package/src/skf-brief-skill/{steps-c/step-03-scope-definition.md → references/scope-definition.md}
RENAMED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
---
|
|
2
|
-
nextStepFile: '
|
|
2
|
+
nextStepFile: 'confirm-brief.md'
|
|
3
3
|
scopeTemplatesFile: 'assets/scope-templates.md'
|
|
4
4
|
recommendScopeTypeScript: '{project-root}/src/shared/scripts/skf-recommend-scope-type.py'
|
|
5
5
|
advancedElicitationSkill: '/bmad-advanced-elicitation'
|
|
6
6
|
partyModeSkill: '/bmad-party-mode'
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
<!-- Config: communicate in {communication_language}. -->
|
|
10
|
+
|
|
9
11
|
# Step 3: Scope Definition
|
|
10
12
|
|
|
11
13
|
## STEP GOAL:
|
|
@@ -18,12 +20,10 @@ To collaboratively define the skill's inclusion and exclusion boundaries using t
|
|
|
18
20
|
- Do not make scope decisions unilaterally — user drives all scope choices
|
|
19
21
|
- Produce: scope type, include patterns, exclude patterns
|
|
20
22
|
- All user-facing output in `{communication_language}`
|
|
21
|
-
- **Re-entry from step
|
|
23
|
+
- **Re-entry from step 4 [R] revise:** prior selections (`scope.type`, `scope.include`, `scope.exclude`, `scope.notes`, `scope.rationale`, `scripts_intent`, `assets_intent`, supplemental `doc_urls`) are preserved as the current state. Re-present them at each section as the existing answer; the user only re-confirms or overrides. Do not reset to the §2c template menu unless the user explicitly asks to start scope over. When `scope.rationale` is preserved and the user changes `chosen` (the scope type) on this pass, recompute `accepted_recommendation` (`chosen == recommended`) and refresh `reason` and `recorded` per the §2c capture rules — revise in place, do not append.
|
|
22
24
|
|
|
23
25
|
## MANDATORY SEQUENCE
|
|
24
26
|
|
|
25
|
-
**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change.
|
|
26
|
-
|
|
27
27
|
### 1. Present Scope Context
|
|
28
28
|
|
|
29
29
|
"**Let's define the scope for your skill.**
|
|
@@ -68,9 +68,9 @@ Add, remove, or confirm these URLs."
|
|
|
68
68
|
|
|
69
69
|
Wait for confirmation. Record any changes to `doc_urls`.
|
|
70
70
|
|
|
71
|
-
HEAD-check the URLs in parallel — issue all N `curl -sI --max-time 5 {url}` calls in a **single message with N parallel Bash calls**, then process the responses together. On a 4xx/5xx, DNS failure, or timeout per URL, warn `"Could not reach {url} — {status or error}."` and offer the same correct/keep choice as step
|
|
71
|
+
HEAD-check the URLs in parallel — issue all N `curl -sI --max-time 5 {url}` calls in a **single message with N parallel Bash calls**, then process the responses together. On a 4xx/5xx, DNS failure, or timeout per URL, warn `"Could not reach {url} — {status or error}."` and offer the same correct/keep choice as step 1 §3. The check is best-effort — never HALT on a failed HEAD — but the failure must surface here so it is not discovered downstream during compilation.
|
|
72
72
|
|
|
73
|
-
**On re-entry from step
|
|
73
|
+
**On re-entry from step 4 [R]:** if `doc_urls` is byte-identical to the list that was probed on the previous pass through this subsection AND the prior per-URL probe results are still recoverable from conversation context, skip the parallel HEAD-check and reuse those results. Re-running the probes when the list has not changed wastes round-trips and can flap on transient failures. Any addition, removal, or edit to a URL invalidates the cache — re-probe the entire updated set. If the prior results are not recoverable (long session, compaction, etc.), re-probe — never cache-hit on a list whose results you cannot cite.
|
|
74
74
|
|
|
75
75
|
**If no supplemental doc_urls were collected:** Skip this subsection.
|
|
76
76
|
|
|
@@ -78,9 +78,9 @@ HEAD-check the URLs in parallel — issue all N `curl -sI --max-time 5 {url}` ca
|
|
|
78
78
|
|
|
79
79
|
### 2c. Offer Scope Templates
|
|
80
80
|
|
|
81
|
-
Load `{
|
|
81
|
+
Load `{scopeTemplatesPath}` for the scope type options ([F], [M], [P], [C], [R]) and their descriptions.
|
|
82
82
|
|
|
83
|
-
**Recommend a scope type — don't present the five options as equal weight.** SKILL.md states this workflow "steers toward the smaller, sharper version when scope is unclear" — surface that opinion at decision time. Use the analysis from step
|
|
83
|
+
**Recommend a scope type — don't present the five options as equal weight.** SKILL.md states this workflow "steers toward the smaller, sharper version when scope is unclear" — surface that opinion at decision time. Use the analysis from step 2 and the user's intent from step 1 to pick the best-fit recommendation, then present the menu with that option marked as the suggested default.
|
|
84
84
|
|
|
85
85
|
**Delegate the recommendation to `{recommendScopeTypeScript}`** instead of walking the heuristic ladder in prose. The script is the single source of truth for the five-rule ladder (component-registry → reference-app keywords → specific-modules naming/count → narrow-public-api → default full-library) plus the docs-only short-circuit. Both the interactive recommendation and the §6 headless GATE invoke the same script — same inputs, same outputs, no drift.
|
|
86
86
|
|
|
@@ -90,10 +90,10 @@ Build the payload and invoke:
|
|
|
90
90
|
|
|
91
91
|
```bash
|
|
92
92
|
echo '{
|
|
93
|
-
"intent": "<combined intent + scope_hint text from step
|
|
94
|
-
"module_count": <count from step
|
|
95
|
-
"export_count": <count from step
|
|
96
|
-
"tree": [<flat list of repo-relative file paths from step
|
|
93
|
+
"intent": "<combined intent + scope_hint text from step 1>",
|
|
94
|
+
"module_count": <count from step 2 §4.3>,
|
|
95
|
+
"export_count": <count from step 2 §4.3>,
|
|
96
|
+
"tree": [<flat list of repo-relative file paths from step 2 §1>],
|
|
97
97
|
"entry_files": [{"path": "<registry path>", "content": "<contents>"}, ...],
|
|
98
98
|
"source_type": "source",
|
|
99
99
|
"mode": "interactive"
|
|
@@ -104,13 +104,15 @@ echo '{
|
|
|
104
104
|
|
|
105
105
|
The script returns `{scope_type, matched_heuristic, signals, rationale}`. Use `rationale` directly — it already names the specific signals that fired.
|
|
106
106
|
|
|
107
|
+
**Persist the rationale — do not discard it.** Hold `scope_type` as `rationale.recommended` and `matched_heuristic` as `rationale.heuristic` in conversation state. After the user's §2c selection: if they accept the recommendation, set `rationale.chosen = recommended`, `accepted_recommendation = true`, `reason = <script rationale verbatim>`. If they override, set `chosen = <selected type>`, `accepted_recommendation = false`, and ask one line — *"In a sentence, why {chosen} over the recommended {recommended}?"* — storing the answer as `reason` (or `"user overrode {recommended}->{chosen}; reason not stated"` if skipped). Set `recorded = {current ISO date}`. This object becomes `scope.rationale`.
|
|
108
|
+
|
|
107
109
|
Present:
|
|
108
110
|
|
|
109
111
|
"**Recommended scope type: [{letter}] {Name}** — {rationale from the script}.
|
|
110
112
|
|
|
111
113
|
How broadly should this skill cover the library?
|
|
112
114
|
|
|
113
|
-
{full menu from `{
|
|
115
|
+
{full menu from `{scopeTemplatesPath}` with the recommended letter marked, e.g. '[F] Full Library', '[M] Specific Modules', '[P] Public API Only ← recommended', '[C] Component Library', '[R] Reference App'}
|
|
114
116
|
|
|
115
117
|
Press Enter to accept the recommendation, or pick a different letter."
|
|
116
118
|
|
|
@@ -118,7 +120,7 @@ Wait for user selection. Empty input or just Enter accepts the recommendation; a
|
|
|
118
120
|
|
|
119
121
|
### 3. Define Boundaries Based on Selection
|
|
120
122
|
|
|
121
|
-
Using the boundary definitions from `{
|
|
123
|
+
Using the boundary definitions from `{scopeTemplatesPath}`, present the appropriate flow for the user's selected scope type ([F], [M], [P], [C], or [R]). Follow each type's prompts and wait for user input at each phase before proceeding.
|
|
122
124
|
|
|
123
125
|
### 4. Handle Language Override
|
|
124
126
|
|
|
@@ -178,11 +180,12 @@ Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Conti
|
|
|
178
180
|
#### EXECUTION RULES:
|
|
179
181
|
|
|
180
182
|
- ALWAYS halt and wait for user input after presenting menu
|
|
181
|
-
- **GATE [default: C]** — If `{headless_mode}`: consume the headless inputs from step
|
|
183
|
+
- **GATE [default: C]** — If `{headless_mode}`: consume the headless inputs from step 1 in priority order:
|
|
182
184
|
- If `scope_type` was supplied, use it (must match one of the six valid types) and skip the §2c template menu.
|
|
183
185
|
- Otherwise auto-select via `{recommendScopeTypeScript}` — invoke the script with the **same payload shape** documented in §2c but with `mode: "headless"` (presence-only matching for the component-registry rule, since `entry_files` may not be available without an interactive context). Use the returned `scope_type` and log `"headless: scope_type={value} from heuristic={matched_heuristic}"`. The script's docs-only short-circuit handles `source_type=docs-only` automatically.
|
|
184
186
|
- If `include`/`exclude` were supplied, use them verbatim (split on comma) instead of running the boundary prompts in §3.
|
|
185
187
|
- If `scripts_intent`/`assets_intent` were supplied, record them and skip §5b; otherwise default to `detect`.
|
|
188
|
+
- Set `scope.rationale`: `recommended`/`heuristic` from the script (or `recommended = scope_type` arg, `heuristic = "user-supplied-arg"` when `scope_type` was passed); `chosen = <resolved type>`; `accepted_recommendation = (no scope_type arg)`; `reason = "<script rationale>"` (auto path) or `"headless: scope_type supplied as argument"` (arg path); `recorded = {date}`. No prompt — headless never asks "why".
|
|
186
189
|
- Log: `"headless: scope_type={value} include={n} exclude={n} scripts_intent={value} assets_intent={value}"`.
|
|
187
190
|
- ONLY proceed to next step when user selects 'C'
|
|
188
191
|
- After other menu items execution, return to this menu
|
|
@@ -190,5 +193,5 @@ Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Conti
|
|
|
190
193
|
|
|
191
194
|
## CRITICAL STEP COMPLETION NOTE
|
|
192
195
|
|
|
193
|
-
ONLY WHEN C is selected and scope boundaries are confirmed will you load and read fully
|
|
196
|
+
ONLY WHEN C is selected and scope boundaries are confirmed will you load and read fully `confirm-brief.md` to present the complete brief for confirmation.
|
|
194
197
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Version Resolution
|
|
2
2
|
|
|
3
|
-
Single source of truth for how brief-skill resolves the `version` field of `skill-brief.yaml`. Loaded by step
|
|
3
|
+
Single source of truth for how brief-skill resolves the `version` field of `skill-brief.yaml`. Loaded by step 2 §4b (auto-detect, fallback path only when the language is not script-supported) and step 5 §3 (resolve & write) so both operate on the same precedence rules and invariant. Step-01 §3b references this file in prose for human-readable rationale but does not load it — that step only collects `target_version` and validates its shape with an inline regex.
|
|
4
4
|
|
|
5
5
|
**Aligned with** `assets/skill-brief-schema.md` "Version Detection" section. If you change one, change the other.
|
|
6
6
|
|
|
@@ -23,7 +23,7 @@ If every step fails or returns a non-semver value, the detected version is `null
|
|
|
23
23
|
|
|
24
24
|
The brief's `version` field is resolved from three candidate sources, in priority order:
|
|
25
25
|
|
|
26
|
-
1. **`target_version`** — collected interactively in step
|
|
26
|
+
1. **`target_version`** — collected interactively in step 1 §3b or supplied as a headless argument. When present, this value wins outright. The auto-detection above still runs for informational purposes (the user sees both "Target version" and "Detected version" side-by-side at the analysis summary), but the brief's `version` field is set from `target_version`.
|
|
27
27
|
2. **Auto-detected version** — from §"Detection Algorithm" above. Used when `target_version` is absent.
|
|
28
28
|
3. **Default** — `"1.0.0"` when both of the above fail or yield a non-semver value.
|
|
29
29
|
|
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
briefSchemaFile: 'assets/skill-brief-schema.md'
|
|
3
3
|
versionResolutionFile: 'references/version-resolution.md'
|
|
4
4
|
qmdRegistrationFile: 'references/qmd-collection-registration.md'
|
|
5
|
-
nextStepFile: '
|
|
5
|
+
nextStepFile: 'health-check.md'
|
|
6
6
|
writeSkillBriefScript: '{project-root}/src/shared/scripts/skf-write-skill-brief.py'
|
|
7
7
|
emitBriefEnvelopeScript: '{project-root}/src/shared/scripts/skf-emit-brief-result-envelope.py'
|
|
8
8
|
forgeTierRwScript: '{project-root}/src/shared/scripts/skf-forge-tier-rw.py'
|
|
9
9
|
forgeTierFile: '{sidecar_path}/forge-tier.yaml'
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
<!-- Config: communicate in {communication_language}. -->
|
|
13
|
+
|
|
12
14
|
# Step 5: Write Brief
|
|
13
15
|
|
|
14
16
|
## STEP GOAL:
|
|
@@ -26,11 +28,9 @@ To generate the complete skill-brief.yaml from the approved brief data and write
|
|
|
26
28
|
|
|
27
29
|
## MANDATORY SEQUENCE
|
|
28
30
|
|
|
29
|
-
**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change.
|
|
30
|
-
|
|
31
31
|
### 1. Reference the Schema (LLM context only)
|
|
32
32
|
|
|
33
|
-
`{
|
|
33
|
+
`{briefSchemaPath}` and `{versionResolutionFile}` document the brief contract for human readers. The deterministic enforcement of that contract lives in `{writeSkillBriefScript}` and its JSON Schema artifact at `src/shared/scripts/schemas/skill-brief.v1.json`. Load `{briefSchemaPath}` only if you need to explain a specific field to the user during inline adjustments — otherwise skip the read; the script is the source of truth.
|
|
34
34
|
|
|
35
35
|
### 2. Resolve Output Path
|
|
36
36
|
|
|
@@ -52,7 +52,7 @@ If the file exists, present:
|
|
|
52
52
|
Overwrite it with the brief you just approved? [Y/N]"
|
|
53
53
|
|
|
54
54
|
- **[Y]** Overwrite — proceed to §3.
|
|
55
|
-
- **[N]** Cancel — emit a single-line stderr log `brief-skill: overwrite-cancelled at {path}` and HALT with exit code 5 (do not chain to step
|
|
55
|
+
- **[N]** Cancel — emit a single-line stderr log `brief-skill: overwrite-cancelled at {path}` and HALT with exit code 5 (do not chain to step 6; the run produced no new artifact).
|
|
56
56
|
|
|
57
57
|
**Headless (`{headless_mode}` is true):**
|
|
58
58
|
|
|
@@ -83,6 +83,7 @@ Assemble the brief context as a **flat** JSON object — every approved value is
|
|
|
83
83
|
"scope_include": ["{approved include patterns}"],
|
|
84
84
|
"scope_exclude": ["{approved exclude patterns}"],
|
|
85
85
|
"scope_notes": "{approved scope notes or empty string}",
|
|
86
|
+
"scope_rationale": null | {"recommended":"...","chosen":"...","accepted_recommendation":true|false,"heuristic":"...","reason":"...","recorded":"YYYY-MM-DD"},
|
|
86
87
|
"doc_urls": null | [{"url": "...", "label": "..."}],
|
|
87
88
|
"scripts_intent": null | "{detect|none|free-text}",
|
|
88
89
|
"assets_intent": null | "{detect|none|free-text}",
|
|
@@ -116,11 +117,11 @@ The script:
|
|
|
116
117
|
|
|
117
118
|
**On success:** capture `brief_path` and `version` from the response envelope — both are needed for §4b and §6.
|
|
118
119
|
|
|
119
|
-
**Draft cleanup.** After a successful write, remove `{forge_data_folder}/{skill-name}/.brief-draft.json` if it exists (`rm -f` — silent on absent). The draft was a step
|
|
120
|
+
**Draft cleanup.** After a successful write, remove `{forge_data_folder}/{skill-name}/.brief-draft.json` if it exists (`rm -f` — silent on absent). The draft was a step 1 §7 checkpoint covering the in-flight workflow window; once the brief is written it is no longer meaningful. In headless mode this rm is a no-op (drafts are only written interactively).
|
|
120
121
|
|
|
121
122
|
### 4b. Headless Result Envelope (Canonical)
|
|
122
123
|
|
|
123
|
-
This section is the canonical envelope-emission reference for the workflow. Every headless emission — the success terminal here and every HARD HALT in step
|
|
124
|
+
This section is the canonical envelope-emission reference for the workflow. Every headless emission — the success terminal here and every HARD HALT in step 1/02/05 — uses this contract. Remote sites point here instead of restating it.
|
|
124
125
|
|
|
125
126
|
**Success (this call site only — emitted from §3 directly):**
|
|
126
127
|
|
|
@@ -136,13 +137,13 @@ echo '{"status":"error","skill_name":"<name>","halt_reason":"<reason>"}' | \
|
|
|
136
137
|
uv run {emitBriefEnvelopeScript} emit --target stderr
|
|
137
138
|
```
|
|
138
139
|
|
|
139
|
-
When the HALT fires before `skill_name` has been resolved (step
|
|
140
|
+
When the HALT fires before `skill_name` has been resolved (step 1 §1 pre-flight write probe, step 1 §8 input-missing on a malformed args bundle), pass the partially-gathered value or the literal `"unknown"` — the script accepts any non-empty string at this position.
|
|
140
141
|
|
|
141
142
|
The script derives `exit_code` deterministically from `halt_reason` (null→0, input-missing/input-invalid→2, forge-tier-missing/target-inaccessible/gh-auth-failed→3, write-failed→4, overwrite-cancelled→5, user-cancelled→6 [interactive-only — headless never raises this]), validates against `src/shared/scripts/schemas/skf-brief-result-envelope.v1.json`, and prints the prefixed `SKF_BRIEF_RESULT_JSON: {…}` line.
|
|
142
143
|
|
|
143
|
-
The script enforces the success/error halt_reason invariant (success requires null halt_reason; error requires non-null). The `user-cancelled` halt_reason is accepted for completeness (interactive `[X]` Cancel sites in step
|
|
144
|
+
The script enforces the success/error halt_reason invariant (success requires null halt_reason; error requires non-null). The `user-cancelled` halt_reason is accepted for completeness (interactive `[X]` Cancel sites in step 1/03/04) but never appears on the headless code path.
|
|
144
145
|
|
|
145
|
-
Invocation sites (each pointed at this block, not duplicated): step
|
|
146
|
+
Invocation sites (each pointed at this block, not duplicated): step 1 §1 (write-failed pre-resolution), step 1 §8 (input-missing/input-invalid GATE), step 5 §2b (overwrite-cancelled), step 5 §3 (input-invalid/write-failed from script). Step-01 §1 forge-tier-missing and step 2 §1 (target-inaccessible/gh-auth-failed) currently HALT without emitting an envelope — pre-existing gaps tracked separately, not addressed by this canonicalization.
|
|
146
147
|
|
|
147
148
|
When `{headless_mode}` is false, skip this section silently — no envelope is emitted.
|
|
148
149
|
|
|
@@ -9,6 +9,14 @@ description: Compile a skill from a brief. Supports --batch for multiple briefs.
|
|
|
9
9
|
|
|
10
10
|
Compiles a verified agent skill from a skill-brief.yaml and source code, producing an agentskills.io-compliant SKILL.md with provenance map, evidence report, and progressive disclosure references. The workflow is mostly autonomous with three interaction points — after ecosystem check (if match found), after source extraction (to confirm findings), and after content quality review (when tessl produces suggestions). Steps adapt behavior based on forge tier (Quick/Forge/Forge+/Deep). Zero hallucination tolerance: every instruction in the output must trace to source code with a confidence tier citation.
|
|
11
11
|
|
|
12
|
+
## Conventions
|
|
13
|
+
|
|
14
|
+
- Bare paths (e.g. `references/<name>.md`) resolve from the skill root.
|
|
15
|
+
- `references/` holds prompt content carved out of SKILL.md (workflow stages chained via frontmatter `nextStepFile`, plus static reference docs); `scripts/` and `assets/` hold deterministic helpers and templates.
|
|
16
|
+
- `{skill-root}` resolves to this skill's installed directory (where `customize.toml` lives, if present).
|
|
17
|
+
- `{project-root}`-prefixed paths resolve from the project working directory.
|
|
18
|
+
- `{skill-name}` resolves to the skill directory's basename.
|
|
19
|
+
|
|
12
20
|
## Role
|
|
13
21
|
|
|
14
22
|
You are operating in Ferris Architect mode — a skill compilation engine performing structural extraction and assembly. Apply zero hallucination tolerance: uncitable content is excluded, not guessed.
|
|
@@ -18,8 +26,6 @@ You are operating in Ferris Architect mode — a skill compilation engine perfor
|
|
|
18
26
|
These rules apply to every step in this workflow:
|
|
19
27
|
|
|
20
28
|
- Never include content in SKILL.md that cannot be cited to source code
|
|
21
|
-
- Read each step file completely before taking any action
|
|
22
|
-
- Follow the mandatory sequence in each step exactly — do not skip, reorder, or optimize
|
|
23
29
|
- Only load one step file at a time — never preload future steps
|
|
24
30
|
- Always communicate in `{communication_language}`
|
|
25
31
|
- If `{headless_mode}` is true, auto-proceed through confirmation gates with their default action and log each auto-decision
|
|
@@ -28,28 +34,28 @@ These rules apply to every step in this workflow:
|
|
|
28
34
|
|
|
29
35
|
| # | Step | File | Auto-proceed |
|
|
30
36
|
|---|------|------|--------------|
|
|
31
|
-
| 1 | Load Brief |
|
|
32
|
-
| 2 | Ecosystem Check |
|
|
33
|
-
| 2b | CCC Discover |
|
|
34
|
-
| 3 | Extract |
|
|
35
|
-
| 3b | Fetch Temporal |
|
|
36
|
-
| 3c | Fetch Docs |
|
|
37
|
-
| 3d | Component Extraction |
|
|
38
|
-
| 4 | Enrich |
|
|
39
|
-
| 5 | Compile |
|
|
40
|
-
| 6 | Validate |
|
|
41
|
-
| 7 | Generate Artifacts |
|
|
42
|
-
| 8 | Report |
|
|
43
|
-
| 9 | Workflow Health Check |
|
|
44
|
-
|
|
45
|
-
*Sub-steps under `
|
|
37
|
+
| 1 | Load Brief | references/load-brief.md | Yes |
|
|
38
|
+
| 2 | Ecosystem Check | references/ecosystem-check.md | Conditional |
|
|
39
|
+
| 2b | CCC Discover | references/sub/ccc-discover.md | Yes |
|
|
40
|
+
| 3 | Extract | references/extract.md | No (confirm) |
|
|
41
|
+
| 3b | Fetch Temporal | references/sub/fetch-temporal.md | Yes |
|
|
42
|
+
| 3c | Fetch Docs | references/sub/fetch-docs.md | Yes |
|
|
43
|
+
| 3d | Component Extraction | references/component-extraction.md | Conditional |
|
|
44
|
+
| 4 | Enrich | references/enrich.md | Yes |
|
|
45
|
+
| 5 | Compile | references/compile.md | Yes |
|
|
46
|
+
| 6 | Validate | references/validate.md | Conditional |
|
|
47
|
+
| 7 | Generate Artifacts | references/generate-artifacts.md | Yes |
|
|
48
|
+
| 8 | Report | references/report.md | Yes |
|
|
49
|
+
| 9 | Workflow Health Check | references/health-check.md | Yes |
|
|
50
|
+
|
|
51
|
+
*Sub-steps under `references/sub/` are conditional branches (CCC discovery, temporal/doc enrichment) kept out of the top-level step count so main-line steps 1–9 drive the workflow. Step 3d (Component Extraction) stays top-level as an alternative main step that replaces the standard extraction path when `scope.type: "component-library"`.*
|
|
46
52
|
|
|
47
53
|
## Invocation Contract
|
|
48
54
|
|
|
49
55
|
| Aspect | Detail |
|
|
50
56
|
|--------|--------|
|
|
51
57
|
| **Inputs** | brief_path (path to skill-brief.yaml) [required], --batch [optional] |
|
|
52
|
-
| **Gates** | step
|
|
58
|
+
| **Gates** | step 2: Choice Gate [P] (if match) | step 3: Review Gate [C] |
|
|
53
59
|
| **Outputs** | SKILL.md, context-snippet.md, metadata.json, provenance-map.json, evidence-report.md, references/ |
|
|
54
60
|
| **Headless** | All gates auto-resolve with default action when `{headless_mode}` is true |
|
|
55
61
|
|
|
@@ -60,4 +66,4 @@ These rules apply to every step in this workflow:
|
|
|
60
66
|
|
|
61
67
|
2. **Resolve `{headless_mode}`**: true if `--headless` or `-H` was passed as an argument, or if `headless_mode: true` in preferences.yaml. Default: false.
|
|
62
68
|
|
|
63
|
-
3. Load, read the full file, and then execute
|
|
69
|
+
3. Load, read the full file, and then execute `references/load-brief.md` to begin the workflow.
|
|
@@ -21,7 +21,7 @@ description: >
|
|
|
21
21
|
- Uppercase placeholders are also acceptable: `NAME`, `COMPONENT_ID`.
|
|
22
22
|
- For code-ish fragments, use curly braces in place of angle brackets inside the backticks: `` `Meta{typeof X}` ``, `` `Array{T}` ``.
|
|
23
23
|
|
|
24
|
-
Authors should not rely on remembering this — step
|
|
24
|
+
Authors should not rely on remembering this — step 5 §2a enforces it via a pre-write sanitization pass that unconditionally replaces every `<` with `{` and every `>` with `}` in the frontmatter `description`. See step 5 §2a for the rule and `assets/tessl-dismissal-rules.md` (`description-xml-tags-guarded-upstream`) for the recovery path if a downstream tool rewrites the description after §2a has run.
|
|
25
25
|
- Only `name` and `description` in frontmatter — `version` and `author` go in metadata.json
|
|
26
26
|
- No other frontmatter fields for standard skills (only `name`, `description`, `license`, `compatibility`, `metadata`, `allowed-tools` are permitted by spec)
|
|
27
27
|
|
|
@@ -62,7 +62,7 @@ These sections form the essential standalone body. Target: **under 300 lines tot
|
|
|
62
62
|
- Provenance citation per function
|
|
63
63
|
|
|
64
64
|
**Section 4b — Migration & Deprecation Warnings (~10 lines, Deep tier only):**
|
|
65
|
-
- Only populated when step
|
|
65
|
+
- Only populated when step 4 enrichment produced **T2-future** annotations (deprecation warnings, breaking changes, planned renames)
|
|
66
66
|
- List each warning as a single-line bullet: function name, what changed or will change, source citation
|
|
67
67
|
- Max 10 lines — just the actionable warnings, not full context
|
|
68
68
|
- Link to Tier 2 Full API Reference for details: "See Full API Reference for migration details."
|
|
@@ -158,7 +158,7 @@ Replace the function table with a Component Catalog organized by category:
|
|
|
158
158
|
**Total components:** {unique count} | {Per variant: **With {name}:** {count}}
|
|
159
159
|
```
|
|
160
160
|
|
|
161
|
-
Source: `component_catalog[]` from step
|
|
161
|
+
Source: `component_catalog[]` from step 3d. Group by `category` field. Provenance: cite the registry file.
|
|
162
162
|
|
|
163
163
|
**Section 5 (Key Types) — Props-focused override:**
|
|
164
164
|
|