spec-manager 0.2.1 → 0.4.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.md +16 -10
- package/dist/cli/decision.js +2 -2
- package/dist/cli/decision.js.map +1 -1
- package/dist/cli/project.d.ts.map +1 -1
- package/dist/cli/project.js +4 -1
- package/dist/cli/project.js.map +1 -1
- package/dist/cli/task.d.ts.map +1 -1
- package/dist/cli/task.js +42 -21
- package/dist/cli/task.js.map +1 -1
- package/dist/core/agents.d.ts +6 -0
- package/dist/core/agents.d.ts.map +1 -1
- package/dist/core/agents.js +65 -25
- package/dist/core/agents.js.map +1 -1
- package/dist/core/audit.d.ts +5 -1
- package/dist/core/audit.d.ts.map +1 -1
- package/dist/core/audit.js +15 -4
- package/dist/core/audit.js.map +1 -1
- package/dist/core/decision.d.ts +1 -0
- package/dist/core/decision.d.ts.map +1 -1
- package/dist/core/decision.js +6 -3
- package/dist/core/decision.js.map +1 -1
- package/dist/core/harness.d.ts +1 -0
- package/dist/core/harness.d.ts.map +1 -1
- package/dist/core/harness.js +11 -35
- package/dist/core/harness.js.map +1 -1
- package/dist/core/integrity.js +3 -3
- package/dist/core/integrity.js.map +1 -1
- package/dist/core/invariants.d.ts +4 -2
- package/dist/core/invariants.d.ts.map +1 -1
- package/dist/core/invariants.js +8 -3
- package/dist/core/invariants.js.map +1 -1
- package/dist/core/spec-io.d.ts.map +1 -1
- package/dist/core/spec-io.js +3 -0
- package/dist/core/spec-io.js.map +1 -1
- package/dist/core/spec-sections.d.ts +10 -0
- package/dist/core/spec-sections.d.ts.map +1 -0
- package/dist/core/spec-sections.js +43 -0
- package/dist/core/spec-sections.js.map +1 -0
- package/dist/core/task.d.ts +12 -0
- package/dist/core/task.d.ts.map +1 -1
- package/dist/core/task.js +114 -5
- package/dist/core/task.js.map +1 -1
- package/dist/core/usability.d.ts +1 -1
- package/dist/core/usability.d.ts.map +1 -1
- package/dist/core/usability.js +22 -6
- package/dist/core/usability.js.map +1 -1
- package/dist/core/validate.d.ts.map +1 -1
- package/dist/core/validate.js +40 -0
- package/dist/core/validate.js.map +1 -1
- package/dist/core/verify.d.ts +44 -0
- package/dist/core/verify.d.ts.map +1 -0
- package/dist/core/verify.js +138 -0
- package/dist/core/verify.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
- package/rules/quality-gate.md +3 -1
- package/scripts/verify-installed-cli.mjs +63 -0
- package/skill/SKILL.md +15 -1
- package/skill/subskills/impl.md +14 -6
- package/templates/L3-impl.md +10 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @verify 规则解析与执行。
|
|
3
|
+
* 从 L3 spec 的 ## 验收标准 段中解析 @verify: 标记,自动执行校验。
|
|
4
|
+
*/
|
|
5
|
+
/** @verify 规则 — 从 L3 验收标准段解析,不持久化 */
|
|
6
|
+
export type VerifyRule = {
|
|
7
|
+
type: 'file-exists';
|
|
8
|
+
path: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: 'export-exists';
|
|
11
|
+
file: string;
|
|
12
|
+
symbol: string;
|
|
13
|
+
} | {
|
|
14
|
+
type: 'command';
|
|
15
|
+
cmd: string;
|
|
16
|
+
};
|
|
17
|
+
/** 单条规则执行结果 */
|
|
18
|
+
export interface VerifyResult {
|
|
19
|
+
rule: VerifyRule;
|
|
20
|
+
passed: boolean;
|
|
21
|
+
message: string;
|
|
22
|
+
}
|
|
23
|
+
/** 匹配 @verify 行,支持有序列表(1. )和无序列表(- )前缀 */
|
|
24
|
+
export declare const VERIFY_RE: RegExp;
|
|
25
|
+
/** @verify 类型 → 参数数量 */
|
|
26
|
+
export declare const VERIFY_TYPE_ARITY: Record<string, number>;
|
|
27
|
+
/**
|
|
28
|
+
* 从 spec markdown 的指定段中解析 @verify 规则。
|
|
29
|
+
* 仅解析 ## sectionName 段内的 @verify: 行。
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseVerifyRules(content: string, sectionName: string): VerifyRule[];
|
|
32
|
+
/**
|
|
33
|
+
* 执行一组 @verify 规则,返回每条规则的结果。
|
|
34
|
+
* projectRoot 用于解析相对路径。
|
|
35
|
+
*/
|
|
36
|
+
export declare function executeVerifyRules(rules: VerifyRule[], projectRoot: string): VerifyResult[];
|
|
37
|
+
export interface RunCommandResult {
|
|
38
|
+
exitCode: number;
|
|
39
|
+
output: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function runCommand(cmd: string, cwd: string): RunCommandResult;
|
|
42
|
+
/** 拆分括号内逗号分隔参数,处理嵌套括号 */
|
|
43
|
+
export declare function splitArgs(raw: string): string[];
|
|
44
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/core/verify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,qCAAqC;AACrC,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC,eAAe;AACf,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,0CAA0C;AAC1C,eAAO,MAAM,SAAS,QAAuD,CAAC;AAG9E,wBAAwB;AACxB,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIpD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU,EAAE,CA4BnF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,EAAE,CAE3F;AA+CD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAUrE;AAED,yBAAyB;AACzB,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAoB/C"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @verify 规则解析与执行。
|
|
3
|
+
* 从 L3 spec 的 ## 验收标准 段中解析 @verify: 标记,自动执行校验。
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
6
|
+
import { execSync } from 'node:child_process';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
/** 匹配 @verify 行,支持有序列表(1. )和无序列表(- )前缀 */
|
|
9
|
+
export const VERIFY_RE = /^(?:\d+\.\s+|- )?@verify:\s*(\w[\w-]*)\((.+)\)\s*$/;
|
|
10
|
+
const COMMAND_TIMEOUT_MS = 30_000;
|
|
11
|
+
/** @verify 类型 → 参数数量 */
|
|
12
|
+
export const VERIFY_TYPE_ARITY = {
|
|
13
|
+
'file-exists': 1,
|
|
14
|
+
'export-exists': 2,
|
|
15
|
+
'command': 1,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* 从 spec markdown 的指定段中解析 @verify 规则。
|
|
19
|
+
* 仅解析 ## sectionName 段内的 @verify: 行。
|
|
20
|
+
*/
|
|
21
|
+
export function parseVerifyRules(content, sectionName) {
|
|
22
|
+
const rules = [];
|
|
23
|
+
const lines = content.split('\n');
|
|
24
|
+
let inSection = false;
|
|
25
|
+
for (const line of lines) {
|
|
26
|
+
const trimmed = line.trim();
|
|
27
|
+
if (/^##\s+/.test(trimmed)) {
|
|
28
|
+
inSection = trimmed.includes(sectionName);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (!inSection)
|
|
32
|
+
continue;
|
|
33
|
+
const m = VERIFY_RE.exec(trimmed);
|
|
34
|
+
if (!m)
|
|
35
|
+
continue;
|
|
36
|
+
const [, type, argsStr] = m;
|
|
37
|
+
const args = splitArgs(argsStr);
|
|
38
|
+
if (type === 'file-exists' && args.length === 1) {
|
|
39
|
+
rules.push({ type: 'file-exists', path: args[0] });
|
|
40
|
+
}
|
|
41
|
+
else if (type === 'export-exists' && args.length === 2) {
|
|
42
|
+
rules.push({ type: 'export-exists', file: args[0], symbol: args[1] });
|
|
43
|
+
}
|
|
44
|
+
else if (type === 'command' && args.length === 1) {
|
|
45
|
+
rules.push({ type: 'command', cmd: args[0] });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return rules;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 执行一组 @verify 规则,返回每条规则的结果。
|
|
52
|
+
* projectRoot 用于解析相对路径。
|
|
53
|
+
*/
|
|
54
|
+
export function executeVerifyRules(rules, projectRoot) {
|
|
55
|
+
return rules.map(rule => executeOne(rule, projectRoot));
|
|
56
|
+
}
|
|
57
|
+
function executeOne(rule, projectRoot) {
|
|
58
|
+
switch (rule.type) {
|
|
59
|
+
case 'file-exists': {
|
|
60
|
+
const abs = path.resolve(projectRoot, rule.path);
|
|
61
|
+
const exists = existsSync(abs);
|
|
62
|
+
return {
|
|
63
|
+
rule,
|
|
64
|
+
passed: exists,
|
|
65
|
+
message: exists ? `${rule.path} exists` : `${rule.path} not found`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
case 'export-exists': {
|
|
69
|
+
const abs = path.resolve(projectRoot, rule.file);
|
|
70
|
+
if (!existsSync(abs)) {
|
|
71
|
+
return { rule, passed: false, message: `${rule.file} not found` };
|
|
72
|
+
}
|
|
73
|
+
const content = readFileSync(abs, 'utf8');
|
|
74
|
+
const re = new RegExp(`export\\s+(?:default\\s+)?(?:function|const|let|var|class|type|interface|enum)\\s+${escapeRegExp(rule.symbol)}\\b`);
|
|
75
|
+
const alsoNamed = new RegExp(`export\\s*\\{[^}]*\\b${escapeRegExp(rule.symbol)}\\b[^}]*\\}`);
|
|
76
|
+
const found = re.test(content) || alsoNamed.test(content);
|
|
77
|
+
return {
|
|
78
|
+
rule,
|
|
79
|
+
passed: found,
|
|
80
|
+
message: found
|
|
81
|
+
? `${rule.symbol} exported from ${rule.file}`
|
|
82
|
+
: `${rule.symbol} not found in exports of ${rule.file}`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
case 'command': {
|
|
86
|
+
const result = runCommand(rule.cmd, projectRoot);
|
|
87
|
+
return {
|
|
88
|
+
rule,
|
|
89
|
+
passed: result.exitCode === 0,
|
|
90
|
+
message: result.exitCode === 0
|
|
91
|
+
? `${rule.cmd} → exit 0`
|
|
92
|
+
: `${rule.cmd} → exit ${result.exitCode}${result.output ? ': ' + result.output : ''}`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export function runCommand(cmd, cwd) {
|
|
98
|
+
try {
|
|
99
|
+
execSync(cmd, { cwd, timeout: COMMAND_TIMEOUT_MS, stdio: 'pipe', encoding: 'utf8' });
|
|
100
|
+
return { exitCode: 0, output: '' };
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
const e = err;
|
|
104
|
+
const exitCode = e.status ?? 1;
|
|
105
|
+
const output = (e.stderr ?? e.stdout ?? '').toString().slice(0, 500);
|
|
106
|
+
return { exitCode, output };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** 拆分括号内逗号分隔参数,处理嵌套括号 */
|
|
110
|
+
export function splitArgs(raw) {
|
|
111
|
+
const args = [];
|
|
112
|
+
let depth = 0;
|
|
113
|
+
let current = '';
|
|
114
|
+
for (const ch of raw) {
|
|
115
|
+
if (ch === '(') {
|
|
116
|
+
depth++;
|
|
117
|
+
current += ch;
|
|
118
|
+
}
|
|
119
|
+
else if (ch === ')') {
|
|
120
|
+
depth--;
|
|
121
|
+
current += ch;
|
|
122
|
+
}
|
|
123
|
+
else if (ch === ',' && depth === 0) {
|
|
124
|
+
args.push(current.trim());
|
|
125
|
+
current = '';
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
current += ch;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (current.trim())
|
|
132
|
+
args.push(current.trim());
|
|
133
|
+
return args;
|
|
134
|
+
}
|
|
135
|
+
function escapeRegExp(s) {
|
|
136
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/core/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export * from './core/audit-events.js';
|
|
|
8
8
|
export * from './core/repository.js';
|
|
9
9
|
export * from './core/usability.js';
|
|
10
10
|
export * from './core/invariants.js';
|
|
11
|
+
export * from './core/verify.js';
|
|
12
|
+
export * from './core/spec-sections.js';
|
|
11
13
|
export * from './core/integrity.js';
|
|
12
14
|
export * from './core/integrity-exemptions.js';
|
|
13
15
|
export * from './core/remediation.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,8 @@ export * from './core/audit-events.js';
|
|
|
9
9
|
export * from './core/repository.js';
|
|
10
10
|
export * from './core/usability.js';
|
|
11
11
|
export * from './core/invariants.js';
|
|
12
|
+
export * from './core/verify.js';
|
|
13
|
+
export * from './core/spec-sections.js';
|
|
12
14
|
export * from './core/integrity.js';
|
|
13
15
|
export * from './core/integrity-exemptions.js';
|
|
14
16
|
export * from './core/remediation.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spec-manager",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
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",
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"types": "./dist/index.d.ts",
|
|
15
15
|
"files": [
|
|
16
16
|
"dist",
|
|
17
|
+
"scripts",
|
|
17
18
|
"skill",
|
|
18
19
|
"templates",
|
|
19
20
|
"rules",
|
|
@@ -27,7 +28,8 @@
|
|
|
27
28
|
"test": "vitest run",
|
|
28
29
|
"test:watch": "vitest",
|
|
29
30
|
"dev": "tsc --watch",
|
|
30
|
-
"lint": "tsc --noEmit"
|
|
31
|
+
"lint": "tsc --noEmit",
|
|
32
|
+
"verify:installed-cli": "node scripts/verify-installed-cli.mjs"
|
|
31
33
|
},
|
|
32
34
|
"keywords": [
|
|
33
35
|
"spec-driven",
|
package/rules/quality-gate.md
CHANGED
|
@@ -64,10 +64,12 @@ added: 0.1.0
|
|
|
64
64
|
applies_to: [L1_implemented]
|
|
65
65
|
---
|
|
66
66
|
|
|
67
|
-
L1 spec 状态推进到 `implemented`(通常通过 L3 cascade
|
|
67
|
+
L1 spec 状态推进到 `implemented`(通常通过 L3 cascade)后,**必须**至少存在 1 张 active 决策卡片;superseded 或 partial 卡片不满足 R18。为避免最后一个 Task 与 R18 形成循环依赖,正常流程应在 L1 已 `confirmed`、最后一个 Task 完成前预建卡片:
|
|
68
68
|
|
|
69
69
|
```bash
|
|
70
70
|
spec-manager decision create <L1 code> --topic <topic> --what "..." --why "..." --criteria AC-1,AC-2
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
+
**执行机制**:`decision create` 允许关联 `confirmed` 或 `implemented` L1,拒绝 draft L1。`task complete` 在 cascade 到 L1 implemented 后自动检查 active 决策卡片,缺失则抛出 R18 错误并回滚完成事务。异常或历史恢复只能使用独立的 `--skip-r18`、`--skip-verification`、`--skip-verify`,且必须提供 `--reason`;旧 `--force` 被拒绝。R18 已纳入合规基线(`audit show` 检查)。
|
|
74
|
+
|
|
73
75
|
新 L1 创建前(PRE-WRITE Q4)必须 `spec-manager decision list --topic <topic>` 查询历史决策。
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { execFileSync } from 'node:child_process';
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
import { existsSync, readFileSync, readdirSync, realpathSync, statSync } from 'node:fs';
|
|
6
|
+
import { dirname, join, relative, resolve } from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
|
|
9
|
+
const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
10
|
+
const installedRootOverride = process.env.SPEC_MANAGER_INSTALLED_ROOT;
|
|
11
|
+
const installedBin = installedRootOverride ? null : findInstalledBin();
|
|
12
|
+
const installedRoot = installedRootOverride ? resolve(installedRootOverride) : findPackageRoot(realpathSync(installedBin));
|
|
13
|
+
const localDist = join(repoRoot, 'dist');
|
|
14
|
+
const installedDist = join(installedRoot, 'dist');
|
|
15
|
+
const localFiles = listFiles(localDist);
|
|
16
|
+
const installedFiles = existsSync(installedDist) ? listFiles(installedDist) : [];
|
|
17
|
+
const allFiles = [...new Set([...localFiles, ...installedFiles])].sort();
|
|
18
|
+
const mismatches = allFiles.filter((file) => {
|
|
19
|
+
const local = join(localDist, file);
|
|
20
|
+
const installed = join(installedDist, file);
|
|
21
|
+
return !existsSync(local) || !existsSync(installed) || digest(local) !== digest(installed);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
if (mismatches.length > 0) {
|
|
25
|
+
console.error(`INSTALLED_CLI_DRIFT: ${installedBin ?? installedRoot} differs from the current build`);
|
|
26
|
+
for (const file of mismatches) console.error(` - ${file}`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
console.log(`Installed CLI matches current build: ${installedBin ?? installedRoot}`);
|
|
31
|
+
|
|
32
|
+
function findInstalledBin() {
|
|
33
|
+
try {
|
|
34
|
+
return execFileSync('sh', ['-c', 'command -v spec-manager'], { encoding: 'utf8' }).trim();
|
|
35
|
+
} catch {
|
|
36
|
+
console.error('INSTALLED_CLI_MISSING: spec-manager is not available on PATH');
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function digest(file) {
|
|
42
|
+
return createHash('sha256').update(readFileSync(file)).digest('hex');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function listFiles(root, base = root) {
|
|
46
|
+
const files = [];
|
|
47
|
+
for (const entry of readdirSync(root, { withFileTypes: true })) {
|
|
48
|
+
const path = join(root, entry.name);
|
|
49
|
+
if (entry.isDirectory()) files.push(...listFiles(path, base));
|
|
50
|
+
else if (entry.isFile() && statSync(path).isFile()) files.push(relative(base, path));
|
|
51
|
+
}
|
|
52
|
+
return files.sort();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function findPackageRoot(start) {
|
|
56
|
+
let current = dirname(start);
|
|
57
|
+
while (dirname(current) !== current) {
|
|
58
|
+
if (existsSync(join(current, 'package.json'))) return current;
|
|
59
|
+
current = dirname(current);
|
|
60
|
+
}
|
|
61
|
+
console.error(`INSTALLED_CLI_PACKAGE_MISSING: cannot locate package root for ${start}`);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
package/skill/SKILL.md
CHANGED
|
@@ -52,6 +52,9 @@ PRD → Design → Spec → Agent Task → 部署。**纯本地**,所有数据
|
|
|
52
52
|
- planJson `coveredSpecs` MUST include the current L3 specCode.
|
|
53
53
|
- Validate L3 markdown plans with `spec-manager spec validate-plan --from-spec <L3-code>`.
|
|
54
54
|
- Record execution with `spec-manager task step`; finish with `spec-manager task complete`.
|
|
55
|
+
- ALL spec/task operations MUST go through `spec-manager` CLI. Never write raw markdown to spec files or JSON to task files — raw writes bypass status machine, audit hits, and cascade logic.
|
|
56
|
+
- Before marking any L3 as implemented, an Agent Task MUST be created and completed via `spec-manager task create/start/step/complete`. Direct `spec implement` is forbidden for L3 (R3).
|
|
57
|
+
- After creating any spec, establish relations: `spec-manager spec add-relation <code> --type based_on --target <parentCode>`. L3 MUST have at least `based_on` to its parent L2.
|
|
55
58
|
|
|
56
59
|
## 规则(24 条,按 applies_to 过滤)
|
|
57
60
|
|
|
@@ -69,7 +72,9 @@ PRD → Design → Spec → Agent Task → 部署。**纯本地**,所有数据
|
|
|
69
72
|
```
|
|
70
73
|
L1/L2: draft → confirmed
|
|
71
74
|
L3: draft → frozen → implemented
|
|
72
|
-
AI agent
|
|
75
|
+
AI agent 用户批准 task_complete cascade
|
|
76
|
+
⚠️ L3 没有 `confirmed` 状态。`spec confirm <L3>` 直接进入 `frozen`。
|
|
77
|
+
⚠️ 禁止绕过 CLI — 直接写文件会跳过 frozen 强制校验。
|
|
73
78
|
```
|
|
74
79
|
|
|
75
80
|
## CLI 概要
|
|
@@ -84,6 +89,15 @@ L3: draft → frozen → implemented
|
|
|
84
89
|
- `incident new|list` — 事故记录
|
|
85
90
|
- `audit hit|report|show` — 规则审计
|
|
86
91
|
|
|
92
|
+
### Relations 工作流
|
|
93
|
+
|
|
94
|
+
创建 spec 后立即建立关联:
|
|
95
|
+
```bash
|
|
96
|
+
spec-manager spec add-relation <code> --type based_on --target <parentCode>
|
|
97
|
+
spec-manager spec add-relation <code> --type references --target <relatedCode> # 若有跨 spec 引用
|
|
98
|
+
```
|
|
99
|
+
L3 必须有至少一条 `based_on` 关联指向父 L2。L1/L2 关联可选但推荐。
|
|
100
|
+
|
|
87
101
|
## 数据布局
|
|
88
102
|
|
|
89
103
|
```
|
package/skill/subskills/impl.md
CHANGED
|
@@ -63,13 +63,21 @@
|
|
|
63
63
|
- step_report 必须在工作完成后才报(R15)
|
|
64
64
|
> ☑ **R5** — `task complete` 时仍有 pending/running 步会拒绝并报错
|
|
65
65
|
> ☑ **R15** — outputJson 缺 summary 时 warning 落 warn 数组
|
|
66
|
-
12.
|
|
67
|
-
|
|
66
|
+
12. 最后一个子 Task 完成前,对即将级联的 confirmed L1 检查并预建 R18 决策卡片:
|
|
67
|
+
```bash
|
|
68
|
+
spec-manager decision list --doc-code <L1-code>
|
|
69
|
+
spec-manager decision create <L1-code> --topic <topic> --what "..." --why "..."
|
|
70
|
+
```
|
|
71
|
+
13. `spec-manager task complete <task-id>`
|
|
68
72
|
> ☑ **R6** — 流程规则:确认 cascade 后再标 implemented
|
|
69
|
-
|
|
70
|
-
14.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
+
> ☑ **R18** — L1 cascade 到 implemented 后自动校验预建决策卡片,缺失则拒绝完成并回滚
|
|
74
|
+
14. 若仍 frozen,手动 `spec-manager spec implement <L3 code>`
|
|
75
|
+
15. 异常或历史恢复必须使用独立跳过参数并提供原因,跳过 R18 后必须立即补建 active 决策卡:
|
|
76
|
+
```bash
|
|
77
|
+
spec-manager task complete <task-id> --skip-r18 --reason "历史仓库恢复"
|
|
78
|
+
spec-manager decision create <L1-code> --topic <topic> --what "..." --why "..."
|
|
79
|
+
```
|
|
80
|
+
16. 规则审计合规检查:
|
|
73
81
|
```bash
|
|
74
82
|
spec-manager audit show
|
|
75
83
|
```
|
package/templates/L3-impl.md
CHANGED
|
@@ -123,3 +123,13 @@ Expert guidelines:
|
|
|
123
123
|
| 风险 | 应对 |
|
|
124
124
|
|---|---|
|
|
125
125
|
| ... | ... |
|
|
126
|
+
|
|
127
|
+
## 关联
|
|
128
|
+
|
|
129
|
+
<使用 `spec-manager spec add-relation <本L3 code> --type <type> --target <targetCode>` 建立关联>
|
|
130
|
+
|
|
131
|
+
| 关联类型 | 目标 specCode | 说明 |
|
|
132
|
+
|---|---|---|
|
|
133
|
+
| based_on | <父 L2 code> | 必填:引用父 L2 |
|
|
134
|
+
| implements | <父 L2 code> | 可选:明确实现关系 |
|
|
135
|
+
| references | <相关 specCode> | 可选:跨 spec 引用 |
|