specweave 0.23.8 → 0.23.12

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.
Files changed (130) hide show
  1. package/.claude-plugin/marketplace.json +7 -7
  2. package/CLAUDE.md +391 -1338
  3. package/dist/src/cli/commands/cleanup-cache.d.ts +14 -0
  4. package/dist/src/cli/commands/cleanup-cache.d.ts.map +1 -0
  5. package/dist/src/cli/commands/cleanup-cache.js +63 -0
  6. package/dist/src/cli/commands/cleanup-cache.js.map +1 -0
  7. package/dist/src/cli/commands/init.js +40 -0
  8. package/dist/src/cli/commands/init.js.map +1 -1
  9. package/dist/src/cli/commands/migrate-config.d.ts +22 -0
  10. package/dist/src/cli/commands/migrate-config.d.ts.map +1 -0
  11. package/dist/src/cli/commands/migrate-config.js +149 -0
  12. package/dist/src/cli/commands/migrate-config.js.map +1 -0
  13. package/dist/src/cli/helpers/async-project-loader.d.ts +148 -0
  14. package/dist/src/cli/helpers/async-project-loader.d.ts.map +1 -0
  15. package/dist/src/cli/helpers/async-project-loader.js +351 -0
  16. package/dist/src/cli/helpers/async-project-loader.js.map +1 -0
  17. package/dist/src/cli/helpers/cancelation-handler.d.ts +123 -0
  18. package/dist/src/cli/helpers/cancelation-handler.d.ts.map +1 -0
  19. package/dist/src/cli/helpers/cancelation-handler.js +187 -0
  20. package/dist/src/cli/helpers/cancelation-handler.js.map +1 -0
  21. package/dist/src/cli/helpers/import-strategy-prompter.d.ts +43 -0
  22. package/dist/src/cli/helpers/import-strategy-prompter.d.ts.map +1 -0
  23. package/dist/src/cli/helpers/import-strategy-prompter.js +136 -0
  24. package/dist/src/cli/helpers/import-strategy-prompter.js.map +1 -0
  25. package/dist/src/cli/helpers/issue-tracker/ado.d.ts +5 -2
  26. package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
  27. package/dist/src/cli/helpers/issue-tracker/ado.js +90 -40
  28. package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
  29. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  30. package/dist/src/cli/helpers/issue-tracker/index.js +112 -60
  31. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  32. package/dist/src/cli/helpers/issue-tracker/jira.d.ts +26 -2
  33. package/dist/src/cli/helpers/issue-tracker/jira.d.ts.map +1 -1
  34. package/dist/src/cli/helpers/issue-tracker/jira.js +197 -132
  35. package/dist/src/cli/helpers/issue-tracker/jira.js.map +1 -1
  36. package/dist/src/cli/helpers/progress-tracker.d.ts +121 -0
  37. package/dist/src/cli/helpers/progress-tracker.d.ts.map +1 -0
  38. package/dist/src/cli/helpers/progress-tracker.js +202 -0
  39. package/dist/src/cli/helpers/progress-tracker.js.map +1 -0
  40. package/dist/src/cli/helpers/project-count-fetcher.d.ts +69 -0
  41. package/dist/src/cli/helpers/project-count-fetcher.d.ts.map +1 -0
  42. package/dist/src/cli/helpers/project-count-fetcher.js +173 -0
  43. package/dist/src/cli/helpers/project-count-fetcher.js.map +1 -0
  44. package/dist/src/config/types.d.ts +14 -14
  45. package/dist/src/core/cache/cache-manager.d.ts +119 -0
  46. package/dist/src/core/cache/cache-manager.d.ts.map +1 -0
  47. package/dist/src/core/cache/cache-manager.js +304 -0
  48. package/dist/src/core/cache/cache-manager.js.map +1 -0
  49. package/dist/src/core/cache/rate-limit-checker.d.ts +92 -0
  50. package/dist/src/core/cache/rate-limit-checker.d.ts.map +1 -0
  51. package/dist/src/core/cache/rate-limit-checker.js +160 -0
  52. package/dist/src/core/cache/rate-limit-checker.js.map +1 -0
  53. package/dist/src/core/config/config-manager.d.ts +135 -0
  54. package/dist/src/core/config/config-manager.d.ts.map +1 -0
  55. package/dist/src/core/config/config-manager.js +341 -0
  56. package/dist/src/core/config/config-manager.js.map +1 -0
  57. package/dist/src/core/config/config-migrator.d.ts +102 -0
  58. package/dist/src/core/config/config-migrator.d.ts.map +1 -0
  59. package/dist/src/core/config/config-migrator.js +367 -0
  60. package/dist/src/core/config/config-migrator.js.map +1 -0
  61. package/dist/src/core/config/index.d.ts +10 -0
  62. package/dist/src/core/config/index.d.ts.map +1 -0
  63. package/dist/src/core/config/index.js +10 -0
  64. package/dist/src/core/config/index.js.map +1 -0
  65. package/dist/src/core/config/types.d.ts +216 -0
  66. package/dist/src/core/config/types.d.ts.map +1 -0
  67. package/dist/src/core/config/types.js +32 -0
  68. package/dist/src/core/config/types.js.map +1 -0
  69. package/dist/src/core/progress/cancelation-handler.d.ts +79 -0
  70. package/dist/src/core/progress/cancelation-handler.d.ts.map +1 -0
  71. package/dist/src/core/progress/cancelation-handler.js +111 -0
  72. package/dist/src/core/progress/cancelation-handler.js.map +1 -0
  73. package/dist/src/core/progress/import-state.d.ts +71 -0
  74. package/dist/src/core/progress/import-state.d.ts.map +1 -0
  75. package/dist/src/core/progress/import-state.js +96 -0
  76. package/dist/src/core/progress/import-state.js.map +1 -0
  77. package/dist/src/core/progress/progress-tracker.d.ts +139 -0
  78. package/dist/src/core/progress/progress-tracker.d.ts.map +1 -0
  79. package/dist/src/core/progress/progress-tracker.js +223 -0
  80. package/dist/src/core/progress/progress-tracker.js.map +1 -0
  81. package/dist/src/init/architecture/types.d.ts +6 -6
  82. package/dist/src/integrations/ado/ado-client.d.ts +25 -0
  83. package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
  84. package/dist/src/integrations/ado/ado-client.js +67 -0
  85. package/dist/src/integrations/ado/ado-client.js.map +1 -1
  86. package/dist/src/integrations/ado/ado-dependency-loader.d.ts +99 -0
  87. package/dist/src/integrations/ado/ado-dependency-loader.d.ts.map +1 -0
  88. package/dist/src/integrations/ado/ado-dependency-loader.js +207 -0
  89. package/dist/src/integrations/ado/ado-dependency-loader.js.map +1 -0
  90. package/dist/src/integrations/jira/jira-client.d.ts +32 -0
  91. package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
  92. package/dist/src/integrations/jira/jira-client.js +81 -0
  93. package/dist/src/integrations/jira/jira-client.js.map +1 -1
  94. package/dist/src/integrations/jira/jira-dependency-loader.d.ts +101 -0
  95. package/dist/src/integrations/jira/jira-dependency-loader.d.ts.map +1 -0
  96. package/dist/src/integrations/jira/jira-dependency-loader.js +200 -0
  97. package/dist/src/integrations/jira/jira-dependency-loader.js.map +1 -0
  98. package/dist/src/integrations/jira/jira-hierarchy-mapper.d.ts +104 -0
  99. package/dist/src/integrations/jira/jira-hierarchy-mapper.d.ts.map +1 -0
  100. package/dist/src/integrations/jira/jira-hierarchy-mapper.js +178 -0
  101. package/dist/src/integrations/jira/jira-hierarchy-mapper.js.map +1 -0
  102. package/package.json +1 -1
  103. package/plugins/specweave/.claude-plugin/plugin.json +20 -0
  104. package/plugins/specweave/agents/architect/AGENT.md +100 -602
  105. package/plugins/specweave/agents/pm/AGENT.md +96 -597
  106. package/plugins/specweave/agents/pm/AGENT.md.bak +1893 -0
  107. package/plugins/specweave/agents/pm/AGENT.md.bak2 +1754 -0
  108. package/plugins/specweave/commands/check-hooks.md +257 -0
  109. package/plugins/specweave/commands/migrate-config.md +104 -0
  110. package/plugins/specweave/hooks/post-edit-spec.sh +202 -31
  111. package/plugins/specweave/hooks/post-task-completion.sh +225 -228
  112. package/plugins/specweave/hooks/post-write-spec.sh +207 -31
  113. package/plugins/specweave/hooks/pre-edit-spec.sh +151 -0
  114. package/plugins/specweave/hooks/pre-task-completion.sh +5 -7
  115. package/plugins/specweave/hooks/pre-write-spec.sh +151 -0
  116. package/plugins/specweave/hooks/test-pretooluse-env.sh +72 -0
  117. package/plugins/specweave/skills/compliance-architecture/SKILL.md +374 -0
  118. package/plugins/specweave/skills/external-sync-wizard/SKILL.md +610 -0
  119. package/plugins/specweave/skills/pm-closure-validation/SKILL.md +541 -0
  120. package/plugins/specweave/skills/roadmap-planner/SKILL.md +473 -0
  121. package/plugins/specweave-ado/commands/refresh-cache.js +25 -0
  122. package/plugins/specweave-ado/commands/refresh-cache.ts +40 -0
  123. package/plugins/specweave-ado/hooks/post-task-completion.sh +1 -1
  124. package/plugins/specweave-github/hooks/post-task-completion.sh +1 -1
  125. package/plugins/specweave-jira/commands/refresh-cache.js +25 -0
  126. package/plugins/specweave-jira/commands/refresh-cache.ts +40 -0
  127. package/plugins/specweave-jira/hooks/post-task-completion.sh +1 -1
  128. package/plugins/specweave-kafka-streams/commands/topology.md +437 -0
  129. package/plugins/specweave-n8n/commands/workflow-template.md +262 -0
  130. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +228 -6333
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Progress Tracker
3
+ *
4
+ * Real-time progress tracking with percentage, ETA estimation, and final summary.
5
+ * Optimized for CLI workflows with throttled updates to prevent console spam.
6
+ *
7
+ * @module cli/helpers/progress-tracker
8
+ */
9
+ import chalk from 'chalk';
10
+ import { consoleLogger } from '../../utils/logger.js';
11
+ /**
12
+ * Progress Tracker
13
+ *
14
+ * Tracks batch operation progress with:
15
+ * - Real-time percentage updates
16
+ * - ETA estimation (rolling average of last 10 items)
17
+ * - Throttled console updates (every N items)
18
+ * - Final summary (succeeded/failed/skipped counts)
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const tracker = new ProgressTracker({ total: 127, updateFrequency: 5 });
23
+ *
24
+ * for (const project of projects) {
25
+ * try {
26
+ * await importProject(project);
27
+ * tracker.update(project.key, 'success');
28
+ * } catch (error) {
29
+ * tracker.update(project.key, 'failure');
30
+ * }
31
+ * }
32
+ *
33
+ * tracker.finish();
34
+ * // Output: ✅ Imported 125/127 projects (2 failed, 0 skipped) in 28s
35
+ * ```
36
+ */
37
+ export class ProgressTracker {
38
+ constructor(options) {
39
+ this.completed = 0;
40
+ this.succeeded = 0;
41
+ this.failed = 0;
42
+ this.skipped = 0;
43
+ this.itemTimestamps = []; // For ETA calculation (rolling average)
44
+ this.lastRenderedProgress = ''; // For clearing previous output
45
+ this.total = options.total;
46
+ this.updateFrequency = options.updateFrequency ?? 5;
47
+ this.showEta = options.showEta ?? true;
48
+ this.progressBarWidth = options.progressBarWidth ?? 30;
49
+ this.logger = options.logger ?? consoleLogger;
50
+ this.startTime = Date.now();
51
+ this.lastUpdateTime = this.startTime;
52
+ }
53
+ /**
54
+ * Update progress with item result
55
+ *
56
+ * @param item - Item identifier (e.g., project key)
57
+ * @param status - Item status (success, failure, skip)
58
+ */
59
+ update(item, status) {
60
+ this.completed++;
61
+ if (status === 'success') {
62
+ this.succeeded++;
63
+ }
64
+ else if (status === 'failure') {
65
+ this.failed++;
66
+ }
67
+ else if (status === 'skip') {
68
+ this.skipped++;
69
+ }
70
+ // Track timestamp for ETA calculation
71
+ const now = Date.now();
72
+ this.itemTimestamps.push(now);
73
+ // Keep only last 10 timestamps (rolling average)
74
+ if (this.itemTimestamps.length > 10) {
75
+ this.itemTimestamps.shift();
76
+ }
77
+ // Throttle updates: only render every N items
78
+ if (this.completed % this.updateFrequency === 0 || this.completed === this.total) {
79
+ this.render();
80
+ }
81
+ }
82
+ /**
83
+ * Render progress bar to console
84
+ */
85
+ render() {
86
+ const percentage = Math.floor((this.completed / this.total) * 100);
87
+ const progressBar = this.getProgressBar(percentage);
88
+ const eta = this.showEta ? this.getEta() : '';
89
+ const message = `Fetching projects... ${this.completed}/${this.total} (${percentage}%) ${progressBar}${eta}`;
90
+ // Clear previous line if needed (terminal overwrite)
91
+ if (this.lastRenderedProgress) {
92
+ process.stdout.write('\r\x1b[K'); // Clear line
93
+ }
94
+ process.stdout.write(chalk.cyan(message));
95
+ this.lastRenderedProgress = message;
96
+ }
97
+ /**
98
+ * Generate ASCII progress bar
99
+ *
100
+ * @param percentage - Completion percentage (0-100)
101
+ * @returns ASCII progress bar string
102
+ */
103
+ getProgressBar(percentage) {
104
+ const filledWidth = Math.floor((percentage / 100) * this.progressBarWidth);
105
+ const emptyWidth = this.progressBarWidth - filledWidth;
106
+ const filled = '='.repeat(Math.max(0, filledWidth - 1)) + (filledWidth > 0 ? '>' : '');
107
+ const empty = ' '.repeat(emptyWidth);
108
+ return `[${filled}${empty}]`;
109
+ }
110
+ /**
111
+ * Calculate ETA using rolling average
112
+ *
113
+ * @returns ETA string (e.g., "~2m remaining") or empty if not enough data
114
+ */
115
+ getEta() {
116
+ if (this.itemTimestamps.length < 2) {
117
+ return ''; // Not enough data yet
118
+ }
119
+ // Calculate average time per item (rolling average of last 10)
120
+ const timestamps = this.itemTimestamps;
121
+ const intervals = [];
122
+ for (let i = 1; i < timestamps.length; i++) {
123
+ intervals.push(timestamps[i] - timestamps[i - 1]);
124
+ }
125
+ const avgTimePerItem = intervals.reduce((sum, interval) => sum + interval, 0) / intervals.length;
126
+ // Calculate remaining time
127
+ const remaining = this.total - this.completed;
128
+ const estimatedMs = remaining * avgTimePerItem;
129
+ // Format ETA
130
+ const estimatedSec = Math.ceil(estimatedMs / 1000);
131
+ const elapsed = Math.floor((Date.now() - this.startTime) / 1000);
132
+ if (estimatedSec < 60) {
133
+ return ` [${elapsed}s elapsed, ~${estimatedSec}s remaining]`;
134
+ }
135
+ else {
136
+ const estimatedMin = Math.ceil(estimatedSec / 60);
137
+ return ` [${elapsed}s elapsed, ~${estimatedMin}m remaining]`;
138
+ }
139
+ }
140
+ /**
141
+ * Finish tracking and show final summary
142
+ */
143
+ finish() {
144
+ // Clear progress line
145
+ if (this.lastRenderedProgress) {
146
+ process.stdout.write('\r\x1b[K');
147
+ }
148
+ const elapsed = Math.ceil((Date.now() - this.startTime) / 1000);
149
+ const elapsedStr = elapsed < 60 ? `${elapsed}s` : `${Math.ceil(elapsed / 60)}m`;
150
+ if (this.failed === 0 && this.skipped === 0) {
151
+ // Perfect success
152
+ this.logger.log(chalk.green(`✅ Imported ${this.succeeded}/${this.total} projects in ${elapsedStr}`));
153
+ }
154
+ else {
155
+ // Partial success
156
+ const summary = `✅ Imported ${this.succeeded}/${this.total}`;
157
+ const failures = this.failed > 0 ? chalk.red(`, ${this.failed} failed`) : '';
158
+ const skips = this.skipped > 0 ? chalk.yellow(`, ${this.skipped} skipped`) : '';
159
+ this.logger.log(`${summary}${failures}${skips} in ${elapsedStr}`);
160
+ // Suggest checking error log if failures exist
161
+ if (this.failed > 0) {
162
+ this.logger.log(chalk.yellow('⚠️ Check .specweave/logs/import-errors.log for details'));
163
+ }
164
+ }
165
+ }
166
+ /**
167
+ * Cancel tracking (for use with cancelation)
168
+ */
169
+ cancel() {
170
+ // Clear progress line
171
+ if (this.lastRenderedProgress) {
172
+ process.stdout.write('\r\x1b[K');
173
+ }
174
+ const elapsed = Math.ceil((Date.now() - this.startTime) / 1000);
175
+ const percentage = Math.floor((this.completed / this.total) * 100);
176
+ this.logger.log(chalk.yellow(`⚠️ Operation canceled. Imported ${this.completed}/${this.total} projects (${percentage}% complete) in ${elapsed}s`));
177
+ }
178
+ /**
179
+ * Get current progress summary
180
+ *
181
+ * @returns Progress summary object
182
+ */
183
+ getSummary() {
184
+ return {
185
+ total: this.total,
186
+ completed: this.completed,
187
+ succeeded: this.succeeded,
188
+ failed: this.failed,
189
+ skipped: this.skipped,
190
+ elapsed: Date.now() - this.startTime
191
+ };
192
+ }
193
+ /**
194
+ * Get current percentage (for testing)
195
+ *
196
+ * @returns Completion percentage (0-100)
197
+ */
198
+ getPercentage() {
199
+ return Math.floor((this.completed / this.total) * 100);
200
+ }
201
+ }
202
+ //# sourceMappingURL=progress-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-tracker.js","sourceRoot":"","sources":["../../../../src/cli/helpers/progress-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Project Count Fetcher
3
+ *
4
+ * Lightweight query to get project count without fetching full metadata.
5
+ * Optimized for < 1 second response time with retry logic.
6
+ *
7
+ * @module cli/helpers/project-count-fetcher
8
+ */
9
+ import { Logger } from '../../utils/logger.js';
10
+ /**
11
+ * Supported issue tracker providers
12
+ */
13
+ export type ProjectProvider = 'jira' | 'ado';
14
+ /**
15
+ * Jira instance type (Cloud vs Server/Data Center)
16
+ */
17
+ export type JiraInstanceType = 'cloud' | 'server';
18
+ /**
19
+ * Jira credentials
20
+ */
21
+ export interface JiraCredentials {
22
+ domain: string;
23
+ email: string;
24
+ token: string;
25
+ instanceType: JiraInstanceType;
26
+ }
27
+ /**
28
+ * Azure DevOps credentials
29
+ */
30
+ export interface AdoCredentials {
31
+ organization: string;
32
+ pat: string;
33
+ }
34
+ /**
35
+ * Project count options
36
+ */
37
+ export interface ProjectCountOptions {
38
+ credentials: JiraCredentials | AdoCredentials;
39
+ provider: ProjectProvider;
40
+ logger?: Logger;
41
+ }
42
+ /**
43
+ * Project count result
44
+ */
45
+ export interface ProjectCountResult {
46
+ total: number;
47
+ accessible: number;
48
+ error?: string;
49
+ }
50
+ /**
51
+ * Get project count from issue tracker
52
+ *
53
+ * Performs lightweight count-only query (no metadata fetched).
54
+ * Target response time: < 1 second
55
+ *
56
+ * @param options - Project count options
57
+ * @returns Project count result
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * const result = await getProjectCount({
62
+ * credentials: { domain: 'example.atlassian.net', email: 'user@example.com', token: 'xyz', instanceType: 'cloud' },
63
+ * provider: 'jira'
64
+ * });
65
+ * console.log(`Found ${result.total} projects`);
66
+ * ```
67
+ */
68
+ export declare function getProjectCount(options: ProjectCountOptions): Promise<ProjectCountResult>;
69
+ //# sourceMappingURL=project-count-fetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-count-fetcher.d.ts","sourceRoot":"","sources":["../../../../src/cli/helpers/project-count-fetcher.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,gBAAgB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,eAAe,GAAG,cAAc,CAAC;IAC9C,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAmB7B"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Project Count Fetcher
3
+ *
4
+ * Lightweight query to get project count without fetching full metadata.
5
+ * Optimized for < 1 second response time with retry logic.
6
+ *
7
+ * @module cli/helpers/project-count-fetcher
8
+ */
9
+ import { consoleLogger } from '../../utils/logger.js';
10
+ /**
11
+ * Get project count from issue tracker
12
+ *
13
+ * Performs lightweight count-only query (no metadata fetched).
14
+ * Target response time: < 1 second
15
+ *
16
+ * @param options - Project count options
17
+ * @returns Project count result
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const result = await getProjectCount({
22
+ * credentials: { domain: 'example.atlassian.net', email: 'user@example.com', token: 'xyz', instanceType: 'cloud' },
23
+ * provider: 'jira'
24
+ * });
25
+ * console.log(`Found ${result.total} projects`);
26
+ * ```
27
+ */
28
+ export async function getProjectCount(options) {
29
+ const { provider, credentials, logger = consoleLogger } = options;
30
+ try {
31
+ if (provider === 'jira') {
32
+ return await getJiraProjectCount(credentials, logger);
33
+ }
34
+ else if (provider === 'ado') {
35
+ return await getAdoProjectCount(credentials, logger);
36
+ }
37
+ else {
38
+ throw new Error(`Unsupported provider: ${provider}`);
39
+ }
40
+ }
41
+ catch (error) {
42
+ logger.error('Error fetching project count:', error);
43
+ return {
44
+ total: 0,
45
+ accessible: 0,
46
+ error: error.message || 'Unknown error'
47
+ };
48
+ }
49
+ }
50
+ /**
51
+ * Get JIRA project count (Cloud or Server)
52
+ *
53
+ * API Endpoints:
54
+ * - Cloud: GET /rest/api/3/project/search?maxResults=0
55
+ * - Server: GET /rest/api/2/project?maxResults=0
56
+ *
57
+ * @param credentials - JIRA credentials
58
+ * @param logger - Logger instance
59
+ * @returns Project count result
60
+ */
61
+ async function getJiraProjectCount(credentials, logger) {
62
+ const { domain, email, token, instanceType } = credentials;
63
+ // Determine API endpoint based on instance type
64
+ const apiVersion = instanceType === 'cloud' ? '3' : '2';
65
+ const endpoint = instanceType === 'cloud'
66
+ ? `/rest/api/${apiVersion}/project/search?maxResults=0`
67
+ : `/rest/api/${apiVersion}/project?maxResults=0`;
68
+ const url = `https://${domain}${endpoint}`;
69
+ // Retry logic: 3 attempts with exponential backoff (1s, 2s, 4s)
70
+ const delays = [1000, 2000, 4000];
71
+ let lastError = null;
72
+ for (let attempt = 0; attempt < 3; attempt++) {
73
+ try {
74
+ const response = await fetch(url, {
75
+ method: 'GET',
76
+ headers: {
77
+ Authorization: `Basic ${Buffer.from(`${email}:${token}`).toString('base64')}`,
78
+ Accept: 'application/json',
79
+ 'Content-Type': 'application/json'
80
+ },
81
+ signal: AbortSignal.timeout(10000) // 10 second timeout
82
+ });
83
+ if (!response.ok) {
84
+ const errorBody = await response.text().catch(() => 'No error body');
85
+ throw new Error(`JIRA API error: ${response.status} ${response.statusText}. ${errorBody}`);
86
+ }
87
+ if (instanceType === 'cloud') {
88
+ // Cloud returns { total: N, values: [] }
89
+ const data = (await response.json());
90
+ return {
91
+ total: data.total,
92
+ accessible: data.total
93
+ };
94
+ }
95
+ else {
96
+ // Server returns [] with X-Total-Count header
97
+ const totalHeader = response.headers.get('X-Total-Count');
98
+ const total = totalHeader ? parseInt(totalHeader, 10) : 0;
99
+ return {
100
+ total,
101
+ accessible: total
102
+ };
103
+ }
104
+ }
105
+ catch (error) {
106
+ lastError = error;
107
+ // Don't retry on auth failures (4XX except 429)
108
+ const isAuthError = error.message && /\b40[0134]\b/.test(error.message);
109
+ if (isAuthError && !error.message.includes('429')) {
110
+ throw error;
111
+ }
112
+ // Retry on network errors or 5XX/429 errors
113
+ if (attempt < 2) {
114
+ logger.log(`Retry ${attempt + 1}/3 after ${delays[attempt]}ms...`);
115
+ await new Promise(resolve => setTimeout(resolve, delays[attempt]));
116
+ }
117
+ }
118
+ }
119
+ throw lastError || new Error('Failed to get project count after 3 attempts');
120
+ }
121
+ /**
122
+ * Get Azure DevOps project count
123
+ *
124
+ * API Endpoint:
125
+ * - GET https://dev.azure.com/{org}/_apis/projects?$top=0
126
+ *
127
+ * @param credentials - ADO credentials
128
+ * @param logger - Logger instance
129
+ * @returns Project count result
130
+ */
131
+ async function getAdoProjectCount(credentials, logger) {
132
+ const { organization, pat } = credentials;
133
+ const url = `https://dev.azure.com/${organization}/_apis/projects?$top=0&api-version=7.0`;
134
+ // Retry logic: 3 attempts with exponential backoff (1s, 2s, 4s)
135
+ const delays = [1000, 2000, 4000];
136
+ let lastError = null;
137
+ for (let attempt = 0; attempt < 3; attempt++) {
138
+ try {
139
+ const response = await fetch(url, {
140
+ method: 'GET',
141
+ headers: {
142
+ Authorization: `Basic ${Buffer.from(`:${pat}`).toString('base64')}`,
143
+ Accept: 'application/json'
144
+ },
145
+ signal: AbortSignal.timeout(10000) // 10 second timeout
146
+ });
147
+ if (!response.ok) {
148
+ const errorBody = await response.text().catch(() => 'No error body');
149
+ throw new Error(`Azure DevOps API error: ${response.status} ${response.statusText}. ${errorBody}`);
150
+ }
151
+ const data = (await response.json());
152
+ return {
153
+ total: data.count,
154
+ accessible: data.count
155
+ };
156
+ }
157
+ catch (error) {
158
+ lastError = error;
159
+ // Don't retry on auth failures (4XX except 429)
160
+ const isAuthError = error.message && /\b40[0134]\b/.test(error.message);
161
+ if (isAuthError && !error.message.includes('429')) {
162
+ throw error;
163
+ }
164
+ // Retry on network errors or 5XX/429 errors
165
+ if (attempt < 2) {
166
+ logger.log(`Retry ${attempt + 1}/3 after ${delays[attempt]}ms...`);
167
+ await new Promise(resolve => setTimeout(resolve, delays[attempt]));
168
+ }
169
+ }
170
+ }
171
+ throw lastError || new Error('Failed to get ADO project count after 3 attempts');
172
+ }
173
+ //# sourceMappingURL=project-count-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-count-fetcher.js","sourceRoot":"","sources":["../../../../src/cli/helpers/project-count-fetcher.ts"],"names":[],"mappings":"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"}
@@ -242,15 +242,15 @@ export declare const ResearchConfigSchema: z.ZodObject<{
242
242
  requirements: z.ZodOptional<z.ZodString>;
243
243
  url: z.ZodOptional<z.ZodString>;
244
244
  }, "strip", z.ZodTypeAny, {
245
+ provider?: string;
245
246
  url?: string;
246
247
  requirements?: string;
247
- provider?: string;
248
248
  amount?: string;
249
249
  duration?: string;
250
250
  }, {
251
+ provider?: string;
251
252
  url?: string;
252
253
  requirements?: string;
253
- provider?: string;
254
254
  amount?: string;
255
255
  duration?: string;
256
256
  }>, "many">;
