devrites 4.7.0 → 5.1.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 (790) hide show
  1. package/CHANGELOG.md +23 -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 +13 -2
  53. package/engine/internal/parallel/ops.go +3 -3
  54. package/engine/internal/parallel/parallel_test.go +104 -0
  55. package/engine/internal/parallel/pathdisjoint.go +6 -0
  56. package/engine/internal/parallel/pathdisjoint_fuzz_test.go +43 -0
  57. package/engine/internal/parallel/pathdisjoint_test.go +4 -1
  58. package/engine/internal/parallel/testdata/fuzz/FuzzPathDisjoint/a449b81b4711b7b4 +3 -0
  59. package/engine/internal/release/release.go +8 -4
  60. package/engine/internal/rootfacts/facts.go +3 -0
  61. package/engine/internal/safepath/safepath_fuzz_test.go +21 -0
  62. package/engine/internal/state/acceptance.go +87 -0
  63. package/engine/internal/state/acceptance_test.go +57 -0
  64. package/engine/internal/state/cursor.go +55 -14
  65. package/engine/internal/state/cursor_fuzz_test.go +80 -0
  66. package/engine/internal/state/lock_unix.go +1 -0
  67. package/engine/internal/state/observation.go +3 -3
  68. package/engine/internal/state/observation_test.go +1 -1
  69. package/engine/internal/state/taskgraph_fuzz_test.go +38 -0
  70. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/114b28f68c1fa4db +4 -0
  71. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/378a0f2218e812ea +4 -0
  72. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/39eaa26fcb481e3c +4 -0
  73. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/776ca1dc0143acf0 +4 -0
  74. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/9295930c1ebb81df +4 -0
  75. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/a60de309dc33be0d +4 -0
  76. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f04dc7b06ef7c99f +4 -0
  77. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f3000ac510878bd6 +4 -0
  78. package/engine/internal/state/testdata/fuzz/FuzzWorkspaceSchemaRow/a75aabb9f2a847d5 +2 -0
  79. package/engine/internal/state/workspaceschema_fuzz_test.go +27 -0
  80. package/engine/internal/state/write.go +3 -2
  81. package/engine/internal/testutil/testutil.go +4 -2
  82. package/engine/main.go +19 -1
  83. package/engine/observation_contract_test.go +174 -0
  84. package/engine/root_routing_test.go +14 -3
  85. package/engine/tests/adr_0027_readiness_binding_test.go +1 -1
  86. package/engine/tests/cli_test.go +2 -2
  87. package/engine/tests/gate_test.go +2 -2
  88. package/pack/.claude/agents/devrites-code-reviewer.md +10 -8
  89. package/pack/.claude/agents/devrites-devex-reviewer.md +4 -6
  90. package/pack/.claude/agents/devrites-evidence-scout.md +13 -2
  91. package/pack/.claude/agents/devrites-frontend-reviewer.md +35 -15
  92. package/pack/.claude/agents/devrites-performance-reviewer.md +4 -7
  93. package/pack/.claude/agents/devrites-plan-reviewer.md +5 -3
  94. package/pack/.claude/agents/devrites-proof-runner.md +1 -1
  95. package/pack/.claude/agents/devrites-retrospector.md +7 -1
  96. package/pack/.claude/agents/devrites-security-auditor.md +6 -5
  97. package/pack/.claude/agents/devrites-simplifier-reviewer.md +3 -2
  98. package/pack/.claude/agents/devrites-slice-wright.md +7 -11
  99. package/pack/.claude/agents/devrites-spec-reviewer.md +3 -2
  100. package/pack/.claude/agents/devrites-strategy-reviewer.md +4 -4
  101. package/pack/.claude/agents/devrites-test-analyst.md +2 -1
  102. package/pack/.claude/skills/devrites-api-interface/SKILL.md +9 -9
  103. package/pack/.claude/skills/devrites-audit/SKILL.md +3 -1
  104. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +9 -2
  105. package/pack/.claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +3 -10
  106. package/pack/.claude/skills/devrites-debug-recovery/reference/regression-test.md +1 -1
  107. package/pack/.claude/skills/devrites-doubt/SKILL.md +5 -7
  108. package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +6 -16
  109. package/pack/.claude/skills/devrites-frontend-craft/reference/craft.md +5 -13
  110. package/pack/.claude/skills/devrites-frontend-craft/reference/design-references.md +2 -3
  111. package/pack/.claude/skills/devrites-frontend-craft/reference/fullstack.md +4 -3
  112. package/pack/.claude/skills/devrites-frontend-craft/reference/quality-standards.md +76 -20
  113. package/pack/.claude/skills/devrites-frontend-craft/reference/reuse-first.md +4 -9
  114. package/pack/.claude/skills/devrites-frontend-craft/reference/shape.md +3 -7
  115. package/pack/.claude/skills/devrites-interview/SKILL.md +4 -3
  116. package/pack/.claude/skills/devrites-lib/SKILL.md +2 -1
  117. package/pack/.claude/skills/devrites-lib/reference/candidate-integrity.md +1 -9
  118. package/pack/.claude/skills/devrites-lib/reference/intent-map.md +20 -3
  119. package/pack/.claude/skills/devrites-lib/reference/orchestration-profiles.md +5 -0
  120. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +34 -4
  121. package/pack/.claude/skills/devrites-lib/reference/reply-contract.md +6 -3
  122. package/pack/.claude/skills/devrites-lib/reference/standards/README.md +7 -0
  123. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +34 -15
  124. package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +13 -5
  125. package/pack/.claude/skills/devrites-lib/reference/standards/browser-proof-checklist.md +19 -3
  126. package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +1 -1
  127. package/pack/.claude/skills/devrites-lib/reference/standards/code-navigation.md +43 -0
  128. package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +19 -1
  129. package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +8 -4
  130. package/pack/.claude/skills/devrites-lib/reference/standards/core.md +34 -10
  131. package/pack/.claude/skills/devrites-lib/reference/standards/data-integrity.md +24 -5
  132. package/pack/.claude/skills/devrites-lib/reference/standards/debug-recovery.md +8 -1
  133. package/pack/.claude/skills/devrites-lib/reference/standards/definition-of-done.md +14 -11
  134. package/pack/.claude/skills/devrites-lib/reference/standards/documentation.md +4 -1
  135. package/pack/.claude/skills/devrites-lib/reference/standards/edge-case-trace.md +2 -2
  136. package/pack/.claude/skills/devrites-lib/reference/standards/elicitation.md +1 -1
  137. package/pack/.claude/skills/devrites-lib/reference/standards/error-handling.md +2 -2
  138. package/pack/.claude/skills/devrites-lib/reference/standards/integration-reliability.md +14 -3
  139. package/pack/.claude/skills/devrites-lib/reference/standards/loop-operations.md +2 -2
  140. package/pack/.claude/skills/devrites-lib/reference/standards/observability.md +6 -1
  141. package/pack/.claude/skills/devrites-lib/reference/standards/one-shot-actions.md +2 -2
  142. package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +20 -0
  143. package/pack/.claude/skills/devrites-lib/reference/standards/prose-style.md +7 -0
  144. package/pack/.claude/skills/devrites-lib/reference/standards/repository-topology.md +3 -2
  145. package/pack/.claude/skills/devrites-lib/reference/standards/review-checklist.md +7 -5
  146. package/pack/.claude/skills/devrites-lib/reference/standards/security-checklist.md +10 -1
  147. package/pack/.claude/skills/devrites-lib/reference/standards/security.md +100 -11
  148. package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +48 -2
  149. package/pack/.claude/skills/devrites-lib/reference/standards/spec-grammar.md +28 -26
  150. package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +22 -2
  151. package/pack/.claude/skills/devrites-lib/reference/standards/tooling.md +40 -12
  152. package/pack/.claude/skills/devrites-lib/reference/standards/workflow-artifacts.md +24 -8
  153. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/code.md +0 -2
  154. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/comparison.md +0 -2
  155. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/diagram.md +1 -3
  156. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/index.md +2 -4
  157. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/input.md +1 -2
  158. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/plan.md +1 -2
  159. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/slides.md +0 -2
  160. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/table.md +0 -2
  161. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +7 -5
  162. package/pack/.claude/skills/devrites-prose-craft/SKILL.md +11 -7
  163. package/pack/.claude/skills/devrites-prose-craft/reference/banned-phrases.md +41 -4
  164. package/pack/.claude/skills/devrites-prose-craft/reference/examples.md +31 -2
  165. package/pack/.claude/skills/devrites-prose-craft/reference/structures.md +62 -0
  166. package/pack/.claude/skills/devrites-source-driven/SKILL.md +11 -12
  167. package/pack/.claude/skills/devrites-ux-shape/SKILL.md +5 -6
  168. package/pack/.claude/skills/rite/SKILL.md +3 -1
  169. package/pack/.claude/skills/rite-adopt/SKILL.md +9 -8
  170. package/pack/.claude/skills/rite-autocomplete/SKILL.md +9 -6
  171. package/pack/.claude/skills/rite-build/SKILL.md +13 -8
  172. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +2 -2
  173. package/pack/.claude/skills/rite-build/reference/checkpoint.md +3 -1
  174. package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +7 -5
  175. package/pack/.claude/skills/rite-build/reference/output.md +2 -2
  176. package/pack/.claude/skills/rite-build/reference/parallel-batch.md +32 -9
  177. package/pack/.claude/skills/rite-build/reference/phase-contract.md +6 -5
  178. package/pack/.claude/skills/rite-build/reference/tdd.md +3 -2
  179. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +7 -7
  180. package/pack/.claude/skills/rite-clarify/SKILL.md +6 -5
  181. package/pack/.claude/skills/rite-converge/SKILL.md +8 -7
  182. package/pack/.claude/skills/rite-converge/reference/anti-patterns.md +1 -1
  183. package/pack/.claude/skills/rite-customize/SKILL.md +9 -0
  184. package/pack/.claude/skills/rite-define/SKILL.md +4 -7
  185. package/pack/.claude/skills/rite-define/reference/anti-patterns.md +1 -1
  186. package/pack/.claude/skills/rite-define/reference/gates.md +6 -5
  187. package/pack/.claude/skills/rite-define/reference/plan-template.md +2 -2
  188. package/pack/.claude/skills/rite-dogfood/SKILL.md +10 -4
  189. package/pack/.claude/skills/rite-explain/SKILL.md +9 -5
  190. package/pack/.claude/skills/rite-explain/reference/intake.md +2 -1
  191. package/pack/.claude/skills/rite-frame/SKILL.md +1 -1
  192. package/pack/.claude/skills/rite-handoff/SKILL.md +1 -1
  193. package/pack/.claude/skills/rite-learn/SKILL.md +18 -4
  194. package/pack/.claude/skills/rite-plan/SKILL.md +4 -4
  195. package/pack/.claude/skills/rite-plan/reference/anti-patterns.md +2 -2
  196. package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +24 -0
  197. package/pack/.claude/skills/rite-polish/SKILL.md +9 -6
  198. package/pack/.claude/skills/rite-polish/reference/anti-ai-slop.md +20 -0
  199. package/pack/.claude/skills/rite-polish/reference/browser-polish-evidence.md +3 -1
  200. package/pack/.claude/skills/rite-polish/reference/code.md +1 -19
  201. package/pack/.claude/skills/rite-polish/reference/harden-checklist.md +1 -1
  202. package/pack/.claude/skills/rite-polish/reference/ledger.md +3 -0
  203. package/pack/.claude/skills/rite-polish/reference/ui.md +4 -3
  204. package/pack/.claude/skills/rite-pov/SKILL.md +16 -1
  205. package/pack/.claude/skills/rite-pr-feedback/SKILL.md +1 -1
  206. package/pack/.claude/skills/rite-pressure-test/SKILL.md +2 -1
  207. package/pack/.claude/skills/rite-prototype/SKILL.md +2 -2
  208. package/pack/.claude/skills/rite-prove/SKILL.md +6 -6
  209. package/pack/.claude/skills/rite-prove/reference/acceptance-proof.md +8 -9
  210. package/pack/.claude/skills/rite-prove/reference/browser-proof.md +5 -3
  211. package/pack/.claude/skills/rite-prove/reference/test-command-discovery.md +0 -1
  212. package/pack/.claude/skills/rite-quick/SKILL.md +6 -4
  213. package/pack/.claude/skills/rite-resolve/SKILL.md +5 -4
  214. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +1 -1
  215. package/pack/.claude/skills/rite-review/SKILL.md +18 -27
  216. package/pack/.claude/skills/rite-review/reference/cognitive-load.md +0 -2
  217. package/pack/.claude/skills/rite-review/reference/five-axis-review.md +3 -3
  218. package/pack/.claude/skills/rite-review/reference/nielsen-heuristics.md +3 -7
  219. package/pack/.claude/skills/rite-seal/SKILL.md +7 -3
  220. package/pack/.claude/skills/rite-seal/reference/final-evidence.md +5 -6
  221. package/pack/.claude/skills/rite-seal/reference/risk-and-rollback.md +1 -1
  222. package/pack/.claude/skills/rite-seal/reference/seal-template.md +2 -0
  223. package/pack/.claude/skills/rite-ship/SKILL.md +3 -2
  224. package/pack/.claude/skills/rite-ship/reference/close-out.md +25 -5
  225. package/pack/.claude/skills/rite-ship/reference/rollout.md +1 -1
  226. package/pack/.claude/skills/rite-spec/SKILL.md +2 -1
  227. package/pack/.claude/skills/rite-spec/reference/anti-patterns.md +0 -1
  228. package/pack/.claude/skills/rite-spec/reference/investigation.md +1 -3
  229. package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +1 -1
  230. package/pack/.claude/skills/rite-spec/reference/spec-template.md +1 -1
  231. package/pack/.claude/skills/rite-spec/reference/state-workspace.md +6 -3
  232. package/pack/.claude/skills/rite-status/SKILL.md +3 -1
  233. package/pack/.claude/skills/rite-temper/SKILL.md +9 -9
  234. package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +2 -2
  235. package/pack/.claude/skills/rite-temper/reference/scope-modes.md +2 -2
  236. package/pack/.claude/skills/rite-temper/reference/significance.md +4 -4
  237. package/pack/.claude/skills/rite-temper/reference/strategy-template.md +6 -6
  238. package/pack/.claude/skills/rite-upgrade/SKILL.md +2 -2
  239. package/pack/.claude/skills/rite-vet/SKILL.md +14 -10
  240. package/pack/.claude/skills/rite-vet/reference/artifacts.md +9 -1
  241. package/pack/.claude/skills/rite-vet/reference/review-axes.md +14 -2
  242. package/pack/.claude/skills/rite-watch-pr/SKILL.md +2 -2
  243. package/pack/.claude/skills/rite-zoom-out/SKILL.md +4 -4
  244. package/pack/generated/README.md +4 -2
  245. package/pack/generated/claude/agents/devrites-code-reviewer.md +10 -8
  246. package/pack/generated/claude/agents/devrites-devex-reviewer.md +4 -6
  247. package/pack/generated/claude/agents/devrites-evidence-scout.md +13 -2
  248. package/pack/generated/claude/agents/devrites-frontend-reviewer.md +35 -15
  249. package/pack/generated/claude/agents/devrites-performance-reviewer.md +4 -7
  250. package/pack/generated/claude/agents/devrites-plan-reviewer.md +5 -3
  251. package/pack/generated/claude/agents/devrites-proof-runner.md +1 -1
  252. package/pack/generated/claude/agents/devrites-retrospector.md +7 -1
  253. package/pack/generated/claude/agents/devrites-security-auditor.md +6 -5
  254. package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +3 -2
  255. package/pack/generated/claude/agents/devrites-slice-wright.md +7 -11
  256. package/pack/generated/claude/agents/devrites-spec-reviewer.md +3 -2
  257. package/pack/generated/claude/agents/devrites-strategy-reviewer.md +4 -4
  258. package/pack/generated/claude/agents/devrites-test-analyst.md +2 -1
  259. package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +9 -9
  260. package/pack/generated/claude/skills/devrites-audit/SKILL.md +3 -1
  261. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +9 -2
  262. package/pack/generated/claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +3 -10
  263. package/pack/generated/claude/skills/devrites-debug-recovery/reference/regression-test.md +1 -1
  264. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +5 -7
  265. package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +6 -16
  266. package/pack/generated/claude/skills/devrites-frontend-craft/reference/craft.md +5 -13
  267. package/pack/generated/claude/skills/devrites-frontend-craft/reference/design-references.md +2 -3
  268. package/pack/generated/claude/skills/devrites-frontend-craft/reference/fullstack.md +4 -3
  269. package/pack/generated/claude/skills/devrites-frontend-craft/reference/quality-standards.md +76 -20
  270. package/pack/generated/claude/skills/devrites-frontend-craft/reference/reuse-first.md +4 -9
  271. package/pack/generated/claude/skills/devrites-frontend-craft/reference/shape.md +3 -7
  272. package/pack/generated/claude/skills/devrites-interview/SKILL.md +4 -3
  273. package/pack/generated/claude/skills/devrites-lib/SKILL.md +2 -1
  274. package/pack/generated/claude/skills/devrites-lib/reference/candidate-integrity.md +1 -9
  275. package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +20 -3
  276. package/pack/generated/claude/skills/devrites-lib/reference/orchestration-profiles.md +5 -0
  277. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +34 -4
  278. package/pack/generated/claude/skills/devrites-lib/reference/reply-contract.md +6 -3
  279. package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +7 -0
  280. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +34 -15
  281. package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +13 -5
  282. package/pack/generated/claude/skills/devrites-lib/reference/standards/browser-proof-checklist.md +19 -3
  283. package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +1 -1
  284. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-navigation.md +43 -0
  285. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +19 -1
  286. package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +8 -4
  287. package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +34 -10
  288. package/pack/generated/claude/skills/devrites-lib/reference/standards/data-integrity.md +24 -5
  289. package/pack/generated/claude/skills/devrites-lib/reference/standards/debug-recovery.md +8 -1
  290. package/pack/generated/claude/skills/devrites-lib/reference/standards/definition-of-done.md +14 -11
  291. package/pack/generated/claude/skills/devrites-lib/reference/standards/documentation.md +4 -1
  292. package/pack/generated/claude/skills/devrites-lib/reference/standards/edge-case-trace.md +2 -2
  293. package/pack/generated/claude/skills/devrites-lib/reference/standards/elicitation.md +1 -1
  294. package/pack/generated/claude/skills/devrites-lib/reference/standards/error-handling.md +2 -2
  295. package/pack/generated/claude/skills/devrites-lib/reference/standards/integration-reliability.md +14 -3
  296. package/pack/generated/claude/skills/devrites-lib/reference/standards/loop-operations.md +2 -2
  297. package/pack/generated/claude/skills/devrites-lib/reference/standards/observability.md +6 -1
  298. package/pack/generated/claude/skills/devrites-lib/reference/standards/one-shot-actions.md +2 -2
  299. package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +20 -0
  300. package/pack/generated/claude/skills/devrites-lib/reference/standards/prose-style.md +7 -0
  301. package/pack/generated/claude/skills/devrites-lib/reference/standards/repository-topology.md +3 -2
  302. package/pack/generated/claude/skills/devrites-lib/reference/standards/review-checklist.md +7 -5
  303. package/pack/generated/claude/skills/devrites-lib/reference/standards/security-checklist.md +10 -1
  304. package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +100 -11
  305. package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +48 -2
  306. package/pack/generated/claude/skills/devrites-lib/reference/standards/spec-grammar.md +28 -26
  307. package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +22 -2
  308. package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +40 -12
  309. package/pack/generated/claude/skills/devrites-lib/reference/standards/workflow-artifacts.md +24 -8
  310. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/code.md +0 -2
  311. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/comparison.md +0 -2
  312. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/diagram.md +1 -3
  313. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/index.md +2 -4
  314. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/input.md +1 -2
  315. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/plan.md +1 -2
  316. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/slides.md +0 -2
  317. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/table.md +0 -2
  318. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +7 -5
  319. package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +11 -7
  320. package/pack/generated/claude/skills/devrites-prose-craft/reference/banned-phrases.md +41 -4
  321. package/pack/generated/claude/skills/devrites-prose-craft/reference/examples.md +31 -2
  322. package/pack/generated/claude/skills/devrites-prose-craft/reference/structures.md +62 -0
  323. package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +11 -12
  324. package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +5 -6
  325. package/pack/generated/claude/skills/rite/SKILL.md +3 -1
  326. package/pack/generated/claude/skills/rite-adopt/SKILL.md +9 -8
  327. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +9 -6
  328. package/pack/generated/claude/skills/rite-build/SKILL.md +13 -8
  329. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +2 -2
  330. package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +3 -1
  331. package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +7 -5
  332. package/pack/generated/claude/skills/rite-build/reference/output.md +2 -2
  333. package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +32 -9
  334. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +6 -5
  335. package/pack/generated/claude/skills/rite-build/reference/tdd.md +3 -2
  336. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +7 -7
  337. package/pack/generated/claude/skills/rite-clarify/SKILL.md +6 -5
  338. package/pack/generated/claude/skills/rite-converge/SKILL.md +8 -7
  339. package/pack/generated/claude/skills/rite-converge/reference/anti-patterns.md +1 -1
  340. package/pack/generated/claude/skills/rite-customize/SKILL.md +9 -0
  341. package/pack/generated/claude/skills/rite-define/SKILL.md +4 -7
  342. package/pack/generated/claude/skills/rite-define/reference/anti-patterns.md +1 -1
  343. package/pack/generated/claude/skills/rite-define/reference/gates.md +6 -5
  344. package/pack/generated/claude/skills/rite-define/reference/plan-template.md +2 -2
  345. package/pack/generated/claude/skills/rite-dogfood/SKILL.md +10 -4
  346. package/pack/generated/claude/skills/rite-explain/SKILL.md +9 -5
  347. package/pack/generated/claude/skills/rite-explain/reference/intake.md +2 -1
  348. package/pack/generated/claude/skills/rite-frame/SKILL.md +1 -1
  349. package/pack/generated/claude/skills/rite-handoff/SKILL.md +1 -1
  350. package/pack/generated/claude/skills/rite-learn/SKILL.md +18 -4
  351. package/pack/generated/claude/skills/rite-plan/SKILL.md +4 -4
  352. package/pack/generated/claude/skills/rite-plan/reference/anti-patterns.md +2 -2
  353. package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +24 -0
  354. package/pack/generated/claude/skills/rite-polish/SKILL.md +9 -6
  355. package/pack/generated/claude/skills/rite-polish/reference/anti-ai-slop.md +20 -0
  356. package/pack/generated/claude/skills/rite-polish/reference/browser-polish-evidence.md +3 -1
  357. package/pack/generated/claude/skills/rite-polish/reference/code.md +1 -19
  358. package/pack/generated/claude/skills/rite-polish/reference/harden-checklist.md +1 -1
  359. package/pack/generated/claude/skills/rite-polish/reference/ledger.md +3 -0
  360. package/pack/generated/claude/skills/rite-polish/reference/ui.md +4 -3
  361. package/pack/generated/claude/skills/rite-pov/SKILL.md +16 -1
  362. package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +1 -1
  363. package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +2 -1
  364. package/pack/generated/claude/skills/rite-prototype/SKILL.md +2 -2
  365. package/pack/generated/claude/skills/rite-prove/SKILL.md +6 -6
  366. package/pack/generated/claude/skills/rite-prove/reference/acceptance-proof.md +8 -9
  367. package/pack/generated/claude/skills/rite-prove/reference/browser-proof.md +5 -3
  368. package/pack/generated/claude/skills/rite-prove/reference/test-command-discovery.md +0 -1
  369. package/pack/generated/claude/skills/rite-quick/SKILL.md +6 -4
  370. package/pack/generated/claude/skills/rite-resolve/SKILL.md +5 -4
  371. package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +1 -1
  372. package/pack/generated/claude/skills/rite-review/SKILL.md +18 -27
  373. package/pack/generated/claude/skills/rite-review/reference/cognitive-load.md +0 -2
  374. package/pack/generated/claude/skills/rite-review/reference/five-axis-review.md +3 -3
  375. package/pack/generated/claude/skills/rite-review/reference/nielsen-heuristics.md +3 -7
  376. package/pack/generated/claude/skills/rite-seal/SKILL.md +7 -3
  377. package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +5 -6
  378. package/pack/generated/claude/skills/rite-seal/reference/risk-and-rollback.md +1 -1
  379. package/pack/generated/claude/skills/rite-seal/reference/seal-template.md +2 -0
  380. package/pack/generated/claude/skills/rite-ship/SKILL.md +3 -2
  381. package/pack/generated/claude/skills/rite-ship/reference/close-out.md +25 -5
  382. package/pack/generated/claude/skills/rite-ship/reference/rollout.md +1 -1
  383. package/pack/generated/claude/skills/rite-spec/SKILL.md +2 -1
  384. package/pack/generated/claude/skills/rite-spec/reference/anti-patterns.md +0 -1
  385. package/pack/generated/claude/skills/rite-spec/reference/investigation.md +1 -3
  386. package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +1 -1
  387. package/pack/generated/claude/skills/rite-spec/reference/spec-template.md +1 -1
  388. package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +6 -3
  389. package/pack/generated/claude/skills/rite-status/SKILL.md +3 -1
  390. package/pack/generated/claude/skills/rite-temper/SKILL.md +9 -9
  391. package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +2 -2
  392. package/pack/generated/claude/skills/rite-temper/reference/scope-modes.md +2 -2
  393. package/pack/generated/claude/skills/rite-temper/reference/significance.md +4 -4
  394. package/pack/generated/claude/skills/rite-temper/reference/strategy-template.md +6 -6
  395. package/pack/generated/claude/skills/rite-upgrade/SKILL.md +2 -2
  396. package/pack/generated/claude/skills/rite-vet/SKILL.md +14 -10
  397. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +9 -1
  398. package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +14 -2
  399. package/pack/generated/claude/skills/rite-watch-pr/SKILL.md +2 -2
  400. package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +4 -4
  401. package/pack/generated/codex/agents/devrites-code-reviewer.toml +10 -8
  402. package/pack/generated/codex/agents/devrites-devex-reviewer.toml +4 -6
  403. package/pack/generated/codex/agents/devrites-evidence-scout.toml +13 -2
  404. package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +35 -15
  405. package/pack/generated/codex/agents/devrites-performance-reviewer.toml +4 -7
  406. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +5 -3
  407. package/pack/generated/codex/agents/devrites-proof-runner.toml +1 -1
  408. package/pack/generated/codex/agents/devrites-retrospector.toml +7 -1
  409. package/pack/generated/codex/agents/devrites-security-auditor.toml +6 -5
  410. package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +3 -2
  411. package/pack/generated/codex/agents/devrites-slice-wright.toml +7 -11
  412. package/pack/generated/codex/agents/devrites-spec-reviewer.toml +3 -2
  413. package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +4 -4
  414. package/pack/generated/codex/agents/devrites-test-analyst.toml +2 -1
  415. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +9 -9
  416. package/pack/generated/codex/skills/devrites-audit/SKILL.md +3 -1
  417. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +9 -2
  418. package/pack/generated/codex/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +3 -10
  419. package/pack/generated/codex/skills/devrites-debug-recovery/reference/regression-test.md +1 -1
  420. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +5 -7
  421. package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +6 -16
  422. package/pack/generated/codex/skills/devrites-frontend-craft/reference/craft.md +5 -13
  423. package/pack/generated/codex/skills/devrites-frontend-craft/reference/design-references.md +2 -3
  424. package/pack/generated/codex/skills/devrites-frontend-craft/reference/fullstack.md +4 -3
  425. package/pack/generated/codex/skills/devrites-frontend-craft/reference/quality-standards.md +76 -20
  426. package/pack/generated/codex/skills/devrites-frontend-craft/reference/reuse-first.md +4 -9
  427. package/pack/generated/codex/skills/devrites-frontend-craft/reference/shape.md +3 -7
  428. package/pack/generated/codex/skills/devrites-interview/SKILL.md +4 -3
  429. package/pack/generated/codex/skills/devrites-lib/SKILL.md +2 -1
  430. package/pack/generated/codex/skills/devrites-lib/reference/candidate-integrity.md +1 -9
  431. package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +20 -3
  432. package/pack/generated/codex/skills/devrites-lib/reference/orchestration-profiles.md +5 -0
  433. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +34 -4
  434. package/pack/generated/codex/skills/devrites-lib/reference/reply-contract.md +6 -3
  435. package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +7 -0
  436. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +34 -15
  437. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +13 -5
  438. package/pack/generated/codex/skills/devrites-lib/reference/standards/browser-proof-checklist.md +19 -3
  439. package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +1 -1
  440. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-navigation.md +43 -0
  441. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +19 -1
  442. package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +8 -4
  443. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +34 -10
  444. package/pack/generated/codex/skills/devrites-lib/reference/standards/data-integrity.md +24 -5
  445. package/pack/generated/codex/skills/devrites-lib/reference/standards/debug-recovery.md +8 -1
  446. package/pack/generated/codex/skills/devrites-lib/reference/standards/definition-of-done.md +14 -11
  447. package/pack/generated/codex/skills/devrites-lib/reference/standards/documentation.md +4 -1
  448. package/pack/generated/codex/skills/devrites-lib/reference/standards/edge-case-trace.md +2 -2
  449. package/pack/generated/codex/skills/devrites-lib/reference/standards/elicitation.md +1 -1
  450. package/pack/generated/codex/skills/devrites-lib/reference/standards/error-handling.md +2 -2
  451. package/pack/generated/codex/skills/devrites-lib/reference/standards/integration-reliability.md +14 -3
  452. package/pack/generated/codex/skills/devrites-lib/reference/standards/loop-operations.md +2 -2
  453. package/pack/generated/codex/skills/devrites-lib/reference/standards/observability.md +6 -1
  454. package/pack/generated/codex/skills/devrites-lib/reference/standards/one-shot-actions.md +2 -2
  455. package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +20 -0
  456. package/pack/generated/codex/skills/devrites-lib/reference/standards/prose-style.md +7 -0
  457. package/pack/generated/codex/skills/devrites-lib/reference/standards/repository-topology.md +3 -2
  458. package/pack/generated/codex/skills/devrites-lib/reference/standards/review-checklist.md +7 -5
  459. package/pack/generated/codex/skills/devrites-lib/reference/standards/security-checklist.md +10 -1
  460. package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +100 -11
  461. package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +48 -2
  462. package/pack/generated/codex/skills/devrites-lib/reference/standards/spec-grammar.md +28 -26
  463. package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +22 -2
  464. package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +40 -12
  465. package/pack/generated/codex/skills/devrites-lib/reference/standards/workflow-artifacts.md +24 -8
  466. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/code.md +0 -2
  467. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/comparison.md +0 -2
  468. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/diagram.md +1 -3
  469. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/index.md +2 -4
  470. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/input.md +1 -2
  471. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/plan.md +1 -2
  472. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/slides.md +0 -2
  473. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/table.md +0 -2
  474. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +7 -5
  475. package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +11 -7
  476. package/pack/generated/codex/skills/devrites-prose-craft/reference/banned-phrases.md +41 -4
  477. package/pack/generated/codex/skills/devrites-prose-craft/reference/examples.md +31 -2
  478. package/pack/generated/codex/skills/devrites-prose-craft/reference/structures.md +62 -0
  479. package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +11 -12
  480. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +5 -6
  481. package/pack/generated/codex/skills/rite/SKILL.md +3 -1
  482. package/pack/generated/codex/skills/rite-adopt/SKILL.md +9 -8
  483. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +9 -6
  484. package/pack/generated/codex/skills/rite-build/SKILL.md +13 -8
  485. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +2 -2
  486. package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +3 -1
  487. package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +7 -5
  488. package/pack/generated/codex/skills/rite-build/reference/output.md +2 -2
  489. package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +32 -9
  490. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +6 -5
  491. package/pack/generated/codex/skills/rite-build/reference/tdd.md +3 -2
  492. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +7 -7
  493. package/pack/generated/codex/skills/rite-clarify/SKILL.md +6 -5
  494. package/pack/generated/codex/skills/rite-converge/SKILL.md +8 -7
  495. package/pack/generated/codex/skills/rite-converge/reference/anti-patterns.md +1 -1
  496. package/pack/generated/codex/skills/rite-customize/SKILL.md +9 -0
  497. package/pack/generated/codex/skills/rite-define/SKILL.md +4 -7
  498. package/pack/generated/codex/skills/rite-define/reference/anti-patterns.md +1 -1
  499. package/pack/generated/codex/skills/rite-define/reference/gates.md +6 -5
  500. package/pack/generated/codex/skills/rite-define/reference/plan-template.md +2 -2
  501. package/pack/generated/codex/skills/rite-dogfood/SKILL.md +10 -4
  502. package/pack/generated/codex/skills/rite-explain/SKILL.md +9 -5
  503. package/pack/generated/codex/skills/rite-explain/reference/intake.md +2 -1
  504. package/pack/generated/codex/skills/rite-frame/SKILL.md +1 -1
  505. package/pack/generated/codex/skills/rite-handoff/SKILL.md +1 -1
  506. package/pack/generated/codex/skills/rite-learn/SKILL.md +18 -4
  507. package/pack/generated/codex/skills/rite-plan/SKILL.md +4 -4
  508. package/pack/generated/codex/skills/rite-plan/reference/anti-patterns.md +2 -2
  509. package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +24 -0
  510. package/pack/generated/codex/skills/rite-polish/SKILL.md +9 -6
  511. package/pack/generated/codex/skills/rite-polish/reference/anti-ai-slop.md +20 -0
  512. package/pack/generated/codex/skills/rite-polish/reference/browser-polish-evidence.md +3 -1
  513. package/pack/generated/codex/skills/rite-polish/reference/code.md +1 -19
  514. package/pack/generated/codex/skills/rite-polish/reference/harden-checklist.md +1 -1
  515. package/pack/generated/codex/skills/rite-polish/reference/ledger.md +3 -0
  516. package/pack/generated/codex/skills/rite-polish/reference/ui.md +4 -3
  517. package/pack/generated/codex/skills/rite-pov/SKILL.md +16 -1
  518. package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +1 -1
  519. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +2 -1
  520. package/pack/generated/codex/skills/rite-prototype/SKILL.md +2 -2
  521. package/pack/generated/codex/skills/rite-prove/SKILL.md +6 -6
  522. package/pack/generated/codex/skills/rite-prove/reference/acceptance-proof.md +8 -9
  523. package/pack/generated/codex/skills/rite-prove/reference/browser-proof.md +5 -3
  524. package/pack/generated/codex/skills/rite-prove/reference/test-command-discovery.md +0 -1
  525. package/pack/generated/codex/skills/rite-quick/SKILL.md +6 -4
  526. package/pack/generated/codex/skills/rite-resolve/SKILL.md +5 -4
  527. package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +1 -1
  528. package/pack/generated/codex/skills/rite-review/SKILL.md +18 -27
  529. package/pack/generated/codex/skills/rite-review/reference/cognitive-load.md +0 -2
  530. package/pack/generated/codex/skills/rite-review/reference/five-axis-review.md +3 -3
  531. package/pack/generated/codex/skills/rite-review/reference/nielsen-heuristics.md +3 -7
  532. package/pack/generated/codex/skills/rite-seal/SKILL.md +7 -3
  533. package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +5 -6
  534. package/pack/generated/codex/skills/rite-seal/reference/risk-and-rollback.md +1 -1
  535. package/pack/generated/codex/skills/rite-seal/reference/seal-template.md +2 -0
  536. package/pack/generated/codex/skills/rite-ship/SKILL.md +3 -2
  537. package/pack/generated/codex/skills/rite-ship/reference/close-out.md +25 -5
  538. package/pack/generated/codex/skills/rite-ship/reference/rollout.md +1 -1
  539. package/pack/generated/codex/skills/rite-spec/SKILL.md +2 -1
  540. package/pack/generated/codex/skills/rite-spec/reference/anti-patterns.md +0 -1
  541. package/pack/generated/codex/skills/rite-spec/reference/investigation.md +1 -3
  542. package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +1 -1
  543. package/pack/generated/codex/skills/rite-spec/reference/spec-template.md +1 -1
  544. package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +6 -3
  545. package/pack/generated/codex/skills/rite-status/SKILL.md +3 -1
  546. package/pack/generated/codex/skills/rite-temper/SKILL.md +9 -9
  547. package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +2 -2
  548. package/pack/generated/codex/skills/rite-temper/reference/scope-modes.md +2 -2
  549. package/pack/generated/codex/skills/rite-temper/reference/significance.md +4 -4
  550. package/pack/generated/codex/skills/rite-temper/reference/strategy-template.md +6 -6
  551. package/pack/generated/codex/skills/rite-upgrade/SKILL.md +2 -2
  552. package/pack/generated/codex/skills/rite-vet/SKILL.md +14 -10
  553. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +9 -1
  554. package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +14 -2
  555. package/pack/generated/codex/skills/rite-watch-pr/SKILL.md +2 -2
  556. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +4 -4
  557. package/pack/generated/omp/.omp-plugin/plugin.json +6 -0
  558. package/pack/generated/omp/agents/devrites-code-reviewer.md +138 -0
  559. package/pack/generated/omp/agents/devrites-devex-reviewer.md +123 -0
  560. package/pack/generated/omp/agents/devrites-doubt-reviewer.md +81 -0
  561. package/pack/generated/omp/agents/devrites-evidence-scout.md +71 -0
  562. package/pack/generated/omp/agents/devrites-frontend-reviewer.md +114 -0
  563. package/pack/generated/omp/agents/devrites-performance-reviewer.md +114 -0
  564. package/pack/generated/omp/agents/devrites-plan-drafter.md +82 -0
  565. package/pack/generated/omp/agents/devrites-plan-reviewer.md +132 -0
  566. package/pack/generated/omp/agents/devrites-proof-runner.md +73 -0
  567. package/pack/generated/omp/agents/devrites-retrospector.md +60 -0
  568. package/pack/generated/omp/agents/devrites-security-auditor.md +108 -0
  569. package/pack/generated/omp/agents/devrites-simplifier-reviewer.md +93 -0
  570. package/pack/generated/omp/agents/devrites-slice-wright.md +203 -0
  571. package/pack/generated/omp/agents/devrites-spec-reviewer.md +95 -0
  572. package/pack/generated/omp/agents/devrites-strategy-reviewer.md +99 -0
  573. package/pack/generated/omp/agents/devrites-test-analyst.md +88 -0
  574. package/pack/generated/omp/agents/devrites-upgrade-planner.md +80 -0
  575. package/pack/generated/omp/skills/devrites-api-interface/SKILL.md +61 -0
  576. package/pack/generated/omp/skills/devrites-audit/SKILL.md +50 -0
  577. package/pack/generated/omp/skills/devrites-browser-proof/SKILL.md +76 -0
  578. package/pack/generated/omp/skills/devrites-browser-proof/reference/browser-performance.md +15 -0
  579. package/pack/generated/omp/skills/devrites-browser-proof/reference/visual-verdict.md +34 -0
  580. package/pack/generated/omp/skills/devrites-debug-recovery/SKILL.md +96 -0
  581. package/pack/generated/omp/skills/devrites-debug-recovery/reference/build-the-loop.md +58 -0
  582. package/pack/generated/omp/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -0
  583. package/pack/generated/omp/skills/devrites-debug-recovery/reference/hypotheses.md +17 -0
  584. package/pack/generated/omp/skills/devrites-debug-recovery/reference/instrumentation.md +21 -0
  585. package/pack/generated/omp/skills/devrites-debug-recovery/reference/regression-test.md +30 -0
  586. package/pack/generated/omp/skills/devrites-debug-recovery/reference/trace.md +25 -0
  587. package/pack/generated/omp/skills/devrites-doubt/SKILL.md +86 -0
  588. package/pack/generated/omp/skills/devrites-frontend-craft/SKILL.md +86 -0
  589. package/pack/generated/omp/skills/devrites-frontend-craft/reference/craft.md +63 -0
  590. package/pack/generated/omp/skills/devrites-frontend-craft/reference/design-references.md +116 -0
  591. package/pack/generated/omp/skills/devrites-frontend-craft/reference/fullstack.md +46 -0
  592. package/pack/generated/omp/skills/devrites-frontend-craft/reference/quality-standards.md +294 -0
  593. package/pack/generated/omp/skills/devrites-frontend-craft/reference/reuse-first.md +53 -0
  594. package/pack/generated/omp/skills/devrites-frontend-craft/reference/shape.md +56 -0
  595. package/pack/generated/omp/skills/devrites-interview/SKILL.md +102 -0
  596. package/pack/generated/omp/skills/devrites-lib/SKILL.md +58 -0
  597. package/pack/generated/omp/skills/devrites-lib/reference/candidate-integrity.md +43 -0
  598. package/pack/generated/omp/skills/devrites-lib/reference/intent-map.md +64 -0
  599. package/pack/generated/omp/skills/devrites-lib/reference/orchestration-profiles.md +27 -0
  600. package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +74 -0
  601. package/pack/generated/omp/skills/devrites-lib/reference/reply-contract.md +88 -0
  602. package/pack/generated/omp/skills/devrites-lib/reference/standards/README.md +60 -0
  603. package/pack/generated/omp/skills/devrites-lib/reference/standards/acceptance-preserving-reslice.md +30 -0
  604. package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +345 -0
  605. package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +98 -0
  606. package/pack/generated/omp/skills/devrites-lib/reference/standards/anti-patterns.md +48 -0
  607. package/pack/generated/omp/skills/devrites-lib/reference/standards/browser-proof-checklist.md +24 -0
  608. package/pack/generated/omp/skills/devrites-lib/reference/standards/ci-cd.md +50 -0
  609. package/pack/generated/omp/skills/devrites-lib/reference/standards/code-navigation.md +43 -0
  610. package/pack/generated/omp/skills/devrites-lib/reference/standards/code-review.md +108 -0
  611. package/pack/generated/omp/skills/devrites-lib/reference/standards/coding-style.md +48 -0
  612. package/pack/generated/omp/skills/devrites-lib/reference/standards/context-hygiene.md +89 -0
  613. package/pack/generated/omp/skills/devrites-lib/reference/standards/core.md +167 -0
  614. package/pack/generated/omp/skills/devrites-lib/reference/standards/data-integrity.md +118 -0
  615. package/pack/generated/omp/skills/devrites-lib/reference/standards/debug-recovery.md +28 -0
  616. package/pack/generated/omp/skills/devrites-lib/reference/standards/definition-of-done.md +19 -0
  617. package/pack/generated/omp/skills/devrites-lib/reference/standards/deprecation.md +31 -0
  618. package/pack/generated/omp/skills/devrites-lib/reference/standards/developer-experience.md +119 -0
  619. package/pack/generated/omp/skills/devrites-lib/reference/standards/development-workflow.md +29 -0
  620. package/pack/generated/omp/skills/devrites-lib/reference/standards/documentation.md +43 -0
  621. package/pack/generated/omp/skills/devrites-lib/reference/standards/edge-case-trace.md +92 -0
  622. package/pack/generated/omp/skills/devrites-lib/reference/standards/elicitation.md +85 -0
  623. package/pack/generated/omp/skills/devrites-lib/reference/standards/error-handling.md +47 -0
  624. package/pack/generated/omp/skills/devrites-lib/reference/standards/git-workflow.md +49 -0
  625. package/pack/generated/omp/skills/devrites-lib/reference/standards/hooks.md +25 -0
  626. package/pack/generated/omp/skills/devrites-lib/reference/standards/integration-reliability.md +102 -0
  627. package/pack/generated/omp/skills/devrites-lib/reference/standards/loop-operations.md +85 -0
  628. package/pack/generated/omp/skills/devrites-lib/reference/standards/observability.md +88 -0
  629. package/pack/generated/omp/skills/devrites-lib/reference/standards/one-shot-actions.md +97 -0
  630. package/pack/generated/omp/skills/devrites-lib/reference/standards/patterns.md +68 -0
  631. package/pack/generated/omp/skills/devrites-lib/reference/standards/performance.md +51 -0
  632. package/pack/generated/omp/skills/devrites-lib/reference/standards/principles.md +42 -0
  633. package/pack/generated/omp/skills/devrites-lib/reference/standards/prose-style.md +123 -0
  634. package/pack/generated/omp/skills/devrites-lib/reference/standards/release/ship-checklist.md +8 -0
  635. package/pack/generated/omp/skills/devrites-lib/reference/standards/repository-topology.md +80 -0
  636. package/pack/generated/omp/skills/devrites-lib/reference/standards/review-checklist.md +12 -0
  637. package/pack/generated/omp/skills/devrites-lib/reference/standards/security-checklist.md +25 -0
  638. package/pack/generated/omp/skills/devrites-lib/reference/standards/security.md +202 -0
  639. package/pack/generated/omp/skills/devrites-lib/reference/standards/skill-authoring.md +209 -0
  640. package/pack/generated/omp/skills/devrites-lib/reference/standards/spec-grammar.md +197 -0
  641. package/pack/generated/omp/skills/devrites-lib/reference/standards/test-proof-checklist.md +13 -0
  642. package/pack/generated/omp/skills/devrites-lib/reference/standards/testing.md +212 -0
  643. package/pack/generated/omp/skills/devrites-lib/reference/standards/tooling.md +92 -0
  644. package/pack/generated/omp/skills/devrites-lib/reference/standards/workflow-artifacts.md +427 -0
  645. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/code.md +44 -0
  646. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/comparison.md +42 -0
  647. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/diagram.md +51 -0
  648. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/index.md +66 -0
  649. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/input.md +46 -0
  650. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/outline-template.md +106 -0
  651. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/plan.md +48 -0
  652. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/slides.md +40 -0
  653. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/table.md +42 -0
  654. package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +228 -0
  655. package/pack/generated/omp/skills/devrites-prose-craft/SKILL.md +73 -0
  656. package/pack/generated/omp/skills/devrites-prose-craft/reference/banned-phrases.md +132 -0
  657. package/pack/generated/omp/skills/devrites-prose-craft/reference/examples.md +131 -0
  658. package/pack/generated/omp/skills/devrites-prose-craft/reference/structures.md +196 -0
  659. package/pack/generated/omp/skills/devrites-source-driven/SKILL.md +52 -0
  660. package/pack/generated/omp/skills/devrites-ux-shape/SKILL.md +134 -0
  661. package/pack/generated/omp/skills/devrites-ux-shape/reference/brief-template.md +108 -0
  662. package/pack/generated/omp/skills/devrites-ux-shape/reference/visual-direction-probe.md +48 -0
  663. package/pack/generated/omp/skills/rite/SKILL.md +148 -0
  664. package/pack/generated/omp/skills/rite/reference/menu.md +48 -0
  665. package/pack/generated/omp/skills/rite-adopt/SKILL.md +52 -0
  666. package/pack/generated/omp/skills/rite-adopt/reference/adoption.md +19 -0
  667. package/pack/generated/omp/skills/rite-adopt/reference/anti-patterns.md +19 -0
  668. package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +122 -0
  669. package/pack/generated/omp/skills/rite-autocomplete/reference/decision-policy.md +41 -0
  670. package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +116 -0
  671. package/pack/generated/omp/skills/rite-autocomplete/reference/stop-conditions.md +92 -0
  672. package/pack/generated/omp/skills/rite-build/SKILL.md +81 -0
  673. package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +145 -0
  674. package/pack/generated/omp/skills/rite-build/reference/anti-patterns.md +23 -0
  675. package/pack/generated/omp/skills/rite-build/reference/checkpoint-protocol.md +120 -0
  676. package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +46 -0
  677. package/pack/generated/omp/skills/rite-build/reference/frontend-trigger.md +39 -0
  678. package/pack/generated/omp/skills/rite-build/reference/one-slice-cycle.md +47 -0
  679. package/pack/generated/omp/skills/rite-build/reference/output.md +33 -0
  680. package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +87 -0
  681. package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +67 -0
  682. package/pack/generated/omp/skills/rite-build/reference/spec-drift-guard.md +59 -0
  683. package/pack/generated/omp/skills/rite-build/reference/tdd.md +27 -0
  684. package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +86 -0
  685. package/pack/generated/omp/skills/rite-clarify/SKILL.md +99 -0
  686. package/pack/generated/omp/skills/rite-clarify/reference/anti-patterns.md +24 -0
  687. package/pack/generated/omp/skills/rite-clarify/reference/decision-coverage.md +55 -0
  688. package/pack/generated/omp/skills/rite-converge/SKILL.md +140 -0
  689. package/pack/generated/omp/skills/rite-converge/reference/anti-patterns.md +35 -0
  690. package/pack/generated/omp/skills/rite-converge/reference/convergence-assessment.md +65 -0
  691. package/pack/generated/omp/skills/rite-customize/SKILL.md +60 -0
  692. package/pack/generated/omp/skills/rite-define/SKILL.md +166 -0
  693. package/pack/generated/omp/skills/rite-define/reference/anti-patterns.md +26 -0
  694. package/pack/generated/omp/skills/rite-define/reference/gates.md +154 -0
  695. package/pack/generated/omp/skills/rite-define/reference/plan-template.md +149 -0
  696. package/pack/generated/omp/skills/rite-doctor/SKILL.md +69 -0
  697. package/pack/generated/omp/skills/rite-dogfood/SKILL.md +55 -0
  698. package/pack/generated/omp/skills/rite-explain/SKILL.md +152 -0
  699. package/pack/generated/omp/skills/rite-explain/reference/intake.md +89 -0
  700. package/pack/generated/omp/skills/rite-frame/SKILL.md +115 -0
  701. package/pack/generated/omp/skills/rite-frame/reference/failure-modes.md +66 -0
  702. package/pack/generated/omp/skills/rite-handoff/SKILL.md +97 -0
  703. package/pack/generated/omp/skills/rite-handoff/reference/handoff-template.md +44 -0
  704. package/pack/generated/omp/skills/rite-learn/SKILL.md +72 -0
  705. package/pack/generated/omp/skills/rite-plan/SKILL.md +132 -0
  706. package/pack/generated/omp/skills/rite-plan/reference/anti-patterns.md +34 -0
  707. package/pack/generated/omp/skills/rite-plan/reference/dependency-graph.md +48 -0
  708. package/pack/generated/omp/skills/rite-plan/reference/replan-and-repair.md +73 -0
  709. package/pack/generated/omp/skills/rite-plan/reference/slicing.md +65 -0
  710. package/pack/generated/omp/skills/rite-plan/reference/task-breakdown.md +42 -0
  711. package/pack/generated/omp/skills/rite-polish/SKILL.md +104 -0
  712. package/pack/generated/omp/skills/rite-polish/reference/adr-promotion.md +11 -0
  713. package/pack/generated/omp/skills/rite-polish/reference/anti-ai-slop.md +187 -0
  714. package/pack/generated/omp/skills/rite-polish/reference/anti-patterns.md +30 -0
  715. package/pack/generated/omp/skills/rite-polish/reference/backend-polish.md +80 -0
  716. package/pack/generated/omp/skills/rite-polish/reference/browser-polish-evidence.md +33 -0
  717. package/pack/generated/omp/skills/rite-polish/reference/code.md +82 -0
  718. package/pack/generated/omp/skills/rite-polish/reference/design-memory.md +117 -0
  719. package/pack/generated/omp/skills/rite-polish/reference/design-system-discovery.md +8 -0
  720. package/pack/generated/omp/skills/rite-polish/reference/harden-checklist.md +109 -0
  721. package/pack/generated/omp/skills/rite-polish/reference/ledger.md +65 -0
  722. package/pack/generated/omp/skills/rite-polish/reference/ui.md +137 -0
  723. package/pack/generated/omp/skills/rite-pov/SKILL.md +58 -0
  724. package/pack/generated/omp/skills/rite-pr-feedback/SKILL.md +54 -0
  725. package/pack/generated/omp/skills/rite-pressure-test/SKILL.md +67 -0
  726. package/pack/generated/omp/skills/rite-prototype/SKILL.md +104 -0
  727. package/pack/generated/omp/skills/rite-prove/SKILL.md +122 -0
  728. package/pack/generated/omp/skills/rite-prove/reference/acceptance-proof.md +88 -0
  729. package/pack/generated/omp/skills/rite-prove/reference/anti-patterns.md +25 -0
  730. package/pack/generated/omp/skills/rite-prove/reference/browser-proof.md +51 -0
  731. package/pack/generated/omp/skills/rite-prove/reference/failure-triage.md +43 -0
  732. package/pack/generated/omp/skills/rite-prove/reference/proof-ladder.md +28 -0
  733. package/pack/generated/omp/skills/rite-prove/reference/test-command-discovery.md +30 -0
  734. package/pack/generated/omp/skills/rite-quick/SKILL.md +82 -0
  735. package/pack/generated/omp/skills/rite-resolve/SKILL.md +95 -0
  736. package/pack/generated/omp/skills/rite-resolve/reference/answer-protocol.md +118 -0
  737. package/pack/generated/omp/skills/rite-review/SKILL.md +159 -0
  738. package/pack/generated/omp/skills/rite-review/reference/anti-patterns.md +32 -0
  739. package/pack/generated/omp/skills/rite-review/reference/cognitive-load.md +90 -0
  740. package/pack/generated/omp/skills/rite-review/reference/feature-scoped-review.md +26 -0
  741. package/pack/generated/omp/skills/rite-review/reference/five-axis-review.md +66 -0
  742. package/pack/generated/omp/skills/rite-review/reference/nielsen-heuristics.md +126 -0
  743. package/pack/generated/omp/skills/rite-review/reference/performance-checklist.md +80 -0
  744. package/pack/generated/omp/skills/rite-review/reference/performance-review.md +14 -0
  745. package/pack/generated/omp/skills/rite-review/reference/security-review.md +42 -0
  746. package/pack/generated/omp/skills/rite-seal/SKILL.md +73 -0
  747. package/pack/generated/omp/skills/rite-seal/reference/anti-patterns.md +29 -0
  748. package/pack/generated/omp/skills/rite-seal/reference/final-evidence.md +40 -0
  749. package/pack/generated/omp/skills/rite-seal/reference/go-no-go.md +29 -0
  750. package/pack/generated/omp/skills/rite-seal/reference/output.md +5 -0
  751. package/pack/generated/omp/skills/rite-seal/reference/phase-contract.md +47 -0
  752. package/pack/generated/omp/skills/rite-seal/reference/risk-and-rollback.md +56 -0
  753. package/pack/generated/omp/skills/rite-seal/reference/seal-template.md +27 -0
  754. package/pack/generated/omp/skills/rite-ship/SKILL.md +85 -0
  755. package/pack/generated/omp/skills/rite-ship/reference/anti-patterns.md +28 -0
  756. package/pack/generated/omp/skills/rite-ship/reference/close-out.md +54 -0
  757. package/pack/generated/omp/skills/rite-ship/reference/git-ship.md +111 -0
  758. package/pack/generated/omp/skills/rite-ship/reference/rollout.md +62 -0
  759. package/pack/generated/omp/skills/rite-ship/reference/ship-template.md +39 -0
  760. package/pack/generated/omp/skills/rite-spec/SKILL.md +144 -0
  761. package/pack/generated/omp/skills/rite-spec/reference/acceptance-criteria.md +31 -0
  762. package/pack/generated/omp/skills/rite-spec/reference/ai-spec-template.md +40 -0
  763. package/pack/generated/omp/skills/rite-spec/reference/anti-patterns.md +27 -0
  764. package/pack/generated/omp/skills/rite-spec/reference/interview-patterns.md +56 -0
  765. package/pack/generated/omp/skills/rite-spec/reference/investigation.md +83 -0
  766. package/pack/generated/omp/skills/rite-spec/reference/question-protocol.md +36 -0
  767. package/pack/generated/omp/skills/rite-spec/reference/references-intake.md +62 -0
  768. package/pack/generated/omp/skills/rite-spec/reference/spec-checklists.md +89 -0
  769. package/pack/generated/omp/skills/rite-spec/reference/spec-template.md +154 -0
  770. package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +221 -0
  771. package/pack/generated/omp/skills/rite-status/SKILL.md +54 -0
  772. package/pack/generated/omp/skills/rite-temper/SKILL.md +127 -0
  773. package/pack/generated/omp/skills/rite-temper/reference/anti-patterns.md +29 -0
  774. package/pack/generated/omp/skills/rite-temper/reference/review-dimensions.md +67 -0
  775. package/pack/generated/omp/skills/rite-temper/reference/scope-modes.md +53 -0
  776. package/pack/generated/omp/skills/rite-temper/reference/significance.md +46 -0
  777. package/pack/generated/omp/skills/rite-temper/reference/strategy-template.md +90 -0
  778. package/pack/generated/omp/skills/rite-upgrade/SKILL.md +112 -0
  779. package/pack/generated/omp/skills/rite-vet/SKILL.md +158 -0
  780. package/pack/generated/omp/skills/rite-vet/reference/anti-patterns.md +41 -0
  781. package/pack/generated/omp/skills/rite-vet/reference/artifacts.md +202 -0
  782. package/pack/generated/omp/skills/rite-vet/reference/cross-model.md +19 -0
  783. package/pack/generated/omp/skills/rite-vet/reference/depth.md +60 -0
  784. package/pack/generated/omp/skills/rite-vet/reference/eng-lenses.md +48 -0
  785. package/pack/generated/omp/skills/rite-vet/reference/review-axes.md +176 -0
  786. package/pack/generated/omp/skills/rite-watch-pr/SKILL.md +85 -0
  787. package/pack/generated/omp/skills/rite-zoom-out/SKILL.md +69 -0
  788. package/package.json +13 -1
  789. package/scripts/build-host-artifacts.sh +48 -6
  790. 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",
