specweave 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +229 -1817
- package/README.md +68 -0
- package/bin/specweave.js +62 -6
- package/dist/locales/de/.gitkeep +0 -0
- package/dist/locales/de/cli.json +108 -0
- package/dist/locales/en/cli.json +287 -0
- package/dist/locales/en/errors.json +7 -0
- package/dist/locales/en/templates.json +6 -0
- package/dist/locales/es/.gitkeep +0 -0
- package/dist/locales/es/cli.json +41 -0
- package/dist/locales/fr/.gitkeep +0 -0
- package/dist/locales/fr/cli.json +108 -0
- package/dist/locales/ja/.gitkeep +0 -0
- package/dist/locales/ja/cli.json +108 -0
- package/dist/locales/ko/.gitkeep +0 -0
- package/dist/locales/ko/cli.json +108 -0
- package/dist/locales/pt/.gitkeep +0 -0
- package/dist/locales/pt/cli.json +108 -0
- package/dist/locales/ru/.gitkeep +0 -0
- package/dist/locales/ru/cli.json +269 -0
- package/dist/locales/zh/.gitkeep +0 -0
- package/dist/locales/zh/cli.json +108 -0
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +3 -0
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts +21 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts.map +1 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js +162 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js.map +1 -0
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +65 -6
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +25 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +191 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts +112 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.js +301 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.js.map +1 -0
- package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts +3 -3
- package/dist/plugins/specweave-github/lib/duplicate-detector.js +3 -3
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +70 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js +258 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +14 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +51 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts +2 -2
- package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.js +20 -5
- package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts +87 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.js +412 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +64 -13
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts +78 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js +237 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts +97 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js +301 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts +83 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +386 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +28 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +156 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts +57 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +248 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.d.ts +82 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.js +13 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts +49 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.js +316 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts +70 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.js +23 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts +85 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.js +281 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts +75 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.js +238 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.js.map +1 -0
- package/dist/spec-parser.js +629 -0
- package/dist/src/cli/commands/import-docs.js +4 -4
- package/dist/src/cli/commands/import-docs.js.map +1 -1
- package/dist/src/cli/commands/init-multiproject.d.ts.map +1 -1
- package/dist/src/cli/commands/init-multiproject.js +17 -18
- package/dist/src/cli/commands/init-multiproject.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +107 -3
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.d.ts.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.js +8 -4
- package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
- package/dist/src/cli/commands/switch-project.d.ts.map +1 -1
- package/dist/src/cli/commands/switch-project.js +9 -26
- package/dist/src/cli/commands/switch-project.js.map +1 -1
- package/dist/src/cli/commands/sync-spec-content.js +3 -0
- package/dist/src/cli/commands/sync-spec-content.js.map +1 -1
- package/dist/src/core/deduplication/command-deduplicator.d.ts +166 -0
- package/dist/src/core/deduplication/command-deduplicator.d.ts.map +1 -0
- package/dist/src/core/deduplication/command-deduplicator.js +254 -0
- package/dist/src/core/deduplication/command-deduplicator.js.map +1 -0
- package/dist/src/core/increment/active-increment-manager.d.ts +42 -15
- package/dist/src/core/increment/active-increment-manager.d.ts.map +1 -1
- package/dist/src/core/increment/active-increment-manager.js +113 -46
- package/dist/src/core/increment/active-increment-manager.js.map +1 -1
- package/dist/src/core/increment/conflict-resolver.d.ts +40 -0
- package/dist/src/core/increment/conflict-resolver.d.ts.map +1 -0
- package/dist/src/core/increment/conflict-resolver.js +219 -0
- package/dist/src/core/increment/conflict-resolver.js.map +1 -0
- package/dist/src/core/increment/discipline-checker.d.ts.map +1 -1
- package/dist/src/core/increment/discipline-checker.js +7 -1
- package/dist/src/core/increment/discipline-checker.js.map +1 -1
- package/dist/src/core/increment/duplicate-detector.d.ts +52 -0
- package/dist/src/core/increment/duplicate-detector.d.ts.map +1 -0
- package/dist/src/core/increment/duplicate-detector.js +276 -0
- package/dist/src/core/increment/duplicate-detector.js.map +1 -0
- package/dist/src/core/increment/increment-archiver.d.ts +90 -0
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -0
- package/dist/src/core/increment/increment-archiver.js +368 -0
- package/dist/src/core/increment/increment-archiver.js.map +1 -0
- package/dist/src/core/increment/increment-reopener.d.ts +165 -0
- package/dist/src/core/increment/increment-reopener.d.ts.map +1 -0
- package/dist/src/core/increment/increment-reopener.js +390 -0
- package/dist/src/core/increment/increment-reopener.js.map +1 -0
- package/dist/src/core/increment/metadata-manager.d.ts +26 -1
- package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +143 -5
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/increment/recent-work-scanner.d.ts +121 -0
- package/dist/src/core/increment/recent-work-scanner.d.ts.map +1 -0
- package/dist/src/core/increment/recent-work-scanner.js +303 -0
- package/dist/src/core/increment/recent-work-scanner.js.map +1 -0
- package/dist/src/core/increment/types.d.ts +1 -0
- package/dist/src/core/increment/types.d.ts.map +1 -1
- package/dist/src/core/increment-utils.d.ts +112 -0
- package/dist/src/core/increment-utils.d.ts.map +1 -0
- package/dist/src/core/increment-utils.js +210 -0
- package/dist/src/core/increment-utils.js.map +1 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.d.ts +65 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.js +175 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.js.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts +130 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.js +549 -0
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts +81 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -0
- package/dist/src/core/living-docs/feature-id-manager.js +339 -0
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -0
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts +144 -83
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js +488 -270
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/index.d.ts +6 -0
- package/dist/src/core/living-docs/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/index.js +6 -0
- package/dist/src/core/living-docs/index.js.map +1 -1
- package/dist/src/core/living-docs/project-detector.d.ts +6 -0
- package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
- package/dist/src/core/living-docs/project-detector.js +35 -1
- package/dist/src/core/living-docs/project-detector.js.map +1 -1
- package/dist/src/core/living-docs/spec-distributor.d.ts +100 -26
- package/dist/src/core/living-docs/spec-distributor.d.ts.map +1 -1
- package/dist/src/core/living-docs/spec-distributor.js +1275 -258
- package/dist/src/core/living-docs/spec-distributor.js.map +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts +109 -0
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/task-project-specific-generator.js +221 -0
- package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -0
- package/dist/src/core/living-docs/types.d.ts +143 -0
- package/dist/src/core/living-docs/types.d.ts.map +1 -1
- package/dist/src/core/project-manager.d.ts +2 -17
- package/dist/src/core/project-manager.d.ts.map +1 -1
- package/dist/src/core/project-manager.js +68 -48
- package/dist/src/core/project-manager.js.map +1 -1
- package/dist/src/core/spec-content-sync.d.ts +1 -1
- package/dist/src/core/spec-content-sync.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.d.ts +32 -54
- package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.js +142 -138
- package/dist/src/core/sync/enhanced-content-builder.js.map +1 -1
- package/dist/src/core/sync/performance-optimizer.d.ts +153 -0
- package/dist/src/core/sync/performance-optimizer.d.ts.map +1 -0
- package/dist/src/core/sync/performance-optimizer.js +220 -0
- package/dist/src/core/sync/performance-optimizer.js.map +1 -0
- package/dist/src/core/sync/retry-handler.d.ts +98 -0
- package/dist/src/core/sync/retry-handler.d.ts.map +1 -0
- package/dist/src/core/sync/retry-handler.js +196 -0
- package/dist/src/core/sync/retry-handler.js.map +1 -0
- package/dist/src/core/sync/spec-content-sync.d.ts +88 -0
- package/dist/src/core/sync/spec-content-sync.d.ts.map +1 -0
- package/dist/src/core/sync/spec-content-sync.js +5 -0
- package/dist/src/core/sync/spec-content-sync.js.map +1 -0
- package/dist/src/core/sync/types.d.ts +52 -0
- package/dist/src/core/sync/types.d.ts.map +1 -0
- package/dist/src/core/sync/types.js +5 -0
- package/dist/src/core/sync/types.js.map +1 -0
- package/dist/src/core/types/config.d.ts +125 -0
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js +25 -0
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +10 -0
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/core/types/increment-metadata.js +10 -1
- package/dist/src/core/types/increment-metadata.js.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.js +4 -8
- package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.js +4 -8
- package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
- package/plugins/specweave/COMMANDS.md +13 -4
- package/plugins/specweave/agents/pm/AGENT.md +159 -12
- package/plugins/specweave/commands/specweave-abandon.md +22 -20
- package/plugins/specweave/commands/specweave-archive-features.md +121 -0
- package/plugins/specweave/commands/specweave-archive-increments.md +82 -0
- package/plugins/specweave/commands/specweave-archive.md +363 -0
- package/plugins/specweave/commands/specweave-backlog.md +211 -0
- package/plugins/specweave/commands/specweave-fix-duplicates.md +517 -0
- package/plugins/specweave/commands/specweave-increment.md +4 -3
- package/plugins/specweave/commands/specweave-progress.md +176 -27
- package/plugins/specweave/commands/specweave-reopen.md +391 -0
- package/plugins/specweave/commands/specweave-restore-feature.md +90 -0
- package/plugins/specweave/commands/specweave-restore.md +309 -0
- package/plugins/specweave/commands/specweave-resume.md +51 -23
- package/plugins/specweave/commands/specweave-status.md +41 -7
- package/plugins/specweave/commands/specweave-sync-specs.md +425 -0
- package/plugins/specweave/commands/specweave.md +70 -405
- package/plugins/specweave/hooks/hooks.json +4 -0
- package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
- package/plugins/specweave/hooks/post-increment-planning.sh +26 -2
- package/plugins/specweave/hooks/post-task-completion.sh +39 -0
- package/plugins/specweave/hooks/pre-command-deduplication.sh +83 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js +2 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.ts +4 -0
- package/plugins/specweave/lib/hooks/update-ac-status.js +102 -0
- package/plugins/specweave/lib/hooks/update-ac-status.ts +192 -0
- package/plugins/specweave/skills/archive-increments/SKILL.md +198 -0
- package/plugins/specweave/skills/increment-planner/scripts/feature-utils.js +14 -0
- package/plugins/specweave/skills/smart-reopen-detector/SKILL.md +244 -0
- package/plugins/specweave-ado/lib/ado-spec-content-sync.js +49 -5
- package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +72 -6
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
- package/plugins/specweave-confluent/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-confluent/README.md +375 -0
- package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +306 -0
- package/plugins/specweave-confluent/skills/confluent-kafka-connect/SKILL.md +453 -0
- package/plugins/specweave-confluent/skills/confluent-ksqldb/SKILL.md +470 -0
- package/plugins/specweave-confluent/skills/confluent-schema-registry/SKILL.md +316 -0
- package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +2 -2
- package/plugins/specweave-github/agents/user-story-updater/AGENT.md +148 -0
- package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +1 -1
- package/plugins/specweave-github/commands/specweave-github-update-user-story.md +156 -0
- package/plugins/specweave-github/hooks/post-task-completion.sh +42 -9
- package/plugins/specweave-github/lib/completion-calculator.js +262 -0
- package/plugins/specweave-github/lib/completion-calculator.ts +434 -0
- package/plugins/specweave-github/lib/duplicate-detector.js +3 -3
- package/plugins/specweave-github/lib/duplicate-detector.ts +4 -4
- package/plugins/specweave-github/lib/epic-content-builder.js +265 -0
- package/plugins/specweave-github/lib/epic-content-builder.ts +376 -0
- package/plugins/specweave-github/lib/github-client-v2.js +49 -0
- package/plugins/specweave-github/lib/github-client-v2.ts +59 -0
- package/plugins/specweave-github/lib/github-epic-sync.js +23 -24
- package/plugins/specweave-github/lib/github-epic-sync.ts +30 -5
- package/plugins/specweave-github/lib/github-feature-sync.js +381 -0
- package/plugins/specweave-github/lib/github-feature-sync.ts +568 -0
- package/plugins/specweave-github/lib/github-spec-content-sync.js +40 -10
- package/plugins/specweave-github/lib/github-spec-content-sync.ts +82 -14
- package/plugins/specweave-github/lib/progress-comment-builder.js +229 -0
- package/plugins/specweave-github/lib/progress-comment-builder.ts +324 -0
- package/plugins/specweave-github/lib/user-story-content-builder.js +299 -0
- package/plugins/specweave-github/lib/user-story-content-builder.ts +413 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.js +344 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.ts +543 -0
- package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +189 -0
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +134 -0
- package/plugins/specweave-jira/lib/{enhanced-jira-sync.ts.disabled → enhanced-jira-sync.ts} +26 -52
- package/plugins/specweave-kafka/.claude-plugin/plugin.json +26 -0
- package/plugins/specweave-kafka/IMPLEMENTATION-COMPLETE.md +483 -0
- package/plugins/specweave-kafka/README.md +242 -0
- package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +235 -0
- package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +209 -0
- package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +266 -0
- package/plugins/specweave-kafka/commands/deploy.md +99 -0
- package/plugins/specweave-kafka/commands/dev-env.md +176 -0
- package/plugins/specweave-kafka/commands/mcp-configure.md +101 -0
- package/plugins/specweave-kafka/commands/monitor-setup.md +96 -0
- package/plugins/specweave-kafka/docker/kafka-local/docker-compose.yml +187 -0
- package/plugins/specweave-kafka/docker/redpanda/docker-compose.yml +199 -0
- package/plugins/specweave-kafka/docker/templates/consumer-nodejs.js +225 -0
- package/plugins/specweave-kafka/docker/templates/consumer-python.py +220 -0
- package/plugins/specweave-kafka/docker/templates/producer-nodejs.js +168 -0
- package/plugins/specweave-kafka/docker/templates/producer-python.py +167 -0
- package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.js +438 -0
- package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.ts +541 -0
- package/plugins/specweave-kafka/lib/adapters/platform-adapter.js +47 -0
- package/plugins/specweave-kafka/lib/adapters/platform-adapter.ts +343 -0
- package/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +258 -0
- package/plugins/specweave-kafka/lib/cli/kcat-wrapper.ts +298 -0
- package/plugins/specweave-kafka/lib/cli/types.js +10 -0
- package/plugins/specweave-kafka/lib/cli/types.ts +92 -0
- package/plugins/specweave-kafka/lib/connectors/connector-catalog.js +305 -0
- package/plugins/specweave-kafka/lib/connectors/connector-catalog.ts +528 -0
- package/plugins/specweave-kafka/lib/documentation/diagram-generator.js +114 -0
- package/plugins/specweave-kafka/lib/documentation/diagram-generator.ts +195 -0
- package/plugins/specweave-kafka/lib/documentation/exporter.js +210 -0
- package/plugins/specweave-kafka/lib/documentation/exporter.ts +338 -0
- package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.js +60 -0
- package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.ts +130 -0
- package/plugins/specweave-kafka/lib/documentation/topology-generator.js +143 -0
- package/plugins/specweave-kafka/lib/documentation/topology-generator.ts +290 -0
- package/plugins/specweave-kafka/lib/mcp/detector.js +298 -0
- package/plugins/specweave-kafka/lib/mcp/detector.ts +352 -0
- package/plugins/specweave-kafka/lib/mcp/types.js +21 -0
- package/plugins/specweave-kafka/lib/mcp/types.ts +77 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.js +193 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.ts +362 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.js +188 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.ts +359 -0
- package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.js +195 -0
- package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.ts +380 -0
- package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.js +209 -0
- package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.ts +358 -0
- package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.js +354 -0
- package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.ts +563 -0
- package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.js +259 -0
- package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.ts +516 -0
- package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.js +233 -0
- package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.ts +423 -0
- package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.js +266 -0
- package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.ts +445 -0
- package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.js +312 -0
- package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.ts +561 -0
- package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.js +289 -0
- package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.ts +607 -0
- package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.js +264 -0
- package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.ts +498 -0
- package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.js +263 -0
- package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.ts +549 -0
- package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.js +205 -0
- package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.ts +399 -0
- package/plugins/specweave-kafka/lib/performance/performance-optimizer.js +249 -0
- package/plugins/specweave-kafka/lib/performance/performance-optimizer.ts +427 -0
- package/plugins/specweave-kafka/lib/security/kafka-security.js +252 -0
- package/plugins/specweave-kafka/lib/security/kafka-security.ts +494 -0
- package/plugins/specweave-kafka/lib/utils/capacity-planner.js +203 -0
- package/plugins/specweave-kafka/lib/utils/capacity-planner.ts +469 -0
- package/plugins/specweave-kafka/lib/utils/config-validator.js +419 -0
- package/plugins/specweave-kafka/lib/utils/config-validator.ts +564 -0
- package/plugins/specweave-kafka/lib/utils/partitioning.js +329 -0
- package/plugins/specweave-kafka/lib/utils/partitioning.ts +473 -0
- package/plugins/specweave-kafka/lib/utils/sizing.js +221 -0
- package/plugins/specweave-kafka/lib/utils/sizing.ts +374 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-broker-metrics.json +628 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-cluster-overview.json +564 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-consumer-lag.json +509 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-jvm-metrics.json +674 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-topic-metrics.json +578 -0
- package/plugins/specweave-kafka/monitoring/grafana/provisioning/dashboards/kafka.yml +17 -0
- package/plugins/specweave-kafka/monitoring/grafana/provisioning/datasources/prometheus.yml +17 -0
- package/plugins/specweave-kafka/monitoring/prometheus/kafka-alerts.yml +415 -0
- package/plugins/specweave-kafka/monitoring/prometheus/kafka-jmx-exporter.yml +256 -0
- package/plugins/specweave-kafka/package.json +41 -0
- package/plugins/specweave-kafka/skills/kafka-architecture/SKILL.md +647 -0
- package/plugins/specweave-kafka/skills/kafka-cli-tools/SKILL.md +433 -0
- package/plugins/specweave-kafka/skills/kafka-iac-deployment/SKILL.md +449 -0
- package/plugins/specweave-kafka/skills/kafka-kubernetes/SKILL.md +667 -0
- package/plugins/specweave-kafka/skills/kafka-mcp-integration/SKILL.md +273 -0
- package/plugins/specweave-kafka/skills/kafka-observability/SKILL.md +576 -0
- package/plugins/specweave-kafka/templates/config/broker-production.properties +254 -0
- package/plugins/specweave-kafka/templates/config/consumer-low-latency.properties +112 -0
- package/plugins/specweave-kafka/templates/config/producer-high-throughput.properties +120 -0
- package/plugins/specweave-kafka/templates/migration/mirrormaker2-config.properties +234 -0
- package/plugins/specweave-kafka/templates/monitoring/grafana/multi-cluster-dashboard.json +686 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/main.tf +347 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/outputs.tf +107 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/templates/kafka-broker-init.sh.tpl +216 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/variables.tf +156 -0
- package/plugins/specweave-kafka/terraform/aws-msk/main.tf +362 -0
- package/plugins/specweave-kafka/terraform/aws-msk/outputs.tf +93 -0
- package/plugins/specweave-kafka/terraform/aws-msk/templates/server.properties.tpl +32 -0
- package/plugins/specweave-kafka/terraform/aws-msk/variables.tf +235 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/main.tf +281 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/outputs.tf +118 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/variables.tf +148 -0
- package/plugins/specweave-kafka/tsconfig.json +21 -0
- package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-kafka-streams/README.md +310 -0
- package/plugins/specweave-kafka-streams/skills/kafka-streams-topology/SKILL.md +539 -0
- package/plugins/specweave-n8n/.claude-plugin/plugin.json +22 -0
- package/plugins/specweave-n8n/README.md +354 -0
- package/plugins/specweave-n8n/skills/n8n-kafka-workflows/SKILL.md +504 -0
- package/plugins/specweave-release/commands/specweave-release-platform.md +1 -1
- package/plugins/specweave-release/hooks/post-task-completion.sh +2 -2
- package/src/templates/AGENTS.md.template +601 -7
- package/src/templates/CLAUDE.md.template +188 -88
- package/plugins/specweave-ado/commands/specweave-ado-sync-spec.md +0 -255
- package/plugins/specweave-github/commands/specweave-github-sync-epic.md +0 -248
- package/plugins/specweave-github/commands/specweave-github-sync-from.md +0 -147
- package/plugins/specweave-github/commands/specweave-github-sync-spec.md +0 -208
- package/plugins/specweave-github/commands/specweave-github-sync-tasks.md +0 -530
- package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +0 -267
- package/plugins/specweave-jira/commands/specweave-jira-sync-spec.md +0 -240
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User Story Issue Builder - Creates GitHub issue content for individual User Stories
|
|
3
|
+
*
|
|
4
|
+
* Architecture (Universal Hierarchy):
|
|
5
|
+
* - Feature (FS-033) → GitHub Milestone
|
|
6
|
+
* - User Story (US-001) → GitHub Issue (this builder creates the body)
|
|
7
|
+
* - Tasks (T-001, T-002) → Checkboxes in issue body
|
|
8
|
+
*
|
|
9
|
+
* Key Features:
|
|
10
|
+
* - Reads single us-*.md file
|
|
11
|
+
* - Extracts acceptance criteria as checkboxes
|
|
12
|
+
* - Maps tasks from increment's tasks.md
|
|
13
|
+
* - Generates GitHub issue body with proper formatting
|
|
14
|
+
*/
|
|
15
|
+
import { readFile } from 'fs/promises';
|
|
16
|
+
import { existsSync } from 'fs';
|
|
17
|
+
import * as path from 'path';
|
|
18
|
+
import * as yaml from 'yaml';
|
|
19
|
+
export class UserStoryIssueBuilder {
|
|
20
|
+
constructor(userStoryPath, projectRoot, featureId, repoInfo) {
|
|
21
|
+
this.userStoryPath = userStoryPath;
|
|
22
|
+
this.projectRoot = projectRoot;
|
|
23
|
+
this.featureId = featureId;
|
|
24
|
+
this.repoOwner = repoInfo?.owner;
|
|
25
|
+
this.repoName = repoInfo?.repo;
|
|
26
|
+
this.branch = repoInfo?.branch || 'develop';
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Build GitHub issue body for a single User Story
|
|
30
|
+
*
|
|
31
|
+
* Format:
|
|
32
|
+
* - User Story statement
|
|
33
|
+
* - Acceptance Criteria (checkboxes)
|
|
34
|
+
* - Tasks (checkboxes)
|
|
35
|
+
* - Links (Feature, Increment, Spec file)
|
|
36
|
+
*/
|
|
37
|
+
async buildIssueBody() {
|
|
38
|
+
// 1. Read User Story metadata
|
|
39
|
+
const frontmatter = await this.readUserStoryFrontmatter();
|
|
40
|
+
const content = await readFile(this.userStoryPath, 'utf-8');
|
|
41
|
+
const bodyContent = content.slice(content.indexOf('---', 3) + 3).trim();
|
|
42
|
+
// 2. Extract sections
|
|
43
|
+
const userStoryStatement = this.extractUserStoryStatement(bodyContent);
|
|
44
|
+
const acceptanceCriteria = this.extractAcceptanceCriteria(bodyContent);
|
|
45
|
+
const tasks = await this.extractTasks(bodyContent, frontmatter.id);
|
|
46
|
+
// 3. Build issue title
|
|
47
|
+
const title = `[${this.featureId}][${frontmatter.id}] ${frontmatter.title}`;
|
|
48
|
+
// 4. Build issue body
|
|
49
|
+
const body = this.buildBody({
|
|
50
|
+
frontmatter,
|
|
51
|
+
userStoryStatement,
|
|
52
|
+
acceptanceCriteria,
|
|
53
|
+
tasks,
|
|
54
|
+
bodyContent
|
|
55
|
+
});
|
|
56
|
+
// 5. Determine labels
|
|
57
|
+
const labels = this.buildLabels(frontmatter);
|
|
58
|
+
return {
|
|
59
|
+
title,
|
|
60
|
+
body,
|
|
61
|
+
labels,
|
|
62
|
+
userStoryId: frontmatter.id
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Read User Story frontmatter
|
|
67
|
+
*/
|
|
68
|
+
async readUserStoryFrontmatter() {
|
|
69
|
+
const content = await readFile(this.userStoryPath, 'utf-8');
|
|
70
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
71
|
+
if (!match) {
|
|
72
|
+
throw new Error(`${this.userStoryPath}: Missing YAML frontmatter`);
|
|
73
|
+
}
|
|
74
|
+
return yaml.parse(match[1]);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Extract "As a... I want... So that..." statement
|
|
78
|
+
*/
|
|
79
|
+
extractUserStoryStatement(content) {
|
|
80
|
+
// Look for "User Story" section or "As a" pattern
|
|
81
|
+
const userStoryMatch = content.match(/##\s*User Story\s*\n+([\s\S]*?)(?=\n##|$)/i);
|
|
82
|
+
if (userStoryMatch) {
|
|
83
|
+
return userStoryMatch[1].trim();
|
|
84
|
+
}
|
|
85
|
+
// Fallback: Look for "As a" pattern
|
|
86
|
+
const asAMatch = content.match(/(\*\*As a\*\*[\s\S]*?\*\*So that\*\*[^\n]*)/i);
|
|
87
|
+
if (asAMatch) {
|
|
88
|
+
return asAMatch[1].trim();
|
|
89
|
+
}
|
|
90
|
+
return '';
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Extract Acceptance Criteria with AC-IDs and checkbox state
|
|
94
|
+
*/
|
|
95
|
+
extractAcceptanceCriteria(content) {
|
|
96
|
+
const criteria = [];
|
|
97
|
+
// Look for "Acceptance Criteria" section
|
|
98
|
+
const acMatch = content.match(/##\s*Acceptance Criteria\s*\n+([\s\S]*?)(?=\n##|$)/i);
|
|
99
|
+
if (!acMatch) {
|
|
100
|
+
return criteria;
|
|
101
|
+
}
|
|
102
|
+
const acSection = acMatch[1];
|
|
103
|
+
// ✅ FIX: Extract checkbox state and AC-IDs
|
|
104
|
+
// Supports TWO formats:
|
|
105
|
+
// Format 1 (preferred): AC-US1-01, AC-US1-02, etc.
|
|
106
|
+
// Format 2 (legacy): AC-001, AC-002, etc.
|
|
107
|
+
// Patterns:
|
|
108
|
+
// - [x] **AC-US1-01**: Description (completed)
|
|
109
|
+
// - [ ] **AC-US1-01**: Description (not completed)
|
|
110
|
+
// - [x] **AC-001**: Description (legacy format, completed)
|
|
111
|
+
// - **AC-US1-01**: Description (no checkbox, default to not completed)
|
|
112
|
+
const acPatternWithCheckbox = /(?:^|\n)\s*[-*]\s+\[([x ])\]\s+\*\*([A-Z]+-(?:[A-Z]+\d+-)?(\d+))\*\*:\s*([^\n]+)/g;
|
|
113
|
+
const acPatternNoCheckbox = /(?:^|\n)\s*[-*]?\s*\*\*([A-Z]+-(?:[A-Z]+\d+-)?(\d+))\*\*:\s*([^\n]+)/g;
|
|
114
|
+
// First try pattern with checkboxes
|
|
115
|
+
let match;
|
|
116
|
+
let foundAny = false;
|
|
117
|
+
while ((match = acPatternWithCheckbox.exec(acSection)) !== null) {
|
|
118
|
+
foundAny = true;
|
|
119
|
+
criteria.push({
|
|
120
|
+
id: match[2], // e.g., "AC-US1-01" or "AC-001"
|
|
121
|
+
description: match[4].trim(),
|
|
122
|
+
completed: match[1] === 'x' // ✅ Read checkbox state from source!
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
// If no checkboxes found, try pattern without checkboxes
|
|
126
|
+
if (!foundAny) {
|
|
127
|
+
while ((match = acPatternNoCheckbox.exec(acSection)) !== null) {
|
|
128
|
+
criteria.push({
|
|
129
|
+
id: match[1], // e.g., "AC-US1-01" or "AC-001"
|
|
130
|
+
description: match[3].trim(),
|
|
131
|
+
completed: false // Default to not completed
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return criteria;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Extract tasks from user story's ## Tasks section (NEW architecture)
|
|
139
|
+
*
|
|
140
|
+
* Previously: Read from increment tasks.md (LEGACY)
|
|
141
|
+
* Now: Read from user story's ## Tasks section directly
|
|
142
|
+
*
|
|
143
|
+
* This enables project-specific tasks with completion tracking per user story.
|
|
144
|
+
*/
|
|
145
|
+
async extractTasks(userStoryContent, userStoryId) {
|
|
146
|
+
const tasks = [];
|
|
147
|
+
// ✅ NEW: Look for ## Tasks section in user story file
|
|
148
|
+
const tasksMatch = userStoryContent.match(/##\s+Tasks\s*\n+([\s\S]*?)(?=\n##|>?\s*\*\*Note\*\*:|---+|$)/i);
|
|
149
|
+
if (!tasksMatch) {
|
|
150
|
+
// FALLBACK: Try old architecture (read from increment tasks.md)
|
|
151
|
+
console.log(` ℹ️ No ## Tasks section found in ${userStoryId}, falling back to legacy extraction`);
|
|
152
|
+
return this.extractTasksLegacy(userStoryContent, userStoryId);
|
|
153
|
+
}
|
|
154
|
+
const tasksSection = tasksMatch[1];
|
|
155
|
+
// Pattern: - [x] **T-001**: Task title or - [ ] **T-001**: Task title
|
|
156
|
+
const taskPattern = /^[-*]\s+\[([x ])\]\s+\*\*(T-\d+)\*\*:\s+(.+)$/gm;
|
|
157
|
+
let match;
|
|
158
|
+
while ((match = taskPattern.exec(tasksSection)) !== null) {
|
|
159
|
+
const completed = match[1] === 'x';
|
|
160
|
+
const taskId = match[2];
|
|
161
|
+
const taskTitle = match[3].trim();
|
|
162
|
+
tasks.push({
|
|
163
|
+
id: taskId,
|
|
164
|
+
title: taskTitle,
|
|
165
|
+
completed // ✅ Read checkbox state directly from user story!
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return tasks;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* LEGACY: Extract tasks from increment's tasks.md (backward compatibility)
|
|
172
|
+
*
|
|
173
|
+
* Used as fallback when user story file doesn't have ## Tasks section.
|
|
174
|
+
*/
|
|
175
|
+
async extractTasksLegacy(userStoryContent, userStoryId) {
|
|
176
|
+
const tasks = [];
|
|
177
|
+
// Look for "Implementation" section with increment link
|
|
178
|
+
const implMatch = userStoryContent.match(/##\s*Implementation\s*\n+([\s\S]*?)(?=\n##|$)/i);
|
|
179
|
+
if (!implMatch) {
|
|
180
|
+
return tasks;
|
|
181
|
+
}
|
|
182
|
+
const implSection = implMatch[1];
|
|
183
|
+
// Extract increment ID from Implementation section
|
|
184
|
+
// Pattern: **Increment**: [0031-external-tool-status-sync](...)
|
|
185
|
+
const incrementMatch = implSection.match(/\*\*Increment\*\*:\s*\[([^\]]+)\]/);
|
|
186
|
+
if (!incrementMatch) {
|
|
187
|
+
return tasks;
|
|
188
|
+
}
|
|
189
|
+
const incrementId = incrementMatch[1];
|
|
190
|
+
// Try to read increment's tasks.md
|
|
191
|
+
const tasksPath = path.join(this.projectRoot, '.specweave', 'increments', incrementId, 'tasks.md');
|
|
192
|
+
if (!existsSync(tasksPath)) {
|
|
193
|
+
return tasks;
|
|
194
|
+
}
|
|
195
|
+
const tasksContent = await readFile(tasksPath, 'utf-8');
|
|
196
|
+
// Extract tasks that reference this User Story via AC-IDs
|
|
197
|
+
// Pattern: ### T-001: Task Title\n**User Story**: ...\n\n**Status**: [x] (100% - Completed)\n\n**AC**: AC-US1-01
|
|
198
|
+
// Note: Status field format: **Status**: [x] or [ ]
|
|
199
|
+
const taskPattern = /###?\s+(T-\d+):\s*([^\n]+)\n([\s\S]*?)(?=\n###?\s+T-\d+:|$)/g;
|
|
200
|
+
let match;
|
|
201
|
+
while ((match = taskPattern.exec(tasksContent)) !== null) {
|
|
202
|
+
const taskId = match[1];
|
|
203
|
+
const taskTitle = match[2].trim();
|
|
204
|
+
const taskBody = match[3];
|
|
205
|
+
// Extract AC list
|
|
206
|
+
const acMatch = taskBody.match(/\*\*AC\*\*:\s*([^\n]+)/);
|
|
207
|
+
if (!acMatch) {
|
|
208
|
+
continue; // Skip tasks without AC field
|
|
209
|
+
}
|
|
210
|
+
const acList = acMatch[1].trim();
|
|
211
|
+
// Check if any AC in this task belongs to current User Story
|
|
212
|
+
// AC-US1-01 → US-001
|
|
213
|
+
const belongsToThisUS = acList
|
|
214
|
+
.split(',')
|
|
215
|
+
.map((ac) => ac.trim())
|
|
216
|
+
.some((acId) => {
|
|
217
|
+
const usMatch = acId.match(/AC-([A-Z]+\d+)-/);
|
|
218
|
+
if (!usMatch)
|
|
219
|
+
return false;
|
|
220
|
+
return usMatch[1] === userStoryId.replace('US-', 'US');
|
|
221
|
+
});
|
|
222
|
+
if (!belongsToThisUS) {
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
// ✅ Extract completion status from **Status**: [x] or [ ]
|
|
226
|
+
const statusMatch = taskBody.match(/\*\*Status\*\*:\s*\[([x ])\]/);
|
|
227
|
+
const completed = statusMatch ? statusMatch[1] === 'x' : false;
|
|
228
|
+
tasks.push({
|
|
229
|
+
id: taskId,
|
|
230
|
+
title: taskTitle,
|
|
231
|
+
completed
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return tasks;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Build complete issue body
|
|
238
|
+
*/
|
|
239
|
+
buildBody(data) {
|
|
240
|
+
const sections = [];
|
|
241
|
+
// Header with metadata
|
|
242
|
+
sections.push(`**Feature**: ${this.featureId}`);
|
|
243
|
+
sections.push(`**Status**: ${this.capitalize(data.frontmatter.status)}`);
|
|
244
|
+
sections.push(`**Priority**: ${data.frontmatter.priority || 'P2'}`);
|
|
245
|
+
// ✅ FIX: Only output Project if defined and not "default"
|
|
246
|
+
if (data.frontmatter.project && data.frontmatter.project !== 'default') {
|
|
247
|
+
sections.push(`**Project**: ${data.frontmatter.project}`);
|
|
248
|
+
}
|
|
249
|
+
sections.push('');
|
|
250
|
+
// User Story statement
|
|
251
|
+
if (data.userStoryStatement) {
|
|
252
|
+
sections.push('## User Story');
|
|
253
|
+
sections.push('');
|
|
254
|
+
sections.push(data.userStoryStatement);
|
|
255
|
+
sections.push('');
|
|
256
|
+
}
|
|
257
|
+
// Acceptance Criteria
|
|
258
|
+
if (data.acceptanceCriteria.length > 0) {
|
|
259
|
+
sections.push('## Acceptance Criteria');
|
|
260
|
+
sections.push('');
|
|
261
|
+
for (const ac of data.acceptanceCriteria) {
|
|
262
|
+
const checkbox = ac.completed ? '[x]' : '[ ]';
|
|
263
|
+
sections.push(`- ${checkbox} **${ac.id}**: ${ac.description}`);
|
|
264
|
+
}
|
|
265
|
+
sections.push('');
|
|
266
|
+
}
|
|
267
|
+
// Tasks
|
|
268
|
+
if (data.tasks.length > 0) {
|
|
269
|
+
sections.push('## Tasks');
|
|
270
|
+
sections.push('');
|
|
271
|
+
for (const task of data.tasks) {
|
|
272
|
+
const checkbox = task.completed ? '[x]' : '[ ]';
|
|
273
|
+
sections.push(`- ${checkbox} **${task.id}**: ${task.title}`);
|
|
274
|
+
}
|
|
275
|
+
sections.push('');
|
|
276
|
+
}
|
|
277
|
+
// Extract Business Rationale if present
|
|
278
|
+
const rationaleMatch = data.bodyContent.match(/##\s*Business Rationale\s*\n+([\s\S]*?)(?=\n##|$)/i);
|
|
279
|
+
if (rationaleMatch) {
|
|
280
|
+
sections.push('## Business Rationale');
|
|
281
|
+
sections.push('');
|
|
282
|
+
sections.push(rationaleMatch[1].trim());
|
|
283
|
+
sections.push('');
|
|
284
|
+
}
|
|
285
|
+
// ✅ NEW: Extract Related User Stories if present
|
|
286
|
+
const relatedMatch = data.bodyContent.match(/##\s*Related User Stories\s*\n+([\s\S]*?)(?=\n##|---+|$)/i);
|
|
287
|
+
if (relatedMatch) {
|
|
288
|
+
sections.push('## Related User Stories');
|
|
289
|
+
sections.push('');
|
|
290
|
+
// Convert relative paths to GitHub blob URLs
|
|
291
|
+
let relatedContent = relatedMatch[1].trim();
|
|
292
|
+
if (this.repoOwner && this.repoName) {
|
|
293
|
+
const baseUrl = `https://github.com/${this.repoOwner}/${this.repoName}/blob/${this.branch}`;
|
|
294
|
+
// Replace relative links like us-002-*.md to proper GitHub URLs
|
|
295
|
+
// Pattern: - [US-002: Title](us-002-file-name.md)
|
|
296
|
+
relatedContent = relatedContent.replace(/\(([^)]+\.md)\)/g, (match, filename) => {
|
|
297
|
+
// If it's already an absolute URL, don't change it
|
|
298
|
+
if (filename.startsWith('http')) {
|
|
299
|
+
return match;
|
|
300
|
+
}
|
|
301
|
+
// Get the project folder from the current user story path
|
|
302
|
+
const projectMatch = this.userStoryPath.match(/\/specs\/([^/]+)\/FS-[^/]+\//);
|
|
303
|
+
const project = projectMatch ? projectMatch[1] : 'default';
|
|
304
|
+
const featureId = this.featureId;
|
|
305
|
+
return `(${baseUrl}/.specweave/docs/internal/specs/${project}/${featureId}/${filename})`;
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
sections.push(relatedContent);
|
|
309
|
+
sections.push('');
|
|
310
|
+
}
|
|
311
|
+
// ✅ FIX: Extract Implementation section if present
|
|
312
|
+
const implMatch = data.bodyContent.match(/##\s*Implementation\s*\n+([\s\S]*?)(?=\n##|$)/i);
|
|
313
|
+
if (implMatch) {
|
|
314
|
+
sections.push('## Implementation');
|
|
315
|
+
sections.push('');
|
|
316
|
+
// Convert relative paths to GitHub blob URLs
|
|
317
|
+
let implContent = implMatch[1].trim();
|
|
318
|
+
if (this.repoOwner && this.repoName) {
|
|
319
|
+
const baseUrl = `https://github.com/${this.repoOwner}/${this.repoName}/blob/${this.branch}`;
|
|
320
|
+
// Replace relative paths like ../../../../../increments/0031-*/tasks.md
|
|
321
|
+
// Pattern: ../ repeated multiple times, then increments/XXXX-name/tasks.md or spec.md
|
|
322
|
+
implContent = implContent.replace(/\.\.(\/\.\.)+\/increments\/([\w-]+)\/([\w.-]+(?:#[\w-]+)?)/g, `${baseUrl}/.specweave/increments/$2/$3`);
|
|
323
|
+
// Replace relative paths to specs like ../../specs/default/FS-XXX/...
|
|
324
|
+
implContent = implContent.replace(/\.\.(\/\.\.)+\/specs\/([\w-]+)\/([\w-]+)\/([\w.-]+(?:#[\w-]+)?)/g, `${baseUrl}/.specweave/docs/internal/specs/$2/$3/$4`);
|
|
325
|
+
}
|
|
326
|
+
sections.push(implContent);
|
|
327
|
+
sections.push('');
|
|
328
|
+
}
|
|
329
|
+
// Links
|
|
330
|
+
sections.push('---');
|
|
331
|
+
sections.push('');
|
|
332
|
+
sections.push('## Links');
|
|
333
|
+
sections.push('');
|
|
334
|
+
// Generate proper GitHub blob URLs
|
|
335
|
+
if (this.repoOwner && this.repoName) {
|
|
336
|
+
const baseUrl = `https://github.com/${this.repoOwner}/${this.repoName}/blob/${this.branch}`;
|
|
337
|
+
// Feature Spec link
|
|
338
|
+
sections.push(`- **Feature Spec**: [${this.featureId}](${baseUrl}/.specweave/docs/internal/specs/_features/${this.featureId}/FEATURE.md)`);
|
|
339
|
+
// User Story File link (relative to project root)
|
|
340
|
+
const relativeUSPath = path.relative(this.projectRoot, this.userStoryPath);
|
|
341
|
+
sections.push(`- **User Story File**: [${path.basename(this.userStoryPath)}](${baseUrl}/${relativeUSPath})`);
|
|
342
|
+
// Increment link (extracted from Implementation section)
|
|
343
|
+
const incrementMatch = implMatch?.[1]?.match(/\*\*Increment\*\*:\s*\[([^\]]+)\]/);
|
|
344
|
+
if (incrementMatch) {
|
|
345
|
+
const incrementId = incrementMatch[1];
|
|
346
|
+
sections.push(`- **Increment**: [${incrementId}](${baseUrl}/.specweave/increments/${incrementId})`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
// Fallback to relative links if repo info not provided
|
|
351
|
+
sections.push(`- **Feature Spec**: [${this.featureId}](../.specweave/docs/internal/specs/_features/${this.featureId}/FEATURE.md)`);
|
|
352
|
+
sections.push(`- **User Story File**: [${path.basename(this.userStoryPath)}](${this.userStoryPath})`);
|
|
353
|
+
}
|
|
354
|
+
sections.push('');
|
|
355
|
+
sections.push('---');
|
|
356
|
+
sections.push('');
|
|
357
|
+
sections.push('🤖 Auto-created by SpecWeave User Story Sync | Updates automatically');
|
|
358
|
+
return sections.join('\n');
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Build labels for the issue
|
|
362
|
+
*/
|
|
363
|
+
buildLabels(frontmatter) {
|
|
364
|
+
const labels = ['user-story', 'specweave'];
|
|
365
|
+
// Add status label
|
|
366
|
+
if (frontmatter.status) {
|
|
367
|
+
labels.push(`status:${frontmatter.status}`);
|
|
368
|
+
}
|
|
369
|
+
// Add priority label
|
|
370
|
+
if (frontmatter.priority) {
|
|
371
|
+
labels.push(frontmatter.priority.toLowerCase());
|
|
372
|
+
}
|
|
373
|
+
// Add project label
|
|
374
|
+
if (frontmatter.project && frontmatter.project !== 'default') {
|
|
375
|
+
labels.push(`project:${frontmatter.project}`);
|
|
376
|
+
}
|
|
377
|
+
return labels;
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Capitalize first letter
|
|
381
|
+
*/
|
|
382
|
+
capitalize(str) {
|
|
383
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=user-story-issue-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-story-issue-builder.js","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/user-story-issue-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced JIRA Spec Content Sync
|
|
3
|
+
*
|
|
4
|
+
* Uses EnhancedContentBuilder and SpecIncrementMapper for rich epic descriptions.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: This version focuses on enhanced content building.
|
|
7
|
+
* Actual JIRA API integration requires jira-spec-sync.ts
|
|
8
|
+
*/
|
|
9
|
+
export interface EnhancedJiraSyncOptions {
|
|
10
|
+
specPath: string;
|
|
11
|
+
domain?: string;
|
|
12
|
+
project?: string;
|
|
13
|
+
dryRun?: boolean;
|
|
14
|
+
verbose?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface EnhancedJiraSyncResult {
|
|
17
|
+
success: boolean;
|
|
18
|
+
action: 'created' | 'updated' | 'no-change' | 'error';
|
|
19
|
+
epicKey?: string;
|
|
20
|
+
epicUrl?: string;
|
|
21
|
+
error?: string;
|
|
22
|
+
tasksLinked?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Enhanced sync with rich content including task mappings
|
|
26
|
+
*/
|
|
27
|
+
export declare function syncSpecToJiraWithEnhancedContent(options: EnhancedJiraSyncOptions): Promise<EnhancedJiraSyncResult>;
|
|
28
|
+
//# sourceMappingURL=enhanced-jira-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanced-jira-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/enhanced-jira-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CA+FjC"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced JIRA Spec Content Sync
|
|
3
|
+
*
|
|
4
|
+
* Uses EnhancedContentBuilder and SpecIncrementMapper for rich epic descriptions.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: This version focuses on enhanced content building.
|
|
7
|
+
* Actual JIRA API integration requires jira-spec-sync.ts
|
|
8
|
+
*/
|
|
9
|
+
import { EnhancedContentBuilder } from '../../../src/core/sync/enhanced-content-builder.js';
|
|
10
|
+
import { SpecIncrementMapper } from '../../../src/core/sync/spec-increment-mapper.js';
|
|
11
|
+
import { parseSpecContent } from '../../../src/core/spec-content-sync.js';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import * as fs from 'fs/promises';
|
|
14
|
+
/**
|
|
15
|
+
* Enhanced sync with rich content including task mappings
|
|
16
|
+
*/
|
|
17
|
+
export async function syncSpecToJiraWithEnhancedContent(options) {
|
|
18
|
+
const { specPath, domain, project, dryRun = false, verbose = false } = options;
|
|
19
|
+
try {
|
|
20
|
+
// 1. Parse spec content
|
|
21
|
+
const baseSpec = await parseSpecContent(specPath);
|
|
22
|
+
if (!baseSpec) {
|
|
23
|
+
return {
|
|
24
|
+
success: false,
|
|
25
|
+
action: 'error',
|
|
26
|
+
error: 'Failed to parse spec content',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (verbose) {
|
|
30
|
+
console.log(`📄 Parsed spec: ${baseSpec.identifier.compact}`);
|
|
31
|
+
}
|
|
32
|
+
// 2. Build enhanced spec with task mappings
|
|
33
|
+
const specId = baseSpec.identifier.full || baseSpec.identifier.compact;
|
|
34
|
+
const rootDir = await findSpecWeaveRoot(specPath);
|
|
35
|
+
const mapper = new SpecIncrementMapper(rootDir);
|
|
36
|
+
const mapping = await mapper.mapSpecToIncrements(specId);
|
|
37
|
+
if (verbose) {
|
|
38
|
+
console.log(`🔗 Found ${mapping.increments.length} related increments`);
|
|
39
|
+
}
|
|
40
|
+
// 3. Build enhanced spec content
|
|
41
|
+
const taskMapping = buildTaskMapping(mapping.increments);
|
|
42
|
+
const architectureDocs = await findArchitectureDocs(rootDir, specId);
|
|
43
|
+
const enhancedSpec = {
|
|
44
|
+
...baseSpec,
|
|
45
|
+
summary: baseSpec.description,
|
|
46
|
+
taskMapping,
|
|
47
|
+
architectureDocs
|
|
48
|
+
};
|
|
49
|
+
// 4. Build external description
|
|
50
|
+
const builder = new EnhancedContentBuilder();
|
|
51
|
+
const description = builder.buildExternalDescription(enhancedSpec);
|
|
52
|
+
if (verbose) {
|
|
53
|
+
console.log(`📝 Generated description: ${description.length} characters`);
|
|
54
|
+
}
|
|
55
|
+
if (dryRun) {
|
|
56
|
+
console.log('🔍 DRY RUN - Would create/update epic with:');
|
|
57
|
+
console.log(` Summary: ${baseSpec.title}`);
|
|
58
|
+
console.log(` Description length: ${description.length}`);
|
|
59
|
+
return {
|
|
60
|
+
success: true,
|
|
61
|
+
action: 'no-change',
|
|
62
|
+
tasksLinked: taskMapping?.tasks.length || 0
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// 5. Validate domain/project (if not dry run)
|
|
66
|
+
if (!dryRun && (!domain || !project)) {
|
|
67
|
+
return {
|
|
68
|
+
success: false,
|
|
69
|
+
action: 'error',
|
|
70
|
+
error: 'JIRA domain/project not specified (required for actual sync)',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// For now, we focus on content building
|
|
74
|
+
// Actual JIRA API integration is in jira-spec-sync.ts
|
|
75
|
+
const result = {
|
|
76
|
+
success: true,
|
|
77
|
+
action: dryRun ? 'no-change' : 'created', // Assume create if not dry run
|
|
78
|
+
tasksLinked: taskMapping?.tasks.length || 0
|
|
79
|
+
};
|
|
80
|
+
if (domain && project && !dryRun) {
|
|
81
|
+
// In a real implementation, this would use JIRA API
|
|
82
|
+
// For now, just simulate success
|
|
83
|
+
result.epicKey = `SPEC-001`; // Placeholder
|
|
84
|
+
result.epicUrl = `https://${domain}/browse/SPEC-001`;
|
|
85
|
+
if (verbose) {
|
|
86
|
+
console.log(`⚠️ JIRA API integration not implemented in this file`);
|
|
87
|
+
console.log(` Use jira-spec-sync.ts for actual JIRA synchronization`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return {
|
|
94
|
+
success: false,
|
|
95
|
+
action: 'error',
|
|
96
|
+
error: error.message
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Helper functions (similar to GitHub sync)
|
|
101
|
+
async function findSpecWeaveRoot(specPath) {
|
|
102
|
+
let currentDir = path.dirname(specPath);
|
|
103
|
+
while (true) {
|
|
104
|
+
const specweaveDir = path.join(currentDir, '.specweave');
|
|
105
|
+
try {
|
|
106
|
+
await fs.access(specweaveDir);
|
|
107
|
+
return currentDir;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
const parentDir = path.dirname(currentDir);
|
|
111
|
+
if (parentDir === currentDir) {
|
|
112
|
+
throw new Error('.specweave directory not found');
|
|
113
|
+
}
|
|
114
|
+
currentDir = parentDir;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function buildTaskMapping(increments) {
|
|
119
|
+
if (increments.length === 0)
|
|
120
|
+
return undefined;
|
|
121
|
+
const firstIncrement = increments[0];
|
|
122
|
+
const tasks = firstIncrement.tasks.map((task) => ({
|
|
123
|
+
id: task.id,
|
|
124
|
+
title: task.title,
|
|
125
|
+
userStories: task.userStories
|
|
126
|
+
}));
|
|
127
|
+
return {
|
|
128
|
+
incrementId: firstIncrement.id,
|
|
129
|
+
tasks,
|
|
130
|
+
tasksUrl: `tasks.md` // JIRA doesn't support external links in same way
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
async function findArchitectureDocs(rootDir, specId) {
|
|
134
|
+
const docs = [];
|
|
135
|
+
const archDir = path.join(rootDir, '.specweave/docs/internal/architecture');
|
|
136
|
+
try {
|
|
137
|
+
const adrDir = path.join(archDir, 'adr');
|
|
138
|
+
try {
|
|
139
|
+
const adrs = await fs.readdir(adrDir);
|
|
140
|
+
const relatedAdrs = adrs.filter(file => file.includes(specId.replace('spec-', '')));
|
|
141
|
+
for (const adr of relatedAdrs) {
|
|
142
|
+
docs.push({
|
|
143
|
+
type: 'adr',
|
|
144
|
+
path: path.join(adrDir, adr),
|
|
145
|
+
title: adr.replace('.md', '').replace(/-/g, ' ')
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch { }
|
|
150
|
+
}
|
|
151
|
+
catch { }
|
|
152
|
+
return docs;
|
|
153
|
+
}
|
|
154
|
+
// NOTE: findExistingEpic not needed in this simplified version
|
|
155
|
+
// Real JIRA API integration is in jira-spec-sync.ts
|
|
156
|
+
//# sourceMappingURL=enhanced-jira-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanced-jira-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/enhanced-jira-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kcat CLI Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Type-safe TypeScript wrapper for kcat (kafkacat) CLI tool.
|
|
5
|
+
* Provides produce, consume, metadata, and query operations.
|
|
6
|
+
*/
|
|
7
|
+
import { KcatProduceOptions, KcatConsumeOptions, KcatMetadataOptions, KcatQueryOptions, ClusterMetadata, ConsumerMessage, CLIExecutionResult } from './types';
|
|
8
|
+
export declare class KcatWrapper {
|
|
9
|
+
/**
|
|
10
|
+
* Produce a message to Kafka topic
|
|
11
|
+
*/
|
|
12
|
+
produce(message: string, options: KcatProduceOptions): Promise<CLIExecutionResult>;
|
|
13
|
+
/**
|
|
14
|
+
* Consume messages from Kafka topic
|
|
15
|
+
*/
|
|
16
|
+
consume(options: KcatConsumeOptions): Promise<ConsumerMessage[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Get cluster metadata
|
|
19
|
+
*/
|
|
20
|
+
getMetadata(options: KcatMetadataOptions): Promise<ClusterMetadata>;
|
|
21
|
+
/**
|
|
22
|
+
* Query topic offsets
|
|
23
|
+
*/
|
|
24
|
+
queryOffsets(options: KcatQueryOptions): Promise<Record<number, {
|
|
25
|
+
earliest: number;
|
|
26
|
+
latest: number;
|
|
27
|
+
}>>;
|
|
28
|
+
/**
|
|
29
|
+
* Execute kcat command
|
|
30
|
+
*/
|
|
31
|
+
private execute;
|
|
32
|
+
/**
|
|
33
|
+
* Parse consume output into messages
|
|
34
|
+
*/
|
|
35
|
+
private parseConsumeOutput;
|
|
36
|
+
/**
|
|
37
|
+
* Parse metadata JSON output
|
|
38
|
+
*/
|
|
39
|
+
private parseMetadataOutput;
|
|
40
|
+
/**
|
|
41
|
+
* Calculate replication factor from partitions
|
|
42
|
+
*/
|
|
43
|
+
private calculateReplicationFactor;
|
|
44
|
+
/**
|
|
45
|
+
* Parse query offset output
|
|
46
|
+
*/
|
|
47
|
+
private parseQueryOutput;
|
|
48
|
+
/**
|
|
49
|
+
* Check if kcat is installed
|
|
50
|
+
*/
|
|
51
|
+
static isInstalled(): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Get kcat version
|
|
54
|
+
*/
|
|
55
|
+
static getVersion(): Promise<string>;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=kcat-wrapper.d.ts.map
|