speccore 5.19.2 → 5.22.0
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/README.en.md +63 -210
- package/README.md +108 -252
- package/dist/cli.js +224 -300
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts +5 -0
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +235 -543
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/ask.d.ts +8 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +293 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/bugfix.d.ts +4 -0
- package/dist/commands/bugfix.d.ts.map +1 -1
- package/dist/commands/bugfix.js +122 -2
- package/dist/commands/bugfix.js.map +1 -1
- package/dist/commands/change.d.ts +2 -0
- package/dist/commands/change.d.ts.map +1 -1
- package/dist/commands/change.js +37 -2
- package/dist/commands/change.js.map +1 -1
- package/dist/commands/completion.js +1 -1
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/dev.d.ts +2 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +175 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doc2spec.d.ts +10 -0
- package/dist/commands/doc2spec.d.ts.map +1 -0
- package/dist/commands/{word2spec.js → doc2spec.js} +55 -19
- package/dist/commands/doc2spec.js.map +1 -0
- package/dist/commands/done.d.ts.map +1 -1
- package/dist/commands/done.js +47 -0
- package/dist/commands/done.js.map +1 -1
- package/dist/commands/execute.d.ts +1 -0
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +118 -11
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/help-quick.js +2 -2
- package/dist/commands/help-quick.js.map +1 -1
- package/dist/commands/help.d.ts +3 -2
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +372 -51
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/import.d.ts +1 -0
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +289 -15
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts +0 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +177 -283
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/iteration/create.d.ts +1 -0
- package/dist/commands/iteration/create.d.ts.map +1 -1
- package/dist/commands/iteration/create.js +1 -0
- package/dist/commands/iteration/create.js.map +1 -1
- package/dist/commands/iteration/split.d.ts +1 -0
- package/dist/commands/iteration/split.d.ts.map +1 -1
- package/dist/commands/iteration/split.js +240 -7
- package/dist/commands/iteration/split.js.map +1 -1
- package/dist/commands/plan.d.ts +1 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +25 -1
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/pr.d.ts +1 -0
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +94 -22
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/schedule.d.ts +27 -0
- package/dist/commands/schedule.d.ts.map +1 -0
- package/dist/commands/schedule.js +203 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/status-panel.d.ts +8 -1
- package/dist/commands/status-panel.d.ts.map +1 -1
- package/dist/commands/status-panel.js +1095 -5
- package/dist/commands/status-panel.js.map +1 -1
- package/dist/commands/task/new.d.ts +4 -0
- package/dist/commands/task/new.d.ts.map +1 -1
- package/dist/commands/task/new.js +87 -0
- package/dist/commands/task/new.js.map +1 -1
- package/dist/core/analyze-engine.d.ts +32 -0
- package/dist/core/analyze-engine.d.ts.map +1 -0
- package/dist/core/analyze-engine.js +935 -0
- package/dist/core/analyze-engine.js.map +1 -0
- package/dist/core/capabilities.d.ts +12 -0
- package/dist/core/capabilities.d.ts.map +1 -0
- package/dist/core/capabilities.js +58 -0
- package/dist/core/capabilities.js.map +1 -0
- package/dist/core/code-scanner.d.ts.map +1 -1
- package/dist/core/code-scanner.js +4 -1
- package/dist/core/code-scanner.js.map +1 -1
- package/dist/core/intent-recognition.d.ts +1 -1
- package/dist/core/intent-recognition.d.ts.map +1 -1
- package/dist/core/intent-recognition.js +5 -5
- package/dist/core/intent-recognition.js.map +1 -1
- package/dist/core/next-steps.js +1 -1
- package/dist/core/next-steps.js.map +1 -1
- package/dist/core/schedule-engine.d.ts +25 -0
- package/dist/core/schedule-engine.d.ts.map +1 -0
- package/dist/core/schedule-engine.js +179 -0
- package/dist/core/schedule-engine.js.map +1 -0
- package/dist/core/schedule-store.d.ts +104 -0
- package/dist/core/schedule-store.d.ts.map +1 -0
- package/dist/core/schedule-store.js +188 -0
- package/dist/core/schedule-store.js.map +1 -0
- package/dist/core/schemas/iteration.schema.d.ts +4 -4
- package/dist/core/schemas/task.schema.d.ts +2 -2
- package/package.json +7 -13
- package/dist/commands/demo.d.ts +0 -10
- package/dist/commands/demo.d.ts.map +0 -1
- package/dist/commands/demo.js +0 -151
- package/dist/commands/demo.js.map +0 -1
- package/dist/commands/goal.d.ts +0 -15
- package/dist/commands/goal.d.ts.map +0 -1
- package/dist/commands/goal.js +0 -232
- package/dist/commands/goal.js.map +0 -1
- package/dist/commands/new-task.d.ts +0 -15
- package/dist/commands/new-task.d.ts.map +0 -1
- package/dist/commands/new-task.js +0 -208
- package/dist/commands/new-task.js.map +0 -1
- package/dist/commands/platform-add.d.ts +0 -12
- package/dist/commands/platform-add.d.ts.map +0 -1
- package/dist/commands/platform-add.js +0 -111
- package/dist/commands/platform-add.js.map +0 -1
- package/dist/commands/retro.d.ts +0 -10
- package/dist/commands/retro.d.ts.map +0 -1
- package/dist/commands/retro.js +0 -131
- package/dist/commands/retro.js.map +0 -1
- package/dist/commands/spec.d.ts +0 -8
- package/dist/commands/spec.d.ts.map +0 -1
- package/dist/commands/spec.js +0 -159
- package/dist/commands/spec.js.map +0 -1
- package/dist/commands/template-add.d.ts +0 -12
- package/dist/commands/template-add.d.ts.map +0 -1
- package/dist/commands/template-add.js +0 -65
- package/dist/commands/template-add.js.map +0 -1
- package/dist/commands/word2spec.d.ts +0 -8
- package/dist/commands/word2spec.d.ts.map +0 -1
- package/dist/commands/word2spec.js.map +0 -1
package/dist/commands/pr.js
CHANGED
|
@@ -9,6 +9,11 @@ const path_1 = require("path");
|
|
|
9
9
|
const child_process_1 = require("child_process");
|
|
10
10
|
const logger_1 = require("../utils/logger");
|
|
11
11
|
const context_1 = require("../core/context");
|
|
12
|
+
const readline_1 = require("readline");
|
|
13
|
+
function promptUser(q) {
|
|
14
|
+
const rl = (0, readline_1.createInterface)({ input: process.stdin, output: process.stdout });
|
|
15
|
+
return new Promise(r => rl.question(`${q} `, a => { rl.close(); r(a.trim()); }));
|
|
16
|
+
}
|
|
12
17
|
async function prCommand(options) {
|
|
13
18
|
const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
|
|
14
19
|
if (!iteration) {
|
|
@@ -16,7 +21,6 @@ async function prCommand(options) {
|
|
|
16
21
|
return;
|
|
17
22
|
}
|
|
18
23
|
const iterDir = `期次-${iteration}`;
|
|
19
|
-
// Find task
|
|
20
24
|
let taskId = options.task;
|
|
21
25
|
if (!taskId) {
|
|
22
26
|
const branch = (0, child_process_1.execSync)('git branch --show-current', { encoding: 'utf-8' }).trim();
|
|
@@ -37,42 +41,110 @@ async function prCommand(options) {
|
|
|
37
41
|
}
|
|
38
42
|
const taskName = taskEntry.name;
|
|
39
43
|
const backendDir = (0, path_1.join)(iterDir, taskName, 'backend');
|
|
40
|
-
const spinner = new logger_1.Spinner(`创建 PR: ${taskName}`);
|
|
41
|
-
spinner.start();
|
|
42
44
|
try {
|
|
43
|
-
// Push current branch
|
|
44
45
|
const branch = (0, child_process_1.execSync)('git branch --show-current', { encoding: 'utf-8' }).trim();
|
|
46
|
+
// ── Interactive mode ──
|
|
47
|
+
if (options.interactive) {
|
|
48
|
+
await interactivePrFlow(branch, backendDir, taskName, iteration, options);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// ── Auto mode ──
|
|
52
|
+
const spinner = new logger_1.Spinner(`创建 PR: ${taskName}`);
|
|
53
|
+
spinner.start();
|
|
45
54
|
(0, child_process_1.execSync)(`git push -u origin "${branch}" 2>/dev/null`, { stdio: 'pipe' });
|
|
46
|
-
// Build PR title + body
|
|
47
55
|
const title = options.title || taskName;
|
|
48
56
|
const body = await buildPrBody(backendDir, taskName, iteration);
|
|
49
|
-
// Detect base branch
|
|
50
57
|
const base = options.base || 'main';
|
|
51
|
-
// Create PR via gh CLI
|
|
52
58
|
const draftFlag = options.draft ? ' --draft' : '';
|
|
53
59
|
const result = (0, child_process_1.execSync)(`gh pr create --base "${base}" --head "${branch}" --title "${title}" --body "${body}"${draftFlag}`, { encoding: 'utf-8', stdio: 'pipe' }).trim();
|
|
54
60
|
spinner.stop(`✅ PR 已创建: ${result}`);
|
|
55
|
-
|
|
56
|
-
const taskMdPath = (0, path_1.join)(backendDir, 'TASK.md');
|
|
57
|
-
if (await (0, fs_extra_1.pathExists)(taskMdPath)) {
|
|
58
|
-
let taskMd = await (0, fs_extra_1.readFile)(taskMdPath, 'utf-8');
|
|
59
|
-
if (!taskMd.includes('## PR')) {
|
|
60
|
-
taskMd += `\n\n## PR\n\n| URL | 状态 |\n| :--- | :--- |\n| ${result} | 🔄 待审查 |\n`;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
taskMd = taskMd.replace('| :--- | :--- |\n', `| :--- | :--- |\n| ${result} | 🔄 待审查 |\n`);
|
|
64
|
-
}
|
|
65
|
-
await require('fs-extra').writeFile(taskMdPath, taskMd);
|
|
66
|
-
}
|
|
61
|
+
await updateTaskMd(backendDir, result);
|
|
67
62
|
logger_1.logger.info(`\n 📄 ${result}`);
|
|
68
|
-
logger_1.logger.info(' 💡 审查通过后: speccore lifecycle --task=' + taskId + ' --status=done');
|
|
69
|
-
logger_1.logger.info('');
|
|
63
|
+
logger_1.logger.info(' 💡 审查通过后: speccore lifecycle --task=' + taskId + ' --status=done\n');
|
|
70
64
|
}
|
|
71
65
|
catch (error) {
|
|
72
|
-
|
|
66
|
+
logger_1.logger.error(`PR 创建失败: ${error}`);
|
|
73
67
|
logger_1.logger.info(' 💡 请确保已安装 gh CLI: brew install gh && gh auth login');
|
|
74
68
|
}
|
|
75
69
|
}
|
|
70
|
+
// ── 分步交互 ──
|
|
71
|
+
async function interactivePrFlow(branch, backendDir, taskName, iteration, options) {
|
|
72
|
+
// 1. 预览变更
|
|
73
|
+
logger_1.logger.info('📋 当前变更:');
|
|
74
|
+
logger_1.logger.info('');
|
|
75
|
+
const status = (0, child_process_1.execSync)('git status --short', { encoding: 'utf-8' }).trim();
|
|
76
|
+
if (!status) {
|
|
77
|
+
logger_1.logger.info(' (无变更)');
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
logger_1.logger.info(status);
|
|
81
|
+
logger_1.logger.info('');
|
|
82
|
+
// 2. 选文件 → add
|
|
83
|
+
const addAns = await promptUser(`提交哪些文件? [a]全部 [p]挑选 [s]跳过提交: `);
|
|
84
|
+
if (addAns === 's') {
|
|
85
|
+
logger_1.logger.info('跳过提交,直接推送已有 commit...');
|
|
86
|
+
}
|
|
87
|
+
else if (addAns === 'p') {
|
|
88
|
+
const files = await promptUser('输入文件路径(空格分隔): ');
|
|
89
|
+
const selected = files.split(/\s+/).filter(Boolean);
|
|
90
|
+
if (selected.length > 0) {
|
|
91
|
+
(0, child_process_1.execSync)(`git add ${selected.join(' ')}`, { stdio: 'pipe' });
|
|
92
|
+
logger_1.logger.info(`✅ 已添加 ${selected.length} 个文件`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
(0, child_process_1.execSync)('git add .', { stdio: 'pipe' });
|
|
97
|
+
logger_1.logger.info('✅ 已添加全部文件');
|
|
98
|
+
}
|
|
99
|
+
// 3. commit(如果有 staged 文件)
|
|
100
|
+
const staged = (0, child_process_1.execSync)('git diff --cached --name-only', { encoding: 'utf-8' }).trim();
|
|
101
|
+
if (staged) {
|
|
102
|
+
logger_1.logger.info(`\n📦 待提交:\n${staged}\n`);
|
|
103
|
+
const commitAns = await promptUser('是否 commit? [y/n]: ');
|
|
104
|
+
if (commitAns === 'y') {
|
|
105
|
+
const msg = await promptUser(`Commit 信息(默认: ${taskName}): `);
|
|
106
|
+
(0, child_process_1.execSync)(`git commit -m "${msg || taskName}"`, { stdio: 'pipe' });
|
|
107
|
+
logger_1.logger.info('✅ 已 commit');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// 4. 推送
|
|
111
|
+
const pushAns = await promptUser('\n推送到 origin? [y/n]: ');
|
|
112
|
+
if (pushAns !== 'y') {
|
|
113
|
+
logger_1.logger.info('已取消推送');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
(0, child_process_1.execSync)(`git push -u origin "${branch}"`, { stdio: 'pipe' });
|
|
117
|
+
logger_1.logger.info(`✅ 已推送 ${branch}`);
|
|
118
|
+
// 5. 创建 PR
|
|
119
|
+
const prAns = await promptUser('\n创建 PR? [y/n]: ');
|
|
120
|
+
if (prAns !== 'y') {
|
|
121
|
+
logger_1.logger.info('已跳过 PR 创建');
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const spinner = new logger_1.Spinner('创建 PR');
|
|
125
|
+
spinner.start();
|
|
126
|
+
const title = options.title || taskName;
|
|
127
|
+
const body = await buildPrBody(backendDir, taskName, iteration);
|
|
128
|
+
const base = options.base || 'main';
|
|
129
|
+
const draftFlag = options.draft ? ' --draft' : '';
|
|
130
|
+
const result = (0, child_process_1.execSync)(`gh pr create --base "${base}" --head "${branch}" --title "${title}" --body "${body}"${draftFlag}`, { encoding: 'utf-8', stdio: 'pipe' }).trim();
|
|
131
|
+
spinner.stop(`✅ PR 已创建: ${result}`);
|
|
132
|
+
await updateTaskMd(backendDir, result);
|
|
133
|
+
logger_1.logger.info(`\n 📄 ${result}\n`);
|
|
134
|
+
}
|
|
135
|
+
async function updateTaskMd(backendDir, prUrl) {
|
|
136
|
+
const taskMdPath = (0, path_1.join)(backendDir, 'TASK.md');
|
|
137
|
+
if (!(await (0, fs_extra_1.pathExists)(taskMdPath)))
|
|
138
|
+
return;
|
|
139
|
+
let md = await (0, fs_extra_1.readFile)(taskMdPath, 'utf-8');
|
|
140
|
+
if (!md.includes('## PR')) {
|
|
141
|
+
md += `\n\n## PR\n\n| URL | 状态 |\n| :--- | :--- |\n| ${prUrl} | 🔄 待审查 |\n`;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
md = md.replace('| :--- | :--- |\n', `| :--- | :--- |\n| ${prUrl} | 🔄 待审查 |\n`);
|
|
145
|
+
}
|
|
146
|
+
await require('fs-extra').writeFile(taskMdPath, md);
|
|
147
|
+
}
|
|
76
148
|
async function buildPrBody(backendDir, taskName, iteration) {
|
|
77
149
|
let body = `## ${taskName}\n\n`;
|
|
78
150
|
// Add REQ summary
|
package/dist/commands/pr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface ScheduleCreateOptions {
|
|
2
|
+
task?: string;
|
|
3
|
+
all?: boolean;
|
|
4
|
+
iteration?: string;
|
|
5
|
+
at: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function scheduleCreateCommand(options: ScheduleCreateOptions): Promise<void>;
|
|
9
|
+
export interface ScheduleListOptions {
|
|
10
|
+
status?: string;
|
|
11
|
+
all?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function scheduleListCommand(options: ScheduleListOptions): Promise<void>;
|
|
14
|
+
export interface ScheduleCancelOptions {
|
|
15
|
+
id: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function scheduleCancelCommand(options: ScheduleCancelOptions): Promise<void>;
|
|
18
|
+
export interface ScheduleDeleteOptions {
|
|
19
|
+
id: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function scheduleDeleteCommand(options: ScheduleDeleteOptions): Promise<void>;
|
|
22
|
+
export interface ScheduleDaemonOptions {
|
|
23
|
+
action?: string;
|
|
24
|
+
foreground?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare function scheduleDaemonCommand(options: ScheduleDaemonOptions): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=schedule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDzF;AAKD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCrF;AAKD,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBzF;AAKD,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzF;AAKD,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DzF"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scheduleCreateCommand = scheduleCreateCommand;
|
|
4
|
+
exports.scheduleListCommand = scheduleListCommand;
|
|
5
|
+
exports.scheduleCancelCommand = scheduleCancelCommand;
|
|
6
|
+
exports.scheduleDeleteCommand = scheduleDeleteCommand;
|
|
7
|
+
exports.scheduleDaemonCommand = scheduleDaemonCommand;
|
|
8
|
+
const logger_1 = require("../utils/logger");
|
|
9
|
+
const context_1 = require("../core/context");
|
|
10
|
+
const schedule_store_1 = require("../core/schedule-store");
|
|
11
|
+
const schedule_engine_1 = require("../core/schedule-engine");
|
|
12
|
+
async function scheduleCreateCommand(options) {
|
|
13
|
+
try {
|
|
14
|
+
// 验证参数
|
|
15
|
+
if (!options.task && !options.all) {
|
|
16
|
+
logger_1.logger.error('必须指定 --task <task-id> 或 --all');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (options.task && options.all) {
|
|
20
|
+
logger_1.logger.error('--task 和 --all 不能同时使用');
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (!options.at) {
|
|
24
|
+
logger_1.logger.error('必须指定 --at "YYYY-MM-DD HH:mm:ss"');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
|
|
28
|
+
if (!iteration) {
|
|
29
|
+
logger_1.logger.error('未找到活跃期次,请使用 --iteration 指定');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const taskName = options.name
|
|
33
|
+
|| (options.all
|
|
34
|
+
? `Batch execute all tasks [${iteration}]`
|
|
35
|
+
: `Execute ${options.task} [${iteration}]`);
|
|
36
|
+
const scheduled = await (0, schedule_store_1.createScheduleTask)({
|
|
37
|
+
name: taskName,
|
|
38
|
+
iteration,
|
|
39
|
+
taskId: options.task || null,
|
|
40
|
+
all: !!options.all,
|
|
41
|
+
scheduledAt: options.at,
|
|
42
|
+
});
|
|
43
|
+
logger_1.logger.success(`调度任务已创建`);
|
|
44
|
+
logger_1.logger.info('');
|
|
45
|
+
logger_1.logger.info(` ID: ${scheduled.id}`);
|
|
46
|
+
logger_1.logger.info(` 任务: ${scheduled.name}`);
|
|
47
|
+
logger_1.logger.info(` 期次: ${scheduled.iteration}`);
|
|
48
|
+
logger_1.logger.info(` 执行时间: ${scheduled.scheduledAt}`);
|
|
49
|
+
logger_1.logger.info(` 状态: ${statusLabel(scheduled.status)}`);
|
|
50
|
+
logger_1.logger.info('');
|
|
51
|
+
logger_1.logger.info('💡 确保 schedule daemon 在运行: speccore schedule daemon start');
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
logger_1.logger.error(`创建调度任务失败: ${error.message}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function scheduleListCommand(options) {
|
|
58
|
+
try {
|
|
59
|
+
const status = options.status;
|
|
60
|
+
const tasks = await (0, schedule_store_1.listScheduleTasks)(status);
|
|
61
|
+
if (tasks.length === 0) {
|
|
62
|
+
logger_1.logger.info('没有调度任务');
|
|
63
|
+
const ds = await (0, schedule_engine_1.daemonStatus)();
|
|
64
|
+
logger_1.logger.info(`调度守护进程: ${ds.running ? '运行中' : '未运行'}`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const ds = await (0, schedule_engine_1.daemonStatus)();
|
|
68
|
+
logger_1.logger.info('');
|
|
69
|
+
logger_1.logger.info(`调度守护进程: ${ds.running ? `🟢 运行中 (PID: ${ds.pid})` : '🔴 未运行'}`);
|
|
70
|
+
logger_1.logger.info('');
|
|
71
|
+
logger_1.logger.info(`共 ${tasks.length} 个调度任务:`);
|
|
72
|
+
logger_1.logger.info('');
|
|
73
|
+
// 表头
|
|
74
|
+
const idHeader = 'ID';
|
|
75
|
+
const nameHeader = '任务名称';
|
|
76
|
+
const timeHeader = '执行时间';
|
|
77
|
+
const statusHeader = '状态';
|
|
78
|
+
logger_1.logger.info(` ${idHeader.padEnd(18)} ${nameHeader.padEnd(30)} ${timeHeader.padEnd(20)} ${statusHeader}`);
|
|
79
|
+
logger_1.logger.info(` ${'─'.repeat(18)} ${'─'.repeat(30)} ${'─'.repeat(20)} ${'─'.repeat(10)}`);
|
|
80
|
+
for (const task of tasks) {
|
|
81
|
+
const shortId = task.id.slice(0, 16);
|
|
82
|
+
const shortName = task.name.length > 28 ? task.name.slice(0, 27) + '…' : task.name;
|
|
83
|
+
const stLabel = statusLabel(task.status);
|
|
84
|
+
logger_1.logger.info(` ${shortId.padEnd(18)} ${shortName.padEnd(30)} ${task.scheduledAt.padEnd(20)} ${stLabel}`);
|
|
85
|
+
}
|
|
86
|
+
logger_1.logger.info('');
|
|
87
|
+
logger_1.logger.info('💡 speccore schedule cancel --id=<id> 取消任务');
|
|
88
|
+
logger_1.logger.info(' speccore schedule daemon start 启动守护进程');
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
logger_1.logger.error(`查看调度任务失败: ${error.message}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function scheduleCancelCommand(options) {
|
|
95
|
+
try {
|
|
96
|
+
if (!options.id) {
|
|
97
|
+
logger_1.logger.error('请指定要取消的任务 ID: --id=<id>');
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const task = await (0, schedule_store_1.cancelScheduleTask)(options.id);
|
|
101
|
+
if (!task) {
|
|
102
|
+
logger_1.logger.error(`未找到调度任务: ${options.id}`);
|
|
103
|
+
logger_1.logger.info('💡 使用 speccore schedule list 查看所有任务');
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
logger_1.logger.success(`已取消调度任务: ${task.name}`);
|
|
107
|
+
logger_1.logger.info(` 原定执行时间: ${task.scheduledAt}`);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
logger_1.logger.error(`取消任务失败: ${error.message}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async function scheduleDeleteCommand(options) {
|
|
114
|
+
try {
|
|
115
|
+
if (!options.id) {
|
|
116
|
+
logger_1.logger.error('请指定要删除的任务 ID: --id=<id>');
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const deleted = await (0, schedule_store_1.deleteScheduleTask)(options.id);
|
|
120
|
+
if (!deleted) {
|
|
121
|
+
logger_1.logger.error(`未找到调度任务: ${options.id}`);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
logger_1.logger.success(`已删除调度记录: ${options.id}`);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
logger_1.logger.error(`删除记录失败: ${error.message}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async function scheduleDaemonCommand(options) {
|
|
131
|
+
try {
|
|
132
|
+
// --foreground 模式(由 start 子命令内部使用)
|
|
133
|
+
if (options.foreground) {
|
|
134
|
+
await (0, schedule_engine_1.runDaemonLoop)();
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const action = options.action || 'status';
|
|
138
|
+
switch (action) {
|
|
139
|
+
case 'start': {
|
|
140
|
+
logger_1.logger.info('正在启动调度守护进程...');
|
|
141
|
+
const started = (0, schedule_engine_1.startDaemon)();
|
|
142
|
+
if (started) {
|
|
143
|
+
logger_1.logger.info('💡 使用 speccore schedule list 查看待执行任务');
|
|
144
|
+
logger_1.logger.info(' speccore schedule daemon stop 停止守护进程');
|
|
145
|
+
logger_1.logger.info(' speccore schedule daemon status 查看状态');
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
case 'stop': {
|
|
150
|
+
logger_1.logger.info('正在停止调度守护进程...');
|
|
151
|
+
(0, schedule_engine_1.stopDaemon)();
|
|
152
|
+
logger_1.logger.success('调度守护进程已停止');
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
case 'restart': {
|
|
156
|
+
logger_1.logger.info('正在重启调度守护进程...');
|
|
157
|
+
(0, schedule_engine_1.stopDaemon)();
|
|
158
|
+
// 等待一下
|
|
159
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
160
|
+
(0, schedule_engine_1.startDaemon)();
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
case 'status':
|
|
164
|
+
default: {
|
|
165
|
+
const ds = await (0, schedule_engine_1.daemonStatus)();
|
|
166
|
+
logger_1.logger.info('');
|
|
167
|
+
if (ds.running) {
|
|
168
|
+
logger_1.logger.info(`调度守护进程: 🟢 运行中`);
|
|
169
|
+
logger_1.logger.info(` PID: ${ds.pid || 'unknown'}`);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
logger_1.logger.info(`调度守护进程: 🔴 未运行`);
|
|
173
|
+
}
|
|
174
|
+
logger_1.logger.info('');
|
|
175
|
+
const pendingTasks = await (0, schedule_store_1.listScheduleTasks)('pending');
|
|
176
|
+
logger_1.logger.info(`待执行任务: ${pendingTasks.length} 个`);
|
|
177
|
+
if (pendingTasks.length > 0) {
|
|
178
|
+
logger_1.logger.info(`下一个任务: ${pendingTasks[0].name} @ ${pendingTasks[0].scheduledAt}`);
|
|
179
|
+
}
|
|
180
|
+
logger_1.logger.info('');
|
|
181
|
+
logger_1.logger.info('💡 speccore schedule daemon start 启动守护进程');
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
logger_1.logger.error(`守护进程操作失败: ${error.message}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// ============================================================
|
|
191
|
+
// Helpers
|
|
192
|
+
// ============================================================
|
|
193
|
+
function statusLabel(status) {
|
|
194
|
+
const map = {
|
|
195
|
+
pending: '⏳ 待执行',
|
|
196
|
+
running: '🔄 执行中',
|
|
197
|
+
completed: '✅ 已完成',
|
|
198
|
+
failed: '❌ 失败',
|
|
199
|
+
cancelled: '🚫 已取消',
|
|
200
|
+
};
|
|
201
|
+
return map[status] || status;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=schedule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
export
|
|
1
|
+
export interface StatusPanelOptions {
|
|
2
|
+
export?: string;
|
|
3
|
+
assignee?: string;
|
|
4
|
+
platform?: string;
|
|
5
|
+
type?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function statusPanelCommand(options?: StatusPanelOptions): Promise<void>;
|
|
8
|
+
export declare function defaultPhase(iterDir: string): Promise<string>;
|
|
2
9
|
//# sourceMappingURL=status-panel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-panel.d.ts","sourceRoot":"","sources":["../../src/commands/status-panel.ts"],"names":[],"mappings":"AASA,
|
|
1
|
+
{"version":3,"file":"status-panel.d.ts","sourceRoot":"","sources":["../../src/commands/status-panel.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyGxF;AAwXD,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUnE"}
|