devrites 2.6.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1078) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/README.md +85 -50
  3. package/SECURITY.md +65 -39
  4. package/bin/devrites.mjs +135 -51
  5. package/docs/agents/domain.md +58 -0
  6. package/docs/agents/issue-driven-rites.md +11 -0
  7. package/docs/agents/issue-tracker.md +29 -0
  8. package/docs/agents/triage-labels.md +15 -0
  9. package/docs/architecture.md +60 -35
  10. package/docs/capability-surface-selection.md +18 -0
  11. package/docs/cli.md +53 -0
  12. package/docs/command-map.md +59 -22
  13. package/docs/engine/agent-contract.md +92 -0
  14. package/docs/engine/commands.md +323 -0
  15. package/docs/engine/state-schema.md +134 -0
  16. package/docs/engine/workspace-schema.md +150 -0
  17. package/docs/extensions.md +178 -0
  18. package/docs/flow.md +19 -16
  19. package/docs/harness-compliance.md +45 -0
  20. package/docs/orchestration.md +6 -4
  21. package/docs/porting-to-a-new-harness.md +27 -0
  22. package/docs/quick-reference.md +22 -0
  23. package/docs/release.md +3 -3
  24. package/docs/skills.md +42 -48
  25. package/docs/usage.md +21 -8
  26. package/engine/.gosec.json +5 -0
  27. package/engine/Makefile +64 -0
  28. package/engine/commands.go +195 -0
  29. package/engine/go.mod +5 -0
  30. package/engine/harnessmatrix.go +60 -0
  31. package/engine/harnessmatrix_test.go +59 -0
  32. package/engine/hookpolicy.go +114 -0
  33. package/engine/hookpolicy_test.go +64 -0
  34. package/engine/hooks.go +336 -0
  35. package/engine/hooks_events_test.go +106 -0
  36. package/engine/hooks_workspace.go +603 -0
  37. package/engine/internal/devritespaths/paths.go +76 -0
  38. package/engine/internal/doctor/doctor.go +178 -0
  39. package/engine/internal/doctor/doctor_test.go +150 -0
  40. package/engine/internal/fsutil/copy.go +101 -0
  41. package/engine/internal/fsutil/replace_other.go +7 -0
  42. package/engine/internal/fsutil/replace_windows.go +31 -0
  43. package/engine/internal/gate/gate.go +243 -0
  44. package/engine/internal/gate/gate_test.go +145 -0
  45. package/engine/internal/harness/compliance.go +102 -0
  46. package/engine/internal/harness/harness.go +304 -0
  47. package/engine/internal/harness/harness_test.go +104 -0
  48. package/engine/internal/hostpack/hostpack.go +259 -0
  49. package/engine/internal/hostpack/hostpack_test.go +111 -0
  50. package/engine/internal/hostpack/templates/alias_skill.md.tmpl +11 -0
  51. package/engine/internal/hostpack/templates/devrites_readme.md.tmpl +14 -0
  52. package/engine/internal/install/install.go +1560 -0
  53. package/engine/internal/install/install_test.go +564 -0
  54. package/engine/internal/iohooks/detach_other.go +11 -0
  55. package/engine/internal/iohooks/detach_unix.go +11 -0
  56. package/engine/internal/iohooks/iohooks.go +546 -0
  57. package/engine/internal/iohooks/iohooks_test.go +130 -0
  58. package/engine/internal/lib/adoption.go +634 -0
  59. package/engine/internal/lib/adoption_test.go +91 -0
  60. package/engine/internal/lib/analyze.go +225 -0
  61. package/engine/internal/lib/archivesearch.go +93 -0
  62. package/engine/internal/lib/archivesearch_test.go +110 -0
  63. package/engine/internal/lib/budget.go +172 -0
  64. package/engine/internal/lib/buildreadiness.go +88 -0
  65. package/engine/internal/lib/checkacceptance.go +176 -0
  66. package/engine/internal/lib/closeout.go +69 -0
  67. package/engine/internal/lib/command_other.go +7 -0
  68. package/engine/internal/lib/command_unix.go +24 -0
  69. package/engine/internal/lib/context.go +236 -0
  70. package/engine/internal/lib/conventions.go +449 -0
  71. package/engine/internal/lib/coverage.go +147 -0
  72. package/engine/internal/lib/doubtcoverage.go +88 -0
  73. package/engine/internal/lib/evidencefresh.go +85 -0
  74. package/engine/internal/lib/extensions.go +619 -0
  75. package/engine/internal/lib/extensions_test.go +305 -0
  76. package/engine/internal/lib/footprint.go +239 -0
  77. package/engine/internal/lib/jsonout.go +115 -0
  78. package/engine/internal/lib/jsonout_test.go +57 -0
  79. package/engine/internal/lib/lanes.go +106 -0
  80. package/engine/internal/lib/learnings.go +391 -0
  81. package/engine/internal/lib/learnings_inject_test.go +77 -0
  82. package/engine/internal/lib/learnings_remediation_test.go +24 -0
  83. package/engine/internal/lib/ledger.go +298 -0
  84. package/engine/internal/lib/ledger_test.go +162 -0
  85. package/engine/internal/lib/mutationgate.go +85 -0
  86. package/engine/internal/lib/overrides.go +164 -0
  87. package/engine/internal/lib/overrides_test.go +112 -0
  88. package/engine/internal/lib/packageexistence.go +175 -0
  89. package/engine/internal/lib/preamble.go +159 -0
  90. package/engine/internal/lib/progress.go +168 -0
  91. package/engine/internal/lib/reconcile.go +173 -0
  92. package/engine/internal/lib/reconcile_test.go +197 -0
  93. package/engine/internal/lib/resolve.go +376 -0
  94. package/engine/internal/lib/resolve_remediation_test.go +49 -0
  95. package/engine/internal/lib/reviewers.go +143 -0
  96. package/engine/internal/lib/reviewers_test.go +45 -0
  97. package/engine/internal/lib/reviewerstats.go +199 -0
  98. package/engine/internal/lib/reviewerstats_test.go +104 -0
  99. package/engine/internal/lib/reviewintegrity.go +143 -0
  100. package/engine/internal/lib/reviewintegrity_test.go +103 -0
  101. package/engine/internal/lib/runbook.go +292 -0
  102. package/engine/internal/lib/runbook_context_test.go +119 -0
  103. package/engine/internal/lib/session.go +328 -0
  104. package/engine/internal/lib/session_test.go +110 -0
  105. package/engine/internal/lib/specparse.go +125 -0
  106. package/engine/internal/lib/specskeleton.go +79 -0
  107. package/engine/internal/lib/specvalidate.go +391 -0
  108. package/engine/internal/lib/specvalidate_test.go +185 -0
  109. package/engine/internal/lib/stuck.go +206 -0
  110. package/engine/internal/lib/templates/conventions_drift.tmpl +6 -0
  111. package/engine/internal/lib/templates/conventions_ledger_header.md +6 -0
  112. package/engine/internal/lib/templates/conventions_orient_header.txt +1 -0
  113. package/engine/internal/lib/testintegrity.go +203 -0
  114. package/engine/internal/lib/testintegrity_test.go +72 -0
  115. package/engine/internal/lib/tickafk.go +99 -0
  116. package/engine/internal/lib/util.go +68 -0
  117. package/engine/internal/migrate/migrate.go +213 -0
  118. package/engine/internal/migrate/migrate_test.go +105 -0
  119. package/engine/internal/orient/firstrun.go +50 -0
  120. package/engine/internal/orient/firstrun_test.go +72 -0
  121. package/engine/internal/orient/orient.go +69 -0
  122. package/engine/internal/orient/orient_test.go +25 -0
  123. package/engine/internal/profile/profile.go +270 -0
  124. package/engine/internal/state/concurrency_test.go +184 -0
  125. package/engine/internal/state/feature.go +309 -0
  126. package/engine/internal/state/lock_other.go +24 -0
  127. package/engine/internal/state/lock_unix.go +35 -0
  128. package/engine/internal/state/lock_windows.go +56 -0
  129. package/engine/internal/state/schema.go +102 -0
  130. package/engine/internal/state/snapshot.go +384 -0
  131. package/engine/internal/state/state_test.go +260 -0
  132. package/engine/internal/state/status.go +90 -0
  133. package/engine/internal/state/write.go +59 -0
  134. package/engine/internal/testutil/testutil.go +66 -0
  135. package/engine/internal/version/version.go +57 -0
  136. package/engine/internal/workflow/commands.go +64 -0
  137. package/engine/main.go +530 -0
  138. package/engine/profile_test.go +76 -0
  139. package/engine/subagent_orient_context.txt +6 -0
  140. package/engine/testdata/fixtures/basic/devrites-root/features/auth-tokens/decisions.md +4 -0
  141. package/engine/testdata/fixtures/basic/devrites-root/features/auth-tokens/feature.md +8 -0
  142. package/engine/testdata/fixtures/basic/devrites-root/features/auth-tokens/plan.md +5 -0
  143. package/engine/testdata/fixtures/basic/devrites-root/features/auth-tokens/spec.md +6 -0
  144. package/engine/testdata/fixtures/basic/devrites-root/features/auth-tokens/status.md +4 -0
  145. package/engine/testdata/fixtures/basic/devrites-root/features/auth-tokens/tasks.md +1 -0
  146. package/engine/testdata/fixtures/basic/devrites-root/features/search-ranking/feature.md +8 -0
  147. package/engine/testdata/fixtures/basic/devrites-root/features/search-ranking/spec.md +6 -0
  148. package/engine/testdata/golden/TestParityA1Guard/devrites-edit-allowed.golden +1 -0
  149. package/engine/testdata/golden/TestParityA1Guard/inline-fallback-silent.golden +1 -0
  150. package/engine/testdata/golden/TestParityA1Guard/no-window-silent.golden +1 -0
  151. package/engine/testdata/golden/TestParityA1Guard/non-edit-tool.golden +1 -0
  152. package/engine/testdata/golden/TestParityA1Guard/observe-mode-silent.golden +1 -0
  153. package/engine/testdata/golden/TestParityA1Guard/source-edit-enforce-denies.golden +2 -0
  154. package/engine/testdata/golden/TestParityA1Guard/subagent-allowed.golden +1 -0
  155. package/engine/testdata/golden/TestParityAnalyze/noactive.golden +1 -0
  156. package/engine/testdata/golden/TestParityAnalyze/slug=covered.golden +15 -0
  157. package/engine/testdata/golden/TestParityAnalyze/slug=dangling.golden +16 -0
  158. package/engine/testdata/golden/TestParityAnalyze/slug=ghost.golden +1 -0
  159. package/engine/testdata/golden/TestParityAnalyze/slug=noac.golden +15 -0
  160. package/engine/testdata/golden/TestParityAnalyze/slug=order.golden +17 -0
  161. package/engine/testdata/golden/TestParityAnalyze/slug=orphan.golden +16 -0
  162. package/engine/testdata/golden/TestParityAnalyze/slug=uncovered.golden +16 -0
  163. package/engine/testdata/golden/TestParityBudget/default-active.golden +4 -0
  164. package/engine/testdata/golden/TestParityBudget/extra-md.golden +5 -0
  165. package/engine/testdata/golden/TestParityBudget/no-active.golden +1 -0
  166. package/engine/testdata/golden/TestParityBudget/no-feature.golden +1 -0
  167. package/engine/testdata/golden/TestParityBudget/over-advisory.golden +6 -0
  168. package/engine/testdata/golden/TestParityBudget/over-strict.golden +6 -0
  169. package/engine/testdata/golden/TestParityBudget/within.golden +6 -0
  170. package/engine/testdata/golden/TestParityBuildReadiness/arg=approved.golden +2 -0
  171. package/engine/testdata/golden/TestParityBuildReadiness/arg=approvenone.golden +1 -0
  172. package/engine/testdata/golden/TestParityBuildReadiness/arg=await.golden +1 -0
  173. package/engine/testdata/golden/TestParityBuildReadiness/arg=blocked.golden +1 -0
  174. package/engine/testdata/golden/TestParityBuildReadiness/arg=emptystatus.golden +2 -0
  175. package/engine/testdata/golden/TestParityBuildReadiness/arg=ghost.golden +1 -0
  176. package/engine/testdata/golden/TestParityBuildReadiness/arg=noapprove.golden +1 -0
  177. package/engine/testdata/golden/TestParityBuildReadiness/arg=trailhash.golden +2 -0
  178. package/engine/testdata/golden/TestParityBuildReadiness/arg=trailpipe.golden +2 -0
  179. package/engine/testdata/golden/TestParityCheckAcceptance/arg=blank-section.golden +1 -0
  180. package/engine/testdata/golden/TestParityCheckAcceptance/arg=empty.golden +1 -0
  181. package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-dropped.golden +1 -0
  182. package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-ok.golden +2 -0
  183. package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-unchecked.golden +1 -0
  184. package/engine/testdata/golden/TestParityCheckAcceptance/arg=id-gap.golden +1 -0
  185. package/engine/testdata/golden/TestParityCheckAcceptance/arg=id-ok.golden +2 -0
  186. package/engine/testdata/golden/TestParityCheckAcceptance/arg=no-seal.golden +1 -0
  187. package/engine/testdata/golden/TestParityCheckAcceptance/arg=no-section.golden +1 -0
  188. package/engine/testdata/golden/TestParityCheckAcceptance/arg=nonexistent.golden +1 -0
  189. package/engine/testdata/golden/TestParityCheckAcceptance.golden +1 -0
  190. package/engine/testdata/golden/TestParityCloseOut/active_pointed_elsewhere.golden +2 -0
  191. package/engine/testdata/golden/TestParityCloseOut/active_slug_cleared.golden +2 -0
  192. package/engine/testdata/golden/TestParityCloseOut/archive_clobber.golden +1 -0
  193. package/engine/testdata/golden/TestParityCloseOut/missing_slug.golden +1 -0
  194. package/engine/testdata/golden/TestParityCloseOut/missing_workspace.golden +1 -0
  195. package/engine/testdata/golden/TestParityCoverage/arg=flat.golden +7 -0
  196. package/engine/testdata/golden/TestParityCoverage/arg=full.golden +10 -0
  197. package/engine/testdata/golden/TestParityCoverage/arg=nonexistent.golden +1 -0
  198. package/engine/testdata/golden/TestParityCoverage/arg=nospec.golden +1 -0
  199. package/engine/testdata/golden/TestParityCoverage/arg=speconly.golden +9 -0
  200. package/engine/testdata/golden/TestParityCoverage.golden +1 -0
  201. package/engine/testdata/golden/TestParityCursor/bare.golden +3 -0
  202. package/engine/testdata/golden/TestParityCursor/full-afk.golden +6 -0
  203. package/engine/testdata/golden/TestParityCursor/full-hitl.golden +5 -0
  204. package/engine/testdata/golden/TestParityCursor/no-active.golden +1 -0
  205. package/engine/testdata/golden/TestParityCursor/red.golden +5 -0
  206. package/engine/testdata/golden/TestParityCursor/zerogates.golden +5 -0
  207. package/engine/testdata/golden/TestParityDoubtCoverage/arg=doubted.golden +2 -0
  208. package/engine/testdata/golden/TestParityDoubtCoverage/arg=ghost.golden +2 -0
  209. package/engine/testdata/golden/TestParityDoubtCoverage/arg=inline.golden +3 -0
  210. package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing-inline.golden +3 -0
  211. package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing.golden +3 -0
  212. package/engine/testdata/golden/TestParityDoubtCoverage/arg=nodoubt.golden +4 -0
  213. package/engine/testdata/golden/TestParityDoubtCoverage/arg=nolog.golden +2 -0
  214. package/engine/testdata/golden/TestParityDoubtCoverage/arg=nowright.golden +2 -0
  215. package/engine/testdata/golden/TestParityDoubtCoverage.golden +1 -0
  216. package/engine/testdata/golden/TestParityLearnings/add.golden +2 -0
  217. package/engine/testdata/golden/TestParityLearnings/list.golden +5 -0
  218. package/engine/testdata/golden/TestParityLearnings/mine-no-archive.golden +2 -0
  219. package/engine/testdata/golden/TestParityLearnings/mine.golden +5 -0
  220. package/engine/testdata/golden/TestParityLearnings/nudge.golden +2 -0
  221. package/engine/testdata/golden/TestParityLearnings/unknown.golden +1 -0
  222. package/engine/testdata/golden/TestParityMutationGate/active-slug.golden +3 -0
  223. package/engine/testdata/golden/TestParityMutationGate/explicit-slug.golden +3 -0
  224. package/engine/testdata/golden/TestParityMutationGate/ghost.golden +1 -0
  225. package/engine/testdata/golden/TestParityOrientSilentPath.golden +1 -0
  226. package/engine/testdata/golden/TestParityPackageExistence/declared.golden +2 -0
  227. package/engine/testdata/golden/TestParityPackageExistence/default-import-subpath.golden +2 -0
  228. package/engine/testdata/golden/TestParityPackageExistence/ghost-workspace.golden +1 -0
  229. package/engine/testdata/golden/TestParityPackageExistence/no-manifest.golden +1 -0
  230. package/engine/testdata/golden/TestParityPackageExistence/not-git.golden +1 -0
  231. package/engine/testdata/golden/TestParityPackageExistence/undeclared.golden +1 -0
  232. package/engine/testdata/golden/TestParityPreamble/afk/a.golden +14 -0
  233. package/engine/testdata/golden/TestParityPreamble/hitl/active.golden +18 -0
  234. package/engine/testdata/golden/TestParityPreamble/hitl/bare.golden +10 -0
  235. package/engine/testdata/golden/TestParityPreamble/hitl/full.golden +18 -0
  236. package/engine/testdata/golden/TestParityPreamble/hitl/ghost.golden +2 -0
  237. package/engine/testdata/golden/TestParityPreamble/hitl/nonl.golden +11 -0
  238. package/engine/testdata/golden/TestParityPreamble/hitl/openend.golden +13 -0
  239. package/engine/testdata/golden/TestParityProgress/arg=allbuilt.golden +4 -0
  240. package/engine/testdata/golden/TestParityProgress/arg=done.golden +3 -0
  241. package/engine/testdata/golden/TestParityProgress/arg=ghost.golden +1 -0
  242. package/engine/testdata/golden/TestParityProgress/arg=mid.golden +4 -0
  243. package/engine/testdata/golden/TestParityProgress/arg=nophase.golden +3 -0
  244. package/engine/testdata/golden/TestParityProgress/arg=noslice.golden +3 -0
  245. package/engine/testdata/golden/TestParityProgress/arg=plan.golden +4 -0
  246. package/engine/testdata/golden/TestParityProgress/arg=seal.golden +3 -0
  247. package/engine/testdata/golden/TestParityReconcile/bad-mode.golden +1 -0
  248. package/engine/testdata/golden/TestParityReconcile/check-clean/snapshot.golden +2 -0
  249. package/engine/testdata/golden/TestParityReconcile/check-clean.golden +2 -0
  250. package/engine/testdata/golden/TestParityReconcile/check-no-base.golden +1 -0
  251. package/engine/testdata/golden/TestParityReconcile/check-no-claimed/snapshot.golden +2 -0
  252. package/engine/testdata/golden/TestParityReconcile/check-no-claimed.golden +1 -0
  253. package/engine/testdata/golden/TestParityReconcile/check-violation/snapshot.golden +2 -0
  254. package/engine/testdata/golden/TestParityReconcile/check-violation.golden +1 -0
  255. package/engine/testdata/golden/TestParityReconcile/inline-fallback/snapshot.golden +2 -0
  256. package/engine/testdata/golden/TestParityReconcile/inline-fallback.golden +1 -0
  257. package/engine/testdata/golden/TestParityReconcile/not-git.golden +1 -0
  258. package/engine/testdata/golden/TestParityReconcile/snapshot/snapshot.golden +2 -0
  259. package/engine/testdata/golden/TestParityReconcile/snapshot.golden +2 -0
  260. package/engine/testdata/golden/TestParityRedwatch/fail-writes-red.golden +2 -0
  261. package/engine/testdata/golden/TestParityRedwatch/non-bash-tool.golden +1 -0
  262. package/engine/testdata/golden/TestParityRedwatch/non-test-command.golden +1 -0
  263. package/engine/testdata/golden/TestParityRedwatch/pass-clears-red.golden +1 -0
  264. package/engine/testdata/golden/TestParityResolve/answer/questions.md.golden +9 -0
  265. package/engine/testdata/golden/TestParityResolve/answer/state.md.golden +6 -0
  266. package/engine/testdata/golden/TestParityResolve/answer.golden +4 -0
  267. package/engine/testdata/golden/TestParityResolve/batch/questions.md.golden +9 -0
  268. package/engine/testdata/golden/TestParityResolve/batch-unterminated/questions.md.golden +9 -0
  269. package/engine/testdata/golden/TestParityResolve/batch-unterminated.golden +2 -0
  270. package/engine/testdata/golden/TestParityResolve/batch.golden +3 -0
  271. package/engine/testdata/golden/TestParityResolve/drop/questions.md.golden +9 -0
  272. package/engine/testdata/golden/TestParityResolve/drop/state.md.golden +8 -0
  273. package/engine/testdata/golden/TestParityResolve/drop.golden +4 -0
  274. package/engine/testdata/golden/TestParityResolve/missing-answer.golden +1 -0
  275. package/engine/testdata/golden/TestParityResolve/next-qid.golden +2 -0
  276. package/engine/testdata/golden/TestParityResolve/no-workspace.golden +1 -0
  277. package/engine/testdata/golden/TestParityResolve/not-found.golden +1 -0
  278. package/engine/testdata/golden/TestParityResolve/not-open.golden +1 -0
  279. package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-devrites-agent-denies.golden +2 -0
  280. package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-non-devrites-allows.golden +1 -0
  281. package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-subagent-type-only-allows.golden +1 -0
  282. package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-git-commit.golden +2 -0
  283. package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-mutating.golden +2 -0
  284. package/engine/testdata/golden/TestParityReviewerReadonly/non-bash-tool.golden +1 -0
  285. package/engine/testdata/golden/TestParityReviewerReadonly/non-tool-input.golden +1 -0
  286. package/engine/testdata/golden/TestParityReviewerReadonly/observe-mutating-silent.golden +1 -0
  287. package/engine/testdata/golden/TestParityReviewerReadonly/safe-bash-command.golden +1 -0
  288. package/engine/testdata/golden/TestParitySpecValidate/arg=dup.golden +1 -0
  289. package/engine/testdata/golden/TestParitySpecValidate/arg=empty.golden +1 -0
  290. package/engine/testdata/golden/TestParitySpecValidate/arg=flat.golden +2 -0
  291. package/engine/testdata/golden/TestParitySpecValidate/arg=nonexistent.golden +1 -0
  292. package/engine/testdata/golden/TestParitySpecValidate/arg=noscenario.golden +1 -0
  293. package/engine/testdata/golden/TestParitySpecValidate/arg=noshall.golden +1 -0
  294. package/engine/testdata/golden/TestParitySpecValidate/arg=nothen.golden +1 -0
  295. package/engine/testdata/golden/TestParitySpecValidate/arg=valid/spec.md.golden +2 -0
  296. package/engine/testdata/golden/TestParitySpecValidate/arg=valid.golden +2 -0
  297. package/engine/testdata/golden/TestParitySpecValidate.golden +1 -0
  298. package/engine/testdata/golden/TestParityStatusline/full-afk.golden +2 -0
  299. package/engine/testdata/golden/TestParityStatusline/full-hitl.golden +2 -0
  300. package/engine/testdata/golden/TestParityStatusline/no-active.golden +1 -0
  301. package/engine/testdata/golden/TestParityStatusline/nophase.golden +2 -0
  302. package/engine/testdata/golden/TestParityStatusline/red.golden +2 -0
  303. package/engine/testdata/golden/TestParityStuckCheck/bad-cmd.golden +1 -0
  304. package/engine/testdata/golden/TestParityStuckCheck/custom-window-2.golden +2 -0
  305. package/engine/testdata/golden/TestParityStuckCheck/dominant.golden +2 -0
  306. package/engine/testdata/golden/TestParityStuckCheck/few.golden +2 -0
  307. package/engine/testdata/golden/TestParityStuckCheck/ghost.golden +2 -0
  308. package/engine/testdata/golden/TestParityStuckCheck/identical.golden +2 -0
  309. package/engine/testdata/golden/TestParityStuckCheck/no-cmd.golden +1 -0
  310. package/engine/testdata/golden/TestParityStuckCheck/no-slug.golden +1 -0
  311. package/engine/testdata/golden/TestParityStuckCheck/nolog.golden +2 -0
  312. package/engine/testdata/golden/TestParityStuckCheck/pingpong.golden +2 -0
  313. package/engine/testdata/golden/TestParityStuckCheck/varied.golden +2 -0
  314. package/engine/testdata/golden/TestParityStuckCheck/window-04-identical.golden +2 -0
  315. package/engine/testdata/golden/TestParityStuckCheck/window-2.5-varied4.golden +2 -0
  316. package/engine/testdata/golden/TestParityStuckCheck/window-4x-varied4.golden +2 -0
  317. package/engine/testdata/golden/TestParityStuckCheck/window-leadspace-varied4.golden +2 -0
  318. package/engine/testdata/golden/TestParityStuckCheck/window-plus4-identical.golden +2 -0
  319. package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent-subagent-type-key.golden +2 -0
  320. package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent.golden +2 -0
  321. package/engine/testdata/golden/TestParitySubagentOrient/garbage-input.golden +1 -0
  322. package/engine/testdata/golden/TestParitySubagentOrient/non-devrites-agent.golden +1 -0
  323. package/engine/testdata/golden/TestParityTestIntegrity/assertion-dropped.golden +1 -0
  324. package/engine/testdata/golden/TestParityTestIntegrity/clean.golden +2 -0
  325. package/engine/testdata/golden/TestParityTestIntegrity/deleted.golden +1 -0
  326. package/engine/testdata/golden/TestParityTestIntegrity/ghost-workspace.golden +1 -0
  327. package/engine/testdata/golden/TestParityTestIntegrity/not-git.golden +1 -0
  328. package/engine/testdata/golden/TestParityTestIntegrity/skip-added.golden +1 -0
  329. package/engine/testdata/golden/TestParityTickAfk/budget1/state.md.golden +1 -0
  330. package/engine/testdata/golden/TestParityTickAfk/budget1.golden +2 -0
  331. package/engine/testdata/golden/TestParityTickAfk/budget3/state.md.golden +5 -0
  332. package/engine/testdata/golden/TestParityTickAfk/budget3.golden +2 -0
  333. package/engine/testdata/golden/TestParityTickAfk/bulletPipe/state.md.golden +1 -0
  334. package/engine/testdata/golden/TestParityTickAfk/bulletPipe.golden +2 -0
  335. package/engine/testdata/golden/TestParityTickAfk/missingField/state.md.golden +3 -0
  336. package/engine/testdata/golden/TestParityTickAfk/missingField.golden +2 -0
  337. package/engine/testdata/golden/TestParityTickAfk/missingFile.golden +1 -0
  338. package/engine/testdata/golden/TestParityTickAfk/nonNumeric/state.md.golden +1 -0
  339. package/engine/testdata/golden/TestParityTickAfk/nonNumeric.golden +1 -0
  340. package/engine/testdata/golden/TestParityTickAfk/none/state.md.golden +1 -0
  341. package/engine/testdata/golden/TestParityTickAfk/none.golden +2 -0
  342. package/engine/testdata/golden/TestParityWrightScope/agent-required-non-wright.golden +1 -0
  343. package/engine/testdata/golden/TestParityWrightScope/devrites-edit-allowed.golden +1 -0
  344. package/engine/testdata/golden/TestParityWrightScope/in-scope-allowed.golden +1 -0
  345. package/engine/testdata/golden/TestParityWrightScope/non-edit-tool.golden +1 -0
  346. package/engine/testdata/golden/TestParityWrightScope/out-of-scope-enforce-denies.golden +2 -0
  347. package/engine/testdata/golden/TestParityWrightScope/out-of-scope-observe-silent.golden +1 -0
  348. package/engine/testdata/golden/TestSpecSkeleton/missing-some.golden +2 -0
  349. package/engine/testdata/golden/TestSpecSkeleton/present-all.golden +2 -0
  350. package/engine/testdata/golden/TestStatusLiveWorkspace.golden +10 -0
  351. package/engine/testdata/golden/TestStuckLogHashParity.golden +1 -0
  352. package/engine/testdata/golden/status/auth-tokens.txt +9 -0
  353. package/engine/testdata/golden/status/search-ranking.txt +9 -0
  354. package/engine/tests/adr_0003_gate_exit_code_test.go +32 -0
  355. package/engine/tests/adr_0004_required_by_phase_test.go +62 -0
  356. package/engine/tests/adr_0006_clock_seam_test.go +36 -0
  357. package/engine/tests/budget_test.go +77 -0
  358. package/engine/tests/cli_test.go +209 -0
  359. package/engine/tests/concurrency_cli_test.go +125 -0
  360. package/engine/tests/conventions_test.go +106 -0
  361. package/engine/tests/doctor_cli_test.go +62 -0
  362. package/engine/tests/gate_test.go +235 -0
  363. package/engine/tests/hook_test.go +390 -0
  364. package/engine/tests/hooks_io_test.go +218 -0
  365. package/engine/tests/json_contract_test.go +99 -0
  366. package/engine/tests/lib_parity_test.go +942 -0
  367. package/engine/tests/meta_test.go +67 -0
  368. package/engine/tests/migrate_cli_test.go +193 -0
  369. package/engine/tests/parity_analyze_test.go +55 -0
  370. package/engine/tests/parity_buildreadiness_test.go +42 -0
  371. package/engine/tests/parity_closeout_test.go +102 -0
  372. package/engine/tests/parity_githelpers_test.go +41 -0
  373. package/engine/tests/parity_learnings_test.go +90 -0
  374. package/engine/tests/parity_mutationgate_test.go +36 -0
  375. package/engine/tests/parity_packageexistence_test.go +64 -0
  376. package/engine/tests/parity_reconcile_test.go +88 -0
  377. package/engine/tests/parity_resolve_test.go +144 -0
  378. package/engine/tests/parity_test.go +380 -0
  379. package/engine/tests/parity_testintegrity_test.go +65 -0
  380. package/engine/tests/parity_tickafk_test.go +83 -0
  381. package/engine/validatepack.go +192 -0
  382. package/engine/validatepack_test.go +79 -0
  383. package/engine/validatepackskills.go +181 -0
  384. package/engine/validatepackskills_test.go +171 -0
  385. package/install.sh +67 -912
  386. package/pack/.claude/agents/devrites-code-reviewer.md +20 -3
  387. package/pack/.claude/agents/devrites-devex-reviewer.md +13 -3
  388. package/pack/.claude/agents/devrites-doubt-reviewer.md +16 -3
  389. package/pack/.claude/agents/devrites-forge-judge.md +14 -4
  390. package/pack/.claude/agents/devrites-frontend-reviewer.md +27 -3
  391. package/pack/.claude/agents/devrites-performance-reviewer.md +18 -2
  392. package/pack/.claude/agents/devrites-plan-reviewer.md +13 -3
  393. package/pack/.claude/agents/devrites-retrospector.md +12 -7
  394. package/pack/.claude/agents/devrites-security-auditor.md +20 -4
  395. package/pack/.claude/agents/devrites-simplifier-reviewer.md +17 -2
  396. package/pack/.claude/agents/devrites-slice-wright.md +32 -16
  397. package/pack/.claude/agents/devrites-spec-reviewer.md +17 -2
  398. package/pack/.claude/agents/devrites-strategy-reviewer.md +12 -2
  399. package/pack/.claude/agents/devrites-test-analyst.md +20 -3
  400. package/pack/.claude/settings.json +58 -8
  401. package/pack/.claude/skills/devrites-api-interface/SKILL.md +22 -5
  402. package/pack/.claude/skills/devrites-audit/SKILL.md +1 -1
  403. package/pack/.claude/skills/devrites-browser-proof/SKILL.md +26 -53
  404. package/pack/.claude/skills/devrites-browser-proof/reference/browser-performance.md +15 -0
  405. package/pack/.claude/skills/devrites-browser-proof/reference/visual-verdict.md +34 -0
  406. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +21 -6
  407. package/pack/.claude/skills/devrites-debug-recovery/reference/build-the-loop.md +11 -0
  408. package/pack/.claude/skills/devrites-debug-recovery/reference/regression-test.md +2 -3
  409. package/pack/.claude/skills/devrites-debug-recovery/reference/trace.md +25 -0
  410. package/pack/.claude/skills/devrites-doubt/SKILL.md +10 -3
  411. package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +16 -13
  412. package/pack/.claude/skills/devrites-frontend-craft/reference/craft.md +15 -3
  413. package/pack/.claude/skills/devrites-frontend-craft/reference/quality-standards.md +19 -0
  414. package/pack/.claude/skills/devrites-frontend-craft/reference/reuse-first.md +3 -3
  415. package/pack/.claude/skills/devrites-interview/SKILL.md +30 -7
  416. package/pack/.claude/skills/devrites-lib/SKILL.md +35 -36
  417. package/pack/.claude/skills/devrites-lib/reference/intent-map.md +16 -0
  418. package/pack/.claude/skills/devrites-lib/reference/model-tiers.md +43 -0
  419. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +104 -20
  420. package/pack/.claude/skills/devrites-lib/reference/reply-contract.md +111 -0
  421. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/README.md +14 -6
  422. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/afk-hitl.md +10 -18
  423. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/agents.md +81 -16
  424. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/anti-patterns.md +3 -4
  425. package/pack/.claude/skills/devrites-lib/reference/standards/browser-proof-checklist.md +9 -0
  426. package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +62 -0
  427. package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +141 -0
  428. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/context-hygiene.md +17 -0
  429. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/core.md +9 -18
  430. package/pack/.claude/skills/devrites-lib/reference/standards/definition-of-done.md +16 -0
  431. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/deprecation.md +21 -0
  432. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/developer-experience.md +3 -3
  433. package/pack/.claude/skills/devrites-lib/reference/standards/development-workflow.md +51 -0
  434. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/documentation.md +9 -1
  435. package/pack/.claude/skills/devrites-lib/reference/standards/edge-case-trace.md +19 -0
  436. package/pack/.claude/skills/devrites-lib/reference/standards/elicitation.md +80 -0
  437. package/pack/.claude/skills/devrites-lib/reference/standards/git-workflow.md +65 -0
  438. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/observability.md +13 -0
  439. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/performance.md +1 -1
  440. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/principles.md +3 -3
  441. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/prose-style.md +18 -2
  442. package/pack/.claude/skills/devrites-lib/reference/standards/release/ship-checklist.md +9 -0
  443. package/pack/.claude/skills/devrites-lib/reference/standards/review-checklist.md +10 -0
  444. package/pack/.claude/skills/devrites-lib/reference/standards/security-checklist.md +9 -0
  445. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/security.md +45 -4
  446. package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +105 -0
  447. package/pack/.claude/skills/devrites-lib/reference/standards/spec-grammar.md +185 -0
  448. package/pack/.claude/skills/devrites-lib/reference/standards/test-proof-checklist.md +9 -0
  449. package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +162 -0
  450. package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/tooling.md +29 -2
  451. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +110 -0
  452. package/pack/.claude/skills/devrites-prose-craft/SKILL.md +40 -76
  453. package/pack/.claude/skills/devrites-prose-craft/reference/examples.md +19 -5
  454. package/pack/.claude/skills/devrites-refresh-indexes/SKILL.md +3 -6
  455. package/pack/.claude/skills/devrites-source-driven/SKILL.md +17 -1
  456. package/pack/.claude/skills/devrites-ux-shape/SKILL.md +20 -7
  457. package/pack/.claude/skills/devrites-ux-shape/reference/brief-template.md +25 -10
  458. package/pack/.claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +2 -2
  459. package/pack/.claude/skills/rite/SKILL.md +67 -42
  460. package/pack/.claude/skills/rite/reference/menu.md +4 -1
  461. package/pack/.claude/skills/rite-adopt/SKILL.md +31 -22
  462. package/pack/.claude/skills/rite-adopt/reference/adoption.md +6 -9
  463. package/pack/.claude/skills/rite-adopt/reference/anti-patterns.md +1 -1
  464. package/pack/.claude/skills/rite-autocomplete/SKILL.md +25 -25
  465. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +2 -2
  466. package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +1 -1
  467. package/pack/.claude/skills/rite-build/SKILL.md +24 -256
  468. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +3 -3
  469. package/pack/.claude/skills/rite-build/reference/anti-patterns.md +1 -1
  470. package/pack/.claude/skills/rite-build/reference/checkpoint-protocol.md +1 -1
  471. package/pack/.claude/skills/rite-build/reference/checkpoint.md +44 -0
  472. package/pack/.claude/skills/rite-build/reference/evidence-standard.md +10 -7
  473. package/pack/.claude/skills/rite-build/reference/forge.md +17 -7
  474. package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +2 -0
  475. package/pack/.claude/skills/rite-build/reference/output.md +41 -0
  476. package/pack/.claude/skills/rite-build/reference/phase-contract.md +258 -0
  477. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +11 -10
  478. package/pack/.claude/skills/rite-converge/SKILL.md +131 -0
  479. package/pack/.claude/skills/rite-converge/reference/anti-patterns.md +35 -0
  480. package/pack/.claude/skills/rite-converge/reference/convergence-assessment.md +61 -0
  481. package/pack/.claude/skills/rite-customize/SKILL.md +67 -0
  482. package/pack/.claude/skills/rite-define/SKILL.md +76 -93
  483. package/pack/.claude/skills/rite-define/reference/anti-patterns.md +2 -1
  484. package/pack/.claude/skills/rite-define/reference/gates.md +3 -3
  485. package/pack/.claude/skills/rite-define/reference/plan-template.md +35 -6
  486. package/pack/.claude/skills/rite-doctor/SKILL.md +41 -16
  487. package/pack/.claude/skills/rite-dogfood/SKILL.md +49 -0
  488. package/pack/.claude/skills/rite-explain/SKILL.md +148 -0
  489. package/pack/.claude/skills/rite-explain/reference/intake.md +79 -0
  490. package/pack/.claude/skills/rite-frame/SKILL.md +14 -15
  491. package/pack/.claude/skills/rite-frame/reference/failure-modes.md +1 -1
  492. package/pack/.claude/skills/rite-handoff/SKILL.md +19 -17
  493. package/pack/.claude/skills/rite-handoff/reference/handoff-template.md +16 -6
  494. package/pack/.claude/skills/rite-learn/SKILL.md +46 -24
  495. package/pack/.claude/skills/rite-plan/SKILL.md +35 -26
  496. package/pack/.claude/skills/rite-plan/reference/anti-patterns.md +1 -1
  497. package/pack/.claude/skills/rite-plan/reference/dependency-graph.md +3 -3
  498. package/pack/.claude/skills/rite-plan/reference/slicing.md +20 -7
  499. package/pack/.claude/skills/rite-plan/reference/task-breakdown.md +15 -16
  500. package/pack/.claude/skills/rite-polish/SKILL.md +18 -23
  501. package/pack/.claude/skills/rite-polish/reference/anti-ai-slop.md +31 -2
  502. package/pack/.claude/skills/rite-polish/reference/anti-patterns.md +4 -1
  503. package/pack/.claude/skills/rite-polish/reference/code.md +16 -5
  504. package/pack/.claude/skills/rite-polish/reference/design-system-discovery.md +5 -32
  505. package/pack/.claude/skills/rite-pov/SKILL.md +46 -0
  506. package/pack/.claude/skills/rite-pr-feedback/SKILL.md +49 -0
  507. package/pack/.claude/skills/rite-pressure-test/SKILL.md +40 -10
  508. package/pack/.claude/skills/rite-prototype/SKILL.md +23 -2
  509. package/pack/.claude/skills/rite-prove/SKILL.md +41 -96
  510. package/pack/.claude/skills/rite-prove/reference/acceptance-proof.md +48 -0
  511. package/pack/.claude/skills/rite-prove/reference/anti-patterns.md +1 -1
  512. package/pack/.claude/skills/rite-prove/reference/browser-proof.md +36 -13
  513. package/pack/.claude/skills/rite-quick/SKILL.md +19 -12
  514. package/pack/.claude/skills/rite-resolve/SKILL.md +21 -25
  515. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +2 -2
  516. package/pack/.claude/skills/rite-review/SKILL.md +43 -45
  517. package/pack/.claude/skills/rite-review/reference/anti-patterns.md +1 -1
  518. package/pack/.claude/skills/rite-review/reference/performance-checklist.md +1 -1
  519. package/pack/.claude/skills/rite-review/reference/performance-review.md +4 -22
  520. package/pack/.claude/skills/rite-review/reference/security-review.md +2 -2
  521. package/pack/.claude/skills/rite-seal/SKILL.md +40 -174
  522. package/pack/.claude/skills/rite-seal/reference/anti-patterns.md +1 -1
  523. package/pack/.claude/skills/rite-seal/reference/conventions-ledger.md +6 -9
  524. package/pack/.claude/skills/rite-seal/reference/final-evidence.md +6 -14
  525. package/pack/.claude/skills/rite-seal/reference/go-no-go.md +3 -3
  526. package/pack/.claude/skills/rite-seal/reference/output.md +7 -0
  527. package/pack/.claude/skills/rite-seal/reference/phase-contract.md +211 -0
  528. package/pack/.claude/skills/rite-seal/reference/seal-template.md +1 -1
  529. package/pack/.claude/skills/rite-ship/SKILL.md +45 -75
  530. package/pack/.claude/skills/rite-ship/reference/adr-promotion.md +9 -0
  531. package/pack/.claude/skills/rite-ship/reference/anti-patterns.md +1 -1
  532. package/pack/.claude/skills/rite-ship/reference/close-out.md +12 -1
  533. package/pack/.claude/skills/rite-ship/reference/design-memory.md +2 -2
  534. package/pack/.claude/skills/rite-ship/reference/git-ship.md +32 -1
  535. package/pack/.claude/skills/rite-ship/reference/ledger.md +56 -0
  536. package/pack/.claude/skills/rite-ship/reference/rollout.md +43 -0
  537. package/pack/.claude/skills/rite-spec/SKILL.md +108 -60
  538. package/pack/.claude/skills/rite-spec/reference/ai-spec-template.md +33 -0
  539. package/pack/.claude/skills/rite-spec/reference/anti-patterns.md +4 -1
  540. package/pack/.claude/skills/rite-spec/reference/investigation.md +34 -14
  541. package/pack/.claude/skills/rite-spec/reference/question-protocol.md +7 -37
  542. package/pack/.claude/skills/rite-spec/reference/references-intake.md +23 -18
  543. package/pack/.claude/skills/rite-spec/reference/spec-template.md +94 -118
  544. package/pack/.claude/skills/rite-spec/reference/state-workspace.md +128 -139
  545. package/pack/.claude/skills/rite-status/SKILL.md +26 -22
  546. package/pack/.claude/skills/rite-temper/SKILL.md +34 -27
  547. package/pack/.claude/skills/rite-temper/reference/anti-patterns.md +1 -1
  548. package/pack/.claude/skills/rite-temper/reference/scope-modes.md +1 -1
  549. package/pack/.claude/skills/rite-temper/reference/significance.md +1 -1
  550. package/pack/.claude/skills/rite-vet/SKILL.md +58 -70
  551. package/pack/.claude/skills/rite-vet/reference/anti-patterns.md +1 -1
  552. package/pack/.claude/skills/rite-vet/reference/cross-model.md +7 -5
  553. package/pack/.claude/skills/rite-vet/reference/depth.md +1 -1
  554. package/pack/.claude/skills/rite-vet/reference/review-axes.md +3 -3
  555. package/pack/.claude/skills/rite-zoom-out/SKILL.md +16 -17
  556. package/pack/generated/README.md +10 -0
  557. package/pack/generated/claude/agents/devrites-code-reviewer.md +103 -0
  558. package/pack/generated/claude/agents/devrites-devex-reviewer.md +104 -0
  559. package/pack/generated/claude/agents/devrites-doubt-reviewer.md +68 -0
  560. package/pack/generated/claude/agents/devrites-forge-judge.md +102 -0
  561. package/pack/generated/claude/agents/devrites-frontend-reviewer.md +84 -0
  562. package/pack/generated/claude/agents/devrites-performance-reviewer.md +111 -0
  563. package/pack/generated/claude/agents/devrites-plan-reviewer.md +89 -0
  564. package/pack/generated/claude/agents/devrites-retrospector.md +96 -0
  565. package/pack/generated/claude/agents/devrites-security-auditor.md +85 -0
  566. package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +90 -0
  567. package/pack/generated/claude/agents/devrites-slice-wright.md +210 -0
  568. package/pack/generated/claude/agents/devrites-spec-reviewer.md +87 -0
  569. package/pack/generated/claude/agents/devrites-strategy-reviewer.md +72 -0
  570. package/pack/generated/claude/agents/devrites-test-analyst.md +64 -0
  571. package/pack/generated/claude/settings.json +103 -0
  572. package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +61 -0
  573. package/pack/generated/claude/skills/devrites-audit/SKILL.md +73 -0
  574. package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +76 -0
  575. package/pack/generated/claude/skills/devrites-browser-proof/reference/browser-performance.md +15 -0
  576. package/pack/generated/claude/skills/devrites-browser-proof/reference/visual-verdict.md +34 -0
  577. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +65 -0
  578. package/pack/generated/claude/skills/devrites-debug-recovery/reference/build-the-loop.md +58 -0
  579. package/pack/generated/claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +17 -0
  580. package/pack/generated/claude/skills/devrites-debug-recovery/reference/hypotheses.md +17 -0
  581. package/pack/generated/claude/skills/devrites-debug-recovery/reference/instrumentation.md +21 -0
  582. package/pack/generated/claude/skills/devrites-debug-recovery/reference/regression-test.md +30 -0
  583. package/pack/generated/claude/skills/devrites-debug-recovery/reference/trace.md +25 -0
  584. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +82 -0
  585. package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +99 -0
  586. package/pack/generated/claude/skills/devrites-frontend-craft/reference/craft.md +71 -0
  587. package/pack/generated/claude/skills/devrites-frontend-craft/reference/design-references.md +116 -0
  588. package/pack/generated/claude/skills/devrites-frontend-craft/reference/fullstack.md +45 -0
  589. package/pack/generated/claude/skills/devrites-frontend-craft/reference/quality-standards.md +234 -0
  590. package/pack/generated/claude/skills/devrites-frontend-craft/reference/reuse-first.md +59 -0
  591. package/pack/generated/claude/skills/devrites-frontend-craft/reference/shape.md +60 -0
  592. package/pack/generated/claude/skills/devrites-interview/SKILL.md +104 -0
  593. package/pack/generated/claude/skills/devrites-lib/SKILL.md +82 -0
  594. package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +16 -0
  595. package/pack/generated/claude/skills/devrites-lib/reference/model-tiers.md +43 -0
  596. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +165 -0
  597. package/pack/generated/claude/skills/devrites-lib/reference/reply-contract.md +111 -0
  598. package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +61 -0
  599. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +243 -0
  600. package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +192 -0
  601. package/pack/generated/claude/skills/devrites-lib/reference/standards/anti-patterns.md +58 -0
  602. package/pack/generated/claude/skills/devrites-lib/reference/standards/browser-proof-checklist.md +9 -0
  603. package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +62 -0
  604. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +141 -0
  605. package/pack/generated/claude/skills/devrites-lib/reference/standards/coding-style.md +55 -0
  606. package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +114 -0
  607. package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +119 -0
  608. package/pack/generated/claude/skills/devrites-lib/reference/standards/definition-of-done.md +16 -0
  609. package/pack/generated/claude/skills/devrites-lib/reference/standards/deprecation.md +71 -0
  610. package/pack/generated/claude/skills/devrites-lib/reference/standards/developer-experience.md +119 -0
  611. package/pack/generated/claude/skills/devrites-lib/reference/standards/development-workflow.md +51 -0
  612. package/pack/generated/claude/skills/devrites-lib/reference/standards/documentation.md +35 -0
  613. package/pack/generated/claude/skills/devrites-lib/reference/standards/edge-case-trace.md +19 -0
  614. package/pack/generated/claude/skills/devrites-lib/reference/standards/elicitation.md +80 -0
  615. package/pack/generated/claude/skills/devrites-lib/reference/standards/error-handling.md +33 -0
  616. package/pack/generated/claude/skills/devrites-lib/reference/standards/git-workflow.md +65 -0
  617. package/pack/generated/claude/skills/devrites-lib/reference/standards/hooks.md +38 -0
  618. package/pack/generated/claude/skills/devrites-lib/reference/standards/observability.md +73 -0
  619. package/pack/generated/claude/skills/devrites-lib/reference/standards/patterns.md +48 -0
  620. package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +36 -0
  621. package/pack/generated/claude/skills/devrites-lib/reference/standards/principles.md +158 -0
  622. package/pack/generated/claude/skills/devrites-lib/reference/standards/prose-style.md +117 -0
  623. package/pack/generated/claude/skills/devrites-lib/reference/standards/release/ship-checklist.md +9 -0
  624. package/pack/generated/claude/skills/devrites-lib/reference/standards/review-checklist.md +10 -0
  625. package/pack/generated/claude/skills/devrites-lib/reference/standards/security-checklist.md +9 -0
  626. package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +135 -0
  627. package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +105 -0
  628. package/pack/generated/claude/skills/devrites-lib/reference/standards/spec-grammar.md +185 -0
  629. package/pack/generated/claude/skills/devrites-lib/reference/standards/test-proof-checklist.md +9 -0
  630. package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +162 -0
  631. package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +99 -0
  632. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +110 -0
  633. package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +69 -0
  634. package/pack/generated/claude/skills/devrites-prose-craft/reference/banned-phrases.md +95 -0
  635. package/pack/generated/claude/skills/devrites-prose-craft/reference/examples.md +102 -0
  636. package/pack/generated/claude/skills/devrites-prose-craft/reference/structures.md +134 -0
  637. package/pack/generated/claude/skills/devrites-refresh-indexes/SKILL.md +51 -0
  638. package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +52 -0
  639. package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +134 -0
  640. package/pack/generated/claude/skills/devrites-ux-shape/reference/brief-template.md +108 -0
  641. package/pack/generated/claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +48 -0
  642. package/pack/generated/claude/skills/rite/SKILL.md +142 -0
  643. package/pack/generated/claude/skills/rite/reference/menu.md +42 -0
  644. package/pack/generated/claude/skills/rite-adopt/SKILL.md +104 -0
  645. package/pack/generated/claude/skills/rite-adopt/reference/adoption.md +55 -0
  646. package/pack/generated/claude/skills/rite-adopt/reference/anti-patterns.md +19 -0
  647. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +98 -0
  648. package/pack/generated/claude/skills/rite-autocomplete/reference/decision-policy.md +35 -0
  649. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +54 -0
  650. package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +59 -0
  651. package/pack/generated/claude/skills/rite-build/SKILL.md +84 -0
  652. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +145 -0
  653. package/pack/generated/claude/skills/rite-build/reference/anti-patterns.md +37 -0
  654. package/pack/generated/claude/skills/rite-build/reference/checkpoint-protocol.md +149 -0
  655. package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +44 -0
  656. package/pack/generated/claude/skills/rite-build/reference/evidence-standard.md +35 -0
  657. package/pack/generated/claude/skills/rite-build/reference/forge.md +181 -0
  658. package/pack/generated/claude/skills/rite-build/reference/frontend-trigger.md +39 -0
  659. package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +42 -0
  660. package/pack/generated/claude/skills/rite-build/reference/output.md +41 -0
  661. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +258 -0
  662. package/pack/generated/claude/skills/rite-build/reference/spec-drift-guard.md +43 -0
  663. package/pack/generated/claude/skills/rite-build/reference/tdd.md +26 -0
  664. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +140 -0
  665. package/pack/generated/claude/skills/rite-converge/SKILL.md +131 -0
  666. package/pack/generated/claude/skills/rite-converge/reference/anti-patterns.md +35 -0
  667. package/pack/generated/claude/skills/rite-converge/reference/convergence-assessment.md +61 -0
  668. package/pack/generated/claude/skills/rite-customize/SKILL.md +67 -0
  669. package/pack/generated/claude/skills/rite-define/SKILL.md +153 -0
  670. package/pack/generated/claude/skills/rite-define/reference/anti-patterns.md +26 -0
  671. package/pack/generated/claude/skills/rite-define/reference/gates.md +152 -0
  672. package/pack/generated/claude/skills/rite-define/reference/plan-template.md +94 -0
  673. package/pack/generated/claude/skills/rite-doctor/SKILL.md +76 -0
  674. package/pack/generated/claude/skills/rite-dogfood/SKILL.md +49 -0
  675. package/pack/generated/claude/skills/rite-explain/SKILL.md +148 -0
  676. package/pack/generated/claude/skills/rite-explain/reference/intake.md +79 -0
  677. package/pack/generated/claude/skills/rite-frame/SKILL.md +120 -0
  678. package/pack/generated/claude/skills/rite-frame/reference/failure-modes.md +68 -0
  679. package/pack/generated/claude/skills/rite-handoff/SKILL.md +97 -0
  680. package/pack/generated/claude/skills/rite-handoff/reference/handoff-template.md +44 -0
  681. package/pack/generated/claude/skills/rite-learn/SKILL.md +117 -0
  682. package/pack/generated/claude/skills/rite-plan/SKILL.md +95 -0
  683. package/pack/generated/claude/skills/rite-plan/reference/anti-patterns.md +24 -0
  684. package/pack/generated/claude/skills/rite-plan/reference/dependency-graph.md +33 -0
  685. package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +42 -0
  686. package/pack/generated/claude/skills/rite-plan/reference/slicing.md +65 -0
  687. package/pack/generated/claude/skills/rite-plan/reference/task-breakdown.md +33 -0
  688. package/pack/generated/claude/skills/rite-polish/SKILL.md +87 -0
  689. package/pack/generated/claude/skills/rite-polish/reference/anti-ai-slop.md +206 -0
  690. package/pack/generated/claude/skills/rite-polish/reference/anti-patterns.md +30 -0
  691. package/pack/generated/claude/skills/rite-polish/reference/backend-polish.md +80 -0
  692. package/pack/generated/claude/skills/rite-polish/reference/browser-polish-evidence.md +31 -0
  693. package/pack/generated/claude/skills/rite-polish/reference/code.md +100 -0
  694. package/pack/generated/claude/skills/rite-polish/reference/design-system-discovery.md +8 -0
  695. package/pack/generated/claude/skills/rite-polish/reference/harden-checklist.md +109 -0
  696. package/pack/generated/claude/skills/rite-polish/reference/ui.md +136 -0
  697. package/pack/generated/claude/skills/rite-pov/SKILL.md +46 -0
  698. package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +49 -0
  699. package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +74 -0
  700. package/pack/generated/claude/skills/rite-prototype/SKILL.md +110 -0
  701. package/pack/generated/claude/skills/rite-prove/SKILL.md +104 -0
  702. package/pack/generated/claude/skills/rite-prove/reference/acceptance-proof.md +48 -0
  703. package/pack/generated/claude/skills/rite-prove/reference/anti-patterns.md +25 -0
  704. package/pack/generated/claude/skills/rite-prove/reference/browser-proof.md +49 -0
  705. package/pack/generated/claude/skills/rite-prove/reference/failure-triage.md +25 -0
  706. package/pack/generated/claude/skills/rite-prove/reference/proof-ladder.md +28 -0
  707. package/pack/generated/claude/skills/rite-prove/reference/test-command-discovery.md +30 -0
  708. package/pack/generated/claude/skills/rite-quick/SKILL.md +93 -0
  709. package/pack/generated/claude/skills/rite-resolve/SKILL.md +109 -0
  710. package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +115 -0
  711. package/pack/generated/claude/skills/rite-review/SKILL.md +171 -0
  712. package/pack/generated/claude/skills/rite-review/reference/anti-patterns.md +32 -0
  713. package/pack/generated/claude/skills/rite-review/reference/cognitive-load.md +92 -0
  714. package/pack/generated/claude/skills/rite-review/reference/feature-scoped-review.md +26 -0
  715. package/pack/generated/claude/skills/rite-review/reference/five-axis-review.md +60 -0
  716. package/pack/generated/claude/skills/rite-review/reference/nielsen-heuristics.md +130 -0
  717. package/pack/generated/claude/skills/rite-review/reference/performance-checklist.md +80 -0
  718. package/pack/generated/claude/skills/rite-review/reference/performance-review.md +14 -0
  719. package/pack/generated/claude/skills/rite-review/reference/security-review.md +37 -0
  720. package/pack/generated/claude/skills/rite-seal/SKILL.md +101 -0
  721. package/pack/generated/claude/skills/rite-seal/reference/anti-patterns.md +29 -0
  722. package/pack/generated/claude/skills/rite-seal/reference/conventions-ledger.md +60 -0
  723. package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +64 -0
  724. package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +53 -0
  725. package/pack/generated/claude/skills/rite-seal/reference/output.md +7 -0
  726. package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +211 -0
  727. package/pack/generated/claude/skills/rite-seal/reference/risk-and-rollback.md +30 -0
  728. package/pack/generated/claude/skills/rite-seal/reference/seal-template.md +36 -0
  729. package/pack/generated/claude/skills/rite-ship/SKILL.md +111 -0
  730. package/pack/generated/claude/skills/rite-ship/reference/adr-promotion.md +9 -0
  731. package/pack/generated/claude/skills/rite-ship/reference/anti-patterns.md +25 -0
  732. package/pack/generated/claude/skills/rite-ship/reference/close-out.md +42 -0
  733. package/pack/generated/claude/skills/rite-ship/reference/design-memory.md +120 -0
  734. package/pack/generated/claude/skills/rite-ship/reference/git-ship.md +73 -0
  735. package/pack/generated/claude/skills/rite-ship/reference/ledger.md +56 -0
  736. package/pack/generated/claude/skills/rite-ship/reference/rollout.md +43 -0
  737. package/pack/generated/claude/skills/rite-ship/reference/ship-template.md +33 -0
  738. package/pack/generated/claude/skills/rite-spec/SKILL.md +217 -0
  739. package/pack/generated/claude/skills/rite-spec/reference/acceptance-criteria.md +31 -0
  740. package/pack/generated/claude/skills/rite-spec/reference/ai-spec-template.md +33 -0
  741. package/pack/generated/claude/skills/rite-spec/reference/anti-patterns.md +28 -0
  742. package/pack/generated/claude/skills/rite-spec/reference/interview-patterns.md +56 -0
  743. package/pack/generated/claude/skills/rite-spec/reference/investigation.md +84 -0
  744. package/pack/generated/claude/skills/rite-spec/reference/question-protocol.md +31 -0
  745. package/pack/generated/claude/skills/rite-spec/reference/references-intake.md +62 -0
  746. package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +73 -0
  747. package/pack/generated/claude/skills/rite-spec/reference/spec-template.md +110 -0
  748. package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +156 -0
  749. package/pack/generated/claude/skills/rite-status/SKILL.md +107 -0
  750. package/pack/generated/claude/skills/rite-temper/SKILL.md +126 -0
  751. package/pack/generated/claude/skills/rite-temper/reference/anti-patterns.md +29 -0
  752. package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +65 -0
  753. package/pack/generated/claude/skills/rite-temper/reference/scope-modes.md +53 -0
  754. package/pack/generated/claude/skills/rite-temper/reference/significance.md +46 -0
  755. package/pack/generated/claude/skills/rite-temper/reference/strategy-template.md +90 -0
  756. package/pack/generated/claude/skills/rite-vet/SKILL.md +175 -0
  757. package/pack/generated/claude/skills/rite-vet/reference/anti-patterns.md +29 -0
  758. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +135 -0
  759. package/pack/generated/claude/skills/rite-vet/reference/cross-model.md +43 -0
  760. package/pack/generated/claude/skills/rite-vet/reference/depth.md +53 -0
  761. package/pack/generated/claude/skills/rite-vet/reference/eng-lenses.md +48 -0
  762. package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +167 -0
  763. package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +75 -0
  764. package/pack/generated/codex/AGENTS.md +23 -0
  765. package/pack/generated/codex/agents/devrites-code-reviewer.toml +101 -0
  766. package/pack/generated/codex/agents/devrites-devex-reviewer.toml +102 -0
  767. package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +66 -0
  768. package/pack/generated/codex/agents/devrites-forge-judge.toml +100 -0
  769. package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +80 -0
  770. package/pack/generated/codex/agents/devrites-performance-reviewer.toml +109 -0
  771. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +93 -0
  772. package/pack/generated/codex/agents/devrites-retrospector.toml +94 -0
  773. package/pack/generated/codex/agents/devrites-security-auditor.toml +83 -0
  774. package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +88 -0
  775. package/pack/generated/codex/agents/devrites-slice-wright.toml +207 -0
  776. package/pack/generated/codex/agents/devrites-spec-reviewer.toml +85 -0
  777. package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +76 -0
  778. package/pack/generated/codex/agents/devrites-test-analyst.toml +62 -0
  779. package/pack/generated/codex/hooks.json +151 -0
  780. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +73 -0
  781. package/pack/generated/codex/skills/devrites-api-interface/agents/openai.yaml +2 -0
  782. package/pack/generated/codex/skills/devrites-audit/SKILL.md +85 -0
  783. package/pack/generated/codex/skills/devrites-audit/agents/openai.yaml +2 -0
  784. package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +88 -0
  785. package/pack/generated/codex/skills/devrites-browser-proof/agents/openai.yaml +2 -0
  786. package/pack/generated/codex/skills/devrites-browser-proof/reference/browser-performance.md +15 -0
  787. package/pack/generated/codex/skills/devrites-browser-proof/reference/visual-verdict.md +34 -0
  788. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +77 -0
  789. package/pack/generated/codex/skills/devrites-debug-recovery/agents/openai.yaml +2 -0
  790. package/pack/generated/codex/skills/devrites-debug-recovery/reference/build-the-loop.md +58 -0
  791. package/pack/generated/codex/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +17 -0
  792. package/pack/generated/codex/skills/devrites-debug-recovery/reference/hypotheses.md +17 -0
  793. package/pack/generated/codex/skills/devrites-debug-recovery/reference/instrumentation.md +21 -0
  794. package/pack/generated/codex/skills/devrites-debug-recovery/reference/regression-test.md +30 -0
  795. package/pack/generated/codex/skills/devrites-debug-recovery/reference/trace.md +25 -0
  796. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +94 -0
  797. package/pack/generated/codex/skills/devrites-doubt/agents/openai.yaml +2 -0
  798. package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +111 -0
  799. package/pack/generated/codex/skills/devrites-frontend-craft/agents/openai.yaml +2 -0
  800. package/pack/generated/codex/skills/devrites-frontend-craft/reference/craft.md +71 -0
  801. package/pack/generated/codex/skills/devrites-frontend-craft/reference/design-references.md +116 -0
  802. package/pack/generated/codex/skills/devrites-frontend-craft/reference/fullstack.md +45 -0
  803. package/pack/generated/codex/skills/devrites-frontend-craft/reference/quality-standards.md +234 -0
  804. package/pack/generated/codex/skills/devrites-frontend-craft/reference/reuse-first.md +59 -0
  805. package/pack/generated/codex/skills/devrites-frontend-craft/reference/shape.md +60 -0
  806. package/pack/generated/codex/skills/devrites-interview/SKILL.md +116 -0
  807. package/pack/generated/codex/skills/devrites-interview/agents/openai.yaml +2 -0
  808. package/pack/generated/codex/skills/devrites-lib/SKILL.md +94 -0
  809. package/pack/generated/codex/skills/devrites-lib/agents/openai.yaml +2 -0
  810. package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +16 -0
  811. package/pack/generated/codex/skills/devrites-lib/reference/model-tiers.md +43 -0
  812. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +165 -0
  813. package/pack/generated/codex/skills/devrites-lib/reference/reply-contract.md +111 -0
  814. package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +61 -0
  815. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +243 -0
  816. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +192 -0
  817. package/pack/generated/codex/skills/devrites-lib/reference/standards/anti-patterns.md +58 -0
  818. package/pack/generated/codex/skills/devrites-lib/reference/standards/browser-proof-checklist.md +9 -0
  819. package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +62 -0
  820. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +141 -0
  821. package/pack/generated/codex/skills/devrites-lib/reference/standards/coding-style.md +55 -0
  822. package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +114 -0
  823. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +119 -0
  824. package/pack/generated/codex/skills/devrites-lib/reference/standards/definition-of-done.md +16 -0
  825. package/pack/generated/codex/skills/devrites-lib/reference/standards/deprecation.md +71 -0
  826. package/pack/generated/codex/skills/devrites-lib/reference/standards/developer-experience.md +119 -0
  827. package/pack/generated/codex/skills/devrites-lib/reference/standards/development-workflow.md +51 -0
  828. package/pack/generated/codex/skills/devrites-lib/reference/standards/documentation.md +35 -0
  829. package/pack/generated/codex/skills/devrites-lib/reference/standards/edge-case-trace.md +19 -0
  830. package/pack/generated/codex/skills/devrites-lib/reference/standards/elicitation.md +80 -0
  831. package/pack/generated/codex/skills/devrites-lib/reference/standards/error-handling.md +33 -0
  832. package/pack/generated/codex/skills/devrites-lib/reference/standards/git-workflow.md +65 -0
  833. package/pack/generated/codex/skills/devrites-lib/reference/standards/hooks.md +38 -0
  834. package/pack/generated/codex/skills/devrites-lib/reference/standards/observability.md +73 -0
  835. package/pack/generated/codex/skills/devrites-lib/reference/standards/patterns.md +48 -0
  836. package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +36 -0
  837. package/pack/generated/codex/skills/devrites-lib/reference/standards/principles.md +158 -0
  838. package/pack/generated/codex/skills/devrites-lib/reference/standards/prose-style.md +117 -0
  839. package/pack/generated/codex/skills/devrites-lib/reference/standards/release/ship-checklist.md +9 -0
  840. package/pack/generated/codex/skills/devrites-lib/reference/standards/review-checklist.md +10 -0
  841. package/pack/generated/codex/skills/devrites-lib/reference/standards/security-checklist.md +9 -0
  842. package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +135 -0
  843. package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +105 -0
  844. package/pack/generated/codex/skills/devrites-lib/reference/standards/spec-grammar.md +185 -0
  845. package/pack/generated/codex/skills/devrites-lib/reference/standards/test-proof-checklist.md +9 -0
  846. package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +162 -0
  847. package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +99 -0
  848. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +110 -0
  849. package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +81 -0
  850. package/pack/generated/codex/skills/devrites-prose-craft/agents/openai.yaml +2 -0
  851. package/pack/generated/codex/skills/devrites-prose-craft/reference/banned-phrases.md +95 -0
  852. package/pack/generated/codex/skills/devrites-prose-craft/reference/examples.md +102 -0
  853. package/pack/generated/codex/skills/devrites-prose-craft/reference/structures.md +134 -0
  854. package/pack/generated/codex/skills/devrites-refresh-indexes/SKILL.md +63 -0
  855. package/pack/generated/codex/skills/devrites-refresh-indexes/agents/openai.yaml +2 -0
  856. package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +64 -0
  857. package/pack/generated/codex/skills/devrites-source-driven/agents/openai.yaml +2 -0
  858. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +146 -0
  859. package/pack/generated/codex/skills/devrites-ux-shape/agents/openai.yaml +2 -0
  860. package/pack/generated/codex/skills/devrites-ux-shape/reference/brief-template.md +108 -0
  861. package/pack/generated/codex/skills/devrites-ux-shape/reference/visual-direction-probe.md +48 -0
  862. package/pack/generated/codex/skills/rite/SKILL.md +154 -0
  863. package/pack/generated/codex/skills/rite/agents/openai.yaml +2 -0
  864. package/pack/generated/codex/skills/rite/reference/menu.md +42 -0
  865. package/pack/generated/codex/skills/rite-adopt/SKILL.md +116 -0
  866. package/pack/generated/codex/skills/rite-adopt/reference/adoption.md +55 -0
  867. package/pack/generated/codex/skills/rite-adopt/reference/anti-patterns.md +19 -0
  868. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +110 -0
  869. package/pack/generated/codex/skills/rite-autocomplete/reference/decision-policy.md +35 -0
  870. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +54 -0
  871. package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +59 -0
  872. package/pack/generated/codex/skills/rite-build/SKILL.md +96 -0
  873. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +145 -0
  874. package/pack/generated/codex/skills/rite-build/reference/anti-patterns.md +37 -0
  875. package/pack/generated/codex/skills/rite-build/reference/checkpoint-protocol.md +149 -0
  876. package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +44 -0
  877. package/pack/generated/codex/skills/rite-build/reference/evidence-standard.md +35 -0
  878. package/pack/generated/codex/skills/rite-build/reference/forge.md +181 -0
  879. package/pack/generated/codex/skills/rite-build/reference/frontend-trigger.md +39 -0
  880. package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +42 -0
  881. package/pack/generated/codex/skills/rite-build/reference/output.md +41 -0
  882. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +258 -0
  883. package/pack/generated/codex/skills/rite-build/reference/spec-drift-guard.md +43 -0
  884. package/pack/generated/codex/skills/rite-build/reference/tdd.md +26 -0
  885. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +140 -0
  886. package/pack/generated/codex/skills/rite-converge/SKILL.md +143 -0
  887. package/pack/generated/codex/skills/rite-converge/reference/anti-patterns.md +35 -0
  888. package/pack/generated/codex/skills/rite-converge/reference/convergence-assessment.md +61 -0
  889. package/pack/generated/codex/skills/rite-customize/SKILL.md +79 -0
  890. package/pack/generated/codex/skills/rite-customize/agents/openai.yaml +2 -0
  891. package/pack/generated/codex/skills/rite-define/SKILL.md +165 -0
  892. package/pack/generated/codex/skills/rite-define/reference/anti-patterns.md +26 -0
  893. package/pack/generated/codex/skills/rite-define/reference/gates.md +152 -0
  894. package/pack/generated/codex/skills/rite-define/reference/plan-template.md +94 -0
  895. package/pack/generated/codex/skills/rite-doctor/SKILL.md +88 -0
  896. package/pack/generated/codex/skills/rite-dogfood/SKILL.md +61 -0
  897. package/pack/generated/codex/skills/rite-dogfood/agents/openai.yaml +2 -0
  898. package/pack/generated/codex/skills/rite-explain/SKILL.md +160 -0
  899. package/pack/generated/codex/skills/rite-explain/agents/openai.yaml +2 -0
  900. package/pack/generated/codex/skills/rite-explain/reference/intake.md +79 -0
  901. package/pack/generated/codex/skills/rite-frame/SKILL.md +132 -0
  902. package/pack/generated/codex/skills/rite-frame/reference/failure-modes.md +68 -0
  903. package/pack/generated/codex/skills/rite-handoff/SKILL.md +109 -0
  904. package/pack/generated/codex/skills/rite-handoff/agents/openai.yaml +2 -0
  905. package/pack/generated/codex/skills/rite-handoff/reference/handoff-template.md +44 -0
  906. package/pack/generated/codex/skills/rite-learn/SKILL.md +129 -0
  907. package/pack/generated/codex/skills/rite-learn/agents/openai.yaml +2 -0
  908. package/pack/generated/codex/skills/rite-plan/SKILL.md +107 -0
  909. package/pack/generated/codex/skills/rite-plan/reference/anti-patterns.md +24 -0
  910. package/pack/generated/codex/skills/rite-plan/reference/dependency-graph.md +33 -0
  911. package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +42 -0
  912. package/pack/generated/codex/skills/rite-plan/reference/slicing.md +65 -0
  913. package/pack/generated/codex/skills/rite-plan/reference/task-breakdown.md +33 -0
  914. package/pack/generated/codex/skills/rite-polish/SKILL.md +99 -0
  915. package/pack/generated/codex/skills/rite-polish/reference/anti-ai-slop.md +206 -0
  916. package/pack/generated/codex/skills/rite-polish/reference/anti-patterns.md +30 -0
  917. package/pack/generated/codex/skills/rite-polish/reference/backend-polish.md +80 -0
  918. package/pack/generated/codex/skills/rite-polish/reference/browser-polish-evidence.md +31 -0
  919. package/pack/generated/codex/skills/rite-polish/reference/code.md +100 -0
  920. package/pack/generated/codex/skills/rite-polish/reference/design-system-discovery.md +8 -0
  921. package/pack/generated/codex/skills/rite-polish/reference/harden-checklist.md +109 -0
  922. package/pack/generated/codex/skills/rite-polish/reference/ui.md +136 -0
  923. package/pack/generated/codex/skills/rite-pov/SKILL.md +58 -0
  924. package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +61 -0
  925. package/pack/generated/codex/skills/rite-pr-feedback/agents/openai.yaml +2 -0
  926. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +86 -0
  927. package/pack/generated/codex/skills/rite-prototype/SKILL.md +122 -0
  928. package/pack/generated/codex/skills/rite-prototype/agents/openai.yaml +2 -0
  929. package/pack/generated/codex/skills/rite-prove/SKILL.md +116 -0
  930. package/pack/generated/codex/skills/rite-prove/reference/acceptance-proof.md +48 -0
  931. package/pack/generated/codex/skills/rite-prove/reference/anti-patterns.md +25 -0
  932. package/pack/generated/codex/skills/rite-prove/reference/browser-proof.md +49 -0
  933. package/pack/generated/codex/skills/rite-prove/reference/failure-triage.md +25 -0
  934. package/pack/generated/codex/skills/rite-prove/reference/proof-ladder.md +28 -0
  935. package/pack/generated/codex/skills/rite-prove/reference/test-command-discovery.md +30 -0
  936. package/pack/generated/codex/skills/rite-quick/SKILL.md +105 -0
  937. package/pack/generated/codex/skills/rite-resolve/SKILL.md +121 -0
  938. package/pack/generated/codex/skills/rite-resolve/agents/openai.yaml +2 -0
  939. package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +115 -0
  940. package/pack/generated/codex/skills/rite-review/SKILL.md +183 -0
  941. package/pack/generated/codex/skills/rite-review/reference/anti-patterns.md +32 -0
  942. package/pack/generated/codex/skills/rite-review/reference/cognitive-load.md +92 -0
  943. package/pack/generated/codex/skills/rite-review/reference/feature-scoped-review.md +26 -0
  944. package/pack/generated/codex/skills/rite-review/reference/five-axis-review.md +60 -0
  945. package/pack/generated/codex/skills/rite-review/reference/nielsen-heuristics.md +130 -0
  946. package/pack/generated/codex/skills/rite-review/reference/performance-checklist.md +80 -0
  947. package/pack/generated/codex/skills/rite-review/reference/performance-review.md +14 -0
  948. package/pack/generated/codex/skills/rite-review/reference/security-review.md +37 -0
  949. package/pack/generated/codex/skills/rite-seal/SKILL.md +113 -0
  950. package/pack/generated/codex/skills/rite-seal/reference/anti-patterns.md +29 -0
  951. package/pack/generated/codex/skills/rite-seal/reference/conventions-ledger.md +60 -0
  952. package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +64 -0
  953. package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +53 -0
  954. package/pack/generated/codex/skills/rite-seal/reference/output.md +7 -0
  955. package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +211 -0
  956. package/pack/generated/codex/skills/rite-seal/reference/risk-and-rollback.md +30 -0
  957. package/pack/generated/codex/skills/rite-seal/reference/seal-template.md +36 -0
  958. package/pack/generated/codex/skills/rite-ship/SKILL.md +123 -0
  959. package/pack/generated/codex/skills/rite-ship/reference/adr-promotion.md +9 -0
  960. package/pack/generated/codex/skills/rite-ship/reference/anti-patterns.md +25 -0
  961. package/pack/generated/codex/skills/rite-ship/reference/close-out.md +42 -0
  962. package/pack/generated/codex/skills/rite-ship/reference/design-memory.md +120 -0
  963. package/pack/generated/codex/skills/rite-ship/reference/git-ship.md +73 -0
  964. package/pack/generated/codex/skills/rite-ship/reference/ledger.md +56 -0
  965. package/pack/generated/codex/skills/rite-ship/reference/rollout.md +43 -0
  966. package/pack/generated/codex/skills/rite-ship/reference/ship-template.md +33 -0
  967. package/pack/generated/codex/skills/rite-spec/SKILL.md +229 -0
  968. package/pack/generated/codex/skills/rite-spec/reference/acceptance-criteria.md +31 -0
  969. package/pack/generated/codex/skills/rite-spec/reference/ai-spec-template.md +33 -0
  970. package/pack/generated/codex/skills/rite-spec/reference/anti-patterns.md +28 -0
  971. package/pack/generated/codex/skills/rite-spec/reference/interview-patterns.md +56 -0
  972. package/pack/generated/codex/skills/rite-spec/reference/investigation.md +84 -0
  973. package/pack/generated/codex/skills/rite-spec/reference/question-protocol.md +31 -0
  974. package/pack/generated/codex/skills/rite-spec/reference/references-intake.md +62 -0
  975. package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +73 -0
  976. package/pack/generated/codex/skills/rite-spec/reference/spec-template.md +110 -0
  977. package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +156 -0
  978. package/pack/generated/codex/skills/rite-status/SKILL.md +119 -0
  979. package/pack/generated/codex/skills/rite-status/agents/openai.yaml +2 -0
  980. package/pack/generated/codex/skills/rite-temper/SKILL.md +138 -0
  981. package/pack/generated/codex/skills/rite-temper/reference/anti-patterns.md +29 -0
  982. package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +65 -0
  983. package/pack/generated/codex/skills/rite-temper/reference/scope-modes.md +53 -0
  984. package/pack/generated/codex/skills/rite-temper/reference/significance.md +46 -0
  985. package/pack/generated/codex/skills/rite-temper/reference/strategy-template.md +90 -0
  986. package/pack/generated/codex/skills/rite-vet/SKILL.md +187 -0
  987. package/pack/generated/codex/skills/rite-vet/reference/anti-patterns.md +29 -0
  988. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +135 -0
  989. package/pack/generated/codex/skills/rite-vet/reference/cross-model.md +43 -0
  990. package/pack/generated/codex/skills/rite-vet/reference/depth.md +53 -0
  991. package/pack/generated/codex/skills/rite-vet/reference/eng-lenses.md +48 -0
  992. package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +167 -0
  993. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +87 -0
  994. package/pack/generated/codex/skills/rite-zoom-out/agents/openai.yaml +2 -0
  995. package/package.json +8 -4
  996. package/scripts/build-binaries.sh +75 -0
  997. package/scripts/build-host-artifacts.sh +100 -0
  998. package/scripts/build-release-tarball.sh +16 -2
  999. package/scripts/check-cross-refs.py +17 -3
  1000. package/scripts/check-generated-skill-budget.mjs +41 -0
  1001. package/scripts/check-instruction-size-baseline.mjs +79 -0
  1002. package/scripts/check-invocation-integrity.py +113 -0
  1003. package/scripts/check-no-global-writes.sh +22 -0
  1004. package/scripts/check-no-personal-paths.py +50 -0
  1005. package/scripts/check-reference-governance.mjs +82 -0
  1006. package/scripts/check-reply-contract.sh +64 -0
  1007. package/scripts/check-rule-uniqueness.sh +4 -32
  1008. package/scripts/codex-generate.sh +300 -0
  1009. package/scripts/devrites-detect.sh +2 -1
  1010. package/scripts/eval-runner.py +4 -2
  1011. package/scripts/eval-scorer.mjs +46 -0
  1012. package/scripts/grade-feature.sh +24 -7
  1013. package/scripts/install-lib.sh +112 -19
  1014. package/scripts/pin.sh +4 -4
  1015. package/scripts/release-check.sh +71 -0
  1016. package/scripts/run-behavioral-evals.sh +34 -2
  1017. package/scripts/run-evals.sh +45 -30
  1018. package/scripts/run-live-behavioral-evals.py +180 -0
  1019. package/scripts/run-outcome-evals.sh +27 -0
  1020. package/scripts/run-routing-evals.py +342 -0
  1021. package/scripts/run-tests.mjs +203 -0
  1022. package/scripts/skill-pruning-audit.mjs +120 -0
  1023. package/scripts/skills-inventory.mjs +107 -0
  1024. package/scripts/validate-agent-composition.py +57 -0
  1025. package/scripts/validate-command-parity.py +70 -0
  1026. package/scripts/validate-frontmatter.py +43 -7
  1027. package/scripts/validate-skill-anatomy.py +139 -0
  1028. package/scripts/validate-workflow-security.py +22 -3
  1029. package/scripts/validate-workspace-schema.py +512 -0
  1030. package/scripts/validate.sh +174 -34
  1031. package/uninstall.sh +22 -183
  1032. package/update.sh +29 -185
  1033. package/docs/cli-mcp.md +0 -62
  1034. package/mcp/devrites-mcp.mjs +0 -105
  1035. package/pack/.claude/hooks/devrites-a1-guard.sh +0 -99
  1036. package/pack/.claude/hooks/devrites-allow.sh +0 -44
  1037. package/pack/.claude/hooks/devrites-cursor.sh +0 -28
  1038. package/pack/.claude/hooks/devrites-orient.sh +0 -53
  1039. package/pack/.claude/hooks/devrites-redwatch.sh +0 -39
  1040. package/pack/.claude/hooks/devrites-refresh-indexes.sh +0 -127
  1041. package/pack/.claude/hooks/devrites-reviewer-readonly.sh +0 -37
  1042. package/pack/.claude/hooks/devrites-statusline.sh +0 -18
  1043. package/pack/.claude/hooks/devrites-stop-gate.sh +0 -45
  1044. package/pack/.claude/hooks/devrites-wright-scope.sh +0 -64
  1045. package/pack/.claude/hooks/hooks.json +0 -52
  1046. package/pack/.claude/rules/code-review.md +0 -48
  1047. package/pack/.claude/rules/development-workflow.md +0 -40
  1048. package/pack/.claude/rules/git-workflow.md +0 -35
  1049. package/pack/.claude/rules/spec-grammar.md +0 -106
  1050. package/pack/.claude/rules/testing.md +0 -88
  1051. package/pack/.claude/skills/devrites-lib/scripts/analyze.sh +0 -78
  1052. package/pack/.claude/skills/devrites-lib/scripts/check-acceptance.sh +0 -75
  1053. package/pack/.claude/skills/devrites-lib/scripts/close-out.sh +0 -47
  1054. package/pack/.claude/skills/devrites-lib/scripts/conventions.py +0 -273
  1055. package/pack/.claude/skills/devrites-lib/scripts/coverage.sh +0 -51
  1056. package/pack/.claude/skills/devrites-lib/scripts/devrites.sh +0 -77
  1057. package/pack/.claude/skills/devrites-lib/scripts/doctor.sh +0 -156
  1058. package/pack/.claude/skills/devrites-lib/scripts/doubt-coverage.sh +0 -59
  1059. package/pack/.claude/skills/devrites-lib/scripts/evidence-fresh.sh +0 -63
  1060. package/pack/.claude/skills/devrites-lib/scripts/footprint.sh +0 -45
  1061. package/pack/.claude/skills/devrites-lib/scripts/learnings.sh +0 -74
  1062. package/pack/.claude/skills/devrites-lib/scripts/mutation-gate.sh +0 -52
  1063. package/pack/.claude/skills/devrites-lib/scripts/package-existence.sh +0 -68
  1064. package/pack/.claude/skills/devrites-lib/scripts/preamble.sh +0 -76
  1065. package/pack/.claude/skills/devrites-lib/scripts/progress.sh +0 -103
  1066. package/pack/.claude/skills/devrites-lib/scripts/readiness.sh +0 -62
  1067. package/pack/.claude/skills/devrites-lib/scripts/reconcile.sh +0 -123
  1068. package/pack/.claude/skills/devrites-lib/scripts/resolve.sh +0 -279
  1069. package/pack/.claude/skills/devrites-lib/scripts/rites.sh +0 -41
  1070. package/pack/.claude/skills/devrites-lib/scripts/spec-validate.sh +0 -130
  1071. package/pack/.claude/skills/devrites-lib/scripts/stuck.sh +0 -67
  1072. package/pack/.claude/skills/devrites-lib/scripts/test-integrity.sh +0 -87
  1073. package/pack/.claude/skills/devrites-lib/scripts/tick-afk.sh +0 -52
  1074. package/scripts/merge-codex-hooks.mjs +0 -78
  1075. /package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/coding-style.md +0 -0
  1076. /package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/error-handling.md +0 -0
  1077. /package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/hooks.md +0 -0
  1078. /package/pack/.claude/{rules → skills/devrites-lib/reference/standards}/patterns.md +0 -0
