@haaaiawd/loom 0.1.0 → 0.8.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/cli/src/help.js CHANGED
@@ -1,410 +1,41 @@
1
1
  // help — LOOM CLI 分层指南
2
2
  // loom help <topic> 输出结构化工作指南,不是 man page 参数说明。
3
3
  // 指南内容是 agent 能直接理解的:"做什么、用什么命令、怎么判断做对了"。
4
+ //
5
+ // 内容存储在 cli/help/*.md 文件中,运行时读取。
6
+ // 这样改帮助内容不用改代码,未来支持多语言也方便。
4
7
 
5
- const TOPICS = {
6
- workflow: `# LOOM 工作流
8
+ import { readFileSync, existsSync, readdirSync } from 'node:fs';
9
+ import { join, dirname } from 'node:path';
10
+ import { fileURLToPath } from 'node:url';
7
11
 
8
- 从零到交付的完整流程。每个阶段有明确的产出和验收标准。
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ const HELP_DIR = join(__dirname, '..', 'help');
9
14
 
10
- ## 第一步:诊断当前阶段
11
-
12
- \`\`\`bash
13
- loom guide
14
- \`\`\`
15
-
16
- guide 检测项目当前在哪个阶段,输出"你在阶段 X,下一步做 Y"。
17
- Agent 每完成一步都跑 guide 确认下一步。
18
-
19
- ## AUTO 模式
20
-
21
- \`\`\`bash
22
- loom auto on # 开启:Agent 自动连续执行,不等确认
23
- loom auto off # 关闭:每步需要用户确认
24
- \`\`\`
25
-
26
- AUTO on 时 Agent 一路跑到底,跑完生成 preview 给人看。
27
- AUTO off 时每步停下等用户说继续。
28
-
29
- ## 阶段 1:织造哲学(Weaver)
30
-
31
- \`\`\`bash
32
- loom activate weaver
33
- \`\`\`
34
-
35
- Weaver 根据项目特征从真实思想体系织造定制化哲学。产出:
36
- - PRODUCT_PHILOSOPHY.md — 产品价值观、反模式清单、决策取舍规则
37
- - ENGINEERING_CREED.md — 工程原则(按需)
38
- - DECISION_RUBRIC.md — 冲突时的优先级(按需)
39
- - PROJECT_BASELINE.md — 项目特定底线(按需)
40
-
41
- **验收**:哲学有北极星、有反模式、有决策标准。全是空话就重做。
42
-
43
- ## 阶段 2:定义愿景(Visionary)
44
-
45
- \`\`\`bash
46
- loom activate visionary
47
- \`\`\`
48
-
49
- 基于哲学定义产品愿景,为每个 Intent 写意图叙事("为什么存在")。产出:
50
- - 01_VISION.md — 北极星 + 意图叙事列表
51
-
52
- **验收**:叙事是"为什么"不是"做什么"。写成功能列表就重做。
53
-
54
- ## 阶段 3:设计系统(Architect)
55
-
56
- \`\`\`bash
57
- loom activate architect
58
- \`\`\`
59
-
60
- 基于愿景设计系统结构,绘制 Intent Map。产出:
61
- - 02_ARCHITECTURE.md — 系统设计
62
- - 04_INTENT_MAP.json — Intent 依赖图 + 验收契约 + 哲学锚点
63
-
64
- **验收**:验收契约具体到可验证,依赖无环,每个 Intent 有叙事引用。
65
- 跑 \`loom intent validate\` 校验结构,跑 \`loom doctor\` 检查完整性。
66
-
67
- ## 阶段 4:Intent Loop
68
-
69
- \`\`\`bash
70
- loom activate keeper # Keeper 选 Intent、验证
71
- loom activate forge # Forge 实现
72
- loom intent next # 下一个可执行 Intent
73
- loom context # 当前状态摘要
74
- \`\`\`
75
-
76
- 每个 Intent 独立走一圈:选 → 实现 → 验证 → 闭合或修正。
77
- 详细流程见 \`loom help loop\`。
78
-
79
- ## 阶段 5:人类预览
80
-
81
- \`\`\`bash
82
- loom preview
83
- \`\`\`
84
-
85
- 输出提示词,Agent 按提示词读 .loom/ 文件、拆解信息、生成 HTML 可视化预览。
86
- 人类用浏览器打开 HTML 看全局——哲学、愿景、架构、Intent 进度、验证历史。
87
- 这是只读投影,修改请编辑源文件后重新生成。
88
-
89
- ## 阶段 6:版本演进(按需)
90
-
91
- 当哲学前提/愿景北极星/架构边界变了,需要 Major 升级。
92
- 详细流程见 \`loom help version\`。
93
-
94
- ## 核心原则
95
-
96
- - **哲学是经线,意图是纬线** — 所有角色共享哲学锚点
97
- - **底线不可协商** — BASELINE 5 条 + 项目特定底线,角色激活时强制加载
98
- - **意图可回溯** — 每个 Intent 携带叙事,Keeper 独立验证忠实度
99
- - **文档开销不超过开发开销** — 小项目可以粗粒度,不必教条`,
100
-
101
- concepts: `# LOOM 核心概念
102
-
103
- ## 哲学
104
-
105
- 项目的价值观和工程原则——为什么存在、什么不做、冲突时谁优先。
106
- 由 Philosophy Weaver 从真实思想体系织造,不是模板填空。
107
- 所有角色激活时强制加载哲学作为共同锚点。
108
-
109
- 相关命令:
110
- - \`loom philosophy get <anchor>\` — 加载哲学章节
111
- - \`loom philosophy list\` — 列出哲学文档
112
- - \`loom intent reverse-ref <anchor>\` — 哪些 Intent 引用了这个哲学锚点
113
-
114
- ## Intent
115
-
116
- 一个意图单元——不是"做什么"(任务),是"为什么做"(意图)。
117
- 每个 Intent 携带:
118
- - narrative_ref — 意图叙事引用(为什么存在)
119
- - depends_on — 依赖的 Intent(拓扑序)
120
- - acceptance — 验收契约(Keeper 据此判定)
121
- - philosophy_anchors — 哲学锚点(引用哪些哲学原则)
122
- - status — 状态(pending|in_progress|completed|blocked|needs_review)
123
- - verification_method — 验证方式(L1 静态|L2 运行时|L3 人类反馈,可选)
124
-
125
- 相关命令:
126
- - \`loom intent next\` — 下一个可执行 Intent
127
- - \`loom intent get <id>\` — Intent 详情
128
- - \`loom intent narrative <id>\` — 意图叙事
129
- - \`loom intent trace <id>\` — 完整追溯链
130
- - \`loom intent reverse-dep <id>\` — 谁依赖这个 Intent
131
-
132
- ## Intent Map
133
-
134
- 所有 Intent 的依赖图(JSON)。Architect 绘制,定义拓扑序和依赖关系。
135
- 必须是 DAG(有向无环图),不能有循环依赖。
136
-
137
- 相关命令:
138
- - \`loom intent validate\` — 校验结构 + 依赖一致性
139
- - \`loom intent graph\` — Mermaid 依赖图
140
- - \`loom intent status\` — 进度概览
141
-
142
- ## Intent Loop
143
-
144
- 核心循环:Keeper 选 Intent → Forge 实现 → Keeper 验证 → 闭合或修正。
145
- 每个 Intent 独立走一圈。详细流程见 \`loom help loop\`。
146
-
147
- ## Keeper
148
-
149
- 独立验证子代理——不继承 Forge 的实现上下文,从磁盘重新加载意图和契约。
150
- 判定四维度:意图忠实度 / 哲学一致性 / 底线合规 / 验收达成。
151
- 判定结果:passed / deviated / blocked / pending_human。
152
-
153
- ## 底线
154
-
155
- 不可妥协的约束(BASELINE.md 5 条 + 项目特定底线)。
156
- 角色激活时强制加载,哲学不能覆盖。违反底线必须立即停止。
157
-
158
- ## 验证记录
159
-
160
- Keeper 每次验证写入一条记录(追加模式),包含:
161
- - verdict(passed/deviated/blocked/pending_human)
162
- - 四维度判定
163
- - 证据
164
- - 偏离说明(如果 deviated)
165
-
166
- deviated 连续 3 轮升级 blocked。pending_human 默认 7 天超时升级 blocked。
167
-
168
- 相关命令:
169
- - \`loom verify contract <id>\` — 获取验收契约
170
- - \`loom verify write --json-file <path>\` — 写入验证记录
171
- - \`loom verify history <id>\` — 验证历史
172
- - \`loom verify pending\` — 待验证的 Intent`,
173
-
174
- loop: `# Intent Loop 详细流程
175
-
176
- 每个 Intent 独立走一圈。Loop 终止条件:所有 Intent 为 completed。
177
-
178
- ## Step 1:Keeper 选 Intent
179
-
180
- \`\`\`bash
181
- loom intent next # 返回下一个可执行 Intent(pending 且依赖都 completed)
182
- loom context # 当前状态摘要(进度+下一步+风险)
183
- \`\`\`
184
-
185
- 如果没有可执行的 Intent:
186
- - 全部 completed → 项目阶段完成
187
- - 有 blocked → 需要人工介入
188
- - 有 in_progress 但无验证记录 → 可能上次中断,跑 \`loom doctor\` 诊断
189
-
190
- ## Step 2:更新状态
191
-
192
- \`\`\`bash
193
- loom intent update <id> --status in_progress
194
- \`\`\`
195
-
196
- ## Step 3:Forge 实现
197
-
198
- \`\`\`bash
199
- loom activate forge
200
- \`\`\`
201
-
202
- Forge 加载:意图叙事 + 哲学锚点 + 验收契约,在约束下自主实现代码。
203
- 辅助命令:
204
- - \`loom intent narrative <id>\` — 读意图叙事
205
- - \`loom intent trace <id>\` — 完整追溯链(含哲学锚点内容)
206
- - \`loom verify contract <id>\` — 读验收契约
207
- - \`loom philosophy get <anchor>\` — 读哲学原则
208
-
209
- ## Step 4:Keeper 验证
210
-
211
- \`\`\`bash
212
- loom activate keeper
213
- loom verify contract <id> # 重新加载验收契约
214
- \`\`\`
215
-
216
- Keeper 独立验证四维度:
217
- 1. 意图忠实度 — 实现是否忠于原始意图叙事
218
- 2. 哲学一致性 — 实现是否符合哲学原则
219
- 3. 底线合规 — 是否违反 BASELINE
220
- 4. 验收达成 — 是否满足验收契约
221
-
222
- 写入验证记录:
223
- \`\`\`bash
224
- loom verify write --json-file verification.json
225
- \`\`\`
226
-
227
- 验证记录格式:
228
- \`\`\`json
229
- {
230
- "intent_id": "INT-001",
231
- "round": 1,
232
- "verdict": "passed",
233
- "dimensions": {
234
- "intent_fidelity": "passed",
235
- "philosophy_consistency": "passed",
236
- "baseline_compliance": "passed",
237
- "acceptance_achievement": "passed"
238
- },
239
- "evidence": "具体证据描述"
15
+ /** topic 列表(从 cli/help/ 目录扫描) */
16
+ export function listHelpTopics() {
17
+ if (!existsSync(HELP_DIR)) return [];
18
+ return readdirSync(HELP_DIR)
19
+ .filter((f) => f.endsWith('.md'))
20
+ .map((f) => f.replace('.md', ''))
21
+ .sort();
240
22
  }
241
- \`\`\`
242
-
243
- ## Step 5:根据判定结果
244
-
245
- | verdict | 处理 |
246
- |---|---|
247
- | passed | \`loom intent update <id> --status completed\`,回到 Step 1 |
248
- | deviated | 与 Forge 对话修正,重新实现重新验证。连续 3 轮升级 blocked |
249
- | blocked | \`loom intent update <id> --status blocked\`,停下报告用户 |
250
- | pending_human | 等用户补充判定(L3 人类反馈,如游戏手感)。7 天超时升级 blocked |
251
-
252
- ## 变更回流
253
-
254
- 如果 Forge 发现验收契约不合理、或 Architect 的设计需要调整:
255
- 1. Keeper 评估变更范围(微调 vs 结构性变更)
256
- 2. 微调(验收措辞、验证方式)→ Keeper 直接改
257
- 3. 结构性变更(增减 Intent、改依赖)→ 重新激活 Architect
258
- 4. 受影响的已完成 Intent 标记为 needs_review
259
-
260
- 详细规则见 .loom/v{N}/ 下的 INTENT_LOOP.md。`,
261
-
262
- version: `# 版本演进指南
263
-
264
- LOOM 用 .loom/v{N}/ 目录支持多版本共存与演进。
265
-
266
- ## 什么时候升级版本
267
-
268
- | 变更类型 | 判定标准 | 处理方式 |
269
- |---|---|---|
270
- | Minor | 不改哲学前提、不改愿景北极星、不改架构边界 | 当前版本内改(变更回流机制) |
271
- | Major | 哲学前提变了、愿景北极星变了、架构边界变了 | 创建新版本 |
272
-
273
- 判定由用户 + Agent 对话完成,CLI 不做决策。
274
-
275
- ## Major 升级流程
276
-
277
- \`\`\`bash
278
- # 1. 创建新版本(空目录 + 模板,自动切换为当前)
279
- loom version new
280
-
281
- # 2. 看看旧版本有什么(Agent 决定参考什么)
282
- loom version diff v1 v2
283
-
284
- # 3. Weaver 读旧哲学,织造新哲学
285
- loom activate weaver
286
- # → 必须读 .loom/v1/00_PHILOSOPHY/,记录"相对 v1 变了什么"
287
-
288
- # 4. Visionary 读旧愿景,定义新愿景
289
- loom activate visionary
290
- # → 必须读 .loom/v1/01_VISION.md
291
-
292
- # 5. Architect 读旧架构,设计新架构
293
- loom activate architect
294
- # → 必须读 .loom/v1/02_ARCHITECTURE.md + 04_INTENT_MAP.json
295
-
296
- # 6. 进入新版本的 Intent Loop
297
- \`\`\`
298
-
299
- ## 关键设计
300
-
301
- - **空目录 + 模板**:\`loom version new\` 不自动复制旧版本内容。强制重新思考——参考 ≠ 复制。
302
- - **旧版本只读**:当前指针指向的版本是当前真相,旧版本保留作历史参考。
303
- - **Intent ID 重新编号**:v2 的 INT-001 和 v1 的 INT-001 没有关系。追溯靠 Git history 和 \`loom version diff\`。
304
-
305
- ## 版本管理命令
306
-
307
- \`\`\`bash
308
- loom version list # 列出所有版本(* 标记当前)
309
- loom version current # 显示当前版本
310
- loom version new # 创建 v{N+1} + 自动切换
311
- loom version use <v> # 切换当前版本
312
- loom version diff <v1> <v2> # 对比文件差异
313
- \`\`\`
314
-
315
- ## 切换回旧版本
316
-
317
- \`\`\`bash
318
- loom version use v1 # 切回 v1 查看历史
319
- loom intent trace <id> # 在 v1 中追溯 Intent 历史
320
- loom version use v2 # 切回 v2 继续
321
- \`\`\``,
322
-
323
- doctor: `# 诊断与恢复指南
324
-
325
- ## 健康检查
326
-
327
- \`\`\`bash
328
- loom doctor
329
- \`\`\`
330
-
331
- 检测 6 类问题:
332
-
333
- | 问题类型 | 严重度 | 说明 |
334
- |---|---|---|
335
- | cycle | fatal | 循环依赖(Intent Map 有环) |
336
- | orphan_philosophy_ref | high | 哲学锚点指向不存在的文件 |
337
- | orphan_dependency | high | depends_on 引用不存在的 Intent |
338
- | completed_no_record | high | completed 但无验证记录 |
339
- | completed_depends_blocked | high | completed 依赖 blocked 的 Intent |
340
- | in_progress_no_record | medium | in_progress 但无验证记录(可能中断) |
341
- | zombie | medium | in_progress/blocked 超过 7 天无活动 |
342
-
343
- ## 上下文摘要
344
-
345
- \`\`\`bash
346
- loom context
347
- \`\`\`
348
-
349
- 一条命令获取:进度 + 下一个 Intent + 待验证 + 不一致项 + 风险。
350
- Agent 重启后先跑这个,快速知道"我在哪、接下来做什么"。
351
-
352
- ## 崩溃恢复
353
-
354
- ### Forge 崩溃(Intent 留在 in_progress)
355
-
356
- 1. 跑 \`loom doctor\` 确认哪些 Intent 状态不一致
357
- 2. 跑 \`loom context\` 看整体状态
358
- 3. 用户决定:
359
- - 继续:重新激活 Forge,从当前代码接着做
360
- - 重置:\`loom intent update <id> --status pending\`,从头来
361
-
362
- ### Intent Map 文件损坏
363
-
364
- 1. \`loom intent validate\` 会检测到格式错误
365
- 2. 从 Git 恢复(.loom/ 应纳入版本控制)
366
-
367
- ### 验证记录丢失
368
-
369
- 1. \`loom doctor\` 会检测到 completed 无记录
370
- 2. 重新验证该 Intent,或从 Git 恢复
371
-
372
- ## 追溯工具
373
-
374
- \`\`\`bash
375
- # Intent 完整追溯链(依赖+验证+哲学+叙事)
376
- loom intent trace <id>
377
-
378
- # 反向依赖(谁依赖这个 Intent → 变更影响评估)
379
- loom intent reverse-dep <id>
380
-
381
- # 反向哲学引用(哪些 Intent 引用这个锚点 → 哲学变更影响评估)
382
- loom intent reverse-ref <anchor>
383
- \`\`\`
384
-
385
- ## 版本控制是前提
386
-
387
- LOOM 假设项目使用 Git。所有 .loom/ 下的文件都应纳入版本控制:
388
- - 文件损坏 → 从 Git 恢复
389
- - 误操作 → 从 Git 回滚
390
- - 变更追溯 → Git log 就是审计日志
391
-
392
- LOOM 不内置备份、审计、回滚——这些是版本控制的职责。`,
393
- };
394
23
 
