specweave 0.29.2 → 0.30.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/README.md +65 -16
- package/bin/specweave.js +16 -0
- package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.d.ts +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.js +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/conflict-resolver.d.ts +134 -0
- package/dist/plugins/specweave-ado/lib/conflict-resolver.d.ts.map +1 -0
- package/dist/plugins/specweave-ado/lib/conflict-resolver.js +423 -0
- package/dist/plugins/specweave-ado/lib/conflict-resolver.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +23 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +95 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-commit-sync.d.ts +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-commit-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-commit-sync.js +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-commit-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/types.d.ts +20 -0
- package/dist/plugins/specweave-github/lib/types.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.js +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.d.ts +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.js +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/setup-wizard.d.ts +2 -2
- package/dist/plugins/specweave-jira/lib/setup-wizard.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/setup-wizard.js +1 -1
- package/dist/plugins/specweave-jira/lib/setup-wizard.js.map +1 -1
- package/dist/src/adapters/claude/adapter.js +1 -1
- package/dist/src/adapters/claude/adapter.js.map +1 -1
- package/dist/src/cli/commands/detect-project.js +1 -1
- package/dist/src/cli/commands/detect-project.js.map +1 -1
- package/dist/src/cli/commands/detect-specs.js +1 -1
- package/dist/src/cli/commands/detect-specs.js.map +1 -1
- package/dist/src/cli/commands/import-docs.js +1 -1
- package/dist/src/cli/commands/import-docs.js.map +1 -1
- package/dist/src/cli/commands/init-multiproject.js +1 -1
- package/dist/src/cli/commands/init-multiproject.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +31 -1
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/jobs.js +15 -1
- package/dist/src/cli/commands/jobs.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/switch-project.js +1 -1
- package/dist/src/cli/commands/switch-project.js.map +1 -1
- package/dist/src/cli/commands/sync-scheduled.d.ts +38 -0
- package/dist/src/cli/commands/sync-scheduled.d.ts.map +1 -0
- package/dist/src/cli/commands/sync-scheduled.js +170 -0
- package/dist/src/cli/commands/sync-scheduled.js.map +1 -0
- package/dist/src/cli/helpers/init/external-import-grouping.d.ts +53 -0
- package/dist/src/cli/helpers/init/external-import-grouping.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/external-import-grouping.js +287 -0
- package/dist/src/cli/helpers/init/external-import-grouping.js.map +1 -0
- package/dist/src/cli/helpers/init/external-import.d.ts +1 -34
- package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/external-import.js +15 -486
- package/dist/src/cli/helpers/init/external-import.js.map +1 -1
- package/dist/src/cli/helpers/init/living-docs-preflight.d.ts +58 -0
- package/dist/src/cli/helpers/init/living-docs-preflight.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/living-docs-preflight.js +290 -0
- package/dist/src/cli/helpers/init/living-docs-preflight.js.map +1 -0
- package/dist/src/cli/helpers/init/sync-profile-helpers.d.ts +48 -0
- package/dist/src/cli/helpers/init/sync-profile-helpers.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/sync-profile-helpers.js +238 -0
- package/dist/src/cli/helpers/init/sync-profile-helpers.js.map +1 -0
- package/dist/src/cli/helpers/init/types.d.ts +1 -0
- package/dist/src/cli/helpers/init/types.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.js +113 -3
- package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +2 -287
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/sync-config-writer.d.ts +25 -0
- package/dist/src/cli/helpers/issue-tracker/sync-config-writer.d.ts.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js +306 -0
- package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/types.d.ts +27 -0
- package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/types.js.map +1 -1
- package/dist/src/cli/workers/living-docs-worker.d.ts +16 -0
- package/dist/src/cli/workers/living-docs-worker.d.ts.map +1 -0
- package/dist/src/cli/workers/living-docs-worker.js +395 -0
- package/dist/src/cli/workers/living-docs-worker.js.map +1 -0
- package/dist/src/core/background/job-dependency.d.ts +45 -0
- package/dist/src/core/background/job-dependency.d.ts.map +1 -0
- package/dist/src/core/background/job-dependency.js +144 -0
- package/dist/src/core/background/job-dependency.js.map +1 -0
- package/dist/src/core/background/job-launcher.d.ts +21 -1
- package/dist/src/core/background/job-launcher.d.ts.map +1 -1
- package/dist/src/core/background/job-launcher.js +93 -0
- package/dist/src/core/background/job-launcher.js.map +1 -1
- package/dist/src/core/background/types.d.ts +73 -2
- package/dist/src/core/background/types.d.ts.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/comment-builder.d.ts +1 -1
- package/dist/src/core/comment-builder.d.ts.map +1 -1
- package/dist/src/core/{cost-tracker.d.ts → cost/cost-tracker.d.ts} +2 -2
- package/dist/src/core/cost/cost-tracker.d.ts.map +1 -0
- package/dist/src/core/{cost-tracker.js → cost/cost-tracker.js} +2 -2
- package/dist/src/core/cost/cost-tracker.js.map +1 -0
- package/dist/src/core/credentials/credentials-manager.d.ts.map +1 -0
- package/dist/src/core/credentials/credentials-manager.js.map +1 -0
- package/dist/src/core/increment/discipline-checker.js +1 -1
- package/dist/src/core/increment/discipline-checker.js.map +1 -1
- package/dist/src/core/increment/increment-archiver.d.ts +9 -8
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
- package/dist/src/core/increment/increment-archiver.js +40 -42
- package/dist/src/core/increment/increment-archiver.js.map +1 -1
- package/dist/src/core/increment/increment-status.d.ts.map +1 -0
- package/dist/src/core/{increment-status.js → increment/increment-status.js} +1 -1
- package/dist/src/core/increment/increment-status.js.map +1 -0
- package/dist/src/core/increment/increment-utils.d.ts.map +1 -0
- package/dist/src/core/increment/increment-utils.js.map +1 -0
- 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/living-docs/checkpoint-manager.d.ts +120 -0
- package/dist/src/core/living-docs/checkpoint-manager.d.ts.map +1 -0
- package/dist/src/core/living-docs/checkpoint-manager.js +231 -0
- package/dist/src/core/living-docs/checkpoint-manager.js.map +1 -0
- package/dist/src/core/living-docs/discovery.d.ts +91 -0
- package/dist/src/core/living-docs/discovery.d.ts.map +1 -0
- package/dist/src/core/living-docs/discovery.js +656 -0
- package/dist/src/core/living-docs/discovery.js.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts +23 -4
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +133 -30
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/living-docs/foundation-builder.d.ts +37 -0
- package/dist/src/core/living-docs/foundation-builder.d.ts.map +1 -0
- package/dist/src/core/living-docs/foundation-builder.js +357 -0
- package/dist/src/core/living-docs/foundation-builder.js.map +1 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts +58 -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 +204 -7
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/living-docs/module-analyzer.d.ts +97 -0
- package/dist/src/core/living-docs/module-analyzer.d.ts.map +1 -0
- package/dist/src/core/living-docs/module-analyzer.js +427 -0
- package/dist/src/core/living-docs/module-analyzer.js.map +1 -0
- package/dist/src/core/living-docs/suggestions-generator.d.ts +112 -0
- package/dist/src/core/living-docs/suggestions-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/suggestions-generator.js +362 -0
- package/dist/src/core/living-docs/suggestions-generator.js.map +1 -0
- package/dist/src/core/living-docs/workitem-matcher.d.ts +116 -0
- package/dist/src/core/living-docs/workitem-matcher.d.ts.map +1 -0
- package/dist/src/core/living-docs/workitem-matcher.js +356 -0
- package/dist/src/core/living-docs/workitem-matcher.js.map +1 -0
- package/dist/src/core/{plugin-loader.d.ts → plugins/plugin-loader.d.ts} +1 -1
- package/dist/src/core/plugins/plugin-loader.d.ts.map +1 -0
- package/dist/src/core/{plugin-loader.js → plugins/plugin-loader.js} +2 -2
- package/dist/src/core/plugins/plugin-loader.js.map +1 -0
- package/dist/src/core/{project-manager.d.ts → project/project-manager.d.ts} +1 -1
- package/dist/src/core/project/project-manager.d.ts.map +1 -0
- package/dist/src/core/{project-manager.js → project/project-manager.js} +3 -3
- package/dist/src/core/project/project-manager.js.map +1 -0
- package/dist/src/core/project/project-structure-detector.d.ts.map +1 -0
- package/dist/src/core/project/project-structure-detector.js.map +1 -0
- package/dist/src/core/{rfc-generator-v2.d.ts → rfc/rfc-generator-v2.d.ts} +1 -1
- package/dist/src/core/rfc/rfc-generator-v2.d.ts.map +1 -0
- package/dist/src/core/{rfc-generator-v2.js → rfc/rfc-generator-v2.js} +1 -1
- package/dist/src/core/rfc/rfc-generator-v2.js.map +1 -0
- package/dist/src/core/scheduler/index.d.ts +1 -0
- package/dist/src/core/scheduler/index.d.ts.map +1 -1
- package/dist/src/core/scheduler/index.js +1 -0
- package/dist/src/core/scheduler/index.js.map +1 -1
- package/dist/src/core/scheduler/scheduled-job.d.ts +1 -1
- package/dist/src/core/scheduler/scheduled-job.d.ts.map +1 -1
- package/dist/src/core/scheduler/scheduled-job.js.map +1 -1
- package/dist/src/core/scheduler/session-sync-executor.d.ts +138 -0
- package/dist/src/core/scheduler/session-sync-executor.d.ts.map +1 -0
- package/dist/src/core/scheduler/session-sync-executor.js +333 -0
- package/dist/src/core/scheduler/session-sync-executor.js.map +1 -0
- package/dist/src/core/{spec-content-sync.d.ts → specs/spec-content-sync.d.ts} +2 -2
- package/dist/src/core/specs/spec-content-sync.d.ts.map +1 -0
- package/dist/src/core/{spec-content-sync.js → specs/spec-content-sync.js} +1 -1
- package/dist/src/core/specs/spec-content-sync.js.map +1 -0
- package/dist/src/core/{spec-detector.d.ts → specs/spec-detector.d.ts} +1 -1
- package/dist/src/core/specs/spec-detector.d.ts.map +1 -0
- package/dist/src/core/{spec-detector.js → specs/spec-detector.js} +1 -1
- package/dist/src/core/specs/spec-detector.js.map +1 -0
- package/dist/src/core/{spec-identifier-detector.d.ts → specs/spec-identifier-detector.d.ts} +2 -2
- package/dist/src/core/specs/spec-identifier-detector.d.ts.map +1 -0
- package/dist/src/core/{spec-identifier-detector.js → specs/spec-identifier-detector.js} +1 -1
- package/dist/src/core/specs/spec-identifier-detector.js.map +1 -0
- package/dist/src/core/specs/spec-metadata-manager.js +1 -1
- package/dist/src/core/specs/spec-metadata-manager.js.map +1 -1
- package/dist/src/core/specs/spec-task-mapper.d.ts.map +1 -0
- package/dist/src/core/specs/spec-task-mapper.js.map +1 -0
- package/dist/src/core/sync/sync-audit-logger.d.ts +62 -0
- package/dist/src/core/sync/sync-audit-logger.d.ts.map +1 -1
- package/dist/src/core/sync/sync-audit-logger.js +59 -0
- package/dist/src/core/sync/sync-audit-logger.js.map +1 -1
- package/dist/src/importers/item-converter.d.ts +51 -27
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +219 -179
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/importers/markdown-generator.d.ts +75 -0
- package/dist/src/importers/markdown-generator.d.ts.map +1 -0
- package/dist/src/importers/markdown-generator.js +250 -0
- package/dist/src/importers/markdown-generator.js.map +1 -0
- package/dist/src/integrations/ado/ado-client.d.ts +93 -0
- package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
- package/dist/src/integrations/ado/ado-client.js +172 -1
- package/dist/src/integrations/ado/ado-client.js.map +1 -1
- package/dist/src/integrations/jira/jira-client.d.ts +44 -0
- package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-client.js +119 -1
- package/dist/src/integrations/jira/jira-client.js.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.js +2 -2
- package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.js +1 -1
- package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
- package/dist/src/living-docs/epic-id-allocator.d.ts +177 -0
- package/dist/src/living-docs/epic-id-allocator.d.ts.map +1 -0
- package/dist/src/living-docs/epic-id-allocator.js +363 -0
- package/dist/src/living-docs/epic-id-allocator.js.map +1 -0
- package/dist/src/sync/external-change-puller.d.ts +94 -0
- package/dist/src/sync/external-change-puller.d.ts.map +1 -0
- package/dist/src/sync/external-change-puller.js +181 -0
- package/dist/src/sync/external-change-puller.js.map +1 -0
- package/dist/src/sync/index.d.ts +4 -0
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +2 -0
- package/dist/src/sync/index.js.map +1 -1
- package/dist/src/sync/living-docs-updater.d.ts +93 -0
- package/dist/src/sync/living-docs-updater.d.ts.map +1 -0
- package/dist/src/sync/living-docs-updater.js +218 -0
- package/dist/src/sync/living-docs-updater.js.map +1 -0
- package/dist/src/testing/test-generator.js +1 -1
- package/dist/src/testing/test-generator.js.map +1 -1
- package/dist/src/utils/cost-reporter.d.ts +1 -1
- package/dist/src/utils/cost-reporter.d.ts.map +1 -1
- package/dist/src/utils/model-selection.js +4 -4
- package/dist/src/utils/model-selection.js.map +1 -1
- package/dist/src/utils/pricing-constants.d.ts +2 -2
- package/dist/src/utils/pricing-constants.js +2 -2
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +1 -28
- package/plugins/specweave/agents/code-standards-detective/AGENT.md +3 -3
- package/plugins/specweave/agents/infrastructure/AGENT.md +4 -0
- package/plugins/specweave/agents/performance/AGENT.md +2 -2
- package/plugins/specweave/agents/reflective-reviewer/AGENT.md +3 -3
- package/plugins/specweave/agents/translator/AGENT.md +2 -2
- package/plugins/specweave/commands/specweave-costs.md +2 -2
- package/plugins/specweave/commands/specweave-do.md +2 -2
- package/plugins/specweave/hooks/lib/scheduler-startup.sh +59 -8
- package/plugins/specweave/skills/code-reviewer/SKILL.md +1 -1
- package/plugins/specweave/skills/role-orchestrator/README.md +1 -1
- package/plugins/specweave-ado/agents/ado-manager/AGENT.md +8 -2
- package/plugins/specweave-ado/agents/ado-multi-project-mapper/AGENT.md +2 -2
- package/plugins/specweave-ado/agents/ado-sync-judge/AGENT.md +2 -2
- package/plugins/specweave-ado/lib/ado-spec-commit-sync.d.ts +1 -1
- package/plugins/specweave-ado/lib/ado-spec-commit-sync.js +1 -1
- package/plugins/specweave-ado/lib/ado-spec-commit-sync.ts +1 -1
- package/plugins/specweave-ado/lib/ado-spec-content-sync.js +1 -1
- package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +1 -1
- package/plugins/specweave-ado/lib/conflict-resolver.js +87 -0
- package/plugins/specweave-ado/lib/conflict-resolver.ts +124 -0
- package/plugins/specweave-ado/skills/specweave-ado-mapper/SKILL.md +1 -1
- package/plugins/specweave-backend/agents/database-optimizer/AGENT.md +3 -3
- package/plugins/specweave-backend/skills/dotnet-backend/SKILL.md +1 -1
- package/plugins/specweave-backend/skills/nodejs-backend/SKILL.md +1 -1
- package/plugins/specweave-backend/skills/python-backend/SKILL.md +1 -1
- package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +6 -1
- package/plugins/specweave-diagrams/agents/diagrams-architect/AGENT.md +2 -2
- package/plugins/specweave-diagrams/skills/diagrams-architect/SKILL.md +1 -1
- package/plugins/specweave-frontend/agents/frontend-architect/AGENT.md +4 -0
- package/plugins/specweave-github/agents/github-manager/AGENT.md +1 -1
- package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +11 -1
- package/plugins/specweave-github/agents/user-story-updater/AGENT.md +6 -1
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +90 -0
- package/plugins/specweave-github/lib/github-client-v2.js +97 -0
- package/plugins/specweave-github/lib/github-client-v2.ts +115 -1
- package/plugins/specweave-github/lib/github-spec-commit-sync.d.ts +1 -1
- package/plugins/specweave-github/lib/github-spec-commit-sync.js +1 -1
- package/plugins/specweave-github/lib/github-spec-commit-sync.ts +1 -1
- package/plugins/specweave-github/lib/github-spec-content-sync.js +1 -1
- package/plugins/specweave-github/lib/github-spec-content-sync.ts +1 -1
- package/plugins/specweave-github/lib/types.ts +21 -0
- package/plugins/specweave-infrastructure/agents/devops/AGENT.md +1 -1
- package/plugins/specweave-infrastructure/agents/network-engineer/AGENT.md +3 -3
- package/plugins/specweave-infrastructure/agents/observability-engineer/AGENT.md +2 -2
- package/plugins/specweave-infrastructure/agents/performance-engineer/AGENT.md +3 -3
- package/plugins/specweave-infrastructure/agents/sre/AGENT.md +2 -2
- package/plugins/specweave-jira/agents/jira-manager/AGENT.md +11 -1
- package/plugins/specweave-jira/commands/import-projects.js +1 -1
- package/plugins/specweave-jira/commands/import-projects.ts +1 -1
- package/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts +1 -1
- package/plugins/specweave-jira/lib/jira-spec-commit-sync.js +1 -1
- package/plugins/specweave-jira/lib/jira-spec-commit-sync.ts +1 -1
- package/plugins/specweave-jira/lib/jira-spec-content-sync.js +1 -1
- package/plugins/specweave-jira/lib/jira-spec-content-sync.ts +1 -1
- package/plugins/specweave-jira/lib/setup-wizard.js +2 -2
- package/plugins/specweave-jira/lib/setup-wizard.ts +2 -2
- package/plugins/specweave-jira/skills/specweave-jira-mapper/SKILL.md +1 -1
- package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +5 -1
- package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +6 -1
- package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +6 -1
- package/plugins/specweave-kubernetes/agents/kubernetes-architect/AGENT.md +3 -3
- package/plugins/specweave-ml/agents/data-scientist/AGENT.md +2 -1
- package/plugins/specweave-ml/agents/ml-engineer/AGENT.md +2 -1
- package/plugins/specweave-ml/agents/mlops-engineer/AGENT.md +3 -3
- package/plugins/specweave-mobile/agents/mobile-architect/AGENT.md +6 -1
- package/plugins/specweave-payments/agents/payment-integration/AGENT.md +3 -3
- package/plugins/specweave-release/agents/release-manager/AGENT.md +6 -1
- package/plugins/specweave-release/commands/specweave-release-npm.md +8 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +135 -0
- package/plugins/specweave-testing/agents/qa-engineer/AGENT.md +5 -0
- package/src/templates/AGENTS.md.template +97 -0
- package/dist/src/core/cost-tracker.d.ts.map +0 -1
- package/dist/src/core/cost-tracker.js.map +0 -1
- package/dist/src/core/credentials-manager.d.ts.map +0 -1
- package/dist/src/core/credentials-manager.js.map +0 -1
- package/dist/src/core/increment-status.d.ts.map +0 -1
- package/dist/src/core/increment-status.js.map +0 -1
- package/dist/src/core/increment-utils.d.ts.map +0 -1
- package/dist/src/core/increment-utils.js.map +0 -1
- package/dist/src/core/plugin-loader.d.ts.map +0 -1
- package/dist/src/core/plugin-loader.js.map +0 -1
- package/dist/src/core/project-manager.d.ts.map +0 -1
- package/dist/src/core/project-manager.js.map +0 -1
- package/dist/src/core/project-structure-detector.d.ts.map +0 -1
- package/dist/src/core/project-structure-detector.js.map +0 -1
- package/dist/src/core/rfc-generator-v2.d.ts.map +0 -1
- package/dist/src/core/rfc-generator-v2.js.map +0 -1
- package/dist/src/core/spec-content-sync.d.ts.map +0 -1
- package/dist/src/core/spec-content-sync.js.map +0 -1
- package/dist/src/core/spec-detector.d.ts.map +0 -1
- package/dist/src/core/spec-detector.js.map +0 -1
- package/dist/src/core/spec-identifier-detector.d.ts.map +0 -1
- package/dist/src/core/spec-identifier-detector.js.map +0 -1
- package/dist/src/core/spec-task-mapper.d.ts.map +0 -1
- package/dist/src/core/spec-task-mapper.js.map +0 -1
- package/dist/src/utils/spec-parser.d.ts +0 -145
- package/dist/src/utils/spec-parser.d.ts.map +0 -1
- package/dist/src/utils/spec-parser.js +0 -640
- package/dist/src/utils/spec-parser.js.map +0 -1
- package/plugins/specweave/agents/pm/AGENT.md.bak2 +0 -1754
- package/plugins/specweave/hooks/hooks.json.bak +0 -72
- package/plugins/specweave/hooks/hooks.json.v1-backup +0 -16
- package/plugins/specweave/hooks/v2/hooks.json +0 -16
- /package/dist/src/core/{credentials-manager.d.ts → credentials/credentials-manager.d.ts} +0 -0
- /package/dist/src/core/{credentials-manager.js → credentials/credentials-manager.js} +0 -0
- /package/dist/src/core/{increment-status.d.ts → increment/increment-status.d.ts} +0 -0
- /package/dist/src/core/{increment-utils.d.ts → increment/increment-utils.d.ts} +0 -0
- /package/dist/src/core/{increment-utils.js → increment/increment-utils.js} +0 -0
- /package/dist/src/core/{project-structure-detector.d.ts → project/project-structure-detector.d.ts} +0 -0
- /package/dist/src/core/{project-structure-detector.js → project/project-structure-detector.js} +0 -0
- /package/dist/src/core/{spec-task-mapper.d.ts → specs/spec-task-mapper.d.ts} +0 -0
- /package/dist/src/core/{spec-task-mapper.js → specs/spec-task-mapper.js} +0 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync Scheduled Command
|
|
3
|
+
*
|
|
4
|
+
* Executes due scheduled sync jobs. Designed for:
|
|
5
|
+
* 1. Cron jobs (periodic execution)
|
|
6
|
+
* 2. Manual invocation
|
|
7
|
+
* 3. CI/CD pipelines
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* specweave sync-scheduled # Execute due jobs
|
|
11
|
+
* specweave sync-scheduled --dry-run # Show what would run
|
|
12
|
+
* specweave sync-scheduled --force # Run all jobs (ignore schedule)
|
|
13
|
+
*
|
|
14
|
+
* Cron example (every 15 minutes):
|
|
15
|
+
* 0,15,30,45 * * * * cd /path/to/project && npx specweave sync-scheduled
|
|
16
|
+
*
|
|
17
|
+
* @module cli/commands/sync-scheduled
|
|
18
|
+
*/
|
|
19
|
+
import { Command } from 'commander';
|
|
20
|
+
import path from 'path';
|
|
21
|
+
import { SessionSyncExecutor, } from '../../core/scheduler/session-sync-executor.js';
|
|
22
|
+
import { SchedulePersistence } from '../../core/scheduler/schedule-persistence.js';
|
|
23
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
24
|
+
/**
|
|
25
|
+
* Create the sync-scheduled command
|
|
26
|
+
*/
|
|
27
|
+
export function createSyncScheduledCommand(options = {}) {
|
|
28
|
+
const logger = options.logger ?? consoleLogger;
|
|
29
|
+
const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
|
|
30
|
+
const projectRoot = path.dirname(specweavePath);
|
|
31
|
+
const command = new Command('sync-scheduled')
|
|
32
|
+
.description('Execute due scheduled sync jobs (for cron/CI use)')
|
|
33
|
+
.option('--dry-run', 'Show what would run without executing')
|
|
34
|
+
.option('--force', 'Run all sync jobs regardless of schedule')
|
|
35
|
+
.option('--json', 'Output as JSON')
|
|
36
|
+
.option('--silent', 'Suppress output (for cron)')
|
|
37
|
+
.action(async (opts) => {
|
|
38
|
+
try {
|
|
39
|
+
if (opts.force) {
|
|
40
|
+
await runForcedSync(projectRoot, opts, logger);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
await runScheduledSync(projectRoot, opts, logger);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (!opts.silent) {
|
|
48
|
+
logger.error(`Sync failed: ${error}`);
|
|
49
|
+
}
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
return command;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Run scheduled sync (only due jobs)
|
|
57
|
+
*/
|
|
58
|
+
async function runScheduledSync(projectRoot, opts, logger) {
|
|
59
|
+
const executor = new SessionSyncExecutor({
|
|
60
|
+
projectRoot,
|
|
61
|
+
logger: opts.silent ? createSilentLogger() : logger,
|
|
62
|
+
dryRun: opts.dryRun,
|
|
63
|
+
maxJobsPerSession: 10, // Allow more jobs for cron
|
|
64
|
+
});
|
|
65
|
+
const result = await executor.executeDueJobs();
|
|
66
|
+
if (opts.json) {
|
|
67
|
+
console.log(JSON.stringify(result, null, 2));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (opts.silent) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// Human-readable output
|
|
74
|
+
printResult(result, opts.dryRun);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Run forced sync (all jobs regardless of schedule)
|
|
78
|
+
*/
|
|
79
|
+
async function runForcedSync(projectRoot, opts, logger) {
|
|
80
|
+
const specweavePath = path.join(projectRoot, '.specweave');
|
|
81
|
+
const persistence = new SchedulePersistence({
|
|
82
|
+
specweavePath,
|
|
83
|
+
logger: opts.silent ? createSilentLogger() : logger,
|
|
84
|
+
});
|
|
85
|
+
// Load all jobs
|
|
86
|
+
const jobs = await persistence.loadSchedules();
|
|
87
|
+
if (jobs.length === 0) {
|
|
88
|
+
if (!opts.silent) {
|
|
89
|
+
logger.log('No scheduled jobs found');
|
|
90
|
+
}
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (!opts.silent) {
|
|
94
|
+
logger.log(`\n🔄 Force sync: ${jobs.length} job(s) to execute\n`);
|
|
95
|
+
}
|
|
96
|
+
// Reset all jobs to be due immediately
|
|
97
|
+
for (const job of jobs) {
|
|
98
|
+
if (job.schedule.enabled) {
|
|
99
|
+
const updatedJob = {
|
|
100
|
+
...job,
|
|
101
|
+
schedule: {
|
|
102
|
+
...job.schedule,
|
|
103
|
+
nextRun: new Date().toISOString(),
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
await persistence.updateJob(job.id, updatedJob);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Now run the executor
|
|
110
|
+
const executor = new SessionSyncExecutor({
|
|
111
|
+
projectRoot,
|
|
112
|
+
logger: opts.silent ? createSilentLogger() : logger,
|
|
113
|
+
dryRun: opts.dryRun,
|
|
114
|
+
maxJobsPerSession: 100, // No limit for forced sync
|
|
115
|
+
});
|
|
116
|
+
const result = await executor.executeDueJobs();
|
|
117
|
+
if (opts.json) {
|
|
118
|
+
console.log(JSON.stringify(result, null, 2));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (!opts.silent) {
|
|
122
|
+
printResult(result, opts.dryRun);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Print human-readable result
|
|
127
|
+
*/
|
|
128
|
+
function printResult(result, dryRun) {
|
|
129
|
+
const mode = dryRun ? '[DRY RUN] ' : '';
|
|
130
|
+
console.log(`\n${mode}📅 Sync Scheduled Results`);
|
|
131
|
+
console.log('─'.repeat(40));
|
|
132
|
+
console.log(`Due jobs: ${result.dueJobCount}`);
|
|
133
|
+
console.log(`Executed: ${result.executedJobs.length}`);
|
|
134
|
+
console.log(`Skipped: ${result.skippedJobs.length}`);
|
|
135
|
+
console.log(`Duration: ${result.totalDurationMs}ms`);
|
|
136
|
+
if (result.executedJobs.length > 0) {
|
|
137
|
+
console.log('\nExecuted Jobs:');
|
|
138
|
+
for (const job of result.executedJobs) {
|
|
139
|
+
const status = job.success ? '✅' : '❌';
|
|
140
|
+
const duration = `(${job.durationMs}ms)`;
|
|
141
|
+
console.log(` ${status} ${job.jobId} ${duration}`);
|
|
142
|
+
if (job.error) {
|
|
143
|
+
console.log(` Error: ${job.error}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (result.skippedJobs.length > 0) {
|
|
148
|
+
console.log('\nSkipped Jobs:');
|
|
149
|
+
for (const job of result.skippedJobs) {
|
|
150
|
+
console.log(` ⏭️ ${job.jobId}: ${job.skipReason || 'Unknown reason'}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
console.log('─'.repeat(40));
|
|
154
|
+
console.log(result.success ? '✅ Sync completed successfully' : '⚠️ Some jobs failed');
|
|
155
|
+
console.log('');
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Create a silent logger for cron mode
|
|
159
|
+
*/
|
|
160
|
+
function createSilentLogger() {
|
|
161
|
+
return {
|
|
162
|
+
log: () => { },
|
|
163
|
+
debug: () => { },
|
|
164
|
+
warn: () => { },
|
|
165
|
+
error: () => { },
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// Default export for CLI registration
|
|
169
|
+
export default createSyncScheduledCommand;
|
|
170
|
+
//# sourceMappingURL=sync-scheduled.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-scheduled.js","sourceRoot":"","sources":["../../../../src/cli/commands/sync-scheduled.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External Import Grouping Logic
|
|
3
|
+
*
|
|
4
|
+
* Groups imported items by external container (JIRA project/board, ADO project/area path)
|
|
5
|
+
* for 2-level directory structure support.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from external-import.ts to reduce file size and improve maintainability.
|
|
8
|
+
*
|
|
9
|
+
* @module cli/helpers/init/external-import-grouping
|
|
10
|
+
*/
|
|
11
|
+
import type { ExternalItem } from '../../../importers/external-importer.js';
|
|
12
|
+
import type { ExternalContainerContext } from '../../../core/types/increment-metadata.js';
|
|
13
|
+
/**
|
|
14
|
+
* Container group for organizing imported items
|
|
15
|
+
*/
|
|
16
|
+
export interface ContainerGroup {
|
|
17
|
+
containerId: string;
|
|
18
|
+
containerType: 'jira' | 'ado' | null;
|
|
19
|
+
projectId: string;
|
|
20
|
+
items: ExternalItem[];
|
|
21
|
+
externalContainer: ExternalContainerContext | undefined;
|
|
22
|
+
/** The parent Epic/Capability item for this group (if ADO hierarchy) */
|
|
23
|
+
parentItem?: ExternalItem;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Group items by their source repository
|
|
27
|
+
* Items without sourceRepo go into '_default' group
|
|
28
|
+
*/
|
|
29
|
+
export declare function groupItemsBySourceRepo(items: ExternalItem[]): Map<string, ExternalItem[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Group items by external container (JIRA project/board, ADO project/area path)
|
|
32
|
+
* Returns groups with container context for 2-level directory structure
|
|
33
|
+
*
|
|
34
|
+
* CRITICAL FIX (2025-12-01): For ADO items with hierarchy, group by parent Epic/Capability
|
|
35
|
+
* instead of by area path. This ensures each Epic becomes a separate FS-XXX folder.
|
|
36
|
+
*
|
|
37
|
+
* ADO Hierarchy: Capability → Epic → Feature → User Story → Task
|
|
38
|
+
* - Each top-level Epic/Capability becomes its own group (→ FS-XXX folder)
|
|
39
|
+
* - Child User Stories/Tasks are grouped under their parent Epic
|
|
40
|
+
* - Items without parents get their own individual groups
|
|
41
|
+
*/
|
|
42
|
+
export declare function groupItemsByExternalContainer(items: ExternalItem[]): ContainerGroup[];
|
|
43
|
+
/**
|
|
44
|
+
* Group ADO items by their parent Epic/Capability hierarchy
|
|
45
|
+
* Each top-level Epic/Capability becomes its own FS-XXX folder
|
|
46
|
+
*/
|
|
47
|
+
export declare function groupAdoItemsByParentHierarchy(items: ExternalItem[]): ContainerGroup[];
|
|
48
|
+
/**
|
|
49
|
+
* Group non-hierarchy items (JIRA, GitHub, or ADO without hierarchy)
|
|
50
|
+
* Original grouping logic by project/board/repo
|
|
51
|
+
*/
|
|
52
|
+
export declare function groupNonHierarchyItems(items: ExternalItem[]): ContainerGroup[];
|
|
53
|
+
//# sourceMappingURL=external-import-grouping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-import-grouping.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/external-import-grouping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAG1F;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,iBAAiB,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACxD,wEAAwE;IACxE,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAiCzF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CA8BrF;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CA4ItF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAiF9E"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External Import Grouping Logic
|
|
3
|
+
*
|
|
4
|
+
* Groups imported items by external container (JIRA project/board, ADO project/area path)
|
|
5
|
+
* for 2-level directory structure support.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from external-import.ts to reduce file size and improve maintainability.
|
|
8
|
+
*
|
|
9
|
+
* @module cli/helpers/init/external-import-grouping
|
|
10
|
+
*/
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import { normalizeToProjectId } from '../../../utils/project-id-generator.js';
|
|
13
|
+
/**
|
|
14
|
+
* Group items by their source repository
|
|
15
|
+
* Items without sourceRepo go into '_default' group
|
|
16
|
+
*/
|
|
17
|
+
export function groupItemsBySourceRepo(items) {
|
|
18
|
+
const groups = new Map();
|
|
19
|
+
for (const item of items) {
|
|
20
|
+
// Extract repo name from sourceRepo (e.g., "owner/repo" -> "repo")
|
|
21
|
+
let repoKey = '_default';
|
|
22
|
+
if (item.sourceRepo) {
|
|
23
|
+
// sourceRepo is "owner/repo", we want just "repo"
|
|
24
|
+
const parts = item.sourceRepo.split('/');
|
|
25
|
+
const rawRepoName = parts.length > 1 ? parts[1] : item.sourceRepo;
|
|
26
|
+
// Sanitize repo name to prevent path injection:
|
|
27
|
+
// - Allow only alphanumeric, hyphens, underscores
|
|
28
|
+
// - Trim leading/trailing hyphens
|
|
29
|
+
// - Limit to 100 chars
|
|
30
|
+
repoKey = rawRepoName
|
|
31
|
+
.replace(/[^a-zA-Z0-9-_]/g, '-')
|
|
32
|
+
.replace(/^-+|-+$/g, '')
|
|
33
|
+
.slice(0, 100);
|
|
34
|
+
// Fall back to _default if sanitization results in empty string
|
|
35
|
+
if (!repoKey) {
|
|
36
|
+
repoKey = '_default';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (!groups.has(repoKey)) {
|
|
40
|
+
groups.set(repoKey, []);
|
|
41
|
+
}
|
|
42
|
+
groups.get(repoKey).push(item);
|
|
43
|
+
}
|
|
44
|
+
return groups;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Group items by external container (JIRA project/board, ADO project/area path)
|
|
48
|
+
* Returns groups with container context for 2-level directory structure
|
|
49
|
+
*
|
|
50
|
+
* CRITICAL FIX (2025-12-01): For ADO items with hierarchy, group by parent Epic/Capability
|
|
51
|
+
* instead of by area path. This ensures each Epic becomes a separate FS-XXX folder.
|
|
52
|
+
*
|
|
53
|
+
* ADO Hierarchy: Capability → Epic → Feature → User Story → Task
|
|
54
|
+
* - Each top-level Epic/Capability becomes its own group (→ FS-XXX folder)
|
|
55
|
+
* - Child User Stories/Tasks are grouped under their parent Epic
|
|
56
|
+
* - Items without parents get their own individual groups
|
|
57
|
+
*/
|
|
58
|
+
export function groupItemsByExternalContainer(items) {
|
|
59
|
+
const groups = new Map();
|
|
60
|
+
// Check if we have ADO items with hierarchy
|
|
61
|
+
const adoItems = items.filter(item => item.platform === 'ado' && item.adoProjectName);
|
|
62
|
+
const hasAdoHierarchy = adoItems.some(item => item.parentId || item.type === 'epic');
|
|
63
|
+
// For ADO with hierarchy, use parent-based grouping
|
|
64
|
+
if (hasAdoHierarchy && adoItems.length > 0) {
|
|
65
|
+
const adoGroups = groupAdoItemsByParentHierarchy(adoItems);
|
|
66
|
+
for (const group of adoGroups) {
|
|
67
|
+
groups.set(group.projectId, group);
|
|
68
|
+
}
|
|
69
|
+
// Also process non-ADO items normally
|
|
70
|
+
const nonAdoItems = items.filter(item => item.platform !== 'ado' || !item.adoProjectName);
|
|
71
|
+
if (nonAdoItems.length > 0) {
|
|
72
|
+
const nonAdoGroups = groupNonHierarchyItems(nonAdoItems);
|
|
73
|
+
for (const group of nonAdoGroups) {
|
|
74
|
+
// Avoid key collisions with ADO groups
|
|
75
|
+
const uniqueKey = `other:${group.projectId}`;
|
|
76
|
+
groups.set(uniqueKey, group);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return Array.from(groups.values());
|
|
80
|
+
}
|
|
81
|
+
// No ADO hierarchy - use original grouping logic for all items
|
|
82
|
+
return groupNonHierarchyItems(items);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Group ADO items by their parent Epic/Capability hierarchy
|
|
86
|
+
* Each top-level Epic/Capability becomes its own FS-XXX folder
|
|
87
|
+
*/
|
|
88
|
+
export function groupAdoItemsByParentHierarchy(items) {
|
|
89
|
+
const groups = new Map();
|
|
90
|
+
// Build item lookup map
|
|
91
|
+
const itemById = new Map();
|
|
92
|
+
for (const item of items) {
|
|
93
|
+
itemById.set(item.id, item);
|
|
94
|
+
}
|
|
95
|
+
// Find feature-level types (these become folder leaders)
|
|
96
|
+
const featureLevelTypes = new Set(['capability', 'epic', 'feature']);
|
|
97
|
+
// Find ALL top-level parents (Epics/Capabilities that are NOT children of other items in our dataset)
|
|
98
|
+
const topLevelParents = new Map();
|
|
99
|
+
for (const item of items) {
|
|
100
|
+
const witType = item.adoWorkItemType?.toLowerCase() || item.type;
|
|
101
|
+
if (featureLevelTypes.has(witType)) {
|
|
102
|
+
// Check if this item's parent is NOT in our dataset (making it a top-level parent)
|
|
103
|
+
const hasParentInDataset = item.parentId && itemById.has(item.parentId);
|
|
104
|
+
if (!hasParentInDataset) {
|
|
105
|
+
topLevelParents.set(item.id, item);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Function to find the top-level parent for an item
|
|
110
|
+
function findTopLevelParent(item) {
|
|
111
|
+
// If this item IS a top-level parent, return it
|
|
112
|
+
if (topLevelParents.has(item.id)) {
|
|
113
|
+
return item;
|
|
114
|
+
}
|
|
115
|
+
// Walk up the parent chain
|
|
116
|
+
let current = item;
|
|
117
|
+
const visited = new Set();
|
|
118
|
+
while (current && current.parentId && !visited.has(current.id)) {
|
|
119
|
+
visited.add(current.id);
|
|
120
|
+
// Check if parent is a top-level parent
|
|
121
|
+
if (topLevelParents.has(current.parentId)) {
|
|
122
|
+
return topLevelParents.get(current.parentId);
|
|
123
|
+
}
|
|
124
|
+
// Move to parent
|
|
125
|
+
current = itemById.get(current.parentId);
|
|
126
|
+
}
|
|
127
|
+
// No top-level parent found
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
// Create groups for each top-level parent first
|
|
131
|
+
for (const [parentId, parentItem] of topLevelParents) {
|
|
132
|
+
const containerId = parentItem.adoProjectName || 'default';
|
|
133
|
+
const projectId = normalizeToProjectId(parentItem.title) || `ado-${parentId.replace('ADO-', '')}`;
|
|
134
|
+
const groupKey = `ado:parent:${parentId}`;
|
|
135
|
+
groups.set(groupKey, {
|
|
136
|
+
containerId,
|
|
137
|
+
containerType: 'ado',
|
|
138
|
+
projectId,
|
|
139
|
+
items: [parentItem], // Parent item goes first
|
|
140
|
+
externalContainer: {
|
|
141
|
+
type: 'ado-project',
|
|
142
|
+
containerId,
|
|
143
|
+
containerName: containerId,
|
|
144
|
+
areaPath: parentItem.adoAreaPath
|
|
145
|
+
},
|
|
146
|
+
parentItem
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// Assign child items to their parent groups
|
|
150
|
+
for (const item of items) {
|
|
151
|
+
// Skip top-level parents (already added)
|
|
152
|
+
if (topLevelParents.has(item.id)) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
// Find the top-level parent
|
|
156
|
+
const topLevelParent = findTopLevelParent(item);
|
|
157
|
+
if (topLevelParent) {
|
|
158
|
+
// Add to parent's group
|
|
159
|
+
const groupKey = `ado:parent:${topLevelParent.id}`;
|
|
160
|
+
const group = groups.get(groupKey);
|
|
161
|
+
if (group) {
|
|
162
|
+
group.items.push(item);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
// No parent found - group by area path (2-level structure: project/areaPath)
|
|
167
|
+
// This handles orphan items (User Stories with parents outside our dataset)
|
|
168
|
+
// CRITICAL FIX (2025-12-01): Group by area path, NOT by User Story title
|
|
169
|
+
const containerId = item.adoProjectName || 'default';
|
|
170
|
+
// Extract area path leaf segment for grouping (e.g., "Project\Platform-Engineering" → "platform-engineering")
|
|
171
|
+
let areaFolder = '_default';
|
|
172
|
+
if (item.adoAreaPath) {
|
|
173
|
+
const segments = item.adoAreaPath.split('\\');
|
|
174
|
+
// Use leaf segment, or second segment if only project name
|
|
175
|
+
const leafSegment = segments.length > 1 ? segments[segments.length - 1] : segments[0];
|
|
176
|
+
areaFolder = normalizeToProjectId(leafSegment) || '_default';
|
|
177
|
+
}
|
|
178
|
+
// Group all items without parents by their area path
|
|
179
|
+
// This ensures siblings with same area path stay together
|
|
180
|
+
const groupKey = `ado:area:${containerId}:${areaFolder}`;
|
|
181
|
+
const projectId = areaFolder;
|
|
182
|
+
if (!groups.has(groupKey)) {
|
|
183
|
+
groups.set(groupKey, {
|
|
184
|
+
containerId,
|
|
185
|
+
containerType: 'ado',
|
|
186
|
+
projectId,
|
|
187
|
+
items: [],
|
|
188
|
+
externalContainer: {
|
|
189
|
+
type: 'ado-project',
|
|
190
|
+
containerId,
|
|
191
|
+
containerName: containerId,
|
|
192
|
+
areaPath: item.adoAreaPath
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
groups.get(groupKey).items.push(item);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Log grouping results for diagnostics
|
|
200
|
+
console.log(chalk.cyan(` 📊 ADO Hierarchy Grouping:`));
|
|
201
|
+
console.log(chalk.gray(` → ${topLevelParents.size} top-level Epics/Capabilities found`));
|
|
202
|
+
for (const [key, group] of groups) {
|
|
203
|
+
const parentInfo = group.parentItem
|
|
204
|
+
? ` (parent: ${group.parentItem.adoWorkItemType || 'Epic'} "${group.parentItem.title.slice(0, 30)}...")`
|
|
205
|
+
: '';
|
|
206
|
+
console.log(chalk.gray(` → ${group.projectId}: ${group.items.length} items${parentInfo}`));
|
|
207
|
+
}
|
|
208
|
+
return Array.from(groups.values());
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Group non-hierarchy items (JIRA, GitHub, or ADO without hierarchy)
|
|
212
|
+
* Original grouping logic by project/board/repo
|
|
213
|
+
*/
|
|
214
|
+
export function groupNonHierarchyItems(items) {
|
|
215
|
+
const groups = new Map();
|
|
216
|
+
for (const item of items) {
|
|
217
|
+
let groupKey;
|
|
218
|
+
let containerType = null;
|
|
219
|
+
let containerId;
|
|
220
|
+
let projectId;
|
|
221
|
+
let externalContainer;
|
|
222
|
+
// Check for JIRA container context
|
|
223
|
+
if (item.jiraProjectKey) {
|
|
224
|
+
containerType = 'jira';
|
|
225
|
+
containerId = item.jiraProjectKey;
|
|
226
|
+
// Project ID from board name (if available) or default
|
|
227
|
+
projectId = item.jiraBoardName
|
|
228
|
+
? normalizeToProjectId(item.jiraBoardName) || 'default'
|
|
229
|
+
: 'default';
|
|
230
|
+
groupKey = `jira:${containerId}:${projectId}`;
|
|
231
|
+
externalContainer = {
|
|
232
|
+
type: 'jira-project',
|
|
233
|
+
containerId: containerId,
|
|
234
|
+
containerName: containerId,
|
|
235
|
+
boardId: item.jiraBoardId,
|
|
236
|
+
boardName: item.jiraBoardName
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
// Check for ADO container context (without hierarchy)
|
|
240
|
+
else if (item.adoProjectName) {
|
|
241
|
+
containerType = 'ado';
|
|
242
|
+
containerId = item.adoProjectName;
|
|
243
|
+
// Project ID from area path (extract last segment) or default
|
|
244
|
+
if (item.adoAreaPath) {
|
|
245
|
+
const areaSegments = item.adoAreaPath.split('\\');
|
|
246
|
+
const lastSegment = areaSegments[areaSegments.length - 1];
|
|
247
|
+
projectId = normalizeToProjectId(lastSegment) || 'default';
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
projectId = 'default';
|
|
251
|
+
}
|
|
252
|
+
groupKey = `ado:${containerId}:${projectId}`;
|
|
253
|
+
externalContainer = {
|
|
254
|
+
type: 'ado-project',
|
|
255
|
+
containerId: containerId,
|
|
256
|
+
containerName: containerId,
|
|
257
|
+
areaPath: item.adoAreaPath
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
// GitHub or default (1-level structure)
|
|
261
|
+
else {
|
|
262
|
+
// Use sourceRepo if available, otherwise '_default'
|
|
263
|
+
if (item.sourceRepo) {
|
|
264
|
+
const parts = item.sourceRepo.split('/');
|
|
265
|
+
const rawRepoName = parts.length > 1 ? parts[1] : item.sourceRepo;
|
|
266
|
+
projectId = normalizeToProjectId(rawRepoName) || '_default';
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
projectId = '_default';
|
|
270
|
+
}
|
|
271
|
+
groupKey = `gh:${projectId}`;
|
|
272
|
+
// No externalContainer for GitHub (1-level structure)
|
|
273
|
+
}
|
|
274
|
+
if (!groups.has(groupKey)) {
|
|
275
|
+
groups.set(groupKey, {
|
|
276
|
+
containerId: containerId || projectId,
|
|
277
|
+
containerType,
|
|
278
|
+
projectId,
|
|
279
|
+
items: [],
|
|
280
|
+
externalContainer
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
groups.get(groupKey).items.push(item);
|
|
284
|
+
}
|
|
285
|
+
return Array.from(groups.values());
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=external-import-grouping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-import-grouping.js","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/external-import-grouping.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
* Imports work items from GitHub, JIRA, Azure DevOps
|
|
4
4
|
*/
|
|
5
5
|
import { CoordinatorResult } from '../../../importers/import-coordinator.js';
|
|
6
|
-
import type { ExternalItem } from '../../../importers/external-importer.js';
|
|
7
|
-
import type { ExternalContainerContext } from '../../../core/types/increment-metadata.js';
|
|
8
6
|
import type { SupportedLanguage } from '../../../core/i18n/types.js';
|
|
7
|
+
import { groupItemsByExternalContainer, groupAdoItemsByParentHierarchy, groupNonHierarchyItems, type ContainerGroup } from './external-import-grouping.js';
|
|
9
8
|
/**
|
|
10
9
|
* Prompt user and run external tool import
|
|
11
10
|
* Detects GitHub/JIRA/ADO configuration and imports work items
|
|
@@ -33,38 +32,6 @@ export interface BackgroundImportResult {
|
|
|
33
32
|
pid?: number;
|
|
34
33
|
message: string;
|
|
35
34
|
}
|
|
36
|
-
/**
|
|
37
|
-
* Group items by external container (JIRA project/board, ADO project/area path)
|
|
38
|
-
* Returns groups with container context for 2-level directory structure
|
|
39
|
-
*
|
|
40
|
-
* CRITICAL FIX (2025-12-01): For ADO items with hierarchy, group by parent Epic/Capability
|
|
41
|
-
* instead of by area path. This ensures each Epic becomes a separate FS-XXX folder.
|
|
42
|
-
*
|
|
43
|
-
* ADO Hierarchy: Capability → Epic → Feature → User Story → Task
|
|
44
|
-
* - Each top-level Epic/Capability becomes its own group (→ FS-XXX folder)
|
|
45
|
-
* - Child User Stories/Tasks are grouped under their parent Epic
|
|
46
|
-
* - Items without parents get their own individual groups
|
|
47
|
-
*/
|
|
48
|
-
interface ContainerGroup {
|
|
49
|
-
containerId: string;
|
|
50
|
-
containerType: 'jira' | 'ado' | null;
|
|
51
|
-
projectId: string;
|
|
52
|
-
items: ExternalItem[];
|
|
53
|
-
externalContainer: ExternalContainerContext | undefined;
|
|
54
|
-
/** The parent Epic/Capability item for this group (if ADO hierarchy) */
|
|
55
|
-
parentItem?: ExternalItem;
|
|
56
|
-
}
|
|
57
|
-
declare function groupItemsByExternalContainer(items: ExternalItem[]): ContainerGroup[];
|
|
58
|
-
/**
|
|
59
|
-
* Group ADO items by their parent Epic/Capability hierarchy
|
|
60
|
-
* Each top-level Epic/Capability becomes its own FS-XXX folder
|
|
61
|
-
*/
|
|
62
|
-
declare function groupAdoItemsByParentHierarchy(items: ExternalItem[]): ContainerGroup[];
|
|
63
|
-
/**
|
|
64
|
-
* Group non-hierarchy items (JIRA, GitHub, or ADO without hierarchy)
|
|
65
|
-
* Original grouping logic by project/board/repo
|
|
66
|
-
*/
|
|
67
|
-
declare function groupNonHierarchyItems(items: ExternalItem[]): ContainerGroup[];
|
|
68
35
|
export declare const __test__: {
|
|
69
36
|
groupAdoItemsByParentHierarchy: typeof groupAdoItemsByParentHierarchy;
|
|
70
37
|
groupItemsByExternalContainer: typeof groupItemsByExternalContainer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-import.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/external-import.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAwC,iBAAiB,EAAgB,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"external-import.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/external-import.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAwC,iBAAiB,EAAgB,MAAM,0CAA0C,CAAC;AAQjI,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAwBrE,OAAO,EACL,6BAA6B,EAE7B,8BAA8B,EAC9B,sBAAsB,EACtB,KAAK,cAAc,EACpB,MAAM,+BAA+B,CAAC;AAoUvC;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,EACb,QAAQ,GAAE,iBAAwB,EAClC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,iBAAiB,GAAG,sBAAsB,CAAC,CAiTrD;AAyED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,IAAI,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AA4aD,eAAO,MAAM,QAAQ;;;;CAIpB,CAAC;AAGF,YAAY,EAAE,cAAc,EAAE,CAAC"}
|