spec-manager 0.1.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.
Files changed (159) hide show
  1. package/AGENTS.md +27 -0
  2. package/CODEBUDDY.md +19 -0
  3. package/LICENSE +21 -0
  4. package/README.md +531 -0
  5. package/dist/cli/audit.d.ts +10 -0
  6. package/dist/cli/audit.d.ts.map +1 -0
  7. package/dist/cli/audit.js +62 -0
  8. package/dist/cli/audit.js.map +1 -0
  9. package/dist/cli/change.d.ts +10 -0
  10. package/dist/cli/change.d.ts.map +1 -0
  11. package/dist/cli/change.js +103 -0
  12. package/dist/cli/change.js.map +1 -0
  13. package/dist/cli/common.d.ts +5 -0
  14. package/dist/cli/common.d.ts.map +1 -0
  15. package/dist/cli/common.js +17 -0
  16. package/dist/cli/common.js.map +1 -0
  17. package/dist/cli/decision.d.ts +13 -0
  18. package/dist/cli/decision.d.ts.map +1 -0
  19. package/dist/cli/decision.js +185 -0
  20. package/dist/cli/decision.js.map +1 -0
  21. package/dist/cli/dict.d.ts +10 -0
  22. package/dist/cli/dict.d.ts.map +1 -0
  23. package/dist/cli/dict.js +73 -0
  24. package/dist/cli/dict.js.map +1 -0
  25. package/dist/cli/incident.d.ts +10 -0
  26. package/dist/cli/incident.d.ts.map +1 -0
  27. package/dist/cli/incident.js +119 -0
  28. package/dist/cli/incident.js.map +1 -0
  29. package/dist/cli/index.d.ts +3 -0
  30. package/dist/cli/index.d.ts.map +1 -0
  31. package/dist/cli/index.js +30 -0
  32. package/dist/cli/index.js.map +1 -0
  33. package/dist/cli/project.d.ts +3 -0
  34. package/dist/cli/project.d.ts.map +1 -0
  35. package/dist/cli/project.js +144 -0
  36. package/dist/cli/project.js.map +1 -0
  37. package/dist/cli/spec.d.ts +3 -0
  38. package/dist/cli/spec.d.ts.map +1 -0
  39. package/dist/cli/spec.js +289 -0
  40. package/dist/cli/spec.js.map +1 -0
  41. package/dist/cli/task.d.ts +14 -0
  42. package/dist/cli/task.d.ts.map +1 -0
  43. package/dist/cli/task.js +287 -0
  44. package/dist/cli/task.js.map +1 -0
  45. package/dist/cli/usability.d.ts +3 -0
  46. package/dist/cli/usability.d.ts.map +1 -0
  47. package/dist/cli/usability.js +153 -0
  48. package/dist/cli/usability.js.map +1 -0
  49. package/dist/core/agents.d.ts +43 -0
  50. package/dist/core/agents.d.ts.map +1 -0
  51. package/dist/core/agents.js +194 -0
  52. package/dist/core/agents.js.map +1 -0
  53. package/dist/core/archive.d.ts +35 -0
  54. package/dist/core/archive.d.ts.map +1 -0
  55. package/dist/core/archive.js +360 -0
  56. package/dist/core/archive.js.map +1 -0
  57. package/dist/core/audit-events.d.ts +12 -0
  58. package/dist/core/audit-events.d.ts.map +1 -0
  59. package/dist/core/audit-events.js +16 -0
  60. package/dist/core/audit-events.js.map +1 -0
  61. package/dist/core/audit.d.ts +78 -0
  62. package/dist/core/audit.d.ts.map +1 -0
  63. package/dist/core/audit.js +157 -0
  64. package/dist/core/audit.js.map +1 -0
  65. package/dist/core/constants.d.ts +28 -0
  66. package/dist/core/constants.d.ts.map +1 -0
  67. package/dist/core/constants.js +30 -0
  68. package/dist/core/constants.js.map +1 -0
  69. package/dist/core/decision.d.ts +69 -0
  70. package/dist/core/decision.d.ts.map +1 -0
  71. package/dist/core/decision.js +210 -0
  72. package/dist/core/decision.js.map +1 -0
  73. package/dist/core/delta.d.ts +85 -0
  74. package/dist/core/delta.d.ts.map +1 -0
  75. package/dist/core/delta.js +264 -0
  76. package/dist/core/delta.js.map +1 -0
  77. package/dist/core/dict.d.ts +28 -0
  78. package/dist/core/dict.d.ts.map +1 -0
  79. package/dist/core/dict.js +57 -0
  80. package/dist/core/dict.js.map +1 -0
  81. package/dist/core/frontmatter.d.ts +19 -0
  82. package/dist/core/frontmatter.d.ts.map +1 -0
  83. package/dist/core/frontmatter.js +57 -0
  84. package/dist/core/frontmatter.js.map +1 -0
  85. package/dist/core/incident.d.ts +45 -0
  86. package/dist/core/incident.d.ts.map +1 -0
  87. package/dist/core/incident.js +128 -0
  88. package/dist/core/incident.js.map +1 -0
  89. package/dist/core/paths.d.ts +68 -0
  90. package/dist/core/paths.d.ts.map +1 -0
  91. package/dist/core/paths.js +162 -0
  92. package/dist/core/paths.js.map +1 -0
  93. package/dist/core/repository.d.ts +13 -0
  94. package/dist/core/repository.d.ts.map +1 -0
  95. package/dist/core/repository.js +29 -0
  96. package/dist/core/repository.js.map +1 -0
  97. package/dist/core/spec-io.d.ts +125 -0
  98. package/dist/core/spec-io.d.ts.map +1 -0
  99. package/dist/core/spec-io.js +260 -0
  100. package/dist/core/spec-io.js.map +1 -0
  101. package/dist/core/status.d.ts +22 -0
  102. package/dist/core/status.d.ts.map +1 -0
  103. package/dist/core/status.js +54 -0
  104. package/dist/core/status.js.map +1 -0
  105. package/dist/core/task.d.ts +118 -0
  106. package/dist/core/task.d.ts.map +1 -0
  107. package/dist/core/task.js +340 -0
  108. package/dist/core/task.js.map +1 -0
  109. package/dist/core/usability.d.ts +25 -0
  110. package/dist/core/usability.d.ts.map +1 -0
  111. package/dist/core/usability.js +136 -0
  112. package/dist/core/usability.js.map +1 -0
  113. package/dist/core/validate.d.ts +34 -0
  114. package/dist/core/validate.d.ts.map +1 -0
  115. package/dist/core/validate.js +195 -0
  116. package/dist/core/validate.js.map +1 -0
  117. package/dist/index.d.ts +11 -0
  118. package/dist/index.d.ts.map +1 -0
  119. package/dist/index.js +12 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/schemas/change.d.ts +138 -0
  122. package/dist/schemas/change.d.ts.map +1 -0
  123. package/dist/schemas/change.js +38 -0
  124. package/dist/schemas/change.js.map +1 -0
  125. package/dist/schemas/spec.d.ts +233 -0
  126. package/dist/schemas/spec.d.ts.map +1 -0
  127. package/dist/schemas/spec.js +56 -0
  128. package/dist/schemas/spec.js.map +1 -0
  129. package/package.json +66 -0
  130. package/rules/_TEMPLATE.md +20 -0
  131. package/rules/code-discipline.md +47 -0
  132. package/rules/codebase-survey.md +37 -0
  133. package/rules/delta.md +42 -0
  134. package/rules/doc-governance.md +195 -0
  135. package/rules/flow-control.md +65 -0
  136. package/rules/quality-gate.md +73 -0
  137. package/skill/SKILL.md +90 -0
  138. package/skill/subskills/adr.md +73 -0
  139. package/skill/subskills/change.md +118 -0
  140. package/skill/subskills/design.md +53 -0
  141. package/skill/subskills/impl.md +100 -0
  142. package/skill/subskills/plan.md +46 -0
  143. package/skill/subskills/postmortem.md +77 -0
  144. package/skill/subskills/prd.md +72 -0
  145. package/skill/subskills/quick.md +25 -0
  146. package/skill/subskills/release.md +50 -0
  147. package/skill/subskills/research.md +35 -0
  148. package/skill/subskills/runbook.md +44 -0
  149. package/skill/subskills/testplan.md +48 -0
  150. package/templates/L0-prd.md +43 -0
  151. package/templates/L1-prd.md +130 -0
  152. package/templates/L2-design.md +135 -0
  153. package/templates/L3-impl.md +125 -0
  154. package/templates/agent-plan.json +17 -0
  155. package/templates/agents/AGENTS.md +27 -0
  156. package/templates/agents/CLAUDE.md +11 -0
  157. package/templates/agents/CODEBUDDY.md +23 -0
  158. package/templates/agents/codebuddy-skill/SKILL.md +46 -0
  159. package/templates/decision.md +42 -0