395
24
  /**
396
- * 获取指定 topic 的指南内容。
397
- * @param {string} topic
398
- * @returns {string|null}
25
+ * 获取某个 topic 的帮助内容。
26
+ * @param {string} topic — topic 名(如 workflow / concepts / loop / version / doctor)
27
+ * @returns {string} 帮助内容(MD 格式)
28
+ * @throws {Error} topic 不存在时抛错
399
29
  */
400
30
  export function getHelpTopic(topic) {
401
- return TOPICS[topic] ?? null;
402
- }
403
-
404
- /**
405
- * 列出所有可用 topic
406
- * @returns {string[]}
407
- */
408
- export function listHelpTopics() {
409
- return Object.keys(TOPICS);
31
+ if (!topic) {
32
+ const topics = listHelpTopics();
33
+ throw new Error(`请指定 topic。可用: ${topics.join(', ')}`);
34
+ }
35
+ const filePath = join(HELP_DIR, `${topic}.md`);
36
+ if (!existsSync(filePath)) {
37
+ const topics = listHelpTopics();
38
+ throw new Error(`未知 topic: ${topic}\n可用: ${topics.join(', ')}`);
39
+ }
40
+ return readFileSync(filePath, 'utf-8');
410
41
  }
package/cli/src/init.js CHANGED
@@ -4,17 +4,10 @@
4
4
  import { mkdirSync, existsSync, copyFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';
5
5
  import { join, dirname, resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
+ import { getLoomRoot } from './shared/paths.js';
7
8
 
8
9
  const __dirname = dirname(fileURLToPath(import.meta.url));
9
10
 
10
- /**
11
- * 获取 LOOM 框架根目录(cli/src 的上上级)
12
- */
13
- function getLoomRoot() {
14
- // cli/src/init.js -> cli/src -> cli -> LOOM root
15
- return resolve(__dirname, '..', '..');
16
- }
17
-
18
11
  /**
19
12
  * 递归复制目录
20
13
  */
@@ -71,6 +64,47 @@ export function createVersionStructure(projectDir, version) {
71
64
  ['templates/VISION_TEMPLATE.md', `.loom/${v}/01_VISION.md`],
72
65
  ];
73
66
 
67
+ // 02_ARCHITECTURE.md 和 05_VERIFICATION.md 没有"填空模板"——
68
+ // 它们由 Architect 自由设计。但 init 时 scaffold 空文件 + LOOM_TEMPLATE 标记,
69
+ // 让 guide 能检测到"还没设计",且 Agent 知道该往哪写。
70
+ const scaffoldFiles = [
71
+ [`.loom/${v}/02_ARCHITECTURE.md`, [
72
+ '<!-- LOOM_TEMPLATE -->',
73
+ `# 02_ARCHITECTURE.md — 系统架构`,
74
+ '',
75
+ `> 版本: ${v}`,
76
+ '> 产出自: Architect 角色激活',
77
+ '',
78
+ 'Architect 设计系统架构后替换本文件。',
79
+ '内容要求:模块边界、接口契约、目录结构、依赖关系。',
80
+ '设计完成后删除顶部的 `<!-- LOOM_TEMPLATE -->` 标记。',
81
+ '',
82
+ ].join('\n')],
83
+ [`.loom/${v}/05_VERIFICATION.md`, [
84
+ '<!-- LOOM_TEMPLATE -->',
85
+ `# 05_VERIFICATION.md — 验证契约`,
86
+ '',
87
+ `> 版本: ${v}`,
88
+ '> 产出自: Architect 角色激活',
89
+ '',
90
+ 'Architect 设计验证契约后替换本文件。',
91
+ '内容要求:每个 Intent 的功能承诺 + 防御承诺 + Pre-Mortem 推演。',
92
+ 'Intent Map 的 acceptance 字段可引用本文件章节(如 "see 05_VERIFICATION.md#int-001")。',
93
+ '设计完成后删除顶部的 `<!-- LOOM_TEMPLATE -->` 标记。',
94
+ '',
95
+ ].join('\n')],
96
+ ];
97
+
98
+ for (const [dst, content] of scaffoldFiles) {
99
+ const dstPath = join(cwd, dst);
100
+ if (existsSync(dstPath)) {
101
+ skipped.push(dst);
102
+ } else {
103
+ writeFileSync(dstPath, content, 'utf-8');
104
+ created.push(dst);
105
+ }
106
+ }
107
+
74
108
  for (const [src, dst] of templates) {
75
109
  const srcPath = join(loomRoot, src);
76
110
  const dstPath = join(cwd, dst);