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,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Completion Calculator - Verifies actual work completion from markdown checkboxes
|
|
3
|
+
*
|
|
4
|
+
* CRITICAL FIX: Prevents premature GitHub issue closure by verifying actual
|
|
5
|
+
* AC and Task completion state, not just frontmatter status.
|
|
6
|
+
*
|
|
7
|
+
* Problem:
|
|
8
|
+
* - OLD: Issues closed based on frontmatter `status: complete`
|
|
9
|
+
* - Issue #574: Closed with 0/5 ACs complete!
|
|
10
|
+
*
|
|
11
|
+
* Solution:
|
|
12
|
+
* - NEW: Parse actual checkbox states ([x] vs [ ])
|
|
13
|
+
* - Close ONLY when ALL ACs and ALL tasks are verified [x]
|
|
14
|
+
*
|
|
15
|
+
* Architecture:
|
|
16
|
+
* - Acceptance Criteria: Read from us-*.md files
|
|
17
|
+
* - Tasks: Read from increment's tasks.md
|
|
18
|
+
* - Verification Gate: 100% completion required
|
|
19
|
+
*/
|
|
20
|
+
import { readFile } from 'fs/promises';
|
|
21
|
+
import { existsSync } from 'fs';
|
|
22
|
+
import * as path from 'path';
|
|
23
|
+
import * as yaml from 'yaml';
|
|
24
|
+
export class CompletionCalculator {
|
|
25
|
+
constructor(projectRoot) {
|
|
26
|
+
this.projectRoot = projectRoot;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Calculate ACTUAL completion from markdown checkboxes
|
|
30
|
+
*
|
|
31
|
+
* Returns true only if:
|
|
32
|
+
* - All ACs have [x] (not [ ])
|
|
33
|
+
* - All Tasks have **Status**: [x] (not [ ])
|
|
34
|
+
* - At least 1 AC exists (no empty user stories)
|
|
35
|
+
*
|
|
36
|
+
* @param userStoryPath - Path to us-*.md file
|
|
37
|
+
* @returns Completion status with detailed metrics
|
|
38
|
+
*/
|
|
39
|
+
async calculateCompletion(userStoryPath) {
|
|
40
|
+
// Step 1: Read and parse user story
|
|
41
|
+
const content = await readFile(userStoryPath, 'utf-8');
|
|
42
|
+
const frontmatter = this.parseUserStoryFrontmatter(content);
|
|
43
|
+
// Step 2: Extract Acceptance Criteria
|
|
44
|
+
const acs = this.extractAcceptanceCriteria(content);
|
|
45
|
+
// Step 3: Extract Tasks from increment (if linked)
|
|
46
|
+
const tasks = await this.extractTasks(content, frontmatter.id);
|
|
47
|
+
// Step 4: Calculate metrics
|
|
48
|
+
const acsCompleted = acs.filter((ac) => ac.completed).length;
|
|
49
|
+
const tasksCompleted = tasks.filter((t) => t.completed).length;
|
|
50
|
+
// Step 5: Determine overall completion
|
|
51
|
+
// MUST have:
|
|
52
|
+
// - At least 1 AC (no empty user stories)
|
|
53
|
+
// - ALL ACs completed
|
|
54
|
+
// - ALL Tasks completed (or no tasks if not implemented yet)
|
|
55
|
+
const overallComplete = acs.length > 0 &&
|
|
56
|
+
acsCompleted === acs.length &&
|
|
57
|
+
(tasks.length === 0 || tasksCompleted === tasks.length);
|
|
58
|
+
return {
|
|
59
|
+
acsTotal: acs.length,
|
|
60
|
+
acsCompleted,
|
|
61
|
+
acsPercentage: acs.length > 0 ? (acsCompleted / acs.length) * 100 : 0,
|
|
62
|
+
tasksTotal: tasks.length,
|
|
63
|
+
tasksCompleted,
|
|
64
|
+
tasksPercentage: tasks.length > 0 ? (tasksCompleted / tasks.length) * 100 : 0,
|
|
65
|
+
overallComplete,
|
|
66
|
+
blockingAcs: acs.filter((ac) => !ac.completed).map((ac) => ac.id),
|
|
67
|
+
blockingTasks: tasks.filter((t) => !t.completed).map((t) => t.id),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Parse User Story frontmatter
|
|
72
|
+
*/
|
|
73
|
+
parseUserStoryFrontmatter(content) {
|
|
74
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
75
|
+
if (!match) {
|
|
76
|
+
throw new Error('Missing YAML frontmatter in user story');
|
|
77
|
+
}
|
|
78
|
+
return yaml.parse(match[1]);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Extract Acceptance Criteria with checkbox state
|
|
82
|
+
*
|
|
83
|
+
* Supports TWO formats:
|
|
84
|
+
* - Format 1 (preferred): AC-US1-01, AC-US1-02 (project-specific)
|
|
85
|
+
* - Format 2 (legacy): AC-001, AC-002, AC-020 (global)
|
|
86
|
+
*
|
|
87
|
+
* Patterns:
|
|
88
|
+
* - [x] **AC-US1-01**: Description (completed)
|
|
89
|
+
* - [ ] **AC-US1-01**: Description (not completed)
|
|
90
|
+
* - **AC-US1-01**: Description (no checkbox, default to not completed)
|
|
91
|
+
*/
|
|
92
|
+
extractAcceptanceCriteria(content) {
|
|
93
|
+
const criteria = [];
|
|
94
|
+
// Look for "Acceptance Criteria" section
|
|
95
|
+
const acMatch = content.match(/##\s*Acceptance Criteria\s*\n+([\s\S]*?)(?=\n##|$)/i);
|
|
96
|
+
if (!acMatch) {
|
|
97
|
+
return criteria;
|
|
98
|
+
}
|
|
99
|
+
const acSection = acMatch[1];
|
|
100
|
+
// Pattern with checkboxes (PREFERRED)
|
|
101
|
+
// Matches: - [x] **AC-US1-01**: Description
|
|
102
|
+
// - [ ] **AC-020**: Description
|
|
103
|
+
const acPatternWithCheckbox = /(?:^|\n)\s*[-*]\s+\[([x ])\]\s+\*\*([A-Z]+-(?:[A-Z]+\d+-)?(\d+))\*\*:\s*([^\n]+)/g;
|
|
104
|
+
// Pattern without checkboxes (FALLBACK)
|
|
105
|
+
// Matches: - **AC-US1-01**: Description
|
|
106
|
+
const acPatternNoCheckbox = /(?:^|\n)\s*[-*]?\s*\*\*([A-Z]+-(?:[A-Z]+\d+-)?(\d+))\*\*:\s*([^\n]+)/g;
|
|
107
|
+
// First try pattern with checkboxes
|
|
108
|
+
let match;
|
|
109
|
+
let foundAny = false;
|
|
110
|
+
while ((match = acPatternWithCheckbox.exec(acSection)) !== null) {
|
|
111
|
+
foundAny = true;
|
|
112
|
+
criteria.push({
|
|
113
|
+
id: match[2], // e.g., "AC-US1-01" or "AC-020"
|
|
114
|
+
description: match[4].trim(),
|
|
115
|
+
completed: match[1] === 'x', // ✅ Read checkbox state from source!
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// If no checkboxes found, try pattern without checkboxes
|
|
119
|
+
if (!foundAny) {
|
|
120
|
+
while ((match = acPatternNoCheckbox.exec(acSection)) !== null) {
|
|
121
|
+
criteria.push({
|
|
122
|
+
id: match[1], // e.g., "AC-US1-01" or "AC-020"
|
|
123
|
+
description: match[3].trim(),
|
|
124
|
+
completed: false, // Default to not completed
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return criteria;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Extract tasks from increment's tasks.md that map to this User Story
|
|
132
|
+
*
|
|
133
|
+
* Process:
|
|
134
|
+
* 1. Find increment link in user story's "Implementation" section
|
|
135
|
+
* 2. Read increment's tasks.md
|
|
136
|
+
* 3. Filter tasks that reference this user story's ACs
|
|
137
|
+
* 4. Extract completion status from **Status**: [x] or [ ]
|
|
138
|
+
*/
|
|
139
|
+
async extractTasks(userStoryContent, userStoryId) {
|
|
140
|
+
const tasks = [];
|
|
141
|
+
// Look for "Implementation" section with increment link
|
|
142
|
+
const implMatch = userStoryContent.match(/##\s*Implementation\s*\n+([\s\S]*?)(?=\n##|$)/i);
|
|
143
|
+
if (!implMatch) {
|
|
144
|
+
return tasks; // No implementation yet
|
|
145
|
+
}
|
|
146
|
+
const implSection = implMatch[1];
|
|
147
|
+
// Extract increment ID from Implementation section
|
|
148
|
+
// Pattern: **Increment**: [0031-external-tool-status-sync](...)
|
|
149
|
+
const incrementMatch = implSection.match(/\*\*Increment\*\*:\s*\[([^\]]+)\]/);
|
|
150
|
+
if (!incrementMatch) {
|
|
151
|
+
return tasks; // No increment linked
|
|
152
|
+
}
|
|
153
|
+
const incrementId = incrementMatch[1];
|
|
154
|
+
// Try to read increment's tasks.md
|
|
155
|
+
const tasksPath = path.join(this.projectRoot, '.specweave', 'increments', incrementId, 'tasks.md');
|
|
156
|
+
if (!existsSync(tasksPath)) {
|
|
157
|
+
return tasks; // Increment has no tasks.md yet
|
|
158
|
+
}
|
|
159
|
+
const tasksContent = await readFile(tasksPath, 'utf-8');
|
|
160
|
+
// Extract tasks that reference this User Story via AC-IDs
|
|
161
|
+
// Pattern:
|
|
162
|
+
// ### T-001: Task Title
|
|
163
|
+
// **User Story**: ...
|
|
164
|
+
// **Status**: [x] (100% - Completed) or [ ] (0% - Not started)
|
|
165
|
+
// **AC**: AC-US1-01, AC-US1-02
|
|
166
|
+
const taskPattern = /###?\s+(T-\d+):\s*([^\n]+)\n([\s\S]*?)(?=\n###?\s+T-\d+:|$)/g;
|
|
167
|
+
let match;
|
|
168
|
+
while ((match = taskPattern.exec(tasksContent)) !== null) {
|
|
169
|
+
const taskId = match[1];
|
|
170
|
+
const taskTitle = match[2].trim();
|
|
171
|
+
const taskBody = match[3];
|
|
172
|
+
// Extract AC list
|
|
173
|
+
const acMatch = taskBody.match(/\*\*AC\*\*:\s*([^\n]+)/);
|
|
174
|
+
if (!acMatch) {
|
|
175
|
+
continue; // Skip tasks without AC field
|
|
176
|
+
}
|
|
177
|
+
const acList = acMatch[1].trim();
|
|
178
|
+
// Check if any AC in this task belongs to current User Story
|
|
179
|
+
// AC-US1-01 → US-001
|
|
180
|
+
// AC-US001-01 → US-001
|
|
181
|
+
const acIds = acList.split(',').map((ac) => ac.trim());
|
|
182
|
+
const belongsToThisUS = acIds.some((acId) => {
|
|
183
|
+
// Extract US ID from AC-ID
|
|
184
|
+
// AC-US1-01 → US1 → US-001
|
|
185
|
+
// AC-US001-01 → US001 → US-001
|
|
186
|
+
const usMatch = acId.match(/AC-([A-Z]+\d+)-/);
|
|
187
|
+
if (!usMatch)
|
|
188
|
+
return false;
|
|
189
|
+
// Normalize to US-XXX format (pad with zeros)
|
|
190
|
+
const extractedUsId = usMatch[1]; // e.g., "US1" or "US001"
|
|
191
|
+
const extractedNum = extractedUsId.replace(/^US/, ''); // "1" or "001"
|
|
192
|
+
const normalizedExtracted = `US-${extractedNum.padStart(3, '0')}`; // "US-001"
|
|
193
|
+
const currentNum = userStoryId.replace(/^US-?/, ''); // "001" or "1"
|
|
194
|
+
const normalizedCurrent = `US-${currentNum.padStart(3, '0')}`; // "US-001"
|
|
195
|
+
return normalizedExtracted === normalizedCurrent;
|
|
196
|
+
});
|
|
197
|
+
if (!belongsToThisUS) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
// ✅ Extract completion status from **Status**: [x] or [ ]
|
|
201
|
+
const statusMatch = taskBody.match(/\*\*Status\*\*:\s*\[([x ])\]/);
|
|
202
|
+
const completed = statusMatch ? statusMatch[1] === 'x' : false;
|
|
203
|
+
tasks.push({
|
|
204
|
+
id: taskId,
|
|
205
|
+
title: taskTitle,
|
|
206
|
+
completed, // ✅ Now reads actual completion status!
|
|
207
|
+
userStories: acIds,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return tasks;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Build completion comment for GitHub issue closure
|
|
214
|
+
*
|
|
215
|
+
* Used when closing issue after verification
|
|
216
|
+
*/
|
|
217
|
+
buildCompletionComment(completion) {
|
|
218
|
+
return `✅ **User Story Verified Complete**
|
|
219
|
+
|
|
220
|
+
**Completion Status**:
|
|
221
|
+
- ✅ Acceptance Criteria: ${completion.acsCompleted}/${completion.acsTotal} (100%)
|
|
222
|
+
- ✅ Implementation Tasks: ${completion.tasksCompleted}/${completion.tasksTotal} (100%)
|
|
223
|
+
|
|
224
|
+
All work has been verified and completed. This issue is now closed.
|
|
225
|
+
|
|
226
|
+
🤖 Auto-verified by SpecWeave AC Completion Gate`;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Build progress comment for GitHub issue update
|
|
230
|
+
*
|
|
231
|
+
* Used when issue stays open (not 100% complete)
|
|
232
|
+
*/
|
|
233
|
+
buildProgressComment(completion) {
|
|
234
|
+
const sections = [];
|
|
235
|
+
sections.push('📊 **Progress Update**');
|
|
236
|
+
sections.push('');
|
|
237
|
+
// AC progress
|
|
238
|
+
const acIcon = completion.acsPercentage === 100 ? '✅' : '🔄';
|
|
239
|
+
sections.push(`${acIcon} **Acceptance Criteria**: ${completion.acsCompleted}/${completion.acsTotal} (${completion.acsPercentage.toFixed(0)}%)`);
|
|
240
|
+
if (completion.blockingAcs.length > 0) {
|
|
241
|
+
sections.push('');
|
|
242
|
+
sections.push('**Incomplete ACs**:');
|
|
243
|
+
for (const acId of completion.blockingAcs) {
|
|
244
|
+
sections.push(`- [ ] ${acId}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
sections.push('');
|
|
248
|
+
// Task progress
|
|
249
|
+
const taskIcon = completion.tasksPercentage === 100 ? '✅' : '🔄';
|
|
250
|
+
sections.push(`${taskIcon} **Implementation Tasks**: ${completion.tasksCompleted}/${completion.tasksTotal} (${completion.tasksPercentage.toFixed(0)}%)`);
|
|
251
|
+
if (completion.blockingTasks.length > 0) {
|
|
252
|
+
sections.push('');
|
|
253
|
+
sections.push('**Incomplete Tasks**:');
|
|
254
|
+
for (const taskId of completion.blockingTasks) {
|
|
255
|
+
sections.push(`- [ ] ${taskId}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
sections.push('');
|
|
259
|
+
sections.push('---');
|
|
260
|
+
sections.push('🤖 Auto-updated by SpecWeave AC Completion Gate');
|
|
261
|
+
return sections.join('\n');
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Build reopen comment for GitHub issue
|
|
265
|
+
*
|
|
266
|
+
* Used when reopening prematurely closed issue
|
|
267
|
+
*/
|
|
268
|
+
buildReopenComment(completion, reason = 'Work verification failed') {
|
|
269
|
+
const sections = [];
|
|
270
|
+
sections.push(`🔄 **Reopening Issue - ${reason}**`);
|
|
271
|
+
sections.push('');
|
|
272
|
+
sections.push('**Current Status**:');
|
|
273
|
+
sections.push(`- Acceptance Criteria: ${completion.acsCompleted}/${completion.acsTotal} (${completion.acsPercentage.toFixed(0)}%)`);
|
|
274
|
+
sections.push(`- Implementation Tasks: ${completion.tasksCompleted}/${completion.tasksTotal} (${completion.tasksPercentage.toFixed(0)}%)`);
|
|
275
|
+
const totalBlocking = completion.blockingAcs.length + completion.blockingTasks.length;
|
|
276
|
+
if (totalBlocking > 0) {
|
|
277
|
+
sections.push('');
|
|
278
|
+
sections.push(`**Blocking Items** (${totalBlocking}):`);
|
|
279
|
+
if (completion.blockingAcs.length > 0) {
|
|
280
|
+
sections.push('');
|
|
281
|
+
sections.push('**Acceptance Criteria**:');
|
|
282
|
+
for (const acId of completion.blockingAcs) {
|
|
283
|
+
sections.push(`- [ ] ${acId}`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (completion.blockingTasks.length > 0) {
|
|
287
|
+
sections.push('');
|
|
288
|
+
sections.push('**Implementation Tasks**:');
|
|
289
|
+
for (const taskId of completion.blockingTasks) {
|
|
290
|
+
sections.push(`- [ ] ${taskId}`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
sections.push('');
|
|
295
|
+
sections.push('⚠️ This issue cannot be closed until all ACs and tasks are verified complete.');
|
|
296
|
+
sections.push('');
|
|
297
|
+
sections.push('🤖 Auto-reopened by SpecWeave AC Completion Gate');
|
|
298
|
+
return sections.join('\n');
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=completion-calculator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-calculator.js","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/completion-calculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAsD7B,MAAM,OAAO,oBAAoB;IAG/B,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,mBAAmB,CAAC,aAAqB;QAC7C,oCAAoC;QACpC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAE5D,sCAAsC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAEpD,mDAAmD;QACnD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;QAE/D,4BAA4B;QAC5B,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAC7D,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAE/D,uCAAuC;QACvC,aAAa;QACb,0CAA0C;QAC1C,sBAAsB;QACtB,6DAA6D;QAC7D,MAAM,eAAe,GACnB,GAAG,CAAC,MAAM,GAAG,CAAC;YACd,YAAY,KAAK,GAAG,CAAC,MAAM;YAC3B,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;QAE1D,OAAO;YACL,QAAQ,EAAE,GAAG,CAAC,MAAM;YACpB,YAAY;YACZ,aAAa,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACrE,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,cAAc;YACd,eAAe,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7E,eAAe;YACf,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACjE,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClE,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,yBAAyB,CAAC,OAAe;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAErD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAyB,CAAC;IACtD,CAAC;IAED;;;;;;;;;;;OAWG;IACK,yBAAyB,CAAC,OAAe;QAC/C,MAAM,QAAQ,GAAyB,EAAE,CAAC;QAE1C,yCAAyC;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAErF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAE7B,sCAAsC;QACtC,4CAA4C;QAC5C,yCAAyC;QACzC,MAAM,qBAAqB,GACzB,mFAAmF,CAAC;QAEtF,wCAAwC;QACxC,wCAAwC;QACxC,MAAM,mBAAmB,GACvB,uEAAuE,CAAC;QAE1E,oCAAoC;QACpC,IAAI,KAAK,CAAC;QACV,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,OAAO,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAChE,QAAQ,GAAG,IAAI,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,gCAAgC;gBAC9C,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBAC5B,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,qCAAqC;aACnE,CAAC,CAAC;QACL,CAAC;QAED,yDAAyD;QACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC9D,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,gCAAgC;oBAC9C,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBAC5B,SAAS,EAAE,KAAK,EAAE,2BAA2B;iBAC9C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,YAAY,CAAC,gBAAwB,EAAE,WAAmB;QACtE,MAAM,KAAK,GAAW,EAAE,CAAC;QAEzB,wDAAwD;QACxD,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAE3F,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,CAAC,wBAAwB;QACxC,CAAC;QAED,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAEjC,mDAAmD;QACnD,gEAAgE;QAChE,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAE9E,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,CAAC,sBAAsB;QACtC,CAAC;QAED,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAEtC,mCAAmC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CACzB,IAAI,CAAC,WAAW,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,CACX,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC,CAAC,gCAAgC;QAChD,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAExD,0DAA0D;QAC1D,WAAW;QACX,wBAAwB;QACxB,sBAAsB;QACtB,+DAA+D;QAC/D,+BAA+B;QAC/B,MAAM,WAAW,GAAG,8DAA8D,CAAC;QACnF,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACzD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAE1B,kBAAkB;YAClB,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACzD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS,CAAC,8BAA8B;YAC1C,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEjC,6DAA6D;YAC7D,qBAAqB;YACrB,uBAAuB;YACvB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YACvD,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC1C,2BAA2B;gBAC3B,2BAA2B;gBAC3B,+BAA+B;gBAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAC9C,IAAI,CAAC,OAAO;oBAAE,OAAO,KAAK,CAAC;gBAE3B,8CAA8C;gBAC9C,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB;gBAC3D,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe;gBACtE,MAAM,mBAAmB,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,WAAW;gBAE9E,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe;gBACpE,MAAM,iBAAiB,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,WAAW;gBAE1E,OAAO,mBAAmB,KAAK,iBAAiB,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,SAAS;YACX,CAAC;YAED,0DAA0D;YAC1D,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACnE,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAE/D,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,MAAM;gBACV,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,wCAAwC;gBACnD,WAAW,EAAE,KAAK;aACnB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,UAA4B;QACjD,OAAO;;;2BAGgB,UAAU,CAAC,YAAY,IAAI,UAAU,CAAC,QAAQ;4BAC7C,UAAU,CAAC,cAAc,IAAI,UAAU,CAAC,UAAU;;;;iDAI7B,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACH,oBAAoB,CAAC,UAA4B;QAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAElB,cAAc;QACd,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,QAAQ,CAAC,IAAI,CACX,GAAG,MAAM,6BAA6B,UAAU,CAAC,YAAY,IAAI,UAAU,CAAC,QAAQ,KAAK,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACjI,CAAC;QAEF,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACrC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;gBAC1C,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAElB,gBAAgB;QAChB,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,QAAQ,CAAC,IAAI,CACX,GAAG,QAAQ,8BAA8B,UAAU,CAAC,cAAc,IAAI,UAAU,CAAC,UAAU,KAAK,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAC1I,CAAC;QAEF,IAAI,UAAU,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACvC,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;gBAC9C,QAAQ,CAAC,IAAI,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAEjE,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAChB,UAA4B,EAC5B,SAAiB,0BAA0B;QAE3C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,QAAQ,CAAC,IAAI,CAAC,0BAA0B,MAAM,IAAI,CAAC,CAAC;QACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAElB,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACrC,QAAQ,CAAC,IAAI,CACX,0BAA0B,UAAU,CAAC,YAAY,IAAI,UAAU,CAAC,QAAQ,KAAK,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACrH,CAAC;QACF,QAAQ,CAAC,IAAI,CACX,2BAA2B,UAAU,CAAC,cAAc,IAAI,UAAU,CAAC,UAAU,KAAK,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAC5H,CAAC;QAEF,MAAM,aAAa,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC;QAEtF,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,uBAAuB,aAAa,IAAI,CAAC,CAAC;YAExD,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBAC1C,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;oBAC1C,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;YAED,IAAI,UAAU,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;gBAC3C,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;oBAC9C,QAAQ,CAAC,IAAI,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;QAC/F,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAElE,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -73,7 +73,7 @@ export declare class DuplicateDetector {
|
|
|
73
73
|
* Searches GitHub for existing issues matching the title pattern.
|
|
74
74
|
* This is the PRIMARY defense against duplicates.
|
|
75
75
|
*
|
|
76
|
-
* @param titlePattern - Pattern to search (e.g., "[FS-031]"
|
|
76
|
+
* @param titlePattern - Pattern to search (e.g., "[FS-031]" current, "[INC-0031]" deprecated)
|
|
77
77
|
* @param incrementId - Optional increment ID for more precise matching
|
|
78
78
|
* @param repo - Optional repo (format: "owner/repo")
|
|
79
79
|
* @returns Existing issue if found, null otherwise
|
|
@@ -122,8 +122,8 @@ export declare class DuplicateDetector {
|
|
|
122
122
|
* Utility: Extract title pattern from full title
|
|
123
123
|
*
|
|
124
124
|
* Examples:
|
|
125
|
-
* - "[FS-031] Feature Title" → "[FS-031]"
|
|
126
|
-
* - "[INC-0031] Increment Title" → "[INC-0031]"
|
|
125
|
+
* - "[FS-031] Feature Title" → "[FS-031]" (current format)
|
|
126
|
+
* - "[INC-0031] Increment Title" → "[INC-0031]" (deprecated, legacy support only)
|
|
127
127
|
*
|
|
128
128
|
* @param title - Full issue title
|
|
129
129
|
* @returns Extracted pattern or null
|
|
@@ -40,7 +40,7 @@ export class DuplicateDetector {
|
|
|
40
40
|
* Searches GitHub for existing issues matching the title pattern.
|
|
41
41
|
* This is the PRIMARY defense against duplicates.
|
|
42
42
|
*
|
|
43
|
-
* @param titlePattern - Pattern to search (e.g., "[FS-031]"
|
|
43
|
+
* @param titlePattern - Pattern to search (e.g., "[FS-031]" current, "[INC-0031]" deprecated)
|
|
44
44
|
* @param incrementId - Optional increment ID for more precise matching
|
|
45
45
|
* @param repo - Optional repo (format: "owner/repo")
|
|
46
46
|
* @returns Existing issue if found, null otherwise
|
|
@@ -361,8 +361,8 @@ The original issue (#${keepIssueNumber}) should be used for tracking instead.
|
|
|
361
361
|
* Utility: Extract title pattern from full title
|
|
362
362
|
*
|
|
363
363
|
* Examples:
|
|
364
|
-
* - "[FS-031] Feature Title" → "[FS-031]"
|
|
365
|
-
* - "[INC-0031] Increment Title" → "[INC-0031]"
|
|
364
|
+
* - "[FS-031] Feature Title" → "[FS-031]" (current format)
|
|
365
|
+
* - "[INC-0031] Increment Title" → "[INC-0031]" (deprecated, legacy support only)
|
|
366
366
|
*
|
|
367
367
|
* @param title - Full issue title
|
|
368
368
|
* @returns Extracted pattern or null
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Epic Content Builder - Hierarchical GitHub issue content for Feature Specs
|
|
3
|
+
*
|
|
4
|
+
* Architecture:
|
|
5
|
+
* - Reads FS-* folder (FEATURE.md + us-*.md files)
|
|
6
|
+
* - Reads increment tasks.md files to map tasks to user stories
|
|
7
|
+
* - Generates hierarchical issue body:
|
|
8
|
+
* 1. User Stories section (with status + increment)
|
|
9
|
+
* 2. Tasks section (grouped by User Story)
|
|
10
|
+
*
|
|
11
|
+
* Key Features:
|
|
12
|
+
* - NO single "Increment" field (epics span multiple increments)
|
|
13
|
+
* - User Stories are checkable with status and increment link
|
|
14
|
+
* - Tasks grouped under their User Story
|
|
15
|
+
* - Shows which increment each US/task belongs to
|
|
16
|
+
*/
|
|
17
|
+
export declare class EpicContentBuilder {
|
|
18
|
+
private epicFolder;
|
|
19
|
+
private projectRoot;
|
|
20
|
+
constructor(epicFolder: string, projectRoot: string);
|
|
21
|
+
/**
|
|
22
|
+
* Build hierarchical GitHub issue body
|
|
23
|
+
*
|
|
24
|
+
* Format:
|
|
25
|
+
* - Epic overview
|
|
26
|
+
* - User Stories section (checkable, with status + increment)
|
|
27
|
+
* - Tasks section (grouped by User Story)
|
|
28
|
+
*/
|
|
29
|
+
buildIssueBody(): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Read Epic FEATURE.md frontmatter
|
|
32
|
+
*/
|
|
33
|
+
private readEpicMetadata;
|
|
34
|
+
/**
|
|
35
|
+
* Read all user stories from us-*.md files
|
|
36
|
+
*/
|
|
37
|
+
private readUserStories;
|
|
38
|
+
/**
|
|
39
|
+
* Extract tasks for a user story from its Implementation section
|
|
40
|
+
*/
|
|
41
|
+
private extractTasksForUserStory;
|
|
42
|
+
/**
|
|
43
|
+
* Extract acceptance criteria from user story content
|
|
44
|
+
*
|
|
45
|
+
* Parses the "## Acceptance Criteria" section and extracts all checkable items.
|
|
46
|
+
* Format: - [x] **AC-US2-01**: Description...
|
|
47
|
+
*/
|
|
48
|
+
private extractAcceptanceCriteria;
|
|
49
|
+
/**
|
|
50
|
+
* Build overview section
|
|
51
|
+
*/
|
|
52
|
+
private buildOverviewSection;
|
|
53
|
+
/**
|
|
54
|
+
* Build User Stories section
|
|
55
|
+
*/
|
|
56
|
+
private buildUserStoriesSection;
|
|
57
|
+
/**
|
|
58
|
+
* Build Tasks section (grouped by User Story)
|
|
59
|
+
*/
|
|
60
|
+
private buildTasksSection;
|
|
61
|
+
/**
|
|
62
|
+
* Normalize status values
|
|
63
|
+
*/
|
|
64
|
+
private normalizeStatus;
|
|
65
|
+
/**
|
|
66
|
+
* Get status emoji
|
|
67
|
+
*/
|
|
68
|
+
private getStatusEmoji;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=epic-content-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epic-content-builder.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/epic-content-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA8CH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;gBAEhB,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAKnD;;;;;;;OAOG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAgBvC;;OAEG;YACW,gBAAgB;IAY9B;;OAEG;YACW,eAAe;IA8C7B;;OAEG;YACW,wBAAwB;IAoEtC;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAgCjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA8B/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,cAAc;CAgBvB"}
|