devrites 4.7.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (785) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/NOTICE.md +6 -0
  3. package/README.md +33 -10
  4. package/SECURITY.md +3 -3
  5. package/bin/devrites.mjs +1 -0
  6. package/docs/adr/0027-content-bound-build-readiness.md +8 -0
  7. package/docs/adr/README.md +1 -1
  8. package/docs/architecture.md +8 -4
  9. package/docs/command-map.md +3 -2
  10. package/docs/engine/commands.md +10 -8
  11. package/docs/flow.md +1 -1
  12. package/docs/orchestration.md +4 -2
  13. package/docs/quick-reference.md +5 -0
  14. package/docs/release.md +55 -7
  15. package/docs/skills.md +3 -3
  16. package/docs/usage.md +1 -0
  17. package/engine/.golangci.yml +27 -0
  18. package/engine/AGENTS.md +24 -0
  19. package/engine/Makefile +20 -5
  20. package/engine/cmd/releasepack/main.go +2 -2
  21. package/engine/cmd/releasepack/main_test.go +4 -4
  22. package/engine/commands.go +4 -0
  23. package/engine/internal/devritespaths/paths.go +3 -0
  24. package/engine/internal/fsutil/copy.go +2 -0
  25. package/engine/internal/gate/gate.go +30 -0
  26. package/engine/internal/gate/readiness_binding.go +10 -7
  27. package/engine/internal/gate/readiness_binding_test.go +43 -1
  28. package/engine/internal/hostpack/hostpack.go +23 -5
  29. package/engine/internal/hostpack/hostpack_test.go +41 -5
  30. package/engine/internal/install/apply.go +14 -4
  31. package/engine/internal/install/binary.go +5 -1
  32. package/engine/internal/install/install.go +13 -3
  33. package/engine/internal/install/install_test.go +12 -5
  34. package/engine/internal/install/manifest.go +3 -0
  35. package/engine/internal/install/merge.go +5 -0
  36. package/engine/internal/install/preflight.go +4 -3
  37. package/engine/internal/install/update.go +2 -1
  38. package/engine/internal/lib/candidate.go +4 -2
  39. package/engine/internal/lib/candidate_test.go +1 -1
  40. package/engine/internal/lib/environment_report.go +109 -0
  41. package/engine/internal/lib/environment_report_test.go +54 -0
  42. package/engine/internal/lib/migrate.go +1 -0
  43. package/engine/internal/lib/open_visual.go +5 -0
  44. package/engine/internal/lib/resolve.go +3 -0
  45. package/engine/internal/lib/secretscan.go +1 -0
  46. package/engine/internal/lib/skilltrust.go +2 -1
  47. package/engine/internal/lib/util.go +1 -0
  48. package/engine/internal/lib/workspace_read.go +1 -0
  49. package/engine/internal/markdowntext/markdowntext_fuzz_test.go +36 -0
  50. package/engine/internal/parallel/cli.go +1 -0
  51. package/engine/internal/parallel/git.go +1 -0
  52. package/engine/internal/parallel/lease.go +1 -0
  53. package/engine/internal/parallel/pathdisjoint.go +6 -0
  54. package/engine/internal/parallel/pathdisjoint_fuzz_test.go +43 -0
  55. package/engine/internal/parallel/pathdisjoint_test.go +4 -1
  56. package/engine/internal/parallel/testdata/fuzz/FuzzPathDisjoint/a449b81b4711b7b4 +3 -0
  57. package/engine/internal/release/release.go +8 -4
  58. package/engine/internal/rootfacts/facts.go +3 -0
  59. package/engine/internal/safepath/safepath_fuzz_test.go +21 -0
  60. package/engine/internal/state/acceptance.go +87 -0
  61. package/engine/internal/state/acceptance_test.go +57 -0
  62. package/engine/internal/state/cursor.go +55 -14
  63. package/engine/internal/state/cursor_fuzz_test.go +80 -0
  64. package/engine/internal/state/lock_unix.go +1 -0
  65. package/engine/internal/state/observation.go +3 -3
  66. package/engine/internal/state/observation_test.go +1 -1
  67. package/engine/internal/state/taskgraph_fuzz_test.go +38 -0
  68. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/114b28f68c1fa4db +4 -0
  69. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/378a0f2218e812ea +4 -0
  70. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/39eaa26fcb481e3c +4 -0
  71. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/776ca1dc0143acf0 +4 -0
  72. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/9295930c1ebb81df +4 -0
  73. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/a60de309dc33be0d +4 -0
  74. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f04dc7b06ef7c99f +4 -0
  75. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f3000ac510878bd6 +4 -0
  76. package/engine/internal/state/testdata/fuzz/FuzzWorkspaceSchemaRow/a75aabb9f2a847d5 +2 -0
  77. package/engine/internal/state/workspaceschema_fuzz_test.go +27 -0
  78. package/engine/internal/state/write.go +3 -2
  79. package/engine/internal/testutil/testutil.go +4 -2
  80. package/engine/main.go +19 -1
  81. package/engine/observation_contract_test.go +174 -0
  82. package/engine/root_routing_test.go +14 -3
  83. package/engine/tests/adr_0027_readiness_binding_test.go +1 -1
  84. package/engine/tests/cli_test.go +2 -2
  85. package/engine/tests/gate_test.go +2 -2
  86. package/pack/.claude/agents/devrites-code-reviewer.md +10 -8
  87. package/pack/.claude/agents/devrites-devex-reviewer.md +4 -6
  88. package/pack/.claude/agents/devrites-evidence-scout.md +13 -2
  89. package/pack/.claude/agents/devrites-frontend-reviewer.md +35 -15
  90. package/pack/.claude/agents/devrites-performance-reviewer.md +4 -7
  91. package/pack/.claude/agents/devrites-plan-reviewer.md +5 -3
  92. package/pack/.claude/agents/devrites-proof-runner.md +1 -1
  93. package/pack/.claude/agents/devrites-retrospector.md +7 -1
  94. package/pack/.claude/agents/devrites-security-auditor.md +6 -5
  95. package/pack/.claude/agents/devrites-simplifier-reviewer.md +3 -2
  96. package/pack/.claude/agents/devrites-slice-wright.md +7 -11
  97. package/pack/.claude/agents/devrites-spec-reviewer.md +3 -2
  98. package/pack/.claude/agents/devrites-strategy-reviewer.md +4 -4
  99. package/pack/.claude/agents/devrites-test-analyst.md +2 -1
  100. package/pack/.claude/skills/devrites-api-interface/SKILL.md +9 -9
  101. package/pack/.claude/skills/devrites-audit/SKILL.md +3 -1
  102. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +9 -2
  103. package/pack/.claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +3 -10
  104. package/pack/.claude/skills/devrites-debug-recovery/reference/regression-test.md +1 -1
  105. package/pack/.claude/skills/devrites-doubt/SKILL.md +5 -7
  106. package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +6 -16
  107. package/pack/.claude/skills/devrites-frontend-craft/reference/craft.md +5 -13
  108. package/pack/.claude/skills/devrites-frontend-craft/reference/design-references.md +2 -3
  109. package/pack/.claude/skills/devrites-frontend-craft/reference/fullstack.md +4 -3
  110. package/pack/.claude/skills/devrites-frontend-craft/reference/quality-standards.md +76 -20
  111. package/pack/.claude/skills/devrites-frontend-craft/reference/reuse-first.md +4 -9
  112. package/pack/.claude/skills/devrites-frontend-craft/reference/shape.md +3 -7
  113. package/pack/.claude/skills/devrites-interview/SKILL.md +4 -3
  114. package/pack/.claude/skills/devrites-lib/SKILL.md +2 -1
  115. package/pack/.claude/skills/devrites-lib/reference/candidate-integrity.md +1 -9
  116. package/pack/.claude/skills/devrites-lib/reference/intent-map.md +20 -3
  117. package/pack/.claude/skills/devrites-lib/reference/orchestration-profiles.md +5 -0
  118. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +34 -4
  119. package/pack/.claude/skills/devrites-lib/reference/reply-contract.md +6 -3
  120. package/pack/.claude/skills/devrites-lib/reference/standards/README.md +7 -0
  121. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +34 -15
  122. package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +13 -5
  123. package/pack/.claude/skills/devrites-lib/reference/standards/browser-proof-checklist.md +19 -3
  124. package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +1 -1
  125. package/pack/.claude/skills/devrites-lib/reference/standards/code-navigation.md +43 -0
  126. package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +19 -1
  127. package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +8 -4
  128. package/pack/.claude/skills/devrites-lib/reference/standards/core.md +34 -10
  129. package/pack/.claude/skills/devrites-lib/reference/standards/data-integrity.md +24 -5
  130. package/pack/.claude/skills/devrites-lib/reference/standards/debug-recovery.md +8 -1
  131. package/pack/.claude/skills/devrites-lib/reference/standards/definition-of-done.md +14 -11
  132. package/pack/.claude/skills/devrites-lib/reference/standards/documentation.md +4 -1
  133. package/pack/.claude/skills/devrites-lib/reference/standards/edge-case-trace.md +2 -2
  134. package/pack/.claude/skills/devrites-lib/reference/standards/elicitation.md +1 -1
  135. package/pack/.claude/skills/devrites-lib/reference/standards/error-handling.md +2 -2
  136. package/pack/.claude/skills/devrites-lib/reference/standards/integration-reliability.md +14 -3
  137. package/pack/.claude/skills/devrites-lib/reference/standards/loop-operations.md +2 -2
  138. package/pack/.claude/skills/devrites-lib/reference/standards/observability.md +6 -1
  139. package/pack/.claude/skills/devrites-lib/reference/standards/one-shot-actions.md +2 -2
  140. package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +20 -0
  141. package/pack/.claude/skills/devrites-lib/reference/standards/prose-style.md +7 -0
  142. package/pack/.claude/skills/devrites-lib/reference/standards/repository-topology.md +3 -2
  143. package/pack/.claude/skills/devrites-lib/reference/standards/review-checklist.md +7 -5
  144. package/pack/.claude/skills/devrites-lib/reference/standards/security-checklist.md +10 -1
  145. package/pack/.claude/skills/devrites-lib/reference/standards/security.md +100 -11
  146. package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +48 -2
  147. package/pack/.claude/skills/devrites-lib/reference/standards/spec-grammar.md +28 -26
  148. package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +22 -2
  149. package/pack/.claude/skills/devrites-lib/reference/standards/tooling.md +40 -12
  150. package/pack/.claude/skills/devrites-lib/reference/standards/workflow-artifacts.md +24 -8
  151. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/code.md +0 -2
  152. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/comparison.md +0 -2
  153. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/diagram.md +1 -3
  154. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/index.md +2 -4
  155. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/input.md +1 -2
  156. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/plan.md +1 -2
  157. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/slides.md +0 -2
  158. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/table.md +0 -2
  159. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +7 -5
  160. package/pack/.claude/skills/devrites-prose-craft/SKILL.md +11 -7
  161. package/pack/.claude/skills/devrites-prose-craft/reference/banned-phrases.md +41 -4
  162. package/pack/.claude/skills/devrites-prose-craft/reference/examples.md +31 -2
  163. package/pack/.claude/skills/devrites-prose-craft/reference/structures.md +62 -0
  164. package/pack/.claude/skills/devrites-source-driven/SKILL.md +11 -12
  165. package/pack/.claude/skills/devrites-ux-shape/SKILL.md +5 -6
  166. package/pack/.claude/skills/rite/SKILL.md +3 -1
  167. package/pack/.claude/skills/rite-adopt/SKILL.md +9 -8
  168. package/pack/.claude/skills/rite-autocomplete/SKILL.md +9 -6
  169. package/pack/.claude/skills/rite-build/SKILL.md +6 -3
  170. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +2 -2
  171. package/pack/.claude/skills/rite-build/reference/checkpoint.md +3 -1
  172. package/pack/.claude/skills/rite-build/reference/output.md +2 -2
  173. package/pack/.claude/skills/rite-build/reference/parallel-batch.md +19 -2
  174. package/pack/.claude/skills/rite-build/reference/phase-contract.md +5 -5
  175. package/pack/.claude/skills/rite-build/reference/tdd.md +3 -2
  176. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +7 -7
  177. package/pack/.claude/skills/rite-clarify/SKILL.md +6 -5
  178. package/pack/.claude/skills/rite-converge/SKILL.md +8 -7
  179. package/pack/.claude/skills/rite-converge/reference/anti-patterns.md +1 -1
  180. package/pack/.claude/skills/rite-customize/SKILL.md +9 -0
  181. package/pack/.claude/skills/rite-define/SKILL.md +4 -7
  182. package/pack/.claude/skills/rite-define/reference/anti-patterns.md +1 -1
  183. package/pack/.claude/skills/rite-define/reference/gates.md +6 -5
  184. package/pack/.claude/skills/rite-define/reference/plan-template.md +2 -2
  185. package/pack/.claude/skills/rite-dogfood/SKILL.md +10 -4
  186. package/pack/.claude/skills/rite-explain/SKILL.md +9 -5
  187. package/pack/.claude/skills/rite-explain/reference/intake.md +2 -1
  188. package/pack/.claude/skills/rite-frame/SKILL.md +1 -1
  189. package/pack/.claude/skills/rite-handoff/SKILL.md +1 -1
  190. package/pack/.claude/skills/rite-learn/SKILL.md +18 -4
  191. package/pack/.claude/skills/rite-plan/SKILL.md +4 -4
  192. package/pack/.claude/skills/rite-plan/reference/anti-patterns.md +2 -2
  193. package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +24 -0
  194. package/pack/.claude/skills/rite-polish/SKILL.md +9 -6
  195. package/pack/.claude/skills/rite-polish/reference/anti-ai-slop.md +20 -0
  196. package/pack/.claude/skills/rite-polish/reference/browser-polish-evidence.md +3 -1
  197. package/pack/.claude/skills/rite-polish/reference/code.md +1 -19
  198. package/pack/.claude/skills/rite-polish/reference/harden-checklist.md +1 -1
  199. package/pack/.claude/skills/rite-polish/reference/ledger.md +3 -0
  200. package/pack/.claude/skills/rite-polish/reference/ui.md +4 -3
  201. package/pack/.claude/skills/rite-pov/SKILL.md +16 -1
  202. package/pack/.claude/skills/rite-pr-feedback/SKILL.md +1 -1
  203. package/pack/.claude/skills/rite-pressure-test/SKILL.md +2 -1
  204. package/pack/.claude/skills/rite-prototype/SKILL.md +2 -2
  205. package/pack/.claude/skills/rite-prove/SKILL.md +6 -6
  206. package/pack/.claude/skills/rite-prove/reference/acceptance-proof.md +8 -9
  207. package/pack/.claude/skills/rite-prove/reference/browser-proof.md +5 -3
  208. package/pack/.claude/skills/rite-prove/reference/test-command-discovery.md +0 -1
  209. package/pack/.claude/skills/rite-quick/SKILL.md +6 -4
  210. package/pack/.claude/skills/rite-resolve/SKILL.md +5 -4
  211. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +1 -1
  212. package/pack/.claude/skills/rite-review/SKILL.md +18 -27
  213. package/pack/.claude/skills/rite-review/reference/cognitive-load.md +0 -2
  214. package/pack/.claude/skills/rite-review/reference/five-axis-review.md +3 -3
  215. package/pack/.claude/skills/rite-review/reference/nielsen-heuristics.md +3 -7
  216. package/pack/.claude/skills/rite-seal/SKILL.md +7 -3
  217. package/pack/.claude/skills/rite-seal/reference/final-evidence.md +5 -6
  218. package/pack/.claude/skills/rite-seal/reference/risk-and-rollback.md +1 -1
  219. package/pack/.claude/skills/rite-seal/reference/seal-template.md +2 -0
  220. package/pack/.claude/skills/rite-ship/SKILL.md +3 -2
  221. package/pack/.claude/skills/rite-ship/reference/close-out.md +25 -5
  222. package/pack/.claude/skills/rite-ship/reference/rollout.md +1 -1
  223. package/pack/.claude/skills/rite-spec/SKILL.md +2 -1
  224. package/pack/.claude/skills/rite-spec/reference/anti-patterns.md +0 -1
  225. package/pack/.claude/skills/rite-spec/reference/investigation.md +1 -3
  226. package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +1 -1
  227. package/pack/.claude/skills/rite-spec/reference/spec-template.md +1 -1
  228. package/pack/.claude/skills/rite-spec/reference/state-workspace.md +6 -3
  229. package/pack/.claude/skills/rite-status/SKILL.md +3 -1
  230. package/pack/.claude/skills/rite-temper/SKILL.md +9 -9
  231. package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +2 -2
  232. package/pack/.claude/skills/rite-temper/reference/scope-modes.md +2 -2
  233. package/pack/.claude/skills/rite-temper/reference/significance.md +4 -4
  234. package/pack/.claude/skills/rite-temper/reference/strategy-template.md +6 -6
  235. package/pack/.claude/skills/rite-upgrade/SKILL.md +2 -2
  236. package/pack/.claude/skills/rite-vet/SKILL.md +14 -10
  237. package/pack/.claude/skills/rite-vet/reference/artifacts.md +9 -1
  238. package/pack/.claude/skills/rite-vet/reference/review-axes.md +14 -2
  239. package/pack/.claude/skills/rite-watch-pr/SKILL.md +2 -2
  240. package/pack/.claude/skills/rite-zoom-out/SKILL.md +4 -4
  241. package/pack/generated/README.md +4 -2
  242. package/pack/generated/claude/agents/devrites-code-reviewer.md +10 -8
  243. package/pack/generated/claude/agents/devrites-devex-reviewer.md +4 -6
  244. package/pack/generated/claude/agents/devrites-evidence-scout.md +13 -2
  245. package/pack/generated/claude/agents/devrites-frontend-reviewer.md +35 -15
  246. package/pack/generated/claude/agents/devrites-performance-reviewer.md +4 -7
  247. package/pack/generated/claude/agents/devrites-plan-reviewer.md +5 -3
  248. package/pack/generated/claude/agents/devrites-proof-runner.md +1 -1
  249. package/pack/generated/claude/agents/devrites-retrospector.md +7 -1
  250. package/pack/generated/claude/agents/devrites-security-auditor.md +6 -5
  251. package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +3 -2
  252. package/pack/generated/claude/agents/devrites-slice-wright.md +7 -11
  253. package/pack/generated/claude/agents/devrites-spec-reviewer.md +3 -2
  254. package/pack/generated/claude/agents/devrites-strategy-reviewer.md +4 -4
  255. package/pack/generated/claude/agents/devrites-test-analyst.md +2 -1
  256. package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +9 -9
  257. package/pack/generated/claude/skills/devrites-audit/SKILL.md +3 -1
  258. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +9 -2
  259. package/pack/generated/claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +3 -10
  260. package/pack/generated/claude/skills/devrites-debug-recovery/reference/regression-test.md +1 -1
  261. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +5 -7
  262. package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +6 -16
  263. package/pack/generated/claude/skills/devrites-frontend-craft/reference/craft.md +5 -13
  264. package/pack/generated/claude/skills/devrites-frontend-craft/reference/design-references.md +2 -3
  265. package/pack/generated/claude/skills/devrites-frontend-craft/reference/fullstack.md +4 -3
  266. package/pack/generated/claude/skills/devrites-frontend-craft/reference/quality-standards.md +76 -20
  267. package/pack/generated/claude/skills/devrites-frontend-craft/reference/reuse-first.md +4 -9
  268. package/pack/generated/claude/skills/devrites-frontend-craft/reference/shape.md +3 -7
  269. package/pack/generated/claude/skills/devrites-interview/SKILL.md +4 -3
  270. package/pack/generated/claude/skills/devrites-lib/SKILL.md +2 -1
  271. package/pack/generated/claude/skills/devrites-lib/reference/candidate-integrity.md +1 -9
  272. package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +20 -3
  273. package/pack/generated/claude/skills/devrites-lib/reference/orchestration-profiles.md +5 -0
  274. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +34 -4
  275. package/pack/generated/claude/skills/devrites-lib/reference/reply-contract.md +6 -3
  276. package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +7 -0
  277. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +34 -15
  278. package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +13 -5
  279. package/pack/generated/claude/skills/devrites-lib/reference/standards/browser-proof-checklist.md +19 -3
  280. package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +1 -1
  281. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-navigation.md +43 -0
  282. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +19 -1
  283. package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +8 -4
  284. package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +34 -10
  285. package/pack/generated/claude/skills/devrites-lib/reference/standards/data-integrity.md +24 -5
  286. package/pack/generated/claude/skills/devrites-lib/reference/standards/debug-recovery.md +8 -1
  287. package/pack/generated/claude/skills/devrites-lib/reference/standards/definition-of-done.md +14 -11
  288. package/pack/generated/claude/skills/devrites-lib/reference/standards/documentation.md +4 -1
  289. package/pack/generated/claude/skills/devrites-lib/reference/standards/edge-case-trace.md +2 -2
  290. package/pack/generated/claude/skills/devrites-lib/reference/standards/elicitation.md +1 -1
  291. package/pack/generated/claude/skills/devrites-lib/reference/standards/error-handling.md +2 -2
  292. package/pack/generated/claude/skills/devrites-lib/reference/standards/integration-reliability.md +14 -3
  293. package/pack/generated/claude/skills/devrites-lib/reference/standards/loop-operations.md +2 -2
  294. package/pack/generated/claude/skills/devrites-lib/reference/standards/observability.md +6 -1
  295. package/pack/generated/claude/skills/devrites-lib/reference/standards/one-shot-actions.md +2 -2
  296. package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +20 -0
  297. package/pack/generated/claude/skills/devrites-lib/reference/standards/prose-style.md +7 -0
  298. package/pack/generated/claude/skills/devrites-lib/reference/standards/repository-topology.md +3 -2
  299. package/pack/generated/claude/skills/devrites-lib/reference/standards/review-checklist.md +7 -5
  300. package/pack/generated/claude/skills/devrites-lib/reference/standards/security-checklist.md +10 -1
  301. package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +100 -11
  302. package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +48 -2
  303. package/pack/generated/claude/skills/devrites-lib/reference/standards/spec-grammar.md +28 -26
  304. package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +22 -2
  305. package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +40 -12
  306. package/pack/generated/claude/skills/devrites-lib/reference/standards/workflow-artifacts.md +24 -8
  307. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/code.md +0 -2
  308. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/comparison.md +0 -2
  309. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/diagram.md +1 -3
  310. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/index.md +2 -4
  311. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/input.md +1 -2
  312. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/plan.md +1 -2
  313. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/slides.md +0 -2
  314. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/table.md +0 -2
  315. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +7 -5
  316. package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +11 -7
  317. package/pack/generated/claude/skills/devrites-prose-craft/reference/banned-phrases.md +41 -4
  318. package/pack/generated/claude/skills/devrites-prose-craft/reference/examples.md +31 -2
  319. package/pack/generated/claude/skills/devrites-prose-craft/reference/structures.md +62 -0
  320. package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +11 -12
  321. package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +5 -6
  322. package/pack/generated/claude/skills/rite/SKILL.md +3 -1
  323. package/pack/generated/claude/skills/rite-adopt/SKILL.md +9 -8
  324. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +9 -6
  325. package/pack/generated/claude/skills/rite-build/SKILL.md +6 -3
  326. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +2 -2
  327. package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +3 -1
  328. package/pack/generated/claude/skills/rite-build/reference/output.md +2 -2
  329. package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +19 -2
  330. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +5 -5
  331. package/pack/generated/claude/skills/rite-build/reference/tdd.md +3 -2
  332. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +7 -7
  333. package/pack/generated/claude/skills/rite-clarify/SKILL.md +6 -5
  334. package/pack/generated/claude/skills/rite-converge/SKILL.md +8 -7
  335. package/pack/generated/claude/skills/rite-converge/reference/anti-patterns.md +1 -1
  336. package/pack/generated/claude/skills/rite-customize/SKILL.md +9 -0
  337. package/pack/generated/claude/skills/rite-define/SKILL.md +4 -7
  338. package/pack/generated/claude/skills/rite-define/reference/anti-patterns.md +1 -1
  339. package/pack/generated/claude/skills/rite-define/reference/gates.md +6 -5
  340. package/pack/generated/claude/skills/rite-define/reference/plan-template.md +2 -2
  341. package/pack/generated/claude/skills/rite-dogfood/SKILL.md +10 -4
  342. package/pack/generated/claude/skills/rite-explain/SKILL.md +9 -5
  343. package/pack/generated/claude/skills/rite-explain/reference/intake.md +2 -1
  344. package/pack/generated/claude/skills/rite-frame/SKILL.md +1 -1
  345. package/pack/generated/claude/skills/rite-handoff/SKILL.md +1 -1
  346. package/pack/generated/claude/skills/rite-learn/SKILL.md +18 -4
  347. package/pack/generated/claude/skills/rite-plan/SKILL.md +4 -4
  348. package/pack/generated/claude/skills/rite-plan/reference/anti-patterns.md +2 -2
  349. package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +24 -0
  350. package/pack/generated/claude/skills/rite-polish/SKILL.md +9 -6
  351. package/pack/generated/claude/skills/rite-polish/reference/anti-ai-slop.md +20 -0
  352. package/pack/generated/claude/skills/rite-polish/reference/browser-polish-evidence.md +3 -1
  353. package/pack/generated/claude/skills/rite-polish/reference/code.md +1 -19
  354. package/pack/generated/claude/skills/rite-polish/reference/harden-checklist.md +1 -1
  355. package/pack/generated/claude/skills/rite-polish/reference/ledger.md +3 -0
  356. package/pack/generated/claude/skills/rite-polish/reference/ui.md +4 -3
  357. package/pack/generated/claude/skills/rite-pov/SKILL.md +16 -1
  358. package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +1 -1
  359. package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +2 -1
  360. package/pack/generated/claude/skills/rite-prototype/SKILL.md +2 -2
  361. package/pack/generated/claude/skills/rite-prove/SKILL.md +6 -6
  362. package/pack/generated/claude/skills/rite-prove/reference/acceptance-proof.md +8 -9
  363. package/pack/generated/claude/skills/rite-prove/reference/browser-proof.md +5 -3
  364. package/pack/generated/claude/skills/rite-prove/reference/test-command-discovery.md +0 -1
  365. package/pack/generated/claude/skills/rite-quick/SKILL.md +6 -4
  366. package/pack/generated/claude/skills/rite-resolve/SKILL.md +5 -4
  367. package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +1 -1
  368. package/pack/generated/claude/skills/rite-review/SKILL.md +18 -27
  369. package/pack/generated/claude/skills/rite-review/reference/cognitive-load.md +0 -2
  370. package/pack/generated/claude/skills/rite-review/reference/five-axis-review.md +3 -3
  371. package/pack/generated/claude/skills/rite-review/reference/nielsen-heuristics.md +3 -7
  372. package/pack/generated/claude/skills/rite-seal/SKILL.md +7 -3
  373. package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +5 -6
  374. package/pack/generated/claude/skills/rite-seal/reference/risk-and-rollback.md +1 -1
  375. package/pack/generated/claude/skills/rite-seal/reference/seal-template.md +2 -0
  376. package/pack/generated/claude/skills/rite-ship/SKILL.md +3 -2
  377. package/pack/generated/claude/skills/rite-ship/reference/close-out.md +25 -5
  378. package/pack/generated/claude/skills/rite-ship/reference/rollout.md +1 -1
  379. package/pack/generated/claude/skills/rite-spec/SKILL.md +2 -1
  380. package/pack/generated/claude/skills/rite-spec/reference/anti-patterns.md +0 -1
  381. package/pack/generated/claude/skills/rite-spec/reference/investigation.md +1 -3
  382. package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +1 -1
  383. package/pack/generated/claude/skills/rite-spec/reference/spec-template.md +1 -1
  384. package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +6 -3
  385. package/pack/generated/claude/skills/rite-status/SKILL.md +3 -1
  386. package/pack/generated/claude/skills/rite-temper/SKILL.md +9 -9
  387. package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +2 -2
  388. package/pack/generated/claude/skills/rite-temper/reference/scope-modes.md +2 -2
  389. package/pack/generated/claude/skills/rite-temper/reference/significance.md +4 -4
  390. package/pack/generated/claude/skills/rite-temper/reference/strategy-template.md +6 -6
  391. package/pack/generated/claude/skills/rite-upgrade/SKILL.md +2 -2
  392. package/pack/generated/claude/skills/rite-vet/SKILL.md +14 -10
  393. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +9 -1
  394. package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +14 -2
  395. package/pack/generated/claude/skills/rite-watch-pr/SKILL.md +2 -2
  396. package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +4 -4
  397. package/pack/generated/codex/agents/devrites-code-reviewer.toml +10 -8
  398. package/pack/generated/codex/agents/devrites-devex-reviewer.toml +4 -6
  399. package/pack/generated/codex/agents/devrites-evidence-scout.toml +13 -2
  400. package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +35 -15
  401. package/pack/generated/codex/agents/devrites-performance-reviewer.toml +4 -7
  402. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +5 -3
  403. package/pack/generated/codex/agents/devrites-proof-runner.toml +1 -1
  404. package/pack/generated/codex/agents/devrites-retrospector.toml +7 -1
  405. package/pack/generated/codex/agents/devrites-security-auditor.toml +6 -5
  406. package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +3 -2
  407. package/pack/generated/codex/agents/devrites-slice-wright.toml +7 -11
  408. package/pack/generated/codex/agents/devrites-spec-reviewer.toml +3 -2
  409. package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +4 -4
  410. package/pack/generated/codex/agents/devrites-test-analyst.toml +2 -1
  411. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +9 -9
  412. package/pack/generated/codex/skills/devrites-audit/SKILL.md +3 -1
  413. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +9 -2
  414. package/pack/generated/codex/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +3 -10
  415. package/pack/generated/codex/skills/devrites-debug-recovery/reference/regression-test.md +1 -1
  416. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +5 -7
  417. package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +6 -16
  418. package/pack/generated/codex/skills/devrites-frontend-craft/reference/craft.md +5 -13
  419. package/pack/generated/codex/skills/devrites-frontend-craft/reference/design-references.md +2 -3
  420. package/pack/generated/codex/skills/devrites-frontend-craft/reference/fullstack.md +4 -3
  421. package/pack/generated/codex/skills/devrites-frontend-craft/reference/quality-standards.md +76 -20
  422. package/pack/generated/codex/skills/devrites-frontend-craft/reference/reuse-first.md +4 -9
  423. package/pack/generated/codex/skills/devrites-frontend-craft/reference/shape.md +3 -7
  424. package/pack/generated/codex/skills/devrites-interview/SKILL.md +4 -3
  425. package/pack/generated/codex/skills/devrites-lib/SKILL.md +2 -1
  426. package/pack/generated/codex/skills/devrites-lib/reference/candidate-integrity.md +1 -9
  427. package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +20 -3
  428. package/pack/generated/codex/skills/devrites-lib/reference/orchestration-profiles.md +5 -0
  429. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +34 -4
  430. package/pack/generated/codex/skills/devrites-lib/reference/reply-contract.md +6 -3
  431. package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +7 -0
  432. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +34 -15
  433. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +13 -5
  434. package/pack/generated/codex/skills/devrites-lib/reference/standards/browser-proof-checklist.md +19 -3
  435. package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +1 -1
  436. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-navigation.md +43 -0
  437. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +19 -1
  438. package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +8 -4
  439. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +34 -10
  440. package/pack/generated/codex/skills/devrites-lib/reference/standards/data-integrity.md +24 -5
  441. package/pack/generated/codex/skills/devrites-lib/reference/standards/debug-recovery.md +8 -1
  442. package/pack/generated/codex/skills/devrites-lib/reference/standards/definition-of-done.md +14 -11
  443. package/pack/generated/codex/skills/devrites-lib/reference/standards/documentation.md +4 -1
  444. package/pack/generated/codex/skills/devrites-lib/reference/standards/edge-case-trace.md +2 -2
  445. package/pack/generated/codex/skills/devrites-lib/reference/standards/elicitation.md +1 -1
  446. package/pack/generated/codex/skills/devrites-lib/reference/standards/error-handling.md +2 -2
  447. package/pack/generated/codex/skills/devrites-lib/reference/standards/integration-reliability.md +14 -3
  448. package/pack/generated/codex/skills/devrites-lib/reference/standards/loop-operations.md +2 -2
  449. package/pack/generated/codex/skills/devrites-lib/reference/standards/observability.md +6 -1
  450. package/pack/generated/codex/skills/devrites-lib/reference/standards/one-shot-actions.md +2 -2
  451. package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +20 -0
  452. package/pack/generated/codex/skills/devrites-lib/reference/standards/prose-style.md +7 -0
  453. package/pack/generated/codex/skills/devrites-lib/reference/standards/repository-topology.md +3 -2
  454. package/pack/generated/codex/skills/devrites-lib/reference/standards/review-checklist.md +7 -5
  455. package/pack/generated/codex/skills/devrites-lib/reference/standards/security-checklist.md +10 -1
  456. package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +100 -11
  457. package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +48 -2
  458. package/pack/generated/codex/skills/devrites-lib/reference/standards/spec-grammar.md +28 -26
  459. package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +22 -2
  460. package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +40 -12
  461. package/pack/generated/codex/skills/devrites-lib/reference/standards/workflow-artifacts.md +24 -8
  462. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/code.md +0 -2
  463. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/comparison.md +0 -2
  464. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/diagram.md +1 -3
  465. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/index.md +2 -4
  466. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/input.md +1 -2
  467. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/plan.md +1 -2
  468. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/slides.md +0 -2
  469. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/table.md +0 -2
  470. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +7 -5
  471. package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +11 -7
  472. package/pack/generated/codex/skills/devrites-prose-craft/reference/banned-phrases.md +41 -4
  473. package/pack/generated/codex/skills/devrites-prose-craft/reference/examples.md +31 -2
  474. package/pack/generated/codex/skills/devrites-prose-craft/reference/structures.md +62 -0
  475. package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +11 -12
  476. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +5 -6
  477. package/pack/generated/codex/skills/rite/SKILL.md +3 -1
  478. package/pack/generated/codex/skills/rite-adopt/SKILL.md +9 -8
  479. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +9 -6
  480. package/pack/generated/codex/skills/rite-build/SKILL.md +6 -3
  481. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +2 -2
  482. package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +3 -1
  483. package/pack/generated/codex/skills/rite-build/reference/output.md +2 -2
  484. package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +19 -2
  485. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +5 -5
  486. package/pack/generated/codex/skills/rite-build/reference/tdd.md +3 -2
  487. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +7 -7
  488. package/pack/generated/codex/skills/rite-clarify/SKILL.md +6 -5
  489. package/pack/generated/codex/skills/rite-converge/SKILL.md +8 -7
  490. package/pack/generated/codex/skills/rite-converge/reference/anti-patterns.md +1 -1
  491. package/pack/generated/codex/skills/rite-customize/SKILL.md +9 -0
  492. package/pack/generated/codex/skills/rite-define/SKILL.md +4 -7
  493. package/pack/generated/codex/skills/rite-define/reference/anti-patterns.md +1 -1
  494. package/pack/generated/codex/skills/rite-define/reference/gates.md +6 -5
  495. package/pack/generated/codex/skills/rite-define/reference/plan-template.md +2 -2
  496. package/pack/generated/codex/skills/rite-dogfood/SKILL.md +10 -4
  497. package/pack/generated/codex/skills/rite-explain/SKILL.md +9 -5
  498. package/pack/generated/codex/skills/rite-explain/reference/intake.md +2 -1
  499. package/pack/generated/codex/skills/rite-frame/SKILL.md +1 -1
  500. package/pack/generated/codex/skills/rite-handoff/SKILL.md +1 -1
  501. package/pack/generated/codex/skills/rite-learn/SKILL.md +18 -4
  502. package/pack/generated/codex/skills/rite-plan/SKILL.md +4 -4
  503. package/pack/generated/codex/skills/rite-plan/reference/anti-patterns.md +2 -2
  504. package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +24 -0
  505. package/pack/generated/codex/skills/rite-polish/SKILL.md +9 -6
  506. package/pack/generated/codex/skills/rite-polish/reference/anti-ai-slop.md +20 -0
  507. package/pack/generated/codex/skills/rite-polish/reference/browser-polish-evidence.md +3 -1
  508. package/pack/generated/codex/skills/rite-polish/reference/code.md +1 -19
  509. package/pack/generated/codex/skills/rite-polish/reference/harden-checklist.md +1 -1
  510. package/pack/generated/codex/skills/rite-polish/reference/ledger.md +3 -0
  511. package/pack/generated/codex/skills/rite-polish/reference/ui.md +4 -3
  512. package/pack/generated/codex/skills/rite-pov/SKILL.md +16 -1
  513. package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +1 -1
  514. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +2 -1
  515. package/pack/generated/codex/skills/rite-prototype/SKILL.md +2 -2
  516. package/pack/generated/codex/skills/rite-prove/SKILL.md +6 -6
  517. package/pack/generated/codex/skills/rite-prove/reference/acceptance-proof.md +8 -9
  518. package/pack/generated/codex/skills/rite-prove/reference/browser-proof.md +5 -3
  519. package/pack/generated/codex/skills/rite-prove/reference/test-command-discovery.md +0 -1
  520. package/pack/generated/codex/skills/rite-quick/SKILL.md +6 -4
  521. package/pack/generated/codex/skills/rite-resolve/SKILL.md +5 -4
  522. package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +1 -1
  523. package/pack/generated/codex/skills/rite-review/SKILL.md +18 -27
  524. package/pack/generated/codex/skills/rite-review/reference/cognitive-load.md +0 -2
  525. package/pack/generated/codex/skills/rite-review/reference/five-axis-review.md +3 -3
  526. package/pack/generated/codex/skills/rite-review/reference/nielsen-heuristics.md +3 -7
  527. package/pack/generated/codex/skills/rite-seal/SKILL.md +7 -3
  528. package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +5 -6
  529. package/pack/generated/codex/skills/rite-seal/reference/risk-and-rollback.md +1 -1
  530. package/pack/generated/codex/skills/rite-seal/reference/seal-template.md +2 -0
  531. package/pack/generated/codex/skills/rite-ship/SKILL.md +3 -2
  532. package/pack/generated/codex/skills/rite-ship/reference/close-out.md +25 -5
  533. package/pack/generated/codex/skills/rite-ship/reference/rollout.md +1 -1
  534. package/pack/generated/codex/skills/rite-spec/SKILL.md +2 -1
  535. package/pack/generated/codex/skills/rite-spec/reference/anti-patterns.md +0 -1
  536. package/pack/generated/codex/skills/rite-spec/reference/investigation.md +1 -3
  537. package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +1 -1
  538. package/pack/generated/codex/skills/rite-spec/reference/spec-template.md +1 -1
  539. package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +6 -3
  540. package/pack/generated/codex/skills/rite-status/SKILL.md +3 -1
  541. package/pack/generated/codex/skills/rite-temper/SKILL.md +9 -9
  542. package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +2 -2
  543. package/pack/generated/codex/skills/rite-temper/reference/scope-modes.md +2 -2
  544. package/pack/generated/codex/skills/rite-temper/reference/significance.md +4 -4
  545. package/pack/generated/codex/skills/rite-temper/reference/strategy-template.md +6 -6
  546. package/pack/generated/codex/skills/rite-upgrade/SKILL.md +2 -2
  547. package/pack/generated/codex/skills/rite-vet/SKILL.md +14 -10
  548. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +9 -1
  549. package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +14 -2
  550. package/pack/generated/codex/skills/rite-watch-pr/SKILL.md +2 -2
  551. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +4 -4
  552. package/pack/generated/omp/.omp-plugin/plugin.json +6 -0
  553. package/pack/generated/omp/agents/devrites-code-reviewer.md +138 -0
  554. package/pack/generated/omp/agents/devrites-devex-reviewer.md +123 -0
  555. package/pack/generated/omp/agents/devrites-doubt-reviewer.md +81 -0
  556. package/pack/generated/omp/agents/devrites-evidence-scout.md +71 -0
  557. package/pack/generated/omp/agents/devrites-frontend-reviewer.md +114 -0
  558. package/pack/generated/omp/agents/devrites-performance-reviewer.md +114 -0
  559. package/pack/generated/omp/agents/devrites-plan-drafter.md +82 -0
  560. package/pack/generated/omp/agents/devrites-plan-reviewer.md +132 -0
  561. package/pack/generated/omp/agents/devrites-proof-runner.md +73 -0
  562. package/pack/generated/omp/agents/devrites-retrospector.md +60 -0
  563. package/pack/generated/omp/agents/devrites-security-auditor.md +108 -0
  564. package/pack/generated/omp/agents/devrites-simplifier-reviewer.md +93 -0
  565. package/pack/generated/omp/agents/devrites-slice-wright.md +203 -0
  566. package/pack/generated/omp/agents/devrites-spec-reviewer.md +95 -0
  567. package/pack/generated/omp/agents/devrites-strategy-reviewer.md +99 -0
  568. package/pack/generated/omp/agents/devrites-test-analyst.md +88 -0
  569. package/pack/generated/omp/agents/devrites-upgrade-planner.md +80 -0
  570. package/pack/generated/omp/skills/devrites-api-interface/SKILL.md +61 -0
  571. package/pack/generated/omp/skills/devrites-audit/SKILL.md +50 -0
  572. package/pack/generated/omp/skills/devrites-browser-proof/SKILL.md +76 -0
  573. package/pack/generated/omp/skills/devrites-browser-proof/reference/browser-performance.md +15 -0
  574. package/pack/generated/omp/skills/devrites-browser-proof/reference/visual-verdict.md +34 -0
  575. package/pack/generated/omp/skills/devrites-debug-recovery/SKILL.md +96 -0
  576. package/pack/generated/omp/skills/devrites-debug-recovery/reference/build-the-loop.md +58 -0
  577. package/pack/generated/omp/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -0
  578. package/pack/generated/omp/skills/devrites-debug-recovery/reference/hypotheses.md +17 -0
  579. package/pack/generated/omp/skills/devrites-debug-recovery/reference/instrumentation.md +21 -0
  580. package/pack/generated/omp/skills/devrites-debug-recovery/reference/regression-test.md +30 -0
  581. package/pack/generated/omp/skills/devrites-debug-recovery/reference/trace.md +25 -0
  582. package/pack/generated/omp/skills/devrites-doubt/SKILL.md +86 -0
  583. package/pack/generated/omp/skills/devrites-frontend-craft/SKILL.md +86 -0
  584. package/pack/generated/omp/skills/devrites-frontend-craft/reference/craft.md +63 -0
  585. package/pack/generated/omp/skills/devrites-frontend-craft/reference/design-references.md +116 -0
  586. package/pack/generated/omp/skills/devrites-frontend-craft/reference/fullstack.md +46 -0
  587. package/pack/generated/omp/skills/devrites-frontend-craft/reference/quality-standards.md +294 -0
  588. package/pack/generated/omp/skills/devrites-frontend-craft/reference/reuse-first.md +53 -0
  589. package/pack/generated/omp/skills/devrites-frontend-craft/reference/shape.md +56 -0
  590. package/pack/generated/omp/skills/devrites-interview/SKILL.md +102 -0
  591. package/pack/generated/omp/skills/devrites-lib/SKILL.md +58 -0
  592. package/pack/generated/omp/skills/devrites-lib/reference/candidate-integrity.md +43 -0
  593. package/pack/generated/omp/skills/devrites-lib/reference/intent-map.md +64 -0
  594. package/pack/generated/omp/skills/devrites-lib/reference/orchestration-profiles.md +27 -0
  595. package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +74 -0
  596. package/pack/generated/omp/skills/devrites-lib/reference/reply-contract.md +88 -0
  597. package/pack/generated/omp/skills/devrites-lib/reference/standards/README.md +60 -0
  598. package/pack/generated/omp/skills/devrites-lib/reference/standards/acceptance-preserving-reslice.md +30 -0
  599. package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +345 -0
  600. package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +98 -0
  601. package/pack/generated/omp/skills/devrites-lib/reference/standards/anti-patterns.md +48 -0
  602. package/pack/generated/omp/skills/devrites-lib/reference/standards/browser-proof-checklist.md +24 -0
  603. package/pack/generated/omp/skills/devrites-lib/reference/standards/ci-cd.md +50 -0
  604. package/pack/generated/omp/skills/devrites-lib/reference/standards/code-navigation.md +43 -0
  605. package/pack/generated/omp/skills/devrites-lib/reference/standards/code-review.md +108 -0
  606. package/pack/generated/omp/skills/devrites-lib/reference/standards/coding-style.md +48 -0
  607. package/pack/generated/omp/skills/devrites-lib/reference/standards/context-hygiene.md +89 -0
  608. package/pack/generated/omp/skills/devrites-lib/reference/standards/core.md +167 -0
  609. package/pack/generated/omp/skills/devrites-lib/reference/standards/data-integrity.md +118 -0
  610. package/pack/generated/omp/skills/devrites-lib/reference/standards/debug-recovery.md +28 -0
  611. package/pack/generated/omp/skills/devrites-lib/reference/standards/definition-of-done.md +19 -0
  612. package/pack/generated/omp/skills/devrites-lib/reference/standards/deprecation.md +31 -0
  613. package/pack/generated/omp/skills/devrites-lib/reference/standards/developer-experience.md +119 -0
  614. package/pack/generated/omp/skills/devrites-lib/reference/standards/development-workflow.md +29 -0
  615. package/pack/generated/omp/skills/devrites-lib/reference/standards/documentation.md +43 -0
  616. package/pack/generated/omp/skills/devrites-lib/reference/standards/edge-case-trace.md +92 -0
  617. package/pack/generated/omp/skills/devrites-lib/reference/standards/elicitation.md +85 -0
  618. package/pack/generated/omp/skills/devrites-lib/reference/standards/error-handling.md +47 -0
  619. package/pack/generated/omp/skills/devrites-lib/reference/standards/git-workflow.md +49 -0
  620. package/pack/generated/omp/skills/devrites-lib/reference/standards/hooks.md +25 -0
  621. package/pack/generated/omp/skills/devrites-lib/reference/standards/integration-reliability.md +102 -0
  622. package/pack/generated/omp/skills/devrites-lib/reference/standards/loop-operations.md +85 -0
  623. package/pack/generated/omp/skills/devrites-lib/reference/standards/observability.md +88 -0
  624. package/pack/generated/omp/skills/devrites-lib/reference/standards/one-shot-actions.md +97 -0
  625. package/pack/generated/omp/skills/devrites-lib/reference/standards/patterns.md +68 -0
  626. package/pack/generated/omp/skills/devrites-lib/reference/standards/performance.md +51 -0
  627. package/pack/generated/omp/skills/devrites-lib/reference/standards/principles.md +42 -0
  628. package/pack/generated/omp/skills/devrites-lib/reference/standards/prose-style.md +123 -0
  629. package/pack/generated/omp/skills/devrites-lib/reference/standards/release/ship-checklist.md +8 -0
  630. package/pack/generated/omp/skills/devrites-lib/reference/standards/repository-topology.md +80 -0
  631. package/pack/generated/omp/skills/devrites-lib/reference/standards/review-checklist.md +12 -0
  632. package/pack/generated/omp/skills/devrites-lib/reference/standards/security-checklist.md +25 -0
  633. package/pack/generated/omp/skills/devrites-lib/reference/standards/security.md +202 -0
  634. package/pack/generated/omp/skills/devrites-lib/reference/standards/skill-authoring.md +209 -0
  635. package/pack/generated/omp/skills/devrites-lib/reference/standards/spec-grammar.md +197 -0
  636. package/pack/generated/omp/skills/devrites-lib/reference/standards/test-proof-checklist.md +13 -0
  637. package/pack/generated/omp/skills/devrites-lib/reference/standards/testing.md +212 -0
  638. package/pack/generated/omp/skills/devrites-lib/reference/standards/tooling.md +92 -0
  639. package/pack/generated/omp/skills/devrites-lib/reference/standards/workflow-artifacts.md +427 -0
  640. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/code.md +44 -0
  641. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/comparison.md +42 -0
  642. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/diagram.md +51 -0
  643. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/index.md +66 -0
  644. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/input.md +46 -0
  645. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/outline-template.md +106 -0
  646. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/plan.md +48 -0
  647. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/slides.md +40 -0
  648. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/table.md +42 -0
  649. package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +228 -0
  650. package/pack/generated/omp/skills/devrites-prose-craft/SKILL.md +73 -0
  651. package/pack/generated/omp/skills/devrites-prose-craft/reference/banned-phrases.md +132 -0
  652. package/pack/generated/omp/skills/devrites-prose-craft/reference/examples.md +131 -0
  653. package/pack/generated/omp/skills/devrites-prose-craft/reference/structures.md +196 -0
  654. package/pack/generated/omp/skills/devrites-source-driven/SKILL.md +52 -0
  655. package/pack/generated/omp/skills/devrites-ux-shape/SKILL.md +134 -0
  656. package/pack/generated/omp/skills/devrites-ux-shape/reference/brief-template.md +108 -0
  657. package/pack/generated/omp/skills/devrites-ux-shape/reference/visual-direction-probe.md +48 -0
  658. package/pack/generated/omp/skills/rite/SKILL.md +148 -0
  659. package/pack/generated/omp/skills/rite/reference/menu.md +48 -0
  660. package/pack/generated/omp/skills/rite-adopt/SKILL.md +52 -0
  661. package/pack/generated/omp/skills/rite-adopt/reference/adoption.md +19 -0
  662. package/pack/generated/omp/skills/rite-adopt/reference/anti-patterns.md +19 -0
  663. package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +122 -0
  664. package/pack/generated/omp/skills/rite-autocomplete/reference/decision-policy.md +41 -0
  665. package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +116 -0
  666. package/pack/generated/omp/skills/rite-autocomplete/reference/stop-conditions.md +92 -0
  667. package/pack/generated/omp/skills/rite-build/SKILL.md +79 -0
  668. package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +145 -0
  669. package/pack/generated/omp/skills/rite-build/reference/anti-patterns.md +23 -0
  670. package/pack/generated/omp/skills/rite-build/reference/checkpoint-protocol.md +120 -0
  671. package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +46 -0
  672. package/pack/generated/omp/skills/rite-build/reference/frontend-trigger.md +39 -0
  673. package/pack/generated/omp/skills/rite-build/reference/one-slice-cycle.md +45 -0
  674. package/pack/generated/omp/skills/rite-build/reference/output.md +33 -0
  675. package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +81 -0
  676. package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +66 -0
  677. package/pack/generated/omp/skills/rite-build/reference/spec-drift-guard.md +59 -0
  678. package/pack/generated/omp/skills/rite-build/reference/tdd.md +27 -0
  679. package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +86 -0
  680. package/pack/generated/omp/skills/rite-clarify/SKILL.md +99 -0
  681. package/pack/generated/omp/skills/rite-clarify/reference/anti-patterns.md +24 -0
  682. package/pack/generated/omp/skills/rite-clarify/reference/decision-coverage.md +55 -0
  683. package/pack/generated/omp/skills/rite-converge/SKILL.md +140 -0
  684. package/pack/generated/omp/skills/rite-converge/reference/anti-patterns.md +35 -0
  685. package/pack/generated/omp/skills/rite-converge/reference/convergence-assessment.md +65 -0
  686. package/pack/generated/omp/skills/rite-customize/SKILL.md +60 -0
  687. package/pack/generated/omp/skills/rite-define/SKILL.md +166 -0
  688. package/pack/generated/omp/skills/rite-define/reference/anti-patterns.md +26 -0
  689. package/pack/generated/omp/skills/rite-define/reference/gates.md +154 -0
  690. package/pack/generated/omp/skills/rite-define/reference/plan-template.md +149 -0
  691. package/pack/generated/omp/skills/rite-doctor/SKILL.md +69 -0
  692. package/pack/generated/omp/skills/rite-dogfood/SKILL.md +55 -0
  693. package/pack/generated/omp/skills/rite-explain/SKILL.md +152 -0
  694. package/pack/generated/omp/skills/rite-explain/reference/intake.md +89 -0
  695. package/pack/generated/omp/skills/rite-frame/SKILL.md +115 -0
  696. package/pack/generated/omp/skills/rite-frame/reference/failure-modes.md +66 -0
  697. package/pack/generated/omp/skills/rite-handoff/SKILL.md +97 -0
  698. package/pack/generated/omp/skills/rite-handoff/reference/handoff-template.md +44 -0
  699. package/pack/generated/omp/skills/rite-learn/SKILL.md +72 -0
  700. package/pack/generated/omp/skills/rite-plan/SKILL.md +132 -0
  701. package/pack/generated/omp/skills/rite-plan/reference/anti-patterns.md +34 -0
  702. package/pack/generated/omp/skills/rite-plan/reference/dependency-graph.md +48 -0
  703. package/pack/generated/omp/skills/rite-plan/reference/replan-and-repair.md +73 -0
  704. package/pack/generated/omp/skills/rite-plan/reference/slicing.md +65 -0
  705. package/pack/generated/omp/skills/rite-plan/reference/task-breakdown.md +42 -0
  706. package/pack/generated/omp/skills/rite-polish/SKILL.md +104 -0
  707. package/pack/generated/omp/skills/rite-polish/reference/adr-promotion.md +11 -0
  708. package/pack/generated/omp/skills/rite-polish/reference/anti-ai-slop.md +187 -0
  709. package/pack/generated/omp/skills/rite-polish/reference/anti-patterns.md +30 -0
  710. package/pack/generated/omp/skills/rite-polish/reference/backend-polish.md +80 -0
  711. package/pack/generated/omp/skills/rite-polish/reference/browser-polish-evidence.md +33 -0
  712. package/pack/generated/omp/skills/rite-polish/reference/code.md +82 -0
  713. package/pack/generated/omp/skills/rite-polish/reference/design-memory.md +117 -0
  714. package/pack/generated/omp/skills/rite-polish/reference/design-system-discovery.md +8 -0
  715. package/pack/generated/omp/skills/rite-polish/reference/harden-checklist.md +109 -0
  716. package/pack/generated/omp/skills/rite-polish/reference/ledger.md +65 -0
  717. package/pack/generated/omp/skills/rite-polish/reference/ui.md +137 -0
  718. package/pack/generated/omp/skills/rite-pov/SKILL.md +58 -0
  719. package/pack/generated/omp/skills/rite-pr-feedback/SKILL.md +54 -0
  720. package/pack/generated/omp/skills/rite-pressure-test/SKILL.md +67 -0
  721. package/pack/generated/omp/skills/rite-prototype/SKILL.md +104 -0
  722. package/pack/generated/omp/skills/rite-prove/SKILL.md +122 -0
  723. package/pack/generated/omp/skills/rite-prove/reference/acceptance-proof.md +88 -0
  724. package/pack/generated/omp/skills/rite-prove/reference/anti-patterns.md +25 -0
  725. package/pack/generated/omp/skills/rite-prove/reference/browser-proof.md +51 -0
  726. package/pack/generated/omp/skills/rite-prove/reference/failure-triage.md +43 -0
  727. package/pack/generated/omp/skills/rite-prove/reference/proof-ladder.md +28 -0
  728. package/pack/generated/omp/skills/rite-prove/reference/test-command-discovery.md +30 -0
  729. package/pack/generated/omp/skills/rite-quick/SKILL.md +82 -0
  730. package/pack/generated/omp/skills/rite-resolve/SKILL.md +95 -0
  731. package/pack/generated/omp/skills/rite-resolve/reference/answer-protocol.md +118 -0
  732. package/pack/generated/omp/skills/rite-review/SKILL.md +159 -0
  733. package/pack/generated/omp/skills/rite-review/reference/anti-patterns.md +32 -0
  734. package/pack/generated/omp/skills/rite-review/reference/cognitive-load.md +90 -0
  735. package/pack/generated/omp/skills/rite-review/reference/feature-scoped-review.md +26 -0
  736. package/pack/generated/omp/skills/rite-review/reference/five-axis-review.md +66 -0
  737. package/pack/generated/omp/skills/rite-review/reference/nielsen-heuristics.md +126 -0
  738. package/pack/generated/omp/skills/rite-review/reference/performance-checklist.md +80 -0
  739. package/pack/generated/omp/skills/rite-review/reference/performance-review.md +14 -0
  740. package/pack/generated/omp/skills/rite-review/reference/security-review.md +42 -0
  741. package/pack/generated/omp/skills/rite-seal/SKILL.md +73 -0
  742. package/pack/generated/omp/skills/rite-seal/reference/anti-patterns.md +29 -0
  743. package/pack/generated/omp/skills/rite-seal/reference/final-evidence.md +40 -0
  744. package/pack/generated/omp/skills/rite-seal/reference/go-no-go.md +29 -0
  745. package/pack/generated/omp/skills/rite-seal/reference/output.md +5 -0
  746. package/pack/generated/omp/skills/rite-seal/reference/phase-contract.md +47 -0
  747. package/pack/generated/omp/skills/rite-seal/reference/risk-and-rollback.md +56 -0
  748. package/pack/generated/omp/skills/rite-seal/reference/seal-template.md +27 -0
  749. package/pack/generated/omp/skills/rite-ship/SKILL.md +85 -0
  750. package/pack/generated/omp/skills/rite-ship/reference/anti-patterns.md +28 -0
  751. package/pack/generated/omp/skills/rite-ship/reference/close-out.md +54 -0
  752. package/pack/generated/omp/skills/rite-ship/reference/git-ship.md +111 -0
  753. package/pack/generated/omp/skills/rite-ship/reference/rollout.md +62 -0
  754. package/pack/generated/omp/skills/rite-ship/reference/ship-template.md +39 -0
  755. package/pack/generated/omp/skills/rite-spec/SKILL.md +144 -0
  756. package/pack/generated/omp/skills/rite-spec/reference/acceptance-criteria.md +31 -0
  757. package/pack/generated/omp/skills/rite-spec/reference/ai-spec-template.md +40 -0
  758. package/pack/generated/omp/skills/rite-spec/reference/anti-patterns.md +27 -0
  759. package/pack/generated/omp/skills/rite-spec/reference/interview-patterns.md +56 -0
  760. package/pack/generated/omp/skills/rite-spec/reference/investigation.md +83 -0
  761. package/pack/generated/omp/skills/rite-spec/reference/question-protocol.md +36 -0
  762. package/pack/generated/omp/skills/rite-spec/reference/references-intake.md +62 -0
  763. package/pack/generated/omp/skills/rite-spec/reference/spec-checklists.md +89 -0
  764. package/pack/generated/omp/skills/rite-spec/reference/spec-template.md +154 -0
  765. package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +221 -0
  766. package/pack/generated/omp/skills/rite-status/SKILL.md +54 -0
  767. package/pack/generated/omp/skills/rite-temper/SKILL.md +127 -0
  768. package/pack/generated/omp/skills/rite-temper/reference/anti-patterns.md +29 -0
  769. package/pack/generated/omp/skills/rite-temper/reference/review-dimensions.md +67 -0
  770. package/pack/generated/omp/skills/rite-temper/reference/scope-modes.md +53 -0
  771. package/pack/generated/omp/skills/rite-temper/reference/significance.md +46 -0
  772. package/pack/generated/omp/skills/rite-temper/reference/strategy-template.md +90 -0
  773. package/pack/generated/omp/skills/rite-upgrade/SKILL.md +112 -0
  774. package/pack/generated/omp/skills/rite-vet/SKILL.md +158 -0
  775. package/pack/generated/omp/skills/rite-vet/reference/anti-patterns.md +41 -0
  776. package/pack/generated/omp/skills/rite-vet/reference/artifacts.md +202 -0
  777. package/pack/generated/omp/skills/rite-vet/reference/cross-model.md +19 -0
  778. package/pack/generated/omp/skills/rite-vet/reference/depth.md +60 -0
  779. package/pack/generated/omp/skills/rite-vet/reference/eng-lenses.md +48 -0
  780. package/pack/generated/omp/skills/rite-vet/reference/review-axes.md +176 -0
  781. package/pack/generated/omp/skills/rite-watch-pr/SKILL.md +85 -0
  782. package/pack/generated/omp/skills/rite-zoom-out/SKILL.md +69 -0
  783. package/package.json +12 -1
  784. package/scripts/build-host-artifacts.sh +48 -6
  785. package/scripts/omp-generate.sh +152 -0
