@namewta/speculo 0.6.0 → 0.7.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.
Files changed (116) hide show
  1. package/README.md +11 -11
  2. package/dist/src/cli.js +36 -128
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/index.d.ts +2 -4
  5. package/dist/src/index.js +173 -151
  6. package/dist/src/index.js.map +1 -1
  7. package/package.json +6 -4
  8. package/template/.speculo/README.md +4 -0
  9. package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +133 -141
  10. package/template/canonical/canonical-specdev-goal-plan.md +394 -377
  11. package/template/canonical/canonical-specdev-grill-with-docs.md +241 -178
  12. package/template/canonical/canonical-specdev-spec.md +132 -122
  13. package/template/canonical/canonical-specdev-tickets.md +176 -156
  14. package/template/canonical/canonical-specdev-wayfinder.md +106 -108
  15. package/template/commands/archive-and-consolidate.md +10 -8
  16. package/template/commands/handoff.md +2 -0
  17. package/template/commands/retro.md +3 -3
  18. package/template/commands/status.md +5 -4
  19. package/template/skills/archive-and-consolidate/SKILL.md +5 -9
  20. package/template/skills/archive-and-consolidate/assets/archive-plan-template.md +1 -1
  21. package/template/skills/archive-and-consolidate/references/archive-rules.md +4 -4
  22. package/template/skills/archive-and-consolidate/references/consolidation-rules.md +7 -8
  23. package/template/skills/archive-and-consolidate/references/knowledge-graduation.md +5 -2
  24. package/template/skills/github-npm-ops/SKILL.md +4 -2
  25. package/template/skills/github-npm-ops/references/issue-transport.md +26 -0
  26. package/template/skills/github-npm-ops/references/preflight-checklist.md +1 -1
  27. package/template/skills/github-npm-ops/scripts/issue-transport.mjs +227 -0
  28. package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +31 -145
  29. package/template/workflows/specdev/A-archive-and-consolidate/consolidation-interview.md +4 -6
  30. package/template/workflows/specdev/C-code-review/C-code-review.md +42 -0
  31. package/template/workflows/specdev/C-code-review/code-review-template.md +42 -0
  32. package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +45 -48
  33. package/template/workflows/specdev/D-diagnose-bugs/diagnosis-template.md +44 -40
  34. package/template/workflows/specdev/D-diagnose-bugs/feedback-loop.md +41 -0
  35. package/template/workflows/specdev/D-diagnose-bugs/hypothesis-and-instrumentation.md +32 -0
  36. package/template/workflows/specdev/D-diagnose-bugs/scripts/hitl-loop.template.sh +26 -0
  37. package/template/workflows/specdev/E-engineering-cognitive-mentor/E-engineering-cognitive-mentor.md +3 -3
  38. package/template/workflows/specdev/E-engineering-cognitive-mentor/persistence-and-resume.md +5 -20
  39. package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +17 -10
  40. package/template/workflows/specdev/G-grill-with-docs/adr-format.md +31 -17
  41. package/template/workflows/specdev/G-grill-with-docs/context-format.md +9 -29
  42. package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +10 -5
  43. package/template/workflows/specdev/G-grill-with-docs/stakeholder-questionnaire.md +45 -0
  44. package/template/workflows/specdev/I-implement/I-implement.md +29 -14
  45. package/template/workflows/specdev/I-implement/delegated-evidence-template.md +11 -0
  46. package/template/workflows/specdev/I-implement/evidence-template.md +24 -10
  47. package/template/workflows/specdev/I-implement/execution-preflight.md +4 -4
  48. package/template/workflows/specdev/I-implement/merge-conflict-protocol.md +20 -0
  49. package/template/workflows/specdev/I-implement/tdd-mocking.md +19 -0
  50. package/template/workflows/specdev/I-implement/tdd-rules.md +14 -12
  51. package/template/workflows/specdev/I-implement/tdd-test-design.md +25 -0
  52. package/template/workflows/specdev/I-init-setup/I-init-setup.md +12 -9
  53. package/template/workflows/specdev/I-init-setup/config-template.json +1 -1
  54. package/template/workflows/specdev/I-init-setup/domain-layout-template.md +2 -2
  55. package/template/workflows/specdev/I-init-setup/status-template.json +2 -3
  56. package/template/workflows/specdev/I-init-setup/tracking-template.md +3 -0
  57. package/template/workflows/specdev/INDEX.md +64 -26
  58. package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +48 -38
  59. package/template/workflows/specdev/P-goal-plan/completion-control.md +19 -53
  60. package/template/workflows/specdev/P-goal-plan/delegated-execution-template.md +33 -0
  61. package/template/workflows/specdev/P-goal-plan/delegated-execution.md +53 -0
  62. package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +9 -40
  63. package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +16 -68
  64. package/template/workflows/specdev/P-goal-plan/planning-modes.md +20 -48
  65. package/template/workflows/specdev/P-prototype/P-prototype.md +46 -0
  66. package/template/workflows/specdev/P-prototype/logic-prototype.md +24 -0
  67. package/template/workflows/specdev/P-prototype/prototype-record-template.md +46 -0
  68. package/template/workflows/specdev/P-prototype/ui-prototype.md +21 -0
  69. package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +1 -1
  70. package/template/workflows/specdev/S-spec/S-spec.md +2 -1
  71. package/template/workflows/specdev/T-tickets/T-tickets.md +3 -2
  72. package/template/workflows/specdev/T-tickets/ticket-readiness.md +1 -1
  73. package/template/workflows/specdev/T-tickets/ticket-template.md +1 -1
  74. package/template/workflows/specdev/T-tickets/tickets-map-template.md +1 -1
  75. package/template/workflows/specdev/T-triage/T-triage.md +65 -26
  76. package/template/workflows/specdev/T-triage/intake-protocol.md +32 -0
  77. package/template/workflows/specdev/T-triage/reconcile-protocol.md +34 -0
  78. package/template/workflows/specdev/T-triage/source-template.md +30 -0
  79. package/template/workflows/specdev/T-triage/triage-template.md +38 -24
  80. package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +3 -1
  81. package/template/workflows/specdev/_state/status.json +2 -3
  82. package/template/workflows/specdev/common/README.md +9 -2
  83. package/template/workflows/specdev/common/rules/artifact-contract.md +20 -9
  84. package/template/workflows/specdev/common/rules/change-completion.md +33 -0
  85. package/template/workflows/specdev/common/rules/deviation-control.md +2 -2
  86. package/template/workflows/specdev/common/rules/evidence-and-verification.md +1 -1
  87. package/template/workflows/specdev/common/rules/path-ownership.md +3 -3
  88. package/template/workflows/specdev/common/schemas/change-status.schema.json +43 -0
  89. package/template/workflows/specdev/common/schemas/code-review.schema.json +22 -0
  90. package/template/workflows/specdev/common/schemas/diagnosis.schema.json +19 -0
  91. package/template/workflows/specdev/common/schemas/prototype-record.schema.json +24 -0
  92. package/template/workflows/specdev/common/schemas/source.schema.json +20 -0
  93. package/template/workflows/specdev/common/schemas/status.schema.json +20 -78
  94. package/template/workflows/specdev/common/schemas/triage.schema.json +21 -0
  95. package/template/workflows/specdev/common/skills/code-review/SKILL.md +49 -0
  96. package/template/workflows/specdev/common/skills/code-review/references/fowler-smells.md +18 -0
  97. package/template/workflows/specdev/common/skills/code-review/references/reviewer-contracts.md +13 -0
  98. package/template/workflows/specdev/common/skills/code-review/references/source-discovery.md +22 -0
  99. package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +12 -9
  100. package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +18 -13
  101. package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +8 -6
  102. package/template/workflows/specdev/common/skills/research/SKILL.md +38 -26
  103. package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +3 -5
  104. package/template/workflows/specdev/common/tools/README.md +3 -0
  105. package/template/workflows/specdev/common/tools/validate-specdev.mjs +496 -30
  106. package/dist/src/migrate.d.ts +0 -38
  107. package/dist/src/migrate.js +0 -642
  108. package/dist/src/migrate.js.map +0 -1
  109. package/dist/src/skills-mirror.d.ts +0 -38
  110. package/dist/src/skills-mirror.js +0 -160
  111. package/dist/src/skills-mirror.js.map +0 -1
  112. package/template/workflows/specdev/A-archive-and-consolidate/archive-checklist.md +0 -15
  113. package/template/workflows/specdev/A-archive-and-consolidate/knowledge-promotion-rules.md +0 -32
  114. package/template/workflows/specdev/I-implement/code-review-process.md +0 -17
  115. package/template/workflows/specdev/I-implement/tdd-examples.md +0 -14
  116. package/template/workflows/specdev/I-init-setup/status-labels-template.md +0 -55
