specweave 1.0.350 → 1.0.352
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 +9 -0
- package/dist/plugins/specweave-ado/lib/ado-client-v2.d.ts +5 -0
- package/dist/plugins/specweave-ado/lib/ado-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-client-v2.js +61 -23
- package/dist/plugins/specweave-ado/lib/ado-client-v2.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-duplicate-detector.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-duplicate-detector.js +3 -2
- package/dist/plugins/specweave-ado/lib/ado-duplicate-detector.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-profile-resolver.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-profile-resolver.js +2 -1
- package/dist/plugins/specweave-ado/lib/ado-profile-resolver.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-sync.d.ts +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-sync.js +25 -9
- package/dist/plugins/specweave-ado/lib/ado-spec-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/conflict-resolver.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/conflict-resolver.js +17 -1
- package/dist/plugins/specweave-ado/lib/conflict-resolver.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/per-us-sync.d.ts +3 -0
- package/dist/plugins/specweave-ado/lib/per-us-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/per-us-sync.js +14 -1
- package/dist/plugins/specweave-ado/lib/per-us-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +10 -7
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client.d.ts +1 -1
- package/dist/plugins/specweave-github/lib/github-client.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client.js +7 -5
- package/dist/plugins/specweave-github/lib/github-client.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-cross-repo-sync.js +13 -3
- package/dist/plugins/specweave-github/lib/github-cross-repo-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync-cli.d.ts +24 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync-cli.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync-cli.js +36 -20
- package/dist/plugins/specweave-github/lib/github-feature-sync-cli.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts +4 -2
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.js +38 -9
- package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-graphql-client.d.ts +1 -0
- package/dist/plugins/specweave-github/lib/github-graphql-client.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-graphql-client.js +32 -22
- package/dist/plugins/specweave-github/lib/github-graphql-client.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.js +144 -8
- package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-sync.d.ts +8 -1
- package/dist/plugins/specweave-github/lib/github-spec-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-sync.js +94 -24
- package/dist/plugins/specweave-github/lib/github-spec-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-sync-orchestrator.d.ts +1 -0
- package/dist/plugins/specweave-github/lib/github-sync-orchestrator.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-sync-orchestrator.js +2 -1
- package/dist/plugins/specweave-github/lib/github-sync-orchestrator.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-us-auto-closer.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-us-auto-closer.js +25 -0
- package/dist/plugins/specweave-github/lib/github-us-auto-closer.js.map +1 -1
- package/dist/plugins/specweave-github/lib/per-us-sync.d.ts +3 -0
- package/dist/plugins/specweave-github/lib/per-us-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/per-us-sync.js +29 -9
- package/dist/plugins/specweave-github/lib/per-us-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/content-format-adapter.d.ts +59 -0
- package/dist/plugins/specweave-jira/lib/content-format-adapter.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/content-format-adapter.js +159 -0
- package/dist/plugins/specweave-jira/lib/content-format-adapter.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-deployment-detector.d.ts +45 -0
- package/dist/plugins/specweave-jira/lib/jira-deployment-detector.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-deployment-detector.js +92 -0
- package/dist/plugins/specweave-jira/lib/jira-deployment-detector.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-duplicate-detector.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-duplicate-detector.js +13 -28
- package/dist/plugins/specweave-jira/lib/jira-duplicate-detector.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-epic-sync.d.ts +2 -1
- package/dist/plugins/specweave-jira/lib/jira-epic-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-epic-sync.js +19 -7
- package/dist/plugins/specweave-jira/lib/jira-epic-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-field-discovery.d.ts +47 -0
- package/dist/plugins/specweave-jira/lib/jira-field-discovery.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-field-discovery.js +110 -0
- package/dist/plugins/specweave-jira/lib/jira-field-discovery.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-paginated-search.d.ts +26 -0
- package/dist/plugins/specweave-jira/lib/jira-paginated-search.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-paginated-search.js +77 -0
- package/dist/plugins/specweave-jira/lib/jira-paginated-search.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.js +5 -3
- package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.d.ts +17 -2
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.js +103 -33
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts +4 -0
- package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-status-sync.js +19 -6
- package/dist/plugins/specweave-jira/lib/jira-status-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/metadata-paths.d.ts +29 -0
- package/dist/plugins/specweave-jira/lib/metadata-paths.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/metadata-paths.js +73 -0
- package/dist/plugins/specweave-jira/lib/metadata-paths.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/reorganization-detector.d.ts +15 -2
- package/dist/plugins/specweave-jira/lib/reorganization-detector.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/reorganization-detector.js +121 -33
- package/dist/plugins/specweave-jira/lib/reorganization-detector.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +23 -18
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/sync-progress.d.ts +6 -0
- package/dist/src/cli/commands/sync-progress.d.ts.map +1 -1
- package/dist/src/cli/commands/sync-progress.js +37 -0
- package/dist/src/cli/commands/sync-progress.js.map +1 -1
- package/dist/src/cli/commands/sync-task.d.ts +16 -0
- package/dist/src/cli/commands/sync-task.d.ts.map +1 -0
- package/dist/src/cli/commands/sync-task.js +42 -0
- package/dist/src/cli/commands/sync-task.js.map +1 -0
- package/dist/src/cli/helpers/init/instruction-file-merger.js +3 -3
- package/dist/src/cli/helpers/init/instruction-file-merger.js.map +1 -1
- package/dist/src/core/hooks/LifecycleHookDispatcher.d.ts +9 -1
- package/dist/src/core/hooks/LifecycleHookDispatcher.d.ts.map +1 -1
- package/dist/src/core/hooks/LifecycleHookDispatcher.js +26 -8
- package/dist/src/core/hooks/LifecycleHookDispatcher.js.map +1 -1
- package/dist/src/core/increment/metadata-manager.d.ts +13 -0
- package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +144 -17
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.d.ts +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.d.ts.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.js +2 -1
- package/dist/src/core/increment/status-change-sync-trigger.js.map +1 -1
- package/dist/src/core/increment/status-commands.d.ts.map +1 -1
- package/dist/src/core/increment/status-commands.js +33 -11
- package/dist/src/core/increment/status-commands.js.map +1 -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 +2 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/locales/de/cli.json +252 -77
- package/dist/src/locales/en/cli.json +7 -0
- package/dist/src/locales/es/cli.json +245 -3
- package/dist/src/locales/fr/cli.json +259 -84
- package/dist/src/locales/ja/cli.json +253 -78
- package/dist/src/locales/ko/cli.json +253 -78
- package/dist/src/locales/pt/cli.json +252 -77
- package/dist/src/locales/ru/cli.json +17 -3
- package/dist/src/locales/zh/cli.json +258 -83
- package/dist/src/sync/ado-reconciler.d.ts.map +1 -1
- package/dist/src/sync/ado-reconciler.js +5 -1
- package/dist/src/sync/ado-reconciler.js.map +1 -1
- package/dist/src/sync/base-reconciler.d.ts.map +1 -1
- package/dist/src/sync/base-reconciler.js +6 -1
- package/dist/src/sync/base-reconciler.js.map +1 -1
- package/dist/src/sync/config.d.ts +4 -0
- package/dist/src/sync/config.d.ts.map +1 -1
- package/dist/src/sync/config.js +6 -4
- package/dist/src/sync/config.js.map +1 -1
- package/dist/src/sync/external-issue-auto-creator.d.ts +3 -0
- package/dist/src/sync/external-issue-auto-creator.d.ts.map +1 -1
- package/dist/src/sync/external-issue-auto-creator.js +53 -17
- package/dist/src/sync/external-issue-auto-creator.js.map +1 -1
- package/dist/src/sync/external-item-sync-service.d.ts +9 -0
- package/dist/src/sync/external-item-sync-service.d.ts.map +1 -1
- package/dist/src/sync/external-item-sync-service.js +210 -9
- package/dist/src/sync/external-item-sync-service.js.map +1 -1
- package/dist/src/sync/github-reconciler.d.ts +30 -0
- package/dist/src/sync/github-reconciler.d.ts.map +1 -1
- package/dist/src/sync/github-reconciler.js +242 -3
- package/dist/src/sync/github-reconciler.js.map +1 -1
- package/dist/src/sync/jira-reconciler.d.ts.map +1 -1
- package/dist/src/sync/jira-reconciler.js +5 -1
- package/dist/src/sync/jira-reconciler.js.map +1 -1
- package/dist/src/sync/provider-router.d.ts.map +1 -1
- package/dist/src/sync/provider-router.js +2 -1
- package/dist/src/sync/provider-router.js.map +1 -1
- package/dist/src/sync/providers/ado.d.ts +4 -0
- package/dist/src/sync/providers/ado.d.ts.map +1 -1
- package/dist/src/sync/providers/ado.js +36 -11
- package/dist/src/sync/providers/ado.js.map +1 -1
- package/dist/src/sync/providers/github.d.ts.map +1 -1
- package/dist/src/sync/providers/github.js +48 -35
- package/dist/src/sync/providers/github.js.map +1 -1
- package/dist/src/sync/providers/jira.d.ts.map +1 -1
- package/dist/src/sync/providers/jira.js +42 -26
- package/dist/src/sync/providers/jira.js.map +1 -1
- package/dist/src/sync/status-mapper.d.ts +3 -1
- package/dist/src/sync/status-mapper.d.ts.map +1 -1
- package/dist/src/sync/status-mapper.js +10 -2
- package/dist/src/sync/status-mapper.js.map +1 -1
- package/dist/src/sync/sync-coordinator.d.ts.map +1 -1
- package/dist/src/sync/sync-coordinator.js +29 -19
- package/dist/src/sync/sync-coordinator.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/hooks/v2/guards/task-ac-sync-guard.sh +31 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.d.ts +13 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +144 -17
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -1
- package/plugins/specweave/lib/vendor/sync/github-reconciler.d.ts +30 -0
- package/plugins/specweave/lib/vendor/sync/github-reconciler.js +242 -3
- package/plugins/specweave/lib/vendor/sync/github-reconciler.js.map +1 -1
- package/plugins/specweave/skills/architect/SKILL.md +2 -0
- package/plugins/specweave/skills/grill/SKILL.md +2 -0
- package/plugins/specweave/skills/team-lead/SKILL.md +43 -320
- package/plugins/specweave/skills/team-lead/agents/backend.md +60 -0
- package/plugins/specweave/skills/team-lead/agents/database.md +51 -0
- package/plugins/specweave/skills/team-lead/agents/frontend.md +61 -0
- package/plugins/specweave/skills/team-lead/agents/security.md +52 -0
- package/plugins/specweave/skills/team-lead/agents/testing.md +57 -0
- package/plugins/specweave/skills/test-aware-planner/SKILL.md +2 -0
- package/plugins/specweave-ado/hooks/post-task-completion.sh +2 -2
- package/plugins/specweave-ado/lib/ado-client-v2.js +51 -21
- package/plugins/specweave-ado/lib/ado-client-v2.ts +62 -23
- package/plugins/specweave-ado/lib/ado-duplicate-detector.js +4 -4
- package/plugins/specweave-ado/lib/ado-duplicate-detector.ts +4 -3
- package/plugins/specweave-ado/lib/ado-hierarchical-sync.js +54 -12
- package/plugins/specweave-ado/lib/ado-hierarchical-sync.ts +88 -18
- package/plugins/specweave-ado/lib/ado-profile-resolver.js +1 -1
- package/plugins/specweave-ado/lib/ado-profile-resolver.ts +3 -1
- package/plugins/specweave-ado/lib/ado-spec-sync.js +22 -9
- package/plugins/specweave-ado/lib/ado-spec-sync.ts +27 -9
- package/plugins/specweave-ado/lib/conflict-resolver.js +17 -1
- package/plugins/specweave-ado/lib/conflict-resolver.ts +17 -1
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +11 -1
- package/plugins/specweave-ado/lib/per-us-sync.js +8 -1
- package/plugins/specweave-ado/lib/per-us-sync.ts +17 -2
- package/plugins/specweave-github/hooks/github-auto-create-handler.sh +28 -2
- package/plugins/specweave-github/hooks/post-task-completion.sh +6 -3
- package/plugins/specweave-github/lib/enhanced-github-sync.js +35 -6
- package/plugins/specweave-github/lib/github-board-resolver.js +4 -4
- package/plugins/specweave-github/lib/github-board-resolver.ts +4 -4
- package/plugins/specweave-github/lib/github-client-v2.js +6 -6
- package/plugins/specweave-github/lib/github-client-v2.ts +11 -7
- package/plugins/specweave-github/lib/github-client.js +5 -4
- package/plugins/specweave-github/lib/github-client.ts +7 -5
- package/plugins/specweave-github/lib/github-cross-repo-sync.js +17 -3
- package/plugins/specweave-github/lib/github-cross-repo-sync.ts +16 -3
- package/plugins/specweave-github/lib/github-feature-sync-cli.js +20 -11
- package/plugins/specweave-github/lib/github-feature-sync-cli.ts +42 -20
- package/plugins/specweave-github/lib/github-feature-sync.js +32 -8
- package/plugins/specweave-github/lib/github-feature-sync.ts +41 -9
- package/plugins/specweave-github/lib/github-graphql-client.js +29 -20
- package/plugins/specweave-github/lib/github-graphql-client.ts +34 -22
- package/plugins/specweave-github/lib/github-hierarchical-sync.js +2 -2
- package/plugins/specweave-github/lib/github-hierarchical-sync.ts +2 -2
- package/plugins/specweave-github/lib/github-multi-project-sync.js +23 -7
- package/plugins/specweave-github/lib/github-multi-project-sync.ts +26 -8
- package/plugins/specweave-github/lib/github-spec-frontmatter-updater.js +110 -5
- package/plugins/specweave-github/lib/github-spec-frontmatter-updater.ts +135 -9
- package/plugins/specweave-github/lib/github-spec-sync.js +85 -24
- package/plugins/specweave-github/lib/github-spec-sync.ts +100 -26
- package/plugins/specweave-github/lib/github-sync-orchestrator.js +2 -1
- package/plugins/specweave-github/lib/github-sync-orchestrator.ts +3 -1
- package/plugins/specweave-github/lib/github-us-auto-closer.js +25 -0
- package/plugins/specweave-github/lib/github-us-auto-closer.ts +43 -0
- package/plugins/specweave-github/lib/per-us-sync.js +26 -11
- package/plugins/specweave-github/lib/per-us-sync.ts +29 -11
- package/plugins/specweave-jira/hooks/post-task-completion.sh +2 -1
- package/plugins/specweave-jira/lib/content-format-adapter.js +116 -0
- package/plugins/specweave-jira/lib/content-format-adapter.ts +189 -0
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +21 -5
- package/plugins/specweave-jira/lib/jira-deployment-detector.js +63 -0
- package/plugins/specweave-jira/lib/jira-deployment-detector.ts +113 -0
- package/plugins/specweave-jira/lib/jira-duplicate-detector.js +12 -29
- package/plugins/specweave-jira/lib/jira-duplicate-detector.ts +13 -27
- package/plugins/specweave-jira/lib/jira-epic-sync.js +15 -5
- package/plugins/specweave-jira/lib/jira-epic-sync.ts +22 -7
- package/plugins/specweave-jira/lib/jira-field-discovery.js +76 -0
- package/plugins/specweave-jira/lib/jira-field-discovery.ts +139 -0
- package/plugins/specweave-jira/lib/jira-hierarchical-sync.js +10 -0
- package/plugins/specweave-jira/lib/jira-hierarchical-sync.ts +11 -0
- package/plugins/specweave-jira/lib/jira-multi-project-sync.js +19 -9
- package/plugins/specweave-jira/lib/jira-multi-project-sync.ts +25 -14
- package/plugins/specweave-jira/lib/jira-paginated-search.js +55 -0
- package/plugins/specweave-jira/lib/jira-paginated-search.ts +108 -0
- package/plugins/specweave-jira/lib/jira-spec-commit-sync.js +5 -3
- package/plugins/specweave-jira/lib/jira-spec-commit-sync.ts +5 -3
- package/plugins/specweave-jira/lib/jira-spec-sync.js +102 -31
- package/plugins/specweave-jira/lib/jira-spec-sync.ts +123 -45
- package/plugins/specweave-jira/lib/jira-status-sync.js +18 -5
- package/plugins/specweave-jira/lib/jira-status-sync.ts +21 -6
- package/plugins/specweave-jira/lib/metadata-paths.js +38 -0
- package/plugins/specweave-jira/lib/metadata-paths.ts +73 -0
- package/plugins/specweave-jira/lib/reorganization-detector.js +101 -23
- package/plugins/specweave-jira/lib/reorganization-detector.ts +125 -35
- package/plugins/specweave-jira/scripts/refresh-cache.js +1 -1
- package/plugins/specweave-jira/scripts/refresh-cache.ts +2 -2
- package/plugins/specweave-jira/skills/jira-resource-validator/SKILL.md +3 -5
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
* Mirrors the GitHub DuplicateDetector pattern for consistency.
|
|
10
10
|
*/
|
|
11
11
|
import { consoleLogger } from '../../../src/utils/logger.js';
|
|
12
|
+
import { getApiBaseUrl } from './jira-deployment-detector.js';
|
|
13
|
+
import { toCommentBody } from './content-format-adapter.js';
|
|
12
14
|
export class JiraDuplicateDetector {
|
|
13
15
|
constructor(options = {}) {
|
|
14
16
|
this.domain = options.domain || process.env.JIRA_DOMAIN || '';
|
|
@@ -64,9 +66,9 @@ export class JiraDuplicateDetector {
|
|
|
64
66
|
catch (error) {
|
|
65
67
|
this.logger.log(`⚠️ Verification check failed: ${error.message}`);
|
|
66
68
|
return {
|
|
67
|
-
success:
|
|
69
|
+
success: false,
|
|
68
70
|
expectedCount,
|
|
69
|
-
actualCount:
|
|
71
|
+
actualCount: -1,
|
|
70
72
|
duplicates: [],
|
|
71
73
|
};
|
|
72
74
|
}
|
|
@@ -187,7 +189,7 @@ export class JiraDuplicateDetector {
|
|
|
187
189
|
throw new Error('JIRA credentials not configured');
|
|
188
190
|
}
|
|
189
191
|
const jql = encodeURIComponent(`summary ~ "${summaryPattern}" ORDER BY created ASC`);
|
|
190
|
-
const url =
|
|
192
|
+
const url = `${getApiBaseUrl(this.domain)}/search?jql=${jql}&fields=summary,status,created`;
|
|
191
193
|
const response = await fetch(url, {
|
|
192
194
|
headers: {
|
|
193
195
|
Authorization: `Basic ${this.auth}`,
|
|
@@ -223,7 +225,7 @@ export class JiraDuplicateDetector {
|
|
|
223
225
|
if (!closeTransition) {
|
|
224
226
|
throw new Error(`No close transition found. Available: ${transitions.map((t) => t.name).join(', ')}`);
|
|
225
227
|
}
|
|
226
|
-
const url =
|
|
228
|
+
const url = `${getApiBaseUrl(this.domain)}/issue/${issueKey}/transitions`;
|
|
227
229
|
const response = await fetch(url, {
|
|
228
230
|
method: 'POST',
|
|
229
231
|
headers: {
|
|
@@ -243,7 +245,7 @@ export class JiraDuplicateDetector {
|
|
|
243
245
|
* Get available transitions for an issue
|
|
244
246
|
*/
|
|
245
247
|
async getTransitions(issueKey) {
|
|
246
|
-
const url =
|
|
248
|
+
const url = `${getApiBaseUrl(this.domain)}/issue/${issueKey}/transitions`;
|
|
247
249
|
const response = await fetch(url, {
|
|
248
250
|
headers: {
|
|
249
251
|
Authorization: `Basic ${this.auth}`,
|
|
@@ -260,38 +262,21 @@ export class JiraDuplicateDetector {
|
|
|
260
262
|
* Add duplicate comment to issue
|
|
261
263
|
*/
|
|
262
264
|
async addComment(issueKey, originalKey) {
|
|
263
|
-
const url =
|
|
264
|
-
const
|
|
265
|
+
const url = `${getApiBaseUrl(this.domain)}/issue/${issueKey}/comment`;
|
|
266
|
+
const commentText = `h2. Duplicate of ${originalKey}
|
|
265
267
|
|
|
266
268
|
This issue was automatically closed by SpecWeave cleanup because it is a duplicate.
|
|
267
269
|
|
|
268
|
-
The original issue (${originalKey}) contains the same content and should be used for tracking instead
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
🤖 Auto-closed by SpecWeave Duplicate Cleanup`;
|
|
270
|
+
The original issue (${originalKey}) contains the same content and should be used for tracking instead.`;
|
|
271
|
+
// Use format adapter for correct format (ADF for Cloud, wiki for Server)
|
|
272
|
+
const body = toCommentBody(commentText, this.domain);
|
|
272
273
|
const response = await fetch(url, {
|
|
273
274
|
method: 'POST',
|
|
274
275
|
headers: {
|
|
275
276
|
Authorization: `Basic ${this.auth}`,
|
|
276
277
|
'Content-Type': 'application/json',
|
|
277
278
|
},
|
|
278
|
-
body: JSON.stringify({
|
|
279
|
-
body: {
|
|
280
|
-
type: 'doc',
|
|
281
|
-
version: 1,
|
|
282
|
-
content: [
|
|
283
|
-
{
|
|
284
|
-
type: 'paragraph',
|
|
285
|
-
content: [
|
|
286
|
-
{
|
|
287
|
-
type: 'text',
|
|
288
|
-
text: comment,
|
|
289
|
-
},
|
|
290
|
-
],
|
|
291
|
-
},
|
|
292
|
-
],
|
|
293
|
-
},
|
|
294
|
-
}),
|
|
279
|
+
body: JSON.stringify({ body }),
|
|
295
280
|
});
|
|
296
281
|
if (!response.ok) {
|
|
297
282
|
// Non-fatal, just log warning
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jira-duplicate-detector.js","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-duplicate-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAU,aAAa,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"jira-duplicate-detector.js","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-duplicate-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,8 @@ export declare class JiraEpicSync {
|
|
|
12
12
|
private client;
|
|
13
13
|
private specsDir;
|
|
14
14
|
private projectKey;
|
|
15
|
-
|
|
15
|
+
private domain;
|
|
16
|
+
constructor(client: JiraClient, specsDir: string, projectKey: string, domain?: string);
|
|
16
17
|
/**
|
|
17
18
|
* Sync Epic folder to JIRA (Epic + Stories)
|
|
18
19
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jira-epic-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-epic-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAAE,UAAU,EAA8B,MAAM,+CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"jira-epic-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-epic-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAAE,UAAU,EAA8B,MAAM,+CAA+C,CAAC;AA+DvG,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAOrF;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAC5C,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IAiGF;;OAEG;YACW,cAAc;IAyB5B;;OAEG;YACW,eAAe;IAY7B;;OAEG;YACW,kBAAkB;IAyChC;;OAEG;YACW,UAAU;IAwBxB;;OAEG;YACW,UAAU;IAcxB;;OAEG;YACW,WAAW;IAyBzB;;OAEG;YACW,WAAW;IAsBzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;YACW,gBAAgB;IAuB9B;;OAEG;YACW,2BAA2B;CAqD1C"}
|
|
@@ -10,11 +10,13 @@
|
|
|
10
10
|
import * as fs from '../../../src/utils/fs-native.js';
|
|
11
11
|
import * as path from 'path';
|
|
12
12
|
import * as yaml from 'yaml';
|
|
13
|
+
import { toDescription } from './content-format-adapter.js';
|
|
13
14
|
export class JiraEpicSync {
|
|
14
|
-
constructor(client, specsDir, projectKey) {
|
|
15
|
+
constructor(client, specsDir, projectKey, domain) {
|
|
15
16
|
this.client = client;
|
|
16
17
|
this.specsDir = specsDir;
|
|
17
18
|
this.projectKey = projectKey;
|
|
19
|
+
this.domain = domain || client['credentials']?.domain || '';
|
|
18
20
|
}
|
|
19
21
|
/**
|
|
20
22
|
* Sync Epic folder to JIRA (Epic + Stories)
|
|
@@ -93,10 +95,18 @@ export class JiraEpicSync {
|
|
|
93
95
|
* Find Epic folder by ID (FS-001 or just 001)
|
|
94
96
|
*/
|
|
95
97
|
async findEpicFolder(epicId) {
|
|
96
|
-
const normalizedId = epicId.startsWith('FS-')
|
|
97
|
-
? epicId
|
|
98
|
-
: `FS-${epicId.padStart(3, '0')}`;
|
|
99
98
|
const folders = await fs.readdir(this.specsDir);
|
|
99
|
+
// Try exact match first
|
|
100
|
+
for (const folder of folders) {
|
|
101
|
+
if (folder.startsWith(epicId)) {
|
|
102
|
+
return path.join(this.specsDir, folder);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Try with project key prefix (derived from projectKey, not hardcoded FS-)
|
|
106
|
+
const prefix = `${this.projectKey}-`;
|
|
107
|
+
const normalizedId = epicId.startsWith(prefix)
|
|
108
|
+
? epicId
|
|
109
|
+
: `${prefix}${epicId.padStart(3, '0')}`;
|
|
100
110
|
for (const folder of folders) {
|
|
101
111
|
if (folder.startsWith(normalizedId)) {
|
|
102
112
|
return path.join(this.specsDir, folder);
|
|
@@ -151,7 +161,8 @@ export class JiraEpicSync {
|
|
|
151
161
|
*/
|
|
152
162
|
async createEpic(epic) {
|
|
153
163
|
const summary = `[${epic.id}] ${epic.title}`;
|
|
154
|
-
const
|
|
164
|
+
const rawDescription = `Epic: ${epic.title}\n\nProgress: ${epic.completed_increments}/${epic.total_increments} increments (${epic.progress})\n\nPriority: ${epic.priority}\nStatus: ${epic.status}`;
|
|
165
|
+
const description = toDescription(rawDescription, this.domain);
|
|
155
166
|
const issueData = {
|
|
156
167
|
issueType: 'Epic',
|
|
157
168
|
summary,
|
|
@@ -162,7 +173,7 @@ export class JiraEpicSync {
|
|
|
162
173
|
const issue = await this.client.createIssue(issueData, this.projectKey);
|
|
163
174
|
return {
|
|
164
175
|
key: issue.key,
|
|
165
|
-
url: issue.self.replace(
|
|
176
|
+
url: issue.self.replace(/\/rest\/api\/\d+\/issue\//, '/browse/'),
|
|
166
177
|
};
|
|
167
178
|
}
|
|
168
179
|
/**
|
|
@@ -170,7 +181,8 @@ export class JiraEpicSync {
|
|
|
170
181
|
*/
|
|
171
182
|
async updateEpic(epicKey, epic) {
|
|
172
183
|
const summary = `[${epic.id}] ${epic.title}`;
|
|
173
|
-
const
|
|
184
|
+
const rawDescription = `Epic: ${epic.title}\n\nProgress: ${epic.completed_increments}/${epic.total_increments} increments (${epic.progress})\n\nPriority: ${epic.priority}\nStatus: ${epic.status}`;
|
|
185
|
+
const description = toDescription(rawDescription, this.domain);
|
|
174
186
|
await this.client.updateIssue({
|
|
175
187
|
key: epicKey,
|
|
176
188
|
summary,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jira-epic-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-epic-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,iCAAiC,CAAC;AACtD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"jira-epic-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-epic-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JIRA Field Discovery
|
|
3
|
+
*
|
|
4
|
+
* Dynamically discovers custom field IDs (e.g., Epic Link) and
|
|
5
|
+
* detects project style (Next-gen vs Classic).
|
|
6
|
+
*
|
|
7
|
+
* Results are cached per domain/project to avoid repeated lookups.
|
|
8
|
+
*
|
|
9
|
+
* @module jira-field-discovery
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Discover the Epic Link custom field ID by querying /rest/api/field.
|
|
13
|
+
* Searches for fields with name "Epic Link" or schema type "com.pyxis.greenhopper.jira:gh-epic-link".
|
|
14
|
+
*
|
|
15
|
+
* @returns The custom field ID (e.g., "customfield_10014") or null if not found
|
|
16
|
+
*/
|
|
17
|
+
export declare function discoverEpicLinkField(domain: string, auth: {
|
|
18
|
+
email: string;
|
|
19
|
+
apiToken: string;
|
|
20
|
+
}): Promise<string | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Detect whether a JIRA project uses Next-gen (Team-managed) or Classic (Company-managed) style.
|
|
23
|
+
*
|
|
24
|
+
* Next-gen projects use `parent` field for epic linking.
|
|
25
|
+
* Classic projects use a custom field (Epic Link).
|
|
26
|
+
*/
|
|
27
|
+
export declare function detectProjectStyle(domain: string, projectKey: string, auth: {
|
|
28
|
+
email: string;
|
|
29
|
+
apiToken: string;
|
|
30
|
+
}): Promise<'next-gen' | 'classic'>;
|
|
31
|
+
/**
|
|
32
|
+
* Get the correct field name/ID for linking an issue to an epic,
|
|
33
|
+
* based on project style.
|
|
34
|
+
*
|
|
35
|
+
* - Next-gen: uses `parent` field
|
|
36
|
+
* - Classic: uses the discovered Epic Link custom field ID
|
|
37
|
+
*/
|
|
38
|
+
export declare function getEpicLinkFieldForProject(domain: string, projectKey: string, auth: {
|
|
39
|
+
email: string;
|
|
40
|
+
apiToken: string;
|
|
41
|
+
}): Promise<{
|
|
42
|
+
field: 'parent' | string;
|
|
43
|
+
style: 'next-gen' | 'classic';
|
|
44
|
+
}>;
|
|
45
|
+
/** Clear caches (for testing) */
|
|
46
|
+
export declare function clearFieldDiscoveryCache(): void;
|
|
47
|
+
//# sourceMappingURL=jira-field-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-field-discovery.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-field-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgCxB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CA+BjC;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAAC;IAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,GAAG,SAAS,CAAA;CAAE,CAAC,CAetE;AAED,iCAAiC;AACjC,wBAAgB,wBAAwB,IAAI,IAAI,CAG/C"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JIRA Field Discovery
|
|
3
|
+
*
|
|
4
|
+
* Dynamically discovers custom field IDs (e.g., Epic Link) and
|
|
5
|
+
* detects project style (Next-gen vs Classic).
|
|
6
|
+
*
|
|
7
|
+
* Results are cached per domain/project to avoid repeated lookups.
|
|
8
|
+
*
|
|
9
|
+
* @module jira-field-discovery
|
|
10
|
+
*/
|
|
11
|
+
import axios from 'axios';
|
|
12
|
+
import { getApiBaseUrl } from './jira-deployment-detector.js';
|
|
13
|
+
/** Cache: domain → epic link field ID */
|
|
14
|
+
const epicLinkFieldCache = new Map();
|
|
15
|
+
/** Cache: projectKey → project style */
|
|
16
|
+
const projectStyleCache = new Map();
|
|
17
|
+
/**
|
|
18
|
+
* Discover the Epic Link custom field ID by querying /rest/api/field.
|
|
19
|
+
* Searches for fields with name "Epic Link" or schema type "com.pyxis.greenhopper.jira:gh-epic-link".
|
|
20
|
+
*
|
|
21
|
+
* @returns The custom field ID (e.g., "customfield_10014") or null if not found
|
|
22
|
+
*/
|
|
23
|
+
export async function discoverEpicLinkField(domain, auth) {
|
|
24
|
+
// Check cache
|
|
25
|
+
const cached = epicLinkFieldCache.get(domain);
|
|
26
|
+
if (cached !== undefined)
|
|
27
|
+
return cached;
|
|
28
|
+
try {
|
|
29
|
+
const baseUrl = getApiBaseUrl(domain);
|
|
30
|
+
const response = await axios.get(`${baseUrl}/field`, {
|
|
31
|
+
auth: {
|
|
32
|
+
username: auth.email,
|
|
33
|
+
password: auth.apiToken,
|
|
34
|
+
},
|
|
35
|
+
headers: { Accept: 'application/json' },
|
|
36
|
+
timeout: 10000,
|
|
37
|
+
});
|
|
38
|
+
const fields = response.data;
|
|
39
|
+
// Find Epic Link field by name or schema
|
|
40
|
+
const epicLinkField = fields.find((f) => f.name === 'Epic Link' ||
|
|
41
|
+
f.schema?.custom === 'com.pyxis.greenhopper.jira:gh-epic-link');
|
|
42
|
+
const fieldId = epicLinkField?.id || null;
|
|
43
|
+
epicLinkFieldCache.set(domain, fieldId);
|
|
44
|
+
return fieldId;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
epicLinkFieldCache.set(domain, null);
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Detect whether a JIRA project uses Next-gen (Team-managed) or Classic (Company-managed) style.
|
|
53
|
+
*
|
|
54
|
+
* Next-gen projects use `parent` field for epic linking.
|
|
55
|
+
* Classic projects use a custom field (Epic Link).
|
|
56
|
+
*/
|
|
57
|
+
export async function detectProjectStyle(domain, projectKey, auth) {
|
|
58
|
+
const cacheKey = `${domain}:${projectKey}`;
|
|
59
|
+
const cached = projectStyleCache.get(cacheKey);
|
|
60
|
+
if (cached)
|
|
61
|
+
return cached;
|
|
62
|
+
try {
|
|
63
|
+
const baseUrl = getApiBaseUrl(domain);
|
|
64
|
+
const response = await axios.get(`${baseUrl}/project/${projectKey}`, {
|
|
65
|
+
auth: {
|
|
66
|
+
username: auth.email,
|
|
67
|
+
password: auth.apiToken,
|
|
68
|
+
},
|
|
69
|
+
headers: { Accept: 'application/json' },
|
|
70
|
+
timeout: 10000,
|
|
71
|
+
});
|
|
72
|
+
const project = response.data;
|
|
73
|
+
// Next-gen projects have style: "next-gen" or projectTypeKey: "software" with simplified: true
|
|
74
|
+
const isNextGen = project.style === 'next-gen' ||
|
|
75
|
+
project.simplified === true;
|
|
76
|
+
const style = isNextGen ? 'next-gen' : 'classic';
|
|
77
|
+
projectStyleCache.set(cacheKey, style);
|
|
78
|
+
return style;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Default to classic if detection fails
|
|
82
|
+
projectStyleCache.set(cacheKey, 'classic');
|
|
83
|
+
return 'classic';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get the correct field name/ID for linking an issue to an epic,
|
|
88
|
+
* based on project style.
|
|
89
|
+
*
|
|
90
|
+
* - Next-gen: uses `parent` field
|
|
91
|
+
* - Classic: uses the discovered Epic Link custom field ID
|
|
92
|
+
*/
|
|
93
|
+
export async function getEpicLinkFieldForProject(domain, projectKey, auth) {
|
|
94
|
+
const style = await detectProjectStyle(domain, projectKey, auth);
|
|
95
|
+
if (style === 'next-gen') {
|
|
96
|
+
return { field: 'parent', style };
|
|
97
|
+
}
|
|
98
|
+
const epicLinkFieldId = await discoverEpicLinkField(domain, auth);
|
|
99
|
+
if (!epicLinkFieldId) {
|
|
100
|
+
throw new Error(`Could not discover Epic Link custom field for ${domain}. ` +
|
|
101
|
+
`Ensure the JIRA instance has the Epic Link field and API credentials have field read access.`);
|
|
102
|
+
}
|
|
103
|
+
return { field: epicLinkFieldId, style };
|
|
104
|
+
}
|
|
105
|
+
/** Clear caches (for testing) */
|
|
106
|
+
export function clearFieldDiscoveryCache() {
|
|
107
|
+
epicLinkFieldCache.clear();
|
|
108
|
+
projectStyleCache.clear();
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=jira-field-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-field-discovery.js","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-field-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JIRA Paginated Search with Rate-Limit Retry
|
|
3
|
+
*
|
|
4
|
+
* Provides a paginated JQL search that fetches all results
|
|
5
|
+
* by iterating through pages using startAt/maxResults.
|
|
6
|
+
*
|
|
7
|
+
* Includes exponential backoff retry on HTTP 429 (rate limit).
|
|
8
|
+
*
|
|
9
|
+
* @module jira-paginated-search
|
|
10
|
+
*/
|
|
11
|
+
import { AxiosInstance } from 'axios';
|
|
12
|
+
export interface PaginatedSearchOptions {
|
|
13
|
+
jql: string;
|
|
14
|
+
fields?: string;
|
|
15
|
+
maxResults?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Search all issues matching a JQL query with full pagination.
|
|
19
|
+
* Handles rate limiting with exponential backoff.
|
|
20
|
+
*
|
|
21
|
+
* @param client - Axios instance configured with JIRA auth
|
|
22
|
+
* @param options - Search options (jql, fields, maxResults per page)
|
|
23
|
+
* @returns All matching issues across all pages
|
|
24
|
+
*/
|
|
25
|
+
export declare function searchAllIssues(client: AxiosInstance, options: PaginatedSearchOptions): Promise<any[]>;
|
|
26
|
+
//# sourceMappingURL=jira-paginated-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-paginated-search.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-paginated-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAc,EAAE,aAAa,EAAc,MAAM,OAAO,CAAC;AAMzD,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,GAAG,EAAE,CAAC,CA4BhB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JIRA Paginated Search with Rate-Limit Retry
|
|
3
|
+
*
|
|
4
|
+
* Provides a paginated JQL search that fetches all results
|
|
5
|
+
* by iterating through pages using startAt/maxResults.
|
|
6
|
+
*
|
|
7
|
+
* Includes exponential backoff retry on HTTP 429 (rate limit).
|
|
8
|
+
*
|
|
9
|
+
* @module jira-paginated-search
|
|
10
|
+
*/
|
|
11
|
+
const DEFAULT_PAGE_SIZE = 50;
|
|
12
|
+
const MAX_RETRIES = 3;
|
|
13
|
+
const BASE_DELAY_MS = 1000;
|
|
14
|
+
/**
|
|
15
|
+
* Search all issues matching a JQL query with full pagination.
|
|
16
|
+
* Handles rate limiting with exponential backoff.
|
|
17
|
+
*
|
|
18
|
+
* @param client - Axios instance configured with JIRA auth
|
|
19
|
+
* @param options - Search options (jql, fields, maxResults per page)
|
|
20
|
+
* @returns All matching issues across all pages
|
|
21
|
+
*/
|
|
22
|
+
export async function searchAllIssues(client, options) {
|
|
23
|
+
const { jql, fields, maxResults = DEFAULT_PAGE_SIZE } = options;
|
|
24
|
+
const allIssues = [];
|
|
25
|
+
let startAt = 0;
|
|
26
|
+
let total = Infinity;
|
|
27
|
+
while (startAt < total) {
|
|
28
|
+
const response = await requestWithRetry(client, '/search', {
|
|
29
|
+
params: {
|
|
30
|
+
jql,
|
|
31
|
+
startAt,
|
|
32
|
+
maxResults,
|
|
33
|
+
...(fields ? { fields } : {}),
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
const data = response.data;
|
|
37
|
+
total = data.total;
|
|
38
|
+
const issues = data.issues || [];
|
|
39
|
+
allIssues.push(...issues);
|
|
40
|
+
startAt += issues.length;
|
|
41
|
+
// Safety: if no issues returned, break to avoid infinite loop
|
|
42
|
+
if (issues.length === 0)
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
return allIssues;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Make an HTTP GET request with exponential backoff retry on 429.
|
|
49
|
+
*/
|
|
50
|
+
async function requestWithRetry(client, url, config, attempt = 0) {
|
|
51
|
+
try {
|
|
52
|
+
return await client.get(url, config);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const axiosError = error;
|
|
56
|
+
const status = axiosError.response?.status;
|
|
57
|
+
if (status === 429 && attempt < MAX_RETRIES) {
|
|
58
|
+
// Read Retry-After header (seconds) or use exponential backoff
|
|
59
|
+
const retryAfterHeader = axiosError.response?.headers?.['retry-after'];
|
|
60
|
+
const retryAfterMs = retryAfterHeader
|
|
61
|
+
? parseInt(retryAfterHeader, 10) * 1000
|
|
62
|
+
: BASE_DELAY_MS * Math.pow(2, attempt);
|
|
63
|
+
console.warn(`Rate limited (429). Retry ${attempt + 1}/${MAX_RETRIES} after ${retryAfterMs}ms...`);
|
|
64
|
+
await sleep(retryAfterMs);
|
|
65
|
+
return requestWithRetry(client, url, config, attempt + 1);
|
|
66
|
+
}
|
|
67
|
+
if (status === 429) {
|
|
68
|
+
throw new Error(`JIRA rate limit exceeded after ${MAX_RETRIES} retries. ` +
|
|
69
|
+
`Try again later or reduce request frequency.`);
|
|
70
|
+
}
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function sleep(ms) {
|
|
75
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=jira-paginated-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-paginated-search.js","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-paginated-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,IAAI,CAAC;AAQ3B;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAqB,EACrB,OAA+B;IAE/B,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,GAAG,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAChE,MAAM,SAAS,GAAU,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,KAAK,GAAG,QAAQ,CAAC;IAErB,OAAO,OAAO,GAAG,KAAK,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE;YACzD,MAAM,EAAE;gBACN,GAAG;gBACH,OAAO;gBACP,UAAU;gBACV,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9B;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QAE1B,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC;QAEzB,8DAA8D;QAC9D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;IACjC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC7B,MAAqB,EACrB,GAAW,EACX,MAAW,EACX,UAAkB,CAAC;IAEnB,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,KAAmB,CAAC;QACvC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;QAE3C,IAAI,MAAM,KAAK,GAAG,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;YAC5C,+DAA+D;YAC/D,MAAM,gBAAgB,GAAG,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,CAAC;YACvE,MAAM,YAAY,GAAG,gBAAgB;gBACnC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,GAAG,IAAI;gBACvC,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAEzC,OAAO,CAAC,IAAI,CACV,6BAA6B,OAAO,GAAG,CAAC,IAAI,WAAW,UAAU,YAAY,OAAO,CACrF,CAAC;YAEF,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;YAC1B,OAAO,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,kCAAkC,WAAW,YAAY;gBACzD,8CAA8C,CAC/C,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jira-spec-commit-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-spec-commit-sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAOL,SAAS,EACT,aAAa,EAEd,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAIL,SAAS,EACV,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"jira-spec-commit-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-spec-commit-sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAOL,SAAS,EACT,aAAa,EAEd,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAIL,SAAS,EACV,MAAM,6CAA6C,CAAC;AAcrD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,WAAW,EAAE,SAAS,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAiNrB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,SAAS,EAAE,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,EACnB,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,OAAO,CAAC,CAgDlB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CASlB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB"}
|
|
@@ -8,6 +8,8 @@ import axios from 'axios';
|
|
|
8
8
|
import { getRecentCommits, detectRepository, getCommitUrl, findPRForCommit, getLastSyncCommit, updateLastSyncCommit, } from '../../../src/utils/git-utils.js';
|
|
9
9
|
import { getSpecTaskMapping, getCompletedUserStories, } from '../../../src/core/specs/spec-task-mapper.js';
|
|
10
10
|
import { buildUserStoryComment, buildCommitBatchComment, buildShortComment, generateSmartSummary, formatForJira, } from '../../../src/core/comment-builder.js';
|
|
11
|
+
import { readIssueKey } from './metadata-paths.js';
|
|
12
|
+
import { getApiBaseUrl } from './jira-deployment-detector.js';
|
|
11
13
|
import path from 'path';
|
|
12
14
|
import fs from 'fs/promises';
|
|
13
15
|
/**
|
|
@@ -33,7 +35,7 @@ export async function syncSpecCommitsToJira(config, options) {
|
|
|
33
35
|
result.errors.push('No metadata.json found');
|
|
34
36
|
return result;
|
|
35
37
|
}
|
|
36
|
-
const jiraIssueKey = metadata
|
|
38
|
+
const jiraIssueKey = readIssueKey(metadata);
|
|
37
39
|
if (!jiraIssueKey) {
|
|
38
40
|
if (verbose) {
|
|
39
41
|
console.log('No JIRA issue linked to increment');
|
|
@@ -42,7 +44,7 @@ export async function syncSpecCommitsToJira(config, options) {
|
|
|
42
44
|
}
|
|
43
45
|
// 2. Create JIRA client
|
|
44
46
|
const client = axios.create({
|
|
45
|
-
baseURL:
|
|
47
|
+
baseURL: getApiBaseUrl(config.domain),
|
|
46
48
|
auth: {
|
|
47
49
|
username: config.email,
|
|
48
50
|
password: config.apiToken,
|
|
@@ -208,7 +210,7 @@ export async function syncSpecCommitsToJira(config, options) {
|
|
|
208
210
|
export async function postCommitBatchUpdate(config, incrementPath, commits, issueKey, repo, dryRun = false) {
|
|
209
211
|
try {
|
|
210
212
|
const client = axios.create({
|
|
211
|
-
baseURL:
|
|
213
|
+
baseURL: getApiBaseUrl(config.domain),
|
|
212
214
|
auth: {
|
|
213
215
|
username: config.email,
|
|
214
216
|
password: config.apiToken,
|