devrites 3.0.4 → 3.0.6

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 (752) hide show
  1. package/CHANGELOG.md +40 -1
  2. package/README.md +280 -521
  3. package/SECURITY.md +91 -77
  4. package/docs/adr/README.md +7 -9
  5. package/docs/agents/domain.md +5 -5
  6. package/docs/agents/issue-driven-rites.md +5 -5
  7. package/docs/agents/issue-tracker.md +1 -1
  8. package/docs/agents/triage-labels.md +2 -2
  9. package/docs/architecture.md +101 -85
  10. package/docs/capability-surface-selection.md +3 -1
  11. package/docs/cli.md +20 -13
  12. package/docs/command-map.md +39 -35
  13. package/docs/engine/agent-contract.md +11 -9
  14. package/docs/engine/commands.md +92 -78
  15. package/docs/engine/state-schema.md +23 -19
  16. package/docs/engine/workspace-schema.md +12 -11
  17. package/docs/extensions.md +17 -17
  18. package/docs/flow.md +34 -23
  19. package/docs/harness-compliance.md +2 -2
  20. package/docs/orchestration.md +21 -20
  21. package/docs/porting-to-a-new-harness.md +6 -2
  22. package/docs/release.md +30 -12
  23. package/docs/research/go-authoritative-workflow-schema-and-quality-2026-07-20.md +3 -3
  24. package/docs/skills.md +77 -52
  25. package/docs/templates/CRITIC_REVIEW_PACKET_TEMPLATE.md +35 -0
  26. package/docs/usage.md +56 -45
  27. package/engine/Makefile +2 -2
  28. package/engine/commands.go +3 -3
  29. package/engine/harnessmatrix.go +2 -2
  30. package/engine/hookpolicy.go +9 -9
  31. package/engine/hooks.go +11 -11
  32. package/engine/hooks_workspace.go +11 -11
  33. package/engine/internal/doctor/doctor.go +7 -7
  34. package/engine/internal/gate/gate.go +11 -11
  35. package/engine/internal/harness/compliance.go +1 -1
  36. package/engine/internal/harness/harness.go +7 -7
  37. package/engine/internal/install/install.go +2 -0
  38. package/engine/internal/install/install_test.go +3 -3
  39. package/engine/internal/iohooks/detach_unix.go +1 -1
  40. package/engine/internal/iohooks/iohooks.go +8 -8
  41. package/engine/internal/lib/adoption.go +1 -1
  42. package/engine/internal/lib/analyze.go +15 -15
  43. package/engine/internal/lib/archivesearch.go +3 -3
  44. package/engine/internal/lib/budget.go +3 -3
  45. package/engine/internal/lib/buildreadiness.go +6 -6
  46. package/engine/internal/lib/checkacceptance.go +10 -10
  47. package/engine/internal/lib/closeout.go +5 -5
  48. package/engine/internal/lib/conventions.go +3 -3
  49. package/engine/internal/lib/coverage.go +4 -4
  50. package/engine/internal/lib/doubtcoverage.go +9 -9
  51. package/engine/internal/lib/evidencefresh.go +6 -6
  52. package/engine/internal/lib/extensions.go +9 -9
  53. package/engine/internal/lib/footprint.go +13 -13
  54. package/engine/internal/lib/jsonout.go +2 -2
  55. package/engine/internal/lib/lanes.go +2 -2
  56. package/engine/internal/lib/learnings.go +9 -9
  57. package/engine/internal/lib/ledger.go +8 -8
  58. package/engine/internal/lib/ledger_test.go +5 -5
  59. package/engine/internal/lib/mutationgate.go +4 -4
  60. package/engine/internal/lib/overrides.go +9 -9
  61. package/engine/internal/lib/overrides_test.go +2 -2
  62. package/engine/internal/lib/packageexistence.go +732 -55
  63. package/engine/internal/lib/packageexistence_test.go +343 -0
  64. package/engine/internal/lib/preamble.go +6 -6
  65. package/engine/internal/lib/progress.go +5 -5
  66. package/engine/internal/lib/reconcile.go +80 -20
  67. package/engine/internal/lib/reconcile_test.go +13 -5
  68. package/engine/internal/lib/resolve.go +3 -3
  69. package/engine/internal/lib/reviewerstats.go +2 -2
  70. package/engine/internal/lib/reviewintegrity.go +13 -13
  71. package/engine/internal/lib/reviewintegrity_test.go +6 -6
  72. package/engine/internal/lib/runbook.go +1 -1
  73. package/engine/internal/lib/session.go +1 -1
  74. package/engine/internal/lib/session_test.go +2 -2
  75. package/engine/internal/lib/specparse.go +4 -4
  76. package/engine/internal/lib/specskeleton.go +2 -2
  77. package/engine/internal/lib/specvalidate.go +13 -13
  78. package/engine/internal/lib/stuck.go +13 -13
  79. package/engine/internal/lib/templates/conventions_ledger_header.md +1 -1
  80. package/engine/internal/lib/templates/conventions_orient_header.txt +1 -1
  81. package/engine/internal/lib/testintegrity.go +9 -9
  82. package/engine/internal/lib/tickafk.go +4 -4
  83. package/engine/internal/lib/util.go +1 -1
  84. package/engine/internal/migrate/migrate.go +2 -2
  85. package/engine/internal/migrate/migrate_test.go +1 -0
  86. package/engine/internal/orient/firstrun.go +8 -8
  87. package/engine/internal/orient/orient.go +5 -5
  88. package/engine/internal/state/concurrency_test.go +4 -4
  89. package/engine/internal/state/feature.go +6 -6
  90. package/engine/internal/state/lock_unix.go +1 -1
  91. package/engine/internal/state/schema.go +1 -1
  92. package/engine/internal/state/snapshot.go +2 -2
  93. package/engine/internal/state/write.go +1 -1
  94. package/engine/internal/version/version.go +1 -1
  95. package/engine/main.go +5 -5
  96. package/engine/subagent_orient_context.txt +4 -4
  97. package/engine/testdata/golden/TestParityA1Guard/source-edit-enforce-denies.golden +1 -1
  98. package/engine/testdata/golden/TestParityAnalyze/slug=covered.golden +2 -2
  99. package/engine/testdata/golden/TestParityAnalyze/slug=dangling.golden +3 -3
  100. package/engine/testdata/golden/TestParityAnalyze/slug=noac.golden +2 -2
  101. package/engine/testdata/golden/TestParityAnalyze/slug=order.golden +4 -4
  102. package/engine/testdata/golden/TestParityAnalyze/slug=orphan.golden +3 -3
  103. package/engine/testdata/golden/TestParityAnalyze/slug=uncovered.golden +3 -3
  104. package/engine/testdata/golden/TestParityBudget/extra-md.golden +1 -1
  105. package/engine/testdata/golden/TestParityBudget/over-advisory.golden +1 -1
  106. package/engine/testdata/golden/TestParityBudget/over-strict.golden +1 -1
  107. package/engine/testdata/golden/TestParityBuildReadiness/arg=approved.golden +1 -1
  108. package/engine/testdata/golden/TestParityBuildReadiness/arg=emptystatus.golden +1 -1
  109. package/engine/testdata/golden/TestParityBuildReadiness/arg=trailhash.golden +1 -1
  110. package/engine/testdata/golden/TestParityBuildReadiness/arg=trailpipe.golden +1 -1
  111. package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-ok.golden +1 -1
  112. package/engine/testdata/golden/TestParityCheckAcceptance/arg=id-ok.golden +1 -1
  113. package/engine/testdata/golden/TestParityCloseOut/active_pointed_elsewhere.golden +1 -1
  114. package/engine/testdata/golden/TestParityCoverage/arg=speconly.golden +2 -2
  115. package/engine/testdata/golden/TestParityCursor/bare.golden +1 -1
  116. package/engine/testdata/golden/TestParityCursor/full-afk.golden +1 -1
  117. package/engine/testdata/golden/TestParityCursor/full-hitl.golden +1 -1
  118. package/engine/testdata/golden/TestParityCursor/red.golden +2 -2
  119. package/engine/testdata/golden/TestParityCursor/zerogates.golden +1 -1
  120. package/engine/testdata/golden/TestParityDoubtCoverage/arg=ghost.golden +1 -1
  121. package/engine/testdata/golden/TestParityDoubtCoverage/arg=inline.golden +1 -1
  122. package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing-inline.golden +1 -1
  123. package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing.golden +1 -1
  124. package/engine/testdata/golden/TestParityDoubtCoverage/arg=nodoubt.golden +1 -1
  125. package/engine/testdata/golden/TestParityDoubtCoverage/arg=nolog.golden +1 -1
  126. package/engine/testdata/golden/TestParityLearnings/mine-no-archive.golden +1 -1
  127. package/engine/testdata/golden/TestParityLearnings/mine.golden +1 -1
  128. package/engine/testdata/golden/TestParityLearnings/nudge.golden +1 -1
  129. package/engine/testdata/golden/TestParityMutationGate/active-slug.golden +1 -1
  130. package/engine/testdata/golden/TestParityMutationGate/explicit-slug.golden +1 -1
  131. package/engine/testdata/golden/TestParityPackageExistence/declared.golden +1 -1
  132. package/engine/testdata/golden/TestParityPackageExistence/default-import-subpath.golden +1 -1
  133. package/engine/testdata/golden/TestParityReconcile/check-clean.golden +1 -1
  134. package/engine/testdata/golden/TestParityRedwatch/fail-writes-red.golden +1 -1
  135. package/engine/testdata/golden/TestParityResolve/answer/state.md.golden +1 -1
  136. package/engine/testdata/golden/TestParityResolve/batch.golden +1 -1
  137. package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-devrites-agent-denies.golden +1 -1
  138. package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-git-commit.golden +1 -1
  139. package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-mutating.golden +1 -1
  140. package/engine/testdata/golden/TestParitySpecValidate/arg=flat.golden +1 -1
  141. package/engine/testdata/golden/TestParitySpecValidate/arg=valid/spec.md.golden +1 -1
  142. package/engine/testdata/golden/TestParitySpecValidate/arg=valid.golden +1 -1
  143. package/engine/testdata/golden/TestParityStuckCheck/custom-window-2.golden +1 -1
  144. package/engine/testdata/golden/TestParityStuckCheck/dominant.golden +1 -1
  145. package/engine/testdata/golden/TestParityStuckCheck/few.golden +1 -1
  146. package/engine/testdata/golden/TestParityStuckCheck/ghost.golden +1 -1
  147. package/engine/testdata/golden/TestParityStuckCheck/identical.golden +1 -1
  148. package/engine/testdata/golden/TestParityStuckCheck/nolog.golden +1 -1
  149. package/engine/testdata/golden/TestParityStuckCheck/pingpong.golden +1 -1
  150. package/engine/testdata/golden/TestParityStuckCheck/varied.golden +1 -1
  151. package/engine/testdata/golden/TestParityStuckCheck/window-04-identical.golden +1 -1
  152. package/engine/testdata/golden/TestParityStuckCheck/window-2.5-varied4.golden +1 -1
  153. package/engine/testdata/golden/TestParityStuckCheck/window-4x-varied4.golden +1 -1
  154. package/engine/testdata/golden/TestParityStuckCheck/window-leadspace-varied4.golden +1 -1
  155. package/engine/testdata/golden/TestParityStuckCheck/window-plus4-identical.golden +1 -1
  156. package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent-subagent-type-key.golden +1 -1
  157. package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent.golden +1 -1
  158. package/engine/testdata/golden/TestParityTestIntegrity/clean.golden +1 -1
  159. package/engine/testdata/golden/TestParityTickAfk/missingField.golden +1 -1
  160. package/engine/testdata/golden/TestParityTickAfk/none.golden +1 -1
  161. package/engine/testdata/golden/TestParityWrightScope/out-of-scope-enforce-denies.golden +1 -1
  162. package/engine/testdata/golden/TestSpecSkeleton/missing-some.golden +1 -1
  163. package/engine/testdata/golden/TestSpecSkeleton/present-all.golden +1 -1
  164. package/engine/tests/adr_0004_required_by_phase_test.go +2 -2
  165. package/engine/tests/adr_0006_clock_seam_test.go +1 -1
  166. package/engine/tests/budget_test.go +1 -1
  167. package/engine/tests/canonical_ac_ids_test.go +2 -2
  168. package/engine/tests/cli_test.go +1 -1
  169. package/engine/tests/concurrency_cli_test.go +1 -1
  170. package/engine/tests/gate_test.go +4 -4
  171. package/engine/tests/hook_test.go +3 -3
  172. package/engine/tests/hooks_io_test.go +1 -1
  173. package/engine/tests/lib_parity_test.go +29 -29
  174. package/engine/tests/meta_test.go +2 -2
  175. package/engine/tests/parity_closeout_test.go +1 -1
  176. package/engine/tests/parity_learnings_test.go +2 -2
  177. package/engine/tests/parity_mutationgate_test.go +2 -2
  178. package/engine/tests/parity_resolve_test.go +1 -1
  179. package/engine/tests/parity_test.go +3 -3
  180. package/engine/tests/parity_tickafk_test.go +1 -1
  181. package/engine/validatepack.go +5 -5
  182. package/engine/validatepackskills.go +9 -9
  183. package/pack/.claude/agents/devrites-code-reviewer.md +21 -22
  184. package/pack/.claude/agents/devrites-devex-reviewer.md +17 -17
  185. package/pack/.claude/agents/devrites-doubt-reviewer.md +6 -6
  186. package/pack/.claude/agents/devrites-forge-judge.md +26 -26
  187. package/pack/.claude/agents/devrites-frontend-reviewer.md +17 -17
  188. package/pack/.claude/agents/devrites-performance-reviewer.md +19 -18
  189. package/pack/.claude/agents/devrites-plan-reviewer.md +29 -27
  190. package/pack/.claude/agents/devrites-retrospector.md +19 -19
  191. package/pack/.claude/agents/devrites-security-auditor.md +15 -15
  192. package/pack/.claude/agents/devrites-simplifier-reviewer.md +14 -14
  193. package/pack/.claude/agents/devrites-slice-wright.md +52 -51
  194. package/pack/.claude/agents/devrites-spec-reviewer.md +11 -11
  195. package/pack/.claude/agents/devrites-strategy-reviewer.md +21 -21
  196. package/pack/.claude/agents/devrites-test-analyst.md +13 -13
  197. package/pack/.claude/settings.json +1 -1
  198. package/pack/.claude/skills/devrites-api-interface/SKILL.md +12 -12
  199. package/pack/.claude/skills/devrites-audit/SKILL.md +7 -7
  200. package/pack/.claude/skills/devrites-browser-proof/SKILL.md +16 -16
  201. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +14 -14
  202. package/pack/.claude/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
  203. package/pack/.claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
  204. package/pack/.claude/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
  205. package/pack/.claude/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
  206. package/pack/.claude/skills/devrites-debug-recovery/reference/trace.md +4 -4
  207. package/pack/.claude/skills/devrites-doubt/SKILL.md +14 -14
  208. package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +18 -18
  209. package/pack/.claude/skills/devrites-frontend-craft/reference/craft.md +17 -17
  210. package/pack/.claude/skills/devrites-frontend-craft/reference/design-references.md +25 -25
  211. package/pack/.claude/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
  212. package/pack/.claude/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
  213. package/pack/.claude/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
  214. package/pack/.claude/skills/devrites-frontend-craft/reference/shape.md +13 -13
  215. package/pack/.claude/skills/devrites-interview/SKILL.md +27 -27
  216. package/pack/.claude/skills/devrites-lib/SKILL.md +25 -27
  217. package/pack/.claude/skills/devrites-lib/reference/model-tiers.md +5 -5
  218. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
  219. package/pack/.claude/skills/devrites-lib/reference/reply-contract.md +11 -3
  220. package/pack/.claude/skills/devrites-lib/reference/standards/README.md +10 -10
  221. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
  222. package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +37 -37
  223. package/pack/.claude/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
  224. package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
  225. package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +40 -40
  226. package/pack/.claude/skills/devrites-lib/reference/standards/coding-style.md +7 -7
  227. package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
  228. package/pack/.claude/skills/devrites-lib/reference/standards/core.md +23 -23
  229. package/pack/.claude/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
  230. package/pack/.claude/skills/devrites-lib/reference/standards/deprecation.md +18 -18
  231. package/pack/.claude/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
  232. package/pack/.claude/skills/devrites-lib/reference/standards/development-workflow.md +12 -13
  233. package/pack/.claude/skills/devrites-lib/reference/standards/documentation.md +4 -4
  234. package/pack/.claude/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
  235. package/pack/.claude/skills/devrites-lib/reference/standards/elicitation.md +26 -26
  236. package/pack/.claude/skills/devrites-lib/reference/standards/error-handling.md +4 -4
  237. package/pack/.claude/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
  238. package/pack/.claude/skills/devrites-lib/reference/standards/hooks.md +3 -3
  239. package/pack/.claude/skills/devrites-lib/reference/standards/observability.md +15 -15
  240. package/pack/.claude/skills/devrites-lib/reference/standards/patterns.md +8 -8
  241. package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +5 -5
  242. package/pack/.claude/skills/devrites-lib/reference/standards/principles.md +31 -31
  243. package/pack/.claude/skills/devrites-lib/reference/standards/prose-style.md +25 -25
  244. package/pack/.claude/skills/devrites-lib/reference/standards/security.md +30 -30
  245. package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
  246. package/pack/.claude/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
  247. package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +40 -40
  248. package/pack/.claude/skills/devrites-lib/reference/standards/tooling.md +26 -26
  249. package/pack/.claude/skills/devrites-prose-craft/SKILL.md +5 -5
  250. package/pack/.claude/skills/devrites-refresh-indexes/SKILL.md +6 -6
  251. package/pack/.claude/skills/devrites-source-driven/SKILL.md +8 -8
  252. package/pack/.claude/skills/devrites-ux-shape/SKILL.md +33 -33
  253. package/pack/.claude/skills/devrites-ux-shape/reference/brief-template.md +6 -6
  254. package/pack/.claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
  255. package/pack/.claude/skills/rite/SKILL.md +13 -14
  256. package/pack/.claude/skills/rite/reference/menu.md +10 -10
  257. package/pack/.claude/skills/rite-adopt/SKILL.md +17 -18
  258. package/pack/.claude/skills/rite-adopt/reference/adoption.md +9 -9
  259. package/pack/.claude/skills/rite-adopt/reference/anti-patterns.md +6 -6
  260. package/pack/.claude/skills/rite-autocomplete/SKILL.md +14 -14
  261. package/pack/.claude/skills/rite-autocomplete/reference/decision-policy.md +4 -4
  262. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +7 -7
  263. package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
  264. package/pack/.claude/skills/rite-build/SKILL.md +22 -22
  265. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +9 -9
  266. package/pack/.claude/skills/rite-build/reference/anti-patterns.md +6 -6
  267. package/pack/.claude/skills/rite-build/reference/checkpoint-protocol.md +14 -14
  268. package/pack/.claude/skills/rite-build/reference/checkpoint.md +8 -8
  269. package/pack/.claude/skills/rite-build/reference/evidence-standard.md +1 -1
  270. package/pack/.claude/skills/rite-build/reference/forge.md +28 -29
  271. package/pack/.claude/skills/rite-build/reference/frontend-trigger.md +2 -2
  272. package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +3 -3
  273. package/pack/.claude/skills/rite-build/reference/output.md +1 -1
  274. package/pack/.claude/skills/rite-build/reference/phase-contract.md +44 -44
  275. package/pack/.claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
  276. package/pack/.claude/skills/rite-build/reference/tdd.md +6 -6
  277. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +23 -23
  278. package/pack/.claude/skills/rite-converge/SKILL.md +17 -17
  279. package/pack/.claude/skills/rite-converge/reference/anti-patterns.md +7 -7
  280. package/pack/.claude/skills/rite-converge/reference/convergence-assessment.md +14 -14
  281. package/pack/.claude/skills/rite-customize/SKILL.md +2 -2
  282. package/pack/.claude/skills/rite-define/SKILL.md +25 -25
  283. package/pack/.claude/skills/rite-define/reference/anti-patterns.md +5 -5
  284. package/pack/.claude/skills/rite-define/reference/gates.md +13 -13
  285. package/pack/.claude/skills/rite-define/reference/plan-template.md +1 -1
  286. package/pack/.claude/skills/rite-doctor/SKILL.md +11 -11
  287. package/pack/.claude/skills/rite-dogfood/SKILL.md +2 -2
  288. package/pack/.claude/skills/rite-explain/SKILL.md +22 -22
  289. package/pack/.claude/skills/rite-explain/reference/intake.md +16 -16
  290. package/pack/.claude/skills/rite-frame/SKILL.md +22 -22
  291. package/pack/.claude/skills/rite-frame/reference/failure-modes.md +13 -13
  292. package/pack/.claude/skills/rite-handoff/SKILL.md +12 -12
  293. package/pack/.claude/skills/rite-learn/SKILL.md +23 -23
  294. package/pack/.claude/skills/rite-plan/SKILL.md +21 -21
  295. package/pack/.claude/skills/rite-plan/reference/anti-patterns.md +3 -3
  296. package/pack/.claude/skills/rite-plan/reference/dependency-graph.md +1 -1
  297. package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +3 -3
  298. package/pack/.claude/skills/rite-plan/reference/slicing.md +9 -9
  299. package/pack/.claude/skills/rite-plan/reference/task-breakdown.md +3 -3
  300. package/pack/.claude/skills/rite-polish/SKILL.md +11 -11
  301. package/pack/.claude/skills/rite-polish/reference/anti-patterns.md +8 -8
  302. package/pack/.claude/skills/rite-polish/reference/backend-polish.md +13 -13
  303. package/pack/.claude/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
  304. package/pack/.claude/skills/rite-polish/reference/code.md +26 -26
  305. package/pack/.claude/skills/rite-polish/reference/harden-checklist.md +31 -31
  306. package/pack/.claude/skills/rite-polish/reference/ui.md +23 -23
  307. package/pack/.claude/skills/rite-pov/SKILL.md +3 -3
  308. package/pack/.claude/skills/rite-pr-feedback/SKILL.md +2 -2
  309. package/pack/.claude/skills/rite-pressure-test/SKILL.md +14 -14
  310. package/pack/.claude/skills/rite-prototype/SKILL.md +13 -13
  311. package/pack/.claude/skills/rite-prove/SKILL.md +17 -17
  312. package/pack/.claude/skills/rite-prove/reference/anti-patterns.md +4 -4
  313. package/pack/.claude/skills/rite-prove/reference/browser-proof.md +2 -2
  314. package/pack/.claude/skills/rite-prove/reference/failure-triage.md +4 -4
  315. package/pack/.claude/skills/rite-prove/reference/proof-ladder.md +6 -6
  316. package/pack/.claude/skills/rite-prove/reference/test-command-discovery.md +1 -1
  317. package/pack/.claude/skills/rite-quick/SKILL.md +22 -22
  318. package/pack/.claude/skills/rite-resolve/SKILL.md +18 -18
  319. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +7 -7
  320. package/pack/.claude/skills/rite-review/SKILL.md +34 -34
  321. package/pack/.claude/skills/rite-review/reference/anti-patterns.md +4 -4
  322. package/pack/.claude/skills/rite-review/reference/cognitive-load.md +22 -22
  323. package/pack/.claude/skills/rite-review/reference/feature-scoped-review.md +2 -2
  324. package/pack/.claude/skills/rite-review/reference/five-axis-review.md +8 -8
  325. package/pack/.claude/skills/rite-review/reference/nielsen-heuristics.md +14 -14
  326. package/pack/.claude/skills/rite-review/reference/performance-checklist.md +14 -14
  327. package/pack/.claude/skills/rite-review/reference/security-review.md +9 -9
  328. package/pack/.claude/skills/rite-seal/SKILL.md +26 -26
  329. package/pack/.claude/skills/rite-seal/reference/anti-patterns.md +8 -8
  330. package/pack/.claude/skills/rite-seal/reference/conventions-ledger.md +8 -8
  331. package/pack/.claude/skills/rite-seal/reference/final-evidence.md +9 -9
  332. package/pack/.claude/skills/rite-seal/reference/go-no-go.md +9 -9
  333. package/pack/.claude/skills/rite-seal/reference/phase-contract.md +43 -43
  334. package/pack/.claude/skills/rite-ship/SKILL.md +12 -12
  335. package/pack/.claude/skills/rite-ship/reference/anti-patterns.md +5 -5
  336. package/pack/.claude/skills/rite-ship/reference/close-out.md +2 -2
  337. package/pack/.claude/skills/rite-ship/reference/design-memory.md +22 -22
  338. package/pack/.claude/skills/rite-ship/reference/git-ship.md +10 -10
  339. package/pack/.claude/skills/rite-ship/reference/ledger.md +9 -9
  340. package/pack/.claude/skills/rite-ship/reference/rollout.md +11 -11
  341. package/pack/.claude/skills/rite-ship/reference/ship-template.md +1 -1
  342. package/pack/.claude/skills/rite-spec/SKILL.md +45 -45
  343. package/pack/.claude/skills/rite-spec/reference/acceptance-criteria.md +4 -4
  344. package/pack/.claude/skills/rite-spec/reference/anti-patterns.md +6 -6
  345. package/pack/.claude/skills/rite-spec/reference/interview-patterns.md +3 -3
  346. package/pack/.claude/skills/rite-spec/reference/investigation.md +21 -21
  347. package/pack/.claude/skills/rite-spec/reference/question-protocol.md +9 -9
  348. package/pack/.claude/skills/rite-spec/reference/references-intake.md +8 -8
  349. package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +19 -19
  350. package/pack/.claude/skills/rite-status/SKILL.md +13 -13
  351. package/pack/.claude/skills/rite-temper/SKILL.md +29 -29
  352. package/pack/.claude/skills/rite-temper/reference/anti-patterns.md +11 -11
  353. package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +20 -20
  354. package/pack/.claude/skills/rite-temper/reference/scope-modes.md +16 -16
  355. package/pack/.claude/skills/rite-temper/reference/significance.md +10 -10
  356. package/pack/.claude/skills/rite-temper/reference/strategy-template.md +14 -14
  357. package/pack/.claude/skills/rite-vet/SKILL.md +31 -31
  358. package/pack/.claude/skills/rite-vet/reference/anti-patterns.md +14 -14
  359. package/pack/.claude/skills/rite-vet/reference/artifacts.md +10 -10
  360. package/pack/.claude/skills/rite-vet/reference/cross-model.md +9 -9
  361. package/pack/.claude/skills/rite-vet/reference/depth.md +14 -14
  362. package/pack/.claude/skills/rite-vet/reference/eng-lenses.md +9 -9
  363. package/pack/.claude/skills/rite-vet/reference/review-axes.md +28 -28
  364. package/pack/.claude/skills/rite-zoom-out/SKILL.md +18 -18
  365. package/pack/generated/claude/agents/devrites-code-reviewer.md +21 -22
  366. package/pack/generated/claude/agents/devrites-devex-reviewer.md +17 -17
  367. package/pack/generated/claude/agents/devrites-doubt-reviewer.md +6 -6
  368. package/pack/generated/claude/agents/devrites-forge-judge.md +26 -26
  369. package/pack/generated/claude/agents/devrites-frontend-reviewer.md +17 -17
  370. package/pack/generated/claude/agents/devrites-performance-reviewer.md +19 -18
  371. package/pack/generated/claude/agents/devrites-plan-reviewer.md +29 -27
  372. package/pack/generated/claude/agents/devrites-retrospector.md +19 -19
  373. package/pack/generated/claude/agents/devrites-security-auditor.md +15 -15
  374. package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +14 -14
  375. package/pack/generated/claude/agents/devrites-slice-wright.md +52 -51
  376. package/pack/generated/claude/agents/devrites-spec-reviewer.md +11 -11
  377. package/pack/generated/claude/agents/devrites-strategy-reviewer.md +21 -21
  378. package/pack/generated/claude/agents/devrites-test-analyst.md +13 -13
  379. package/pack/generated/claude/settings.json +1 -1
  380. package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +12 -12
  381. package/pack/generated/claude/skills/devrites-audit/SKILL.md +7 -7
  382. package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +16 -16
  383. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +14 -14
  384. package/pack/generated/claude/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
  385. package/pack/generated/claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
  386. package/pack/generated/claude/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
  387. package/pack/generated/claude/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
  388. package/pack/generated/claude/skills/devrites-debug-recovery/reference/trace.md +4 -4
  389. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +14 -14
  390. package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +18 -18
  391. package/pack/generated/claude/skills/devrites-frontend-craft/reference/craft.md +17 -17
  392. package/pack/generated/claude/skills/devrites-frontend-craft/reference/design-references.md +25 -25
  393. package/pack/generated/claude/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
  394. package/pack/generated/claude/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
  395. package/pack/generated/claude/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
  396. package/pack/generated/claude/skills/devrites-frontend-craft/reference/shape.md +13 -13
  397. package/pack/generated/claude/skills/devrites-interview/SKILL.md +27 -27
  398. package/pack/generated/claude/skills/devrites-lib/SKILL.md +25 -27
  399. package/pack/generated/claude/skills/devrites-lib/reference/model-tiers.md +5 -5
  400. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
  401. package/pack/generated/claude/skills/devrites-lib/reference/reply-contract.md +11 -3
  402. package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +10 -10
  403. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
  404. package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +37 -37
  405. package/pack/generated/claude/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
  406. package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
  407. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +40 -40
  408. package/pack/generated/claude/skills/devrites-lib/reference/standards/coding-style.md +7 -7
  409. package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
  410. package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +23 -23
  411. package/pack/generated/claude/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
  412. package/pack/generated/claude/skills/devrites-lib/reference/standards/deprecation.md +18 -18
  413. package/pack/generated/claude/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
  414. package/pack/generated/claude/skills/devrites-lib/reference/standards/development-workflow.md +12 -13
  415. package/pack/generated/claude/skills/devrites-lib/reference/standards/documentation.md +4 -4
  416. package/pack/generated/claude/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
  417. package/pack/generated/claude/skills/devrites-lib/reference/standards/elicitation.md +26 -26
  418. package/pack/generated/claude/skills/devrites-lib/reference/standards/error-handling.md +4 -4
  419. package/pack/generated/claude/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
  420. package/pack/generated/claude/skills/devrites-lib/reference/standards/hooks.md +3 -3
  421. package/pack/generated/claude/skills/devrites-lib/reference/standards/observability.md +15 -15
  422. package/pack/generated/claude/skills/devrites-lib/reference/standards/patterns.md +8 -8
  423. package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +5 -5
  424. package/pack/generated/claude/skills/devrites-lib/reference/standards/principles.md +31 -31
  425. package/pack/generated/claude/skills/devrites-lib/reference/standards/prose-style.md +25 -25
  426. package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +30 -30
  427. package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
  428. package/pack/generated/claude/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
  429. package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +40 -40
  430. package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +26 -26
  431. package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +5 -5
  432. package/pack/generated/claude/skills/devrites-refresh-indexes/SKILL.md +6 -6
  433. package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +8 -8
  434. package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +33 -33
  435. package/pack/generated/claude/skills/devrites-ux-shape/reference/brief-template.md +6 -6
  436. package/pack/generated/claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
  437. package/pack/generated/claude/skills/rite/SKILL.md +13 -14
  438. package/pack/generated/claude/skills/rite/reference/menu.md +10 -10
  439. package/pack/generated/claude/skills/rite-adopt/SKILL.md +17 -18
  440. package/pack/generated/claude/skills/rite-adopt/reference/adoption.md +9 -9
  441. package/pack/generated/claude/skills/rite-adopt/reference/anti-patterns.md +6 -6
  442. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +14 -14
  443. package/pack/generated/claude/skills/rite-autocomplete/reference/decision-policy.md +4 -4
  444. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +7 -7
  445. package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
  446. package/pack/generated/claude/skills/rite-build/SKILL.md +22 -22
  447. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +9 -9
  448. package/pack/generated/claude/skills/rite-build/reference/anti-patterns.md +6 -6
  449. package/pack/generated/claude/skills/rite-build/reference/checkpoint-protocol.md +14 -14
  450. package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +8 -8
  451. package/pack/generated/claude/skills/rite-build/reference/evidence-standard.md +1 -1
  452. package/pack/generated/claude/skills/rite-build/reference/forge.md +28 -29
  453. package/pack/generated/claude/skills/rite-build/reference/frontend-trigger.md +2 -2
  454. package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +3 -3
  455. package/pack/generated/claude/skills/rite-build/reference/output.md +1 -1
  456. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +44 -44
  457. package/pack/generated/claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
  458. package/pack/generated/claude/skills/rite-build/reference/tdd.md +6 -6
  459. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +23 -23
  460. package/pack/generated/claude/skills/rite-converge/SKILL.md +17 -17
  461. package/pack/generated/claude/skills/rite-converge/reference/anti-patterns.md +7 -7
  462. package/pack/generated/claude/skills/rite-converge/reference/convergence-assessment.md +14 -14
  463. package/pack/generated/claude/skills/rite-customize/SKILL.md +2 -2
  464. package/pack/generated/claude/skills/rite-define/SKILL.md +25 -25
  465. package/pack/generated/claude/skills/rite-define/reference/anti-patterns.md +5 -5
  466. package/pack/generated/claude/skills/rite-define/reference/gates.md +13 -13
  467. package/pack/generated/claude/skills/rite-define/reference/plan-template.md +1 -1
  468. package/pack/generated/claude/skills/rite-doctor/SKILL.md +11 -11
  469. package/pack/generated/claude/skills/rite-dogfood/SKILL.md +2 -2
  470. package/pack/generated/claude/skills/rite-explain/SKILL.md +22 -22
  471. package/pack/generated/claude/skills/rite-explain/reference/intake.md +16 -16
  472. package/pack/generated/claude/skills/rite-frame/SKILL.md +22 -22
  473. package/pack/generated/claude/skills/rite-frame/reference/failure-modes.md +13 -13
  474. package/pack/generated/claude/skills/rite-handoff/SKILL.md +12 -12
  475. package/pack/generated/claude/skills/rite-learn/SKILL.md +23 -23
  476. package/pack/generated/claude/skills/rite-plan/SKILL.md +21 -21
  477. package/pack/generated/claude/skills/rite-plan/reference/anti-patterns.md +3 -3
  478. package/pack/generated/claude/skills/rite-plan/reference/dependency-graph.md +1 -1
  479. package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +3 -3
  480. package/pack/generated/claude/skills/rite-plan/reference/slicing.md +9 -9
  481. package/pack/generated/claude/skills/rite-plan/reference/task-breakdown.md +3 -3
  482. package/pack/generated/claude/skills/rite-polish/SKILL.md +11 -11
  483. package/pack/generated/claude/skills/rite-polish/reference/anti-patterns.md +8 -8
  484. package/pack/generated/claude/skills/rite-polish/reference/backend-polish.md +13 -13
  485. package/pack/generated/claude/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
  486. package/pack/generated/claude/skills/rite-polish/reference/code.md +26 -26
  487. package/pack/generated/claude/skills/rite-polish/reference/harden-checklist.md +31 -31
  488. package/pack/generated/claude/skills/rite-polish/reference/ui.md +23 -23
  489. package/pack/generated/claude/skills/rite-pov/SKILL.md +3 -3
  490. package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +2 -2
  491. package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +14 -14
  492. package/pack/generated/claude/skills/rite-prototype/SKILL.md +13 -13
  493. package/pack/generated/claude/skills/rite-prove/SKILL.md +17 -17
  494. package/pack/generated/claude/skills/rite-prove/reference/anti-patterns.md +4 -4
  495. package/pack/generated/claude/skills/rite-prove/reference/browser-proof.md +2 -2
  496. package/pack/generated/claude/skills/rite-prove/reference/failure-triage.md +4 -4
  497. package/pack/generated/claude/skills/rite-prove/reference/proof-ladder.md +6 -6
  498. package/pack/generated/claude/skills/rite-prove/reference/test-command-discovery.md +1 -1
  499. package/pack/generated/claude/skills/rite-quick/SKILL.md +22 -22
  500. package/pack/generated/claude/skills/rite-resolve/SKILL.md +18 -18
  501. package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +7 -7
  502. package/pack/generated/claude/skills/rite-review/SKILL.md +34 -34
  503. package/pack/generated/claude/skills/rite-review/reference/anti-patterns.md +4 -4
  504. package/pack/generated/claude/skills/rite-review/reference/cognitive-load.md +22 -22
  505. package/pack/generated/claude/skills/rite-review/reference/feature-scoped-review.md +2 -2
  506. package/pack/generated/claude/skills/rite-review/reference/five-axis-review.md +8 -8
  507. package/pack/generated/claude/skills/rite-review/reference/nielsen-heuristics.md +14 -14
  508. package/pack/generated/claude/skills/rite-review/reference/performance-checklist.md +14 -14
  509. package/pack/generated/claude/skills/rite-review/reference/security-review.md +9 -9
  510. package/pack/generated/claude/skills/rite-seal/SKILL.md +26 -26
  511. package/pack/generated/claude/skills/rite-seal/reference/anti-patterns.md +8 -8
  512. package/pack/generated/claude/skills/rite-seal/reference/conventions-ledger.md +8 -8
  513. package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +9 -9
  514. package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +9 -9
  515. package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +43 -43
  516. package/pack/generated/claude/skills/rite-ship/SKILL.md +12 -12
  517. package/pack/generated/claude/skills/rite-ship/reference/anti-patterns.md +5 -5
  518. package/pack/generated/claude/skills/rite-ship/reference/close-out.md +2 -2
  519. package/pack/generated/claude/skills/rite-ship/reference/design-memory.md +22 -22
  520. package/pack/generated/claude/skills/rite-ship/reference/git-ship.md +10 -10
  521. package/pack/generated/claude/skills/rite-ship/reference/ledger.md +9 -9
  522. package/pack/generated/claude/skills/rite-ship/reference/rollout.md +11 -11
  523. package/pack/generated/claude/skills/rite-ship/reference/ship-template.md +1 -1
  524. package/pack/generated/claude/skills/rite-spec/SKILL.md +45 -45
  525. package/pack/generated/claude/skills/rite-spec/reference/acceptance-criteria.md +4 -4
  526. package/pack/generated/claude/skills/rite-spec/reference/anti-patterns.md +6 -6
  527. package/pack/generated/claude/skills/rite-spec/reference/interview-patterns.md +3 -3
  528. package/pack/generated/claude/skills/rite-spec/reference/investigation.md +21 -21
  529. package/pack/generated/claude/skills/rite-spec/reference/question-protocol.md +9 -9
  530. package/pack/generated/claude/skills/rite-spec/reference/references-intake.md +8 -8
  531. package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +19 -19
  532. package/pack/generated/claude/skills/rite-status/SKILL.md +13 -13
  533. package/pack/generated/claude/skills/rite-temper/SKILL.md +29 -29
  534. package/pack/generated/claude/skills/rite-temper/reference/anti-patterns.md +11 -11
  535. package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +20 -20
  536. package/pack/generated/claude/skills/rite-temper/reference/scope-modes.md +16 -16
  537. package/pack/generated/claude/skills/rite-temper/reference/significance.md +10 -10
  538. package/pack/generated/claude/skills/rite-temper/reference/strategy-template.md +14 -14
  539. package/pack/generated/claude/skills/rite-vet/SKILL.md +31 -31
  540. package/pack/generated/claude/skills/rite-vet/reference/anti-patterns.md +14 -14
  541. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +10 -10
  542. package/pack/generated/claude/skills/rite-vet/reference/cross-model.md +9 -9
  543. package/pack/generated/claude/skills/rite-vet/reference/depth.md +14 -14
  544. package/pack/generated/claude/skills/rite-vet/reference/eng-lenses.md +9 -9
  545. package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +28 -28
  546. package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +18 -18
  547. package/pack/generated/codex/agents/devrites-code-reviewer.toml +21 -22
  548. package/pack/generated/codex/agents/devrites-devex-reviewer.toml +17 -17
  549. package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +6 -6
  550. package/pack/generated/codex/agents/devrites-forge-judge.toml +26 -26
  551. package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +17 -17
  552. package/pack/generated/codex/agents/devrites-performance-reviewer.toml +19 -18
  553. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +29 -27
  554. package/pack/generated/codex/agents/devrites-retrospector.toml +19 -19
  555. package/pack/generated/codex/agents/devrites-security-auditor.toml +15 -15
  556. package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +14 -14
  557. package/pack/generated/codex/agents/devrites-slice-wright.toml +52 -51
  558. package/pack/generated/codex/agents/devrites-spec-reviewer.toml +11 -11
  559. package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +21 -21
  560. package/pack/generated/codex/agents/devrites-test-analyst.toml +13 -13
  561. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +15 -15
  562. package/pack/generated/codex/skills/devrites-audit/SKILL.md +10 -10
  563. package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +19 -19
  564. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +17 -17
  565. package/pack/generated/codex/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
  566. package/pack/generated/codex/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
  567. package/pack/generated/codex/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
  568. package/pack/generated/codex/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
  569. package/pack/generated/codex/skills/devrites-debug-recovery/reference/trace.md +4 -4
  570. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +17 -17
  571. package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +20 -20
  572. package/pack/generated/codex/skills/devrites-frontend-craft/reference/craft.md +17 -17
  573. package/pack/generated/codex/skills/devrites-frontend-craft/reference/design-references.md +25 -25
  574. package/pack/generated/codex/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
  575. package/pack/generated/codex/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
  576. package/pack/generated/codex/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
  577. package/pack/generated/codex/skills/devrites-frontend-craft/reference/shape.md +13 -13
  578. package/pack/generated/codex/skills/devrites-interview/SKILL.md +30 -30
  579. package/pack/generated/codex/skills/devrites-lib/SKILL.md +28 -30
  580. package/pack/generated/codex/skills/devrites-lib/reference/model-tiers.md +5 -5
  581. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
  582. package/pack/generated/codex/skills/devrites-lib/reference/reply-contract.md +11 -3
  583. package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +10 -10
  584. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
  585. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +37 -37
  586. package/pack/generated/codex/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
  587. package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
  588. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +40 -40
  589. package/pack/generated/codex/skills/devrites-lib/reference/standards/coding-style.md +7 -7
  590. package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
  591. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +23 -23
  592. package/pack/generated/codex/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
  593. package/pack/generated/codex/skills/devrites-lib/reference/standards/deprecation.md +18 -18
  594. package/pack/generated/codex/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
  595. package/pack/generated/codex/skills/devrites-lib/reference/standards/development-workflow.md +12 -13
  596. package/pack/generated/codex/skills/devrites-lib/reference/standards/documentation.md +4 -4
  597. package/pack/generated/codex/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
  598. package/pack/generated/codex/skills/devrites-lib/reference/standards/elicitation.md +26 -26
  599. package/pack/generated/codex/skills/devrites-lib/reference/standards/error-handling.md +4 -4
  600. package/pack/generated/codex/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
  601. package/pack/generated/codex/skills/devrites-lib/reference/standards/hooks.md +3 -3
  602. package/pack/generated/codex/skills/devrites-lib/reference/standards/observability.md +15 -15
  603. package/pack/generated/codex/skills/devrites-lib/reference/standards/patterns.md +8 -8
  604. package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +5 -5
  605. package/pack/generated/codex/skills/devrites-lib/reference/standards/principles.md +31 -31
  606. package/pack/generated/codex/skills/devrites-lib/reference/standards/prose-style.md +25 -25
  607. package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +30 -30
  608. package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
  609. package/pack/generated/codex/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
  610. package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +40 -40
  611. package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +26 -26
  612. package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +8 -8
  613. package/pack/generated/codex/skills/devrites-refresh-indexes/SKILL.md +9 -9
  614. package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +11 -11
  615. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +36 -36
  616. package/pack/generated/codex/skills/devrites-ux-shape/reference/brief-template.md +6 -6
  617. package/pack/generated/codex/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
  618. package/pack/generated/codex/skills/rite/SKILL.md +16 -17
  619. package/pack/generated/codex/skills/rite/reference/menu.md +10 -10
  620. package/pack/generated/codex/skills/rite-adopt/SKILL.md +20 -21
  621. package/pack/generated/codex/skills/rite-adopt/reference/adoption.md +9 -9
  622. package/pack/generated/codex/skills/rite-adopt/reference/anti-patterns.md +6 -6
  623. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +17 -17
  624. package/pack/generated/codex/skills/rite-autocomplete/reference/decision-policy.md +4 -4
  625. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +7 -7
  626. package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
  627. package/pack/generated/codex/skills/rite-build/SKILL.md +25 -25
  628. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +9 -9
  629. package/pack/generated/codex/skills/rite-build/reference/anti-patterns.md +6 -6
  630. package/pack/generated/codex/skills/rite-build/reference/checkpoint-protocol.md +14 -14
  631. package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +8 -8
  632. package/pack/generated/codex/skills/rite-build/reference/evidence-standard.md +1 -1
  633. package/pack/generated/codex/skills/rite-build/reference/forge.md +28 -29
  634. package/pack/generated/codex/skills/rite-build/reference/frontend-trigger.md +2 -2
  635. package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +3 -3
  636. package/pack/generated/codex/skills/rite-build/reference/output.md +1 -1
  637. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +44 -44
  638. package/pack/generated/codex/skills/rite-build/reference/spec-drift-guard.md +1 -1
  639. package/pack/generated/codex/skills/rite-build/reference/tdd.md +6 -6
  640. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +23 -23
  641. package/pack/generated/codex/skills/rite-converge/SKILL.md +20 -20
  642. package/pack/generated/codex/skills/rite-converge/reference/anti-patterns.md +7 -7
  643. package/pack/generated/codex/skills/rite-converge/reference/convergence-assessment.md +14 -14
  644. package/pack/generated/codex/skills/rite-customize/SKILL.md +5 -5
  645. package/pack/generated/codex/skills/rite-define/SKILL.md +28 -28
  646. package/pack/generated/codex/skills/rite-define/reference/anti-patterns.md +5 -5
  647. package/pack/generated/codex/skills/rite-define/reference/gates.md +13 -13
  648. package/pack/generated/codex/skills/rite-define/reference/plan-template.md +1 -1
  649. package/pack/generated/codex/skills/rite-doctor/SKILL.md +14 -14
  650. package/pack/generated/codex/skills/rite-dogfood/SKILL.md +5 -5
  651. package/pack/generated/codex/skills/rite-explain/SKILL.md +25 -25
  652. package/pack/generated/codex/skills/rite-explain/reference/intake.md +16 -16
  653. package/pack/generated/codex/skills/rite-frame/SKILL.md +25 -25
  654. package/pack/generated/codex/skills/rite-frame/reference/failure-modes.md +13 -13
  655. package/pack/generated/codex/skills/rite-handoff/SKILL.md +15 -15
  656. package/pack/generated/codex/skills/rite-learn/SKILL.md +26 -26
  657. package/pack/generated/codex/skills/rite-plan/SKILL.md +24 -24
  658. package/pack/generated/codex/skills/rite-plan/reference/anti-patterns.md +3 -3
  659. package/pack/generated/codex/skills/rite-plan/reference/dependency-graph.md +1 -1
  660. package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +3 -3
  661. package/pack/generated/codex/skills/rite-plan/reference/slicing.md +9 -9
  662. package/pack/generated/codex/skills/rite-plan/reference/task-breakdown.md +3 -3
  663. package/pack/generated/codex/skills/rite-polish/SKILL.md +14 -14
  664. package/pack/generated/codex/skills/rite-polish/reference/anti-patterns.md +8 -8
  665. package/pack/generated/codex/skills/rite-polish/reference/backend-polish.md +13 -13
  666. package/pack/generated/codex/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
  667. package/pack/generated/codex/skills/rite-polish/reference/code.md +26 -26
  668. package/pack/generated/codex/skills/rite-polish/reference/harden-checklist.md +31 -31
  669. package/pack/generated/codex/skills/rite-polish/reference/ui.md +23 -23
  670. package/pack/generated/codex/skills/rite-pov/SKILL.md +6 -6
  671. package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +5 -5
  672. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +17 -17
  673. package/pack/generated/codex/skills/rite-prototype/SKILL.md +16 -16
  674. package/pack/generated/codex/skills/rite-prove/SKILL.md +20 -20
  675. package/pack/generated/codex/skills/rite-prove/reference/anti-patterns.md +4 -4
  676. package/pack/generated/codex/skills/rite-prove/reference/browser-proof.md +2 -2
  677. package/pack/generated/codex/skills/rite-prove/reference/failure-triage.md +4 -4
  678. package/pack/generated/codex/skills/rite-prove/reference/proof-ladder.md +6 -6
  679. package/pack/generated/codex/skills/rite-prove/reference/test-command-discovery.md +1 -1
  680. package/pack/generated/codex/skills/rite-quick/SKILL.md +25 -25
  681. package/pack/generated/codex/skills/rite-resolve/SKILL.md +21 -21
  682. package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +7 -7
  683. package/pack/generated/codex/skills/rite-review/SKILL.md +37 -37
  684. package/pack/generated/codex/skills/rite-review/reference/anti-patterns.md +4 -4
  685. package/pack/generated/codex/skills/rite-review/reference/cognitive-load.md +22 -22
  686. package/pack/generated/codex/skills/rite-review/reference/feature-scoped-review.md +2 -2
  687. package/pack/generated/codex/skills/rite-review/reference/five-axis-review.md +8 -8
  688. package/pack/generated/codex/skills/rite-review/reference/nielsen-heuristics.md +14 -14
  689. package/pack/generated/codex/skills/rite-review/reference/performance-checklist.md +14 -14
  690. package/pack/generated/codex/skills/rite-review/reference/security-review.md +9 -9
  691. package/pack/generated/codex/skills/rite-seal/SKILL.md +29 -29
  692. package/pack/generated/codex/skills/rite-seal/reference/anti-patterns.md +8 -8
  693. package/pack/generated/codex/skills/rite-seal/reference/conventions-ledger.md +8 -8
  694. package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +9 -9
  695. package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +9 -9
  696. package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +43 -43
  697. package/pack/generated/codex/skills/rite-ship/SKILL.md +15 -15
  698. package/pack/generated/codex/skills/rite-ship/reference/anti-patterns.md +5 -5
  699. package/pack/generated/codex/skills/rite-ship/reference/close-out.md +2 -2
  700. package/pack/generated/codex/skills/rite-ship/reference/design-memory.md +22 -22
  701. package/pack/generated/codex/skills/rite-ship/reference/git-ship.md +10 -10
  702. package/pack/generated/codex/skills/rite-ship/reference/ledger.md +9 -9
  703. package/pack/generated/codex/skills/rite-ship/reference/rollout.md +11 -11
  704. package/pack/generated/codex/skills/rite-ship/reference/ship-template.md +1 -1
  705. package/pack/generated/codex/skills/rite-spec/SKILL.md +48 -48
  706. package/pack/generated/codex/skills/rite-spec/reference/acceptance-criteria.md +4 -4
  707. package/pack/generated/codex/skills/rite-spec/reference/anti-patterns.md +6 -6
  708. package/pack/generated/codex/skills/rite-spec/reference/interview-patterns.md +3 -3
  709. package/pack/generated/codex/skills/rite-spec/reference/investigation.md +21 -21
  710. package/pack/generated/codex/skills/rite-spec/reference/question-protocol.md +9 -9
  711. package/pack/generated/codex/skills/rite-spec/reference/references-intake.md +8 -8
  712. package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +19 -19
  713. package/pack/generated/codex/skills/rite-status/SKILL.md +16 -16
  714. package/pack/generated/codex/skills/rite-temper/SKILL.md +32 -32
  715. package/pack/generated/codex/skills/rite-temper/reference/anti-patterns.md +11 -11
  716. package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +20 -20
  717. package/pack/generated/codex/skills/rite-temper/reference/scope-modes.md +16 -16
  718. package/pack/generated/codex/skills/rite-temper/reference/significance.md +10 -10
  719. package/pack/generated/codex/skills/rite-temper/reference/strategy-template.md +14 -14
  720. package/pack/generated/codex/skills/rite-vet/SKILL.md +34 -34
  721. package/pack/generated/codex/skills/rite-vet/reference/anti-patterns.md +14 -14
  722. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +10 -10
  723. package/pack/generated/codex/skills/rite-vet/reference/cross-model.md +9 -9
  724. package/pack/generated/codex/skills/rite-vet/reference/depth.md +14 -14
  725. package/pack/generated/codex/skills/rite-vet/reference/eng-lenses.md +9 -9
  726. package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +28 -28
  727. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +21 -21
  728. package/package.json +2 -2
  729. package/scripts/build-binaries.sh +1 -1
  730. package/scripts/build-host-artifacts.sh +1 -1
  731. package/scripts/build-release-tarball.sh +1 -1
  732. package/scripts/check-cross-refs.py +8 -8
  733. package/scripts/check-invocation-integrity.py +4 -4
  734. package/scripts/check-no-global-writes.sh +2 -2
  735. package/scripts/check-reply-contract.sh +1 -1
  736. package/scripts/check-rule-uniqueness.sh +2 -2
  737. package/scripts/codex-generate.sh +5 -5
  738. package/scripts/devrites-detect.sh +33 -33
  739. package/scripts/eval-runner.py +7 -7
  740. package/scripts/grade-feature.sh +14 -14
  741. package/scripts/install-lib.sh +2 -2
  742. package/scripts/pin.sh +12 -12
  743. package/scripts/run-behavioral-evals.sh +12 -12
  744. package/scripts/run-evals.sh +1 -1
  745. package/scripts/run-outcome-evals.sh +12 -12
  746. package/scripts/scan-pack-security.py +4 -4
  747. package/scripts/scan-supply-chain-iocs.py +7 -7
  748. package/scripts/skills-inventory.mjs +21 -4
  749. package/scripts/sync-version.sh +2 -2
  750. package/scripts/validate-workflow-security.py +12 -6
  751. package/scripts/validate-workspace-schema.py +2 -2
  752. package/scripts/validate.sh +7 -7