@@ -302,9 +302,9 @@ export declare const ResearchConfigSchema: z.ZodObject<{
302
302
  at1M?: string;
303
303
  };
304
304
  cloudCredits?: {
305
+ provider?: string;
305
306
  url?: string;
306
307
  requirements?: string;
307
- provider?: string;
308
308
  amount?: string;
309
309
  duration?: string;
310
310
  }[];
@@ -330,9 +330,9 @@ export declare const ResearchConfigSchema: z.ZodObject<{
330
330
  at1M?: string;
331
331
  };
332
332
  cloudCredits?: {
333
+ provider?: string;
333
334
  url?: string;
334
335
  requirements?: string;
335
- provider?: string;
336
336
  amount?: string;
337
337
  duration?: string;
338
338
  }[];
@@ -385,9 +385,9 @@ export declare const ResearchConfigSchema: z.ZodObject<{
385
385
  at1M?: string;
386
386
  };
387
387
  cloudCredits?: {
388
+ provider?: string;
388
389
  url?: string;
389
390
  requirements?: string;
390
- provider?: string;
391
391
  amount?: string;
392
392
  duration?: string;
393
393
  }[];
@@ -476,9 +476,9 @@ export declare const ResearchConfigSchema: z.ZodObject<{
476
476
  at1M?: string;
477
477
  };