@@ -0,0 +1,309 @@
1
+ package state
2
+
3
+ import (
4
+ "errors"
5
+ "fmt"
6
+ "os"
7
+ "path/filepath"
8
+ "sort"
9
+ "strconv"
10
+ "strings"
11
+
12
+ "github.com/devrites/devrites/internal/devritespaths"
13
+ )
14
+
15
+ // ResolveRoot returns the .devrites directory to operate on. A non-empty
16
+ // override (e.g. from DEVRITES_ROOT) may name either the project root or its
17
+ // .devrites directory; otherwise the nearest ancestor .devrites is used.
18
+ func ResolveRoot(override string) (string, error) {
19
+ if override != "" {
20
+ info, err := os.Stat(override)
21
+ if err != nil {
22
+ return "", fmt.Errorf("DEVRITES_ROOT %q: %w", override, err)
23
+ }
24
+ if !info.IsDir() {
25
+ return "", fmt.Errorf("DEVRITES_ROOT %q is not a directory", override)
26
+ }
27
+ if filepath.Base(filepath.Clean(override)) == ".devrites" {
28
+ return override, nil
29
+ }
30
+ child := filepath.Join(override, ".devrites")
31
+ if info, err := os.Stat(child); err == nil && info.IsDir() {
32
+ return child, nil
33
+ }
34
+ return "", fmt.Errorf("DEVRITES_ROOT %q is not a project root or .devrites directory", override)
35
+ }
36
+ cwd, err := os.Getwd()
37
+ if err != nil {
38
+ return "", fmt.Errorf("resolve working directory: %w", err)
39
+ }
40
+ for dir := cwd; ; {
41
+ cand := filepath.Join(dir, ".devrites")
42
+ if info, err := os.Stat(cand); err == nil && info.IsDir() {
43
+ return cand, nil
44
+ }
45
+ parent := filepath.Dir(dir)
46
+ if parent == dir {
47
+ return "", errors.New("no .devrites directory found (set DEVRITES_ROOT or run inside a DevRites workspace)")
48
+ }
49
+ dir = parent
50
+ }
51
+ }
52
+
53
+ // Feature is a loaded per-feature workspace: its declared phase plus which
54
+ // completeness sections currently have real content.
55
+ type Feature struct {
56
+ Slug string
57
+ Phase Phase
58
+ Present map[Section]bool
59
+ }
60
+
61
+ // featureDir is where per-feature state lives under the root. work/ is the
62
+ // canonical layout; features/ remains readable as a compatibility alias.
63
+ func featureDir(root, slug string) string {
64
+ return devritespaths.FeatureDir(root, slug)
65
+ }
66
+
67
+ // ListFeatures returns the slugs of every feature under root — directories under
68
+ // canonical work/ plus compatibility features/ recognized as a feature — sorted.
69
+ // A directory is a feature if it has a manifest (feature.md) OR the working-state
70
+ // ledger (state.md), so a live workspace the pack created without a manifest
71
+ // still lists. Missing layout directories yield an empty list, not an error.
72
+ func ListFeatures(root string) ([]string, error) {
73
+ seen := map[string]bool{}
74
+ for _, layout := range []string{"work", "features"} {
75
+ entries, err := os.ReadDir(filepath.Join(root, layout))
76
+ if errors.Is(err, os.ErrNotExist) {
77
+ continue
78
+ }
79
+ if err != nil {
80
+ return nil, fmt.Errorf("list features: %w", err)
81
+ }
82
+ for _, e := range entries {
83
+ if !e.IsDir() {
84
+ continue
85
+ }
86
+ if isFeatureDir(filepath.Join(root, layout, e.Name())) {
87
+ seen[e.Name()] = true
88
+ }
89
+ }
90
+ }
91
+ slugs := make([]string, 0, len(seen))
92
+ for slug := range seen {
93
+ slugs = append(slugs, slug)
94
+ }
95
+ sort.Strings(slugs)
96
+ return slugs, nil
97
+ }
98
+
99
+ // isFeatureDir reports whether dir is a recognized feature: it carries a manifest
100
+ // or the working-state ledger. Either is a sufficient phase source for LoadFeature.
101
+ func isFeatureDir(dir string) bool {
102
+ return regularFileExists(filepath.Join(dir, "feature.md")) ||
103
+ regularFileExists(filepath.Join(dir, LedgerFile))
104
+ }
105
+
106
+ func regularFileExists(path string) bool {
107
+ info, err := os.Stat(path)
108
+ return err == nil && info.Mode().IsRegular()
109
+ }
110
+
111
+ // CandidateFiles returns the paths that make up feature <slug>: its feature.md
112
+ // manifest plus every file that can satisfy a section (canonical names and the
113
+ // transitional aliases), in a stable order. Not all need exist; callers that
114
+ // fingerprint the feature stat and hash the ones that do, so including the alias
115
+ // names means a change to either the canonical or the alias file is detected.
116
+ func CandidateFiles(root, slug string) []string {
117
+ dir := featureDir(root, slug)
118
+ files := []string{filepath.Join(dir, "feature.md")}
119
+ for _, s := range Sections {
120
+ for _, name := range sectionFiles[s] {
121
+ files = append(files, filepath.Join(dir, name))
122
+ }
123
+ }
124
+ return files
125
+ }
126
+
127
+ // LoadFeature reads feature <slug> under root. The phase comes from the manifest
128
+ // (feature.md) frontmatter when present, otherwise from the working-state ledger
129
+ // (state.md, a "- Phase: <p>" line) the live pack writes. A feature with neither a
130
+ // manifest nor a ledger does not exist. Section content is read from the canonical
131
+ // section files or their transitional aliases (see sectionFiles).
132
+ func LoadFeature(root, slug string) (*Feature, error) {
133
+ dir := featureDir(root, slug)
134
+
135
+ manifest, mErr := os.ReadFile(filepath.Join(dir, "feature.md"))
136
+ if mErr != nil && !errors.Is(mErr, os.ErrNotExist) {
137
+ return nil, fmt.Errorf("feature %q: %w", slug, mErr)
138
+ }
139
+ hasManifest := mErr == nil
140
+ hasLedger := regularFileExists(filepath.Join(dir, LedgerFile))
141
+ if !hasManifest && !hasLedger {
142
+ return nil, fmt.Errorf("feature %q not found", slug)
143
+ }
144
+
145
+ var phase Phase
146
+ if hasManifest {
147
+ fm, _ := splitFrontmatter(manifest)
148
+ if v := strings.TrimSpace(fm["schemaVersion"]); v != "" {
149
+ n, err := strconv.Atoi(v)
150
+ if err != nil {
151
+ return nil, fmt.Errorf("feature %q: invalid schemaVersion %q", slug, v)
152
+ }
153
+ if n > SchemaVersion {
154
+ return nil, fmt.Errorf("feature %q: schemaVersion %d is newer than this engine supports (%d); upgrade devrites", slug, n, SchemaVersion)
155
+ }
156
+ }
157
+ phase = Phase(strings.TrimSpace(fm["phase"]))
158
+ }
159
+ // Ledger fallback: only when the manifest did not declare a phase, so a manifest
160
+ // with an explicit-but-unknown phase still surfaces as that error below.
161
+ if phase == "" {
162
+ phase = PhaseFromLedger(filepath.Join(dir, LedgerFile))
163
+ }
164
+ if phase == "" {
165
+ return nil, fmt.Errorf("feature %q: no phase in feature.md frontmatter or %s ledger", slug, LedgerFile)
166
+ }
167
+ if !KnownPhase(phase) {
168
+ return nil, fmt.Errorf("feature %q: unknown phase %q", slug, phase)
169
+ }
170
+
171
+ present := make(map[Section]bool, len(Sections))
172
+ for _, s := range Sections {
173
+ present[s] = sectionPresentAny(dir, s)
174
+ }
175
+ return &Feature{Slug: slug, Phase: phase, Present: present}, nil
176
+ }
177
+
178
+ // sectionPresentAny reports whether any file that can satisfy section s has real
179
+ // content — the canonical name or a transitional alias.
180
+ func sectionPresentAny(dir string, s Section) bool {
181
+ for _, name := range sectionFiles[s] {
182
+ if sectionPresent(filepath.Join(dir, name)) {
183
+ return true
184
+ }
185
+ }
186
+ return false
187
+ }
188
+
189
+ // PhaseFromLedger reads a phase from the working-state ledger: the value of a
190
+ // "- Phase: <p>" line (leading list markers tolerated), taking the first token
191
+ // and accepting it only if it is a phase the engine understands. Returns "" when
192
+ // the file is absent or declares no recognized phase. Unlike migrate's tolerant
193
+ // legacy mapping, this accepts only canonical phase words — the live pack's form.
194
+ func PhaseFromLedger(path string) Phase {
195
+ raw, err := os.ReadFile(path)
196
+ if err != nil {
197
+ return ""
198
+ }
199
+ for _, line := range strings.Split(string(raw), "\n") {
200
+ t := strings.TrimLeft(strings.TrimSpace(line), "-*+ \t")
201
+ key, val, ok := strings.Cut(t, ":")
202
+ if !ok || !strings.EqualFold(strings.TrimSpace(key), "phase") {
203
+ continue
204
+ }
205
+ word := strings.ToLower(strings.TrimSpace(val))
206
+ if i := strings.IndexAny(word, " \t"); i > 0 {
207
+ word = word[:i]
208
+ }
209
+ if p := Phase(word); KnownPhase(p) {
210
+ return p
211
+ }
212
+ }
213
+ return ""
214
+ }
215
+
216
+ // ReadDeclaredSchemaVersion returns the schemaVersion declared in a feature's
217
+ // feature.md frontmatter, or 0 if the file, frontmatter, or field is
218
+ // absent/unparseable. Unlike LoadFeature it does NOT refuse a version newer than
219
+ // the engine supports — doctor needs to observe a newer version to report skew,
220
+ // not fail on it.
221
+ func ReadDeclaredSchemaVersion(root, slug string) int {
222
+ raw, err := os.ReadFile(filepath.Join(featureDir(root, slug), "feature.md"))
223
+ if err != nil {
224
+ return 0
225
+ }
226
+ fm, _ := splitFrontmatter(raw)
227
+ n, err := strconv.Atoi(strings.TrimSpace(fm["schemaVersion"]))
228
+ if err != nil {
229
+ return 0
230
+ }
231
+ return n
232
+ }
233
+
234
+ // MaxDeclaredSchemaVersion returns the highest schemaVersion declared by any
235
+ // feature under root, or 0 when no feature declares one. It is how doctor reports
236
+ // the "state" leg of the version triangle.
237
+ func MaxDeclaredSchemaVersion(root string) (int, error) {
238
+ slugs, err := ListFeatures(root)
239
+ if err != nil {
240
+ return 0, fmt.Errorf("resolve max schema version: %w", err)
241
+ }
242
+ max := 0
243
+ for _, slug := range slugs {
244
+ if v := ReadDeclaredSchemaVersion(root, slug); v > max {
245
+ max = v
246
+ }
247
+ }
248
+ return max, nil
249
+ }
250
+
251
+ // blankOrHash reports whether a trimmed line carries no meaningful content —
252
+ // it is empty or starts with '#' (a Markdown ATX heading, or a comment inside a
253
+ // frontmatter block). Both the section-content scan and the frontmatter parser
254
+ // skip such lines.
255
+ func blankOrHash(trimmed string) bool {
256
+ return trimmed == "" || strings.HasPrefix(trimmed, "#")
257
+ }
258
+
259
+ // sectionPresent reports whether a section file has real content: it exists
260
+ // and, after removing a leading YAML frontmatter block, ATX (`#`) headings, and
261
+ // whitespace, some content remains. A stub that is only a heading counts as
262
+ // empty, so scaffolding a file never fakes completeness.
263
+ func sectionPresent(path string) bool {
264
+ raw, err := os.ReadFile(path)
265
+ if err != nil {
266
+ return false
267
+ }
268
+ _, body := splitFrontmatter(raw)
269
+ for _, line := range strings.Split(string(body), "\n") {
270
+ if !blankOrHash(strings.TrimSpace(line)) {
271
+ return true
272
+ }
273
+ }
274
+ return false
275
+ }
276
+
277
+ // splitFrontmatter separates a leading `---\n ... \n---\n` block from the body.
278
+ // The closing fence must be a line that is exactly `---` (so a `----` rule or a
279
+ // `--- note` line in the body is never mistaken for it). It parses only flat
280
+ // `key: value` scalars (no third-party YAML dependency). With no well-formed
281
+ // block the map is empty and body is the original input.
282
+ func splitFrontmatter(raw []byte) (map[string]string, []byte) {
283
+ fm := map[string]string{}
284
+ norm := strings.ReplaceAll(string(raw), "\r\n", "\n")
285
+ if !strings.HasPrefix(norm, "---\n") {
286
+ return fm, raw
287
+ }
288
+ lines := strings.Split(norm[len("---\n"):], "\n")
289
+ end := -1
290
+ for i, line := range lines {
291
+ if strings.TrimRight(line, " \t") == "---" {
292
+ end = i
293
+ break
294
+ }
295
+ }
296
+ if end < 0 {
297
+ return fm, raw // no closing fence — treat as if there were no frontmatter
298
+ }
299
+ for _, line := range lines[:end] {
300
+ t := strings.TrimSpace(line)
301
+ if blankOrHash(t) {
302
+ continue
303
+ }
304
+ if k, v, ok := strings.Cut(t, ":"); ok {
305
+ fm[strings.TrimSpace(k)] = strings.Trim(strings.TrimSpace(v), `"'`)
306
+ }
307
+ }
308
+ return fm, []byte(strings.Join(lines[end+1:], "\n"))
309
+ }
@@ -0,0 +1,24 @@
1
+ //go:build !unix && !windows
2
+
3
+ package state
4
+
5
+ import (
6
+ "fmt"
7
+ "os"
8
+ )
9
+
10
+ // fileLock on non-unix platforms (notably Windows) is best-effort: the engine
11
+ // still cross-compiles and runs, but without kernel advisory locking. DevRites'
12
+ // concurrent-reviewer fan-out runs on macOS/Linux, where lock_unix.go provides
13
+ // real flock; this keeps the pure-Go build green on every target.
14
+ type fileLock struct{ f *os.File }
15
+
16
+ func acquireLock(path string) (*fileLock, error) {
17
+ f, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0o644)
18
+ if err != nil {
19
+ return nil, fmt.Errorf("acquire lock: %w", err)
20
+ }
21
+ return &fileLock{f: f}, nil
22
+ }
23
+
24
+ func (l *fileLock) release() error { return l.f.Close() }
@@ -0,0 +1,35 @@
1
+ //go:build unix
2
+
3
+ package state
4
+
5
+ import (
6
+ "fmt"
7
+ "os"
8
+ "syscall"
9
+ )
10
+
11
+ // fileLock is an exclusive advisory lock held on an open lock file. On unix it
12
+ // uses flock(2), which the kernel releases automatically when the file is closed
13
+ // or the process exits — so a crashed writer never strands the lock.
14
+ type fileLock struct{ f *os.File }
15
+
16
+ func acquireLock(path string) (*fileLock, error) {
17
+ f, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0o644)
18
+ if err != nil {
19
+ return nil, fmt.Errorf("acquire lock: %w", err)
20
+ }
21
+ // LOCK_EX blocks until the lock is available; contending devrites-engine processes
22
+ // queue here rather than racing the read-modify-write.
23
+ if err := syscall.Flock(int(f.Fd()), syscall.LOCK_EX); err != nil {
24
+ _ = f.Close()
25
+ return nil, fmt.Errorf("flock %s: %w", path, err)
26
+ }
27
+ return &fileLock{f: f}, nil
28
+ }
29
+
30
+ func (l *fileLock) release() error {
31
+ // Closing the descriptor releases the flock; unlock explicitly first so the
32
+ // intent is clear and the lock is gone before any close error is considered.
33
+ _ = syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN)
34
+ return l.f.Close()
35
+ }
@@ -0,0 +1,56 @@
1
+ //go:build windows
2
+
3
+ package state
4
+
5
+ import (
6
+ "fmt"
7
+ "os"
8
+ "syscall"
9
+ "unsafe"
10
+ )
11
+
12
+ const lockFileExclusiveLock = 0x2
13
+
14
+ var (
15
+ lockFileEx = syscall.NewLazyDLL("kernel32.dll").NewProc("LockFileEx")
16
+ unlockFileEx = syscall.NewLazyDLL("kernel32.dll").NewProc("UnlockFileEx")
17
+ )
18
+
19
+ type fileLock struct {
20
+ f *os.File
21
+ ov syscall.Overlapped
22
+ }
23
+
24
+ func acquireLock(path string) (*fileLock, error) {
25
+ f, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0o644)
26
+ if err != nil {
27
+ return nil, fmt.Errorf("acquire lock: %w", err)
28
+ }
29
+ l := &fileLock{f: f}
30
+ if ok, _, callErr := lockFileEx.Call(
31
+ f.Fd(),
32
+ lockFileExclusiveLock,
33
+ 0,
34
+ 1,
35
+ 0,
36
+ uintptr(unsafe.Pointer(&l.ov)),
37
+ ); ok == 0 {
38
+ _ = f.Close()
39
+ return nil, fmt.Errorf("lock file %s: %w", path, callErr)
40
+ }
41
+ return l, nil
42
+ }
43
+
44
+ func (l *fileLock) release() error {
45
+ if ok, _, callErr := unlockFileEx.Call(
46
+ l.f.Fd(),
47
+ 0,
48
+ 1,
49
+ 0,
50
+ uintptr(unsafe.Pointer(&l.ov)),
51
+ ); ok == 0 {
52
+ _ = l.f.Close()
53
+ return callErr
54
+ }
55
+ return l.f.Close()
56
+ }
@@ -0,0 +1,102 @@
1
+ package state
2
+
3
+ // SchemaVersion is the .devrites state-schema version this engine understands.
4
+ // A feature.md may declare its own schemaVersion in frontmatter; the engine
5
+ // refuses a version newer than this (see LoadFeature) and otherwise reads the
6
+ // files, which evolve additively.
7
+ const SchemaVersion = 1
8
+
9
+ // Section is one single-concern completeness file within a feature directory.
10
+ // Splitting a feature into small files (rather than one long document) keeps
11
+ // each file context-cheap and makes completeness self-evident.
12
+ type Section string
13
+
14
+ const (
15
+ SectionSpec Section = "spec" // outcome, scope, constraints
16
+ SectionPlan Section = "plan" // approach / implementation plan
17
+ SectionDecisions Section = "decisions" // decision log
18
+ SectionTasks Section = "tasks" // task breakdown with status
19
+ SectionProof Section = "proof" // acceptance criteria / evidence
20
+ SectionStatus Section = "status" // status checkpoint
21
+ )
22
+
23
+ // Sections is the canonical order sections are read and displayed in.
24
+ var Sections = []Section{
25
+ SectionSpec,
26
+ SectionPlan,
27
+ SectionDecisions,
28
+ SectionTasks,
29
+ SectionProof,
30
+ SectionStatus,
31
+ }
32
+
33
+ // sectionFiles lists the filenames that can satisfy each section, canonical name
34
+ // first, then the transitional aliases the live pack still writes — the same
35
+ // mapping `devrites-engine migrate` normalizes (evidence→proof, state→status). A section
36
+ // counts as present if ANY of its files has real content, so the engine reads a
37
+ // live workspace before the pack sweep converges the filenames. The manifest
38
+ // (feature.md) is not a section; it is handled separately in LoadFeature.
39
+ var sectionFiles = map[Section][]string{
40
+ SectionSpec: {"spec.md"},
41
+ SectionPlan: {"plan.md"},
42
+ SectionDecisions: {"decisions.md"},
43
+ SectionTasks: {"tasks.md"},
44
+ SectionProof: {"proof.md", "evidence.md"},
45
+ SectionStatus: {"status.md", "state.md"},
46
+ }
47
+
48
+ // LedgerFile is the working-state ledger the live pack writes. It carries the
49
+ // phase (as a "- Phase: <p>" line) when no feature.md manifest declares one, and
50
+ // it satisfies the status section.
51
+ const LedgerFile = "state.md"
52
+
53
+ // Phase is a workflow state. The order mirrors the rite-* arc.
54
+ type Phase string
55
+
56
+ const (
57
+ PhaseFrame Phase = "frame" // problem framing
58
+ PhaseSpec Phase = "spec" // specification
59
+ PhasePlan Phase = "plan" // planning
60
+ PhaseBuild Phase = "build" // implementation
61
+ PhaseProve Phase = "prove" // proof / testing
62
+ PhaseVet Phase = "vet" // review
63
+ PhaseSeal Phase = "seal" // completeness seal
64
+ PhaseShip Phase = "ship" // shipping
65
+ )
66
+
67
+ // requiredByPhase lists the sections that must have real content to complete a
68
+ // phase. Completeness is phase-relative: a section not yet required (e.g. proof
69
+ // during the spec phase) never blocks. The set is additive down the arc.
70
+ var requiredByPhase = map[Phase][]Section{
71
+ PhaseFrame: {},
72
+ PhaseSpec: {SectionSpec},
73
+ PhasePlan: {SectionSpec, SectionPlan},
74
+ PhaseBuild: {SectionSpec, SectionPlan, SectionDecisions, SectionTasks},
75
+ PhaseProve: {SectionSpec, SectionPlan, SectionDecisions, SectionTasks, SectionProof},
76
+ PhaseVet: {SectionSpec, SectionPlan, SectionDecisions, SectionTasks, SectionProof},
77
+ PhaseSeal: {SectionSpec, SectionPlan, SectionDecisions, SectionTasks, SectionProof, SectionStatus},
78
+ PhaseShip: {SectionSpec, SectionPlan, SectionDecisions, SectionTasks, SectionProof, SectionStatus},
79
+ }
80
+
81
+ // KnownPhase reports whether p is a phase the engine understands.
82
+ func KnownPhase(p Phase) bool {
83
+ _, ok := requiredByPhase[p]
84
+ return ok
85
+ }
86
+
87
+ // RequiredSections returns the sections required to complete the given phase,
88
+ // in canonical Sections order.
89
+ func RequiredSections(p Phase) []Section {
90
+ want := requiredByPhase[p]
91
+ set := make(map[Section]bool, len(want))
92
+ for _, s := range want {
93
+ set[s] = true
94
+ }
95
+ out := make([]Section, 0, len(want))
96
+ for _, s := range Sections {
97
+ if set[s] {
98
+ out = append(out, s)
99
+ }
100
+ }
101
+ return out
102
+ }