@@ -49,7 +49,7 @@ Wayfinder 默认进行**规划**:每个 Ticket 解决一个决策,当地图
49
49
  每个 Ticket 要么是 **HITL**,与一个代表自己发言的人类一起工作;要么是 **AFK**,由 Agent 独立驱动。HITL Ticket 只能通过实时交流解决,Agent 绝不代替人类一方发言。
50
50
 
51
51
  - **Research(AFK)**:阅读文档、第三方 API 或知识库等资源,揭示某个决策等待的事实。调用 下方 `<research>` 标签。当需要当前工作目录之外的知识时使用。
52
- - **Prototype(HITL)**:制作廉价、粗糙、具体的产物提高讨论保真度——大纲、粗略尝试、桩代码或 UI/逻辑原型。将原型链接为资产;当“它应是什么样”或“怎样表现”是关键问题时使用。
52
+ - **Prototype(HITL)**:调用 “原型阶段” 回答一个 UI/逻辑问题,并把 record、临时 branch/worktree 和运行 URL 链接为 solution comment 资产;P 不实现目的地。
53
53
  - **Grilling(HITL)**:对话。调用 “设计访谈能力” 的 grilling 与 domain-modeling 能力,但本会话只关闭当前 Wayfinder Ticket。
54
54
  - **Task(HITL 或 AFK)**:在决策做出前必须完成的手动工作。它通过为决策解除阻塞赢得位置,不以交付目的地为目标。Agent 能独立驱动时使用 AFK,否则给人类精确清单。
55
55
 
@@ -101,6 +101,8 @@ Ticket label 只能是 `wayfinder:research | wayfinder:prototype | wayfinder:gri
101
101
 
102
102
  当前沿为空且“尚未明确”不再包含阻塞目的地的内容时,路径清晰:
103
103
 
104
+ 路由前使用 Speculo Node 校验器 的 `--stage wayfinder`;Ticket、claim、comment 或地图不一致时保持 blocked。
105
+
104
106
  - 需要产品或架构取舍:“设计访谈能力”;
105
107
  - 外部行为已清楚:“编写 Spec 阶段”;
106
108
  - Spec Ready、只需拆分:“拆分 Tickets 阶段”;
@@ -267,42 +269,54 @@ resolution: answered
267
269
 
268
270
  # SpecDev Research
269
271
 
270
- ## 触发
272
+ ## 输入
273
+
274
+ - `decision`:研究要支持的一个具体决定;
275
+ - `questions`:需要回答的穷尽问题集;
276
+ - `stop_condition`:何时证据已足够;
277
+ - `caller`:D、G、S、W、R、T 或 I;
278
+ - `target_artifact`:调用方拥有且将接收结果的完整 Path。
271
279
 
272
- 当外部 API、库版本、协议、法规、产品能力或最佳实践会改变设计/实现决策,且当前材料不足时使用。
280
+ 缺少 owner 或 target 时返回阻塞,不创建 `{change}/research/` 等共享 namespace。
273
281
 
274
282
  ## 流程
275
283
 
276
- 1. 写清楚要支持的具体决策和停止条件。
277
- 2. 优先官方文档、规范、源代码、论文或维护者材料;技术问题优先一手来源。
278
- 3. 核对版本、发布日期、适用环境和已知限制。
279
- 4. 区分:来源明确事实、代码库事实、推断、建议。
280
- 5. 对关键结论至少交叉验证;来源冲突时并列呈现,不强行调和。
281
- 6. 记录摘要、证据、置信度、对 ADR/Spec/Ticket 的影响和仍未知项。
282
- 7. 长期有效且经实现验证后才可由 Archive 提升到永久 research。
284
+ 1. 固定问题、版本、环境和停止条件。
285
+ 2. 优先官方文档、规范、源代码、论文或维护者材料;技术问题使用一手来源。
286
+ 3. 核对发布日期、版本、适用环境、限制和已知冲突。
287
+ 4. 对每个会改变决定的实质声明就近给出来源;关键结论交叉验证,来源冲突时并列呈现。
288
+ 5. 区分来源事实、代码库事实、推断、建议和未知项。
289
+ 6. 返回一个 Markdown block,由 caller 原子写入 `target_artifact`;本 Skill 不自行写 state。
283
290
 
284
- ## 输出模板
291
+ ## 输出
285
292
 
286
293
  ```markdown