@@ -0,0 +1,343 @@
1
+ package lib
2
+
3
+ import (
4
+ "bytes"
5
+ "os"
6
+ "os/exec"
7
+ "path/filepath"
8
+ "strings"
9
+ "testing"
10
+ )
11
+
12
+ func TestPackageExistenceJavaScriptWorkspaces(t *testing.T) {
13
+ tests := []struct {
14
+ name string
15
+ sourcePath string
16
+ workingDir string
17
+ importLine string
18
+ files map[string]string
19
+ wantCode int
20
+ wantFinding string
21
+ }{
22
+ {
23
+ name: "nested workspace",
24
+ sourcePath: "frontend/src/example.ts",
25
+ workingDir: "frontend",
26
+ importLine: `import { Dialog } from "@ark-ui/svelte/dialog";`,
27
+ files: map[string]string{
28
+ "frontend/package.json": `{"dependencies":{"@ark-ui/svelte":"^5.22.1"}}`,
29
+ },
30
+ },
31
+ {
32
+ name: "scoped package subpath",
33
+ sourcePath: "app/src/example.ts",
34
+ importLine: `import value from "@scope/package/subpath";`,
35
+ files: map[string]string{
36
+ "app/package.json": `{"devDependencies":{"@scope/package":"1.0.0"}}`,
37
+ },
38
+ },
39
+ {
40
+ name: "wildcard alias",
41
+ sourcePath: "frontend/src/example.ts",
42
+ importLine: `import Button from "$lib/components/button";`,
43
+ files: map[string]string{
44
+ "frontend/package.json": `{}`,
45
+ "frontend/tsconfig.json": "{\n // SvelteKit generates the inherited aliases.\n \"extends\": \"./.svelte-kit/tsconfig.json\"\n}",
46
+ "frontend/.svelte-kit/tsconfig.json": `{"compilerOptions":{"paths":{"$lib/*":["../src/lib/*"]}}}`,
47
+ },
48
+ },
49
+ {
50
+ name: "exact alias",
51
+ sourcePath: "frontend/src/example.ts",
52
+ importLine: `import library from "$lib";`,
53
+ files: map[string]string{
54
+ "frontend/package.json": `{}`,
55
+ "frontend/tsconfig.json": `{"compilerOptions":{"paths":{"$lib":["./src/lib"]}}}`,
56
+ },
57
+ },
58
+ {
59
+ name: "package shaped alias",
60
+ sourcePath: "frontend/src/example.svelte",
61
+ importLine: `import { css } from "styled-system/css";`,
62
+ files: map[string]string{
63
+ "frontend/package.json": `{}`,
64
+ "frontend/jsconfig.json": `{"compilerOptions":{"paths":{"styled-system/*":["./styled-system/*"]}}}`,
65
+ },
66
+ },
67
+ {
68
+ name: "undeclared dependency",
69
+ sourcePath: "frontend/src/example.ts",
70
+ importLine: `import missing from "definitely-missing-package";`,
71
+ files: map[string]string{"frontend/package.json": `{}`},
72
+ wantCode: 3,
73
+ wantFinding: "definitely-missing-package",
74
+ },
75
+ {
76
+ name: "sibling isolation",
77
+ sourcePath: "workspace-a/src/example.ts",
78
+ importLine: `import sibling from "sibling-only-package";`,
79
+ files: map[string]string{
80
+ "workspace-a/package.json": `{}`,
81
+ "workspace-b/package.json": `{"dependencies":{"sibling-only-package":"1.0.0"}}`,
82
+ },
83
+ wantCode: 3,
84
+ wantFinding: "sibling-only-package",
85
+ },
86
+ {
87
+ name: "malformed config does not allow alias",
88
+ sourcePath: "frontend/src/example.ts",
89
+ importLine: `import { css } from "styled-system/css";`,
90
+ files: map[string]string{
91
+ "frontend/package.json": `{}`,
92
+ "frontend/tsconfig.json": `{"compilerOptions":{"paths":{"styled-system/*":["./styled-system/*"]}}`,
93
+ },
94
+ wantCode: 3,
95
+ wantFinding: "styled-system",
96
+ },
97
+ }
98
+
99
+ for _, test := range tests {
100
+ t.Run(test.name, func(t *testing.T) {
101
+ repo := t.TempDir()
102
+ writePackageExistenceFile(t, repo, "Cargo.toml", "[package]\nname = \"fixture\"\nversion = \"0.1.0\"\n")
103
+ writePackageExistenceFile(t, repo, test.sourcePath, "// baseline\n")
104
+ for path, content := range test.files {
105
+ writePackageExistenceFile(t, repo, path, content+"\n")
106
+ }
107
+ gitPackageExistence(t, repo, "init", "-q")
108
+ gitPackageExistence(t, repo, "config", "user.email", "test@example.com")
109
+ gitPackageExistence(t, repo, "config", "user.name", "Test")
110
+ gitPackageExistence(t, repo, "add", ".")
111
+ gitPackageExistence(t, repo, "commit", "-qm", "baseline")
112
+ if err := os.MkdirAll(featureDir(repo, "feat"), 0o755); err != nil {
113
+ t.Fatal(err)
114
+ }
115
+ writePackageExistenceFile(t, repo, test.sourcePath, "// baseline\n"+test.importLine+"\n")
116
+ t.Chdir(filepath.Join(repo, test.workingDir))
117
+
118
+ var stdout, stderr bytes.Buffer
119
+ gotCode := PackageExistence(repo, []string{"feat"}, &stdout, &stderr)
120
+ if gotCode != test.wantCode {
121
+ t.Fatalf("code = %d, want %d\nstdout: %s\nstderr: %s", gotCode, test.wantCode, stdout.String(), stderr.String())
122
+ }
123
+ if test.wantFinding != "" && !strings.Contains(stderr.String(), test.wantFinding) {
124
+ t.Fatalf("stderr does not name %q: %s", test.wantFinding, stderr.String())
125
+ }
126
+ })
127
+ }
128
+ }
129
+
130
+ func TestPackageExistenceNonJavaScriptWorkspaces(t *testing.T) {
131
+ tests := []struct {
132
+ name string
133
+ sourcePath string
134
+ addedSource string
135
+ files map[string]string
136
+ wantCode int
137
+ wantFinding string
138
+ }{
139
+ {
140
+ name: "go import block rejects undeclared module",
141
+ sourcePath: "main.go",
142
+ addedSource: "package main\n\nimport (\n\t\"definitely.invalid/missing\"\n)\n",
143
+ files: map[string]string{"go.mod": "module example.com/app\n\ngo 1.26\n"},
144
+ wantCode: 3,
145
+ wantFinding: "definitely.invalid/missing",
146
+ },
147
+ {
148
+ name: "go modules do not collide by hostname",
149
+ sourcePath: "main.go",
150
+ addedSource: "package main\n\nimport \"github.com/evil/missing\"\n",
151
+ files: map[string]string{"go.mod": "module example.com/app\n\ngo 1.26\n\nrequire github.com/good/pkg v1.0.0\n"},
152
+ wantCode: 3,
153
+ wantFinding: "github.com/evil/missing",
154
+ },
155
+ {
156
+ name: "nested go module declaration",
157
+ sourcePath: "backend/main.go",
158
+ addedSource: "package main\n\nimport \"github.com/good/pkg/sub\"\n",
159
+ files: map[string]string{
160
+ "Cargo.toml": "[package]\nname = \"root\"\nversion = \"0.1.0\"\n",
161
+ "backend/go.mod": "module example.com/backend\n\ngo 1.26\n\nrequire github.com/good/pkg v1.0.0\n",
162
+ },
163
+ },
164
+ {
165
+ name: "go standard library subpackage",
166
+ sourcePath: "main.go",
167
+ addedSource: "package main\n\nimport \"encoding/json\"\n",
168
+ files: map[string]string{"go.mod": "module example.com/app\n\ngo 1.26\n"},
169
+ },
170
+ {
171
+ name: "go standard library typo remains undeclared",
172
+ sourcePath: "main.go",
173
+ addedSource: "package main\n\nimport \"encoding/josn\"\n",
174
+ files: map[string]string{"go.mod": "module example.com/app\n\ngo 1.26\n"},
175
+ wantCode: 3,
176
+ wantFinding: "encoding/josn",
177
+ },
178
+ {
179
+ name: "malformed go manifest does not declare import",
180
+ sourcePath: "main.go",
181
+ addedSource: "package main\n\nimport \"github.com/missing/pkg\"\n",
182
+ files: map[string]string{"go.mod": "module example.com/app\n\ngo 1.26\n\nrequire (\n github.com/missing/pkg v1.0.0\n"},
183
+ wantCode: 3,
184
+ wantFinding: "github.com/missing/pkg",
185
+ },
186
+ {
187
+ name: "rust rejects undeclared crate",
188
+ sourcePath: "src/main.rs",
189
+ addedSource: "use definitely_missing_crate::Thing;\n",
190
+ files: map[string]string{"Cargo.toml": "[package]\nname = \"fixture\"\nversion = \"0.1.0\"\n\n[dependencies]\n"},
191
+ wantCode: 3,
192
+ wantFinding: "definitely_missing_crate",
193
+ },
194
+ {
195
+ name: "nested rust dependency and hyphen normalization",
196
+ sourcePath: "crates/app/src/main.rs",
197
+ addedSource: "use serde_json::Value;\n",
198
+ files: map[string]string{
199
+ "Cargo.toml": "[workspace]\nmembers = [\"crates/app\"]\n",
200
+ "crates/app/Cargo.toml": "[package]\nname = \"app\"\nversion = \"0.1.0\"\n\n[dependencies.serde-json]\nversion = \"1\"\n",
201
+ },
202
+ },
203
+ {
204
+ name: "python dotted import uses top-level module",
205
+ sourcePath: "app.py",
206
+ addedSource: "from requests.sessions import Session\n",
207
+ files: map[string]string{"requirements.txt": "requests==2.32.0\n"},
208
+ },
209
+ {
210
+ name: "python standard library module",
211
+ sourcePath: "app.py",
212
+ addedSource: "import asyncio\n",
213
+ files: map[string]string{"requirements.txt": "requests==2.32.0\n"},
214
+ },
215
+ {
216
+ name: "nested python manifest declaration",
217
+ sourcePath: "backend/app.py",
218
+ addedSource: "import requests\n",
219
+ files: map[string]string{
220
+ "Cargo.toml": "[package]\nname = \"root\"\nversion = \"0.1.0\"\n",
221
+ "backend/requirements.txt": "requests==2.32.0\n",
222
+ },
223
+ },
224
+ {
225
+ name: "pyproject dependency declaration",
226
+ sourcePath: "service/app.py",
227
+ addedSource: "import requests\n",
228
+ files: map[string]string{
229
+ "service/pyproject.toml": "[project]\ndependencies = [\n \"requests[socks]>=2.32\",\n]\n",
230
+ },
231
+ },
232
+ {
233
+ name: "pipfile dependency declaration",
234
+ sourcePath: "service/app.py",
235
+ addedSource: "import requests\n",
236
+ files: map[string]string{
237
+ "service/Pipfile": "[packages]\nrequests = \"*\"\n",
238
+ },
239
+ },
240
+ {
241
+ name: "malformed pyproject does not declare import",
242
+ sourcePath: "service/app.py",
243
+ addedSource: "import definitely_missing\n",
244
+ files: map[string]string{
245
+ "service/pyproject.toml": "[project]\ndependencies = [\n \"definitely_missing\"\n",
246
+ },
247
+ wantCode: 3,
248
+ wantFinding: "definitely_missing",
249
+ },
250
+ {
251
+ name: "python multiple imports reject undeclared module",
252
+ sourcePath: "app.py",
253
+ addedSource: "import requests, definitely_missing\n",
254
+ files: map[string]string{"requirements.txt": "requests==2.32.0\n"},
255
+ wantCode: 3,
256
+ wantFinding: "definitely_missing",
257
+ },
258
+ {
259
+ name: "comments and other ecosystems do not declare python imports",
260
+ sourcePath: "app.py",
261
+ addedSource: "import definitely_missing\n",
262
+ files: map[string]string{
263
+ "Cargo.toml": "[package]\nname = \"definitely_missing\"\nversion = \"0.1.0\"\n",
264
+ "requirements.txt": "# definitely_missing is intentionally absent\n",
265
+ },
266
+ wantCode: 3,
267
+ wantFinding: "definitely_missing",
268
+ },
269
+ }
270
+
271
+ for _, test := range tests {
272
+ t.Run(test.name, func(t *testing.T) {
273
+ repo := t.TempDir()
274
+ for path, content := range test.files {
275
+ writePackageExistenceFile(t, repo, path, content)
276
+ }
277
+ writePackageExistenceFile(t, repo, test.sourcePath, "// baseline\n")
278
+ gitPackageExistence(t, repo, "init", "-q")
279
+ gitPackageExistence(t, repo, "config", "user.email", "test@example.com")
280
+ gitPackageExistence(t, repo, "config", "user.name", "Test")
281
+ gitPackageExistence(t, repo, "add", ".")
282
+ gitPackageExistence(t, repo, "commit", "-qm", "baseline")
283
+ if err := os.MkdirAll(featureDir(repo, "feat"), 0o755); err != nil {
284
+ t.Fatal(err)
285
+ }
286
+ writePackageExistenceFile(t, repo, test.sourcePath, test.addedSource)
287
+ t.Chdir(repo)
288
+
289
+ var stdout, stderr bytes.Buffer
290
+ gotCode := PackageExistence(repo, []string{"feat"}, &stdout, &stderr)
291
+ if gotCode != test.wantCode {
292
+ t.Fatalf("code = %d, want %d\nstdout: %s\nstderr: %s", gotCode, test.wantCode, stdout.String(), stderr.String())
293
+ }
294
+ if test.wantFinding != "" && !strings.Contains(stderr.String(), test.wantFinding) {
295
+ t.Fatalf("stderr does not name %q: %s", test.wantFinding, stderr.String())
296
+ }
297
+ })
298
+ }
299
+ }
300
+
301
+ func TestPackageExistenceGenericResolverFailsClosed(t *testing.T) {
302
+ repo := t.TempDir()
303
+ writePackageExistenceFile(t, repo, "package.json", `{"dependencies":{"definitely-missing-package":"1.0.0"}}`)
304
+ writePackageExistenceFile(t, repo, "src/example.custom", "// baseline\n")
305
+ gitPackageExistence(t, repo, "init", "-q")
306
+ gitPackageExistence(t, repo, "config", "user.email", "test@example.com")
307
+ gitPackageExistence(t, repo, "config", "user.name", "Test")
308
+ gitPackageExistence(t, repo, "add", ".")
309
+ gitPackageExistence(t, repo, "commit", "-qm", "baseline")
310
+ if err := os.MkdirAll(featureDir(repo, "feat"), 0o755); err != nil {
311
+ t.Fatal(err)
312
+ }
313
+ writePackageExistenceFile(t, repo, "src/example.custom", "import \"definitely-missing-package\"\n")
314
+ t.Chdir(repo)
315
+
316
+ var stdout, stderr bytes.Buffer
317
+ gotCode := PackageExistence(repo, []string{"feat"}, &stdout, &stderr)
318
+ if gotCode != 3 {
319
+ t.Fatalf("code = %d, want 3\nstdout: %s\nstderr: %s", gotCode, stdout.String(), stderr.String())
320
+ }
321
+ if !strings.Contains(stderr.String(), "definitely-missing-package") {
322
+ t.Fatalf("stderr does not name unresolved import: %s", stderr.String())
323
+ }
324
+ }
325
+
326
+ func writePackageExistenceFile(t *testing.T, root, path, content string) {
327
+ t.Helper()
328
+ fullPath := filepath.Join(root, filepath.FromSlash(path))
329
+ if err := os.MkdirAll(filepath.Dir(fullPath), 0o755); err != nil {
330
+ t.Fatal(err)
331
+ }
332
+ if err := os.WriteFile(fullPath, []byte(content), 0o644); err != nil {
333
+ t.Fatal(err)
334
+ }
335
+ }
336
+
337
+ func gitPackageExistence(t *testing.T, root string, args ...string) {
338
+ t.Helper()
339
+ cmd := exec.Command("git", append([]string{"-C", root}, args...)...)
340
+ if out, err := cmd.CombinedOutput(); err != nil {
341
+ t.Fatalf("git %s: %v\n%s", strings.Join(args, " "), err, out)
342
+ }
343
+ }
@@ -11,7 +11,7 @@ import (
11
11
  "github.com/devrites/devrites/internal/workflow"
12
12
  )