478
478
  cloudCredits?: {
479
+ provider?: string;
479
480
  url?: string;
480
481
  requirements?: string;
481
- provider?: string;
482
482
  amount?: string;
483
483
  duration?: string;
484
484
  }[];
@@ -814,15 +814,15 @@ export declare const SpecWeaveConfigSchema: z.ZodObject<{
814
814
  requirements: z.ZodOptional<z.ZodString>;
815
815
  url: z.ZodOptional<z.ZodString>;
816
816
  }, "strip", z.ZodTypeAny, {
817
+ provider?: string;
817
818
  url?: string;
818
819
  requirements?: string;
819
- provider?: string;
820
820
  amount?: string;
821
821
  duration?: string;
822
822
  }, {
823
+ provider?: string;
823
824
  url?: string;
824
825
  requirements?: string;
825
- provider?: string;
826
826
  amount?: string;
827
827
  duration?: string;
828
828
  }>, "many">;
@@ -874,9 +874,9 @@ export declare const SpecWeaveConfigSchema: z.ZodObject<{
874
874
  at1M?: string;
875
875
  };
876
876
  cloudCredits?: {
877
+ provider?: string;
877
878
  url?: string;
878
879
  requirements?: string;
879
- provider?: string;
880
880
  amount?: string;
881
881
  duration?: string;
882
882
  }[];
