bmad-module-skill-forge 1.4.1 → 1.5.1
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 +147 -16
- 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-manifest-ops.py +22 -6
- package/src/shared/scripts/skf-merge-ccc-exclusions.py +34 -4
- 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} +48 -14
- package/src/skf-analyze-source/{steps-c/step-01-init.md → references/init.md} +32 -9
- 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} +16 -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/{steps-c/step-01-init.md → references/init.md} +63 -19
- 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} +35 -17
- package/src/skf-brief-skill/SKILL.md +49 -19
- 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} +27 -15
- 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} +35 -29
- 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 +2 -2
- package/src/skf-brief-skill/{steps-c/step-03-scope-definition.md → references/scope-definition.md} +27 -20
- 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} +29 -16
- 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 +10 -8
- package/src/skf-create-skill/{steps-c/step-07-generate-artifacts.md → references/generate-artifacts.md} +11 -11
- 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} +48 -28
- 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} +37 -11
- package/src/skf-create-stack-skill/{steps-c/step-02-detect-manifests.md → references/detect-manifests.md} +32 -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} +44 -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} +11 -11
- 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} +11 -49
- 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 +79 -0
- package/src/skf-export-skill/{steps-c/step-06-summary.md → references/summary.md} +23 -11
- 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} +109 -113
- 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} +16 -31
- 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} +37 -73
- 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} +13 -9
- 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 +170 -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} +18 -14
- package/src/skf-verify-stack/{steps-c/step-06-report.md → references/report.md} +27 -42
- package/src/skf-verify-stack/{steps-c/step-04-requirements.md → references/requirements.md} +13 -9
- package/src/skf-verify-stack/{steps-c/step-05-synthesize.md → references/synthesize.md} +14 -10
- package/tools/validate-docs-drift.js +1 -1
- 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-04-confirm-brief.md → references/confirm-brief.md}
RENAMED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
---
|
|
2
|
-
nextStepFile: '
|
|
3
|
-
reviseStepFile: '
|
|
2
|
+
nextStepFile: 'write-brief.md'
|
|
3
|
+
reviseStepFile: 'scope-definition.md'
|
|
4
4
|
briefSchemaFile: 'assets/skill-brief-schema.md'
|
|
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 4: Confirm Brief
|
|
10
12
|
|
|
11
13
|
## STEP GOAL:
|
|
@@ -20,11 +22,9 @@ To present the complete skill brief in human-readable format, highlighting all f
|
|
|
20
22
|
|
|
21
23
|
## MANDATORY SEQUENCE
|
|
22
24
|
|
|
23
|
-
**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change.
|
|
24
|
-
|
|
25
25
|
### 1. Assemble Complete Brief
|
|
26
26
|
|
|
27
|
-
Use the values already accepted in steps 01-03 directly — do not re-load `{
|
|
27
|
+
Use the values already accepted in steps 01-03 directly — do not re-load `{briefSchemaPath}` here. The 18 fields below are all in conversation; the schema is only consulted in §4 if an inline adjustment needs a specific field's validation rule cited.
|
|
28
28
|
|
|
29
29
|
Compile all gathered data from steps 01-03 into the complete brief:
|
|
30
30
|
|
|
@@ -41,6 +41,7 @@ Compile all gathered data from steps 01-03 into the complete brief:
|
|
|
41
41
|
- **scope.include:** {include patterns from step 03}
|
|
42
42
|
- **scope.exclude:** {exclude patterns from step 03}
|
|
43
43
|
- **scope.notes:** {any scope notes from step 03}
|
|
44
|
+
- **scope.rationale:** {recommended -> chosen, reason — from step 03}
|
|
44
45
|
- **source_type:** {source or docs-only, from step 01}
|
|
45
46
|
- **doc_urls:** {collected documentation URLs with labels, from steps 01/03 — include if source_type is "docs-only" or supplemental URLs were collected}
|
|
46
47
|
- **scripts_intent:** {detect/none/description from step 03, or "detect" if not explicitly set}
|
|
@@ -68,6 +69,8 @@ Scope: {scope.type}
|
|
|
68
69
|
Include: {scope.include patterns, one per line}
|
|
69
70
|
Exclude: {scope.exclude patterns, one per line}
|
|
70
71
|
Notes: {scope.notes}
|
|
72
|
+
Rationale: {chosen} chosen over {recommended} — {reason}
|
|
73
|
+
{omit this line entirely if scope.rationale absent}
|
|
71
74
|
|
|
72
75
|
{If source_type is "docs-only":}
|
|
73
76
|
Source Type: docs-only
|
|
@@ -108,7 +111,7 @@ Glosses (substitute the matching one-liner for `{tier_gloss}`, `{scripts_gloss}`
|
|
|
108
111
|
- `none`: no script/asset packaging — create-skill will skip the detection pass
|
|
109
112
|
- free-text (anything else): a description of what to package; create-skill treats it as the user's spec
|
|
110
113
|
|
|
111
|
-
(For `docs-only` and `public-api` scope types the scripts/assets prompt is skipped in step
|
|
114
|
+
(For `docs-only` and `public-api` scope types the scripts/assets prompt is skipped in step 3 §5b — the values default to `detect` but the create-skill detection pass also no-ops for these scope types, so the gloss just clarifies that the recorded value will not actually fire any scan.)"
|
|
112
115
|
|
|
113
116
|
### 3. Highlight Items Needing Attention
|
|
114
117
|
|
|
@@ -117,7 +120,7 @@ Flag any fields that may need review:
|
|
|
117
120
|
{If language was overridden or low confidence:}
|
|
118
121
|
"**Note:** Language was {auto-detected / manually overridden}."
|
|
119
122
|
|
|
120
|
-
"**Description:** synthesized and confirmed in step
|
|
123
|
+
"**Description:** synthesized and confirmed in step 1 §7b. This is the text agents read when deciding whether to route to your skill — refine here if you want to tighten it now that the full brief is visible."
|
|
121
124
|
|
|
122
125
|
{If forge tier was defaulted:}
|
|
123
126
|
"**Note:** Forge tier defaulted to Quick (no forge-tier.yaml found)."
|
|
@@ -138,7 +141,7 @@ You can:
|
|
|
138
141
|
### 4. Handle Inline Adjustments
|
|
139
142
|
|
|
140
143
|
If the user requests changes to specific fields (name, description, version, etc.):
|
|
141
|
-
- If the adjustment requires explaining a field's validation rule or allowed values, load `{
|
|
144
|
+
- If the adjustment requires explaining a field's validation rule or allowed values, load `{briefSchemaPath}` now (otherwise skip the read — the common path does not need it)
|
|
142
145
|
- Make the adjustment
|
|
143
146
|
- Re-present the updated brief
|
|
144
147
|
- Return to the menu
|
|
@@ -153,7 +156,7 @@ Display: **Select an Option:** [R] Revise Scope [A] Advanced Elicitation [P] Par
|
|
|
153
156
|
- IF A: Invoke {advancedElicitationSkill}, and when finished redisplay the menu
|
|
154
157
|
- IF P: Invoke {partyModeSkill}, and when finished redisplay the menu
|
|
155
158
|
- IF C: Load, read entire file, then execute {nextStepFile}
|
|
156
|
-
- IF X: Treat as user-cancellation. Display `"Cancelled — no brief was written."` and HALT (exit code 6, `halt_reason: "user-cancelled"`). Cancellation here is non-destructive — step
|
|
159
|
+
- IF X: Treat as user-cancellation. Display `"Cancelled — no brief was written."` and HALT (exit code 6, `halt_reason: "user-cancelled"`). Cancellation here is non-destructive — step 5 has not run, no skill-brief.yaml file exists yet. `[X]` is interactive-only; the headless GATE never reaches this branch.
|
|
157
160
|
- IF Any other comments or queries: help user respond, apply any field adjustments, re-present brief if changed, then [Redisplay Menu Options](#5-present-menu-options)
|
|
158
161
|
|
|
159
162
|
#### EXECUTION RULES:
|
|
@@ -166,5 +169,5 @@ Display: **Select an Option:** [R] Revise Scope [A] Advanced Elicitation [P] Par
|
|
|
166
169
|
|
|
167
170
|
## CRITICAL STEP COMPLETION NOTE
|
|
168
171
|
|
|
169
|
-
ONLY WHEN C is selected and the user has explicitly approved the brief will you load and read fully
|
|
172
|
+
ONLY WHEN C is selected and the user has explicitly approved the brief will you load and read fully `write-brief.md` to write the skill-brief.yaml file.
|
|
170
173
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Draft Checkpoint Lifecycle
|
|
2
2
|
|
|
3
|
-
The `.brief-draft.json` file at `{forge_data_folder}/{skill-name}/.brief-draft.json` is a step
|
|
3
|
+
The `.brief-draft.json` file at `{forge_data_folder}/{skill-name}/.brief-draft.json` is a step 1 in-flight-state checkpoint. It exists only while the workflow has progressed past §7 but not yet completed step 5 — once the final brief writes successfully, step 5 §4 removes it.
|
|
4
4
|
|
|
5
5
|
**Headless mode skips this entire lifecycle** — the run completes in a single invocation, so no resume is meaningful and no checkpoint is written.
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@ The two halves of the lifecycle (resume on entry, write on §7 confirmation) for
|
|
|
8
8
|
|
|
9
9
|
## Half 1 — Resume Check (loaded from §6 after name confirmation)
|
|
10
10
|
|
|
11
|
-
After the skill name is confirmed in §6, check for an in-progress draft at `{forge_data_folder}/{name}/.brief-draft.json`. **Only present the resume prompt** when the file exists AND no `skill-brief.yaml` sits beside it (a finished brief uses the same dir; if a finished brief exists, the draft is stale and step
|
|
11
|
+
After the skill name is confirmed in §6, check for an in-progress draft at `{forge_data_folder}/{name}/.brief-draft.json`. **Only present the resume prompt** when the file exists AND no `skill-brief.yaml` sits beside it (a finished brief uses the same dir; if a finished brief exists, the draft is stale and step 5's overwrite gate is the right control point).
|
|
12
12
|
|
|
13
13
|
When the precondition is met, present:
|
|
14
14
|
|
|
@@ -24,7 +24,7 @@ Load the JSON and restore the captured fields: `target_repo`, `source_type`, `so
|
|
|
24
24
|
|
|
25
25
|
The skip rule for §7b is load-bearing: re-running §7b would overwrite the user's previously accepted `description` with a fresh candidate synthesized from the seed material. The restored `description` is authoritative.
|
|
26
26
|
|
|
27
|
-
The user can still revise any field at step
|
|
27
|
+
The user can still revise any field at step 4 §3 if a refinement is needed after the full brief is visible.
|
|
28
28
|
|
|
29
29
|
### `[N]` — Start fresh
|
|
30
30
|
|
|
@@ -43,4 +43,4 @@ After the user confirms the §7 summary, persist the captured state atomically.
|
|
|
43
43
|
|
|
44
44
|
Atomic-write protocol: write to `.brief-draft.json.tmp` first, then `mv .brief-draft.json.tmp .brief-draft.json`. The rename is atomic on a single filesystem; a partial write never becomes visible as `.brief-draft.json`.
|
|
45
45
|
|
|
46
|
-
The file is removed by step
|
|
46
|
+
The file is removed by step 5 §4 after the final brief writes successfully.
|
package/src/skf-brief-skill/{steps-c/step-01-gather-intent.md → references/gather-intent.md}
RENAMED
|
@@ -1,15 +1,21 @@
|
|
|
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'
|
|
6
6
|
headlessSourceAuthorityDetectionFile: 'references/headless-source-authority-detection.md'
|
|
7
7
|
portfolioSimilarityCheckFile: 'references/portfolio-similarity-check.md'
|
|
8
8
|
draftCheckpointFile: 'references/draft-checkpoint.md'
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
validateBriefInputsProbeOrder:
|
|
10
|
+
- '{project-root}/_bmad/skf/shared/scripts/skf-validate-brief-inputs.py'
|
|
11
|
+
- '{project-root}/src/shared/scripts/skf-validate-brief-inputs.py'
|
|
12
|
+
emitBriefEnvelopeProbeOrder:
|
|
13
|
+
- '{project-root}/_bmad/skf/shared/scripts/skf-emit-brief-result-envelope.py'
|
|
14
|
+
- '{project-root}/src/shared/scripts/skf-emit-brief-result-envelope.py'
|
|
11
15
|
---
|
|
12
16
|
|
|
17
|
+
<!-- Config: communicate in {communication_language}. -->
|
|
18
|
+
|
|
13
19
|
# Step 1: Gather Intent
|
|
14
20
|
|
|
15
21
|
## STEP GOAL:
|
|
@@ -25,11 +31,9 @@ To initialize the brief-skill workflow by discovering the forge tier configurati
|
|
|
25
31
|
|
|
26
32
|
## MANDATORY SEQUENCE
|
|
27
33
|
|
|
28
|
-
**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change.
|
|
29
|
-
|
|
30
34
|
### 1. Discover Forge Tier
|
|
31
35
|
|
|
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
|
|
36
|
+
**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
37
|
|
|
34
38
|
```bash
|
|
35
39
|
mkdir -p "{forge_data_folder}" && \
|
|
@@ -37,7 +41,7 @@ mkdir -p "{forge_data_folder}" && \
|
|
|
37
41
|
rm "{forge_data_folder}/.skf-write-probe"
|
|
38
42
|
```
|
|
39
43
|
|
|
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
|
|
44
|
+
`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
45
|
|
|
42
46
|
Attempt to load `{forgeTierFile}`:
|
|
43
47
|
|
|
@@ -59,6 +63,8 @@ Attempt to load `{forgeTierFile}`:
|
|
|
59
63
|
|
|
60
64
|
"**Welcome to Brief Skill — the skill scoping workflow.**
|
|
61
65
|
|
|
66
|
+
**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.
|
|
67
|
+
|
|
62
68
|
I'll help you define exactly what to skill and produce a `skill-brief.yaml` that drives the create-skill compilation workflow.
|
|
63
69
|
|
|
64
70
|
We'll work through this together:
|
|
@@ -74,8 +80,6 @@ We'll work through this together:
|
|
|
74
80
|
|
|
75
81
|
(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
82
|
|
|
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
83
|
Let's get started."
|
|
80
84
|
|
|
81
85
|
### 3. Gather Target Repository
|
|
@@ -97,7 +101,7 @@ Or type `cancel` / `exit` / `[X]` to leave without writing anything.
|
|
|
97
101
|
|
|
98
102
|
Wait for user response. Branch on the response:
|
|
99
103
|
|
|
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
|
|
104
|
+
- 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
105
|
- Documentation URLs only (no source location) → §3.2
|
|
102
106
|
- GitHub URL or local filesystem path → §3.3
|
|
103
107
|
- 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 +123,8 @@ Skip §3.3 and continue at "Confirm the target" below.
|
|
|
119
123
|
- Set `source_type: "source"` (default)
|
|
120
124
|
- **Pre-validate the target before continuing.** Issue these probes in a single message with parallel Bash calls:
|
|
121
125
|
- **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
|
|
126
|
+
- **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.
|
|
127
|
+
- **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
128
|
- **Local path:** verify the directory exists (`test -d {path}`). If not, warn `"Local path {path} does not exist."` and re-prompt.
|
|
125
129
|
- Optionally ask: "Are there any documentation URLs you'd like to include for supplemental context? (These will be fetched as T3 external references.)"
|
|
126
130
|
- If yes: collect doc URLs into `doc_urls`
|
|
@@ -142,7 +146,7 @@ Confirm the target.
|
|
|
142
146
|
|
|
143
147
|
### 3b. Gather Target Version
|
|
144
148
|
|
|
145
|
-
This step only collects `target_version` and validates its shape with the regex below — auto-detection runs in step
|
|
149
|
+
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
150
|
|
|
147
151
|
**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
152
|
|
|
@@ -154,7 +158,7 @@ This step only collects `target_version` and validates its shape with the regex
|
|
|
154
158
|
|
|
155
159
|
Wait for user response.
|
|
156
160
|
|
|
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
|
|
161
|
+
**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
162
|
**If blank:** Proceed without `target_version` — version will be auto-detected in step 02.
|
|
159
163
|
|
|
160
164
|
{If target_version was set AND doc_urls are being collected (either docs-only primary or supplemental):}
|
|
@@ -176,7 +180,7 @@ If the command produces any output, skip this rail silently — repeat users don
|
|
|
176
180
|
|
|
177
181
|
"**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
182
|
|
|
179
|
-
On `[Y]`: load `{
|
|
183
|
+
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
184
|
|
|
181
185
|
"**What's your intent for this skill?**
|
|
182
186
|
|
|
@@ -227,12 +231,12 @@ Wait for confirmation or alternative.
|
|
|
227
231
|
{if a second alternate was produced:} [2] {alternate-2}
|
|
228
232
|
{if a third alternate was produced:} [3] {alternate-3}
|
|
229
233
|
|
|
230
|
-
Pick a number to use that name, type a different name, or press Enter to keep `{name}` and let step
|
|
234
|
+
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
235
|
```
|
|
232
236
|
|
|
233
|
-
On a numbered choice, replace `{name}` with the chosen alternate. On Enter, fall through to step
|
|
237
|
+
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
238
|
|
|
235
|
-
- Headless: log `"warn: skill name '{name}' collides with existing brief at {path}"` and proceed; the existing-brief overwrite policy in step
|
|
239
|
+
- 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
240
|
|
|
237
241
|
**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
242
|
|
|
@@ -260,11 +264,11 @@ Ready to analyze the target repository?"
|
|
|
260
264
|
|
|
261
265
|
### 7b. Synthesize Skill Description
|
|
262
266
|
|
|
263
|
-
The schema's `description` field is 1-3 sentences and surfaces in skill registries — it must exist by the time step
|
|
267
|
+
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
268
|
|
|
265
269
|
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
270
|
|
|
267
|
-
Load `{
|
|
271
|
+
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
272
|
|
|
269
273
|
Present:
|
|
270
274
|
|
|
@@ -282,11 +286,11 @@ Wait for user confirmation or alternative.
|
|
|
282
286
|
|
|
283
287
|
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
288
|
|
|
285
|
-
Store the accepted text as the brief's `description` field. The same field is re-presented in step
|
|
289
|
+
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
290
|
|
|
287
|
-
**Headless:** if the `intent` argument was supplied, load `{
|
|
291
|
+
**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
292
|
|
|
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 `{
|
|
293
|
+
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
294
|
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
295
|
|
|
292
296
|
### 8. Present MENU OPTIONS
|
|
@@ -296,25 +300,27 @@ Display: "**Select:** [C] Continue to Target Analysis · [X] Cancel and exit"
|
|
|
296
300
|
#### Menu Handling Logic:
|
|
297
301
|
|
|
298
302
|
- 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
|
|
303
|
+
- 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
304
|
- IF Any other: Help user, then [Redisplay Menu Options](#8-present-menu-options)
|
|
301
305
|
|
|
302
306
|
#### EXECUTION RULES:
|
|
303
307
|
|
|
304
308
|
- ALWAYS halt and wait for user input after presenting menu
|
|
305
|
-
- **
|
|
309
|
+
- **Resolve `{validateBriefInputsHelper}`** from `{validateBriefInputsProbeOrder}`; first existing path wins. HALT if no candidate exists.
|
|
310
|
+
|
|
311
|
+
- **GATE [default: use args]** — If `{headless_mode}`, consume pre-supplied arguments and auto-proceed. The full argument set (required/optional, defaults, halt codes, enum values) is documented in `{headlessArgsFile}` — load it now if you need to look up a specific argument. Validation is delegated to `{validateBriefInputsHelper}`; the table is the canonical operator-facing documentation, the script enforces it.
|
|
306
312
|
|
|
307
313
|
**Preset merge (before validation).** If the headless args include a `preset` field, load `{sidecar_path}/brief-presets/{preset}.yaml` and merge its contents as defaults — explicit args override preset values, key by key. The preset file is YAML; if it does not exist, log `"warn: preset '{name}' not found at {path} — proceeding without preset"` and continue (do not HALT). If it parses but contains unknown fields, log per-field warnings and pass through unchanged (the validator's KNOWN_FIELDS check will catch any that survive). Drop the `preset` key itself from the merged dict before passing to the validator (it is consumed at this level and is not a brief field).
|
|
308
314
|
|
|
309
|
-
**Delegate validation to `{
|
|
315
|
+
**Delegate validation to `{validateBriefInputsHelper}`** instead of reasoning through the table rules in prose:
|
|
310
316
|
|
|
311
317
|
```bash
|
|
312
|
-
echo '<headless-args-as-json>' | uv run {
|
|
318
|
+
echo '<headless-args-as-json>' | uv run {validateBriefInputsHelper}
|
|
313
319
|
```
|
|
314
320
|
|
|
315
321
|
The script returns a JSON envelope: `{valid, errors[], warnings[], normalized, halt_reason}`. Apply the result deterministically:
|
|
316
322
|
|
|
317
|
-
- **`valid: false`** — emit the error envelope per **step
|
|
323
|
+
- **`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
324
|
- **`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
325
|
|
|
320
326
|
The script's `KNOWN_FIELDS` set must stay in sync with the table in `{headlessArgsFile}`.
|
|
@@ -325,5 +331,5 @@ Display: "**Select:** [C] Continue to Target Analysis · [X] Cancel and exit"
|
|
|
325
331
|
|
|
326
332
|
## CRITICAL STEP COMPLETION NOTE
|
|
327
333
|
|
|
328
|
-
ONLY WHEN C is selected and target repository is confirmed will you load and read fully
|
|
334
|
+
ONLY WHEN C is selected and target repository is confirmed will you load and read fully `analyze-target.md` to execute target analysis.
|
|
329
335
|
|
|
@@ -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 `{validateBriefInputsHelper}` 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
|
|
|
@@ -41,7 +41,7 @@ echo '{
|
|
|
41
41
|
"skill_name": "{skill-name}",
|
|
42
42
|
"created_at": "{current ISO date}"
|
|
43
43
|
// include "status": "pending" only when embed verification failed
|
|
44
|
-
}' | uv run {
|
|
44
|
+
}' | uv run {forgeTierRwHelper} register-qmd-collection --target {forgeTierFile}
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
The script handles the upsert deterministically (replace existing entry with same `name`, else append) and preserves all other forge-tier state (tools, tier, ccc_index, ccc_index_registry, other qmd_collections entries) — no need to reason about YAML re-rendering or section comments.
|
package/src/skf-brief-skill/{steps-c/step-03-scope-definition.md → references/scope-definition.md}
RENAMED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
---
|
|
2
|
-
nextStepFile: '
|
|
2
|
+
nextStepFile: 'confirm-brief.md'
|
|
3
3
|
scopeTemplatesFile: 'assets/scope-templates.md'
|
|
4
|
-
|
|
4
|
+
recommendScopeTypeProbeOrder:
|
|
5
|
+
- '{project-root}/_bmad/skf/shared/scripts/skf-recommend-scope-type.py'
|
|
6
|
+
- '{project-root}/src/shared/scripts/skf-recommend-scope-type.py'
|
|
5
7
|
advancedElicitationSkill: '/bmad-advanced-elicitation'
|
|
6
8
|
partyModeSkill: '/bmad-party-mode'
|
|
7
9
|
---
|
|
8
10
|
|
|
11
|
+
<!-- Config: communicate in {communication_language}. -->
|
|
12
|
+
|
|
9
13
|
# Step 3: Scope Definition
|
|
10
14
|
|
|
11
15
|
## STEP GOAL:
|
|
@@ -18,12 +22,10 @@ To collaboratively define the skill's inclusion and exclusion boundaries using t
|
|
|
18
22
|
- Do not make scope decisions unilaterally — user drives all scope choices
|
|
19
23
|
- Produce: scope type, include patterns, exclude patterns
|
|
20
24
|
- All user-facing output in `{communication_language}`
|
|
21
|
-
- **Re-entry from step
|
|
25
|
+
- **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
26
|
|
|
23
27
|
## MANDATORY SEQUENCE
|
|
24
28
|
|
|
25
|
-
**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change.
|
|
26
|
-
|
|
27
29
|
### 1. Present Scope Context
|
|
28
30
|
|
|
29
31
|
"**Let's define the scope for your skill.**
|
|
@@ -68,9 +70,9 @@ Add, remove, or confirm these URLs."
|
|
|
68
70
|
|
|
69
71
|
Wait for confirmation. Record any changes to `doc_urls`.
|
|
70
72
|
|
|
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
|
|
73
|
+
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
74
|
|
|
73
|
-
**On re-entry from step
|
|
75
|
+
**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
76
|
|
|
75
77
|
**If no supplemental doc_urls were collected:** Skip this subsection.
|
|
76
78
|
|
|
@@ -78,11 +80,13 @@ HEAD-check the URLs in parallel — issue all N `curl -sI --max-time 5 {url}` ca
|
|
|
78
80
|
|
|
79
81
|
### 2c. Offer Scope Templates
|
|
80
82
|
|
|
81
|
-
Load `{
|
|
83
|
+
Load `{scopeTemplatesPath}` for the scope type options ([F], [M], [P], [C], [R]) and their descriptions.
|
|
82
84
|
|
|
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
|
|
85
|
+
**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
86
|
|
|
85
|
-
**
|
|
87
|
+
**Resolve `{recommendScopeTypeHelper}`** from `{recommendScopeTypeProbeOrder}`; first existing path wins. HALT if no candidate exists.
|
|
88
|
+
|
|
89
|
+
**Delegate the recommendation to `{recommendScopeTypeHelper}`** 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
90
|
|
|
87
91
|
**Fetch registry-file contents before building the payload.** Step-02 §4.1 fetches `package.json` plus the entry-point files but does not fetch `registry.ts` / `components.ts` — the deep-match branch of the component-registry rule needs those contents. Scan the tree for any of `registry.ts` / `registry.tsx` / `components.ts` / `components.tsx` (any depth). For each match, fetch its contents in **one message with N parallel Bash calls** (`gh api repos/{owner}/{repo}/contents/{path}` for GitHub, file reads for local), then base64-decode the responses together. Skip the fetch if the tree contains no registry files.
|
|
88
92
|
|
|
@@ -90,27 +94,29 @@ Build the payload and invoke:
|
|
|
90
94
|
|
|
91
95
|
```bash
|
|
92
96
|
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
|
|
97
|
+
"intent": "<combined intent + scope_hint text from step 1>",
|
|
98
|
+
"module_count": <count from step 2 §4.3>,
|
|
99
|
+
"export_count": <count from step 2 §4.3>,
|
|
100
|
+
"tree": [<flat list of repo-relative file paths from step 2 §1>],
|
|
97
101
|
"entry_files": [{"path": "<registry path>", "content": "<contents>"}, ...],
|
|
98
102
|
"source_type": "source",
|
|
99
103
|
"mode": "interactive"
|
|
100
|
-
}' | uv run {
|
|
104
|
+
}' | uv run {recommendScopeTypeHelper}
|
|
101
105
|
```
|
|
102
106
|
|
|
103
107
|
`entry_files` carries the registry contents fetched above; omit when no registry files exist in the tree. `mode: "interactive"` activates the content-inspection branch of the component-registry rule (10+ entries or `Component[]` annotation); the headless GATE in §6 uses `mode: "headless"` which falls back to presence-only matching. `source_type: "docs-only"` short-circuits to `docs-only` regardless of the other signals.
|
|
104
108
|
|
|
105
109
|
The script returns `{scope_type, matched_heuristic, signals, rationale}`. Use `rationale` directly — it already names the specific signals that fired.
|
|
106
110
|
|
|
111
|
+
**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`.
|
|
112
|
+
|
|
107
113
|
Present:
|
|
108
114
|
|
|
109
115
|
"**Recommended scope type: [{letter}] {Name}** — {rationale from the script}.
|
|
110
116
|
|
|
111
117
|
How broadly should this skill cover the library?
|
|
112
118
|
|
|
113
|
-
{full menu from `{
|
|
119
|
+
{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
120
|
|
|
115
121
|
Press Enter to accept the recommendation, or pick a different letter."
|
|
116
122
|
|
|
@@ -118,7 +124,7 @@ Wait for user selection. Empty input or just Enter accepts the recommendation; a
|
|
|
118
124
|
|
|
119
125
|
### 3. Define Boundaries Based on Selection
|
|
120
126
|
|
|
121
|
-
Using the boundary definitions from `{
|
|
127
|
+
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
128
|
|
|
123
129
|
### 4. Handle Language Override
|
|
124
130
|
|
|
@@ -178,11 +184,12 @@ Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Conti
|
|
|
178
184
|
#### EXECUTION RULES:
|
|
179
185
|
|
|
180
186
|
- ALWAYS halt and wait for user input after presenting menu
|
|
181
|
-
- **GATE [default: C]** — If `{headless_mode}`: consume the headless inputs from step
|
|
187
|
+
- **GATE [default: C]** — If `{headless_mode}`: consume the headless inputs from step 1 in priority order:
|
|
182
188
|
- If `scope_type` was supplied, use it (must match one of the six valid types) and skip the §2c template menu.
|
|
183
|
-
- Otherwise auto-select via `{
|
|
189
|
+
- Otherwise auto-select via `{recommendScopeTypeHelper}` — 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
190
|
- If `include`/`exclude` were supplied, use them verbatim (split on comma) instead of running the boundary prompts in §3.
|
|
185
191
|
- If `scripts_intent`/`assets_intent` were supplied, record them and skip §5b; otherwise default to `detect`.
|
|
192
|
+
- 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
193
|
- Log: `"headless: scope_type={value} include={n} exclude={n} scripts_intent={value} assets_intent={value}"`.
|
|
187
194
|
- ONLY proceed to next step when user selects 'C'
|
|
188
195
|
- After other menu items execution, return to this menu
|
|
@@ -190,5 +197,5 @@ Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Conti
|
|
|
190
197
|
|
|
191
198
|
## CRITICAL STEP COMPLETION NOTE
|
|
192
199
|
|
|
193
|
-
ONLY WHEN C is selected and scope boundaries are confirmed will you load and read fully
|
|
200
|
+
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
201
|
|
|
@@ -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
|
|