specweave 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +229 -1817
- package/README.md +68 -0
- package/bin/specweave.js +62 -6
- package/dist/locales/de/.gitkeep +0 -0
- package/dist/locales/de/cli.json +108 -0
- package/dist/locales/en/cli.json +287 -0
- package/dist/locales/en/errors.json +7 -0
- package/dist/locales/en/templates.json +6 -0
- package/dist/locales/es/.gitkeep +0 -0
- package/dist/locales/es/cli.json +41 -0
- package/dist/locales/fr/.gitkeep +0 -0
- package/dist/locales/fr/cli.json +108 -0
- package/dist/locales/ja/.gitkeep +0 -0
- package/dist/locales/ja/cli.json +108 -0
- package/dist/locales/ko/.gitkeep +0 -0
- package/dist/locales/ko/cli.json +108 -0
- package/dist/locales/pt/.gitkeep +0 -0
- package/dist/locales/pt/cli.json +108 -0
- package/dist/locales/ru/.gitkeep +0 -0
- package/dist/locales/ru/cli.json +269 -0
- package/dist/locales/zh/.gitkeep +0 -0
- package/dist/locales/zh/cli.json +108 -0
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +3 -0
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts +21 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts.map +1 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js +162 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js.map +1 -0
- 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 +65 -6
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +25 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +191 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts +112 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.js +301 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.js.map +1 -0
- package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts +3 -3
- package/dist/plugins/specweave-github/lib/duplicate-detector.js +3 -3
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +70 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js +258 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +14 -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 +51 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts +2 -2
- package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.js +20 -5
- package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts +87 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.js +412 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -0
- 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 +64 -13
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts +78 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js +237 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts +97 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js +301 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts +83 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +386 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +28 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +156 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts +57 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +248 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.d.ts +82 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.js +13 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts +49 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.js +316 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts +70 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.js +23 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts +85 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.js +281 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts +75 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.js +238 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.js.map +1 -0
- package/dist/spec-parser.js +629 -0
- package/dist/src/cli/commands/import-docs.js +4 -4
- package/dist/src/cli/commands/import-docs.js.map +1 -1
- package/dist/src/cli/commands/init-multiproject.d.ts.map +1 -1
- package/dist/src/cli/commands/init-multiproject.js +17 -18
- 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 +107 -3
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.d.ts.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.js +8 -4
- package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
- package/dist/src/cli/commands/switch-project.d.ts.map +1 -1
- package/dist/src/cli/commands/switch-project.js +9 -26
- package/dist/src/cli/commands/switch-project.js.map +1 -1
- package/dist/src/cli/commands/sync-spec-content.js +3 -0
- package/dist/src/cli/commands/sync-spec-content.js.map +1 -1
- package/dist/src/core/deduplication/command-deduplicator.d.ts +166 -0
- package/dist/src/core/deduplication/command-deduplicator.d.ts.map +1 -0
- package/dist/src/core/deduplication/command-deduplicator.js +254 -0
- package/dist/src/core/deduplication/command-deduplicator.js.map +1 -0
- package/dist/src/core/increment/active-increment-manager.d.ts +42 -15
- package/dist/src/core/increment/active-increment-manager.d.ts.map +1 -1
- package/dist/src/core/increment/active-increment-manager.js +113 -46
- package/dist/src/core/increment/active-increment-manager.js.map +1 -1
- package/dist/src/core/increment/conflict-resolver.d.ts +40 -0
- package/dist/src/core/increment/conflict-resolver.d.ts.map +1 -0
- package/dist/src/core/increment/conflict-resolver.js +219 -0
- package/dist/src/core/increment/conflict-resolver.js.map +1 -0
- package/dist/src/core/increment/discipline-checker.d.ts.map +1 -1
- package/dist/src/core/increment/discipline-checker.js +7 -1
- package/dist/src/core/increment/discipline-checker.js.map +1 -1
- package/dist/src/core/increment/duplicate-detector.d.ts +52 -0
- package/dist/src/core/increment/duplicate-detector.d.ts.map +1 -0
- package/dist/src/core/increment/duplicate-detector.js +276 -0
- package/dist/src/core/increment/duplicate-detector.js.map +1 -0
- package/dist/src/core/increment/increment-archiver.d.ts +90 -0
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -0
- package/dist/src/core/increment/increment-archiver.js +368 -0
- package/dist/src/core/increment/increment-archiver.js.map +1 -0
- package/dist/src/core/increment/increment-reopener.d.ts +165 -0
- package/dist/src/core/increment/increment-reopener.d.ts.map +1 -0
- package/dist/src/core/increment/increment-reopener.js +390 -0
- package/dist/src/core/increment/increment-reopener.js.map +1 -0
- package/dist/src/core/increment/metadata-manager.d.ts +26 -1
- package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +143 -5
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/increment/recent-work-scanner.d.ts +121 -0
- package/dist/src/core/increment/recent-work-scanner.d.ts.map +1 -0
- package/dist/src/core/increment/recent-work-scanner.js +303 -0
- package/dist/src/core/increment/recent-work-scanner.js.map +1 -0
- package/dist/src/core/increment/types.d.ts +1 -0
- package/dist/src/core/increment/types.d.ts.map +1 -1
- package/dist/src/core/increment-utils.d.ts +112 -0
- package/dist/src/core/increment-utils.d.ts.map +1 -0
- package/dist/src/core/increment-utils.js +210 -0
- package/dist/src/core/increment-utils.js.map +1 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.d.ts +65 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.js +175 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.js.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts +130 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.js +549 -0
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts +81 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -0
- package/dist/src/core/living-docs/feature-id-manager.js +339 -0
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -0
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts +144 -83
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js +488 -270
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/index.d.ts +6 -0
- package/dist/src/core/living-docs/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/index.js +6 -0
- package/dist/src/core/living-docs/index.js.map +1 -1
- package/dist/src/core/living-docs/project-detector.d.ts +6 -0
- package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
- package/dist/src/core/living-docs/project-detector.js +35 -1
- package/dist/src/core/living-docs/project-detector.js.map +1 -1
- package/dist/src/core/living-docs/spec-distributor.d.ts +100 -26
- package/dist/src/core/living-docs/spec-distributor.d.ts.map +1 -1
- package/dist/src/core/living-docs/spec-distributor.js +1275 -258
- package/dist/src/core/living-docs/spec-distributor.js.map +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts +109 -0
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/task-project-specific-generator.js +221 -0
- package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -0
- package/dist/src/core/living-docs/types.d.ts +143 -0
- package/dist/src/core/living-docs/types.d.ts.map +1 -1
- package/dist/src/core/project-manager.d.ts +2 -17
- package/dist/src/core/project-manager.d.ts.map +1 -1
- package/dist/src/core/project-manager.js +68 -48
- package/dist/src/core/project-manager.js.map +1 -1
- package/dist/src/core/spec-content-sync.d.ts +1 -1
- package/dist/src/core/spec-content-sync.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.d.ts +32 -54
- package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.js +142 -138
- package/dist/src/core/sync/enhanced-content-builder.js.map +1 -1
- package/dist/src/core/sync/performance-optimizer.d.ts +153 -0
- package/dist/src/core/sync/performance-optimizer.d.ts.map +1 -0
- package/dist/src/core/sync/performance-optimizer.js +220 -0
- package/dist/src/core/sync/performance-optimizer.js.map +1 -0
- package/dist/src/core/sync/retry-handler.d.ts +98 -0
- package/dist/src/core/sync/retry-handler.d.ts.map +1 -0
- package/dist/src/core/sync/retry-handler.js +196 -0
- package/dist/src/core/sync/retry-handler.js.map +1 -0
- package/dist/src/core/sync/spec-content-sync.d.ts +88 -0
- package/dist/src/core/sync/spec-content-sync.d.ts.map +1 -0
- package/dist/src/core/sync/spec-content-sync.js +5 -0
- package/dist/src/core/sync/spec-content-sync.js.map +1 -0
- package/dist/src/core/sync/types.d.ts +52 -0
- package/dist/src/core/sync/types.d.ts.map +1 -0
- package/dist/src/core/sync/types.js +5 -0
- package/dist/src/core/sync/types.js.map +1 -0
- package/dist/src/core/types/config.d.ts +125 -0
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js +25 -0
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +10 -0
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/core/types/increment-metadata.js +10 -1
- package/dist/src/core/types/increment-metadata.js.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.js +4 -8
- package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.js +4 -8
- package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
- package/plugins/specweave/COMMANDS.md +13 -4
- package/plugins/specweave/agents/pm/AGENT.md +159 -12
- package/plugins/specweave/commands/specweave-abandon.md +22 -20
- package/plugins/specweave/commands/specweave-archive-features.md +121 -0
- package/plugins/specweave/commands/specweave-archive-increments.md +82 -0
- package/plugins/specweave/commands/specweave-archive.md +363 -0
- package/plugins/specweave/commands/specweave-backlog.md +211 -0
- package/plugins/specweave/commands/specweave-fix-duplicates.md +517 -0
- package/plugins/specweave/commands/specweave-increment.md +4 -3
- package/plugins/specweave/commands/specweave-progress.md +176 -27
- package/plugins/specweave/commands/specweave-reopen.md +391 -0
- package/plugins/specweave/commands/specweave-restore-feature.md +90 -0
- package/plugins/specweave/commands/specweave-restore.md +309 -0
- package/plugins/specweave/commands/specweave-resume.md +51 -23
- package/plugins/specweave/commands/specweave-status.md +41 -7
- package/plugins/specweave/commands/specweave-sync-specs.md +425 -0
- package/plugins/specweave/commands/specweave.md +70 -405
- package/plugins/specweave/hooks/hooks.json +4 -0
- package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
- package/plugins/specweave/hooks/post-increment-planning.sh +26 -2
- package/plugins/specweave/hooks/post-task-completion.sh +39 -0
- package/plugins/specweave/hooks/pre-command-deduplication.sh +83 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js +2 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.ts +4 -0
- package/plugins/specweave/lib/hooks/update-ac-status.js +102 -0
- package/plugins/specweave/lib/hooks/update-ac-status.ts +192 -0
- package/plugins/specweave/skills/archive-increments/SKILL.md +198 -0
- package/plugins/specweave/skills/increment-planner/scripts/feature-utils.js +14 -0
- package/plugins/specweave/skills/smart-reopen-detector/SKILL.md +244 -0
- package/plugins/specweave-ado/lib/ado-spec-content-sync.js +49 -5
- package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +72 -6
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
- package/plugins/specweave-confluent/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-confluent/README.md +375 -0
- package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +306 -0
- package/plugins/specweave-confluent/skills/confluent-kafka-connect/SKILL.md +453 -0
- package/plugins/specweave-confluent/skills/confluent-ksqldb/SKILL.md +470 -0
- package/plugins/specweave-confluent/skills/confluent-schema-registry/SKILL.md +316 -0
- package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +2 -2
- package/plugins/specweave-github/agents/user-story-updater/AGENT.md +148 -0
- package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +1 -1
- package/plugins/specweave-github/commands/specweave-github-update-user-story.md +156 -0
- package/plugins/specweave-github/hooks/post-task-completion.sh +42 -9
- package/plugins/specweave-github/lib/completion-calculator.js +262 -0
- package/plugins/specweave-github/lib/completion-calculator.ts +434 -0
- package/plugins/specweave-github/lib/duplicate-detector.js +3 -3
- package/plugins/specweave-github/lib/duplicate-detector.ts +4 -4
- package/plugins/specweave-github/lib/epic-content-builder.js +265 -0
- package/plugins/specweave-github/lib/epic-content-builder.ts +376 -0
- package/plugins/specweave-github/lib/github-client-v2.js +49 -0
- package/plugins/specweave-github/lib/github-client-v2.ts +59 -0
- package/plugins/specweave-github/lib/github-epic-sync.js +23 -24
- package/plugins/specweave-github/lib/github-epic-sync.ts +30 -5
- package/plugins/specweave-github/lib/github-feature-sync.js +381 -0
- package/plugins/specweave-github/lib/github-feature-sync.ts +568 -0
- package/plugins/specweave-github/lib/github-spec-content-sync.js +40 -10
- package/plugins/specweave-github/lib/github-spec-content-sync.ts +82 -14
- package/plugins/specweave-github/lib/progress-comment-builder.js +229 -0
- package/plugins/specweave-github/lib/progress-comment-builder.ts +324 -0
- package/plugins/specweave-github/lib/user-story-content-builder.js +299 -0
- package/plugins/specweave-github/lib/user-story-content-builder.ts +413 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.js +344 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.ts +543 -0
- package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +189 -0
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +134 -0
- package/plugins/specweave-jira/lib/{enhanced-jira-sync.ts.disabled → enhanced-jira-sync.ts} +26 -52
- package/plugins/specweave-kafka/.claude-plugin/plugin.json +26 -0
- package/plugins/specweave-kafka/IMPLEMENTATION-COMPLETE.md +483 -0
- package/plugins/specweave-kafka/README.md +242 -0
- package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +235 -0
- package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +209 -0
- package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +266 -0
- package/plugins/specweave-kafka/commands/deploy.md +99 -0
- package/plugins/specweave-kafka/commands/dev-env.md +176 -0
- package/plugins/specweave-kafka/commands/mcp-configure.md +101 -0
- package/plugins/specweave-kafka/commands/monitor-setup.md +96 -0
- package/plugins/specweave-kafka/docker/kafka-local/docker-compose.yml +187 -0
- package/plugins/specweave-kafka/docker/redpanda/docker-compose.yml +199 -0
- package/plugins/specweave-kafka/docker/templates/consumer-nodejs.js +225 -0
- package/plugins/specweave-kafka/docker/templates/consumer-python.py +220 -0
- package/plugins/specweave-kafka/docker/templates/producer-nodejs.js +168 -0
- package/plugins/specweave-kafka/docker/templates/producer-python.py +167 -0
- package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.js +438 -0
- package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.ts +541 -0
- package/plugins/specweave-kafka/lib/adapters/platform-adapter.js +47 -0
- package/plugins/specweave-kafka/lib/adapters/platform-adapter.ts +343 -0
- package/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +258 -0
- package/plugins/specweave-kafka/lib/cli/kcat-wrapper.ts +298 -0
- package/plugins/specweave-kafka/lib/cli/types.js +10 -0
- package/plugins/specweave-kafka/lib/cli/types.ts +92 -0
- package/plugins/specweave-kafka/lib/connectors/connector-catalog.js +305 -0
- package/plugins/specweave-kafka/lib/connectors/connector-catalog.ts +528 -0
- package/plugins/specweave-kafka/lib/documentation/diagram-generator.js +114 -0
- package/plugins/specweave-kafka/lib/documentation/diagram-generator.ts +195 -0
- package/plugins/specweave-kafka/lib/documentation/exporter.js +210 -0
- package/plugins/specweave-kafka/lib/documentation/exporter.ts +338 -0
- package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.js +60 -0
- package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.ts +130 -0
- package/plugins/specweave-kafka/lib/documentation/topology-generator.js +143 -0
- package/plugins/specweave-kafka/lib/documentation/topology-generator.ts +290 -0
- package/plugins/specweave-kafka/lib/mcp/detector.js +298 -0
- package/plugins/specweave-kafka/lib/mcp/detector.ts +352 -0
- package/plugins/specweave-kafka/lib/mcp/types.js +21 -0
- package/plugins/specweave-kafka/lib/mcp/types.ts +77 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.js +193 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.ts +362 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.js +188 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.ts +359 -0
- package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.js +195 -0
- package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.ts +380 -0
- package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.js +209 -0
- package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.ts +358 -0
- package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.js +354 -0
- package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.ts +563 -0
- package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.js +259 -0
- package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.ts +516 -0
- package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.js +233 -0
- package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.ts +423 -0
- package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.js +266 -0
- package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.ts +445 -0
- package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.js +312 -0
- package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.ts +561 -0
- package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.js +289 -0
- package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.ts +607 -0
- package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.js +264 -0
- package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.ts +498 -0
- package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.js +263 -0
- package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.ts +549 -0
- package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.js +205 -0
- package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.ts +399 -0
- package/plugins/specweave-kafka/lib/performance/performance-optimizer.js +249 -0
- package/plugins/specweave-kafka/lib/performance/performance-optimizer.ts +427 -0
- package/plugins/specweave-kafka/lib/security/kafka-security.js +252 -0
- package/plugins/specweave-kafka/lib/security/kafka-security.ts +494 -0
- package/plugins/specweave-kafka/lib/utils/capacity-planner.js +203 -0
- package/plugins/specweave-kafka/lib/utils/capacity-planner.ts +469 -0
- package/plugins/specweave-kafka/lib/utils/config-validator.js +419 -0
- package/plugins/specweave-kafka/lib/utils/config-validator.ts +564 -0
- package/plugins/specweave-kafka/lib/utils/partitioning.js +329 -0
- package/plugins/specweave-kafka/lib/utils/partitioning.ts +473 -0
- package/plugins/specweave-kafka/lib/utils/sizing.js +221 -0
- package/plugins/specweave-kafka/lib/utils/sizing.ts +374 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-broker-metrics.json +628 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-cluster-overview.json +564 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-consumer-lag.json +509 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-jvm-metrics.json +674 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-topic-metrics.json +578 -0
- package/plugins/specweave-kafka/monitoring/grafana/provisioning/dashboards/kafka.yml +17 -0
- package/plugins/specweave-kafka/monitoring/grafana/provisioning/datasources/prometheus.yml +17 -0
- package/plugins/specweave-kafka/monitoring/prometheus/kafka-alerts.yml +415 -0
- package/plugins/specweave-kafka/monitoring/prometheus/kafka-jmx-exporter.yml +256 -0
- package/plugins/specweave-kafka/package.json +41 -0
- package/plugins/specweave-kafka/skills/kafka-architecture/SKILL.md +647 -0
- package/plugins/specweave-kafka/skills/kafka-cli-tools/SKILL.md +433 -0
- package/plugins/specweave-kafka/skills/kafka-iac-deployment/SKILL.md +449 -0
- package/plugins/specweave-kafka/skills/kafka-kubernetes/SKILL.md +667 -0
- package/plugins/specweave-kafka/skills/kafka-mcp-integration/SKILL.md +273 -0
- package/plugins/specweave-kafka/skills/kafka-observability/SKILL.md +576 -0
- package/plugins/specweave-kafka/templates/config/broker-production.properties +254 -0
- package/plugins/specweave-kafka/templates/config/consumer-low-latency.properties +112 -0
- package/plugins/specweave-kafka/templates/config/producer-high-throughput.properties +120 -0
- package/plugins/specweave-kafka/templates/migration/mirrormaker2-config.properties +234 -0
- package/plugins/specweave-kafka/templates/monitoring/grafana/multi-cluster-dashboard.json +686 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/main.tf +347 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/outputs.tf +107 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/templates/kafka-broker-init.sh.tpl +216 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/variables.tf +156 -0
- package/plugins/specweave-kafka/terraform/aws-msk/main.tf +362 -0
- package/plugins/specweave-kafka/terraform/aws-msk/outputs.tf +93 -0
- package/plugins/specweave-kafka/terraform/aws-msk/templates/server.properties.tpl +32 -0
- package/plugins/specweave-kafka/terraform/aws-msk/variables.tf +235 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/main.tf +281 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/outputs.tf +118 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/variables.tf +148 -0
- package/plugins/specweave-kafka/tsconfig.json +21 -0
- package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-kafka-streams/README.md +310 -0
- package/plugins/specweave-kafka-streams/skills/kafka-streams-topology/SKILL.md +539 -0
- package/plugins/specweave-n8n/.claude-plugin/plugin.json +22 -0
- package/plugins/specweave-n8n/README.md +354 -0
- package/plugins/specweave-n8n/skills/n8n-kafka-workflows/SKILL.md +504 -0
- package/plugins/specweave-release/commands/specweave-release-platform.md +1 -1
- package/plugins/specweave-release/hooks/post-task-completion.sh +2 -2
- package/src/templates/AGENTS.md.template +601 -7
- package/src/templates/CLAUDE.md.template +188 -88
- package/plugins/specweave-ado/commands/specweave-ado-sync-spec.md +0 -255
- package/plugins/specweave-github/commands/specweave-github-sync-epic.md +0 -248
- package/plugins/specweave-github/commands/specweave-github-sync-from.md +0 -147
- package/plugins/specweave-github/commands/specweave-github-sync-spec.md +0 -208
- package/plugins/specweave-github/commands/specweave-github-sync-tasks.md +0 -530
- package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +0 -267
- package/plugins/specweave-jira/commands/specweave-jira-sync-spec.md +0 -240
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Increment Number Management Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides centralized utilities for managing increment numbers across
|
|
5
|
+
* all SpecWeave directories (main, _archive, _abandoned, _paused).
|
|
6
|
+
*
|
|
7
|
+
* Prevents increment number reuse when increments are moved to subdirectories.
|
|
8
|
+
*
|
|
9
|
+
* @module increment-utils
|
|
10
|
+
* @since 0.18.3
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
/**
|
|
15
|
+
* Centralized manager for increment number generation and validation.
|
|
16
|
+
*
|
|
17
|
+
* Scans ALL increment directories to ensure sequential numbering and
|
|
18
|
+
* prevent duplicate increment IDs.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* // Get next increment number
|
|
23
|
+
* const nextId = IncrementNumberManager.getNextIncrementNumber();
|
|
24
|
+
* console.log(nextId); // "0033"
|
|
25
|
+
*
|
|
26
|
+
* // Check if increment exists
|
|
27
|
+
* const exists = IncrementNumberManager.incrementNumberExists("0032");
|
|
28
|
+
* console.log(exists); // true
|
|
29
|
+
*
|
|
30
|
+
* // Clear cache (if needed)
|
|
31
|
+
* IncrementNumberManager.clearCache();
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export class IncrementNumberManager {
|
|
35
|
+
/**
|
|
36
|
+
* Get the next available increment number across all directories.
|
|
37
|
+
*
|
|
38
|
+
* Scans main directory and all subdirectories (_archive, _abandoned, _paused)
|
|
39
|
+
* to find the highest increment number and returns the next sequential number.
|
|
40
|
+
*
|
|
41
|
+
* @param projectRoot - Project root directory (defaults to process.cwd())
|
|
42
|
+
* @param useCache - Whether to use cached value (defaults to true)
|
|
43
|
+
* @returns Next increment number as 4-digit string (e.g., "0033")
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* const nextId = IncrementNumberManager.getNextIncrementNumber();
|
|
48
|
+
* // "0033"
|
|
49
|
+
*
|
|
50
|
+
* const nextIdNoCache = IncrementNumberManager.getNextIncrementNumber(undefined, false);
|
|
51
|
+
* // "0033" (fresh scan)
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
static getNextIncrementNumber(projectRoot = process.cwd(), useCache = true) {
|
|
55
|
+
const incrementsDir = path.join(projectRoot, '.specweave', 'increments');
|
|
56
|
+
const cacheKey = incrementsDir;
|
|
57
|
+
// Check cache if enabled
|
|
58
|
+
if (useCache) {
|
|
59
|
+
const cached = this.cache.get(cacheKey);
|
|
60
|
+
if (cached && Date.now() - cached.timestamp < this.CACHE_TTL) {
|
|
61
|
+
return String(cached.number).padStart(4, '0');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Scan all directories
|
|
65
|
+
const highestNumber = this.scanAllIncrementDirectories(incrementsDir);
|
|
66
|
+
const nextNumber = highestNumber + 1;
|
|
67
|
+
// Update cache
|
|
68
|
+
this.cache.set(cacheKey, {
|
|
69
|
+
number: nextNumber,
|
|
70
|
+
timestamp: Date.now()
|
|
71
|
+
});
|
|
72
|
+
// Auto-expire cache after TTL
|
|
73
|
+
setTimeout(() => {
|
|
74
|
+
this.cache.delete(cacheKey);
|
|
75
|
+
}, this.CACHE_TTL);
|
|
76
|
+
return String(nextNumber).padStart(4, '0');
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if an increment number already exists in any directory.
|
|
80
|
+
*
|
|
81
|
+
* Scans all directories to determine if the given increment number
|
|
82
|
+
* has already been used. Normalizes 3-digit IDs to 4-digit for comparison.
|
|
83
|
+
*
|
|
84
|
+
* @param incrementNumber - Increment number to check (string or number)
|
|
85
|
+
* @param projectRoot - Project root directory (defaults to process.cwd())
|
|
86
|
+
* @returns true if increment exists, false otherwise
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```typescript
|
|
90
|
+
* IncrementNumberManager.incrementNumberExists("0032"); // true
|
|
91
|
+
* IncrementNumberManager.incrementNumberExists(32); // true
|
|
92
|
+
* IncrementNumberManager.incrementNumberExists("9999"); // false
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
static incrementNumberExists(incrementNumber, projectRoot = process.cwd()) {
|
|
96
|
+
const incrementsDir = path.join(projectRoot, '.specweave', 'increments');
|
|
97
|
+
// Normalize to 4-digit string
|
|
98
|
+
const normalizedNumber = String(incrementNumber).padStart(4, '0');
|
|
99
|
+
// Directories to check
|
|
100
|
+
const dirsToCheck = [
|
|
101
|
+
incrementsDir,
|
|
102
|
+
path.join(incrementsDir, '_archive'),
|
|
103
|
+
path.join(incrementsDir, '_abandoned'),
|
|
104
|
+
path.join(incrementsDir, '_paused')
|
|
105
|
+
];
|
|
106
|
+
// Check each directory
|
|
107
|
+
for (const dir of dirsToCheck) {
|
|
108
|
+
if (!fs.existsSync(dir))
|
|
109
|
+
continue;
|
|
110
|
+
try {
|
|
111
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
112
|
+
for (const entry of entries) {
|
|
113
|
+
if (!entry.isDirectory())
|
|
114
|
+
continue;
|
|
115
|
+
// Match pattern: 0032-name or 032-name
|
|
116
|
+
const match = entry.name.match(/^(\d{3,4})-/);
|
|
117
|
+
if (match) {
|
|
118
|
+
const entryNumber = match[1].padStart(4, '0');
|
|
119
|
+
if (entryNumber === normalizedNumber) {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
// Permission denied or other error - continue
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Clear the increment number cache.
|
|
134
|
+
*
|
|
135
|
+
* Forces next call to getNextIncrementNumber() to perform a fresh
|
|
136
|
+
* filesystem scan instead of using cached value.
|
|
137
|
+
*
|
|
138
|
+
* Useful for testing or when you know the filesystem has changed.
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```typescript
|
|
142
|
+
* IncrementNumberManager.clearCache();
|
|
143
|
+
* const freshId = IncrementNumberManager.getNextIncrementNumber();
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
static clearCache() {
|
|
147
|
+
this.cache.clear();
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Scan all increment directories and return highest number found.
|
|
151
|
+
*
|
|
152
|
+
* Scans these directories (in order):
|
|
153
|
+
* 1. .specweave/increments/ (main)
|
|
154
|
+
* 2. .specweave/increments/_archive/
|
|
155
|
+
* 3. .specweave/increments/_abandoned/
|
|
156
|
+
* 4. .specweave/increments/_paused/
|
|
157
|
+
*
|
|
158
|
+
* @param incrementsDir - Path to .specweave/increments directory
|
|
159
|
+
* @returns Highest increment number found (0 if none exist)
|
|
160
|
+
* @private
|
|
161
|
+
*/
|
|
162
|
+
static scanAllIncrementDirectories(incrementsDir) {
|
|
163
|
+
let highestNumber = 0;
|
|
164
|
+
// Directories to scan
|
|
165
|
+
const dirsToScan = [
|
|
166
|
+
{ path: incrementsDir, label: 'main' },
|
|
167
|
+
{ path: path.join(incrementsDir, '_archive'), label: '_archive' },
|
|
168
|
+
{ path: path.join(incrementsDir, '_abandoned'), label: '_abandoned' },
|
|
169
|
+
{ path: path.join(incrementsDir, '_paused'), label: '_paused' }
|
|
170
|
+
];
|
|
171
|
+
// Scan each directory
|
|
172
|
+
for (const { path: dirPath, label } of dirsToScan) {
|
|
173
|
+
if (!fs.existsSync(dirPath))
|
|
174
|
+
continue;
|
|
175
|
+
try {
|
|
176
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
177
|
+
for (const entry of entries) {
|
|
178
|
+
if (!entry.isDirectory())
|
|
179
|
+
continue;
|
|
180
|
+
// Match pattern: 0032-name or 032-name
|
|
181
|
+
const match = entry.name.match(/^(\d{3,4})-/);
|
|
182
|
+
if (match) {
|
|
183
|
+
const number = parseInt(match[1], 10);
|
|
184
|
+
if (number > highestNumber) {
|
|
185
|
+
highestNumber = number;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
// Permission denied or other error - log warning and continue
|
|
192
|
+
console.warn(`Warning: Could not scan directory ${dirPath}:`, error.message);
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return highestNumber;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* In-memory cache for increment numbers (performance optimization)
|
|
201
|
+
* Key: incrementsDir path, Value: highest increment number
|
|
202
|
+
* @private
|
|
203
|
+
*/
|
|
204
|
+
IncrementNumberManager.cache = new Map();
|
|
205
|
+
/**
|
|
206
|
+
* Cache time-to-live in milliseconds (5 seconds)
|
|
207
|
+
* @private
|
|
208
|
+
*/
|
|
209
|
+
IncrementNumberManager.CACHE_TTL = 5000;
|
|
210
|
+
//# sourceMappingURL=increment-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"increment-utils.js","sourceRoot":"","sources":["../../../src/core/increment-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Acceptance Criteria Project-Specific Generator
|
|
3
|
+
*
|
|
4
|
+
* Intelligently rewrites acceptance criteria based on project context.
|
|
5
|
+
*
|
|
6
|
+
* Architecture:
|
|
7
|
+
* - Generic AC (config schema, validation) → Keep unchanged
|
|
8
|
+
* - Backend AC (API, database) → Rewrite with backend context
|
|
9
|
+
* - Frontend AC (UI, component) → Rewrite with frontend context
|
|
10
|
+
* - Mobile AC (screen, gesture) → Rewrite with mobile context
|
|
11
|
+
*
|
|
12
|
+
* Example:
|
|
13
|
+
* - Original: "UI displays status configuration form"
|
|
14
|
+
* - Backend: "Backend service: API returns status configuration data"
|
|
15
|
+
* - Frontend: "UI: Component displays status configuration form"
|
|
16
|
+
* - Mobile: "Mobile app: Screen displays status configuration form"
|
|
17
|
+
*
|
|
18
|
+
* Related:
|
|
19
|
+
* - .specweave/increments/0034-github-ac-checkboxes-fix/reports/ULTRATHINK-AC-PROJECT-SPECIFIC-DESIGN.md
|
|
20
|
+
* - src/core/living-docs/spec-distributor.ts (uses this)
|
|
21
|
+
*/
|
|
22
|
+
export interface ProjectContext {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
type: 'backend' | 'frontend' | 'mobile' | 'infrastructure' | 'generic';
|
|
26
|
+
techStack: string[];
|
|
27
|
+
keywords: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface AcceptanceCriterion {
|
|
30
|
+
id: string;
|
|
31
|
+
description: string;
|
|
32
|
+
priority?: string;
|
|
33
|
+
testable: boolean;
|
|
34
|
+
completed: boolean;
|
|
35
|
+
projectSpecific?: boolean;
|
|
36
|
+
}
|
|
37
|
+
export declare class ACProjectSpecificGenerator {
|
|
38
|
+
/**
|
|
39
|
+
* Make acceptance criteria project-specific
|
|
40
|
+
*
|
|
41
|
+
* Strategy:
|
|
42
|
+
* 1. Detect if AC is generic (applies to all projects)
|
|
43
|
+
* 2. Detect if AC needs project-specific variant
|
|
44
|
+
* 3. Rewrite AC description based on project context
|
|
45
|
+
* 4. Add project suffix to AC ID
|
|
46
|
+
*/
|
|
47
|
+
makeProjectSpecific(ac: AcceptanceCriterion[], userStoryId: string, projectContext: ProjectContext): AcceptanceCriterion[];
|
|
48
|
+
/**
|
|
49
|
+
* Detect if AC is generic (applies to all projects without changes)
|
|
50
|
+
*/
|
|
51
|
+
private isGenericAC;
|
|
52
|
+
/**
|
|
53
|
+
* Detect if AC needs project-specific variant
|
|
54
|
+
*/
|
|
55
|
+
private needsProjectVariant;
|
|
56
|
+
/**
|
|
57
|
+
* Rewrite AC description for specific project
|
|
58
|
+
*/
|
|
59
|
+
private rewriteACForProject;
|
|
60
|
+
/**
|
|
61
|
+
* Get project suffix for AC ID
|
|
62
|
+
*/
|
|
63
|
+
private getProjectSuffix;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=ac-project-specific-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ac-project-specific-generator.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/ac-project-specific-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACvE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,0BAA0B;IACrC;;;;;;;;OAQG;IACH,mBAAmB,CACjB,EAAE,EAAE,mBAAmB,EAAE,EACzB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,GAC7B,mBAAmB,EAAE;IA8BxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAgBnB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+E3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAWzB"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Acceptance Criteria Project-Specific Generator
|
|
3
|
+
*
|
|
4
|
+
* Intelligently rewrites acceptance criteria based on project context.
|
|
5
|
+
*
|
|
6
|
+
* Architecture:
|
|
7
|
+
* - Generic AC (config schema, validation) → Keep unchanged
|
|
8
|
+
* - Backend AC (API, database) → Rewrite with backend context
|
|
9
|
+
* - Frontend AC (UI, component) → Rewrite with frontend context
|
|
10
|
+
* - Mobile AC (screen, gesture) → Rewrite with mobile context
|
|
11
|
+
*
|
|
12
|
+
* Example:
|
|
13
|
+
* - Original: "UI displays status configuration form"
|
|
14
|
+
* - Backend: "Backend service: API returns status configuration data"
|
|
15
|
+
* - Frontend: "UI: Component displays status configuration form"
|
|
16
|
+
* - Mobile: "Mobile app: Screen displays status configuration form"
|
|
17
|
+
*
|
|
18
|
+
* Related:
|
|
19
|
+
* - .specweave/increments/0034-github-ac-checkboxes-fix/reports/ULTRATHINK-AC-PROJECT-SPECIFIC-DESIGN.md
|
|
20
|
+
* - src/core/living-docs/spec-distributor.ts (uses this)
|
|
21
|
+
*/
|
|
22
|
+
export class ACProjectSpecificGenerator {
|
|
23
|
+
/**
|
|
24
|
+
* Make acceptance criteria project-specific
|
|
25
|
+
*
|
|
26
|
+
* Strategy:
|
|
27
|
+
* 1. Detect if AC is generic (applies to all projects)
|
|
28
|
+
* 2. Detect if AC needs project-specific variant
|
|
29
|
+
* 3. Rewrite AC description based on project context
|
|
30
|
+
* 4. Add project suffix to AC ID
|
|
31
|
+
*/
|
|
32
|
+
makeProjectSpecific(ac, userStoryId, projectContext) {
|
|
33
|
+
return ac.map((criterion) => {
|
|
34
|
+
// Step 1: Detect if AC is generic
|
|
35
|
+
if (this.isGenericAC(criterion.description)) {
|
|
36
|
+
return criterion; // Keep as-is
|
|
37
|
+
}
|
|
38
|
+
// Step 2: Detect if AC needs project-specific variant
|
|
39
|
+
const needsProjectVariant = this.needsProjectVariant(criterion.description, projectContext);
|
|
40
|
+
if (!needsProjectVariant) {
|
|
41
|
+
return criterion; // Keep as-is
|
|
42
|
+
}
|
|
43
|
+
// Step 3: Rewrite AC for this project
|
|
44
|
+
const projectSpecificDesc = this.rewriteACForProject(criterion.description, projectContext);
|
|
45
|
+
// Step 4: Add project suffix to ID
|
|
46
|
+
const projectSuffix = this.getProjectSuffix(projectContext);
|
|
47
|
+
const projectSpecificId = `${criterion.id}-${projectSuffix}`;
|
|
48
|
+
return {
|
|
49
|
+
...criterion,
|
|
50
|
+
id: projectSpecificId,
|
|
51
|
+
description: projectSpecificDesc,
|
|
52
|
+
projectSpecific: true,
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Detect if AC is generic (applies to all projects without changes)
|
|
58
|
+
*/
|
|
59
|
+
isGenericAC(description) {
|
|
60
|
+
const genericIndicators = [
|
|
61
|
+
/config\s+schema/i,
|
|
62
|
+
/default\s+(mappings|settings|configuration)/i,
|
|
63
|
+
/validation\s+prevents/i,
|
|
64
|
+
/error\s+handling/i,
|
|
65
|
+
/documentation\s+includes/i,
|
|
66
|
+
/logging/i,
|
|
67
|
+
/\btest\b.*\bcoverage\b/i, // "test coverage"
|
|
68
|
+
/\bunit\s+test/i,
|
|
69
|
+
/\bintegration\s+test/i,
|
|
70
|
+
];
|
|
71
|
+
return genericIndicators.some((pattern) => pattern.test(description));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Detect if AC needs project-specific variant
|
|
75
|
+
*/
|
|
76
|
+
needsProjectVariant(description, projectContext) {
|
|
77
|
+
// Backend-specific indicators
|
|
78
|
+
if (projectContext.type === 'backend') {
|
|
79
|
+
return /API|endpoint|database|service|server|request|response/i.test(description);
|
|
80
|
+
}
|
|
81
|
+
// Frontend-specific indicators
|
|
82
|
+
if (projectContext.type === 'frontend') {
|
|
83
|
+
return /UI|component|screen|form|display|render|button|click|input/i.test(description);
|
|
84
|
+
}
|
|
85
|
+
// Mobile-specific indicators
|
|
86
|
+
if (projectContext.type === 'mobile') {
|
|
87
|
+
return /screen|navigation|gesture|native|platform|tap|swipe/i.test(description);
|
|
88
|
+
}
|
|
89
|
+
// Infrastructure-specific indicators
|
|
90
|
+
if (projectContext.type === 'infrastructure') {
|
|
91
|
+
return /deployment|CI\/CD|pipeline|monitoring|scaling|cluster|container/i.test(description);
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Rewrite AC description for specific project
|
|
97
|
+
*/
|
|
98
|
+
rewriteACForProject(description, projectContext) {
|
|
99
|
+
let rewritten = description;
|
|
100
|
+
// Backend-specific rewrites
|
|
101
|
+
if (projectContext.type === 'backend') {
|
|
102
|
+
rewritten = rewritten
|
|
103
|
+
.replace(/UI\s+(displays|shows)/gi, 'API returns')
|
|
104
|
+
.replace(/form\s+validation/gi, 'request payload validation')
|
|
105
|
+
.replace(/\bscreen\b/gi, 'endpoint')
|
|
106
|
+
.replace(/button\s+click/gi, 'API call')
|
|
107
|
+
.replace(/user\s+sees/gi, 'API response includes')
|
|
108
|
+
.replace(/component/gi, 'service')
|
|
109
|
+
.replace(/\brender\b/gi, 'serialize');
|
|
110
|
+
// Add backend context prefix if not already present
|
|
111
|
+
if (!rewritten.includes('Backend') &&
|
|
112
|
+
!rewritten.includes('API') &&
|
|
113
|
+
!rewritten.includes('service')) {
|
|
114
|
+
rewritten = `Backend service: ${rewritten}`;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Frontend-specific rewrites
|
|
118
|
+
if (projectContext.type === 'frontend') {
|
|
119
|
+
rewritten = rewritten
|
|
120
|
+
.replace(/API\s+endpoint/gi, 'UI component')
|
|
121
|
+
.replace(/database\s+schema/gi, 'state management')
|
|
122
|
+
.replace(/server\s+validates/gi, 'client-side validation')
|
|
123
|
+
.replace(/returns\s+response/gi, 'displays result')
|
|
124
|
+
.replace(/service/gi, 'component')
|
|
125
|
+
.replace(/\bserialize\b/gi, 'render');
|
|
126
|
+
// Add frontend context prefix if not already present
|
|
127
|
+
if (!rewritten.includes('UI') &&
|
|
128
|
+
!rewritten.includes('component') &&
|
|
129
|
+
!rewritten.includes('Frontend')) {
|
|
130
|
+
rewritten = `UI: ${rewritten}`;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Mobile-specific rewrites
|
|
134
|
+
if (projectContext.type === 'mobile') {
|
|
135
|
+
rewritten = rewritten
|
|
136
|
+
.replace(/\bpage\b/gi, 'screen')
|
|
137
|
+
.replace(/\bclick\b/gi, 'tap')
|
|
138
|
+
.replace(/\bhover\b/gi, 'long press')
|
|
139
|
+
.replace(/component/gi, 'view')
|
|
140
|
+
.replace(/web/gi, 'mobile');
|
|
141
|
+
// Add mobile context prefix if not already present
|
|
142
|
+
if (!rewritten.includes('Mobile') && !rewritten.includes('screen')) {
|
|
143
|
+
rewritten = `Mobile app: ${rewritten}`;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Infrastructure-specific rewrites
|
|
147
|
+
if (projectContext.type === 'infrastructure') {
|
|
148
|
+
rewritten = rewritten
|
|
149
|
+
.replace(/\bcode\b/gi, 'infrastructure code')
|
|
150
|
+
.replace(/application/gi, 'deployment')
|
|
151
|
+
.replace(/feature/gi, 'infrastructure change');
|
|
152
|
+
// Add infrastructure context if not present
|
|
153
|
+
if (!rewritten.includes('Infrastructure') &&
|
|
154
|
+
!rewritten.includes('deployment') &&
|
|
155
|
+
!rewritten.includes('pipeline')) {
|
|
156
|
+
rewritten = `Infrastructure: ${rewritten}`;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return rewritten;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get project suffix for AC ID
|
|
163
|
+
*/
|
|
164
|
+
getProjectSuffix(projectContext) {
|
|
165
|
+
const suffixMap = {
|
|
166
|
+
backend: 'BE',
|
|
167
|
+
frontend: 'FE',
|
|
168
|
+
mobile: 'MOB',
|
|
169
|
+
infrastructure: 'INFRA',
|
|
170
|
+
generic: 'GEN',
|
|
171
|
+
};
|
|
172
|
+
return suffixMap[projectContext.type] || projectContext.id.slice(0, 3).toUpperCase();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=ac-project-specific-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ac-project-specific-generator.js","sourceRoot":"","sources":["../../../../src/core/living-docs/ac-project-specific-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAmBH,MAAM,OAAO,0BAA0B;IACrC;;;;;;;;OAQG;IACH,mBAAmB,CACjB,EAAyB,EACzB,WAAmB,EACnB,cAA8B;QAE9B,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YAC1B,kCAAkC;YAClC,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5C,OAAO,SAAS,CAAC,CAAC,aAAa;YACjC,CAAC;YAED,sDAAsD;YACtD,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YAE5F,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzB,OAAO,SAAS,CAAC,CAAC,aAAa;YACjC,CAAC;YAED,sCAAsC;YACtC,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YAE5F,mCAAmC;YACnC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;YAC5D,MAAM,iBAAiB,GAAG,GAAG,SAAS,CAAC,EAAE,IAAI,aAAa,EAAE,CAAC;YAE7D,OAAO;gBACL,GAAG,SAAS;gBACZ,EAAE,EAAE,iBAAiB;gBACrB,WAAW,EAAE,mBAAmB;gBAChC,eAAe,EAAE,IAAI;aACtB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,WAAmB;QACrC,MAAM,iBAAiB,GAAG;YACxB,kBAAkB;YAClB,8CAA8C;YAC9C,wBAAwB;YACxB,mBAAmB;YACnB,2BAA2B;YAC3B,UAAU;YACV,yBAAyB,EAAE,kBAAkB;YAC7C,gBAAgB;YAChB,uBAAuB;SACxB,CAAC;QAEF,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,WAAmB,EAAE,cAA8B;QAC7E,8BAA8B;QAC9B,IAAI,cAAc,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,wDAAwD,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpF,CAAC;QAED,+BAA+B;QAC/B,IAAI,cAAc,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACvC,OAAO,6DAA6D,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzF,CAAC;QAED,6BAA6B;QAC7B,IAAI,cAAc,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAO,sDAAsD,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClF,CAAC;QAED,qCAAqC;QACrC,IAAI,cAAc,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAC7C,OAAO,kEAAkE,CAAC,IAAI,CAC5E,WAAW,CACZ,CAAC;QACJ,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,WAAmB,EAAE,cAA8B;QAC7E,IAAI,SAAS,GAAG,WAAW,CAAC;QAE5B,4BAA4B;QAC5B,IAAI,cAAc,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,SAAS,GAAG,SAAS;iBAClB,OAAO,CAAC,yBAAyB,EAAE,aAAa,CAAC;iBACjD,OAAO,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;iBAC5D,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC;iBACnC,OAAO,CAAC,kBAAkB,EAAE,UAAU,CAAC;iBACvC,OAAO,CAAC,eAAe,EAAE,uBAAuB,CAAC;iBACjD,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC;iBACjC,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YAExC,oDAAoD;YACpD,IACE,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAC9B,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC1B,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAC9B,CAAC;gBACD,SAAS,GAAG,oBAAoB,SAAS,EAAE,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,cAAc,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACvC,SAAS,GAAG,SAAS;iBAClB,OAAO,CAAC,kBAAkB,EAAE,cAAc,CAAC;iBAC3C,OAAO,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;iBAClD,OAAO,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;iBACzD,OAAO,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;iBAClD,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC;iBACjC,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAExC,qDAAqD;YACrD,IACE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACzB,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAChC,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAC/B,CAAC;gBACD,SAAS,GAAG,OAAO,SAAS,EAAE,CAAC;YACjC,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,cAAc,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,SAAS,GAAG,SAAS;iBAClB,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;iBAC/B,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC;iBAC7B,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC;iBACpC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC;iBAC9B,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAE9B,mDAAmD;YACnD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnE,SAAS,GAAG,eAAe,SAAS,EAAE,CAAC;YACzC,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,IAAI,cAAc,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAC7C,SAAS,GAAG,SAAS;iBAClB,OAAO,CAAC,YAAY,EAAE,qBAAqB,CAAC;iBAC5C,OAAO,CAAC,eAAe,EAAE,YAAY,CAAC;iBACtC,OAAO,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;YAEjD,4CAA4C;YAC5C,IACE,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBACrC,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;gBACjC,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAC/B,CAAC;gBACD,SAAS,GAAG,mBAAmB,SAAS,EAAE,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,cAA8B;QACrD,MAAM,SAAS,GAA2B;YACxC,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,KAAK;YACb,cAAc,EAAE,OAAO;YACvB,OAAO,EAAE,KAAK;SACf,CAAC;QAEF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACvF,CAAC;CACF"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature & Epic Archiver - Smart archiving system for features and epics
|
|
3
|
+
*
|
|
4
|
+
* Works in tandem with IncrementArchiver to maintain consistency between
|
|
5
|
+
* increments, features, and epics. When an increment is archived, its
|
|
6
|
+
* associated feature is automatically archived if all increments for
|
|
7
|
+
* that feature are archived.
|
|
8
|
+
*/
|
|
9
|
+
interface LinkUpdate {
|
|
10
|
+
file: string;
|
|
11
|
+
oldLink: string;
|
|
12
|
+
newLink: string;
|
|
13
|
+
lineNumber: number;
|
|
14
|
+
}
|
|
15
|
+
export interface FeatureArchiveOptions {
|
|
16
|
+
dryRun?: boolean;
|
|
17
|
+
updateLinks?: boolean;
|
|
18
|
+
preserveActiveFeatures?: boolean;
|
|
19
|
+
archiveOrphanedFeatures?: boolean;
|
|
20
|
+
archiveOrphanedEpics?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface FeatureArchiveResult {
|
|
23
|
+
archivedFeatures: string[];
|
|
24
|
+
archivedEpics: string[];
|
|
25
|
+
updatedLinks: LinkUpdate[];
|
|
26
|
+
errors: string[];
|
|
27
|
+
}
|
|
28
|
+
export declare class FeatureArchiver {
|
|
29
|
+
private rootDir;
|
|
30
|
+
private specsDir;
|
|
31
|
+
private featuresDir;
|
|
32
|
+
private epicsDir;
|
|
33
|
+
private incrementArchiver;
|
|
34
|
+
private hierarchyMapper;
|
|
35
|
+
private featureIdManager;
|
|
36
|
+
constructor(rootDir: string);
|
|
37
|
+
/**
|
|
38
|
+
* Archive features and epics based on increment archive status
|
|
39
|
+
*/
|
|
40
|
+
archiveFeatures(options?: FeatureArchiveOptions): Promise<FeatureArchiveResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Identify features that should be archived
|
|
43
|
+
*/
|
|
44
|
+
private identifyFeaturesToArchive;
|
|
45
|
+
/**
|
|
46
|
+
* Identify epics that should be archived
|
|
47
|
+
*/
|
|
48
|
+
private identifyEpicsToArchive;
|
|
49
|
+
/**
|
|
50
|
+
* Execute an archive operation
|
|
51
|
+
*/
|
|
52
|
+
private executeArchiveOperation;
|
|
53
|
+
/**
|
|
54
|
+
* Archive project-specific folders for a feature
|
|
55
|
+
*/
|
|
56
|
+
private archiveProjectSpecificFolders;
|
|
57
|
+
/**
|
|
58
|
+
* Update all links to archived items
|
|
59
|
+
*/
|
|
60
|
+
private updateAllLinks;
|
|
61
|
+
/**
|
|
62
|
+
* Update links in a single file
|
|
63
|
+
*/
|
|
64
|
+
private updateLinksInFile;
|
|
65
|
+
/**
|
|
66
|
+
* Get all features
|
|
67
|
+
*/
|
|
68
|
+
private getAllFeatures;
|
|
69
|
+
/**
|
|
70
|
+
* Get all epics
|
|
71
|
+
*/
|
|
72
|
+
private getAllEpics;
|
|
73
|
+
/**
|
|
74
|
+
* Get increments linked to a feature
|
|
75
|
+
*/
|
|
76
|
+
private getLinkedIncrements;
|
|
77
|
+
/**
|
|
78
|
+
* Get features linked to an epic
|
|
79
|
+
*/
|
|
80
|
+
private getLinkedFeatures;
|
|
81
|
+
/**
|
|
82
|
+
* Check if all features are archived
|
|
83
|
+
*/
|
|
84
|
+
private areAllFeaturesArchived;
|
|
85
|
+
/**
|
|
86
|
+
* Check if feature has active projects
|
|
87
|
+
*/
|
|
88
|
+
private hasActiveProjects;
|
|
89
|
+
/**
|
|
90
|
+
* Ensure archive directories exist
|
|
91
|
+
*/
|
|
92
|
+
private ensureArchiveDirectories;
|
|
93
|
+
/**
|
|
94
|
+
* Restore an epic from archive
|
|
95
|
+
*/
|
|
96
|
+
restoreEpic(epicId: string): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Update links for restored epic
|
|
99
|
+
*/
|
|
100
|
+
private updateLinksForRestoredEpic;
|
|
101
|
+
/**
|
|
102
|
+
* Restore a feature from archive
|
|
103
|
+
*/
|
|
104
|
+
restoreFeature(featureId: string): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Update links for restored feature
|
|
107
|
+
*/
|
|
108
|
+
private updateLinksForRestoredFeature;
|
|
109
|
+
/**
|
|
110
|
+
* Get archive statistics
|
|
111
|
+
*/
|
|
112
|
+
getArchiveStats(): Promise<{
|
|
113
|
+
features: {
|
|
114
|
+
active: number;
|
|
115
|
+
archived: number;
|
|
116
|
+
};
|
|
117
|
+
epics: {
|
|
118
|
+
active: number;
|
|
119
|
+
archived: number;
|
|
120
|
+
};
|
|
121
|
+
projects: {
|
|
122
|
+
[key: string]: {
|
|
123
|
+
active: number;
|
|
124
|
+
archived: number;
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
}>;
|
|
128
|
+
}
|
|
129
|
+
export {};
|
|
130
|
+
//# sourceMappingURL=feature-archiver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-archiver.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/feature-archiver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkBH,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,OAAO,EAAE,MAAM;IAU3B;;OAEG;IACG,eAAe,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA0CzF;;OAEG;YACW,yBAAyB;IAkDvC;;OAEG;YACW,sBAAsB;IA4CpC;;OAEG;YACW,uBAAuB;IAsCrC;;OAEG;YACW,6BAA6B;IAkB3C;;OAEG;YACW,cAAc;IAwB5B;;OAEG;YACW,iBAAiB;IAwE/B;;OAEG;YACW,cAAc;IAmB5B;;OAEG;YACW,WAAW;IAmBzB;;OAEG;YACW,mBAAmB;IA8BjC;;OAEG;YACW,iBAAiB;IA+B/B;;OAEG;YACW,sBAAsB;IAkBpC;;OAEG;YACW,iBAAiB;IAwB/B;;OAEG;YACW,wBAAwB;IAiBtC;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBhD;;OAEG;YACW,0BAA0B;IAyBxC;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCtD;;OAEG;YACW,6BAA6B;IA4B3C;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC;QAC/B,QAAQ,EAAE;YACR,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,KAAK,EAAE;YACL,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,QAAQ,EAAE;YACR,CAAC,GAAG,EAAE,MAAM,GAAG;gBACb,MAAM,EAAE,MAAM,CAAC;gBACf,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;SACH,CAAC;KACH,CAAC;CA6CH"}
|