287
- # Research: <问题>
288
- - 决策用途:
289
- - 范围/版本:
290
- - 停止条件:
294
+ ## Research: <问题>
295
+ - Decision / target:
296
+ - Scope / version:
297
+ - Stop condition:
291
298
 
292
- ## Findings
293
299
  ### R-001
294
- - 结论:
295
- - 类型:官方事实 / 代码事实 / 推断 / 建议
296
- - 来源:
297
- - 置信度:high / medium / low
298
- - 适用限制:
299
- - 对工件影响:
300
-
301
- ## Conflicts and Unknowns
302
- ## Recommendation
300
+ - Claim:
301
+ - Type: official fact / code fact / inference / recommendation
302
+ - Source:
303
+ - Confidence:
304
+ - Limits:
305
+ - Artifact impact:
306
+
307
+ ### Conflicts and Unknowns
308
+ ### Recommendation
303
309
  ```
304
310
 
305
- 不得长篇复制受版权保护的来源;使用短引文和自己的准确摘要。
311
+ 不得长篇复制受版权保护内容。长期有效且经实现验证的结论只能由 Archive 从调用方工件提升到永久 research。
312
+
313
+ ## 完成标准
314
+
315
+ - 每个输入问题有答案或明确未知;
316
+ - 每个实质声明就近引用一手来源;
317
+ - 版本、限制、冲突和置信度已记录;
318
+ - 结果有唯一 owning artifact;
319
+ - 本 Skill 没有创建自己的 state 路径。
306
320
 
307
321
  </research>
308
322
 
@@ -321,7 +335,7 @@ resolution: answered
321
335
  "execution": {
322
336
  "max_parallel": 3,
323
337
  "deep_ticket_human_approval": true,
324
- "shared_path_owner": "lead"
338
+ "shared_path_owner": "explicit"
325
339
  },
326
340
  "verification": {
327
341
  "test": null,
@@ -404,11 +418,10 @@ resolution: answered
404
418
 
405
419
  ```json
406
420
  {
407
- "schema_version": 3,
421
+ "schema_version": 4,
408
422
  "workflow": "specdev",
409
423
  "active": [],
410
- "work_history": [],
411
- "completed": []
424
+ "archived": []
412
425
  }
413
426
  ```
414
427
 
@@ -419,19 +432,18 @@ resolution: answered
419
432
  ```json
420
433
  {
421
434
  "$schema": "https://json-schema.org/draft/2020-12/schema",
422
- "$id": "urn:speculo:specdev:status:v3",
435
+ "$id": "urn:speculo:specdev:status:v4",
423
436
  "title": "SpecDev Global Status",
424
437
  "type": "object",
425
438
  "required": [
426
439
  "schema_version",
427
440
  "workflow",
428
441
  "active",
429
- "work_history",
430
- "completed"
442
+ "archived"
431
443
  ],
432
444
  "properties": {
433
445
  "schema_version": {
434
- "const": 3
446
+ "const": 4
435
447
  },
436
448
  "workflow": {
437
449
  "const": "specdev"
@@ -443,30 +455,27 @@ resolution: answered
443
455
  "required": [
444
456
  "change",
445
457
  "current_work",
446
- "works_run",
447
- "result"
458
+ "works_run"
448
459
  ],
449
460
  "properties": {
450
461
  "change": {
451
- "type": "string"
462
+ "type": "string",
463
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
452
464
  },
453
465
  "current_work": {
454
466
  "type": [
455
467
  "string",
456
468
  "null"
457
- ]
469
+ ],
470
+ "pattern": "^specdev/"
458
471
  },
459
472
  "works_run": {
460
473
  "type": "array",
461
474
  "items": {
462
- "type": "string"
463
- }
464
- },
465
- "result": {
466
- "type": [
467
- "string",
468
- "null"
469
- ]
475
+ "type": "string",
476
+ "pattern": "^specdev/"
477
+ },
478
+ "uniqueItems": true
470
479
  },
471
480
  "claimed_investigations": {
472
481
  "type": "array",
@@ -494,77 +503,23 @@ resolution: answered
494
503
  "type": "string"
495
504
  }
496
505
  },
497
- "additionalProperties": true
506
+ "additionalProperties": false
498
507
  }
499
508
  }
500
509
  },
501
- "additionalProperties": true
510
+ "additionalProperties": false
502
511
  }
503
512
  },
