@accelerator-mzq/forge 3.1.1 → 4.0.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/dist/cli/commands/archive.d.ts +32 -33
- package/dist/cli/commands/archive.d.ts.map +1 -1
- package/dist/cli/commands/archive.js +339 -667
- package/dist/cli/commands/archive.js.map +1 -1
- package/dist/cli/commands/legacy-bridge.js +1 -1
- package/dist/cli/commands/legacy-bridge.js.map +1 -1
- package/dist/cli/commands/upgrade.d.ts.map +1 -1
- package/dist/cli/commands/upgrade.js +2 -51
- package/dist/cli/commands/upgrade.js.map +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +4 -25
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/index.js +0 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/core/archive/index.d.ts +2 -3
- package/dist/core/archive/index.d.ts.map +1 -1
- package/dist/core/archive/index.js +7 -5
- package/dist/core/archive/index.js.map +1 -1
- package/dist/core/archive/summary-builder.d.ts +26 -21
- package/dist/core/archive/summary-builder.d.ts.map +1 -1
- package/dist/core/archive/summary-builder.js +115 -223
- package/dist/core/archive/summary-builder.js.map +1 -1
- package/dist/core/archive/summary-render.d.ts +5 -3
- package/dist/core/archive/summary-render.d.ts.map +1 -1
- package/dist/core/archive/summary-render.js +38 -44
- package/dist/core/archive/summary-render.js.map +1 -1
- package/dist/core/lock.d.ts +46 -0
- package/dist/core/lock.d.ts.map +1 -0
- package/dist/core/lock.js +98 -0
- package/dist/core/lock.js.map +1 -0
- package/dist/core/markers/types.d.ts +27 -134
- package/dist/core/markers/types.d.ts.map +1 -1
- package/dist/core/markers/types.js +10 -1
- package/dist/core/markers/types.js.map +1 -1
- package/dist/core/migrate/index.js +1 -1
- package/dist/core/migrate/index.js.map +1 -1
- package/dist/core/monitor/artifact-observer.d.ts.map +1 -1
- package/dist/core/monitor/artifact-observer.js +28 -78
- package/dist/core/monitor/artifact-observer.js.map +1 -1
- package/dist/core/monitor/divergence-map.d.ts.map +1 -1
- package/dist/core/monitor/divergence-map.js +9 -7
- package/dist/core/monitor/divergence-map.js.map +1 -1
- package/dist/core/monitor/health-verdict.d.ts.map +1 -1
- package/dist/core/monitor/health-verdict.js +2 -1
- package/dist/core/monitor/health-verdict.js.map +1 -1
- package/dist/core/monitor/trace-store.d.ts +1 -1
- package/dist/core/monitor/trace-store.js +2 -2
- package/dist/core/monitor/trace-store.js.map +1 -1
- package/dist/core/monitor/types.d.ts +1 -1
- package/dist/core/monitor/types.d.ts.map +1 -1
- package/dist/core/monitor/types.js +0 -1
- package/dist/core/monitor/types.js.map +1 -1
- package/dist/core/schemas/archive-summary.d.ts +39 -109
- package/dist/core/schemas/archive-summary.d.ts.map +1 -1
- package/dist/core/schemas/archive-summary.js +15 -23
- package/dist/core/schemas/archive-summary.js.map +1 -1
- package/dist/core/templates/commands/apply.md +49 -112
- package/dist/core/templates/commands/archive.md +43 -160
- package/dist/core/templates/commands/review.md +49 -74
- package/dist/core/templates/commands/upgrade.md +21 -40
- package/dist/core/templates/commands/verify.md +43 -146
- package/dist/core/templates/skills/_shared/tier23-command-bridge.md +8 -8
- package/dist/core/templates/skills/receiving-code-review.md +14 -45
- package/dist/core/templates/skills/requesting-code-review.md +4 -4
- package/dist/core/templates/skills/subagent-driven-development.md +25 -30
- package/dist/core/templates/skills/subagent-driven-discipline.md +28 -28
- package/dist/core/templates/skills/using-forge.md +24 -23
- package/dist/core/templates/skills/verification-before-completion.md +4 -4
- package/dist/core/templates/skills/verifying-three-dimensions.md +93 -169
- package/dist/core/validate/archive-summary-schema.d.ts +1 -1
- package/dist/core/validate/archive-summary-schema.d.ts.map +1 -1
- package/dist/core/validate/archive-summary-schema.js +101 -125
- package/dist/core/validate/archive-summary-schema.js.map +1 -1
- package/dist/core/validate/index.d.ts +0 -1
- package/dist/core/validate/index.d.ts.map +1 -1
- package/dist/core/validate/index.js +2 -1
- package/dist/core/validate/index.js.map +1 -1
- package/dist/core/validate/marker-schema.d.ts +12 -4
- package/dist/core/validate/marker-schema.d.ts.map +1 -1
- package/dist/core/validate/marker-schema.js +98 -605
- package/dist/core/validate/marker-schema.js.map +1 -1
- package/package.json +18 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/archive/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/archive/index.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,4EAA4E;AAC5E,sEAAsE;AACtE,mDAAmD;AAEnD,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
@@ -1,28 +1,33 @@
|
|
|
1
|
+
import type { SpecDelta } from '../specs-sync/index.js';
|
|
1
2
|
import type { ArchiveSummary } from '../schemas/archive-summary.js';
|
|
2
|
-
import type { FenceCheckResult } from './fence.js';
|
|
3
|
-
/** 选项:archive 时刻(测试可注入,生产用 new Date()) */
|
|
4
|
-
export interface BuildArchiveSummaryOptions {
|
|
5
|
-
/** archived_at 时刻(沿 archive transaction 调用方计算,默认 new Date().toISOString()) */
|
|
6
|
-
archivedAt?: string;
|
|
7
|
-
}
|
|
8
3
|
/**
|
|
9
|
-
*
|
|
4
|
+
* buildArchiveSummary 入参 — v4 sig 改造(plan §10.1.2 Task 1.6)
|
|
10
5
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
6
|
+
* - archivePath:归档后的目标目录绝对路径(forge/changes/archive/<archiveName>/);
|
|
7
|
+
* buildArchiveSummary 从此处读 proposal.md / design.md 抽 scope_entries handoff
|
|
8
|
+
* - changeId:change id 字符串
|
|
9
|
+
* - verifyMarker / reviewMarker:v2 marker 解析后对象
|
|
10
|
+
* - deltas:archive 主流程 readDeltas + applyDeltas 实际应用的 SpecDelta 数组
|
|
11
|
+
* - archivedAt:可选时间戳(测试注入用,生产默认 new Date().toISOString())
|
|
17
12
|
*/
|
|
18
|
-
export
|
|
13
|
+
export interface BuildArchiveSummaryInput {
|
|
14
|
+
archivePath: string;
|
|
15
|
+
changeId: string;
|
|
16
|
+
verifyMarker: Record<string, unknown>;
|
|
17
|
+
reviewMarker: Record<string, unknown>;
|
|
18
|
+
deltas: SpecDelta[];
|
|
19
|
+
archivedAt?: string;
|
|
20
|
+
}
|
|
19
21
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
+
* buildArchiveSummary v4 — 构造极简 ArchiveSummary v2 对象
|
|
23
|
+
*
|
|
24
|
+
* 沿 plan §6.4 + §10.1.2 v7:
|
|
25
|
+
* - schema:forge-archive-summary/v2
|
|
26
|
+
* - spec_updates_applied:从 deltas 1:1 映射 capability + operation
|
|
27
|
+
* - handoff_to_backlog 两来源:
|
|
28
|
+
* 1) verify/review marker.pause_decisions[] chosen_option=3(转 out-of-scope)
|
|
29
|
+
* 2) proposal.md + design.md `## Out of Scope` / `## Future Work` YAML 块 active entry
|
|
30
|
+
* - 不再生成 acked_warnings / pending_suggestions / process_evidence_summary / verified_invariants
|
|
22
31
|
*/
|
|
23
|
-
export declare
|
|
24
|
-
readonly artifactName: string;
|
|
25
|
-
readonly anchorId: string;
|
|
26
|
-
constructor(message: string, artifactName: string, anchorId: string);
|
|
27
|
-
}
|
|
32
|
+
export declare function buildArchiveSummary(input: BuildArchiveSummaryInput): Promise<ArchiveSummary>;
|
|
28
33
|
//# sourceMappingURL=summary-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary-builder.d.ts","sourceRoot":"","sources":["../../../src/core/archive/summary-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"summary-builder.d.ts","sourceRoot":"","sources":["../../../src/core/archive/summary-builder.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,+BAA+B,CAAC;AAMlF;;;;;;;;;GASG;AACH,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,cAAc,CAAC,CA8BzB"}
|
|
@@ -1,287 +1,179 @@
|
|
|
1
|
-
// src/core/archive/summary-builder.ts — plan-
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
1
|
+
// src/core/archive/summary-builder.ts — v4 OpenSpec alignment 简版(plan-v4 Phase 1 Task 1.6)
|
|
2
|
+
//
|
|
3
|
+
// v4 BREAKING change(沿 plan-v4 §6.4 + §10.1.2):
|
|
4
|
+
// - signature 改为 `buildArchiveSummary({ archivePath, changeId, verifyMarker, reviewMarker, deltas })`
|
|
5
|
+
// - 输出 ArchiveSummary v2:仅 schema/version/archived_at/change_id/archive_name/verified_by/
|
|
6
|
+
// reviewed_by/applied_commits/spec_updates_applied/handoff_to_backlog 字段
|
|
7
|
+
// - 删 collectAckedWarnings / collectPendingSuggestions / buildVerifiedInvariants /
|
|
8
|
+
// buildProcessEvidenceSummary / mergePauseDecisions(反加固阵列消亡)
|
|
9
|
+
// - handoff_to_backlog 仅两来源:pause_decisions chosen_option=3 + scope_entries 三段 YAML 块
|
|
10
|
+
// - spec_updates_applied 字段从 forge applyDeltas 实际 SpecDelta[] 转换,operation 沿 create/replace/delete
|
|
7
11
|
import { readFile } from 'node:fs/promises';
|
|
8
12
|
import { existsSync } from 'node:fs';
|
|
9
|
-
import { join } from 'node:path';
|
|
13
|
+
import { basename, join } from 'node:path';
|
|
10
14
|
import { ARCHIVE_SUMMARY_VERSION } from '../schemas/archive-summary.js';
|
|
11
15
|
import { parseMarkdown } from '../parse/markdown.js';
|
|
12
16
|
import { parseFencedYamlBlocks } from '../parse/fenced-yaml.js';
|
|
13
17
|
import { SCOPE_ANCHOR_IDS } from '../schemas/scope-entries.js';
|
|
14
18
|
/**
|
|
15
|
-
*
|
|
19
|
+
* buildArchiveSummary v4 — 构造极简 ArchiveSummary v2 对象
|
|
16
20
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
21
|
+
* 沿 plan §6.4 + §10.1.2 v7:
|
|
22
|
+
* - schema:forge-archive-summary/v2
|
|
23
|
+
* - spec_updates_applied:从 deltas 1:1 映射 capability + operation
|
|
24
|
+
* - handoff_to_backlog 两来源:
|
|
25
|
+
* 1) verify/review marker.pause_decisions[] chosen_option=3(转 out-of-scope)
|
|
26
|
+
* 2) proposal.md + design.md `## Out of Scope` / `## Future Work` YAML 块 active entry
|
|
27
|
+
* - 不再生成 acked_warnings / pending_suggestions / process_evidence_summary / verified_invariants
|
|
23
28
|
*/
|
|
24
|
-
export async function buildArchiveSummary(
|
|
25
|
-
const archivedAt =
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
// review marker 也可能携带 pause_decisions(沿 9c superset additive 镜像)
|
|
33
|
-
const reviewPauseDecisions = Array.isArray(reviewMarker.pause_decisions)
|
|
34
|
-
? reviewMarker.pause_decisions
|
|
35
|
-
: [];
|
|
36
|
-
const reviewOutcomes = Array.isArray(reviewMarker.review_outcomes)
|
|
37
|
-
? reviewMarker.review_outcomes
|
|
38
|
-
: [];
|
|
39
|
-
const acked_warnings = collectAckedWarnings(verifyFindings, reviewOutcomes);
|
|
40
|
-
const pending_suggestions = collectPendingSuggestions(verifyFindings, reviewOutcomes);
|
|
41
|
-
// 合并 verify + review 的 pause_decisions(去重以 id 为 key,review 镜像优先级低)
|
|
42
|
-
const allPauseDecisions = mergePauseDecisions(pauseDecisions, reviewPauseDecisions);
|
|
29
|
+
export async function buildArchiveSummary(input) {
|
|
30
|
+
const archivedAt = input.archivedAt ?? toIso8601(new Date());
|
|
31
|
+
// —— spec_updates_applied:从 SpecDelta 直接映射(name → capability,operation 沿 create/replace/delete)——
|
|
32
|
+
const spec_updates_applied = input.deltas.map((d) => ({
|
|
33
|
+
capability: d.name,
|
|
34
|
+
operation: d.operation,
|
|
35
|
+
}));
|
|
36
|
+
// —— handoff_to_backlog:pause_decisions option=3 + scope_entries active(两来源 union)——
|
|
43
37
|
const handoff_to_backlog = [
|
|
44
|
-
|
|
45
|
-
...
|
|
46
|
-
source: s.source,
|
|
47
|
-
id: s.id,
|
|
48
|
-
severity: 'SUGGESTION',
|
|
49
|
-
dimension: s.dimension,
|
|
50
|
-
check_type: s.check_type,
|
|
51
|
-
evidence: s.evidence,
|
|
52
|
-
recommendation: s.recommendation,
|
|
53
|
-
})),
|
|
54
|
-
// 第 2 类:pause_decisions chosen_option=3
|
|
55
|
-
...allPauseDecisions
|
|
56
|
-
.filter((p) => p.chosen_option === 3)
|
|
57
|
-
.map((p) => ({
|
|
58
|
-
source: 'pause_decisions',
|
|
59
|
-
id: p.id,
|
|
60
|
-
severity: p.severity,
|
|
61
|
-
chosen_option: 3,
|
|
62
|
-
target_artifact: p.target_artifact,
|
|
63
|
-
target_anchor: p.target_anchor,
|
|
64
|
-
issue_summary: p.issue_summary,
|
|
65
|
-
})),
|
|
66
|
-
// 第 3 类:proposal/design scope-entries Out-of-Scope/Future-Work YAML 块的 active entry
|
|
67
|
-
...(await collectScopeEntriesHandoff(changeDir)),
|
|
38
|
+
...collectPauseDecisionHandoff(input.verifyMarker, input.reviewMarker),
|
|
39
|
+
...(await collectScopeEntriesHandoff(input.archivePath)),
|
|
68
40
|
];
|
|
41
|
+
// —— verified_by / reviewed_by 直读 marker(v2 schema 已校验为非空字符串)——
|
|
42
|
+
const verified_by = String(input.verifyMarker.verified_by ?? 'unknown');
|
|
43
|
+
const reviewed_by = String(input.reviewMarker.reviewed_by ?? 'unknown');
|
|
69
44
|
return {
|
|
70
|
-
schema: 'forge-archive-summary/
|
|
45
|
+
schema: 'forge-archive-summary/v2',
|
|
71
46
|
version: ARCHIVE_SUMMARY_VERSION,
|
|
72
47
|
archived_at: archivedAt,
|
|
73
|
-
change_id: changeId,
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
reviewers: [String(reviewMarker.reviewed_by ?? 'unknown')],
|
|
79
|
-
},
|
|
80
|
-
process_evidence_summary: buildProcessEvidenceSummary(fenceResult),
|
|
48
|
+
change_id: input.changeId,
|
|
49
|
+
archive_name: basename(input.archivePath),
|
|
50
|
+
verified_by,
|
|
51
|
+
reviewed_by,
|
|
52
|
+
spec_updates_applied,
|
|
81
53
|
handoff_to_backlog,
|
|
82
|
-
acked_warnings,
|
|
83
|
-
pending_suggestions,
|
|
84
54
|
};
|
|
85
55
|
}
|
|
86
|
-
/**
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
// review_outcomes WARNING 全名 + acked(v3 BLOCKER 4:resign 后或 v1.0 native 写入)
|
|
107
|
-
for (let i = 0; i < outcomes.length; i++) {
|
|
108
|
-
const o = outcomes[i];
|
|
109
|
-
// C 简码由 fence 拒签,不进 builder(沿 plan-9e1 v3 BLOCKER 3)
|
|
110
|
-
// S 简码 / CRITICAL 全名由 fence 拒签,不进 builder
|
|
111
|
-
// 仅 WARNING 全名 + accepted=true + rationale 非空(v0.4 review_outcomes 端的 "acked" 等价路径)
|
|
112
|
-
if (o.severity === 'WARNING' &&
|
|
113
|
-
o.resolved === false &&
|
|
114
|
-
o.accepted === true &&
|
|
115
|
-
typeof o.rationale === 'string' &&
|
|
116
|
-
o.rationale.length > 0) {
|
|
117
|
-
refs.push({
|
|
118
|
-
source: 'review_outcomes',
|
|
119
|
-
id: i,
|
|
120
|
-
acked_by: 'review-accepted',
|
|
121
|
-
acked_at: '', // review_outcomes 端无 user 字段,沿 plan-9e1 v1 collector1 review-accepted 标记
|
|
122
|
-
rationale: o.rationale,
|
|
123
|
-
});
|
|
124
|
-
}
|
|
56
|
+
/**
|
|
57
|
+
* collectPauseDecisionHandoff:从 verify + review marker 抽 pause_decisions chosen_option=3
|
|
58
|
+
*
|
|
59
|
+
* v4 PauseDecisionSimple 仅 5 字段(paused_at / task_ref / issue_summary / chosen_option / notes),
|
|
60
|
+
* 不再有 v1 的 target_artifact / target_anchor / severity 等反加固字段。
|
|
61
|
+
* verify + review 两侧 pause_decisions 合并去重(以 (task_ref, paused_at) 复合 key)。
|
|
62
|
+
*/
|
|
63
|
+
function collectPauseDecisionHandoff(verifyMarker, reviewMarker) {
|
|
64
|
+
const all = mergePauseDecisions(extractPauseDecisions(verifyMarker), extractPauseDecisions(reviewMarker));
|
|
65
|
+
const entries = [];
|
|
66
|
+
for (let i = 0; i < all.length; i++) {
|
|
67
|
+
const p = all[i];
|
|
68
|
+
if (!p || p.chosen_option !== 3)
|
|
69
|
+
continue;
|
|
70
|
+
entries.push({
|
|
71
|
+
source: 'pause_decisions',
|
|
72
|
+
id: i, // 数字索引(沿 v4 简化 — 不再有 capture_id 链)
|
|
73
|
+
chosen_option: 3,
|
|
74
|
+
issue_summary: p.issue_summary,
|
|
75
|
+
});
|
|
125
76
|
}
|
|
126
|
-
return
|
|
77
|
+
return entries;
|
|
127
78
|
}
|
|
128
|
-
/**
|
|
129
|
-
function
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if (f.severity === 'SUGGESTION' && f.resolved === false) {
|
|
134
|
-
refs.push({
|
|
135
|
-
source: 'verify_findings',
|
|
136
|
-
id: f.id,
|
|
137
|
-
dimension: f.dimension,
|
|
138
|
-
check_type: f.check_type,
|
|
139
|
-
evidence: f.evidence,
|
|
140
|
-
recommendation: f.recommendation,
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
// review_outcomes L 简码 + SUGGESTION 全名双格式映射(v3 BLOCKER 4 新增)
|
|
145
|
-
for (let i = 0; i < outcomes.length; i++) {
|
|
146
|
-
const o = outcomes[i];
|
|
147
|
-
if ((o.severity === 'L' || o.severity === 'SUGGESTION') && o.resolved === false) {
|
|
148
|
-
refs.push({
|
|
149
|
-
source: 'review_outcomes',
|
|
150
|
-
id: i,
|
|
151
|
-
recommendation: o.rationale,
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
return refs;
|
|
79
|
+
/** 从 marker 安全抽 pause_decisions 数组(非数组返空) */
|
|
80
|
+
function extractPauseDecisions(marker) {
|
|
81
|
+
return Array.isArray(marker.pause_decisions)
|
|
82
|
+
? marker.pause_decisions
|
|
83
|
+
: [];
|
|
156
84
|
}
|
|
157
85
|
/**
|
|
158
|
-
*
|
|
159
|
-
*
|
|
86
|
+
* 合并 verify + review 两侧 pause_decisions
|
|
87
|
+
*
|
|
88
|
+
* 去重策略:以 (task_ref, paused_at) 复合 key 判等,verify 侧优先。
|
|
89
|
+
* v4 简化:不再有 capture_id 锚定,user 在 verify/review 阶段可能各写一次同一 pause,
|
|
90
|
+
* 合并避免 handoff 重复一项。
|
|
160
91
|
*/
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
92
|
+
function mergePauseDecisions(verifyPauses, reviewPauses) {
|
|
93
|
+
const keyOf = (p) => `${p.task_ref}@${p.paused_at}`;
|
|
94
|
+
const seen = new Set();
|
|
95
|
+
const out = [];
|
|
96
|
+
for (const p of verifyPauses) {
|
|
97
|
+
const k = keyOf(p);
|
|
98
|
+
if (seen.has(k))
|
|
99
|
+
continue;
|
|
100
|
+
seen.add(k);
|
|
101
|
+
out.push(p);
|
|
102
|
+
}
|
|
103
|
+
for (const p of reviewPauses) {
|
|
104
|
+
const k = keyOf(p);
|
|
105
|
+
if (seen.has(k))
|
|
106
|
+
continue;
|
|
107
|
+
seen.add(k);
|
|
108
|
+
out.push(p);
|
|
169
109
|
}
|
|
110
|
+
return out;
|
|
170
111
|
}
|
|
171
112
|
/**
|
|
172
|
-
*
|
|
173
|
-
*
|
|
113
|
+
* collectScopeEntriesHandoff:从 archive 后的 proposal.md + design.md 抽 scope-entries
|
|
114
|
+
*
|
|
115
|
+
* v4 简化:
|
|
116
|
+
* - 仅扫 forge-oos / forge-future-work 两段(forge-non-goals 是反目标,不做 handoff)
|
|
117
|
+
* - 仅取 status=active 的 entry(inherited/superseded/completed/obsolete 不进)
|
|
118
|
+
* - parse 失败 / schema 不匹配 → 静默跳过(v4 不再 throw fence error,沿 OpenSpec 风格)
|
|
119
|
+
* - changeDir 已归档到 archivePath,本函数从该路径读 proposal/design
|
|
174
120
|
*/
|
|
175
|
-
async function collectScopeEntriesHandoff(
|
|
121
|
+
async function collectScopeEntriesHandoff(archivePath) {
|
|
176
122
|
const entries = [];
|
|
177
123
|
for (const artifactName of ['proposal.md', 'design.md']) {
|
|
178
|
-
const artifactPath = join(
|
|
124
|
+
const artifactPath = join(archivePath, artifactName);
|
|
179
125
|
if (!existsSync(artifactPath))
|
|
180
126
|
continue;
|
|
181
|
-
|
|
127
|
+
let content;
|
|
128
|
+
try {
|
|
129
|
+
content = await readFile(artifactPath, 'utf8');
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
continue; // 读失败静默跳过(archive 已完成,handoff 是衍生产物)
|
|
133
|
+
}
|
|
182
134
|
const md = parseMarkdown(content);
|
|
183
135
|
for (const sec of md.sections) {
|
|
184
136
|
if (!sec.anchor || !SCOPE_ANCHOR_IDS.includes(sec.anchor))
|
|
185
137
|
continue;
|
|
186
|
-
// 仅取 forge-oos / forge-future-work(non-goals 不是 handoff 目标;non-goal 是"反目标",不需 backlog 追踪)
|
|
187
138
|
const anchorId = sec.anchor;
|
|
139
|
+
// 仅 oos / future-work 进 handoff;non-goals 不进
|
|
188
140
|
if (anchorId !== 'forge-oos' && anchorId !== 'forge-future-work')
|
|
189
141
|
continue;
|
|
190
142
|
let yamlBlocks;
|
|
191
143
|
try {
|
|
192
144
|
yamlBlocks = parseFencedYamlBlocks(sec.body);
|
|
193
145
|
}
|
|
194
|
-
catch
|
|
195
|
-
//
|
|
196
|
-
throw new ScopeEntriesIntegrityError(`scope-entries YAML parse failed in ${artifactName} section ${anchorId}: ${err.message}`, artifactName, anchorId);
|
|
146
|
+
catch {
|
|
147
|
+
continue; // v4 静默跳过(不再 throw ScopeEntriesIntegrityError)
|
|
197
148
|
}
|
|
198
149
|
if (yamlBlocks.length === 0)
|
|
199
|
-
continue;
|
|
150
|
+
continue;
|
|
200
151
|
const block = yamlBlocks[0];
|
|
201
|
-
if (block.schema !== 'forge-scope-entries/v1')
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
if (!Array.isArray(block.entries)) {
|
|
208
|
-
throw new ScopeEntriesIntegrityError(`scope-entries entries 非数组(${artifactName} section ${anchorId})`, artifactName, anchorId);
|
|
209
|
-
}
|
|
152
|
+
if (block.schema !== 'forge-scope-entries/v1')
|
|
153
|
+
continue;
|
|
154
|
+
if (block.anchor_id !== anchorId)
|
|
155
|
+
continue;
|
|
156
|
+
if (!Array.isArray(block.entries))
|
|
157
|
+
continue;
|
|
210
158
|
for (const e of block.entries) {
|
|
211
159
|
if (!e || typeof e !== 'object')
|
|
212
160
|
continue;
|
|
213
|
-
// 仅 status=active 进 handoff(inherited/superseded/completed/obsolete 不进)
|
|
214
161
|
if (e.status !== 'active')
|
|
215
162
|
continue;
|
|
216
163
|
entries.push({
|
|
217
164
|
source: 'scope_entries',
|
|
218
165
|
id: e.id,
|
|
219
|
-
severity: null,
|
|
220
166
|
category: e.category,
|
|
167
|
+
description: e.description,
|
|
221
168
|
reason: e.reason,
|
|
222
|
-
target_artifact: artifactName,
|
|
223
|
-
target_anchor: anchorId === 'forge-oos' ? '## Out of Scope' : '## Future Work',
|
|
224
169
|
});
|
|
225
170
|
}
|
|
226
171
|
}
|
|
227
172
|
}
|
|
228
173
|
return entries;
|
|
229
174
|
}
|
|
230
|
-
/**
|
|
231
|
-
function mergePauseDecisions(verifyPauses, reviewPauses) {
|
|
232
|
-
const byId = new Map();
|
|
233
|
-
for (const p of verifyPauses)
|
|
234
|
-
byId.set(p.id, p);
|
|
235
|
-
for (const p of reviewPauses) {
|
|
236
|
-
if (!byId.has(p.id))
|
|
237
|
-
byId.set(p.id, p);
|
|
238
|
-
}
|
|
239
|
-
return [...byId.values()];
|
|
240
|
-
}
|
|
241
|
-
/** 沿 design verified_invariants 至少含 hash-match + evidence-complete(9d 三维度 fence 已通过) */
|
|
242
|
-
function buildVerifiedInvariants(verifyMarker) {
|
|
243
|
-
const list = ['hash-match', 'evidence-complete'];
|
|
244
|
-
// 9d 三维度 fence 已通过 — 若 verify_findings 字段存在(老 marker 缺则跳),加上 verify-findings-fence
|
|
245
|
-
if (Array.isArray(verifyMarker.verify_findings)) {
|
|
246
|
-
list.push('verify-findings-fence');
|
|
247
|
-
}
|
|
248
|
-
if (Array.isArray(verifyMarker.pause_decisions)) {
|
|
249
|
-
list.push('pause-decisions-fence');
|
|
250
|
-
}
|
|
251
|
-
return list;
|
|
252
|
-
}
|
|
253
|
-
/** Date → 'YYYY-MM-DDTHH:MM:SSZ'(沿 marker-schema.ts:20 ISO 8601 UTC 格式) */
|
|
175
|
+
/** Date → 'YYYY-MM-DDTHH:MM:SSZ'(沿 marker-schema.ts ISO 8601 UTC 格式,无 ms) */
|
|
254
176
|
function toIso8601(d) {
|
|
255
177
|
return d.toISOString().replace(/\.\d{3}Z$/, 'Z');
|
|
256
178
|
}
|
|
257
|
-
/**
|
|
258
|
-
* buildProcessEvidenceSummary — fence 14 不变量统计折数为 ProcessEvidenceSummary
|
|
259
|
-
*
|
|
260
|
-
* plan-9e2 v2 codex 一轮 MAJOR 修订:4 字段计数
|
|
261
|
-
*
|
|
262
|
-
* 输出 4 计数:
|
|
263
|
-
* - invariants_passed: status='pass' 的数(真过校验)
|
|
264
|
-
* - invariants_with_warning: status='warning' 的数(WARNING 经 fail/legacy-skip 优先级筛选后保留)
|
|
265
|
-
* - invariants_failed: status='fail' 的数(v1.0 永远 = 0;fence.ok=false 时 archive 已 exit 1 不进本路径)
|
|
266
|
-
* - legacy_exempt: status='legacy-skip' 的数(沿 §3.4.4.1)
|
|
267
|
-
*
|
|
268
|
-
* 不变式:passed + warning + failed + exempt === FENCE_INVARIANT_NAMES.length
|
|
269
|
-
*
|
|
270
|
-
* 注:不在 builder 内 throw — 让 archive-summary-schema validator 单点把守不变式
|
|
271
|
-
* (避免双源校验路径分歧;沿 brainstorm spec §4.2 决策 #1)
|
|
272
|
-
*/
|
|
273
|
-
function buildProcessEvidenceSummary(fenceResult) {
|
|
274
|
-
// 按 status 4 态分类统计
|
|
275
|
-
const passed = fenceResult.results.filter((r) => r.status === 'pass').length;
|
|
276
|
-
const warning = fenceResult.results.filter((r) => r.status === 'warning').length;
|
|
277
|
-
const failed = fenceResult.results.filter((r) => r.status === 'fail').length;
|
|
278
|
-
const exempt = fenceResult.results.filter((r) => r.status === 'legacy-skip').length;
|
|
279
|
-
return {
|
|
280
|
-
placeholder: false,
|
|
281
|
-
invariants_passed: passed,
|
|
282
|
-
invariants_with_warning: warning,
|
|
283
|
-
invariants_failed: failed,
|
|
284
|
-
legacy_exempt: exempt,
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
179
|
//# sourceMappingURL=summary-builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary-builder.js","sourceRoot":"","sources":["../../../src/core/archive/summary-builder.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"summary-builder.js","sourceRoot":"","sources":["../../../src/core/archive/summary-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { ArchiveSummary } from '../schemas/archive-summary.js';
|
|
2
2
|
/**
|
|
3
|
-
* 渲染 archive 完成后的用户输出字符串
|
|
4
|
-
*
|
|
5
|
-
* @param
|
|
3
|
+
* 渲染 archive 完成后的用户输出字符串(v4 简版)
|
|
4
|
+
*
|
|
5
|
+
* @param summary ArchiveSummary v2 对象
|
|
6
|
+
* @param archiveDirName archive 子目录名(如 '2026-05-20-add-oauth-refresh');
|
|
7
|
+
* caller 已算出,本函数不重复算(避免与 summary.archive_name 同步偏移)
|
|
6
8
|
*/
|
|
7
9
|
export declare function renderArchiveSummaryOutput(summary: ArchiveSummary, archiveDirName: string): string;
|
|
8
10
|
//# sourceMappingURL=summary-render.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary-render.d.ts","sourceRoot":"","sources":["../../../src/core/archive/summary-render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"summary-render.d.ts","sourceRoot":"","sources":["../../../src/core/archive/summary-render.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,+BAA+B,CAAC;AAElF;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,GACrB,MAAM,CAmCR"}
|