@accelerator-mzq/forge 2.0.0 → 3.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/README.md +12 -12
- package/dist/cli/commands/ack.d.ts.map +1 -1
- package/dist/cli/commands/ack.js +87 -12
- package/dist/cli/commands/ack.js.map +1 -1
- package/dist/cli/commands/archive.d.ts.map +1 -1
- package/dist/cli/commands/archive.js +29 -4
- package/dist/cli/commands/archive.js.map +1 -1
- package/dist/cli/commands/pause-capture.d.ts +24 -0
- package/dist/cli/commands/pause-capture.d.ts.map +1 -0
- package/dist/cli/commands/pause-capture.js +87 -0
- package/dist/cli/commands/pause-capture.js.map +1 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/ack/marker-ack.d.ts +28 -0
- package/dist/core/ack/marker-ack.d.ts.map +1 -0
- package/dist/core/ack/marker-ack.js +155 -0
- package/dist/core/ack/marker-ack.js.map +1 -0
- package/dist/core/ack-log.d.ts +17 -1
- package/dist/core/ack-log.d.ts.map +1 -1
- package/dist/core/ack-log.js +10 -7
- package/dist/core/ack-log.js.map +1 -1
- package/dist/core/archive/ack-log-consistency.d.ts.map +1 -1
- package/dist/core/archive/ack-log-consistency.js +2 -1
- package/dist/core/archive/ack-log-consistency.js.map +1 -1
- package/dist/core/archive/pause-decisions-fence.d.ts +24 -1
- package/dist/core/archive/pause-decisions-fence.d.ts.map +1 -1
- package/dist/core/archive/pause-decisions-fence.js +263 -49
- package/dist/core/archive/pause-decisions-fence.js.map +1 -1
- package/dist/core/markers/types.d.ts +7 -2
- package/dist/core/markers/types.d.ts.map +1 -1
- package/dist/core/parse/unified-diff.d.ts +26 -0
- package/dist/core/parse/unified-diff.d.ts.map +1 -0
- package/dist/core/parse/unified-diff.js +61 -0
- package/dist/core/parse/unified-diff.js.map +1 -0
- package/dist/core/templates/commands/ack-confirm.md +1 -1
- package/dist/core/templates/commands/apply.md +15 -6
- package/dist/core/templates/commands/verify.md +2 -0
- package/dist/core/templates/skills/_shared/tier23-command-bridge.md +34 -0
- package/dist/core/templates/skills/exploring.md +3 -3
- package/dist/core/templates/skills/finishing-a-development-branch.md +6 -21
- package/dist/core/templates/skills/requesting-code-review.md +11 -0
- package/dist/core/templates/skills/subagent-driven-development.md +9 -0
- package/dist/core/templates/skills/using-forge.md +6 -6
- package/dist/core/templates/skills/verification-before-completion.md +7 -18
- package/dist/core/templates/skills/writing-plans.md +6 -17
- package/dist/core/validate/marker-schema.d.ts.map +1 -1
- package/dist/core/validate/marker-schema.js +15 -0
- package/dist/core/validate/marker-schema.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/package.json +22 -19
- package/scripts/codex-review-helper.mjs +337 -0
- package/src/core/codex-review/prompts/adversarial-default.md +105 -0
package/dist/cli/index.js
CHANGED
|
@@ -18,6 +18,7 @@ import { buildPreflightCommand } from './commands/preflight.js';
|
|
|
18
18
|
import { buildStageExtensionsCommand } from './commands/stage-extensions.js';
|
|
19
19
|
import { buildBacklogCommand } from './commands/backlog.js';
|
|
20
20
|
import { buildMonitorCommand } from './commands/monitor.js';
|
|
21
|
+
import { buildPauseCaptureCommand } from './commands/pause-capture.js';
|
|
21
22
|
import { maybeRecordCliExit } from '../core/monitor/exit-handler.js';
|
|
22
23
|
// 创建主命令
|
|
23
24
|
const program = new Command();
|
|
@@ -57,6 +58,8 @@ program.addCommand(buildStageExtensionsCommand());
|
|
|
57
58
|
program.addCommand(buildBacklogCommand());
|
|
58
59
|
// 注册 monitor 子命令组(plan-workflow-monitor)
|
|
59
60
|
program.addCommand(buildMonitorCommand());
|
|
61
|
+
// 注册 pause-capture 子命令(plan pause-fence Block C — Fluid Pause 锚点捕获)
|
|
62
|
+
program.addCommand(buildPauseCaptureCommand());
|
|
60
63
|
// workflow-monitor:唯一的 CLI 侧埋点(spec §4)。config 守卫确保关闭时零行为。
|
|
61
64
|
process.on('exit', (code) => {
|
|
62
65
|
maybeRecordCliExit(process.cwd(), process.argv.slice(2), code);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface MarkerAckResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
/** 失败原因(marker/finding 缺失、severity 不合法、marker 写失败已自恢复 等),ok=false 时非空 */
|
|
4
|
+
reason?: string;
|
|
5
|
+
/** ok=true 时:写回 ack-log entry 应带的 finding_hash(ack-pause-warning 为 null) */
|
|
6
|
+
ackLogFindingHash: string | null;
|
|
7
|
+
/**
|
|
8
|
+
* ok=true 时:本次已写 marker 的 .bak 路径列表。供调用方:
|
|
9
|
+
* ack-log 操作失败 → 用 .bak restore 对应 marker(spec §5.1.4 rollback);
|
|
10
|
+
* 成功 → best-effort unlink .bak 清理。ok=false 时为 [](applyMarkerAck 内部已自恢复)。
|
|
11
|
+
*/
|
|
12
|
+
backups: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* applyMarkerAck — 按 action 定位 marker 并写 ack 字段。**永不抛错**:
|
|
16
|
+
* marker/finding 缺失、severity 不合法、marker 写失败 → 一律返回 { ok:false }
|
|
17
|
+
* (写失败时 writeMarkersAtomic 已自恢复所有 marker)。调用方据 ok=false → exit 2。
|
|
18
|
+
*/
|
|
19
|
+
export declare function applyMarkerAck(params: {
|
|
20
|
+
changeDir: string;
|
|
21
|
+
action: string;
|
|
22
|
+
findingId: string;
|
|
23
|
+
user: string;
|
|
24
|
+
ackedAt: string;
|
|
25
|
+
rationale: string | null;
|
|
26
|
+
targetSeverity: 'WARNING' | 'SUGGESTION' | null;
|
|
27
|
+
}): Promise<MarkerAckResult>;
|
|
28
|
+
//# sourceMappingURL=marker-ack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker-ack.d.ts","sourceRoot":"","sources":["../../../src/core/ack/marker-ack.ts"],"names":[],"mappings":"AA6DA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;;OAIG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,SAAS,GAAG,YAAY,GAAG,IAAI,CAAC;CACjD,GAAG,OAAO,CAAC,eAAe,CAAC,CAgH3B"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// marker-ack.ts: Task A2 — marker ack 字段写入 + 定位逻辑
|
|
2
|
+
// 按 action 类型定位对应 marker 文件,写入 severity_acked_by/at 等 ack 字段
|
|
3
|
+
// 采用原子写 + 备份回滚机制,保证 marker 一致性
|
|
4
|
+
import { readFile, writeFile, rename, copyFile } from 'node:fs/promises';
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
8
|
+
import { extractHashPayload, computeFindingHash } from '../validate/finding-hash.js';
|
|
9
|
+
/** 原子写单文件:先写 tmp 再 rename,避免写到一半崩溃留下半文件 */
|
|
10
|
+
async function atomicWriteYaml(filePath, obj) {
|
|
11
|
+
const tmp = `${filePath}.tmp`;
|
|
12
|
+
await writeFile(tmp, stringifyYaml(obj), 'utf8');
|
|
13
|
+
await rename(tmp, filePath);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* writeMarkersAtomic — 备份并原子写一组 marker;**任一写失败 → 恢复所有已写的、抛错**。
|
|
17
|
+
* 这是 A3 双 marker 自回滚的核心:写第 2 个 marker 失败时第 1 个会被恢复。
|
|
18
|
+
* 返回 .bak 路径列表(与 writes 顺序对齐)。
|
|
19
|
+
*/
|
|
20
|
+
async function writeMarkersAtomic(writes) {
|
|
21
|
+
// 先为每个 marker 建备份
|
|
22
|
+
const backups = writes.map((w) => `${w.path}.bak`);
|
|
23
|
+
for (let i = 0; i < writes.length; i++)
|
|
24
|
+
await copyFile(writes[i].path, backups[i]);
|
|
25
|
+
const written = [];
|
|
26
|
+
try {
|
|
27
|
+
for (let i = 0; i < writes.length; i++) {
|
|
28
|
+
await atomicWriteYaml(writes[i].path, writes[i].content);
|
|
29
|
+
written.push(i);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
// 尽力恢复所有已写 marker;收集恢复失败,不让单个失败中断其余恢复
|
|
34
|
+
const restoreErrors = [];
|
|
35
|
+
for (const i of written) {
|
|
36
|
+
try {
|
|
37
|
+
await copyFile(backups[i], writes[i].path);
|
|
38
|
+
}
|
|
39
|
+
catch (re) {
|
|
40
|
+
restoreErrors.push(`${writes[i].path}: ${re instanceof Error ? re.message : String(re)}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (restoreErrors.length > 0) {
|
|
44
|
+
throw new Error(`marker 写失败且 rollback incomplete —— 未恢复: ${restoreErrors.join('; ')}` +
|
|
45
|
+
`;原错误: ${e instanceof Error ? e.message : String(e)}`);
|
|
46
|
+
}
|
|
47
|
+
throw e;
|
|
48
|
+
}
|
|
49
|
+
return backups;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* applyMarkerAck — 按 action 定位 marker 并写 ack 字段。**永不抛错**:
|
|
53
|
+
* marker/finding 缺失、severity 不合法、marker 写失败 → 一律返回 { ok:false }
|
|
54
|
+
* (写失败时 writeMarkersAtomic 已自恢复所有 marker)。调用方据 ok=false → exit 2。
|
|
55
|
+
*/
|
|
56
|
+
export async function applyMarkerAck(params) {
|
|
57
|
+
const { changeDir, action, findingId, user, ackedAt } = params;
|
|
58
|
+
const verifyPath = join(changeDir, '.verify-passed');
|
|
59
|
+
const reviewPath = join(changeDir, '.review-passed');
|
|
60
|
+
// 统一的失败构造器
|
|
61
|
+
const FAIL = (reason) => ({
|
|
62
|
+
ok: false,
|
|
63
|
+
reason,
|
|
64
|
+
ackLogFindingHash: null,
|
|
65
|
+
backups: [],
|
|
66
|
+
});
|
|
67
|
+
try {
|
|
68
|
+
if (action === 'ack-warning') {
|
|
69
|
+
// 定位 .verify-passed marker 中的 finding,写 severity_acked_by/at
|
|
70
|
+
if (!existsSync(verifyPath))
|
|
71
|
+
return FAIL('.verify-passed 不存在');
|
|
72
|
+
const marker = parseYaml(await readFile(verifyPath, 'utf8'));
|
|
73
|
+
const findings = marker.verify_findings ?? [];
|
|
74
|
+
const f = findings.find((x) => String(x.id) === findingId);
|
|
75
|
+
if (!f)
|
|
76
|
+
return FAIL(`verify_findings 无 id=${findingId}`);
|
|
77
|
+
// 写入 ack 字段
|
|
78
|
+
f.severity_acked_by = user;
|
|
79
|
+
f.severity_acked_at = ackedAt;
|
|
80
|
+
// 原子写,备份用于 A5 事务回滚
|
|
81
|
+
const backups = await writeMarkersAtomic([{ path: verifyPath, content: marker }]);
|
|
82
|
+
// 计算 finding_hash 并返回(ack-warning 不修改 8 字段 payload,hash 不变)
|
|
83
|
+
return {
|
|
84
|
+
ok: true,
|
|
85
|
+
ackLogFindingHash: computeFindingHash(extractHashPayload(f)),
|
|
86
|
+
backups,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (action === 'ack-pause-warning') {
|
|
90
|
+
// §5.1.3 步骤 4-5:同步写 .verify-passed 与 .review-passed 的 pause_decisions ack 字段
|
|
91
|
+
// 1. 先全量校验两个 marker 都存在且都含该 pause decision,fail-closed:任一不满足 → 不写任何 marker
|
|
92
|
+
if (!existsSync(verifyPath))
|
|
93
|
+
return FAIL('.verify-passed 不存在');
|
|
94
|
+
if (!existsSync(reviewPath))
|
|
95
|
+
return FAIL('.review-passed 不存在');
|
|
96
|
+
// 剥 "pause_decisions:" 前缀得到数字 id 字符串
|
|
97
|
+
const pdIdStr = findingId.replace(/^pause_decisions:/, '');
|
|
98
|
+
const verifyMarker = parseYaml(await readFile(verifyPath, 'utf8'));
|
|
99
|
+
const reviewMarker = parseYaml(await readFile(reviewPath, 'utf8'));
|
|
100
|
+
const verifyPds = verifyMarker.pause_decisions ?? [];
|
|
101
|
+
const reviewPds = reviewMarker.pause_decisions ?? [];
|
|
102
|
+
const verifyPd = verifyPds.find((pd) => String(pd['id']) === pdIdStr);
|
|
103
|
+
if (!verifyPd)
|
|
104
|
+
return FAIL(`.verify-passed pause_decisions 无 id=${pdIdStr}`);
|
|
105
|
+
const reviewPd = reviewPds.find((pd) => String(pd['id']) === pdIdStr);
|
|
106
|
+
if (!reviewPd)
|
|
107
|
+
return FAIL(`.review-passed pause_decisions 无 id=${pdIdStr}`);
|
|
108
|
+
// 2. 两个 marker 都校验通过 → 写入同一 ack 值(保证一致性)
|
|
109
|
+
verifyPd['severity_acked_by'] = user;
|
|
110
|
+
verifyPd['severity_acked_at'] = ackedAt;
|
|
111
|
+
reviewPd['severity_acked_by'] = user;
|
|
112
|
+
reviewPd['severity_acked_at'] = ackedAt;
|
|
113
|
+
// 3. 双 marker 原子写:第二个写失败时 writeMarkersAtomic 自动恢复第一个并抛错
|
|
114
|
+
const backups = await writeMarkersAtomic([
|
|
115
|
+
{ path: verifyPath, content: verifyMarker },
|
|
116
|
+
{ path: reviewPath, content: reviewMarker },
|
|
117
|
+
]);
|
|
118
|
+
// 4. pause decision 无 FindingHashPayload,ackLogFindingHash 为 null
|
|
119
|
+
return { ok: true, ackLogFindingHash: null, backups };
|
|
120
|
+
}
|
|
121
|
+
if (action === 'downgrade') {
|
|
122
|
+
// §5.1 downgrade 行:仅允许 WARNING → SUGGESTION,CRITICAL/SUGGESTION 均拒绝
|
|
123
|
+
if (!existsSync(verifyPath))
|
|
124
|
+
return FAIL('.verify-passed 不存在');
|
|
125
|
+
const marker = parseYaml(await readFile(verifyPath, 'utf8'));
|
|
126
|
+
const findings = marker.verify_findings ?? [];
|
|
127
|
+
const f = findings.find((x) => String(x.id) === findingId);
|
|
128
|
+
if (!f)
|
|
129
|
+
return FAIL(`verify_findings 无 id=${findingId}`);
|
|
130
|
+
// severity 校验:仅 WARNING 允许 downgrade;CRITICAL 无 ack 路径,SUGGESTION 无需降级
|
|
131
|
+
if (f.severity !== 'WARNING') {
|
|
132
|
+
return FAIL(`downgrade 仅允许 WARNING → SUGGESTION,当前 severity=${String(f.severity)} 不支持`);
|
|
133
|
+
}
|
|
134
|
+
// 固定写 'WARNING'(spec 语义:downgraded_from 记录降级前的原始级别)
|
|
135
|
+
f.downgraded_from = 'WARNING';
|
|
136
|
+
// 先改 severity,再重算 hash(使 hash 反映新 severity=SUGGESTION)
|
|
137
|
+
f.severity = 'SUGGESTION';
|
|
138
|
+
f.downgrade_acked_by = params.user;
|
|
139
|
+
f.downgrade_rationale = params.rationale;
|
|
140
|
+
// 重算 finding_hash:此时 f.severity 已是 SUGGESTION
|
|
141
|
+
const newHash = computeFindingHash(extractHashPayload(f));
|
|
142
|
+
f.finding_hash = newHash;
|
|
143
|
+
// 原子写 .verify-passed,备份供 A5 事务回滚
|
|
144
|
+
const backups = await writeMarkersAtomic([{ path: verifyPath, content: marker }]);
|
|
145
|
+
return { ok: true, ackLogFindingHash: newHash, backups };
|
|
146
|
+
}
|
|
147
|
+
// 其余 action:不写 marker,finding_hash 为 null
|
|
148
|
+
return { ok: true, ackLogFindingHash: null, backups: [] };
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
// marker 写失败 → writeMarkersAtomic 已自恢复所有已写 marker;此处转 ok:false
|
|
152
|
+
return FAIL(`marker 写入失败(已回滚): ${e instanceof Error ? e.message : String(e)}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=marker-ack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker-ack.js","sourceRoot":"","sources":["../../../src/core/ack/marker-ack.ts"],"names":[],"mappings":"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"}
|
package/dist/core/ack-log.d.ts
CHANGED
|
@@ -37,8 +37,24 @@ export interface EvidenceHelperEntry {
|
|
|
37
37
|
prev_entry_hash?: string | null;
|
|
38
38
|
extra: Record<string, unknown>;
|
|
39
39
|
}
|
|
40
|
+
/** pause-capture 操作日志条目(kind='pause-capture') — plan pause-fence Block C
|
|
41
|
+
* Fluid Pause 触发时 `forge pause-capture` 写入,记录 pause 时刻 tasks.md 的全部 task id。
|
|
42
|
+
* 沿全 JSONL 链:prev_entry_hash 跨 kind 递推(同 AckEntry / EvidenceHelperEntry)。 */
|
|
43
|
+
export interface PauseCaptureEntry {
|
|
44
|
+
schema: 'forge-ack-log/v1';
|
|
45
|
+
kind: 'pause-capture';
|
|
46
|
+
timestamp: string;
|
|
47
|
+
capture_id: string;
|
|
48
|
+
change_id: string;
|
|
49
|
+
task_ref: string;
|
|
50
|
+
pause_issue_summary: string;
|
|
51
|
+
tasks_md_task_ids: string[];
|
|
52
|
+
git_head: string | null;
|
|
53
|
+
prev_entry_hash?: string | null;
|
|
54
|
+
extra: Record<string, unknown>;
|
|
55
|
+
}
|
|
40
56
|
/** ack 日志条目判别联合 */
|
|
41
|
-
export type AckLogEntry = AckEntry | EvidenceHelperEntry;
|
|
57
|
+
export type AckLogEntry = AckEntry | EvidenceHelperEntry | PauseCaptureEntry;
|
|
42
58
|
/** listPending 返回的单条记录 */
|
|
43
59
|
export interface PendingItem {
|
|
44
60
|
/** 文件绝对路径(plan §7 line 1000 spec 字段名 'path') */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ack-log.d.ts","sourceRoot":"","sources":["../../src/core/ack-log.ts"],"names":[],"mappings":"AAaA,6BAA6B;AAC7B,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,IAAI,EAAE,KAAK,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;IAC3C;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,IAAI,EAAE,iBAAiB,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,YAAY,GAAG,eAAe,GAAG,eAAe,GAAG,QAAQ,CAAC;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,mBAAmB;AACnB,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ack-log.d.ts","sourceRoot":"","sources":["../../src/core/ack-log.ts"],"names":[],"mappings":"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"}
|
package/dist/core/ack-log.js
CHANGED
|
@@ -10,10 +10,11 @@ import { canonicalHash } from './canonical-json.js'; // plan-9g Task 3:全 JSONL
|
|
|
10
10
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
11
11
|
/** pending-acks 目录相对于 changeRoot 的路径 */
|
|
12
12
|
const PENDING_DIR_REL = '.evidence/pending-acks';
|
|
13
|
-
/** 文件名正则:匹配 <findingId>-<safeTimestamp>.yaml */
|
|
14
|
-
// findingId
|
|
15
|
-
// safeTimestamp
|
|
16
|
-
|
|
13
|
+
/** 文件名正则:匹配 <encodeURIComponent(findingId)>-<safeTimestamp>.yaml */
|
|
14
|
+
// 文件名 <encodeURIComponent(findingId)>-<safeTimestamp>.yaml
|
|
15
|
+
// safeTimestamp = ISO 时间戳冒号替换连字符:YYYY-MM-DDTHH-MM-SS.mmmZ
|
|
16
|
+
// timestamp 段从右精确锚定 → group 1(findingId)即使含 '-' 也无切分歧义
|
|
17
|
+
const PENDING_FILE_RE = /^(.+)-(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}\.\d{3}Z)\.yaml$/;
|
|
17
18
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
18
19
|
// 公开 API
|
|
19
20
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
@@ -62,9 +63,10 @@ export async function appendAckLog(changeRoot, entry) {
|
|
|
62
63
|
* Windows 安全:ISO 时间戳中的 ':' 替换为 '-'(冒号在 Windows 文件名中非法)
|
|
63
64
|
*/
|
|
64
65
|
export function getPendingPath(changeRoot, findingId, timestamp) {
|
|
65
|
-
// 将 ISO 时间戳中的冒号替换为连字符,确保 Windows 文件系统兼容
|
|
66
66
|
const safeTimestamp = timestamp.replace(/:/g, '-');
|
|
67
|
-
|
|
67
|
+
// findingId 可能含 ':'(pause_decisions:<id>),encodeURIComponent 编码为 %3A;
|
|
68
|
+
// 纯数字 id 编码后不变 → 向后兼容
|
|
69
|
+
const fileName = `${encodeURIComponent(findingId)}-${safeTimestamp}.yaml`;
|
|
68
70
|
// path.join 在 Windows 上返回反斜杠;统一替换为正斜杠,使路径在跨平台测试中可靠匹配
|
|
69
71
|
// Windows 文件系统 API 同时接受正斜杠路径
|
|
70
72
|
return path.join(changeRoot, PENDING_DIR_REL, fileName).replace(/\\/g, '/');
|
|
@@ -99,7 +101,8 @@ export async function listPending(changeRoot, findingId) {
|
|
|
99
101
|
if (!match)
|
|
100
102
|
continue; // 跳过不符合命名规范的文件
|
|
101
103
|
// match[1] 和 match[2] 由正则捕获组保证存在,但 TypeScript 认为可能 undefined
|
|
102
|
-
|
|
104
|
+
// group 1 为 encodeURIComponent 编码后的 findingId,decodeURIComponent 还原原始值
|
|
105
|
+
const parsedFindingId = decodeURIComponent(match[1] ?? '');
|
|
103
106
|
const safeTimestamp = match[2] ?? '';
|
|
104
107
|
// 可选 findingId 过滤
|
|
105
108
|
if (findingId !== undefined && parsedFindingId !== findingId)
|
package/dist/core/ack-log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ack-log.js","sourceRoot":"","sources":["../../src/core/ack-log.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,4CAA4C;AAC5C,8CAA8C;AAE9C,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC,CAAC,mCAAmC;
|
|
1
|
+
{"version":3,"file":"ack-log.js","sourceRoot":"","sources":["../../src/core/ack-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ack-log-consistency.d.ts","sourceRoot":"","sources":["../../../src/core/archive/ack-log-consistency.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ack-log-consistency.d.ts","sourceRoot":"","sources":["../../../src/core/archive/ack-log-consistency.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,sBAAsB,CAAC;AAIvF;;;;;;;;;;;GAWG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAsL3B"}
|
|
@@ -57,6 +57,7 @@ export async function validateAckLogConsistency(changeDir, verifyMarker, changeI
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
// 2-4. ack-log.jsonl 解析 + marker ↔ ack-log 一致性
|
|
60
|
+
// ackEntries 类型为 AckEntry[],过滤后类型正确收窄,使下游访问 finding_id/action 等专属字段通过 typecheck
|
|
60
61
|
let ackEntries = [];
|
|
61
62
|
try {
|
|
62
63
|
const ackText = await readFile(ackLogPath, 'utf8');
|
|
@@ -64,7 +65,7 @@ export async function validateAckLogConsistency(changeDir, verifyMarker, changeI
|
|
|
64
65
|
.split('\n')
|
|
65
66
|
.filter((line) => line.trim())
|
|
66
67
|
.map((line) => JSON.parse(line))
|
|
67
|
-
.filter((e) => e.kind === 'ack'); //
|
|
68
|
+
.filter((e) => e.kind === 'ack'); // type guard:过滤后收窄为 AckEntry(沿 master §3.12.4)
|
|
68
69
|
}
|
|
69
70
|
catch (err) {
|
|
70
71
|
if (err.code !== 'ENOENT') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ack-log-consistency.js","sourceRoot":"","sources":["../../../src/core/archive/ack-log-consistency.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,qCAAqC;AACrC,uEAAuE;AAEvE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAErF,OAAO,EAAyB,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ack-log-consistency.js","sourceRoot":"","sources":["../../../src/core/archive/ack-log-consistency.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,36 @@
|
|
|
1
|
+
import type { PauseDecision } from '../markers/types.js';
|
|
1
2
|
import { type ValidationResult } from '../validate/types.js';
|
|
3
|
+
/** option=2 capture 链固化入参(由 archive 层从 verify marker 取出) */
|
|
4
|
+
export interface PauseFenceOptions {
|
|
5
|
+
verifyAckLogTailHash?: string | null;
|
|
6
|
+
verifyAckLogEntryCount?: number | null;
|
|
7
|
+
changeId?: string;
|
|
8
|
+
}
|
|
2
9
|
/**
|
|
3
10
|
* pause_decisions fence 五类业务校验(沿 design §2.1.5)
|
|
4
11
|
* @param marker — verify-passed / review-passed 等 marker 对象(Record 形)
|
|
5
12
|
* @param changeDir — change 目录绝对路径(需读 proposal.md / tasks.md / design.md)
|
|
13
|
+
* @param repoRoot — git 仓库根目录绝对路径(Task 5 用于 option=1 `git diff HEAD -- <changeDir>/proposal.md`)
|
|
14
|
+
* @param opts — option=2 capture 链固化入参(Task 11;archive 层从 verify marker 取出)
|
|
6
15
|
* @param file — 可选错误报告用 marker 文件路径
|
|
7
16
|
*
|
|
8
17
|
* v4 codex NEW-MAJOR A6 + B4 联动修订:fence 不再需要 ctx 参数(v3 加 ctx 是为给
|
|
9
18
|
* `validateScopeEntries` 算 finding_hash;但 v4 NEW-MAJOR B4 改用 `parseMarkdown` 局部段
|
|
10
19
|
* 校验后,fence 内部不再调 validateScopeEntries,ctx 自然 unused → 沿 YAGNI 移除)
|
|
20
|
+
* Task 11:加 opts 参数(option=2 capture 链固化值),file 移至第 5 位
|
|
11
21
|
*/
|
|
12
|
-
export declare function validatePauseDecisionsFence(marker: Record<string, unknown>, changeDir: string, file?: string): Promise<ValidationResult>;
|
|
22
|
+
export declare function validatePauseDecisionsFence(marker: Record<string, unknown>, changeDir: string, repoRoot: string, opts?: PauseFenceOptions, file?: string): Promise<ValidationResult>;
|
|
23
|
+
/**
|
|
24
|
+
* verify/review 双 marker pause_decisions cross-check(design §6.5)。
|
|
25
|
+
* 对两侧 id 相同的 pause_decision,逐字段比对;单侧独有 id 不拒签。
|
|
26
|
+
*
|
|
27
|
+
* 前置假设:各 marker 内 pause_decision 的 id 唯一(design §2.1.5 schema 约定)。
|
|
28
|
+
* 若同侧出现重复 id,reviewById Map 后者覆盖前者 —— 该场景属 marker 数据异常,
|
|
29
|
+
* 不在本函数防御范围(整 marker 镜像 / id 唯一性校验是 design §12 非目标)。
|
|
30
|
+
*
|
|
31
|
+
* @param verifyDecisions — verify marker 的 pause_decisions 数组
|
|
32
|
+
* @param reviewDecisions — review marker 的 pause_decisions 数组
|
|
33
|
+
* @param file — 可选错误报告用 marker 文件路径
|
|
34
|
+
*/
|
|
35
|
+
export declare function crossCheckPauseDecisions(verifyDecisions: PauseDecision[], reviewDecisions: PauseDecision[], file?: string): ValidationResult;
|
|
13
36
|
//# sourceMappingURL=pause-decisions-fence.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pause-decisions-fence.d.ts","sourceRoot":"","sources":["../../../src/core/archive/pause-decisions-fence.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pause-decisions-fence.d.ts","sourceRoot":"","sources":["../../../src/core/archive/pause-decisions-fence.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,sBAAsB,CAAC;AAcvF,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IAGhC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,iBAAsB,EAC5B,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,CAAC,CAyH3B;AAgPD;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,aAAa,EAAE,EAChC,eAAe,EAAE,aAAa,EAAE,EAChC,IAAI,CAAC,EAAE,MAAM,GACZ,gBAAgB,CA4BlB"}
|