@@ -65,7 +65,7 @@ func runUpdate(opts Options) error {
65
65
  if err != nil {
66
66
  return fmt.Errorf("resolve payload %s: %w", opts.PayloadDir, err)
67
67
  }
68
- if err := hostpack.ValidatePayload(os.DirFS(payload), true); err != nil {
68
+ if err := hostpack.ValidatePayload(os.DirFS(payload), true, true); err != nil {
69
69
  return fmt.Errorf("local update payload under %s is invalid: %w", payload, err)
70
70
  }
71
71
  installFlags := manifestHeader(mf, "devrites-flags")
@@ -153,6 +153,7 @@ func runRemoteUpdate(opts Options, target, installed string) error {
153
153
  if opts.Force {
154
154
  args = append(args, "--force")
155
155
  }
156
+ // #nosec G204 -- re-execs the located engine binary with fixed migration args
156
157
  cmd := exec.CommandContext(ctx, candidate.EnginePath, args...)
157
158
  cmd.Stdout = opts.Stdout
158
159
  cmd.Stderr = opts.Stderr
@@ -103,11 +103,12 @@ func readBoundedRegularFile(name string, limit int64) ([]byte, error) {
103
103
  if before.Size() < 0 || before.Size() > limit {
104
104
  return nil, fmt.Errorf("artifact exceeds %s limit", byteLimitName(limit))
105
105
  }
106
+ // #nosec G304 -- candidate artifact path; size cap checked above
106
107
  file, err := os.Open(name)
107
108
  if err != nil {
108
109
  return nil, err
109
110
  }
110
- defer file.Close()
111
+ defer func() { _ = file.Close() }()
111
112
  opened, err := file.Stat()
112
113
  if err != nil {
113
114
  return nil, err
@@ -440,11 +441,12 @@ func hashCandidateFile(digest hash.Hash, project string, row candidateRow) error
440
441
  return errors.New("present path disappeared before reading")
441
442
  }
442
443
  name := filepath.Join(project, filepath.FromSlash(row.path))
444
+ // #nosec G304 -- row path validated against the workspace contract (validateCandidateRow)
443
445
  file, err := os.Open(name)
444
446
  if err != nil {
445
447
  return err
446
448
  }
447
- defer file.Close()
449
+ defer func() { _ = file.Close() }()
448
450
  opened, err := file.Stat()
449
451
  if err != nil {
450
452
  return err
@@ -435,7 +435,7 @@ func TestCandidateIdentityRejectsSpecialFile(t *testing.T) {
435
435
  if err != nil {
436
436
  t.Skipf("Unix-domain sockets unavailable: %v", err)
437
437
  }
438
- defer listener.Close()
438
+ defer func() { _ = listener.Close() }()
439
439
  if _, _, err := CandidateIdentity(root, "feature"); err == nil || !strings.Contains(err.Error(), "regular file") {
440
440
  t.Fatalf("error=%v, want special-file rejection", err)
441
441
  }
@@ -0,0 +1,109 @@
1
+ package lib
2
+
3
+ import (
4
+ "encoding/json"
5
+ "fmt"
6
+ "io"
7
+ "os"
8
+ "path/filepath"
9
+
10
+ "github.com/devrites/devrites/internal/devritespaths"
11
+ "github.com/devrites/devrites/internal/version"
12
+ )
13
+
14
+ // PathProbe records whether one project-relative path exists.
15
+ type PathProbe struct {
16
+ Path string `json:"path"`
17
+ Present bool `json:"present"`
18
+ }
19
+
20
+ // EnvironmentReport is a read-only snapshot of install and code-index presence.
21
+ type EnvironmentReport struct {
22
+ EngineVersion string `json:"engine_version"`
23
+ ProjectRoot string `json:"project_root"`
24
+ DevritesRoot string `json:"devrites_root,omitempty"`
25
+ Manifest PathProbe `json:"manifest"`
26
+ Indexes []PathProbe `json:"indexes"`
27
+ }
28
+
29
+ func projectRootFromDevritesRoot(root string) string {
30
+ if root == "" {
31
+ wd, err := os.Getwd()
32
+ if err != nil {
33
+ return "."
34
+ }
35
+ return wd
36
+ }
37
+ if filepath.Base(root) == devritespaths.DevritesRootName {
38
+ return filepath.Dir(root)
39
+ }
40
+ return root
41
+ }
42
+
43
+ func probePath(projectRoot, rel string) PathProbe {
44
+ abs := filepath.Join(projectRoot, filepath.FromSlash(rel))
45
+ info, err := os.Stat(abs)
46
+ return PathProbe{Path: rel, Present: err == nil && info != nil}
47
+ }
48
+
49
+ // EnvironmentReportFor builds a report for one project root.
50
+ func EnvironmentReportFor(devritesRoot, projectRoot string) (EnvironmentReport, error) {
51
+ if projectRoot == "" {
52
+ projectRoot = projectRootFromDevritesRoot(devritesRoot)
53
+ }
54
+ abs, err := filepath.Abs(projectRoot)
55
+ if err != nil {
56
+ return EnvironmentReport{}, err
57
+ }
58
+ report := EnvironmentReport{
59
+ EngineVersion: version.Version,
60
+ ProjectRoot: abs,
61
+ Manifest: probePath(abs, devritespaths.ManifestName),
62
+ Indexes: []PathProbe{
63
+ probePath(abs, ".codegraph"),
64
+ probePath(abs, ".code-review-graph"),
65
+ probePath(abs, ".codebase-memory"),
66
+ },
67
+ }
68
+ if devritesRoot != "" {
69
+ report.DevritesRoot = devritesRoot
70
+ }
71
+ return report, nil
72
+ }
73
+
74
+ // WriteEnvironmentReportJSON prints one JSON object to stdout.
75
+ func WriteEnvironmentReportJSON(devritesRoot, projectRoot string, stdout io.Writer) error {
76
+ report, err := EnvironmentReportFor(devritesRoot, projectRoot)
77
+ if err != nil {
78
+ return fmt.Errorf("build environment report: %w", err)
79
+ }
80
+ enc := json.NewEncoder(stdout)
81
+ enc.SetIndent("", " ")
82
+ if err := enc.Encode(report); err != nil {
83
+ return fmt.Errorf("encode environment report: %w", err)
84
+ }
85
+ return nil
86
+ }
87
+
88
+ // RunEnvironmentCheck implements `devrites-engine check indexes`.
89
+ func RunEnvironmentCheck(devritesRoot string, args []string, stdout, stderr io.Writer) int {
90
+ projectRoot := ""
91
+ for i := 0; i < len(args); i++ {
92
+ if args[i] == "--root" {
93
+ if i+1 >= len(args) {
94
+ fmt.Fprintln(stderr, "indexes: --root requires a path")
95
+ return 2
96
+ }
97
+ projectRoot = args[i+1]
98
+ i++
99
+ continue
100
+ }
101
+ fmt.Fprintf(stderr, "indexes: unexpected argument %q\n", args[i])
102
+ return 2
103
+ }
104
+ if err := WriteEnvironmentReportJSON(devritesRoot, projectRoot, stdout); err != nil {
105
+ fmt.Fprintf(stderr, "indexes: %v\n", err)
106
+ return 2
107
+ }
108
+ return 0
109
+ }
@@ -0,0 +1,54 @@
1
+ package lib
2
+
3
+ import (
4
+ "bytes"
5
+ "os"
6
+ "path/filepath"
7
+ "strings"
8
+ "testing"
9
+
10
+ "github.com/devrites/devrites/internal/devritespaths"
11
+ )
12
+
13
+ func TestEnvironmentReportForDetectsManifestAndIndexes(t *testing.T) {
14
+ project := t.TempDir()
15
+ root := filepath.Join(project, devritespaths.DevritesRootName)
16
+ manifestPath := filepath.Join(project, devritespaths.ManifestName)
17
+ if err := os.MkdirAll(filepath.Dir(manifestPath), 0o755); err != nil {
18
+ t.Fatal(err)
19
+ }
20
+ if err := os.WriteFile(manifestPath, []byte("devrites\n"), 0o644); err != nil {
21
+ t.Fatal(err)
22
+ }
23
+ if err := os.MkdirAll(filepath.Join(project, ".codegraph"), 0o755); err != nil {
24
+ t.Fatal(err)
25
+ }
26
+
27
+ report, err := EnvironmentReportFor(root, project)
28
+ if err != nil {
29
+ t.Fatal(err)
30
+ }
31
+ if report.ProjectRoot != project {
32
+ t.Fatalf("project root = %q, want %q", report.ProjectRoot, project)
33
+ }
34
+ if !report.Manifest.Present {
35
+ t.Fatal("expected manifest present")
36
+ }
37
+ if len(report.Indexes) != 3 {
38
+ t.Fatalf("indexes = %d, want 3", len(report.Indexes))
39
+ }
40
+ if !report.Indexes[0].Present {
41
+ t.Fatalf("expected .codegraph present, got %+v", report.Indexes)
42
+ }
43
+ }
44
+
45
+ func TestRunEnvironmentCheckWritesJSON(t *testing.T) {
46
+ project := t.TempDir()
47
+ var stdout, stderr bytes.Buffer
48
+ if code := RunEnvironmentCheck("", []string{"--root", project}, &stdout, &stderr); code != 0 {
49
+ t.Fatalf("code=%d stderr=%q", code, stderr.String())
50
+ }
51
+ if !strings.Contains(stdout.String(), `"engine_version"`) || !strings.Contains(stdout.String(), `"manifest"`) {
52
+ t.Fatalf("stdout=%q", stdout.String())
53
+ }
54
+ }
@@ -88,6 +88,7 @@ func Migrate(root string, args []string, stdout, stderr io.Writer) int {
88
88
  var exit int
89
89
  var result string
90
90
  err = state.WithFeatureLock(root, slug, func() error {
91
+ // #nosec G304 -- workspace ledger path resolved from the operator root
91
92
  raw, err := os.ReadFile(ledger)
92
93
  if err != nil {
93
94
  return err
@@ -77,7 +77,9 @@ func OpenVisual(root string, args []string, stdout, stderr io.Writer) int {
77
77
  var idReport VisualIDConsistency
78
78
  idsChecked := false
79
79
  if !outlineMissing {
80
+ // #nosec G304 -- visual evidence files inside the workspace
80
81
  htmlBody, herr := os.ReadFile(htmlPath)
82
+ // #nosec G304 -- visual evidence files inside the workspace
81
83
  outlineBody, oerr := os.ReadFile(outlinePath)
82
84
  switch {
83
85
  case herr != nil:
@@ -239,12 +241,15 @@ func openLocalFile(path string) error {
239
241
  switch runtime.GOOS {
240
242
  case "darwin":
241
243
  // argv only — no shell.
244
+ // #nosec G204 -- fixed platform opener; path passed as argv, no shell
242
245
  cmd = exec.Command("open", path)
243
246
  case "windows":
244
247
  // Avoid cmd.exe /c shell composition; FileProtocolHandler takes one path argv.
248
+ // #nosec G204 -- fixed platform opener; path passed as argv, no shell
245
249
  cmd = exec.Command("rundll32.exe", "url.dll,FileProtocolHandler", path)
246
250
  default:
247
251
  // argv only — no shell.
252
+ // #nosec G204 -- fixed platform opener; path passed as argv, no shell
248
253
  cmd = exec.Command("xdg-open", path)
249
254
  }
250
255
  if err := cmd.Start(); err != nil {
@@ -98,6 +98,7 @@ func resolveMutation(mode, qid, payload, qfile, sfile string, stdout, stderr io.
98
98
  fmt.Fprintf(stdout, "Reason: %s\n", payload)
99
99
  fmt.Fprintf(stdout, "Workspace: questions.md + state.md updated.\n")
100
100
  case "batch":
101
+ // #nosec G304 -- operator-passed --batch file argument
101
102
  data, err := os.ReadFile(payload)
102
103
  if err != nil {
103
104
  return fail(stderr, "Batch file not found: "+payload, 5)
@@ -188,6 +189,7 @@ func nowUTC() string { return clockNow().UTC().Format("2006-01-02T15:04:05Z") }
188
189
  // status, answer, and answered-at time in one pass. Returns 0, or 3 (qid
189
190
  // not found) / 4 (qid not open), writing the message on failure.
190
191
  func resolveQuestion(qfile, qid, status, answer string, stderr io.Writer) int {
192
+ // #nosec G304 -- questions.md path inside the feature workspace
191
193
  data, err := os.ReadFile(qfile)
192
194
  if err != nil {
193
195
  return fail(stderr, "questions.md missing at "+qfile, 2)
@@ -284,6 +286,7 @@ var (
284
286
  // running, clears the Next step, and appends a Log entry. It is a no-op when the
285
287
  // workspace is not waiting on this question.
286
288
  func clearAwaiting(sfile, qid string) error {
289
+ // #nosec G304 -- state.md path inside the feature workspace
287
290
  data, err := os.ReadFile(sfile)
288
291
  if err != nil {
289
292
  return fmt.Errorf("read state %s: %w", sfile, err)
@@ -385,6 +385,7 @@ func scanWorktreePaths(project string, paths []string, budget *secretScanBudget)
385
385
  if info.Size() < 0 || info.Size() > budget.bytesRemaining {
386
386
  return nil, errSecretScanLimit
387
387
  }
388
+ // #nosec G304 -- workspace walk; size budget checked above
388
389
  file, err := os.Open(fullPath)
389
390
  if err != nil {
390
391
  return nil, err
@@ -68,11 +68,12 @@ func ScanSkillTrust(path string) (SkillTrustResult, error) {
68
68
  if info.Size() > 1<<20 {
69
69
  return SkillTrustResult{}, fmt.Errorf("skill-trust: %q exceeds 1 MiB limit", path)
70
70
  }
71
+ // #nosec G304 -- installed skill file; 1 MiB cap checked above
71
72
  file, err := os.Open(path)
72
73
  if err != nil {
73
74
  return SkillTrustResult{}, err
74
75
  }
75
- defer file.Close()
76
+ defer func() { _ = file.Close() }()
76
77
  raw, err := io.ReadAll(io.LimitReader(file, 1<<20+1))
77
78
  if err != nil {
78
79
  return SkillTrustResult{}, err
@@ -65,6 +65,7 @@ func runGitCommandIO(dir string, env []string, input []byte, stdout io.Writer, a
65
65
  ctx, cancel := context.WithTimeout(context.Background(), gitCommandTimeout)
66
66
  defer cancel()
67
67
  commandArgs := append([]string{"-C", dir}, args...)
68
+ // #nosec G204 -- git -C <operator repo dir>; fixed binary, sanitized env
68
69
  cmd := exec.CommandContext(ctx, "git", commandArgs...)
69
70
  cmd.WaitDelay = 2 * time.Second
70
71
  if input != nil {
@@ -21,6 +21,7 @@ func readWorkspaceArtifact(root, slug, name string) ([]byte, error) {
21
21
  if info.Size() > 1<<20 {
22
22
  return nil, fmt.Errorf("task-graph: %s exceeds 1 MiB limit", name)
23
23
  }
24
+ // #nosec G304 -- workspace task-graph file; 1 MiB cap checked above
24
25
  raw, err := os.ReadFile(path)
25
26
  if err != nil {
26
27
  return nil, fmt.Errorf("task-graph: cannot read %s: %w", name, err)
@@ -0,0 +1,36 @@
1
+ package markdowntext
2
+
3
+ import (
4
+ "bytes"
5
+ "testing"
6
+ "unicode/utf8"
7
+ )
8
+
9
+ func FuzzStructural(f *testing.F) {
10
+ f.Add([]byte("# Title\n\n```go\nfmt.Println()\n```\n"))
11
+ f.Add([]byte("~~~\nunclosed fence\n"))
12
+ f.Add([]byte(" ```\n ~~~\n"))
13
+ f.Add([]byte("code ``` inline\n| not | a | fence |\n"))
14
+ f.Add([]byte("line\r\nwith\r\ncrlf\r\n"))
15
+ f.Add([]byte("\xff\xfe invalid utf8 \x00"))
16
+ f.Add([]byte(""))
17
+ f.Fuzz(func(t *testing.T, input []byte) {
18
+ out, err := Structural(input)
19
+ if err != nil {
20
+ if utf8.Valid(input) && bytes.IndexByte(input, 0) < 0 {
21
+ t.Fatalf("Structural rejected input without malformed UTF-8 or NUL: %v", err)
22
+ }
23
+ return
24
+ }
25
+ if len(out) != len(input) {
26
+ t.Fatalf("Structural changed length: %d -> %d", len(input), len(out))
27
+ }
28
+ if !utf8.Valid(out) {
29
+ t.Fatal("Structural emitted invalid UTF-8")
30
+ }
31
+ stable, err := Structural(out)
32
+ if err != nil || !bytes.Equal(stable, out) {
33
+ t.Fatal("Structural is not idempotent")
34
+ }
35
+ })
36
+ }
@@ -225,6 +225,7 @@ func readJSONInput(path string, stdin io.Reader) ([]byte, error) {
225
225
  if strings.Contains(path, "..") {
226
226
  return nil, fmt.Errorf("json path must not contain '..'")
227
227
  }
228
+ // #nosec G304 -- path traversal refused just above
228
229
  return os.ReadFile(path)
229
230
  }
230
231
 
@@ -18,6 +18,7 @@ const gitTimeout = 60 * time.Second
18
18
  func git(repo string, args ...string) (string, error) {
19
19
  ctx, cancel := context.WithTimeout(context.Background(), gitTimeout)
20
20
  defer cancel()
21
+ // #nosec G204 -- git -C <worktree>; fixed binary, sanitized env
21
22
  cmd := exec.CommandContext(ctx, "git", append([]string{"-C", repo}, args...)...)
22
23
  env := append(gitenv.Sanitize(os.Environ()),
23
24
  "GIT_TERMINAL_PROMPT=0",
@@ -213,6 +213,7 @@ func WriteLease(path string, lease *Lease) error {
213
213
  }
214
214
 
215
215
  func ReadLease(path string) (*Lease, error) {
216
+ // #nosec G304 -- lease file under the engine-managed work dir
216
217
  data, err := os.ReadFile(path)
217
218
  if err != nil {
218
219
  return nil, err
@@ -32,6 +32,12 @@ func NormalizePath(raw string) (string, error) {
32
32
  }
33
33
  parts := make([]string, 0, strings.Count(path, "/")+1)
34
34
  for part := range strings.SplitSeq(path, "/") {
35
+ // Edge whitespace on a segment would survive segment filtering and
36
+ // make normalization non-idempotent ("0\n." collapsing to "0\n"),
37
+ // so reject it outright like the other malformed shapes.
38
+ if trimmed := strings.TrimSpace(part); trimmed != part {
39
+ return "", fmt.Errorf("path segment must not have leading or trailing whitespace: %q", raw)
40
+ }
35
41
  if part == "" || part == "." {
36
42
  continue
37
43
  }
@@ -0,0 +1,43 @@
1
+ package parallel
2
+
3
+ import (
4
+ "strings"
5
+ "testing"
6
+ )
7
+
8
+ func FuzzPathDisjoint(f *testing.F) {
9
+ f.Add("src/a.go", []byte(`{"slices":[{"id":"a","paths":["src/a.go"]},{"id":"b","paths":["src/b.go"]}]}`))
10
+ f.Add("../escape", []byte(`[{"id":"a","paths":["/abs"]},{"id":"b","paths":[".devrites/state.md"]}]`))
11
+ f.Add("src\\windows.go", []byte(`{"slices":[{"id":"a","paths":["src", "src"]}]}`))
12
+ f.Add("src//double/", []byte(`not json`))
13
+ f.Add(".devrites", []byte(`{"slices":[]}`))
14
+ f.Fuzz(func(t *testing.T, raw string, doc []byte) {
15
+ normalized, err := NormalizePath(raw)
16
+ if err == nil {
17
+ if normalized == "" || strings.HasPrefix(normalized, "/") || strings.Contains(normalized, "\\") {
18
+ t.Fatalf("NormalizePath accepted %q into %q", raw, normalized)
19
+ }
20
+ for _, part := range strings.Split(normalized, "/") {
21
+ if part == "" || part == "." || part == ".." {
22
+ t.Fatalf("NormalizePath accepted %q into %q with bad segment %q", raw, normalized, part)
23
+ }
24
+ }
25
+ again, err := NormalizePath(normalized)
26
+ if err != nil || again != normalized {
27
+ t.Fatalf("NormalizePath not idempotent: %q -> %q (err %v)", normalized, again, err)
28
+ }
29
+ }
30
+
31
+ slices, err := ParseSlicesJSON(doc)
32
+ if err != nil {
33
+ return
34
+ }
35
+ ids, err := CheckPathDisjoint(slices, "")
36
+ if err != nil {
37
+ return
38
+ }
39
+ if len(ids) != len(slices) {
40
+ t.Fatalf("CheckPathDisjoint returned %d ids for %d slices", len(ids), len(slices))
41
+ }
42
+ })
43
+ }
@@ -9,7 +9,10 @@ import (
9
9
 
10
10
  func TestNormalizePathRejectsDirty(t *testing.T) {
11
11
  t.Parallel()
12
- cases := []string{"", " ", "/", "/abs", `C:\windows`, `..`, "a/../b", "../x"}
12
+ cases := []string{"", " ", "/", "/abs", `C:\windows`, `..`, "a/../b", "../x",
13
+ // Segment-edge whitespace previously survived normalization
14
+ // ("0 /." collapsed to "0 "), making the mapping non-idempotent.
15
+ "0 /.", "src /a.go", "./ \n/x"}
13
16
  for _, raw := range cases {
14
17
  if _, err := NormalizePath(raw); err == nil {
15
18
  t.Fatalf("NormalizePath(%q) should fail", raw)
@@ -0,0 +1,3 @@
1
+ go test fuzz v1
2
+ string("0 /")
3
+ []byte("0")
@@ -164,7 +164,7 @@ func fetchJSON(ctx context.Context, rawURL string, out any) error {
164
164
  if err != nil {
165
165
  return err
166
166
  }
167
- defer resp.Body.Close()
167
+ defer func() { _ = resp.Body.Close() }()
168
168
  if resp.StatusCode < 200 || resp.StatusCode > 299 {
169
169
  return fmt.Errorf("%s returned %s", resp.Request.URL.Redacted(), resp.Status)
170
170
  }
@@ -192,6 +192,7 @@ func downloadVerified(ctx context.Context, rawURL, destination, filename string,
192
192
  if err := download(ctx, rawURL+".sha256", sumPath, maxChecksumBytes, 0o600); err != nil {
193
193
  return fmt.Errorf("missing checksum for %s: %w", filename, err)
194
194
  }
195
+ // #nosec G304 -- checksum downloaded into the self-update temp dir
195
196
  sum, err := os.ReadFile(sumPath)
196
197
  if err != nil {
197
198
  return fmt.Errorf("read checksum for %s: %w", filename, err)
@@ -204,6 +205,7 @@ func downloadVerified(ctx context.Context, rawURL, destination, filename string,
204
205
  if err != nil || len(want) != sha256.Size {
205
206
  return fmt.Errorf("invalid SHA-256 for %s", filename)
206
207
  }
208
+ // #nosec G304 -- downloaded release asset in the self-update temp dir
207
209
  file, err := os.Open(destination)
208
210
  if err != nil {
209
211
  return fmt.Errorf("open %s for checksum: %w", filename, err)
@@ -228,7 +230,7 @@ func download(ctx context.Context, rawURL, destination string, maxBytes int64, m
228
230
  if err != nil {
229
231
  return err
230
232
  }
231
- defer resp.Body.Close()
233
+ defer func() { _ = resp.Body.Close() }()
232
234
  if resp.StatusCode < 200 || resp.StatusCode > 299 {
233
235
  return fmt.Errorf("%s returned %s", resp.Request.URL.Redacted(), resp.Status)
234
236
  }
@@ -338,16 +340,17 @@ func extractBundle(archive, destination, tag string) (string, error) {
338
340
  }
339
341
 
340
342
  func extractTarGz(archive, destination string) error {
343
+ // #nosec G304 -- downloaded release archive in the self-update temp dir
341
344
  file, err := os.Open(archive)
342
345
  if err != nil {
343
346
  return fmt.Errorf("open archive: %w", err)
344
347
  }
345
- defer file.Close()
348
+ defer func() { _ = file.Close() }()
346
349
  gz, err := gzip.NewReader(file)
347
350
  if err != nil {
348
351
  return fmt.Errorf("open gzip stream: %w", err)
349
352
  }
350
- defer gz.Close()
353
+ defer func() { _ = gz.Close() }()
351
354
  reader := tar.NewReader(gz)
352
355
  root, err := filepath.Abs(destination)
353
356
  if err != nil {
@@ -389,6 +392,7 @@ func extractTarGz(archive, destination string) error {
389
392
  if err := os.MkdirAll(filepath.Dir(target), 0o755); err != nil {
390
393
  return fmt.Errorf("create directory for %s: %w", name, err)
391
394
  }
395
+ // #nosec G304 -- tar member name ValidPath-checked and confined to the extraction root above
392
396
  out, err := os.OpenFile(target, os.O_CREATE|os.O_EXCL|os.O_WRONLY, mode)
393
397
  if err != nil {
394
398
  return fmt.Errorf("create %s: %w", name, err)
@@ -299,6 +299,7 @@ func inspectWorkspaceState(facts *Facts) {
299
299
  })
300
300
  return
301
301
  }
302
+ // #nosec G304 -- workspace ACTIVE path; symlink policy enforced by state.ResolveRoot
302
303
  raw, err := os.ReadFile(activePath)
303
304
  if err != nil {
304
305
  return
@@ -349,6 +350,7 @@ func probeGit(dir string) GitFacts {
349
350
  func gitPath(dir, flag string) (string, bool) {
350
351
  ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
351
352
  defer cancel()
353
+ // #nosec G204 -- git -C <operator repo dir>, fixed args, sanitized env
352
354
  cmd := exec.CommandContext(ctx, "git", "-C", dir, "rev-parse", "--path-format=absolute", flag)
353
355
  cmd.Env = append(gitenv.Sanitize(os.Environ()), "GIT_OPTIONAL_LOCKS=0", "GIT_TERMINAL_PROMPT=0")
354
356
  out, err := cmd.Output()
@@ -441,6 +443,7 @@ func within(candidate, parent string) bool {
441
443
  }
442
444
 
443
445
  func isDir(path string) bool {
446
+ // #nosec G703 -- existence probe on a safepath-resolved candidate
444
447
  info, err := os.Stat(path)
445
448
  return err == nil && info.IsDir()
446
449
  }
@@ -0,0 +1,21 @@
1
+ package safepath
2
+
3
+ import "testing"
4
+
5
+ func FuzzWithinResolved(f *testing.F) {
6
+ f.Add("child/file.txt", "/tmp/parent")
7
+ f.Add("..", "/tmp/parent")
8
+ f.Add("", "")
9
+ f.Fuzz(func(t *testing.T, candidate, parent string) {
10
+ _ = WithinResolved(candidate, parent)
11
+ })
12
+ }
13
+
14
+ func FuzzResolveExisting(f *testing.F) {
15
+ f.Add("/tmp/example")
16
+ f.Add("relative/path")
17
+ f.Add("")
18
+ f.Fuzz(func(t *testing.T, filename string) {
19
+ _, _ = ResolveExisting(filename)
20
+ })
21
+ }
@@ -0,0 +1,87 @@
1
+ package state
2
+
3
+ import (
4
+ "fmt"
5
+ "regexp"
6
+ "strings"
7
+ )
8
+
9
+ var (
10
+ acceptanceHeadingRE = regexp.MustCompile(`(?i)^##\s+Acceptance criteria\s*$`)
11
+ canonicalACRE = regexp.MustCompile(`\bAC-\d{3}\b`)
12
+ h2HeadingRE = regexp.MustCompile(`^##\s+`)
13
+ )
14
+
15
+ // AcceptanceMapResult is the deterministic ID-presence check from spec.md
16
+ // onto tasks.md and test-plan.md. It does not judge coverage quality.
17
+ type AcceptanceMapResult struct {
18
+ SpecIDs []string
19
+ Problems []string
20
+ }
21
+
22
+ // ParseAcceptanceMap extracts canonical AC-### IDs from spec.md's Acceptance
23
+ // criteria section and requires each to appear as a literal substring in the
24
+ // required planning artifacts.
25
+ func ParseAcceptanceMap(spec, tasks, testPlan []byte, requireTasks, requireTestPlan bool) AcceptanceMapResult {
26
+ ids := uniqueCanonicalACs(acceptanceSection(spec))
27
+ result := AcceptanceMapResult{SpecIDs: ids}
28
+ if len(ids) == 0 {
29
+ return result
30
+ }
31
+ if requireTasks {
32
+ text := string(tasks)
33
+ for _, id := range ids {
34
+ if !strings.Contains(text, id) {
35
+ result.Problems = append(result.Problems, fmt.Sprintf("acceptance %s is not referenced in tasks.md", id))
36
+ }
37
+ }
38
+ }
39
+ if requireTestPlan {
40
+ text := string(testPlan)
41
+ for _, id := range ids {
42
+ if !strings.Contains(text, id) {
43
+ result.Problems = append(result.Problems, fmt.Sprintf("acceptance %s is not referenced in test-plan.md", id))
44
+ }
45
+ }
46
+ }
47
+ return result
48
+ }
49
+
50
+ func acceptanceSection(spec []byte) string {
51
+ lines := strings.Split(strings.ReplaceAll(string(spec), "\r\n", "\n"), "\n")
52
+ start := -1
53
+ for i, line := range lines {
54
+ if acceptanceHeadingRE.MatchString(strings.TrimSpace(line)) {
55
+ start = i + 1
56
+ break
57
+ }
58
+ }
59
+ if start < 0 {
60
+ return ""
61
+ }
62
+ end := len(lines)
63
+ for i := start; i < len(lines); i++ {
64
+ if h2HeadingRE.MatchString(lines[i]) {
65
+ end = i
66
+ break
67
+ }
68
+ }
69
+ return strings.Join(lines[start:end], "\n")
70
+ }
71
+
72
+ func uniqueCanonicalACs(text string) []string {
73
+ found := canonicalACRE.FindAllString(text, -1)
74
+ if len(found) == 0 {
75
+ return nil
76
+ }
77
+ seen := make(map[string]bool, len(found))
78
+ var ids []string
79
+ for _, id := range found {
80
+ if seen[id] {
81
+ continue
82
+ }
83
+ seen[id] = true
84
+ ids = append(ids, id)
85
+ }
86
+ return ids
87
+ }