504
- "work_history": {
505
- "type": "array",
506
- "items": {
507
- "type": "object",
508
- "required": [
509
- "change",
510
- "work_id",
511
- "started_at",
512
- "completed_at",
513
- "result"
514
- ],
515
- "properties": {
516
- "change": {
517
- "type": "string"
518
- },
519
- "work_id": {
520
- "type": "string",
521
- "pattern": "^specdev/"
522
- },
523
- "started_at": {
524
- "type": "string"
525
- },
526
- "completed_at": {
527
- "type": [
528
- "string",
529
- "null"
530
- ]
531
- },
532
- "result": {
533
- "type": [
534
- "string",
535
- "null"
536
- ]
537
- }
538
- },
539
- "additionalProperties": true
540
- }
541
- },
542
- "completed": {
513
+ "archived": {
543
514
  "type": "array",
544
515
  "items": {
545
- "type": "object",
546
- "required": [
547
- "change",
548
- "archived_at",
549
- "archive_path"
550
- ],
551
- "properties": {
552
- "change": {
553
- "type": "string"
554
- },
555
- "archived_at": {
556
- "type": "string"
557
- },
558
- "archive_path": {
559
- "type": "string",
560
- "pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
561
- }
562
- },
563
- "additionalProperties": true
564
- }
516
+ "type": "string",
517
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
518
+ },
519
+ "uniqueItems": true
565
520
  }
566
521
  },
567
- "additionalProperties": true
522
+ "additionalProperties": false
568
523
  }
