spec-wave 2.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.
Files changed (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +327 -0
  3. package/README.zh-CN.md +327 -0
  4. package/RELEASING.md +52 -0
  5. package/assets/README.md +30 -0
  6. package/assets/ci/samples/README.md +76 -0
  7. package/assets/ci/samples/hgm-ingest.yml.example +42 -0
  8. package/assets/ci/samples/lint-wiki-delta.pin.yml.example +47 -0
  9. package/assets/ci/samples/lint-wiki-delta.yml.example +49 -0
  10. package/assets/ci/samples/pytest.yml.example +49 -0
  11. package/assets/ci/samples/quality.yml.example +56 -0
  12. package/assets/ci/samples/skills-validate.yml.example +38 -0
  13. package/assets/ci/samples/tech-graph.yml.example +55 -0
  14. package/assets/coding_wiki/templates/README.md +115 -0
  15. package/assets/coding_wiki/templates/_index.md +19 -0
  16. package/assets/coding_wiki/templates/context.md +18 -0
  17. package/assets/coding_wiki/templates/stable.md +26 -0
  18. package/assets/coding_wiki/templates/topics/wiki_layout.md +13 -0
  19. package/assets/coding_wiki/templates/topics/wikilinks_export.md +13 -0
  20. package/assets/coding_wiki/templates/volatile.md +25 -0
  21. package/assets/docs/POINTER_ONBOARDING.md +9 -0
  22. package/assets/docs/POINTER_RUNBOOK_wiki_delta.md +18 -0
  23. package/assets/docs/POINTER_SDD_HAT_FLOW.md +8 -0
  24. package/assets/docs/POINTER_USER_GUIDE.md +8 -0
  25. package/assets/graph/stubs/README.md +6 -0
  26. package/assets/graph/templates/00_main.graph.yaml +72 -0
  27. package/assets/graph/templates/00_main.md +85 -0
  28. package/assets/graph/templates/01_struct.md +38 -0
  29. package/assets/graph/templates/02_version.md +7 -0
  30. package/assets/graph/templates/10_flow_MAIN.graph.yaml +105 -0
  31. package/assets/graph/templates/10_flow_MAIN.md +103 -0
  32. package/assets/graph/templates/99_mermaid_protocol.md +156 -0
  33. package/assets/graph/templates/README.md +66 -0
  34. package/assets/harness/README.md +18 -0
  35. package/assets/harness/discipline-coverage.yaml +320 -0
  36. package/assets/harness/invokes/README.md +22 -0
  37. package/assets/harness/invokes/TEMPLATE_invoke.md +61 -0
  38. package/assets/harness/lifecycle.yaml +127 -0
  39. package/assets/harness/prompts/00-orchestrator.md +91 -0
  40. package/assets/harness/prompts/10-spec-requirements.md +63 -0
  41. package/assets/harness/prompts/10-task-requirements.md +70 -0
  42. package/assets/harness/prompts/20-spec-audit.md +50 -0
  43. package/assets/harness/prompts/20-task-audit.md +90 -0
  44. package/assets/harness/prompts/30-execute-code.md +64 -0
  45. package/assets/harness/prompts/40-self-check.md +65 -0
  46. package/assets/harness/prompts/FRAGMENT_00_delegate_only_v1_zh.md +19 -0
  47. package/assets/harness/prompts/FRAGMENT_30_gate_verify_v1_zh.md +34 -0
  48. package/assets/harness/prompts/FRAGMENT_30_invoke_block_v1_zh.md +28 -0
  49. package/assets/harness/prompts/FRAGMENT_hat_reanchor_v1_zh.md +19 -0
  50. package/assets/harness/prompts/README.md +67 -0
  51. package/assets/harness/prompts/TEMPLATE_30_gate_stop.md +36 -0
  52. package/assets/harness/templates/FRAGMENT_task_domain_infer_v1_zh.md +16 -0
  53. package/assets/harness/templates/ONTOLOGY_consumer_slice_v1.md +41 -0
  54. package/assets/harness/templates/QUICKREF_v1_zh.md +35 -0
  55. package/assets/harness/templates/README.md +50 -0
  56. package/assets/harness/templates/TASK_TEMPLATE.md +133 -0
  57. package/assets/harness/templates/TASK_done_README.md +76 -0
  58. package/assets/harness/templates/TASK_epic.md +103 -0
  59. package/assets/harness/templates/TASK_graph_bootstrap.md +115 -0
  60. package/assets/harness/templates/VIEW_done_by_domain.md +66 -0
  61. package/assets/harness/templates/VIEW_done_thin_pointer.md +16 -0
  62. package/assets/ide/adapters/AGENTS.md.fragment.example +33 -0
  63. package/assets/ide/adapters/CLAUDE.md.fragment.example +32 -0
  64. package/assets/ide/adapters/README.md +57 -0
  65. package/assets/ide/adapters/cursor-harness-starter.mdc.example +39 -0
  66. package/assets/ide/commands/claude/kit/apply-standards.md +10 -0
  67. package/assets/ide/commands/claude/kit/gate-status.md +10 -0
  68. package/assets/ide/commands/claude/kit/graph-check.md +8 -0
  69. package/assets/ide/commands/claude/kit/hat-00-delegate.md +9 -0
  70. package/assets/ide/commands/claude/kit/hat-10-spec.md +9 -0
  71. package/assets/ide/commands/claude/kit/hat-10-task.md +9 -0
  72. package/assets/ide/commands/claude/kit/hat-20-spec-audit.md +9 -0
  73. package/assets/ide/commands/claude/kit/hat-20-task-audit.md +9 -0
  74. package/assets/ide/commands/claude/kit/hat-reanchor.md +8 -0
  75. package/assets/ide/commands/claude/kit/init-guide.md +16 -0
  76. package/assets/ide/commands/claude/kit/sync-prompts-guide.md +9 -0
  77. package/assets/ide/commands/claude/kit/verify.md +16 -0
  78. package/assets/ide/commands/cursor/kit-apply-standards.md +12 -0
  79. package/assets/ide/commands/cursor/kit-gate-status.md +12 -0
  80. package/assets/ide/commands/cursor/kit-graph-check.md +10 -0
  81. package/assets/ide/commands/cursor/kit-hat-00-delegate.md +11 -0
  82. package/assets/ide/commands/cursor/kit-hat-10-spec.md +11 -0
  83. package/assets/ide/commands/cursor/kit-hat-10-task.md +11 -0
  84. package/assets/ide/commands/cursor/kit-hat-20-spec-audit.md +11 -0
  85. package/assets/ide/commands/cursor/kit-hat-20-task-audit.md +11 -0
  86. package/assets/ide/commands/cursor/kit-hat-reanchor.md +10 -0
  87. package/assets/ide/commands/cursor/kit-init-guide.md +18 -0
  88. package/assets/ide/commands/cursor/kit-sync-prompts-guide.md +11 -0
  89. package/assets/ide/commands/cursor/kit-verify.md +18 -0
  90. package/assets/ide/host-adapt/README.md +113 -0
  91. package/assets/ide/host-adapt/examples/mvp-hosts.yaml +78 -0
  92. package/assets/ide/host-adapt/host-adapt.schema.json +97 -0
  93. package/assets/ide/skills-orch/README.md +16 -0
  94. package/assets/ide/skills-orch/kit-apply-standards/SKILL.md +17 -0
  95. package/assets/ide/skills-orch/kit-gate-status/SKILL.md +17 -0
  96. package/assets/ide/skills-orch/kit-hat-reanchor/SKILL.md +15 -0
  97. package/assets/ide/skills-orch/kit-init-guide/SKILL.md +23 -0
  98. package/assets/ide/skills-orch/kit-verify/SKILL.md +23 -0
  99. package/assets/ontology.yaml +113 -0
  100. package/assets/skills/README.md +37 -0
  101. package/assets/skills/harness-00-delegate-only/SKILL.md +19 -0
  102. package/assets/skills/harness-10-spec/SKILL.md +63 -0
  103. package/assets/skills/harness-10-task/SKILL.md +70 -0
  104. package/assets/skills/harness-20-spec-audit/SKILL.md +50 -0
  105. package/assets/skills/harness-20-task-audit/SKILL.md +90 -0
  106. package/assets/skills/harness-20-task-audit/references/TEMPLATE_30_gate_stop.md +36 -0
  107. package/assets/skills/harness-hat-reanchor/SKILL.md +19 -0
  108. package/assets/standards/POINTER_workspace_truth_v1_zh.md +42 -0
  109. package/assets/standards/README.md +35 -0
  110. package/assets/standards/SOURCES_v1_zh.md +49 -0
  111. package/assets/standards/TEMPLATE_CODING_BASELINE_L1_v1_zh.md +88 -0
  112. package/assets/standards/TEMPLATE_CODING_BASELINE_L2_backend_v1_zh.md +75 -0
  113. package/assets/standards/TEMPLATE_CODING_BASELINE_L2_frontend_v1_zh.md +76 -0
  114. package/bin/dsh-coding-kit.js +7 -0
  115. package/bin/specgate.js +7 -0
  116. package/bin/validate_template_compliance.py +470 -0
  117. package/cordis.patch.yml +5 -0
  118. package/lib/cli-checks.d.ts +68 -0
  119. package/lib/cli-checks.js +812 -0
  120. package/lib/cli-checks.js.map +1 -0
  121. package/lib/cli-graph-hgm.d.ts +74 -0
  122. package/lib/cli-graph-hgm.js +416 -0
  123. package/lib/cli-graph-hgm.js.map +1 -0
  124. package/lib/cli-graph-yaml.d.ts +79 -0
  125. package/lib/cli-graph-yaml.js +602 -0
  126. package/lib/cli-graph-yaml.js.map +1 -0
  127. package/lib/cli-graph.d.ts +1 -0
  128. package/lib/cli-graph.js +199 -0
  129. package/lib/cli-graph.js.map +1 -0
  130. package/lib/cli-host.d.ts +24 -0
  131. package/lib/cli-host.js +1197 -0
  132. package/lib/cli-host.js.map +1 -0
  133. package/lib/cli-lifecycle.d.ts +2 -0
  134. package/lib/cli-lifecycle.js +401 -0
  135. package/lib/cli-lifecycle.js.map +1 -0
  136. package/lib/cli-refresh-ide-blocks.d.ts +66 -0
  137. package/lib/cli-refresh-ide-blocks.js +484 -0
  138. package/lib/cli-refresh-ide-blocks.js.map +1 -0
  139. package/lib/cli-shared.d.ts +74 -0
  140. package/lib/cli-shared.js +281 -0
  141. package/lib/cli-shared.js.map +1 -0
  142. package/lib/cli-skills.d.ts +52 -0
  143. package/lib/cli-skills.js +363 -0
  144. package/lib/cli-skills.js.map +1 -0
  145. package/lib/cli-status.d.ts +2 -0
  146. package/lib/cli-status.js +251 -0
  147. package/lib/cli-status.js.map +1 -0
  148. package/lib/cli-sync-prompts.d.ts +25 -0
  149. package/lib/cli-sync-prompts.js +158 -0
  150. package/lib/cli-sync-prompts.js.map +1 -0
  151. package/lib/cli-sync.d.ts +2 -0
  152. package/lib/cli-sync.js +124 -0
  153. package/lib/cli-sync.js.map +1 -0
  154. package/lib/cli-task-extra.d.ts +53 -0
  155. package/lib/cli-task-extra.js +408 -0
  156. package/lib/cli-task-extra.js.map +1 -0
  157. package/lib/cli-timeline.d.ts +28 -0
  158. package/lib/cli-timeline.js +68 -0
  159. package/lib/cli-timeline.js.map +1 -0
  160. package/lib/cli-wiki.d.ts +21 -0
  161. package/lib/cli-wiki.js +189 -0
  162. package/lib/cli-wiki.js.map +1 -0
  163. package/lib/cli.d.ts +22 -0
  164. package/lib/cli.js +1034 -0
  165. package/lib/cli.js.map +1 -0
  166. package/lib/host-contract.d.ts +23 -0
  167. package/lib/host-contract.js +143 -0
  168. package/lib/host-contract.js.map +1 -0
  169. package/lib/index.d.ts +18 -0
  170. package/lib/index.js +290 -0
  171. package/lib/index.js.map +1 -0
  172. package/lib/yaml.d.ts +4 -0
  173. package/lib/yaml.js +10 -0
  174. package/lib/yaml.js.map +1 -0
  175. package/package.json +87 -0
@@ -0,0 +1,484 @@
1
+ // R-07:消费者仓 IDE marker 块旧命令字面自动刷写
2
+ // SPEC: docs/spec/self-tech-graph/reference/POINTERS.md#R07
3
+ // 分层:T1 parseBlocks(§3 纯函数)→ T2 rewriteBody(§4 映射表)→ T3 拒写闸/备份(§6)→ T4 命令与报告(§5)
4
+ import { execFileSync } from 'node:child_process';
5
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync, } from 'node:fs';
6
+ import path from 'node:path';
7
+ import { assertNotS2Abs, fail, kitLayoutJoin, resolveTarget, takeOption } from "./cli-shared.js";
8
+ // ---------- T1:marker 块解析器(§3 冻结形态 · 纯函数 · 不写盘) ----------
9
+ // §3.1:整行精确匹配;仅 HTML 注释;大小写敏感;无属性;独立行
10
+ const PRODUCT_BEGIN_RE = /^\s*<!-- cyning-harness:begin -->\s*$/;
11
+ const PRODUCT_END_RE = /^\s*<!-- cyning-harness:end -->\s*$/;
12
+ const LOCAL_BEGIN_RE = /^\s*<!-- cyning-harness-local:begin -->\s*$/;
13
+ const LOCAL_END_RE = /^\s*<!-- cyning-harness-local:end -->\s*$/;
14
+ // §3.2:栈式配对(顺序扫描 · 不引入 Markdown 语义);任一畸形 → 整文件 MALFORMED(不 salvage)
15
+ export function parseBlocks(text) {
16
+ const lines = text.split('\n');
17
+ const blocks = [];
18
+ let state = 'outside';
19
+ let openLine = 0;
20
+ const malformed = (kind, line) => ({
21
+ blocks,
22
+ malformed: { kind, line },
23
+ });
24
+ for (let i = 0; i < lines.length; i++) {
25
+ const ln = i + 1;
26
+ const line = lines[i] ?? '';
27
+ const isPB = PRODUCT_BEGIN_RE.test(line);
28
+ const isPE = PRODUCT_END_RE.test(line);
29
+ const isLB = LOCAL_BEGIN_RE.test(line);
30
+ const isLE = LOCAL_END_RE.test(line);
31
+ if (state === 'outside') {
32
+ if (isPB) {
33
+ state = 'product';
34
+ openLine = ln;
35
+ }
36
+ else if (isLB) {
37
+ state = 'local';
38
+ openLine = ln;
39
+ }
40
+ else if (isPE || isLE) {
41
+ return malformed('unmatched_end', ln);
42
+ }
43
+ continue;
44
+ }
45
+ if (state === 'product') {
46
+ if (isPB)
47
+ return malformed('nested_begin', ln);
48
+ if (isLB || isLE)
49
+ return malformed('local_inside_product', ln);
50
+ if (isPE) {
51
+ blocks.push({ kind: 'product', beginLine: openLine, endLine: ln, bodyStart: openLine + 1, bodyEnd: ln - 1 });
52
+ state = 'outside';
53
+ }
54
+ continue;
55
+ }
56
+ // state === 'local'
57
+ if (isLB || isPB)
58
+ return malformed('nested_begin', ln);
59
+ if (isPE)
60
+ return malformed('unmatched_end', ln);
61
+ if (isLE) {
62
+ blocks.push({ kind: 'local', beginLine: openLine, endLine: ln, bodyStart: openLine + 1, bodyEnd: ln - 1 });
63
+ state = 'outside';
64
+ }
65
+ }
66
+ if (state !== 'outside')
67
+ return malformed('unclosed_begin', openLine);
68
+ return { blocks, malformed: null };
69
+ }
70
+ // §3.3:IDE 文件发现面(冻结白名单)
71
+ export function discoverIdeFiles(target) {
72
+ const out = [];
73
+ for (const name of ['AGENTS.md', 'CLAUDE.md']) {
74
+ if (existsSync(path.join(target, name)))
75
+ out.push(name);
76
+ }
77
+ const rulesDir = path.join(target, '.cursor', 'rules');
78
+ if (existsSync(rulesDir) && statSync(rulesDir).isDirectory()) {
79
+ for (const n of readdirSync(rulesDir)) {
80
+ const abs = path.join(rulesDir, n);
81
+ if (n.endsWith('.mdc') && statSync(abs).isFile())
82
+ out.push('.cursor/rules/' + n);
83
+ }
84
+ }
85
+ return out.sort();
86
+ }
87
+ // §4.1 A1–A3:npx( --yes)? @cyning/harness(@pin)? → npx [yes] spec-wave
88
+ const A_NPX_RE = /npx( --yes)? @cyning\/harness(@[0-9][^\s")']*)?(?![\w/@-])/g;
89
+ // B-REFRESH A5–A7:npx( --yes)? dsh-coding-kit(@pin)? → npx [yes] spec-wave
90
+ const DSH_NPX_RE = /npx( --yes)? dsh-coding-kit(@[0-9][^\s")']*)?(?![\w/@-])/g;
91
+ // A8:曾拟 npm 名 / 旧命令字面 npx( --yes)? specgate(@pin)? → npx [yes] spec-wave(钉版丢弃)
92
+ const SPECGATE_NPX_RE = /npx( --yes)? specgate(@[0-9][^\s")']*)?(?![\w/@-])/g;
93
+ // §4.1 A4:裸 bin 形态;行前缀已含现行 npx 时防二刷
94
+ const A4_RE = /(?<![\w./-])harness skills (build|check)\b/g;
95
+ // §6.3-2 MIXED:块体内现行字面(SpecGate · npm CLI = spec-wave)
96
+ const CURRENT_NPX = 'npx spec-wave';
97
+ // §4.2 B 组检出正则(仅报告)
98
+ const B1_RE = /CYNING_HARNESS/g;
99
+ const B2_RE = /--with-scripts/g;
100
+ const B3_RE = /(?<![\w./-])wizard\/[^\s"')\]]+/g;
101
+ const B4_RE = /(?<![\w.:/-])harness:[A-Za-z][\w-]*/g;
102
+ const B5_PKG_RE = /@cyning\/harness/g;
103
+ const B5_BARE_RE = /(?<![\w./:-])harness [a-z][a-z0-9-]*/g;
104
+ function bump(list, rule, droppedPin) {
105
+ const hit = list.find((h) => h.rule === rule);
106
+ if (hit) {
107
+ hit.count += 1;
108
+ hit.dropped_pin = hit.dropped_pin || droppedPin;
109
+ }
110
+ else {
111
+ list.push({ rule, count: 1, dropped_pin: droppedPin });
112
+ }
113
+ }
114
+ function maskSameLength(m) {
115
+ return ' '.repeat(m.length);
116
+ }
117
+ function applyNpxRewrite(body, re, rules, rewrites) {
118
+ return body.replace(re, (_m, yes, pin) => {
119
+ const rule = yes ? rules.yes : pin ? rules.pin : rules.plain;
120
+ bump(rewrites, rule, Boolean(pin));
121
+ return 'npx' + (yes ?? '') + ' spec-wave';
122
+ });
123
+ }
124
+ function applySpecgateNpxRewrite(body, rewrites) {
125
+ return body.replace(SPECGATE_NPX_RE, (_m, yes, pin) => {
126
+ bump(rewrites, 'A8', Boolean(pin));
127
+ return 'npx' + (yes ?? '') + ' spec-wave';
128
+ });
129
+ }
130
+ // §4.3:纯字面替换 · 行内多处逐个 · 表外不自动改;B 组在「A 组掩蔽后」的文本上检出
131
+ export function rewriteBody(body) {
132
+ const rewrites = [];
133
+ // 先掩蔽 A5–A7 / A1–A3 / A8,供 B 组排除已迁移前缀
134
+ let masked = body.replace(DSH_NPX_RE, (m) => maskSameLength(m));
135
+ masked = masked.replace(A_NPX_RE, (m) => maskSameLength(m));
136
+ masked = masked.replace(SPECGATE_NPX_RE, (m) => maskSameLength(m));
137
+ // B-REFRESH:旧 dsh-coding-kit 字面先刷到 spec-wave
138
+ let text = applyNpxRewrite(body, DSH_NPX_RE, { plain: 'A5', pin: 'A6', yes: 'A7' }, rewrites);
139
+ // 旧 @cyning/harness 直接落到现行 spec-wave(不再中停 dsh-coding-kit)
140
+ text = applyNpxRewrite(text, A_NPX_RE, { plain: 'A1', pin: 'A2', yes: 'A3' }, rewrites);
141
+ // A8:旧 npx specgate[@pin] → npx spec-wave
142
+ text = applySpecgateNpxRewrite(text, rewrites);
143
+ // A4 逐行处理(防二刷看行前缀);命中同步掩蔽供 B5 排除
144
+ const maskedLines = masked.split('\n');
145
+ text = text
146
+ .split('\n')
147
+ .map((line, i) => {
148
+ let mline = maskedLines[i] ?? '';
149
+ const out = line.replace(A4_RE, (m, sub, offset) => {
150
+ const prefix = line.slice(0, offset);
151
+ // 防二刷:已是现行 / 仍待 A5·A8 刷写的旧前缀
152
+ if (prefix.includes(CURRENT_NPX) ||
153
+ prefix.includes('npx dsh-coding-kit') ||
154
+ prefix.includes('npx specgate')) {
155
+ return m;
156
+ }
157
+ bump(rewrites, 'A4', false);
158
+ mline = mline.replace(m, maskSameLength(m));
159
+ return CURRENT_NPX + ' skills ' + sub;
160
+ });
161
+ maskedLines[i] = mline;
162
+ return out;
163
+ })
164
+ .join('\n');
165
+ const masked2 = maskedLines.join('\n');
166
+ const countOf = (re) => (masked2.match(re) ?? []).length;
167
+ const reportOnly = [];
168
+ const pushReport = (rule, count) => {
169
+ if (count > 0)
170
+ reportOnly.push({ rule, count });
171
+ };
172
+ pushReport('B1', countOf(B1_RE));
173
+ pushReport('B2', countOf(B2_RE));
174
+ pushReport('B3', countOf(B3_RE));
175
+ pushReport('B4', countOf(B4_RE));
176
+ pushReport('B5', countOf(B5_PKG_RE) + countOf(B5_BARE_RE));
177
+ const aHits = rewrites.reduce((s, h) => s + h.count, 0);
178
+ return { text, rewrites, reportOnly, aHits };
179
+ }
180
+ export function scanIdeFile(rel, text) {
181
+ const parsed = parseBlocks(text);
182
+ const productBlocks = parsed.blocks.filter((b) => b.kind === 'product');
183
+ const localBlocks = parsed.blocks.filter((b) => b.kind === 'local');
184
+ const base = {
185
+ path: rel,
186
+ blocks: productBlocks.length,
187
+ status: 'ok',
188
+ rewrites: [],
189
+ reportOnly: [],
190
+ skippedLocalBlocks: localBlocks.length,
191
+ malformed: parsed.malformed,
192
+ mixedLines: [],
193
+ plainMentions: [],
194
+ };
195
+ if (parsed.malformed) {
196
+ base.status = 'malformed';
197
+ return base;
198
+ }
199
+ // DEF-029:0 product 块文件做整文只读扫描(复用 rewriteBody 纯函数取 A/B 组命中计数;
200
+ // 返回的改写文本直接丢弃——newText 不赋值,写盘路径结构上不含这些文件)
201
+ if (productBlocks.length === 0) {
202
+ const r = rewriteBody(text);
203
+ base.plainMentions = [
204
+ ...r.rewrites.map((h) => ({ rule: h.rule, count: h.count })),
205
+ ...r.reportOnly.map((h) => ({ rule: h.rule, count: h.count })),
206
+ ];
207
+ if (localBlocks.length > 0)
208
+ base.status = 'skipped_local'; // 状态口径与原末段一致
209
+ return base;
210
+ }
211
+ const lines = text.split('\n');
212
+ const rewrites = new Map();
213
+ const reports = new Map();
214
+ const mixedLines = [];
215
+ let aHits = 0;
216
+ let hasCurrent = false;
217
+ for (const b of productBlocks) {
218
+ if (b.bodyStart > b.bodyEnd)
219
+ continue;
220
+ const body = lines.slice(b.bodyStart - 1, b.bodyEnd).join('\n');
221
+ const r = rewriteBody(body);
222
+ aHits += r.aHits;
223
+ for (const h of r.rewrites) {
224
+ const cur = rewrites.get(h.rule);
225
+ if (cur) {
226
+ cur.count += h.count;
227
+ cur.dropped_pin = cur.dropped_pin || h.dropped_pin;
228
+ }
229
+ else {
230
+ rewrites.set(h.rule, { ...h });
231
+ }
232
+ }
233
+ for (const h of r.reportOnly)
234
+ reports.set(h.rule, (reports.get(h.rule) ?? 0) + h.count);
235
+ // MIXED 行号:块体内现行字面——必须看替换前的原始行(替换后必然含 CURRENT_NPX,会假阳性)
236
+ const origBodyLines = lines.slice(b.bodyStart - 1, b.bodyEnd);
237
+ for (let k = 0; k < origBodyLines.length; k++) {
238
+ if ((origBodyLines[k] ?? '').includes(CURRENT_NPX)) {
239
+ hasCurrent = true;
240
+ mixedLines.push(b.bodyStart + k);
241
+ }
242
+ }
243
+ lines.splice(b.bodyStart - 1, b.bodyEnd - b.bodyStart + 1, ...r.text.split('\n'));
244
+ }
245
+ base.rewrites = [...rewrites.values()];
246
+ base.reportOnly = [...reports.entries()].map(([rule, count]) => ({ rule, count }));
247
+ // 0 product 块(含 local-only)已在上方 DEF-029 早退分支处理并返回;此处 productBlocks.length >= 1
248
+ if (aHits > 0 && hasCurrent) {
249
+ base.status = 'mixed';
250
+ base.mixedLines = mixedLines;
251
+ }
252
+ if (aHits > 0)
253
+ base.newText = lines.join('\n');
254
+ return base;
255
+ }
256
+ export function gitState(target) {
257
+ try {
258
+ const out = execFileSync('git', ['-C', target, 'status', '--porcelain'], {
259
+ encoding: 'utf8',
260
+ stdio: ['pipe', 'pipe', 'pipe'],
261
+ });
262
+ return out.trim() ? 'dirty' : 'clean';
263
+ }
264
+ catch {
265
+ return 'none';
266
+ }
267
+ }
268
+ const BACKUP_KEEP = 5; // §12 裁定:备份维持 5 代
269
+ function backupsRoot(target) {
270
+ return kitLayoutJoin(target, 'backups', 'refresh-ide-blocks');
271
+ }
272
+ // §6.5:写盘前原字节复制到 .coding-kit/backups/refresh-ide-blocks/<UTCts>/<相对路径>
273
+ function backupFile(target, genDir, rel) {
274
+ const src = path.join(target, rel);
275
+ const dest = path.join(genDir, rel);
276
+ mkdirSync(path.dirname(dest), { recursive: true });
277
+ copyFileSync(src, dest);
278
+ return dest;
279
+ }
280
+ // §6.3-4:单文件 tmp+rename 原子写
281
+ function atomicWrite(abs, body) {
282
+ const tmp = abs + '.tmp-refresh-' + process.pid;
283
+ writeFileSync(tmp, body, 'utf8');
284
+ renameSync(tmp, abs);
285
+ }
286
+ // §6.5:写盘成功后保留最近 5 代时间戳目录
287
+ function pruneBackups(target) {
288
+ const root = backupsRoot(target);
289
+ if (!existsSync(root))
290
+ return;
291
+ const gens = readdirSync(root)
292
+ .filter((n) => statSync(path.join(root, n)).isDirectory())
293
+ .sort();
294
+ for (const old of gens.slice(0, Math.max(0, gens.length - BACKUP_KEEP))) {
295
+ rmSync(path.join(root, old), { recursive: true, force: true });
296
+ }
297
+ }
298
+ // ---------- T4:命令接线与报告(§5) ----------
299
+ // DEF-029:schema 保持 @1(向后兼容增量)——1.5.2 起新增 top-level plain_mentions[] 与 totals.plain_mentions,
300
+ // 仅追加字段、不改既有字段语义;旧消费者忽略新字段即可。
301
+ const REPORT_SCHEMA = 'dsh-coding-kit/refresh-ide-blocks-report@1';
302
+ const A_LABEL = {
303
+ A1: 'npx @cyning/harness → npx spec-wave',
304
+ A2: 'npx @cyning/harness@<version> → npx spec-wave(钉版丢弃)',
305
+ A3: 'npx --yes @cyning/harness[@<version>] → npx --yes spec-wave',
306
+ A4: 'harness skills build|check → npx spec-wave skills build|check',
307
+ A5: 'npx dsh-coding-kit → npx spec-wave',
308
+ A6: 'npx dsh-coding-kit@<version> → npx spec-wave(钉版丢弃)',
309
+ A7: 'npx --yes dsh-coding-kit[@<version>] → npx --yes spec-wave',
310
+ A8: 'npx specgate[@<version>] → npx spec-wave(钉版丢弃)',
311
+ };
312
+ const B_LABEL = {
313
+ B1: 'CYNING_HARNESS env 名(需人工删改)',
314
+ B2: '--with-scripts 旗标(需人工删改)',
315
+ B3: 'wizard/ 路径引用(需人工删改)',
316
+ B4: 'harness:<name> npm script 名(需人工删改)',
317
+ B5: '其他裸 @cyning/harness 引用(需人工删改)',
318
+ };
319
+ const MALFORMED_LABEL = {
320
+ unclosed_begin: 'begin 无配对 end',
321
+ unmatched_end: 'end 无配对 begin',
322
+ nested_begin: '嵌套 begin',
323
+ local_inside_product: 'local marker 落在 product 块体内',
324
+ };
325
+ function printHumanReport(report, scans) {
326
+ console.log('=== refresh-ide-blocks (' + report.mode + ') ===');
327
+ console.log('目标: ' + report.target);
328
+ console.log('git: ' + report.git);
329
+ for (const f of report.files) {
330
+ const scan = scans.find((s) => s.path === f.path);
331
+ const mal = scan?.malformed ? '(' + MALFORMED_LABEL[scan.malformed.kind] + '@L' + scan.malformed.line + ')' : '';
332
+ const mix = scan && scan.mixedLines.length > 0 ? '(现行字面行: ' + scan.mixedLines.map((n) => 'L' + n).join(',') + ')' : '';
333
+ console.log('文件: ' + f.path);
334
+ console.log(' 块: ' + f.blocks + ' · 状态: ' + f.status + mal + mix);
335
+ for (const h of f.rewrites) {
336
+ console.log(' ' + h.rule + ' ' + A_LABEL[h.rule] + ': ' + h.count + (h.dropped_pin ? '(dropped_pin)' : ''));
337
+ }
338
+ for (const h of f.report_only) {
339
+ console.log(' ' + h.rule + ' ' + B_LABEL[h.rule] + ': ' + h.count);
340
+ }
341
+ if (f.skipped_local_blocks > 0)
342
+ console.log(' 跳过 local 块: ' + f.skipped_local_blocks);
343
+ if (report.mode === 'dry-run') {
344
+ if (f.rewrites.length > 0 && f.status !== 'malformed')
345
+ console.log(' 计划写入(dry-run 未写盘)');
346
+ }
347
+ else if (f.written) {
348
+ console.log(' 已写入(备份: ' + (f.backup ?? 'n/a') + ')');
349
+ }
350
+ }
351
+ // DEF-029:无 marker 文件检出段(仅报告,不刷写;命中不触发 preflight fail-fast)
352
+ if (report.plain_mentions.length > 0) {
353
+ console.log('无 marker 检出(仅报告,不刷写):');
354
+ for (const m of report.plain_mentions) {
355
+ const label = A_LABEL[m.rule] ?? B_LABEL[m.rule] ?? m.rule;
356
+ console.log(' ' + m.path + ': ' + m.rule + ' ' + label + ': ' + m.count);
357
+ }
358
+ }
359
+ const t = report.totals;
360
+ console.log('汇总: files_scanned=' + t.files_scanned + ' product_blocks=' + t.product_blocks + ' rewrites=' + t.rewrites + ' report_only=' + t.report_only + ' files_written=' + t.files_written + ' plain_mentions=' + t.plain_mentions);
361
+ console.log('回滚: git checkout -- <path>(干净树 preflight 保证 git 可用时 diff 即回滚面);非 git 仓以备份 cp 回(.coding-kit/backups/refresh-ide-blocks/)');
362
+ }
363
+ export async function cmdRefreshIdeBlocks(args) {
364
+ if (args.includes('--help') || args.includes('-h')) {
365
+ console.log('用法: npx spec-wave refresh-ide-blocks [--target PATH] [--dry-run] [--yes] [--json]');
366
+ return;
367
+ }
368
+ const yes = args.includes('--yes');
369
+ const dryRunFlag = args.includes('--dry-run');
370
+ const json = args.includes('--json');
371
+ if (yes && dryRunFlag)
372
+ fail('refresh-ide-blocks: --yes 与 --dry-run 不可同现', 1);
373
+ let rest = args.filter((a) => a !== '--yes' && a !== '--dry-run' && a !== '--json');
374
+ const { value: targetArg, rest: r1 } = takeOption(rest, '--target');
375
+ rest = r1;
376
+ if (rest.length > 0)
377
+ fail('refresh-ide-blocks 未知参数: ' + rest.join(' '), 1);
378
+ const target = resolveTarget(process.cwd(), targetArg);
379
+ if (!existsSync(target))
380
+ fail('refresh-ide-blocks target 不存在: ' + target, 1);
381
+ // 第一段:全扫(dry-run 与 --yes 共用同一核心)
382
+ const relFiles = discoverIdeFiles(target);
383
+ const scans = relFiles.map((rel) => scanIdeFile(rel, readFileSync(path.join(target, rel), 'utf8')));
384
+ const git = gitState(target);
385
+ const apply = yes;
386
+ const toWrites = scans.filter((s) => s.newText !== undefined);
387
+ // 第二段(--yes 专用):preflight fail-fast,全过才写盘(§6.3)
388
+ if (apply) {
389
+ for (const s of toWrites)
390
+ assertNotS2Abs(path.resolve(path.join(target, s.path)));
391
+ if (git === 'dirty') {
392
+ fail('refresh-ide-blocks: git 工作树脏(未提交变更),fail-fast 拒写。请先 commit/stash 后重跑。核查: git -C ' + target + ' status --porcelain', 2);
393
+ }
394
+ const malformedFiles = scans.filter((s) => s.status === 'malformed');
395
+ if (malformedFiles.length > 0) {
396
+ const detail = malformedFiles
397
+ .map((s) => s.path + ': ' + MALFORMED_LABEL[s.malformed?.kind ?? 'unclosed_begin'] + '@L' + (s.malformed?.line ?? 0))
398
+ .join(';');
399
+ fail('refresh-ide-blocks: 存在 MALFORMED 文件,fail-fast 拒写(人工修 marker 配对后重跑): ' + detail, 2);
400
+ }
401
+ const mixedFiles = scans.filter((s) => s.status === 'mixed');
402
+ if (mixedFiles.length > 0) {
403
+ const detail = mixedFiles
404
+ .map((s) => s.path + '(现行字面行: ' + s.mixedLines.map((n) => 'L' + n).join(',') + ')')
405
+ .join(';');
406
+ fail('refresh-ide-blocks: 存在 MIXED 文件(块内新旧命令字面混杂,部分手迁迹象),fail-fast 拒写: ' + detail, 2);
407
+ }
408
+ }
409
+ if (apply && git === 'none' && toWrites.length > 0) {
410
+ console.log('警告: target 非 git 仓(git: none),写盘后无 diff 回滚面,仅可靠备份回滚: ' + target);
411
+ }
412
+ // 写盘阶段:备份 → tmp+rename → 5 代清理
413
+ const reportFiles = [];
414
+ let genDir = null;
415
+ if (apply && toWrites.length > 0) {
416
+ const ts = new Date().toISOString().replace(/[:.]/g, '-');
417
+ genDir = path.join(backupsRoot(target), ts);
418
+ }
419
+ for (const s of scans) {
420
+ let written = false;
421
+ let backup = null;
422
+ if (apply && s.newText !== undefined && genDir) {
423
+ backup = backupFile(target, genDir, s.path);
424
+ atomicWrite(path.join(target, s.path), s.newText);
425
+ written = true;
426
+ }
427
+ reportFiles.push({
428
+ path: s.path,
429
+ blocks: s.blocks,
430
+ status: s.status,
431
+ rewrites: s.rewrites,
432
+ report_only: s.reportOnly,
433
+ skipped_local_blocks: s.skippedLocalBlocks,
434
+ written,
435
+ backup,
436
+ });
437
+ }
438
+ if (apply && toWrites.length > 0)
439
+ pruneBackups(target);
440
+ // DEF-029:汇总无 marker 文件只读检出(dry-run 与 --yes 均报告;不影响 exit 码与 preflight)
441
+ const plainMentions = scans.flatMap((s) => s.plainMentions.map((m) => ({ path: s.path, rule: m.rule, count: m.count })));
442
+ const totals = {
443
+ files_scanned: scans.length,
444
+ product_blocks: scans.reduce((n, s) => n + s.blocks, 0),
445
+ rewrites: scans.reduce((n, s) => n + s.rewrites.reduce((m, h) => m + h.count, 0), 0),
446
+ report_only: scans.reduce((n, s) => n + s.reportOnly.reduce((m, h) => m + h.count, 0), 0),
447
+ files_written: reportFiles.filter((f) => f.written).length,
448
+ plain_mentions: plainMentions.reduce((n, m) => n + m.count, 0),
449
+ };
450
+ const report = {
451
+ schema: REPORT_SCHEMA,
452
+ target,
453
+ mode: apply ? 'apply' : 'dry-run',
454
+ git,
455
+ files: reportFiles,
456
+ plain_mentions: plainMentions,
457
+ totals,
458
+ exit: 0,
459
+ };
460
+ if (json)
461
+ console.log(JSON.stringify(report));
462
+ else
463
+ printHumanReport(report, scans);
464
+ }
465
+ // §5.2:cmdUpgrade 内嵌 dry-run 只读提示用的轻量计数(永不抛错 · 不读写 manifest · 不写任何文件)
466
+ export function countStaleIdeLiterals(target) {
467
+ try {
468
+ let n = 0;
469
+ for (const rel of discoverIdeFiles(target)) {
470
+ try {
471
+ const scan = scanIdeFile(rel, readFileSync(path.join(target, rel), 'utf8'));
472
+ n += scan.rewrites.reduce((s, h) => s + h.count, 0);
473
+ }
474
+ catch {
475
+ // 单文件异常吞为提示级
476
+ }
477
+ }
478
+ return n;
479
+ }
480
+ catch {
481
+ return 0;
482
+ }
483
+ }
484
+ //# sourceMappingURL=cli-refresh-ide-blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-refresh-ide-blocks.js","sourceRoot":"","sources":["../src/cli-refresh-ide-blocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ export declare class CliError extends Error {
2
+ readonly exitCode: number;
3
+ constructor(message: string, exitCode?: number);
4
+ }
5
+ export type HumanGate = {
6
+ id: string;
7
+ status: string;
8
+ blocksHats: string;
9
+ };
10
+ export type MayStart = {
11
+ ok: boolean;
12
+ reason: string | null;
13
+ };
14
+ export declare const STATUS_RE: RegExp;
15
+ export declare function packageRoot(): string;
16
+ export declare function resolveTarget(cwd: string, targetArg?: string): string;
17
+ export declare function takeOption(args: string[], name: string): {
18
+ value: string | undefined;
19
+ rest: string[];
20
+ };
21
+ export declare function fail(message: string, exitCode?: number): never;
22
+ /**
23
+ * S2 过程域前缀唯一真值源(F1 / X7)。
24
+ * 规范三路径 + legacy 裸前缀并集;判定用「相等或前缀/」——禁止各命令本地再硬编码等价列表。
25
+ */
26
+ export declare const S2_TRUTH_PREFIXES: readonly ["docs/tasks", "docs/harness/reviews", "docs/harness/invokes/by-task", "reviews", "invokes/by-task"];
27
+ export type S2TruthPrefix = (typeof S2_TRUTH_PREFIXES)[number];
28
+ export declare function normalizeSlashPath(p: string): string;
29
+ /** 相对路径(仓内 rel)是否命中 S2 */
30
+ export declare function isS2RelPath(destRel: string): boolean;
31
+ /**
32
+ * 绝对路径是否命中 S2。
33
+ * `.dsh/skills` 安装落点白名单:永不视为 S2(与 skills install 历史语义一致)。
34
+ */
35
+ export declare function isS2AbsPath(absPath: string): boolean;
36
+ export declare function assertNotS2Abs(absPath: string, message?: string, exitCode?: number): void;
37
+ /** 现行落盘根(F4 方案 B) */
38
+ export declare const KIT_LAYOUT_DIR: ".coding-kit";
39
+ /** legacy 只读探测根(不再作为新写默认目标) */
40
+ export declare const LEGACY_LAYOUT_DIR: ".cyning-harness";
41
+ export declare function kitLayoutJoin(target: string, ...parts: string[]): string;
42
+ export declare function legacyLayoutJoin(target: string, ...parts: string[]): string;
43
+ /**
44
+ * 解析布局内相对文件:优先 `.coding-kit/`,否则 legacy `.cyning-harness/`。
45
+ * `source=none` 时 `abs` 仍指向新布局路径(供写入)。
46
+ */
47
+ export declare function resolveLayoutFile(target: string, relWithinLayout: string): {
48
+ abs: string;
49
+ source: 'kit' | 'legacy' | 'none';
50
+ };
51
+ export declare function legacyLayoutHint(target: string): string | null;
52
+ export declare function extractSection(content: string, startMarker: string, endMarker?: string): string | null;
53
+ export declare function normalizeCell(raw: string): string;
54
+ export declare function parseHarnessMeta(content: string): Record<string, string>;
55
+ export declare function findWikiDeltaOutsideMetaSection(content: string): {
56
+ line: number;
57
+ section: string;
58
+ } | null;
59
+ export declare function parseHumanGates(content: string): HumanGate[];
60
+ export declare function findGate(gates: HumanGate[], prefix: string): HumanGate | undefined;
61
+ export declare function evaluateMayStart30(gates: HumanGate[]): MayStart;
62
+ export declare function extractTaskSlug(fileName: string): string;
63
+ export declare function normalizeSlug(slug: string): string;
64
+ export declare function resolveTaskPath(target: string, taskFile: string): string;
65
+ export declare function readTextIfExists(file: string): string | null;
66
+ export declare function toRel(target: string, abs: string): string;
67
+ export declare function extractHatsFromInvokeFilename(name: string): string[];
68
+ export type DoneSnapshot = {
69
+ path: string;
70
+ harness_meta_section: string;
71
+ warn: string | null;
72
+ };
73
+ export declare function canonicalHarnessMetaSection(): string;
74
+ export declare function buildDoneSnapshot(dest: string): DoneSnapshot;