@@ -902,9 +902,9 @@ export declare const SpecWeaveConfigSchema: z.ZodObject<{
902
902
  at1M?: string;
903
903
  };
904
904
  cloudCredits?: {
905
+ provider?: string;
905
906
  url?: string;
906
907
  requirements?: string;
907
- provider?: string;
908
908
  amount?: string;
909
909
  duration?: string;
910
910
  }[];
@@ -957,9 +957,9 @@ export declare const SpecWeaveConfigSchema: z.ZodObject<{
957
957
  at1M?: string;
958
958
  };
959
959
  cloudCredits?: {
960
+ provider?: string;
960
961
  url?: string;
961
962
  requirements?: string;
962
- provider?: string;
963
963
  amount?: string;
964
964
  duration?: string;
965
965
  }[];
@@ -1048,9 +1048,9 @@ export declare const SpecWeaveConfigSchema: z.ZodObject<{
1048
1048
  at1M?: string;
1049
1049
  };
1050
1050
  cloudCredits?: {
1051
+ provider?: string;
1051
1052
  url?: string;
1052
1053
  requirements?: string;
1053
- provider?: string;
1054
1054
  amount?: string;
1055
1055
  duration?: string;
1056
1056
  }[];
@@ -1175,9 +1175,9 @@ export declare const SpecWeaveConfigSchema: z.ZodObject<{
1175
1175
  at1M?: string;
1176
1176
  };
1177
1177
  cloudCredits?: {
1178
+ provider?: string;
1178
1179
  url?: string;
1179
1180
  requirements?: string;
1180
- provider?: string;
1181
1181
  amount?: string;
1182
1182
  duration?: string;
1183
1183
  }[];
@@ -1277,9 +1277,9 @@ export declare const SpecWeaveConfigSchema: z.ZodObject<{
1277
1277
  at1M?: string;
1278
1278
  };
1279
1279
  cloudCredits?: {
1280
+ provider?: string;
1280
1281
  url?: string;
1281
1282
  requirements?: string;
1282
- provider?: string;
1283
1283
  amount?: string;
1284
1284
  duration?: string;
1285
1285
  }[];