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
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 调度任务状态
|
|
3
|
+
*/
|
|
4
|
+
export type ScheduleTaskStatus = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
5
|
+
/**
|
|
6
|
+
* 单个调度任务
|
|
7
|
+
*/
|
|
8
|
+
export interface ScheduleTask {
|
|
9
|
+
/** 唯一 ID,自动生成 */
|
|
10
|
+
id: string;
|
|
11
|
+
/** 任务名称/描述 */
|
|
12
|
+
name: string;
|
|
13
|
+
/** 目标期次 */
|
|
14
|
+
iteration: string;
|
|
15
|
+
/** 指定执行的 Task ID(单个模式),null 表示批量模式 */
|
|
16
|
+
taskId: string | null;
|
|
17
|
+
/** 是否 --all 批量模式 */
|
|
18
|
+
all: boolean;
|
|
19
|
+
/** 调度时间,格式: "2026-08-10 21:00:00" */
|
|
20
|
+
scheduledAt: string;
|
|
21
|
+
/** ISO 8601 格式的调度时间 */
|
|
22
|
+
scheduledAtISO: string;
|
|
23
|
+
/** 任务状态 */
|
|
24
|
+
status: ScheduleTaskStatus;
|
|
25
|
+
/** 创建时间 */
|
|
26
|
+
createdAt: string;
|
|
27
|
+
/** 实际执行时间 */
|
|
28
|
+
executedAt: string | null;
|
|
29
|
+
/** 执行结果摘要 */
|
|
30
|
+
result: string | null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 调度存储文件
|
|
34
|
+
*/
|
|
35
|
+
export interface ScheduleStore {
|
|
36
|
+
/** 版本号 */
|
|
37
|
+
version: number;
|
|
38
|
+
/** 所有调度任务 */
|
|
39
|
+
tasks: ScheduleTask[];
|
|
40
|
+
/** 守护进程是否在运行 */
|
|
41
|
+
daemonRunning: boolean;
|
|
42
|
+
/** 守护进程 PID */
|
|
43
|
+
daemonPid: number | null;
|
|
44
|
+
/** 最后更新时间 */
|
|
45
|
+
updatedAt: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 解析时间字符串 "2026-08-10 21:00:00" 为 Date 和 ISO 字符串
|
|
49
|
+
*/
|
|
50
|
+
export declare function parseScheduleTime(timeStr: string): {
|
|
51
|
+
date: Date;
|
|
52
|
+
iso: string;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* 格式化时间为 "YYYY-MM-DD HH:mm:ss"
|
|
56
|
+
*/
|
|
57
|
+
export declare function formatScheduleTime(date: Date): string;
|
|
58
|
+
/**
|
|
59
|
+
* 加载调度存储
|
|
60
|
+
*/
|
|
61
|
+
export declare function loadScheduleStore(): Promise<ScheduleStore>;
|
|
62
|
+
/**
|
|
63
|
+
* 保存调度存储
|
|
64
|
+
*/
|
|
65
|
+
export declare function saveScheduleStore(store: ScheduleStore): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* 创建调度任务
|
|
68
|
+
*/
|
|
69
|
+
export declare function createScheduleTask(params: {
|
|
70
|
+
name: string;
|
|
71
|
+
iteration: string;
|
|
72
|
+
taskId: string | null;
|
|
73
|
+
all: boolean;
|
|
74
|
+
scheduledAt: string;
|
|
75
|
+
}): Promise<ScheduleTask>;
|
|
76
|
+
/**
|
|
77
|
+
* 获取所有待执行的任务(按调度时间排序)
|
|
78
|
+
*/
|
|
79
|
+
export declare function getPendingTasks(): Promise<ScheduleTask[]>;
|
|
80
|
+
/**
|
|
81
|
+
* 获取所有任务(按状态筛选)
|
|
82
|
+
*/
|
|
83
|
+
export declare function listScheduleTasks(status?: ScheduleTaskStatus): Promise<ScheduleTask[]>;
|
|
84
|
+
/**
|
|
85
|
+
* 更新任务状态
|
|
86
|
+
*/
|
|
87
|
+
export declare function updateScheduleTask(taskId: string, updates: Partial<Pick<ScheduleTask, 'status' | 'executedAt' | 'result'>>): Promise<ScheduleTask | null>;
|
|
88
|
+
/**
|
|
89
|
+
* 取消调度任务
|
|
90
|
+
*/
|
|
91
|
+
export declare function cancelScheduleTask(taskId: string): Promise<ScheduleTask | null>;
|
|
92
|
+
/**
|
|
93
|
+
* 删除调度任务(物理删除)
|
|
94
|
+
*/
|
|
95
|
+
export declare function deleteScheduleTask(taskId: string): Promise<boolean>;
|
|
96
|
+
/**
|
|
97
|
+
* 获取所有已到期但未执行的任务
|
|
98
|
+
*/
|
|
99
|
+
export declare function getDueTasks(): Promise<ScheduleTask[]>;
|
|
100
|
+
/**
|
|
101
|
+
* 更新守护进程状态
|
|
102
|
+
*/
|
|
103
|
+
export declare function updateDaemonStatus(running: boolean, pid: number | null): Promise<void>;
|
|
104
|
+
//# sourceMappingURL=schedule-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-store.d.ts","sourceRoot":"","sources":["../../src/core/schedule-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseScheduleTime = parseScheduleTime;
|
|
4
|
+
exports.formatScheduleTime = formatScheduleTime;
|
|
5
|
+
exports.loadScheduleStore = loadScheduleStore;
|
|
6
|
+
exports.saveScheduleStore = saveScheduleStore;
|
|
7
|
+
exports.createScheduleTask = createScheduleTask;
|
|
8
|
+
exports.getPendingTasks = getPendingTasks;
|
|
9
|
+
exports.listScheduleTasks = listScheduleTasks;
|
|
10
|
+
exports.updateScheduleTask = updateScheduleTask;
|
|
11
|
+
exports.cancelScheduleTask = cancelScheduleTask;
|
|
12
|
+
exports.deleteScheduleTask = deleteScheduleTask;
|
|
13
|
+
exports.getDueTasks = getDueTasks;
|
|
14
|
+
exports.updateDaemonStatus = updateDaemonStatus;
|
|
15
|
+
const fs_extra_1 = require("fs-extra");
|
|
16
|
+
const SCHEDULE_PATH = '.speccore/local/schedule.json';
|
|
17
|
+
/**
|
|
18
|
+
* 生成唯一 ID
|
|
19
|
+
*/
|
|
20
|
+
function generateId() {
|
|
21
|
+
const ts = Date.now().toString(36);
|
|
22
|
+
const rand = Math.random().toString(36).substring(2, 8);
|
|
23
|
+
return `sch-${ts}-${rand}`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 解析时间字符串 "2026-08-10 21:00:00" 为 Date 和 ISO 字符串
|
|
27
|
+
*/
|
|
28
|
+
function parseScheduleTime(timeStr) {
|
|
29
|
+
// 支持 "YYYY-MM-DD HH:mm:ss" 格式
|
|
30
|
+
const match = timeStr.match(/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/);
|
|
31
|
+
if (!match) {
|
|
32
|
+
throw new Error(`Invalid time format: "${timeStr}". Expected: YYYY-MM-DD HH:mm:ss (e.g., 2026-08-10 21:00:00)`);
|
|
33
|
+
}
|
|
34
|
+
const [, y, m, d, h, min, s] = match;
|
|
35
|
+
// 使用本地时间构造
|
|
36
|
+
const date = new Date(parseInt(y), parseInt(m) - 1, parseInt(d), parseInt(h), parseInt(min), parseInt(s));
|
|
37
|
+
if (isNaN(date.getTime())) {
|
|
38
|
+
throw new Error(`Invalid date/time: "${timeStr}"`);
|
|
39
|
+
}
|
|
40
|
+
return { date, iso: date.toISOString() };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 格式化时间为 "YYYY-MM-DD HH:mm:ss"
|
|
44
|
+
*/
|
|
45
|
+
function formatScheduleTime(date) {
|
|
46
|
+
const y = date.getFullYear();
|
|
47
|
+
const m = String(date.getMonth() + 1).padStart(2, '0');
|
|
48
|
+
const d = String(date.getDate()).padStart(2, '0');
|
|
49
|
+
const h = String(date.getHours()).padStart(2, '0');
|
|
50
|
+
const min = String(date.getMinutes()).padStart(2, '0');
|
|
51
|
+
const s = String(date.getSeconds()).padStart(2, '0');
|
|
52
|
+
return `${y}-${m}-${d} ${h}:${min}:${s}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 加载调度存储
|
|
56
|
+
*/
|
|
57
|
+
async function loadScheduleStore() {
|
|
58
|
+
if (await (0, fs_extra_1.pathExists)(SCHEDULE_PATH)) {
|
|
59
|
+
return await (0, fs_extra_1.readJson)(SCHEDULE_PATH);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
version: 1,
|
|
63
|
+
tasks: [],
|
|
64
|
+
daemonRunning: false,
|
|
65
|
+
daemonPid: null,
|
|
66
|
+
updatedAt: new Date().toISOString(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 保存调度存储
|
|
71
|
+
*/
|
|
72
|
+
async function saveScheduleStore(store) {
|
|
73
|
+
await (0, fs_extra_1.ensureDir)('.speccore/local');
|
|
74
|
+
store.updatedAt = new Date().toISOString();
|
|
75
|
+
await (0, fs_extra_1.writeJson)(SCHEDULE_PATH, store, { spaces: 2 });
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 创建调度任务
|
|
79
|
+
*/
|
|
80
|
+
async function createScheduleTask(params) {
|
|
81
|
+
const { date, iso } = parseScheduleTime(params.scheduledAt);
|
|
82
|
+
const now = new Date();
|
|
83
|
+
if (date <= now) {
|
|
84
|
+
throw new Error(`Scheduled time must be in the future. Got: ${params.scheduledAt}, current: ${formatScheduleTime(now)}`);
|
|
85
|
+
}
|
|
86
|
+
const store = await loadScheduleStore();
|
|
87
|
+
const task = {
|
|
88
|
+
id: generateId(),
|
|
89
|
+
name: params.name,
|
|
90
|
+
iteration: params.iteration,
|
|
91
|
+
taskId: params.taskId,
|
|
92
|
+
all: params.all,
|
|
93
|
+
scheduledAt: params.scheduledAt,
|
|
94
|
+
scheduledAtISO: iso,
|
|
95
|
+
status: 'pending',
|
|
96
|
+
createdAt: now.toISOString(),
|
|
97
|
+
executedAt: null,
|
|
98
|
+
result: null,
|
|
99
|
+
};
|
|
100
|
+
store.tasks.push(task);
|
|
101
|
+
await saveScheduleStore(store);
|
|
102
|
+
return task;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 获取所有待执行的任务(按调度时间排序)
|
|
106
|
+
*/
|
|
107
|
+
async function getPendingTasks() {
|
|
108
|
+
const store = await loadScheduleStore();
|
|
109
|
+
return store.tasks
|
|
110
|
+
.filter(t => t.status === 'pending')
|
|
111
|
+
.sort((a, b) => new Date(a.scheduledAtISO).getTime() - new Date(b.scheduledAtISO).getTime());
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 获取所有任务(按状态筛选)
|
|
115
|
+
*/
|
|
116
|
+
async function listScheduleTasks(status) {
|
|
117
|
+
const store = await loadScheduleStore();
|
|
118
|
+
if (status) {
|
|
119
|
+
return store.tasks.filter(t => t.status === status);
|
|
120
|
+
}
|
|
121
|
+
return [...store.tasks].sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 更新任务状态
|
|
125
|
+
*/
|
|
126
|
+
async function updateScheduleTask(taskId, updates) {
|
|
127
|
+
const store = await loadScheduleStore();
|
|
128
|
+
const task = store.tasks.find(t => t.id === taskId);
|
|
129
|
+
if (!task)
|
|
130
|
+
return null;
|
|
131
|
+
if (updates.status !== undefined)
|
|
132
|
+
task.status = updates.status;
|
|
133
|
+
if (updates.executedAt !== undefined)
|
|
134
|
+
task.executedAt = updates.executedAt;
|
|
135
|
+
if (updates.result !== undefined)
|
|
136
|
+
task.result = updates.result;
|
|
137
|
+
await saveScheduleStore(store);
|
|
138
|
+
return task;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 取消调度任务
|
|
142
|
+
*/
|
|
143
|
+
async function cancelScheduleTask(taskId) {
|
|
144
|
+
const store = await loadScheduleStore();
|
|
145
|
+
const task = store.tasks.find(t => t.id === taskId);
|
|
146
|
+
if (!task)
|
|
147
|
+
return null;
|
|
148
|
+
if (task.status !== 'pending') {
|
|
149
|
+
throw new Error(`Cannot cancel task "${taskId}" — current status is "${task.status}"`);
|
|
150
|
+
}
|
|
151
|
+
task.status = 'cancelled';
|
|
152
|
+
await saveScheduleStore(store);
|
|
153
|
+
return task;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 删除调度任务(物理删除)
|
|
157
|
+
*/
|
|
158
|
+
async function deleteScheduleTask(taskId) {
|
|
159
|
+
const store = await loadScheduleStore();
|
|
160
|
+
const idx = store.tasks.findIndex(t => t.id === taskId);
|
|
161
|
+
if (idx === -1)
|
|
162
|
+
return false;
|
|
163
|
+
store.tasks.splice(idx, 1);
|
|
164
|
+
await saveScheduleStore(store);
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 获取所有已到期但未执行的任务
|
|
169
|
+
*/
|
|
170
|
+
async function getDueTasks() {
|
|
171
|
+
const store = await loadScheduleStore();
|
|
172
|
+
const now = new Date();
|
|
173
|
+
return store.tasks.filter(t => {
|
|
174
|
+
if (t.status !== 'pending')
|
|
175
|
+
return false;
|
|
176
|
+
return new Date(t.scheduledAtISO) <= now;
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* 更新守护进程状态
|
|
181
|
+
*/
|
|
182
|
+
async function updateDaemonStatus(running, pid) {
|
|
183
|
+
const store = await loadScheduleStore();
|
|
184
|
+
store.daemonRunning = running;
|
|
185
|
+
store.daemonPid = pid;
|
|
186
|
+
await saveScheduleStore(store);
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=schedule-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-store.js","sourceRoot":"","sources":["../../src/core/schedule-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
export declare const IterationStatusSchema: z.ZodEnum<{
|
|
7
|
-
completed: "completed";
|
|
8
7
|
archived: "archived";
|
|
9
|
-
|
|
8
|
+
completed: "completed";
|
|
10
9
|
active: "active";
|
|
10
|
+
planning: "planning";
|
|
11
11
|
paused: "paused";
|
|
12
12
|
}>;
|
|
13
13
|
export declare const IterationGoalSchema: z.ZodObject<{
|
|
@@ -28,10 +28,10 @@ export declare const IterationSchema: z.ZodObject<{
|
|
|
28
28
|
id: z.ZodString;
|
|
29
29
|
name: z.ZodString;
|
|
30
30
|
status: z.ZodDefault<z.ZodEnum<{
|
|
31
|
-
completed: "completed";
|
|
32
31
|
archived: "archived";
|
|
33
|
-
|
|
32
|
+
completed: "completed";
|
|
34
33
|
active: "active";
|
|
34
|
+
planning: "planning";
|
|
35
35
|
paused: "paused";
|
|
36
36
|
}>>;
|
|
37
37
|
priority: z.ZodDefault<z.ZodEnum<{
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
export declare const TaskStatusSchema: z.ZodEnum<{
|
|
7
|
+
archived: "archived";
|
|
7
8
|
pending: "pending";
|
|
8
9
|
in_progress: "in_progress";
|
|
9
10
|
completed: "completed";
|
|
10
11
|
blocked: "blocked";
|
|
11
|
-
archived: "archived";
|
|
12
12
|
}>;
|
|
13
13
|
export declare const TaskTypeSchema: z.ZodEnum<{
|
|
14
14
|
feature: "feature";
|
|
@@ -61,11 +61,11 @@ export declare const TaskSchema: z.ZodObject<{
|
|
|
61
61
|
document: "document";
|
|
62
62
|
}>;
|
|
63
63
|
status: z.ZodDefault<z.ZodEnum<{
|
|
64
|
+
archived: "archived";
|
|
64
65
|
pending: "pending";
|
|
65
66
|
in_progress: "in_progress";
|
|
66
67
|
completed: "completed";
|
|
67
68
|
blocked: "blocked";
|
|
68
|
-
archived: "archived";
|
|
69
69
|
}>>;
|
|
70
70
|
priority: z.ZodDefault<z.ZodEnum<{
|
|
71
71
|
high: "high";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "speccore",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.22.0",
|
|
4
4
|
"description": "SpecCore - Code by Spec, Not by Vibe.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -8,12 +8,10 @@
|
|
|
8
8
|
"speccore": "./bin/speccore"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
|
-
"build": "tsc
|
|
11
|
+
"build": "tsc",
|
|
12
12
|
"watch": "tsc --watch",
|
|
13
13
|
"prepublish": "npm run build",
|
|
14
|
-
"test": "
|
|
15
|
-
"test:watch": "vitest",
|
|
16
|
-
"test:coverage": "vitest run --coverage",
|
|
14
|
+
"test": "jest",
|
|
17
15
|
"lint": "eslint src/**/*.ts"
|
|
18
16
|
},
|
|
19
17
|
"keywords": [
|
|
@@ -36,20 +34,16 @@
|
|
|
36
34
|
"dependencies": {
|
|
37
35
|
"commander": "^11.1.0",
|
|
38
36
|
"fs-extra": "^11.2.0",
|
|
39
|
-
"
|
|
40
|
-
"js-yaml": "^4.1.0"
|
|
41
|
-
"zod": "^4.4.3"
|
|
37
|
+
"glob": "^10.3.10",
|
|
38
|
+
"js-yaml": "^4.1.0"
|
|
42
39
|
},
|
|
43
40
|
"devDependencies": {
|
|
44
41
|
"@types/fs-extra": "^11.0.4",
|
|
45
|
-
"@types/inquirer": "^9.0.10",
|
|
46
42
|
"@types/js-yaml": "^4.0.9",
|
|
47
43
|
"@types/node": "^20.10.5",
|
|
48
|
-
"
|
|
49
|
-
"typescript": "^5.3.3",
|
|
50
|
-
"vitest": "^4.1.10"
|
|
44
|
+
"typescript": "^5.3.3"
|
|
51
45
|
},
|
|
52
46
|
"engines": {
|
|
53
47
|
"node": ">=18.0.0"
|
|
54
48
|
}
|
|
55
|
-
}
|
|
49
|
+
}
|
package/dist/commands/demo.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../src/commands/demo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAoBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCrE"}
|
package/dist/commands/demo.js
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* demo - 快速体验命令
|
|
4
|
-
* 5 分钟快速体验 SpecCore 完整流程,内置示例项目
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.demoCommand = demoCommand;
|
|
8
|
-
const logger_1 = require("../utils/logger");
|
|
9
|
-
const fs_extra_1 = require("fs-extra");
|
|
10
|
-
const path_1 = require("path");
|
|
11
|
-
const DEMO_PROJECTS = {
|
|
12
|
-
book: {
|
|
13
|
-
name: '图书管理系统',
|
|
14
|
-
description: 'CRUD + 借阅管理,包含用户认证、图书录入、借阅/归还流程',
|
|
15
|
-
features: ['用户注册登录', '图书增删改查', '借阅管理', '超期罚款'],
|
|
16
|
-
},
|
|
17
|
-
todo: {
|
|
18
|
-
name: '待办事项管理',
|
|
19
|
-
description: '任务创建、状态流转、分类筛选',
|
|
20
|
-
features: ['任务CRUD', '状态流转(未开始/进行中/已完成)', '分类标签', '截止日期提醒'],
|
|
21
|
-
},
|
|
22
|
-
blog: {
|
|
23
|
-
name: '博客系统',
|
|
24
|
-
description: '文章发布、评论管理、标签分类',
|
|
25
|
-
features: ['文章发布编辑', '评论管理', '标签分类', 'Markdown 编辑器'],
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
async function demoCommand(options) {
|
|
29
|
-
if (options.list) {
|
|
30
|
-
showDemoList();
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
const projectKey = options.project || 'book';
|
|
34
|
-
const project = DEMO_PROJECTS[projectKey];
|
|
35
|
-
if (!project) {
|
|
36
|
-
logger_1.logger.error(`未知示例 "${projectKey}"。可用的示例:`);
|
|
37
|
-
showDemoList();
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
const spinner = new logger_1.Spinner(`正在创建 ${project.name} 示例项目...`);
|
|
41
|
-
spinner.start();
|
|
42
|
-
try {
|
|
43
|
-
await createDemoProject(projectKey, project);
|
|
44
|
-
spinner.stop(`${project.name} 示例项目创建完成!`);
|
|
45
|
-
logger_1.logger.info('');
|
|
46
|
-
logger_1.logger.info('🚀 快速体验 SpecCore:');
|
|
47
|
-
logger_1.logger.info(` 1. 查看需求: cat 期次-${projectKey}/00-需求文档/REQUIREMENT.md`);
|
|
48
|
-
logger_1.logger.info(` 2. 查看项目图谱: cat 期次-${projectKey}/00-期次总览/PROJECT_GRAPH.md`);
|
|
49
|
-
logger_1.logger.info(` 3. 查看进度: speccore progress --iteration=期次-${projectKey}`);
|
|
50
|
-
logger_1.logger.info(` 4. 查看状态: speccore status --iteration=期次-${projectKey}`);
|
|
51
|
-
logger_1.logger.info(` 5. 生成报告: speccore report --iteration=期次-${projectKey} --format=markdown`);
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
spinner.fail(`示例创建失败: ${error}`);
|
|
55
|
-
throw error;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
function showDemoList() {
|
|
59
|
-
logger_1.logger.info('🎮 可用的示例项目:');
|
|
60
|
-
logger_1.logger.info('');
|
|
61
|
-
for (const [key, project] of Object.entries(DEMO_PROJECTS)) {
|
|
62
|
-
logger_1.logger.info(` ${key} - ${project.name}`);
|
|
63
|
-
logger_1.logger.info(` ${project.description}`);
|
|
64
|
-
logger_1.logger.info(` 特性: ${project.features.join('、')}`);
|
|
65
|
-
logger_1.logger.info('');
|
|
66
|
-
}
|
|
67
|
-
logger_1.logger.info('用法: speccore demo --project=<key>');
|
|
68
|
-
logger_1.logger.info('例如: speccore demo --project=todo');
|
|
69
|
-
}
|
|
70
|
-
async function createDemoProject(key, project) {
|
|
71
|
-
const iterationName = `期次-${key}`;
|
|
72
|
-
const iterDir = (0, path_1.join)(process.cwd(), iterationName);
|
|
73
|
-
if (await (0, fs_extra_1.pathExists)(iterDir)) {
|
|
74
|
-
logger_1.logger.warn(`期次 ${iterationName} 已存在,将复用现有结构。`);
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
// 创建期次目录
|
|
78
|
-
await (0, fs_extra_1.ensureDir)((0, path_1.join)(iterDir, '00-需求文档'));
|
|
79
|
-
await (0, fs_extra_1.ensureDir)((0, path_1.join)(iterDir, '00-技术文档'));
|
|
80
|
-
await (0, fs_extra_1.ensureDir)((0, path_1.join)(iterDir, '00-期次总览'));
|
|
81
|
-
// 需求文档
|
|
82
|
-
const featuresList = project.features.map((f, i) => `${i + 1}. ${f}`).join('\n');
|
|
83
|
-
await (0, fs_extra_1.writeFile)((0, path_1.join)(iterDir, '00-需求文档', 'REQUIREMENT.md'), `# ${project.name} - 需求文档\n\n` +
|
|
84
|
-
`## 1. 项目背景\n\n${project.description}\n\n` +
|
|
85
|
-
`## 2. 功能清单\n\n${featuresList}\n\n` +
|
|
86
|
-
`## 3. 非功能需求\n\n- 性能:接口响应时间 < 500ms\n` +
|
|
87
|
-
`- 安全:JWT 认证,密码 BCrypt 加密\n` +
|
|
88
|
-
`- 可用性:99.9%\n\n` +
|
|
89
|
-
`## 4. 验收标准\n\n` +
|
|
90
|
-
project.features.map((f) => `- [ ] ${f} 功能可用`).join('\n') + `\n`);
|
|
91
|
-
// 技术文档
|
|
92
|
-
await (0, fs_extra_1.writeFile)((0, path_1.join)(iterDir, '00-技术文档', 'ARCHITECTURE.md'), `# ${project.name} - 技术架构\n\n` +
|
|
93
|
-
`## 1. 整体架构\n\n采用前后端分离架构\n\n` +
|
|
94
|
-
`\`\`\`\n` +
|
|
95
|
-
`[前端] ← HTTP/REST → [后端] ← [数据库]\n` +
|
|
96
|
-
`\`\`\`\n\n` +
|
|
97
|
-
`## 2. 技术选型\n\n` +
|
|
98
|
-
`| 层 | 技术 |\n` +
|
|
99
|
-
`| :--- | :--- |\n` +
|
|
100
|
-
`| 前端 | Vue 3 + TypeScript + Element Plus |\n` +
|
|
101
|
-
`| 后端 | Spring Boot 3 + MyBatis Plus |\n` +
|
|
102
|
-
`| 数据库 | MySQL 8.0 |\n` +
|
|
103
|
-
`| 缓存 | Redis |\n\n` +
|
|
104
|
-
`## 3. 决策记录\n\n` +
|
|
105
|
-
`| 决策 | 方案 | 理由 |\n` +
|
|
106
|
-
`| :--- | :--- | :--- |\n` +
|
|
107
|
-
`| 认证方案 | JWT | 无状态,适合微服务扩展 |\n` +
|
|
108
|
-
`| 密码加密 | BCrypt | 业界标准,抗暴力破解 |\n` +
|
|
109
|
-
`| API 规范 | RESTful | 通用性强,容易理解 |\n`);
|
|
110
|
-
// 项目图谱
|
|
111
|
-
await (0, fs_extra_1.writeFile)((0, path_1.join)(iterDir, '00-期次总览', 'PROJECT_GRAPH.md'), `# ${project.name} - 项目图谱\n\n` +
|
|
112
|
-
`## 1. 任务依赖关系\n\n` +
|
|
113
|
-
`\`\`\`mermaid\n` +
|
|
114
|
-
`graph TD\n` +
|
|
115
|
-
` Task-001[用户注册登录] --> Task-002[核心业务 CRUD]\n` +
|
|
116
|
-
` Task-002 --> Task-003[高级功能]\n` +
|
|
117
|
-
` Task-002 --> Task-004[管理后台]\n` +
|
|
118
|
-
`\`\`\`\n\n` +
|
|
119
|
-
`## 2. 任务列表\n\n` +
|
|
120
|
-
`| 任务 | 类型 | 状态 | 负责人 | 依赖 |\n` +
|
|
121
|
-
`| :--- | :--- | :--- | :--- | :--- |\n` +
|
|
122
|
-
`| Task-001 用户注册登录 | feature | 🔲 待开发 | | |\n` +
|
|
123
|
-
`| Task-002 核心业务 | feature | 🔲 待开发 | | Task-001 |\n` +
|
|
124
|
-
`| Task-003 高级功能 | feature | 🔲 待开发 | | Task-002 |\n` +
|
|
125
|
-
`| Task-004 管理后台 | feature | 🔲 待开发 | | Task-002 |\n`);
|
|
126
|
-
// 创建示例任务
|
|
127
|
-
const tasks = [
|
|
128
|
-
{ id: 'Task-001', name: '用户注册登录', type: 'feature' },
|
|
129
|
-
{ id: 'Task-002', name: '核心业务', type: 'feature' },
|
|
130
|
-
{ id: 'Task-003', name: '高级功能', type: 'feature' },
|
|
131
|
-
{ id: 'Task-004', name: '管理后台', type: 'feature' },
|
|
132
|
-
];
|
|
133
|
-
for (const task of tasks) {
|
|
134
|
-
const taskDir = (0, path_1.join)(iterDir, task.id);
|
|
135
|
-
await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, 'backend'));
|
|
136
|
-
await (0, fs_extra_1.ensureDir)((0, path_1.join)(taskDir, '_shared'));
|
|
137
|
-
await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '.task-type'), task.type);
|
|
138
|
-
await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'backend', 'REQ.md'), `# ${task.name} - 后端需求\n\n` +
|
|
139
|
-
`## 1. 需求描述\n\n待补充\n\n` +
|
|
140
|
-
`## 2. 验收标准\n\n- [ ] 功能可用\n`);
|
|
141
|
-
await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'backend', 'TASK.md'), `# ${task.name} - 执行追踪\n\n` +
|
|
142
|
-
`> 任务类型: ${task.type} | 状态: 🔲 待开发\n\n` +
|
|
143
|
-
`## 1. 变更履历\n\n` +
|
|
144
|
-
`| 日期 | 版本 | 变更说明 | 作者 |\n` +
|
|
145
|
-
`| :--- | :--- | :--- | :--- |\n` +
|
|
146
|
-
`| ${new Date().toISOString().split('T')[0]} | v1.0 | 初始创建 | SpecCore |\n`);
|
|
147
|
-
await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, 'backend', 'TECH.md'), `# ${task.name} - 技术方案\n\n## 1. 方案概述\n\n待补充\n`);
|
|
148
|
-
await (0, fs_extra_1.writeFile)((0, path_1.join)(taskDir, '_shared', 'API_CONTRACT.yaml'), `# ${task.name} - API 契约\nopenapi: "3.0.3"\ninfo:\n title: ${task.name}\n version: "1.0.0"\npaths: {}\n`);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
//# sourceMappingURL=demo.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/commands/demo.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/goal.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* goal - 完整需求交付命令
|
|
3
|
-
* 从需求描述出发,自动创建任务并生成完整的 Spec 文档结构
|
|
4
|
-
*/
|
|
5
|
-
export interface GoalOptions {
|
|
6
|
-
name?: string;
|
|
7
|
-
desc?: string;
|
|
8
|
-
type?: string;
|
|
9
|
-
taskId?: string;
|
|
10
|
-
iteration?: string;
|
|
11
|
-
backendOnly?: boolean;
|
|
12
|
-
frontendOnly?: boolean;
|
|
13
|
-
}
|
|
14
|
-
export declare function goalCommand(options: GoalOptions): Promise<void>;
|
|
15
|
-
//# sourceMappingURL=goal.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"goal.d.ts","sourceRoot":"","sources":["../../src/commands/goal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFrE"}
|