@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,33 @@
1
+ ---
2
+ title: CI
3
+ description: GitHub Actions workflow triggers and checks
4
+ ---
5
+
6
+ # CI
7
+
8
+ ## Overview
9
+
10
+ Owns the GitHub Actions workflow that gates a merge: which events start a run, and which checks have to pass before the branch can land. The checks call package scripts rather than defining commands of their own, so what each one runs is the development entry's subject.
11
+
12
+ ## Layout
13
+
14
+ - `.github/workflows/` owns the workflow definitions a trigger below starts
15
+
16
+ ## Triggers
17
+
18
+ - Pull requests targeting `main`
19
+ - `workflow_dispatch` (manual run from the Actions tab)
20
+
21
+ ## Checks
22
+
23
+ Defined in `.github/workflows/verify.yml`. All jobs must pass before merge.
24
+
25
+ | Check | Command | What it asserts |
26
+ | ------ | ---------------------- | ---------------------------------- |
27
+ | Format | `bun run check:format` | prettier and shfmt are clean |
28
+ | Spell | `bun run check:spell` | cspell passes against dictionaries |
29
+ | Shell | `bun run check:shell` | shellcheck passes at warning level |
30
+
31
+ ## Running CI locally
32
+
33
+ `bun run check` runs the same three asserts plus auto-formats first. If CI fails on format, run `bun run check` locally and commit the diff.
@@ -0,0 +1,37 @@
1
+ ---
2
+ title: Development
3
+ description: Local dev workflow, scripts, and husky hooks
4
+ ---
5
+
6
+ # Development
7
+
8
+ ## Overview
9
+
10
+ Owns how the project runs on a developer machine: installing the toolchain, the scripts that verify a change, and the git hooks that run them before a commit or a push leaves. CI calls the same scripts from a workflow, which is the CI entry's subject.
11
+
12
+ ## Layout
13
+
14
+ - `scripts/` owns the shell scripts the package scripts below call
15
+ - `.husky/` owns the git hooks
16
+
17
+ ## Setup
18
+
19
+ - Install [Bun](https://bun.sh): `curl -fsSL https://bun.sh/install | bash`
20
+ - Install dependencies: `bun install`
21
+
22
+ ## Scripts
23
+
24
+ | Command | Purpose |
25
+ | ---------------- | ------------------------------------------------------------------------------ |
26
+ | `bun run check` | Repairs locally. Auto-formats, then asserts what the formatters could not fix. |
27
+ | `bun run format` | Auto-fix prettier and shfmt formatting. |
28
+
29
+ ## Shell scripts
30
+
31
+ All `.sh` files live under `scripts/`. Do not place shell scripts outside `scripts/`.
32
+
33
+ ## Husky hooks
34
+
35
+ - `pre-commit` runs `lint-staged` (prettier, cspell, shfmt, shellcheck on staged files).
36
+ - `commit-msg` runs `commitlint` against the conventional commit format.
37
+ - `pre-push` runs `bun run check`. After pushing, run `git status`. If files changed, commit the diff as `style(<scope>):` and push again.
@@ -0,0 +1,11 @@
1
+ ---
2
+ title: Context
3
+ subtitle: Per-domain narrative loaded on demand
4
+ ---
5
+
6
+ # Context
7
+
8
+ Per-domain narrative loaded on demand
9
+
10
+ - [CI](ci.md): GitHub Actions workflow triggers and checks
11
+ - [Development](development.md): Local dev workflow, scripts, and husky hooks
File without changes
@@ -0,0 +1,19 @@
1
+ canon
2
+ bradlc
3
+ bunx
4
+ commitlint
5
+ dbaeumer
6
+ dotfolders
7
+ esbenp
8
+ frontmatter
9
+ lintstagedrc
10
+ mkhl
11
+ parallelizable
12
+ scannability
13
+ shellcheck
14
+ shfmt
15
+ timonwong
16
+ wireframe
17
+ wireframes
18
+ worktree
19
+ worktrees
@@ -0,0 +1,8 @@
1
+ {
2
+ "**/*.{json,md,mdc}": [
3
+ "prettier --write --ignore-path .gitignore --ignore-path .prettierignore",
4
+ "cspell --no-must-find-files"
5
+ ],
6
+ "**/*.md": ["canon indexes regen"],
7
+ "**/*.sh": ["shfmt --write --indent 2", "shellcheck --severity=warning"]
8
+ }
File without changes
@@ -0,0 +1,20 @@
1
+ {
2
+ "version": "0.2",
3
+ "language": "en",
4
+ "useGitignore": true,
5
+ "gitignoreRoot": ["."],
6
+ "dictionaryDefinitions": [
7
+ {
8
+ "name": "project-terms",
9
+ "path": ".cspell/project-terms.txt",
10
+ "addWords": true
11
+ },
12
+ {
13
+ "name": "tech-stack",
14
+ "path": ".cspell/tech-stack.txt",
15
+ "addWords": true
16
+ }
17
+ ],
18
+ "dictionaries": ["project-terms", "tech-stack"],
19
+ "ignorePaths": [".cspell/**", ".git/**"]
20
+ }
@@ -0,0 +1,14 @@
1
+ # Consumed only by `canon claude init`. Claude is not a discoverable tooling stack
2
+ # and is excluded from `canon tooling` discovery via scripts/lib/tooling.sh.
3
+
4
+ [stack]
5
+ name = "claude"
6
+ extends = ""
7
+ runtime = ""
8
+ scaffold = ""
9
+
10
+ # Checked against this repository's own `.gitignore` by
11
+ # scripts/core/check-ignore-parity.sh, which also holds the two `.claude/` paths
12
+ # this array deliberately omits and the reason each stays out.
13
+ [gitignore]
14
+ "# Claude" = [".claude/.records.git/", ".claude/.tmp/", ".claude/groundwork/", ".claude/intake/", ".claude/memory/", ".claude/plans/", ".claude/proposals/", ".claude/review/", ".claude/worktrees/", ".claude/tasks/", ".claude/teach/"]
@@ -0,0 +1,79 @@
1
+ # Tooling Claude reference
2
+
3
+ ## Overview
4
+
5
+ The claude stack installs the `.claude/` workflow directory into a project. State docs are seeds, written once and never overwritten by tooling. `CLAUDE.md` is a seed, filled in per project after init.
6
+
7
+ ## Structure
8
+
9
+ ```plaintext
10
+ .claude/
11
+ ├── CLAUDE.md ← seeded. Project context and rules, auto-loaded by Claude Code each session
12
+ ├── tasks/ ← seeded then gitignored. One file per task plus a generated index.md, local scratch only. `archive/` holds the tasks that shipped.
13
+ ├── REQUIREMENTS.md ← seeded. Project goals, non-goals, MVP scope
14
+ ├── ARCHITECTURE.md ← seeded. Technical design decisions and open questions
15
+ ├── DESIGN.md ← seeded. Visual intent and the decisions behind it
16
+ ├── wireframes/ ← seeded. Per-surface ASCII layouts. `index.md` is the discovery anchor; `<surface>.md` files hold the sketches and behavior bullets.
17
+ ├── diagrams/ ← seeded. Per-kind Mermaid views. `index.md` is the discovery anchor. `<kind>.md` files hold one diagram each, grouped by the `category` frontmatter field.
18
+ ├── GOV.md ← retired. Removed by `canon gov sync` if present from a prior install
19
+ ├── settings.json ← seeded. Project-level Claude Code config (PreToolUse and PostToolUse hooks). User-level config installed separately via `canon claude setup`.
20
+ ├── plans/ ← execution detail for multi-step tasks, gitignored. `feature-*.md` entries swept by claude-docs into `archive/`.
21
+ ├── review/ ← gitignored, one subfolder per producer. `branch/` for claude-review, `feedback/` for canon feedback, `memory/` for claude-memory-review with its own `archive/`, `design/` for canon design render.
22
+ ├── .tmp/ ← ephemeral scratch space, gitignored
23
+ └── memory/ ← session facts no context entry owns, gitignored. `index.md` regenerated by a hook.
24
+ ```
25
+
26
+ ## Upgrading from a single-file board
27
+
28
+ A project installed before the board became a folder still holds `.claude/TASKS.md`. Nothing migrates it. `canon claude init` seeds an empty `.claude/tasks/index.md` beside it and leaves the old file untouched, so every skill reads the empty catalog while the real board sits unreferenced.
29
+
30
+ Convert by hand, once per project:
31
+
32
+ 1. Split each `###` block into `.claude/tasks/vXX.Y-<slug>.md`, adding the `title` and `description` frontmatter the tasks standard requires, which `canon standards tasks` prints. Compare each new file against the block it came from rather than checking that every block landed somewhere.
33
+ 2. Run `canon indexes regen --no-stage --root . .claude/tasks/<any-task>.md` to build the catalog.
34
+ 3. Delete `.claude/TASKS.md`, and swap its `.gitignore` entry for `.claude/tasks/`.
35
+
36
+ ## Upgrading a hand-appended memory index
37
+
38
+ A project installed before the memory folder gained a generated index still holds `.claude/memory/MEMORY.md`, and its entries still carry `name` and `type` frontmatter. Nothing migrates it. `claude-memory-capture` stops appending rows once the new seed lands, so the old file freezes at whatever it held while the folder keeps growing past it.
39
+
40
+ Convert by hand, once per project:
41
+
42
+ 1. Rewrite each entry's `name` key to `title` and its `type` key to a sentence-case `category`, quoting any `description` that opens with a backtick or a colon so the frontmatter parses.
43
+ 2. Replace `MEMORY.md` with an `index.md` carrying `title` and `subtitle` frontmatter and nothing else.
44
+ 3. Run `canon indexes regen --no-stage --root . .claude/memory/index.md` to build the catalog, and compare its entry count against the file count before deleting anything.
45
+
46
+ ## Upgrading from a single-file diagram set
47
+
48
+ A project installed before the diagram surface became a folder still holds `.claude/DIAGRAMS.md`. Unlike the board, this one migrates itself. The `claude-diagram` skill reads the flat file when `.claude/diagrams/` holds no entries, splits it by kind into the folder, and reports what it wrote. The old file stays on disk so the split can be compared against its source, and deleting it is a manual step once that check passes.
49
+
50
+ ## Gitignore
51
+
52
+ - `# Claude`: `.claude/.records.git/`, `.claude/.tmp/`, `.claude/groundwork/`, `.claude/intake/`, `.claude/memory/`, `.claude/plans/`, `.claude/review/`, `.claude/worktrees/`, `.claude/tasks/`, `.claude/teach/`
53
+
54
+ Each entry is a top-level record folder, and an archive sits inside the folder it archives, so one line covers a record and everything it retires.
55
+
56
+ ## CLI
57
+
58
+ | Command | What it does |
59
+ | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
60
+ | `canon claude init` | Seeds `.claude/` workflow docs, updates `.gitignore` |
61
+ | `canon claude sync` | Reconciles `.gitignore` against the manifest. Reports seeded file status. |
62
+ | `canon claude setup` | Installs user-level config to `~/.claude/`: statusline, attribution, and the `permissions.allow` and `permissions.deny` lists. Run once per machine. |
63
+
64
+ ## CLAUDE.md
65
+
66
+ - Ships as a seed with placeholder project name, description, and key paths. Fill these in after init.
67
+ - Section layout: `Context`, `Indexes`, `Markdown`, `Key paths`, `Spelling`, `Snippets`, `Tasks`, `Memory`. Each section groups rules that share a surface so skills can detect, extend, or skip by heading.
68
+ - The memory rules favor signal over volume. Saving only after a second occurrence or an explicit user correction keeps entries focused on patterns worth preventing, not first-occurrence slips. The 3-line cap stops the built-in auto-memory from drifting into narrative writeups that bury the rule underneath the recovery story.
69
+ - The `Context` section points at `.claude/` state docs one line. `claude-feature` does the parallel read when invoked. The seed intentionally does not re-list every file.
70
+
71
+ ## Seed docs
72
+
73
+ - Seed docs ship with a guidelines preamble above the first H2. These are instructions Claude internalizes before filling in the sections below. They are not sections to populate.
74
+
75
+ ## settings.json
76
+
77
+ - Project seed at `tooling/claude/seeds/.claude/settings.json` ships two PreToolUse hooks (pairing with `.claude/hooks/index-reminder.sh` and `.claude/hooks/scratch-guard.sh`) and a PostToolUse hook (pairs with `.claude/hooks/standards-audit.sh`). Project settings layer over user settings, so per-project files only carry what is genuinely project-specific.
78
+ - User-level template at `tooling/claude/user/settings.template.json` carries `attribution.commit` and `attribution.pr` (empty strings to suppress co-author tags), `permissions.allow` with `Bash(bun run *)`, and `permissions.deny` with `Read(**/.env)` and `Read(**/.env.*)` to block accidental secret exposure across any project. Installed once per machine via `canon claude setup`.
79
+ - The deprecated `includeCoAuthoredBy` key is not used.
@@ -0,0 +1,13 @@
1
+ # Architecture
2
+
3
+ Authoring guidance: the architecture standard.
4
+
5
+ ## Overview
6
+
7
+ ## Key technical decisions
8
+
9
+ ### Decision name
10
+
11
+ Reasoning and tradeoffs.
12
+
13
+ ## Risks / open questions
@@ -0,0 +1,62 @@
1
+ # Design
2
+
3
+ Authoring guidance: the design standard.
4
+
5
+ ## Personality
6
+
7
+ One paragraph. Voice, tone, and the feeling a user should have. The same content a design intake form asks for.
8
+
9
+ ## Color
10
+
11
+ One row per role. Intent is a short phrase a human can picture. Value is a hex or a named system token.
12
+
13
+ | Role | Intent | Value |
14
+ | ---------- | ----------------------------- | ----- |
15
+ | background | page canvas | |
16
+ | surface | cards, panels, raised blocks | |
17
+ | text | primary body text | |
18
+ | muted | secondary text, captions | |
19
+ | accent | links, primary action | |
20
+ | success | confirmations, positive state | |
21
+ | warning | cautions, pending state | |
22
+ | error | failures, destructive action | |
23
+
24
+ ## Typography
25
+
26
+ One row per role. Size and line height in pixels or rem. Family names use their product casing.
27
+
28
+ | Role | Family | Weight | Size | Line height |
29
+ | ------- | ------ | ------ | ---- | ----------- |
30
+ | display | | | | |
31
+ | heading | | | | |
32
+ | body | | | | |
33
+ | label | | | | |
34
+ | code | | | | |
35
+
36
+ ## Spacing
37
+
38
+ Base unit and scale. The renderer draws a swatch per step.
39
+
40
+ | Step | Multiplier | Value |
41
+ | ---- | ---------- | ----- |
42
+ | xs | 0.5 | |
43
+ | sm | 1 | |
44
+ | md | 2 | |
45
+ | lg | 3 | |
46
+ | xl | 5 | |
47
+
48
+ ## Borders
49
+
50
+ | Role | Radius | Width | When used |
51
+ | ------- | ------ | ----- | --------------------- |
52
+ | default | | | cards, inputs |
53
+ | pill | | | tags, status chips |
54
+ | none | 0 | 0 | edge-to-edge surfaces |
55
+
56
+ ## Motion
57
+
58
+ One line. State whether motion is used at all, and if so, the default duration and easing.
59
+
60
+ ## Iconography
61
+
62
+ One line. Style (outline, filled, duotone), source library, and whether custom icons are allowed.
@@ -0,0 +1,18 @@
1
+ # Requirements
2
+
3
+ Authoring guidance: the requirements standard.
4
+
5
+ ## Problem
6
+
7
+ ## Goals
8
+
9
+ ## Non-goals
10
+
11
+ ## MVP features
12
+
13
+ 1. Feature: description
14
+ 2. Feature: description
15
+
16
+ ## Tech stack
17
+
18
+ ## Constraints
@@ -0,0 +1,8 @@
1
+ ---
2
+ title: Diagrams
3
+ subtitle: Per-kind Mermaid views loaded on demand. Start with system context.
4
+ ---
5
+
6
+ # Diagrams
7
+
8
+ Per-kind Mermaid views loaded on demand. Start with system context.
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Claude Code sends a payload and closes stdin. A bare read with nothing feeding
4
+ # it blocks forever and holds the session open, so the read is bounded. `read`
5
+ # rather than `timeout cat`, which macOS does not ship.
6
+ IFS= read -r -d '' -t 2 input
7
+ [ -n "$input" ] || {
8
+ printf '%s reads a Claude Code hook payload on stdin and cannot be run by hand.\n' "${0##*/}" >&2
9
+ exit 1
10
+ }
11
+
12
+ tool=$(printf '%s' "$input" | jq -r '.tool_name // empty')
13
+ case "$tool" in
14
+ Grep | Glob) ;;
15
+ *) exit 0 ;;
16
+ esac
17
+
18
+ path=$(printf '%s' "$input" | jq -r '.tool_input.path // empty')
19
+ [ -n "$path" ] || exit 0
20
+
21
+ if [ -f "$path" ]; then
22
+ dir=$(dirname "$path")
23
+ else
24
+ dir="$path"
25
+ fi
26
+
27
+ index=""
28
+ cur="$dir"
29
+ while :; do
30
+ if [ -f "$cur/index.md" ]; then
31
+ index="$cur/index.md"
32
+ break
33
+ fi
34
+ parent=$(dirname "$cur")
35
+ [ "$parent" = "$cur" ] && break
36
+ cur="$parent"
37
+ done
38
+
39
+ [ -n "$index" ] || exit 0
40
+
41
+ session=$(printf '%s' "$input" | jq -r '.session_id // "none"')
42
+ key=$(printf '%s__%s' "$session" "$index" | tr -c 'A-Za-z0-9' '_')
43
+ marker_dir="${CLAUDE_PROJECT_DIR:-.}/.claude/.tmp/index-reminder"
44
+ marker="$marker_dir/$key"
45
+ [ -f "$marker" ] && exit 0
46
+ mkdir -p "$marker_dir"
47
+ : >"$marker"
48
+
49
+ msg=$(printf 'An index.md exists at %s. Read it before searching this folder, it catalogs the sibling files faster than a blind search.' "$index")
50
+ jq -nc --arg msg "$msg" '{hookSpecificOutput:{hookEventName:"PreToolUse",additionalContext:$msg}}'
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Regenerates .claude/memory/index.md after a memory file changes.
4
+ #
5
+ # The memory folder is gitignored, so the whole-repo walk in `bun run check`
6
+ # drops it and never regenerates this index. Naming the file as a positional
7
+ # argument to `canon indexes regen` below bypasses that filter, which makes this
8
+ # hook the only trigger that reaches the folder.
9
+
10
+ # Claude Code sends a payload and closes stdin. A bare read with nothing feeding
11
+ # it blocks forever and holds the session open, so the read is bounded. `read`
12
+ # rather than `timeout cat`, which macOS does not ship.
13
+ IFS= read -r -d '' -t 2 input
14
+ [ -n "$input" ] || {
15
+ printf '%s reads a Claude Code hook payload on stdin and cannot be run by hand.\n' "${0##*/}" >&2
16
+ exit 1
17
+ }
18
+
19
+ tool=$(printf '%s' "$input" | jq -r '.tool_name // empty')
20
+ case "$tool" in
21
+ Write | Edit | MultiEdit) ;;
22
+ *) exit 0 ;;
23
+ esac
24
+
25
+ file_path=$(printf '%s' "$input" | jq -r '.tool_input.file_path // empty')
26
+ [ -n "$file_path" ] || exit 0
27
+
28
+ case "$file_path" in
29
+ */.claude/memory/*.md) ;;
30
+ *) exit 0 ;;
31
+ esac
32
+
33
+ case "$file_path" in
34
+ */.claude/memory/index.md) exit 0 ;;
35
+ esac
36
+
37
+ # Report a missing CLI rather than exiting quietly. The path guard above already
38
+ # scopes this to a memory-file edit, so the message only fires where the stale
39
+ # index it warns about is the actual outcome.
40
+ if ! command -v canon >/dev/null 2>&1; then
41
+ jq -nc --arg msg 'canon is not on PATH, so .claude/memory/index.md was not regenerated and is now stale. Install the toolkit CLI or run canon indexes regen by hand.' \
42
+ '{hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:$msg}}'
43
+ exit 0
44
+ fi
45
+
46
+ # The walk-up boundary has to come from the path, not from the session. Shared
47
+ # scratch resolves at the main worktree root, so a session inside a linked
48
+ # worktree passes a path that sits outside its own project directory and the
49
+ # default boundary would reject it.
50
+ root="${file_path%/.claude/memory/*}"
51
+ [ -n "$root" ] || exit 0
52
+
53
+ # `--no-stage` because a hook has no business touching the index. On a project
54
+ # whose memory folder is not gitignored, the default auto-stage would silently
55
+ # add memory files to whatever commit is being assembled.
56
+ output=$(canon indexes regen --no-stage --root "$root" "$file_path" 2>&1) && exit 0
57
+
58
+ # Regen failed, which on this folder means a memory file is missing `title` or
59
+ # `description`. Report it. Nothing else can: the folder is gitignored, so the
60
+ # whole-repo walk never reaches it and no gate stage will ever fail on a stale
61
+ # index. Staying quiet here is what makes the drift permanent.
62
+ errors=$(printf '%s\n' "$output" | grep '^ERROR: ' | head -5)
63
+ [ -n "$errors" ] || errors="$output"
64
+
65
+ msg="Memory index regen failed, so .claude/memory/index.md is now stale. Fix the frontmatter and save again. $errors"
66
+ jq -nc --arg msg "$msg" \
67
+ '{hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:$msg}}'
68
+ exit 0
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Hands back the absolute path form for a write made from a linked worktree.
4
+ #
5
+ # A relative path emitted from a linked worktree resolves against that
6
+ # worktree rather than the editor root, so the terminal's path detection and
7
+ # the desktop app's link both fail silently: nothing happens on the click
8
+ # and no error appears. This computes the fact a session was asking itself
9
+ # to infer on every response and hands the answer back instead.
10
+ #
11
+ # The entrypoint branch (bare vs. `file://` link) stays prose in
12
+ # governance/rules/core/015-output.md. CLAUDE_CODE_ENTRYPOINT is not among
13
+ # the environment variables Claude Code documents as passed to a hook
14
+ # subprocess, unlike CLAUDE_PROJECT_DIR, so a hook cannot read it reliably.
15
+ #
16
+ # The worktree branch comes from the path rather than from `git rev-parse`,
17
+ # the way `tasks-index.sh` and `memory-index.sh` already derive their main
18
+ # root from a path suffix instead of the session. A git call would answer for
19
+ # whatever directory the hook's own process happens to run in, which is not
20
+ # necessarily the worktree the write came from.
21
+
22
+ # Claude Code sends a payload and closes stdin. A bare read with nothing
23
+ # feeding it blocks forever and holds the session open, so the read is
24
+ # bounded. `read` rather than `timeout cat`, which macOS does not ship.
25
+ IFS= read -r -d '' -t 2 input
26
+ [ -n "$input" ] || {
27
+ printf '%s reads a Claude Code hook payload on stdin and cannot be run by hand.\n' "${0##*/}" >&2
28
+ exit 1
29
+ }
30
+
31
+ tool=$(printf '%s' "$input" | jq -r '.tool_name // empty')
32
+ case "$tool" in
33
+ Write | Edit | MultiEdit) ;;
34
+ *) exit 0 ;;
35
+ esac
36
+
37
+ file_path=$(printf '%s' "$input" | jq -r '.tool_input.file_path // empty')
38
+ [ -n "$file_path" ] || exit 0
39
+
40
+ # A path with no worktree segment is either the main worktree, where a
41
+ # relative path already resolves against the editor root, or a path this
42
+ # hook cannot place. Either way there is nothing to hand back.
43
+ case "$file_path" in
44
+ */.claude/worktrees/*) ;;
45
+ *) exit 0 ;;
46
+ esac
47
+
48
+ abs_path=$(realpath -- "$file_path" 2>/dev/null)
49
+ if [ -z "$abs_path" ]; then
50
+ jq -nc --arg msg "path-form.sh could not resolve an absolute form for $file_path from this linked worktree. Report the path per the worktree branch in the output rule instead of guessing." \
51
+ '{hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:$msg}}'
52
+ exit 0
53
+ fi
54
+
55
+ jq -nc --arg path "$abs_path" \
56
+ '{hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:("This write is from a linked worktree. When reporting this path in your response, use its absolute form: " + $path)}}'
57
+ exit 0
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Claude Code sends a payload and closes stdin. A bare read with nothing feeding
4
+ # it blocks forever and holds the session open, so the read is bounded. `read`
5
+ # rather than `timeout cat`, which macOS does not ship.
6
+ IFS= read -r -d '' -t 2 input
7
+ [ -n "$input" ] || {
8
+ printf '%s reads a Claude Code hook payload on stdin and cannot be run by hand.\n' "${0##*/}" >&2
9
+ exit 1
10
+ }
11
+
12
+ tool=$(printf '%s' "$input" | jq -r '.tool_name // empty')
13
+ case "$tool" in
14
+ Write | Edit) ;;
15
+ *) exit 0 ;;
16
+ esac
17
+
18
+ file_path=$(printf '%s' "$input" | jq -r '.tool_input.file_path // empty')
19
+ [ -n "$file_path" ] || exit 0
20
+
21
+ case "$file_path" in
22
+ */.claude/.tmp/*) exit 0 ;;
23
+ esac
24
+
25
+ # A project whose own root sits under a path carrying a tmp segment is not
26
+ # writing to system temp, and the bare pattern below trips the guard on every
27
+ # source file it holds. Anchor on the project root before the pattern match.
28
+ #
29
+ # This gives up one case on purpose: a write to <project>/tmp/ is a genuine
30
+ # scratch violation that no longer warns. The false positive fires on every
31
+ # source write in an affected project, so the trade favors the anchor.
32
+ if [ -n "${CLAUDE_PROJECT_DIR:-}" ]; then
33
+ case "$file_path" in
34
+ "$CLAUDE_PROJECT_DIR"/*) exit 0 ;;
35
+ esac
36
+ fi
37
+
38
+ case "$file_path" in
39
+ */tmp/* | *\\tmp\\* | */Temp/* | *\\Temp\\* | */var/folders/*) ;;
40
+ *) exit 0 ;;
41
+ esac
42
+
43
+ session=$(printf '%s' "$input" | jq -r '.session_id // "none"')
44
+ key=$(printf '%s' "$session" | tr -c 'A-Za-z0-9' '_')
45
+ marker_dir="${CLAUDE_PROJECT_DIR:-.}/.claude/.tmp/scratch-guard"
46
+ marker="$marker_dir/$key"
47
+ [ -f "$marker" ] && exit 0
48
+ mkdir -p "$marker_dir"
49
+ : >"$marker"
50
+
51
+ msg='Temporary file write outside .claude/.tmp/. Write temp files to .claude/.tmp/<slug>/ in the project root, not system temp. See the Scratch rule in CLAUDE.md.'
52
+ jq -nc --arg msg "$msg" '{hookSpecificOutput:{hookEventName:"PreToolUse",additionalContext:$msg}}'
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Claude Code sends a payload and closes stdin. A bare read with nothing feeding
4
+ # it blocks forever and holds the session open, so the read is bounded. `read`
5
+ # rather than `timeout cat`, which macOS does not ship.
6
+ IFS= read -r -d '' -t 2 input
7
+ [ -n "$input" ] || {
8
+ printf '%s reads a Claude Code hook payload on stdin and cannot be run by hand.\n' "${0##*/}" >&2
9
+ exit 1
10
+ }
11
+
12
+ file=$(printf '%s' "$input" | jq -r '.tool_input.file_path // .tool_response.filePath // empty')
13
+
14
+ file="${file//\\//}"
15
+
16
+ case "$file" in
17
+ *.md) ;;
18
+ *) exit 0 ;;
19
+ esac
20
+
21
+ case "$file" in
22
+ *.claude/.tmp/* | *.claude/memory/* | *.claude/review/* | *.claude/plans/*) exit 0 ;;
23
+ esac
24
+
25
+ [ -f "$file" ] || exit 0
26
+
27
+ # The audit verb owns the ban sets, so this hook carries no copy of them. The
28
+ # awk this replaces parsed the word bans out of the project's own standards,
29
+ # hardcoded the em-dash and semicolon, and reached none of the spellings, so a
30
+ # British spelling passed at edit time and a corpus check caught it later with
31
+ # nothing in between explaining the difference. A ban class added to the verb
32
+ # now reaches this hook without an edit here.
33
+ #
34
+ # The verb resolves its own paths under the cwd, so the project root is named
35
+ # rather than inherited. The payload carries an absolute file path, which is
36
+ # what lets the runner move without taking the argument out of reach.
37
+ root="${CLAUDE_PROJECT_DIR:-.}"
38
+
39
+ # A machine without the binary reports that nothing ran rather than exiting
40
+ # clean. An edit nobody checked and an edit carrying no violation are the same
41
+ # silence to a reader, so the enforcement a machine lacks is reported.
42
+ #
43
+ # A completed run always writes the record, and a refusal writes nothing, so an
44
+ # empty one means the verb declined to measure rather than measured and found
45
+ # nothing. It refuses outside a git repository, which is a project this hook can
46
+ # be installed into, and reading the findings alone reports that as a clean file.
47
+ unread=""
48
+ record=""
49
+ if command -v canon >/dev/null 2>&1; then
50
+ record=$(cd "$root" 2>/dev/null && canon markdown audit "$file" --json 2>/dev/null) || true
51
+ [ -n "$record" ] || unread="record"
52
+ else
53
+ unread="runner"
54
+ fi
55
+
56
+ # The record decides rather than the exit code, so a binary predating a ban
57
+ # class still reports what it does measure. A refusal and an unparseable payload
58
+ # both yield nothing, which is the same silence a clean file produces.
59
+ hits=$(printf '%s' "$record" |
60
+ jq -r '.entries[]?.bans[]? | ":\(.line):\(.column + 1) \(.kind) \(.term)"' 2>/dev/null)
61
+
62
+ # A set the verb shipped empty measures nothing and would report a clean file.
63
+ # Reading the findings alone turns that narrowed check into a pass, so the field
64
+ # is read beside them.
65
+ empty=$(printf '%s' "$record" |
66
+ jq -r '[.bans.emptySets[]?] | join(", ")' 2>/dev/null)
67
+
68
+ [ -z "$hits" ] && [ -z "$unread" ] && [ -z "$empty" ] && exit 0
69
+
70
+ nl=$'\n'
71
+ msg=""
72
+
73
+ if [ "$unread" = "runner" ]; then
74
+ msg=$(printf 'Standards-audit: nothing checked in %s. Found no `canon` binary on PATH. Install one with `bun add -g @erclx/canon`.' "$file")
75
+ elif [ "$unread" = "record" ]; then
76
+ msg=$(printf 'Standards-audit: nothing checked in %s. `canon markdown audit` returned no record, which it does when it declines to measure. It needs a git repository to build its corpus.' "$file")
77
+ elif [ -n "$empty" ]; then
78
+ msg=$(printf 'Standards-audit: the shipped ban set is empty for %s, so %s was checked against a narrowed set. Reinstall the toolkit with `bun add -g @erclx/canon`.' "$empty" "$file")
79
+ fi
80
+
81
+ if [ -n "$hits" ]; then
82
+ found=$(printf 'Standards-audit: markdown.md violations in %s. Rewrite the sentence (do not lazy-swap). A code span is the answer only where the token is genuinely an identifier under discussion.\n%s' "$file" "$hits")
83
+ msg="${msg:+$msg$nl}$found"
84
+ fi
85
+
86
+ jq -nc --arg msg "$msg" '{hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:$msg}}'