@@ -0,0 +1,287 @@
1
+ /**
2
+ * task 子命令:
3
+ * create <spec> --plan <file> [--auto-confirm]
4
+ * start <task-id>
5
+ * step <task-id> --no <N> --status <s> [--type T] [--name S] [--tool T] [--output-json J] [--input-json J] [--latency L] [--error-code E] [--error-message M]
6
+ * complete <task-id>
7
+ * fail <task-id> [--code E] [--msg M]
8
+ * wait <task-id> [--reason R]
9
+ * show <task-id> [--full]
10
+ * list [--topic T] [--spec S] [--status running]
11
+ */
12
+ import { readFileSync } from 'node:fs';
13
+ import { getPaths } from '../core/paths.js';
14
+ import { createTask, startTask, reportStep, completeTask, failTask, waitTask, showTask, listTasks, } from '../core/task.js';
15
+ import { listDecisions } from '../core/decision.js';
16
+ import { findSpecByCode } from '../core/spec-io.js';
17
+ import { hit as auditHit } from '../core/audit.js';
18
+ import { StepStatusSchema } from '../schemas/spec.js';
19
+ const TASK_STATUSES = ['draft', 'running', 'waiting', 'completed', 'failed'];
20
+ export function registerTaskCommands(program) {
21
+ const task = program
22
+ .command('task')
23
+ .description('Agent Task 生命周期管理(创建/执行步骤/完成/失败)');
24
+ task
25
+ .command('create <specCode>')
26
+ .description('为 frozen L3 spec 创建 Agent Task(R3)')
27
+ .requiredOption('--plan <file>', 'planJson 文件路径(含 steps[])')
28
+ .option('--auto-confirm', 'human_gate 自动通过', false)
29
+ .option('--json', '以 JSON 格式输出', false)
30
+ .action((specCode, opts) => {
31
+ const paths = getPaths();
32
+ const planJson = JSON.parse(readFileSync(opts.plan, 'utf8'));
33
+ const result = createTask({
34
+ paths,
35
+ specCode,
36
+ planJson,
37
+ autoConfirm: opts.autoConfirm,
38
+ });
39
+ if (opts.json) {
40
+ console.log(JSON.stringify(result, null, 2));
41
+ return;
42
+ }
43
+ console.log(`✓ Task ${result.task.id} created for ${specCode}`);
44
+ console.log(` file: ${result.taskFile}`);
45
+ console.log(` status: ${result.task.status}`);
46
+ console.log(` steps: ${planJson.steps.length}`);
47
+ });
48
+ task
49
+ .command('start <taskId>')
50
+ .description('把 Task 状态从 draft/running 推进到 running')
51
+ .option('--spec <specCode>', '限定查找范围(避免跨 spec 的 T-001 冲突)')
52
+ .action((taskId, opts) => {
53
+ const paths = getPaths();
54
+ const updated = startTask(paths, taskId, opts.spec);
55
+ console.log(`✓ Task ${updated.id} → running`);
56
+ console.log(` startedAt: ${updated.startedAt}`);
57
+ });
58
+ task
59
+ .command('step <taskId>')
60
+ .description('上报一个 step 的执行结果(写入 task JSON steps[])')
61
+ .requiredOption('--no <stepNo>', '步骤编号', (v) => v)
62
+ .requiredOption('--status <status>', '状态: pending|running|succeeded|failed|skipped')
63
+ .option('--spec <specCode>', '限定查找范围(避免跨 spec 的 T-001 冲突)')
64
+ .option('--type <type>', '步骤类型(llm_call|mcp_tool|human_gate)')
65
+ .option('--name <name>', '步骤名称')
66
+ .option('--tool <toolName>', '工具名(如 Read/Write)')
67
+ .option('--input-json <json>', '输入 JSON 字符串')
68
+ .option('--output-json <json>', '输出 JSON 字符串(必含 summary,R15)')
69
+ .option('--latency <ms>', '耗时(毫秒)', (v) => Number(v))
70
+ .option('--error-code <code>', '错误代码')
71
+ .option('--error-message <msg>', '错误信息')
72
+ .action((taskId, opts) => {
73
+ // Zod 校验 status
74
+ const parsed = StepStatusSchema.safeParse(opts.status);
75
+ if (!parsed.success) {
76
+ console.error(`✗ --status 非法: ${opts.status}(必须 pending|running|succeeded|failed|skipped)`);
77
+ process.exit(2);
78
+ }
79
+ const paths = getPaths();
80
+ const result = reportStep({
81
+ paths,
82
+ taskId,
83
+ specCode: opts.spec,
84
+ stepNo: opts.no,
85
+ status: parsed.data,
86
+ toolName: opts.tool,
87
+ inputJson: opts.inputJson,
88
+ outputJson: opts.outputJson,
89
+ latencyMs: opts.latency,
90
+ errorCode: opts.errorCode,
91
+ errorMessage: opts.errorMessage,
92
+ });
93
+ console.log(`✓ Step ${opts.no} reported for task ${taskId}`);
94
+ for (const w of result.warnings)
95
+ console.warn(`⚠ ${w}`);
96
+ });
97
+ task
98
+ .command('complete <taskId>')
99
+ .description('标记 Task 完成 → 触发 L3 spec cascade → implemented')
100
+ .option('--spec <specCode>', '限定查找范围(避免跨 spec 的 T-001 冲突)')
101
+ .option('--json', '以 JSON 格式输出 cascade 结果', false)
102
+ .action((taskId, opts) => {
103
+ const paths = getPaths();
104
+ const result = completeTask({ paths, taskId, specCode: opts.spec });
105
+ if (opts.json) {
106
+ console.log(JSON.stringify(result, null, 2));
107
+ return;
108
+ }
109
+ console.log(`✓ Task ${result.task.id} → completed`);
110
+ console.log(` finishedAt: ${result.task.finishedAt}`);
111
+ if (result.cascadedSpecs.length > 0) {
112
+ console.log(' cascaded:');
113
+ for (const c of result.cascadedSpecs) {
114
+ console.log(` ${c.code} (${c.level}): ${c.oldStatus} → ${c.newStatus}`);
115
+ }
116
+ }
117
+ if (result.skippedSpecs.length > 0) {
118
+ console.log(' skipped:');
119
+ for (const s of result.skippedSpecs) {
120
+ console.log(` ${s.code} (${s.reason})`);
121
+ }
122
+ }
123
+ // R18 自检:对每个新 implemented 的 L1,检查是否已有决策卡片,自动 audit hit 落库
124
+ if (result.cascadedL1Specs.length > 0) {
125
+ console.log('');
126
+ console.log('⚠ R18 (决策卡片):以下 L1 已 cascade 到 implemented');
127
+ for (const code of result.cascadedL1Specs) {
128
+ const existing = listDecisions(paths, { docCode: code, includeAll: true });
129
+ const spec = findSpecByCode(paths, code);
130
+ const topic = spec?.fm.topic ?? '?';
131
+ // 自动 audit hit:无论是否已建,都记录"已检查"这一事实
132
+ auditHit({ paths, ruleId: 'R18', specCode: code });
133
+ if (existing.length === 0) {
134
+ console.log(` ✗ ${code} [${topic}] — 待建 (audit hit R18 已落库)`);
135
+ console.log(` spec-manager decision create ${code} \\`);
136
+ console.log(` --topic ${topic} --what "..." --why "..." --criteria AC-1,AC-2`);
137
+ }
138
+ else {
139
+ const active = existing.filter(d => d.fm.status === 'active');
140
+ console.log(` ✓ ${code} [${topic}] — 已有 ${existing.length} 张 (active: ${active.length}, audit hit R18 已落库)`);
141
+ }
142
+ }
143
+ }
144
+ });
145
+ task
146
+ .command('fail <taskId>')
147
+ .description('标记 Task 失败')
148
+ .option('--spec <specCode>', '限定查找范围(避免跨 spec 的 T-001 冲突)')
149
+ .option('--code <code>', '错误代码', 'AGENT_TOOL')
150
+ .option('--msg <message>', '错误信息', '未知错误')
151
+ .action((taskId, opts) => {
152
+ const paths = getPaths();
153
+ const updated = failTask({
154
+ paths,
155
+ taskId,
156
+ specCode: opts.spec,
157
+ errorCode: opts.code,
158
+ errorMessage: opts.msg,
159
+ });
160
+ console.log(`✗ Task ${updated.id} → failed`);
161
+ console.log(` ${opts.code}: ${opts.msg}`);
162
+ });
163
+ task
164
+ .command('wait <taskId>')
165
+ .description('把 Task 标记为 waiting(等人工确认)')
166
+ .option('--spec <specCode>', '限定查找范围(避免跨 spec 的 T-001 冲突)')
167
+ .option('--reason <reason>', '等待原因', '需要人工确认')
168
+ .action((taskId, opts) => {
169
+ const paths = getPaths();
170
+ const updated = waitTask({ paths, taskId, specCode: opts.spec, reason: opts.reason });
171
+ console.log(`⏸ Task ${updated.id} → waiting`);
172
+ console.log(` reason: ${updated.waitReason}`);
173
+ });
174
+ task
175
+ .command('show <taskId>')
176
+ .description('查看 Task 详情(默认 last 5 steps + totalSteps)')
177
+ .option('--spec <specCode>', '限定查找范围(避免跨 spec 的 T-001 冲突)')
178
+ .option('--full', '返回完整 steps 列表', false)
179
+ .option('--json', '以 JSON 格式输出', false)
180
+ .action((taskId, opts) => {
181
+ const paths = getPaths();
182
+ const result = showTask(paths, taskId, { full: opts.full, specCode: opts.spec });
183
+ if (!result) {
184
+ console.error(`✗ Task not found: ${taskId}`);
185
+ process.exit(1);
186
+ }
187
+ if (opts.json) {
188
+ console.log(JSON.stringify(result, null, 2));
189
+ return;
190
+ }
191
+ console.log(`Task ${result.task.id} — ${result.task.specCode}`);
192
+ console.log(` status: ${result.task.status}`);
193
+ console.log(` startedAt: ${result.task.startedAt ?? '-'}`);
194
+ console.log(` finishedAt: ${result.task.finishedAt ?? '-'}`);
195
+ if (result.task.waitReason)
196
+ console.log(` waitReason: ${result.task.waitReason}`);
197
+ if (result.task.errorCode)
198
+ console.log(` error: ${result.task.errorCode} — ${result.task.errorMessage}`);
199
+ console.log(` steps: ${result.steps.length} (totalSteps: ${result.steps.length}${result.truncated ? ', truncated' : ''})`);
200
+ if (result.steps.length > 0) {
201
+ for (const s of result.steps) {
202
+ const lat = s.latencyMs != null ? ` (${s.latencyMs}ms)` : '';
203
+ console.log(` [${s.stepNo}] ${s.status.padEnd(10)} ${s.name}${lat}`);
204
+ }
205
+ }
206
+ });
207
+ task
208
+ .command('list')
209
+ .description('列出所有 Task(可按 topic / spec / status 过滤)')
210
+ .option('--topic <topic>', '按 topic 过滤(连续性层:执行前查同主题历史任务)')
211
+ .option('--spec <specCode>', '按 spec code 过滤')
212
+ .option('--status <status>', '按 status 过滤(draft|running|waiting|completed|failed)')
213
+ .option('--json', '以 JSON 格式输出', false)
214
+ .action((opts) => {
215
+ const paths = getPaths();
216
+ if (opts.status && !TASK_STATUSES.includes(opts.status)) {
217
+ console.error(`✗ --status 非法: ${opts.status}(必须 ${TASK_STATUSES.join('|')})`);
218
+ process.exit(2);
219
+ }
220
+ const all = listTasks(paths, {
221
+ topic: opts.topic,
222
+ specCode: opts.spec,
223
+ status: opts.status,
224
+ });
225
+ if (opts.json) {
226
+ console.log(JSON.stringify(all, null, 2));
227
+ return;
228
+ }
229
+ if (all.length === 0) {
230
+ console.log('(no tasks)');
231
+ return;
232
+ }
233
+ for (const t of all) {
234
+ console.log(`${t.id} ${t.status.padEnd(10)} ${t.specCode} created=${t.created}`);
235
+ }
236
+ });
237
+ // ── batch: 一条命令完成 create → start → step×N → complete ──
238
+ task
239
+ .command('batch <specCode>')
240
+ .description('一条命令完成 Agent Task 全生命周期(create + start + step×N + complete)')
241
+ .requiredOption('--plan <file>', 'planJson 文件路径(含 steps[])')
242
+ .option('--auto-confirm', 'human_gate 自动通过', false)
243
+ .option('--json', '以 JSON 格式输出', false)
244
+ .action((specCode, opts) => {
245
+ const paths = getPaths();
246
+ const planJson = JSON.parse(readFileSync(opts.plan, 'utf8'));
247
+ // 1. create
248
+ const { task: created } = createTask({ paths, specCode, planJson, autoConfirm: opts.autoConfirm });
249
+ console.log(`✓ Task ${created.id} created for ${specCode}`);
250
+ console.log(` steps: ${planJson.steps.length}`);
251
+ // 2. start
252
+ startTask(paths, created.id, specCode);
253
+ console.log(`✓ Task ${created.id} → running`);
254
+ // 3. step × N
255
+ for (const step of planJson.steps) {
256
+ const outputJson = JSON.stringify({ summary: `step ${step.stepNo}: ${step.name}` });
257
+ reportStep({
258
+ paths,
259
+ taskId: created.id,
260
+ specCode,
261
+ stepNo: step.stepNo,
262
+ status: 'succeeded',
263
+ outputJson,
264
+ });
265
+ console.log(` [${step.stepNo}/${planJson.steps.length}] ${step.name}... succeeded`);
266
+ }
267
+ // 4. complete
268
+ const result = completeTask({ paths, taskId: created.id, specCode });
269
+ console.log(`✓ Task ${result.task.id} → completed`);
270
+ if (result.cascadedSpecs.length > 0) {
271
+ console.log(' cascaded:');
272
+ for (const c of result.cascadedSpecs) {
273
+ console.log(` ${c.code} (${c.level}): ${c.oldStatus} → ${c.newStatus}`);
274
+ }
275
+ }
276
+ if (result.skippedSpecs.length > 0) {
277
+ console.log(' skipped:');
278
+ for (const s of result.skippedSpecs) {
279
+ console.log(` ${s.code} (${s.reason})`);
280
+ }
281
+ }
282
+ if (opts.json) {
283
+ console.log(JSON.stringify(result, null, 2));
284
+ }
285
+ });
286
+ }
287
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/cli/task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerUsabilityCommands(program: Command): void;
3
+ //# sourceMappingURL=usability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usability.d.ts","sourceRoot":"","sources":["../../src/cli/usability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmIhE"}
@@ -0,0 +1,153 @@
1
+ import { dirname, join } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { readFileSync, writeFileSync } from 'node:fs';
4
+ import { getPaths } from '../core/paths.js';
5
+ import { createSpec, findSpecByCode, generateSpecCode, updateSpec } from '../core/spec-io.js';
6
+ import { canTransition } from '../core/status.js';
7
+ import { createTask, startTask } from '../core/task.js';
8
+ import { getFlowStatus, renderTemplate, runProjectDoctor, suggestAfterSpecCommand } from '../core/usability.js';
9
+ import { fail, requireInitialized } from './common.js';
10
+ export function registerUsabilityCommands(program) {
11
+ program
12
+ .command('flow')
13
+ .description('流程视图:按 topic 展示 L1/L2/L3/Task 当前状态与下一步')
14
+ .command('status')
15
+ .option('--topic <topic>', '只查看指定 topic')
16
+ .action((opts) => {
17
+ const paths = getPaths();
18
+ requireInitialized(paths);
19
+ const flows = getFlowStatus(paths, { topic: opts.topic });
20
+ if (flows.length === 0) {
21
+ console.log('(no topics)');
22
+ console.log('Next: spec-manager spec new L1 --topic <topic> --title "..."');
23
+ return;
24
+ }
25
+ for (const flow of flows) {
26
+ console.log(flow.topic);
27
+ if (flow.specs.length === 0) {
28
+ console.log(' (no specs)');
29
+ }
30
+ else {
31
+ for (const spec of flow.specs) {
32
+ console.log(` ${spec.fm.code.padEnd(28)} ${spec.fm.level.padEnd(3)} ${spec.fm.status.padEnd(12)} ${spec.fm.title}`);
33
+ }
34
+ }
35
+ const activeTasks = flow.tasks.filter((t) => t.status !== 'completed' && t.status !== 'failed');
36
+ if (activeTasks.length > 0) {
37
+ console.log(' tasks:');
38
+ for (const task of activeTasks)
39
+ console.log(` ${task.id} ${task.status} ${task.specCode}`);
40
+ }
41
+ console.log(` Next: ${flow.nextAction}`);
42
+ }
43
+ });
44
+ program
45
+ .command('guide [request...]')
46
+ .description('新手向导:检查项目状态并给出下一步')
47
+ .action((requestParts) => {
48
+ const request = requestParts.join(' ').trim();
49
+ const paths = getPaths();
50
+ if (!paths.isInitialized) {
51
+ console.log('Next: spec-manager project init --name <project-name>');
52
+ return;
53
+ }
54
+ const doctor = runProjectDoctor(paths);
55
+ const blocking = doctor.find((c) => c.status === 'fail' || c.status === 'warn');
56
+ if (blocking?.action) {
57
+ console.log(`Next: ${blocking.action}`);
58
+ return;
59
+ }
60
+ const topic = inferTopic(request) ?? '<topic>';
61
+ const flow = getFlowStatus(paths, { topic })[0];
62
+ console.log(`Request: ${request || '(none)'}`);
63
+ console.log(`Next: ${flow?.nextAction ?? `spec-manager spec new L1 --topic ${topic} --title "..."`}`);
64
+ });
65
+ program
66
+ .command('new')
67
+ .description('常用创建快捷入口')
68
+ .command('feature')
69
+ .argument('<title...>', '功能标题')
70
+ .requiredOption('--topic <topic>', 'topic 名')
71
+ .option('--allow-duplicate-topic', '允许同 topic 下创建额外 L1', false)
72
+ .action((titleParts, opts) => {
73
+ const paths = getPaths();
74
+ requireInitialized(paths);
75
+ const title = titleParts.join(' ');
76
+ const code = generateSpecCode(opts.topic, 'L1');
77
+ if (findSpecByCode(paths, code)) {
78
+ fail(`✗ code 已存在: ${code}\nNext: spec-manager flow status --topic ${opts.topic}`, 2);
79
+ }
80
+ const rec = createSpec({
81
+ paths,
82
+ code,
83
+ level: 'L1',
84
+ title,
85
+ topic: opts.topic,
86
+ parentCode: null,
87
+ });
88
+ console.log(`✓ Created feature L1: ${rec.fm.code}`);
89
+ console.log(` file: ${rec.filePath}`);
90
+ console.log(`Next: ${suggestAfterSpecCommand(rec)}`);
91
+ });
92
+ program
93
+ .command('approve <code>')
94
+ .description('快捷批准当前 spec:draft→confirmed,L3 confirmed→frozen')
95
+ .action((code) => {
96
+ const paths = getPaths();
97
+ requireInitialized(paths);
98
+ const rec = findSpecByCode(paths, code);
99
+ if (!rec)
100
+ fail(`✗ 未找到: ${code}`, 1);
101
+ const target = rec.fm.level === 'L3' && rec.fm.status === 'confirmed' ? 'frozen' : 'confirmed';
102
+ if (!canTransition(rec.fm.status, target)) {
103
+ fail(`✗ 状态非法: ${rec.fm.status} → ${target}\nNext: spec-manager flow status --topic ${rec.fm.topic}`, 2);
104
+ }
105
+ const { record } = updateSpec(paths, code, { status: target, changeSummary: `${rec.fm.status} → ${target}` });
106
+ console.log(`✓ ${code}: ${rec.fm.status} → ${target}`);
107
+ console.log(`Next: ${suggestAfterSpecCommand(record)}`);
108
+ });
109
+ program
110
+ .command('run <specCode>')
111
+ .description('快捷执行 frozen L3:create task + start')
112
+ .requiredOption('--plan <file>', 'planJson 文件路径')
113
+ .option('--auto-confirm', 'human_gate 自动通过', false)
114
+ .action((specCode, opts) => {
115
+ const paths = getPaths();
116
+ requireInitialized(paths);
117
+ const planJson = JSON.parse(readFileSync(opts.plan, 'utf8'));
118
+ const { task } = createTask({ paths, specCode, planJson, autoConfirm: opts.autoConfirm });
119
+ const started = startTask(paths, task.id, specCode);
120
+ console.log(`✓ Task ${started.id} created and started for ${specCode}`);
121
+ console.log(`Next: spec-manager task step ${started.id} --spec ${specCode} --no <N> --status succeeded --output-json '{"summary":"..."}'`);
122
+ });
123
+ program
124
+ .command('template <level>')
125
+ .description('输出 L0/L1/L2/L3 或 agent-plan 模板')
126
+ .option('--title <title>', '替换模板标题', 'Untitled')
127
+ .option('--output <file>', '写入文件;不传则输出到 stdout')
128
+ .action((levelRaw, opts) => {
129
+ const level = normalizeTemplateLevel(levelRaw);
130
+ const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '..', '..');
131
+ const content = renderTemplate(packageRoot, level, opts.title);
132
+ if (opts.output) {
133
+ writeFileSync(opts.output, content, 'utf8');
134
+ console.log(`✓ Template written: ${opts.output}`);
135
+ }
136
+ else {
137
+ process.stdout.write(content);
138
+ }
139
+ });
140
+ }
141
+ function normalizeTemplateLevel(input) {
142
+ const normalized = input.toUpperCase();
143
+ if (['L0', 'L1', 'L2', 'L3'].includes(normalized))
144
+ return normalized;
145
+ if (input === 'agent-plan' || input === 'plan')
146
+ return 'agent-plan';
147
+ fail('✗ template level 必须是 L0/L1/L2/L3/agent-plan', 2);
148
+ }
149
+ function inferTopic(input) {
150
+ const first = input.toLowerCase().match(/[a-z0-9][a-z0-9-]*/)?.[0];
151
+ return first ?? null;
152
+ }
153
+ //# sourceMappingURL=usability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usability.js","sourceRoot":"","sources":["../../src/cli/usability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { ProjectPaths } from './paths.js';
2
+ export declare const AGENT_PROVIDERS: readonly ["claude", "codex", "opencode", "codebuddy"];
3
+ export type AgentProvider = (typeof AGENT_PROVIDERS)[number];
4
+ export type AgentProviderSelection = AgentProvider | 'all';
5
+ export interface AgentProviderInfo {
6
+ provider: AgentProvider;
7
+ aliases: string[];
8
+ files: string[];
9
+ description: string;
10
+ notes: string[];
11
+ installSteps: AgentInstallStep[];
12
+ }
13
+ export type AgentInstallStep = {
14
+ kind: 'template';
15
+ source: string;
16
+ target: string;
17
+ } | {
18
+ kind: 'directory';
19
+ source: string;
20
+ target: string;
21
+ };
22
+ export interface InstallAgentSupportOptions {
23
+ paths: ProjectPaths;
24
+ packageRoot: string;
25
+ providers: AgentProviderSelection[];
26
+ force?: boolean;
27
+ dryRun?: boolean;
28
+ }
29
+ export interface AgentInstallReport {
30
+ providers: AgentProvider[];
31
+ dryRun: boolean;
32
+ created: string[];
33
+ overwritten: string[];
34
+ skipped: string[];
35
+ notes: string[];
36
+ }
37
+ export declare const AGENT_PROVIDER_INFO: AgentProviderInfo[];
38
+ export declare function parseAgentProviders(input: string): AgentProviderSelection[];
39
+ export declare function normalizeAgentProvider(input: string): AgentProviderSelection;
40
+ export declare function expandAgentProviders(providers: AgentProviderSelection[]): AgentProvider[];
41
+ export declare function listAgentProviders(): AgentProviderInfo[];
42
+ export declare function installAgentSupport(options: InstallAgentSupportOptions): AgentInstallReport;
43
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/core/agents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,eAAO,MAAM,eAAe,uDAAwD,CAAC;AAErF,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7D,MAAM,MAAM,sBAAsB,GAAG,aAAa,GAAG,KAAK,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,gBAAgB,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,eAAO,MAAM,mBAAmB,EAAE,iBAAiB,EAoDlD,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAQ3E;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB,CAU5E;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,sBAAsB,EAAE,GAAG,aAAa,EAAE,CAQzF;AAED,wBAAgB,kBAAkB,IAAI,iBAAiB,EAAE,CAExD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,kBAAkB,CAuB3F"}