devrites 5.4.0 → 5.6.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 (490) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +8 -6
  3. package/docs/command-map.md +2 -2
  4. package/docs/engine/state-schema.md +12 -0
  5. package/docs/flow.md +4 -0
  6. package/docs/orchestration.md +5 -2
  7. package/engine/commands.go +2 -2
  8. package/engine/internal/devritespaths/paths.go +18 -0
  9. package/engine/internal/gate/gate.go +78 -0
  10. package/engine/internal/gate/gate_test.go +118 -0
  11. package/engine/internal/hostpack/hostpack.go +45 -6
  12. package/engine/internal/hostpack/hostpack_test.go +29 -13
  13. package/engine/internal/install/apply.go +14 -5
  14. package/engine/internal/install/install.go +8 -2
  15. package/engine/internal/install/install_test.go +12 -5
  16. package/engine/internal/install/merge.go +5 -0
  17. package/engine/internal/install/preflight.go +20 -2
  18. package/engine/internal/install/uninstall.go +5 -0
  19. package/engine/internal/install/update.go +1 -1
  20. package/engine/internal/lib/candidate.go +7 -3
  21. package/engine/internal/lib/manifest_union.go +326 -0
  22. package/engine/internal/lib/manifest_union_test.go +214 -0
  23. package/engine/internal/lib/observe_budgets.go +73 -0
  24. package/engine/internal/lib/observe_budgets_test.go +142 -0
  25. package/engine/internal/lib/observe_summary.go +74 -13
  26. package/engine/internal/lib/workspace_read.go +11 -6
  27. package/engine/internal/state/budgets.go +163 -0
  28. package/engine/internal/state/budgets_test.go +42 -0
  29. package/engine/internal/state/cursor.go +16 -10
  30. package/engine/internal/state/observation.go +50 -4
  31. package/engine/internal/state/status.go +38 -26
  32. package/engine/internal/state/taskgraph.go +23 -0
  33. package/engine/main.go +32 -13
  34. package/engine/root_routing_test.go +3 -1
  35. package/install.sh +4 -1
  36. package/pack/.claude/agents/devrites-code-reviewer.md +9 -6
  37. package/pack/.claude/agents/devrites-doubt-reviewer.md +6 -0
  38. package/pack/.claude/agents/devrites-plan-reviewer.md +7 -1
  39. package/pack/.claude/agents/devrites-slice-wright.md +42 -46
  40. package/pack/.claude/agents/devrites-test-analyst.md +9 -4
  41. package/pack/.claude/agents/devrites-upgrade-planner.md +9 -1
  42. package/pack/.claude/settings.json +17 -0
  43. package/pack/.claude/skills/devrites-api-interface/SKILL.md +2 -2
  44. package/pack/.claude/skills/devrites-doubt/SKILL.md +9 -17
  45. package/pack/.claude/skills/devrites-lib/reference/candidate-integrity.md +34 -35
  46. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +11 -12
  47. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +104 -51
  48. package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +1 -0
  49. package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +45 -25
  50. package/pack/.claude/skills/devrites-lib/reference/standards/core.md +1 -1
  51. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +80 -41
  52. package/pack/.claude/skills/rite-autocomplete/SKILL.md +19 -8
  53. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +33 -1
  54. package/pack/.claude/skills/rite-build/SKILL.md +26 -19
  55. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +1 -1
  56. package/pack/.claude/skills/rite-build/reference/parallel-batch.md +90 -40
  57. package/pack/.claude/skills/rite-build/reference/phase-contract.md +79 -59
  58. package/pack/.claude/skills/rite-build/reference/spec-drift-guard.md +14 -15
  59. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +8 -8
  60. package/pack/.claude/skills/rite-define/SKILL.md +4 -1
  61. package/pack/.claude/skills/rite-plan/SKILL.md +4 -1
  62. package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +21 -0
  63. package/pack/.claude/skills/rite-plan/reference/slicing.md +117 -15
  64. package/pack/.claude/skills/rite-prove/SKILL.md +20 -22
  65. package/pack/.claude/skills/rite-review/SKILL.md +23 -16
  66. package/pack/.claude/skills/rite-seal/SKILL.md +8 -8
  67. package/pack/.claude/skills/rite-seal/reference/final-evidence.md +6 -5
  68. package/pack/.claude/skills/rite-seal/reference/phase-contract.md +13 -13
  69. package/pack/.claude/skills/rite-ship/SKILL.md +3 -0
  70. package/pack/.claude/skills/rite-ship/reference/close-out.md +16 -2
  71. package/pack/.claude/skills/rite-ship/reference/git-ship.md +14 -5
  72. package/pack/.claude/skills/rite-spec/SKILL.md +6 -0
  73. package/pack/.claude/skills/rite-spec/reference/state-workspace.md +6 -0
  74. package/pack/.claude/skills/rite-status/SKILL.md +4 -1
  75. package/pack/.claude/skills/rite-temper/SKILL.md +14 -11
  76. package/pack/.claude/skills/rite-temper/reference/anti-patterns.md +14 -13
  77. package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +3 -4
  78. package/pack/.claude/skills/rite-upgrade/SKILL.md +11 -2
  79. package/pack/.claude/skills/rite-vet/SKILL.md +22 -15
  80. package/pack/.claude/skills/rite-vet/reference/anti-patterns.md +11 -9
  81. package/pack/.claude/skills/rite-vet/reference/depth.md +6 -7
  82. package/pack/.claude/skills/rite-vet/reference/review-axes.md +39 -14
  83. package/pack/generated/README.md +5 -1
  84. package/pack/generated/claude/agents/devrites-code-reviewer.md +9 -6
  85. package/pack/generated/claude/agents/devrites-doubt-reviewer.md +6 -0
  86. package/pack/generated/claude/agents/devrites-plan-reviewer.md +7 -1
  87. package/pack/generated/claude/agents/devrites-slice-wright.md +42 -46
  88. package/pack/generated/claude/agents/devrites-test-analyst.md +9 -4
  89. package/pack/generated/claude/agents/devrites-upgrade-planner.md +9 -1
  90. package/pack/generated/claude/settings.json +17 -0
  91. package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +2 -2
  92. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +9 -17
  93. package/pack/generated/claude/skills/devrites-lib/reference/candidate-integrity.md +34 -35
  94. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +11 -12
  95. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +104 -51
  96. package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +1 -0
  97. package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +45 -25
  98. package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +1 -1
  99. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +80 -41
  100. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +19 -8
  101. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +33 -1
  102. package/pack/generated/claude/skills/rite-build/SKILL.md +26 -19
  103. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +1 -1
  104. package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +90 -40
  105. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +79 -59
  106. package/pack/generated/claude/skills/rite-build/reference/spec-drift-guard.md +14 -15
  107. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +8 -8
  108. package/pack/generated/claude/skills/rite-define/SKILL.md +4 -1
  109. package/pack/generated/claude/skills/rite-plan/SKILL.md +4 -1
  110. package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +21 -0
  111. package/pack/generated/claude/skills/rite-plan/reference/slicing.md +117 -15
  112. package/pack/generated/claude/skills/rite-prove/SKILL.md +20 -22
  113. package/pack/generated/claude/skills/rite-review/SKILL.md +23 -16
  114. package/pack/generated/claude/skills/rite-seal/SKILL.md +8 -8
  115. package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +6 -5
  116. package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +13 -13
  117. package/pack/generated/claude/skills/rite-ship/SKILL.md +3 -0
  118. package/pack/generated/claude/skills/rite-ship/reference/close-out.md +16 -2
  119. package/pack/generated/claude/skills/rite-ship/reference/git-ship.md +14 -5
  120. package/pack/generated/claude/skills/rite-spec/SKILL.md +6 -0
  121. package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +6 -0
  122. package/pack/generated/claude/skills/rite-status/SKILL.md +4 -1
  123. package/pack/generated/claude/skills/rite-temper/SKILL.md +14 -11
  124. package/pack/generated/claude/skills/rite-temper/reference/anti-patterns.md +14 -13
  125. package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +3 -4
  126. package/pack/generated/claude/skills/rite-upgrade/SKILL.md +11 -2
  127. package/pack/generated/claude/skills/rite-vet/SKILL.md +22 -15
  128. package/pack/generated/claude/skills/rite-vet/reference/anti-patterns.md +11 -9
  129. package/pack/generated/claude/skills/rite-vet/reference/depth.md +6 -7
  130. package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +39 -14
  131. package/pack/generated/codex/agents/devrites-code-reviewer.toml +9 -6
  132. package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +6 -0
  133. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +7 -1
  134. package/pack/generated/codex/agents/devrites-slice-wright.toml +42 -46
  135. package/pack/generated/codex/agents/devrites-test-analyst.toml +9 -4
  136. package/pack/generated/codex/agents/devrites-upgrade-planner.toml +9 -1
  137. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +2 -2
  138. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +9 -17
  139. package/pack/generated/codex/skills/devrites-lib/reference/candidate-integrity.md +34 -35
  140. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +11 -12
  141. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +104 -51
  142. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +1 -0
  143. package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +45 -25
  144. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +1 -1
  145. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +80 -41
  146. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +19 -8
  147. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +33 -1
  148. package/pack/generated/codex/skills/rite-build/SKILL.md +26 -19
  149. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +1 -1
  150. package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +90 -40
  151. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +79 -59
  152. package/pack/generated/codex/skills/rite-build/reference/spec-drift-guard.md +14 -15
  153. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +8 -8
  154. package/pack/generated/codex/skills/rite-define/SKILL.md +4 -1
  155. package/pack/generated/codex/skills/rite-plan/SKILL.md +4 -1
  156. package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +21 -0
  157. package/pack/generated/codex/skills/rite-plan/reference/slicing.md +117 -15
  158. package/pack/generated/codex/skills/rite-prove/SKILL.md +20 -22
  159. package/pack/generated/codex/skills/rite-review/SKILL.md +23 -16
  160. package/pack/generated/codex/skills/rite-seal/SKILL.md +8 -8
  161. package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +6 -5
  162. package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +13 -13
  163. package/pack/generated/codex/skills/rite-ship/SKILL.md +3 -0
  164. package/pack/generated/codex/skills/rite-ship/reference/close-out.md +16 -2
  165. package/pack/generated/codex/skills/rite-ship/reference/git-ship.md +14 -5
  166. package/pack/generated/codex/skills/rite-spec/SKILL.md +6 -0
  167. package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +6 -0
  168. package/pack/generated/codex/skills/rite-status/SKILL.md +4 -1
  169. package/pack/generated/codex/skills/rite-temper/SKILL.md +14 -11
  170. package/pack/generated/codex/skills/rite-temper/reference/anti-patterns.md +14 -13
  171. package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +3 -4
  172. package/pack/generated/codex/skills/rite-upgrade/SKILL.md +11 -2
  173. package/pack/generated/codex/skills/rite-vet/SKILL.md +22 -15
  174. package/pack/generated/codex/skills/rite-vet/reference/anti-patterns.md +11 -9
  175. package/pack/generated/codex/skills/rite-vet/reference/depth.md +6 -7
  176. package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +39 -14
  177. package/pack/generated/omp/agents/devrites-code-reviewer.md +9 -6
  178. package/pack/generated/omp/agents/devrites-doubt-reviewer.md +6 -0
  179. package/pack/generated/omp/agents/devrites-plan-reviewer.md +7 -1
  180. package/pack/generated/omp/agents/devrites-slice-wright.md +42 -46
  181. package/pack/generated/omp/agents/devrites-test-analyst.md +9 -4
  182. package/pack/generated/omp/agents/devrites-upgrade-planner.md +9 -1
  183. package/pack/generated/omp/skills/devrites-api-interface/SKILL.md +2 -2
  184. package/pack/generated/omp/skills/devrites-doubt/SKILL.md +9 -17
  185. package/pack/generated/omp/skills/devrites-lib/reference/candidate-integrity.md +34 -35
  186. package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +11 -12
  187. package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +104 -51
  188. package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +1 -0
  189. package/pack/generated/omp/skills/devrites-lib/reference/standards/context-hygiene.md +45 -25
  190. package/pack/generated/omp/skills/devrites-lib/reference/standards/core.md +1 -1
  191. package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +80 -41
  192. package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +19 -8
  193. package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +33 -1
  194. package/pack/generated/omp/skills/rite-build/SKILL.md +26 -19
  195. package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +1 -1
  196. package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +90 -40
  197. package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +79 -59
  198. package/pack/generated/omp/skills/rite-build/reference/spec-drift-guard.md +14 -15
  199. package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +8 -8
  200. package/pack/generated/omp/skills/rite-define/SKILL.md +4 -1
  201. package/pack/generated/omp/skills/rite-plan/SKILL.md +4 -1
  202. package/pack/generated/omp/skills/rite-plan/reference/replan-and-repair.md +21 -0
  203. package/pack/generated/omp/skills/rite-plan/reference/slicing.md +117 -15
  204. package/pack/generated/omp/skills/rite-prove/SKILL.md +20 -22
  205. package/pack/generated/omp/skills/rite-review/SKILL.md +23 -16
  206. package/pack/generated/omp/skills/rite-seal/SKILL.md +8 -8
  207. package/pack/generated/omp/skills/rite-seal/reference/final-evidence.md +6 -5
  208. package/pack/generated/omp/skills/rite-seal/reference/phase-contract.md +13 -13
  209. package/pack/generated/omp/skills/rite-ship/SKILL.md +3 -0
  210. package/pack/generated/omp/skills/rite-ship/reference/close-out.md +16 -2
  211. package/pack/generated/omp/skills/rite-ship/reference/git-ship.md +14 -5
  212. package/pack/generated/omp/skills/rite-spec/SKILL.md +6 -0
  213. package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +6 -0
  214. package/pack/generated/omp/skills/rite-status/SKILL.md +4 -1
  215. package/pack/generated/omp/skills/rite-temper/SKILL.md +14 -11
  216. package/pack/generated/omp/skills/rite-temper/reference/anti-patterns.md +14 -13
  217. package/pack/generated/omp/skills/rite-temper/reference/review-dimensions.md +3 -4
  218. package/pack/generated/omp/skills/rite-upgrade/SKILL.md +11 -2
  219. package/pack/generated/omp/skills/rite-vet/SKILL.md +22 -15
  220. package/pack/generated/omp/skills/rite-vet/reference/anti-patterns.md +11 -9
  221. package/pack/generated/omp/skills/rite-vet/reference/depth.md +6 -7
  222. package/pack/generated/omp/skills/rite-vet/reference/review-axes.md +39 -14
  223. package/pack/generated/pi/AGENTS.md +22 -0
  224. package/pack/generated/pi/agents/devrites-code-reviewer.md +142 -0
  225. package/pack/generated/pi/agents/devrites-devex-reviewer.md +124 -0
  226. package/pack/generated/pi/agents/devrites-doubt-reviewer.md +88 -0
  227. package/pack/generated/pi/agents/devrites-evidence-scout.md +72 -0
  228. package/pack/generated/pi/agents/devrites-frontend-reviewer.md +116 -0
  229. package/pack/generated/pi/agents/devrites-performance-reviewer.md +115 -0
  230. package/pack/generated/pi/agents/devrites-plan-drafter.md +99 -0
  231. package/pack/generated/pi/agents/devrites-plan-reviewer.md +142 -0
  232. package/pack/generated/pi/agents/devrites-proof-runner.md +74 -0
  233. package/pack/generated/pi/agents/devrites-retrospector.md +61 -0
  234. package/pack/generated/pi/agents/devrites-security-auditor.md +109 -0
  235. package/pack/generated/pi/agents/devrites-simplifier-reviewer.md +94 -0
  236. package/pack/generated/pi/agents/devrites-slice-wright.md +204 -0
  237. package/pack/generated/pi/agents/devrites-spec-reviewer.md +96 -0
  238. package/pack/generated/pi/agents/devrites-strategy-reviewer.md +100 -0
  239. package/pack/generated/pi/agents/devrites-test-analyst.md +94 -0
  240. package/pack/generated/pi/agents/devrites-upgrade-planner.md +89 -0
  241. package/pack/generated/pi/prompts/rite-adopt.md +5 -0
  242. package/pack/generated/pi/prompts/rite-autocomplete.md +5 -0
  243. package/pack/generated/pi/prompts/rite-build.md +5 -0
  244. package/pack/generated/pi/prompts/rite-clarify.md +5 -0
  245. package/pack/generated/pi/prompts/rite-converge.md +5 -0
  246. package/pack/generated/pi/prompts/rite-customize.md +5 -0
  247. package/pack/generated/pi/prompts/rite-define.md +5 -0
  248. package/pack/generated/pi/prompts/rite-doctor.md +5 -0
  249. package/pack/generated/pi/prompts/rite-dogfood.md +5 -0
  250. package/pack/generated/pi/prompts/rite-explain.md +5 -0
  251. package/pack/generated/pi/prompts/rite-frame.md +5 -0
  252. package/pack/generated/pi/prompts/rite-handoff.md +5 -0
  253. package/pack/generated/pi/prompts/rite-learn.md +5 -0
  254. package/pack/generated/pi/prompts/rite-plan.md +5 -0
  255. package/pack/generated/pi/prompts/rite-polish.md +5 -0
  256. package/pack/generated/pi/prompts/rite-pov.md +5 -0
  257. package/pack/generated/pi/prompts/rite-pr-feedback.md +5 -0
  258. package/pack/generated/pi/prompts/rite-pressure-test.md +5 -0
  259. package/pack/generated/pi/prompts/rite-prototype.md +5 -0
  260. package/pack/generated/pi/prompts/rite-prove.md +5 -0
  261. package/pack/generated/pi/prompts/rite-quick.md +5 -0
  262. package/pack/generated/pi/prompts/rite-resolve.md +5 -0
  263. package/pack/generated/pi/prompts/rite-review.md +5 -0
  264. package/pack/generated/pi/prompts/rite-seal.md +5 -0
  265. package/pack/generated/pi/prompts/rite-ship.md +5 -0
  266. package/pack/generated/pi/prompts/rite-spec.md +5 -0
  267. package/pack/generated/pi/prompts/rite-status.md +5 -0
  268. package/pack/generated/pi/prompts/rite-temper.md +5 -0
  269. package/pack/generated/pi/prompts/rite-upgrade.md +5 -0
  270. package/pack/generated/pi/prompts/rite-vet.md +5 -0
  271. package/pack/generated/pi/prompts/rite-watch-pr.md +5 -0
  272. package/pack/generated/pi/prompts/rite-zoom-out.md +5 -0
  273. package/pack/generated/pi/prompts/rite.md +5 -0
  274. package/pack/generated/pi/skills/devrites-api-interface/SKILL.md +63 -0
  275. package/pack/generated/pi/skills/devrites-audit/SKILL.md +50 -0
  276. package/pack/generated/pi/skills/devrites-browser-proof/SKILL.md +76 -0
  277. package/pack/generated/pi/skills/devrites-browser-proof/reference/browser-performance.md +15 -0
  278. package/pack/generated/pi/skills/devrites-browser-proof/reference/visual-verdict.md +34 -0
  279. package/pack/generated/pi/skills/devrites-debug-recovery/SKILL.md +96 -0
  280. package/pack/generated/pi/skills/devrites-debug-recovery/reference/build-the-loop.md +58 -0
  281. package/pack/generated/pi/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -0
  282. package/pack/generated/pi/skills/devrites-debug-recovery/reference/hypotheses.md +17 -0
  283. package/pack/generated/pi/skills/devrites-debug-recovery/reference/instrumentation.md +21 -0
  284. package/pack/generated/pi/skills/devrites-debug-recovery/reference/regression-test.md +30 -0
  285. package/pack/generated/pi/skills/devrites-debug-recovery/reference/trace.md +25 -0
  286. package/pack/generated/pi/skills/devrites-doubt/SKILL.md +79 -0
  287. package/pack/generated/pi/skills/devrites-frontend-craft/SKILL.md +86 -0
  288. package/pack/generated/pi/skills/devrites-frontend-craft/reference/craft.md +63 -0
  289. package/pack/generated/pi/skills/devrites-frontend-craft/reference/design-references.md +116 -0
  290. package/pack/generated/pi/skills/devrites-frontend-craft/reference/fullstack.md +46 -0
  291. package/pack/generated/pi/skills/devrites-frontend-craft/reference/quality-standards.md +294 -0
  292. package/pack/generated/pi/skills/devrites-frontend-craft/reference/reuse-first.md +53 -0
  293. package/pack/generated/pi/skills/devrites-frontend-craft/reference/shape.md +56 -0
  294. package/pack/generated/pi/skills/devrites-interview/SKILL.md +102 -0
  295. package/pack/generated/pi/skills/devrites-lib/SKILL.md +58 -0
  296. package/pack/generated/pi/skills/devrites-lib/reference/candidate-integrity.md +42 -0
  297. package/pack/generated/pi/skills/devrites-lib/reference/intent-map.md +64 -0
  298. package/pack/generated/pi/skills/devrites-lib/reference/orchestration-profiles.md +27 -0
  299. package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +73 -0
  300. package/pack/generated/pi/skills/devrites-lib/reference/reply-contract.md +88 -0
  301. package/pack/generated/pi/skills/devrites-lib/reference/standards/README.md +60 -0
  302. package/pack/generated/pi/skills/devrites-lib/reference/standards/acceptance-preserving-reslice.md +30 -0
  303. package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +398 -0
  304. package/pack/generated/pi/skills/devrites-lib/reference/standards/agents.md +99 -0
  305. package/pack/generated/pi/skills/devrites-lib/reference/standards/anti-patterns.md +48 -0
  306. package/pack/generated/pi/skills/devrites-lib/reference/standards/browser-proof-checklist.md +24 -0
  307. package/pack/generated/pi/skills/devrites-lib/reference/standards/ci-cd.md +50 -0
  308. package/pack/generated/pi/skills/devrites-lib/reference/standards/code-navigation.md +43 -0
  309. package/pack/generated/pi/skills/devrites-lib/reference/standards/code-review.md +108 -0
  310. package/pack/generated/pi/skills/devrites-lib/reference/standards/coding-style.md +48 -0
  311. package/pack/generated/pi/skills/devrites-lib/reference/standards/context-hygiene.md +109 -0
  312. package/pack/generated/pi/skills/devrites-lib/reference/standards/core.md +167 -0
  313. package/pack/generated/pi/skills/devrites-lib/reference/standards/data-integrity.md +118 -0
  314. package/pack/generated/pi/skills/devrites-lib/reference/standards/debug-recovery.md +28 -0
  315. package/pack/generated/pi/skills/devrites-lib/reference/standards/definition-of-done.md +19 -0
  316. package/pack/generated/pi/skills/devrites-lib/reference/standards/deprecation.md +31 -0
  317. package/pack/generated/pi/skills/devrites-lib/reference/standards/developer-experience.md +119 -0
  318. package/pack/generated/pi/skills/devrites-lib/reference/standards/development-workflow.md +29 -0
  319. package/pack/generated/pi/skills/devrites-lib/reference/standards/documentation.md +43 -0
  320. package/pack/generated/pi/skills/devrites-lib/reference/standards/edge-case-trace.md +92 -0
  321. package/pack/generated/pi/skills/devrites-lib/reference/standards/elicitation.md +85 -0
  322. package/pack/generated/pi/skills/devrites-lib/reference/standards/error-handling.md +47 -0
  323. package/pack/generated/pi/skills/devrites-lib/reference/standards/git-workflow.md +49 -0
  324. package/pack/generated/pi/skills/devrites-lib/reference/standards/hooks.md +25 -0
  325. package/pack/generated/pi/skills/devrites-lib/reference/standards/integration-reliability.md +102 -0
  326. package/pack/generated/pi/skills/devrites-lib/reference/standards/loop-operations.md +85 -0
  327. package/pack/generated/pi/skills/devrites-lib/reference/standards/observability.md +88 -0
  328. package/pack/generated/pi/skills/devrites-lib/reference/standards/one-shot-actions.md +97 -0
  329. package/pack/generated/pi/skills/devrites-lib/reference/standards/patterns.md +68 -0
  330. package/pack/generated/pi/skills/devrites-lib/reference/standards/performance.md +51 -0
  331. package/pack/generated/pi/skills/devrites-lib/reference/standards/principles.md +42 -0
  332. package/pack/generated/pi/skills/devrites-lib/reference/standards/prose-style.md +123 -0
  333. package/pack/generated/pi/skills/devrites-lib/reference/standards/release/ship-checklist.md +8 -0
  334. package/pack/generated/pi/skills/devrites-lib/reference/standards/repository-topology.md +80 -0
  335. package/pack/generated/pi/skills/devrites-lib/reference/standards/review-checklist.md +12 -0
  336. package/pack/generated/pi/skills/devrites-lib/reference/standards/security-checklist.md +25 -0
  337. package/pack/generated/pi/skills/devrites-lib/reference/standards/security.md +202 -0
  338. package/pack/generated/pi/skills/devrites-lib/reference/standards/skill-authoring.md +209 -0
  339. package/pack/generated/pi/skills/devrites-lib/reference/standards/spec-grammar.md +197 -0
  340. package/pack/generated/pi/skills/devrites-lib/reference/standards/test-proof-checklist.md +13 -0
  341. package/pack/generated/pi/skills/devrites-lib/reference/standards/testing.md +212 -0
  342. package/pack/generated/pi/skills/devrites-lib/reference/standards/tooling.md +92 -0
  343. package/pack/generated/pi/skills/devrites-lib/reference/standards/workflow-artifacts.md +427 -0
  344. package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/code.md +44 -0
  345. package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/comparison.md +42 -0
  346. package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/diagram.md +51 -0
  347. package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/index.md +66 -0
  348. package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/input.md +46 -0
  349. package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/outline-template.md +106 -0
  350. package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/plan.md +48 -0
  351. package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/slides.md +40 -0
  352. package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/table.md +42 -0
  353. package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +267 -0
  354. package/pack/generated/pi/skills/devrites-prose-craft/SKILL.md +73 -0
  355. package/pack/generated/pi/skills/devrites-prose-craft/reference/banned-phrases.md +132 -0
  356. package/pack/generated/pi/skills/devrites-prose-craft/reference/examples.md +131 -0
  357. package/pack/generated/pi/skills/devrites-prose-craft/reference/structures.md +196 -0
  358. package/pack/generated/pi/skills/devrites-source-driven/SKILL.md +52 -0
  359. package/pack/generated/pi/skills/devrites-ux-shape/SKILL.md +134 -0
  360. package/pack/generated/pi/skills/devrites-ux-shape/reference/brief-template.md +108 -0
  361. package/pack/generated/pi/skills/devrites-ux-shape/reference/visual-direction-probe.md +48 -0
  362. package/pack/generated/pi/skills/rite/SKILL.md +148 -0
  363. package/pack/generated/pi/skills/rite/reference/menu.md +48 -0
  364. package/pack/generated/pi/skills/rite-adopt/SKILL.md +52 -0
  365. package/pack/generated/pi/skills/rite-adopt/reference/adoption.md +19 -0
  366. package/pack/generated/pi/skills/rite-adopt/reference/anti-patterns.md +19 -0
  367. package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +132 -0
  368. package/pack/generated/pi/skills/rite-autocomplete/reference/decision-policy.md +41 -0
  369. package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +148 -0
  370. package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +92 -0
  371. package/pack/generated/pi/skills/rite-build/SKILL.md +96 -0
  372. package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +145 -0
  373. package/pack/generated/pi/skills/rite-build/reference/anti-patterns.md +23 -0
  374. package/pack/generated/pi/skills/rite-build/reference/checkpoint-protocol.md +120 -0
  375. package/pack/generated/pi/skills/rite-build/reference/checkpoint.md +44 -0
  376. package/pack/generated/pi/skills/rite-build/reference/frontend-trigger.md +39 -0
  377. package/pack/generated/pi/skills/rite-build/reference/one-slice-cycle.md +50 -0
  378. package/pack/generated/pi/skills/rite-build/reference/output.md +33 -0
  379. package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +205 -0
  380. package/pack/generated/pi/skills/rite-build/reference/phase-contract.md +87 -0
  381. package/pack/generated/pi/skills/rite-build/reference/spec-drift-guard.md +84 -0
  382. package/pack/generated/pi/skills/rite-build/reference/tdd.md +27 -0
  383. package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +89 -0
  384. package/pack/generated/pi/skills/rite-clarify/SKILL.md +99 -0
  385. package/pack/generated/pi/skills/rite-clarify/reference/anti-patterns.md +24 -0
  386. package/pack/generated/pi/skills/rite-clarify/reference/decision-coverage.md +55 -0
  387. package/pack/generated/pi/skills/rite-converge/SKILL.md +145 -0
  388. package/pack/generated/pi/skills/rite-converge/reference/anti-patterns.md +35 -0
  389. package/pack/generated/pi/skills/rite-converge/reference/convergence-assessment.md +65 -0
  390. package/pack/generated/pi/skills/rite-customize/SKILL.md +60 -0
  391. package/pack/generated/pi/skills/rite-define/SKILL.md +169 -0
  392. package/pack/generated/pi/skills/rite-define/reference/anti-patterns.md +26 -0
  393. package/pack/generated/pi/skills/rite-define/reference/gates.md +154 -0
  394. package/pack/generated/pi/skills/rite-define/reference/plan-template.md +149 -0
  395. package/pack/generated/pi/skills/rite-doctor/SKILL.md +69 -0
  396. package/pack/generated/pi/skills/rite-dogfood/SKILL.md +55 -0
  397. package/pack/generated/pi/skills/rite-explain/SKILL.md +152 -0
  398. package/pack/generated/pi/skills/rite-explain/reference/intake.md +89 -0
  399. package/pack/generated/pi/skills/rite-frame/SKILL.md +115 -0
  400. package/pack/generated/pi/skills/rite-frame/reference/failure-modes.md +66 -0
  401. package/pack/generated/pi/skills/rite-handoff/SKILL.md +97 -0
  402. package/pack/generated/pi/skills/rite-handoff/reference/handoff-template.md +44 -0
  403. package/pack/generated/pi/skills/rite-learn/SKILL.md +72 -0
  404. package/pack/generated/pi/skills/rite-plan/SKILL.md +186 -0
  405. package/pack/generated/pi/skills/rite-plan/reference/anti-patterns.md +34 -0
  406. package/pack/generated/pi/skills/rite-plan/reference/dependency-graph.md +48 -0
  407. package/pack/generated/pi/skills/rite-plan/reference/replan-and-repair.md +105 -0
  408. package/pack/generated/pi/skills/rite-plan/reference/slicing.md +167 -0
  409. package/pack/generated/pi/skills/rite-plan/reference/task-breakdown.md +42 -0
  410. package/pack/generated/pi/skills/rite-polish/SKILL.md +104 -0
  411. package/pack/generated/pi/skills/rite-polish/reference/adr-promotion.md +11 -0
  412. package/pack/generated/pi/skills/rite-polish/reference/anti-ai-slop.md +187 -0
  413. package/pack/generated/pi/skills/rite-polish/reference/anti-patterns.md +30 -0
  414. package/pack/generated/pi/skills/rite-polish/reference/backend-polish.md +80 -0
  415. package/pack/generated/pi/skills/rite-polish/reference/browser-polish-evidence.md +33 -0
  416. package/pack/generated/pi/skills/rite-polish/reference/code.md +82 -0
  417. package/pack/generated/pi/skills/rite-polish/reference/design-memory.md +117 -0
  418. package/pack/generated/pi/skills/rite-polish/reference/design-system-discovery.md +8 -0
  419. package/pack/generated/pi/skills/rite-polish/reference/harden-checklist.md +109 -0
  420. package/pack/generated/pi/skills/rite-polish/reference/ledger.md +65 -0
  421. package/pack/generated/pi/skills/rite-polish/reference/ui.md +137 -0
  422. package/pack/generated/pi/skills/rite-pov/SKILL.md +58 -0
  423. package/pack/generated/pi/skills/rite-pr-feedback/SKILL.md +54 -0
  424. package/pack/generated/pi/skills/rite-pressure-test/SKILL.md +67 -0
  425. package/pack/generated/pi/skills/rite-prototype/SKILL.md +104 -0
  426. package/pack/generated/pi/skills/rite-prove/SKILL.md +120 -0
  427. package/pack/generated/pi/skills/rite-prove/reference/acceptance-proof.md +88 -0
  428. package/pack/generated/pi/skills/rite-prove/reference/anti-patterns.md +25 -0
  429. package/pack/generated/pi/skills/rite-prove/reference/browser-proof.md +51 -0
  430. package/pack/generated/pi/skills/rite-prove/reference/failure-triage.md +43 -0
  431. package/pack/generated/pi/skills/rite-prove/reference/proof-ladder.md +28 -0
  432. package/pack/generated/pi/skills/rite-prove/reference/test-command-discovery.md +30 -0
  433. package/pack/generated/pi/skills/rite-quick/SKILL.md +82 -0
  434. package/pack/generated/pi/skills/rite-resolve/SKILL.md +95 -0
  435. package/pack/generated/pi/skills/rite-resolve/reference/answer-protocol.md +118 -0
  436. package/pack/generated/pi/skills/rite-review/SKILL.md +170 -0
  437. package/pack/generated/pi/skills/rite-review/reference/anti-patterns.md +32 -0
  438. package/pack/generated/pi/skills/rite-review/reference/cognitive-load.md +90 -0
  439. package/pack/generated/pi/skills/rite-review/reference/feature-scoped-review.md +26 -0
  440. package/pack/generated/pi/skills/rite-review/reference/five-axis-review.md +66 -0
  441. package/pack/generated/pi/skills/rite-review/reference/nielsen-heuristics.md +126 -0
  442. package/pack/generated/pi/skills/rite-review/reference/performance-checklist.md +80 -0
  443. package/pack/generated/pi/skills/rite-review/reference/performance-review.md +14 -0
  444. package/pack/generated/pi/skills/rite-review/reference/security-review.md +42 -0
  445. package/pack/generated/pi/skills/rite-seal/SKILL.md +75 -0
  446. package/pack/generated/pi/skills/rite-seal/reference/anti-patterns.md +29 -0
  447. package/pack/generated/pi/skills/rite-seal/reference/final-evidence.md +41 -0
  448. package/pack/generated/pi/skills/rite-seal/reference/go-no-go.md +29 -0
  449. package/pack/generated/pi/skills/rite-seal/reference/output.md +5 -0
  450. package/pack/generated/pi/skills/rite-seal/reference/phase-contract.md +47 -0
  451. package/pack/generated/pi/skills/rite-seal/reference/risk-and-rollback.md +56 -0
  452. package/pack/generated/pi/skills/rite-seal/reference/seal-template.md +27 -0
  453. package/pack/generated/pi/skills/rite-ship/SKILL.md +88 -0
  454. package/pack/generated/pi/skills/rite-ship/reference/anti-patterns.md +28 -0
  455. package/pack/generated/pi/skills/rite-ship/reference/close-out.md +68 -0
  456. package/pack/generated/pi/skills/rite-ship/reference/git-ship.md +120 -0
  457. package/pack/generated/pi/skills/rite-ship/reference/rollout.md +62 -0
  458. package/pack/generated/pi/skills/rite-ship/reference/ship-template.md +39 -0
  459. package/pack/generated/pi/skills/rite-spec/SKILL.md +150 -0
  460. package/pack/generated/pi/skills/rite-spec/reference/acceptance-criteria.md +31 -0
  461. package/pack/generated/pi/skills/rite-spec/reference/ai-spec-template.md +40 -0
  462. package/pack/generated/pi/skills/rite-spec/reference/anti-patterns.md +27 -0
  463. package/pack/generated/pi/skills/rite-spec/reference/interview-patterns.md +56 -0
  464. package/pack/generated/pi/skills/rite-spec/reference/investigation.md +83 -0
  465. package/pack/generated/pi/skills/rite-spec/reference/question-protocol.md +36 -0
  466. package/pack/generated/pi/skills/rite-spec/reference/references-intake.md +62 -0
  467. package/pack/generated/pi/skills/rite-spec/reference/spec-checklists.md +89 -0
  468. package/pack/generated/pi/skills/rite-spec/reference/spec-template.md +154 -0
  469. package/pack/generated/pi/skills/rite-spec/reference/state-workspace.md +227 -0
  470. package/pack/generated/pi/skills/rite-status/SKILL.md +57 -0
  471. package/pack/generated/pi/skills/rite-temper/SKILL.md +130 -0
  472. package/pack/generated/pi/skills/rite-temper/reference/anti-patterns.md +30 -0
  473. package/pack/generated/pi/skills/rite-temper/reference/review-dimensions.md +66 -0
  474. package/pack/generated/pi/skills/rite-temper/reference/scope-modes.md +53 -0
  475. package/pack/generated/pi/skills/rite-temper/reference/significance.md +46 -0
  476. package/pack/generated/pi/skills/rite-temper/reference/strategy-template.md +90 -0
  477. package/pack/generated/pi/skills/rite-upgrade/SKILL.md +121 -0
  478. package/pack/generated/pi/skills/rite-vet/SKILL.md +193 -0
  479. package/pack/generated/pi/skills/rite-vet/reference/anti-patterns.md +43 -0
  480. package/pack/generated/pi/skills/rite-vet/reference/artifacts.md +202 -0
  481. package/pack/generated/pi/skills/rite-vet/reference/cross-model.md +19 -0
  482. package/pack/generated/pi/skills/rite-vet/reference/depth.md +59 -0
  483. package/pack/generated/pi/skills/rite-vet/reference/eng-lenses.md +48 -0
  484. package/pack/generated/pi/skills/rite-vet/reference/review-axes.md +201 -0
  485. package/pack/generated/pi/skills/rite-watch-pr/SKILL.md +85 -0
  486. package/pack/generated/pi/skills/rite-zoom-out/SKILL.md +69 -0
  487. package/package.json +3 -2
  488. package/scripts/build-host-artifacts.sh +54 -4
  489. package/scripts/codex-generate.sh +6 -0
  490. package/scripts/pi-generate.sh +198 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  All notable changes to DevRites are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and DevRites adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Releases are generated automatically by [semantic-release](https://semantic-release.gitbook.io/) from Conventional Commits on `main`.
4
4
 
5
+ ## [5.6.0](https://github.com/ViktorsBaikers/DevRites/compare/v5.5.0...v5.6.0) (2026-09-13)
6
+
7
+ ### Added
8
+
9
+ * **rite:** add pi as fourth host target ([#69](https://github.com/ViktorsBaikers/DevRites/issues/69)) ([8249a6b](https://github.com/ViktorsBaikers/DevRites/commit/8249a6b9d5bef3dfd2411089fdcd34845f535b12))
10
+
11
+ ## [5.5.0](https://github.com/ViktorsBaikers/DevRites/compare/v5.4.0...v5.5.0) (2026-09-13)
12
+
13
+ ### Added
14
+
15
+ * **rite:** cap parallel batch width and chain deferred ship ([#68](https://github.com/ViktorsBaikers/DevRites/issues/68)) ([d023dfa](https://github.com/ViktorsBaikers/DevRites/commit/d023dfa742d5b6f5a9775c21308cd4731d6858f9))
16
+
5
17
  ## [5.4.0](https://github.com/ViktorsBaikers/DevRites/compare/v5.3.0...v5.4.0) (2026-09-13)
6
18
 
7
19
  ### Added
package/README.md CHANGED
@@ -33,7 +33,7 @@ project-conventional push, tag, or PR action, and archive the workspace.
33
33
  Unattended runs may create local WIP checkpoint commits along the way, but they
34
34
  remain local unless Ship's disclosed plan includes an approved remote action.
35
35
 
36
- **Status:** [`v5.4.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v5.4.0): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
36
+ **Status:** [`v5.6.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v5.6.0): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
37
37
 
38
38
  This is the latest published release; `main` may contain unreleased work.
39
39
 
@@ -47,8 +47,8 @@ Run this from the root of your project. Node.js 18 or later is required.
47
47
  npx devrites@latest
48
48
  ```
49
49
 
50
- The installer adds project-local support for Claude Code and Codex. It does not
51
- write skills, agents, or hooks to `~/.claude` or `~/.codex`.
50
+ The installer adds project-local support for Claude Code, Codex, omp, and pi.
51
+ It does not write skills, agents, or hooks to `~/.claude`, `~/.codex`, or `~/.pi`.
52
52
 
53
53
  ### 2. Choose the smallest route
54
54
 
@@ -78,8 +78,9 @@ proof and next action.
78
78
  ## How the lifecycle works
79
79
 
80
80
  Claude Code supports both `/rite <verb>` and `/rite-<verb>`. Codex uses the same
81
- forms with `$`: `$rite <verb>` and `$rite-<verb>`. The menu and direct forms run
82
- the same skill.
81
+ forms with `$`: `$rite <verb>` and `$rite-<verb>`. omp and pi use the Claude
82
+ slash forms (on pi they run as prompt templates under `.pi/prompts`, with
83
+ `/skill:rite-<verb>` equivalent). The menu and direct forms run the same skill.
83
84
 
84
85
  | # | Stage | Direct command | What happens |
85
86
  | ---: | --- | --- | --- |
@@ -294,7 +295,8 @@ Useful install flags:
294
295
  | `--target DIR` | Use another project directory. |
295
296
  | `--dry-run` | Show planned file operations without changing anything. |
296
297
  | `--force` | Replace or remove foreign or customized managed files. The installer still rejects symlinks and path escapes. |
297
- | `--no-codex` | Skip `.agents`, `.codex`, and `AGENTS.md` integration. |
298
+ | `--no-codex` | Skip `.agents`, `.codex`, and the Codex `AGENTS.md` block. |
299
+ | `--no-pi` | Skip `.pi` skills, agents, prompt commands, and the pi `AGENTS.md` block. |
298
300
  | `--no-agents` | Skip hook-free native specialist profiles. |
299
301
  | `--no-skills` | Skip skills and their bundled standards. |
300
302
  | `--no-binary` | Do not keep the shared `devrites-engine` binary in a user or system bin directory. |
@@ -41,8 +41,8 @@ The Go surface is intentionally closed and deterministic:
41
41
  | Lane | Commands | Owner |
42
42
  |---|---|---|
43
43
  | Candidate and deterministic checks | `check candidate`, `check readiness [--emit-binding]`, `check seal`, `check task-graph`, `check path-disjoint`, `check skill-trust`, `check indexes` | Candidate validates/hashes the strict project manifest; readiness checks phase files, the required `tasks.md` slice graph, or emits the vetted Build-input binding; seal checks final files/open gates, that graph and binding, then exact candidate bindings. `check indexes` reports install manifest and optional code-index directory presence as JSON. |
44
- | Workspace observation | `observe summary`, `orient` | JSON workspace snapshot for agents; `orient` is an alias for `observe summary`. |
45
- | Atomic workspace state | `state resolve`, `state close`, `migrate [--dry-run] [--answer id=choice]` | Go owns answer/drop/batch resolution, transactional close, and fail-closed v5 schema normalization. |
44
+ | Workspace observation | `observe summary`, `orient`, `observe slice <slug> <SLICE-ID>` | JSON workspace snapshot for agents (cursor, task graph, `artifact_budgets`, `bulk_files`); `orient` is an alias for `observe summary`. `observe slice` prints one `SLICE-###` section of `tasks.md` so Build reads a slice, not the file. |
45
+ | Atomic workspace state | `state resolve`, `state merge-manifest`, `state close`, `migrate [--dry-run] [--answer id=choice]` | Go owns answer/drop/batch resolution, the recorded predecessor-chain manifest union for a release milestone, transactional close, and fail-closed v5 schema normalization. |
46
46
  | Security | `secret-scan` | `/rite-ship`, safe hooks, or an operator scans staged blobs, stdin, or touched files. |
47
47
  | Install/operator | `install`, `update`, `uninstall`, `version` | Direct update acquires latest; npm/bootstrap may supply local candidates; the engine performs manifest-owned local changes. |
48
48
  | Native policy | no engine command | Skills/root own spec grammar re-read, qid allocation, Clarify cursor edits, AFK/recovery accounting, and read-only `/rite-doctor`. |
@@ -147,6 +147,18 @@ There is no recovery-counter artifact. The caller and recovery loop count at
147
147
  most three failed attempts per causal fingerprint from current context and the
148
148
  recorded `## Dead ends` / `evidence.md`, then stop before a fourth.
149
149
 
150
+ For a deferred-ship continuation chain (`.devrites/AFK` `continue_sequence`),
151
+ three optional cursor fields carry the chain: `sequence_parent` (the immediately
152
+ preceding workspace slug), `sequence_position` (1-based ordinal), and
153
+ `sequence_workspaces_remaining` (slots the chain may still open). The controlling
154
+ root seeds them once per continuation workspace from the recorded parent and the
155
+ parent's counter; values only decrease, malformed values fail closed, and a
156
+ workspace without a recorded parent/position is not a sequence member. The
157
+ release milestone additionally carries `sequence_role: release`, which makes
158
+ `check candidate` and `check seal` require its manifest to cover the whole
159
+ recorded chain (built by `state merge-manifest`).
160
+ `observe summary`/`orient` surface them under `sequence`.
161
+
150
162
  <!-- authority:state-tracking:start -->
151
163
  Git-tracked shared state: `.devrites/specs/`. Per-clone runtime state: `.devrites/work/`, `.devrites/archive/`, `.devrites/ACTIVE`.
152
164
  <!-- authority:state-tracking:end -->
package/docs/flow.md CHANGED
@@ -351,6 +351,10 @@ erDiagram
351
351
  string status "running | awaiting_human | blocked | done"
352
352
  string active_slice "N: name"
353
353
  int afk_slices_remaining "root-owned; never negative; one charge per green built slice"
354
+ string sequence_parent "deferred-ship chain: preceding workspace slug"
355
+ int sequence_position "1-based ordinal in the recorded continuation chain"
356
+ int sequence_workspaces_remaining "chain slots still open after this workspace; never negative"
357
+ string sequence_role "release on the release milestone; gates then require the chain union"
354
358
  string return_phase "durable later-phase clarify return"
355
359
  string return_next_action "restored only after fresh CLEAR"
356
360
  block awaiting_human "qid, gate, question, proposed, raised_at (only when paused)"
@@ -127,8 +127,11 @@ conflict, extra paths, moved base, or cleanup failure stops with worktree eviden
127
127
  preserved. No ad hoc copy/cherry-pick/merge occurs from the read-only root.
128
128
 
129
129
  Isolation does not authorize same-worktree throughput. Parallel writers are allowed
130
- **only** under `/rite-build --parallel N` when path-disjoint eligibility, abort-batch,
131
- and a control `parallel-lease.md` apply (see
130
+ **only** under the `/rite-build` batch path when path-disjoint eligibility, abort-batch,
131
+ and a control `parallel-lease.md` apply. `--parallel N` (or the AFK sentinel
132
+ `max_parallel`, default cap 10 under `/rite-autocomplete`) is a **cap**: each round runs
133
+ the largest eligible set, recomputes after every integrate, and repeats until no pending
134
+ slice remains; fewer than two eligible slices fall back to the serial cycle (see
132
135
  [`parallel-batch.md`](../pack/.claude/skills/rite-build/reference/parallel-batch.md)).
133
136
  Same-worktree multi-writer and root-emulated worktrees remain forbidden; default
134
137
  `/rite-build` stays one writer across linked worktrees.
@@ -31,7 +31,7 @@ func rootModeFor(command string, args []string) rootMode {
31
31
  return rootLenient
32
32
  case "state":
33
33
  switch subcommand {
34
- case "resolve", "close":
34
+ case "resolve", "merge-manifest", "close":
35
35
  return rootStrict
36
36
  }
37
37
  return rootUnused
@@ -49,7 +49,7 @@ func rootModeFor(command string, args []string) rootMode {
49
49
  return rootStrictUsage
50
50
  case "observe":
51
51
  switch subcommand {
52
- case "summary":
52
+ case "summary", "slice":
53
53
  return rootStrictUsage
54
54
  }
55
55
  return rootUnused
@@ -16,9 +16,12 @@ const (
16
16
  ClaudeSkillsTarget = ".claude/skills"
17
17
  CodexSkillsTarget = ".agents/skills"
18
18
  OmpSkillsTarget = ".omp/skills"
19
+ PiSkillsTarget = ".pi/skills"
19
20
  ClaudeAgentsTarget = ".claude/agents"
20
21
  CodexAgentsTarget = ".codex/agents"
21
22
  OmpAgentsTarget = ".omp/agents"
23
+ PiAgentsTarget = ".pi/agents"
24
+ PiPromptsTarget = ".pi/prompts"
22
25
  ClaudeWorkflowsTarget = ".claude/workflows"
23
26
 
24
27
  ManifestName = ".claude/devrites.manifest"
@@ -118,6 +121,21 @@ func ArchiveDirChecked(root string) (string, error) {
118
121
  return checkedCanonicalDir(root, filepath.Join(root, "archive"), "archive", "")
119
122
  }
120
123
 
124
+ // ExistingArchivedFeatureDirChecked resolves an archived feature directory that
125
+ // must already exist. A live workspace never satisfies this lookup; callers
126
+ // that accept either location try ExistingFeatureDirChecked first.
127
+ func ExistingArchivedFeatureDirChecked(root, slug string) (string, error) {
128
+ if !validSlug(slug) {
129
+ return "", fmt.Errorf("DRV-WORKSPACE-INVALID: %q is not a feature slug", slug)
130
+ }
131
+ candidate := filepath.Join(root, "archive", slug)
132
+ resolved, err := checkedCanonicalDir(root, candidate, filepath.Join("archive", slug), "")
133
+ if err != nil {
134
+ return "", err
135
+ }
136
+ return resolved, nil
137
+ }
138
+
121
139
  func checkedCanonicalDir(root, candidate, parent, slug string) (string, error) {
122
140
  resolvedRoot, err := safepath.ResolveExisting(root)
123
141
  if err != nil {
@@ -51,9 +51,38 @@ func Check(kind Kind, root, slug string) (*Result, error) {
51
51
  if err != nil {
52
52
  return nil, fmt.Errorf("gate %s: %w", kind, err)
53
53
  }
54
+ for _, problem := range unsanctionedRootFiles(observation) {
55
+ result.StateProblems = append(result.StateProblems, "placement: "+problem)
56
+ // Keep a more specific reason (readiness-stale) when the observation
57
+ // already blocked; only an otherwise-passing gate takes the generic one.
58
+ if !result.Blocked {
59
+ result.Blocked = true
60
+ result.ReasonID = ResultReasonID(kind, true)
61
+ }
62
+ }
54
63
  return result, nil
55
64
  }
56
65
 
66
+ // unsanctionedRootFiles blocks a workspace-root file the schema does not place
67
+ // there and is over the packet ceiling. `packets/` owns by-reference dispatch
68
+ // packets and admitted accounts (<= 64 KiB each) and `history/` owns relocated
69
+ // narrative, so a large stray file in the root is misplaced payload — the shape
70
+ // that let a real workspace reach 71 MB, 83% of it reviewer packets and traces
71
+ // (see context-hygiene.md dispatch packets and its failing case).
72
+ func unsanctionedRootFiles(observation *state.WorkspaceObservation) []string {
73
+ var problems []string
74
+ for _, file := range observation.RootFiles() {
75
+ if state.SanctionedRootFile(file.Name) || file.Bytes <= state.PacketMaxBytes {
76
+ continue
77
+ }
78
+ problems = append(problems, fmt.Sprintf(
79
+ "%s is %d bytes in the workspace root; move dispatch packets and accounts to packets/ (<= %d bytes each), closed narrative to history/ via /rite-plan revise, and never persist transcripts anywhere in .devrites/",
80
+ file.Name, file.Bytes, state.PacketMaxBytes,
81
+ ))
82
+ }
83
+ return problems
84
+ }
85
+
57
86
  func checkObservation(kind Kind, observation *state.WorkspaceObservation) (*Result, error) {
58
87
  phase, err := observation.DeclaredPhase()
59
88
  if err != nil {
@@ -109,6 +138,28 @@ func checkObservation(kind Kind, observation *state.WorkspaceObservation) (*Resu
109
138
  blocked = true
110
139
  }
111
140
  }
141
+ if len(missingFiles) == 0 {
142
+ for _, problem := range artifactBudgetProblems(observation, policy) {
143
+ stateProblems = append(stateProblems, "budget: "+problem)
144
+ blocked = true
145
+ }
146
+ }
147
+ // Deliberately not gated on missingFiles: a file over the read cap IS missing,
148
+ // so the budget comparison below can never reach it. Missing already blocks it;
149
+ // name the size remedies too so the signal is actionable rather than a bare cap.
150
+ for _, artifact := range policy.RequiredArtifacts {
151
+ fact, ok := observation.Fact(artifact)
152
+ if !ok {
153
+ continue
154
+ }
155
+ if diagnostic, has := fact.Diagnostic(); has && diagnostic.Code == state.DiagnosticFileTooLarge {
156
+ stateProblems = append(stateProblems, fmt.Sprintf(
157
+ "budget: %s exceeds the %d-byte artifact cap; relocate history (history/<file>-<YYYYMMDD>.md) or split the feature via /rite-plan revise|course-correct",
158
+ artifact, state.MaxArtifactBytes,
159
+ ))
160
+ blocked = true
161
+ }
162
+ }
112
163
  if len(missingFiles) == 0 && phaseRequiresReadinessBinding(policy) {
113
164
  expected, bindingErr := verifyReadinessBinding(observation)
114
165
  if bindingErr != nil {
@@ -142,6 +193,33 @@ func checkObservation(kind Kind, observation *state.WorkspaceObservation) (*Resu
142
193
  return result, nil
143
194
  }
144
195
 
196
+ // artifactBudgetProblems blocks a required artifact only on a material overshoot
197
+ // (>= state.BudgetBlockFactor of a line or byte budget) with no structural
198
+ // `Budget override:` line. Smaller overshoots stay advisory and are reported by
199
+ // `orient`.
200
+ func artifactBudgetProblems(observation *state.WorkspaceObservation, policy state.PhasePolicy) []string {
201
+ var problems []string
202
+ for _, artifact := range policy.RequiredArtifacts {
203
+ fact, ok := observation.Fact(artifact)
204
+ if !ok || fact.State() != state.ArtifactPresent {
205
+ continue
206
+ }
207
+ if !state.ArtifactBudgetGateApplies(string(artifact)) {
208
+ continue
209
+ }
210
+ status, ok := state.ArtifactBudget(string(artifact), fact.Bytes())
211
+ if !ok || !status.Material || status.Override {
212
+ continue
213
+ }
214
+ problems = append(problems, fmt.Sprintf(
215
+ "%s is %d lines/%d bytes, at or above %gx its %d-line/%d-byte budget; relocate history (history/<file>-<YYYYMMDD>.md) or split the feature via /rite-plan revise|course-correct, or record a structural `Budget override: <reason>` line",
216
+ status.File, status.Lines, status.Bytes, state.BudgetBlockFactor,
217
+ status.LineBudget, status.ByteBudget,
218
+ ))
219
+ }
220
+ return problems
221
+ }
222
+
145
223
  func acceptanceMapProblems(observation *state.WorkspaceObservation, policy state.PhasePolicy) []string {
146
224
  requireTasks := phaseRequiresTasks(policy)
147
225
  requireTestPlan := phaseRequiresTestPlan(policy)
@@ -636,3 +636,121 @@ func writeWorkFeature(t *testing.T, root, slug string, files map[string]string)
636
636
  testutil.WriteFile(t, filepath.Join(root, "work", slug, name), content)
637
637
  }
638
638
  }
639
+
640
+ func TestCheckBlocksMaterialBudgetOvershootWithoutOverride(t *testing.T) {
641
+ root := t.TempDir()
642
+ writeCompleteGateFeature(t, root, "oversized", state.PhaseBuild, state.PhaseBuild, "none\n")
643
+ workspace := filepath.Join(root, "work", "oversized")
644
+ oversized := "# Tasks\n\n## SLICE-001 A\nDependencies: none\n\n" + strings.Repeat("long line of planning prose\n", 500)
645
+ testutil.WriteFile(t, filepath.Join(workspace, "tasks.md"), oversized)
646
+ binding := mustReadinessBinding(t, root, "oversized")
647
+ testutil.AppendFile(t, filepath.Join(workspace, "eng-review.md"), "\n"+binding+"\n")
648
+
649
+ res, err := Check(Readiness, root, "oversized")
650
+ if err != nil {
651
+ t.Fatal(err)
652
+ }
653
+ if !res.Blocked {
654
+ t.Fatalf("blocked=false, want true")
655
+ }
656
+ joined := strings.Join(res.StateProblems, "\n")
657
+ if !strings.Contains(joined, "budget: tasks.md is") || !strings.Contains(joined, "Budget override") {
658
+ t.Fatalf("StateProblems=%q", joined)
659
+ }
660
+
661
+ testutil.AppendFile(t, filepath.Join(workspace, "tasks.md"), "\nBudget override: vendored requirement matrix, relocation pending\n")
662
+ res, err = Check(Readiness, root, "oversized")
663
+ if err != nil {
664
+ t.Fatal(err)
665
+ }
666
+ if strings.Contains(strings.Join(res.StateProblems, "\n"), "budget: tasks.md") {
667
+ t.Fatalf("override did not clear the budget problem: %v", res.StateProblems)
668
+ }
669
+ }
670
+
671
+ func TestCheckKeepsNonMaterialOvershootAdvisory(t *testing.T) {
672
+ root := t.TempDir()
673
+ writeCompleteGateFeature(t, root, "slightly-over", state.PhaseBuild, state.PhaseBuild, "none\n")
674
+ workspace := filepath.Join(root, "work", "slightly-over")
675
+ // 300 lines against a 280-line budget: over, but below the material factor.
676
+ testutil.WriteFile(t, filepath.Join(workspace, "tasks.md"), testutil.CanonicalTasksMarkdown+"\n"+strings.Repeat("note\n", 200))
677
+ binding := mustReadinessBinding(t, root, "slightly-over")
678
+ testutil.AppendFile(t, filepath.Join(workspace, "eng-review.md"), "\n"+binding+"\n")
679
+
680
+ res, err := Check(Readiness, root, "slightly-over")
681
+ if err != nil {
682
+ t.Fatal(err)
683
+ }
684
+ if strings.Contains(strings.Join(res.StateProblems, "\n"), "budget:") {
685
+ t.Fatalf("non-material overshoot must stay advisory: %v", res.StateProblems)
686
+ }
687
+ }
688
+
689
+ func TestCheckBlocksOversizedPacketInWorkspaceRoot(t *testing.T) {
690
+ root := t.TempDir()
691
+ writeCompleteGateFeature(t, root, "stray", state.PhaseBuild, state.PhaseBuild, "none\n")
692
+ workspace := filepath.Join(root, "work", "stray")
693
+ binding := mustReadinessBinding(t, root, "stray")
694
+ testutil.AppendFile(t, filepath.Join(workspace, "eng-review.md"), "\n"+binding+"\n")
695
+
696
+ // Sanctioned conditional artifact over the ceiling: placement stays legal.
697
+ testutil.WriteFile(t, filepath.Join(workspace, "references.md"),
698
+ "# refs\n\n"+strings.Repeat("reference line\n", 6000))
699
+ // Unsanctioned root payload over the ceiling: blocked.
700
+ testutil.WriteFile(t, filepath.Join(workspace, "vet-review-input-031.json"),
701
+ strings.Repeat("x", state.PacketMaxBytes+1))
702
+
703
+ res, err := Check(Readiness, root, "stray")
704
+ if err != nil {
705
+ t.Fatal(err)
706
+ }
707
+ joined := strings.Join(res.StateProblems, "\n")
708
+ if !res.Blocked || !strings.Contains(joined, "placement: vet-review-input-031.json") {
709
+ t.Fatalf("blocked=%v StateProblems=%q", res.Blocked, joined)
710
+ }
711
+ if !strings.Contains(joined, "packets/") {
712
+ t.Fatalf("remediation must name packets/: %q", joined)
713
+ }
714
+ if strings.Contains(joined, "references.md") {
715
+ t.Fatalf("sanctioned root artifact must not be treated as misplaced: %q", joined)
716
+ }
717
+ }
718
+
719
+ func TestCheckNamesSizeRemediesForArtifactOverReadCap(t *testing.T) {
720
+ root := t.TempDir()
721
+ writeCompleteGateFeature(t, root, "huge", state.PhaseBuild, state.PhaseBuild, "none\n")
722
+ workspace := filepath.Join(root, "work", "huge")
723
+ // Over the read cap, so the artifact cannot be measured against its line budget.
724
+ // No binding: an over-cap file cannot be hashed into one, and this asserts the
725
+ // size signal alone rather than a passing gate.
726
+ testutil.WriteFile(t, filepath.Join(workspace, "tasks.md"),
727
+ "# Tasks\n\n"+strings.Repeat("n\n", state.MaxArtifactBytes/2+1))
728
+
729
+ res, err := Check(Readiness, root, "huge")
730
+ if err != nil {
731
+ t.Fatal(err)
732
+ }
733
+ joined := strings.Join(res.StateProblems, "\n")
734
+ if !res.Blocked || !strings.Contains(joined, "budget: tasks.md exceeds the") {
735
+ t.Fatalf("blocked=%v StateProblems=%q", res.Blocked, joined)
736
+ }
737
+ if !strings.Contains(joined, "history/") || !strings.Contains(joined, "/rite-plan") {
738
+ t.Fatalf("size remedies must be named: %q", joined)
739
+ }
740
+ }
741
+
742
+ func TestCheckLeavesProofLedgerOvershootAdvisory(t *testing.T) {
743
+ root := t.TempDir()
744
+ writeCompleteGateFeature(t, root, "big-ledger", state.PhaseProve, state.PhaseProve, "none\n")
745
+ workspace := filepath.Join(root, "work", "big-ledger")
746
+ testutil.WriteFile(t, filepath.Join(workspace, "evidence.md"), strings.Repeat("EVID-001 proof line\n", 800))
747
+ testutil.WriteFile(t, filepath.Join(workspace, "touched-files.md"), strings.Repeat("trail line\n", 600))
748
+
749
+ res, err := Check(Readiness, root, "big-ledger")
750
+ if err != nil {
751
+ t.Fatal(err)
752
+ }
753
+ if joined := strings.Join(res.StateProblems, "\n"); strings.Contains(joined, "budget:") {
754
+ t.Fatalf("proof ledgers must stay advisory: %v", res.StateProblems)
755
+ }
756
+ }
@@ -17,9 +17,12 @@ const (
17
17
  ClaudeSkillsTarget = devritespaths.ClaudeSkillsTarget
18
18
  CodexSkillsTarget = devritespaths.CodexSkillsTarget
19
19
  OmpSkillsTarget = devritespaths.OmpSkillsTarget
20
+ PiSkillsTarget = devritespaths.PiSkillsTarget
20
21
  ClaudeAgentsTarget = devritespaths.ClaudeAgentsTarget
21
22
  CodexAgentsTarget = devritespaths.CodexAgentsTarget
22
23
  OmpAgentsTarget = devritespaths.OmpAgentsTarget
24
+ PiAgentsTarget = devritespaths.PiAgentsTarget
25
+ PiPromptsTarget = devritespaths.PiPromptsTarget
23
26
  ClaudeWorkflowsTarget = devritespaths.ClaudeWorkflowsTarget
24
27
  )
25
28
 
@@ -87,6 +90,15 @@ var ClaudeSettingsMerge = JSONMerge{
87
90
  DryRunText: ".claude/settings.json (DevRites permissions)",
88
91
  }
89
92
 
93
+ var PiAgentsMerge = MarkerMerge{
94
+ TargetRel: "AGENTS.md",
95
+ PayloadRel: "pi/AGENTS.md",
96
+ Begin: "<!-- BEGIN DEVRITES PI -->",
97
+ End: "<!-- END DEVRITES PI -->",
98
+ MarkerRel: ".claude/devrites.pi-agents-merge",
99
+ MarkerText: "AGENTS.md contains a DevRites managed block between BEGIN/END DEVRITES PI markers.",
100
+ }
101
+
90
102
  var CodexConfigMerge = MarkerMerge{
91
103
  TargetRel: ".codex/config.toml",
92
104
  PayloadRel: "codex/config.toml",
@@ -108,7 +120,14 @@ var managedMerges = []ManagedMerge{
108
120
  TargetRel: CodexAgentsMerge.TargetRel,
109
121
  Begin: CodexAgentsMerge.Begin,
110
122
  End: CodexAgentsMerge.End,
111
- DryRun: "AGENTS.md DevRites block",
123
+ DryRun: "AGENTS.md DevRites Codex block",
124
+ },
125
+ {
126
+ MarkerRel: PiAgentsMerge.MarkerRel,
127
+ TargetRel: PiAgentsMerge.TargetRel,
128
+ Begin: PiAgentsMerge.Begin,
129
+ End: PiAgentsMerge.End,
130
+ DryRun: "AGENTS.md DevRites pi block",
112
131
  },
113
132
  {
114
133
  MarkerRel: CodexConfigMerge.MarkerRel,
@@ -125,7 +144,7 @@ var managedMerges = []ManagedMerge{
125
144
  LegacyCodexHooksMerge,
126
145
  }
127
146
 
128
- func RequiredPayload(withCodex, withOmp bool) []string {
147
+ func RequiredPayload(withCodex, withOmp, withPi bool) []string {
129
148
  required := []string{
130
149
  "claude/skills",
131
150
  "claude/agents",
@@ -147,11 +166,19 @@ func RequiredPayload(withCodex, withOmp bool) []string {
147
166
  "omp/.omp-plugin/plugin.json",
148
167
  )
149
168
  }
169
+ if withPi {
170
+ required = append(required,
171
+ "pi/skills",
172
+ "pi/agents",
173
+ "pi/prompts",
174
+ "pi/AGENTS.md",
175
+ )
176
+ }
150
177
  return required
151
178
  }
152
179
 
153
- func ValidatePayload(payload fs.FS, withCodex, withOmp bool) error {
154
- for _, rel := range RequiredPayload(withCodex, withOmp) {
180
+ func ValidatePayload(payload fs.FS, withCodex, withOmp, withPi bool) error {
181
+ for _, rel := range RequiredPayload(withCodex, withOmp, withPi) {
155
182
  if _, err := fs.Stat(payload, rel); err != nil {
156
183
  return fmt.Errorf("missing %s", rel)
157
184
  }
@@ -159,7 +186,7 @@ func ValidatePayload(payload fs.FS, withCodex, withOmp bool) error {
159
186
  return nil
160
187
  }
161
188
 
162
- func InstallTrees(withSkills, withAgents, withCodex, withOmp bool) []Tree {
189
+ func InstallTrees(withSkills, withAgents, withCodex, withOmp, withPi bool) []Tree {
163
190
  var trees []Tree
164
191
  if withSkills {
165
192
  trees = append(trees, Tree{PayloadPrefix: "claude/skills", TargetPrefix: ClaudeSkillsTarget})
@@ -169,6 +196,12 @@ func InstallTrees(withSkills, withAgents, withCodex, withOmp bool) []Tree {
169
196
  if withOmp {
170
197
  trees = append(trees, Tree{PayloadPrefix: "omp/skills", TargetPrefix: OmpSkillsTarget})
171
198
  }
199
+ if withPi {
200
+ trees = append(trees,
201
+ Tree{PayloadPrefix: "pi/skills", TargetPrefix: PiSkillsTarget},
202
+ Tree{PayloadPrefix: "pi/prompts", TargetPrefix: PiPromptsTarget},
203
+ )
204
+ }
172
205
  }
173
206
  if withAgents {
174
207
  trees = append(trees, Tree{PayloadPrefix: "claude/agents", TargetPrefix: ClaudeAgentsTarget})
@@ -178,6 +211,9 @@ func InstallTrees(withSkills, withAgents, withCodex, withOmp bool) []Tree {
178
211
  if withOmp {
179
212
  trees = append(trees, Tree{PayloadPrefix: "omp/agents", TargetPrefix: OmpAgentsTarget})
180
213
  }
214
+ if withPi {
215
+ trees = append(trees, Tree{PayloadPrefix: "pi/agents", TargetPrefix: PiAgentsTarget})
216
+ }
181
217
  }
182
218
  if withSkills && withAgents {
183
219
  trees = append(trees, Tree{PayloadPrefix: "claude/workflows", TargetPrefix: ClaudeWorkflowsTarget})
@@ -185,7 +221,7 @@ func InstallTrees(withSkills, withAgents, withCodex, withOmp bool) []Tree {
185
221
  return trees
186
222
  }
187
223
 
188
- func AliasTargets(alias Alias, withCodex, withOmp bool) []string {
224
+ func AliasTargets(alias Alias, withCodex, withOmp, withPi bool) []string {
189
225
  targets := []string{filepath.ToSlash(filepath.Join(ClaudeSkillsTarget, alias.Name, "SKILL.md"))}
190
226
  if withCodex {
191
227
  targets = append(targets, filepath.ToSlash(filepath.Join(CodexSkillsTarget, alias.Name, "SKILL.md")))
@@ -193,6 +229,9 @@ func AliasTargets(alias Alias, withCodex, withOmp bool) []string {
193
229
  if withOmp {
194
230
  targets = append(targets, filepath.ToSlash(filepath.Join(OmpSkillsTarget, alias.Name, "SKILL.md")))
195
231
  }
232
+ if withPi {
233
+ targets = append(targets, filepath.ToSlash(filepath.Join(PiSkillsTarget, alias.Name, "SKILL.md")))
234
+ }
196
235
  return targets
197
236
  }
198
237
 
@@ -21,70 +21,86 @@ func TestValidatePayloadRequiresClaudeAndCodexFiles(t *testing.T) {
21
21
  "omp/skills/rite/SKILL.md": {},
22
22
  "omp/agents/devrites-code-reviewer.md": {},
23
23
  "omp/.omp-plugin/plugin.json": {},
24
+ "pi/skills/rite/SKILL.md": {},
25
+ "pi/agents/devrites-code-reviewer.md": {},
26
+ "pi/prompts/rite.md": {},
27
+ "pi/AGENTS.md": {},
24
28
  }
25
- if err := ValidatePayload(payload, true, true); err != nil {
29
+ if err := ValidatePayload(payload, true, true, true); err != nil {
26
30
  t.Fatal(err)
27
31
  }
28
32
  delete(payload, "codex/config.toml")
29
- err := ValidatePayload(payload, true, true)
33
+ err := ValidatePayload(payload, true, true, true)
30
34
  if err == nil || !strings.Contains(err.Error(), "missing codex/config.toml") {
31
35
  t.Fatalf("ValidatePayload error = %v, want missing codex/config.toml", err)
32
36
  }
33
- if err := ValidatePayload(payload, false, true); err != nil {
37
+ if err := ValidatePayload(payload, false, true, true); err != nil {
34
38
  t.Fatalf("claude-only payload should not require codex files: %v", err)
35
39
  }
36
40
  delete(payload, "omp/.omp-plugin/plugin.json")
37
- err = ValidatePayload(payload, false, true)
41
+ err = ValidatePayload(payload, false, true, true)
38
42
  if err == nil || !strings.Contains(err.Error(), "missing omp/.omp-plugin/plugin.json") {
39
43
  t.Fatalf("ValidatePayload error = %v, want missing omp/.omp-plugin/plugin.json", err)
40
44
  }
41
- if err := ValidatePayload(payload, false, false); err != nil {
42
- t.Fatalf("claude-only payload should not require omp files: %v", err)
45
+ delete(payload, "pi/prompts/rite.md")
46
+ err = ValidatePayload(payload, false, false, true)
47
+ if err == nil || !strings.Contains(err.Error(), "missing pi/prompts") {
48
+ t.Fatalf("ValidatePayload error = %v, want missing pi/prompts", err)
49
+ }
50
+ if err := ValidatePayload(payload, false, false, false); err != nil {
51
+ t.Fatalf("claude-only payload should not require omp or pi files: %v", err)
43
52
  }
44
53
  }
45
54
 
46
55
  func TestInstallTreesMapPayloadsToTargets(t *testing.T) {
47
- got := InstallTrees(true, true, true, true)
56
+ got := InstallTrees(true, true, true, true, true)
48
57
  want := []Tree{
49
58
  {PayloadPrefix: "claude/skills", TargetPrefix: ".claude/skills"},
50
59
  {PayloadPrefix: "codex/skills", TargetPrefix: ".agents/skills"},
51
60
  {PayloadPrefix: "omp/skills", TargetPrefix: ".omp/skills"},
61
+ {PayloadPrefix: "pi/skills", TargetPrefix: ".pi/skills"},
62
+ {PayloadPrefix: "pi/prompts", TargetPrefix: ".pi/prompts"},
52
63
  {PayloadPrefix: "claude/agents", TargetPrefix: ".claude/agents"},
53
64
  {PayloadPrefix: "codex/agents", TargetPrefix: ".codex/agents"},
54
65
  {PayloadPrefix: "omp/agents", TargetPrefix: ".omp/agents"},
66
+ {PayloadPrefix: "pi/agents", TargetPrefix: ".pi/agents"},
55
67
  {PayloadPrefix: "claude/workflows", TargetPrefix: ".claude/workflows"},
56
68
  }
57
69
  if !reflect.DeepEqual(got, want) {
58
70
  t.Fatalf("InstallTrees() = %#v, want %#v", got, want)
59
71
  }
60
- for _, trees := range [][]Tree{InstallTrees(true, false, true, true), InstallTrees(false, true, true, true)} {
72
+ for _, trees := range [][]Tree{InstallTrees(true, false, true, true, true), InstallTrees(false, true, true, true, true)} {
61
73
  for _, tree := range trees {
62
74
  if tree.PayloadPrefix == "claude/workflows" {
63
75
  t.Fatal("Claude workflow installed without both skills and agents")
64
76
  }
65
77
  }
66
78
  }
67
- for _, tree := range InstallTrees(true, true, true, false) {
79
+ for _, tree := range InstallTrees(true, true, true, false, false) {
68
80
  if strings.HasPrefix(tree.TargetPrefix, ".omp/") {
69
81
  t.Fatalf("omp tree installed with withOmp=false: %#v", tree)
70
82
  }
83
+ if strings.HasPrefix(tree.TargetPrefix, ".pi/") {
84
+ t.Fatalf("pi tree installed with withPi=false: %#v", tree)
85
+ }
71
86
  }
72
87
  }
73
88
 
74
89
  func TestAliasTargetsIncludeOmpWhenEnabled(t *testing.T) {
75
- got := AliasTargets(Alias{Name: "define"}, true, true)
90
+ got := AliasTargets(Alias{Name: "define"}, true, true, true)
76
91
  want := []string{
77
92
  ".claude/skills/define/SKILL.md",
78
93
  ".agents/skills/define/SKILL.md",
79
94
  ".omp/skills/define/SKILL.md",
95
+ ".pi/skills/define/SKILL.md",
80
96
  }
81
97
  if !reflect.DeepEqual(got, want) {
82
98
  t.Fatalf("AliasTargets() = %#v, want %#v", got, want)
83
99
  }
84
- got = AliasTargets(Alias{Name: "define"}, true, false)
100
+ got = AliasTargets(Alias{Name: "define"}, true, false, false)
85
101
  for _, rel := range got {
86
- if strings.HasPrefix(rel, ".omp/") {
87
- t.Fatalf("omp alias installed with withOmp=false: %s", rel)
102
+ if strings.HasPrefix(rel, ".omp/") || strings.HasPrefix(rel, ".pi/") {
103
+ t.Fatalf("disabled-host alias installed: %s", rel)
88
104
  }
89
105
  }
90
106
  }