spec-manager 0.1.0 → 0.1.1
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/AGENTS.md +1 -1
- package/README.md +36 -21
- package/dist/cli/completion.d.ts +3 -0
- package/dist/cli/completion.d.ts.map +1 -0
- package/dist/cli/completion.js +30 -0
- package/dist/cli/completion.js.map +1 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/project.d.ts.map +1 -1
- package/dist/cli/project.js +21 -7
- package/dist/cli/project.js.map +1 -1
- package/dist/cli/spec.d.ts.map +1 -1
- package/dist/cli/spec.js +42 -14
- package/dist/cli/spec.js.map +1 -1
- package/dist/cli/task.d.ts.map +1 -1
- package/dist/cli/task.js +4 -1
- package/dist/cli/task.js.map +1 -1
- package/dist/cli/usability.d.ts.map +1 -1
- package/dist/cli/usability.js +32 -8
- package/dist/cli/usability.js.map +1 -1
- package/dist/cli/view.d.ts +3 -0
- package/dist/cli/view.d.ts.map +1 -0
- package/dist/cli/view.js +122 -0
- package/dist/cli/view.js.map +1 -0
- package/dist/core/agents.d.ts +6 -1
- package/dist/core/agents.d.ts.map +1 -1
- package/dist/core/agents.js +39 -1
- package/dist/core/agents.js.map +1 -1
- package/dist/core/completion.d.ts +12 -0
- package/dist/core/completion.d.ts.map +1 -0
- package/dist/core/completion.js +136 -0
- package/dist/core/completion.js.map +1 -0
- package/dist/core/placeholder.d.ts +6 -0
- package/dist/core/placeholder.d.ts.map +1 -0
- package/dist/core/placeholder.js +12 -0
- package/dist/core/placeholder.js.map +1 -0
- package/dist/core/spec-io.d.ts +1 -5
- package/dist/core/spec-io.d.ts.map +1 -1
- package/dist/core/spec-io.js +3 -11
- package/dist/core/spec-io.js.map +1 -1
- package/dist/core/status.d.ts +4 -3
- package/dist/core/status.d.ts.map +1 -1
- package/dist/core/status.js +5 -4
- package/dist/core/status.js.map +1 -1
- package/dist/core/task.d.ts +2 -0
- package/dist/core/task.d.ts.map +1 -1
- package/dist/core/task.js +12 -3
- package/dist/core/task.js.map +1 -1
- package/dist/core/usability.d.ts +8 -2
- package/dist/core/usability.d.ts.map +1 -1
- package/dist/core/usability.js +157 -26
- package/dist/core/usability.js.map +1 -1
- package/dist/core/validate.d.ts +2 -0
- package/dist/core/validate.d.ts.map +1 -1
- package/dist/core/validate.js +29 -1
- package/dist/core/validate.js.map +1 -1
- package/dist/core/view.d.ts +35 -0
- package/dist/core/view.d.ts.map +1 -0
- package/dist/core/view.js +50 -0
- package/dist/core/view.js.map +1 -0
- package/package.json +2 -1
- package/rules/flow-control.md +3 -3
- package/skill/SKILL.md +14 -2
- package/skill/subskills/impl.md +2 -2
- package/templates/L3-impl.md +2 -2
- package/templates/agent-plan.json +2 -1
- package/templates/agents/AGENTS.md +8 -6
- package/templates/agents/CLAUDE.md +7 -3
- package/templates/agents/CODEBUDDY.md +9 -7
- package/templates/agents/CURSOR.md +28 -0
- package/templates/agents/WINDSURF.md +28 -0
- package/templates/agents/codebuddy-skill/SKILL.md +12 -1
package/dist/core/usability.js
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
+
import { parse as parseYaml } from 'yaml';
|
|
3
4
|
import { AGENT_PROVIDER_INFO } from './agents.js';
|
|
4
5
|
import { readAudit } from './audit.js';
|
|
5
|
-
import {
|
|
6
|
-
import { listAllSpecs } from './spec-io.js';
|
|
6
|
+
import { findSpecByCode, isPlaceholderContent, listAllSpecs } from './spec-io.js';
|
|
7
7
|
import { listTasks } from './task.js';
|
|
8
|
+
import { REQUIRED_SECTIONS } from './validate.js';
|
|
8
9
|
export function runProjectDoctor(paths) {
|
|
9
10
|
const checks = [];
|
|
10
|
-
checks.push(fileCheck(paths.isInitialized, '.spec-manager/', 'Project initialized', 'spec-manager project init'));
|
|
11
|
-
checks.push(fileCheck(existsSync(paths.configFile), '.spec-manager/config.yaml', 'Config file present', 'spec-manager project init'));
|
|
12
|
-
checks.push(fileCheck(existsSync(paths.auditFile), '.spec-manager/audit.json', 'Audit file present', 'spec-manager project init'));
|
|
13
|
-
checks.push(fileCheck(existsSync(paths.specsDir), 'specs/', 'Specs directory present', 'spec-manager project init'));
|
|
14
|
-
checks.push(fileCheck(existsSync(paths.changesDir), 'changes/', 'Changes directory present', 'spec-manager project init'));
|
|
15
|
-
checks.push(fileCheck(existsSync(paths.archiveDir), 'archive/', 'Archive directory present', 'spec-manager project init'));
|
|
11
|
+
checks.push(fileCheck(paths.isInitialized, '.spec-manager/', 'Project initialized', 'spec-manager project init', true));
|
|
12
|
+
checks.push(fileCheck(existsSync(paths.configFile), '.spec-manager/config.yaml', 'Config file present', 'spec-manager project init', true));
|
|
13
|
+
checks.push(fileCheck(existsSync(paths.auditFile), '.spec-manager/audit.json', 'Audit file present', 'spec-manager project init', true));
|
|
14
|
+
checks.push(fileCheck(existsSync(paths.specsDir), 'specs/', 'Specs directory present', 'spec-manager project init', true));
|
|
15
|
+
checks.push(fileCheck(existsSync(paths.changesDir), 'changes/', 'Changes directory present', 'spec-manager project init', true));
|
|
16
|
+
checks.push(fileCheck(existsSync(paths.archiveDir), 'archive/', 'Archive directory present', 'spec-manager project init', true));
|
|
16
17
|
const agentFiles = AGENT_PROVIDER_INFO.flatMap((p) => p.files);
|
|
17
18
|
const installedAgentFiles = Array.from(new Set(agentFiles)).filter((f) => existsSync(join(paths.root, trimTrailingSlash(f))));
|
|
18
19
|
checks.push({
|
|
@@ -20,24 +21,26 @@ export function runProjectDoctor(paths) {
|
|
|
20
21
|
label: 'AI agent instructions',
|
|
21
22
|
detail: installedAgentFiles.length > 0 ? installedAgentFiles.join(', ') : 'No agent instruction files found',
|
|
22
23
|
action: installedAgentFiles.length > 0 ? undefined : 'spec-manager project agents --provider all',
|
|
24
|
+
blocking: false,
|
|
23
25
|
});
|
|
24
26
|
const claudeSkill = join(paths.root, '.claude', 'skills', 'spec-manager');
|
|
25
27
|
if (existsSync(claudeSkill)) {
|
|
26
|
-
checks.push(fileCheck(existsSync(join(claudeSkill, 'rules')), '.claude/skills/spec-manager/rules', 'Claude skill rules bundled', 'spec-manager project agents --provider claude --force'));
|
|
27
|
-
checks.push(fileCheck(existsSync(join(claudeSkill, 'templates')), '.claude/skills/spec-manager/templates', 'Claude skill templates bundled', 'spec-manager project agents --provider claude --force'));
|
|
28
|
+
checks.push(fileCheck(existsSync(join(claudeSkill, 'rules')), '.claude/skills/spec-manager/rules', 'Claude skill rules bundled', 'spec-manager project agents --provider claude --force', false));
|
|
29
|
+
checks.push(fileCheck(existsSync(join(claudeSkill, 'templates')), '.claude/skills/spec-manager/templates', 'Claude skill templates bundled', 'spec-manager project agents --provider claude --force', false));
|
|
28
30
|
}
|
|
29
31
|
const codeBuddySkill = join(paths.root, '.codebuddy', 'skills', 'spec-manager');
|
|
30
32
|
if (existsSync(codeBuddySkill)) {
|
|
31
|
-
checks.push(fileCheck(existsSync(join(codeBuddySkill, 'rules')), '.codebuddy/skills/spec-manager/rules', 'CodeBuddy skill rules bundled', 'spec-manager project agents --provider codebuddy --force'));
|
|
32
|
-
checks.push(fileCheck(existsSync(join(codeBuddySkill, 'templates')), '.codebuddy/skills/spec-manager/templates', 'CodeBuddy skill templates bundled', 'spec-manager project agents --provider codebuddy --force'));
|
|
33
|
+
checks.push(fileCheck(existsSync(join(codeBuddySkill, 'rules')), '.codebuddy/skills/spec-manager/rules', 'CodeBuddy skill rules bundled', 'spec-manager project agents --provider codebuddy --force', false));
|
|
34
|
+
checks.push(fileCheck(existsSync(join(codeBuddySkill, 'templates')), '.codebuddy/skills/spec-manager/templates', 'CodeBuddy skill templates bundled', 'spec-manager project agents --provider codebuddy --force', false));
|
|
33
35
|
}
|
|
34
36
|
const specs = paths.isInitialized ? listAllSpecs(paths) : [];
|
|
35
|
-
const placeholders = specs.filter((s) => s.content
|
|
37
|
+
const placeholders = specs.filter((s) => isPlaceholderContent(s.content));
|
|
36
38
|
checks.push({
|
|
37
39
|
status: placeholders.length === 0 ? 'ok' : 'warn',
|
|
38
40
|
label: 'Spec placeholder content',
|
|
39
41
|
detail: placeholders.length === 0 ? 'No placeholder specs' : placeholders.map((s) => s.fm.code).join(', '),
|
|
40
42
|
action: placeholders.length === 0 ? undefined : 'spec-manager spec update <code> --content ./draft.md --ai-summary "..." --change-summary "..."',
|
|
43
|
+
blocking: false,
|
|
41
44
|
});
|
|
42
45
|
try {
|
|
43
46
|
readAudit(paths);
|
|
@@ -49,12 +52,31 @@ export function runProjectDoctor(paths) {
|
|
|
49
52
|
label: 'Audit readable',
|
|
50
53
|
detail: err instanceof Error ? err.message : String(err),
|
|
51
54
|
action: 'Check .spec-manager/audit.json permissions or recreate it',
|
|
55
|
+
blocking: true,
|
|
52
56
|
});
|
|
53
57
|
}
|
|
54
58
|
return checks;
|
|
55
59
|
}
|
|
56
|
-
function fileCheck(condition, detail, label, action) {
|
|
57
|
-
return { status: condition ? 'ok' : 'fail', label, detail, action: condition ? undefined : action };
|
|
60
|
+
function fileCheck(condition, detail, label, action, blocking) {
|
|
61
|
+
return { status: condition ? 'ok' : 'fail', label, detail, action: condition ? undefined : action, blocking };
|
|
62
|
+
}
|
|
63
|
+
export function isBlockingDoctorCheck(check) {
|
|
64
|
+
if (check.status === 'ok')
|
|
65
|
+
return false;
|
|
66
|
+
if (check.blocking !== undefined)
|
|
67
|
+
return check.blocking;
|
|
68
|
+
return check.status === 'fail' && isCoreProjectCheckLabel(check.label);
|
|
69
|
+
}
|
|
70
|
+
function isCoreProjectCheckLabel(label) {
|
|
71
|
+
return [
|
|
72
|
+
'Project initialized',
|
|
73
|
+
'Config file present',
|
|
74
|
+
'Audit file present',
|
|
75
|
+
'Specs directory present',
|
|
76
|
+
'Changes directory present',
|
|
77
|
+
'Archive directory present',
|
|
78
|
+
'Audit readable',
|
|
79
|
+
].includes(label);
|
|
58
80
|
}
|
|
59
81
|
function trimTrailingSlash(value) {
|
|
60
82
|
return value.endsWith('/') ? value.slice(0, -1) : value;
|
|
@@ -79,7 +101,7 @@ export function suggestNextActionForTopic(topic, specs, tasks) {
|
|
|
79
101
|
if (specs.length === 0) {
|
|
80
102
|
return `spec-manager spec new L1 --topic ${topic} --title "..."`;
|
|
81
103
|
}
|
|
82
|
-
const placeholder = specs.find((s) => s.content
|
|
104
|
+
const placeholder = specs.find((s) => isPlaceholderContent(s.content));
|
|
83
105
|
if (placeholder) {
|
|
84
106
|
return `spec-manager spec update ${placeholder.fm.code} --content ./draft.md --ai-summary "..." --change-summary "..."`;
|
|
85
107
|
}
|
|
@@ -88,12 +110,12 @@ export function suggestNextActionForTopic(topic, specs, tasks) {
|
|
|
88
110
|
return `spec-manager spec confirm ${draft.fm.code}`;
|
|
89
111
|
const confirmedL3 = specs.find((s) => s.fm.level === 'L3' && s.fm.status === 'confirmed');
|
|
90
112
|
if (confirmedL3)
|
|
91
|
-
return `spec-manager spec freeze ${confirmedL3.fm.code}
|
|
113
|
+
return appendAdvice(`spec-manager spec freeze ${confirmedL3.fm.code}`, getUpstreamFreezeAdviceForSpecs(specs, confirmedL3));
|
|
92
114
|
const frozenL3 = specs.find((s) => s.fm.level === 'L3' && s.fm.status === 'frozen');
|
|
93
115
|
if (frozenL3) {
|
|
94
116
|
const task = tasks.find((t) => t.specCode === frozenL3.fm.code && t.status !== 'completed' && t.status !== 'failed');
|
|
95
117
|
if (!task)
|
|
96
|
-
return `spec-manager task create ${frozenL3.fm.code} --plan ./plan.json
|
|
118
|
+
return appendAdvice(`spec-manager task create ${frozenL3.fm.code} --plan ./plan.json`, getUpstreamFreezeAdviceForSpecs(specs, frozenL3));
|
|
97
119
|
if (task.status === 'draft')
|
|
98
120
|
return `spec-manager task start ${task.id} --spec ${task.specCode}`;
|
|
99
121
|
if (task.status === 'running')
|
|
@@ -108,22 +130,78 @@ export function suggestNextActionForTopic(topic, specs, tasks) {
|
|
|
108
130
|
return `spec-manager spec new L3 --topic ${topic} --parent ${confirmedNonL3.fm.code} --title "..."`;
|
|
109
131
|
return 'No immediate action. Use spec-manager flow status for details.';
|
|
110
132
|
}
|
|
111
|
-
export function suggestAfterSpecCommand(spec) {
|
|
112
|
-
if (spec.content
|
|
133
|
+
export function suggestAfterSpecCommand(spec, paths) {
|
|
134
|
+
if (isPlaceholderContent(spec.content)) {
|
|
113
135
|
return `spec-manager spec update ${spec.fm.code} --content ./draft.md --ai-summary "..." --change-summary "init"`;
|
|
114
136
|
}
|
|
115
|
-
if (spec.fm.status === 'draft')
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if (spec.fm.level === 'L3' && spec.fm.status === '
|
|
120
|
-
return `spec-manager
|
|
137
|
+
if (spec.fm.status === 'draft') {
|
|
138
|
+
const outcome = spec.fm.level === 'L3' ? 'frozen' : 'confirmed';
|
|
139
|
+
return `Wait for user approval, then spec-manager spec confirm ${spec.fm.code} (${spec.fm.status} -> ${outcome})`;
|
|
140
|
+
}
|
|
141
|
+
if (spec.fm.level === 'L3' && spec.fm.status === 'confirmed') {
|
|
142
|
+
return appendAdvice(`Wait for user approval, then spec-manager spec freeze ${spec.fm.code}`, paths ? getUpstreamFreezeAdvice(paths, spec) : []);
|
|
143
|
+
}
|
|
144
|
+
if (spec.fm.level === 'L3' && spec.fm.status === 'frozen') {
|
|
145
|
+
return appendAdvice(`spec-manager task create ${spec.fm.code} --plan ./plan.json`, paths ? getUpstreamFreezeAdvice(paths, spec) : []);
|
|
146
|
+
}
|
|
121
147
|
if (spec.fm.level === 'L1' && spec.fm.status === 'confirmed')
|
|
122
148
|
return `spec-manager spec new L2 --topic ${spec.fm.topic} --parent ${spec.fm.code} --title "..."`;
|
|
123
149
|
if (spec.fm.level === 'L2' && spec.fm.status === 'confirmed')
|
|
124
150
|
return `spec-manager spec new L3 --topic ${spec.fm.topic} --parent ${spec.fm.code} --title "..."`;
|
|
125
151
|
return 'spec-manager flow status';
|
|
126
152
|
}
|
|
153
|
+
export function getUpstreamFreezeAdvice(paths, spec) {
|
|
154
|
+
return getUpstreamFreezeAdviceForSpecs(listAllSpecs(paths), spec);
|
|
155
|
+
}
|
|
156
|
+
function getUpstreamFreezeAdviceForSpecs(specs, spec) {
|
|
157
|
+
if (spec.fm.level !== 'L3')
|
|
158
|
+
return [];
|
|
159
|
+
const advice = [];
|
|
160
|
+
let parentCode = spec.fm.parentCode;
|
|
161
|
+
while (parentCode) {
|
|
162
|
+
const upstream = specs.find((s) => s.fm.code === parentCode);
|
|
163
|
+
if (!upstream)
|
|
164
|
+
break;
|
|
165
|
+
if (upstream.fm.status !== 'frozen' && upstream.fm.status !== 'implemented') {
|
|
166
|
+
advice.push(`Upstream ${upstream.fm.code} is ${upstream.fm.status}; task complete will not cascade it unless it is frozen.`);
|
|
167
|
+
}
|
|
168
|
+
parentCode = upstream.fm.parentCode;
|
|
169
|
+
}
|
|
170
|
+
return advice;
|
|
171
|
+
}
|
|
172
|
+
function appendAdvice(command, advice) {
|
|
173
|
+
if (advice.length === 0)
|
|
174
|
+
return command;
|
|
175
|
+
return [command, ...advice.map((line) => `Advice: ${line}`)].join('\n');
|
|
176
|
+
}
|
|
177
|
+
export function readProjectContext(paths) {
|
|
178
|
+
try {
|
|
179
|
+
const raw = readFileSync(paths.configFile, 'utf8');
|
|
180
|
+
const parsed = parseYaml(raw);
|
|
181
|
+
const context = parsed?.context;
|
|
182
|
+
return typeof context === 'string' ? context.trim() : '';
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return '';
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
export function renderRichGuide(paths, packageRoot, request) {
|
|
189
|
+
const matchedSpec = findSpecForRequest(paths, request);
|
|
190
|
+
const topic = matchedSpec?.fm.topic ?? inferTopicFromRequest(request) ?? '<topic>';
|
|
191
|
+
const flow = getFlowStatus(paths, { topic })[0];
|
|
192
|
+
const nextCommand = matchedSpec
|
|
193
|
+
? suggestAfterSpecCommand(matchedSpec, paths)
|
|
194
|
+
: flow?.nextAction ?? `spec-manager spec new L1 --topic ${topic} --title "..."`;
|
|
195
|
+
return [
|
|
196
|
+
renderTag('task', renderGuideTask(matchedSpec, request)),
|
|
197
|
+
renderTag('project_context', readProjectContext(paths) || '(none)'),
|
|
198
|
+
renderTag('parent_context', renderParentContext(paths, matchedSpec)),
|
|
199
|
+
renderTag('rules', renderGuideRules()),
|
|
200
|
+
renderTag('required_sections', renderRequiredSections(matchedSpec)),
|
|
201
|
+
renderTag('template', renderGuideTemplate(packageRoot, matchedSpec)),
|
|
202
|
+
renderTag('next_command', nextCommand),
|
|
203
|
+
].join('\n');
|
|
204
|
+
}
|
|
127
205
|
function compareSpecRecords(a, b) {
|
|
128
206
|
return a.fm.code.localeCompare(b.fm.code);
|
|
129
207
|
}
|
|
@@ -133,4 +211,57 @@ export function renderTemplate(packageRoot, level, title) {
|
|
|
133
211
|
const raw = readFileSync(join(packageRoot, 'templates', actual), 'utf8');
|
|
134
212
|
return raw.replaceAll('{{title}}', title ?? 'Untitled');
|
|
135
213
|
}
|
|
214
|
+
function findSpecForRequest(paths, request) {
|
|
215
|
+
const exact = request.trim();
|
|
216
|
+
if (exact) {
|
|
217
|
+
const found = findSpecByCode(paths, exact);
|
|
218
|
+
if (found)
|
|
219
|
+
return found;
|
|
220
|
+
}
|
|
221
|
+
const specs = listAllSpecs(paths);
|
|
222
|
+
return specs.find((spec) => request.includes(spec.fm.code)) ?? null;
|
|
223
|
+
}
|
|
224
|
+
function inferTopicFromRequest(input) {
|
|
225
|
+
const first = input.toLowerCase().match(/[a-z0-9][a-z0-9-]*/)?.[0];
|
|
226
|
+
return first ?? null;
|
|
227
|
+
}
|
|
228
|
+
function renderGuideTask(spec, request) {
|
|
229
|
+
if (spec)
|
|
230
|
+
return `为 ${spec.fm.code} 编写/推进 ${spec.fm.level} spec: ${spec.fm.title}`;
|
|
231
|
+
return request ? `处理请求: ${request}` : '检查当前项目状态并给出下一步';
|
|
232
|
+
}
|
|
233
|
+
function renderParentContext(paths, spec) {
|
|
234
|
+
if (!spec?.fm.parentCode)
|
|
235
|
+
return '(none)';
|
|
236
|
+
const parent = findSpecByCode(paths, spec.fm.parentCode);
|
|
237
|
+
if (!parent)
|
|
238
|
+
return `parent spec: ${spec.fm.parentCode} (not found)`;
|
|
239
|
+
return [
|
|
240
|
+
`parent spec: ${parent.fm.code}`,
|
|
241
|
+
`title: ${parent.fm.title}`,
|
|
242
|
+
`status: ${parent.fm.status}`,
|
|
243
|
+
`aiSummary: ${parent.fm.aiSummary || '(empty)'}`,
|
|
244
|
+
].join('\n');
|
|
245
|
+
}
|
|
246
|
+
function renderGuideRules() {
|
|
247
|
+
return [
|
|
248
|
+
'R1: 写完 spec 内容后必须停下等待用户审核。',
|
|
249
|
+
'R2: confirm/freeze 是用户审核动作,不由 AI 自行推进。',
|
|
250
|
+
'R13: spec update --content 必须同时提供 aiSummary。',
|
|
251
|
+
'R22: 占位正文必须替换为真实内容。',
|
|
252
|
+
].join('\n');
|
|
253
|
+
}
|
|
254
|
+
function renderRequiredSections(spec) {
|
|
255
|
+
if (!spec)
|
|
256
|
+
return '(unknown until a spec code is provided)';
|
|
257
|
+
return REQUIRED_SECTIONS[spec.fm.level].map((section) => `## ${section}`).join('\n');
|
|
258
|
+
}
|
|
259
|
+
function renderGuideTemplate(packageRoot, spec) {
|
|
260
|
+
if (!spec)
|
|
261
|
+
return '(unknown until a spec code is provided)';
|
|
262
|
+
return renderTemplate(packageRoot, spec.fm.level, spec.fm.title);
|
|
263
|
+
}
|
|
264
|
+
function renderTag(name, body) {
|
|
265
|
+
return `<${name}>\n${body}\n</${name}>`;
|
|
266
|
+
}
|
|
136
267
|
//# sourceMappingURL=usability.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usability.js","sourceRoot":"","sources":["../../src/core/usability.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"usability.js","sourceRoot":"","sources":["../../src/core/usability.ts"],"names":[],"mappings":"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"}
|
package/dist/core/validate.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export interface ValidationWarning {
|
|
|
17
17
|
message: string;
|
|
18
18
|
section?: string;
|
|
19
19
|
}
|
|
20
|
+
export declare const REQUIRED_SECTIONS: Record<SpecLevel, string[]>;
|
|
20
21
|
export declare function validateSpecContent(level: SpecLevel, content: string): ValidationWarning[];
|
|
21
22
|
/**
|
|
22
23
|
* 校验 planJson(来自 templates/agent-plan.json 模板)。
|
|
@@ -31,4 +32,5 @@ export interface PlanJson {
|
|
|
31
32
|
steps: PlanStep[];
|
|
32
33
|
}
|
|
33
34
|
export declare function validatePlanJson(plan: unknown): ValidationWarning[];
|
|
35
|
+
export declare function extractPlanJsonFromSpecContent(content: string): unknown;
|
|
34
36
|
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAKzD,CAAC;AAIF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAkG1F;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,EAAE,CAmEnE;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAoBvE"}
|
package/dist/core/validate.js
CHANGED
|
@@ -10,8 +10,9 @@
|
|
|
10
10
|
* 同时校验 RFC 2119 关键字(如果 L1/L2 内容包含"验收标准"段,则该段每条 AC 应含
|
|
11
11
|
* SHALL/MUST/SHOULD 之一)。这是 OpenSpec 风格的强化。
|
|
12
12
|
*/
|
|
13
|
+
import { isPlaceholderContent } from './placeholder.js';
|
|
13
14
|
const SPEC_CODE_INLINE_RE = /\b[a-z0-9][a-z0-9-]*-L[0-3](?:\.\d+)*(?:-(?!\d{8}\b)[a-z0-9][a-z0-9-]*)?\b/;
|
|
14
|
-
const REQUIRED_SECTIONS = {
|
|
15
|
+
export const REQUIRED_SECTIONS = {
|
|
15
16
|
L0: ['愿景', '路线图'],
|
|
16
17
|
L1: ['背景', '用户故事', '验收标准', '范围边界'],
|
|
17
18
|
L2: ['方案概述', '技术决策', '受影响模块', '接口契约', 'L3 裂变计划'],
|
|
@@ -22,6 +23,13 @@ export function validateSpecContent(level, content) {
|
|
|
22
23
|
const warnings = [];
|
|
23
24
|
const required = REQUIRED_SECTIONS[level] ?? [];
|
|
24
25
|
const sections = parseSections(content);
|
|
26
|
+
if (isPlaceholderContent(content)) {
|
|
27
|
+
warnings.push({
|
|
28
|
+
rule: 'placeholder_marker',
|
|
29
|
+
level: 'warn',
|
|
30
|
+
message: 'contentTemplate 仍包含占位标记,请使用 spec-manager spec update <code> --content <file> --ai-summary "..."',
|
|
31
|
+
});
|
|
32
|
+
}
|
|
25
33
|
for (const r of required) {
|
|
26
34
|
if (!sections.some(s => s.heading === r)) {
|
|
27
35
|
warnings.push({
|
|
@@ -173,6 +181,26 @@ export function validatePlanJson(plan) {
|
|
|
173
181
|
}
|
|
174
182
|
return warnings;
|
|
175
183
|
}
|
|
184
|
+
export function extractPlanJsonFromSpecContent(content) {
|
|
185
|
+
const heading = content.match(/^##\s+planJson \(final\)\s*$/im);
|
|
186
|
+
if (!heading || heading.index === undefined) {
|
|
187
|
+
throw new Error('PLAN_JSON_MISSING: 未找到 ## planJson (final) 段');
|
|
188
|
+
}
|
|
189
|
+
const afterHeading = content.slice(heading.index + heading[0].length);
|
|
190
|
+
const nextHeading = afterHeading.search(/^##\s+/m);
|
|
191
|
+
const section = nextHeading >= 0 ? afterHeading.slice(0, nextHeading) : afterHeading;
|
|
192
|
+
const block = section.match(/```json\s*([\s\S]*?)\s*```/i);
|
|
193
|
+
if (!block) {
|
|
194
|
+
throw new Error('PLAN_JSON_MISSING: ## planJson (final) 段缺少 ```json 代码块');
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
return JSON.parse(block[1]);
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
201
|
+
throw new Error(`PLAN_JSON_INVALID: ${detail}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
176
204
|
function parseSections(content) {
|
|
177
205
|
const lines = content.split('\n');
|
|
178
206
|
const sections = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,mBAAmB,GAAG,4EAA4E,CAAC;AAWzG,MAAM,iBAAiB,GAAgC;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ProjectPaths } from './paths.js';
|
|
2
|
+
import type { SpecLevelT, SpecStatusT } from '../schemas/spec.js';
|
|
3
|
+
import type { TaskStatus } from './status.js';
|
|
4
|
+
export interface ViewSpecSummary {
|
|
5
|
+
code: string;
|
|
6
|
+
level: SpecLevelT;
|
|
7
|
+
status: SpecStatusT;
|
|
8
|
+
title: string;
|
|
9
|
+
parentCode: string | null;
|
|
10
|
+
aiSummary: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ViewTaskSummary {
|
|
13
|
+
id: string;
|
|
14
|
+
specCode: string;
|
|
15
|
+
status: TaskStatus;
|
|
16
|
+
startedAt: string | null;
|
|
17
|
+
finishedAt: string | null;
|
|
18
|
+
totalSteps: number;
|
|
19
|
+
succeededSteps: number;
|
|
20
|
+
}
|
|
21
|
+
export interface ViewTopicSummary {
|
|
22
|
+
topic: string;
|
|
23
|
+
specCount: number;
|
|
24
|
+
taskCount: number;
|
|
25
|
+
nextAction: string;
|
|
26
|
+
specs: ViewSpecSummary[];
|
|
27
|
+
tasks: ViewTaskSummary[];
|
|
28
|
+
}
|
|
29
|
+
export interface ViewModel {
|
|
30
|
+
topics: ViewTopicSummary[];
|
|
31
|
+
}
|
|
32
|
+
export declare function buildViewModel(paths: ProjectPaths, opts?: {
|
|
33
|
+
topic?: string;
|
|
34
|
+
}): ViewModel;
|
|
35
|
+
//# sourceMappingURL=view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/core/view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAoCxF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { listAllSpecs } from './spec-io.js';
|
|
2
|
+
import { listTasks } from './task.js';
|
|
3
|
+
import { getFlowStatus } from './usability.js';
|
|
4
|
+
export function buildViewModel(paths, opts) {
|
|
5
|
+
const specs = listAllSpecs(paths).filter((spec) => !opts?.topic || spec.fm.topic === opts.topic);
|
|
6
|
+
const tasks = listTasks(paths, { topic: opts?.topic });
|
|
7
|
+
if (opts?.topic && specs.length === 0 && tasks.length === 0) {
|
|
8
|
+
throw new Error(`TOPIC_NOT_FOUND: ${opts.topic}`);
|
|
9
|
+
}
|
|
10
|
+
const flows = getFlowStatus(paths, { topic: opts?.topic });
|
|
11
|
+
const topics = flows
|
|
12
|
+
.filter((flow) => !opts?.topic || flow.topic === opts.topic)
|
|
13
|
+
.map((flow) => {
|
|
14
|
+
const topicSpecs = specs
|
|
15
|
+
.filter((spec) => spec.fm.topic === flow.topic)
|
|
16
|
+
.sort((a, b) => a.fm.code.localeCompare(b.fm.code));
|
|
17
|
+
const topicTasks = tasks
|
|
18
|
+
.filter((task) => topicSpecs.some((spec) => spec.fm.code === task.specCode))
|
|
19
|
+
.sort((a, b) => a.created.localeCompare(b.created));
|
|
20
|
+
return {
|
|
21
|
+
topic: flow.topic,
|
|
22
|
+
specCount: topicSpecs.length,
|
|
23
|
+
taskCount: topicTasks.length,
|
|
24
|
+
nextAction: flow.nextAction,
|
|
25
|
+
specs: topicSpecs.map((spec) => ({
|
|
26
|
+
code: spec.fm.code,
|
|
27
|
+
level: spec.fm.level,
|
|
28
|
+
status: spec.fm.status,
|
|
29
|
+
title: spec.fm.title,
|
|
30
|
+
parentCode: spec.fm.parentCode,
|
|
31
|
+
aiSummary: spec.fm.aiSummary ?? '',
|
|
32
|
+
})),
|
|
33
|
+
tasks: topicTasks.map(summarizeTask),
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
return { topics };
|
|
37
|
+
}
|
|
38
|
+
function summarizeTask(task) {
|
|
39
|
+
const steps = task.steps ?? [];
|
|
40
|
+
return {
|
|
41
|
+
id: task.id,
|
|
42
|
+
specCode: task.specCode,
|
|
43
|
+
status: task.status,
|
|
44
|
+
startedAt: task.startedAt,
|
|
45
|
+
finishedAt: task.finishedAt,
|
|
46
|
+
totalSteps: steps.length,
|
|
47
|
+
succeededSteps: steps.filter((step) => step.status === 'succeeded').length,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/core/view.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAmB,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAoC/C,MAAM,UAAU,cAAc,CAAC,KAAmB,EAAE,IAAyB;IAC3E,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACvD,IAAI,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,KAAK;SACjB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC;SAC3D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,UAAU,GAAG,KAAK;aACrB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC;aAC9C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,KAAK;aACrB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC3E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAEtD,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,UAAU,CAAC,MAAM;YAC5B,SAAS,EAAE,UAAU,CAAC,MAAM;YAC5B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC/B,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI;gBAClB,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK;gBACpB,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM;gBACtB,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK;gBACpB,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU;gBAC9B,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,IAAI,EAAE;aACnC,CAAC,CAAC;YACH,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC;SACrC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC;AAED,SAAS,aAAa,CAAC,IAAgB;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,KAAK,CAAC,MAAM;QACxB,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM;KAC3E,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spec-manager",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "spec-manager: local-first spec-driven development platform. Pure markdown storage, no network, no MCP. Portable CLI + multi-agent instructions.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"delta-spec"
|
|
45
45
|
],
|
|
46
46
|
"dependencies": {
|
|
47
|
+
"@inquirer/prompts": "^7.10.1",
|
|
47
48
|
"commander": "^12.0.0",
|
|
48
49
|
"gray-matter": "^4.0.3",
|
|
49
50
|
"yaml": "^2.4.0",
|
package/rules/flow-control.md
CHANGED
|
@@ -14,7 +14,7 @@ applies_to: [L1_create, L2_create, L3_create]
|
|
|
14
14
|
|
|
15
15
|
每次 `spec-manager spec update <code> --content` 写入后,**必须停下**,告知用户文件路径,等用户明确说"批准"/"已确认"/"继续"/"通过"等。
|
|
16
16
|
|
|
17
|
-
**严禁一口气做**:`new L1 → update --content → confirm → new L2 → update → confirm → new L3 →
|
|
17
|
+
**严禁一口气做**:`new L1 → update --content → confirm → new L2 → update → confirm → new L3 → confirm → task create → start`。
|
|
18
18
|
|
|
19
19
|
## R2 — 状态推进是用户行为,不是 AI 行为
|
|
20
20
|
|
|
@@ -25,7 +25,7 @@ added: 0.1.0
|
|
|
25
25
|
applies_to: [L1_confirm, L2_confirm, L3_confirm, L3_freeze, user_approve]
|
|
26
26
|
---
|
|
27
27
|
|
|
28
|
-
`draft → confirmed`
|
|
28
|
+
L1/L2 的 `draft → confirmed`、L3 的 `draft → frozen`,以及历史 L3 的 `confirmed → frozen` 都是用户审核意见的体现。L3 一次明确批准后直接进入 frozen,不再要求对同一正文重复批准。AI agent **不能**在未获用户明确批准前主动调用 `spec-manager spec confirm` / `freeze`。
|
|
29
29
|
|
|
30
30
|
**唯一例外**:`frozen → implemented` 由 `spec-manager task complete` 自动触发,允许 AI agent 执行。
|
|
31
31
|
|
|
@@ -60,6 +60,6 @@ applies_to: [L1_confirm, L2_confirm, L3_confirm]
|
|
|
60
60
|
|
|
61
61
|
> 人工审计:本规则依赖人工判断,无法通过系统强制执行,实际执行由人工审核保障。
|
|
62
62
|
|
|
63
|
-
L1 PRD 审核、L2 Design 审核、L3 Impl 审核是**三个独立的停止点**。不能因为 L1 批准了就连带假设 L2
|
|
63
|
+
L1 PRD 审核、L2 Design 审核、L3 Impl 审核是**三个独立的停止点**。不能因为 L1 批准了就连带假设 L2 也批准;L3 自身只需一次明确批准,批准后直接 frozen。
|
|
64
64
|
|
|
65
65
|
**人工审计说明**:本规则依赖人工判断,无法通过系统强制执行。hooks 作为辅助提醒,实际执行由人工审核保障。
|
package/skill/SKILL.md
CHANGED
|
@@ -41,6 +41,17 @@ PRD → Design → Spec → Agent Task → 部署。**纯本地**,所有数据
|
|
|
41
41
|
| L2 Design | 技术设计 | confirmed 才能进实施 |
|
|
42
42
|
| L3 Impl | 实施规格 | ≤20 步,frozen 后建 Task |
|
|
43
43
|
|
|
44
|
+
## Unified Rules
|
|
45
|
+
|
|
46
|
+
- Feature work MUST go through `spec-manager`.
|
|
47
|
+
- New or non-trivial work follows L1 -> L2 -> L3 -> Agent Task.
|
|
48
|
+
- Never write implementation code without a frozen L3 spec.
|
|
49
|
+
- L1/L2 approval advances `draft -> confirmed`; one explicit L3 approval (an explicit user approval) advances `draft -> frozen`.
|
|
50
|
+
- Before code edits, read the frozen L3 spec and create/start an Agent Task.
|
|
51
|
+
- planJson `coveredSpecs` MUST include the current L3 specCode.
|
|
52
|
+
- Validate L3 markdown plans with `spec-manager spec validate-plan --from-spec <L3-code>`.
|
|
53
|
+
- Record execution with `spec-manager task step`; finish with `spec-manager task complete`.
|
|
54
|
+
|
|
44
55
|
## 规则(24 条,按 applies_to 过滤)
|
|
45
56
|
|
|
46
57
|
| 主题 | 规则 | 文件 |
|
|
@@ -55,8 +66,9 @@ PRD → Design → Spec → Agent Task → 部署。**纯本地**,所有数据
|
|
|
55
66
|
## Spec 状态流
|
|
56
67
|
|
|
57
68
|
```
|
|
58
|
-
draft → confirmed
|
|
59
|
-
|
|
69
|
+
L1/L2: draft → confirmed
|
|
70
|
+
L3: draft → frozen → implemented
|
|
71
|
+
AI agent 用户 task_complete
|
|
60
72
|
```
|
|
61
73
|
|
|
62
74
|
## CLI 概要
|
package/skill/subskills/impl.md
CHANGED
|
@@ -40,9 +40,9 @@
|
|
|
40
40
|
> ☑ **R13** / **R21** — `--ai-summary` ≤300 字符(CLI 截断,>300 自动 warn)
|
|
41
41
|
> ☑ **R14** / **R22** — 流程规则,人工把关
|
|
42
42
|
6. 🛑 **等用户审核**(R1)— 流程规则,停下等用户信号
|
|
43
|
-
7.
|
|
43
|
+
7. 用户一次批准 → `spec-manager spec confirm <code>`,L3 直接进入 `frozen`
|
|
44
44
|
> ☑ **R2** / **R4** — 流程规则:状态由用户推进,每层独立审核
|
|
45
|
-
> CLI
|
|
45
|
+
> CLI 在批准进入 `frozen` 之前会校验 R22(contentTemplate 非空)
|
|
46
46
|
|
|
47
47
|
### Agent Task 执行
|
|
48
48
|
|
package/templates/L3-impl.md
CHANGED
|
@@ -13,7 +13,7 @@ Expert guidelines:
|
|
|
13
13
|
- 每步实施必须精确到函数/方法级别,禁止"修改相关代码"等模糊表述
|
|
14
14
|
- planJson 字段名必须从 templates/agent-plan.json 读取,禁止凭记忆(R12/INC-005)
|
|
15
15
|
- step_report 每步必须携带 outputJson(R15),格式见下方模板
|
|
16
|
-
- coveredSpecs:
|
|
16
|
+
- coveredSpecs: 必须包含当前 L3 specCode;若本 Task 实际覆盖多条 L3,列出所有 specCode
|
|
17
17
|
- 验证命令必须可直接粘贴执行,含预期输出的精确匹配串
|
|
18
18
|
- 回滚方案不是可选项,每个 L3 必须说明"改坏了怎么恢复"
|
|
19
19
|
- 写 L3 前必须执行 Level 3 文件级分析(R23,见 rules/codebase-survey.md)
|
|
@@ -95,7 +95,7 @@ Expert guidelines:
|
|
|
95
95
|
|
|
96
96
|
```json
|
|
97
97
|
{
|
|
98
|
-
"coveredSpecs": ["
|
|
98
|
+
"coveredSpecs": ["<本 L3 specCode>"],
|
|
99
99
|
"steps": [
|
|
100
100
|
{"stepNo": 1, "stepType": "mcp_tool", "name": "上下文收集: spec-manager spec show(L3 + 父 L2)"},
|
|
101
101
|
{"stepNo": 2, "stepType": "mcp_tool", "name": "<动词+宾语+文件>"},
|