@erclx/canon 4.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 (643) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +129 -0
  3. package/claude/.claude-plugin/plugin.json +19 -0
  4. package/claude/skills/bash-cli-script/REQUIREMENT.md +42 -0
  5. package/claude/skills/bash-cli-script/SKILL.md +48 -0
  6. package/claude/skills/bash-cli-script/references/template.md +43 -0
  7. package/claude/skills/bash-script/REQUIREMENT.md +36 -0
  8. package/claude/skills/bash-script/SKILL.md +100 -0
  9. package/claude/skills/bash-script/references/patterns.md +349 -0
  10. package/claude/skills/canon-cli/REQUIREMENT.md +41 -0
  11. package/claude/skills/canon-cli/SKILL.md +103 -0
  12. package/claude/skills/canon-feedback-file/REQUIREMENT.md +40 -0
  13. package/claude/skills/canon-feedback-file/SKILL.md +80 -0
  14. package/claude/skills/canon-feedback-triage/REQUIREMENT.md +40 -0
  15. package/claude/skills/canon-feedback-triage/SKILL.md +63 -0
  16. package/claude/skills/canon-operator/REQUIREMENT.md +61 -0
  17. package/claude/skills/canon-operator/SKILL.md +108 -0
  18. package/claude/skills/canon-rollout/REQUIREMENT.md +59 -0
  19. package/claude/skills/canon-rollout/SKILL.md +147 -0
  20. package/claude/skills/canon-screencast/REQUIREMENT.md +39 -0
  21. package/claude/skills/canon-screencast/SKILL.md +167 -0
  22. package/claude/skills/canon-slides-draft/REQUIREMENT.md +39 -0
  23. package/claude/skills/canon-slides-draft/SKILL.md +62 -0
  24. package/claude/skills/ci-workflow/REQUIREMENT.md +40 -0
  25. package/claude/skills/ci-workflow/SKILL.md +65 -0
  26. package/claude/skills/ci-workflow/references/workflows.md +98 -0
  27. package/claude/skills/claude-address-review/REQUIREMENT.md +57 -0
  28. package/claude/skills/claude-address-review/SKILL.md +212 -0
  29. package/claude/skills/claude-address-review/references/rebase-conflicts.md +39 -0
  30. package/claude/skills/claude-autoship/REQUIREMENT.md +50 -0
  31. package/claude/skills/claude-autoship/SKILL.md +207 -0
  32. package/claude/skills/claude-design-extract/REQUIREMENT.md +42 -0
  33. package/claude/skills/claude-design-extract/SKILL.md +102 -0
  34. package/claude/skills/claude-diagram/REQUIREMENT.md +45 -0
  35. package/claude/skills/claude-diagram/SKILL.md +177 -0
  36. package/claude/skills/claude-docs/REQUIREMENT.md +60 -0
  37. package/claude/skills/claude-docs/SKILL.md +287 -0
  38. package/claude/skills/claude-docs/references/anchor-sweep.md +58 -0
  39. package/claude/skills/claude-docs/references/wireframe-sweep.md +45 -0
  40. package/claude/skills/claude-feature/REQUIREMENT.md +36 -0
  41. package/claude/skills/claude-feature/SKILL.md +115 -0
  42. package/claude/skills/claude-groundwork/REQUIREMENT.md +48 -0
  43. package/claude/skills/claude-groundwork/SKILL.md +142 -0
  44. package/claude/skills/claude-intake/REQUIREMENT.md +49 -0
  45. package/claude/skills/claude-intake/SKILL.md +114 -0
  46. package/claude/skills/claude-intake-answer/REQUIREMENT.md +48 -0
  47. package/claude/skills/claude-intake-answer/SKILL.md +90 -0
  48. package/claude/skills/claude-markdown-propose/REQUIREMENT.md +48 -0
  49. package/claude/skills/claude-markdown-propose/SKILL.md +118 -0
  50. package/claude/skills/claude-markdown-propose/references/format.md +107 -0
  51. package/claude/skills/claude-memory-capture/REQUIREMENT.md +50 -0
  52. package/claude/skills/claude-memory-capture/SKILL.md +101 -0
  53. package/claude/skills/claude-memory-review/REQUIREMENT.md +50 -0
  54. package/claude/skills/claude-memory-review/SKILL.md +210 -0
  55. package/claude/skills/claude-memory-review/references/receipt-format.md +48 -0
  56. package/claude/skills/claude-orchestrate/REQUIREMENT.md +121 -0
  57. package/claude/skills/claude-orchestrate/SKILL.md +241 -0
  58. package/claude/skills/claude-orchestrate/references/orchestrator-dispatch.md +132 -0
  59. package/claude/skills/claude-orchestrate/references/orchestrator-handoff.md +32 -0
  60. package/claude/skills/claude-orchestrate/references/orchestrator-parked.md +72 -0
  61. package/claude/skills/claude-orchestrate/references/orchestrator-poll.md +87 -0
  62. package/claude/skills/claude-orchestrate/references/orchestrator-resume.md +30 -0
  63. package/claude/skills/claude-orchestrate/references/orchestrator-sweep.md +21 -0
  64. package/claude/skills/claude-orchestrate/scripts/poll.sh +373 -0
  65. package/claude/skills/claude-orchestrate/scripts/watch.sh +181 -0
  66. package/claude/skills/claude-pr-review/REQUIREMENT.md +47 -0
  67. package/claude/skills/claude-pr-review/SKILL.md +295 -0
  68. package/claude/skills/claude-review/REQUIREMENT.md +39 -0
  69. package/claude/skills/claude-review/SKILL.md +142 -0
  70. package/claude/skills/claude-seed-sync/REQUIREMENT.md +45 -0
  71. package/claude/skills/claude-seed-sync/SKILL.md +156 -0
  72. package/claude/skills/claude-standards-audit/REQUIREMENT.md +33 -0
  73. package/claude/skills/claude-standards-audit/SKILL.md +99 -0
  74. package/claude/skills/claude-tasks/REQUIREMENT.md +43 -0
  75. package/claude/skills/claude-tasks/SKILL.md +161 -0
  76. package/claude/skills/claude-teach/REQUIREMENT.md +56 -0
  77. package/claude/skills/claude-teach/SKILL.md +196 -0
  78. package/claude/skills/claude-teach/references/lesson-craft.md +59 -0
  79. package/claude/skills/claude-teach/references/pedagogy.md +67 -0
  80. package/claude/skills/claude-teach/references/promotion.md +54 -0
  81. package/claude/skills/claude-ui-test/REQUIREMENT.md +40 -0
  82. package/claude/skills/claude-ui-test/SKILL.md +77 -0
  83. package/claude/skills/claude-ux-audit/REQUIREMENT.md +40 -0
  84. package/claude/skills/claude-ux-audit/SKILL.md +79 -0
  85. package/claude/skills/claude-ux-measure/REQUIREMENT.md +48 -0
  86. package/claude/skills/claude-ux-measure/SKILL.md +122 -0
  87. package/claude/skills/claude-worker/REQUIREMENT.md +54 -0
  88. package/claude/skills/claude-worker/SKILL.md +96 -0
  89. package/claude/skills/claude-worktree/REQUIREMENT.md +58 -0
  90. package/claude/skills/claude-worktree/SKILL.md +136 -0
  91. package/claude/skills/create-rule/REQUIREMENT.md +45 -0
  92. package/claude/skills/create-rule/SKILL.md +68 -0
  93. package/claude/skills/create-skill/REQUIREMENT.md +38 -0
  94. package/claude/skills/create-skill/SKILL.md +32 -0
  95. package/claude/skills/create-snippet/REQUIREMENT.md +39 -0
  96. package/claude/skills/create-snippet/SKILL.md +30 -0
  97. package/claude/skills/create-standard/REQUIREMENT.md +35 -0
  98. package/claude/skills/create-standard/SKILL.md +29 -0
  99. package/claude/skills/decision-escalate/REQUIREMENT.md +45 -0
  100. package/claude/skills/decision-escalate/SKILL.md +79 -0
  101. package/claude/skills/docs-sync/REQUIREMENT.md +41 -0
  102. package/claude/skills/docs-sync/SKILL.md +95 -0
  103. package/claude/skills/git-branch/REQUIREMENT.md +38 -0
  104. package/claude/skills/git-branch/SKILL.md +60 -0
  105. package/claude/skills/git-commit/REQUIREMENT.md +36 -0
  106. package/claude/skills/git-commit/SKILL.md +49 -0
  107. package/claude/skills/git-followup/REQUIREMENT.md +43 -0
  108. package/claude/skills/git-followup/SKILL.md +48 -0
  109. package/claude/skills/git-issue/REQUIREMENT.md +38 -0
  110. package/claude/skills/git-issue/SKILL.md +65 -0
  111. package/claude/skills/git-pr/REQUIREMENT.md +50 -0
  112. package/claude/skills/git-pr/SKILL.md +164 -0
  113. package/claude/skills/git-pr/references/labels.md +95 -0
  114. package/claude/skills/git-ship/REQUIREMENT.md +42 -0
  115. package/claude/skills/git-ship/SKILL.md +55 -0
  116. package/claude/skills/git-split/REQUIREMENT.md +39 -0
  117. package/claude/skills/git-split/SKILL.md +162 -0
  118. package/claude/skills/git-stage/REQUIREMENT.md +39 -0
  119. package/claude/skills/git-stage/SKILL.md +73 -0
  120. package/claude/skills/git-worktree/REQUIREMENT.md +38 -0
  121. package/claude/skills/git-worktree/SKILL.md +130 -0
  122. package/claude/skills/migration-claude-md/REQUIREMENT.md +40 -0
  123. package/claude/skills/migration-claude-md/SKILL.md +76 -0
  124. package/claude/skills/migration-context/REQUIREMENT.md +36 -0
  125. package/claude/skills/migration-context/SKILL.md +95 -0
  126. package/claude/skills/migration-standards-drop/REQUIREMENT.md +55 -0
  127. package/claude/skills/migration-standards-drop/SKILL.md +113 -0
  128. package/claude/skills/migration-superseded/REQUIREMENT.md +44 -0
  129. package/claude/skills/migration-superseded/SKILL.md +115 -0
  130. package/claude/skills/project-commands/REQUIREMENT.md +42 -0
  131. package/claude/skills/project-commands/SKILL.md +85 -0
  132. package/claude/skills/restate-plainly/REQUIREMENT.md +41 -0
  133. package/claude/skills/restate-plainly/SKILL.md +39 -0
  134. package/claude/skills/session-map/REQUIREMENT.md +57 -0
  135. package/claude/skills/session-map/SKILL.md +70 -0
  136. package/claude/skills/session-resume/REQUIREMENT.md +49 -0
  137. package/claude/skills/session-resume/SKILL.md +51 -0
  138. package/claude/skills/setup-gov/REQUIREMENT.md +37 -0
  139. package/claude/skills/setup-gov/SKILL.md +77 -0
  140. package/claude/skills/setup-indexes/REQUIREMENT.md +45 -0
  141. package/claude/skills/setup-indexes/SKILL.md +153 -0
  142. package/claude/skills/setup-init/REQUIREMENT.md +45 -0
  143. package/claude/skills/setup-init/SKILL.md +127 -0
  144. package/claude/skills/setup-plugins/REQUIREMENT.md +42 -0
  145. package/claude/skills/setup-plugins/SKILL.md +81 -0
  146. package/claude/skills/setup-plugins/references/plugin-catalog.md +53 -0
  147. package/claude/skills/setup-verify/REQUIREMENT.md +39 -0
  148. package/claude/skills/setup-verify/SKILL.md +51 -0
  149. package/claude/skills/systematic-debugging/REQUIREMENT.md +41 -0
  150. package/claude/skills/systematic-debugging/SKILL.md +70 -0
  151. package/claude/skills/write-human/REQUIREMENT.md +46 -0
  152. package/claude/skills/write-human/SKILL.md +68 -0
  153. package/claude/skills/write-human/references/density.md +38 -0
  154. package/claude/skills/write-human/references/machine-tells.md +107 -0
  155. package/claude/skills/write-human/references/source-material.md +37 -0
  156. package/claude/skills/youtube-transcripts/REQUIREMENT.md +38 -0
  157. package/claude/skills/youtube-transcripts/SKILL.md +34 -0
  158. package/docs/agents/audits.md +98 -0
  159. package/docs/agents/capture.md +37 -0
  160. package/docs/agents/census.md +23 -0
  161. package/docs/agents/commands.md +146 -0
  162. package/docs/agents/comments.md +34 -0
  163. package/docs/agents/context-audit-checks.md +120 -0
  164. package/docs/agents/context-audit.md +83 -0
  165. package/docs/agents/counts.md +76 -0
  166. package/docs/agents/demo.md +86 -0
  167. package/docs/agents/docs.md +17 -0
  168. package/docs/agents/gate.md +84 -0
  169. package/docs/agents/index.md +47 -0
  170. package/docs/agents/indexes.md +35 -0
  171. package/docs/agents/install-and-sync.md +385 -0
  172. package/docs/agents/intake.md +81 -0
  173. package/docs/agents/key-changes.md +103 -0
  174. package/docs/agents/label-coverage.md +73 -0
  175. package/docs/agents/markdown-audit.md +197 -0
  176. package/docs/agents/output-shape.md +70 -0
  177. package/docs/agents/overview.md +26 -0
  178. package/docs/agents/records.md +170 -0
  179. package/docs/agents/restated.md +81 -0
  180. package/docs/agents/review-classification.md +77 -0
  181. package/docs/agents/routing.md +61 -0
  182. package/docs/agents/rule-citations.md +98 -0
  183. package/docs/agents/sandbox.md +71 -0
  184. package/docs/agents/scripting.md +149 -0
  185. package/docs/agents/sessions.md +120 -0
  186. package/docs/agents/skills-audit.md +94 -0
  187. package/docs/agents/skills-reach.md +64 -0
  188. package/docs/agents/standards-audit.md +38 -0
  189. package/docs/agents/state-scoped-risk.md +105 -0
  190. package/docs/agents/superseded.md +85 -0
  191. package/docs/agents/targets.md +83 -0
  192. package/docs/agents/tasks.md +200 -0
  193. package/docs/agents/teach.md +158 -0
  194. package/docs/agents/test-order.md +56 -0
  195. package/docs/agents/worktrees.md +62 -0
  196. package/docs/ai-workflow.md +317 -0
  197. package/docs/index.md +23 -0
  198. package/docs/operating-model.md +223 -0
  199. package/docs/target-projects.md +258 -0
  200. package/docs/visual-design-workflow.md +151 -0
  201. package/docs/zshrc-aliases.md +65 -0
  202. package/governance/rules/ci/700-ci-workflow.md +44 -0
  203. package/governance/rules/claude/500-prose.md +15 -0
  204. package/governance/rules/claude/501-markdown.md +14 -0
  205. package/governance/rules/claude/510-context.md +28 -0
  206. package/governance/rules/claude/511-indexes.md +14 -0
  207. package/governance/rules/claude/520-wireframes.md +12 -0
  208. package/governance/rules/claude/530-requirements.md +11 -0
  209. package/governance/rules/claude/540-architecture.md +11 -0
  210. package/governance/rules/claude/550-design.md +11 -0
  211. package/governance/rules/claude/555-tasks.md +12 -0
  212. package/governance/rules/claude/556-groundwork.md +11 -0
  213. package/governance/rules/claude/557-intake.md +11 -0
  214. package/governance/rules/claude/558-plan.md +22 -0
  215. package/governance/rules/claude/559-memory.md +11 -0
  216. package/governance/rules/claude/560-diagrams.md +18 -0
  217. package/governance/rules/claude/561-teach.md +13 -0
  218. package/governance/rules/claude/562-session.md +15 -0
  219. package/governance/rules/claude/570-skill.md +24 -0
  220. package/governance/rules/claude/575-hooks.md +17 -0
  221. package/governance/rules/claude/576-settings.md +14 -0
  222. package/governance/rules/claude/580-readme.md +11 -0
  223. package/governance/rules/claude/590-rule-authoring.md +12 -0
  224. package/governance/rules/claude/591-standard-authoring.md +12 -0
  225. package/governance/rules/claude/592-claude-md.md +19 -0
  226. package/governance/rules/core/000-constitution.md +30 -0
  227. package/governance/rules/core/005-behavior.md +27 -0
  228. package/governance/rules/core/010-testing.md +35 -0
  229. package/governance/rules/core/015-output.md +20 -0
  230. package/governance/rules/core/020-concurrency.md +22 -0
  231. package/governance/rules/core/025-indexes.md +9 -0
  232. package/governance/rules/core/030-error-handling.md +31 -0
  233. package/governance/rules/core/035-tasks.md +13 -0
  234. package/governance/rules/core/040-performance.md +20 -0
  235. package/governance/rules/core/045-memory.md +12 -0
  236. package/governance/rules/core/050-logging.md +20 -0
  237. package/governance/rules/core/055-scratch.md +9 -0
  238. package/governance/rules/core/060-naming.md +19 -0
  239. package/governance/rules/core/065-spelling.md +19 -0
  240. package/governance/rules/core/070-planning.md +18 -0
  241. package/governance/rules/core/075-dependencies.md +25 -0
  242. package/governance/rules/core/080-config-comments.md +22 -0
  243. package/governance/rules/core/085-worktrees.md +17 -0
  244. package/governance/rules/core/087-git.md +11 -0
  245. package/governance/rules/core/090-code-comments.md +39 -0
  246. package/governance/rules/framework/200-react.md +51 -0
  247. package/governance/rules/framework/210-astro.md +41 -0
  248. package/governance/rules/framework/220-fastapi.md +43 -0
  249. package/governance/rules/framework/230-nextjs.md +48 -0
  250. package/governance/rules/framework/250-tailwind.md +32 -0
  251. package/governance/rules/framework/260-shadcn.md +34 -0
  252. package/governance/rules/lang/100-typescript.md +40 -0
  253. package/governance/rules/lang/110-python.md +42 -0
  254. package/governance/rules/lang/120-bash.md +19 -0
  255. package/governance/rules/lib/300-testing-ts.md +39 -0
  256. package/governance/rules/lib/305-e2e-reliability.md +34 -0
  257. package/governance/rules/lib/306-test-scope.md +25 -0
  258. package/governance/rules/lib/310-zod.md +25 -0
  259. package/governance/rules/lib/320-tanstack-query.md +32 -0
  260. package/governance/rules/lib/330-testing-py.md +44 -0
  261. package/governance/rules/lib/340-pydantic.md +38 -0
  262. package/governance/rules/lib/350-security-web.md +32 -0
  263. package/governance/rules/lib/360-security-server.md +39 -0
  264. package/governance/rules/lib/370-database.md +35 -0
  265. package/governance/rules/snippets/505-at-references.md +9 -0
  266. package/governance/rules/ui/400-ui.md +36 -0
  267. package/governance/rules/ui/410-a11y.md +48 -0
  268. package/governance/rules/ui/420-forms.md +36 -0
  269. package/governance/rules/ui/430-ux-completeness.md +65 -0
  270. package/governance/rules/ui/440-surface-capture.md +34 -0
  271. package/governance/rules/ui/450-link-behavior.md +19 -0
  272. package/governance/stacks/astro.toml +2 -0
  273. package/governance/stacks/base.toml +8 -0
  274. package/governance/stacks/node-server.toml +2 -0
  275. package/governance/stacks/node.toml +2 -0
  276. package/governance/stacks/python-fastapi.toml +2 -0
  277. package/governance/stacks/python.toml +2 -0
  278. package/governance/stacks/react.toml +2 -0
  279. package/package.json +69 -0
  280. package/scripts/config.sh +11 -0
  281. package/scripts/core/bootstrap.sh +81 -0
  282. package/scripts/core/check-color-source.sh +41 -0
  283. package/scripts/core/check-ignore-parity.sh +162 -0
  284. package/scripts/core/check-plugin-boundary.sh +45 -0
  285. package/scripts/core/check-seed-independence.sh +59 -0
  286. package/scripts/core/check-skill-paths.sh +24 -0
  287. package/scripts/core/clean.sh +36 -0
  288. package/scripts/core/install-check.sh +101 -0
  289. package/scripts/core/list-seed-roots.sh +18 -0
  290. package/scripts/core/regen-claude-copies.sh +10 -0
  291. package/scripts/core/regen-hero.sh +217 -0
  292. package/scripts/core/regen-indexes.sh +10 -0
  293. package/scripts/core/regen-tooling-paths.sh +61 -0
  294. package/scripts/core/repair-bare-flag.sh +19 -0
  295. package/scripts/core/snapshot.sh +134 -0
  296. package/scripts/core/update.sh +35 -0
  297. package/scripts/docs/list.sh +165 -0
  298. package/scripts/lib/frontmatter.sh +30 -0
  299. package/scripts/lib/gov.sh +14 -0
  300. package/scripts/lib/sandbox-fixtures.sh +191 -0
  301. package/scripts/lib/sandbox-git.sh +125 -0
  302. package/scripts/lib/sandbox-path.sh +206 -0
  303. package/scripts/lib/tooling.sh +35 -0
  304. package/scripts/lib/ui.sh +266 -0
  305. package/scripts/lib/worktree.sh +20 -0
  306. package/scripts/manage-sandbox.sh +466 -0
  307. package/scripts/snippets/create.sh +156 -0
  308. package/scripts/standards/list.sh +115 -0
  309. package/scripts/tooling/create.sh +109 -0
  310. package/scripts/tooling/verify.sh +179 -0
  311. package/snippets/align.md +12 -0
  312. package/snippets/claude/decision-memo.md +39 -0
  313. package/snippets/claude/feature-recap.md +19 -0
  314. package/snippets/claude/figma-steps.md +24 -0
  315. package/snippets/compact-summary.md +5 -0
  316. package/snippets/decision-help.md +6 -0
  317. package/snippets/meta-prompt.md +14 -0
  318. package/snippets/research-prompt.md +7 -0
  319. package/snippets/session-notes.md +11 -0
  320. package/snippets/snippets.toml +5 -0
  321. package/snippets/step-by-step.md +10 -0
  322. package/snippets/web-research.md +21 -0
  323. package/src/audits/baseline.ts +201 -0
  324. package/src/audits/catalog.ts +876 -0
  325. package/src/audits/run.ts +204 -0
  326. package/src/autoship/classify.ts +75 -0
  327. package/src/autoship/paths.ts +51 -0
  328. package/src/binary.ts +16 -0
  329. package/src/browser/engine.ts +40 -0
  330. package/src/census/count.ts +113 -0
  331. package/src/claude/cases/all.ts +24 -0
  332. package/src/claude/cases/authoring.ts +53 -0
  333. package/src/claude/cases/claude-workflow.ts +158 -0
  334. package/src/claude/cases/git.ts +44 -0
  335. package/src/claude/cases/misc.ts +27 -0
  336. package/src/claude/cases/setup.ts +94 -0
  337. package/src/claude/gitignore.ts +51 -0
  338. package/src/claude/routing.ts +283 -0
  339. package/src/claude/seeds-list.ts +47 -0
  340. package/src/claude/seeds.ts +150 -0
  341. package/src/claude/settings.ts +151 -0
  342. package/src/claude/skills-audit.ts +228 -0
  343. package/src/claude/skills-drift.ts +156 -0
  344. package/src/claude/skills-list.ts +99 -0
  345. package/src/claude/skills-rank.ts +320 -0
  346. package/src/claude/skills-reach.ts +227 -0
  347. package/src/cli-run.ts +43 -0
  348. package/src/cli.ts +200 -0
  349. package/src/commands/audits.ts +350 -0
  350. package/src/commands/autoship.ts +129 -0
  351. package/src/commands/capture.ts +133 -0
  352. package/src/commands/census.ts +105 -0
  353. package/src/commands/claude.ts +1286 -0
  354. package/src/commands/comments.ts +240 -0
  355. package/src/commands/context.ts +857 -0
  356. package/src/commands/demo.ts +389 -0
  357. package/src/commands/deps.ts +173 -0
  358. package/src/commands/design.ts +36 -0
  359. package/src/commands/docs.ts +60 -0
  360. package/src/commands/feedback-format.ts +23 -0
  361. package/src/commands/feedback.ts +112 -0
  362. package/src/commands/gate.ts +189 -0
  363. package/src/commands/gov.ts +1265 -0
  364. package/src/commands/indexes.ts +184 -0
  365. package/src/commands/init.ts +113 -0
  366. package/src/commands/intake.ts +406 -0
  367. package/src/commands/inventory.ts +256 -0
  368. package/src/commands/labels.ts +361 -0
  369. package/src/commands/markdown.ts +544 -0
  370. package/src/commands/migrate.ts +175 -0
  371. package/src/commands/pass-through.ts +39 -0
  372. package/src/commands/pr.ts +411 -0
  373. package/src/commands/records.ts +728 -0
  374. package/src/commands/sandbox.ts +468 -0
  375. package/src/commands/secrets.ts +132 -0
  376. package/src/commands/serve.ts +159 -0
  377. package/src/commands/sessions.ts +408 -0
  378. package/src/commands/slides.ts +126 -0
  379. package/src/commands/snippets.ts +84 -0
  380. package/src/commands/standards.ts +247 -0
  381. package/src/commands/sync.ts +428 -0
  382. package/src/commands/targets.ts +319 -0
  383. package/src/commands/tasks.ts +743 -0
  384. package/src/commands/teach.ts +786 -0
  385. package/src/commands/tooling.ts +573 -0
  386. package/src/commands/transcripts.ts +44 -0
  387. package/src/commands/upgrade.ts +231 -0
  388. package/src/commands/wiki.ts +100 -0
  389. package/src/commands/worktrees.ts +191 -0
  390. package/src/comments/scan.ts +338 -0
  391. package/src/comments/trend.ts +207 -0
  392. package/src/comments/vocabulary.ts +85 -0
  393. package/src/context/architecture.ts +364 -0
  394. package/src/context/audit.ts +790 -0
  395. package/src/context/citations.ts +196 -0
  396. package/src/context/folders.ts +186 -0
  397. package/src/context/gate.ts +57 -0
  398. package/src/context/index-drift.ts +64 -0
  399. package/src/context/narration.ts +99 -0
  400. package/src/copy.ts +30 -0
  401. package/src/counts/catalogs.ts +96 -0
  402. package/src/counts/numbers.ts +79 -0
  403. package/src/counts/scan.ts +314 -0
  404. package/src/demo/beats.ts +135 -0
  405. package/src/demo/compile.ts +326 -0
  406. package/src/demo/container.ts +63 -0
  407. package/src/demo/cursors.ts +55 -0
  408. package/src/demo/drive.ts +357 -0
  409. package/src/demo/pointer.ts +178 -0
  410. package/src/demo/theme.ts +112 -0
  411. package/src/deps/audit.ts +153 -0
  412. package/src/design/parse.ts +116 -0
  413. package/src/design/render.ts +249 -0
  414. package/src/docs/read.ts +77 -0
  415. package/src/exec.ts +16 -0
  416. package/src/exempt-marker.ts +43 -0
  417. package/src/frontmatter.ts +13 -0
  418. package/src/gate/measures.ts +682 -0
  419. package/src/gate/sequencer.ts +386 -0
  420. package/src/gate/stages.ts +412 -0
  421. package/src/git-env.ts +36 -0
  422. package/src/git-files.ts +105 -0
  423. package/src/git-ignore.ts +46 -0
  424. package/src/github-format.ts +13 -0
  425. package/src/github.ts +24 -0
  426. package/src/gov/adapter.ts +103 -0
  427. package/src/gov/citations.ts +514 -0
  428. package/src/gov/consumed.ts +129 -0
  429. package/src/gov/install.ts +132 -0
  430. package/src/gov/list.ts +106 -0
  431. package/src/gov/payload.ts +39 -0
  432. package/src/gov/restated.ts +814 -0
  433. package/src/gov/stacks.ts +205 -0
  434. package/src/gov/superseded.ts +415 -0
  435. package/src/gov/test-order.ts +407 -0
  436. package/src/indexes/frontmatter.ts +46 -0
  437. package/src/indexes/regen.ts +84 -0
  438. package/src/indexes/render.ts +201 -0
  439. package/src/indexes/walk.ts +83 -0
  440. package/src/init/flags.ts +60 -0
  441. package/src/init/plan.ts +114 -0
  442. package/src/init/run.ts +46 -0
  443. package/src/init/steps.ts +77 -0
  444. package/src/intake/folder.ts +320 -0
  445. package/src/intake/items.ts +174 -0
  446. package/src/inventory/config.ts +117 -0
  447. package/src/inventory/group.ts +76 -0
  448. package/src/inventory/subjects.ts +114 -0
  449. package/src/inventory/walk.ts +129 -0
  450. package/src/labels/audit.ts +82 -0
  451. package/src/labels/coverage.ts +79 -0
  452. package/src/labels/map.ts +101 -0
  453. package/src/labels/phase.ts +95 -0
  454. package/src/markdown/bans.ts +94 -0
  455. package/src/markdown/files.ts +102 -0
  456. package/src/markdown/gate.ts +28 -0
  457. package/src/markdown/scan.ts +295 -0
  458. package/src/markdown/structure.ts +730 -0
  459. package/src/migrate/apply.ts +115 -0
  460. package/src/migrate/plan.ts +103 -0
  461. package/src/migrate/rename.ts +183 -0
  462. package/src/pr/bijection.ts +145 -0
  463. package/src/pr/paths.ts +335 -0
  464. package/src/process/harness.ts +167 -0
  465. package/src/project-root.ts +19 -0
  466. package/src/records/backup.ts +455 -0
  467. package/src/records/migrate.ts +78 -0
  468. package/src/records/size.ts +260 -0
  469. package/src/records/validate.ts +1162 -0
  470. package/src/sandbox/census.ts +228 -0
  471. package/src/sandbox/coverage.ts +115 -0
  472. package/src/sandbox/expect.ts +629 -0
  473. package/src/sandbox/tree.ts +47 -0
  474. package/src/secrets/marker.ts +30 -0
  475. package/src/secrets/patterns.ts +142 -0
  476. package/src/secrets/scan.ts +123 -0
  477. package/src/secrets/shipped.ts +111 -0
  478. package/src/seed-marker.ts +74 -0
  479. package/src/serve/static.ts +322 -0
  480. package/src/sessions/claim.ts +85 -0
  481. package/src/sessions/live.ts +79 -0
  482. package/src/sessions/registry.ts +137 -0
  483. package/src/sessions/resolve.ts +333 -0
  484. package/src/slides/layouts.ts +391 -0
  485. package/src/slides/open.ts +18 -0
  486. package/src/slides/parse.ts +84 -0
  487. package/src/slides/render.ts +88 -0
  488. package/src/slides/styles.ts +44 -0
  489. package/src/snippets/categories.ts +66 -0
  490. package/src/snippets/list.ts +32 -0
  491. package/src/snippets/presets.ts +50 -0
  492. package/src/standards/audit.ts +132 -0
  493. package/src/standards/read.ts +100 -0
  494. package/src/sync/check.ts +692 -0
  495. package/src/sync/engine.ts +576 -0
  496. package/src/sync/git.ts +225 -0
  497. package/src/sync/history.ts +123 -0
  498. package/src/sync/layout.ts +140 -0
  499. package/src/sync/reverse.ts +268 -0
  500. package/src/sync/seeds-report.ts +126 -0
  501. package/src/sync/stamp.ts +358 -0
  502. package/src/sync/target.ts +70 -0
  503. package/src/sync/workflow.ts +200 -0
  504. package/src/target.ts +43 -0
  505. package/src/targets/pulls.ts +250 -0
  506. package/src/targets/registry.ts +203 -0
  507. package/src/targets/resolve.ts +145 -0
  508. package/src/targets/sweep.ts +246 -0
  509. package/src/tasks/archive.ts +506 -0
  510. package/src/tasks/record.ts +311 -0
  511. package/src/tasks/trunk.ts +89 -0
  512. package/src/tasks/validate.ts +1001 -0
  513. package/src/teach/lesson.ts +180 -0
  514. package/src/teach/workspace.ts +842 -0
  515. package/src/tooling/gitignore.ts +122 -0
  516. package/src/tooling/inject.ts +193 -0
  517. package/src/tooling/list.ts +39 -0
  518. package/src/tooling/manifest.ts +176 -0
  519. package/src/tooling/package.ts +166 -0
  520. package/src/tooling/read.ts +65 -0
  521. package/src/tooling/scan.ts +147 -0
  522. package/src/tooling/stamp.ts +44 -0
  523. package/src/transcripts/fetch.ts +156 -0
  524. package/src/transcripts/metadata.ts +54 -0
  525. package/src/transcripts/vtt.ts +114 -0
  526. package/src/ui.ts +266 -0
  527. package/src/version/compare.ts +53 -0
  528. package/src/version/installed.ts +40 -0
  529. package/src/version/manager.ts +67 -0
  530. package/src/version/skew.ts +192 -0
  531. package/src/wiki/init.ts +85 -0
  532. package/src/worktree.ts +143 -0
  533. package/src/worktrees/reclaim.ts +306 -0
  534. package/standards/architecture.md +72 -0
  535. package/standards/branch.md +59 -0
  536. package/standards/commit.md +72 -0
  537. package/standards/context.md +151 -0
  538. package/standards/design.md +93 -0
  539. package/standards/diagrams.md +152 -0
  540. package/standards/glossary.md +75 -0
  541. package/standards/groundwork.md +211 -0
  542. package/standards/index.md +36 -0
  543. package/standards/intake.md +192 -0
  544. package/standards/issue.md +94 -0
  545. package/standards/markdown.md +137 -0
  546. package/standards/memory.md +144 -0
  547. package/standards/plan.md +172 -0
  548. package/standards/pr.md +139 -0
  549. package/standards/publish.md +51 -0
  550. package/standards/readme.md +208 -0
  551. package/standards/requirements.md +70 -0
  552. package/standards/rule.md +118 -0
  553. package/standards/session.md +109 -0
  554. package/standards/skill.md +300 -0
  555. package/standards/slug.md +39 -0
  556. package/standards/snippets.md +76 -0
  557. package/standards/standard.md +170 -0
  558. package/standards/tasks.md +254 -0
  559. package/standards/teach.md +153 -0
  560. package/standards/versioning.md +71 -0
  561. package/standards/wireframes.md +113 -0
  562. package/tooling/astro/configs/astro.config.mjs +31 -0
  563. package/tooling/astro/configs/eslint.config.js +79 -0
  564. package/tooling/astro/configs/playwright.config.ts +26 -0
  565. package/tooling/astro/configs/tsconfig.json +12 -0
  566. package/tooling/astro/configs/vitest.config.ts +22 -0
  567. package/tooling/astro/manifest.toml +34 -0
  568. package/tooling/astro/reference.md +60 -0
  569. package/tooling/base/configs/.editorconfig +5 -0
  570. package/tooling/base/configs/.github/pull_request_template.md +18 -0
  571. package/tooling/base/configs/.github/workflows/verify.yml +35 -0
  572. package/tooling/base/configs/.husky/commit-msg +1 -0
  573. package/tooling/base/configs/.husky/post-merge +61 -0
  574. package/tooling/base/configs/.husky/post-rewrite +21 -0
  575. package/tooling/base/configs/.husky/pre-commit +1 -0
  576. package/tooling/base/configs/.husky/pre-push +1 -0
  577. package/tooling/base/configs/.prettierrc +12 -0
  578. package/tooling/base/configs/.shellcheckrc +1 -0
  579. package/tooling/base/configs/.vscode/extensions.json +9 -0
  580. package/tooling/base/configs/.vscode/settings.json +3 -0
  581. package/tooling/base/configs/commitlint.config.js +11 -0
  582. package/tooling/base/configs/scripts/verify.sh +64 -0
  583. package/tooling/base/manifest.toml +30 -0
  584. package/tooling/base/reference.md +98 -0
  585. package/tooling/base/seeds/.claude/context/ci.md +33 -0
  586. package/tooling/base/seeds/.claude/context/development.md +37 -0
  587. package/tooling/base/seeds/.claude/context/index.md +11 -0
  588. package/tooling/base/seeds/.cspell/project-terms.txt +0 -0
  589. package/tooling/base/seeds/.cspell/tech-stack.txt +19 -0
  590. package/tooling/base/seeds/.lintstagedrc +8 -0
  591. package/tooling/base/seeds/.prettierignore +0 -0
  592. package/tooling/base/seeds/cspell.json +20 -0
  593. package/tooling/claude/manifest.toml +14 -0
  594. package/tooling/claude/reference.md +79 -0
  595. package/tooling/claude/seeds/.claude/ARCHITECTURE.md +13 -0
  596. package/tooling/claude/seeds/.claude/DESIGN.md +62 -0
  597. package/tooling/claude/seeds/.claude/REQUIREMENTS.md +18 -0
  598. package/tooling/claude/seeds/.claude/diagrams/index.md +8 -0
  599. package/tooling/claude/seeds/.claude/hooks/index-reminder.sh +50 -0
  600. package/tooling/claude/seeds/.claude/hooks/memory-index.sh +68 -0
  601. package/tooling/claude/seeds/.claude/hooks/path-form.sh +57 -0
  602. package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +52 -0
  603. package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +86 -0
  604. package/tooling/claude/seeds/.claude/hooks/tasks-index.sh +71 -0
  605. package/tooling/claude/seeds/.claude/memory/index.md +8 -0
  606. package/tooling/claude/seeds/.claude/settings.json +47 -0
  607. package/tooling/claude/seeds/.claude/tasks/index.md +8 -0
  608. package/tooling/claude/seeds/.claude/wireframes/index.md +8 -0
  609. package/tooling/claude/seeds/CLAUDE.md +29 -0
  610. package/tooling/claude/user/settings.template.json +10 -0
  611. package/tooling/claude/user/statusline-command.sh +53 -0
  612. package/tooling/python/configs/.coveragerc +14 -0
  613. package/tooling/python/configs/.python-version +1 -0
  614. package/tooling/python/configs/mypy.ini +6 -0
  615. package/tooling/python/configs/pytest.ini +4 -0
  616. package/tooling/python/configs/ruff.toml +15 -0
  617. package/tooling/python/configs/scripts/verify.sh +77 -0
  618. package/tooling/python/manifest.toml +16 -0
  619. package/tooling/python/reference.md +66 -0
  620. package/tooling/python/seeds/.cspell/tech-stack.txt +19 -0
  621. package/tooling/python/seeds/tests/test_smoke.py +2 -0
  622. package/tooling/vite-react/configs/playwright.config.ts +26 -0
  623. package/tooling/vite-react/configs/tsconfig.json +35 -0
  624. package/tooling/vite-react/configs/vite.config.ts +24 -0
  625. package/tooling/vite-react/configs/vitest.config.ts +26 -0
  626. package/tooling/vite-react/manifest.toml +23 -0
  627. package/tooling/vite-react/reference.md +55 -0
  628. package/tooling/vite-react/seeds/.cspell/project-terms.txt +1 -0
  629. package/tooling/vite-react/seeds/.cspell/tech-stack.txt +1 -0
  630. package/tooling/web/configs/.github/workflows/verify.yml +134 -0
  631. package/tooling/web/configs/.vscode/extensions.json +13 -0
  632. package/tooling/web/configs/.vscode/settings.json +10 -0
  633. package/tooling/web/configs/e2e/home.spec.ts +6 -0
  634. package/tooling/web/configs/e2e/screenshot.ts +53 -0
  635. package/tooling/web/configs/eslint.config.js +82 -0
  636. package/tooling/web/configs/scripts/screenshot.sh +28 -0
  637. package/tooling/web/configs/scripts/verify.sh +80 -0
  638. package/tooling/web/configs/scripts/worktree-port.sh +74 -0
  639. package/tooling/web/configs/src/test/setup.ts +8 -0
  640. package/tooling/web/manifest.toml +58 -0
  641. package/tooling/web/reference.md +115 -0
  642. package/tooling/web/seeds/.cspell/tech-stack.txt +18 -0
  643. package/tsconfig.json +14 -0
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+ set -o pipefail
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
7
+
8
+ source "$PROJECT_ROOT/scripts/lib/ui.sh"
9
+
10
+ bun "$PROJECT_ROOT/src/cli.ts" indexes regen --root "$PROJECT_ROOT" --json >/dev/null
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+ set -o pipefail
4
+
5
+ # Rewrites the generated path block in the shipped overwrite contract, which
6
+ # names every file a tooling sync can replace. The category reaches past the
7
+ # linters its name suggests, into the CI workflow, the end-to-end harness, and
8
+ # the shell scripts under scripts/, so a reader cannot infer the list. Generating
9
+ # it is what keeps a stack gaining a file from leaving the contract wrong.
10
+ #
11
+ # The stack names come from `tooling list` rather than from a directory walk,
12
+ # so a stack the verb excludes never reaches a contract about what the verb does.
13
+
14
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
15
+ PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
16
+
17
+ TOOLING_DIR="$PROJECT_ROOT/tooling"
18
+ CONTRACT="$PROJECT_ROOT/claude/skills/canon-cli/SKILL.md"
19
+
20
+ BEGIN="<!-- generated:tooling-paths -->"
21
+ END="<!-- /generated:tooling-paths -->"
22
+
23
+ [ -d "$TOOLING_DIR" ] || exit 0
24
+ [ -f "$CONTRACT" ] || exit 0
25
+
26
+ grep -qF "$BEGIN" "$CONTRACT" || {
27
+ echo "Missing $BEGIN marker in $CONTRACT" >&2
28
+ exit 1
29
+ }
30
+
31
+ block="$(mktemp)"
32
+ trap 'rm -f "$block" "$CONTRACT.tmp"' EXIT
33
+
34
+ {
35
+ echo "$BEGIN"
36
+ echo
37
+ while IFS= read -r stack; do
38
+ [ -d "$TOOLING_DIR/$stack/configs" ] || continue
39
+ echo "### $stack"
40
+ echo
41
+ while IFS= read -r rel; do
42
+ echo "- \`$rel\`"
43
+ done < <(cd "$TOOLING_DIR/$stack/configs" && find . -type f | sed 's|^\./||' | sort)
44
+ echo
45
+ done < <(bun "$PROJECT_ROOT/src/cli.ts" tooling list --json | jq -r '.stacks[].name' | sort)
46
+ echo "$END"
47
+ } >"$block"
48
+
49
+ # awk streams the file rather than editing in place, so a pattern that matches
50
+ # nothing produces a file missing the block instead of an unchanged one that
51
+ # exits zero.
52
+ awk -v block_file="$block" -v begin="$BEGIN" -v end="$END" '
53
+ $0 == begin { while ((getline line < block_file) > 0) print line; skipping = 1; next }
54
+ $0 == end { skipping = 0; next }
55
+ !skipping { print }
56
+ ' "$CONTRACT" >"$CONTRACT.tmp"
57
+
58
+ # The destination is a tracked file with a mode the copy must not inherit from
59
+ # mktemp, so the content moves onto the original rather than replacing it.
60
+ cat "$CONTRACT.tmp" >"$CONTRACT"
61
+ rm -f "$CONTRACT.tmp"
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bash
2
+ # Repairs `core.bare`, which Claude Code's worktree entry leaves set in the
3
+ # shared config with nothing restoring it. The flag strands the main worktree
4
+ # and breaks the git reads that scope a verification run, so this runs ahead of
5
+ # every stage rather than as one of them.
6
+ #
7
+ # The rule itself lives in `scripts/lib/worktree.sh`, the one bash function in
8
+ # this repository under test, so this file is the invocation and never a second
9
+ # copy of the guard that spares a genuinely bare repository.
10
+ set -e
11
+ set -o pipefail
12
+
13
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14
+ PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
15
+
16
+ source "$PROJECT_ROOT/scripts/lib/ui.sh"
17
+ source "$PROJECT_ROOT/scripts/lib/worktree.sh"
18
+
19
+ repair_bare_flag "$PROJECT_ROOT"
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+ set -o pipefail
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
7
+
8
+ # shellcheck source=/dev/null
9
+ source "$PROJECT_ROOT/scripts/lib/ui.sh"
10
+
11
+ NESTED="${VERIFY_NESTED:-false}"
12
+
13
+ OUTPUT_FILE=".claude/.tmp/project/PROJECT-SNAPSHOT.md"
14
+
15
+ check_dependencies() {
16
+ command -v find >/dev/null 2>&1 || log_error "find not installed"
17
+ }
18
+
19
+ load_gitignore_patterns() {
20
+ if [ ! -f ".gitignore" ]; then
21
+ echo ""
22
+ return
23
+ fi
24
+ grep -v '^\s*#' .gitignore | grep -v '^\s*$' | sed 's|/$||'
25
+ }
26
+
27
+ is_ignored() {
28
+ local name="$1"
29
+ local patterns="$2"
30
+
31
+ [ "$name" = ".git" ] && return 0
32
+ [ "$name" = "_" ] && return 0
33
+
34
+ while IFS= read -r pattern; do
35
+ [ -z "$pattern" ] && continue
36
+ # shellcheck disable=SC2053
37
+ if [[ "$name" == $pattern ]]; then
38
+ return 0
39
+ fi
40
+ done <<<"$patterns"
41
+
42
+ return 1
43
+ }
44
+
45
+ build_tree() {
46
+ local dir="${1:-.}"
47
+ local prefix="${2:-}"
48
+ local patterns="${3:-}"
49
+ local entries=()
50
+
51
+ while IFS= read -r entry; do
52
+ local name
53
+ name=$(basename "$entry")
54
+ is_ignored "$name" "$patterns" && continue
55
+ entries+=("$entry")
56
+ done < <(find "$dir" -maxdepth 1 -mindepth 1 | sort)
57
+
58
+ local count=${#entries[@]}
59
+ local i=0
60
+
61
+ for entry in "${entries[@]}"; do
62
+ i=$((i + 1))
63
+ local name
64
+ name=$(basename "$entry")
65
+ local connector="├──"
66
+ local child_prefix="${prefix}│ "
67
+
68
+ if [ "$i" -eq "$count" ]; then
69
+ connector="└──"
70
+ child_prefix="${prefix} "
71
+ fi
72
+
73
+ if [ -d "$entry" ]; then
74
+ echo "${prefix}${connector} ${name}/"
75
+ build_tree "$entry" "$child_prefix" "$patterns"
76
+ else
77
+ echo "${prefix}${connector} ${name}"
78
+ fi
79
+ done
80
+ }
81
+
82
+ write_snapshot() {
83
+ local project_name
84
+ project_name=$(basename "$PWD")
85
+ local patterns
86
+ patterns=$(load_gitignore_patterns)
87
+
88
+ mkdir -p "$(dirname "$OUTPUT_FILE")"
89
+
90
+ {
91
+ echo "# Project Snapshot: $project_name"
92
+ echo ""
93
+ echo "## Structure"
94
+ echo ""
95
+ echo '```'
96
+ build_tree "." "" "$patterns"
97
+ echo '```'
98
+ echo ""
99
+
100
+ if [ -f "package.json" ]; then
101
+ echo "## package.json"
102
+ echo ""
103
+ echo '```json'
104
+ cat package.json
105
+ echo '```'
106
+ echo ""
107
+ fi
108
+ } >"$OUTPUT_FILE"
109
+ }
110
+
111
+ main() {
112
+ check_dependencies
113
+
114
+ if [ "$NESTED" = false ]; then open_timeline; fi
115
+
116
+ log_step "Snapshot"
117
+ write_snapshot
118
+ log_info "Written to $OUTPUT_FILE"
119
+
120
+ # The whole frame goes to stderr, since the run writes its document to a file
121
+ # and leaves stdout carrying nothing. Edges on stdout with the body on stderr
122
+ # would capture as a frame with no body inside it.
123
+ if [ "$NESTED" = false ]; then
124
+ close_timeline
125
+ # All six are declared to scope what `set_palette` assigns, so the four this
126
+ # line never spells stay out of the globals a sourcing script reads.
127
+ # shellcheck disable=SC2034
128
+ local GREEN RED YELLOW WHITE GREY NC
129
+ set_palette 2
130
+ echo -e "\n${GREEN}✓ Snapshot complete${NC}" >&2
131
+ fi
132
+ }
133
+
134
+ main "$@"
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+ set -o pipefail
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ PROJECT_ROOT="${PROJECT_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
7
+
8
+ source "$PROJECT_ROOT/scripts/lib/ui.sh"
9
+
10
+ check_dependencies() {
11
+ command -v bun >/dev/null 2>&1 || log_error "bun is not installed"
12
+ }
13
+
14
+ main() {
15
+ check_dependencies
16
+
17
+ echo -e "${GREY}┌${NC}"
18
+
19
+ echo -e "${GREY}├${NC} ${WHITE}Interactive dependency update${NC}"
20
+ echo -e "${GREY}│${NC}"
21
+ bun update --interactive
22
+
23
+ log_step "Verifying project health"
24
+ if [ -f "$PROJECT_ROOT/src/cli.ts" ]; then
25
+ bun "$PROJECT_ROOT/src/cli.ts" gate run --nested
26
+ log_info "All checks passed"
27
+ else
28
+ log_warn "Verification entry point not found, skipping."
29
+ fi
30
+
31
+ echo -e "${GREY}└${NC}\n"
32
+ echo -e "${GREEN}✓ Update complete${NC}"
33
+ }
34
+
35
+ main "$@"
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+ set -o pipefail
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ PROJECT_ROOT="${PROJECT_ROOT:-$(dirname "$(dirname "$SCRIPT_DIR")")}"
7
+
8
+ source "$PROJECT_ROOT/scripts/lib/ui.sh"
9
+ source "$PROJECT_ROOT/scripts/lib/frontmatter.sh"
10
+
11
+ DOCS_DIR="$PROJECT_ROOT/docs"
12
+ CONTEXT_DIR="$PROJECT_ROOT/.claude/context"
13
+
14
+ INTERNAL_TOPICS=" ci development sandbox "
15
+
16
+ show_help() {
17
+ echo -e "${GREY}┌${NC}"
18
+ echo -e "${GREY}├${NC} ${WHITE}Usage:${NC} canon docs list [options]"
19
+ echo -e "${GREY}│${NC}"
20
+ echo -e "${GREY}│${NC} ${WHITE}Options:${NC}"
21
+ echo -e "${GREY}│${NC} --json ${GREY}# Emit machine-readable JSON${NC}"
22
+ echo -e "${GREY}│${NC} -h, --help ${GREY}# Show this help message${NC}"
23
+ echo -e "${GREY}└${NC}"
24
+ exit 0
25
+ }
26
+
27
+ is_target_facing() {
28
+ case "$1" in
29
+ "Agent surface" | "Domain references") return 0 ;;
30
+ *) return 1 ;;
31
+ esac
32
+ }
33
+
34
+ is_internal_topic() {
35
+ case "$INTERNAL_TOPICS" in
36
+ *" $1 "*) return 0 ;;
37
+ *) return 1 ;;
38
+ esac
39
+ }
40
+
41
+ # Emits `name<TAB>description<TAB>category<TAB>target` per target-facing doc,
42
+ # sorted so a domain split into a folder lands in its alphabetical place rather
43
+ # than after every file. A folder declares its category on its own index, since
44
+ # the allowlist is what separates a target-facing doc from a workflow one and a
45
+ # split domain is not exempt from it.
46
+ collect_docs() {
47
+ local file name description category
48
+ {
49
+ while IFS= read -r file; do
50
+ name=$(basename "$file" .md)
51
+ [ "$name" = "index" ] && continue
52
+ category=$(read_frontmatter_field "$file" "category")
53
+ is_target_facing "$category" || continue
54
+ description=$(read_frontmatter_field "$file" "description")
55
+ printf '%s\t%s\t%s\t%s\n' "$name" "$description" "$category" "docs/$name.md"
56
+ done < <(find "$DOCS_DIR" -maxdepth 1 -type f -name "*.md")
57
+
58
+ # A split domain is named by its folder and described by its generated
59
+ # index, which carries subtitle where a sibling file carries description
60
+ while IFS= read -r file; do
61
+ name=$(basename "$(dirname "$file")")
62
+ category=$(read_frontmatter_field "$file" "category")
63
+ is_target_facing "$category" || continue
64
+ description=$(read_frontmatter_field "$file" "subtitle")
65
+ printf '%s\t%s\t%s\t%s\n' "$name" "$description" "$category" "docs/$name/index.md"
66
+ done < <(find "$DOCS_DIR" -mindepth 2 -maxdepth 2 -type f -name "index.md")
67
+ } | sort
68
+ }
69
+
70
+ # Emits `name<TAB>description<TAB>target` per context entry, sorted so a domain
71
+ # split into a folder lands in its alphabetical place rather than after every
72
+ # file. Matches listTopics in src/docs/read.ts, which sorts both together.
73
+ collect_context() {
74
+ local file name description
75
+ {
76
+ while IFS= read -r file; do
77
+ name=$(basename "$file" .md)
78
+ [ "$name" = "index" ] && continue
79
+ is_internal_topic "$name" && continue
80
+ description=$(read_frontmatter_field "$file" "description")
81
+ printf '%s\t%s\t%s\n' "$name" "$description" ".claude/context/$name.md"
82
+ done < <(find "$CONTEXT_DIR" -maxdepth 1 -type f -name "*.md")
83
+
84
+ # A split domain is named by its folder and described by its generated
85
+ # index, which carries subtitle where a sibling file carries description
86
+ while IFS= read -r file; do
87
+ name=$(basename "$(dirname "$file")")
88
+ is_internal_topic "$name" && continue
89
+ description=$(read_frontmatter_field "$file" "subtitle")
90
+ printf '%s\t%s\t%s\n' "$name" "$description" ".claude/context/$name/index.md"
91
+ done < <(find "$CONTEXT_DIR" -mindepth 2 -maxdepth 2 -type f -name "index.md")
92
+ } | sort
93
+ }
94
+
95
+ list_text() {
96
+ local name description category target
97
+ log_step "Docs"
98
+ while IFS=$'\t' read -r name description category target; do
99
+ log_info "$name : $description"
100
+ done < <(collect_docs)
101
+
102
+ # Absent in a registry install, which ships docs/ without .claude/
103
+ if [ -d "$CONTEXT_DIR" ]; then
104
+ log_step "Domain context"
105
+ while IFS=$'\t' read -r name description target; do
106
+ log_info "$name : $description"
107
+ done < <(collect_context)
108
+ fi
109
+ }
110
+
111
+ emit_json_entry() {
112
+ local name="$1" description="$2" category="$3" target="$4"
113
+ [ "$JSON_FIRST" -eq 0 ] && printf ','
114
+ jq -nc \
115
+ --arg name "$name" \
116
+ --arg description "$description" \
117
+ --arg category "$category" \
118
+ --arg target "$target" \
119
+ '{name: $name, description: $description, category: $category, target: $target}'
120
+ JSON_FIRST=0
121
+ }
122
+
123
+ list_json() {
124
+ local name description category target
125
+ JSON_FIRST=1
126
+ printf '['
127
+ while IFS=$'\t' read -r name description category target; do
128
+ emit_json_entry "$name" "$description" "$category" "$target"
129
+ done < <(collect_docs)
130
+
131
+ if [ -d "$CONTEXT_DIR" ]; then
132
+ while IFS=$'\t' read -r name description target; do
133
+ emit_json_entry "$name" "$description" "" "$target"
134
+ done < <(collect_context)
135
+ fi
136
+ printf ']'
137
+ }
138
+
139
+ main() {
140
+ local json=0
141
+
142
+ while [[ $# -gt 0 ]]; do
143
+ case "$1" in
144
+ -h | --help) show_help ;;
145
+ --json)
146
+ json=1
147
+ shift
148
+ ;;
149
+ *) log_error "Unknown option: $1" ;;
150
+ esac
151
+ done
152
+
153
+ trap close_timeline EXIT
154
+
155
+ if [ "$json" -eq 1 ]; then
156
+ printf '{"docs":'
157
+ list_json
158
+ printf '}\n'
159
+ exit 0
160
+ fi
161
+
162
+ list_text
163
+ }
164
+
165
+ main "$@"
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Reads one frontmatter field from a markdown file.
4
+ #
5
+ # Kept in bash because the list commands call it once per field per file
6
+ # inside a loop, where shelling into the CLI would cost a process per read.
7
+ # Index logic is TypeScript, in src/indexes/, and does not belong here.
8
+ read_frontmatter_field() {
9
+ local file="$1"
10
+ local key="$2"
11
+ awk -v key="$key" '
12
+ NR == 1 && /^---$/ { in_fm = 1; next }
13
+ in_fm && /^---$/ { exit }
14
+ in_fm {
15
+ prefix = key ": "
16
+ if (index($0, prefix) == 1) {
17
+ val = substr($0, length(prefix) + 1)
18
+ if (length(val) >= 2) {
19
+ first = substr(val, 1, 1)
20
+ last = substr(val, length(val), 1)
21
+ if ((first == "\"" && last == "\"") || (first == "'\''" && last == "'\''")) {
22
+ val = substr(val, 2, length(val) - 2)
23
+ }
24
+ }
25
+ print val
26
+ exit
27
+ }
28
+ }
29
+ ' "$file"
30
+ }
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Sole survivor of the gov lib. Called once per rule file inside install and
4
+ # sandbox loops, where routing through the CLI would cost a process per file.
5
+
6
+ rule_subdir() {
7
+ local src="$1"
8
+ local rules_root="${2:-$PROJECT_ROOT/governance/rules}"
9
+ local rel="${src#"$rules_root/"}"
10
+ local subdir
11
+ subdir=$(dirname "$rel")
12
+ [ "$subdir" = "." ] && subdir=""
13
+ echo "$subdir"
14
+ }
@@ -0,0 +1,191 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Fixture files carry this suffix so the repository's own checks ignore them.
4
+ # A stored `index.md.fixture` is not an `index.md`, so the index walker, prettier,
5
+ # shfmt, and shellcheck all skip it and the bytes reach the sandbox unmodified.
6
+ FIXTURE_SUFFIX=".fixture"
7
+
8
+ # The tree mirrors the scenario path, so `category` and `scenario` together match
9
+ # `scripts/sandbox/<category>/<scenario>.sh`. Both segments are load-bearing:
10
+ # four scenario basenames repeat across categories (`claude`, `docs`, `review`,
11
+ # `sync`), and `docs` is also a category of its own.
12
+ fixture_stage_dir() {
13
+ local category="$1"
14
+ local scenario="$2"
15
+ local arm="$3"
16
+ local stage="$4"
17
+ echo "$PROJECT_ROOT/scripts/sandbox/fixtures/$category/$scenario/$arm/$stage"
18
+ }
19
+
20
+ list_fixture_files() {
21
+ local source_dir="$1"
22
+ find "$source_dir" -type f -name "*$FIXTURE_SUFFIX" -print0 | sort -z
23
+ }
24
+
25
+ count_fixture_files() {
26
+ local source_dir="$1"
27
+ if [ ! -d "$source_dir" ]; then
28
+ echo 0
29
+ return 0
30
+ fi
31
+ find "$source_dir" -type f -name "*$FIXTURE_SUFFIX" | wc -l
32
+ }
33
+
34
+ # The copy loops match on the suffix, so a file without one would be skipped in
35
+ # silence and the scenario would provision a tree it was never meant to have.
36
+ assert_fixtures_suffixed() {
37
+ local source_dir="$1"
38
+ [ -d "$source_dir" ] || return 0
39
+
40
+ local stray
41
+ stray="$(find "$source_dir" -type f -not -name "*$FIXTURE_SUFFIX" | sort | tr '\n' ' ')"
42
+ [ -z "$stray" ] || log_error "Fixture missing the $FIXTURE_SUFFIX suffix: $stray"
43
+ }
44
+
45
+ fixture_target_path() {
46
+ local source_dir="$1"
47
+ local source_file="$2"
48
+ local relative="${source_file#"$source_dir"/}"
49
+ echo "${relative%"$FIXTURE_SUFFIX"}"
50
+ }
51
+
52
+ create_from_fixtures() {
53
+ local source_dir="$1"
54
+ [ -d "$source_dir" ] || return 0
55
+
56
+ local source_file target
57
+ while IFS= read -r -d '' source_file; do
58
+ target="$(fixture_target_path "$source_dir" "$source_file")"
59
+ mkdir -p "$(dirname "$target")"
60
+ cp "$source_file" "$target"
61
+ done < <(list_fixture_files "$source_dir")
62
+ }
63
+
64
+ # An append fixture extends a file the anchor or the injected seeds already
65
+ # provide. A missing target means that upstream shape changed, so fail rather
66
+ # than create the file and silently alter what the scenario provisions.
67
+ append_from_fixtures() {
68
+ local source_dir="$1"
69
+ [ -d "$source_dir" ] || return 0
70
+
71
+ local source_file target
72
+ while IFS= read -r -d '' source_file; do
73
+ target="$(fixture_target_path "$source_dir" "$source_file")"
74
+ if [ ! -f "$target" ]; then
75
+ log_error "Append fixture has no target: $target"
76
+ fi
77
+ cat "$source_file" >>"$target"
78
+ done < <(list_fixture_files "$source_dir")
79
+ }
80
+
81
+ # Stages the first `count` markdown files the toolkit ships for a domain into
82
+ # `dest`, flattening any source subfolder. Source rather than fixture tree,
83
+ # because an arm modelling a real install wants the files a target actually
84
+ # received and a copy under `fixtures/` would drift from them silently.
85
+ #
86
+ # The flattening is load-bearing rather than incidental. Both `detectUnmigrated`
87
+ # and the sync engine match a target file to its source by basename against the
88
+ # flat domain root, so a file lifted out of a source subfolder such as `bundled/`
89
+ # has no flat sibling and reads as project-authored. An arm staging one claims a
90
+ # drift or an unmigrated domain it did not stage.
91
+ stage_toolkit_markdown() {
92
+ local src="$1"
93
+ local dest="$2"
94
+ local count="$3"
95
+
96
+ mkdir -p "$dest"
97
+ while IFS= read -r file; do
98
+ cp "$file" "$dest/$(basename "$file")"
99
+ done < <(find "$src" -maxdepth 1 -type f -name "*.md" ! -name "index.md" | sort | head -n "$count")
100
+ }
101
+
102
+ # The newest top-level path history records a deletion under that the toolkit no
103
+ # longer ships. Read from history rather than hardcoded, so an arm stages a root
104
+ # the walk will actually recognize instead of a name that has since come back.
105
+ # `prompts` is preferred because it is the case measured in a real target, and
106
+ # any other dropped root exercises the same walk.
107
+ pick_dropped_root() {
108
+ local preferred="prompts"
109
+ local first=""
110
+ local candidate
111
+
112
+ while IFS= read -r candidate; do
113
+ [ -e "$PROJECT_ROOT/$candidate" ] && continue
114
+ [ "$candidate" = "$preferred" ] && {
115
+ echo "$preferred"
116
+ return 0
117
+ }
118
+ [ -n "$first" ] || first="$candidate"
119
+ done < <(git -C "$PROJECT_ROOT" log --all --diff-filter=D --name-only --format= |
120
+ awk -F/ 'NF > 1 { print $1 }' | sort -u)
121
+
122
+ echo "$first"
123
+ }
124
+
125
+ # Restores one file's exact published bytes from the commit before it was
126
+ # deleted. Content is what the attribution matches on, so a file written by hand
127
+ # would report unattributed and an arm would assert the wrong verdict.
128
+ #
129
+ # Both reads take the whole listing through a process substitution rather than a
130
+ # pipeline ending in an early exit. `set -o pipefail` is on, and a `grep -m 1`
131
+ # that matches the first line closes the pipe while git is still writing, so the
132
+ # substitution returns git's SIGPIPE status and the arm fails on a listing it
133
+ # actually read.
134
+ restore_dropped_file() {
135
+ local root="$1"
136
+ local rel="" commit="" line
137
+
138
+ while IFS= read -r line; do
139
+ case "$line" in
140
+ "$root"/*)
141
+ rel="$line"
142
+ break
143
+ ;;
144
+ esac
145
+ done < <(git -C "$PROJECT_ROOT" log --all --diff-filter=D --name-only \
146
+ --format= -- "$root/")
147
+
148
+ [ -n "$rel" ] || return 1
149
+
150
+ while IFS= read -r line; do
151
+ commit="$line"
152
+ break
153
+ done < <(git -C "$PROJECT_ROOT" log --all --diff-filter=D --format=%H -- "$rel")
154
+
155
+ [ -n "$commit" ] || return 1
156
+
157
+ mkdir -p "$(dirname "$rel")"
158
+ git -C "$PROJECT_ROOT" show "$commit^:$rel" >"$rel" || return 1
159
+
160
+ echo "$rel"
161
+ }
162
+
163
+ # Stages one step of a scenario arm into the sandbox working directory.
164
+ # Scenarios call this once per step so their own git operations stay between
165
+ # the steps, where they are visible.
166
+ stage_fixtures() {
167
+ local category="$1"
168
+ local scenario="$2"
169
+ local arm="$3"
170
+ local stage="$4"
171
+
172
+ local stage_dir
173
+ stage_dir="$(fixture_stage_dir "$category" "$scenario" "$arm" "$stage")"
174
+
175
+ if [ ! -d "$stage_dir" ]; then
176
+ log_error "Fixture stage not found: $category/$scenario/$arm/$stage"
177
+ fi
178
+
179
+ assert_fixtures_suffixed "$stage_dir/create"
180
+ assert_fixtures_suffixed "$stage_dir/append"
181
+
182
+ local staged
183
+ staged=$(($(count_fixture_files "$stage_dir/create") + \
184
+ $(count_fixture_files "$stage_dir/append")))
185
+ if [ "$staged" -eq 0 ]; then
186
+ log_error "Fixture stage provisions nothing: $category/$scenario/$arm/$stage"
187
+ fi
188
+
189
+ create_from_fixtures "$stage_dir/create"
190
+ append_from_fixtures "$stage_dir/append"
191
+ }