@ngocsangairvds/vsaf 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/bmad-advanced-elicitation/SKILL.md +136 -0
- package/.claude/skills/bmad-advanced-elicitation/methods.csv +51 -0
- package/.claude/skills/bmad-agent-analyst/SKILL.md +59 -0
- package/.claude/skills/bmad-agent-analyst/bmad-skill-manifest.yaml +11 -0
- package/.claude/skills/bmad-agent-architect/SKILL.md +54 -0
- package/.claude/skills/bmad-agent-architect/bmad-skill-manifest.yaml +11 -0
- package/.claude/skills/bmad-agent-dev/SKILL.md +69 -0
- package/.claude/skills/bmad-agent-dev/bmad-skill-manifest.yaml +11 -0
- package/.claude/skills/bmad-agent-pm/SKILL.md +59 -0
- package/.claude/skills/bmad-agent-pm/bmad-skill-manifest.yaml +11 -0
- package/.claude/skills/bmad-agent-tech-writer/SKILL.md +57 -0
- package/.claude/skills/bmad-agent-tech-writer/bmad-skill-manifest.yaml +11 -0
- package/.claude/skills/bmad-agent-tech-writer/explain-concept.md +20 -0
- package/.claude/skills/bmad-agent-tech-writer/mermaid-gen.md +20 -0
- package/.claude/skills/bmad-agent-tech-writer/validate-doc.md +19 -0
- package/.claude/skills/bmad-agent-tech-writer/write-document.md +20 -0
- package/.claude/skills/bmad-agent-ux-designer/SKILL.md +55 -0
- package/.claude/skills/bmad-agent-ux-designer/bmad-skill-manifest.yaml +11 -0
- package/.claude/skills/bmad-brainstorming/SKILL.md +6 -0
- package/.claude/skills/bmad-brainstorming/brain-methods.csv +62 -0
- package/.claude/skills/bmad-brainstorming/steps/step-01-session-setup.md +214 -0
- package/.claude/skills/bmad-brainstorming/steps/step-01b-continue.md +124 -0
- package/.claude/skills/bmad-brainstorming/steps/step-02a-user-selected.md +229 -0
- package/.claude/skills/bmad-brainstorming/steps/step-02b-ai-recommended.md +239 -0
- package/.claude/skills/bmad-brainstorming/steps/step-02c-random-selection.md +211 -0
- package/.claude/skills/bmad-brainstorming/steps/step-02d-progressive-flow.md +266 -0
- package/.claude/skills/bmad-brainstorming/steps/step-03-technique-execution.md +401 -0
- package/.claude/skills/bmad-brainstorming/steps/step-04-idea-organization.md +305 -0
- package/.claude/skills/bmad-brainstorming/template.md +15 -0
- package/.claude/skills/bmad-brainstorming/workflow.md +53 -0
- package/.claude/skills/bmad-check-implementation-readiness/SKILL.md +6 -0
- package/.claude/skills/bmad-check-implementation-readiness/steps/step-01-document-discovery.md +179 -0
- package/.claude/skills/bmad-check-implementation-readiness/steps/step-02-prd-analysis.md +168 -0
- package/.claude/skills/bmad-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +169 -0
- package/.claude/skills/bmad-check-implementation-readiness/steps/step-04-ux-alignment.md +129 -0
- package/.claude/skills/bmad-check-implementation-readiness/steps/step-05-epic-quality-review.md +241 -0
- package/.claude/skills/bmad-check-implementation-readiness/steps/step-06-final-assessment.md +126 -0
- package/.claude/skills/bmad-check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/.claude/skills/bmad-check-implementation-readiness/workflow.md +47 -0
- package/.claude/skills/bmad-checkpoint-preview/SKILL.md +29 -0
- package/.claude/skills/bmad-checkpoint-preview/generate-trail.md +38 -0
- package/.claude/skills/bmad-checkpoint-preview/step-01-orientation.md +105 -0
- package/.claude/skills/bmad-checkpoint-preview/step-02-walkthrough.md +89 -0
- package/.claude/skills/bmad-checkpoint-preview/step-03-detail-pass.md +106 -0
- package/.claude/skills/bmad-checkpoint-preview/step-04-testing.md +74 -0
- package/.claude/skills/bmad-checkpoint-preview/step-05-wrapup.md +24 -0
- package/.claude/skills/bmad-code-review/SKILL.md +6 -0
- package/.claude/skills/bmad-code-review/steps/step-01-gather-context.md +85 -0
- package/.claude/skills/bmad-code-review/steps/step-02-review.md +34 -0
- package/.claude/skills/bmad-code-review/steps/step-03-triage.md +49 -0
- package/.claude/skills/bmad-code-review/steps/step-04-present.md +129 -0
- package/.claude/skills/bmad-code-review/workflow.md +55 -0
- package/.claude/skills/bmad-correct-course/SKILL.md +6 -0
- package/.claude/skills/bmad-correct-course/checklist.md +288 -0
- package/.claude/skills/bmad-correct-course/workflow.md +267 -0
- package/.claude/skills/bmad-create-architecture/SKILL.md +6 -0
- package/.claude/skills/bmad-create-architecture/architecture-decision-template.md +12 -0
- package/.claude/skills/bmad-create-architecture/data/domain-complexity.csv +13 -0
- package/.claude/skills/bmad-create-architecture/data/project-types.csv +7 -0
- package/.claude/skills/bmad-create-architecture/steps/step-01-init.md +153 -0
- package/.claude/skills/bmad-create-architecture/steps/step-01b-continue.md +173 -0
- package/.claude/skills/bmad-create-architecture/steps/step-02-context.md +224 -0
- package/.claude/skills/bmad-create-architecture/steps/step-03-starter.md +329 -0
- package/.claude/skills/bmad-create-architecture/steps/step-04-decisions.md +318 -0
- package/.claude/skills/bmad-create-architecture/steps/step-05-patterns.md +359 -0
- package/.claude/skills/bmad-create-architecture/steps/step-06-structure.md +379 -0
- package/.claude/skills/bmad-create-architecture/steps/step-07-validation.md +359 -0
- package/.claude/skills/bmad-create-architecture/steps/step-08-complete.md +76 -0
- package/.claude/skills/bmad-create-architecture/workflow.md +32 -0
- package/.claude/skills/bmad-create-epics-and-stories/SKILL.md +6 -0
- package/.claude/skills/bmad-create-epics-and-stories/steps/step-01-validate-prerequisites.md +255 -0
- package/.claude/skills/bmad-create-epics-and-stories/steps/step-02-design-epics.md +212 -0
- package/.claude/skills/bmad-create-epics-and-stories/steps/step-03-create-stories.md +255 -0
- package/.claude/skills/bmad-create-epics-and-stories/steps/step-04-final-validation.md +131 -0
- package/.claude/skills/bmad-create-epics-and-stories/templates/epics-template.md +61 -0
- package/.claude/skills/bmad-create-epics-and-stories/workflow.md +51 -0
- package/.claude/skills/bmad-create-prd/SKILL.md +6 -0
- package/.claude/skills/bmad-create-prd/data/domain-complexity.csv +15 -0
- package/.claude/skills/bmad-create-prd/data/prd-purpose.md +197 -0
- package/.claude/skills/bmad-create-prd/data/project-types.csv +11 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-01-init.md +178 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-01b-continue.md +161 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-02-discovery.md +208 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-02b-vision.md +142 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-02c-executive-summary.md +158 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-03-success.md +214 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-04-journeys.md +201 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-05-domain.md +194 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-06-innovation.md +211 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-07-project-type.md +222 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-08-scoping.md +216 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-09-functional.md +219 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-10-nonfunctional.md +230 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-11-polish.md +221 -0
- package/.claude/skills/bmad-create-prd/steps-c/step-12-complete.md +115 -0
- package/.claude/skills/bmad-create-prd/templates/prd-template.md +10 -0
- package/.claude/skills/bmad-create-prd/workflow.md +61 -0
- package/.claude/skills/bmad-create-story/SKILL.md +6 -0
- package/.claude/skills/bmad-create-story/checklist.md +357 -0
- package/.claude/skills/bmad-create-story/discover-inputs.md +88 -0
- package/.claude/skills/bmad-create-story/template.md +49 -0
- package/.claude/skills/bmad-create-story/workflow.md +380 -0
- package/.claude/skills/bmad-create-ux-design/SKILL.md +6 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-01-init.md +135 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-01b-continue.md +127 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-02-discovery.md +190 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-03-core-experience.md +217 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-04-emotional-response.md +220 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-05-inspiration.md +235 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-06-design-system.md +253 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-07-defining-experience.md +255 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-08-visual-foundation.md +225 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-09-design-directions.md +225 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-10-user-journeys.md +242 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-11-component-strategy.md +249 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-12-ux-patterns.md +238 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-13-responsive-accessibility.md +265 -0
- package/.claude/skills/bmad-create-ux-design/steps/step-14-complete.md +171 -0
- package/.claude/skills/bmad-create-ux-design/ux-design-template.md +13 -0
- package/.claude/skills/bmad-create-ux-design/workflow.md +35 -0
- package/.claude/skills/bmad-dev-story/SKILL.md +6 -0
- package/.claude/skills/bmad-dev-story/checklist.md +80 -0
- package/.claude/skills/bmad-dev-story/workflow.md +450 -0
- package/.claude/skills/bmad-distillator/SKILL.md +177 -0
- package/.claude/skills/bmad-distillator/agents/distillate-compressor.md +116 -0
- package/.claude/skills/bmad-distillator/agents/round-trip-reconstructor.md +68 -0
- package/.claude/skills/bmad-distillator/resources/compression-rules.md +51 -0
- package/.claude/skills/bmad-distillator/resources/distillate-format-reference.md +227 -0
- package/.claude/skills/bmad-distillator/resources/splitting-strategy.md +78 -0
- package/.claude/skills/bmad-distillator/scripts/analyze_sources.py +300 -0
- package/.claude/skills/bmad-distillator/scripts/tests/test_analyze_sources.py +204 -0
- package/.claude/skills/bmad-document-project/SKILL.md +6 -0
- package/.claude/skills/bmad-document-project/checklist.md +245 -0
- package/.claude/skills/bmad-document-project/documentation-requirements.csv +12 -0
- package/.claude/skills/bmad-document-project/instructions.md +128 -0
- package/.claude/skills/bmad-document-project/templates/deep-dive-template.md +345 -0
- package/.claude/skills/bmad-document-project/templates/index-template.md +169 -0
- package/.claude/skills/bmad-document-project/templates/project-overview-template.md +103 -0
- package/.claude/skills/bmad-document-project/templates/project-scan-report-schema.json +160 -0
- package/.claude/skills/bmad-document-project/templates/source-tree-template.md +135 -0
- package/.claude/skills/bmad-document-project/workflow.md +25 -0
- package/.claude/skills/bmad-document-project/workflows/deep-dive-instructions.md +299 -0
- package/.claude/skills/bmad-document-project/workflows/deep-dive-workflow.md +34 -0
- package/.claude/skills/bmad-document-project/workflows/full-scan-instructions.md +1107 -0
- package/.claude/skills/bmad-document-project/workflows/full-scan-workflow.md +34 -0
- package/.claude/skills/bmad-domain-research/SKILL.md +6 -0
- package/.claude/skills/bmad-domain-research/domain-steps/step-01-init.md +137 -0
- package/.claude/skills/bmad-domain-research/domain-steps/step-02-domain-analysis.md +229 -0
- package/.claude/skills/bmad-domain-research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/.claude/skills/bmad-domain-research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/.claude/skills/bmad-domain-research/domain-steps/step-05-technical-trends.md +234 -0
- package/.claude/skills/bmad-domain-research/domain-steps/step-06-research-synthesis.md +444 -0
- package/.claude/skills/bmad-domain-research/research.template.md +29 -0
- package/.claude/skills/bmad-domain-research/workflow.md +51 -0
- package/.claude/skills/bmad-edit-prd/SKILL.md +6 -0
- package/.claude/skills/bmad-edit-prd/data/prd-purpose.md +197 -0
- package/.claude/skills/bmad-edit-prd/steps-e/step-e-01-discovery.md +242 -0
- package/.claude/skills/bmad-edit-prd/steps-e/step-e-01b-legacy-conversion.md +204 -0
- package/.claude/skills/bmad-edit-prd/steps-e/step-e-02-review.md +245 -0
- package/.claude/skills/bmad-edit-prd/steps-e/step-e-03-edit.md +250 -0
- package/.claude/skills/bmad-edit-prd/steps-e/step-e-04-complete.md +163 -0
- package/.claude/skills/bmad-edit-prd/workflow.md +62 -0
- package/.claude/skills/bmad-editorial-review-prose/SKILL.md +86 -0
- package/.claude/skills/bmad-editorial-review-structure/SKILL.md +179 -0
- package/.claude/skills/bmad-generate-project-context/SKILL.md +6 -0
- package/.claude/skills/bmad-generate-project-context/project-context-template.md +21 -0
- package/.claude/skills/bmad-generate-project-context/steps/step-01-discover.md +186 -0
- package/.claude/skills/bmad-generate-project-context/steps/step-02-generate.md +321 -0
- package/.claude/skills/bmad-generate-project-context/steps/step-03-complete.md +278 -0
- package/.claude/skills/bmad-generate-project-context/workflow.md +39 -0
- package/.claude/skills/bmad-help/SKILL.md +75 -0
- package/.claude/skills/bmad-index-docs/SKILL.md +66 -0
- package/.claude/skills/bmad-market-research/SKILL.md +6 -0
- package/.claude/skills/bmad-market-research/research.template.md +29 -0
- package/.claude/skills/bmad-market-research/steps/step-01-init.md +184 -0
- package/.claude/skills/bmad-market-research/steps/step-02-customer-behavior.md +239 -0
- package/.claude/skills/bmad-market-research/steps/step-03-customer-pain-points.md +251 -0
- package/.claude/skills/bmad-market-research/steps/step-04-customer-decisions.md +261 -0
- package/.claude/skills/bmad-market-research/steps/step-05-competitive-analysis.md +173 -0
- package/.claude/skills/bmad-market-research/steps/step-06-research-completion.md +478 -0
- package/.claude/skills/bmad-market-research/workflow.md +51 -0
- package/.claude/skills/bmad-party-mode/SKILL.md +125 -0
- package/.claude/skills/bmad-prfaq/SKILL.md +96 -0
- package/.claude/skills/bmad-prfaq/agents/artifact-analyzer.md +60 -0
- package/.claude/skills/bmad-prfaq/agents/web-researcher.md +49 -0
- package/.claude/skills/bmad-prfaq/assets/prfaq-template.md +62 -0
- package/.claude/skills/bmad-prfaq/bmad-manifest.json +16 -0
- package/.claude/skills/bmad-prfaq/references/customer-faq.md +55 -0
- package/.claude/skills/bmad-prfaq/references/internal-faq.md +51 -0
- package/.claude/skills/bmad-prfaq/references/press-release.md +60 -0
- package/.claude/skills/bmad-prfaq/references/verdict.md +79 -0
- package/.claude/skills/bmad-product-brief/SKILL.md +82 -0
- package/.claude/skills/bmad-product-brief/agents/artifact-analyzer.md +60 -0
- package/.claude/skills/bmad-product-brief/agents/opportunity-reviewer.md +44 -0
- package/.claude/skills/bmad-product-brief/agents/skeptic-reviewer.md +44 -0
- package/.claude/skills/bmad-product-brief/agents/web-researcher.md +49 -0
- package/.claude/skills/bmad-product-brief/bmad-manifest.json +17 -0
- package/.claude/skills/bmad-product-brief/prompts/contextual-discovery.md +57 -0
- package/.claude/skills/bmad-product-brief/prompts/draft-and-review.md +86 -0
- package/.claude/skills/bmad-product-brief/prompts/finalize.md +75 -0
- package/.claude/skills/bmad-product-brief/prompts/guided-elicitation.md +70 -0
- package/.claude/skills/bmad-product-brief/resources/brief-template.md +60 -0
- package/.claude/skills/bmad-qa-generate-e2e-tests/SKILL.md +6 -0
- package/.claude/skills/bmad-qa-generate-e2e-tests/checklist.md +33 -0
- package/.claude/skills/bmad-qa-generate-e2e-tests/workflow.md +136 -0
- package/.claude/skills/bmad-quick-dev/SKILL.md +6 -0
- package/.claude/skills/bmad-quick-dev/compile-epic-context.md +62 -0
- package/.claude/skills/bmad-quick-dev/spec-template.md +88 -0
- package/.claude/skills/bmad-quick-dev/step-01-clarify-and-route.md +91 -0
- package/.claude/skills/bmad-quick-dev/step-02-plan.md +47 -0
- package/.claude/skills/bmad-quick-dev/step-03-implement.md +39 -0
- package/.claude/skills/bmad-quick-dev/step-04-review.md +49 -0
- package/.claude/skills/bmad-quick-dev/step-05-present.md +63 -0
- package/.claude/skills/bmad-quick-dev/step-oneshot.md +61 -0
- package/.claude/skills/bmad-quick-dev/workflow.md +75 -0
- package/.claude/skills/bmad-retrospective/SKILL.md +6 -0
- package/.claude/skills/bmad-retrospective/workflow.md +1479 -0
- package/.claude/skills/bmad-review-adversarial-general/SKILL.md +37 -0
- package/.claude/skills/bmad-review-edge-case-hunter/SKILL.md +67 -0
- package/.claude/skills/bmad-shard-doc/SKILL.md +105 -0
- package/.claude/skills/bmad-sprint-planning/SKILL.md +6 -0
- package/.claude/skills/bmad-sprint-planning/checklist.md +33 -0
- package/.claude/skills/bmad-sprint-planning/sprint-status-template.yaml +56 -0
- package/.claude/skills/bmad-sprint-planning/workflow.md +263 -0
- package/.claude/skills/bmad-sprint-status/SKILL.md +6 -0
- package/.claude/skills/bmad-sprint-status/workflow.md +261 -0
- package/.claude/skills/bmad-technical-research/SKILL.md +6 -0
- package/.claude/skills/bmad-technical-research/research.template.md +29 -0
- package/.claude/skills/bmad-technical-research/technical-steps/step-01-init.md +137 -0
- package/.claude/skills/bmad-technical-research/technical-steps/step-02-technical-overview.md +239 -0
- package/.claude/skills/bmad-technical-research/technical-steps/step-03-integration-patterns.md +248 -0
- package/.claude/skills/bmad-technical-research/technical-steps/step-04-architectural-patterns.md +202 -0
- package/.claude/skills/bmad-technical-research/technical-steps/step-05-implementation-research.md +233 -0
- package/.claude/skills/bmad-technical-research/technical-steps/step-06-research-synthesis.md +487 -0
- package/.claude/skills/bmad-technical-research/workflow.md +52 -0
- package/.claude/skills/bmad-validate-prd/SKILL.md +6 -0
- package/.claude/skills/bmad-validate-prd/data/domain-complexity.csv +15 -0
- package/.claude/skills/bmad-validate-prd/data/prd-purpose.md +197 -0
- package/.claude/skills/bmad-validate-prd/data/project-types.csv +11 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-01-discovery.md +221 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-02-format-detection.md +188 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-02b-parity-check.md +206 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-03-density-validation.md +171 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-04-brief-coverage-validation.md +211 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-05-measurability-validation.md +225 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-06-traceability-validation.md +214 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-07-implementation-leakage-validation.md +202 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-08-domain-compliance-validation.md +240 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-09-project-type-validation.md +260 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-10-smart-validation.md +206 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-11-holistic-quality-validation.md +261 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-12-completeness-validation.md +239 -0
- package/.claude/skills/bmad-validate-prd/steps-v/step-v-13-report-complete.md +229 -0
- package/.claude/skills/bmad-validate-prd/workflow.md +61 -0
- package/.claude/skills/gitnexus/gitnexus-cli/SKILL.md +82 -0
- package/.claude/skills/gitnexus/gitnexus-debugging/SKILL.md +89 -0
- package/.claude/skills/gitnexus/gitnexus-exploring/SKILL.md +78 -0
- package/.claude/skills/gitnexus/gitnexus-guide/SKILL.md +64 -0
- package/.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md +97 -0
- package/.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md +121 -0
- package/.claude/skills/openspec-apply-change/SKILL.md +156 -0
- package/.claude/skills/openspec-archive-change/SKILL.md +114 -0
- package/.claude/skills/openspec-explore/SKILL.md +288 -0
- package/.claude/skills/openspec-propose/SKILL.md +110 -0
- package/.claude/skills/vsaf-build/SKILL.md +52 -0
- package/.claude/skills/vsaf-doc/SKILL.md +66 -0
- package/.claude/skills/vsaf-memory-protocol.md +51 -0
- package/.claude/skills/vsaf-onboard/SKILL.md +55 -0
- package/.claude/skills/vsaf-plan/SKILL.md +68 -0
- package/.claude/skills/vsaf-ship/SKILL.md +76 -0
- package/.claude/skills/vsaf-test/SKILL.md +70 -0
- package/README.md +124 -0
- package/assets/templates/.claude/settings.json +82 -0
- package/assets/templates/CLAUDE.md +248 -0
- package/assets/templates/Makefile +77 -0
- package/assets/templates/scripts/session-end-check.sh +28 -0
- package/bin/vsaf.js +68 -0
- package/package.json +22 -0
- package/src/global.js +98 -0
- package/src/project.js +94 -0
- package/src/status.js +51 -0
- package/src/utils.js +42 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Session-end verification hook for Claude Code.
|
|
3
|
+
# Checks staged files for secrets and debug artifacts.
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
cd "${PROJECT_DIR:-.}" 2>/dev/null || exit 0
|
|
7
|
+
|
|
8
|
+
ISSUES=""
|
|
9
|
+
|
|
10
|
+
# Check for hardcoded secrets in staged files
|
|
11
|
+
SECRETS=$(git diff --cached --diff-filter=ACM --name-only 2>/dev/null \
|
|
12
|
+
| xargs grep -lE 'AKIA[0-9A-Z]{16}|ghp_[a-zA-Z0-9]{36}|sk-[a-zA-Z0-9]{48}|xox[bpoas]-|BEGIN.*PRIVATE' 2>/dev/null) || true
|
|
13
|
+
|
|
14
|
+
if [ -n "$SECRETS" ]; then
|
|
15
|
+
ISSUES="${ISSUES}WARNING: Possible secrets staged: ${SECRETS} "
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
# Check for debug artifacts in staged files
|
|
19
|
+
LOGS=$(git diff --cached --name-only 2>/dev/null \
|
|
20
|
+
| xargs grep -lE 'console[.]log|debugger' 2>/dev/null) || true
|
|
21
|
+
|
|
22
|
+
if [ -n "$LOGS" ]; then
|
|
23
|
+
ISSUES="${ISSUES}WARNING: Debug artifacts in staged files: ${LOGS} "
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
if [ -n "$ISSUES" ]; then
|
|
27
|
+
echo "$ISSUES"
|
|
28
|
+
fi
|
package/bin/vsaf.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const [,, cmd] = process.argv;
|
|
5
|
+
|
|
6
|
+
const HELP = `
|
|
7
|
+
vsaf — Agentic AI SDLC Framework v3
|
|
8
|
+
|
|
9
|
+
USAGE
|
|
10
|
+
vsaf init Full setup: global infra + project scaffold
|
|
11
|
+
vsaf global Install global infra only (skills, binaries)
|
|
12
|
+
vsaf project Scaffold project files only (assumes global done)
|
|
13
|
+
vsaf status Show installation status
|
|
14
|
+
|
|
15
|
+
GLOBAL (once per machine → ~/.claude/)
|
|
16
|
+
Skills : bmad (41), openspec (4), vsaf (5), gitnexus (6)
|
|
17
|
+
Binaries: gitnexus, openspec, graphify, mempalace, bun, claude-mem
|
|
18
|
+
|
|
19
|
+
PER PROJECT (per repo, run inside the repo root)
|
|
20
|
+
.claude/settings.json Hooks: secret detection, protected files
|
|
21
|
+
CLAUDE.md 10-step workflow rules
|
|
22
|
+
Makefile index, verify, review, archive, mine, status
|
|
23
|
+
scripts/ Session-end check hook
|
|
24
|
+
|
|
25
|
+
EXAMPLES
|
|
26
|
+
npx vsaf init # New machine + new project (recommended)
|
|
27
|
+
npx vsaf global # Already have projects, new machine
|
|
28
|
+
npx vsaf project # Global already done, add VSAF to existing repo
|
|
29
|
+
npx vsaf status # Check what is installed
|
|
30
|
+
`;
|
|
31
|
+
|
|
32
|
+
async function main() {
|
|
33
|
+
switch (cmd) {
|
|
34
|
+
case 'init': {
|
|
35
|
+
const { installGlobal } = require('../src/global');
|
|
36
|
+
const { installProject } = require('../src/project');
|
|
37
|
+
await installGlobal();
|
|
38
|
+
await installProject();
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
case 'global': {
|
|
42
|
+
const { installGlobal } = require('../src/global');
|
|
43
|
+
await installGlobal();
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case 'project': {
|
|
47
|
+
const { installProject } = require('../src/project');
|
|
48
|
+
await installProject();
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
case 'status': {
|
|
52
|
+
const { showStatus } = require('../src/status');
|
|
53
|
+
await showStatus();
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
default:
|
|
57
|
+
console.log(HELP);
|
|
58
|
+
if (cmd && cmd !== '--help' && cmd !== 'help') {
|
|
59
|
+
console.error(`\nUnknown command: ${cmd}`);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
main().catch(err => {
|
|
66
|
+
console.error('\x1b[31mError:\x1b[0m', err.message);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ngocsangairvds/vsaf",
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"description": "VSAF — Agentic AI SDLC Framework. Spec-driven development, 3-layer review, 7 integrated tools.",
|
|
5
|
+
"keywords": ["claude", "claude-code", "ai", "sdlc", "framework", "bmad", "openspec"],
|
|
6
|
+
"bin": {
|
|
7
|
+
"vsaf": "./bin/vsaf.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "echo 'No tests'"
|
|
11
|
+
},
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=18"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"bin/",
|
|
17
|
+
"src/",
|
|
18
|
+
".claude/skills/",
|
|
19
|
+
"assets/"
|
|
20
|
+
],
|
|
21
|
+
"license": "MIT"
|
|
22
|
+
}
|
package/src/global.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const { ok, info, warn, step, hasCommand, exec, copyDir, copyFile, CLAUDE_HOME } = require('./utils');
|
|
5
|
+
|
|
6
|
+
const PKG_ROOT = path.join(__dirname, '..');
|
|
7
|
+
const SKILLS_SRC = path.join(PKG_ROOT, '.claude', 'skills');
|
|
8
|
+
const SKILLS_DST = path.join(CLAUDE_HOME, 'skills');
|
|
9
|
+
|
|
10
|
+
async function installGlobal() {
|
|
11
|
+
console.log('\n\x1b[1m╔══════════════════════════════════════════╗\x1b[0m');
|
|
12
|
+
console.log( '\x1b[1m║ VSAF — Global Infra ║\x1b[0m');
|
|
13
|
+
console.log( '\x1b[1m╚══════════════════════════════════════════╝\x1b[0m');
|
|
14
|
+
|
|
15
|
+
installSkills();
|
|
16
|
+
installBinary('gitnexus', () => exec('npm install -g gitnexus'));
|
|
17
|
+
installBinary('openspec', () => exec('npm install -g @fission-ai/openspec@latest'));
|
|
18
|
+
installPipx('graphify', 'graphifyy');
|
|
19
|
+
installPipx('mempalace', 'mempalace');
|
|
20
|
+
installBun();
|
|
21
|
+
installClaudeMem();
|
|
22
|
+
|
|
23
|
+
console.log('\n\x1b[32m\x1b[1m✓ Global infra ready.\x1b[0m\n');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// ── Skills ──────────────────────────────────────────────────────────────────
|
|
27
|
+
|
|
28
|
+
function installSkills() {
|
|
29
|
+
step('Skills → ~/.claude/skills/');
|
|
30
|
+
|
|
31
|
+
if (!fs.existsSync(SKILLS_SRC)) {
|
|
32
|
+
warn('Skills directory not found in package — skipping');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
fs.mkdirSync(SKILLS_DST, { recursive: true });
|
|
37
|
+
|
|
38
|
+
let installed = 0;
|
|
39
|
+
let skipped = 0;
|
|
40
|
+
|
|
41
|
+
for (const entry of fs.readdirSync(SKILLS_SRC, { withFileTypes: true })) {
|
|
42
|
+
const src = path.join(SKILLS_SRC, entry.name);
|
|
43
|
+
const dst = path.join(SKILLS_DST, entry.name);
|
|
44
|
+
|
|
45
|
+
if (fs.existsSync(dst)) {
|
|
46
|
+
skipped++;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
entry.isDirectory() ? copyDir(src, dst) : copyFile(src, dst);
|
|
51
|
+
installed++;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
ok(`${installed} skill(s) installed, ${skipped} already present`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ── Binary helpers ───────────────────────────────────────────────────────────
|
|
58
|
+
|
|
59
|
+
function installBinary(name, installFn) {
|
|
60
|
+
step(`${name}`);
|
|
61
|
+
if (hasCommand(name)) { ok(`${name} already installed`); return; }
|
|
62
|
+
info(`Installing ${name}...`);
|
|
63
|
+
installFn()
|
|
64
|
+
? ok(`${name} installed`)
|
|
65
|
+
: warn(`${name} install failed — run manually`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function installPipx(cmd, pkg) {
|
|
69
|
+
step(cmd);
|
|
70
|
+
if (hasCommand(cmd)) { ok(`${cmd} already installed`); return; }
|
|
71
|
+
if (!hasCommand('pipx')) {
|
|
72
|
+
warn(`pipx not found — install pipx first, then run: pipx install ${pkg}`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
info(`Installing ${pkg} via pipx...`);
|
|
76
|
+
exec(`pipx install ${pkg}`)
|
|
77
|
+
? ok(`${cmd} installed`)
|
|
78
|
+
: warn(`${cmd} install failed — run: pipx install ${pkg}`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function installBun() {
|
|
82
|
+
step('bun (claude-mem runtime)');
|
|
83
|
+
if (hasCommand('bun')) { ok('bun already installed'); return; }
|
|
84
|
+
info('Installing bun...');
|
|
85
|
+
exec('curl -fsSL https://bun.sh/install | bash')
|
|
86
|
+
? ok('bun installed')
|
|
87
|
+
: warn('bun install failed — run: curl -fsSL https://bun.sh/install | bash');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function installClaudeMem() {
|
|
91
|
+
step('claude-mem');
|
|
92
|
+
info('Running claude-mem install...');
|
|
93
|
+
exec('npx claude-mem install')
|
|
94
|
+
? ok('claude-mem installed')
|
|
95
|
+
: warn('claude-mem install had issues — check manually');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
module.exports = { installGlobal };
|
package/src/project.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const { ok, info, warn, step, hasCommand, exec, copyDir, copyFile } = require('./utils');
|
|
5
|
+
|
|
6
|
+
const PKG_ROOT = path.join(__dirname, '..');
|
|
7
|
+
const TEMPLATES = path.join(PKG_ROOT, 'assets', 'templates');
|
|
8
|
+
const CWD = process.cwd();
|
|
9
|
+
|
|
10
|
+
async function installProject() {
|
|
11
|
+
console.log('\n\x1b[1m╔══════════════════════════════════════════╗\x1b[0m');
|
|
12
|
+
console.log( '\x1b[1m║ VSAF — Project Scaffold ║\x1b[0m');
|
|
13
|
+
console.log( '\x1b[1m╚══════════════════════════════════════════╝\x1b[0m');
|
|
14
|
+
|
|
15
|
+
scaffoldFiles();
|
|
16
|
+
initOpenSpec();
|
|
17
|
+
initGitNexus();
|
|
18
|
+
initMemPalace();
|
|
19
|
+
configureGitHooks();
|
|
20
|
+
|
|
21
|
+
console.log('\n\x1b[32m\x1b[1m✓ Project ready.\x1b[0m');
|
|
22
|
+
console.log('\n Next steps:');
|
|
23
|
+
console.log(' make status check all tools');
|
|
24
|
+
console.log(' /graphify . build knowledge graph (inside Claude Code)');
|
|
25
|
+
console.log(' /superpowers install install Superpowers plugin (inside Claude Code)\n');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ── File scaffold ────────────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
function scaffoldFiles() {
|
|
31
|
+
step('Scaffolding project files');
|
|
32
|
+
|
|
33
|
+
const files = [
|
|
34
|
+
{ tpl: '.claude/settings.json', dst: '.claude/settings.json' },
|
|
35
|
+
{ tpl: 'CLAUDE.md', dst: 'CLAUDE.md' },
|
|
36
|
+
{ tpl: 'Makefile', dst: 'Makefile' },
|
|
37
|
+
{ tpl: 'scripts/session-end-check.sh', dst: 'scripts/session-end-check.sh', chmod: 0o755 },
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
for (const { tpl, dst, chmod } of files) {
|
|
41
|
+
const src = path.join(TEMPLATES, tpl);
|
|
42
|
+
const dstAbs = path.join(CWD, dst);
|
|
43
|
+
|
|
44
|
+
if (!fs.existsSync(src)) {
|
|
45
|
+
warn(`Template missing: ${tpl}`);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (fs.existsSync(dstAbs)) {
|
|
50
|
+
ok(`${dst} — already exists, skipped`);
|
|
51
|
+
} else {
|
|
52
|
+
copyFile(src, dstAbs);
|
|
53
|
+
if (chmod) fs.chmodSync(dstAbs, chmod);
|
|
54
|
+
ok(`${dst} — created`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ── Tool initialisation ──────────────────────────────────────────────────────
|
|
60
|
+
|
|
61
|
+
function initOpenSpec() {
|
|
62
|
+
step('OpenSpec');
|
|
63
|
+
if (!hasCommand('openspec')) { warn('openspec not found — run: vsaf global'); return; }
|
|
64
|
+
const already = fs.existsSync(path.join(CWD, 'openspec.json'))
|
|
65
|
+
|| fs.existsSync(path.join(CWD, 'openspec'));
|
|
66
|
+
if (already) { ok('OpenSpec already initialised'); return; }
|
|
67
|
+
info('Initialising openspec...');
|
|
68
|
+
exec('openspec init', { cwd: CWD }) ? ok('OpenSpec initialised') : warn('openspec init failed — run manually');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function initGitNexus() {
|
|
72
|
+
step('GitNexus');
|
|
73
|
+
if (!hasCommand('gitnexus')) { warn('gitnexus not found — run: vsaf global'); return; }
|
|
74
|
+
info('Indexing repository (gitnexus analyze)...');
|
|
75
|
+
exec('gitnexus analyze', { cwd: CWD }) ? ok('Repository indexed') : warn('gitnexus analyze failed — run manually');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function initMemPalace() {
|
|
79
|
+
step('MemPalace');
|
|
80
|
+
if (!hasCommand('mempalace')) { warn('mempalace not found — run: vsaf global'); return; }
|
|
81
|
+
if (fs.existsSync(path.join(CWD, 'mempalace.yaml'))) { ok('MemPalace already initialised'); return; }
|
|
82
|
+
info('Initialising mempalace...');
|
|
83
|
+
exec(`mempalace init --yes "${CWD}"`, { cwd: CWD }) ? ok('MemPalace initialised') : warn('mempalace init failed — run manually');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function configureGitHooks() {
|
|
87
|
+
step('Git hooks');
|
|
88
|
+
if (!fs.existsSync(path.join(CWD, '.git'))) { warn('Not a git repo — skipping'); return; }
|
|
89
|
+
fs.mkdirSync(path.join(CWD, 'githooks'), { recursive: true });
|
|
90
|
+
exec('git config core.hooksPath githooks/', { cwd: CWD });
|
|
91
|
+
ok('Git hooks path → githooks/');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
module.exports = { installProject };
|
package/src/status.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const { hasCommand, CLAUDE_HOME } = require('./utils');
|
|
5
|
+
|
|
6
|
+
async function showStatus() {
|
|
7
|
+
console.log('\n\x1b[1mVSAF Status\x1b[0m\n');
|
|
8
|
+
|
|
9
|
+
// ── Global ─────────────────────────────────────────────────────────────────
|
|
10
|
+
console.log('\x1b[1mGlobal (machine-wide → ~/.claude/)\x1b[0m');
|
|
11
|
+
checkSkills();
|
|
12
|
+
checkCmd('gitnexus', 'GitNexus');
|
|
13
|
+
checkCmd('openspec', 'OpenSpec');
|
|
14
|
+
checkCmd('graphify', 'Graphify');
|
|
15
|
+
checkCmd('mempalace', 'MemPalace');
|
|
16
|
+
checkCmd('bun', 'Bun');
|
|
17
|
+
|
|
18
|
+
// ── Project ────────────────────────────────────────────────────────────────
|
|
19
|
+
console.log('\n\x1b[1mProject (current repo)\x1b[0m');
|
|
20
|
+
checkPath('.claude/settings.json', 'Project settings');
|
|
21
|
+
checkPath('CLAUDE.md', 'Workflow rules');
|
|
22
|
+
checkPath('Makefile', 'Makefile');
|
|
23
|
+
checkPath('scripts/session-end-check.sh', 'Session-end hook');
|
|
24
|
+
checkPath('.gitnexus', 'GitNexus index');
|
|
25
|
+
checkPath('openspec', 'OpenSpec');
|
|
26
|
+
checkPath('mempalace.yaml', 'MemPalace');
|
|
27
|
+
checkPath('githooks', 'Git hooks');
|
|
28
|
+
console.log('');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function checkCmd(cmd, label) {
|
|
32
|
+
const found = hasCommand(cmd);
|
|
33
|
+
console.log(` ${found ? '\x1b[32m✓\x1b[0m' : '\x1b[31m✗\x1b[0m'} ${label}`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function checkSkills() {
|
|
37
|
+
const dir = path.join(CLAUDE_HOME, 'skills');
|
|
38
|
+
if (!fs.existsSync(dir)) {
|
|
39
|
+
console.log(' \x1b[31m✗\x1b[0m Skills (not installed)');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const count = fs.readdirSync(dir).length;
|
|
43
|
+
console.log(` \x1b[32m✓\x1b[0m Skills (${count} in ~/.claude/skills/)`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function checkPath(rel, label) {
|
|
47
|
+
const exists = fs.existsSync(path.join(process.cwd(), rel));
|
|
48
|
+
console.log(` ${exists ? '\x1b[32m✓\x1b[0m' : '\x1b[31m✗\x1b[0m'} ${label}`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
module.exports = { showStatus };
|
package/src/utils.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const { execSync, spawnSync } = require('child_process');
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
|
|
7
|
+
const CLAUDE_HOME = path.join(os.homedir(), '.claude');
|
|
8
|
+
|
|
9
|
+
const ok = (msg) => console.log(` \x1b[32m✓\x1b[0m ${msg}`);
|
|
10
|
+
const info = (msg) => console.log(` \x1b[36m→\x1b[0m ${msg}`);
|
|
11
|
+
const warn = (msg) => console.log(` \x1b[33m!\x1b[0m ${msg}`);
|
|
12
|
+
const step = (msg) => console.log(`\n\x1b[1m${msg}\x1b[0m`);
|
|
13
|
+
|
|
14
|
+
function hasCommand(cmd) {
|
|
15
|
+
const r = spawnSync(cmd, ['--version'], { stdio: 'ignore', shell: false });
|
|
16
|
+
return r.status === 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function exec(cmd, opts = {}) {
|
|
20
|
+
try {
|
|
21
|
+
execSync(cmd, { stdio: opts.silent ? 'pipe' : 'inherit', shell: true, ...opts });
|
|
22
|
+
return true;
|
|
23
|
+
} catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function copyDir(src, dst) {
|
|
29
|
+
fs.mkdirSync(dst, { recursive: true });
|
|
30
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
31
|
+
const s = path.join(src, entry.name);
|
|
32
|
+
const d = path.join(dst, entry.name);
|
|
33
|
+
entry.isDirectory() ? copyDir(s, d) : fs.copyFileSync(s, d);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function copyFile(src, dst) {
|
|
38
|
+
fs.mkdirSync(path.dirname(dst), { recursive: true });
|
|
39
|
+
fs.copyFileSync(src, dst);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
module.exports = { ok, info, warn, step, hasCommand, exec, copyDir, copyFile, CLAUDE_HOME };
|