specweave 0.33.5 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/README.md +13 -13
- package/.claude-plugin/marketplace.json +26 -37
- package/CLAUDE.md +427 -70
- package/README.md +34 -31
- package/bin/fix-marketplace-errors.sh +1 -1
- package/bin/install-commands.sh +2 -2
- package/bin/specweave.js +58 -1
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts +5 -0
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js +14 -4
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js.map +1 -1
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts +1 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/completion-calculator.js +2 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.js.map +1 -1
- package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/duplicate-detector.js +20 -6
- package/dist/plugins/specweave-github/lib/duplicate-detector.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +9 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +31 -18
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts +7 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.js +47 -11
- package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js +39 -13
- package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-issue-updater.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-issue-updater.js +15 -3
- package/dist/plugins/specweave-github/lib/github-issue-updater.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-sync.d.ts +7 -0
- package/dist/plugins/specweave-github/lib/github-spec-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-sync.js +17 -4
- package/dist/plugins/specweave-github/lib/github-spec-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-sync-bidirectional.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-sync-bidirectional.js +13 -3
- package/dist/plugins/specweave-github/lib/github-sync-bidirectional.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-sync-increment-changes.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-sync-increment-changes.js +14 -4
- package/dist/plugins/specweave-github/lib/github-sync-increment-changes.js.map +1 -1
- package/dist/plugins/specweave-github/lib/increment-issue-builder.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/increment-issue-builder.js +24 -8
- package/dist/plugins/specweave-github/lib/increment-issue-builder.js.map +1 -1
- package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js +21 -18
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js.map +1 -1
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts +3 -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 +20 -19
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -1
- package/dist/src/cli/cleanup-zombies.js +34 -18
- package/dist/src/cli/cleanup-zombies.js.map +1 -1
- package/dist/src/cli/commands/discrepancies.js +6 -6
- package/dist/src/cli/commands/discrepancies.js.map +1 -1
- package/dist/src/cli/commands/docs.js +1 -1
- package/dist/src/cli/commands/docs.js.map +1 -1
- package/dist/src/cli/commands/import-docs.d.ts +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/import-external.d.ts +1 -1
- package/dist/src/cli/commands/import-external.js +1 -1
- package/dist/src/cli/commands/init-multiproject.d.ts +1 -1
- package/dist/src/cli/commands/init-multiproject.js +3 -3
- package/dist/src/cli/commands/init-multiproject.js.map +1 -1
- package/dist/src/cli/commands/init.js +2 -2
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/living-docs.d.ts +1 -0
- package/dist/src/cli/commands/living-docs.d.ts.map +1 -1
- package/dist/src/cli/commands/living-docs.js +18 -2
- package/dist/src/cli/commands/living-docs.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.js +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-profiles.js +1 -1
- package/dist/src/cli/commands/migrate-to-profiles.js.map +1 -1
- package/dist/src/cli/commands/next-command.d.ts +1 -1
- package/dist/src/cli/commands/next-command.js +9 -9
- package/dist/src/cli/commands/next-command.js.map +1 -1
- package/dist/src/cli/commands/notifications.js +3 -3
- package/dist/src/cli/commands/notifications.js.map +1 -1
- package/dist/src/cli/commands/plan/increment-detector.js +2 -2
- package/dist/src/cli/commands/plan/increment-detector.js.map +1 -1
- package/dist/src/cli/commands/plan/plan-orchestrator.d.ts +2 -2
- package/dist/src/cli/commands/plan/plan-orchestrator.js +2 -2
- package/dist/src/cli/commands/plan/plan-validator.js +2 -2
- package/dist/src/cli/commands/plan/plan-validator.js.map +1 -1
- package/dist/src/cli/commands/plan/types.d.ts +1 -1
- package/dist/src/cli/commands/plan/types.js +1 -1
- package/dist/src/cli/commands/plan-command.d.ts +3 -3
- package/dist/src/cli/commands/plan-command.js +12 -12
- package/dist/src/cli/commands/plan-command.js.map +1 -1
- package/dist/src/cli/commands/project.d.ts +77 -0
- package/dist/src/cli/commands/project.d.ts.map +1 -0
- package/dist/src/cli/commands/project.js +526 -0
- package/dist/src/cli/commands/project.js.map +1 -0
- package/dist/src/cli/commands/save.d.ts +49 -0
- package/dist/src/cli/commands/save.d.ts.map +1 -0
- package/dist/src/cli/commands/save.js +583 -0
- package/dist/src/cli/commands/save.js.map +1 -0
- package/dist/src/cli/commands/sync-spec-commits.js +15 -6
- package/dist/src/cli/commands/sync-spec-commits.js.map +1 -1
- package/dist/src/cli/commands/sync-spec-content.js +15 -6
- package/dist/src/cli/commands/sync-spec-content.js.map +1 -1
- package/dist/src/cli/helpers/init/ado-repo-cloning.js +2 -2
- package/dist/src/cli/helpers/init/ado-repo-cloning.js.map +1 -1
- package/dist/src/cli/helpers/init/bitbucket-repo-cloning.d.ts +1 -1
- package/dist/src/cli/helpers/init/bitbucket-repo-cloning.js +3 -3
- package/dist/src/cli/helpers/init/bitbucket-repo-cloning.js.map +1 -1
- package/dist/src/cli/helpers/init/brownfield-analysis.js +18 -18
- package/dist/src/cli/helpers/init/brownfield-analysis.js.map +1 -1
- package/dist/src/cli/helpers/init/directory-structure.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/directory-structure.js +3 -0
- package/dist/src/cli/helpers/init/directory-structure.js.map +1 -1
- package/dist/src/cli/helpers/init/external-import.js +18 -18
- package/dist/src/cli/helpers/init/external-import.js.map +1 -1
- package/dist/src/cli/helpers/init/github-repo-cloning.d.ts +1 -1
- package/dist/src/cli/helpers/init/github-repo-cloning.js +3 -3
- package/dist/src/cli/helpers/init/github-repo-cloning.js.map +1 -1
- package/dist/src/cli/helpers/init/initial-increment-generator.js +12 -12
- package/dist/src/cli/helpers/init/living-docs-preflight.js +5 -5
- package/dist/src/cli/helpers/init/living-docs-preflight.js.map +1 -1
- package/dist/src/cli/helpers/init/next-steps.js +9 -9
- package/dist/src/cli/helpers/init/next-steps.js.map +1 -1
- package/dist/src/cli/helpers/init/plugin-installer.js +3 -3
- package/dist/src/cli/helpers/init/plugin-installer.js.map +1 -1
- package/dist/src/cli/helpers/init/translation-config.js +9 -9
- package/dist/src/cli/helpers/init/translation-config.js.map +1 -1
- package/dist/src/cli/helpers/init/types.d.ts +1 -1
- package/dist/src/cli/helpers/init/types.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.js +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github.js +1 -1
- package/dist/src/cli/helpers/issue-tracker/github.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +2 -2
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/jira.js +1 -1
- package/dist/src/cli/helpers/issue-tracker/jira.js.map +1 -1
- package/dist/src/cli/update-status-line.js +1 -1
- package/dist/src/cli/update-status-line.js.map +1 -1
- package/dist/src/cli/workers/brownfield-worker.js +1 -1
- package/dist/src/cli/workers/brownfield-worker.js.map +1 -1
- package/dist/src/cli/workers/import-worker.js +1 -1
- package/dist/src/cli/workers/import-worker.js.map +1 -1
- package/dist/src/core/background/brownfield-launcher.js +4 -4
- package/dist/src/core/background/brownfield-launcher.js.map +1 -1
- package/dist/src/core/background/index.d.ts +3 -3
- package/dist/src/core/background/index.js +3 -3
- package/dist/src/core/background/job-launcher.d.ts +1 -1
- package/dist/src/core/background/job-launcher.js +3 -3
- package/dist/src/core/background/job-launcher.js.map +1 -1
- package/dist/src/core/brownfield/importer.js +1 -1
- package/dist/src/core/brownfield/importer.js.map +1 -1
- package/dist/src/core/config/config-manager.d.ts +7 -1
- package/dist/src/core/config/config-manager.d.ts.map +1 -1
- package/dist/src/core/config/config-manager.js +24 -2
- package/dist/src/core/config/config-manager.js.map +1 -1
- package/dist/src/core/config/single-project-migrator.d.ts +110 -0
- package/dist/src/core/config/single-project-migrator.d.ts.map +1 -0
- package/dist/src/core/config/single-project-migrator.js +179 -0
- package/dist/src/core/config/single-project-migrator.js.map +1 -0
- package/dist/src/core/config/types.d.ts +3 -3
- package/dist/src/core/credentials/credentials-manager.d.ts +25 -4
- package/dist/src/core/credentials/credentials-manager.d.ts.map +1 -1
- package/dist/src/core/credentials/credentials-manager.js +54 -15
- package/dist/src/core/credentials/credentials-manager.js.map +1 -1
- package/dist/src/core/deduplication/command-deduplicator.d.ts +4 -4
- package/dist/src/core/deduplication/command-deduplicator.d.ts.map +1 -1
- package/dist/src/core/deduplication/command-deduplicator.js +3 -3
- package/dist/src/core/external-tools/external-items-counter.d.ts +4 -4
- package/dist/src/core/external-tools/external-items-counter.js +4 -4
- package/dist/src/core/external-tools/external-items-display.js +4 -4
- package/dist/src/core/external-tools/external-items-display.js.map +1 -1
- package/dist/src/core/increment/completion-validator.js +3 -3
- package/dist/src/core/increment/completion-validator.js.map +1 -1
- package/dist/src/core/increment/conflict-resolver.js +2 -2
- package/dist/src/core/increment/conflict-resolver.js.map +1 -1
- package/dist/src/core/increment/desync-detector.d.ts +1 -1
- package/dist/src/core/increment/desync-detector.js +3 -3
- package/dist/src/core/increment/desync-detector.js.map +1 -1
- package/dist/src/core/increment/discipline-checker.js +2 -2
- package/dist/src/core/increment/discipline-checker.js.map +1 -1
- package/dist/src/core/increment/increment-archiver.js +4 -4
- package/dist/src/core/increment/increment-archiver.js.map +1 -1
- package/dist/src/core/increment/increment-utils.d.ts +53 -2
- package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
- package/dist/src/core/increment/increment-utils.js +78 -7
- package/dist/src/core/increment/increment-utils.js.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +6 -6
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/increment/metadata-validator.js +1 -1
- package/dist/src/core/increment/metadata-validator.js.map +1 -1
- package/dist/src/core/increment/recent-work-scanner.js +2 -2
- package/dist/src/core/increment/recent-work-scanner.js.map +1 -1
- package/dist/src/core/increment/spec-sync-manager.js +1 -1
- package/dist/src/core/increment/spec-sync-manager.js.map +1 -1
- package/dist/src/core/increment/status-auto-transition.d.ts +68 -1
- package/dist/src/core/increment/status-auto-transition.d.ts.map +1 -1
- package/dist/src/core/increment/status-auto-transition.js +141 -1
- package/dist/src/core/increment/status-auto-transition.js.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.d.ts +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.js +3 -3
- package/dist/src/core/increment/status-change-sync-trigger.js.map +1 -1
- package/dist/src/core/living-docs/cross-project-sync.d.ts +12 -0
- package/dist/src/core/living-docs/cross-project-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/cross-project-sync.js +33 -0
- package/dist/src/core/living-docs/cross-project-sync.js.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.d.ts +3 -3
- package/dist/src/core/living-docs/feature-archiver.js +3 -3
- package/dist/src/core/living-docs/feature-consistency-validator.js +1 -1
- package/dist/src/core/living-docs/feature-consistency-validator.js.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.d.ts +5 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.js +19 -1
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
- package/dist/src/core/living-docs/governance/standards-generator.js +1 -1
- package/dist/src/core/living-docs/governance/standards-generator.js.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts +5 -0
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js +22 -2
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +1 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +77 -8
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/living-docs/project-detector.d.ts +9 -0
- package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
- package/dist/src/core/living-docs/project-detector.js +38 -3
- package/dist/src/core/living-docs/project-detector.js.map +1 -1
- package/dist/src/core/living-docs/suggestions-generator.js +1 -1
- package/dist/src/core/living-docs/suggestions-generator.js.map +1 -1
- package/dist/src/core/notifications/command-integration.js +1 -1
- package/dist/src/core/notifications/command-integration.js.map +1 -1
- package/dist/src/core/project/adapters/ado-project-adapter.d.ts +73 -0
- package/dist/src/core/project/adapters/ado-project-adapter.d.ts.map +1 -0
- package/dist/src/core/project/adapters/ado-project-adapter.js +304 -0
- package/dist/src/core/project/adapters/ado-project-adapter.js.map +1 -0
- package/dist/src/core/project/adapters/github-project-adapter.d.ts +76 -0
- package/dist/src/core/project/adapters/github-project-adapter.d.ts.map +1 -0
- package/dist/src/core/project/adapters/github-project-adapter.js +315 -0
- package/dist/src/core/project/adapters/github-project-adapter.js.map +1 -0
- package/dist/src/core/project/adapters/jira-project-adapter.d.ts +69 -0
- package/dist/src/core/project/adapters/jira-project-adapter.d.ts.map +1 -0
- package/dist/src/core/project/adapters/jira-project-adapter.js +241 -0
- package/dist/src/core/project/adapters/jira-project-adapter.js.map +1 -0
- package/dist/src/core/project/project-event-bus.d.ts +72 -0
- package/dist/src/core/project/project-event-bus.d.ts.map +1 -0
- package/dist/src/core/project/project-event-bus.js +150 -0
- package/dist/src/core/project/project-event-bus.js.map +1 -0
- package/dist/src/core/project/project-manager.d.ts +0 -22
- package/dist/src/core/project/project-manager.d.ts.map +1 -1
- package/dist/src/core/project/project-manager.js +5 -275
- package/dist/src/core/project/project-manager.js.map +1 -1
- package/dist/src/core/project/project-registry.d.ts +93 -0
- package/dist/src/core/project/project-registry.d.ts.map +1 -0
- package/dist/src/core/project/project-registry.js +448 -0
- package/dist/src/core/project/project-registry.js.map +1 -0
- package/dist/src/core/project/project-resolution.d.ts +229 -0
- package/dist/src/core/project/project-resolution.d.ts.map +1 -0
- package/dist/src/core/project/project-resolution.js +633 -0
- package/dist/src/core/project/project-resolution.js.map +1 -0
- package/dist/src/core/project/types/project-types.d.ts +214 -0
- package/dist/src/core/project/types/project-types.d.ts.map +1 -0
- package/dist/src/core/project/types/project-types.js +9 -0
- package/dist/src/core/project/types/project-types.js.map +1 -0
- package/dist/src/core/repo-structure/setup-summary.js +2 -2
- package/dist/src/core/repo-structure/setup-summary.js.map +1 -1
- package/dist/src/core/specs/spec-identifier-detector.d.ts.map +1 -1
- package/dist/src/core/specs/spec-identifier-detector.js +8 -5
- package/dist/src/core/specs/spec-identifier-detector.js.map +1 -1
- package/dist/src/core/status-line/status-line-updater.js +1 -1
- package/dist/src/core/status-line/status-line-updater.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +3 -3
- package/dist/src/core/types/increment-metadata.js +3 -3
- package/dist/src/core/types/increment-metadata.js.map +1 -1
- package/dist/src/core/types/sync-profile.d.ts +1 -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/validators/ac-presence-validator.d.ts +4 -4
- package/dist/src/core/validators/ac-presence-validator.js +3 -3
- package/dist/src/core/validators/ac-presence-validator.js.map +1 -1
- package/dist/src/core/workflow/backlog-scanner.d.ts +5 -0
- package/dist/src/core/workflow/backlog-scanner.d.ts.map +1 -1
- package/dist/src/core/workflow/backlog-scanner.js +14 -2
- package/dist/src/core/workflow/backlog-scanner.js.map +1 -1
- package/dist/src/core/workflow/phase-detector.js +17 -17
- package/dist/src/core/workflow/phase-detector.js.map +1 -1
- package/dist/src/core/workflow/types.d.ts +1 -1
- package/dist/src/core/workflow/types.d.ts.map +1 -1
- package/dist/src/core/workflow/workflow-orchestrator.d.ts +1 -1
- package/dist/src/core/workflow/workflow-orchestrator.js +9 -9
- package/dist/src/core/workflow/workflow-orchestrator.js.map +1 -1
- package/dist/src/hooks/scheduler-startup.js +1 -1
- package/dist/src/hooks/scheduler-startup.js.map +1 -1
- package/dist/src/importers/item-converter.js +1 -1
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.d.ts +17 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.js +20 -12
- package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.d.ts +17 -1
- package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.js +13 -5
- package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
- package/dist/src/living-docs/enterprise-analyzer.js +1 -1
- package/dist/src/living-docs/enterprise-analyzer.js.map +1 -1
- package/dist/src/sync/ado-reconciler.d.ts +5 -0
- package/dist/src/sync/ado-reconciler.d.ts.map +1 -1
- package/dist/src/sync/ado-reconciler.js +16 -4
- package/dist/src/sync/ado-reconciler.js.map +1 -1
- package/dist/src/sync/jira-reconciler.d.ts +3 -0
- package/dist/src/sync/jira-reconciler.d.ts.map +1 -1
- package/dist/src/sync/jira-reconciler.js +12 -5
- package/dist/src/sync/jira-reconciler.js.map +1 -1
- package/dist/src/types/dashboard-cache.d.ts +4 -2
- package/dist/src/types/dashboard-cache.d.ts.map +1 -1
- package/dist/src/types/dashboard-cache.js +1 -1
- package/dist/src/types/dashboard-cache.js.map +1 -1
- package/dist/src/utils/ac-embedder.d.ts +1 -1
- package/dist/src/utils/docs-preview/docusaurus-setup.js +2 -2
- package/dist/src/utils/docs-preview/docusaurus-setup.js.map +1 -1
- package/dist/src/utils/docs-preview/sidebar-builder.js +1 -1
- package/dist/src/utils/env-multi-project-parser.d.ts +17 -0
- package/dist/src/utils/env-multi-project-parser.d.ts.map +1 -1
- package/dist/src/utils/env-multi-project-parser.js +26 -1
- package/dist/src/utils/env-multi-project-parser.js.map +1 -1
- package/dist/src/utils/external-tool-drift-detector.d.ts +2 -2
- package/dist/src/utils/external-tool-drift-detector.js +6 -6
- package/dist/src/utils/external-tool-drift-detector.js.map +1 -1
- package/dist/src/utils/notification-constants.js +2 -2
- package/dist/src/utils/notification-constants.js.map +1 -1
- package/dist/src/utils/notification-manager.d.ts +12 -3
- package/dist/src/utils/notification-manager.d.ts.map +1 -1
- package/dist/src/utils/notification-manager.js +51 -49
- package/dist/src/utils/notification-manager.js.map +1 -1
- package/dist/src/utils/platform-utils.d.ts +12 -3
- package/dist/src/utils/platform-utils.d.ts.map +1 -1
- package/dist/src/utils/platform-utils.js +35 -16
- package/dist/src/utils/platform-utils.js.map +1 -1
- package/dist/src/utils/plugin-validator.js +11 -11
- package/dist/src/utils/plugin-validator.js.map +1 -1
- package/dist/src/validators/ac-coverage-validator.d.ts +1 -1
- package/dist/src/validators/ac-coverage-validator.js +1 -1
- package/package.json +3 -1
- package/plugins/PLUGINS-INDEX.md +1 -2
- package/plugins/specweave/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave/COMMANDS.md +49 -49
- package/plugins/specweave/agents/pm/AGENT.md +18 -18
- package/plugins/specweave/agents/test-aware-planner/AGENT.md +7 -7
- package/plugins/specweave/agents/translator/AGENT.md +2 -2
- package/plugins/specweave/commands/{specweave-abandon.md → abandon.md} +20 -20
- package/plugins/specweave/commands/{specweave-analyze-standards.sh → analyze-standards.sh} +4 -4
- package/plugins/specweave/commands/{specweave-archive-features.md → archive-features.md} +7 -7
- package/plugins/specweave/commands/{specweave-archive.md → archive.md} +36 -36
- package/plugins/specweave/commands/{specweave-backlog.md → backlog.md} +24 -24
- package/plugins/specweave/commands/{specweave-check-hooks.md → check-hooks.md} +10 -10
- package/plugins/specweave/commands/{specweave-check-tests.md → check-tests.md} +14 -14
- package/plugins/specweave/commands/{specweave-costs.md → costs.md} +8 -8
- package/plugins/specweave/commands/{specweave-discrepancies.md → discrepancies.md} +15 -15
- package/plugins/specweave/commands/{specweave-discrepancy-to-increment.md → discrepancy-to-increment.md} +10 -10
- package/plugins/specweave/commands/{specweave-do.md → do.md} +37 -39
- package/plugins/specweave/commands/{specweave-done.md → done.md} +23 -23
- package/plugins/specweave/commands/{specweave-embed-acs.md → embed-acs.md} +21 -21
- package/plugins/specweave/commands/{specweave-external.md → external.md} +11 -11
- package/plugins/specweave/commands/{specweave-fix-duplicates.md → fix-duplicates.md} +16 -16
- package/plugins/specweave/commands/{specweave-import-docs.md → import-docs.md} +7 -7
- package/plugins/specweave/commands/{specweave-import-external.md → import-external.md} +9 -9
- package/plugins/specweave/commands/{specweave-increment.md → increment.md} +17 -17
- package/plugins/specweave/commands/{specweave-jobs.md → jobs.md} +28 -28
- package/plugins/specweave/commands/{specweave-judge-llm.md → judge-llm.md} +19 -19
- package/plugins/specweave/commands/{specweave-living-docs.md → living-docs.md} +72 -29
- package/plugins/specweave/commands/migrate-config.md +2 -2
- package/plugins/specweave/commands/{specweave-next.md → next.md} +20 -20
- package/plugins/specweave/commands/{specweave-notifications.md → notifications.md} +11 -11
- package/plugins/specweave/commands/{specweave-organize-docs.md → organize-docs.md} +9 -9
- package/plugins/specweave/commands/{specweave-pause.md → pause.md} +19 -19
- package/plugins/specweave/commands/{specweave-plan.md → plan.md} +19 -19
- package/plugins/specweave/commands/{specweave-progress.md → progress.md} +6 -6
- package/plugins/specweave/commands/{specweave-qa.md → qa.md} +15 -15
- package/plugins/specweave/commands/{specweave-reopen.md → reopen.md} +41 -41
- package/plugins/specweave/commands/{specweave-restore-feature.md → restore-feature.md} +6 -6
- package/plugins/specweave/commands/{specweave-restore.md → restore.md} +26 -26
- package/plugins/specweave/commands/{specweave-resume.md → resume.md} +33 -33
- package/plugins/specweave/commands/revert-wip-limit.md +4 -4
- package/plugins/specweave/commands/{specweave-save.md → save.md} +34 -34
- package/plugins/specweave/commands/{specweave-status.md → status.md} +29 -29
- package/plugins/specweave/commands/{specweave.md → sw.md} +28 -28
- package/plugins/specweave/commands/{specweave-sync-acs.md → sync-acs.md} +12 -12
- package/plugins/specweave/commands/sync-diagnostics.md +5 -5
- package/plugins/specweave/commands/{specweave-sync-docs.md → sync-docs.md} +7 -7
- package/plugins/specweave/commands/{specweave-sync-logs.md → sync-logs.md} +14 -14
- package/plugins/specweave/commands/{specweave-sync-monitor.md → sync-monitor.md} +5 -5
- package/plugins/specweave/commands/{specweave-sync-progress.md → sync-progress.md} +38 -38
- package/plugins/specweave/commands/{specweave-sync-specs.md → sync-specs.md} +17 -17
- package/plugins/specweave/commands/{specweave-sync-status.md → sync-status.md} +16 -16
- package/plugins/specweave/commands/{specweave-sync-tasks.md → sync-tasks.md} +13 -13
- package/plugins/specweave/commands/{specweave-tdd-cycle.md → tdd-cycle.md} +1 -1
- package/plugins/specweave/commands/{specweave-tdd-green.md → tdd-green.md} +1 -1
- package/plugins/specweave/commands/{specweave-tdd-red.md → tdd-red.md} +1 -1
- package/plugins/specweave/commands/{specweave-tdd-refactor.md → tdd-refactor.md} +1 -1
- package/plugins/specweave/commands/{specweave-translate.md → translate.md} +17 -17
- package/plugins/specweave/commands/{specweave-update-scope.md → update-scope.md} +8 -8
- package/plugins/specweave/commands/{specweave-update-status.md → update-status.md} +6 -6
- package/plugins/specweave/commands/{specweave-validate-features.md → validate-features.md} +8 -8
- package/plugins/specweave/commands/{specweave-validate.md → validate.md} +20 -20
- package/plugins/specweave/commands/{specweave-workflow.md → workflow.md} +40 -40
- package/plugins/specweave/hooks/README.md +5 -5
- package/plugins/specweave/hooks/config-env-separator.sh +99 -0
- package/plugins/specweave/hooks/github-metadata-guard.sh +73 -0
- package/plugins/specweave/hooks/hooks.json +32 -2
- package/plugins/specweave/hooks/post-first-increment.sh +2 -2
- package/plugins/specweave/hooks/post-increment-completion.sh +7 -7
- package/plugins/specweave/hooks/post-increment-planning.sh +11 -11
- package/plugins/specweave/hooks/post-increment-status-change.sh +1 -1
- package/plugins/specweave/hooks/post-metadata-change.sh +1 -1
- package/plugins/specweave/hooks/post-spec-update.sh +2 -2
- package/plugins/specweave/hooks/post-task-completion.sh +2 -2
- package/plugins/specweave/hooks/pre-increment-start.sh +7 -7
- package/plugins/specweave/hooks/project-folder-guard.sh +272 -0
- package/plugins/specweave/hooks/spec-project-validator.sh +68 -47
- package/plugins/specweave/hooks/user-prompt-submit.sh +27 -27
- package/plugins/specweave/hooks/v2/guards/completion-guard.sh +2 -2
- package/plugins/specweave/hooks/v2/guards/metadata-json-guard.sh +1 -1
- package/plugins/specweave/hooks/v2/handlers/github-sync-handler.sh +1 -1
- package/plugins/specweave/lib/hooks/consolidated-sync.js +35 -5
- package/plugins/specweave/lib/hooks/invoke-translator-skill.js +2 -2
- package/plugins/specweave/lib/hooks/invoke-translator-skill.ts +2 -2
- package/plugins/specweave/lib/hooks/prepare-reflection-context.js +1 -1
- package/plugins/specweave/lib/hooks/prepare-reflection-context.ts +1 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js +5 -5
- package/plugins/specweave/lib/hooks/translate-file.d.ts +1 -1
- package/plugins/specweave/lib/hooks/translate-file.js +2 -2
- package/plugins/specweave/lib/hooks/translate-file.ts +3 -3
- package/plugins/specweave/lib/hooks/us-completion-orchestrator.js +1 -1
- package/plugins/specweave/lib/hooks/us-completion-orchestrator.ts +2 -2
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +6 -6
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -1
- package/plugins/specweave/lib/vendor/core/increment/status-auto-transition.d.ts +113 -0
- package/plugins/specweave/lib/vendor/core/increment/status-auto-transition.js +318 -0
- package/plugins/specweave/lib/vendor/core/increment/status-auto-transition.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +3 -3
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.js +3 -3
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.js.map +1 -1
- package/plugins/specweave/scripts/README.md +9 -9
- package/plugins/specweave/scripts/cleanup-state.sh +1 -1
- package/plugins/specweave/scripts/jobs.js +2 -2
- package/plugins/specweave/scripts/progress.js +6 -6
- package/plugins/specweave/scripts/read-costs.sh +3 -3
- package/plugins/specweave/scripts/read-jobs.sh +8 -8
- package/plugins/specweave/scripts/read-progress.sh +17 -10
- package/plugins/specweave/scripts/read-status.sh +7 -7
- package/plugins/specweave/scripts/read-workflow.sh +18 -18
- package/plugins/specweave/scripts/rebuild-dashboard-cache.sh +6 -5
- package/plugins/specweave/scripts/session-watchdog.sh +4 -4
- package/plugins/specweave/scripts/status.js +7 -7
- package/plugins/specweave/scripts/update-dashboard-cache.sh +28 -10
- package/plugins/specweave/skills/SKILLS-INDEX.md +4 -4
- package/plugins/specweave/skills/archive-increments/SKILL.md +15 -15
- package/plugins/specweave/skills/brownfield-analyzer/SKILL.md +5 -5
- package/plugins/specweave/skills/code-standards-analyzer/SKILL.md +4 -4
- package/plugins/specweave/skills/context-loader/SKILL.md +1 -1
- package/plugins/specweave/skills/{specweave-detector → detector}/SKILL.md +5 -5
- package/plugins/specweave/skills/discrepancy-viewer.md +4 -4
- package/plugins/specweave/skills/external-sync-wizard/SKILL.md +24 -24
- package/plugins/specweave/skills/{specweave-framework → framework}/SKILL.md +33 -33
- package/plugins/specweave/skills/increment-planner/SKILL.md +25 -24
- package/plugins/specweave/skills/increment-planner/templates/spec-multi-project.md +6 -16
- package/plugins/specweave/skills/increment-planner/templates/spec-single-project.md +6 -12
- package/plugins/specweave/skills/increment-quality-judge-v2/SKILL.md +6 -6
- package/plugins/specweave/skills/increment-work-router/SKILL.md +23 -23
- package/plugins/specweave/skills/instant-status/SKILL.md +7 -7
- package/plugins/specweave/skills/plugin-validator/SKILL.md +9 -9
- package/plugins/specweave/skills/pm-closure-validation/SKILL.md +4 -4
- package/plugins/specweave/skills/progress-sync/SKILL.md +51 -51
- package/plugins/specweave/skills/project-kickstarter/SKILL.md +11 -11
- package/plugins/specweave/skills/role-orchestrator/README.md +1 -1
- package/plugins/specweave/skills/role-orchestrator/SKILL.md +4 -4
- package/plugins/specweave/skills/smart-reopen-detector/SKILL.md +17 -17
- package/plugins/specweave/skills/spec-generator/SKILL.md +6 -6
- package/plugins/specweave/skills/tdd-workflow/SKILL.md +21 -21
- package/plugins/specweave/skills/translator/SKILL.md +4 -4
- package/plugins/specweave/skills/umbrella-repo-detector/SKILL.md +5 -5
- package/plugins/specweave-ado/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-ado/agents/ado-manager/AGENT.md +4 -4
- package/plugins/specweave-ado/agents/ado-sync-judge/AGENT.md +4 -4
- package/plugins/specweave-ado/commands/cleanup-duplicates.md +9 -9
- package/plugins/specweave-ado/commands/clone.md +17 -17
- package/plugins/specweave-ado/commands/close.md +10 -10
- package/plugins/specweave-ado/commands/create.md +8 -8
- package/plugins/specweave-ado/commands/import-areas.md +15 -15
- package/plugins/specweave-ado/commands/import-projects.md +12 -12
- package/plugins/specweave-ado/commands/pull.md +25 -25
- package/plugins/specweave-ado/commands/push.md +20 -20
- package/plugins/specweave-ado/commands/reconcile.md +7 -7
- package/plugins/specweave-ado/commands/status.md +7 -7
- package/plugins/specweave-ado/commands/sync.md +17 -17
- package/plugins/specweave-ado/hooks/post-living-docs-update.sh +2 -2
- package/plugins/specweave-ado/lib/ado-project-detector.js +1 -1
- package/plugins/specweave-ado/lib/ado-project-detector.ts +1 -1
- package/plugins/specweave-ado/skills/{specweave-ado-mapper → ado-mapper}/SKILL.md +2 -2
- package/plugins/specweave-ado/skills/ado-multi-project/SKILL.md +6 -6
- package/plugins/specweave-ado/skills/ado-resource-validator/SKILL.md +5 -5
- package/plugins/specweave-ado/skills/ado-sync/SKILL.md +19 -19
- package/plugins/specweave-alternatives/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-alternatives/commands/alternatives-analyze.md +14 -14
- package/plugins/specweave-backend/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-confluent/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-cost-optimizer/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-cost-optimizer/commands/cost-analyze.md +1 -1
- package/plugins/specweave-cost-optimizer/commands/cost-optimize.md +1 -1
- package/plugins/specweave-diagrams/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-diagrams/commands/diagrams-generate.md +1 -1
- package/plugins/specweave-docs/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-docs/commands/build.md +8 -8
- package/plugins/specweave-docs/commands/generate.md +22 -22
- package/plugins/specweave-docs/commands/health.md +10 -10
- package/plugins/specweave-docs/commands/init.md +9 -9
- package/plugins/specweave-docs/commands/organize.md +10 -10
- package/plugins/specweave-docs/commands/validate.md +9 -9
- package/plugins/specweave-docs/commands/view.md +14 -14
- package/plugins/specweave-docs/skills/preview/SKILL.md +11 -11
- package/plugins/specweave-figma/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-figma/commands/figma-import.md +1 -1
- package/plugins/specweave-figma/commands/figma-to-react.md +1 -1
- package/plugins/specweave-figma/commands/figma-tokens.md +1 -1
- package/plugins/specweave-frontend/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-frontend/agents/frontend-architect/README.md +5 -5
- package/plugins/specweave-frontend/commands/component-generate.md +1 -1
- package/plugins/specweave-frontend/commands/design-system-init.md +1 -1
- package/plugins/specweave-frontend/commands/frontend-scaffold.md +1 -1
- package/plugins/specweave-frontend/commands/nextjs-setup.md +1 -1
- package/plugins/specweave-github/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-github/MULTI-PROJECT-SYNC-ARCHITECTURE.md +4 -4
- package/plugins/specweave-github/SYNC-ARCHITECTURE-FIX-SUMMARY.md +18 -18
- package/plugins/specweave-github/agents/github-manager/AGENT.md +8 -8
- package/plugins/specweave-github/commands/cleanup-duplicates.md +8 -8
- package/plugins/specweave-github/commands/close.md +25 -25
- package/plugins/specweave-github/commands/create.md +17 -17
- package/plugins/specweave-github/commands/pull.md +12 -12
- package/plugins/specweave-github/commands/push.md +12 -12
- package/plugins/specweave-github/commands/reconcile.md +7 -7
- package/plugins/specweave-github/commands/status.md +24 -24
- package/plugins/specweave-github/commands/sync.md +34 -34
- package/plugins/specweave-github/commands/update-user-story.md +6 -6
- package/plugins/specweave-github/hooks/README.md +8 -8
- package/plugins/specweave-github/hooks/post-task-completion.sh +2 -2
- package/plugins/specweave-github/lib/ThreeLayerSyncManager.js +12 -4
- package/plugins/specweave-github/lib/ThreeLayerSyncManager.ts +16 -4
- package/plugins/specweave-github/lib/completion-calculator.js +3 -1
- package/plugins/specweave-github/lib/completion-calculator.ts +6 -0
- package/plugins/specweave-github/lib/duplicate-detector.js +12 -6
- package/plugins/specweave-github/lib/duplicate-detector.ts +22 -6
- package/plugins/specweave-github/lib/github-board-resolver.js +7 -2
- package/plugins/specweave-github/lib/github-board-resolver.ts +13 -2
- package/plugins/specweave-github/lib/github-client-v2.js +29 -18
- package/plugins/specweave-github/lib/github-client-v2.ts +33 -18
- package/plugins/specweave-github/lib/github-feature-sync.js +41 -11
- package/plugins/specweave-github/lib/github-feature-sync.ts +52 -11
- package/plugins/specweave-github/lib/github-hierarchical-sync.js +6 -1
- package/plugins/specweave-github/lib/github-hierarchical-sync.ts +12 -1
- package/plugins/specweave-github/lib/github-increment-sync-cli.js +35 -17
- package/plugins/specweave-github/lib/github-increment-sync-cli.ts +44 -16
- package/plugins/specweave-github/lib/github-issue-updater.js +8 -3
- package/plugins/specweave-github/lib/github-issue-updater.ts +16 -3
- package/plugins/specweave-github/lib/github-spec-sync.js +14 -4
- package/plugins/specweave-github/lib/github-spec-sync.ts +19 -4
- package/plugins/specweave-github/lib/github-sync-bidirectional.js +8 -3
- package/plugins/specweave-github/lib/github-sync-bidirectional.ts +14 -3
- package/plugins/specweave-github/lib/github-sync-increment-changes.js +9 -4
- package/plugins/specweave-github/lib/github-sync-increment-changes.ts +15 -4
- package/plugins/specweave-github/lib/increment-issue-builder.js +23 -10
- package/plugins/specweave-github/lib/increment-issue-builder.ts +29 -11
- package/plugins/specweave-github/lib/user-story-content-builder.js +19 -16
- package/plugins/specweave-github/lib/user-story-content-builder.ts +24 -19
- package/plugins/specweave-github/lib/user-story-issue-builder.js +10 -13
- package/plugins/specweave-github/lib/user-story-issue-builder.ts +20 -19
- package/plugins/specweave-github/reference/github-specweave-mapping.md +1 -1
- package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +3 -3
- package/plugins/specweave-github/skills/github-issue-tracker/SKILL.md +8 -8
- package/plugins/specweave-github/skills/github-sync/SKILL.md +14 -14
- package/plugins/specweave-infrastructure/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-infrastructure/commands/{specweave-infrastructure-monitor-setup.md → monitor-setup.md} +1 -1
- package/plugins/specweave-infrastructure/commands/{specweave-infrastructure-slo-implement.md → slo-implement.md} +1 -1
- package/plugins/specweave-jira/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-jira/agents/jira-sync-judge/AGENT.md +3 -3
- package/plugins/specweave-jira/commands/cleanup-duplicates.md +9 -9
- package/plugins/specweave-jira/commands/close.md +13 -13
- package/plugins/specweave-jira/commands/create.md +8 -8
- package/plugins/specweave-jira/commands/import-boards.md +15 -15
- package/plugins/specweave-jira/commands/import-projects-full.md +15 -15
- package/plugins/specweave-jira/commands/import-projects.md +10 -10
- package/plugins/specweave-jira/commands/pull.md +10 -10
- package/plugins/specweave-jira/commands/push.md +11 -11
- package/plugins/specweave-jira/commands/reconcile.md +7 -7
- package/plugins/specweave-jira/commands/status.md +16 -16
- package/plugins/specweave-jira/commands/sync.md +27 -27
- package/plugins/specweave-jira/skills/{specweave-jira-mapper → jira-mapper}/SKILL.md +2 -2
- package/plugins/specweave-jira/skills/jira-resource-validator/SKILL.md +4 -4
- package/plugins/specweave-jira/skills/jira-sync/SKILL.md +5 -5
- package/plugins/specweave-kafka/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-kafka/IMPLEMENTATION-COMPLETE.md +10 -10
- package/plugins/specweave-kafka/README.md +12 -12
- package/plugins/specweave-kafka/commands/deploy.md +5 -5
- package/plugins/specweave-kafka/commands/dev-env.md +2 -2
- package/plugins/specweave-kafka/commands/mcp-configure.md +3 -3
- package/plugins/specweave-kafka/commands/monitor-setup.md +3 -3
- package/plugins/specweave-kafka/skills/kafka-architecture/SKILL.md +4 -4
- package/plugins/specweave-kafka/skills/kafka-cli-tools/SKILL.md +5 -5
- package/plugins/specweave-kafka/skills/kafka-mcp-integration/SKILL.md +6 -6
- package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-kafka-streams/commands/topology.md +4 -4
- package/plugins/specweave-kubernetes/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-ml/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-ml/README.md +9 -9
- package/plugins/specweave-ml/commands/{specweave-ml-deploy.md → deploy.md} +1 -1
- package/plugins/specweave-ml/commands/{specweave-ml-evaluate.md → evaluate.md} +1 -1
- package/plugins/specweave-ml/commands/{specweave-ml-explain.md → explain.md} +1 -1
- package/plugins/specweave-ml/commands/{specweave-ml-pipeline.md → pipeline.md} +1 -1
- package/plugins/specweave-ml/skills/automl-optimizer/SKILL.md +1 -1
- package/plugins/specweave-ml/skills/data-visualizer/SKILL.md +1 -1
- package/plugins/specweave-ml/skills/experiment-tracker/SKILL.md +4 -4
- package/plugins/specweave-ml/skills/feature-engineer/SKILL.md +1 -1
- package/plugins/specweave-ml/skills/ml-deployment-helper/SKILL.md +2 -2
- package/plugins/specweave-ml/skills/ml-pipeline-orchestrator/SKILL.md +10 -10
- package/plugins/specweave-ml/skills/model-registry/SKILL.md +1 -1
- package/plugins/specweave-ml/skills/time-series-forecaster/SKILL.md +1 -1
- package/plugins/specweave-mobile/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-mobile/README.md +2 -2
- package/plugins/specweave-mobile/agents/mobile-architect/AGENT.md +2 -2
- package/plugins/specweave-mobile/skills/react-native-setup/SKILL.md +1 -1
- package/plugins/specweave-n8n/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-n8n/commands/workflow-template.md +4 -4
- package/plugins/specweave-payments/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-payments/commands/stripe-setup.md +1 -1
- package/plugins/specweave-payments/commands/subscription-flow.md +1 -1
- package/plugins/specweave-plugin-dev/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-plugin-dev/commands/plugin-create.md +1 -1
- package/plugins/specweave-plugin-dev/commands/plugin-publish.md +1 -1
- package/plugins/specweave-plugin-dev/commands/plugin-test.md +1 -1
- package/plugins/specweave-release/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-release/IMPLEMENTATION.md +14 -14
- package/plugins/specweave-release/README.md +33 -33
- package/plugins/specweave-release/agents/release-manager/AGENT.md +18 -18
- package/plugins/specweave-release/commands/{specweave-release-align.md → align.md} +19 -19
- package/plugins/specweave-release/commands/{specweave-release-init.md → init.md} +19 -19
- package/plugins/specweave-release/commands/{specweave-release-npm.md → npm.md} +14 -14
- package/plugins/specweave-release/commands/{specweave-release-platform.md → platform.md} +17 -17
- package/plugins/specweave-release/commands/{specweave-release-rc.md → rc.md} +37 -37
- package/plugins/specweave-release/hooks/post-task-completion.sh +1 -1
- package/plugins/specweave-release/skills/rc-manager/SKILL.md +12 -12
- package/plugins/specweave-release/skills/release-coordinator/SKILL.md +11 -11
- package/plugins/specweave-release/skills/release-strategy-advisor/SKILL.md +4 -4
- package/plugins/specweave-release/skills/version-aligner/SKILL.md +7 -7
- package/plugins/specweave-testing/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-testing/agents/qa-engineer/README.md +5 -5
- package/plugins/specweave-testing/commands/e2e-setup.md +1 -1
- package/plugins/specweave-testing/commands/test-coverage.md +1 -1
- package/plugins/specweave-testing/commands/test-generate.md +1 -1
- package/plugins/specweave-testing/commands/test-init.md +1 -1
- package/plugins/specweave-tooling/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-tooling/commands/{specweave-tooling-skill-create.md → skill-create.md} +1 -1
- package/plugins/specweave-tooling/commands/{specweave-tooling-skill-package.md → skill-package.md} +1 -1
- package/plugins/specweave-tooling/commands/{specweave-tooling-skill-validate.md → skill-validate.md} +1 -1
- package/plugins/specweave-ui/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-ui/commands/ui-automate.md +9 -9
- package/plugins/specweave-ui/commands/ui-inspect.md +6 -6
- package/src/templates/AGENTS.md.template +49 -49
- package/src/templates/CLAUDE.md.template +11 -11
- package/dist/src/cli/commands/switch-project.d.ts +0 -13
- package/dist/src/cli/commands/switch-project.d.ts.map +0 -1
- package/dist/src/cli/commands/switch-project.js +0 -78
- package/dist/src/cli/commands/switch-project.js.map +0 -1
- package/plugins/specweave/commands/specweave-init-multiproject.md +0 -146
- package/plugins/specweave-core/.claude-plugin/plugin.json +0 -21
- package/plugins/specweave-core/commands/architecture-review.md +0 -288
- package/plugins/specweave-core/commands/code-review.md +0 -213
- package/plugins/specweave-core/commands/refactor-plan.md +0 -249
- package/plugins/specweave-core/skills/code-quality/SKILL.md +0 -158
- package/plugins/specweave-core/skills/design-patterns/SKILL.md +0 -245
- package/plugins/specweave-core/skills/software-architecture/SKILL.md +0 -84
- /package/plugins/specweave/skills/{specweave-framework → framework}/test-cases/test-1-increment-naming.yaml +0 -0
- /package/plugins/specweave/skills/{specweave-framework → framework}/test-cases/test-2-source-of-truth.yaml +0 -0
- /package/plugins/specweave/skills/{specweave-framework → framework}/test-cases/test-3-increment-discipline.yaml +0 -0
- /package/plugins/specweave/skills/{specweave-framework → framework}/test-cases/test-4-file-placement.yaml +0 -0
|
@@ -0,0 +1,633 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProjectResolutionService - Centralized project resolution for SpecWeave
|
|
3
|
+
*
|
|
4
|
+
* Provides authoritative project resolution with priority-based fallback chain:
|
|
5
|
+
* 1. Per-US **Project**: fields (primary source of truth)
|
|
6
|
+
* 2. Config project.name (single-project mode fallback)
|
|
7
|
+
* 3. Intelligent keyword detection (multi-project mode)
|
|
8
|
+
* 4. Ultimate fallback ("default")
|
|
9
|
+
*
|
|
10
|
+
* Key Architecture Decision (ADR-0140):
|
|
11
|
+
* - Frontmatter project: field REMOVED as source
|
|
12
|
+
* - Per-US fields are now the single source of truth
|
|
13
|
+
* - This service centralizes all project resolution logic
|
|
14
|
+
*
|
|
15
|
+
* @module core/project/project-resolution
|
|
16
|
+
*/
|
|
17
|
+
import { promises as fs } from 'fs';
|
|
18
|
+
import path from 'path';
|
|
19
|
+
import { ConfigManager } from '../config/config-manager.js';
|
|
20
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
21
|
+
import { ProjectRegistry } from './project-registry.js';
|
|
22
|
+
/**
|
|
23
|
+
* Centralized project resolution service
|
|
24
|
+
*
|
|
25
|
+
* Replaces fragmented frontmatter.project access throughout codebase
|
|
26
|
+
* with a single, consistent resolution mechanism.
|
|
27
|
+
*/
|
|
28
|
+
export class ProjectResolutionService {
|
|
29
|
+
/**
|
|
30
|
+
* Create a new ProjectResolutionService
|
|
31
|
+
*
|
|
32
|
+
* @param projectRoot - Path to project root
|
|
33
|
+
* @param options - Configuration options
|
|
34
|
+
*/
|
|
35
|
+
constructor(projectRoot, options = {}) {
|
|
36
|
+
this.cache = new Map();
|
|
37
|
+
this.projectRoot = projectRoot;
|
|
38
|
+
this.logger = options.logger ?? consoleLogger;
|
|
39
|
+
this.configManager = options.configManager ?? new ConfigManager(projectRoot, this.logger);
|
|
40
|
+
this.registry = options.registry ?? new ProjectRegistry(projectRoot, { logger: this.logger });
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Resolve project for an increment with priority-based fallback
|
|
44
|
+
*
|
|
45
|
+
* Resolution Priority:
|
|
46
|
+
* 1. Per-US **Project**: fields in spec.md (high confidence)
|
|
47
|
+
* 2. Config project.name in single-project mode (high confidence)
|
|
48
|
+
* 3. Intelligent keyword detection (medium/low confidence)
|
|
49
|
+
* 4. Ultimate fallback to "default" (low confidence)
|
|
50
|
+
*
|
|
51
|
+
* @param incrementId - Increment folder name (e.g., "0001-feature-name")
|
|
52
|
+
* @returns Resolved project with confidence and source
|
|
53
|
+
*/
|
|
54
|
+
async resolveProjectForIncrement(incrementId) {
|
|
55
|
+
// Check cache first
|
|
56
|
+
const cached = this.cache.get(incrementId);
|
|
57
|
+
if (cached) {
|
|
58
|
+
this.logger.debug(`Using cached project resolution for ${incrementId}`);
|
|
59
|
+
return cached;
|
|
60
|
+
}
|
|
61
|
+
// Resolution priority chain
|
|
62
|
+
const resolved = await this.resolveFromPerUSFields(incrementId) ||
|
|
63
|
+
await this.resolveFromConfig() ||
|
|
64
|
+
await this.resolveFromIntelligentDetection(incrementId) ||
|
|
65
|
+
this.resolveFallback();
|
|
66
|
+
// Cache result
|
|
67
|
+
this.cache.set(incrementId, resolved);
|
|
68
|
+
this.logger.debug(`Resolved project for ${incrementId}: ${resolved.projectId} ` +
|
|
69
|
+
`(${resolved.confidence}, source: ${resolved.source})`);
|
|
70
|
+
return resolved;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Resolve project for spec content directly (without increment ID)
|
|
74
|
+
*
|
|
75
|
+
* Useful when spec content is already loaded and increment ID is not available.
|
|
76
|
+
*
|
|
77
|
+
* @param specContent - Raw spec.md content
|
|
78
|
+
* @returns Resolved project with confidence and source
|
|
79
|
+
*/
|
|
80
|
+
async resolveProjectFromContent(specContent) {
|
|
81
|
+
// Try per-US fields from content
|
|
82
|
+
const projects = this.extractProjectsFromUSFields(specContent);
|
|
83
|
+
if (projects.length === 1) {
|
|
84
|
+
return {
|
|
85
|
+
projectId: projects[0],
|
|
86
|
+
confidence: 'high',
|
|
87
|
+
source: 'per-us',
|
|
88
|
+
reasoning: [`Single project found in US fields: ${projects[0]}`]
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (projects.length > 1) {
|
|
92
|
+
return {
|
|
93
|
+
projectId: projects[0],
|
|
94
|
+
confidence: 'medium',
|
|
95
|
+
source: 'per-us',
|
|
96
|
+
reasoning: [
|
|
97
|
+
`Multiple projects found: ${projects.join(', ')}`,
|
|
98
|
+
`Using first project as primary: ${projects[0]}`
|
|
99
|
+
]
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// Fall back to config
|
|
103
|
+
const configResolved = await this.resolveFromConfig();
|
|
104
|
+
if (configResolved) {
|
|
105
|
+
return configResolved;
|
|
106
|
+
}
|
|
107
|
+
// Ultimate fallback
|
|
108
|
+
return this.resolveFallback();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Priority 1: Extract from per-US **Project**: fields
|
|
112
|
+
*
|
|
113
|
+
* Scans spec.md for **Project**: field patterns in user stories.
|
|
114
|
+
* This is the primary and preferred source of truth.
|
|
115
|
+
*/
|
|
116
|
+
async resolveFromPerUSFields(incrementId) {
|
|
117
|
+
const specPath = path.join(this.projectRoot, '.specweave/increments', incrementId, 'spec.md');
|
|
118
|
+
try {
|
|
119
|
+
const content = await fs.readFile(specPath, 'utf-8');
|
|
120
|
+
const projects = this.extractProjectsFromUSFields(content);
|
|
121
|
+
if (projects.length === 0) {
|
|
122
|
+
this.logger.debug(`No per-US **Project**: fields found in ${incrementId}`);
|
|
123
|
+
return null; // No per-US fields found
|
|
124
|
+
}
|
|
125
|
+
if (projects.length === 1) {
|
|
126
|
+
// Single project - high confidence
|
|
127
|
+
return {
|
|
128
|
+
projectId: projects[0],
|
|
129
|
+
confidence: 'high',
|
|
130
|
+
source: 'per-us',
|
|
131
|
+
reasoning: [`Single project found in US fields: ${projects[0]}`]
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// Multiple projects - use first one as primary (cross-project increment)
|
|
135
|
+
return {
|
|
136
|
+
projectId: projects[0],
|
|
137
|
+
confidence: 'medium',
|
|
138
|
+
source: 'per-us',
|
|
139
|
+
reasoning: [
|
|
140
|
+
`Multiple projects found: ${projects.join(', ')}`,
|
|
141
|
+
`Using first project as primary: ${projects[0]}`
|
|
142
|
+
]
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
this.logger.debug(`Could not extract from per-US fields: ${error.message}`);
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Priority 2: Use config.project.name (single-project mode)
|
|
152
|
+
*
|
|
153
|
+
* Only applies when multiProject.enabled !== true.
|
|
154
|
+
* In single-project mode, config.project.name is authoritative.
|
|
155
|
+
*/
|
|
156
|
+
async resolveFromConfig() {
|
|
157
|
+
try {
|
|
158
|
+
// Cast to any to access multiProject which may or may not exist
|
|
159
|
+
// (multiProject is a runtime field managed by single-project-migrator)
|
|
160
|
+
const config = await this.configManager.read();
|
|
161
|
+
const isSingleProject = config.multiProject?.enabled !== true;
|
|
162
|
+
if (!isSingleProject) {
|
|
163
|
+
this.logger.debug('Multi-project mode enabled, skipping config fallback');
|
|
164
|
+
return null; // Multi-project mode, can't use config fallback
|
|
165
|
+
}
|
|
166
|
+
const projectName = config.project?.name;
|
|
167
|
+
if (!projectName) {
|
|
168
|
+
this.logger.debug('No project.name in config');
|
|
169
|
+
return null; // No project name in config
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
projectId: projectName,
|
|
173
|
+
confidence: 'high',
|
|
174
|
+
source: 'config',
|
|
175
|
+
reasoning: [
|
|
176
|
+
'Single-project mode detected',
|
|
177
|
+
`Using project.name from config: ${projectName}`
|
|
178
|
+
]
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
this.logger.debug(`Config resolution failed: ${error.message}`);
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Priority 3: Intelligent detection from increment content
|
|
188
|
+
*
|
|
189
|
+
* Scores each available project based on keyword matching.
|
|
190
|
+
* Only used in multi-project mode when per-US fields are missing.
|
|
191
|
+
*/
|
|
192
|
+
async resolveFromIntelligentDetection(incrementId) {
|
|
193
|
+
const specPath = path.join(this.projectRoot, '.specweave/increments', incrementId, 'spec.md');
|
|
194
|
+
try {
|
|
195
|
+
const content = await fs.readFile(specPath, 'utf-8');
|
|
196
|
+
const config = await this.configManager.read();
|
|
197
|
+
// Get available projects
|
|
198
|
+
const availableProjects = this.getAvailableProjects(config);
|
|
199
|
+
if (availableProjects.length === 0) {
|
|
200
|
+
this.logger.debug('No available projects for intelligent detection');
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
// Score each project based on keyword matching
|
|
204
|
+
const scores = new Map();
|
|
205
|
+
const keywords = this.extractKeywords(content);
|
|
206
|
+
const contentLower = content.toLowerCase();
|
|
207
|
+
for (const project of availableProjects) {
|
|
208
|
+
let score = 0;
|
|
209
|
+
// Match project ID directly in content (handles kebab-case like "frontend-app")
|
|
210
|
+
if (contentLower.includes(project.id.toLowerCase())) {
|
|
211
|
+
score += 10;
|
|
212
|
+
}
|
|
213
|
+
// Also check individual word matches (for keywords in content)
|
|
214
|
+
if (keywords.has(project.id.toLowerCase())) {
|
|
215
|
+
score += 5;
|
|
216
|
+
}
|
|
217
|
+
// Match project keywords (if configured)
|
|
218
|
+
const projectKeywords = project.keywords || [];
|
|
219
|
+
for (const keyword of projectKeywords) {
|
|
220
|
+
if (keywords.has(keyword.toLowerCase())) {
|
|
221
|
+
score += 3;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
scores.set(project.id, score);
|
|
225
|
+
}
|
|
226
|
+
// Find highest scoring project
|
|
227
|
+
const sortedScores = Array.from(scores.entries())
|
|
228
|
+
.sort((a, b) => b[1] - a[1]);
|
|
229
|
+
const bestMatch = sortedScores[0];
|
|
230
|
+
if (bestMatch && bestMatch[1] > 0) {
|
|
231
|
+
return {
|
|
232
|
+
projectId: bestMatch[0],
|
|
233
|
+
confidence: bestMatch[1] >= 10 ? 'medium' : 'low',
|
|
234
|
+
source: 'detection',
|
|
235
|
+
reasoning: [
|
|
236
|
+
'Intelligent detection based on keywords',
|
|
237
|
+
`Best match: ${bestMatch[0]} (score: ${bestMatch[1]})`
|
|
238
|
+
]
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
this.logger.debug('No keyword matches found in intelligent detection');
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
this.logger.debug(`Intelligent detection failed: ${error.message}`);
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Priority 4: Ultimate fallback - "default" project
|
|
251
|
+
*
|
|
252
|
+
* This should rarely happen in practice. Indicates missing configuration.
|
|
253
|
+
*/
|
|
254
|
+
resolveFallback() {
|
|
255
|
+
this.logger.debug('Using ultimate fallback for project resolution');
|
|
256
|
+
return {
|
|
257
|
+
projectId: 'default',
|
|
258
|
+
confidence: 'low',
|
|
259
|
+
source: 'fallback',
|
|
260
|
+
reasoning: [
|
|
261
|
+
'No project could be resolved from any source',
|
|
262
|
+
'Using fallback project: default'
|
|
263
|
+
]
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Extract project IDs from **Project**: fields in spec.md
|
|
268
|
+
*
|
|
269
|
+
* Pattern: **Project**: project-id (case-insensitive, kebab-case)
|
|
270
|
+
*
|
|
271
|
+
* @param content - Spec content to scan
|
|
272
|
+
* @returns Unique project IDs found
|
|
273
|
+
*/
|
|
274
|
+
extractProjectsFromUSFields(content) {
|
|
275
|
+
const projectPattern = /\*\*Project\*\*:\s*([a-zA-Z0-9-]+)/gi;
|
|
276
|
+
const projects = new Set();
|
|
277
|
+
let match;
|
|
278
|
+
while ((match = projectPattern.exec(content)) !== null) {
|
|
279
|
+
projects.add(match[1].toLowerCase());
|
|
280
|
+
}
|
|
281
|
+
return Array.from(projects);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Extract keywords from spec content for intelligent matching
|
|
285
|
+
*
|
|
286
|
+
* Filters out short words and common stopwords.
|
|
287
|
+
*/
|
|
288
|
+
extractKeywords(content) {
|
|
289
|
+
const words = content
|
|
290
|
+
.toLowerCase()
|
|
291
|
+
.split(/\W+/)
|
|
292
|
+
.filter(w => w.length > 3);
|
|
293
|
+
return new Set(words);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Get available projects from config
|
|
297
|
+
*
|
|
298
|
+
* Handles both single-project and multi-project modes.
|
|
299
|
+
*/
|
|
300
|
+
getAvailableProjects(config) {
|
|
301
|
+
if (config.multiProject?.enabled) {
|
|
302
|
+
return Object.entries(config.multiProject.projects || {}).map(([id, proj]) => ({
|
|
303
|
+
id,
|
|
304
|
+
keywords: proj.keywords || []
|
|
305
|
+
}));
|
|
306
|
+
}
|
|
307
|
+
if (config.project?.name) {
|
|
308
|
+
return [{ id: config.project.name, keywords: [] }];
|
|
309
|
+
}
|
|
310
|
+
return [];
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Clear cache (useful for testing and after config changes)
|
|
314
|
+
*/
|
|
315
|
+
clearCache() {
|
|
316
|
+
this.cache.clear();
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Get cache statistics for debugging
|
|
320
|
+
*/
|
|
321
|
+
getCacheStats() {
|
|
322
|
+
return {
|
|
323
|
+
size: this.cache.size,
|
|
324
|
+
keys: Array.from(this.cache.keys())
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Validate resolved project against the project registry
|
|
329
|
+
*
|
|
330
|
+
* Checks if the project exists in the registry and provides suggestions if not.
|
|
331
|
+
* This integration supports AC-US9-01 through AC-US9-04 for Living Docs integration.
|
|
332
|
+
*
|
|
333
|
+
* @param projectId - Project ID to validate
|
|
334
|
+
* @returns Validation result with suggestions if project not found
|
|
335
|
+
*/
|
|
336
|
+
async validateAgainstRegistry(projectId) {
|
|
337
|
+
try {
|
|
338
|
+
const project = await this.registry.getProject(projectId);
|
|
339
|
+
if (project) {
|
|
340
|
+
return {
|
|
341
|
+
valid: true,
|
|
342
|
+
projectId: project.id,
|
|
343
|
+
inRegistry: true,
|
|
344
|
+
techStack: project.techStack,
|
|
345
|
+
team: project.team
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
// Project not found - get suggestions from registered projects
|
|
349
|
+
const registeredProjects = await this.registry.listProjects();
|
|
350
|
+
const suggestions = registeredProjects
|
|
351
|
+
.map(p => p.id)
|
|
352
|
+
.filter(id => {
|
|
353
|
+
// Suggest projects with similar names (partial match)
|
|
354
|
+
return id.includes(projectId) || projectId.includes(id);
|
|
355
|
+
})
|
|
356
|
+
.slice(0, 3);
|
|
357
|
+
this.logger.warn(`Project '${projectId}' not found in registry. ` +
|
|
358
|
+
`Run 'specweave project add ${projectId}' to register it.`);
|
|
359
|
+
if (suggestions.length > 0) {
|
|
360
|
+
this.logger.warn(`Similar registered projects: ${suggestions.join(', ')}`);
|
|
361
|
+
}
|
|
362
|
+
return {
|
|
363
|
+
valid: false,
|
|
364
|
+
projectId,
|
|
365
|
+
inRegistry: false,
|
|
366
|
+
suggestions: suggestions.length > 0 ? suggestions : undefined
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
// Registry not initialized or error - return valid to not block sync
|
|
371
|
+
this.logger.debug(`Registry validation skipped: ${error}`);
|
|
372
|
+
return {
|
|
373
|
+
valid: true,
|
|
374
|
+
projectId,
|
|
375
|
+
inRegistry: false
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Get project metadata from registry (techStack, team, etc.)
|
|
381
|
+
*
|
|
382
|
+
* Useful for enriching living docs with project context.
|
|
383
|
+
*
|
|
384
|
+
* @param projectId - Project ID to look up
|
|
385
|
+
* @returns Project metadata or null if not found
|
|
386
|
+
*/
|
|
387
|
+
async getProjectMetadata(projectId) {
|
|
388
|
+
try {
|
|
389
|
+
const project = await this.registry.getProject(projectId);
|
|
390
|
+
if (!project)
|
|
391
|
+
return null;
|
|
392
|
+
return {
|
|
393
|
+
techStack: project.techStack,
|
|
394
|
+
team: project.team,
|
|
395
|
+
description: project.description,
|
|
396
|
+
keywords: project.keywords
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
return null;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Get the project registry instance
|
|
405
|
+
*
|
|
406
|
+
* Allows external code to interact with the registry directly.
|
|
407
|
+
*/
|
|
408
|
+
getRegistry() {
|
|
409
|
+
return this.registry;
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Get all unique projects from an increment's user stories
|
|
413
|
+
*
|
|
414
|
+
* Useful for cross-project increment handling.
|
|
415
|
+
*
|
|
416
|
+
* @param incrementId - Increment folder name
|
|
417
|
+
* @returns Array of unique project IDs
|
|
418
|
+
*/
|
|
419
|
+
async getAllProjectsForIncrement(incrementId) {
|
|
420
|
+
const specPath = path.join(this.projectRoot, '.specweave/increments', incrementId, 'spec.md');
|
|
421
|
+
try {
|
|
422
|
+
const content = await fs.readFile(specPath, 'utf-8');
|
|
423
|
+
return this.extractProjectsFromUSFields(content);
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
// Fallback to resolved project if spec can't be read
|
|
427
|
+
const resolved = await this.resolveProjectForIncrement(incrementId);
|
|
428
|
+
return [resolved.projectId];
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* CRITICAL: Validate a project ID before folder creation
|
|
433
|
+
*
|
|
434
|
+
* This is the primary guard against folder pollution from example/invalid projects.
|
|
435
|
+
* Called before any ensureDir() or mkdirSync() that creates project folders.
|
|
436
|
+
*
|
|
437
|
+
* Validation rules (STRICT - returns false if ANY rule fails):
|
|
438
|
+
* 1. Must be a valid project format (kebab-case, alphanumeric)
|
|
439
|
+
* 2. Must NOT be an obvious example/placeholder name
|
|
440
|
+
* 3. In single-project mode: must match config.project.name
|
|
441
|
+
* 4. In multi-project mode: must exist in config.multiProject.projects
|
|
442
|
+
*
|
|
443
|
+
* @param projectId - Project ID to validate
|
|
444
|
+
* @returns Validation result with reason for rejection
|
|
445
|
+
*/
|
|
446
|
+
async validateProjectForFolderCreation(projectId) {
|
|
447
|
+
// Rule 1: Basic format validation
|
|
448
|
+
if (!projectId || typeof projectId !== 'string') {
|
|
449
|
+
return {
|
|
450
|
+
valid: false,
|
|
451
|
+
projectId: projectId || '(empty)',
|
|
452
|
+
reason: 'Project ID is empty or not a string',
|
|
453
|
+
allowedProjects: []
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
// Rule 2: Reject obvious placeholders and invalid characters
|
|
457
|
+
const invalidPatterns = [
|
|
458
|
+
/\{\{.*\}\}/, // Template placeholders like {{PROJECT_ID}}
|
|
459
|
+
/,/, // Comma-separated lists
|
|
460
|
+
/\s{2,}/, // Multiple spaces
|
|
461
|
+
/[←→❌✅⚠️]/, // Emoji indicators (from examples)
|
|
462
|
+
/[()]/, // Parentheses (like "MyApp (3 repos)")
|
|
463
|
+
/[^\w-]/, // Non-alphanumeric (except hyphen)
|
|
464
|
+
/^(example|test-project|my-?app|sample|demo|placeholder|todo|tbd|xxx)$/i,
|
|
465
|
+
];
|
|
466
|
+
for (const pattern of invalidPatterns) {
|
|
467
|
+
if (pattern.test(projectId)) {
|
|
468
|
+
return {
|
|
469
|
+
valid: false,
|
|
470
|
+
projectId,
|
|
471
|
+
reason: `Project ID contains invalid pattern: ${pattern.toString()}`,
|
|
472
|
+
allowedProjects: []
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
// Rule 3: Known example project names that appear in documentation/specs
|
|
477
|
+
const exampleProjects = new Set([
|
|
478
|
+
'frontend-app',
|
|
479
|
+
'backend-api',
|
|
480
|
+
'mobile-app',
|
|
481
|
+
'shared-lib',
|
|
482
|
+
'acme-corp',
|
|
483
|
+
'myapp',
|
|
484
|
+
'my-app',
|
|
485
|
+
'example-project',
|
|
486
|
+
'sample-project',
|
|
487
|
+
'test-project',
|
|
488
|
+
'per',
|
|
489
|
+
'default'
|
|
490
|
+
]);
|
|
491
|
+
// CRITICAL v0.35.1: Use ProjectRegistry as PRIMARY source of truth
|
|
492
|
+
// Fallback to config.json for backward compatibility
|
|
493
|
+
let allowedProjects = [];
|
|
494
|
+
const projectIdLower = projectId.toLowerCase();
|
|
495
|
+
try {
|
|
496
|
+
// Check ProjectRegistry FIRST (.specweave/state/projects.json)
|
|
497
|
+
const registeredProjects = await this.registry.listProjects();
|
|
498
|
+
if (registeredProjects.length > 0) {
|
|
499
|
+
allowedProjects = registeredProjects.map(p => p.id.toLowerCase());
|
|
500
|
+
// If project exists in registry, it's valid
|
|
501
|
+
if (allowedProjects.includes(projectIdLower)) {
|
|
502
|
+
return {
|
|
503
|
+
valid: true,
|
|
504
|
+
projectId,
|
|
505
|
+
reason: 'Project exists in registry',
|
|
506
|
+
allowedProjects
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
// If project is a known example and NOT in registry, reject it
|
|
510
|
+
if (exampleProjects.has(projectIdLower)) {
|
|
511
|
+
return {
|
|
512
|
+
valid: false,
|
|
513
|
+
projectId,
|
|
514
|
+
reason: `Project '${projectId}' is a known example project name. Add it with 'specweave project add ${projectId}' to allow.`,
|
|
515
|
+
allowedProjects
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
// Project not in registry - REJECT
|
|
519
|
+
return {
|
|
520
|
+
valid: false,
|
|
521
|
+
projectId,
|
|
522
|
+
reason: `Project '${projectId}' is not in the project registry. Allowed: [${allowedProjects.join(', ')}]`,
|
|
523
|
+
allowedProjects
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
catch (error) {
|
|
528
|
+
this.logger.debug(`Registry check failed, falling back to config.json: ${error}`);
|
|
529
|
+
}
|
|
530
|
+
// FALLBACK: Use config.json if registry is empty or failed
|
|
531
|
+
const config = await this.configManager.read();
|
|
532
|
+
const isSingleProject = config.multiProject?.enabled !== true;
|
|
533
|
+
if (isSingleProject) {
|
|
534
|
+
// Single-project mode: only config.project.name is allowed
|
|
535
|
+
const configProject = config.project?.name;
|
|
536
|
+
if (configProject) {
|
|
537
|
+
allowedProjects = [configProject.toLowerCase()];
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
// Multi-project mode: only projects in config.multiProject.projects
|
|
542
|
+
const multiProjects = config.multiProject?.projects || {};
|
|
543
|
+
allowedProjects = Object.keys(multiProjects).map(p => p.toLowerCase());
|
|
544
|
+
}
|
|
545
|
+
// If project is in allowed list, it's valid (even if it's in exampleProjects)
|
|
546
|
+
if (allowedProjects.includes(projectIdLower)) {
|
|
547
|
+
return {
|
|
548
|
+
valid: true,
|
|
549
|
+
projectId,
|
|
550
|
+
reason: 'Project is in config.json',
|
|
551
|
+
allowedProjects
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
// If project is a known example and NOT in allowed list, reject it
|
|
555
|
+
if (exampleProjects.has(projectIdLower)) {
|
|
556
|
+
return {
|
|
557
|
+
valid: false,
|
|
558
|
+
projectId,
|
|
559
|
+
reason: `Project '${projectId}' is a known example project name. Add it to config to allow.`,
|
|
560
|
+
allowedProjects
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
// If there are no allowed projects configured, be permissive (new project setup)
|
|
564
|
+
if (allowedProjects.length === 0) {
|
|
565
|
+
this.logger.warn(`No projects configured. Project '${projectId}' will be allowed. ` +
|
|
566
|
+
`Consider adding it with 'specweave project add ${projectId}'`);
|
|
567
|
+
return {
|
|
568
|
+
valid: true,
|
|
569
|
+
projectId,
|
|
570
|
+
reason: 'No projects configured, allowing new project',
|
|
571
|
+
allowedProjects
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
// Project not in allowed list - REJECT
|
|
575
|
+
return {
|
|
576
|
+
valid: false,
|
|
577
|
+
projectId,
|
|
578
|
+
reason: `Project '${projectId}' is not in the allowed list: [${allowedProjects.join(', ')}]`,
|
|
579
|
+
allowedProjects
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Filter project IDs extracted from spec.md to only valid projects
|
|
584
|
+
*
|
|
585
|
+
* This prevents example User Stories from polluting the specs folder.
|
|
586
|
+
* Should be called after extractProjectsFromUSFields() to filter results.
|
|
587
|
+
*
|
|
588
|
+
* @param projectIds - Raw project IDs from spec.md
|
|
589
|
+
* @returns Only valid, configured project IDs
|
|
590
|
+
*/
|
|
591
|
+
async filterValidProjects(projectIds) {
|
|
592
|
+
const validProjects = [];
|
|
593
|
+
for (const projectId of projectIds) {
|
|
594
|
+
const validation = await this.validateProjectForFolderCreation(projectId);
|
|
595
|
+
if (validation.valid) {
|
|
596
|
+
validProjects.push(projectId);
|
|
597
|
+
}
|
|
598
|
+
else {
|
|
599
|
+
this.logger.debug(`Filtered out invalid project '${projectId}': ${validation.reason}`);
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
return validProjects;
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Synchronous check for common example project names
|
|
606
|
+
*
|
|
607
|
+
* Fast path for pre-tool-use hooks that can't be async.
|
|
608
|
+
* Returns true if the project name looks like an example.
|
|
609
|
+
*/
|
|
610
|
+
static isExampleProjectName(projectId) {
|
|
611
|
+
if (!projectId)
|
|
612
|
+
return true;
|
|
613
|
+
const examplePatterns = [
|
|
614
|
+
/^frontend-?app$/i,
|
|
615
|
+
/^backend-?api$/i,
|
|
616
|
+
/^mobile-?app$/i,
|
|
617
|
+
/^shared-?lib$/i,
|
|
618
|
+
/^acme-?corp$/i,
|
|
619
|
+
/^my-?app$/i,
|
|
620
|
+
/^example/i,
|
|
621
|
+
/^sample/i,
|
|
622
|
+
/^test-project/i,
|
|
623
|
+
/^demo/i,
|
|
624
|
+
/^placeholder/i,
|
|
625
|
+
/\{\{.*\}\}/, // Template placeholders
|
|
626
|
+
/,/, // Comma-separated
|
|
627
|
+
/[()]/, // Parentheses
|
|
628
|
+
/[←→❌✅]/, // Emoji indicators
|
|
629
|
+
];
|
|
630
|
+
return examplePatterns.some(p => p.test(projectId));
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
//# sourceMappingURL=project-resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-resolution.js","sourceRoot":"","sources":["../../../../src/core/project/project-resolution.ts"],"names":[],"mappings":"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"}
|