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
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: confluent-schema-registry
|
|
3
|
+
description: Schema Registry expert for Avro, Protobuf, and JSON Schema management. Covers schema evolution strategies, compatibility modes, validation, and best practices for managing schemas in Confluent Cloud and self-hosted Schema Registry. Activates for schema registry, avro, protobuf, json schema, schema evolution, compatibility modes, schema validation.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Confluent Schema Registry Skill
|
|
7
|
+
|
|
8
|
+
Expert knowledge of Confluent Schema Registry for managing Avro, Protobuf, and JSON Schema schemas in Kafka ecosystems.
|
|
9
|
+
|
|
10
|
+
## What I Know
|
|
11
|
+
|
|
12
|
+
### Schema Formats
|
|
13
|
+
|
|
14
|
+
**Avro** (Most Popular):
|
|
15
|
+
- Binary serialization format
|
|
16
|
+
- Schema evolution support
|
|
17
|
+
- Smaller message size vs JSON
|
|
18
|
+
- Self-describing with schema ID in header
|
|
19
|
+
- Best for: High-throughput applications, data warehousing
|
|
20
|
+
|
|
21
|
+
**Protobuf** (Google Protocol Buffers):
|
|
22
|
+
- Binary serialization
|
|
23
|
+
- Strong typing with .proto files
|
|
24
|
+
- Language-agnostic (Java, Python, Go, C++, etc.)
|
|
25
|
+
- Efficient encoding
|
|
26
|
+
- Best for: Polyglot environments, gRPC integration
|
|
27
|
+
|
|
28
|
+
**JSON Schema**:
|
|
29
|
+
- Human-readable text format
|
|
30
|
+
- Easy debugging
|
|
31
|
+
- Widely supported
|
|
32
|
+
- Larger message size
|
|
33
|
+
- Best for: Development, debugging, REST APIs
|
|
34
|
+
|
|
35
|
+
### Compatibility Modes
|
|
36
|
+
|
|
37
|
+
| Mode | Producer Can | Consumer Can | Use Case |
|
|
38
|
+
|------|-------------|-------------|----------|
|
|
39
|
+
| **BACKWARD** | Remove fields, add optional fields | Read old data with new schema | Most common, safe for consumers |
|
|
40
|
+
| **FORWARD** | Add fields, remove optional fields | Read new data with old schema | Safe for producers |
|
|
41
|
+
| **FULL** | Add/remove optional fields only | Bi-directional compatibility | Both producers and consumers upgrade independently |
|
|
42
|
+
| **NONE** | Any change | Must coordinate upgrades | Development only, NOT production |
|
|
43
|
+
| **BACKWARD_TRANSITIVE** | BACKWARD across all versions | Read any old data | Strictest backward compatibility |
|
|
44
|
+
| **FORWARD_TRANSITIVE** | FORWARD across all versions | Read any new data | Strictest forward compatibility |
|
|
45
|
+
| **FULL_TRANSITIVE** | FULL across all versions | Complete bi-directional | Strictest overall |
|
|
46
|
+
|
|
47
|
+
**Default**: `BACKWARD` (recommended for production)
|
|
48
|
+
|
|
49
|
+
### Schema Evolution Strategies
|
|
50
|
+
|
|
51
|
+
**Adding Fields**:
|
|
52
|
+
```avro
|
|
53
|
+
// V1
|
|
54
|
+
{
|
|
55
|
+
"type": "record",
|
|
56
|
+
"name": "User",
|
|
57
|
+
"fields": [
|
|
58
|
+
{"name": "id", "type": "long"},
|
|
59
|
+
{"name": "name", "type": "string"}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// V2 - BACKWARD compatible (added optional field with default)
|
|
64
|
+
{
|
|
65
|
+
"type": "record",
|
|
66
|
+
"name": "User",
|
|
67
|
+
"fields": [
|
|
68
|
+
{"name": "id", "type": "long"},
|
|
69
|
+
{"name": "name", "type": "string"},
|
|
70
|
+
{"name": "email", "type": ["null", "string"], "default": null}
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Removing Fields** (BACKWARD compatible):
|
|
76
|
+
```avro
|
|
77
|
+
// V1
|
|
78
|
+
{"name": "address", "type": "string"}
|
|
79
|
+
|
|
80
|
+
// V2 - Remove field (old consumers will ignore it)
|
|
81
|
+
// Field removed from schema
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**Changing Field Types** (Breaking Change!):
|
|
85
|
+
```avro
|
|
86
|
+
// ❌ BREAKING - Cannot change string to int
|
|
87
|
+
{"name": "age", "type": "string"} → {"name": "age", "type": "int"}
|
|
88
|
+
|
|
89
|
+
// ✅ SAFE - Use union types
|
|
90
|
+
{"name": "age", "type": ["string", "int"], "default": "unknown"}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## When to Use This Skill
|
|
94
|
+
|
|
95
|
+
Activate me when you need help with:
|
|
96
|
+
- Schema evolution strategies ("How do I evolve my Avro schema?")
|
|
97
|
+
- Compatibility mode selection ("Which compatibility mode for production?")
|
|
98
|
+
- Schema validation ("Validate my Avro schema")
|
|
99
|
+
- Best practices ("Schema Registry best practices")
|
|
100
|
+
- Schema registration ("Register Avro schema with Schema Registry")
|
|
101
|
+
- Debugging schema issues ("Schema compatibility error")
|
|
102
|
+
- Format comparison ("Avro vs Protobuf vs JSON Schema")
|
|
103
|
+
|
|
104
|
+
## Best Practices
|
|
105
|
+
|
|
106
|
+
### 1. Always Use Compatible Evolution
|
|
107
|
+
|
|
108
|
+
✅ **DO**:
|
|
109
|
+
- Add optional fields with defaults
|
|
110
|
+
- Remove optional fields
|
|
111
|
+
- Use union types for flexibility
|
|
112
|
+
- Test schema changes in staging first
|
|
113
|
+
|
|
114
|
+
❌ **DON'T**:
|
|
115
|
+
- Change field types
|
|
116
|
+
- Remove required fields
|
|
117
|
+
- Rename fields (add new + deprecate old)
|
|
118
|
+
- Use `NONE` compatibility in production
|
|
119
|
+
|
|
120
|
+
### 2. Schema Naming Conventions
|
|
121
|
+
|
|
122
|
+
**Hierarchical Namespaces**:
|
|
123
|
+
```
|
|
124
|
+
com.company.domain.EntityName
|
|
125
|
+
com.acme.ecommerce.Order
|
|
126
|
+
com.acme.ecommerce.OrderLineItem
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Subject Naming** (Kafka topics):
|
|
130
|
+
- `<topic-name>-value` - For record values
|
|
131
|
+
- `<topic-name>-key` - For record keys
|
|
132
|
+
- Example: `orders-value`, `orders-key`
|
|
133
|
+
|
|
134
|
+
### 3. Schema Registry Configuration
|
|
135
|
+
|
|
136
|
+
**Producer** (with Avro):
|
|
137
|
+
```javascript
|
|
138
|
+
const { Kafka } = require('kafkajs');
|
|
139
|
+
const { SchemaRegistry } = require('@kafkajs/confluent-schema-registry');
|
|
140
|
+
|
|
141
|
+
const registry = new SchemaRegistry({
|
|
142
|
+
host: 'https://schema-registry:8081',
|
|
143
|
+
auth: {
|
|
144
|
+
username: 'SR_API_KEY',
|
|
145
|
+
password: 'SR_API_SECRET'
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// Register schema
|
|
150
|
+
const schema = `
|
|
151
|
+
{
|
|
152
|
+
"type": "record",
|
|
153
|
+
"name": "User",
|
|
154
|
+
"fields": [
|
|
155
|
+
{"name": "id", "type": "long"},
|
|
156
|
+
{"name": "name", "type": "string"}
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
`;
|
|
160
|
+
|
|
161
|
+
const { id } = await registry.register({
|
|
162
|
+
type: SchemaType.AVRO,
|
|
163
|
+
schema
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// Encode message with schema
|
|
167
|
+
const payload = await registry.encode(id, {
|
|
168
|
+
id: 1,
|
|
169
|
+
name: 'John Doe'
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
await producer.send({
|
|
173
|
+
topic: 'users',
|
|
174
|
+
messages: [{ value: payload }]
|
|
175
|
+
});
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**Consumer** (with Avro):
|
|
179
|
+
```javascript
|
|
180
|
+
const consumer = kafka.consumer({ groupId: 'user-processor' });
|
|
181
|
+
|
|
182
|
+
await consumer.subscribe({ topic: 'users' });
|
|
183
|
+
|
|
184
|
+
await consumer.run({
|
|
185
|
+
eachMessage: async ({ message }) => {
|
|
186
|
+
// Decode message (schema ID is in header)
|
|
187
|
+
const decodedMessage = await registry.decode(message.value);
|
|
188
|
+
console.log(decodedMessage); // { id: 1, name: 'John Doe' }
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### 4. Schema Validation Workflow
|
|
194
|
+
|
|
195
|
+
**Before Registering**:
|
|
196
|
+
1. Validate schema syntax (Avro JSON, .proto, JSON Schema)
|
|
197
|
+
2. Check compatibility with existing versions
|
|
198
|
+
3. Test with sample data
|
|
199
|
+
4. Register in dev/staging first
|
|
200
|
+
5. Deploy to production after validation
|
|
201
|
+
|
|
202
|
+
**CLI Validation**:
|
|
203
|
+
```bash
|
|
204
|
+
# Check compatibility (before registering)
|
|
205
|
+
curl -X POST http://localhost:8081/compatibility/subjects/users-value/versions/latest \
|
|
206
|
+
-H "Content-Type: application/vnd.schemaregistry.v1+json" \
|
|
207
|
+
-d '{"schema": "{...}"}'
|
|
208
|
+
|
|
209
|
+
# Register schema
|
|
210
|
+
curl -X POST http://localhost:8081/subjects/users-value/versions \
|
|
211
|
+
-H "Content-Type: application/vnd.schemaregistry.v1+json" \
|
|
212
|
+
-d '{"schema": "{...}"}'
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Common Issues & Solutions
|
|
216
|
+
|
|
217
|
+
### Issue 1: Schema Compatibility Error
|
|
218
|
+
|
|
219
|
+
**Error**:
|
|
220
|
+
```
|
|
221
|
+
Schema being registered is incompatible with an earlier schema
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Root Cause**: Violates compatibility mode (e.g., removed required field with BACKWARD mode)
|
|
225
|
+
|
|
226
|
+
**Solution**:
|
|
227
|
+
1. Check current compatibility mode:
|
|
228
|
+
```bash
|
|
229
|
+
curl http://localhost:8081/config/users-value
|
|
230
|
+
```
|
|
231
|
+
2. Fix schema to be compatible OR change mode (carefully!)
|
|
232
|
+
3. Validate before registering:
|
|
233
|
+
```bash
|
|
234
|
+
curl -X POST http://localhost:8081/compatibility/subjects/users-value/versions/latest \
|
|
235
|
+
-d '{"schema": "{...}"}'
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Issue 2: Schema Not Found
|
|
239
|
+
|
|
240
|
+
**Error**:
|
|
241
|
+
```
|
|
242
|
+
Subject 'users-value' not found
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
**Root Cause**: Schema not registered yet OR wrong subject name
|
|
246
|
+
|
|
247
|
+
**Solution**:
|
|
248
|
+
1. List all subjects:
|
|
249
|
+
```bash
|
|
250
|
+
curl http://localhost:8081/subjects
|
|
251
|
+
```
|
|
252
|
+
2. Register schema if missing
|
|
253
|
+
3. Check subject naming convention (`<topic>-key` or `<topic>-value`)
|
|
254
|
+
|
|
255
|
+
### Issue 3: Message Deserialization Failed
|
|
256
|
+
|
|
257
|
+
**Error**:
|
|
258
|
+
```
|
|
259
|
+
Unknown magic byte!
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**Root Cause**: Message not encoded with Schema Registry (missing magic byte + schema ID)
|
|
263
|
+
|
|
264
|
+
**Solution**:
|
|
265
|
+
1. Ensure producer uses Schema Registry encoder
|
|
266
|
+
2. Check message format: [magic_byte(1) + schema_id(4) + payload]
|
|
267
|
+
3. Use `@kafkajs/confluent-schema-registry` library
|
|
268
|
+
|
|
269
|
+
## Schema Evolution Decision Tree
|
|
270
|
+
|
|
271
|
+
```
|
|
272
|
+
Need to change schema?
|
|
273
|
+
├─ Adding new field?
|
|
274
|
+
│ ├─ Required field? → Add with default value (BACKWARD)
|
|
275
|
+
│ └─ Optional field? → Add with default null (BACKWARD)
|
|
276
|
+
│
|
|
277
|
+
├─ Removing field?
|
|
278
|
+
│ ├─ Required field? → ❌ BREAKING CHANGE (coordinate upgrade)
|
|
279
|
+
│ └─ Optional field? → ✅ BACKWARD compatible
|
|
280
|
+
│
|
|
281
|
+
├─ Changing field type?
|
|
282
|
+
│ ├─ Compatible types (e.g., int → long)? → Use union types
|
|
283
|
+
│ └─ Incompatible types? → ❌ BREAKING CHANGE (add new field, deprecate old)
|
|
284
|
+
│
|
|
285
|
+
└─ Renaming field?
|
|
286
|
+
└─ ❌ BREAKING CHANGE → Add new field + mark old as deprecated
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Avro vs Protobuf vs JSON Schema Comparison
|
|
290
|
+
|
|
291
|
+
| Feature | Avro | Protobuf | JSON Schema |
|
|
292
|
+
|---------|------|----------|-------------|
|
|
293
|
+
| **Encoding** | Binary | Binary | Text (JSON) |
|
|
294
|
+
| **Message Size** | Small (90% smaller) | Small (80% smaller) | Large (baseline) |
|
|
295
|
+
| **Human Readable** | No | No | Yes |
|
|
296
|
+
| **Schema Evolution** | Excellent | Good | Fair |
|
|
297
|
+
| **Language Support** | Java, Python, C++ | 20+ languages | Universal |
|
|
298
|
+
| **Performance** | Very Fast | Very Fast | Slower |
|
|
299
|
+
| **Debugging** | Harder | Harder | Easy |
|
|
300
|
+
| **Best For** | Data warehousing, ETL | Polyglot, gRPC | REST APIs, dev |
|
|
301
|
+
|
|
302
|
+
**Recommendation**:
|
|
303
|
+
- **Production**: Avro (best balance)
|
|
304
|
+
- **Polyglot teams**: Protobuf
|
|
305
|
+
- **Development/Debugging**: JSON Schema
|
|
306
|
+
|
|
307
|
+
## References
|
|
308
|
+
|
|
309
|
+
- Schema Registry REST API: https://docs.confluent.io/platform/current/schema-registry/develop/api.html
|
|
310
|
+
- Avro Specification: https://avro.apache.org/docs/current/spec.html
|
|
311
|
+
- Protobuf Guide: https://developers.google.com/protocol-buffers
|
|
312
|
+
- JSON Schema Spec: https://json-schema.org/
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
**Invoke me when you need schema management, evolution strategies, or compatibility guidance!**
|
|
@@ -139,9 +139,9 @@ Total Tasks: 2
|
|
|
139
139
|
For each repository, I create a tracking issue:
|
|
140
140
|
|
|
141
141
|
```markdown
|
|
142
|
-
# [
|
|
142
|
+
# [FS-25-11-14] Shopping Cart - Frontend Tasks
|
|
143
143
|
|
|
144
|
-
Part of increment 0015-shopping-cart
|
|
144
|
+
Part of increment 0015-shopping-cart (Feature: FS-25-11-14)
|
|
145
145
|
|
|
146
146
|
## Tasks (5)
|
|
147
147
|
- [ ] T-001: Create CartItem component
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: user-story-updater
|
|
3
|
+
description: Updates GitHub issues for user stories with proper ACs and tasks. Activates for update user story issue, fix GitHub issue format, add checkable ACs, refresh user story issue, sync user story to GitHub.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# User Story Updater Agent
|
|
7
|
+
|
|
8
|
+
**Role**: Updates GitHub issues for individual user stories to include checkable acceptance criteria and task connections.
|
|
9
|
+
|
|
10
|
+
**Activates For**:
|
|
11
|
+
- "Update user story issue"
|
|
12
|
+
- "Fix GitHub issue format for US-004"
|
|
13
|
+
- "Add checkable ACs to GitHub issue"
|
|
14
|
+
- "Refresh user story issue #501"
|
|
15
|
+
- "Sync user story to GitHub"
|
|
16
|
+
|
|
17
|
+
**Capabilities**:
|
|
18
|
+
|
|
19
|
+
1. **Parse User Story Files** (`us-*.md` from living docs)
|
|
20
|
+
- Extract frontmatter (id, epic, status, priority)
|
|
21
|
+
- Parse user story description (As a... I want... So that...)
|
|
22
|
+
- Extract acceptance criteria with completion status
|
|
23
|
+
- Find related tasks from increment tasks.md
|
|
24
|
+
|
|
25
|
+
2. **Build Rich GitHub Issue Content**
|
|
26
|
+
- Convert ACs to GitHub task checkboxes (`- [x]` or `- [ ]`)
|
|
27
|
+
- Link tasks to increment tasks.md with anchors
|
|
28
|
+
- Calculate progress percentages
|
|
29
|
+
- Format with proper sections
|
|
30
|
+
|
|
31
|
+
3. **Update Existing Issues**
|
|
32
|
+
- Search for existing issue by title pattern
|
|
33
|
+
- Replace issue body with new formatted content
|
|
34
|
+
- Preserve issue number and URL
|
|
35
|
+
|
|
36
|
+
**Tools You Have**:
|
|
37
|
+
- `Read` - Read user story files and tasks.md
|
|
38
|
+
- `Bash` - Execute `gh` CLI commands
|
|
39
|
+
- `Write` - Create TypeScript if needed
|
|
40
|
+
|
|
41
|
+
**Workflow**:
|
|
42
|
+
|
|
43
|
+
When user says "update user story issue for FS-031/US-004":
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// 1. Find user story file
|
|
47
|
+
const projectRoot = process.cwd();
|
|
48
|
+
const userStoryPath = await findUserStoryFile(projectRoot, 'FS-031', 'US-004');
|
|
49
|
+
// Result: .specweave/docs/internal/specs/default/FS-031/us-004-bidirectional-status-sync.md
|
|
50
|
+
|
|
51
|
+
// 2. Parse and build content
|
|
52
|
+
import { UserStoryContentBuilder } from './lib/user-story-content-builder.js';
|
|
53
|
+
const builder = new UserStoryContentBuilder(userStoryPath, projectRoot);
|
|
54
|
+
const content = await builder.parse();
|
|
55
|
+
const issueBody = await builder.buildIssueBody();
|
|
56
|
+
|
|
57
|
+
// 3. Find existing GitHub issue
|
|
58
|
+
const searchResult = await bash(`gh issue list --search "[FS-031][US-004]" --json number,title`);
|
|
59
|
+
const issue = JSON.parse(searchResult)[0];
|
|
60
|
+
|
|
61
|
+
// 4. Update issue
|
|
62
|
+
await bash(`gh issue edit ${issue.number} --body "${issueBody}"`);
|
|
63
|
+
|
|
64
|
+
// 5. Report success
|
|
65
|
+
console.log(`✅ Updated issue #${issue.number}`);
|
|
66
|
+
console.log(`🔗 https://github.com/owner/repo/issues/${issue.number}`);
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Example Execution**:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
User: "Fix the display of GitHub issue #501 for US-004"
|
|
73
|
+
|
|
74
|
+
Agent: "I'll update GitHub issue #501 for US-004 to include checkable ACs and task connections.
|
|
75
|
+
|
|
76
|
+
🔍 Finding user story: FS-031/US-004
|
|
77
|
+
📄 Found: .specweave/docs/internal/specs/default/FS-031/us-004-bidirectional-status-sync.md
|
|
78
|
+
|
|
79
|
+
📖 Parsing content...
|
|
80
|
+
✅ User story description: As a PM, I want status changes...
|
|
81
|
+
✅ 6 acceptance criteria (4 completed, 2 pending)
|
|
82
|
+
✅ 6 tasks linked from increment 0031
|
|
83
|
+
|
|
84
|
+
📝 Building issue body...
|
|
85
|
+
✅ ACs converted to checkboxes
|
|
86
|
+
✅ Tasks linked to tasks.md
|
|
87
|
+
✅ Progress calculated: 67% ACs, 50% tasks
|
|
88
|
+
|
|
89
|
+
🚀 Updating GitHub issue #501...
|
|
90
|
+
[gh issue edit 501 --body "..."]
|
|
91
|
+
✅ Updated successfully!
|
|
92
|
+
|
|
93
|
+
🔗 View issue: https://github.com/anton-abyzov/specweave/issues/501
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Key Implementation Details**:
|
|
97
|
+
|
|
98
|
+
1. **Find User Story File**:
|
|
99
|
+
```bash
|
|
100
|
+
# Search in all projects
|
|
101
|
+
find .specweave/docs/internal/specs -name "us-004-*.md" -path "*/FS-031/*"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
2. **Parse User Story** (use UserStoryContentBuilder):
|
|
105
|
+
- Frontmatter: YAML parsing
|
|
106
|
+
- ACs: Pattern `- [x] **AC-US4-01**: Description (P1, testable)`
|
|
107
|
+
- Tasks: Extract from Implementation section
|
|
108
|
+
- Increment: Pattern `**Increment**: [0031-name](...)`
|
|
109
|
+
|
|
110
|
+
3. **Build Issue Body**:
|
|
111
|
+
- See UserStoryContentBuilder.buildIssueBody()
|
|
112
|
+
- Sections: User Story, Acceptance Criteria, Implementation Tasks
|
|
113
|
+
- Checkboxes: `- [x]` for completed, `- [ ]` for pending
|
|
114
|
+
- Links: Relative to repository root
|
|
115
|
+
|
|
116
|
+
4. **Update GitHub Issue**:
|
|
117
|
+
```bash
|
|
118
|
+
# Find issue
|
|
119
|
+
gh issue list --search "[FS-031][US-004]" --json number,title --jq '.[0].number'
|
|
120
|
+
|
|
121
|
+
# Update body
|
|
122
|
+
gh issue edit 501 --body "$(cat body.md)"
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Error Handling**:
|
|
126
|
+
|
|
127
|
+
- ✅ User story file not found → Search all projects, suggest alternatives
|
|
128
|
+
- ✅ GitHub issue not found → Offer to create new issue
|
|
129
|
+
- ✅ Missing frontmatter → Graceful fallback with warnings
|
|
130
|
+
- ✅ No tasks found → Show "No tasks defined yet"
|
|
131
|
+
|
|
132
|
+
**Related Files**:
|
|
133
|
+
- `plugins/specweave-github/lib/user-story-content-builder.ts` - Core builder class
|
|
134
|
+
- `plugins/specweave-github/commands/specweave-github-update-user-story.md` - Command spec
|
|
135
|
+
- `.specweave/docs/internal/specs/{project}/FS-*/us-*.md` - User story files
|
|
136
|
+
|
|
137
|
+
**Testing**:
|
|
138
|
+
1. Read user story file: `us-004-bidirectional-status-sync.md`
|
|
139
|
+
2. Use UserStoryContentBuilder to parse
|
|
140
|
+
3. Build issue body
|
|
141
|
+
4. Update issue #501
|
|
142
|
+
5. Verify checkable ACs and task links work
|
|
143
|
+
|
|
144
|
+
**Success Criteria**:
|
|
145
|
+
- ✅ GitHub issue has checkable ACs (can check/uncheck in UI)
|
|
146
|
+
- ✅ Tasks link to correct increment tasks.md sections
|
|
147
|
+
- ✅ Progress percentages match reality
|
|
148
|
+
- ✅ User story description formatted correctly
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: specweave-github-update-user-story
|
|
3
|
+
description: Update GitHub issue for user story with proper ACs and tasks
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Update User Story GitHub Issue
|
|
7
|
+
|
|
8
|
+
**Purpose**: Update an existing GitHub issue for a user story to include:
|
|
9
|
+
- ✅ Checkable acceptance criteria (GitHub task checkboxes)
|
|
10
|
+
- ✅ Task connections (links to increment tasks)
|
|
11
|
+
- ✅ Proper formatting and status
|
|
12
|
+
|
|
13
|
+
**Usage**:
|
|
14
|
+
```bash
|
|
15
|
+
/specweave-github:update-user-story FS-031 US-004
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**What It Does**:
|
|
19
|
+
|
|
20
|
+
1. **Finds user story file**: `.specweave/docs/internal/specs/{project}/FS-031/us-004-*.md`
|
|
21
|
+
2. **Parses content**:
|
|
22
|
+
- User story description (As a... I want... So that...)
|
|
23
|
+
- Acceptance criteria with completion status
|
|
24
|
+
- Tasks from increment tasks.md
|
|
25
|
+
3. **Finds existing GitHub issue**: Searches for `[FS-031][US-004]` or `[FS-031 US-004]`
|
|
26
|
+
4. **Updates issue body**: Replaces with properly formatted content including:
|
|
27
|
+
- Checkable ACs
|
|
28
|
+
- Task connections
|
|
29
|
+
- Status and progress
|
|
30
|
+
|
|
31
|
+
**Arguments**:
|
|
32
|
+
- `featureId` - Feature ID (e.g., `FS-031`)
|
|
33
|
+
- `userStoryId` - User Story ID (e.g., `US-004`)
|
|
34
|
+
|
|
35
|
+
**Example**:
|
|
36
|
+
```bash
|
|
37
|
+
# Update US-004 in FS-031
|
|
38
|
+
/specweave-github:update-user-story FS-031 US-004
|
|
39
|
+
|
|
40
|
+
# Output:
|
|
41
|
+
# 🔍 Finding user story: FS-031/US-004
|
|
42
|
+
# 📄 Found: .specweave/docs/internal/specs/default/FS-031/us-004-bidirectional-status-sync.md
|
|
43
|
+
# 🔍 Searching for existing GitHub issue...
|
|
44
|
+
# 🔗 Found issue #501: [FS-031][US-004] Bidirectional Status Sync
|
|
45
|
+
# 📝 Building updated issue body...
|
|
46
|
+
# ✅ 6 acceptance criteria (4 completed)
|
|
47
|
+
# ✅ 6 tasks (3 completed)
|
|
48
|
+
# 🚀 Updating GitHub issue #501...
|
|
49
|
+
# ✅ Updated successfully!
|
|
50
|
+
# 🔗 https://github.com/owner/repo/issues/501
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**What Gets Updated**:
|
|
54
|
+
|
|
55
|
+
```markdown
|
|
56
|
+
**Feature**: [FS-031](../../_features/FS-031/FEATURE.md)
|
|
57
|
+
**Status**: complete
|
|
58
|
+
**Priority**: P1
|
|
59
|
+
**Project**: default
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## User Story
|
|
64
|
+
|
|
65
|
+
**As a** PM
|
|
66
|
+
**I want** status changes in external tools to sync back to SpecWeave
|
|
67
|
+
**So that** both systems stay in sync without manual updates
|
|
68
|
+
|
|
69
|
+
📄 View full story: [`us-004-bidirectional-status-sync.md`](...)
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Acceptance Criteria
|
|
74
|
+
|
|
75
|
+
Progress: 4/6 criteria met (67%)
|
|
76
|
+
|
|
77
|
+
- [x] **AC-US4-01**: SpecWeave status change triggers external update (P1, testable)
|
|
78
|
+
- [x] **AC-US4-02**: External issue close triggers SpecWeave prompt (P1, testable)
|
|
79
|
+
- [x] **AC-US4-03**: External issue reopen triggers SpecWeave prompt (P2, testable)
|
|
80
|
+
- [x] **AC-US4-04**: Sync logs include timestamp and reason (P2, testable)
|
|
81
|
+
- [ ] **AC-US4-05**: Failed syncs retry with exponential backoff (P2, testable)
|
|
82
|
+
- [ ] **AC-US4-06**: Sync works for GitHub, JIRA, and ADO (P1, testable)
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Implementation Tasks
|
|
87
|
+
|
|
88
|
+
Progress: 3/6 tasks complete (50%)
|
|
89
|
+
|
|
90
|
+
**Increment**: [0031-external-tool-status-sync](../../increments/0031-external-tool-status-sync/)
|
|
91
|
+
|
|
92
|
+
- [x] [T-008: Create Status Sync Engine (Core)](../../increments/0031/tasks.md#t-008-create-status-sync-engine-core)
|
|
93
|
+
- [x] [T-009: Implement GitHub Status Sync](../../increments/0031/tasks.md#t-009-implement-github-status-sync)
|
|
94
|
+
- [x] [T-010: Implement JIRA Status Sync](../../increments/0031/tasks.md#t-010-implement-jira-status-sync)
|
|
95
|
+
- [ ] [T-011: Implement ADO Status Sync](../../increments/0031/tasks.md#t-011-implement-ado-status-sync)
|
|
96
|
+
- [ ] [T-018: Add Sync Event Logging](../../increments/0031/tasks.md#t-018-add-sync-event-logging)
|
|
97
|
+
- [ ] [T-021: Error Handling & Retry Logic](../../increments/0031/tasks.md#t-021-error-handling-retry-logic)
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
🤖 Auto-synced by SpecWeave User Story Sync
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**When to Use**:
|
|
105
|
+
|
|
106
|
+
- ✅ After completing increment implementation (update task statuses)
|
|
107
|
+
- ✅ After modifying acceptance criteria
|
|
108
|
+
- ✅ When GitHub issue is missing proper formatting
|
|
109
|
+
- ✅ When you want to refresh issue content from living docs
|
|
110
|
+
|
|
111
|
+
**Related Commands**:
|
|
112
|
+
- `/specweave-github:sync-epic FS-031` - Sync entire epic (all user stories)
|
|
113
|
+
- `/specweave-github:create-issue 0031` - Create issue for increment
|
|
114
|
+
- `/specweave-github:sync 0031` - Bidirectional sync for increment
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Implementation
|
|
119
|
+
|
|
120
|
+
**File**: `plugins/specweave-github/lib/user-story-content-builder.ts`
|
|
121
|
+
|
|
122
|
+
**Workflow**:
|
|
123
|
+
1. Parse user story file with `UserStoryContentBuilder`
|
|
124
|
+
2. Search GitHub for existing issue (title pattern matching)
|
|
125
|
+
3. Build rich issue body with checkable ACs and task links
|
|
126
|
+
4. Update issue via `gh issue edit` with new body
|
|
127
|
+
|
|
128
|
+
**Error Handling**:
|
|
129
|
+
- ✅ Graceful fallback if user story file not found
|
|
130
|
+
- ✅ Clear error if GitHub issue doesn't exist
|
|
131
|
+
- ✅ Validation of required fields (epic, status, etc.)
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Execution
|
|
136
|
+
|
|
137
|
+
When user runs this command, the Claude Code assistant should:
|
|
138
|
+
|
|
139
|
+
1. Extract `featureId` and `userStoryId` from command arguments
|
|
140
|
+
2. Find user story file in living docs (search all projects)
|
|
141
|
+
3. Use `UserStoryContentBuilder` to parse and build issue body
|
|
142
|
+
4. Search for existing GitHub issue using `gh issue list --search`
|
|
143
|
+
5. Update issue using `gh issue edit --body`
|
|
144
|
+
6. Report success with issue URL
|
|
145
|
+
|
|
146
|
+
**Tech Stack**:
|
|
147
|
+
- TypeScript (UserStoryContentBuilder class)
|
|
148
|
+
- GitHub CLI (`gh issue list`, `gh issue edit`)
|
|
149
|
+
- YAML frontmatter parsing
|
|
150
|
+
- Markdown formatting
|
|
151
|
+
|
|
152
|
+
**Testing**:
|
|
153
|
+
- Test with FS-031/US-004 (bidirectional status sync)
|
|
154
|
+
- Verify ACs are checkable
|
|
155
|
+
- Verify tasks link to correct increment tasks.md
|
|
156
|
+
- Verify progress percentages are correct
|
|
@@ -3,20 +3,21 @@
|
|
|
3
3
|
# SpecWeave GitHub Sync Hook
|
|
4
4
|
# Runs after task completion to sync progress to GitHub Projects
|
|
5
5
|
#
|
|
6
|
-
#
|
|
7
|
-
# -
|
|
8
|
-
# -
|
|
6
|
+
# ARCHITECTURE (v0.19.0+): IMMUTABLE DESCRIPTIONS + PROGRESS COMMENTS
|
|
7
|
+
# - User Story files (.specweave/docs/internal/specs/) ↔ GitHub Issues
|
|
8
|
+
# - Issue descriptions created once (IMMUTABLE snapshot)
|
|
9
|
+
# - All updates via progress comments (audit trail)
|
|
9
10
|
#
|
|
10
11
|
# This hook is part of the specweave-github plugin and handles:
|
|
11
|
-
# - Finding which spec the current work belongs to
|
|
12
|
-
# -
|
|
13
|
-
# -
|
|
14
|
-
# -
|
|
12
|
+
# - Finding which spec user stories the current work belongs to
|
|
13
|
+
# - Syncing progress via GitHub comments (NOT editing issue body)
|
|
14
|
+
# - Creating audit trail of all changes over time
|
|
15
|
+
# - Notifying stakeholders via GitHub notifications
|
|
15
16
|
#
|
|
16
17
|
# Dependencies:
|
|
17
|
-
# - Node.js and TypeScript CLI (dist/cli/commands
|
|
18
|
+
# - Node.js and TypeScript CLI (dist/cli/commands/sync-spec-content.js)
|
|
18
19
|
# - GitHub CLI (gh) must be installed and authenticated
|
|
19
|
-
# -
|
|
20
|
+
# - ProgressCommentBuilder (lib/progress-comment-builder.ts)
|
|
20
21
|
|
|
21
22
|
set -e
|
|
22
23
|
|