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,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Documentation Exporter
|
|
3
|
+
*
|
|
4
|
+
* Exports generated documentation to multiple formats (Markdown, HTML, PDF)
|
|
5
|
+
*
|
|
6
|
+
* @module exporter
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Export Format
|
|
14
|
+
*/
|
|
15
|
+
export enum ExportFormat {
|
|
16
|
+
MARKDOWN = 'markdown',
|
|
17
|
+
HTML = 'html',
|
|
18
|
+
PDF = 'pdf',
|
|
19
|
+
JSON = 'json',
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Export Options
|
|
24
|
+
*/
|
|
25
|
+
export interface ExportOptions {
|
|
26
|
+
/** Output directory */
|
|
27
|
+
outputDir: string;
|
|
28
|
+
/** File name (without extension) */
|
|
29
|
+
fileName: string;
|
|
30
|
+
/** Export format */
|
|
31
|
+
format: ExportFormat;
|
|
32
|
+
/** Include timestamp in filename */
|
|
33
|
+
includeTimestamp?: boolean;
|
|
34
|
+
/** Custom CSS for HTML/PDF (optional) */
|
|
35
|
+
customCSS?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Documentation Exporter
|
|
40
|
+
*
|
|
41
|
+
* Handles exporting documentation to various formats
|
|
42
|
+
*/
|
|
43
|
+
export class DocumentationExporter {
|
|
44
|
+
/**
|
|
45
|
+
* Export documentation
|
|
46
|
+
*/
|
|
47
|
+
static async export(content: string, options: ExportOptions): Promise<string> {
|
|
48
|
+
// Ensure output directory exists
|
|
49
|
+
if (!fs.existsSync(options.outputDir)) {
|
|
50
|
+
fs.mkdirSync(options.outputDir, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Build filename
|
|
54
|
+
const timestamp = options.includeTimestamp
|
|
55
|
+
? `-${new Date().toISOString().replace(/:/g, '-').split('.')[0]}`
|
|
56
|
+
: '';
|
|
57
|
+
const extension = this.getExtension(options.format);
|
|
58
|
+
const fileName = `${options.fileName}${timestamp}.${extension}`;
|
|
59
|
+
const filePath = path.join(options.outputDir, fileName);
|
|
60
|
+
|
|
61
|
+
switch (options.format) {
|
|
62
|
+
case ExportFormat.MARKDOWN:
|
|
63
|
+
return this.exportMarkdown(content, filePath);
|
|
64
|
+
|
|
65
|
+
case ExportFormat.HTML:
|
|
66
|
+
return this.exportHTML(content, filePath, options.customCSS);
|
|
67
|
+
|
|
68
|
+
case ExportFormat.PDF:
|
|
69
|
+
return this.exportPDF(content, filePath, options.customCSS);
|
|
70
|
+
|
|
71
|
+
case ExportFormat.JSON:
|
|
72
|
+
return this.exportJSON(content, filePath);
|
|
73
|
+
|
|
74
|
+
default:
|
|
75
|
+
throw new Error(`Unsupported export format: ${options.format}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Get file extension for format
|
|
81
|
+
*/
|
|
82
|
+
private static getExtension(format: ExportFormat): string {
|
|
83
|
+
switch (format) {
|
|
84
|
+
case ExportFormat.MARKDOWN:
|
|
85
|
+
return 'md';
|
|
86
|
+
case ExportFormat.HTML:
|
|
87
|
+
return 'html';
|
|
88
|
+
case ExportFormat.PDF:
|
|
89
|
+
return 'pdf';
|
|
90
|
+
case ExportFormat.JSON:
|
|
91
|
+
return 'json';
|
|
92
|
+
default:
|
|
93
|
+
return 'txt';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Export as Markdown
|
|
99
|
+
*/
|
|
100
|
+
private static exportMarkdown(content: string, filePath: string): string {
|
|
101
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
102
|
+
return filePath;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Export as HTML
|
|
107
|
+
*/
|
|
108
|
+
private static exportHTML(content: string, filePath: string, customCSS?: string): string {
|
|
109
|
+
// Convert Markdown to HTML (would use marked or similar in real implementation)
|
|
110
|
+
const htmlContent = this.markdownToHTML(content);
|
|
111
|
+
|
|
112
|
+
const html = `<!DOCTYPE html>
|
|
113
|
+
<html lang="en">
|
|
114
|
+
<head>
|
|
115
|
+
<meta charset="UTF-8">
|
|
116
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
117
|
+
<title>Kafka Documentation</title>
|
|
118
|
+
<style>
|
|
119
|
+
${customCSS || this.getDefaultCSS()}
|
|
120
|
+
</style>
|
|
121
|
+
</head>
|
|
122
|
+
<body>
|
|
123
|
+
<div class="container">
|
|
124
|
+
${htmlContent}
|
|
125
|
+
</div>
|
|
126
|
+
</body>
|
|
127
|
+
</html>`;
|
|
128
|
+
|
|
129
|
+
fs.writeFileSync(filePath, html, 'utf-8');
|
|
130
|
+
return filePath;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Export as PDF
|
|
135
|
+
*/
|
|
136
|
+
private static exportPDF(content: string, filePath: string, customCSS?: string): string {
|
|
137
|
+
// In real implementation, would use puppeteer or similar
|
|
138
|
+
// For now, just export as HTML and note that PDF generation requires additional setup
|
|
139
|
+
|
|
140
|
+
const htmlPath = filePath.replace('.pdf', '.html');
|
|
141
|
+
this.exportHTML(content, htmlPath, customCSS);
|
|
142
|
+
|
|
143
|
+
console.warn(
|
|
144
|
+
`PDF export requires additional setup (puppeteer, wkhtmltopdf, etc.). ` +
|
|
145
|
+
`HTML file exported to: ${htmlPath}. ` +
|
|
146
|
+
`Use a tool like puppeteer to convert to PDF.`
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
return htmlPath;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Export as JSON
|
|
154
|
+
*/
|
|
155
|
+
private static exportJSON(content: string, filePath: string): string {
|
|
156
|
+
// Assume content is already JSON string
|
|
157
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
158
|
+
return filePath;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Convert Markdown to HTML (simplified)
|
|
163
|
+
*/
|
|
164
|
+
private static markdownToHTML(markdown: string): string {
|
|
165
|
+
// Simple Markdown to HTML conversion
|
|
166
|
+
// In production, use marked, markdown-it, or similar
|
|
167
|
+
|
|
168
|
+
let html = markdown;
|
|
169
|
+
|
|
170
|
+
// Headers
|
|
171
|
+
html = html.replace(/^### (.*$)/gim, '<h3>$1</h3>');
|
|
172
|
+
html = html.replace(/^## (.*$)/gim, '<h2>$1</h2>');
|
|
173
|
+
html = html.replace(/^# (.*$)/gim, '<h1>$1</h1>');
|
|
174
|
+
|
|
175
|
+
// Bold
|
|
176
|
+
html = html.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
|
|
177
|
+
|
|
178
|
+
// Tables (basic)
|
|
179
|
+
const tableRegex = /\|(.+)\|\n\|(.+)\|\n((?:\|.+\|\n?)+)/gm;
|
|
180
|
+
html = html.replace(tableRegex, (match) => {
|
|
181
|
+
const lines = match.trim().split('\n');
|
|
182
|
+
const headers = lines[0]
|
|
183
|
+
.split('|')
|
|
184
|
+
.filter((c) => c.trim())
|
|
185
|
+
.map((h) => `<th>${h.trim()}</th>`)
|
|
186
|
+
.join('');
|
|
187
|
+
const rows = lines
|
|
188
|
+
.slice(2)
|
|
189
|
+
.map((line) => {
|
|
190
|
+
const cells = line
|
|
191
|
+
.split('|')
|
|
192
|
+
.filter((c) => c.trim())
|
|
193
|
+
.map((c) => `<td>${c.trim()}</td>`)
|
|
194
|
+
.join('');
|
|
195
|
+
return `<tr>${cells}</tr>`;
|
|
196
|
+
})
|
|
197
|
+
.join('');
|
|
198
|
+
|
|
199
|
+
return `<table><thead><tr>${headers}</tr></thead><tbody>${rows}</tbody></table>`;
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
// Code blocks
|
|
203
|
+
html = html.replace(/```(.*?)\n([\s\S]*?)```/g, '<pre><code>$2</code></pre>');
|
|
204
|
+
|
|
205
|
+
// Paragraphs
|
|
206
|
+
html = html.replace(/\n\n/g, '</p><p>');
|
|
207
|
+
html = `<p>${html}</p>`;
|
|
208
|
+
|
|
209
|
+
return html;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Get default CSS for HTML export
|
|
214
|
+
*/
|
|
215
|
+
private static getDefaultCSS(): string {
|
|
216
|
+
return `
|
|
217
|
+
body {
|
|
218
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
|
|
219
|
+
line-height: 1.6;
|
|
220
|
+
color: #333;
|
|
221
|
+
background: #f5f5f5;
|
|
222
|
+
}
|
|
223
|
+
.container {
|
|
224
|
+
max-width: 1000px;
|
|
225
|
+
margin: 40px auto;
|
|
226
|
+
padding: 40px;
|
|
227
|
+
background: white;
|
|
228
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
229
|
+
}
|
|
230
|
+
h1 {
|
|
231
|
+
border-bottom: 3px solid #2196F3;
|
|
232
|
+
padding-bottom: 10px;
|
|
233
|
+
color: #1976D2;
|
|
234
|
+
}
|
|
235
|
+
h2 {
|
|
236
|
+
border-bottom: 2px solid #64B5F6;
|
|
237
|
+
padding-bottom: 8px;
|
|
238
|
+
color: #1976D2;
|
|
239
|
+
margin-top: 30px;
|
|
240
|
+
}
|
|
241
|
+
h3 {
|
|
242
|
+
color: #424242;
|
|
243
|
+
margin-top: 20px;
|
|
244
|
+
}
|
|
245
|
+
table {
|
|
246
|
+
width: 100%;
|
|
247
|
+
border-collapse: collapse;
|
|
248
|
+
margin: 20px 0;
|
|
249
|
+
}
|
|
250
|
+
th, td {
|
|
251
|
+
border: 1px solid #ddd;
|
|
252
|
+
padding: 12px;
|
|
253
|
+
text-align: left;
|
|
254
|
+
}
|
|
255
|
+
th {
|
|
256
|
+
background-color: #2196F3;
|
|
257
|
+
color: white;
|
|
258
|
+
font-weight: bold;
|
|
259
|
+
}
|
|
260
|
+
tr:nth-child(even) {
|
|
261
|
+
background-color: #f9f9f9;
|
|
262
|
+
}
|
|
263
|
+
pre {
|
|
264
|
+
background: #2e3440;
|
|
265
|
+
color: #d8dee9;
|
|
266
|
+
padding: 16px;
|
|
267
|
+
border-radius: 4px;
|
|
268
|
+
overflow-x: auto;
|
|
269
|
+
}
|
|
270
|
+
code {
|
|
271
|
+
font-family: 'Monaco', 'Courier New', monospace;
|
|
272
|
+
font-size: 14px;
|
|
273
|
+
}
|
|
274
|
+
`;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Batch export to multiple formats
|
|
279
|
+
*/
|
|
280
|
+
static async exportMultiple(
|
|
281
|
+
content: string,
|
|
282
|
+
baseOptions: Omit<ExportOptions, 'format'>
|
|
283
|
+
): Promise<string[]> {
|
|
284
|
+
const formats = [ExportFormat.MARKDOWN, ExportFormat.HTML, ExportFormat.JSON];
|
|
285
|
+
const results: string[] = [];
|
|
286
|
+
|
|
287
|
+
for (const format of formats) {
|
|
288
|
+
const filePath = await this.export(content, {
|
|
289
|
+
...baseOptions,
|
|
290
|
+
format,
|
|
291
|
+
});
|
|
292
|
+
results.push(filePath);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return results;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Example Usage: Export Topology Documentation
|
|
301
|
+
*
|
|
302
|
+
* ```typescript
|
|
303
|
+
* import { TopologyGenerator } from './topology-generator';
|
|
304
|
+
* import { DocumentationExporter, ExportFormat } from './exporter';
|
|
305
|
+
*
|
|
306
|
+
* // Generate topology markdown
|
|
307
|
+
* const topology = await TopologyGenerator.generate(admin);
|
|
308
|
+
* const markdown = TopologyGenerator.formatAsMarkdown(topology);
|
|
309
|
+
*
|
|
310
|
+
* // Export as HTML
|
|
311
|
+
* const htmlPath = await DocumentationExporter.export(markdown, {
|
|
312
|
+
* outputDir: './docs/output',
|
|
313
|
+
* fileName: 'kafka-topology',
|
|
314
|
+
* format: ExportFormat.HTML,
|
|
315
|
+
* includeTimestamp: true,
|
|
316
|
+
* });
|
|
317
|
+
*
|
|
318
|
+
* console.log(`Documentation exported to: ${htmlPath}`);
|
|
319
|
+
* ```
|
|
320
|
+
*/
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Example Usage: Batch Export
|
|
324
|
+
*
|
|
325
|
+
* ```typescript
|
|
326
|
+
* // Export to all formats
|
|
327
|
+
* const paths = await DocumentationExporter.exportMultiple(markdown, {
|
|
328
|
+
* outputDir: './docs/output',
|
|
329
|
+
* fileName: 'kafka-topology',
|
|
330
|
+
* includeTimestamp: false,
|
|
331
|
+
* });
|
|
332
|
+
*
|
|
333
|
+
* console.log('Exported files:', paths);
|
|
334
|
+
* // Output: ['./docs/output/kafka-topology.md', './docs/output/kafka-topology.html', './docs/output/kafka-topology.json']
|
|
335
|
+
* ```
|
|
336
|
+
*/
|
|
337
|
+
|
|
338
|
+
export default DocumentationExporter;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
class SchemaCatalogGenerator {
|
|
2
|
+
/**
|
|
3
|
+
* Generate schema catalog from Schema Registry
|
|
4
|
+
*/
|
|
5
|
+
static async generate(schemaRegistryUrl) {
|
|
6
|
+
const subjects = [];
|
|
7
|
+
return {
|
|
8
|
+
totalSubjects: subjects.length,
|
|
9
|
+
subjects,
|
|
10
|
+
generatedAt: /* @__PURE__ */ new Date()
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Format catalog as Markdown
|
|
15
|
+
*/
|
|
16
|
+
static formatAsMarkdown(catalog) {
|
|
17
|
+
const lines = [];
|
|
18
|
+
lines.push("# Schema Registry Catalog");
|
|
19
|
+
lines.push("");
|
|
20
|
+
lines.push(`**Total Subjects**: ${catalog.totalSubjects}`);
|
|
21
|
+
lines.push(`**Generated**: ${catalog.generatedAt.toISOString()}`);
|
|
22
|
+
lines.push("");
|
|
23
|
+
for (const subject of catalog.subjects) {
|
|
24
|
+
lines.push(`## ${subject.subject}`);
|
|
25
|
+
lines.push("");
|
|
26
|
+
lines.push(`**Latest Version**: ${subject.latestVersion}`);
|
|
27
|
+
lines.push(`**Compatibility Mode**: ${subject.compatibility}`);
|
|
28
|
+
lines.push("");
|
|
29
|
+
lines.push("### Versions");
|
|
30
|
+
lines.push("");
|
|
31
|
+
lines.push("| Version | Schema ID | Type |");
|
|
32
|
+
lines.push("|---------|-----------|------|");
|
|
33
|
+
for (const version of subject.versions) {
|
|
34
|
+
lines.push(`| ${version.version} | ${version.id} | ${version.schemaType} |`);
|
|
35
|
+
}
|
|
36
|
+
lines.push("");
|
|
37
|
+
const latestVersion = subject.versions[subject.versions.length - 1];
|
|
38
|
+
if (latestVersion) {
|
|
39
|
+
lines.push("### Latest Schema");
|
|
40
|
+
lines.push("");
|
|
41
|
+
lines.push("```json");
|
|
42
|
+
lines.push(latestVersion.schema);
|
|
43
|
+
lines.push("```");
|
|
44
|
+
lines.push("");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return lines.join("\n");
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Format catalog as JSON
|
|
51
|
+
*/
|
|
52
|
+
static formatAsJSON(catalog) {
|
|
53
|
+
return JSON.stringify(catalog, null, 2);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
var schema_catalog_generator_default = SchemaCatalogGenerator;
|
|
57
|
+
export {
|
|
58
|
+
SchemaCatalogGenerator,
|
|
59
|
+
schema_catalog_generator_default as default
|
|
60
|
+
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Catalog Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates Schema Registry catalog documentation
|
|
5
|
+
*
|
|
6
|
+
* @module schema-catalog-generator
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Schema Version
|
|
11
|
+
*/
|
|
12
|
+
export interface SchemaVersion {
|
|
13
|
+
/** Schema ID */
|
|
14
|
+
id: number;
|
|
15
|
+
/** Version number */
|
|
16
|
+
version: number;
|
|
17
|
+
/** Schema definition (Avro/Protobuf/JSON) */
|
|
18
|
+
schema: string;
|
|
19
|
+
/** Schema type */
|
|
20
|
+
schemaType: 'AVRO' | 'PROTOBUF' | 'JSON';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Subject Metadata
|
|
25
|
+
*/
|
|
26
|
+
export interface SubjectMetadata {
|
|
27
|
+
/** Subject name */
|
|
28
|
+
subject: string;
|
|
29
|
+
/** Latest version */
|
|
30
|
+
latestVersion: number;
|
|
31
|
+
/** Compatibility mode */
|
|
32
|
+
compatibility: 'BACKWARD' | 'FORWARD' | 'FULL' | 'NONE';
|
|
33
|
+
/** All versions */
|
|
34
|
+
versions: SchemaVersion[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Schema Catalog
|
|
39
|
+
*/
|
|
40
|
+
export interface SchemaCatalog {
|
|
41
|
+
/** Total subjects */
|
|
42
|
+
totalSubjects: number;
|
|
43
|
+
/** Subjects */
|
|
44
|
+
subjects: SubjectMetadata[];
|
|
45
|
+
/** Generated timestamp */
|
|
46
|
+
generatedAt: Date;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Schema Catalog Generator
|
|
51
|
+
*
|
|
52
|
+
* Generates documentation for Schema Registry
|
|
53
|
+
*/
|
|
54
|
+
export class SchemaCatalogGenerator {
|
|
55
|
+
/**
|
|
56
|
+
* Generate schema catalog from Schema Registry
|
|
57
|
+
*/
|
|
58
|
+
static async generate(schemaRegistryUrl: string): Promise<SchemaCatalog> {
|
|
59
|
+
// In real implementation, would use @kafkajs/confluent-schema-registry
|
|
60
|
+
// For now, return mock data structure
|
|
61
|
+
|
|
62
|
+
const subjects: SubjectMetadata[] = [];
|
|
63
|
+
|
|
64
|
+
// Would fetch from Schema Registry REST API:
|
|
65
|
+
// GET /subjects
|
|
66
|
+
// GET /subjects/{subject}/versions
|
|
67
|
+
// GET /subjects/{subject}/versions/{version}
|
|
68
|
+
// GET /config/{subject}
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
totalSubjects: subjects.length,
|
|
72
|
+
subjects,
|
|
73
|
+
generatedAt: new Date(),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Format catalog as Markdown
|
|
79
|
+
*/
|
|
80
|
+
static formatAsMarkdown(catalog: SchemaCatalog): string {
|
|
81
|
+
const lines: string[] = [];
|
|
82
|
+
|
|
83
|
+
lines.push('# Schema Registry Catalog');
|
|
84
|
+
lines.push('');
|
|
85
|
+
lines.push(`**Total Subjects**: ${catalog.totalSubjects}`);
|
|
86
|
+
lines.push(`**Generated**: ${catalog.generatedAt.toISOString()}`);
|
|
87
|
+
lines.push('');
|
|
88
|
+
|
|
89
|
+
for (const subject of catalog.subjects) {
|
|
90
|
+
lines.push(`## ${subject.subject}`);
|
|
91
|
+
lines.push('');
|
|
92
|
+
lines.push(`**Latest Version**: ${subject.latestVersion}`);
|
|
93
|
+
lines.push(`**Compatibility Mode**: ${subject.compatibility}`);
|
|
94
|
+
lines.push('');
|
|
95
|
+
|
|
96
|
+
lines.push('### Versions');
|
|
97
|
+
lines.push('');
|
|
98
|
+
lines.push('| Version | Schema ID | Type |');
|
|
99
|
+
lines.push('|---------|-----------|------|');
|
|
100
|
+
|
|
101
|
+
for (const version of subject.versions) {
|
|
102
|
+
lines.push(`| ${version.version} | ${version.id} | ${version.schemaType} |`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
lines.push('');
|
|
106
|
+
|
|
107
|
+
// Latest schema definition
|
|
108
|
+
const latestVersion = subject.versions[subject.versions.length - 1];
|
|
109
|
+
if (latestVersion) {
|
|
110
|
+
lines.push('### Latest Schema');
|
|
111
|
+
lines.push('');
|
|
112
|
+
lines.push('```json');
|
|
113
|
+
lines.push(latestVersion.schema);
|
|
114
|
+
lines.push('```');
|
|
115
|
+
lines.push('');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return lines.join('\n');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Format catalog as JSON
|
|
124
|
+
*/
|
|
125
|
+
static formatAsJSON(catalog: SchemaCatalog): string {
|
|
126
|
+
return JSON.stringify(catalog, null, 2);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export default SchemaCatalogGenerator;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
class TopologyGenerator {
|
|
2
|
+
/**
|
|
3
|
+
* Generate cluster topology documentation
|
|
4
|
+
*/
|
|
5
|
+
static async generate(admin) {
|
|
6
|
+
const cluster = await admin.describeCluster();
|
|
7
|
+
const allTopics = await admin.listTopics();
|
|
8
|
+
const topicMetadata = await admin.fetchTopicMetadata({ topics: allTopics });
|
|
9
|
+
const topicConfigs = await admin.fetchTopicOffsets(allTopics.slice(0, 10));
|
|
10
|
+
const topics = [];
|
|
11
|
+
let totalPartitions = 0;
|
|
12
|
+
const underReplicatedPartitions = [];
|
|
13
|
+
for (const topicData of topicMetadata.topics) {
|
|
14
|
+
const partitionCount = topicData.partitions.length;
|
|
15
|
+
totalPartitions += partitionCount;
|
|
16
|
+
const replicationFactor = topicData.partitions.length > 0 ? topicData.partitions[0].replicas.length : 0;
|
|
17
|
+
topics.push({
|
|
18
|
+
name: topicData.name,
|
|
19
|
+
partitions: partitionCount,
|
|
20
|
+
replicationFactor,
|
|
21
|
+
configs: {},
|
|
22
|
+
// Would fetch from describeConfigs in real implementation
|
|
23
|
+
isInternal: topicData.name.startsWith("__") || topicData.name.startsWith("_")
|
|
24
|
+
});
|
|
25
|
+
for (const partition of topicData.partitions) {
|
|
26
|
+
if (partition.isr.length < partition.replicas.length) {
|
|
27
|
+
underReplicatedPartitions.push({
|
|
28
|
+
topic: topicData.name,
|
|
29
|
+
partition: partition.partitionId,
|
|
30
|
+
leader: partition.leader,
|
|
31
|
+
isr: partition.isr.map(Number),
|
|
32
|
+
replicas: partition.replicas.map(Number)
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const topology = {
|
|
38
|
+
clusterId: cluster.clusterId,
|
|
39
|
+
controller: Number(cluster.controller),
|
|
40
|
+
brokers: cluster.brokers.map((broker) => ({
|
|
41
|
+
nodeId: broker.nodeId,
|
|
42
|
+
host: broker.host,
|
|
43
|
+
port: broker.port,
|
|
44
|
+
rack: broker.rack
|
|
45
|
+
})),
|
|
46
|
+
topics,
|
|
47
|
+
totalPartitions,
|
|
48
|
+
underReplicatedPartitions,
|
|
49
|
+
generatedAt: /* @__PURE__ */ new Date()
|
|
50
|
+
};
|
|
51
|
+
return topology;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Format topology as Markdown
|
|
55
|
+
*/
|
|
56
|
+
static formatAsMarkdown(topology) {
|
|
57
|
+
const lines = [];
|
|
58
|
+
lines.push("# Kafka Cluster Topology");
|
|
59
|
+
lines.push("");
|
|
60
|
+
lines.push(`**Cluster ID**: ${topology.clusterId}`);
|
|
61
|
+
lines.push(`**Controller**: Broker ${topology.controller}`);
|
|
62
|
+
lines.push(`**Generated**: ${topology.generatedAt.toISOString()}`);
|
|
63
|
+
lines.push("");
|
|
64
|
+
lines.push("## Brokers");
|
|
65
|
+
lines.push("");
|
|
66
|
+
lines.push("| Broker ID | Host | Port | Rack |");
|
|
67
|
+
lines.push("|-----------|------|------|------|");
|
|
68
|
+
for (const broker of topology.brokers) {
|
|
69
|
+
lines.push(
|
|
70
|
+
`| ${broker.nodeId} | ${broker.host} | ${broker.port} | ${broker.rack || "N/A"} |`
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
lines.push("");
|
|
74
|
+
lines.push("## Topics");
|
|
75
|
+
lines.push("");
|
|
76
|
+
lines.push(`**Total Topics**: ${topology.topics.length}`);
|
|
77
|
+
lines.push(`**Total Partitions**: ${topology.totalPartitions}`);
|
|
78
|
+
lines.push("");
|
|
79
|
+
lines.push("### Topic List");
|
|
80
|
+
lines.push("");
|
|
81
|
+
lines.push("| Topic Name | Partitions | Replication Factor | Internal |");
|
|
82
|
+
lines.push("|------------|------------|-------------------|----------|");
|
|
83
|
+
const sortedTopics = [...topology.topics].sort((a, b) => a.name.localeCompare(b.name));
|
|
84
|
+
for (const topic of sortedTopics) {
|
|
85
|
+
lines.push(
|
|
86
|
+
`| ${topic.name} | ${topic.partitions} | ${topic.replicationFactor} | ${topic.isInternal ? "Yes" : "No"} |`
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
lines.push("");
|
|
90
|
+
if (topology.underReplicatedPartitions.length > 0) {
|
|
91
|
+
lines.push("## \u26A0\uFE0F Under-Replicated Partitions");
|
|
92
|
+
lines.push("");
|
|
93
|
+
lines.push("| Topic | Partition | Leader | ISR | Replicas |");
|
|
94
|
+
lines.push("|-------|-----------|--------|-----|----------|");
|
|
95
|
+
for (const partition of topology.underReplicatedPartitions) {
|
|
96
|
+
lines.push(
|
|
97
|
+
`| ${partition.topic} | ${partition.partition} | ${partition.leader} | ${partition.isr.join(", ")} | ${partition.replicas.join(", ")} |`
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
lines.push("");
|
|
101
|
+
}
|
|
102
|
+
return lines.join("\n");
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Format topology as JSON
|
|
106
|
+
*/
|
|
107
|
+
static formatAsJSON(topology) {
|
|
108
|
+
return JSON.stringify(topology, null, 2);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generate Mermaid diagram for cluster topology
|
|
112
|
+
*/
|
|
113
|
+
static generateMermaidDiagram(topology) {
|
|
114
|
+
const lines = [];
|
|
115
|
+
lines.push("```mermaid");
|
|
116
|
+
lines.push("graph TB");
|
|
117
|
+
lines.push(" subgraph Kafka Cluster");
|
|
118
|
+
for (const broker of topology.brokers) {
|
|
119
|
+
const isController = broker.nodeId === topology.controller;
|
|
120
|
+
const shape = isController ? "[Broker " : "(Broker ";
|
|
121
|
+
const endShape = isController ? "]" : ")";
|
|
122
|
+
lines.push(
|
|
123
|
+
` B${broker.nodeId}${shape}${broker.nodeId}<br/>${broker.host}:${broker.port}${endShape}`
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
const sampleTopics = topology.topics.filter((t) => !t.isInternal).slice(0, 10);
|
|
127
|
+
for (const topic of sampleTopics) {
|
|
128
|
+
const topicId = topic.name.replace(/[^a-zA-Z0-9]/g, "_");
|
|
129
|
+
lines.push(` T_${topicId}[${topic.name}<br/>${topic.partitions} partitions]`);
|
|
130
|
+
for (const broker of topology.brokers.slice(0, 3)) {
|
|
131
|
+
lines.push(` T_${topicId} --> B${broker.nodeId}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
lines.push(" end");
|
|
135
|
+
lines.push("```");
|
|
136
|
+
return lines.join("\n");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
var topology_generator_default = TopologyGenerator;
|
|
140
|
+
export {
|
|
141
|
+
TopologyGenerator,
|
|
142
|
+
topology_generator_default as default
|
|
143
|
+
};
|