@@ -20,6 +20,9 @@ const (
20
20
  WrightGreen = "green"
21
21
  WrightRed = "red"
22
22
  WrightGap = "gap"
23
+
24
+ MinParallelSlices = 2
25
+ MaxParallelSlices = 10
23
26
  )
24
27
 
25
28
  var (
@@ -95,6 +98,13 @@ func validateSliceID(id string) error {
95
98
  return nil
96
99
  }
97
100
 
101
+ func checkParallelSliceCount(n int) error {
102
+ if n < MinParallelSlices || n > MaxParallelSlices {
103
+ return fmt.Errorf("parallel requires %d-%d slices (got %d)", MinParallelSlices, MaxParallelSlices, n)
104
+ }
105
+ return nil
106
+ }
107
+
98
108
  func ValidateLease(lease *Lease) error {
99
109
  if lease == nil {
100
110
  return fmt.Errorf("lease is nil")
@@ -113,8 +123,8 @@ func ValidateLease(lease *Lease) error {
113
123
  default:
114
124
  return fmt.Errorf("invalid lease status %q", lease.Status)
115
125
  }
116
- if len(lease.Slices) < 2 || len(lease.Slices) > 3 {
117
- return fmt.Errorf("lease must have 2 or 3 slices (got %d)", len(lease.Slices))
126
+ if err := checkParallelSliceCount(len(lease.Slices)); err != nil {
127
+ return err
118
128
  }
119
129
  if lease.N != len(lease.Slices) {
120
130
  return fmt.Errorf("lease n=%d does not match slices=%d", lease.N, len(lease.Slices))
@@ -213,6 +223,7 @@ func WriteLease(path string, lease *Lease) error {
213
223
  }
214
224
 
215
225
  func ReadLease(path string) (*Lease, error) {
226
+ // #nosec G304 -- lease file under the engine-managed work dir
216
227
  data, err := os.ReadFile(path)
217
228
  if err != nil {
218
229
  return nil, err
@@ -29,7 +29,7 @@ type CreateOpts struct {
29
29
  Slices []SlicePaths
30
30
  }
31
31
 
32
- // Create path-disjoint-gates, creates <=3 worktrees from base, and writes a running lease.
32
+ // Create path-disjoint-gates, creates 2-10 worktrees from base, and writes a running lease.
33
33
  func Create(opts CreateOpts) (*Lease, error) {
34
34
  if err := validateSlug(opts.Slug); err != nil {
35
35
  return nil, err
@@ -37,8 +37,8 @@ func Create(opts CreateOpts) (*Lease, error) {
37
37
  if err := validateBatchID(opts.BatchID); err != nil {
38
38
  return nil, err
39
39
  }
40
- if len(opts.Slices) < 2 || len(opts.Slices) > 3 {
41
- return nil, fmt.Errorf("create requires 2 or 3 slices (got %d)", len(opts.Slices))
40
+ if err := checkParallelSliceCount(len(opts.Slices)); err != nil {
41
+ return nil, err
42
42
  }
43
43
  if _, err := CheckPathDisjoint(opts.Slices, opts.Root); err != nil {
44
44
  return nil, err
@@ -1,6 +1,7 @@
1
1
  package parallel
2
2
 
3
3
  import (
4
+ "fmt"
4
5
  "os"
5
6
  "os/exec"
6
7
  "path/filepath"
@@ -146,6 +147,109 @@ func TestCreateAbortCleanup(t *testing.T) {
146
147
  }
147
148
  }
148
149
 
150
+ func TestCreateAcceptsFourSlices(t *testing.T) {
151
+ t.Parallel()
152
+ repo, _ := setupRepo(t)
153
+ for _, name := range []string{"c.go", "d.go"} {
154
+ if err := os.WriteFile(filepath.Join(repo, "src", name), []byte("package main\n"), 0o644); err != nil {
155
+ t.Fatal(err)
156
+ }
157
+ }
158
+ gitOk(t, repo, "add", ".")
159
+ gitOk(t, repo, "commit", "-m", "more files")
160
+ base := gitOk(t, repo, "rev-parse", "HEAD")
161
+ lease, err := Create(CreateOpts{
162
+ Root: repo,
163
+ Slug: "demo-four",
164
+ BatchID: "batch4",
165
+ BaseSHA: base,
166
+ Slices: []SlicePaths{
167
+ {ID: "slice-a", Paths: []string{"src/a.go"}},
168
+ {ID: "slice-b", Paths: []string{"src/b.go"}},
169
+ {ID: "slice-c", Paths: []string{"src/c.go"}},
170
+ {ID: "slice-d", Paths: []string{"src/d.go"}},
171
+ },
172
+ })
173
+ if err != nil {
174
+ t.Fatal(err)
175
+ }
176
+ if lease.N != 4 || len(lease.Slices) != 4 {
177
+ t.Fatalf("want 4 slices, got n=%d slices=%d", lease.N, len(lease.Slices))
178
+ }
179
+ }
180
+
181
+ func TestCreateRefusesCountOutsideBounds(t *testing.T) {
182
+ t.Parallel()
183
+ repo, base := setupRepo(t)
184
+ _, err := Create(CreateOpts{
185
+ Root: repo,
186
+ Slug: "demo-one",
187
+ BatchID: "batch1",
188
+ BaseSHA: base,
189
+ Slices: []SlicePaths{{ID: "slice-a", Paths: []string{"src/a.go"}}},
190
+ })
191
+ if err == nil || !strings.Contains(err.Error(), "2-10 slices") {
192
+ t.Fatalf("expected 2-10 bound for N=1, got %v", err)
193
+ }
194
+
195
+ slices := make([]SlicePaths, MaxParallelSlices+1)
196
+ for i := range slices {
197
+ name := fmt.Sprintf("src/x%d.go", i)
198
+ if err := os.WriteFile(filepath.Join(repo, name), []byte("package main\n"), 0o644); err != nil {
199
+ t.Fatal(err)
200
+ }
201
+ slices[i] = SlicePaths{ID: fmt.Sprintf("s%d", i), Paths: []string{name}}
202
+ }
203
+ gitOk(t, repo, "add", ".")
204
+ gitOk(t, repo, "commit", "-m", "eleven")
205
+ base = gitOk(t, repo, "rev-parse", "HEAD")
206
+ _, err = Create(CreateOpts{
207
+ Root: repo,
208
+ Slug: "demo-eleven",
209
+ BatchID: "batch11",
210
+ BaseSHA: base,
211
+ Slices: slices,
212
+ })
213
+ if err == nil || !strings.Contains(err.Error(), "2-10 slices") {
214
+ t.Fatalf("expected 2-10 bound for N=11, got %v", err)
215
+ }
216
+ }
217
+
218
+ func TestValidateLeaseBounds(t *testing.T) {
219
+ t.Parallel()
220
+ ok := validTestLease(MaxParallelSlices)
221
+ if err := ValidateLease(ok); err != nil {
222
+ t.Fatalf("N=%d should validate: %v", MaxParallelSlices, err)
223
+ }
224
+ tooMany := validTestLease(MaxParallelSlices + 1)
225
+ if err := ValidateLease(tooMany); err == nil || !strings.Contains(err.Error(), "2-10 slices") {
226
+ t.Fatalf("N=%d should refuse, got %v", MaxParallelSlices+1, err)
227
+ }
228
+ }
229
+
230
+ func validTestLease(n int) *Lease {
231
+ slices := make([]LeaseSlice, n)
232
+ for i := range slices {
233
+ id := fmt.Sprintf("s%d", i)
234
+ slices[i] = LeaseSlice{
235
+ ID: id,
236
+ Paths: []string{fmt.Sprintf("src/%s.go", id)},
237
+ WorktreePath: "/tmp/" + id,
238
+ Branch: "devrites/parallel/x/batch/" + id,
239
+ WrightStatus: WrightPending,
240
+ }
241
+ }
242
+ return &Lease{
243
+ BatchID: "batch1",
244
+ CreatedAt: "2026-08-23T00:00:00Z",
245
+ BaseSHA: "abcdef1",
246
+ N: n,
247
+ Status: StatusRunning,
248
+ ControlPIDOrSession: "test",
249
+ Slices: slices,
250
+ }
251
+ }
252
+
149
253
  func TestCreateRefusesOverlap(t *testing.T) {
150
254
  repo, base := setupRepo(t)
151
255
  _, err := Create(CreateOpts{
@@ -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")