specweave 0.21.2 → 0.21.3
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.md +232 -5
- package/dist/plugins/specweave-github/lib/IssueStateManager.d.ts +98 -0
- package/dist/plugins/specweave-github/lib/IssueStateManager.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/IssueStateManager.js +146 -0
- package/dist/plugins/specweave-github/lib/IssueStateManager.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +6 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -1
- package/dist/src/cli/commands/check-hooks.d.ts +11 -0
- package/dist/src/cli/commands/check-hooks.d.ts.map +1 -0
- package/dist/src/cli/commands/check-hooks.js +144 -0
- package/dist/src/cli/commands/check-hooks.js.map +1 -0
- package/dist/src/cli/commands/cicd-monitor.js +3 -3
- package/dist/src/cli/commands/cicd-monitor.js.map +1 -1
- package/dist/src/cli/commands/import-docs.js +2 -2
- package/dist/src/cli/commands/import-docs.js.map +1 -1
- package/dist/src/cli/commands/init-multiproject.js +4 -4
- package/dist/src/cli/commands/init-multiproject.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.js +3 -3
- package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
- package/dist/src/cli/commands/plan/agent-invoker.d.ts +79 -0
- package/dist/src/cli/commands/plan/agent-invoker.d.ts.map +1 -0
- package/dist/src/cli/commands/plan/agent-invoker.js +383 -0
- package/dist/src/cli/commands/plan/agent-invoker.js.map +1 -0
- package/dist/src/cli/commands/plan/increment-detector.d.ts +27 -0
- package/dist/src/cli/commands/plan/increment-detector.d.ts.map +1 -0
- package/dist/src/cli/commands/plan/increment-detector.js +159 -0
- package/dist/src/cli/commands/plan/increment-detector.js.map +1 -0
- package/dist/src/cli/commands/plan/plan-orchestrator.d.ts +45 -0
- package/dist/src/cli/commands/plan/plan-orchestrator.d.ts.map +1 -0
- package/dist/src/cli/commands/plan/plan-orchestrator.js +229 -0
- package/dist/src/cli/commands/plan/plan-orchestrator.js.map +1 -0
- package/dist/src/cli/commands/plan/plan-validator.d.ts +36 -0
- package/dist/src/cli/commands/plan/plan-validator.d.ts.map +1 -0
- package/dist/src/cli/commands/plan/plan-validator.js +174 -0
- package/dist/src/cli/commands/plan/plan-validator.js.map +1 -0
- package/dist/src/cli/commands/plan/types.d.ts +170 -0
- package/dist/src/cli/commands/plan/types.d.ts.map +1 -0
- package/dist/src/cli/commands/plan/types.js +42 -0
- package/dist/src/cli/commands/plan/types.js.map +1 -0
- package/dist/src/cli/commands/plan-command.d.ts +16 -0
- package/dist/src/cli/commands/plan-command.d.ts.map +1 -0
- package/dist/src/cli/commands/plan-command.js +127 -0
- package/dist/src/cli/commands/plan-command.js.map +1 -0
- package/dist/src/cli/commands/switch-project.js +3 -3
- package/dist/src/cli/commands/switch-project.js.map +1 -1
- package/dist/src/cli/commands/validate-parent-repo.js +1 -1
- package/dist/src/cli/commands/validate-parent-repo.js.map +1 -1
- package/dist/src/config/ConfigManager.d.ts +69 -0
- package/dist/src/config/ConfigManager.d.ts.map +1 -0
- package/dist/src/config/ConfigManager.js +130 -0
- package/dist/src/config/ConfigManager.js.map +1 -0
- package/dist/src/config/types.d.ts +1357 -0
- package/dist/src/config/types.d.ts.map +1 -0
- package/dist/src/config/types.js +67 -0
- package/dist/src/config/types.js.map +1 -0
- package/dist/src/core/brownfield/importer.d.ts +1 -1
- package/dist/src/core/brownfield/importer.d.ts.map +1 -1
- package/dist/src/core/brownfield/importer.js +3 -3
- package/dist/src/core/brownfield/importer.js.map +1 -1
- package/dist/src/core/cicd/config-loader.d.ts +1 -1
- package/dist/src/core/cicd/config-loader.d.ts.map +1 -1
- package/dist/src/core/cicd/index.d.ts +6 -6
- package/dist/src/core/cicd/index.d.ts.map +1 -1
- package/dist/src/core/cicd/index.js +6 -6
- package/dist/src/core/cicd/index.js.map +1 -1
- package/dist/src/core/cicd/monitor-service.d.ts +3 -3
- package/dist/src/core/cicd/monitor-service.d.ts.map +1 -1
- package/dist/src/core/cicd/monitor-service.js +3 -3
- package/dist/src/core/cicd/monitor-service.js.map +1 -1
- package/dist/src/core/cicd/notifier.d.ts +1 -1
- package/dist/src/core/cicd/notifier.d.ts.map +1 -1
- package/dist/src/core/cicd/state-manager.d.ts +1 -1
- package/dist/src/core/cicd/state-manager.d.ts.map +1 -1
- package/dist/src/core/cicd/state-manager.js +1 -1
- package/dist/src/core/cicd/state-manager.js.map +1 -1
- package/dist/src/core/cicd/workflow-monitor.d.ts +1 -1
- package/dist/src/core/cicd/workflow-monitor.d.ts.map +1 -1
- package/dist/src/core/cicd/workflow-monitor.js +1 -1
- package/dist/src/core/cicd/workflow-monitor.js.map +1 -1
- package/dist/src/core/cost-tracker.d.ts +2 -2
- package/dist/src/core/cost-tracker.d.ts.map +1 -1
- package/dist/src/core/cost-tracker.js +1 -1
- package/dist/src/core/cost-tracker.js.map +1 -1
- package/dist/src/core/hooks/HealthReporter.d.ts +55 -0
- package/dist/src/core/hooks/HealthReporter.d.ts.map +1 -0
- package/dist/src/core/hooks/HealthReporter.js +268 -0
- package/dist/src/core/hooks/HealthReporter.js.map +1 -0
- package/dist/src/core/hooks/HookAutoFixer.d.ts +41 -0
- package/dist/src/core/hooks/HookAutoFixer.d.ts.map +1 -0
- package/dist/src/core/hooks/HookAutoFixer.js +222 -0
- package/dist/src/core/hooks/HookAutoFixer.js.map +1 -0
- package/dist/src/core/hooks/HookExecutor.d.ts +57 -0
- package/dist/src/core/hooks/HookExecutor.d.ts.map +1 -0
- package/dist/src/core/hooks/HookExecutor.js +287 -0
- package/dist/src/core/hooks/HookExecutor.js.map +1 -0
- package/dist/src/core/hooks/HookHealthChecker.d.ts +51 -0
- package/dist/src/core/hooks/HookHealthChecker.d.ts.map +1 -0
- package/dist/src/core/hooks/HookHealthChecker.js +212 -0
- package/dist/src/core/hooks/HookHealthChecker.js.map +1 -0
- package/dist/src/core/hooks/HookScanner.d.ts +65 -0
- package/dist/src/core/hooks/HookScanner.d.ts.map +1 -0
- package/dist/src/core/hooks/HookScanner.js +214 -0
- package/dist/src/core/hooks/HookScanner.js.map +1 -0
- package/dist/src/core/hooks/types.d.ts +281 -0
- package/dist/src/core/hooks/types.d.ts.map +1 -0
- package/dist/src/core/hooks/types.js +10 -0
- package/dist/src/core/hooks/types.js.map +1 -0
- package/dist/src/core/iac/index.d.ts +10 -0
- package/dist/src/core/iac/index.d.ts.map +1 -0
- package/dist/src/core/iac/index.js +11 -0
- package/dist/src/core/iac/index.js.map +1 -0
- package/dist/src/core/iac/template-engine.d.ts +77 -0
- package/dist/src/core/iac/template-engine.d.ts.map +1 -0
- package/dist/src/core/iac/template-engine.js +182 -0
- package/dist/src/core/iac/template-engine.js.map +1 -0
- package/dist/src/core/increment/ac-status-manager.d.ts +115 -0
- package/dist/src/core/increment/ac-status-manager.d.ts.map +1 -0
- package/dist/src/core/increment/ac-status-manager.js +343 -0
- package/dist/src/core/increment/ac-status-manager.js.map +1 -0
- package/dist/src/core/increment/auto-transition-manager.d.ts +60 -0
- package/dist/src/core/increment/auto-transition-manager.d.ts.map +1 -0
- package/dist/src/core/increment/auto-transition-manager.js +192 -0
- package/dist/src/core/increment/auto-transition-manager.js.map +1 -0
- package/dist/src/core/increment/limits.d.ts +1 -1
- package/dist/src/core/increment/limits.d.ts.map +1 -1
- package/dist/src/core/increment/limits.js +2 -2
- package/dist/src/core/increment/limits.js.map +1 -1
- package/dist/src/core/increment/spec-sync-manager.d.ts +177 -0
- package/dist/src/core/increment/spec-sync-manager.d.ts.map +1 -0
- package/dist/src/core/increment/spec-sync-manager.js +496 -0
- package/dist/src/core/increment/spec-sync-manager.js.map +1 -0
- package/dist/src/core/increment/status-auto-transition.d.ts +46 -0
- package/dist/src/core/increment/status-auto-transition.d.ts.map +1 -0
- package/dist/src/core/increment/status-auto-transition.js +178 -0
- package/dist/src/core/increment/status-auto-transition.js.map +1 -0
- package/dist/src/core/increment/task-state-manager.d.ts +75 -0
- package/dist/src/core/increment/task-state-manager.d.ts.map +1 -0
- package/dist/src/core/increment/task-state-manager.js +117 -0
- package/dist/src/core/increment/task-state-manager.js.map +1 -0
- package/dist/src/core/living-docs/CodeValidator.d.ts +68 -0
- package/dist/src/core/living-docs/CodeValidator.d.ts.map +1 -0
- package/dist/src/core/living-docs/CodeValidator.js +160 -0
- package/dist/src/core/living-docs/CodeValidator.js.map +1 -0
- package/dist/src/core/living-docs/CompletionPropagator.d.ts +84 -0
- package/dist/src/core/living-docs/CompletionPropagator.d.ts.map +1 -0
- package/dist/src/core/living-docs/CompletionPropagator.js +205 -0
- package/dist/src/core/living-docs/CompletionPropagator.js.map +1 -0
- package/dist/src/core/living-docs/ProjectDetector.d.ts +29 -0
- package/dist/src/core/living-docs/ProjectDetector.d.ts.map +1 -0
- package/dist/src/core/living-docs/ProjectDetector.js +94 -0
- package/dist/src/core/living-docs/ProjectDetector.js.map +1 -0
- package/dist/src/core/living-docs/SpecDistributor.d.ts +55 -0
- package/dist/src/core/living-docs/SpecDistributor.d.ts.map +1 -0
- package/dist/src/core/living-docs/SpecDistributor.js +216 -0
- package/dist/src/core/living-docs/SpecDistributor.js.map +1 -0
- package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts +116 -0
- package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts.map +1 -0
- package/dist/src/core/living-docs/ThreeLayerSyncManager.js +356 -0
- package/dist/src/core/living-docs/ThreeLayerSyncManager.js.map +1 -0
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js +2 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/index.d.ts +1 -1
- package/dist/src/core/living-docs/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/index.js +5 -1
- package/dist/src/core/living-docs/index.js.map +1 -1
- package/dist/src/core/living-docs/types.d.ts +70 -300
- package/dist/src/core/living-docs/types.d.ts.map +1 -1
- package/dist/src/core/living-docs/types.js +2 -10
- package/dist/src/core/living-docs/types.js.map +1 -1
- package/dist/src/core/project-manager.d.ts +1 -1
- package/dist/src/core/project-manager.d.ts.map +1 -1
- package/dist/src/core/project-manager.js +2 -2
- package/dist/src/core/project-manager.js.map +1 -1
- package/dist/src/core/qa/quality-gate-decider.d.ts +1 -1
- package/dist/src/core/qa/quality-gate-decider.d.ts.map +1 -1
- package/dist/src/core/qa/risk-calculator.d.ts +1 -1
- package/dist/src/core/qa/risk-calculator.d.ts.map +1 -1
- package/dist/src/core/repo-structure/setup-summary.d.ts +1 -1
- package/dist/src/core/repo-structure/setup-summary.d.ts.map +1 -1
- package/dist/src/core/rfc-generator-v2.d.ts +1 -1
- package/dist/src/core/rfc-generator-v2.d.ts.map +1 -1
- package/dist/src/core/rfc-generator-v2.js +1 -1
- package/dist/src/core/rfc-generator-v2.js.map +1 -1
- package/dist/src/core/serverless/context-detector.d.ts +12 -0
- package/dist/src/core/serverless/context-detector.d.ts.map +1 -0
- package/dist/src/core/serverless/context-detector.js +213 -0
- package/dist/src/core/serverless/context-detector.js.map +1 -0
- package/dist/src/core/serverless/cost-comparison.d.ts +73 -0
- package/dist/src/core/serverless/cost-comparison.d.ts.map +1 -0
- package/dist/src/core/serverless/cost-comparison.js +198 -0
- package/dist/src/core/serverless/cost-comparison.js.map +1 -0
- package/dist/src/core/serverless/cost-estimator.d.ts +69 -0
- package/dist/src/core/serverless/cost-estimator.d.ts.map +1 -0
- package/dist/src/core/serverless/cost-estimator.js +127 -0
- package/dist/src/core/serverless/cost-estimator.js.map +1 -0
- package/dist/src/core/serverless/cost-optimizer.d.ts +57 -0
- package/dist/src/core/serverless/cost-optimizer.d.ts.map +1 -0
- package/dist/src/core/serverless/cost-optimizer.js +221 -0
- package/dist/src/core/serverless/cost-optimizer.js.map +1 -0
- package/dist/src/core/serverless/index.d.ts +20 -0
- package/dist/src/core/serverless/index.d.ts.map +1 -0
- package/dist/src/core/serverless/index.js +26 -0
- package/dist/src/core/serverless/index.js.map +1 -0
- package/dist/src/core/serverless/learning-path-recommender.d.ts +152 -0
- package/dist/src/core/serverless/learning-path-recommender.d.ts.map +1 -0
- package/dist/src/core/serverless/learning-path-recommender.js +389 -0
- package/dist/src/core/serverless/learning-path-recommender.js.map +1 -0
- package/dist/src/core/serverless/platform-data-loader.d.ts +22 -0
- package/dist/src/core/serverless/platform-data-loader.d.ts.map +1 -0
- package/dist/src/core/serverless/platform-data-loader.js +49 -0
- package/dist/src/core/serverless/platform-data-loader.js.map +1 -0
- package/dist/src/core/serverless/platform-selector.d.ts +20 -0
- package/dist/src/core/serverless/platform-selector.d.ts.map +1 -0
- package/dist/src/core/serverless/platform-selector.js +279 -0
- package/dist/src/core/serverless/platform-selector.js.map +1 -0
- package/dist/src/core/serverless/recommendation-formatter.d.ts +24 -0
- package/dist/src/core/serverless/recommendation-formatter.d.ts.map +1 -0
- package/dist/src/core/serverless/recommendation-formatter.js +70 -0
- package/dist/src/core/serverless/recommendation-formatter.js.map +1 -0
- package/dist/src/core/serverless/suitability-analyzer.d.ts +22 -0
- package/dist/src/core/serverless/suitability-analyzer.d.ts.map +1 -0
- package/dist/src/core/serverless/suitability-analyzer.js +262 -0
- package/dist/src/core/serverless/suitability-analyzer.js.map +1 -0
- package/dist/src/core/serverless/types.d.ts +96 -0
- package/dist/src/core/serverless/types.d.ts.map +1 -0
- package/dist/src/core/serverless/types.js +5 -0
- package/dist/src/core/serverless/types.js.map +1 -0
- package/dist/src/core/sync/bidirectional-engine.d.ts +1 -1
- package/dist/src/core/sync/bidirectional-engine.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.d.ts +1 -1
- package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -1
- package/dist/src/core/sync/profile-manager.d.ts +1 -1
- package/dist/src/core/sync/profile-manager.d.ts.map +1 -1
- package/dist/src/core/sync/profile-selector.d.ts +1 -1
- package/dist/src/core/sync/profile-selector.d.ts.map +1 -1
- package/dist/src/core/sync/profile-selector.js +1 -1
- package/dist/src/core/sync/profile-selector.js.map +1 -1
- package/dist/src/core/sync/project-context.d.ts +1 -1
- package/dist/src/core/sync/project-context.d.ts.map +1 -1
- package/dist/src/core/sync/rate-limiter.d.ts +1 -1
- package/dist/src/core/sync/rate-limiter.d.ts.map +1 -1
- package/dist/src/core/sync/status-sync-engine.d.ts +2 -2
- package/dist/src/core/sync/status-sync-engine.d.ts.map +1 -1
- package/dist/src/core/sync/status-sync-engine.js +2 -2
- package/dist/src/core/sync/status-sync-engine.js.map +1 -1
- package/dist/src/core/sync/time-range-selector.d.ts +1 -1
- package/dist/src/core/sync/time-range-selector.d.ts.map +1 -1
- package/dist/src/core/sync/time-range-selector.js +1 -1
- package/dist/src/core/sync/time-range-selector.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +27 -0
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/core/types/increment-metadata.js +45 -1
- package/dist/src/core/types/increment-metadata.js.map +1 -1
- package/dist/src/core/types/sync-profile.d.ts +2 -0
- package/dist/src/core/types/sync-profile.d.ts.map +1 -1
- package/dist/src/core/types/sync-profile.js.map +1 -1
- package/dist/src/core/validation/increment-structure-validator.d.ts +47 -0
- package/dist/src/core/validation/increment-structure-validator.d.ts.map +1 -0
- package/dist/src/core/validation/increment-structure-validator.js +187 -0
- package/dist/src/core/validation/increment-structure-validator.js.map +1 -0
- package/dist/src/core/validation/three-file-validator.d.ts +82 -0
- package/dist/src/core/validation/three-file-validator.d.ts.map +1 -0
- package/dist/src/core/validation/three-file-validator.js +320 -0
- package/dist/src/core/validation/three-file-validator.js.map +1 -0
- package/dist/src/core/workflow/phase-detector.d.ts +103 -0
- package/dist/src/core/workflow/phase-detector.d.ts.map +1 -0
- package/dist/src/core/workflow/phase-detector.js +704 -0
- package/dist/src/core/workflow/phase-detector.js.map +1 -0
- package/dist/src/core/workflow/types.d.ts +153 -0
- package/dist/src/core/workflow/types.d.ts.map +1 -0
- package/dist/src/core/workflow/types.js +47 -0
- package/dist/src/core/workflow/types.js.map +1 -0
- package/dist/src/init/InitFlow.d.ts +37 -0
- package/dist/src/init/InitFlow.d.ts.map +1 -0
- package/dist/src/init/InitFlow.js +209 -0
- package/dist/src/init/InitFlow.js.map +1 -0
- package/dist/src/init/architecture/ArchitectureDecisionEngine.d.ts +107 -0
- package/dist/src/init/architecture/ArchitectureDecisionEngine.d.ts.map +1 -0
- package/dist/src/init/architecture/ArchitectureDecisionEngine.js +405 -0
- package/dist/src/init/architecture/ArchitectureDecisionEngine.js.map +1 -0
- package/dist/src/init/architecture/CloudCreditsDatabase.d.ts +11 -0
- package/dist/src/init/architecture/CloudCreditsDatabase.d.ts.map +1 -0
- package/dist/src/init/architecture/CloudCreditsDatabase.js +92 -0
- package/dist/src/init/architecture/CloudCreditsDatabase.js.map +1 -0
- package/dist/src/init/architecture/types.d.ts +251 -0
- package/dist/src/init/architecture/types.d.ts.map +1 -0
- package/dist/src/init/architecture/types.js +54 -0
- package/dist/src/init/architecture/types.js.map +1 -0
- package/dist/src/init/compliance/ComplianceDetector.d.ts +17 -0
- package/dist/src/init/compliance/ComplianceDetector.d.ts.map +1 -0
- package/dist/src/init/compliance/ComplianceDetector.js +64 -0
- package/dist/src/init/compliance/ComplianceDetector.js.map +1 -0
- package/dist/src/init/compliance/standards-database.d.ts +48 -0
- package/dist/src/init/compliance/standards-database.d.ts.map +1 -0
- package/dist/src/init/compliance/standards-database.js +506 -0
- package/dist/src/init/compliance/standards-database.js.map +1 -0
- package/dist/src/init/compliance/types.d.ts +91 -0
- package/dist/src/init/compliance/types.d.ts.map +1 -0
- package/dist/src/init/compliance/types.js +43 -0
- package/dist/src/init/compliance/types.js.map +1 -0
- package/dist/src/init/repo/GitHubAPIClient.d.ts +51 -0
- package/dist/src/init/repo/GitHubAPIClient.d.ts.map +1 -0
- package/dist/src/init/repo/GitHubAPIClient.js +144 -0
- package/dist/src/init/repo/GitHubAPIClient.js.map +1 -0
- package/dist/src/init/repo/RepositorySelector.d.ts +45 -0
- package/dist/src/init/repo/RepositorySelector.d.ts.map +1 -0
- package/dist/src/init/repo/RepositorySelector.js +106 -0
- package/dist/src/init/repo/RepositorySelector.js.map +1 -0
- package/dist/src/init/repo/types.d.ts +95 -0
- package/dist/src/init/repo/types.d.ts.map +1 -0
- package/dist/src/init/repo/types.js +25 -0
- package/dist/src/init/repo/types.js.map +1 -0
- package/dist/src/init/research/CompetitorAnalyzer.d.ts +79 -0
- package/dist/src/init/research/CompetitorAnalyzer.d.ts.map +1 -0
- package/dist/src/init/research/CompetitorAnalyzer.js +265 -0
- package/dist/src/init/research/CompetitorAnalyzer.js.map +1 -0
- package/dist/src/init/research/MarketDetector.d.ts +62 -0
- package/dist/src/init/research/MarketDetector.d.ts.map +1 -0
- package/dist/src/init/research/MarketDetector.js +247 -0
- package/dist/src/init/research/MarketDetector.js.map +1 -0
- package/dist/src/init/research/OpportunityScorer.d.ts +58 -0
- package/dist/src/init/research/OpportunityScorer.d.ts.map +1 -0
- package/dist/src/init/research/OpportunityScorer.js +194 -0
- package/dist/src/init/research/OpportunityScorer.js.map +1 -0
- package/dist/src/init/research/QuestionGenerator.d.ts +68 -0
- package/dist/src/init/research/QuestionGenerator.d.ts.map +1 -0
- package/dist/src/init/research/QuestionGenerator.js +244 -0
- package/dist/src/init/research/QuestionGenerator.js.map +1 -0
- package/dist/src/init/research/ReportGenerator.d.ts +36 -0
- package/dist/src/init/research/ReportGenerator.d.ts.map +1 -0
- package/dist/src/init/research/ReportGenerator.js +125 -0
- package/dist/src/init/research/ReportGenerator.js.map +1 -0
- package/dist/src/init/research/VisionAnalyzer.d.ts +129 -0
- package/dist/src/init/research/VisionAnalyzer.d.ts.map +1 -0
- package/dist/src/init/research/VisionAnalyzer.js +212 -0
- package/dist/src/init/research/VisionAnalyzer.js.map +1 -0
- package/dist/src/init/research/keyword-extractor.d.ts +78 -0
- package/dist/src/init/research/keyword-extractor.d.ts.map +1 -0
- package/dist/src/init/research/keyword-extractor.js +230 -0
- package/dist/src/init/research/keyword-extractor.js.map +1 -0
- package/dist/src/init/research/src/config/ConfigManager.d.ts +14 -0
- package/dist/src/init/research/src/config/ConfigManager.d.ts.map +1 -0
- package/dist/src/init/research/src/config/ConfigManager.js +45 -0
- package/dist/src/init/research/src/config/ConfigManager.js.map +1 -0
- package/dist/src/init/research/src/config/types.d.ts +102 -0
- package/dist/src/init/research/src/config/types.d.ts.map +1 -0
- package/dist/src/init/research/src/config/types.js +24 -0
- package/dist/src/init/research/src/config/types.js.map +1 -0
- package/dist/src/init/research/types.d.ts +183 -0
- package/dist/src/init/research/types.d.ts.map +1 -0
- package/dist/src/init/research/types.js +65 -0
- package/dist/src/init/research/types.js.map +1 -0
- package/dist/src/init/team/ServerlessSavingsCalculator.d.ts +136 -0
- package/dist/src/init/team/ServerlessSavingsCalculator.d.ts.map +1 -0
- package/dist/src/init/team/ServerlessSavingsCalculator.js +360 -0
- package/dist/src/init/team/ServerlessSavingsCalculator.js.map +1 -0
- package/dist/src/init/team/TeamRecommender.d.ts +122 -0
- package/dist/src/init/team/TeamRecommender.d.ts.map +1 -0
- package/dist/src/init/team/TeamRecommender.js +405 -0
- package/dist/src/init/team/TeamRecommender.js.map +1 -0
- package/dist/src/init/team/types.d.ts +95 -0
- package/dist/src/init/team/types.d.ts.map +1 -0
- package/dist/src/init/team/types.js +23 -0
- package/dist/src/init/team/types.js.map +1 -0
- package/dist/src/integrations/jira/jira-mapper.d.ts +1 -1
- package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
- package/dist/src/types/cost-tracking.d.ts +1 -1
- package/dist/src/types/cost-tracking.d.ts.map +1 -1
- package/dist/src/utils/cost-reporter.d.ts +2 -2
- package/dist/src/utils/cost-reporter.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/config-generator.d.ts +1 -1
- package/dist/src/utils/docs-preview/config-generator.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/config-generator.js +1 -1
- package/dist/src/utils/docs-preview/docusaurus-setup.d.ts +1 -1
- package/dist/src/utils/docs-preview/docusaurus-setup.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/docusaurus-setup.js +4 -4
- package/dist/src/utils/docs-preview/docusaurus-setup.js.map +1 -1
- package/dist/src/utils/docs-preview/index.d.ts +6 -6
- package/dist/src/utils/docs-preview/index.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/index.js +6 -6
- package/dist/src/utils/docs-preview/index.js.map +1 -1
- package/dist/src/utils/docs-preview/package-installer.d.ts +1 -1
- package/dist/src/utils/docs-preview/package-installer.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/package-installer.js +1 -1
- package/dist/src/utils/docs-preview/package-installer.js.map +1 -1
- package/dist/src/utils/docs-preview/server-manager.d.ts +1 -1
- package/dist/src/utils/docs-preview/server-manager.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/server-manager.js +1 -1
- package/dist/src/utils/docs-preview/server-manager.js.map +1 -1
- package/dist/src/utils/docs-preview/sidebar-builder.d.ts +1 -1
- package/dist/src/utils/docs-preview/sidebar-builder.d.ts.map +1 -1
- package/dist/src/utils/generate-skills-index.d.ts +1 -1
- package/dist/src/utils/generate-skills-index.js +1 -1
- package/dist/src/utils/project-detection.js +1 -1
- package/dist/src/utils/project-detection.js.map +1 -1
- package/package.json +9 -3
- package/plugins/specweave/agents/architect/AGENT.md +605 -0
- package/plugins/specweave/agents/infrastructure/AGENT.md +760 -0
- package/plugins/specweave/agents/pm/AGENT.md +14 -13
- package/plugins/specweave/commands/specweave-check-hooks.md +186 -0
- package/plugins/specweave/commands/specweave-plan.md +151 -0
- package/plugins/specweave/commands/specweave-sync-acs.md +342 -0
- package/plugins/specweave/commands/specweave-validate.md +60 -11
- package/plugins/specweave/hooks/lib/update-status-line.sh +8 -4
- package/plugins/specweave/hooks/post-increment-change.sh +4 -0
- package/plugins/specweave/hooks/post-increment-completion.sh +7 -1
- package/plugins/specweave/hooks/post-increment-planning.sh +4 -0
- package/plugins/specweave/hooks/post-increment-status-change.sh +4 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +78 -0
- package/plugins/specweave/iac-templates/aws-lambda/README.md.hbs +280 -0
- package/plugins/specweave/iac-templates/aws-lambda/defaults.json +118 -0
- package/plugins/specweave/iac-templates/aws-lambda/environments/dev.defaults.json +46 -0
- package/plugins/specweave/iac-templates/aws-lambda/environments/prod.defaults.json +67 -0
- package/plugins/specweave/iac-templates/aws-lambda/environments/staging.defaults.json +47 -0
- package/plugins/specweave/iac-templates/aws-lambda/main.tf.hbs +241 -0
- package/plugins/specweave/iac-templates/aws-lambda/outputs.tf.hbs +61 -0
- package/plugins/specweave/iac-templates/aws-lambda/provider.tf.hbs +15 -0
- package/plugins/specweave/iac-templates/aws-lambda/variables.tf.hbs +88 -0
- package/plugins/specweave/iac-templates/azure-functions/README.md.hbs +315 -0
- package/plugins/specweave/iac-templates/azure-functions/defaults.json +65 -0
- package/plugins/specweave/iac-templates/azure-functions/environments/dev.defaults.json +30 -0
- package/plugins/specweave/iac-templates/azure-functions/environments/prod.defaults.json +34 -0
- package/plugins/specweave/iac-templates/azure-functions/environments/staging.defaults.json +31 -0
- package/plugins/specweave/iac-templates/azure-functions/iam.tf.hbs +34 -0
- package/plugins/specweave/iac-templates/azure-functions/main.tf.hbs +247 -0
- package/plugins/specweave/iac-templates/azure-functions/outputs.tf.hbs +72 -0
- package/plugins/specweave/iac-templates/azure-functions/provider.tf.hbs +14 -0
- package/plugins/specweave/iac-templates/azure-functions/variables.tf.hbs +64 -0
- package/plugins/specweave/iac-templates/firebase/README.md.hbs +487 -0
- package/plugins/specweave/iac-templates/firebase/defaults.json +55 -0
- package/plugins/specweave/iac-templates/firebase/environments/dev.defaults.json +44 -0
- package/plugins/specweave/iac-templates/firebase/environments/prod.defaults.json +52 -0
- package/plugins/specweave/iac-templates/firebase/environments/staging.defaults.json +43 -0
- package/plugins/specweave/iac-templates/firebase/iam.tf.hbs +75 -0
- package/plugins/specweave/iac-templates/firebase/main.tf.hbs +297 -0
- package/plugins/specweave/iac-templates/firebase/outputs.tf.hbs +67 -0
- package/plugins/specweave/iac-templates/firebase/provider.tf.hbs +26 -0
- package/plugins/specweave/iac-templates/firebase/variables.tf.hbs +68 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/README.md.hbs +330 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/defaults.json +69 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/environments/dev.defaults.json +33 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/environments/prod.defaults.json +40 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/environments/staging.defaults.json +33 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/iam.tf.hbs +54 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/main.tf.hbs +211 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/outputs.tf.hbs +44 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/provider.tf.hbs +14 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/variables.tf.hbs +82 -0
- package/plugins/specweave/iac-templates/supabase/README.md.hbs +534 -0
- package/plugins/specweave/iac-templates/supabase/defaults.json +69 -0
- package/plugins/specweave/iac-templates/supabase/environments/dev.defaults.json +55 -0
- package/plugins/specweave/iac-templates/supabase/environments/prod.defaults.json +75 -0
- package/plugins/specweave/iac-templates/supabase/environments/staging.defaults.json +54 -0
- package/plugins/specweave/iac-templates/supabase/iam.tf.hbs +146 -0
- package/plugins/specweave/iac-templates/supabase/main.tf.hbs +310 -0
- package/plugins/specweave/iac-templates/supabase/outputs.tf.hbs +74 -0
- package/plugins/specweave/iac-templates/supabase/provider.tf.hbs +19 -0
- package/plugins/specweave/iac-templates/supabase/variables.tf.hbs +78 -0
- package/plugins/specweave/knowledge-base/serverless/FRESHNESS.md +69 -0
- package/plugins/specweave/knowledge-base/serverless/learning-paths.json +865 -0
- package/plugins/specweave/knowledge-base/serverless/platforms/aws-lambda.json +41 -0
- package/plugins/specweave/knowledge-base/serverless/platforms/azure-functions.json +41 -0
- package/plugins/specweave/knowledge-base/serverless/platforms/firebase.json +46 -0
- package/plugins/specweave/knowledge-base/serverless/platforms/gcp-cloud-functions.json +41 -0
- package/plugins/specweave/knowledge-base/serverless/platforms/supabase.json +41 -0
- package/plugins/specweave/knowledge-base/serverless/schema.json +155 -0
- package/plugins/specweave/lib/hooks/auto-transition.js +50 -0
- package/plugins/specweave/lib/hooks/auto-transition.ts +84 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.js +1 -1
- package/plugins/specweave/lib/hooks/invoke-translator-skill.ts +1 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js +4 -31
- package/plugins/specweave/lib/hooks/{sync-living-docs.ts → sync-living-docs.ts.DISABLED} +9 -48
- package/plugins/specweave/lib/hooks/translate-file.js +1 -1
- package/plugins/specweave/lib/hooks/translate-file.ts +1 -1
- package/plugins/specweave/lib/hooks/update-ac-status.js +24 -75
- package/plugins/specweave/lib/hooks/update-ac-status.ts +46 -135
- package/plugins/specweave/lib/hooks/update-tasks-md.js +115 -3
- package/plugins/specweave/lib/hooks/update-tasks-md.ts +182 -10
- package/plugins/specweave/lib/utils/validate-dev-setup.sh +133 -0
- package/plugins/specweave/skills/increment-planner/SKILL.md +25 -15
- package/plugins/specweave/skills/serverless-recommender/SKILL.md +368 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/iam.tf.hbs +137 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/main.tf.hbs +216 -0
- package/plugins/specweave-github/lib/IssueStateManager.js +117 -0
- package/plugins/specweave-github/lib/IssueStateManager.ts +231 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.js +7 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.ts +11 -0
- package/plugins/specweave-ui/.mcp.json +0 -10
- package/plugins/specweave-ui/README.md +26 -26
- package/plugins/specweave-ui/skills/browser-automation/SKILL.md +31 -18
- package/src/templates/tasks.md.template +51 -33
- package/dist/plugins/specweave/lib/hooks/git-diff-analyzer.d.ts +0 -89
- package/dist/plugins/specweave/lib/hooks/git-diff-analyzer.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/git-diff-analyzer.js +0 -226
- package/dist/plugins/specweave/lib/hooks/git-diff-analyzer.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/invoke-translator-skill.d.ts +0 -60
- package/dist/plugins/specweave/lib/hooks/invoke-translator-skill.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/invoke-translator-skill.js +0 -201
- package/dist/plugins/specweave/lib/hooks/invoke-translator-skill.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/prepare-reflection-context.d.ts +0 -42
- package/dist/plugins/specweave/lib/hooks/prepare-reflection-context.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/prepare-reflection-context.js +0 -123
- package/dist/plugins/specweave/lib/hooks/prepare-reflection-context.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-config-loader.d.ts +0 -45
- package/dist/plugins/specweave/lib/hooks/reflection-config-loader.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-config-loader.js +0 -132
- package/dist/plugins/specweave/lib/hooks/reflection-config-loader.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-parser.d.ts +0 -33
- package/dist/plugins/specweave/lib/hooks/reflection-parser.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-parser.js +0 -419
- package/dist/plugins/specweave/lib/hooks/reflection-parser.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-prompt-builder.d.ts +0 -56
- package/dist/plugins/specweave/lib/hooks/reflection-prompt-builder.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-prompt-builder.js +0 -239
- package/dist/plugins/specweave/lib/hooks/reflection-prompt-builder.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-storage.d.ts +0 -64
- package/dist/plugins/specweave/lib/hooks/reflection-storage.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-storage.js +0 -305
- package/dist/plugins/specweave/lib/hooks/reflection-storage.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/run-self-reflection.d.ts +0 -43
- package/dist/plugins/specweave/lib/hooks/run-self-reflection.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/run-self-reflection.js +0 -203
- package/dist/plugins/specweave/lib/hooks/run-self-reflection.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts +0 -32
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +0 -405
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/translate-file.d.ts +0 -59
- package/dist/plugins/specweave/lib/hooks/translate-file.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/translate-file.js +0 -350
- package/dist/plugins/specweave/lib/hooks/translate-file.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/translate-living-docs.d.ts +0 -13
- package/dist/plugins/specweave/lib/hooks/translate-living-docs.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/translate-living-docs.js +0 -175
- package/dist/plugins/specweave/lib/hooks/translate-living-docs.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/types/reflection-types.d.ts +0 -164
- package/dist/plugins/specweave/lib/hooks/types/reflection-types.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/types/reflection-types.js +0 -73
- package/dist/plugins/specweave/lib/hooks/types/reflection-types.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts +0 -21
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js +0 -162
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/update-tasks-md.d.ts +0 -29
- package/dist/plugins/specweave/lib/hooks/update-tasks-md.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/update-tasks-md.js +0 -203
- package/dist/plugins/specweave/lib/hooks/update-tasks-md.js.map +0 -1
- package/dist/src/core/living-docs/spec-distributor.d.ts +0 -180
- package/dist/src/core/living-docs/spec-distributor.d.ts.map +0 -1
- package/dist/src/core/living-docs/spec-distributor.js +0 -1840
- package/dist/src/core/living-docs/spec-distributor.js.map +0 -1
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status Auto-Transition Module
|
|
3
|
+
*
|
|
4
|
+
* Automatically transitions increment status based on file activity:
|
|
5
|
+
* - When spec.md created → status = PLANNING (if not already set)
|
|
6
|
+
* - When tasks.md created → status = ACTIVE (if currently PLANNING)
|
|
7
|
+
* - When first task marked in-progress → status = ACTIVE (if not already)
|
|
8
|
+
*
|
|
9
|
+
* Part of increment 0039: Ultra-Smart Next Command
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'fs-extra';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import { IncrementStatus } from '../types/increment-metadata.js';
|
|
14
|
+
import { MetadataManager } from './metadata-manager.js';
|
|
15
|
+
/**
|
|
16
|
+
* File paths that trigger status transitions
|
|
17
|
+
*/
|
|
18
|
+
const TRANSITION_TRIGGERS = {
|
|
19
|
+
/** spec.md existence indicates planning started */
|
|
20
|
+
SPEC_FILE: 'spec.md',
|
|
21
|
+
/** plan.md existence indicates detailed planning */
|
|
22
|
+
PLAN_FILE: 'plan.md',
|
|
23
|
+
/** tasks.md existence indicates ready for active work */
|
|
24
|
+
TASKS_FILE: 'tasks.md'
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Check if increment folder has specific file
|
|
28
|
+
*/
|
|
29
|
+
function hasFile(incrementId, fileName) {
|
|
30
|
+
const incrementPath = path.join(process.cwd(), '.specweave', 'increments', incrementId);
|
|
31
|
+
const filePath = path.join(incrementPath, fileName);
|
|
32
|
+
return fs.existsSync(filePath);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if tasks.md has any in-progress tasks
|
|
36
|
+
*/
|
|
37
|
+
function hasInProgressTasks(incrementId) {
|
|
38
|
+
const incrementPath = path.join(process.cwd(), '.specweave', 'increments', incrementId);
|
|
39
|
+
const tasksPath = path.join(incrementPath, TRANSITION_TRIGGERS.TASKS_FILE);
|
|
40
|
+
if (!fs.existsSync(tasksPath)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const content = fs.readFileSync(tasksPath, 'utf-8');
|
|
45
|
+
// Match tasks with in-progress markers: [⏳], [🔄], or [ ] followed by **T-XXX**
|
|
46
|
+
const inProgressPattern = /^\s*-\s*\[(?:⏳|🔄|x)\]\s+\*\*T-\d+\*\*/m;
|
|
47
|
+
return inProgressPattern.test(content);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Auto-transition increment status based on file activity
|
|
55
|
+
*
|
|
56
|
+
* Transition Rules:
|
|
57
|
+
* 1. PLANNING → ACTIVE: When tasks.md created or first task in-progress
|
|
58
|
+
* 2. BACKLOG → PLANNING: When spec.md created (resume planning)
|
|
59
|
+
* 3. Any status → ACTIVE: When first task in-progress (override)
|
|
60
|
+
*
|
|
61
|
+
* @param incrementId - Increment ID to check
|
|
62
|
+
* @param triggerFile - File that triggered the check (optional, for logging)
|
|
63
|
+
* @returns true if status was transitioned, false otherwise
|
|
64
|
+
*/
|
|
65
|
+
export function autoTransitionStatus(incrementId, triggerFile) {
|
|
66
|
+
try {
|
|
67
|
+
// Read current metadata
|
|
68
|
+
const metadata = MetadataManager.read(incrementId);
|
|
69
|
+
const currentStatus = metadata.status;
|
|
70
|
+
// Rule 1: PLANNING → ACTIVE (when tasks.md created)
|
|
71
|
+
if (currentStatus === IncrementStatus.PLANNING && hasFile(incrementId, TRANSITION_TRIGGERS.TASKS_FILE)) {
|
|
72
|
+
MetadataManager.updateStatus(incrementId, IncrementStatus.ACTIVE);
|
|
73
|
+
console.log(`✅ Auto-transitioned ${incrementId}: PLANNING → ACTIVE (tasks.md created)`);
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
// Rule 2: BACKLOG → PLANNING (when spec.md created)
|
|
77
|
+
if (currentStatus === IncrementStatus.BACKLOG && hasFile(incrementId, TRANSITION_TRIGGERS.SPEC_FILE)) {
|
|
78
|
+
MetadataManager.updateStatus(incrementId, IncrementStatus.PLANNING);
|
|
79
|
+
console.log(`✅ Auto-transitioned ${incrementId}: BACKLOG → PLANNING (spec.md created)`);
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
// Rule 3: Any non-ACTIVE status → ACTIVE (when tasks in-progress)
|
|
83
|
+
if (currentStatus !== IncrementStatus.ACTIVE && hasInProgressTasks(incrementId)) {
|
|
84
|
+
MetadataManager.updateStatus(incrementId, IncrementStatus.ACTIVE);
|
|
85
|
+
console.log(`✅ Auto-transitioned ${incrementId}: ${currentStatus} → ACTIVE (tasks in-progress)`);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
return false; // No transition needed
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.warn(`⚠️ Auto-transition failed for ${incrementId}:`, error);
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Auto-transition based on specific file creation
|
|
97
|
+
*
|
|
98
|
+
* This is called by file watchers or post-write hooks
|
|
99
|
+
*
|
|
100
|
+
* @param incrementId - Increment ID
|
|
101
|
+
* @param createdFile - File that was just created
|
|
102
|
+
*/
|
|
103
|
+
export function onFileCreated(incrementId, createdFile) {
|
|
104
|
+
const fileName = path.basename(createdFile);
|
|
105
|
+
// Only trigger on known files
|
|
106
|
+
if (!Object.values(TRANSITION_TRIGGERS).includes(fileName)) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
autoTransitionStatus(incrementId, fileName);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check if increment should auto-transition to ACTIVE
|
|
113
|
+
*
|
|
114
|
+
* Used by /specweave:do command before execution
|
|
115
|
+
*/
|
|
116
|
+
export function shouldTransitionToActive(incrementId) {
|
|
117
|
+
try {
|
|
118
|
+
const metadata = MetadataManager.read(incrementId);
|
|
119
|
+
// Already active, no transition needed
|
|
120
|
+
if (metadata.status === IncrementStatus.ACTIVE) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
// Planning with tasks.md → should transition
|
|
124
|
+
if (metadata.status === IncrementStatus.PLANNING && hasFile(incrementId, TRANSITION_TRIGGERS.TASKS_FILE)) {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
// Any status with in-progress tasks → should transition
|
|
128
|
+
if (hasInProgressTasks(incrementId)) {
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Validate and fix "planned" vs "planning" inconsistency
|
|
139
|
+
*
|
|
140
|
+
* Legacy increments may have "planned" status (not in enum).
|
|
141
|
+
* This migrates them to "planning" (valid enum value).
|
|
142
|
+
*/
|
|
143
|
+
export function migrateLegacyStatuses() {
|
|
144
|
+
let migratedCount = 0;
|
|
145
|
+
try {
|
|
146
|
+
const incrementsPath = path.join(process.cwd(), '.specweave', 'increments');
|
|
147
|
+
if (!fs.existsSync(incrementsPath)) {
|
|
148
|
+
return 0;
|
|
149
|
+
}
|
|
150
|
+
const increments = fs.readdirSync(incrementsPath)
|
|
151
|
+
.filter(name => !name.startsWith('_')) // Skip _archive, _templates
|
|
152
|
+
.filter(name => fs.statSync(path.join(incrementsPath, name)).isDirectory());
|
|
153
|
+
for (const incrementId of increments) {
|
|
154
|
+
const metadataPath = path.join(incrementsPath, incrementId, 'metadata.json');
|
|
155
|
+
if (!fs.existsSync(metadataPath)) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
const metadata = fs.readJsonSync(metadataPath);
|
|
160
|
+
// Migrate "planned" → "planning"
|
|
161
|
+
if (metadata.status === 'planned') {
|
|
162
|
+
metadata.status = IncrementStatus.PLANNING;
|
|
163
|
+
fs.writeJsonSync(metadataPath, metadata, { spaces: 2 });
|
|
164
|
+
console.log(`✅ Migrated ${incrementId}: "planned" → "planning"`);
|
|
165
|
+
migratedCount++;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.warn(`⚠️ Failed to migrate ${incrementId}:`, error);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
console.error('Migration error:', error);
|
|
175
|
+
}
|
|
176
|
+
return migratedCount;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=status-auto-transition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-auto-transition.js","sourceRoot":"","sources":["../../../../src/core/increment/status-auto-transition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task State Manager - Single Source of Truth
|
|
3
|
+
*
|
|
4
|
+
* Enforces that implementation checkboxes are the ONLY way to mark tasks complete.
|
|
5
|
+
* Header markers (✅ COMPLETE) are DERIVED and auto-computed from checkboxes.
|
|
6
|
+
*
|
|
7
|
+
* This prevents inconsistencies where:
|
|
8
|
+
* - Header says "✅ COMPLETE" but checkboxes are unchecked
|
|
9
|
+
* - Checkboxes all checked but header missing marker
|
|
10
|
+
*
|
|
11
|
+
* @see .specweave/increments/0037/reports/ULTRATHINK-LONG-TERM-PREVENTION.md
|
|
12
|
+
*/
|
|
13
|
+
export interface TaskState {
|
|
14
|
+
/** Task ID (e.g., "T-001", "T-123-DISCIPLINE") */
|
|
15
|
+
taskId: string;
|
|
16
|
+
/** Implementation checkbox statistics */
|
|
17
|
+
implementationCheckboxes: {
|
|
18
|
+
total: number;
|
|
19
|
+
checked: number;
|
|
20
|
+
};
|
|
21
|
+
/** Computed completion status (derived from checkboxes) */
|
|
22
|
+
isComplete: boolean;
|
|
23
|
+
/** Expected header marker (computed, not manually set) */
|
|
24
|
+
headerMarker: string | null;
|
|
25
|
+
/** Whether header and checkboxes match */
|
|
26
|
+
isConsistent: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface ValidationResult {
|
|
29
|
+
/** Whether task is consistent */
|
|
30
|
+
valid: boolean;
|
|
31
|
+
/** Error message if validation failed */
|
|
32
|
+
error?: string;
|
|
33
|
+
/** Auto-fixed content (if validation failed) */
|
|
34
|
+
fix?: string;
|
|
35
|
+
}
|
|
36
|
+
export declare class TaskStateManager {
|
|
37
|
+
/**
|
|
38
|
+
* Compute task state from SSOT (implementation checkboxes)
|
|
39
|
+
*
|
|
40
|
+
* This is the canonical way to determine task completion.
|
|
41
|
+
* Header markers are DERIVED from this, never trusted directly.
|
|
42
|
+
*/
|
|
43
|
+
computeTaskState(taskContent: string): TaskState;
|
|
44
|
+
/**
|
|
45
|
+
* Validate task consistency
|
|
46
|
+
*
|
|
47
|
+
* Checks if header marker matches what checkboxes say.
|
|
48
|
+
* Returns auto-fix suggestion if inconsistent.
|
|
49
|
+
*/
|
|
50
|
+
validate(taskContent: string): ValidationResult;
|
|
51
|
+
/**
|
|
52
|
+
* Auto-fix header to match SSOT
|
|
53
|
+
*
|
|
54
|
+
* Adds or removes "✅ COMPLETE" marker based on checkbox state.
|
|
55
|
+
* This is the canonical way to sync headers with reality.
|
|
56
|
+
*/
|
|
57
|
+
autoFixHeader(taskContent: string): string;
|
|
58
|
+
/**
|
|
59
|
+
* Extract task ID from content
|
|
60
|
+
*/
|
|
61
|
+
private extractTaskId;
|
|
62
|
+
/**
|
|
63
|
+
* Extract implementation checkboxes from content
|
|
64
|
+
*/
|
|
65
|
+
private extractImplementationCheckboxes;
|
|
66
|
+
/**
|
|
67
|
+
* Extract header marker from content
|
|
68
|
+
*/
|
|
69
|
+
private extractHeaderMarker;
|
|
70
|
+
/**
|
|
71
|
+
* Set header marker in content
|
|
72
|
+
*/
|
|
73
|
+
private setHeaderMarker;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=task-state-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-state-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/task-state-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,SAAS;IACxB,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IAEf,yCAAyC;IACzC,wBAAwB,EAAE;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF,2DAA2D;IAC3D,UAAU,EAAE,OAAO,CAAC;IAEpB,0DAA0D;IAC1D,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,0CAA0C;IAC1C,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,KAAK,EAAE,OAAO,CAAC;IAEf,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,gBAAgB;IAC3B;;;;;OAKG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS;IAiBhD;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB;IAkB/C;;;;;OAKG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAK1C;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAuBvC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACH,OAAO,CAAC,eAAe;CAWxB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task State Manager - Single Source of Truth
|
|
3
|
+
*
|
|
4
|
+
* Enforces that implementation checkboxes are the ONLY way to mark tasks complete.
|
|
5
|
+
* Header markers (✅ COMPLETE) are DERIVED and auto-computed from checkboxes.
|
|
6
|
+
*
|
|
7
|
+
* This prevents inconsistencies where:
|
|
8
|
+
* - Header says "✅ COMPLETE" but checkboxes are unchecked
|
|
9
|
+
* - Checkboxes all checked but header missing marker
|
|
10
|
+
*
|
|
11
|
+
* @see .specweave/increments/0037/reports/ULTRATHINK-LONG-TERM-PREVENTION.md
|
|
12
|
+
*/
|
|
13
|
+
export class TaskStateManager {
|
|
14
|
+
/**
|
|
15
|
+
* Compute task state from SSOT (implementation checkboxes)
|
|
16
|
+
*
|
|
17
|
+
* This is the canonical way to determine task completion.
|
|
18
|
+
* Header markers are DERIVED from this, never trusted directly.
|
|
19
|
+
*/
|
|
20
|
+
computeTaskState(taskContent) {
|
|
21
|
+
const taskId = this.extractTaskId(taskContent);
|
|
22
|
+
const checkboxes = this.extractImplementationCheckboxes(taskContent);
|
|
23
|
+
const total = checkboxes.length;
|
|
24
|
+
const checked = checkboxes.filter(c => c.checked).length;
|
|
25
|
+
const isComplete = total > 0 && checked === total;
|
|
26
|
+
return {
|
|
27
|
+
taskId,
|
|
28
|
+
implementationCheckboxes: { total, checked },
|
|
29
|
+
isComplete,
|
|
30
|
+
headerMarker: isComplete ? '✅ COMPLETE' : null,
|
|
31
|
+
isConsistent: true // By definition, since computed from SSOT
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Validate task consistency
|
|
36
|
+
*
|
|
37
|
+
* Checks if header marker matches what checkboxes say.
|
|
38
|
+
* Returns auto-fix suggestion if inconsistent.
|
|
39
|
+
*/
|
|
40
|
+
validate(taskContent) {
|
|
41
|
+
const expectedState = this.computeTaskState(taskContent);
|
|
42
|
+
const actualMarker = this.extractHeaderMarker(taskContent);
|
|
43
|
+
const expected = expectedState.headerMarker;
|
|
44
|
+
const actual = actualMarker;
|
|
45
|
+
if (actual !== expected) {
|
|
46
|
+
return {
|
|
47
|
+
valid: false,
|
|
48
|
+
error: `Header marker mismatch: expected "${expected}", got "${actual}"`,
|
|
49
|
+
fix: this.autoFixHeader(taskContent)
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return { valid: true };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Auto-fix header to match SSOT
|
|
56
|
+
*
|
|
57
|
+
* Adds or removes "✅ COMPLETE" marker based on checkbox state.
|
|
58
|
+
* This is the canonical way to sync headers with reality.
|
|
59
|
+
*/
|
|
60
|
+
autoFixHeader(taskContent) {
|
|
61
|
+
const state = this.computeTaskState(taskContent);
|
|
62
|
+
return this.setHeaderMarker(taskContent, state.headerMarker);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Extract task ID from content
|
|
66
|
+
*/
|
|
67
|
+
extractTaskId(content) {
|
|
68
|
+
const match = content.match(/^###\s+(T-\d+[-A-Z]*)/m);
|
|
69
|
+
return match ? match[1] : '';
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extract implementation checkboxes from content
|
|
73
|
+
*/
|
|
74
|
+
extractImplementationCheckboxes(content) {
|
|
75
|
+
const checkboxes = [];
|
|
76
|
+
// Find Implementation section
|
|
77
|
+
const implMatch = content.match(/\*\*Implementation\*\*:([\s\S]*?)(?=\n\*\*|\n---|$)/);
|
|
78
|
+
if (!implMatch)
|
|
79
|
+
return checkboxes;
|
|
80
|
+
const implSection = implMatch[1];
|
|
81
|
+
// Extract all checkboxes
|
|
82
|
+
const checkboxPattern = /-\s*\[([ x])\]\s*(.+)/g;
|
|
83
|
+
let match;
|
|
84
|
+
while ((match = checkboxPattern.exec(implSection)) !== null) {
|
|
85
|
+
checkboxes.push({
|
|
86
|
+
text: match[2].trim(),
|
|
87
|
+
checked: match[1] === 'x'
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return checkboxes;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Extract header marker from content
|
|
94
|
+
*/
|
|
95
|
+
extractHeaderMarker(content) {
|
|
96
|
+
// Match task header line
|
|
97
|
+
const headerMatch = content.match(/^###\s+T-\d+[-A-Z]*:?\s+[^\n]+/m);
|
|
98
|
+
if (!headerMatch)
|
|
99
|
+
return null;
|
|
100
|
+
const headerLine = headerMatch[0];
|
|
101
|
+
// Check if header contains ✅ COMPLETE marker
|
|
102
|
+
return headerLine.includes('✅ COMPLETE') ? '✅ COMPLETE' : null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Set header marker in content
|
|
106
|
+
*/
|
|
107
|
+
setHeaderMarker(content, marker) {
|
|
108
|
+
// Remove existing marker if present
|
|
109
|
+
let updated = content.replace(/(###\s+T-\d+[-A-Z]*:?\s+.+?)\s*✅ COMPLETE/m, '$1');
|
|
110
|
+
// Add new marker if needed
|
|
111
|
+
if (marker) {
|
|
112
|
+
updated = updated.replace(/(###\s+T-\d+[-A-Z]*:?\s+[^\n]+)/m, `$1 ${marker}`);
|
|
113
|
+
}
|
|
114
|
+
return updated;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=task-state-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-state-manager.js","sourceRoot":"","sources":["../../../../src/core/increment/task-state-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Validator - Validates that code exists for completed tasks
|
|
3
|
+
*
|
|
4
|
+
* Prevents tasks from being marked complete without actual implementation.
|
|
5
|
+
* Parses task descriptions to extract file paths and verifies they exist.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* File validation result
|
|
9
|
+
*/
|
|
10
|
+
export interface FileValidationResult {
|
|
11
|
+
/** File path */
|
|
12
|
+
path: string;
|
|
13
|
+
/** File exists */
|
|
14
|
+
exists: boolean;
|
|
15
|
+
/** File has meaningful content (not empty) */
|
|
16
|
+
hasContent: boolean;
|
|
17
|
+
/** File size in bytes */
|
|
18
|
+
size: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* CodeValidator - Validates code exists for tasks
|
|
22
|
+
*/
|
|
23
|
+
export declare class CodeValidator {
|
|
24
|
+
/**
|
|
25
|
+
* Validate that code exists for a completed task
|
|
26
|
+
*
|
|
27
|
+
* @param taskId - Task ID (e.g., "T-001")
|
|
28
|
+
* @param incrementPath - Path to increment
|
|
29
|
+
* @returns True if all expected files exist with content
|
|
30
|
+
*/
|
|
31
|
+
validateCodeExists(taskId: string, incrementPath: string): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Validate a single file
|
|
34
|
+
*
|
|
35
|
+
* @param filePath - Absolute or relative file path
|
|
36
|
+
*/
|
|
37
|
+
validateFile(filePath: string): Promise<FileValidationResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Extract task section from tasks.md content
|
|
40
|
+
*/
|
|
41
|
+
private extractTaskSection;
|
|
42
|
+
/**
|
|
43
|
+
* Extract file paths from task description
|
|
44
|
+
*
|
|
45
|
+
* Looks for:
|
|
46
|
+
* - **Files**: section with file paths
|
|
47
|
+
* - Code blocks with file paths in comments
|
|
48
|
+
* - Inline file references (e.g., `src/foo/bar.ts`)
|
|
49
|
+
*/
|
|
50
|
+
private extractFilePaths;
|
|
51
|
+
/**
|
|
52
|
+
* Validate multiple tasks at once
|
|
53
|
+
*
|
|
54
|
+
* @param taskIds - Array of task IDs
|
|
55
|
+
* @param incrementPath - Path to increment
|
|
56
|
+
* @returns Map of task ID to validation result
|
|
57
|
+
*/
|
|
58
|
+
validateMultipleTasks(taskIds: string[], incrementPath: string): Promise<Map<string, boolean>>;
|
|
59
|
+
/**
|
|
60
|
+
* Get validation details for a task
|
|
61
|
+
*
|
|
62
|
+
* @param taskId - Task ID
|
|
63
|
+
* @param incrementPath - Path to increment
|
|
64
|
+
* @returns Array of file validation results
|
|
65
|
+
*/
|
|
66
|
+
getValidationDetails(taskId: string, incrementPath: string): Promise<FileValidationResult[]>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=CodeValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeValidator.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/CodeValidator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IAEb,kBAAkB;IAClB,MAAM,EAAE,OAAO,CAAC;IAEhB,8CAA8C;IAC9C,UAAU,EAAE,OAAO,CAAC;IAEpB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB;;;;;;OAMG;IACG,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoCjF;;;;OAIG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsBnE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAqCxB;;;;;;OAMG;IACG,qBAAqB,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAWhC;;;;;;OAMG;IACG,oBAAoB,CACxB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,oBAAoB,EAAE,CAAC;CAiBnC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Validator - Validates that code exists for completed tasks
|
|
3
|
+
*
|
|
4
|
+
* Prevents tasks from being marked complete without actual implementation.
|
|
5
|
+
* Parses task descriptions to extract file paths and verifies they exist.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'fs/promises';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
/**
|
|
10
|
+
* CodeValidator - Validates code exists for tasks
|
|
11
|
+
*/
|
|
12
|
+
export class CodeValidator {
|
|
13
|
+
/**
|
|
14
|
+
* Validate that code exists for a completed task
|
|
15
|
+
*
|
|
16
|
+
* @param taskId - Task ID (e.g., "T-001")
|
|
17
|
+
* @param incrementPath - Path to increment
|
|
18
|
+
* @returns True if all expected files exist with content
|
|
19
|
+
*/
|
|
20
|
+
async validateCodeExists(taskId, incrementPath) {
|
|
21
|
+
try {
|
|
22
|
+
// Read tasks.md to find the task
|
|
23
|
+
const tasksPath = path.join(incrementPath, 'tasks.md');
|
|
24
|
+
const tasksContent = await fs.readFile(tasksPath, 'utf-8');
|
|
25
|
+
// Extract task section
|
|
26
|
+
const taskSection = this.extractTaskSection(tasksContent, taskId);
|
|
27
|
+
if (!taskSection) {
|
|
28
|
+
// Task not found
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
// Extract file paths from task description
|
|
32
|
+
const filePaths = this.extractFilePaths(taskSection);
|
|
33
|
+
if (filePaths.length === 0) {
|
|
34
|
+
// No files specified - assume valid
|
|
35
|
+
// (Some tasks like "Write documentation" may not have specific files)
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
// Validate each file
|
|
39
|
+
const results = await Promise.all(filePaths.map(filePath => this.validateFile(filePath)));
|
|
40
|
+
// All files must exist and have content
|
|
41
|
+
return results.every(r => r.exists && r.hasContent);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
// On error, assume code doesn't exist (safe default)
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Validate a single file
|
|
50
|
+
*
|
|
51
|
+
* @param filePath - Absolute or relative file path
|
|
52
|
+
*/
|
|
53
|
+
async validateFile(filePath) {
|
|
54
|
+
try {
|
|
55
|
+
const stats = await fs.stat(filePath);
|
|
56
|
+
const isFile = stats.isFile();
|
|
57
|
+
const size = stats.size;
|
|
58
|
+
return {
|
|
59
|
+
path: filePath,
|
|
60
|
+
exists: isFile,
|
|
61
|
+
hasContent: isFile && size > 0,
|
|
62
|
+
size
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return {
|
|
67
|
+
path: filePath,
|
|
68
|
+
exists: false,
|
|
69
|
+
hasContent: false,
|
|
70
|
+
size: 0
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Extract task section from tasks.md content
|
|
76
|
+
*/
|
|
77
|
+
extractTaskSection(content, taskId) {
|
|
78
|
+
const pattern = new RegExp(`### ${taskId}:.*?(?=###|$)`, 's');
|
|
79
|
+
const match = content.match(pattern);
|
|
80
|
+
return match ? match[0] : null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Extract file paths from task description
|
|
84
|
+
*
|
|
85
|
+
* Looks for:
|
|
86
|
+
* - **Files**: section with file paths
|
|
87
|
+
* - Code blocks with file paths in comments
|
|
88
|
+
* - Inline file references (e.g., `src/foo/bar.ts`)
|
|
89
|
+
*/
|
|
90
|
+
extractFilePaths(taskSection) {
|
|
91
|
+
const paths = [];
|
|
92
|
+
// Method 1: **Files**: section
|
|
93
|
+
const filesMatch = taskSection.match(/\*\*Files\*\*:\s*\n((?:- .+\n?)+)/);
|
|
94
|
+
if (filesMatch) {
|
|
95
|
+
const fileLines = filesMatch[1].split('\n');
|
|
96
|
+
for (const line of fileLines) {
|
|
97
|
+
const match = line.match(/^- (.+?)(?:\s+\(.*\))?$/);
|
|
98
|
+
if (match) {
|
|
99
|
+
paths.push(match[1].trim());
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Method 2: Inline code references (e.g., `src/foo/bar.ts`)
|
|
104
|
+
const inlineMatches = taskSection.matchAll(/`([a-zA-Z0-9_\-\/\.]+\.(?:ts|js|tsx|jsx|md|json))`/g);
|
|
105
|
+
for (const match of inlineMatches) {
|
|
106
|
+
const filePath = match[1];
|
|
107
|
+
if (!paths.includes(filePath)) {
|
|
108
|
+
paths.push(filePath);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Method 3: File path patterns in descriptions
|
|
112
|
+
// Match paths like: src/core/living-docs/ThreeLayerSyncManager.ts
|
|
113
|
+
const pathMatches = taskSection.matchAll(/\b([a-zA-Z0-9_\-]+(?:\/[a-zA-Z0-9_\-]+)+\.(?:ts|js|tsx|jsx|md|json|yml|yaml))/g);
|
|
114
|
+
for (const match of pathMatches) {
|
|
115
|
+
const filePath = match[1];
|
|
116
|
+
if (!paths.includes(filePath)) {
|
|
117
|
+
paths.push(filePath);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return paths;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Validate multiple tasks at once
|
|
124
|
+
*
|
|
125
|
+
* @param taskIds - Array of task IDs
|
|
126
|
+
* @param incrementPath - Path to increment
|
|
127
|
+
* @returns Map of task ID to validation result
|
|
128
|
+
*/
|
|
129
|
+
async validateMultipleTasks(taskIds, incrementPath) {
|
|
130
|
+
const results = new Map();
|
|
131
|
+
for (const taskId of taskIds) {
|
|
132
|
+
const isValid = await this.validateCodeExists(taskId, incrementPath);
|
|
133
|
+
results.set(taskId, isValid);
|
|
134
|
+
}
|
|
135
|
+
return results;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get validation details for a task
|
|
139
|
+
*
|
|
140
|
+
* @param taskId - Task ID
|
|
141
|
+
* @param incrementPath - Path to increment
|
|
142
|
+
* @returns Array of file validation results
|
|
143
|
+
*/
|
|
144
|
+
async getValidationDetails(taskId, incrementPath) {
|
|
145
|
+
try {
|
|
146
|
+
const tasksPath = path.join(incrementPath, 'tasks.md');
|
|
147
|
+
const tasksContent = await fs.readFile(tasksPath, 'utf-8');
|
|
148
|
+
const taskSection = this.extractTaskSection(tasksContent, taskId);
|
|
149
|
+
if (!taskSection) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
const filePaths = this.extractFilePaths(taskSection);
|
|
153
|
+
return await Promise.all(filePaths.map(p => this.validateFile(p)));
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=CodeValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeValidator.js","sourceRoot":"","sources":["../../../../src/core/living-docs/CodeValidator.ts"],"names":[],"mappings":"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"}
|