specweave 0.28.57 → 0.28.61
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 +36 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +13 -1
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/jobs.d.ts +20 -0
- package/dist/src/cli/commands/jobs.d.ts.map +1 -0
- package/dist/src/cli/commands/jobs.js +448 -0
- package/dist/src/cli/commands/jobs.js.map +1 -0
- package/dist/src/cli/helpers/init/ado-repo-cloning.d.ts +32 -0
- package/dist/src/cli/helpers/init/ado-repo-cloning.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/ado-repo-cloning.js +161 -0
- package/dist/src/cli/helpers/init/ado-repo-cloning.js.map +1 -0
- package/dist/src/cli/helpers/init/external-import.d.ts +18 -1
- package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/external-import.js +61 -21
- package/dist/src/cli/helpers/init/external-import.js.map +1 -1
- package/dist/src/cli/helpers/selection-strategy.d.ts +28 -0
- package/dist/src/cli/helpers/selection-strategy.d.ts.map +1 -1
- package/dist/src/cli/helpers/selection-strategy.js +48 -0
- package/dist/src/cli/helpers/selection-strategy.js.map +1 -1
- package/dist/src/cli/workers/import-worker.d.ts +18 -0
- package/dist/src/cli/workers/import-worker.d.ts.map +1 -0
- package/dist/src/cli/workers/import-worker.js +268 -0
- package/dist/src/cli/workers/import-worker.js.map +1 -0
- package/dist/src/core/background/index.d.ts +8 -0
- package/dist/src/core/background/index.d.ts.map +1 -1
- package/dist/src/core/background/index.js +8 -0
- package/dist/src/core/background/index.js.map +1 -1
- package/dist/src/core/background/job-launcher.d.ts +54 -0
- package/dist/src/core/background/job-launcher.d.ts.map +1 -0
- package/dist/src/core/background/job-launcher.js +206 -0
- package/dist/src/core/background/job-launcher.js.map +1 -0
- package/dist/src/core/repo-structure/providers/azure-devops-provider.d.ts +15 -0
- package/dist/src/core/repo-structure/providers/azure-devops-provider.d.ts.map +1 -1
- package/dist/src/core/repo-structure/providers/azure-devops-provider.js +56 -0
- package/dist/src/core/repo-structure/providers/azure-devops-provider.js.map +1 -1
- package/dist/src/importers/ado-importer.d.ts +7 -1
- package/dist/src/importers/ado-importer.d.ts.map +1 -1
- package/dist/src/importers/ado-importer.js +108 -61
- package/dist/src/importers/ado-importer.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/commands/specweave-jobs.md +133 -29
- package/plugins/specweave-ado/commands/specweave-ado-clone-repos.md +379 -0
- package/plugins/specweave-release/commands/specweave-release-npm.md +51 -14
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background Jobs CLI Command
|
|
3
|
+
*
|
|
4
|
+
* Monitor and manage long-running background operations:
|
|
5
|
+
* - Repository cloning (multi-repo/umbrella setup)
|
|
6
|
+
* - Issue import (10K+ items from GitHub/JIRA/ADO)
|
|
7
|
+
* - External sync operations
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* specweave jobs # Show active jobs
|
|
11
|
+
* specweave jobs --all # Show all jobs (including completed)
|
|
12
|
+
* specweave jobs --id <jobId> # Show details for specific job
|
|
13
|
+
* specweave jobs --logs <jobId> # Show worker log output
|
|
14
|
+
* specweave jobs --follow <jobId> # Follow job progress in real-time
|
|
15
|
+
* specweave jobs --kill <jobId> # Kill running background job
|
|
16
|
+
* specweave jobs --resume <jobId> # Resume paused job
|
|
17
|
+
*/
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
import chalk from 'chalk';
|
|
20
|
+
import { Command } from 'commander';
|
|
21
|
+
import { getJobManager, isJobRunning, killJob, getJobLog, getJobResult, launchImportJob, } from '../../core/background/index.js';
|
|
22
|
+
import * as fs from '../../utils/fs-native.js';
|
|
23
|
+
export function createJobsCommand() {
|
|
24
|
+
const cmd = new Command('jobs')
|
|
25
|
+
.description('Monitor and manage background jobs (imports, cloning, sync)')
|
|
26
|
+
.option('--all', 'Show all jobs (including completed)')
|
|
27
|
+
.option('--id <jobId>', 'Show details for specific job')
|
|
28
|
+
.option('--logs <jobId>', 'Show worker log output')
|
|
29
|
+
.option('--follow <jobId>', 'Follow job progress in real-time')
|
|
30
|
+
.option('--kill <jobId>', 'Kill running background job')
|
|
31
|
+
.option('--resume <jobId>', 'Resume paused job')
|
|
32
|
+
.action(async (options) => {
|
|
33
|
+
const projectPath = process.cwd();
|
|
34
|
+
// Check if SpecWeave is initialized
|
|
35
|
+
const specweavePath = path.join(projectPath, '.specweave');
|
|
36
|
+
if (!fs.existsSync(specweavePath)) {
|
|
37
|
+
console.log(chalk.yellow('No SpecWeave project found in current directory.'));
|
|
38
|
+
console.log(chalk.gray('Run `specweave init` to initialize a project.'));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
if (options.kill) {
|
|
43
|
+
await handleKill(projectPath, options.kill);
|
|
44
|
+
}
|
|
45
|
+
else if (options.resume) {
|
|
46
|
+
await handleResume(projectPath, options.resume);
|
|
47
|
+
}
|
|
48
|
+
else if (options.logs) {
|
|
49
|
+
await handleLogs(projectPath, options.logs);
|
|
50
|
+
}
|
|
51
|
+
else if (options.follow) {
|
|
52
|
+
await handleFollow(projectPath, options.follow);
|
|
53
|
+
}
|
|
54
|
+
else if (options.id) {
|
|
55
|
+
await handleJobDetails(projectPath, options.id);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
await handleListJobs(projectPath, options.all);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
63
|
+
console.error(chalk.red(`Error: ${errorMessage}`));
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return cmd;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get provider from job config (type-safe)
|
|
71
|
+
*/
|
|
72
|
+
function getJobProvider(job) {
|
|
73
|
+
const config = job.config;
|
|
74
|
+
if (config.type === 'import-issues' || config.type === 'sync-external') {
|
|
75
|
+
return config.provider || 'unknown';
|
|
76
|
+
}
|
|
77
|
+
return 'unknown';
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* List all jobs
|
|
81
|
+
*/
|
|
82
|
+
async function handleListJobs(projectPath, showAll) {
|
|
83
|
+
const jobManager = getJobManager(projectPath);
|
|
84
|
+
const jobs = jobManager.getJobs();
|
|
85
|
+
if (jobs.length === 0) {
|
|
86
|
+
console.log(chalk.gray('No background jobs found.'));
|
|
87
|
+
console.log(chalk.gray('\nJobs are created when importing large datasets during `specweave init`.'));
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Group jobs by status
|
|
91
|
+
const running = jobs.filter((j) => j.status === 'running');
|
|
92
|
+
const paused = jobs.filter((j) => j.status === 'paused');
|
|
93
|
+
const completed = jobs.filter((j) => j.status === 'completed');
|
|
94
|
+
const failed = jobs.filter((j) => j.status === 'failed');
|
|
95
|
+
console.log(chalk.blue('\n📋 Background Jobs\n'));
|
|
96
|
+
// Running jobs
|
|
97
|
+
if (running.length > 0) {
|
|
98
|
+
console.log(chalk.green(`🔄 Running (${running.length}):`));
|
|
99
|
+
for (const job of running) {
|
|
100
|
+
printJobSummary(job, projectPath);
|
|
101
|
+
}
|
|
102
|
+
console.log('');
|
|
103
|
+
}
|
|
104
|
+
// Paused jobs
|
|
105
|
+
if (paused.length > 0) {
|
|
106
|
+
console.log(chalk.yellow(`⏸️ Paused (${paused.length}):`));
|
|
107
|
+
for (const job of paused) {
|
|
108
|
+
printJobSummary(job, projectPath);
|
|
109
|
+
}
|
|
110
|
+
console.log('');
|
|
111
|
+
}
|
|
112
|
+
// Failed jobs
|
|
113
|
+
if (failed.length > 0) {
|
|
114
|
+
console.log(chalk.red(`❌ Failed (${failed.length}):`));
|
|
115
|
+
for (const job of failed) {
|
|
116
|
+
printJobSummary(job, projectPath);
|
|
117
|
+
}
|
|
118
|
+
console.log('');
|
|
119
|
+
}
|
|
120
|
+
// Completed jobs (only if --all)
|
|
121
|
+
if (showAll && completed.length > 0) {
|
|
122
|
+
console.log(chalk.gray(`✅ Completed (${completed.length}):`));
|
|
123
|
+
for (const job of completed.slice(0, 10)) {
|
|
124
|
+
printJobSummary(job, projectPath, true);
|
|
125
|
+
}
|
|
126
|
+
if (completed.length > 10) {
|
|
127
|
+
console.log(chalk.gray(` ... and ${completed.length - 10} more`));
|
|
128
|
+
}
|
|
129
|
+
console.log('');
|
|
130
|
+
}
|
|
131
|
+
// Show hints
|
|
132
|
+
console.log(chalk.blue('💡 Commands:'));
|
|
133
|
+
console.log(chalk.gray(' specweave jobs --id <jobId> → Details for specific job'));
|
|
134
|
+
console.log(chalk.gray(' specweave jobs --follow <jobId> → Follow progress live'));
|
|
135
|
+
console.log(chalk.gray(' specweave jobs --logs <jobId> → View worker logs'));
|
|
136
|
+
if (paused.length > 0) {
|
|
137
|
+
console.log(chalk.gray(' specweave jobs --resume <jobId> → Resume paused job'));
|
|
138
|
+
}
|
|
139
|
+
if (running.length > 0) {
|
|
140
|
+
console.log(chalk.gray(' specweave jobs --kill <jobId> → Kill running job'));
|
|
141
|
+
}
|
|
142
|
+
console.log(chalk.gray(' specweave jobs --all → Show all jobs (including completed)'));
|
|
143
|
+
console.log('');
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Print job summary line
|
|
147
|
+
*/
|
|
148
|
+
function printJobSummary(job, projectPath, compact = false) {
|
|
149
|
+
const shortId = job.id.slice(0, 8);
|
|
150
|
+
const provider = getJobProvider(job);
|
|
151
|
+
const progress = job.progress;
|
|
152
|
+
if (compact) {
|
|
153
|
+
// Compact format for completed jobs
|
|
154
|
+
const ago = getTimeAgo(job.updatedAt);
|
|
155
|
+
console.log(chalk.gray(` [${shortId}] ${job.type} - ${progress.current} items - ${ago}`));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
// Full format for active jobs
|
|
159
|
+
console.log(chalk.white(` [${shortId}] ${job.type} (${provider})`));
|
|
160
|
+
// Progress bar
|
|
161
|
+
const percentage = progress.total > 0
|
|
162
|
+
? Math.round((progress.current / progress.total) * 100)
|
|
163
|
+
: 0;
|
|
164
|
+
const progressBar = createProgressBar(percentage);
|
|
165
|
+
console.log(chalk.gray(` Progress: ${progressBar} ${progress.current}/${progress.total} (${percentage}%)`));
|
|
166
|
+
// Rate and ETA
|
|
167
|
+
const elapsed = (Date.now() - new Date(job.startedAt).getTime()) / 1000;
|
|
168
|
+
const rate = elapsed > 0 ? (progress.current / elapsed).toFixed(1) : '0';
|
|
169
|
+
const remaining = progress.total - progress.current;
|
|
170
|
+
const eta = parseFloat(rate) > 0 ? Math.round(remaining / parseFloat(rate)) : 0;
|
|
171
|
+
const etaStr = formatDuration(eta);
|
|
172
|
+
console.log(chalk.gray(` Rate: ${rate}/s | ETA: ${etaStr}`));
|
|
173
|
+
// Current item
|
|
174
|
+
if (progress.currentItem) {
|
|
175
|
+
console.log(chalk.gray(` Current: ${progress.currentItem}`));
|
|
176
|
+
}
|
|
177
|
+
// Process status
|
|
178
|
+
const running = isJobRunning(projectPath, job.id);
|
|
179
|
+
const pidFile = path.join(projectPath, '.specweave', 'state', 'jobs', job.id, 'worker.pid');
|
|
180
|
+
let pid = 'unknown';
|
|
181
|
+
try {
|
|
182
|
+
if (fs.existsSync(pidFile)) {
|
|
183
|
+
pid = fs.readFileSync(pidFile, 'utf-8').trim();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch { /* ignore */ }
|
|
187
|
+
const started = getTimeAgo(job.startedAt);
|
|
188
|
+
console.log(chalk.gray(` PID: ${pid} (${running ? 'alive' : 'not running'}) | Started: ${started}`));
|
|
189
|
+
// Error for failed jobs
|
|
190
|
+
if (job.error) {
|
|
191
|
+
console.log(chalk.red(` Error: ${job.error}`));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Show detailed job info
|
|
196
|
+
*/
|
|
197
|
+
async function handleJobDetails(projectPath, jobId) {
|
|
198
|
+
const jobManager = getJobManager(projectPath);
|
|
199
|
+
const job = jobManager.getJob(jobId) || findJobByPrefix(jobManager.getJobs(), jobId);
|
|
200
|
+
if (!job) {
|
|
201
|
+
console.log(chalk.red(`Job not found: ${jobId}`));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
console.log(chalk.blue(`\n📦 Job Details: ${job.id}\n`));
|
|
205
|
+
console.log(`Type: ${job.type}`);
|
|
206
|
+
console.log(`Status: ${formatStatus(job.status)}`);
|
|
207
|
+
console.log(`Provider: ${getJobProvider(job)}`);
|
|
208
|
+
const pidFile = path.join(projectPath, '.specweave', 'state', 'jobs', job.id, 'worker.pid');
|
|
209
|
+
let pid = 'N/A';
|
|
210
|
+
try {
|
|
211
|
+
if (fs.existsSync(pidFile)) {
|
|
212
|
+
pid = fs.readFileSync(pidFile, 'utf-8').trim();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch { /* ignore */ }
|
|
216
|
+
console.log(`PID: ${pid}`);
|
|
217
|
+
console.log('');
|
|
218
|
+
console.log(`Started: ${job.startedAt}`);
|
|
219
|
+
console.log(`Updated: ${job.updatedAt}`);
|
|
220
|
+
console.log('');
|
|
221
|
+
const progress = job.progress;
|
|
222
|
+
const percentage = progress.total > 0
|
|
223
|
+
? Math.round((progress.current / progress.total) * 100)
|
|
224
|
+
: 0;
|
|
225
|
+
console.log(`Progress: ${progress.current}/${progress.total} (${percentage}%)`);
|
|
226
|
+
if (progress.currentItem) {
|
|
227
|
+
console.log(`Current: ${progress.currentItem}`);
|
|
228
|
+
}
|
|
229
|
+
const elapsed = (Date.now() - new Date(job.startedAt).getTime()) / 1000;
|
|
230
|
+
const rate = elapsed > 0 ? (progress.current / elapsed).toFixed(1) : '0';
|
|
231
|
+
console.log(`Rate: ${rate} items/sec`);
|
|
232
|
+
const remaining = progress.total - progress.current;
|
|
233
|
+
const eta = parseFloat(rate) > 0 ? Math.round(remaining / parseFloat(rate)) : 0;
|
|
234
|
+
console.log(`ETA: ${formatDuration(eta)}`);
|
|
235
|
+
console.log('');
|
|
236
|
+
// Files
|
|
237
|
+
console.log('Files:');
|
|
238
|
+
const jobDir = path.join(projectPath, '.specweave', 'state', 'jobs', job.id);
|
|
239
|
+
console.log(` Config: ${path.join(jobDir, 'config.json')}`);
|
|
240
|
+
console.log(` Logs: ${path.join(jobDir, 'worker.log')}`);
|
|
241
|
+
console.log(` PID: ${pidFile}`);
|
|
242
|
+
// Result if available
|
|
243
|
+
const result = getJobResult(projectPath, job.id);
|
|
244
|
+
if (result) {
|
|
245
|
+
console.log('');
|
|
246
|
+
console.log('Result:');
|
|
247
|
+
console.log(` Total Count: ${result.totalCount}`);
|
|
248
|
+
console.log(` Completed At: ${result.completedAt}`);
|
|
249
|
+
}
|
|
250
|
+
// Error if any
|
|
251
|
+
if (job.error) {
|
|
252
|
+
console.log('');
|
|
253
|
+
console.log(chalk.red(`Error: ${job.error}`));
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Show job logs
|
|
258
|
+
*/
|
|
259
|
+
async function handleLogs(projectPath, jobId) {
|
|
260
|
+
const jobManager = getJobManager(projectPath);
|
|
261
|
+
const job = jobManager.getJob(jobId) || findJobByPrefix(jobManager.getJobs(), jobId);
|
|
262
|
+
if (!job) {
|
|
263
|
+
console.log(chalk.red(`Job not found: ${jobId}`));
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const logs = getJobLog(projectPath, job.id, 50);
|
|
267
|
+
if (!logs) {
|
|
268
|
+
console.log(chalk.gray('No logs available for this job.'));
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
console.log(chalk.blue(`\n📋 Worker Logs for ${job.id.slice(0, 8)} (last 50 lines):\n`));
|
|
272
|
+
console.log(logs);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Follow job progress in real-time
|
|
276
|
+
*/
|
|
277
|
+
async function handleFollow(projectPath, jobId) {
|
|
278
|
+
const jobManager = getJobManager(projectPath);
|
|
279
|
+
let job = jobManager.getJob(jobId) || findJobByPrefix(jobManager.getJobs(), jobId);
|
|
280
|
+
if (!job) {
|
|
281
|
+
console.log(chalk.red(`Job not found: ${jobId}`));
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
console.log(chalk.blue(`\n📦 Following job ${job.id.slice(0, 8)} (Ctrl+C to stop)\n`));
|
|
285
|
+
let lastProgress = -1;
|
|
286
|
+
let lastItem = '';
|
|
287
|
+
const interval = setInterval(() => {
|
|
288
|
+
// Refresh job data
|
|
289
|
+
job = jobManager.getJob(job.id);
|
|
290
|
+
if (!job) {
|
|
291
|
+
console.log(chalk.yellow('\nJob no longer exists.'));
|
|
292
|
+
clearInterval(interval);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
const progress = job.progress;
|
|
296
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
297
|
+
// Only print if something changed
|
|
298
|
+
if (progress.current !== lastProgress || progress.currentItem !== lastItem) {
|
|
299
|
+
const percentage = progress.total > 0
|
|
300
|
+
? Math.round((progress.current / progress.total) * 100)
|
|
301
|
+
: 0;
|
|
302
|
+
const progressBar = createProgressBar(percentage);
|
|
303
|
+
console.log(chalk.gray(`[${timestamp}] ${progressBar} ${progress.current}/${progress.total} (${percentage}%) - ${progress.currentItem || 'processing...'}`));
|
|
304
|
+
lastProgress = progress.current;
|
|
305
|
+
lastItem = progress.currentItem || '';
|
|
306
|
+
}
|
|
307
|
+
// Stop if job completed
|
|
308
|
+
if (job.status === 'completed' || job.status === 'failed') {
|
|
309
|
+
console.log('');
|
|
310
|
+
if (job.status === 'completed') {
|
|
311
|
+
console.log(chalk.green(`✅ Job completed! ${progress.current} items processed.`));
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
console.log(chalk.red(`❌ Job failed: ${job.error}`));
|
|
315
|
+
}
|
|
316
|
+
clearInterval(interval);
|
|
317
|
+
}
|
|
318
|
+
}, 1000);
|
|
319
|
+
// Handle Ctrl+C
|
|
320
|
+
process.on('SIGINT', () => {
|
|
321
|
+
clearInterval(interval);
|
|
322
|
+
console.log(chalk.gray('\nStopped following. Job continues in background.'));
|
|
323
|
+
process.exit(0);
|
|
324
|
+
});
|
|
325
|
+
// Keep process alive
|
|
326
|
+
await new Promise(() => { }); // Never resolves, until SIGINT
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Kill a running job
|
|
330
|
+
*/
|
|
331
|
+
async function handleKill(projectPath, jobId) {
|
|
332
|
+
const jobManager = getJobManager(projectPath);
|
|
333
|
+
const job = jobManager.getJob(jobId) || findJobByPrefix(jobManager.getJobs(), jobId);
|
|
334
|
+
if (!job) {
|
|
335
|
+
console.log(chalk.red(`Job not found: ${jobId}`));
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
const progress = job.progress;
|
|
339
|
+
const percentage = progress.total > 0 ? Math.round((progress.current / progress.total) * 100) : 0;
|
|
340
|
+
console.log(chalk.yellow(`\n⚠️ Killing job ${job.id.slice(0, 8)}...`));
|
|
341
|
+
console.log(` Type: ${job.type}`);
|
|
342
|
+
console.log(` Progress: ${progress.current}/${progress.total} (${percentage}%)`);
|
|
343
|
+
const success = killJob(projectPath, job.id);
|
|
344
|
+
if (success) {
|
|
345
|
+
console.log(chalk.green('\n✅ Job killed. Status changed to "paused".'));
|
|
346
|
+
console.log(chalk.gray(` Resume later: specweave jobs --resume ${job.id.slice(0, 8)}`));
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
console.log(chalk.yellow('\n⚠️ Could not kill job (may already be stopped).'));
|
|
350
|
+
console.log(chalk.gray(' Check status: specweave jobs --id ' + job.id.slice(0, 8)));
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Resume a paused job
|
|
355
|
+
*/
|
|
356
|
+
async function handleResume(projectPath, jobId) {
|
|
357
|
+
const jobManager = getJobManager(projectPath);
|
|
358
|
+
const job = jobManager.getJob(jobId) || findJobByPrefix(jobManager.getJobs(), jobId);
|
|
359
|
+
if (!job) {
|
|
360
|
+
console.log(chalk.red(`Job not found: ${jobId}`));
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
if (job.status === 'running') {
|
|
364
|
+
console.log(chalk.yellow(`Job ${job.id.slice(0, 8)} is already running.`));
|
|
365
|
+
console.log(chalk.gray(` Follow progress: specweave jobs --follow ${job.id.slice(0, 8)}`));
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
if (job.status === 'completed') {
|
|
369
|
+
console.log(chalk.gray(`Job ${job.id.slice(0, 8)} is already completed.`));
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
console.log(chalk.cyan(`\n🔄 Resuming job ${job.id.slice(0, 8)}...`));
|
|
373
|
+
console.log(` Type: ${job.type}`);
|
|
374
|
+
console.log(` Provider: ${getJobProvider(job)}`);
|
|
375
|
+
console.log(` Resuming from: item ${job.progress.current} of ${job.progress.total}`);
|
|
376
|
+
// Load original config
|
|
377
|
+
const configPath = path.join(projectPath, '.specweave', 'state', 'jobs', job.id, 'config.json');
|
|
378
|
+
if (!fs.existsSync(configPath)) {
|
|
379
|
+
console.log(chalk.red('\n❌ Cannot resume: job config not found.'));
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
const jobConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
383
|
+
// Mark job as running again (startJob does this)
|
|
384
|
+
jobManager.startJob(job.id);
|
|
385
|
+
// Re-launch worker
|
|
386
|
+
const result = await launchImportJob({
|
|
387
|
+
type: job.type,
|
|
388
|
+
projectPath,
|
|
389
|
+
coordinatorConfig: jobConfig.coordinatorConfig,
|
|
390
|
+
estimatedTotal: job.progress.total,
|
|
391
|
+
});
|
|
392
|
+
if (result.isBackground) {
|
|
393
|
+
console.log(chalk.green(`\n✅ Job resumed in background.`));
|
|
394
|
+
console.log(chalk.gray(` New PID: ${result.pid}`));
|
|
395
|
+
console.log(chalk.gray(` Check progress: specweave jobs --follow ${job.id.slice(0, 8)}`));
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
console.log(chalk.yellow('\n⚠️ Running in foreground (background mode unavailable).'));
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// Helper functions
|
|
402
|
+
function findJobByPrefix(jobs, prefix) {
|
|
403
|
+
return jobs.find(j => j.id.startsWith(prefix));
|
|
404
|
+
}
|
|
405
|
+
function formatStatus(status) {
|
|
406
|
+
switch (status) {
|
|
407
|
+
case 'running':
|
|
408
|
+
return chalk.green('running');
|
|
409
|
+
case 'paused':
|
|
410
|
+
return chalk.yellow('paused');
|
|
411
|
+
case 'completed':
|
|
412
|
+
return chalk.gray('completed');
|
|
413
|
+
case 'failed':
|
|
414
|
+
return chalk.red('failed');
|
|
415
|
+
default:
|
|
416
|
+
return status;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
function createProgressBar(percentage, width = 20) {
|
|
420
|
+
const filled = Math.round((percentage / 100) * width);
|
|
421
|
+
const empty = width - filled;
|
|
422
|
+
return `[${'█'.repeat(filled)}${'░'.repeat(empty)}]`;
|
|
423
|
+
}
|
|
424
|
+
function formatDuration(seconds) {
|
|
425
|
+
if (seconds <= 0)
|
|
426
|
+
return 'calculating...';
|
|
427
|
+
if (seconds < 60)
|
|
428
|
+
return `${seconds}s`;
|
|
429
|
+
const minutes = Math.floor(seconds / 60);
|
|
430
|
+
const secs = seconds % 60;
|
|
431
|
+
if (minutes < 60)
|
|
432
|
+
return `${minutes}m ${secs}s`;
|
|
433
|
+
const hours = Math.floor(minutes / 60);
|
|
434
|
+
const mins = minutes % 60;
|
|
435
|
+
return `${hours}h ${mins}m`;
|
|
436
|
+
}
|
|
437
|
+
function getTimeAgo(dateStr) {
|
|
438
|
+
const date = new Date(dateStr);
|
|
439
|
+
const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
|
|
440
|
+
if (seconds < 60)
|
|
441
|
+
return 'just now';
|
|
442
|
+
if (seconds < 3600)
|
|
443
|
+
return `${Math.floor(seconds / 60)} mins ago`;
|
|
444
|
+
if (seconds < 86400)
|
|
445
|
+
return `${Math.floor(seconds / 3600)} hours ago`;
|
|
446
|
+
return `${Math.floor(seconds / 86400)} days ago`;
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../../../src/cli/commands/jobs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADO Repository Cloning
|
|
3
|
+
*
|
|
4
|
+
* Handles fetching and cloning Azure DevOps repositories during init.
|
|
5
|
+
* Cloning runs in background (non-blocking) via job manager.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/helpers/init/ado-repo-cloning
|
|
8
|
+
*/
|
|
9
|
+
import { type ClonePatternResult } from '../selection-strategy.js';
|
|
10
|
+
/**
|
|
11
|
+
* ADO project selection (from repository-setup.ts)
|
|
12
|
+
*/
|
|
13
|
+
export interface AdoProjectSelection {
|
|
14
|
+
org: string;
|
|
15
|
+
pat: string;
|
|
16
|
+
projects: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Trigger ADO repository cloning during init
|
|
20
|
+
*
|
|
21
|
+
* This function:
|
|
22
|
+
* 1. Fetches repository list from each selected ADO project
|
|
23
|
+
* 2. Filters repositories by clone pattern (glob/regex)
|
|
24
|
+
* 3. Creates a background job for cloning
|
|
25
|
+
* 4. Starts cloning asynchronously (non-blocking)
|
|
26
|
+
*
|
|
27
|
+
* @param projectPath - Target directory for cloning
|
|
28
|
+
* @param adoProjectSelection - ADO org, PAT, and selected projects
|
|
29
|
+
* @param clonePattern - Clone pattern configuration
|
|
30
|
+
*/
|
|
31
|
+
export declare function triggerAdoRepoCloning(projectPath: string, adoProjectSelection: AdoProjectSelection, clonePattern: ClonePatternResult): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=ado-repo-cloning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ado-repo-cloning.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/ado-repo-cloning.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAA+B,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAKhG;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAcD;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,mBAAmB,EACxC,YAAY,EAAE,kBAAkB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAiFf"}
|