13
13
 
14
- // spaceChars is the POSIX [[:space:]] set under the C locale the collation the
14
+ // spaceChars is the POSIX [[:space:]] set under the C locale: the collation the
15
15
  // parity oracle pins (LC_ALL=C), so trimming matches the bash awk/sed exactly.
16
16
  const spaceChars = " \t\n\v\f\r"
17
17
 
@@ -22,7 +22,7 @@ func featureDir(root, slug string) string {
22
22
  }
23
23
 
24
24
  // activeSlug reads the active-feature pointer at <root>/ACTIVE (trimmed), or ""
25
- // when absent the new-schema replacement for the old .devrites/ACTIVE lookup.
25
+ // when absent: the new-schema replacement for the old .devrites/ACTIVE lookup.
26
26
  func activeSlug(root string) string {
27
27
  slug, err := devritespaths.ActiveSlug(root)
28
28
  if err != nil {
@@ -32,7 +32,7 @@ func activeSlug(root string) string {
32
32
  }
33
33
 
34
34
  // preambleArtifacts is the fixed order preamble.sh scans for present artifacts.
35
- // It is NOT sorted the display order is the workflow order, so the port keeps
35
+ // It is NOT sorted: the display order is the workflow order, so the port keeps
36
36
  // the literal list.
37
37
  var preambleArtifacts = []string{
38
38
  "brief", "spec", "references", "strategy", "plan", "tasks", "eng-review",
@@ -41,7 +41,7 @@ var preambleArtifacts = []string{
41
41
  "polish-report", "review", "seal", "ship", "handoff",
42
42
  }
43
43
 
44
- // Preamble prints the active feature's workspace state the orientation every
44
+ // Preamble prints the active feature's workspace state: the orientation every
45
45
  // workspace-operating rite-* skill runs first (step 0). Read-only. root is the
46
46
  // .devrites directory; slug defaults to the active feature at <root>/ACTIVE.
47
47
  // Always exits 0: orientation is never a hard dependency.
@@ -63,7 +63,7 @@ func Preamble(root string, args []string, stdout, stderr io.Writer) int {
63
63
 
64
64
  if state, err := os.ReadFile(filepath.Join(workDir, "state.md")); err == nil {
65
65
  fmt.Fprintln(stdout, "### state.md")
66
- // Emit the file verbatim, like `cat` no added trailing newline.
66
+ // Emit the file verbatim, like `cat`: no added trailing newline.
67
67
  _, _ = stdout.Write(state)
68
68
  }
69
69
 
@@ -148,7 +148,7 @@ func isHeadingLine(line string) bool {
148
148
 
149
149
  // splitLinesNoTrailing splits data into lines on '\n', dropping a single trailing
150
150
  // newline's empty final element so a "\n"-terminated file yields N lines, not N+1
151
- // matching how awk/grep iterate records.
151
+ // : matching how awk/grep iterate records.
152
152
  func splitLinesNoTrailing(data []byte) []string {
153
153
  s := string(data)
154
154
  s = strings.TrimSuffix(s, "\n")
@@ -12,18 +12,18 @@ import (
12
12
  )
13
13
 
14
14
  // State-parsing patterns ported verbatim from progress.sh's awk. Each name-strip
15
- // sub is anchored (^ or $), so it matches at most once per line ReplaceAllString
15
+ // sub is anchored (^ or $), so it matches at most once per line: ReplaceAllString
16
16
  // is therefore equivalent to awk's single-match sub.
17
17
  var (
18
18
  sliceCheckRe = regexp.MustCompile(`^- \[[^\]]*\][[:space:]]*`) // drop "- [x] "
19
19
  sliceNameRe = regexp.MustCompile(`^Slice[[:space:]]*[0-9]+:[[:space:]]*`) // drop "Slice N: "
20
20
  sliceStateRe = regexp.MustCompile(`[[:space:]]+(built|pending)[[:space:]]*$`)
21
- sliceSepRe = regexp.MustCompile(`[[:space:]]+[^[:alnum:][:space:]]+[[:space:]]*$`) // drop " "
21
+ sliceSepRe = regexp.MustCompile(`[[:space:]]+[^[:alnum:][:space:]]+[[:space:]]*$`) // drop " · "
22
22
  sliceCheckedRe = regexp.MustCompile(`\[[xX]\]`)
23
23
  sliceHeadingRe = regexp.MustCompile(`^##[[:space:]]+(SLICE-[0-9]{3})(?:[[:space:]]+(.*))?$`)
24
24
  )
25
25
 
26
- // Progress renders the active feature's position the deterministic footer every
26
+ // Progress renders the active feature's position: the deterministic footer every
27
27
  // workspace-operating rite-* skill prints last. Read-only. Prints nothing and
28
28
  // exits 0 when there is no active workspace, so pre-spec callers stay silent. root
29
29
  // is the .devrites directory; slug defaults to the active feature at <root>/ACTIVE.
@@ -38,7 +38,7 @@ func Progress(root string, args []string, stdout, stderr io.Writer) int {
38
38
  workDir := featureDir(root, slug)
39
39
  statePath := filepath.Join(workDir, "state.md")
40
40
  if slug == "" || !isFile(statePath) {
41
- return 0 // silent no active workspace
41
+ return 0 // silent: no active workspace
42
42
  }
43
43
  stateBytes, err := os.ReadFile(statePath)
44
44
  if err != nil {
@@ -180,7 +180,7 @@ func parsePhase(lines []string) string {
180
180
  }
181
181
 
182
182
  // tallySlices reads the "## Slice progress" block: total slice lines, how many are
183
- // checked, and the display name of the last checked one the awk in progress.sh.
183
+ // checked, and the display name of the last checked one: the awk in progress.sh.
184
184
  func tallySlices(lines []string) (total, built int, lastbuilt string) {
185
185
  inp := false
186
186
  for _, line := range lines {
@@ -9,7 +9,7 @@ import (
9
9
  "strings"
10
10
  )
11
11
 
12
- // Reconcile enforces that the orchestrator never edits source itself only the
12
+ // Reconcile enforces that the orchestrator never edits source itself: only the
13
13
  // dispatched slice-wright writes code and tests, while the orchestrator writes
14
14
  // bookkeeping under .devrites/. `snapshot` records the working tree just before
15
15
  // the wright runs; `check` diffs it afterward and flags any changed path that is
@@ -17,8 +17,8 @@ import (
17
17
  // <root>/features/<slug>.
18
18
  //
19
19
  // 0 clean check, snapshot written, inline fallback, or skipped (not a git repo)
20
- // 5 VIOLATION source changed outside the wright's claimed set
21
- // 6 setup error bad args, missing snapshot, or missing claimed manifest
20
+ // 5 VIOLATION: source changed outside the wright's claimed set
21
+ // 6 setup error: bad args, missing snapshot, or missing claimed manifest
22
22
  func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
23
23
  mode := argAt(args, 0)
24
24
  slug := argAt(args, 1)
@@ -29,7 +29,7 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
29
29
  cwd, _ := os.Getwd()
30
30
  gitRoot := gitToplevel(cwd)
31
31
  if gitRoot == "" {
32
- fmt.Fprintln(stderr, "reconcile: not a git repo gate skipped, verify the diff by hand.")
32
+ fmt.Fprintln(stderr, "reconcile: not a git repo: gate skipped, verify the diff by hand.")
33
33
  return 0
34
34
  }
35
35
 
@@ -37,28 +37,37 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
37
37
  base := filepath.Join(d, ".reconcile-base")
38
38
  claimed := filepath.Join(d, ".reconcile-claimed")
39
39
  inline := filepath.Join(d, ".reconcile-inline")
40
+ objects := filepath.Join(d, ".reconcile-objects")
40
41
 
41
42
  if slug == "" || !isDir(d) {
42
43
  s := slug
43
44
  if s == "" {
44
45
  s = "<unset>"
45
46
  }
46
- fmt.Fprintf(stderr, "reconcile: no active workspace (slug=%s) nothing to reconcile.\n", s)
47
+ fmt.Fprintf(stderr, "reconcile: no active workspace (slug=%s): nothing to reconcile.\n", s)
47
48
  return 6
48
49
  }
49
50
 
50
- closeWindow := func() { _ = os.Remove(base); _ = os.Remove(claimed); _ = os.Remove(inline) }
51
+ closeWindow := func() {
52
+ _ = os.Remove(base)
53
+ _ = os.Remove(claimed)
54
+ _ = os.Remove(inline)
55
+ _ = os.RemoveAll(objects)
56
+ }
51
57
 
52
58
  switch mode {
53
59
  case "snapshot":
54
60
  _ = os.Remove(inline) // clear any stale sentinel / prior-slice manifest
55
61
  _ = os.Remove(claimed)
56
- tree, err := worktreeTree(gitRoot)
62
+ _ = os.RemoveAll(objects)
63
+ tree, err := worktreeTree(gitRoot, objects)
57
64
  if err != nil {
65
+ _ = os.RemoveAll(objects)
58
66
  fmt.Fprintf(stderr, "reconcile: cannot snapshot worktree: %v\n", err)
59
67
  return 6
60
68
  }
61
69
  if err := os.WriteFile(base, []byte(tree+"\n"), 0o644); err != nil {
70
+ _ = os.RemoveAll(objects)
62
71
  fmt.Fprintf(stderr, "reconcile: cannot write snapshot: %v\n", err)
63
72
  return 6
64
73
  }
@@ -67,16 +76,16 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
67
76
 
68
77
  case "check":
69
78
  if isFile(inline) {
70
- fmt.Fprintln(stderr, "reconcile: inline-fallback run (no wright dispatched) gate skipped.")
79
+ fmt.Fprintln(stderr, "reconcile: inline-fallback run (no wright dispatched): gate skipped.")
71
80
  closeWindow()
72
81
  return 0
73
82
  }
74
83
  if !isFile(base) {
75
- fmt.Fprintln(stderr, `reconcile: no snapshot (.reconcile-base) run "devrites-engine reconcile snapshot" before dispatch.`)
84
+ fmt.Fprintln(stderr, `reconcile: no snapshot (.reconcile-base): run "devrites-engine reconcile snapshot" before dispatch.`)
76
85
  return 6
77
86
  }
78
87
  if !isFile(claimed) {
79
- fmt.Fprintln(stderr, "reconcile: no claimed manifest (.reconcile-claimed) write the wright Files-changed paths first.")
88
+ fmt.Fprintln(stderr, "reconcile: no claimed manifest (.reconcile-claimed): write the wright Files-changed paths first.")
80
89
  return 6
81
90
  }
82
91
  baseBytes, err := os.ReadFile(base)
@@ -86,19 +95,34 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
86
95
  }
87
96
  baseTree := strings.TrimSpace(string(baseBytes))
88
97
  if baseTree == "" {
89
- fmt.Fprintln(stderr, "reconcile: empty snapshot (.reconcile-base) re-run \"devrites-engine reconcile snapshot\" before dispatch.")
98
+ fmt.Fprintln(stderr, "reconcile: empty snapshot (.reconcile-base): re-run \"devrites-engine reconcile snapshot\" before dispatch.")
99
+ return 6
100
+ }
101
+ if !isDir(objects) {
102
+ fmt.Fprintln(stderr, "reconcile: missing snapshot object database (.reconcile-objects): re-run \"devrites-engine reconcile snapshot\" before dispatch.")
90
103
  return 6
91
104
  }
92
- nowTree, err := worktreeTree(gitRoot)
105
+ nowTree, err := worktreeTree(gitRoot, objects)
93
106
  if err != nil {
94
107
  fmt.Fprintf(stderr, "reconcile: cannot capture worktree: %v\n", err)
95
108
  return 6
96
109
  }
110
+ diff := exec.Command("git", "-C", gitRoot, "diff", "--name-only", baseTree, nowTree)
111
+ diff.Env, err = reconcileGitEnv(gitRoot, objects)
112
+ if err != nil {
113
+ fmt.Fprintf(stderr, "reconcile: cannot compare worktree: %v\n", err)
114
+ return 6
115
+ }
116
+ diffOut, err := diff.CombinedOutput()
117
+ if err != nil {
118
+ fmt.Fprintf(stderr, "reconcile: cannot compare worktree: git diff --name-only: %v: %s\n", err, strings.TrimSpace(string(diffOut)))
119
+ return 6
120
+ }
97
121
 
98
122
  claimedSet := claimedPaths(claimed)
99
123
  viol := 0
100
124
  var violist strings.Builder
101
- for _, f := range gitDiffNames(gitRoot, baseTree, nowTree) {
125
+ for _, f := range splitLinesNoTrailing(diffOut) {
102
126
  if f == "" || strings.HasPrefix(f, ".devrites/") {
103
127
  continue
104
128
  }
@@ -108,13 +132,13 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
108
132
  }
109
133
  }
110
134
  if viol > 0 {
111
- fmt.Fprintf(stderr, "reconcile: STOP %d source file(s) changed OUTSIDE the wright (A1 breach):\n", viol)
135
+ fmt.Fprintf(stderr, "reconcile: STOP: %d source file(s) changed OUTSIDE the wright (A1 breach):\n", viol)
112
136
  fmt.Fprint(stderr, violist.String())
113
137
  fmt.Fprintln(stderr, "The orchestrator must NOT edit source. Re-dispatch the wright (continue it once) or revert these.")
114
138
  return 5
115
139
  }
116
140
  closeWindow()
117
- fmt.Fprintln(stdout, "reconcile: OK every source change is the wright's; orchestrator touched only bookkeeping.")
141
+ fmt.Fprintln(stdout, "reconcile: OK: every source change is the wright's; orchestrator touched only bookkeeping.")
118
142
  return 0
119
143
 
120
144
  default:
@@ -132,23 +156,36 @@ func Reconcile(root string, args []string, stdout, stderr io.Writer) int {
132
156
  // snapshot and the check would then record that same sha, the diff would come
133
157
  // back empty, and the gate would report OK on precisely the A1 breach it exists
134
158
  // to catch. Surface the error and let the caller fail closed.
135
- func worktreeTree(gitRoot string) (string, error) {
159
+ func worktreeTree(gitRoot, objectDir string) (string, error) {
136
160
  idx := filepath.Join(os.TempDir(), fmt.Sprintf("devrites-reconcile-%d.idx", os.Getpid()))
137
161
  _ = os.Remove(idx)
138
162
  defer func() { _ = os.Remove(idx) }()
139
- env := append(os.Environ(), "GIT_INDEX_FILE="+idx)
163
+ if err := os.MkdirAll(objectDir, 0o700); err != nil {
164
+ return "", fmt.Errorf("create object directory: %w", err)
165
+ }
166
+ env, err := reconcileGitEnv(gitRoot, objectDir)
167
+ if err != nil {
168
+ return "", err
169
+ }
170
+ env = append(env, "GIT_INDEX_FILE="+idx)
140
171
 
141
172
  add := exec.Command("git", "-C", gitRoot, "add", "-A")
142
173
  add.Env = env
143
- add.Stdout, add.Stderr = io.Discard, io.Discard
144
- if err := add.Run(); err != nil {
174
+ addOut, err := add.CombinedOutput()
175
+ if err != nil {
176
+ if detail := strings.TrimSpace(string(addOut)); detail != "" {
177
+ return "", fmt.Errorf("git add -A: %w: %s", err, detail)
178
+ }
145
179
  return "", fmt.Errorf("git add -A: %w", err)
146
180
  }
147
181
 
148
182
  write := exec.Command("git", "-C", gitRoot, "write-tree")
149
183
  write.Env = env
150
- out, err := write.Output()
184
+ out, err := write.CombinedOutput()
151
185
  if err != nil {
186
+ if detail := strings.TrimSpace(string(out)); detail != "" {
187
+ return "", fmt.Errorf("git write-tree: %w: %s", err, detail)
188
+ }
152
189
  return "", fmt.Errorf("git write-tree: %w", err)
153
190
  }
154
191
  tree := strings.TrimSpace(string(out))
@@ -158,6 +195,29 @@ func worktreeTree(gitRoot string) (string, error) {
158
195
  return tree, nil
159
196
  }
160
197
 
198
+ func reconcileGitEnv(gitRoot, objectDir string) ([]string, error) {
199
+ common := exec.Command("git", "-C", gitRoot, "rev-parse", "--git-common-dir")
200
+ out, err := common.CombinedOutput()
201
+ if err != nil {
202
+ return nil, fmt.Errorf("git rev-parse --git-common-dir: %w: %s", err, strings.TrimSpace(string(out)))
203
+ }
204
+ commonDir := strings.TrimSpace(string(out))
205
+ if !filepath.IsAbs(commonDir) {
206
+ commonDir = filepath.Join(gitRoot, commonDir)
207
+ }
208
+ alternates := []string{filepath.Join(commonDir, "objects")}
209
+ if inherited := os.Getenv("GIT_OBJECT_DIRECTORY"); inherited != "" {
210
+ alternates = append(alternates, inherited)
211
+ }
212
+ if inherited := os.Getenv("GIT_ALTERNATE_OBJECT_DIRECTORIES"); inherited != "" {
213
+ alternates = append(alternates, inherited)
214
+ }
215
+ return append(os.Environ(),
216
+ "GIT_OBJECT_DIRECTORY="+objectDir,
217
+ "GIT_ALTERNATE_OBJECT_DIRECTORIES="+strings.Join(alternates, string(os.PathListSeparator)),
218
+ ), nil
219
+ }
220
+
161
221
  // claimedPaths reads the .reconcile-claimed manifest into a set of the exact
162
222
  // paths the wright reported changing.
163
223
  func claimedPaths(path string) map[string]struct{} {