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.
- package/.claude-plugin/marketplace.json +7 -7
- package/CLAUDE.md +391 -1338
- package/dist/src/cli/commands/cleanup-cache.d.ts +14 -0
- package/dist/src/cli/commands/cleanup-cache.d.ts.map +1 -0
- package/dist/src/cli/commands/cleanup-cache.js +63 -0
- package/dist/src/cli/commands/cleanup-cache.js.map +1 -0
- package/dist/src/cli/commands/init.js +40 -0
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/migrate-config.d.ts +22 -0
- package/dist/src/cli/commands/migrate-config.d.ts.map +1 -0
- package/dist/src/cli/commands/migrate-config.js +149 -0
- package/dist/src/cli/commands/migrate-config.js.map +1 -0
- package/dist/src/cli/helpers/async-project-loader.d.ts +148 -0
- package/dist/src/cli/helpers/async-project-loader.d.ts.map +1 -0
- package/dist/src/cli/helpers/async-project-loader.js +351 -0
- package/dist/src/cli/helpers/async-project-loader.js.map +1 -0
- package/dist/src/cli/helpers/cancelation-handler.d.ts +123 -0
- package/dist/src/cli/helpers/cancelation-handler.d.ts.map +1 -0
- package/dist/src/cli/helpers/cancelation-handler.js +187 -0
- package/dist/src/cli/helpers/cancelation-handler.js.map +1 -0
- package/dist/src/cli/helpers/import-strategy-prompter.d.ts +43 -0
- package/dist/src/cli/helpers/import-strategy-prompter.d.ts.map +1 -0
- package/dist/src/cli/helpers/import-strategy-prompter.js +136 -0
- package/dist/src/cli/helpers/import-strategy-prompter.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts +5 -2
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.js +90 -40
- package/dist/src/cli/helpers/issue-tracker/ado.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 +112 -60
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/jira.d.ts +26 -2
- package/dist/src/cli/helpers/issue-tracker/jira.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/jira.js +197 -132
- package/dist/src/cli/helpers/issue-tracker/jira.js.map +1 -1
- package/dist/src/cli/helpers/progress-tracker.d.ts +121 -0
- package/dist/src/cli/helpers/progress-tracker.d.ts.map +1 -0
- package/dist/src/cli/helpers/progress-tracker.js +202 -0
- package/dist/src/cli/helpers/progress-tracker.js.map +1 -0
- package/dist/src/cli/helpers/project-count-fetcher.d.ts +69 -0
- package/dist/src/cli/helpers/project-count-fetcher.d.ts.map +1 -0
- package/dist/src/cli/helpers/project-count-fetcher.js +173 -0
- package/dist/src/cli/helpers/project-count-fetcher.js.map +1 -0
- package/dist/src/config/types.d.ts +14 -14
- package/dist/src/core/cache/cache-manager.d.ts +119 -0
- package/dist/src/core/cache/cache-manager.d.ts.map +1 -0
- package/dist/src/core/cache/cache-manager.js +304 -0
- package/dist/src/core/cache/cache-manager.js.map +1 -0
- package/dist/src/core/cache/rate-limit-checker.d.ts +92 -0
- package/dist/src/core/cache/rate-limit-checker.d.ts.map +1 -0
- package/dist/src/core/cache/rate-limit-checker.js +160 -0
- package/dist/src/core/cache/rate-limit-checker.js.map +1 -0
- package/dist/src/core/config/config-manager.d.ts +135 -0
- package/dist/src/core/config/config-manager.d.ts.map +1 -0
- package/dist/src/core/config/config-manager.js +341 -0
- package/dist/src/core/config/config-manager.js.map +1 -0
- package/dist/src/core/config/config-migrator.d.ts +102 -0
- package/dist/src/core/config/config-migrator.d.ts.map +1 -0
- package/dist/src/core/config/config-migrator.js +367 -0
- package/dist/src/core/config/config-migrator.js.map +1 -0
- package/dist/src/core/config/index.d.ts +10 -0
- package/dist/src/core/config/index.d.ts.map +1 -0
- package/dist/src/core/config/index.js +10 -0
- package/dist/src/core/config/index.js.map +1 -0
- package/dist/src/core/config/types.d.ts +216 -0
- package/dist/src/core/config/types.d.ts.map +1 -0
- package/dist/src/core/config/types.js +32 -0
- package/dist/src/core/config/types.js.map +1 -0
- package/dist/src/core/progress/cancelation-handler.d.ts +79 -0
- package/dist/src/core/progress/cancelation-handler.d.ts.map +1 -0
- package/dist/src/core/progress/cancelation-handler.js +111 -0
- package/dist/src/core/progress/cancelation-handler.js.map +1 -0
- package/dist/src/core/progress/import-state.d.ts +71 -0
- package/dist/src/core/progress/import-state.d.ts.map +1 -0
- package/dist/src/core/progress/import-state.js +96 -0
- package/dist/src/core/progress/import-state.js.map +1 -0
- package/dist/src/core/progress/progress-tracker.d.ts +139 -0
- package/dist/src/core/progress/progress-tracker.d.ts.map +1 -0
- package/dist/src/core/progress/progress-tracker.js +223 -0
- package/dist/src/core/progress/progress-tracker.js.map +1 -0
- package/dist/src/init/architecture/types.d.ts +6 -6
- package/dist/src/integrations/ado/ado-client.d.ts +25 -0
- package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
- package/dist/src/integrations/ado/ado-client.js +67 -0
- package/dist/src/integrations/ado/ado-client.js.map +1 -1
- package/dist/src/integrations/ado/ado-dependency-loader.d.ts +99 -0
- package/dist/src/integrations/ado/ado-dependency-loader.d.ts.map +1 -0
- package/dist/src/integrations/ado/ado-dependency-loader.js +207 -0
- package/dist/src/integrations/ado/ado-dependency-loader.js.map +1 -0
- package/dist/src/integrations/jira/jira-client.d.ts +32 -0
- package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-client.js +81 -0
- package/dist/src/integrations/jira/jira-client.js.map +1 -1
- package/dist/src/integrations/jira/jira-dependency-loader.d.ts +101 -0
- package/dist/src/integrations/jira/jira-dependency-loader.d.ts.map +1 -0
- package/dist/src/integrations/jira/jira-dependency-loader.js +200 -0
- package/dist/src/integrations/jira/jira-dependency-loader.js.map +1 -0
- package/dist/src/integrations/jira/jira-hierarchy-mapper.d.ts +104 -0
- package/dist/src/integrations/jira/jira-hierarchy-mapper.d.ts.map +1 -0
- package/dist/src/integrations/jira/jira-hierarchy-mapper.js +178 -0
- package/dist/src/integrations/jira/jira-hierarchy-mapper.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +20 -0
- package/plugins/specweave/agents/architect/AGENT.md +100 -602
- package/plugins/specweave/agents/pm/AGENT.md +96 -597
- package/plugins/specweave/agents/pm/AGENT.md.bak +1893 -0
- package/plugins/specweave/agents/pm/AGENT.md.bak2 +1754 -0
- package/plugins/specweave/commands/check-hooks.md +257 -0
- package/plugins/specweave/commands/migrate-config.md +104 -0
- package/plugins/specweave/hooks/post-edit-spec.sh +202 -31
- package/plugins/specweave/hooks/post-task-completion.sh +225 -228
- package/plugins/specweave/hooks/post-write-spec.sh +207 -31
- package/plugins/specweave/hooks/pre-edit-spec.sh +151 -0
- package/plugins/specweave/hooks/pre-task-completion.sh +5 -7
- package/plugins/specweave/hooks/pre-write-spec.sh +151 -0
- package/plugins/specweave/hooks/test-pretooluse-env.sh +72 -0
- package/plugins/specweave/skills/compliance-architecture/SKILL.md +374 -0
- package/plugins/specweave/skills/external-sync-wizard/SKILL.md +610 -0
- package/plugins/specweave/skills/pm-closure-validation/SKILL.md +541 -0
- package/plugins/specweave/skills/roadmap-planner/SKILL.md +473 -0
- package/plugins/specweave-ado/commands/refresh-cache.js +25 -0
- package/plugins/specweave-ado/commands/refresh-cache.ts +40 -0
- package/plugins/specweave-ado/hooks/post-task-completion.sh +1 -1
- package/plugins/specweave-github/hooks/post-task-completion.sh +1 -1
- package/plugins/specweave-jira/commands/refresh-cache.js +25 -0
- package/plugins/specweave-jira/commands/refresh-cache.ts +40 -0
- package/plugins/specweave-jira/hooks/post-task-completion.sh +1 -1
- package/plugins/specweave-kafka-streams/commands/topology.md +437 -0
- package/plugins/specweave-n8n/commands/workflow-template.md +262 -0
- 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
|
}[];
|