specweave 0.17.1 → 0.17.2
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/bin/specweave.js +16 -16
- package/dist/plugins/specweave-github/lib/github-spec-sync.d.ts +109 -6
- package/dist/plugins/specweave-github/lib/github-spec-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-sync.js +435 -49
- package/dist/plugins/specweave-github/lib/github-spec-sync.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts +10 -2
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +28 -14
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github.js +10 -1
- package/dist/src/cli/helpers/issue-tracker/github.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +20 -0
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/core/project-manager.d.ts +25 -21
- package/dist/src/core/project-manager.d.ts.map +1 -1
- package/dist/src/core/project-manager.js +41 -51
- package/dist/src/core/project-manager.js.map +1 -1
- package/dist/src/core/repo-structure/folder-detector.d.ts +19 -0
- package/dist/src/core/repo-structure/folder-detector.d.ts.map +1 -0
- package/dist/src/core/repo-structure/folder-detector.js +95 -0
- package/dist/src/core/repo-structure/folder-detector.js.map +1 -0
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts +4 -1
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +41 -27
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/types/spec-metadata.d.ts +34 -1
- package/dist/src/core/types/spec-metadata.d.ts.map +1 -1
- package/dist/src/core/types/sync-profile.d.ts +30 -0
- package/dist/src/core/types/sync-profile.d.ts.map +1 -1
- package/dist/src/core/types/sync-profile.js.map +1 -1
- package/dist/src/utils/project-validator.d.ts +27 -0
- package/dist/src/utils/project-validator.d.ts.map +1 -0
- package/dist/src/utils/project-validator.js +68 -0
- package/dist/src/utils/project-validator.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/lib/hooks/git-diff-analyzer.js +129 -213
- package/plugins/specweave/lib/hooks/invoke-translator-skill.js +146 -192
- package/plugins/specweave/lib/hooks/prepare-reflection-context.js +103 -116
- package/plugins/specweave/lib/hooks/reflection-config-loader.js +85 -125
- package/plugins/specweave/lib/hooks/reflection-parser.js +267 -385
- package/plugins/specweave/lib/hooks/reflection-prompt-builder.js +169 -226
- package/plugins/specweave/lib/hooks/reflection-storage.js +223 -297
- package/plugins/specweave/lib/hooks/run-self-reflection.js +120 -191
- package/plugins/specweave/lib/hooks/translate-file.js +239 -300
- package/plugins/specweave/lib/hooks/translate-living-docs.js +88 -144
- package/plugins/specweave/lib/hooks/types/reflection-types.js +57 -72
- package/plugins/specweave/lib/hooks/update-tasks-md.js +117 -179
- package/plugins/specweave-ado/lib/ado-board-resolver.js +135 -205
- package/plugins/specweave-ado/lib/ado-client-v2.js +405 -449
- package/plugins/specweave-ado/lib/ado-hierarchical-sync.js +223 -335
- package/plugins/specweave-ado/lib/ado-spec-commit-sync.js +173 -194
- package/plugins/specweave-ado/lib/ado-spec-sync.js +380 -414
- package/plugins/specweave-ado/lib/conflict-resolver.ts +1 -1
- package/plugins/specweave-ado/lib/project-selector.js +168 -196
- package/plugins/specweave-github/MULTI-PROJECT-SYNC-ARCHITECTURE.md +658 -0
- package/plugins/specweave-github/SYNC-ARCHITECTURE-FIX-SUMMARY.md +302 -0
- package/plugins/specweave-github/hooks/post-task-completion.sh +55 -157
- package/plugins/specweave-github/lib/cli-sync-increment-changes.js +9 -20
- package/plugins/specweave-github/lib/github-board-resolver.js +69 -115
- package/plugins/specweave-github/lib/github-client-v2.js +400 -389
- package/plugins/specweave-github/lib/github-client.js +246 -280
- package/plugins/specweave-github/lib/github-hierarchical-sync.js +168 -251
- package/plugins/specweave-github/lib/github-spec-commit-sync.js +171 -194
- package/plugins/specweave-github/lib/github-spec-sync.js +742 -418
- package/plugins/specweave-github/lib/github-spec-sync.ts +597 -61
- package/plugins/specweave-github/lib/index.js +11 -10
- package/plugins/specweave-github/lib/repo-selector.js +174 -201
- package/plugins/specweave-github/lib/subtask-sync.js +132 -125
- package/plugins/specweave-github/lib/task-parser.js +191 -207
- package/plugins/specweave-github/lib/task-sync.js +344 -296
- package/plugins/specweave-github/lib/types.js +0 -5
- package/plugins/specweave-github/skills/github-sync/SKILL.md +234 -242
- package/plugins/specweave-jira/lib/jira-board-resolver.js +50 -79
- package/plugins/specweave-jira/lib/jira-hierarchical-sync.js +119 -191
- package/plugins/specweave-jira/lib/jira-spec-commit-sync.js +241 -263
- package/plugins/specweave-jira/lib/jira-spec-sync.js +366 -405
- package/plugins/specweave-jira/lib/project-selector.js +172 -201
- package/plugins/specweave-jira/lib/reorganization-detector.js +202 -237
- package/plugins/specweave-jira/lib/setup-wizard.js +162 -204
- package/dist/adapters/adapter-base.d.ts +0 -71
- package/dist/adapters/adapter-base.d.ts.map +0 -1
- package/dist/adapters/adapter-base.js +0 -139
- package/dist/adapters/adapter-base.js.map +0 -1
- package/dist/adapters/adapter-interface.d.ts +0 -149
- package/dist/adapters/adapter-interface.d.ts.map +0 -1
- package/dist/adapters/adapter-interface.js +0 -8
- package/dist/adapters/adapter-interface.js.map +0 -1
- package/dist/adapters/adapter-loader.d.ts +0 -91
- package/dist/adapters/adapter-loader.d.ts.map +0 -1
- package/dist/adapters/adapter-loader.js +0 -238
- package/dist/adapters/adapter-loader.js.map +0 -1
- package/dist/adapters/agents-md-generator.d.ts +0 -48
- package/dist/adapters/agents-md-generator.d.ts.map +0 -1
- package/dist/adapters/agents-md-generator.js +0 -193
- package/dist/adapters/agents-md-generator.js.map +0 -1
- package/dist/adapters/claude/adapter.d.ts +0 -128
- package/dist/adapters/claude/adapter.d.ts.map +0 -1
- package/dist/adapters/claude/adapter.js +0 -415
- package/dist/adapters/claude/adapter.js.map +0 -1
- package/dist/adapters/claude-md-generator.d.ts +0 -78
- package/dist/adapters/claude-md-generator.d.ts.map +0 -1
- package/dist/adapters/claude-md-generator.js +0 -307
- package/dist/adapters/claude-md-generator.js.map +0 -1
- package/dist/adapters/codex/adapter.d.ts +0 -50
- package/dist/adapters/codex/adapter.d.ts.map +0 -1
- package/dist/adapters/codex/adapter.js +0 -316
- package/dist/adapters/codex/adapter.js.map +0 -1
- package/dist/adapters/cursor/adapter.d.ts +0 -98
- package/dist/adapters/cursor/adapter.d.ts.map +0 -1
- package/dist/adapters/cursor/adapter.js +0 -406
- package/dist/adapters/cursor/adapter.js.map +0 -1
- package/dist/adapters/doc-generator.d.ts +0 -69
- package/dist/adapters/doc-generator.d.ts.map +0 -1
- package/dist/adapters/doc-generator.js +0 -247
- package/dist/adapters/doc-generator.js.map +0 -1
- package/dist/adapters/gemini/adapter.d.ts +0 -50
- package/dist/adapters/gemini/adapter.d.ts.map +0 -1
- package/dist/adapters/gemini/adapter.js +0 -281
- package/dist/adapters/gemini/adapter.js.map +0 -1
- package/dist/adapters/generic/adapter.d.ts +0 -86
- package/dist/adapters/generic/adapter.d.ts.map +0 -1
- package/dist/adapters/generic/adapter.js +0 -338
- package/dist/adapters/generic/adapter.js.map +0 -1
- package/dist/cli/commands/abandon.d.ts +0 -13
- package/dist/cli/commands/abandon.d.ts.map +0 -1
- package/dist/cli/commands/abandon.js +0 -15
- package/dist/cli/commands/abandon.js.map +0 -1
- package/dist/cli/commands/check-discipline.d.ts +0 -16
- package/dist/cli/commands/check-discipline.d.ts.map +0 -1
- package/dist/cli/commands/check-discipline.js +0 -79
- package/dist/cli/commands/check-discipline.js.map +0 -1
- package/dist/cli/commands/import-docs.d.ts +0 -21
- package/dist/cli/commands/import-docs.d.ts.map +0 -1
- package/dist/cli/commands/import-docs.js +0 -146
- package/dist/cli/commands/import-docs.js.map +0 -1
- package/dist/cli/commands/init-multiproject.d.ts +0 -11
- package/dist/cli/commands/init-multiproject.d.ts.map +0 -1
- package/dist/cli/commands/init-multiproject.js +0 -202
- package/dist/cli/commands/init-multiproject.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -10
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -1328
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/install.d.ts +0 -9
- package/dist/cli/commands/install.d.ts.map +0 -1
- package/dist/cli/commands/install.js +0 -127
- package/dist/cli/commands/install.js.map +0 -1
- package/dist/cli/commands/list.d.ts +0 -8
- package/dist/cli/commands/list.d.ts.map +0 -1
- package/dist/cli/commands/list.js +0 -119
- package/dist/cli/commands/list.js.map +0 -1
- package/dist/cli/commands/migrate-to-multiproject.d.ts +0 -37
- package/dist/cli/commands/migrate-to-multiproject.d.ts.map +0 -1
- package/dist/cli/commands/migrate-to-multiproject.js +0 -189
- package/dist/cli/commands/migrate-to-multiproject.js.map +0 -1
- package/dist/cli/commands/migrate-to-profiles.d.ts +0 -25
- package/dist/cli/commands/migrate-to-profiles.d.ts.map +0 -1
- package/dist/cli/commands/migrate-to-profiles.js +0 -348
- package/dist/cli/commands/migrate-to-profiles.js.map +0 -1
- package/dist/cli/commands/pause.d.ts +0 -13
- package/dist/cli/commands/pause.d.ts.map +0 -1
- package/dist/cli/commands/pause.js +0 -15
- package/dist/cli/commands/pause.js.map +0 -1
- package/dist/cli/commands/qa.d.ts +0 -54
- package/dist/cli/commands/qa.d.ts.map +0 -1
- package/dist/cli/commands/qa.js +0 -98
- package/dist/cli/commands/qa.js.map +0 -1
- package/dist/cli/commands/resume.d.ts +0 -12
- package/dist/cli/commands/resume.d.ts.map +0 -1
- package/dist/cli/commands/resume.js +0 -14
- package/dist/cli/commands/resume.js.map +0 -1
- package/dist/cli/commands/revert-wip-limit.js +0 -60
- package/dist/cli/commands/status-line.d.ts +0 -14
- package/dist/cli/commands/status-line.d.ts.map +0 -1
- package/dist/cli/commands/status-line.js +0 -75
- package/dist/cli/commands/status-line.js.map +0 -1
- package/dist/cli/commands/status.d.ts +0 -12
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/status.js +0 -23
- package/dist/cli/commands/status.js.map +0 -1
- package/dist/cli/commands/switch-project.d.ts +0 -13
- package/dist/cli/commands/switch-project.d.ts.map +0 -1
- package/dist/cli/commands/switch-project.js +0 -91
- package/dist/cli/commands/switch-project.js.map +0 -1
- package/dist/cli/commands/sync-spec-commits.d.ts +0 -9
- package/dist/cli/commands/sync-spec-commits.d.ts.map +0 -1
- package/dist/cli/commands/sync-spec-commits.js +0 -186
- package/dist/cli/commands/sync-spec-commits.js.map +0 -1
- package/dist/cli/commands/validate-jira.d.ts +0 -35
- package/dist/cli/commands/validate-jira.d.ts.map +0 -1
- package/dist/cli/commands/validate-jira.js +0 -112
- package/dist/cli/commands/validate-jira.js.map +0 -1
- package/dist/cli/commands/validate-plugins.d.ts +0 -41
- package/dist/cli/commands/validate-plugins.d.ts.map +0 -1
- package/dist/cli/commands/validate-plugins.js +0 -171
- package/dist/cli/commands/validate-plugins.js.map +0 -1
- package/dist/cli/helpers/github/increment-profile-selector.d.ts +0 -47
- package/dist/cli/helpers/github/increment-profile-selector.d.ts.map +0 -1
- package/dist/cli/helpers/github/increment-profile-selector.js +0 -186
- package/dist/cli/helpers/github/increment-profile-selector.js.map +0 -1
- package/dist/cli/helpers/github/profile-manager.d.ts +0 -119
- package/dist/cli/helpers/github/profile-manager.d.ts.map +0 -1
- package/dist/cli/helpers/github/profile-manager.js +0 -311
- package/dist/cli/helpers/github/profile-manager.js.map +0 -1
- package/dist/cli/helpers/issue-tracker/ado.d.ts +0 -57
- package/dist/cli/helpers/issue-tracker/ado.d.ts.map +0 -1
- package/dist/cli/helpers/issue-tracker/ado.js +0 -243
- package/dist/cli/helpers/issue-tracker/ado.js.map +0 -1
- package/dist/cli/helpers/issue-tracker/github-multi-repo.d.ts +0 -86
- package/dist/cli/helpers/issue-tracker/github-multi-repo.d.ts.map +0 -1
- package/dist/cli/helpers/issue-tracker/github-multi-repo.js +0 -417
- package/dist/cli/helpers/issue-tracker/github-multi-repo.js.map +0 -1
- package/dist/cli/helpers/issue-tracker/github.d.ts +0 -80
- package/dist/cli/helpers/issue-tracker/github.d.ts.map +0 -1
- package/dist/cli/helpers/issue-tracker/github.js +0 -324
- package/dist/cli/helpers/issue-tracker/github.js.map +0 -1
- package/dist/cli/helpers/issue-tracker/index.d.ts +0 -22
- package/dist/cli/helpers/issue-tracker/index.d.ts.map +0 -1
- package/dist/cli/helpers/issue-tracker/index.js +0 -562
- package/dist/cli/helpers/issue-tracker/index.js.map +0 -1
- package/dist/cli/helpers/issue-tracker/jira.d.ts +0 -61
- package/dist/cli/helpers/issue-tracker/jira.d.ts.map +0 -1
- package/dist/cli/helpers/issue-tracker/jira.js +0 -404
- package/dist/cli/helpers/issue-tracker/jira.js.map +0 -1
- package/dist/cli/helpers/issue-tracker/types.d.ts +0 -108
- package/dist/cli/helpers/issue-tracker/types.d.ts.map +0 -1
- package/dist/cli/helpers/issue-tracker/types.js +0 -16
- package/dist/cli/helpers/issue-tracker/types.js.map +0 -1
- package/dist/cli/helpers/issue-tracker/utils.d.ts +0 -120
- package/dist/cli/helpers/issue-tracker/utils.d.ts.map +0 -1
- package/dist/cli/helpers/issue-tracker/utils.js +0 -293
- package/dist/cli/helpers/issue-tracker/utils.js.map +0 -1
- package/dist/core/agent-model-manager.d.ts +0 -52
- package/dist/core/agent-model-manager.d.ts.map +0 -1
- package/dist/core/agent-model-manager.js +0 -120
- package/dist/core/agent-model-manager.js.map +0 -1
- package/dist/core/brownfield/analyzer.d.ts +0 -86
- package/dist/core/brownfield/analyzer.d.ts.map +0 -1
- package/dist/core/brownfield/analyzer.js +0 -365
- package/dist/core/brownfield/analyzer.js.map +0 -1
- package/dist/core/brownfield/importer.d.ts +0 -76
- package/dist/core/brownfield/importer.d.ts.map +0 -1
- package/dist/core/brownfield/importer.js +0 -287
- package/dist/core/brownfield/importer.js.map +0 -1
- package/dist/core/comment-builder.d.ts +0 -57
- package/dist/core/comment-builder.d.ts.map +0 -1
- package/dist/core/comment-builder.js +0 -239
- package/dist/core/comment-builder.js.map +0 -1
- package/dist/core/config-manager.d.ts +0 -47
- package/dist/core/config-manager.d.ts.map +0 -1
- package/dist/core/config-manager.js +0 -136
- package/dist/core/config-manager.js.map +0 -1
- package/dist/core/cost-tracker.d.ts +0 -108
- package/dist/core/cost-tracker.d.ts.map +0 -1
- package/dist/core/cost-tracker.js +0 -281
- package/dist/core/cost-tracker.js.map +0 -1
- package/dist/core/credentials-manager.d.ts +0 -107
- package/dist/core/credentials-manager.d.ts.map +0 -1
- package/dist/core/credentials-manager.js +0 -457
- package/dist/core/credentials-manager.js.map +0 -1
- package/dist/core/i18n/language-detector.d.ts +0 -29
- package/dist/core/i18n/language-detector.d.ts.map +0 -1
- package/dist/core/i18n/language-detector.js +0 -143
- package/dist/core/i18n/language-detector.js.map +0 -1
- package/dist/core/i18n/language-manager.d.ts +0 -101
- package/dist/core/i18n/language-manager.d.ts.map +0 -1
- package/dist/core/i18n/language-manager.js +0 -232
- package/dist/core/i18n/language-manager.js.map +0 -1
- package/dist/core/i18n/language-registry.d.ts +0 -44
- package/dist/core/i18n/language-registry.d.ts.map +0 -1
- package/dist/core/i18n/language-registry.js +0 -234
- package/dist/core/i18n/language-registry.js.map +0 -1
- package/dist/core/i18n/locale-manager.d.ts +0 -62
- package/dist/core/i18n/locale-manager.d.ts.map +0 -1
- package/dist/core/i18n/locale-manager.js +0 -137
- package/dist/core/i18n/locale-manager.js.map +0 -1
- package/dist/core/i18n/system-prompt-injector.d.ts +0 -33
- package/dist/core/i18n/system-prompt-injector.d.ts.map +0 -1
- package/dist/core/i18n/system-prompt-injector.js +0 -131
- package/dist/core/i18n/system-prompt-injector.js.map +0 -1
- package/dist/core/i18n/types.d.ts +0 -151
- package/dist/core/i18n/types.d.ts.map +0 -1
- package/dist/core/i18n/types.js +0 -11
- package/dist/core/i18n/types.js.map +0 -1
- package/dist/core/increment/active-increment-manager.d.ts +0 -79
- package/dist/core/increment/active-increment-manager.d.ts.map +0 -1
- package/dist/core/increment/active-increment-manager.js +0 -153
- package/dist/core/increment/active-increment-manager.js.map +0 -1
- package/dist/core/increment/discipline-checker.d.ts +0 -60
- package/dist/core/increment/discipline-checker.d.ts.map +0 -1
- package/dist/core/increment/discipline-checker.js +0 -274
- package/dist/core/increment/discipline-checker.js.map +0 -1
- package/dist/core/increment/limits.d.ts +0 -68
- package/dist/core/increment/limits.d.ts.map +0 -1
- package/dist/core/increment/limits.js +0 -224
- package/dist/core/increment/limits.js.map +0 -1
- package/dist/core/increment/metadata-manager.d.ts +0 -116
- package/dist/core/increment/metadata-manager.d.ts.map +0 -1
- package/dist/core/increment/metadata-manager.js.map +0 -1
- package/dist/core/increment/metadata-validator.d.ts +0 -33
- package/dist/core/increment/metadata-validator.d.ts.map +0 -1
- package/dist/core/increment/metadata-validator.js +0 -147
- package/dist/core/increment/metadata-validator.js.map +0 -1
- package/dist/core/increment/status-commands.d.ts +0 -43
- package/dist/core/increment/status-commands.d.ts.map +0 -1
- package/dist/core/increment/status-commands.js +0 -277
- package/dist/core/increment/status-commands.js.map +0 -1
- package/dist/core/increment/types.d.ts +0 -88
- package/dist/core/increment/types.d.ts.map +0 -1
- package/dist/core/increment/types.js +0 -8
- package/dist/core/increment/types.js.map +0 -1
- package/dist/core/increment-status.d.ts +0 -72
- package/dist/core/increment-status.d.ts.map +0 -1
- package/dist/core/increment-status.js +0 -227
- package/dist/core/increment-status.js.map +0 -1
- package/dist/core/model-selector.d.ts +0 -57
- package/dist/core/model-selector.d.ts.map +0 -1
- package/dist/core/model-selector.js +0 -115
- package/dist/core/model-selector.js.map +0 -1
- package/dist/core/phase-detector.d.ts +0 -62
- package/dist/core/phase-detector.d.ts.map +0 -1
- package/dist/core/phase-detector.js +0 -229
- package/dist/core/phase-detector.js.map +0 -1
- package/dist/core/plugin-loader.d.ts +0 -131
- package/dist/core/plugin-loader.d.ts.map +0 -1
- package/dist/core/plugin-loader.js +0 -421
- package/dist/core/plugin-loader.js.map +0 -1
- package/dist/core/project-manager.d.ts +0 -127
- package/dist/core/project-manager.d.ts.map +0 -1
- package/dist/core/project-manager.js +0 -524
- package/dist/core/project-manager.js.map +0 -1
- package/dist/core/project-structure-detector.d.ts +0 -92
- package/dist/core/project-structure-detector.d.ts.map +0 -1
- package/dist/core/project-structure-detector.js +0 -289
- package/dist/core/project-structure-detector.js.map +0 -1
- package/dist/core/qa/qa-runner.d.ts +0 -16
- package/dist/core/qa/qa-runner.d.ts.map +0 -1
- package/dist/core/qa/qa-runner.js +0 -422
- package/dist/core/qa/qa-runner.js.map +0 -1
- package/dist/core/qa/quality-gate-decider.d.ts +0 -53
- package/dist/core/qa/quality-gate-decider.d.ts.map +0 -1
- package/dist/core/qa/quality-gate-decider.js +0 -268
- package/dist/core/qa/quality-gate-decider.js.map +0 -1
- package/dist/core/qa/risk-calculator.d.ts +0 -126
- package/dist/core/qa/risk-calculator.d.ts.map +0 -1
- package/dist/core/qa/risk-calculator.js +0 -247
- package/dist/core/qa/risk-calculator.js.map +0 -1
- package/dist/core/qa/types.d.ts +0 -315
- package/dist/core/qa/types.d.ts.map +0 -1
- package/dist/core/qa/types.js +0 -8
- package/dist/core/qa/types.js.map +0 -1
- package/dist/core/repo-structure/repo-structure-manager.d.ts +0 -82
- package/dist/core/repo-structure/repo-structure-manager.d.ts.map +0 -1
- package/dist/core/repo-structure/repo-structure-manager.js +0 -581
- package/dist/core/repo-structure/repo-structure-manager.js.map +0 -1
- package/dist/core/rfc-generator-v2.d.ts +0 -149
- package/dist/core/rfc-generator-v2.d.ts.map +0 -1
- package/dist/core/rfc-generator-v2.js +0 -399
- package/dist/core/rfc-generator-v2.js.map +0 -1
- package/dist/core/spec-task-mapper.d.ts +0 -71
- package/dist/core/spec-task-mapper.d.ts.map +0 -1
- package/dist/core/spec-task-mapper.js +0 -208
- package/dist/core/spec-task-mapper.js.map +0 -1
- package/dist/core/specs/spec-metadata-manager.d.ts +0 -70
- package/dist/core/specs/spec-metadata-manager.d.ts.map +0 -1
- package/dist/core/specs/spec-metadata-manager.js +0 -371
- package/dist/core/specs/spec-metadata-manager.js.map +0 -1
- package/dist/core/specs/spec-parser.d.ts +0 -66
- package/dist/core/specs/spec-parser.d.ts.map +0 -1
- package/dist/core/specs/spec-parser.js +0 -276
- package/dist/core/specs/spec-parser.js.map +0 -1
- package/dist/core/status-line/status-line-manager.d.ts +0 -62
- package/dist/core/status-line/status-line-manager.d.ts.map +0 -1
- package/dist/core/status-line/status-line-manager.js +0 -169
- package/dist/core/status-line/status-line-manager.js.map +0 -1
- package/dist/core/status-line/types.d.ts +0 -50
- package/dist/core/status-line/types.d.ts.map +0 -1
- package/dist/core/status-line/types.js +0 -17
- package/dist/core/status-line/types.js.map +0 -1
- package/dist/core/sync/bidirectional-engine.d.ts +0 -110
- package/dist/core/sync/bidirectional-engine.d.ts.map +0 -1
- package/dist/core/sync/bidirectional-engine.js +0 -356
- package/dist/core/sync/bidirectional-engine.js.map +0 -1
- package/dist/core/sync/folder-mapper.d.ts +0 -71
- package/dist/core/sync/folder-mapper.d.ts.map +0 -1
- package/dist/core/sync/folder-mapper.js +0 -203
- package/dist/core/sync/folder-mapper.js.map +0 -1
- package/dist/core/sync/profile-manager.d.ts +0 -72
- package/dist/core/sync/profile-manager.d.ts.map +0 -1
- package/dist/core/sync/profile-manager.js +0 -338
- package/dist/core/sync/profile-manager.js.map +0 -1
- package/dist/core/sync/profile-selector.d.ts +0 -52
- package/dist/core/sync/profile-selector.d.ts.map +0 -1
- package/dist/core/sync/profile-selector.js +0 -179
- package/dist/core/sync/profile-selector.js.map +0 -1
- package/dist/core/sync/profile-validator.d.ts +0 -52
- package/dist/core/sync/profile-validator.d.ts.map +0 -1
- package/dist/core/sync/profile-validator.js +0 -170
- package/dist/core/sync/profile-validator.js.map +0 -1
- package/dist/core/sync/project-context.d.ts +0 -81
- package/dist/core/sync/project-context.d.ts.map +0 -1
- package/dist/core/sync/project-context.js +0 -354
- package/dist/core/sync/project-context.js.map +0 -1
- package/dist/core/sync/rate-limiter.d.ts +0 -116
- package/dist/core/sync/rate-limiter.d.ts.map +0 -1
- package/dist/core/sync/rate-limiter.js +0 -308
- package/dist/core/sync/rate-limiter.js.map +0 -1
- package/dist/core/sync/time-range-selector.d.ts +0 -48
- package/dist/core/sync/time-range-selector.d.ts.map +0 -1
- package/dist/core/sync/time-range-selector.js +0 -224
- package/dist/core/sync/time-range-selector.js.map +0 -1
- package/dist/core/types/config.d.ts +0 -90
- package/dist/core/types/config.d.ts.map +0 -1
- package/dist/core/types/config.js +0 -44
- package/dist/core/types/config.js.map +0 -1
- package/dist/core/types/increment-metadata.d.ts +0 -120
- package/dist/core/types/increment-metadata.d.ts.map +0 -1
- package/dist/core/types/increment-metadata.js +0 -138
- package/dist/core/types/increment-metadata.js.map +0 -1
- package/dist/core/types/plugin.d.ts +0 -283
- package/dist/core/types/plugin.d.ts.map +0 -1
- package/dist/core/types/plugin.js +0 -49
- package/dist/core/types/plugin.js.map +0 -1
- package/dist/core/types/spec-metadata.d.ts +0 -229
- package/dist/core/types/spec-metadata.d.ts.map +0 -1
- package/dist/core/types/spec-metadata.js +0 -14
- package/dist/core/types/spec-metadata.js.map +0 -1
- package/dist/core/types/sync-profile.d.ts +0 -349
- package/dist/core/types/sync-profile.d.ts.map +0 -1
- package/dist/core/types/sync-profile.js +0 -79
- package/dist/core/types/sync-profile.js.map +0 -1
- package/dist/hooks/lib/git-diff-analyzer.d.ts +0 -89
- package/dist/hooks/lib/git-diff-analyzer.d.ts.map +0 -1
- package/dist/hooks/lib/git-diff-analyzer.js +0 -226
- package/dist/hooks/lib/git-diff-analyzer.js.map +0 -1
- package/dist/hooks/lib/invoke-translator-skill.d.ts +0 -60
- package/dist/hooks/lib/invoke-translator-skill.d.ts.map +0 -1
- package/dist/hooks/lib/invoke-translator-skill.js +0 -201
- package/dist/hooks/lib/invoke-translator-skill.js.map +0 -1
- package/dist/hooks/lib/prepare-reflection-context.d.ts +0 -42
- package/dist/hooks/lib/prepare-reflection-context.d.ts.map +0 -1
- package/dist/hooks/lib/prepare-reflection-context.js +0 -123
- package/dist/hooks/lib/prepare-reflection-context.js.map +0 -1
- package/dist/hooks/lib/reflection-config-loader.d.ts +0 -45
- package/dist/hooks/lib/reflection-config-loader.d.ts.map +0 -1
- package/dist/hooks/lib/reflection-config-loader.js +0 -132
- package/dist/hooks/lib/reflection-config-loader.js.map +0 -1
- package/dist/hooks/lib/reflection-parser.d.ts +0 -33
- package/dist/hooks/lib/reflection-parser.d.ts.map +0 -1
- package/dist/hooks/lib/reflection-parser.js +0 -419
- package/dist/hooks/lib/reflection-parser.js.map +0 -1
- package/dist/hooks/lib/reflection-prompt-builder.d.ts +0 -56
- package/dist/hooks/lib/reflection-prompt-builder.d.ts.map +0 -1
- package/dist/hooks/lib/reflection-prompt-builder.js +0 -239
- package/dist/hooks/lib/reflection-prompt-builder.js.map +0 -1
- package/dist/hooks/lib/reflection-storage.d.ts +0 -64
- package/dist/hooks/lib/reflection-storage.d.ts.map +0 -1
- package/dist/hooks/lib/reflection-storage.js +0 -305
- package/dist/hooks/lib/reflection-storage.js.map +0 -1
- package/dist/hooks/lib/run-self-reflection.d.ts +0 -43
- package/dist/hooks/lib/run-self-reflection.d.ts.map +0 -1
- package/dist/hooks/lib/run-self-reflection.js +0 -203
- package/dist/hooks/lib/run-self-reflection.js.map +0 -1
- package/dist/hooks/lib/sync-living-docs.d.ts +0 -27
- package/dist/hooks/lib/sync-living-docs.d.ts.map +0 -1
- package/dist/hooks/lib/sync-living-docs.js +0 -116
- package/dist/hooks/lib/sync-living-docs.js.map +0 -1
- package/dist/hooks/lib/translate-file.d.ts +0 -59
- package/dist/hooks/lib/translate-file.d.ts.map +0 -1
- package/dist/hooks/lib/translate-file.js +0 -350
- package/dist/hooks/lib/translate-file.js.map +0 -1
- package/dist/hooks/lib/translate-living-docs.d.ts +0 -13
- package/dist/hooks/lib/translate-living-docs.d.ts.map +0 -1
- package/dist/hooks/lib/translate-living-docs.js +0 -175
- package/dist/hooks/lib/translate-living-docs.js.map +0 -1
- package/dist/hooks/lib/types/reflection-types.d.ts +0 -164
- package/dist/hooks/lib/types/reflection-types.d.ts.map +0 -1
- package/dist/hooks/lib/types/reflection-types.js +0 -73
- package/dist/hooks/lib/types/reflection-types.js.map +0 -1
- package/dist/hooks/lib/update-tasks-md.d.ts +0 -29
- package/dist/hooks/lib/update-tasks-md.d.ts.map +0 -1
- package/dist/hooks/lib/update-tasks-md.js +0 -203
- package/dist/hooks/lib/update-tasks-md.js.map +0 -1
- package/dist/integrations/ado/ado-client.d.ts +0 -127
- package/dist/integrations/ado/ado-client.d.ts.map +0 -1
- package/dist/integrations/ado/ado-client.js +0 -416
- package/dist/integrations/ado/ado-client.js.map +0 -1
- package/dist/integrations/jira/jira-client.d.ts +0 -139
- package/dist/integrations/jira/jira-client.d.ts.map +0 -1
- package/dist/integrations/jira/jira-client.js +0 -386
- package/dist/integrations/jira/jira-client.js.map +0 -1
- package/dist/integrations/jira/jira-incremental-mapper.d.ts +0 -75
- package/dist/integrations/jira/jira-incremental-mapper.d.ts.map +0 -1
- package/dist/integrations/jira/jira-incremental-mapper.js +0 -474
- package/dist/integrations/jira/jira-incremental-mapper.js.map +0 -1
- package/dist/integrations/jira/jira-mapper.d.ts +0 -105
- package/dist/integrations/jira/jira-mapper.d.ts.map +0 -1
- package/dist/integrations/jira/jira-mapper.js +0 -494
- package/dist/integrations/jira/jira-mapper.js.map +0 -1
- package/dist/metrics/calculators/change-failure-rate.d.ts +0 -22
- package/dist/metrics/calculators/change-failure-rate.d.ts.map +0 -1
- package/dist/metrics/calculators/change-failure-rate.js +0 -70
- package/dist/metrics/calculators/change-failure-rate.js.map +0 -1
- package/dist/metrics/calculators/deployment-frequency.d.ts +0 -20
- package/dist/metrics/calculators/deployment-frequency.d.ts.map +0 -1
- package/dist/metrics/calculators/deployment-frequency.js +0 -61
- package/dist/metrics/calculators/deployment-frequency.js.map +0 -1
- package/dist/metrics/calculators/lead-time.d.ts +0 -22
- package/dist/metrics/calculators/lead-time.d.ts.map +0 -1
- package/dist/metrics/calculators/lead-time.js +0 -82
- package/dist/metrics/calculators/lead-time.js.map +0 -1
- package/dist/metrics/calculators/mttr.d.ts +0 -21
- package/dist/metrics/calculators/mttr.d.ts.map +0 -1
- package/dist/metrics/calculators/mttr.js +0 -60
- package/dist/metrics/calculators/mttr.js.map +0 -1
- package/dist/metrics/dora-calculator.d.ts +0 -28
- package/dist/metrics/dora-calculator.d.ts.map +0 -1
- package/dist/metrics/dora-calculator.js +0 -117
- package/dist/metrics/dora-calculator.js.map +0 -1
- package/dist/metrics/github-client.d.ts +0 -51
- package/dist/metrics/github-client.d.ts.map +0 -1
- package/dist/metrics/github-client.js +0 -133
- package/dist/metrics/github-client.js.map +0 -1
- package/dist/metrics/report-generator.d.ts +0 -17
- package/dist/metrics/report-generator.d.ts.map +0 -1
- package/dist/metrics/report-generator.js +0 -403
- package/dist/metrics/report-generator.js.map +0 -1
- package/dist/metrics/types.d.ts +0 -112
- package/dist/metrics/types.d.ts.map +0 -1
- package/dist/metrics/types.js +0 -10
- package/dist/metrics/types.js.map +0 -1
- package/dist/metrics/utils/percentile.d.ts +0 -25
- package/dist/metrics/utils/percentile.d.ts.map +0 -1
- package/dist/metrics/utils/percentile.js +0 -46
- package/dist/metrics/utils/percentile.js.map +0 -1
- package/dist/metrics/utils/tier-classifier.d.ts +0 -61
- package/dist/metrics/utils/tier-classifier.d.ts.map +0 -1
- package/dist/metrics/utils/tier-classifier.js +0 -100
- package/dist/metrics/utils/tier-classifier.js.map +0 -1
- package/dist/plugins/specweave-ado/lib/ado-board-resolver.d.ts +0 -94
- package/dist/plugins/specweave-ado/lib/ado-board-resolver.d.ts.map +0 -1
- package/dist/plugins/specweave-ado/lib/ado-board-resolver.js +0 -219
- package/dist/plugins/specweave-ado/lib/ado-board-resolver.js.map +0 -1
- package/dist/plugins/specweave-ado/lib/ado-hierarchical-sync.d.ts +0 -40
- package/dist/plugins/specweave-ado/lib/ado-hierarchical-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-ado/lib/ado-hierarchical-sync.js +0 -370
- package/dist/plugins/specweave-ado/lib/ado-hierarchical-sync.js.map +0 -1
- package/dist/plugins/specweave-ado/lib/ado-multi-project-sync.d.ts +0 -149
- package/dist/plugins/specweave-ado/lib/ado-multi-project-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -517
- package/dist/plugins/specweave-ado/lib/ado-multi-project-sync.js.map +0 -1
- package/dist/plugins/specweave-ado/lib/ado-project-detector.d.ts +0 -72
- package/dist/plugins/specweave-ado/lib/ado-project-detector.d.ts.map +0 -1
- package/dist/plugins/specweave-ado/lib/ado-project-detector.js +0 -416
- package/dist/plugins/specweave-ado/lib/ado-project-detector.js.map +0 -1
- package/dist/plugins/specweave-ado/lib/conflict-resolver.d.ts +0 -99
- package/dist/plugins/specweave-ado/lib/conflict-resolver.d.ts.map +0 -1
- package/dist/plugins/specweave-ado/lib/conflict-resolver.js +0 -331
- package/dist/plugins/specweave-ado/lib/conflict-resolver.js.map +0 -1
- package/dist/plugins/specweave-ado/lib/project-selector.d.ts +0 -42
- package/dist/plugins/specweave-ado/lib/project-selector.d.ts.map +0 -1
- package/dist/plugins/specweave-ado/lib/project-selector.js +0 -211
- package/dist/plugins/specweave-ado/lib/project-selector.js.map +0 -1
- package/dist/plugins/specweave-github/lib/github-board-resolver.d.ts +0 -54
- package/dist/plugins/specweave-github/lib/github-board-resolver.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/github-board-resolver.js +0 -122
- package/dist/plugins/specweave-github/lib/github-board-resolver.js.map +0 -1
- package/dist/plugins/specweave-github/lib/github-hierarchical-sync.d.ts +0 -29
- package/dist/plugins/specweave-github/lib/github-hierarchical-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/github-hierarchical-sync.js +0 -268
- package/dist/plugins/specweave-github/lib/github-hierarchical-sync.js.map +0 -1
- package/dist/plugins/specweave-github/lib/github-multi-project-sync.d.ts +0 -126
- package/dist/plugins/specweave-github/lib/github-multi-project-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/github-multi-project-sync.js +0 -420
- package/dist/plugins/specweave-github/lib/github-multi-project-sync.js.map +0 -1
- package/dist/plugins/specweave-github/lib/repo-selector.d.ts +0 -49
- package/dist/plugins/specweave-github/lib/repo-selector.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/repo-selector.js +0 -216
- package/dist/plugins/specweave-github/lib/repo-selector.js.map +0 -1
- package/dist/plugins/specweave-jira/lib/jira-board-resolver.d.ts +0 -50
- package/dist/plugins/specweave-jira/lib/jira-board-resolver.d.ts.map +0 -1
- package/dist/plugins/specweave-jira/lib/jira-board-resolver.js +0 -84
- package/dist/plugins/specweave-jira/lib/jira-board-resolver.js.map +0 -1
- package/dist/plugins/specweave-jira/lib/jira-hierarchical-sync.d.ts +0 -33
- package/dist/plugins/specweave-jira/lib/jira-hierarchical-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-jira/lib/jira-hierarchical-sync.js +0 -206
- package/dist/plugins/specweave-jira/lib/jira-hierarchical-sync.js.map +0 -1
- package/dist/plugins/specweave-jira/lib/jira-multi-project-sync.d.ts +0 -95
- package/dist/plugins/specweave-jira/lib/jira-multi-project-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-jira/lib/jira-multi-project-sync.js +0 -301
- package/dist/plugins/specweave-jira/lib/jira-multi-project-sync.js.map +0 -1
- package/dist/plugins/specweave-jira/lib/project-selector.d.ts +0 -42
- package/dist/plugins/specweave-jira/lib/project-selector.d.ts.map +0 -1
- package/dist/plugins/specweave-jira/lib/project-selector.js +0 -216
- package/dist/plugins/specweave-jira/lib/project-selector.js.map +0 -1
- package/dist/project-mapper.js +0 -272
- package/dist/scripts/split-spec-by-project.js +0 -105
- package/dist/spec-splitter.js +0 -283
- package/dist/src/core/agent-model-manager.d.ts +0 -52
- package/dist/src/core/agent-model-manager.d.ts.map +0 -1
- package/dist/src/core/agent-model-manager.js +0 -120
- package/dist/src/core/agent-model-manager.js.map +0 -1
- package/dist/src/core/model-selector.d.ts +0 -57
- package/dist/src/core/model-selector.d.ts.map +0 -1
- package/dist/src/core/model-selector.js +0 -115
- package/dist/src/core/model-selector.js.map +0 -1
- package/dist/src/core/phase-detector.d.ts +0 -62
- package/dist/src/core/phase-detector.d.ts.map +0 -1
- package/dist/src/core/phase-detector.js +0 -229
- package/dist/src/core/phase-detector.js.map +0 -1
- package/dist/src/hooks/lib/git-diff-analyzer.d.ts +0 -89
- package/dist/src/hooks/lib/git-diff-analyzer.d.ts.map +0 -1
- package/dist/src/hooks/lib/git-diff-analyzer.js +0 -226
- package/dist/src/hooks/lib/git-diff-analyzer.js.map +0 -1
- package/dist/src/hooks/lib/invoke-translator-skill.d.ts +0 -60
- package/dist/src/hooks/lib/invoke-translator-skill.d.ts.map +0 -1
- package/dist/src/hooks/lib/invoke-translator-skill.js +0 -201
- package/dist/src/hooks/lib/invoke-translator-skill.js.map +0 -1
- package/dist/src/hooks/lib/prepare-reflection-context.d.ts +0 -42
- package/dist/src/hooks/lib/prepare-reflection-context.d.ts.map +0 -1
- package/dist/src/hooks/lib/prepare-reflection-context.js +0 -123
- package/dist/src/hooks/lib/prepare-reflection-context.js.map +0 -1
- package/dist/src/hooks/lib/reflection-config-loader.d.ts +0 -45
- package/dist/src/hooks/lib/reflection-config-loader.d.ts.map +0 -1
- package/dist/src/hooks/lib/reflection-config-loader.js +0 -132
- package/dist/src/hooks/lib/reflection-config-loader.js.map +0 -1
- package/dist/src/hooks/lib/reflection-parser.d.ts +0 -33
- package/dist/src/hooks/lib/reflection-parser.d.ts.map +0 -1
- package/dist/src/hooks/lib/reflection-parser.js +0 -419
- package/dist/src/hooks/lib/reflection-parser.js.map +0 -1
- package/dist/src/hooks/lib/reflection-prompt-builder.d.ts +0 -56
- package/dist/src/hooks/lib/reflection-prompt-builder.d.ts.map +0 -1
- package/dist/src/hooks/lib/reflection-prompt-builder.js +0 -239
- package/dist/src/hooks/lib/reflection-prompt-builder.js.map +0 -1
- package/dist/src/hooks/lib/reflection-storage.d.ts +0 -64
- package/dist/src/hooks/lib/reflection-storage.d.ts.map +0 -1
- package/dist/src/hooks/lib/reflection-storage.js +0 -305
- package/dist/src/hooks/lib/reflection-storage.js.map +0 -1
- package/dist/src/hooks/lib/run-self-reflection.d.ts +0 -43
- package/dist/src/hooks/lib/run-self-reflection.d.ts.map +0 -1
- package/dist/src/hooks/lib/run-self-reflection.js +0 -203
- package/dist/src/hooks/lib/run-self-reflection.js.map +0 -1
- package/dist/src/hooks/lib/sync-living-docs.d.ts +0 -27
- package/dist/src/hooks/lib/sync-living-docs.d.ts.map +0 -1
- package/dist/src/hooks/lib/sync-living-docs.js +0 -116
- package/dist/src/hooks/lib/sync-living-docs.js.map +0 -1
- package/dist/src/hooks/lib/translate-file.d.ts +0 -59
- package/dist/src/hooks/lib/translate-file.d.ts.map +0 -1
- package/dist/src/hooks/lib/translate-file.js +0 -350
- package/dist/src/hooks/lib/translate-file.js.map +0 -1
- package/dist/src/hooks/lib/translate-living-docs.d.ts +0 -13
- package/dist/src/hooks/lib/translate-living-docs.d.ts.map +0 -1
- package/dist/src/hooks/lib/translate-living-docs.js +0 -175
- package/dist/src/hooks/lib/translate-living-docs.js.map +0 -1
- package/dist/src/hooks/lib/types/reflection-types.d.ts +0 -164
- package/dist/src/hooks/lib/types/reflection-types.d.ts.map +0 -1
- package/dist/src/hooks/lib/types/reflection-types.js +0 -73
- package/dist/src/hooks/lib/types/reflection-types.js.map +0 -1
- package/dist/src/hooks/lib/update-tasks-md.d.ts +0 -29
- package/dist/src/hooks/lib/update-tasks-md.d.ts.map +0 -1
- package/dist/src/hooks/lib/update-tasks-md.js +0 -203
- package/dist/src/hooks/lib/update-tasks-md.js.map +0 -1
- package/dist/testing/test-generator.d.ts +0 -117
- package/dist/testing/test-generator.d.ts.map +0 -1
- package/dist/testing/test-generator.js +0 -370
- package/dist/testing/test-generator.js.map +0 -1
- package/dist/types/cost-tracking.d.ts +0 -43
- package/dist/types/cost-tracking.d.ts.map +0 -1
- package/dist/types/cost-tracking.js +0 -8
- package/dist/types/cost-tracking.js.map +0 -1
- package/dist/types/model-selection.d.ts +0 -53
- package/dist/types/model-selection.d.ts.map +0 -1
- package/dist/types/model-selection.js +0 -12
- package/dist/types/model-selection.js.map +0 -1
- package/dist/utils/agents-md-compiler.d.ts +0 -68
- package/dist/utils/agents-md-compiler.d.ts.map +0 -1
- package/dist/utils/agents-md-compiler.js +0 -420
- package/dist/utils/agents-md-compiler.js.map +0 -1
- package/dist/utils/auth-helpers.d.ts +0 -58
- package/dist/utils/auth-helpers.d.ts.map +0 -1
- package/dist/utils/auth-helpers.js +0 -108
- package/dist/utils/auth-helpers.js.map +0 -1
- package/dist/utils/auto-install.d.ts +0 -47
- package/dist/utils/auto-install.d.ts.map +0 -1
- package/dist/utils/auto-install.js +0 -211
- package/dist/utils/auto-install.js.map +0 -1
- package/dist/utils/claude-cli-detector.d.ts +0 -75
- package/dist/utils/claude-cli-detector.d.ts.map +0 -1
- package/dist/utils/claude-cli-detector.js +0 -285
- package/dist/utils/claude-cli-detector.js.map +0 -1
- package/dist/utils/cost-reporter.d.ts +0 -58
- package/dist/utils/cost-reporter.d.ts.map +0 -1
- package/dist/utils/cost-reporter.js +0 -224
- package/dist/utils/cost-reporter.js.map +0 -1
- package/dist/utils/docs-preview/config-generator.d.ts +0 -46
- package/dist/utils/docs-preview/config-generator.d.ts.map +0 -1
- package/dist/utils/docs-preview/config-generator.js +0 -377
- package/dist/utils/docs-preview/config-generator.js.map +0 -1
- package/dist/utils/docs-preview/docusaurus-setup.d.ts +0 -38
- package/dist/utils/docs-preview/docusaurus-setup.d.ts.map +0 -1
- package/dist/utils/docs-preview/docusaurus-setup.js +0 -177
- package/dist/utils/docs-preview/docusaurus-setup.js.map +0 -1
- package/dist/utils/docs-preview/index.d.ts +0 -7
- package/dist/utils/docs-preview/index.d.ts.map +0 -1
- package/dist/utils/docs-preview/index.js +0 -7
- package/dist/utils/docs-preview/index.js.map +0 -1
- package/dist/utils/docs-preview/package-installer.d.ts +0 -42
- package/dist/utils/docs-preview/package-installer.d.ts.map +0 -1
- package/dist/utils/docs-preview/package-installer.js +0 -182
- package/dist/utils/docs-preview/package-installer.js.map +0 -1
- package/dist/utils/docs-preview/server-manager.d.ts +0 -30
- package/dist/utils/docs-preview/server-manager.d.ts.map +0 -1
- package/dist/utils/docs-preview/server-manager.js +0 -212
- package/dist/utils/docs-preview/server-manager.js.map +0 -1
- package/dist/utils/docs-preview/sidebar-builder.d.ts +0 -32
- package/dist/utils/docs-preview/sidebar-builder.d.ts.map +0 -1
- package/dist/utils/docs-preview/sidebar-builder.js +0 -202
- package/dist/utils/docs-preview/sidebar-builder.js.map +0 -1
- package/dist/utils/docs-preview/types.d.ts +0 -57
- package/dist/utils/docs-preview/types.d.ts.map +0 -1
- package/dist/utils/docs-preview/types.js +0 -2
- package/dist/utils/docs-preview/types.js.map +0 -1
- package/dist/utils/env-file.d.ts +0 -88
- package/dist/utils/env-file.d.ts.map +0 -1
- package/dist/utils/env-file.js +0 -180
- package/dist/utils/env-file.js.map +0 -1
- package/dist/utils/env-multi-project-parser.d.ts +0 -220
- package/dist/utils/env-multi-project-parser.d.ts.map +0 -1
- package/dist/utils/env-multi-project-parser.js +0 -401
- package/dist/utils/env-multi-project-parser.js.map +0 -1
- package/dist/utils/esm-helpers.d.ts +0 -50
- package/dist/utils/esm-helpers.d.ts.map +0 -1
- package/dist/utils/esm-helpers.js +0 -57
- package/dist/utils/esm-helpers.js.map +0 -1
- package/dist/utils/execFileNoThrow.d.ts +0 -99
- package/dist/utils/execFileNoThrow.d.ts.map +0 -1
- package/dist/utils/execFileNoThrow.js +0 -137
- package/dist/utils/execFileNoThrow.js.map +0 -1
- package/dist/utils/external-resource-validator.d.ts +0 -102
- package/dist/utils/external-resource-validator.d.ts.map +0 -1
- package/dist/utils/external-resource-validator.js +0 -504
- package/dist/utils/external-resource-validator.js.map +0 -1
- package/dist/utils/generate-skills-index.d.ts +0 -24
- package/dist/utils/generate-skills-index.d.ts.map +0 -1
- package/dist/utils/generate-skills-index.js +0 -410
- package/dist/utils/generate-skills-index.js.map +0 -1
- package/dist/utils/git-detector.d.ts +0 -84
- package/dist/utils/git-detector.d.ts.map +0 -1
- package/dist/utils/git-detector.js +0 -233
- package/dist/utils/git-detector.js.map +0 -1
- package/dist/utils/git-utils.d.ts +0 -74
- package/dist/utils/git-utils.d.ts.map +0 -1
- package/dist/utils/git-utils.js +0 -272
- package/dist/utils/git-utils.js.map +0 -1
- package/dist/utils/model-selection.d.ts +0 -75
- package/dist/utils/model-selection.d.ts.map +0 -1
- package/dist/utils/model-selection.js +0 -204
- package/dist/utils/model-selection.js.map +0 -1
- package/dist/utils/plugin-validator.d.ts +0 -161
- package/dist/utils/plugin-validator.d.ts.map +0 -1
- package/dist/utils/plugin-validator.js +0 -558
- package/dist/utils/plugin-validator.js.map +0 -1
- package/dist/utils/pricing-constants.d.ts +0 -70
- package/dist/utils/pricing-constants.d.ts.map +0 -1
- package/dist/utils/pricing-constants.js +0 -71
- package/dist/utils/pricing-constants.js.map +0 -1
- package/dist/utils/project-detection.d.ts +0 -141
- package/dist/utils/project-detection.d.ts.map +0 -1
- package/dist/utils/project-detection.js +0 -321
- package/dist/utils/project-detection.js.map +0 -1
- package/dist/utils/project-mapper.d.ts +0 -92
- package/dist/utils/project-mapper.d.ts.map +0 -1
- package/dist/utils/project-mapper.js +0 -276
- package/dist/utils/project-mapper.js.map +0 -1
- package/dist/utils/spec-splitter.d.ts +0 -75
- package/dist/utils/spec-splitter.d.ts.map +0 -1
- package/dist/utils/spec-splitter.js +0 -332
- package/dist/utils/spec-splitter.js.map +0 -1
- package/dist/utils/string-utils.d.ts +0 -40
- package/dist/utils/string-utils.d.ts.map +0 -1
- package/dist/utils/string-utils.js +0 -58
- package/dist/utils/string-utils.js.map +0 -1
- package/dist/utils/translation.d.ts +0 -187
- package/dist/utils/translation.d.ts.map +0 -1
- package/dist/utils/translation.js +0 -414
- package/dist/utils/translation.js.map +0 -1
|
@@ -1,18 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GitHub Spec Sync
|
|
2
|
+
* GitHub Spec Sync (Multi-Project Architecture)
|
|
3
3
|
*
|
|
4
4
|
* CORRECT ARCHITECTURE:
|
|
5
|
-
* - Syncs .specweave/docs/internal/specs/spec-*.md ↔ GitHub Projects
|
|
5
|
+
* - Syncs .specweave/docs/internal/specs/{project-id}/spec-*.md ↔ GitHub Projects
|
|
6
6
|
* - NOT increments ↔ GitHub Issues (that was wrong!)
|
|
7
7
|
*
|
|
8
|
+
* MULTI-PROJECT SUPPORT (v0.18.0+):
|
|
9
|
+
* - Detects which project a spec belongs to (by folder path)
|
|
10
|
+
* - Routes to correct GitHub repo based on project config
|
|
11
|
+
* - Supports multiple sync strategies per project
|
|
12
|
+
* - Handles cross-team specs (create issues in multiple repos)
|
|
13
|
+
*
|
|
8
14
|
* Mapping:
|
|
9
15
|
* - Spec → GitHub Project
|
|
10
16
|
* - User Story → GitHub Project Card/Issue
|
|
11
17
|
* - Acceptance Criteria → Checklist in Issue
|
|
12
18
|
*
|
|
19
|
+
* Sync Strategies:
|
|
20
|
+
* - project-per-spec: One GitHub Project per spec (default)
|
|
21
|
+
* - team-board: One GitHub Project per team (aggregates specs)
|
|
22
|
+
* - centralized: Parent repo tracks all (multi-repo pattern)
|
|
23
|
+
* - distributed: Each team syncs to their repo (microservices)
|
|
24
|
+
*
|
|
13
25
|
* @module github-spec-sync
|
|
14
26
|
*/
|
|
15
27
|
|
|
28
|
+
import * as path from 'path';
|
|
16
29
|
import { SpecMetadataManager } from '../../../src/core/specs/spec-metadata-manager.js';
|
|
17
30
|
import { SpecParser } from '../../../src/core/specs/spec-parser.js';
|
|
18
31
|
import {
|
|
@@ -22,6 +35,8 @@ import {
|
|
|
22
35
|
SpecSyncConflict
|
|
23
36
|
} from '../../../src/core/types/spec-metadata.js';
|
|
24
37
|
import { execFileNoThrow } from '../../../src/utils/execFileNoThrow.js';
|
|
38
|
+
import { ProjectContextManager } from '../../../src/core/sync/project-context.js';
|
|
39
|
+
import { SyncProfile, GitHubConfig } from '../../../src/core/types/sync-profile.js';
|
|
25
40
|
|
|
26
41
|
export interface GitHubProject {
|
|
27
42
|
id: number;
|
|
@@ -50,15 +65,97 @@ export interface GitHubIssue {
|
|
|
50
65
|
assignees: string[];
|
|
51
66
|
}
|
|
52
67
|
|
|
68
|
+
/**
|
|
69
|
+
* GitHub Sync Strategy
|
|
70
|
+
*/
|
|
71
|
+
export type GitHubSyncStrategy =
|
|
72
|
+
| 'project-per-spec' // One GitHub Project per spec (default, current behavior)
|
|
73
|
+
| 'team-board' // One GitHub Project per team (aggregates multiple specs)
|
|
74
|
+
| 'centralized' // Parent repo tracks all specs (multi-repo pattern)
|
|
75
|
+
| 'distributed'; // Each team syncs to their repo (microservices)
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Project-specific GitHub configuration
|
|
79
|
+
*/
|
|
80
|
+
export interface ProjectGitHubConfig {
|
|
81
|
+
projectId: string;
|
|
82
|
+
strategy: GitHubSyncStrategy;
|
|
83
|
+
owner: string;
|
|
84
|
+
repo: string;
|
|
85
|
+
teamBoardId?: number; // For team-board strategy
|
|
86
|
+
}
|
|
87
|
+
|
|
53
88
|
export class GitHubSpecSync {
|
|
54
89
|
private specManager: SpecMetadataManager;
|
|
90
|
+
private projectContextManager: ProjectContextManager;
|
|
91
|
+
private projectRoot: string;
|
|
55
92
|
|
|
56
93
|
constructor(projectRoot: string = process.cwd()) {
|
|
94
|
+
this.projectRoot = projectRoot;
|
|
57
95
|
this.specManager = new SpecMetadataManager(projectRoot);
|
|
96
|
+
this.projectContextManager = new ProjectContextManager(projectRoot);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Detect project from spec file path
|
|
101
|
+
*
|
|
102
|
+
* Spec path format: .specweave/docs/internal/specs/{project-id}/spec-*.md
|
|
103
|
+
* OR (single project): .specweave/docs/internal/specs/spec-*.md
|
|
104
|
+
*/
|
|
105
|
+
private async detectProjectFromSpecPath(specFilePath: string): Promise<string | null> {
|
|
106
|
+
const specPathMatch = specFilePath.match(/\.specweave\/docs\/internal\/specs\/([^/]+)\//);
|
|
107
|
+
|
|
108
|
+
if (specPathMatch) {
|
|
109
|
+
// Multi-project: .specweave/docs/internal/specs/frontend/spec-001.md
|
|
110
|
+
const projectId = specPathMatch[1];
|
|
111
|
+
const project = await this.projectContextManager.getProject(projectId);
|
|
112
|
+
return project ? projectId : null;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Single project (default): .specweave/docs/internal/specs/spec-001.md
|
|
116
|
+
return 'default';
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Get GitHub configuration for a project
|
|
121
|
+
*/
|
|
122
|
+
private async getGitHubConfigForProject(projectId: string): Promise<ProjectGitHubConfig | null> {
|
|
123
|
+
const config = await this.projectContextManager.load();
|
|
124
|
+
const project = await this.projectContextManager.getProject(projectId);
|
|
125
|
+
|
|
126
|
+
if (!project) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Get profile from project's default sync profile
|
|
131
|
+
const profileId = project.defaultSyncProfile || config.activeProfile;
|
|
132
|
+
if (!profileId) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const profile = config.profiles?.[profileId];
|
|
137
|
+
if (!profile || profile.provider !== 'github') {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const githubConfig = profile.config as GitHubConfig;
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
projectId,
|
|
145
|
+
strategy: (githubConfig as any).githubStrategy || 'project-per-spec',
|
|
146
|
+
owner: githubConfig.owner || '',
|
|
147
|
+
repo: githubConfig.repo || (githubConfig.repos && githubConfig.repos[0]) || '',
|
|
148
|
+
teamBoardId: (githubConfig as any).teamBoardId
|
|
149
|
+
};
|
|
58
150
|
}
|
|
59
151
|
|
|
60
152
|
/**
|
|
61
153
|
* Sync spec to GitHub Project (CREATE or UPDATE)
|
|
154
|
+
*
|
|
155
|
+
* MULTI-PROJECT ARCHITECTURE:
|
|
156
|
+
* - Detects which project the spec belongs to
|
|
157
|
+
* - Routes to correct GitHub repo based on project config
|
|
158
|
+
* - Supports multiple sync strategies
|
|
62
159
|
*/
|
|
63
160
|
async syncSpecToGitHub(specId: string): Promise<SpecSyncResult> {
|
|
64
161
|
console.log(`\n🔄 Syncing spec ${specId} to GitHub Project...`);
|
|
@@ -75,20 +172,103 @@ export class GitHubSpecSync {
|
|
|
75
172
|
};
|
|
76
173
|
}
|
|
77
174
|
|
|
78
|
-
// 2. Detect
|
|
79
|
-
const
|
|
80
|
-
if (!
|
|
175
|
+
// 2. Detect project from spec path
|
|
176
|
+
const projectId = await this.detectProjectFromSpecPath(spec.filePath);
|
|
177
|
+
if (!projectId) {
|
|
81
178
|
return {
|
|
82
179
|
success: false,
|
|
83
180
|
specId,
|
|
84
181
|
provider: 'github',
|
|
85
|
-
error: 'Could not
|
|
182
|
+
error: 'Could not determine project for spec'
|
|
86
183
|
};
|
|
87
184
|
}
|
|
88
185
|
|
|
89
|
-
|
|
186
|
+
console.log(` 📦 Detected project: ${projectId}`);
|
|
187
|
+
|
|
188
|
+
// 3. Get GitHub config for this project
|
|
189
|
+
const githubConfig = await this.getGitHubConfigForProject(projectId);
|
|
190
|
+
if (!githubConfig) {
|
|
191
|
+
// Fallback to auto-detect from git remote
|
|
192
|
+
const repoInfo = await this.detectRepo();
|
|
193
|
+
if (!repoInfo) {
|
|
194
|
+
return {
|
|
195
|
+
success: false,
|
|
196
|
+
specId,
|
|
197
|
+
provider: 'github',
|
|
198
|
+
error: `No GitHub configuration found for project '${projectId}'`
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Use fallback config
|
|
203
|
+
githubConfig.owner = repoInfo.owner;
|
|
204
|
+
githubConfig.repo = repoInfo.repo;
|
|
205
|
+
githubConfig.strategy = 'project-per-spec';
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
console.log(` 🎯 Strategy: ${githubConfig.strategy}`);
|
|
209
|
+
console.log(` 🔗 Repository: ${githubConfig.owner}/${githubConfig.repo}`);
|
|
210
|
+
|
|
211
|
+
const { owner, repo, strategy } = githubConfig;
|
|
90
212
|
|
|
91
|
-
//
|
|
213
|
+
// 4. Handle strategy-specific sync
|
|
214
|
+
return await this.syncWithStrategy(spec, owner, repo, strategy, githubConfig);
|
|
215
|
+
|
|
216
|
+
} catch (error) {
|
|
217
|
+
console.error('❌ Error syncing to GitHub:', error);
|
|
218
|
+
return {
|
|
219
|
+
success: false,
|
|
220
|
+
specId,
|
|
221
|
+
provider: 'github',
|
|
222
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Sync spec using specified strategy
|
|
229
|
+
*/
|
|
230
|
+
private async syncWithStrategy(
|
|
231
|
+
spec: SpecContent,
|
|
232
|
+
owner: string,
|
|
233
|
+
repo: string,
|
|
234
|
+
strategy: GitHubSyncStrategy,
|
|
235
|
+
config: ProjectGitHubConfig
|
|
236
|
+
): Promise<SpecSyncResult> {
|
|
237
|
+
const specId = spec.metadata.id;
|
|
238
|
+
|
|
239
|
+
switch (strategy) {
|
|
240
|
+
case 'project-per-spec':
|
|
241
|
+
return await this.syncProjectPerSpec(spec, owner, repo);
|
|
242
|
+
|
|
243
|
+
case 'team-board':
|
|
244
|
+
return await this.syncTeamBoard(spec, owner, repo, config.teamBoardId);
|
|
245
|
+
|
|
246
|
+
case 'centralized':
|
|
247
|
+
return await this.syncCentralized(spec, owner, repo);
|
|
248
|
+
|
|
249
|
+
case 'distributed':
|
|
250
|
+
return await this.syncDistributed(spec, config);
|
|
251
|
+
|
|
252
|
+
default:
|
|
253
|
+
// Fallback to project-per-spec
|
|
254
|
+
return await this.syncProjectPerSpec(spec, owner, repo);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Strategy 1: Project-per-Spec (DEFAULT)
|
|
260
|
+
* - One GitHub Project per spec
|
|
261
|
+
* - Current behavior, no changes needed
|
|
262
|
+
*/
|
|
263
|
+
private async syncProjectPerSpec(
|
|
264
|
+
spec: SpecContent,
|
|
265
|
+
owner: string,
|
|
266
|
+
repo: string
|
|
267
|
+
): Promise<SpecSyncResult> {
|
|
268
|
+
const specId = spec.metadata.id;
|
|
269
|
+
|
|
270
|
+
try {
|
|
271
|
+
// Check if spec already linked to GitHub Project
|
|
92
272
|
const existingLink = spec.metadata.externalLinks?.github;
|
|
93
273
|
|
|
94
274
|
let project: GitHubProject;
|
|
@@ -320,59 +500,6 @@ export class GitHubSpecSync {
|
|
|
320
500
|
};
|
|
321
501
|
}
|
|
322
502
|
|
|
323
|
-
/**
|
|
324
|
-
* Sync user stories as GitHub Issues
|
|
325
|
-
*/
|
|
326
|
-
private async syncUserStories(
|
|
327
|
-
owner: string,
|
|
328
|
-
repo: string,
|
|
329
|
-
projectNumber: number,
|
|
330
|
-
spec: SpecContent
|
|
331
|
-
): Promise<{ created: string[]; updated: string[]; deleted: string[] }> {
|
|
332
|
-
const created: string[] = [];
|
|
333
|
-
const updated: string[] = [];
|
|
334
|
-
const deleted: string[] = [];
|
|
335
|
-
|
|
336
|
-
if (!spec.metadata.userStories || spec.metadata.userStories.length === 0) {
|
|
337
|
-
console.log(' ℹ️ No user stories to sync');
|
|
338
|
-
return { created, updated, deleted };
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
console.log(` Syncing ${spec.metadata.userStories.length} user stories...`);
|
|
342
|
-
|
|
343
|
-
for (const us of spec.metadata.userStories) {
|
|
344
|
-
// Create or update issue for each user story
|
|
345
|
-
const issueTitle = `[${us.id}] ${us.title}`;
|
|
346
|
-
const issueBody = this.generateIssueBody(us);
|
|
347
|
-
|
|
348
|
-
// Check if issue already exists (by title pattern)
|
|
349
|
-
const existingIssue = await this.findIssueByTitle(owner, repo, us.id);
|
|
350
|
-
|
|
351
|
-
if (existingIssue) {
|
|
352
|
-
// UPDATE existing issue
|
|
353
|
-
await this.updateIssue(owner, repo, existingIssue.number, {
|
|
354
|
-
title: issueTitle,
|
|
355
|
-
body: issueBody,
|
|
356
|
-
state: us.status === 'done' ? 'closed' : 'open'
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
updated.push(us.id);
|
|
360
|
-
console.log(` ✅ Updated ${us.id}`);
|
|
361
|
-
} else {
|
|
362
|
-
// CREATE new issue
|
|
363
|
-
const newIssue = await this.createIssue(owner, repo, {
|
|
364
|
-
title: issueTitle,
|
|
365
|
-
body: issueBody,
|
|
366
|
-
labels: ['user-story', `spec:${spec.metadata.id}`, `priority:${us.priority}`]
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
created.push(us.id);
|
|
370
|
-
console.log(` ✅ Created ${us.id} → Issue #${newIssue.number}`);
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
return { created, updated, deleted };
|
|
375
|
-
}
|
|
376
503
|
|
|
377
504
|
/**
|
|
378
505
|
* Generate project description from spec
|
|
@@ -627,6 +754,415 @@ ${acList}
|
|
|
627
754
|
}
|
|
628
755
|
}
|
|
629
756
|
|
|
757
|
+
/**
|
|
758
|
+
* Strategy 2: Team-Board
|
|
759
|
+
* - One GitHub Project per team (aggregates multiple specs)
|
|
760
|
+
* - All specs from the same team/project sync to same board
|
|
761
|
+
*/
|
|
762
|
+
private async syncTeamBoard(
|
|
763
|
+
spec: SpecContent,
|
|
764
|
+
owner: string,
|
|
765
|
+
repo: string,
|
|
766
|
+
teamBoardId?: number
|
|
767
|
+
): Promise<SpecSyncResult> {
|
|
768
|
+
const specId = spec.metadata.id;
|
|
769
|
+
|
|
770
|
+
try {
|
|
771
|
+
console.log(' 📋 Using team-board strategy (aggregated)');
|
|
772
|
+
|
|
773
|
+
// If team board doesn't exist, create it
|
|
774
|
+
if (!teamBoardId) {
|
|
775
|
+
const projectId = await this.detectProjectFromSpecPath(spec.filePath);
|
|
776
|
+
const project = await this.projectContextManager.getProject(projectId || 'default');
|
|
777
|
+
|
|
778
|
+
const teamName = project?.team || 'Team';
|
|
779
|
+
const teamProject = await this.createGitHubProject(owner, repo, {
|
|
780
|
+
...spec,
|
|
781
|
+
metadata: {
|
|
782
|
+
...spec.metadata,
|
|
783
|
+
title: `${teamName} Board`
|
|
784
|
+
}
|
|
785
|
+
});
|
|
786
|
+
|
|
787
|
+
teamBoardId = teamProject.id;
|
|
788
|
+
|
|
789
|
+
console.log(` ✅ Created team board: ${teamName} Board (#${teamBoardId})`);
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
// Sync this spec's user stories to the team board
|
|
793
|
+
const changes = await this.syncUserStories(owner, repo, teamBoardId, spec);
|
|
794
|
+
|
|
795
|
+
return {
|
|
796
|
+
success: true,
|
|
797
|
+
specId,
|
|
798
|
+
provider: 'github',
|
|
799
|
+
externalId: teamBoardId.toString(),
|
|
800
|
+
url: `https://github.com/orgs/${owner}/projects/${teamBoardId}`,
|
|
801
|
+
changes
|
|
802
|
+
};
|
|
803
|
+
|
|
804
|
+
} catch (error) {
|
|
805
|
+
console.error('❌ Error syncing to team board:', error);
|
|
806
|
+
return {
|
|
807
|
+
success: false,
|
|
808
|
+
specId,
|
|
809
|
+
provider: 'github',
|
|
810
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
811
|
+
};
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
/**
|
|
816
|
+
* Strategy 3: Centralized
|
|
817
|
+
* - Parent repo tracks all specs (multi-repo pattern)
|
|
818
|
+
* - Issues created in parent repo with tags for child repos
|
|
819
|
+
*/
|
|
820
|
+
private async syncCentralized(
|
|
821
|
+
spec: SpecContent,
|
|
822
|
+
parentOwner: string,
|
|
823
|
+
parentRepo: string
|
|
824
|
+
): Promise<SpecSyncResult> {
|
|
825
|
+
const specId = spec.metadata.id;
|
|
826
|
+
|
|
827
|
+
try {
|
|
828
|
+
console.log(' 🏢 Using centralized strategy (parent repo tracks all)');
|
|
829
|
+
|
|
830
|
+
// Create project in parent repo
|
|
831
|
+
const project = await this.createGitHubProject(parentOwner, parentRepo, spec);
|
|
832
|
+
|
|
833
|
+
// Tag issues with project/team info
|
|
834
|
+
const projectId = await this.detectProjectFromSpecPath(spec.filePath);
|
|
835
|
+
const projectContext = await this.projectContextManager.getProject(projectId || 'default');
|
|
836
|
+
|
|
837
|
+
// Sync user stories with project tags
|
|
838
|
+
const changes = await this.syncUserStories(
|
|
839
|
+
parentOwner,
|
|
840
|
+
parentRepo,
|
|
841
|
+
project.number,
|
|
842
|
+
spec,
|
|
843
|
+
projectContext?.name ? [`project:${projectContext.name}`] : []
|
|
844
|
+
);
|
|
845
|
+
|
|
846
|
+
console.log(` ✅ Synced to parent repo: ${parentOwner}/${parentRepo}`);
|
|
847
|
+
|
|
848
|
+
return {
|
|
849
|
+
success: true,
|
|
850
|
+
specId,
|
|
851
|
+
provider: 'github',
|
|
852
|
+
externalId: project.id.toString(),
|
|
853
|
+
url: project.url,
|
|
854
|
+
changes
|
|
855
|
+
};
|
|
856
|
+
|
|
857
|
+
} catch (error) {
|
|
858
|
+
console.error('❌ Error syncing centralized:', error);
|
|
859
|
+
return {
|
|
860
|
+
success: false,
|
|
861
|
+
specId,
|
|
862
|
+
provider: 'github',
|
|
863
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
864
|
+
};
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
/**
|
|
869
|
+
* Strategy 4: Distributed
|
|
870
|
+
* - Each team syncs to their repo (microservices)
|
|
871
|
+
* - Cross-team specs create issues in multiple repos
|
|
872
|
+
*/
|
|
873
|
+
private async syncDistributed(
|
|
874
|
+
spec: SpecContent,
|
|
875
|
+
config: ProjectGitHubConfig
|
|
876
|
+
): Promise<SpecSyncResult> {
|
|
877
|
+
const specId = spec.metadata.id;
|
|
878
|
+
|
|
879
|
+
try {
|
|
880
|
+
console.log(' 🌐 Using distributed strategy (per-team repos)');
|
|
881
|
+
|
|
882
|
+
const projectId = config.projectId;
|
|
883
|
+
const projectContext = await this.projectContextManager.getProject(projectId);
|
|
884
|
+
|
|
885
|
+
if (!projectContext) {
|
|
886
|
+
throw new Error(`Project context not found for ${projectId}`);
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
// Determine if this is a cross-team spec
|
|
890
|
+
const isCrossTeam = this.isCrossTeamSpec(spec);
|
|
891
|
+
|
|
892
|
+
if (isCrossTeam) {
|
|
893
|
+
console.log(' 🔗 Cross-team spec detected, syncing to multiple repos');
|
|
894
|
+
return await this.syncCrossTeamSpec(spec, projectId);
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
// Single-team spec: sync to its own repo
|
|
898
|
+
return await this.syncProjectPerSpec(spec, config.owner, config.repo);
|
|
899
|
+
|
|
900
|
+
} catch (error) {
|
|
901
|
+
console.error('❌ Error syncing distributed:', error);
|
|
902
|
+
return {
|
|
903
|
+
success: false,
|
|
904
|
+
specId,
|
|
905
|
+
provider: 'github',
|
|
906
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
907
|
+
};
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
/**
|
|
912
|
+
* Check if spec is cross-team (touches multiple projects)
|
|
913
|
+
*
|
|
914
|
+
* Detection heuristics:
|
|
915
|
+
* - Spec title contains keywords like "integration", "cross-team", "shared"
|
|
916
|
+
* - User stories reference multiple projects/teams
|
|
917
|
+
* - Tags include multiple project names
|
|
918
|
+
*/
|
|
919
|
+
private isCrossTeamSpec(spec: SpecContent): boolean {
|
|
920
|
+
const crossTeamKeywords = [
|
|
921
|
+
'integration',
|
|
922
|
+
'cross-team',
|
|
923
|
+
'cross-project',
|
|
924
|
+
'shared',
|
|
925
|
+
'common',
|
|
926
|
+
'auth', // Auth often touches frontend + backend
|
|
927
|
+
'api-contract',
|
|
928
|
+
'sync'
|
|
929
|
+
];
|
|
930
|
+
|
|
931
|
+
const title = spec.metadata.title.toLowerCase();
|
|
932
|
+
const hasCrossTeamKeyword = crossTeamKeywords.some(keyword =>
|
|
933
|
+
title.includes(keyword)
|
|
934
|
+
);
|
|
935
|
+
|
|
936
|
+
// Check tags for multiple project references
|
|
937
|
+
const tags = spec.metadata.tags || [];
|
|
938
|
+
const projectTags = tags.filter(tag => tag.startsWith('project:'));
|
|
939
|
+
const hasMultipleProjects = projectTags.length > 1;
|
|
940
|
+
|
|
941
|
+
return hasCrossTeamKeyword || hasMultipleProjects;
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
/**
|
|
945
|
+
* Sync cross-team spec to multiple repositories
|
|
946
|
+
*
|
|
947
|
+
* Creates issues in multiple repos:
|
|
948
|
+
* - Frontend repo gets frontend-specific user stories
|
|
949
|
+
* - Backend repo gets backend-specific user stories
|
|
950
|
+
* - Shared stories get created in both with cross-links
|
|
951
|
+
*/
|
|
952
|
+
private async syncCrossTeamSpec(
|
|
953
|
+
spec: SpecContent,
|
|
954
|
+
projectId: string
|
|
955
|
+
): Promise<SpecSyncResult> {
|
|
956
|
+
const specId = spec.metadata.id;
|
|
957
|
+
|
|
958
|
+
try {
|
|
959
|
+
// Get all related project profiles
|
|
960
|
+
const config = await this.projectContextManager.load();
|
|
961
|
+
const relatedProfiles = await this.detectRelatedProfiles(spec, config);
|
|
962
|
+
|
|
963
|
+
if (relatedProfiles.length === 0) {
|
|
964
|
+
throw new Error('No related profiles found for cross-team spec');
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
console.log(` 📂 Syncing to ${relatedProfiles.length} repositories:`);
|
|
968
|
+
|
|
969
|
+
const allChanges = {
|
|
970
|
+
created: [] as string[],
|
|
971
|
+
updated: [] as string[],
|
|
972
|
+
deleted: [] as string[]
|
|
973
|
+
};
|
|
974
|
+
|
|
975
|
+
// Sync to each related repo
|
|
976
|
+
for (const profile of relatedProfiles) {
|
|
977
|
+
const githubConfig = profile.config as GitHubConfig;
|
|
978
|
+
console.log(` → ${githubConfig.owner}/${githubConfig.repo}`);
|
|
979
|
+
|
|
980
|
+
// Filter user stories relevant to this project
|
|
981
|
+
const relevantStories = this.filterRelevantUserStories(
|
|
982
|
+
spec,
|
|
983
|
+
profile.projectContext?.name || ''
|
|
984
|
+
);
|
|
985
|
+
|
|
986
|
+
if (relevantStories.length === 0) {
|
|
987
|
+
console.log(` ℹ️ No relevant stories, skipping`);
|
|
988
|
+
continue;
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
// Create project in this repo
|
|
992
|
+
const project = await this.createGitHubProject(
|
|
993
|
+
githubConfig.owner || '',
|
|
994
|
+
githubConfig.repo || '',
|
|
995
|
+
{
|
|
996
|
+
...spec,
|
|
997
|
+
metadata: {
|
|
998
|
+
...spec.metadata,
|
|
999
|
+
userStories: relevantStories
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
);
|
|
1003
|
+
|
|
1004
|
+
// Sync user stories
|
|
1005
|
+
const changes = await this.syncUserStories(
|
|
1006
|
+
githubConfig.owner || '',
|
|
1007
|
+
githubConfig.repo || '',
|
|
1008
|
+
project.number,
|
|
1009
|
+
{ ...spec, metadata: { ...spec.metadata, userStories: relevantStories } }
|
|
1010
|
+
);
|
|
1011
|
+
|
|
1012
|
+
allChanges.created.push(...changes.created);
|
|
1013
|
+
allChanges.updated.push(...changes.updated);
|
|
1014
|
+
allChanges.deleted.push(...changes.deleted);
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
console.log(' ✅ Cross-team sync complete!');
|
|
1018
|
+
|
|
1019
|
+
return {
|
|
1020
|
+
success: true,
|
|
1021
|
+
specId,
|
|
1022
|
+
provider: 'github',
|
|
1023
|
+
externalId: 'cross-team',
|
|
1024
|
+
url: 'multiple-repos',
|
|
1025
|
+
changes: allChanges
|
|
1026
|
+
};
|
|
1027
|
+
|
|
1028
|
+
} catch (error) {
|
|
1029
|
+
console.error('❌ Error syncing cross-team spec:', error);
|
|
1030
|
+
return {
|
|
1031
|
+
success: false,
|
|
1032
|
+
specId,
|
|
1033
|
+
provider: 'github',
|
|
1034
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
1035
|
+
};
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
/**
|
|
1040
|
+
* Detect related profiles for cross-team spec
|
|
1041
|
+
*/
|
|
1042
|
+
private async detectRelatedProfiles(
|
|
1043
|
+
spec: SpecContent,
|
|
1044
|
+
config: any
|
|
1045
|
+
): Promise<Array<any>> {
|
|
1046
|
+
const profiles: Array<any> = [];
|
|
1047
|
+
const tags = spec.metadata.tags || [];
|
|
1048
|
+
|
|
1049
|
+
// Extract project tags (e.g., project:frontend, project:backend)
|
|
1050
|
+
const projectTags = tags
|
|
1051
|
+
.filter(tag => tag.startsWith('project:'))
|
|
1052
|
+
.map(tag => tag.replace('project:', ''));
|
|
1053
|
+
|
|
1054
|
+
// Find profiles for these projects
|
|
1055
|
+
for (const projectId of projectTags) {
|
|
1056
|
+
const project = await this.projectContextManager.getProject(projectId);
|
|
1057
|
+
if (project && project.defaultSyncProfile) {
|
|
1058
|
+
const profile = config.profiles?.[project.defaultSyncProfile];
|
|
1059
|
+
if (profile && profile.provider === 'github') {
|
|
1060
|
+
profiles.push({
|
|
1061
|
+
...profile,
|
|
1062
|
+
projectContext: project
|
|
1063
|
+
});
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
return profiles;
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
/**
|
|
1072
|
+
* Filter user stories relevant to a specific project
|
|
1073
|
+
*
|
|
1074
|
+
* Heuristics:
|
|
1075
|
+
* - Story title/description contains project keywords
|
|
1076
|
+
* - Story tags include project name
|
|
1077
|
+
* - Story implementation references project folder
|
|
1078
|
+
*/
|
|
1079
|
+
private filterRelevantUserStories(
|
|
1080
|
+
spec: SpecContent,
|
|
1081
|
+
projectName: string
|
|
1082
|
+
): UserStory[] {
|
|
1083
|
+
if (!spec.metadata.userStories) {
|
|
1084
|
+
return [];
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
const projectKeywords = projectName.toLowerCase().split(/[-_\s]/);
|
|
1088
|
+
|
|
1089
|
+
return spec.metadata.userStories.filter(story => {
|
|
1090
|
+
const storyText = `${story.title} ${story.description || ''}`.toLowerCase();
|
|
1091
|
+
|
|
1092
|
+
// Check if story mentions this project
|
|
1093
|
+
const mentionsProject = projectKeywords.some(keyword =>
|
|
1094
|
+
storyText.includes(keyword)
|
|
1095
|
+
);
|
|
1096
|
+
|
|
1097
|
+
// If story doesn't mention any specific project, include it (shared story)
|
|
1098
|
+
const isShared = !storyText.match(/\b(frontend|backend|mobile|infra|platform)\b/);
|
|
1099
|
+
|
|
1100
|
+
return mentionsProject || isShared;
|
|
1101
|
+
});
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
/**
|
|
1105
|
+
* Enhanced syncUserStories with optional extra labels
|
|
1106
|
+
*/
|
|
1107
|
+
private async syncUserStories(
|
|
1108
|
+
owner: string,
|
|
1109
|
+
repo: string,
|
|
1110
|
+
projectNumber: number,
|
|
1111
|
+
spec: SpecContent,
|
|
1112
|
+
extraLabels: string[] = []
|
|
1113
|
+
): Promise<{ created: string[]; updated: string[]; deleted: string[] }> {
|
|
1114
|
+
const created: string[] = [];
|
|
1115
|
+
const updated: string[] = [];
|
|
1116
|
+
const deleted: string[] = [];
|
|
1117
|
+
|
|
1118
|
+
if (!spec.metadata.userStories || spec.metadata.userStories.length === 0) {
|
|
1119
|
+
console.log(' ℹ️ No user stories to sync');
|
|
1120
|
+
return { created, updated, deleted };
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
console.log(` Syncing ${spec.metadata.userStories.length} user stories...`);
|
|
1124
|
+
|
|
1125
|
+
for (const us of spec.metadata.userStories) {
|
|
1126
|
+
// Create or update issue for each user story
|
|
1127
|
+
const issueTitle = `[${us.id}] ${us.title}`;
|
|
1128
|
+
const issueBody = this.generateIssueBody(us);
|
|
1129
|
+
|
|
1130
|
+
// Check if issue already exists (by title pattern)
|
|
1131
|
+
const existingIssue = await this.findIssueByTitle(owner, repo, us.id);
|
|
1132
|
+
|
|
1133
|
+
const labels = [
|
|
1134
|
+
'user-story',
|
|
1135
|
+
`spec:${spec.metadata.id}`,
|
|
1136
|
+
`priority:${us.priority}`,
|
|
1137
|
+
...extraLabels
|
|
1138
|
+
];
|
|
1139
|
+
|
|
1140
|
+
if (existingIssue) {
|
|
1141
|
+
// UPDATE existing issue
|
|
1142
|
+
await this.updateIssue(owner, repo, existingIssue.number, {
|
|
1143
|
+
title: issueTitle,
|
|
1144
|
+
body: issueBody,
|
|
1145
|
+
state: us.status === 'done' ? 'closed' : 'open'
|
|
1146
|
+
});
|
|
1147
|
+
|
|
1148
|
+
updated.push(us.id);
|
|
1149
|
+
console.log(` ✅ Updated ${us.id}`);
|
|
1150
|
+
} else {
|
|
1151
|
+
// CREATE new issue
|
|
1152
|
+
const newIssue = await this.createIssue(owner, repo, {
|
|
1153
|
+
title: issueTitle,
|
|
1154
|
+
body: issueBody,
|
|
1155
|
+
labels
|
|
1156
|
+
});
|
|
1157
|
+
|
|
1158
|
+
created.push(us.id);
|
|
1159
|
+
console.log(` ✅ Created ${us.id} → Issue #${newIssue.number}`);
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
return { created, updated, deleted };
|
|
1164
|
+
}
|
|
1165
|
+
|
|
630
1166
|
/**
|
|
631
1167
|
* Detect GitHub repository from git remote
|
|
632
1168
|
*/
|