569
524
  ```
570
525
 
@@ -742,6 +697,49 @@ resolution: answered
742
697
  }
743
698
  },
744
699
  "allOf": [
700
+ {
701
+ "if": {
702
+ "properties": {
703
+ "worktrees": {
704
+ "contains": {
705
+ "properties": {
706
+ "provider": {
707
+ "const": "git"
708
+ }
709
+ },
710
+ "required": [
711
+ "provider"
712
+ ]
713
+ }
714
+ }
715
+ }
716
+ },
717
+ "then": {
718
+ "properties": {
719
+ "worktrees": {
720
+ "items": {
721
+ "if": {
722
+ "properties": {
723
+ "provider": {
724
+ "const": "git"
725
+ }
726
+ },
727
+ "required": [
728
+ "provider"
729
+ ]
730
+ },
731
+ "then": {
732
+ "properties": {
733
+ "workspace_ref": {
734
+ "pattern": "^specdev-worktree/T-[0-9]{2,}$"
735
+ }
736
+ }
737
+ }
738
+ }
739
+ }
740
+ }
741
+ }
742
+ },
745
743
  {
746
744
  "if": {
747
745
  "properties": {
@@ -24,10 +24,11 @@ keywords: [archive, consolidate, knowledge, cleanup, adr, 归档, 知识合并,
24
24
 
25
25
  1. 读取 `../skills/archive-and-consolidate/SKILL.md`,执行路径解析(Step 0),解析 `speculo/config.json`(不存在时静默降级)。
26
26
  2. 选择一个 `change_status: completed` 的 change。
27
- 3. 执行 Step 1-5:扫描 stores、扫描 change、生成归档计划、生成合并计划、生成清理候选。
28
- 4. 默认 dry-run:将完整计划写入报告文件,展示摘要并等待用户显式确认。
29
- 5. 确认后以 mode=`confirmed` 执行 Step 7-8:归档移动、合并写入、清理、重读验证。
30
- 6. 执行结果作为补遗追加到原报告。
27
+ 3. 目标为 SpecDev 时先读取其 `common/rules/change-completion.md` `triage.md`:完成门必须通过,`external_action` 必须为 `closed | waived | not-applicable`;pending/failed 返回 Triage,不生成可执行归档计划。
28
+ 4. 执行 Step 1-5:扫描 stores、扫描 change、生成归档计划、生成合并计划、生成清理候选。
29
+ 5. 默认 dry-run:将完整计划写入报告文件,展示摘要并等待用户显式确认。
30
+ 6. 确认后以 mode=`confirmed` 执行 Step 7-8:归档移动、合并写入、清理、重读验证。
31
+ 7. 执行结果作为补遗追加到原报告。
31
32
 
32
33
  ### archive-batch
33
34
 
@@ -35,10 +36,11 @@ keywords: [archive, consolidate, knowledge, cleanup, adr, 归档, 知识合并,
35
36
 
36
37
  1. 读取 `../skills/archive-and-consolidate/SKILL.md`,执行路径解析。
37
38
  2. 扫描目标 workflow 下所有 `change_status: completed` 的 change。不接受 active 或 broken 状态。
38
- 3. 执行 Step 1-5:扫描 stores、逐 change 扫描、批量预检、合并计划、清理候选。
39
- 4. 批量原子性:任一预检失败阻塞整批。
40
- 5. 默认 dry-run:将完整计划写入报告文件,展示摘要并等待用户显式确认。
41
- 6. 确认后逐项执行:归档移动 → 合并写入 → 清理 → 重读验证。失败时报告已完成/未完成清单。
39
+ 3. SpecDev 候选逐个通过 change completion external reconcile 门;任一 pending/failed 阻塞整批。
40
+ 4. 执行 Step 1-5:扫描 stores、逐 change 扫描、批量预检、合并计划、清理候选。
41
+ 5. 批量原子性:任一预检失败阻塞整批。
42
+ 6. 默认 dry-run:将完整计划写入报告文件,展示摘要并等待用户显式确认。
43
+ 7. 确认后逐项执行:归档移动 → 合并写入 → 清理 → 重读验证。失败时报告已完成/未完成清单。
42
44
 
43
45
  ## 完成标准
44
46
 
@@ -35,6 +35,8 @@ speculo/.speculo/commands/handoff/<YYYY-MM-DD>-<scope>-<topic>[-NN].md
35
35
 
36
36
  如果用户传入了参数,将其视为对下一个会话重点内容的描述,并据此定制文档。
37
37
 
38
+ 交接范围包含 SpecDev change 时,引用该 change 的 `source.md`、`triage.md`、`.status.json` 和当前 owning 工件,不复制正文。若 `external_action` 为 `pending-close` 或 `close-failed`,必须记录准确远程 locator、已完成步骤、授权状态和恢复入口 `T-triage`;不得把待关闭误报为本地未完成。
39
+
38
40
  ## 路径引用规范
39
41
 
40
42
  文档中所有文件/文件夹引用必须使用**项目根目录**的相对路径。
@@ -21,16 +21,16 @@ keywords: [retro, 复盘, 痛点, feedback, issue, 优化, 反馈]
21
21
  ## 调用的 skills
22
22
 
23
23
  - `../skills/speculo-retro/SKILL.md` — 复盘 Speculo 使用痛点、深度分析并产出去重/分级/根因化的 issue-ready 提案时读取。
24
- - `../skills/github-npm-ops/SKILL.md` — 需要用 `gh` 去重(`gh issue list --search`)与创建 issue(`gh issue create`)时读取,其 `references/issue-pr-triage.md` 提供检索、标签体系与命令模板。
24
+ - `../skills/github-npm-ops/SKILL.md` — `issue-search` 去重、以 `issue-create` dry-run/confirmed 创建 Issue;该能力不成为任何 workflow tracker。
25
25
 
26
26
  ## 执行步骤
27
27
 
28
28
  1. 读取 `../skills/speculo-retro/SKILL.md`,解析 `speculo/config.json` 与 `speculo/.speculo/workspace.json`(不存在时以默认值静默降级),采集对话、command 报告、change 状态以及各 `INDEX.md` 声明的知识 store。
29
29
  2. 用该 skill 产出规范化复盘结论:去重、分级、根因化的 issue-ready 提案清单,附丢弃/合并说明与每条处置建议。
30
30
  3. 创建 command 专属目录 `speculo/.speculo/commands/retro/`,把复盘结论写入带 scope 的 Markdown 报告。
31
- 4. **去重**:读取 `../skills/github-npm-ops/SKILL.md` 的 `references/issue-pr-triage.md`,对每条 `disposition: file-issue` 的提案用 `gh issue list --repo NAMEWTA/Speculo --search "<关键词>" --state all --limit 20` 检索;命中语义重复的默认跳过并记录 `dup_of`,仅当用户明确要求才补提。
31
+ 4. **去重**:调用 `github-npm-ops` 的 `operation=issue-search`,对每条 `disposition: file-issue` 检索;命中语义重复的默认跳过并记录 `dup_of`,仅当用户明确要求才补提。
32
32
  5. **外部写操作边界**:向用户展示将要创建的 issue 清单(标题、类型/优先级标签、正文摘要、目标仓库 `NAMEWTA/Speculo`)与去重结果,等待用户明确确认。没有确认时只输出计划,不调用 `gh`。
33
- 6. 用户确认后,按优先级倒序逐条执行 `gh issue create --repo NAMEWTA/Speculo --title "<title>" --body "<body>" --label "<type>,<priority>[,<area>]"`(多行正文可用 `--body-file` 指向不保留的临时文件)。任一条失败时停止后续创建,报告已建/未建清单,不重复创建同一条。
33
+ 6. 用户确认后,按优先级倒序调用 `github-npm-ops` 的 `operation=issue-create` confirmed 分支。任一条失败时停止后续创建,报告已建/未建清单,不重复创建同一条。
34
34
  7. 把每条提案的最终 issue 编号/URL 回写进本次报告的「提交结果」小节;返回报告路径、3-5 条复盘摘要和已创建 issue 链接清单。
35
35
 
36
36
  ## 产物模板
@@ -10,7 +10,8 @@ keywords: [status, 状态, active, blocked]
10
10
 
11
11
  1. 读取 `speculo/.speculo/workspace.json`,解析 `speculo/config.json`(不存在时以默认值静默降级),获取全部已安装 workflow/state 根。
12
12
  2. 扫描 `speculo/workflows/*/INDEX.md`,得到已安装 workflow ids。
13
- 3. 对每个 id 读取 `speculo/.speculo/<workflow>/status.json`,再读取 `changes/<change>/.status.json`。
14
- 4. 报告 active 数量、各 change 的 `current_work` `works_run`、最近更新时间、停滞 change(`.status.json` 超过 14 天未更新)与 malformed 目录。
15
- 5. 报告没有 workflow 资产的孤立状态根,以及缺少状态根的已安装 workflow;不自动修复。
16
- 6. 用户要求持久化时写入 `speculo/.speculo/commands/status/<YYYY-MM-DD>-workspace-<topic>[-NN].md`,并在报告中列出本次扫描的 workflow 选择。
13
+ 3. 对每个 id 读取 `speculo/.speculo/<workflow>/status.json`。SpecDev schema v4 直接按 `active` 与 `archived` 分块;对 active 再读取 `changes/<change>/.status.json`,对 archived 按 `archive/YYYY-MM/<change>/.status.json` 定位。
14
+ 4. 报告 active 数量、各 change 的 `current_work`、去重后的 `works_run`、change 业务状态、最近更新时间、调查 claims,以及停滞 change(`.status.json` 超过 14 天未更新)。SpecDev change 存在 `triage.md` 时同时读取 `external_action`,把 `pending-close`、`close-failed` 和可归档状态分开显示;不执行远程动作。
15
+ 5. 报告 archived 数量和名称;预期归档目录或归档 `.status.json` 缺失、active/archived 重叠、重复名称、未知 schema 和 malformed 目录均列为异常,不自动修复。
16
+ 6. 报告没有 workflow 资产的孤立状态根,以及缺少状态根的已安装 workflow;不自动修复。
17
+ 7. 用户要求持久化时写入 `speculo/.speculo/commands/status/<YYYY-MM-DD>-workspace-<topic>[-NN].md`,并在报告中列出本次扫描的 workflow 选择。
@@ -4,7 +4,7 @@ type: skill
4
4
  name: Archive and Consolidate
5
5
  description: >
6
6
  对 workflow 下已完成 change 执行归档移动,从归档 change 中提取知识并合并到 workflow
7
- INDEX.md 声明的 _state/ 知识 store(adr/、context/ 等),
7
+ INDEX.md 声明的 state 知识 store(adr/、context/ 等),
8
8
  然后审计并清理过时/重复知识。默认 dry-run 返回可确认计划,所有破坏性动作需用户显式确认后执行。
9
9
  触发场景:workflow 中存在 change_status: completed 的 change 需要归档收尾、知识沉淀、清理过时内容时。
10
10
  ---
@@ -43,7 +43,7 @@ description: >
43
43
  - 识别操作型路径:`status.json`、`changes/`、`archive/`。
44
44
  - 识别知识型 store:`adr/`、`context/` 及任何标注为"永久"的目录(其内容在 change 完成后提升至此)。
45
45
  - 每个路径解析为完整的项目相对路径。
46
- 5. 派生固定路径:`changes_root = state_root/changes`,`archive_root = state_root/archive`,`commands_root = state_root/commands`。
46
+ 5. 派生固定路径:`changes_root = state_root/changes`、`archive_root = state_root/archive`;`commands_root` 从公共 `{roots.state}/commands` 解析,不放进 workflow 私有 state root。
47
47
  6. 读取 `speculo/config.json`(若存在);不存在时静默降级为默认值(`language: "en"`、`confirm_before_external_write: true`)。
48
48
  7. 对每个已解析路径执行真实路径包含检查;符号链接逃逸或不存在的静态引用阻塞。
49
49
  8. 读取 `status.json`;扫描 changes 时校验 change 名称格式 `^\d{4}-\d{2}-\d{2}-[a-z0-9]+(-[a-z0-9]+)*$`,无日期前缀的历史 change 标注遗留但不阻塞。
@@ -64,11 +64,7 @@ description: >
64
64
 
65
65
  1. 枚举 `changes_root/` 下所有目录,读取各自的 `.status.json`。
66
66
  2. 筛选 `change_status: completed` 的 change。
67
- 3. 对每个候选 change 收集:
68
- - `.status.json`(验证可解析、状态字段)
69
- - `completion-summary.md`(若存在)
70
- - `completion-verification.md`(若存在)
71
- - 知识产物:ADR.md、LOG.md、CONTEXT.md 及自定义产物
67
+ 3. 对每个候选 change 收集 `.status.json`,以及实际存在的 source、triage、diagnosis、Spec、Tickets Map、Goal Plan、Evidence、reviews、prototypes、questionnaires、ADR、LOG、CONTEXT 和 workflow 自定义产物;不存在的可选项静默跳过。
72
68
  4. `archive-single` 模式用户选择一个;`archive-batch` 全选所有 completed。
73
69
 
74
70
  ### Step 3:生成归档计划
@@ -127,7 +123,7 @@ description: >
127
123
 
128
124
  1. **重新验证**:路径包含检查、预检重跑(确认计划生成后无新 change 插入)、store 存在性重验。
129
125
  2. **执行顺序**:
130
- a. **归档移动**(原子批处理):创建月目录 → 移动 change 目录 → 更新 `.status.json` → `status.json` 的 `active` 移除对应条目,追加到 `completed` 数组
126
+ a. **归档移动**(原子批处理):创建月目录 → 移动 change 目录 → 更新归档 `.status.json` → 从全局 `status.json` 的 `active` 移除对应条目,将 change 名称去重追加到 `archived`
131
127
  b. **知识合并写入**:创建 lazy stores(如 `adr/`、`context/` 不存在则创建)→ 写入新 ADR → 合并术语到 `context/` → 标记 superseded ADR
132
128
  c. **清理**:删除已批准文件 → 合并已批准内容 → 改写已批准条目
133
129
  3. 任一步骤失败:报告已完成/失败清单,停止,不猜测成功。
@@ -136,7 +132,7 @@ description: >
136
132
 
137
133
  1. 重读源路径:归档 change 必须不存在于 `changes_root/`。
138
134
  2. 重读目标路径:归档 change 完整存在于 `archive_root/<YYYY-MM>/`,知识 store 内容正确。
139
- 3. 重读 `status.json`:`active` 数组不包含已归档 change 条目,`completed` 数组已追加对应归档记录。
135
+ 3. 重读 `status.json`:`active` 数组不包含已归档 change,`archived` 数组已追加其名称,二者没有重叠。
140
136
  4. 重读归档 `.status.json`:`change_status: archived`、`archived: true`、`archive_path` 一致。
141
137
  5. 对照知识 stores:新内容存在,无不期望的修改。
142
138
  6. 任一不一致 → `blocked`,报告具体差异;全部通过 → `verified`。
@@ -27,7 +27,7 @@
27
27
  归档执行后将对 `status.json` 做如下变更:
28
28
 
29
29
  - `active` 数组移除对应 change 条目
30
- - `completed` 数组追加归档记录(`change`、`path`、`archived_at`、`archive_path`)
30
+ - `archived` 数组去重追加 change 名称;路径、时间和 promotion 明细只写归档 `.status.json`
31
31
  - 每个归档 change 的 `.status.json` 更新:`change_status: archived`, `archived: true`
32
32
 
33
33
  ## 阻塞项详情
@@ -10,7 +10,7 @@
10
10
  - `.status.json` 可解析,`change_status` 字段存在且值为 `completed`。
11
11
  - 源位于 `changes_root/<change>` 且真实存在。
12
12
  - 目标位于 `archive_root/<YYYY-MM>/<change>`(YYYY-MM 从 change 名称提取),目标目录不存在。
13
- - Workflow `status.json` 与 change 状态一致:change 条目出现在 `active` 数组中(通过 `change` 字段匹配),且 `result` 为 `"completed"`。
13
+ - Workflow `status.json` 与 change 状态一致:change 条目唯一出现在 `active` 数组中,且不在 `archived`;业务完成状态只由 change `.status.json#change_status: completed` 表达。
14
14
  - 若 worktree 模式:已合并回目标分支并清理;未合并则记录 `blocked`。
15
15
  - **任一预检失败阻塞整批操作**(批量原子性)。
16
16
 
@@ -18,7 +18,7 @@
18
18
 
19
19
  1. 创建 `archive_root/<YYYY-MM>/` 月目录(如不存在)。
20
20
  2. 将 `changes_root/<change>/` 整个目录移动到 `archive_root/<YYYY-MM>/<change>/`。使用原子移动(mv/rename),不用复制后删除。
21
- 3. 从 workflow `status.json` 的 `active` 数组中移除该 change 条目,追加归档记录到 `completed` 数组(`change`、`path`、`archived_at`、`archive_path`)。
21
+ 3. 从 workflow `status.json` 的 `active` 数组中移除该 change 条目,将 change 名称去重追加到 `archived`。全局索引不保存路径、时间、Work 或 promotion 明细。
22
22
  4. 更新已移动的 `.status.json`:
23
23
  - `change_status: archived`
24
24
  - `archived: true`
@@ -41,8 +41,8 @@
41
41
 
42
42
  1. 源路径不存在(移动成功)。
43
43
  2. 目标路径完整存在,内容与移动前一致。
44
- 3. Workflow `status.json` 的 `active` 数组已移除该 change 条目,`completed` 数组已追加对应归档记录。
44
+ 3. Workflow `status.json` 的 `active` 数组已移除该 change,`archived` 数组已追加其名称,且两者没有重叠。
45
45
  4. 归档目录 `.status.json` 字段一致(`change_status: archived`、`archived: true`、`archive_path` 正确)。
46
46
  5. 验证失败时报告已完成/未完成清单,不猜测成功。
47
47
 
48
- 完成标准:源不存在、目标完整、active 索引已移除且 completed 已追加、归档状态字段一致。
48
+ 完成标准:源不存在、目标完整、active 索引已移除且 archived 名称已追加、归档状态字段一致。
@@ -1,17 +1,16 @@
1
1
  # Consolidation Rules
2
2
 
3
- 从已完成 change 的知识产物中提取、分类并合并到 workflow `_state/` 声明的持久化 store。
3
+ 从已完成 change 的知识产物中提取、分类并合并到 workflow state root 声明的持久化 store。
4
4
 
5
5
  ## 提取来源
6
6
 
7
7
  对每个候选 change,扫描以下知识产物:
8
8
 
9
- 1. `completion-summary.md`交付边界、关键变更、遗留事项
10
- 2. `completion-verification.md`验证证据、需求核对、调试残留
11
- 3. Change 自身的 ADR.md — 架构决策记录
12
- 4. LOG.md — 设计决策日志(可能含未正式记录的 ADR)
13
- 5. CONTEXT.md 领域术语定义
14
- 6. 任何自定义知识产物
9
+ 1. Evidence 与 Goal Plan 交付边界、验证证据和残余风险
10
+ 2. Change 自身的 ADR.md — 架构决策记录
11
+ 3. LOG.md — 设计决策日志(可能含未正式记录的 ADR)
12
+ 4. CONTEXT.md — 项目规范术语
13
+ 5. diagnosis、reviews、prototypes、questionnaires 和任何 workflow 自定义知识产物
15
14
 
16
15
  ## Store 映射与合并策略
17
16
 
@@ -22,7 +21,7 @@
22
21
  - **文件命名**:`<NNNN>-<kebab-slug>.md`。
23
22
  - **内容格式**:标题、状态(Accepted)、日期、决策上下文、决策内容、后果。
24
23
  - **Supersede 处理**:若新 ADR 取代旧 ADR,在旧 ADR 开头添加 `> **Superseded by [ADR-NNNN](./NNNN-<slug>.md)**`;不删除旧 ADR。
25
- - **从 LOG 提升**:LOG.md 中满足 ADR 标准但未正式记录的决策 → 创建正式 ADR,注明"从 LOG.md 提升"
24
+ - **从 LOG 提升**:LOG.md 中满足 ADR 标准且尚未写入 change ADR.md 的决策 → 创建正式 ADR,注明"从 LOG.md 提升";已有 change ADR 时只评估该唯一候选,不重复生成。
26
25
 
27
26
  ### context/(领域词汇表目录)
28
27
 
@@ -1,6 +1,6 @@
1
1
  # Knowledge Graduation Criteria
2
2
 
3
- 判定 change 中的知识是否值得提取到 workflow `_state/` 持久化 store。默认只提取满足标准的;其余归为 `ephemeral`,留在归档 change 中。
3
+ 判定 change 中的知识是否值得提取到 workflow state root 声明的持久化 store。默认只提取满足标准的;其余归为 `ephemeral`,留在归档 change 中。
4
4
 
5
5
  ## 毕业标准(三项满足任一即提取)
6
6
 
@@ -21,10 +21,13 @@
21
21
  - 仅适用于单次 change 的实现细节(具体行号、临时变量名、中间重构步骤)。
22
22
  - 已解决的临时变通方案(workaround 已被正式修复取代)。
23
23
  - 调试日志、故障排查过程记录(除非提炼出可复用的诊断方法)。
24
- - Change 自身的 ADR.md 已充分捕获的决策(不重复提取)。
25
24
  - 脱离完整 change 上下文会产生误导的内容。
26
25
  - 纯个人偏好且无项目级约束力("我习惯用 X")。
27
26
 
27
+ ## 候选去重
28
+
29
+ 同一决定已由 change 自身的 ADR.md 充分捕获时,以该 ADR 作为唯一毕业候选,不再从 LOG、Evidence 或其他工件生成重复候选。这只消除重复,不跳过永久知识毕业评估;通过标准的 change ADR 仍应进入永久 `adr/` 合并计划。
30
+
28
31
  ## 决策流程
29
32
 
30
33
  对每段待评估知识:
@@ -9,12 +9,13 @@ description: 提供 GitHub issue/PR/CI/security 治理与 npm provenance 发布
9
9
 
10
10
  ## 输入
11
11
 
12
+ - `operation`:`issue-read | pr-read | issue-search | issue-create | issue-comment-close | ci-security | release-preflight | release | recover`。
12
13
  - 仓库、目标分支、issue/PR/run id 或目标版本。
13
14
  - package metadata、release workflow、CHANGELOG 和可选 docs-sync state。
14
15
 
15
16
  ## 分支
16
17
 
17
- 1. **Issue/PR**:读取 `references/issue-pr-triage.md`;完成标准是分类、去重、标签和外部写入计划均有证据。
18
+ 1. **Issue transport**:执行读取、去重、创建或关闭时读取 `references/issue-transport.md`;需要社区分类、标签或 PR 治理判断时再读取 `references/issue-pr-triage.md`。完成标准是规范化结果、dry-run/授权边界和执行后重读均有证据。
18
19
  2. **CI/Security**:读取 `references/ci-and-security-ops.md`;完成标准是失败或告警根因可复现,修复动作与验证分离。
19
20
  3. **发布预检**:读取 `references/preflight-checklist.md`、`references/package-json-checklist.md` 和 `references/publish-detection.md`;完成标准是分支、认证、版本、tag、流水线和发布目标均已判定。
20
21
  4. **发布实施**:按需读取 `references/release-pipeline.md`、`references/workflow-yaml-reference.md`、`references/version-bump-flow.md`、`references/release-notes-injection.md` 和 `references/setup-npm-token.md`;完成标准是版本/CHANGELOG 同 commit、tag 精确指向该 commit,外部动作均已确认。
@@ -22,7 +23,8 @@ description: 提供 GitHub issue/PR/CI/security 治理与 npm provenance 发布
22
23
 
23
24
  ## 输出
24
25
 
25
- - 操作建议或经确认后的执行结果、风险和验证证据。
26
+ - Issue/PR transport 返回规范化 JSON、dry-run 计划或经确认后的执行结果;不写调用方 state。
27
+ - 其他分支返回操作建议或经确认后的执行结果、风险和验证证据。
26
28
  - 发布后三端验证:workflow success、GitHub Release 非 draft 且正文非空、需要发布 npm 时 registry 版本/dist-tag 一致。
27
29
 
28
30
  本 skill 不推进 docs-sync state,也不自行选择报告或 workflow knowledge 路径。
@@ -0,0 +1,26 @@
1
+ # GitHub Issue Transport
2
+
3
+ 本合同提供 GitHub 的读取和受控写入原语,不承担 SpecDev tracker、change、Ticket、Map 或报告所有权。
4
+
5
+ ## 操作
6
+
7
+ - `issue-read`:读取 title、body、state、URL、author、labels、时间与全部可见评论。
8
+ - `pr-read`:读取 PR 正文、评论、文件列表以及不可变 base/head SHA。
9
+ - `issue-search`:按 query 返回候选,用于去重。
10
+ - `issue-create`:默认 dry-run;调用方确认后使用 `--apply`。
11
+ - `issue-comment-close`:按 marker 幂等评论并关闭;默认 dry-run,只有调用方确认后使用 `--apply`。
12
+
13
+ 脚本:`scripts/issue-transport.mjs`。所有参数通过 argv 传递,不使用 shell 拼接;输出为 JSON,失败退出非零。
14
+
15
+ ## 写入边界
16
+
17
+ 调用方必须在执行前展示 repo、Issue、标题或评论、labels/reason 和准确动作,并取得本次明确授权。脚本的 `--apply` 只表示调用方已经完成该确认,不替代授权本身。
18
+
19
+ 不得把 token、Cookie、认证输出、机器绝对路径或包含秘密的正文写入长期工件。部分失败由调用方保存已完成步骤和恢复条件;不得因远程失败回滚本地事实。
20
+
21
+ ## 完成标准
22
+
23
+ - 读取结果可以冻结为调用方拥有的工件;
24
+ - dry-run 的外部写入为零;
25
+ - comment-close 的 marker 使重试不会重复评论;
26
+ - 成功结论来自执行后的远程重读。
@@ -16,7 +16,7 @@
16
16
  | 7 | 包管理器 | `pnpm --version` (或 `npm` / `yarn`) | 版本 ≥ 仓库 lockfile 隐含版本 | 安装匹配版本;不要随意切换包管理器 |
17
17
  | 8 | release.yml 存在 | `test -f .github/workflows/release.yml` | 文件存在 | 转 `github-npm-ops` skill 的 `references/workflow-yaml-reference.md` 先落该文件 |
18
18
  | 9 | release.yml 形态 | 见 [publish-detection.md](publish-detection.md) | 输出 `PUBLISH_TO_NPM=true` 或 `false` | 见 publish-detection 文档的判定矩阵 |
19
- | 10 | docs-sync state | `test -f speculo/.speculo/commands/docs-sync/state.json && jq . speculo/.speculo/commands/docs-sync/state.json` | schema v4、scope 已确认,baseline 可解析 | 不存在/未确认 → 走 docs-sync command bootstrap;旧 schema → 先迁移并确认范围;损坏 阻塞修复 |
19
+ | 10 | docs-sync state | `test -f speculo/.speculo/commands/docs-sync/state.json && jq . speculo/.speculo/commands/docs-sync/state.json` | schema v4、scope 已确认,baseline 可解析 | 不存在/未确认 → 走 docs-sync command bootstrap;旧 schema 或损坏 重新运行 `speculo init` 刷新受管理状态后再确认范围 |
20
20
  | 11 | tag 名称冲突 | `git rev-parse vX.Y.Z 2>/dev/null` | 退出码非 0(tag 不存在) | 同 tag 已存在:先确认是否真的失败需要重发;若是则 `git tag -d` + `git push origin :refs/tags/vX.Y.Z`,否则 bump 到下一版本 |
21
21
 
22
22
  ## 失败处理总策略