specweave 0.33.4 → 0.33.6
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 +445 -80
- 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/jobs.js +19 -2
- package/dist/src/cli/commands/jobs.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 +19 -3
- 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-grouping.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/external-import-grouping.js +11 -7
- package/dist/src/cli/helpers/init/external-import-grouping.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/clone-worker.js +22 -5
- package/dist/src/cli/workers/clone-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-dependency.d.ts.map +1 -1
- package/dist/src/core/background/job-dependency.js +1 -0
- package/dist/src/core/background/job-dependency.js.map +1 -1
- package/dist/src/core/background/job-launcher.d.ts +1 -1
- package/dist/src/core/background/job-launcher.js +5 -5
- package/dist/src/core/background/job-launcher.js.map +1 -1
- package/dist/src/core/background/job-manager.d.ts +8 -0
- package/dist/src/core/background/job-manager.d.ts.map +1 -1
- package/dist/src/core/background/job-manager.js +19 -1
- package/dist/src/core/background/job-manager.js.map +1 -1
- package/dist/src/core/background/types.d.ts +9 -1
- package/dist/src/core/background/types.d.ts.map +1 -1
- package/dist/src/core/background/types.js +8 -1
- package/dist/src/core/background/types.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/external-importer.d.ts +26 -5
- package/dist/src/importers/external-importer.d.ts.map +1 -1
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +19 -2
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/importers/jira-importer.d.ts.map +1 -1
- package/dist/src/importers/jira-importer.js +15 -1
- package/dist/src/importers/jira-importer.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/living-docs/smart-doc-organizer.js +1 -1
- package/dist/src/living-docs/smart-doc-organizer.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/config-generator.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/config-generator.js +4 -0
- package/dist/src/utils/docs-preview/config-generator.js.map +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.d.ts +8 -6
- package/dist/src/utils/notification-constants.d.ts.map +1 -1
- package/dist/src/utils/notification-constants.js +10 -8
- package/dist/src/utils/notification-constants.js.map +1 -1
- package/dist/src/utils/notification-manager.d.ts +36 -3
- package/dist/src/utils/notification-manager.d.ts.map +1 -1
- package/dist/src/utils/notification-manager.js +80 -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/judge-llm.md +296 -0
- 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 +41 -1
- 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 +87 -0
- package/plugins/specweave/hooks/v2/guards/metadata-json-guard.test.sh +302 -0
- package/plugins/specweave/hooks/v2/guards/per-us-project-validator.sh +72 -18
- package/plugins/specweave/hooks/v2/guards/per-us-project-validator.test.sh +406 -0
- 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 +14 -8
- 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 +9 -9
- 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 +391 -0
- package/plugins/specweave-docs/skills/preview/SKILL.md +60 -21
- 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 +73 -77
- package/src/templates/CLAUDE.md.template +23 -19
- 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/commands/specweave-judge.md +0 -276
- 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-docs/commands/preview.md +0 -274
- /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
|
@@ -19,6 +19,7 @@ import { UserStoryIssueBuilder } from './user-story-issue-builder.js';
|
|
|
19
19
|
import { CompletionCalculator } from './completion-calculator.js';
|
|
20
20
|
import { DuplicateDetector } from './duplicate-detector.js';
|
|
21
21
|
import { execFileNoThrow } from '../../../src/utils/execFileNoThrow.js';
|
|
22
|
+
import { getGitHubAuthFromProject } from '../../../src/utils/auth-helpers.js';
|
|
22
23
|
|
|
23
24
|
interface FeatureFrontmatter {
|
|
24
25
|
id: string;
|
|
@@ -51,6 +52,7 @@ export class GitHubFeatureSync {
|
|
|
51
52
|
private specsDir: string;
|
|
52
53
|
private projectRoot: string;
|
|
53
54
|
private calculator: CompletionCalculator;
|
|
55
|
+
private token?: string;
|
|
54
56
|
|
|
55
57
|
// SYNC LOCK: Prevent concurrent syncs of the same feature
|
|
56
58
|
// Maps featureId → last sync timestamp
|
|
@@ -62,6 +64,19 @@ export class GitHubFeatureSync {
|
|
|
62
64
|
this.specsDir = specsDir;
|
|
63
65
|
this.projectRoot = projectRoot;
|
|
64
66
|
this.calculator = new CompletionCalculator(projectRoot);
|
|
67
|
+
// Get token from .env for gh CLI passthrough
|
|
68
|
+
this.token = getGitHubAuthFromProject(projectRoot).token;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Get environment object with GH_TOKEN for gh CLI commands.
|
|
73
|
+
* This ensures the token from .env is passed to all gh operations,
|
|
74
|
+
* regardless of `gh auth` status.
|
|
75
|
+
*/
|
|
76
|
+
private getGhEnv(): NodeJS.ProcessEnv {
|
|
77
|
+
return this.token
|
|
78
|
+
? { ...process.env, GH_TOKEN: this.token }
|
|
79
|
+
: process.env;
|
|
65
80
|
}
|
|
66
81
|
|
|
67
82
|
/**
|
|
@@ -393,7 +408,7 @@ export class GitHubFeatureSync {
|
|
|
393
408
|
'repos/:owner/:repo/milestones',
|
|
394
409
|
'--jq',
|
|
395
410
|
`.[] | select(.title == "${title}") | {number, html_url}`,
|
|
396
|
-
]);
|
|
411
|
+
], { env: this.getGhEnv() });
|
|
397
412
|
|
|
398
413
|
// DEBUG: Log detection result
|
|
399
414
|
console.log(` 🔍 Milestone detection: exitCode=${existingResult.exitCode}, stdout length=${existingResult.stdout.length}`);
|
|
@@ -426,7 +441,7 @@ export class GitHubFeatureSync {
|
|
|
426
441
|
`description=${description}`,
|
|
427
442
|
'-f',
|
|
428
443
|
'state=open',
|
|
429
|
-
]);
|
|
444
|
+
], { env: this.getGhEnv() });
|
|
430
445
|
|
|
431
446
|
if (result.exitCode !== 0) {
|
|
432
447
|
throw new Error(`Failed to create Milestone: ${result.stderr || result.stdout}`);
|
|
@@ -467,7 +482,7 @@ export class GitHubFeatureSync {
|
|
|
467
482
|
'--milestone',
|
|
468
483
|
milestoneTitle,
|
|
469
484
|
...issueContent.labels.flatMap((label) => ['--label', label]),
|
|
470
|
-
]);
|
|
485
|
+
], { env: this.getGhEnv() });
|
|
471
486
|
|
|
472
487
|
if (result.exitCode !== 0) {
|
|
473
488
|
throw new Error(`Failed to create GitHub Issue: ${result.stderr || result.stdout}`);
|
|
@@ -493,7 +508,7 @@ export class GitHubFeatureSync {
|
|
|
493
508
|
issueNumber.toString(),
|
|
494
509
|
'--comment',
|
|
495
510
|
this.calculator.buildCompletionComment(completion),
|
|
496
|
-
]);
|
|
511
|
+
], { env: this.getGhEnv() });
|
|
497
512
|
console.log(
|
|
498
513
|
` ✅ Created and verified complete: ${completion.acsCompleted}/${completion.acsTotal} ACs, ${completion.tasksCompleted}/${completion.tasksTotal} tasks`
|
|
499
514
|
);
|
|
@@ -535,7 +550,7 @@ export class GitHubFeatureSync {
|
|
|
535
550
|
issueContent.title,
|
|
536
551
|
'--body',
|
|
537
552
|
issueContent.body,
|
|
538
|
-
]);
|
|
553
|
+
], { env: this.getGhEnv() });
|
|
539
554
|
|
|
540
555
|
// ✅ VERIFICATION GATE: Calculate ACTUAL completion from checkboxes
|
|
541
556
|
const completion = await this.calculator.calculateCompletion(userStoryPath);
|
|
@@ -554,7 +569,7 @@ export class GitHubFeatureSync {
|
|
|
554
569
|
issueNumber.toString(),
|
|
555
570
|
'--comment',
|
|
556
571
|
this.calculator.buildCompletionComment(completion),
|
|
557
|
-
]);
|
|
572
|
+
], { env: this.getGhEnv() });
|
|
558
573
|
console.log(
|
|
559
574
|
` ✅ Verified complete: ${completion.acsCompleted}/${completion.acsTotal} ACs, ${completion.tasksCompleted}/${completion.tasksTotal} tasks`
|
|
560
575
|
);
|
|
@@ -569,7 +584,7 @@ export class GitHubFeatureSync {
|
|
|
569
584
|
issueNumber.toString(),
|
|
570
585
|
'--comment',
|
|
571
586
|
this.calculator.buildReopenComment(completion, 'Work verification failed'),
|
|
572
|
-
]);
|
|
587
|
+
], { env: this.getGhEnv() });
|
|
573
588
|
console.log(
|
|
574
589
|
` ⚠️ Reopened: ${completion.blockingAcs.length + completion.blockingTasks.length} items incomplete`
|
|
575
590
|
);
|
|
@@ -597,6 +612,9 @@ export class GitHubFeatureSync {
|
|
|
597
612
|
overallComplete: boolean;
|
|
598
613
|
acsPercentage: number;
|
|
599
614
|
tasksPercentage: number;
|
|
615
|
+
acsTotal?: number;
|
|
616
|
+
tasksTotal?: number;
|
|
617
|
+
frontmatterStatus?: string;
|
|
600
618
|
}
|
|
601
619
|
): Promise<void> {
|
|
602
620
|
try {
|
|
@@ -615,6 +633,29 @@ export class GitHubFeatureSync {
|
|
|
615
633
|
newStatusLabel = 'status:complete'; // Repository uses "complete" not "completed"
|
|
616
634
|
} else if (completion.acsPercentage > 0 || completion.tasksPercentage > 0) {
|
|
617
635
|
newStatusLabel = 'status:active'; // Repository uses "active" not "in-progress"
|
|
636
|
+
} else if (
|
|
637
|
+
// v0.35.1 FIX: For external-origin USs without ACs/tasks, use frontmatter status
|
|
638
|
+
// This fixes issue #889 where external USs always showed "not_started"
|
|
639
|
+
(completion.acsTotal === 0 || completion.acsTotal === undefined) &&
|
|
640
|
+
(completion.tasksTotal === 0 || completion.tasksTotal === undefined) &&
|
|
641
|
+
completion.frontmatterStatus
|
|
642
|
+
) {
|
|
643
|
+
// Map frontmatter status to GitHub label
|
|
644
|
+
switch (completion.frontmatterStatus) {
|
|
645
|
+
case 'complete':
|
|
646
|
+
case 'completed':
|
|
647
|
+
newStatusLabel = 'status:complete';
|
|
648
|
+
break;
|
|
649
|
+
case 'active':
|
|
650
|
+
case 'in-progress':
|
|
651
|
+
newStatusLabel = 'status:active';
|
|
652
|
+
break;
|
|
653
|
+
case 'planning':
|
|
654
|
+
case 'not-started':
|
|
655
|
+
default:
|
|
656
|
+
newStatusLabel = 'status:not_started';
|
|
657
|
+
}
|
|
658
|
+
console.log(` ℹ️ Using frontmatter status (no ACs/tasks): ${completion.frontmatterStatus} → ${newStatusLabel}`);
|
|
618
659
|
} else {
|
|
619
660
|
newStatusLabel = 'status:not_started';
|
|
620
661
|
}
|
|
@@ -637,7 +678,7 @@ export class GitHubFeatureSync {
|
|
|
637
678
|
issueNumber.toString(),
|
|
638
679
|
'--remove-label',
|
|
639
680
|
...statusLabels,
|
|
640
|
-
]);
|
|
681
|
+
], { env: this.getGhEnv() });
|
|
641
682
|
}
|
|
642
683
|
|
|
643
684
|
// Step 2: Add new status label
|
|
@@ -647,7 +688,7 @@ export class GitHubFeatureSync {
|
|
|
647
688
|
issueNumber.toString(),
|
|
648
689
|
'--add-label',
|
|
649
690
|
newStatusLabel,
|
|
650
|
-
]);
|
|
691
|
+
], { env: this.getGhEnv() });
|
|
651
692
|
|
|
652
693
|
if (result.exitCode === 0) {
|
|
653
694
|
console.log(` 🏷️ Updated label: ${newStatusLabel}`);
|
|
@@ -686,7 +727,7 @@ export class GitHubFeatureSync {
|
|
|
686
727
|
'repos/:owner/:repo/issues/' + issueNumber + '/comments',
|
|
687
728
|
'--jq',
|
|
688
729
|
'.[-1] | {body: .body, created_at: .created_at}', // Get last comment only
|
|
689
|
-
]);
|
|
730
|
+
], { env: this.getGhEnv() });
|
|
690
731
|
|
|
691
732
|
let lastCommentBody = '';
|
|
692
733
|
if (commentsResult.exitCode === 0 && commentsResult.stdout.trim()) {
|
|
@@ -727,7 +768,7 @@ export class GitHubFeatureSync {
|
|
|
727
768
|
issueNumber.toString(),
|
|
728
769
|
'--body',
|
|
729
770
|
newCommentBody,
|
|
730
|
-
]);
|
|
771
|
+
], { env: this.getGhEnv() });
|
|
731
772
|
console.log(
|
|
732
773
|
` 📊 Progress: ${completion.acsPercentage.toFixed(0)}% ACs, ${completion.tasksPercentage.toFixed(0)}% tasks (updated)`
|
|
733
774
|
);
|
|
@@ -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}`);
|