specweave 0.18.1 → 0.20.1
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/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-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 +7 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/epic-content-builder.js +42 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -1
- 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.js +1 -1
- 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 +8 -6
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +78 -117
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -1
- 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/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.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.js +2 -1
- 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/types/config.d.ts +94 -0
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js +16 -0
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +6 -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/package.json +1 -1
- package/plugins/specweave/COMMANDS.md +13 -4
- 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/hooks/hooks.json +4 -0
- package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -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-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 +10 -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 +38 -0
- package/plugins/specweave-github/lib/epic-content-builder.ts +59 -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.ts +1 -1
- 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-ado/lib/enhanced-ado-sync.js → specweave-jira/lib/enhanced-jira-sync.js} +25 -61
- 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/dist/locales/de/.gitkeep +0 -0
- package/dist/locales/de/cli.json +0 -108
- package/dist/locales/en/cli.json +0 -287
- package/dist/locales/en/errors.json +0 -7
- package/dist/locales/en/templates.json +0 -6
- package/dist/locales/es/.gitkeep +0 -0
- package/dist/locales/es/cli.json +0 -41
- package/dist/locales/fr/.gitkeep +0 -0
- package/dist/locales/fr/cli.json +0 -108
- package/dist/locales/ja/.gitkeep +0 -0
- package/dist/locales/ja/cli.json +0 -108
- package/dist/locales/ko/.gitkeep +0 -0
- package/dist/locales/ko/cli.json +0 -108
- package/dist/locales/pt/.gitkeep +0 -0
- package/dist/locales/pt/cli.json +0 -108
- package/dist/locales/ru/.gitkeep +0 -0
- package/dist/locales/ru/cli.json +0 -269
- package/dist/locales/zh/.gitkeep +0 -0
- package/dist/locales/zh/cli.json +0 -108
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +0 -25
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -191
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +0 -1
- package/dist/spec-parser.js +0 -629
- package/dist/src/core/sync/spec-content-sync.d.ts +0 -88
- package/dist/src/core/sync/spec-content-sync.d.ts.map +0 -1
- package/dist/src/core/sync/spec-content-sync.js +0 -5
- package/dist/src/core/sync/spec-content-sync.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- 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
|
@@ -6,7 +6,7 @@ class DuplicateDetector {
|
|
|
6
6
|
* Searches GitHub for existing issues matching the title pattern.
|
|
7
7
|
* This is the PRIMARY defense against duplicates.
|
|
8
8
|
*
|
|
9
|
-
* @param titlePattern - Pattern to search (e.g., "[FS-031]"
|
|
9
|
+
* @param titlePattern - Pattern to search (e.g., "[FS-031]" current, "[INC-0031]" deprecated)
|
|
10
10
|
* @param incrementId - Optional increment ID for more precise matching
|
|
11
11
|
* @param repo - Optional repo (format: "owner/repo")
|
|
12
12
|
* @returns Existing issue if found, null otherwise
|
|
@@ -341,8 +341,8 @@ The original issue (#${keepIssueNumber}) should be used for tracking instead.
|
|
|
341
341
|
* Utility: Extract title pattern from full title
|
|
342
342
|
*
|
|
343
343
|
* Examples:
|
|
344
|
-
* - "[FS-031] Feature Title" → "[FS-031]"
|
|
345
|
-
* - "[INC-0031] Increment Title" → "[INC-0031]"
|
|
344
|
+
* - "[FS-031] Feature Title" → "[FS-031]" (current format)
|
|
345
|
+
* - "[INC-0031] Increment Title" → "[INC-0031]" (deprecated, legacy support only)
|
|
346
346
|
*
|
|
347
347
|
* @param title - Full issue title
|
|
348
348
|
* @returns Extracted pattern or null
|
|
@@ -63,7 +63,7 @@ export interface CorrectionResult {
|
|
|
63
63
|
export interface CreateOptions {
|
|
64
64
|
title: string;
|
|
65
65
|
body: string;
|
|
66
|
-
titlePattern: string; // e.g., "[FS-031]" or "[INC-0031]"
|
|
66
|
+
titlePattern: string; // e.g., "[FS-031]" (current) or "[INC-0031]" (deprecated, legacy only)
|
|
67
67
|
incrementId?: string; // e.g., "0031-feature-name"
|
|
68
68
|
labels?: string[];
|
|
69
69
|
milestone?: string;
|
|
@@ -89,7 +89,7 @@ export class DuplicateDetector {
|
|
|
89
89
|
* Searches GitHub for existing issues matching the title pattern.
|
|
90
90
|
* This is the PRIMARY defense against duplicates.
|
|
91
91
|
*
|
|
92
|
-
* @param titlePattern - Pattern to search (e.g., "[FS-031]"
|
|
92
|
+
* @param titlePattern - Pattern to search (e.g., "[FS-031]" current, "[INC-0031]" deprecated)
|
|
93
93
|
* @param incrementId - Optional increment ID for more precise matching
|
|
94
94
|
* @param repo - Optional repo (format: "owner/repo")
|
|
95
95
|
* @returns Existing issue if found, null otherwise
|
|
@@ -498,8 +498,8 @@ The original issue (#${keepIssueNumber}) should be used for tracking instead.
|
|
|
498
498
|
* Utility: Extract title pattern from full title
|
|
499
499
|
*
|
|
500
500
|
* Examples:
|
|
501
|
-
* - "[FS-031] Feature Title" → "[FS-031]"
|
|
502
|
-
* - "[INC-0031] Increment Title" → "[INC-0031]"
|
|
501
|
+
* - "[FS-031] Feature Title" → "[FS-031]" (current format)
|
|
502
|
+
* - "[INC-0031] Increment Title" → "[INC-0031]" (deprecated, legacy support only)
|
|
503
503
|
*
|
|
504
504
|
* @param title - Full issue title
|
|
505
505
|
* @returns Extracted pattern or null
|
|
@@ -66,6 +66,7 @@ ${tasksSection}
|
|
|
66
66
|
const bodyContent = content.slice(match[0].length).trim();
|
|
67
67
|
const incrementMatch = bodyContent.match(/\*\*Increment\*\*:\s*\[([^\]]+)\]/);
|
|
68
68
|
const increment = incrementMatch ? incrementMatch[1] : null;
|
|
69
|
+
const acceptanceCriteria = this.extractAcceptanceCriteria(bodyContent);
|
|
69
70
|
const tasks = await this.extractTasksForUserStory(
|
|
70
71
|
frontmatter.id,
|
|
71
72
|
increment,
|
|
@@ -76,6 +77,7 @@ ${tasksSection}
|
|
|
76
77
|
title: frontmatter.title,
|
|
77
78
|
status: this.normalizeStatus(frontmatter.status),
|
|
78
79
|
increment,
|
|
80
|
+
acceptanceCriteria,
|
|
79
81
|
tasks
|
|
80
82
|
});
|
|
81
83
|
}
|
|
@@ -131,6 +133,33 @@ ${tasksSection}
|
|
|
131
133
|
}
|
|
132
134
|
return tasks;
|
|
133
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* Extract acceptance criteria from user story content
|
|
138
|
+
*
|
|
139
|
+
* Parses the "## Acceptance Criteria" section and extracts all checkable items.
|
|
140
|
+
* Format: - [x] **AC-US2-01**: Description...
|
|
141
|
+
*/
|
|
142
|
+
extractAcceptanceCriteria(content) {
|
|
143
|
+
const acceptanceCriteria = [];
|
|
144
|
+
const acSectionMatch = content.match(/##\s+Acceptance Criteria\s*\n([\s\S]*?)(?=\n##|\n---|\n$)/i);
|
|
145
|
+
if (!acSectionMatch) {
|
|
146
|
+
return acceptanceCriteria;
|
|
147
|
+
}
|
|
148
|
+
const acSection = acSectionMatch[1];
|
|
149
|
+
const acPattern = /^-\s+\[([x\s])\]\s+\*\*([^*]+)\*\*:\s*(.+)$/gm;
|
|
150
|
+
let match;
|
|
151
|
+
while ((match = acPattern.exec(acSection)) !== null) {
|
|
152
|
+
const completed = match[1].trim().toLowerCase() === "x";
|
|
153
|
+
const acId = match[2].trim();
|
|
154
|
+
const description = match[3].trim();
|
|
155
|
+
acceptanceCriteria.push({
|
|
156
|
+
id: acId,
|
|
157
|
+
description,
|
|
158
|
+
completed
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
return acceptanceCriteria;
|
|
162
|
+
}
|
|
134
163
|
/**
|
|
135
164
|
* Build overview section
|
|
136
165
|
*/
|
|
@@ -159,6 +188,15 @@ Progress: ${completed}/${total} user stories complete (${percentage}%)
|
|
|
159
188
|
const incrementLink = us.increment ? `[${us.increment}](../../increments/${us.increment}/)` : "TBD";
|
|
160
189
|
section += `- ${checkbox} **${us.id}: ${us.title}** (${statusEmoji} ${us.status} | Increment: ${incrementLink})
|
|
161
190
|
`;
|
|
191
|
+
if (us.acceptanceCriteria.length > 0) {
|
|
192
|
+
section += "\n **Acceptance Criteria**:\n";
|
|
193
|
+
for (const ac of us.acceptanceCriteria) {
|
|
194
|
+
const acCheckbox = ac.completed ? "[x]" : "[ ]";
|
|
195
|
+
section += ` - ${acCheckbox} **${ac.id}**: ${ac.description}
|
|
196
|
+
`;
|
|
197
|
+
}
|
|
198
|
+
section += "\n";
|
|
199
|
+
}
|
|
162
200
|
}
|
|
163
201
|
return section;
|
|
164
202
|
}
|
|
@@ -25,9 +25,16 @@ interface UserStory {
|
|
|
25
25
|
title: string;
|
|
26
26
|
status: 'complete' | 'active' | 'planning' | 'not-started';
|
|
27
27
|
increment: string | null; // e.g., "0031-external-tool-status-sync"
|
|
28
|
+
acceptanceCriteria: AcceptanceCriteria[];
|
|
28
29
|
tasks: Task[];
|
|
29
30
|
}
|
|
30
31
|
|
|
32
|
+
interface AcceptanceCriteria {
|
|
33
|
+
id: string; // e.g., "AC-US2-01"
|
|
34
|
+
description: string;
|
|
35
|
+
completed: boolean; // true = [x], false = [ ]
|
|
36
|
+
}
|
|
37
|
+
|
|
31
38
|
interface Task {
|
|
32
39
|
id: string;
|
|
33
40
|
title: string;
|
|
@@ -126,6 +133,9 @@ export class EpicContentBuilder {
|
|
|
126
133
|
const incrementMatch = bodyContent.match(/\*\*Increment\*\*:\s*\[([^\]]+)\]/);
|
|
127
134
|
const increment = incrementMatch ? incrementMatch[1] : null;
|
|
128
135
|
|
|
136
|
+
// Extract acceptance criteria from AC section
|
|
137
|
+
const acceptanceCriteria = this.extractAcceptanceCriteria(bodyContent);
|
|
138
|
+
|
|
129
139
|
// Extract tasks from Implementation section
|
|
130
140
|
const tasks = await this.extractTasksForUserStory(
|
|
131
141
|
frontmatter.id,
|
|
@@ -138,6 +148,7 @@ export class EpicContentBuilder {
|
|
|
138
148
|
title: frontmatter.title,
|
|
139
149
|
status: this.normalizeStatus(frontmatter.status),
|
|
140
150
|
increment,
|
|
151
|
+
acceptanceCriteria,
|
|
141
152
|
tasks,
|
|
142
153
|
});
|
|
143
154
|
}
|
|
@@ -216,6 +227,44 @@ export class EpicContentBuilder {
|
|
|
216
227
|
return tasks;
|
|
217
228
|
}
|
|
218
229
|
|
|
230
|
+
/**
|
|
231
|
+
* Extract acceptance criteria from user story content
|
|
232
|
+
*
|
|
233
|
+
* Parses the "## Acceptance Criteria" section and extracts all checkable items.
|
|
234
|
+
* Format: - [x] **AC-US2-01**: Description...
|
|
235
|
+
*/
|
|
236
|
+
private extractAcceptanceCriteria(content: string): AcceptanceCriteria[] {
|
|
237
|
+
const acceptanceCriteria: AcceptanceCriteria[] = [];
|
|
238
|
+
|
|
239
|
+
// Find Acceptance Criteria section
|
|
240
|
+
const acSectionMatch = content.match(/##\s+Acceptance Criteria\s*\n([\s\S]*?)(?=\n##|\n---|\n$)/i);
|
|
241
|
+
|
|
242
|
+
if (!acSectionMatch) {
|
|
243
|
+
return acceptanceCriteria; // No AC section found
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const acSection = acSectionMatch[1];
|
|
247
|
+
|
|
248
|
+
// Parse each AC line: - [x] **AC-US2-01**: Description (P1, testable)
|
|
249
|
+
// Pattern matches both checked [x] and unchecked [ ] boxes
|
|
250
|
+
const acPattern = /^-\s+\[([x\s])\]\s+\*\*([^*]+)\*\*:\s*(.+)$/gm;
|
|
251
|
+
|
|
252
|
+
let match;
|
|
253
|
+
while ((match = acPattern.exec(acSection)) !== null) {
|
|
254
|
+
const completed = match[1].trim().toLowerCase() === 'x';
|
|
255
|
+
const acId = match[2].trim(); // e.g., "AC-US2-01"
|
|
256
|
+
const description = match[3].trim(); // e.g., "Spec frontmatter includes linked_increments mapping (P1, testable)"
|
|
257
|
+
|
|
258
|
+
acceptanceCriteria.push({
|
|
259
|
+
id: acId,
|
|
260
|
+
description,
|
|
261
|
+
completed,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return acceptanceCriteria;
|
|
266
|
+
}
|
|
267
|
+
|
|
219
268
|
/**
|
|
220
269
|
* Build overview section
|
|
221
270
|
*/
|
|
@@ -241,6 +290,16 @@ export class EpicContentBuilder {
|
|
|
241
290
|
: 'TBD';
|
|
242
291
|
|
|
243
292
|
section += `- ${checkbox} **${us.id}: ${us.title}** (${statusEmoji} ${us.status} | Increment: ${incrementLink})\n`;
|
|
293
|
+
|
|
294
|
+
// Add Acceptance Criteria checkboxes under each user story
|
|
295
|
+
if (us.acceptanceCriteria.length > 0) {
|
|
296
|
+
section += '\n **Acceptance Criteria**:\n';
|
|
297
|
+
for (const ac of us.acceptanceCriteria) {
|
|
298
|
+
const acCheckbox = ac.completed ? '[x]' : '[ ]';
|
|
299
|
+
section += ` - ${acCheckbox} **${ac.id}**: ${ac.description}\n`;
|
|
300
|
+
}
|
|
301
|
+
section += '\n';
|
|
302
|
+
}
|
|
244
303
|
}
|
|
245
304
|
|
|
246
305
|
return section;
|
|
@@ -24,6 +24,18 @@ class GitHubClientV2 {
|
|
|
24
24
|
};
|
|
25
25
|
return new GitHubClientV2(profile);
|
|
26
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Get repository owner
|
|
29
|
+
*/
|
|
30
|
+
getOwner() {
|
|
31
|
+
return this.owner;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get repository name
|
|
35
|
+
*/
|
|
36
|
+
getRepo() {
|
|
37
|
+
return this.repo;
|
|
38
|
+
}
|
|
27
39
|
// ==========================================================================
|
|
28
40
|
// Authentication & Setup
|
|
29
41
|
// ==========================================================================
|
|
@@ -189,6 +201,43 @@ ${body}`;
|
|
|
189
201
|
labels: issue.labels?.map((l) => l.name) || []
|
|
190
202
|
};
|
|
191
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* Search for issue by exact title match
|
|
206
|
+
*
|
|
207
|
+
* IDEMPOTENCY: Use this before creating issues to prevent duplicates
|
|
208
|
+
*/
|
|
209
|
+
async searchIssueByTitle(title) {
|
|
210
|
+
const escapedTitle = title.replace(/"/g, '\\"');
|
|
211
|
+
const result = await execFileNoThrow("gh", [
|
|
212
|
+
"issue",
|
|
213
|
+
"list",
|
|
214
|
+
"--repo",
|
|
215
|
+
this.fullRepo,
|
|
216
|
+
"--search",
|
|
217
|
+
`"${escapedTitle}" in:title`,
|
|
218
|
+
"--json",
|
|
219
|
+
"number,title,state,url,labels",
|
|
220
|
+
"--limit",
|
|
221
|
+
"1"
|
|
222
|
+
]);
|
|
223
|
+
if (result.exitCode !== 0) {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
const issues = JSON.parse(result.stdout || "[]");
|
|
227
|
+
if (!issues || issues.length === 0) {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
const issue = issues[0];
|
|
231
|
+
return {
|
|
232
|
+
number: issue.number,
|
|
233
|
+
title: issue.title,
|
|
234
|
+
body: "",
|
|
235
|
+
// Body not included in list view
|
|
236
|
+
state: issue.state,
|
|
237
|
+
html_url: issue.url,
|
|
238
|
+
labels: issue.labels?.map((l) => l.name) || []
|
|
239
|
+
};
|
|
240
|
+
}
|
|
192
241
|
/**
|
|
193
242
|
* Update issue body
|
|
194
243
|
*/
|
|
@@ -44,6 +44,20 @@ export class GitHubClientV2 {
|
|
|
44
44
|
return new GitHubClientV2(profile);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
/**
|
|
48
|
+
* Get repository owner
|
|
49
|
+
*/
|
|
50
|
+
getOwner(): string {
|
|
51
|
+
return this.owner;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Get repository name
|
|
56
|
+
*/
|
|
57
|
+
getRepo(): string {
|
|
58
|
+
return this.repo;
|
|
59
|
+
}
|
|
60
|
+
|
|
47
61
|
// ==========================================================================
|
|
48
62
|
// Authentication & Setup
|
|
49
63
|
// ==========================================================================
|
|
@@ -272,6 +286,51 @@ export class GitHubClientV2 {
|
|
|
272
286
|
};
|
|
273
287
|
}
|
|
274
288
|
|
|
289
|
+
/**
|
|
290
|
+
* Search for issue by exact title match
|
|
291
|
+
*
|
|
292
|
+
* IDEMPOTENCY: Use this before creating issues to prevent duplicates
|
|
293
|
+
*/
|
|
294
|
+
async searchIssueByTitle(title: string): Promise<GitHubIssue | null> {
|
|
295
|
+
// Escape double quotes in title for gh search
|
|
296
|
+
const escapedTitle = title.replace(/"/g, '\\"');
|
|
297
|
+
|
|
298
|
+
const result = await execFileNoThrow('gh', [
|
|
299
|
+
'issue',
|
|
300
|
+
'list',
|
|
301
|
+
'--repo',
|
|
302
|
+
this.fullRepo,
|
|
303
|
+
'--search',
|
|
304
|
+
`"${escapedTitle}" in:title`,
|
|
305
|
+
'--json',
|
|
306
|
+
'number,title,state,url,labels',
|
|
307
|
+
'--limit',
|
|
308
|
+
'1',
|
|
309
|
+
]);
|
|
310
|
+
|
|
311
|
+
if (result.exitCode !== 0) {
|
|
312
|
+
// Search failed, return null (treat as not found)
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
const issues = JSON.parse(result.stdout || '[]');
|
|
317
|
+
|
|
318
|
+
if (!issues || issues.length === 0) {
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// Return first exact match
|
|
323
|
+
const issue = issues[0];
|
|
324
|
+
return {
|
|
325
|
+
number: issue.number,
|
|
326
|
+
title: issue.title,
|
|
327
|
+
body: '', // Body not included in list view
|
|
328
|
+
state: issue.state,
|
|
329
|
+
html_url: issue.url,
|
|
330
|
+
labels: issue.labels?.map((l: any) => l.name) || [],
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
|
|
275
334
|
/**
|
|
276
335
|
* Update issue body
|
|
277
336
|
*/
|
|
@@ -318,7 +318,7 @@ export class GitHubEpicSync {
|
|
|
318
318
|
): Promise<number | null> {
|
|
319
319
|
try {
|
|
320
320
|
// Search GitHub for issues with Epic ID in title
|
|
321
|
-
// Pattern: "[FS-031] Title" or "[INC-0031] Title"
|
|
321
|
+
// Pattern: "[FS-031] Title" (new) or "[INC-0031] Title" (deprecated, legacy support only)
|
|
322
322
|
const titlePattern = `[${epicId}]`;
|
|
323
323
|
|
|
324
324
|
const result = await execFileNoThrow('gh', [
|