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
|
@@ -4,6 +4,11 @@ import {
|
|
|
4
4
|
isCustomStrategy
|
|
5
5
|
} from "../../../src/core/types/sync-profile.js";
|
|
6
6
|
import { execFileNoThrow } from "../../../src/utils/execFileNoThrow.js";
|
|
7
|
+
import { getGitHubAuthFromProject } from "../../../src/utils/auth-helpers.js";
|
|
8
|
+
function getGhEnv() {
|
|
9
|
+
const { token } = getGitHubAuthFromProject(process.cwd());
|
|
10
|
+
return token ? { ...process.env, GH_TOKEN: token } : process.env;
|
|
11
|
+
}
|
|
7
12
|
async function buildHierarchicalSearchQuery(containers) {
|
|
8
13
|
const parts = [];
|
|
9
14
|
for (const container of containers) {
|
|
@@ -150,7 +155,7 @@ async function executeSearch(query) {
|
|
|
150
155
|
"--limit",
|
|
151
156
|
"1000"
|
|
152
157
|
// Max results
|
|
153
|
-
]);
|
|
158
|
+
], { env: getGhEnv() });
|
|
154
159
|
if (result.status !== 0) {
|
|
155
160
|
throw new Error(`Failed to search issues: ${result.stderr || result.stdout}`);
|
|
156
161
|
}
|
|
@@ -19,6 +19,17 @@ import {
|
|
|
19
19
|
import { GitHubIssue } from './types.js';
|
|
20
20
|
import { getBoardNumbers } from './github-board-resolver.js';
|
|
21
21
|
import { execFileNoThrow } from '../../../src/utils/execFileNoThrow.js';
|
|
22
|
+
import { getGitHubAuthFromProject } from '../../../src/utils/auth-helpers.js';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Get environment object with GH_TOKEN for gh CLI commands.
|
|
26
|
+
*/
|
|
27
|
+
function getGhEnv(): NodeJS.ProcessEnv {
|
|
28
|
+
const { token } = getGitHubAuthFromProject(process.cwd());
|
|
29
|
+
return token
|
|
30
|
+
? { ...process.env, GH_TOKEN: token }
|
|
31
|
+
: process.env;
|
|
32
|
+
}
|
|
22
33
|
|
|
23
34
|
/**
|
|
24
35
|
* Build hierarchical GitHub search query from containers
|
|
@@ -304,7 +315,7 @@ async function executeSearch(query: string): Promise<GitHubIssue[]> {
|
|
|
304
315
|
'number,title,body,state,url,labels,milestone,repository',
|
|
305
316
|
'--limit',
|
|
306
317
|
'1000', // Max results
|
|
307
|
-
]);
|
|
318
|
+
], { env: getGhEnv() });
|
|
308
319
|
|
|
309
320
|
if (result.status !== 0) {
|
|
310
321
|
throw new Error(`Failed to search issues: ${result.stderr || result.stdout}`);
|
|
@@ -4,6 +4,11 @@ import * as fs from "fs/promises";
|
|
|
4
4
|
import * as path from "path";
|
|
5
5
|
import { IncrementIssueBuilder } from "./increment-issue-builder.js";
|
|
6
6
|
import { execFileNoThrow } from "../../../src/utils/execFileNoThrow.js";
|
|
7
|
+
import { getGitHubAuthFromProject } from "../../../src/utils/auth-helpers.js";
|
|
8
|
+
function getGhEnv() {
|
|
9
|
+
const { token } = getGitHubAuthFromProject(process.cwd());
|
|
10
|
+
return token ? { ...process.env, GH_TOKEN: token } : process.env;
|
|
11
|
+
}
|
|
7
12
|
async function loadGitHubConfig() {
|
|
8
13
|
const projectRoot = process.cwd();
|
|
9
14
|
const configPath = path.join(projectRoot, ".specweave/config.json");
|
|
@@ -117,7 +122,7 @@ async function createOrGetMilestone(owner, repo, featureId, title, existingMiles
|
|
|
117
122
|
`repos/${owner}/${repo}/milestones/${existingMilestone}`,
|
|
118
123
|
"--jq",
|
|
119
124
|
".number"
|
|
120
|
-
]);
|
|
125
|
+
], { env: getGhEnv() });
|
|
121
126
|
if (verifyResult.exitCode === 0) {
|
|
122
127
|
return {
|
|
123
128
|
number: existingMilestone,
|
|
@@ -130,7 +135,7 @@ async function createOrGetMilestone(owner, repo, featureId, title, existingMiles
|
|
|
130
135
|
`repos/${owner}/${repo}/milestones`,
|
|
131
136
|
"--jq",
|
|
132
137
|
`.[] | select(.title | contains("${featureId}")) | .number`
|
|
133
|
-
]);
|
|
138
|
+
], { env: getGhEnv() });
|
|
134
139
|
if (searchResult.exitCode === 0 && searchResult.stdout.trim()) {
|
|
135
140
|
const milestoneNumber2 = parseInt(searchResult.stdout.trim().split("\n")[0], 10);
|
|
136
141
|
return {
|
|
@@ -150,7 +155,7 @@ async function createOrGetMilestone(owner, repo, featureId, title, existingMiles
|
|
|
150
155
|
`description=Feature milestone for ${featureId}`,
|
|
151
156
|
"--jq",
|
|
152
157
|
".number"
|
|
153
|
-
]);
|
|
158
|
+
], { env: getGhEnv() });
|
|
154
159
|
if (createResult.exitCode !== 0) {
|
|
155
160
|
throw new Error(`Failed to create milestone: ${createResult.stderr || createResult.stdout}`);
|
|
156
161
|
}
|
|
@@ -163,14 +168,30 @@ async function createOrGetMilestone(owner, repo, featureId, title, existingMiles
|
|
|
163
168
|
function buildUserStoryIssueBody(story, tasks, incrementData, githubRepo) {
|
|
164
169
|
const incrementId = incrementData.frontmatter.increment;
|
|
165
170
|
let body = "";
|
|
166
|
-
|
|
171
|
+
const completedACs = story.acceptanceCriteria.filter((ac) => ac.completed).length;
|
|
172
|
+
const totalACs = story.acceptanceCriteria.length;
|
|
173
|
+
const storyTasks = tasks.filter(
|
|
174
|
+
(t) => t.userStories.includes(story.id) || t.userStories.some((us) => us.includes(story.id.replace("US-", "")))
|
|
175
|
+
);
|
|
176
|
+
const completedTasks = storyTasks.filter((t) => t.completed).length;
|
|
177
|
+
const totalTasks = storyTasks.length;
|
|
178
|
+
const overallPercentage = totalACs + totalTasks > 0 ? Math.round((completedACs + completedTasks) / (totalACs + totalTasks) * 100) : 0;
|
|
179
|
+
body += `## Progress
|
|
180
|
+
|
|
181
|
+
`;
|
|
182
|
+
body += `**Acceptance Criteria**: ${completedACs}/${totalACs} (${totalACs > 0 ? Math.round(completedACs / totalACs * 100) : 0}%)
|
|
167
183
|
`;
|
|
168
|
-
body += `**
|
|
184
|
+
body += `**Tasks**: ${completedTasks}/${totalTasks} (${totalTasks > 0 ? Math.round(completedTasks / totalTasks * 100) : 0}%)
|
|
169
185
|
`;
|
|
170
|
-
body += `**
|
|
186
|
+
body += `**Overall**: ${overallPercentage}%
|
|
187
|
+
|
|
171
188
|
`;
|
|
172
|
-
|
|
173
|
-
|
|
189
|
+
const filledBlocks = Math.floor(overallPercentage / 5);
|
|
190
|
+
const emptyBlocks = 20 - filledBlocks;
|
|
191
|
+
body += `${"\u2588".repeat(filledBlocks)}${"\u2591".repeat(emptyBlocks)} ${overallPercentage}%
|
|
192
|
+
|
|
193
|
+
`;
|
|
194
|
+
body += `---
|
|
174
195
|
|
|
175
196
|
`;
|
|
176
197
|
body += `## User Story
|
|
@@ -216,17 +237,14 @@ function buildUserStoryIssueBody(story, tasks, incrementData, githubRepo) {
|
|
|
216
237
|
body += `---
|
|
217
238
|
|
|
218
239
|
`;
|
|
219
|
-
const storyTasks = tasks.filter(
|
|
220
|
-
(t) => t.userStories.includes(story.id) || t.userStories.some((us) => us.includes(story.id.replace("US-", "")))
|
|
221
|
-
);
|
|
222
240
|
if (storyTasks.length > 0) {
|
|
223
241
|
body += `## Implementation Tasks
|
|
224
242
|
|
|
225
243
|
`;
|
|
226
|
-
const
|
|
227
|
-
const
|
|
228
|
-
const taskPercentage =
|
|
229
|
-
body += `Progress: ${
|
|
244
|
+
const completedTasks2 = storyTasks.filter((t) => t.completed).length;
|
|
245
|
+
const totalTasks2 = storyTasks.length;
|
|
246
|
+
const taskPercentage = totalTasks2 > 0 ? Math.round(completedTasks2 / totalTasks2 * 100) : 0;
|
|
247
|
+
body += `Progress: ${completedTasks2}/${totalTasks2} tasks (${taskPercentage}%)
|
|
230
248
|
|
|
231
249
|
`;
|
|
232
250
|
for (const task of storyTasks) {
|
|
@@ -268,7 +286,7 @@ async function syncUserStoryIssue(owner, repo, featureId, story, tasks, incremen
|
|
|
268
286
|
title,
|
|
269
287
|
"--body",
|
|
270
288
|
body
|
|
271
|
-
]);
|
|
289
|
+
], { env: getGhEnv() });
|
|
272
290
|
if (updateResult.exitCode !== 0) {
|
|
273
291
|
throw new Error(`Failed to update issue #${existingIssueNumber}: ${updateResult.stderr}`);
|
|
274
292
|
}
|
|
@@ -292,7 +310,7 @@ async function syncUserStoryIssue(owner, repo, featureId, story, tasks, incremen
|
|
|
292
310
|
if (labels.length > 0) {
|
|
293
311
|
createArgs.push("--label", labels.join(","));
|
|
294
312
|
}
|
|
295
|
-
const createResult = await execFileNoThrow("gh", createArgs);
|
|
313
|
+
const createResult = await execFileNoThrow("gh", createArgs, { env: getGhEnv() });
|
|
296
314
|
if (createResult.exitCode !== 0) {
|
|
297
315
|
throw new Error(`Failed to create issue: ${createResult.stderr || createResult.stdout}`);
|
|
298
316
|
}
|
|
@@ -23,6 +23,17 @@ import * as fs from 'fs/promises';
|
|
|
23
23
|
import * as path from 'path';
|
|
24
24
|
import { IncrementIssueBuilder, UserStory, Task, IncrementData } from './increment-issue-builder.js';
|
|
25
25
|
import { execFileNoThrow } from '../../../src/utils/execFileNoThrow.js';
|
|
26
|
+
import { getGitHubAuthFromProject } from '../../../src/utils/auth-helpers.js';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Get environment object with GH_TOKEN for gh CLI commands.
|
|
30
|
+
*/
|
|
31
|
+
function getGhEnv(): NodeJS.ProcessEnv {
|
|
32
|
+
const { token } = getGitHubAuthFromProject(process.cwd());
|
|
33
|
+
return token
|
|
34
|
+
? { ...process.env, GH_TOKEN: token }
|
|
35
|
+
: process.env;
|
|
36
|
+
}
|
|
26
37
|
|
|
27
38
|
interface GitHubConfig {
|
|
28
39
|
owner: string;
|
|
@@ -213,7 +224,7 @@ async function createOrGetMilestone(
|
|
|
213
224
|
const verifyResult = await execFileNoThrow('gh', [
|
|
214
225
|
'api', `repos/${owner}/${repo}/milestones/${existingMilestone}`,
|
|
215
226
|
'--jq', '.number'
|
|
216
|
-
]);
|
|
227
|
+
], { env: getGhEnv() });
|
|
217
228
|
if (verifyResult.exitCode === 0) {
|
|
218
229
|
return {
|
|
219
230
|
number: existingMilestone,
|
|
@@ -226,7 +237,7 @@ async function createOrGetMilestone(
|
|
|
226
237
|
const searchResult = await execFileNoThrow('gh', [
|
|
227
238
|
'api', `repos/${owner}/${repo}/milestones`,
|
|
228
239
|
'--jq', `.[] | select(.title | contains("${featureId}")) | .number`
|
|
229
|
-
]);
|
|
240
|
+
], { env: getGhEnv() });
|
|
230
241
|
|
|
231
242
|
if (searchResult.exitCode === 0 && searchResult.stdout.trim()) {
|
|
232
243
|
const milestoneNumber = parseInt(searchResult.stdout.trim().split('\n')[0], 10);
|
|
@@ -244,7 +255,7 @@ async function createOrGetMilestone(
|
|
|
244
255
|
'-f', `title=${milestoneTitle}`,
|
|
245
256
|
'-f', `description=Feature milestone for ${featureId}`,
|
|
246
257
|
'--jq', '.number'
|
|
247
|
-
]);
|
|
258
|
+
], { env: getGhEnv() });
|
|
248
259
|
|
|
249
260
|
if (createResult.exitCode !== 0) {
|
|
250
261
|
throw new Error(`Failed to create milestone: ${createResult.stderr || createResult.stdout}`);
|
|
@@ -269,12 +280,34 @@ function buildUserStoryIssueBody(
|
|
|
269
280
|
const incrementId = incrementData.frontmatter.increment;
|
|
270
281
|
let body = '';
|
|
271
282
|
|
|
272
|
-
//
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
283
|
+
// ❌ REMOVED: Metadata header (Feature, Status, Priority)
|
|
284
|
+
// WHY: GitHub has NATIVE fields for this (labels, milestones)
|
|
285
|
+
// Body should contain ONLY actual work content (ACs, tasks, user story)
|
|
286
|
+
// See: .specweave/docs/internal/troubleshooting/CRITICAL-remove-metadata-header-from-github-issues.md
|
|
276
287
|
|
|
277
|
-
|
|
288
|
+
// Progress section (consistency with user-story-issue-builder.ts)
|
|
289
|
+
const completedACs = story.acceptanceCriteria.filter(ac => ac.completed).length;
|
|
290
|
+
const totalACs = story.acceptanceCriteria.length;
|
|
291
|
+
const storyTasks = tasks.filter(t =>
|
|
292
|
+
t.userStories.includes(story.id) ||
|
|
293
|
+
t.userStories.some(us => us.includes(story.id.replace('US-', '')))
|
|
294
|
+
);
|
|
295
|
+
const completedTasks = storyTasks.filter(t => t.completed).length;
|
|
296
|
+
const totalTasks = storyTasks.length;
|
|
297
|
+
const overallPercentage = (totalACs + totalTasks) > 0
|
|
298
|
+
? Math.round(((completedACs + completedTasks) / (totalACs + totalTasks)) * 100)
|
|
299
|
+
: 0;
|
|
300
|
+
|
|
301
|
+
body += `## Progress\n\n`;
|
|
302
|
+
body += `**Acceptance Criteria**: ${completedACs}/${totalACs} (${totalACs > 0 ? Math.round((completedACs / totalACs) * 100) : 0}%)\n`;
|
|
303
|
+
body += `**Tasks**: ${completedTasks}/${totalTasks} (${totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0}%)\n`;
|
|
304
|
+
body += `**Overall**: ${overallPercentage}%\n\n`;
|
|
305
|
+
|
|
306
|
+
// Progress bar
|
|
307
|
+
const filledBlocks = Math.floor(overallPercentage / 5);
|
|
308
|
+
const emptyBlocks = 20 - filledBlocks;
|
|
309
|
+
body += `${'█'.repeat(filledBlocks)}${'░'.repeat(emptyBlocks)} ${overallPercentage}%\n\n`;
|
|
310
|
+
body += `---\n\n`;
|
|
278
311
|
|
|
279
312
|
// User Story description
|
|
280
313
|
body += `## User Story\n\n`;
|
|
@@ -307,12 +340,7 @@ function buildUserStoryIssueBody(
|
|
|
307
340
|
|
|
308
341
|
body += `---\n\n`;
|
|
309
342
|
|
|
310
|
-
// Tasks for this user story
|
|
311
|
-
const storyTasks = tasks.filter(t =>
|
|
312
|
-
t.userStories.includes(story.id) ||
|
|
313
|
-
t.userStories.some(us => us.includes(story.id.replace('US-', '')))
|
|
314
|
-
);
|
|
315
|
-
|
|
343
|
+
// Tasks for this user story (already calculated above for Progress section)
|
|
316
344
|
if (storyTasks.length > 0) {
|
|
317
345
|
body += `## Implementation Tasks\n\n`;
|
|
318
346
|
const completedTasks = storyTasks.filter(t => t.completed).length;
|
|
@@ -369,7 +397,7 @@ async function syncUserStoryIssue(
|
|
|
369
397
|
'--repo', `${owner}/${repo}`,
|
|
370
398
|
'--title', title,
|
|
371
399
|
'--body', body
|
|
372
|
-
]);
|
|
400
|
+
], { env: getGhEnv() });
|
|
373
401
|
|
|
374
402
|
if (updateResult.exitCode !== 0) {
|
|
375
403
|
throw new Error(`Failed to update issue #${existingIssueNumber}: ${updateResult.stderr}`);
|
|
@@ -394,7 +422,7 @@ async function syncUserStoryIssue(
|
|
|
394
422
|
createArgs.push('--label', labels.join(','));
|
|
395
423
|
}
|
|
396
424
|
|
|
397
|
-
const createResult = await execFileNoThrow('gh', createArgs);
|
|
425
|
+
const createResult = await execFileNoThrow('gh', createArgs, { env: getGhEnv() });
|
|
398
426
|
|
|
399
427
|
if (createResult.exitCode !== 0) {
|
|
400
428
|
throw new Error(`Failed to create issue: ${createResult.stderr || createResult.stdout}`);
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import * as fs from "../../../src/utils/fs-native.js";
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { execFileNoThrow } from "../../../src/utils/execFileNoThrow.js";
|
|
4
|
+
import { getGitHubAuthFromProject } from "../../../src/utils/auth-helpers.js";
|
|
5
|
+
function getGhEnv() {
|
|
6
|
+
const { token } = getGitHubAuthFromProject(process.cwd());
|
|
7
|
+
return token ? { ...process.env, GH_TOKEN: token } : process.env;
|
|
8
|
+
}
|
|
4
9
|
async function updateIssueLivingDocs(issueNumber, livingDocs, owner, repo) {
|
|
5
10
|
console.log(`\u{1F4DD} Updating GitHub issue #${issueNumber} with living docs...`);
|
|
6
11
|
const currentBody = await getIssueBody(issueNumber, owner, repo);
|
|
@@ -166,7 +171,7 @@ async function getIssueBody(issueNumber, owner, repo) {
|
|
|
166
171
|
"body",
|
|
167
172
|
"-q",
|
|
168
173
|
".body"
|
|
169
|
-
]);
|
|
174
|
+
], { env: getGhEnv() });
|
|
170
175
|
if (result.exitCode !== 0) {
|
|
171
176
|
throw new Error(`Failed to get issue body: ${result.stderr}`);
|
|
172
177
|
}
|
|
@@ -181,7 +186,7 @@ async function updateIssueBody(issueNumber, body, owner, repo) {
|
|
|
181
186
|
`${owner}/${repo}`,
|
|
182
187
|
"--body",
|
|
183
188
|
body
|
|
184
|
-
]);
|
|
189
|
+
], { env: getGhEnv() });
|
|
185
190
|
if (result.exitCode !== 0) {
|
|
186
191
|
throw new Error(`Failed to update issue body: ${result.stderr}`);
|
|
187
192
|
}
|
|
@@ -195,7 +200,7 @@ async function postComment(issueNumber, comment, owner, repo) {
|
|
|
195
200
|
`${owner}/${repo}`,
|
|
196
201
|
"--body",
|
|
197
202
|
comment
|
|
198
|
-
]);
|
|
203
|
+
], { env: getGhEnv() });
|
|
199
204
|
if (result.exitCode !== 0) {
|
|
200
205
|
throw new Error(`Failed to post comment: ${result.stderr}`);
|
|
201
206
|
}
|
|
@@ -10,6 +10,19 @@
|
|
|
10
10
|
import * as fs from '../../../src/utils/fs-native.js';
|
|
11
11
|
import path from 'path';
|
|
12
12
|
import { execFileNoThrow } from '../../../src/utils/execFileNoThrow.js';
|
|
13
|
+
import { getGitHubAuthFromProject } from '../../../src/utils/auth-helpers.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Get environment object with GH_TOKEN for gh CLI commands.
|
|
17
|
+
* This ensures the token from .env is passed to all gh operations,
|
|
18
|
+
* regardless of `gh auth` status.
|
|
19
|
+
*/
|
|
20
|
+
function getGhEnv(): NodeJS.ProcessEnv {
|
|
21
|
+
const { token } = getGitHubAuthFromProject(process.cwd());
|
|
22
|
+
return token
|
|
23
|
+
? { ...process.env, GH_TOKEN: token }
|
|
24
|
+
: process.env;
|
|
25
|
+
}
|
|
13
26
|
|
|
14
27
|
export interface LivingDocsSection {
|
|
15
28
|
specs: string[];
|
|
@@ -296,7 +309,7 @@ async function getIssueBody(
|
|
|
296
309
|
'body',
|
|
297
310
|
'-q',
|
|
298
311
|
'.body'
|
|
299
|
-
]);
|
|
312
|
+
], { env: getGhEnv() });
|
|
300
313
|
|
|
301
314
|
if (result.exitCode !== 0) {
|
|
302
315
|
throw new Error(`Failed to get issue body: ${result.stderr}`);
|
|
@@ -322,7 +335,7 @@ async function updateIssueBody(
|
|
|
322
335
|
`${owner}/${repo}`,
|
|
323
336
|
'--body',
|
|
324
337
|
body
|
|
325
|
-
]);
|
|
338
|
+
], { env: getGhEnv() });
|
|
326
339
|
|
|
327
340
|
if (result.exitCode !== 0) {
|
|
328
341
|
throw new Error(`Failed to update issue body: ${result.stderr}`);
|
|
@@ -346,7 +359,7 @@ async function postComment(
|
|
|
346
359
|
`${owner}/${repo}`,
|
|
347
360
|
'--body',
|
|
348
361
|
comment
|
|
349
|
-
]);
|
|
362
|
+
], { env: getGhEnv() });
|
|
350
363
|
|
|
351
364
|
if (result.exitCode !== 0) {
|
|
352
365
|
throw new Error(`Failed to post comment: ${result.stderr}`);
|
|
@@ -2,11 +2,21 @@ import { SpecMetadataManager } from "../../../src/core/specs/spec-metadata-manag
|
|
|
2
2
|
import { SpecParser } from "../../../src/core/specs/spec-parser.js";
|
|
3
3
|
import { execFileNoThrow } from "../../../src/utils/execFileNoThrow.js";
|
|
4
4
|
import { ProjectContextManager } from "../../../src/core/sync/project-context.js";
|
|
5
|
+
import { getGitHubAuthFromProject } from "../../../src/utils/auth-helpers.js";
|
|
5
6
|
class GitHubSpecSync {
|
|
6
7
|
constructor(projectRoot = process.cwd()) {
|
|
7
8
|
this.projectRoot = projectRoot;
|
|
8
9
|
this.specManager = new SpecMetadataManager(projectRoot);
|
|
9
10
|
this.projectContextManager = new ProjectContextManager(projectRoot);
|
|
11
|
+
this.token = getGitHubAuthFromProject(projectRoot).token;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get environment object with GH_TOKEN for gh CLI commands.
|
|
15
|
+
* This ensures the token from .env is passed to all gh operations,
|
|
16
|
+
* regardless of `gh auth` status.
|
|
17
|
+
*/
|
|
18
|
+
getGhEnv() {
|
|
19
|
+
return this.token ? { ...process.env, GH_TOKEN: this.token } : process.env;
|
|
10
20
|
}
|
|
11
21
|
/**
|
|
12
22
|
* Detect project from spec file path
|
|
@@ -408,7 +418,7 @@ ${acList}
|
|
|
408
418
|
"-f",
|
|
409
419
|
`query=${query}`,
|
|
410
420
|
...Object.entries(variables).flatMap(([key, value]) => ["-F", `${key}=${value}`])
|
|
411
|
-
]);
|
|
421
|
+
], { env: this.getGhEnv() });
|
|
412
422
|
if (result.error) {
|
|
413
423
|
throw new Error(`GraphQL query failed: ${result.error}`);
|
|
414
424
|
}
|
|
@@ -457,7 +467,7 @@ ${acList}
|
|
|
457
467
|
"number,title,body,state,labels",
|
|
458
468
|
"--limit",
|
|
459
469
|
"1"
|
|
460
|
-
]);
|
|
470
|
+
], { env: this.getGhEnv() });
|
|
461
471
|
if (result.error || !result.stdout) {
|
|
462
472
|
return null;
|
|
463
473
|
}
|
|
@@ -481,7 +491,7 @@ ${acList}
|
|
|
481
491
|
issue.labels.join(","),
|
|
482
492
|
"--json",
|
|
483
493
|
"number,title,body,state"
|
|
484
|
-
]);
|
|
494
|
+
], { env: this.getGhEnv() });
|
|
485
495
|
if (result.error) {
|
|
486
496
|
throw new Error(`Failed to create issue: ${result.error}`);
|
|
487
497
|
}
|
|
@@ -503,7 +513,7 @@ ${acList}
|
|
|
503
513
|
} else if (updates.state === "open") {
|
|
504
514
|
args.push("--state", "open");
|
|
505
515
|
}
|
|
506
|
-
const result = await execFileNoThrow("gh", args);
|
|
516
|
+
const result = await execFileNoThrow("gh", args, { env: this.getGhEnv() });
|
|
507
517
|
if (result.error) {
|
|
508
518
|
throw new Error(`Failed to update issue #${issueNumber}: ${result.error}`);
|
|
509
519
|
}
|
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
import { execFileNoThrow } from '../../../src/utils/execFileNoThrow.js';
|
|
38
38
|
import { ProjectContextManager } from '../../../src/core/sync/project-context.js';
|
|
39
39
|
import { SyncProfile, GitHubConfig } from '../../../src/core/types/sync-profile.js';
|
|
40
|
+
import { getGitHubAuthFromProject } from '../../../src/utils/auth-helpers.js';
|
|
40
41
|
|
|
41
42
|
export interface GitHubProject {
|
|
42
43
|
id: number;
|
|
@@ -89,11 +90,25 @@ export class GitHubSpecSync {
|
|
|
89
90
|
private specManager: SpecMetadataManager;
|
|
90
91
|
private projectContextManager: ProjectContextManager;
|
|
91
92
|
private projectRoot: string;
|
|
93
|
+
private token?: string;
|
|
92
94
|
|
|
93
95
|
constructor(projectRoot: string = process.cwd()) {
|
|
94
96
|
this.projectRoot = projectRoot;
|
|
95
97
|
this.specManager = new SpecMetadataManager(projectRoot);
|
|
96
98
|
this.projectContextManager = new ProjectContextManager(projectRoot);
|
|
99
|
+
// Get token from .env for gh CLI passthrough
|
|
100
|
+
this.token = getGitHubAuthFromProject(projectRoot).token;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Get environment object with GH_TOKEN for gh CLI commands.
|
|
105
|
+
* This ensures the token from .env is passed to all gh operations,
|
|
106
|
+
* regardless of `gh auth` status.
|
|
107
|
+
*/
|
|
108
|
+
private getGhEnv(): NodeJS.ProcessEnv {
|
|
109
|
+
return this.token
|
|
110
|
+
? { ...process.env, GH_TOKEN: this.token }
|
|
111
|
+
: process.env;
|
|
97
112
|
}
|
|
98
113
|
|
|
99
114
|
/**
|
|
@@ -618,7 +633,7 @@ ${acList}
|
|
|
618
633
|
'-f',
|
|
619
634
|
`query=${query}`,
|
|
620
635
|
...Object.entries(variables).flatMap(([key, value]) => ['-F', `${key}=${value}`])
|
|
621
|
-
]);
|
|
636
|
+
], { env: this.getGhEnv() });
|
|
622
637
|
|
|
623
638
|
if (result.error) {
|
|
624
639
|
throw new Error(`GraphQL query failed: ${result.error}`);
|
|
@@ -682,7 +697,7 @@ ${acList}
|
|
|
682
697
|
'number,title,body,state,labels',
|
|
683
698
|
'--limit',
|
|
684
699
|
'1'
|
|
685
|
-
]);
|
|
700
|
+
], { env: this.getGhEnv() });
|
|
686
701
|
|
|
687
702
|
if (result.error || !result.stdout) {
|
|
688
703
|
return null;
|
|
@@ -713,7 +728,7 @@ ${acList}
|
|
|
713
728
|
issue.labels.join(','),
|
|
714
729
|
'--json',
|
|
715
730
|
'number,title,body,state'
|
|
716
|
-
]);
|
|
731
|
+
], { env: this.getGhEnv() });
|
|
717
732
|
|
|
718
733
|
if (result.error) {
|
|
719
734
|
throw new Error(`Failed to create issue: ${result.error}`);
|
|
@@ -747,7 +762,7 @@ ${acList}
|
|
|
747
762
|
args.push('--state', 'open');
|
|
748
763
|
}
|
|
749
764
|
|
|
750
|
-
const result = await execFileNoThrow('gh', args);
|
|
765
|
+
const result = await execFileNoThrow('gh', args, { env: this.getGhEnv() });
|
|
751
766
|
|
|
752
767
|
if (result.error) {
|
|
753
768
|
throw new Error(`Failed to update issue #${issueNumber}: ${result.error}`);
|
|
@@ -5,6 +5,11 @@ import {
|
|
|
5
5
|
loadIncrementMetadata,
|
|
6
6
|
detectRepo
|
|
7
7
|
} from "./github-issue-updater.js";
|
|
8
|
+
import { getGitHubAuthFromProject } from "../../../src/utils/auth-helpers.js";
|
|
9
|
+
function getGhEnv() {
|
|
10
|
+
const { token } = getGitHubAuthFromProject(process.cwd());
|
|
11
|
+
return token ? { ...process.env, GH_TOKEN: token } : process.env;
|
|
12
|
+
}
|
|
8
13
|
async function syncFromGitHub(incrementId) {
|
|
9
14
|
console.log(`
|
|
10
15
|
\u{1F504} Syncing from GitHub for increment: ${incrementId}`);
|
|
@@ -47,7 +52,7 @@ async function fetchGitHubIssueState(issueNumber, owner, repo) {
|
|
|
47
52
|
`${owner}/${repo}`,
|
|
48
53
|
"--json",
|
|
49
54
|
"number,title,body,state,labels,assignees,milestone,updatedAt"
|
|
50
|
-
]);
|
|
55
|
+
], { env: getGhEnv() });
|
|
51
56
|
if (issueResult.exitCode !== 0) {
|
|
52
57
|
throw new Error(`Failed to fetch issue: ${issueResult.stderr}`);
|
|
53
58
|
}
|
|
@@ -57,7 +62,7 @@ async function fetchGitHubIssueState(issueNumber, owner, repo) {
|
|
|
57
62
|
`repos/${owner}/${repo}/issues/${issueNumber}/comments`,
|
|
58
63
|
"--jq",
|
|
59
64
|
".[] | {id: .id, author: .user.login, body: .body, created_at: .created_at}"
|
|
60
|
-
]);
|
|
65
|
+
], { env: getGhEnv() });
|
|
61
66
|
let comments = [];
|
|
62
67
|
if (commentsResult.exitCode === 0 && commentsResult.stdout.trim()) {
|
|
63
68
|
const commentLines = commentsResult.stdout.trim().split("\n");
|
|
@@ -108,7 +113,7 @@ async function resolveStatusConflict(incrementId, metadata, githubState) {
|
|
|
108
113
|
if (githubStatus === "closed" && specweaveStatus === "active") {
|
|
109
114
|
console.log(`
|
|
110
115
|
\u26A0\uFE0F **CONFLICT**: GitHub issue closed but SpecWeave increment still active!`);
|
|
111
|
-
console.log(` Recommendation: Run /
|
|
116
|
+
console.log(` Recommendation: Run /sw:done ${incrementId} to close increment`);
|
|
112
117
|
console.log(` Or reopen issue on GitHub if work is not complete`);
|
|
113
118
|
}
|
|
114
119
|
if (githubStatus === "open" && specweaveStatus === "completed") {
|
|
@@ -24,6 +24,17 @@ import {
|
|
|
24
24
|
IncrementMetadata,
|
|
25
25
|
detectRepo
|
|
26
26
|
} from './github-issue-updater.js';
|
|
27
|
+
import { getGitHubAuthFromProject } from '../../../src/utils/auth-helpers.js';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Get environment object with GH_TOKEN for gh CLI commands.
|
|
31
|
+
*/
|
|
32
|
+
function getGhEnv(): NodeJS.ProcessEnv {
|
|
33
|
+
const { token } = getGitHubAuthFromProject(process.cwd());
|
|
34
|
+
return token
|
|
35
|
+
? { ...process.env, GH_TOKEN: token }
|
|
36
|
+
: process.env;
|
|
37
|
+
}
|
|
27
38
|
|
|
28
39
|
export interface GitHubIssueState {
|
|
29
40
|
number: number;
|
|
@@ -124,7 +135,7 @@ async function fetchGitHubIssueState(
|
|
|
124
135
|
`${owner}/${repo}`,
|
|
125
136
|
'--json',
|
|
126
137
|
'number,title,body,state,labels,assignees,milestone,updatedAt'
|
|
127
|
-
]);
|
|
138
|
+
], { env: getGhEnv() });
|
|
128
139
|
|
|
129
140
|
if (issueResult.exitCode !== 0) {
|
|
130
141
|
throw new Error(`Failed to fetch issue: ${issueResult.stderr}`);
|
|
@@ -138,7 +149,7 @@ async function fetchGitHubIssueState(
|
|
|
138
149
|
`repos/${owner}/${repo}/issues/${issueNumber}/comments`,
|
|
139
150
|
'--jq',
|
|
140
151
|
'.[] | {id: .id, author: .user.login, body: .body, created_at: .created_at}'
|
|
141
|
-
]);
|
|
152
|
+
], { env: getGhEnv() });
|
|
142
153
|
|
|
143
154
|
let comments: GitHubComment[] = [];
|
|
144
155
|
if (commentsResult.exitCode === 0 && commentsResult.stdout.trim()) {
|
|
@@ -222,7 +233,7 @@ async function resolveStatusConflict(
|
|
|
222
233
|
// GitHub closed but SpecWeave active
|
|
223
234
|
if (githubStatus === 'closed' && specweaveStatus === 'active') {
|
|
224
235
|
console.log(`\n⚠️ **CONFLICT**: GitHub issue closed but SpecWeave increment still active!`);
|
|
225
|
-
console.log(` Recommendation: Run /
|
|
236
|
+
console.log(` Recommendation: Run /sw:done ${incrementId} to close increment`);
|
|
226
237
|
console.log(` Or reopen issue on GitHub if work is not complete`);
|
|
227
238
|
}
|
|
228
239
|
|
|
@@ -7,6 +7,11 @@ import {
|
|
|
7
7
|
postScopeChangeComment
|
|
8
8
|
} from "./github-issue-updater.js";
|
|
9
9
|
import { execFileNoThrow } from "../../../src/utils/execFileNoThrow.js";
|
|
10
|
+
import { getGitHubAuthFromProject } from "../../../src/utils/auth-helpers.js";
|
|
11
|
+
function getGhEnv() {
|
|
12
|
+
const { token } = getGitHubAuthFromProject(process.cwd());
|
|
13
|
+
return token ? { ...process.env, GH_TOKEN: token } : process.env;
|
|
14
|
+
}
|
|
10
15
|
async function syncIncrementChanges(incrementId, changedFile) {
|
|
11
16
|
console.log(`
|
|
12
17
|
\u{1F504} Syncing ${changedFile} changes to GitHub...`);
|
|
@@ -181,7 +186,7 @@ async function updateIssueTitle(issueNumber, title, owner, repo) {
|
|
|
181
186
|
`${owner}/${repo}`,
|
|
182
187
|
"--title",
|
|
183
188
|
title
|
|
184
|
-
]);
|
|
189
|
+
], { env: getGhEnv() });
|
|
185
190
|
if (result.exitCode !== 0) {
|
|
186
191
|
console.warn(`\u26A0\uFE0F Could not update issue title: ${result.stderr}`);
|
|
187
192
|
}
|
|
@@ -197,7 +202,7 @@ async function updateIssueTaskChecklist(issueNumber, tasks, owner, repo) {
|
|
|
197
202
|
"body",
|
|
198
203
|
"-q",
|
|
199
204
|
".body"
|
|
200
|
-
]);
|
|
205
|
+
], { env: getGhEnv() });
|
|
201
206
|
if (result.exitCode !== 0) {
|
|
202
207
|
throw new Error(`Failed to get issue body: ${result.stderr}`);
|
|
203
208
|
}
|
|
@@ -224,7 +229,7 @@ ${taskChecklist}
|
|
|
224
229
|
`${owner}/${repo}`,
|
|
225
230
|
"--body",
|
|
226
231
|
updatedBody
|
|
227
|
-
]);
|
|
232
|
+
], { env: getGhEnv() });
|
|
228
233
|
if (updateResult.exitCode !== 0) {
|
|
229
234
|
throw new Error(`Failed to update issue body: ${updateResult.stderr}`);
|
|
230
235
|
}
|
|
@@ -238,7 +243,7 @@ async function postComment(issueNumber, comment, owner, repo) {
|
|
|
238
243
|
`${owner}/${repo}`,
|
|
239
244
|
"--body",
|
|
240
245
|
comment
|
|
241
|
-
]);
|
|
246
|
+
], { env: getGhEnv() });
|
|
242
247
|
if (result.exitCode !== 0) {
|
|
243
248
|
throw new Error(`Failed to post comment: ${result.stderr}`);
|
|
244
249
|
}
|
|
@@ -16,6 +16,17 @@ import {
|
|
|
16
16
|
postScopeChangeComment
|
|
17
17
|
} from './github-issue-updater.js';
|
|
18
18
|
import { execFileNoThrow } from '../../../src/utils/execFileNoThrow.js';
|
|
19
|
+
import { getGitHubAuthFromProject } from '../../../src/utils/auth-helpers.js';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Get environment object with GH_TOKEN for gh CLI commands.
|
|
23
|
+
*/
|
|
24
|
+
function getGhEnv(): NodeJS.ProcessEnv {
|
|
25
|
+
const { token } = getGitHubAuthFromProject(process.cwd());
|
|
26
|
+
return token
|
|
27
|
+
? { ...process.env, GH_TOKEN: token }
|
|
28
|
+
: process.env;
|
|
29
|
+
}
|
|
19
30
|
|
|
20
31
|
export interface SpecChanges {
|
|
21
32
|
added: string[];
|
|
@@ -289,7 +300,7 @@ async function updateIssueTitle(
|
|
|
289
300
|
`${owner}/${repo}`,
|
|
290
301
|
'--title',
|
|
291
302
|
title
|
|
292
|
-
]);
|
|
303
|
+
], { env: getGhEnv() });
|
|
293
304
|
|
|
294
305
|
if (result.exitCode !== 0) {
|
|
295
306
|
console.warn(`⚠️ Could not update issue title: ${result.stderr}`);
|
|
@@ -316,7 +327,7 @@ async function updateIssueTaskChecklist(
|
|
|
316
327
|
'body',
|
|
317
328
|
'-q',
|
|
318
329
|
'.body'
|
|
319
|
-
]);
|
|
330
|
+
], { env: getGhEnv() });
|
|
320
331
|
|
|
321
332
|
if (result.exitCode !== 0) {
|
|
322
333
|
throw new Error(`Failed to get issue body: ${result.stderr}`);
|
|
@@ -348,7 +359,7 @@ async function updateIssueTaskChecklist(
|
|
|
348
359
|
`${owner}/${repo}`,
|
|
349
360
|
'--body',
|
|
350
361
|
updatedBody
|
|
351
|
-
]);
|
|
362
|
+
], { env: getGhEnv() });
|
|
352
363
|
|
|
353
364
|
if (updateResult.exitCode !== 0) {
|
|
354
365
|
throw new Error(`Failed to update issue body: ${updateResult.stderr}`);
|
|
@@ -372,7 +383,7 @@ async function postComment(
|
|
|
372
383
|
`${owner}/${repo}`,
|
|
373
384
|
'--body',
|
|
374
385
|
comment
|
|
375
|
-
]);
|
|
386
|
+
], { env: getGhEnv() });
|
|
376
387
|
|
|
377
388
|
if (result.exitCode !== 0) {
|
|
378
389
|
throw new Error(`Failed to post comment: ${result.stderr}`);
|