@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,38 @@
1
+ ---
2
+ description: Enforce pydantic v2 patterns for validation and serialization
3
+ paths:
4
+ - '**/*.py'
5
+ ---
6
+
7
+ # Pydantic standards
8
+
9
+ ## Models
10
+
11
+ - Use `pydantic.BaseModel` over `dataclass` at I/O and API boundaries.
12
+ - Use `model_config = ConfigDict(...)` over the legacy nested `Config` class.
13
+ - Set `extra="forbid"` on models receiving external input to prevent data pollution.
14
+ - Use `Field(...)` for defaults, descriptions, and constraints over docstring conventions.
15
+
16
+ ## Validation
17
+
18
+ - Use `Model.model_validate(data)` over `Model(**data)` for untrusted dict input.
19
+ - Use `Model.model_validate_json(s)` over `json.loads` followed by validation.
20
+ - Use `@field_validator` over the legacy `@validator`.
21
+ - Use `@model_validator(mode="after")` for cross-field invariants.
22
+
23
+ ## Types
24
+
25
+ - Use `AnyUrl`, `EmailStr`, `SecretStr`, and `PositiveInt` over hand-rolled regex constraints.
26
+ - Use `Annotated[T, Field(...)]` over default-value `Field(...)` for reusable constrained types.
27
+ - Do not use `Any` in fields. Reach for `JsonValue` or a `Union` of concrete types.
28
+
29
+ ## Settings
30
+
31
+ - Use `pydantic_settings.BaseSettings` for env-driven configuration.
32
+ - Load environment through a single `Settings` model. Do not read `os.environ` directly elsewhere.
33
+
34
+ ## Serialization
35
+
36
+ - Use `model.model_dump(mode="json")` over the legacy `.dict()`.
37
+ - Use `model.model_dump_json()` over `json.dumps(model.dict())`.
38
+ - Use `by_alias=True` when serializing to external schemas with non-Python field names.
@@ -0,0 +1,32 @@
1
+ ---
2
+ description: Enforce web frontend security and XSS prevention
3
+ paths:
4
+ - '**/*.tsx'
5
+ - '**/*.jsx'
6
+ - '**/*.html'
7
+ - '**/*.astro'
8
+ ---
9
+
10
+ # Web security standards
11
+
12
+ ## Link safety
13
+
14
+ - Add `rel="noopener noreferrer"` to all external links with `target="_blank"`.
15
+
16
+ ## Content sanitization
17
+
18
+ - Sanitize all user-generated content rendered via `dangerouslySetInnerHTML` using DOMPurify or equivalent.
19
+ - Never use `dangerouslySetInnerHTML` without sanitization.
20
+
21
+ ## Input validation
22
+
23
+ - Validate all URL parameters and query strings using schema validation before use.
24
+
25
+ ## Storage and tokens
26
+
27
+ - Do not store sensitive data (tokens, passwords, PII) in `localStorage` or `sessionStorage`.
28
+ - Store authentication tokens in httpOnly cookies over exposing them to JavaScript.
29
+
30
+ ## Third-party scripts
31
+
32
+ - Audit and pin versions for all third-party scripts loaded in the browser.
@@ -0,0 +1,39 @@
1
+ ---
2
+ description: Enforce server-side authorization, secret handling, and abuse limits on request handlers
3
+ paths:
4
+ - '**/*.py'
5
+ - '**/*.ts'
6
+ - '**/*.js'
7
+ ---
8
+
9
+ # Server security standards
10
+
11
+ ## Authorization
12
+
13
+ - Authorize every request on the server, whatever the client already checked.
14
+ - Derive the caller identity from the verified session or token. Never read it from a request body, query string, or header the client sets.
15
+ - Check that the caller owns or may reach the specific record a request names, not only that the caller is signed in.
16
+ - Deny by default. Grant a route access through an explicit allow.
17
+
18
+ ## Credentials
19
+
20
+ - Hash passwords with a memory-hard algorithm and a per-record salt. Never store a reversible password.
21
+ - Compare tokens, signatures, and password hashes with a constant-time function.
22
+ - Expire and revoke sessions and refresh tokens on the server. Do not rely on client-side deletion.
23
+
24
+ ## Secrets
25
+
26
+ - Read every secret from the environment or a secret manager at runtime.
27
+ - Never commit a secret, connection string, or private key to the repository.
28
+ - Never return a secret, connection string, or internal hostname in a response body.
29
+
30
+ ## Abuse limits
31
+
32
+ - Rate-limit authentication, password reset, and any endpoint that sends mail or costs money per call.
33
+ - Set an explicit maximum body size and request timeout on every endpoint.
34
+ - Bound pagination parameters with a server-side maximum.
35
+
36
+ ## Transport
37
+
38
+ - Serve every route over TLS and reject plaintext requests.
39
+ - Restrict CORS to an explicit origin list. Never reflect the request origin or pair a wildcard with credentials.
@@ -0,0 +1,35 @@
1
+ ---
2
+ description: Enforce persistence boundaries for migrations, query construction, transactions, and rollback
3
+ paths:
4
+ - '**/*.py'
5
+ - '**/*.ts'
6
+ - '**/*.js'
7
+ - '**/*.sql'
8
+ ---
9
+
10
+ # Persistence standards
11
+
12
+ ## Schema changes
13
+
14
+ - Express every schema change as a migration file committed to version control.
15
+ - Ship a tested rollback path with every migration that changes a schema.
16
+ - Never alter a deployed schema outside a migration.
17
+ - Never edit a migration that has run in a shared environment. Add a new one.
18
+ - Separate a destructive migration from the deploy that stops reading the dropped column.
19
+
20
+ ## Query construction
21
+
22
+ - Pass every runtime value as a bound parameter.
23
+ - Never interpolate, concatenate, or format a value into a statement string.
24
+ - Name the columns a read needs. Do not select every column by wildcard.
25
+
26
+ ## Transactions
27
+
28
+ - Give each transaction one owner that opens it, commits it, and rolls it back.
29
+ - Never open a transaction inside a function that was handed one.
30
+ - Keep network calls, queue publishes, and filesystem writes outside an open transaction.
31
+
32
+ ## Access patterns
33
+
34
+ - Load related rows in the query that fetches their parents. Do not resolve a relation lazily inside an iteration.
35
+ - Scope a connection or session to the request that opened it and release it on exit.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Execute an @-referenced snippet's instructions immediately using session context
3
+ ---
4
+
5
+ # Snippet reference standards
6
+
7
+ ## Execution
8
+
9
+ - When a snippet is referenced with `@`, execute its instructions immediately using available session context
@@ -0,0 +1,36 @@
1
+ ---
2
+ description: Enforce UI copy and text standards for rendered strings in components
3
+ paths:
4
+ - '**/*.tsx'
5
+ - '**/*.jsx'
6
+ - '**/*.astro'
7
+ - '**/*.html'
8
+ ---
9
+
10
+ # UI copy standards
11
+
12
+ ## Casing
13
+
14
+ - Use sentence case for all rendered UI text: headings, labels, nav items, tab titles, and dialog titles.
15
+ - Retain original casing for proper nouns and product names: `GitHub`, `macOS`, `TypeScript`.
16
+
17
+ ## Punctuation
18
+
19
+ - Do not use em dashes (`—`). Use a comma or period, or restructure the sentence.
20
+ - Do not add punctuation to button labels or short action strings.
21
+
22
+ ## Button copy
23
+
24
+ - Use imperative verbs for actions: `Save`, `Delete`, `Connect`, `Cancel`.
25
+ - Avoid padded phrasing: `Save` over `Save changes`, `Delete` over `Click to delete`.
26
+
27
+ ## Error messages
28
+
29
+ - State what to do, not what went wrong: `Enter a valid email` over `Email is invalid`.
30
+ - Keep messages short and actionable.
31
+ - One sentence maximum.
32
+
33
+ ## Placeholder text
34
+
35
+ - Show format examples over instructions: `name@example.com` over `Enter your email here`.
36
+ - Reserve instructions for labels or helper text below the input.
@@ -0,0 +1,48 @@
1
+ ---
2
+ description: Keyboard interaction, focus management, and ARIA accessibility for rendered UI
3
+ paths:
4
+ - '**/*.tsx'
5
+ - '**/*.jsx'
6
+ - '**/*.astro'
7
+ - '**/*.html'
8
+ - '**/*.css'
9
+ ---
10
+
11
+ # Accessibility and keyboard standards
12
+
13
+ ## Focus styles
14
+
15
+ - All interactive elements must use the project focus ring. Do not define per-component focus styles.
16
+ - Never apply `outline-none` without a custom focus ring in the same rule.
17
+ - Focus ring must have 3:1 contrast against its background in both light and dark modes.
18
+
19
+ ## Keyboard interaction model
20
+
21
+ - Tab / Shift+Tab: move focus sequentially through interactive elements in DOM order.
22
+ - Enter: activates buttons and links, submits forms.
23
+ - Space: activates buttons and checkboxes, toggles selection in listboxes.
24
+ - Arrow keys: navigate within composite widgets. Do not let them exit the widget.
25
+ - Escape: closes any overlay, popover, dialog, or dropdown. Cancels in-progress edits.
26
+ - Do not introduce non-standard key bindings for common actions.
27
+
28
+ ## Composite widgets
29
+
30
+ - Roving tabindex for interactive collections: one item in the tab sequence at a time.
31
+ - Combobox: arrow keys navigate options, Enter selects, Escape closes, typing filters.
32
+
33
+ ## Focus management
34
+
35
+ - Move focus into any overlay, popover, or dialog on open. Return focus to the trigger on close.
36
+ - Never move focus on hover. Only on keyboard input or explicit pointer activation.
37
+
38
+ ## ARIA semantics
39
+
40
+ - Use semantic HTML over custom elements: `<button>` over a `<div>` carrying a click handler, `<a>` over a `<span>` carrying one.
41
+ - A `<div>` with a click handler requires a role, a tab index, and keyboard handlers. Use `<button>` instead.
42
+ - Spell an attribute the way the file's syntax spells it: `onclick` and `tabindex` in HTML and Astro markup, `onClick` and `tabIndex` in JSX.
43
+ - Set role on custom controls: `role="combobox"`, `role="listbox"`, `role="menu"`, `role="option"`.
44
+ - Synchronize state attributes with visual state: `aria-expanded`, `aria-selected`, `aria-checked`, `aria-disabled`.
45
+ - Add `aria-label` or `aria-labelledby` to interactive elements with no visible text label.
46
+ - Always provide `alt` on `<img>`. Use `alt=""` for decorative images.
47
+ - Describe the content or function of the image, not its appearance. Do not prefix with "Image of" or "Photo of".
48
+ - Alt text for functional images (icons, buttons) should describe the action, not the graphic.
@@ -0,0 +1,36 @@
1
+ ---
2
+ description: Form validation timing, save-blocking, and derived state for rendered forms
3
+ paths:
4
+ - '**/*.tsx'
5
+ - '**/*.jsx'
6
+ - '**/*.astro'
7
+ - '**/*.html'
8
+ ---
9
+
10
+ # Form standards
11
+
12
+ ## Validation timing
13
+
14
+ - Validate on blur, not on every keystroke. Exception: realtime feedback that is explicitly part of the feature (e.g. character count, live search).
15
+ - After a field shows its first error (on blur), re-validate on every change so the error clears as soon as the input becomes valid.
16
+ - Apply the same validation timing to all fields in a form. Do not mix blur-only and change-only validation within one form.
17
+ - Do not show an error on a field the user has never touched.
18
+
19
+ ## Save blocking
20
+
21
+ - Block save when any required field is empty, invalid, or has never been touched.
22
+ - Treat whitespace-only values as empty for required fields.
23
+
24
+ ## Error placement
25
+
26
+ - Show the error directly under the field that caused it, not under an unrelated field.
27
+ - When a change to field A causes a conflict involving field B, show the error under field A (the field the user edited), not under field B.
28
+
29
+ ## Input sanitization
30
+
31
+ - Trim leading and trailing whitespace from text inputs on blur or submit, not on every keystroke.
32
+ - If a field is case-sensitive, surface that constraint near the field. Do not silently treat `Foo` and `foo` as different values without warning.
33
+
34
+ ## Derived display state
35
+
36
+ - Reset status indicators, counts, and derived display values when their source input changes.
@@ -0,0 +1,65 @@
1
+ ---
2
+ description: UX completeness checklist for interactive components and views
3
+ paths:
4
+ - '**/*.tsx'
5
+ - '**/*.jsx'
6
+ - '**/*.astro'
7
+ - '**/*.html'
8
+ - '**/*.css'
9
+ ---
10
+
11
+ # UX completeness standards
12
+
13
+ ## Mutation feedback
14
+
15
+ - Every user-initiated mutation (save, delete, sync, import, export) must show inline feedback on success.
16
+ - Feedback must be transient: auto-dismiss after 2-3 seconds without requiring user action.
17
+ - Show inline error feedback when a mutation fails. Do not fail silently.
18
+
19
+ ## Empty states
20
+
21
+ - Every list, table, or collection view must handle the empty state explicitly.
22
+ - Empty states must include a next action: a button, link, or instruction that tells the user what to do.
23
+ - Distinguish between "nothing exists yet" (onboarding) and "nothing matches your filter" (recovery). Use different copy for each.
24
+ - Filter-driven empty states must include a way to clear the filter (link or button).
25
+
26
+ ## Loading states
27
+
28
+ - Every async operation visible to the user must show a loading indicator (spinner, skeleton, or disabled state).
29
+ - Do not show stale content while new content is loading. Either show a loading state or keep the previous content with a progress indicator.
30
+
31
+ ## Destructive actions
32
+
33
+ - Destructive actions (delete, disconnect, discard) must require confirmation before executing.
34
+ - Confirmation UI must be dismissible via Escape in addition to a cancel button.
35
+
36
+ ## Inline confirmations
37
+
38
+ - All inline confirmation rows (delete, discard, cancel) must be dismissible via Escape.
39
+ - Confirmation labels and destructive buttons must have sufficient contrast in both light and dark modes.
40
+
41
+ ## Status indicators
42
+
43
+ - Status indicators (dots, badges, connection status) must reset to a neutral state when their source input changes.
44
+ - Do not show optimistic status (green dot, "connected") while unsaved edits are pending.
45
+
46
+ ## State transitions
47
+
48
+ - Do not flash intermediate states during transitions (e.g., white flash on theme load, layout jump before data arrives).
49
+ - Use CSS transitions or deferred rendering to prevent visible flicker between states.
50
+
51
+ ## Interactive element states
52
+
53
+ - All interactive elements must visually respond to hover, active, focus, and disabled states.
54
+ - Disabled elements must use reduced opacity or muted colors and `cursor: not-allowed`.
55
+ - Do not rely on a single state (e.g., focus only) to communicate interactivity.
56
+
57
+ ## Overflow and truncation
58
+
59
+ - Long text in constrained containers must truncate with ellipsis, not overflow or wrap unexpectedly.
60
+ - Truncated text must be accessible via `title` attribute or expandable interaction.
61
+
62
+ ## Scroll and clipping
63
+
64
+ - Focus rings and interactive borders must not be clipped by parent `overflow: hidden` or `overflow: auto` containers.
65
+ - Add padding or adjust overflow to prevent clipping on edge items in scrollable lists.
@@ -0,0 +1,34 @@
1
+ ---
2
+ description: Require a capture against a running preview after a rendered surface changes
3
+ paths:
4
+ - '**/routes/**/*.{tsx,jsx,vue,svelte,astro}'
5
+ - '**/pages/**/*.{tsx,jsx,vue,svelte,astro}'
6
+ - '**/app/**/page.{tsx,jsx}'
7
+ - '**/*.html'
8
+ ---
9
+
10
+ # Surface capture standards
11
+
12
+ ## What a surface is
13
+
14
+ - A surface is anything the project renders for a person to look at. A framework route is one. A page the project generates is another, whoever generates it.
15
+ - Judge a generated page by the same rule as a route. Reading its markup reports nothing about how it composes.
16
+
17
+ ## When to capture
18
+
19
+ - Run the project's capture command after changing what a surface renders. Report it rather than proceeding silently when the project has none.
20
+ - Capture against a running preview server. Do not capture against a dev server.
21
+ - Capture every theme the surface ships. Do not capture the default theme alone.
22
+ - Capture again after fixing a defect a capture found. A repair inside a shared stylesheet can cancel a rule written earlier in the same file.
23
+
24
+ ## What a capture covers
25
+
26
+ - Capture the full page at the viewport its case declares. Do not capture a component in isolation.
27
+ - Drive a state a screenshot cannot reach. An initial render reports nothing about a menu that opens, an answer that is chosen, or a rail that tracks scrolling.
28
+ - Add a case to the capture record when adding a surface.
29
+ - Remove a surface's case in the change that removes the surface.
30
+
31
+ ## Sharing a capture
32
+
33
+ - Attach a capture to the pull request by hand when a reviewer needs to see it.
34
+ - Do not commit a capture. Do not remove the capture folder from `.gitignore`.
@@ -0,0 +1,19 @@
1
+ ---
2
+ description: Enforce the same-tab default for an outbound link and for a mail link
3
+ paths:
4
+ - '**/*.tsx'
5
+ - '**/*.jsx'
6
+ - '**/*.astro'
7
+ - '**/*.html'
8
+ ---
9
+
10
+ # Link behavior standards
11
+
12
+ ## Default target
13
+
14
+ - Open a link in the same tab. Reserve `target="_blank"` for a destination that would discard in-progress work if it replaced the current page, such as a document a user is midway through elsewhere.
15
+ - Do not add `target="_blank"` as a default for every external link.
16
+
17
+ ## mailto: links
18
+
19
+ - Open a `mailto:` link in the same tab. It hands off to the mail client rather than replacing page content, so a new tab leaves an empty tab behind.
@@ -0,0 +1,2 @@
1
+ extends = "node"
2
+ rules = ["210-astro", "350-security-web", "400-ui", "410-a11y", "430-ux-completeness", "440-surface-capture", "450-link-behavior"]
@@ -0,0 +1,8 @@
1
+ extends = ""
2
+ # All four folders whole. Every rule authored under them ships to a base
3
+ # consumer, so adding one is a single edit rather than a file and a name here.
4
+ # `snippets` carries the `@`-reference convention rule, which lost its only
5
+ # other delivery path when `canon snippets install` retired. `ci` carries the
6
+ # workflow rule, whose glob is the only inbound route to the `ci-workflow`
7
+ # skill.
8
+ rules = ["core", "claude", "snippets", "ci", "120-bash"]
@@ -0,0 +1,2 @@
1
+ extends = "node"
2
+ rules = ["360-security-server", "370-database"]
@@ -0,0 +1,2 @@
1
+ extends = "base"
2
+ rules = ["100-typescript"]
@@ -0,0 +1,2 @@
1
+ extends = "python"
2
+ rules = ["220-fastapi"]
@@ -0,0 +1,2 @@
1
+ extends = "base"
2
+ rules = ["110-python", "340-pydantic", "330-testing-py", "360-security-server", "370-database"]
@@ -0,0 +1,2 @@
1
+ extends = "node"
2
+ rules = ["200-react", "230-nextjs", "250-tailwind", "300-testing-ts", "305-e2e-reliability", "306-test-scope", "310-zod", "350-security-web", "400-ui", "410-a11y", "420-forms", "430-ux-completeness", "440-surface-capture", "450-link-behavior"]
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@erclx/canon",
3
+ "type": "module",
4
+ "version": "4.0.0",
5
+ "description": "Infrastructure and quality tooling for developer workflows",
6
+ "license": "MIT",
7
+ "bin": {
8
+ "canon": "./src/cli.ts"
9
+ },
10
+ "files": [
11
+ "src",
12
+ "scripts",
13
+ "standards",
14
+ "snippets",
15
+ "governance",
16
+ "tooling",
17
+ "claude",
18
+ "docs",
19
+ "tsconfig.json",
20
+ "!scripts/sandbox",
21
+ "!scripts/eval",
22
+ "!src/capture",
23
+ "!**/*.test.ts"
24
+ ],
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "scripts": {
29
+ "check:spell": "cspell '**' '.*/**' '.*' --no-progress --color --show-context",
30
+ "format": "prettier --write --log-level warn --ignore-path .gitignore --ignore-path .prettierignore . && shfmt --write --indent 2 scripts/ tooling/ claude/",
31
+ "check:format": "prettier --check --log-level warn --ignore-path .gitignore --ignore-path .prettierignore . && shfmt --diff --indent 2 scripts/ tooling/ claude/",
32
+ "check:shell": "find scripts tooling claude .claude/hooks -name '*.sh' -exec shellcheck --severity=warning {} +",
33
+ "check:types": "tsc --noEmit",
34
+ "check:install": "./scripts/core/install-check.sh",
35
+ "test": "bun --bun vitest run",
36
+ "prepare": "husky",
37
+ "check": "bun src/cli.ts gate run",
38
+ "check:ci": "bun src/cli.ts gate run --all --no-write",
39
+ "update": "./scripts/core/update.sh",
40
+ "clean": "./scripts/core/clean.sh",
41
+ "snapshot": "./scripts/core/snapshot.sh",
42
+ "bootstrap": "./scripts/core/bootstrap.sh",
43
+ "canon:sandbox": "canon sandbox",
44
+ "canon:sandbox:reset": "canon sandbox reset"
45
+ },
46
+ "dependencies": {
47
+ "commander": "^13.1.0",
48
+ "execa": "^9.5.2",
49
+ "playwright-core": "1.59.1",
50
+ "pptxgenjs": "^4.0.1"
51
+ },
52
+ "devDependencies": {
53
+ "@astrojs/check": "^0.9.8",
54
+ "@astrojs/react": "^5.0.4",
55
+ "@commitlint/cli": "^20.4.1",
56
+ "@commitlint/config-conventional": "^20.4.1",
57
+ "@playwright/test": "1.59.1",
58
+ "@tailwindcss/vite": "^4.2.4",
59
+ "@testing-library/jest-dom": "^6.9.1",
60
+ "@types/bun": "^1.2.10",
61
+ "astro": "^6.1.9",
62
+ "cspell": "^8.17.1",
63
+ "husky": "^9.1.7",
64
+ "prettier": "^3.8.1",
65
+ "prettier-plugin-tailwindcss": "^0.7.2",
66
+ "typescript": "^5.9.3",
67
+ "vitest": "^4.1.5"
68
+ }
69
+ }
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env bash
2
+
3
+ if [ -z "${GITHUB_ORG:-}" ]; then
4
+ _origin_url="$(git config --get remote.origin.url 2>/dev/null || true)"
5
+ if [ -n "$_origin_url" ]; then
6
+ GITHUB_ORG="$(echo "$_origin_url" | sed -nE 's#^(git@github\.com:|https://github\.com/)([^/]+)/.+#\2#p')"
7
+ fi
8
+ unset _origin_url
9
+ fi
10
+
11
+ export GITHUB_ORG="${GITHUB_ORG:-}"
@@ -0,0 +1,81 @@
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
+ ZSHRC="${ZDOTDIR:-$HOME}/.zshrc"
11
+ MARKER_OPEN="# >>> canon aliases >>>"
12
+ MARKER_CLOSE="# <<< canon aliases <<<"
13
+
14
+ check_dependencies() {
15
+ command -v bun >/dev/null 2>&1 || log_error "bun is not installed. See https://bun.sh, then re-run."
16
+ }
17
+
18
+ install_cli() {
19
+ log_step "Installing the canon CLI"
20
+ bun install --cwd "$PROJECT_ROOT" >/dev/null
21
+ bun link --cwd "$PROJECT_ROOT" >/dev/null
22
+ log_info "Dependencies installed and canon linked"
23
+ }
24
+
25
+ alias_block() {
26
+ cat <<EOF
27
+ $MARKER_OPEN
28
+ TOOLKIT="$PROJECT_ROOT"
29
+
30
+ alias cl='claude'
31
+ alias clr='cl -r'
32
+ alias clc='cl -c'
33
+ alias clw='cl -w'
34
+ alias cls='cl --model sonnet'
35
+
36
+ alias clp='claude --plugin-dir \$TOOLKIT/claude'
37
+ alias clpc='clp -c'
38
+ alias clps='clp --model sonnet'
39
+ $MARKER_CLOSE
40
+ EOF
41
+ }
42
+
43
+ install_aliases() {
44
+ log_step "Installing Claude Code shell aliases"
45
+
46
+ if [ -f "$ZSHRC" ] && grep -qF "$MARKER_OPEN" "$ZSHRC"; then
47
+ log_info "Aliases already present in $ZSHRC, skipping"
48
+ return
49
+ fi
50
+
51
+ if [ -f "$ZSHRC" ] && grep -qE "^alias clp=" "$ZSHRC"; then
52
+ log_warn "An unmanaged clp alias is already in $ZSHRC. Leaving it untouched."
53
+ log_warn "Remove it and re-run to switch to the managed block."
54
+ return
55
+ fi
56
+
57
+ printf '\n%s\n' "$(alias_block)" >>"$ZSHRC"
58
+ log_add "Appended canon alias block to $ZSHRC"
59
+ log_info "Run 'source $ZSHRC' or open a new shell to load them"
60
+ }
61
+
62
+ verify_cli() {
63
+ log_step "Verifying the install"
64
+ if canon --help >/dev/null 2>&1; then
65
+ log_info "canon resolves on PATH"
66
+ else
67
+ log_warn "canon not on PATH yet. Ensure \$BUN_INSTALL/bin is exported, then re-open your shell."
68
+ fi
69
+ }
70
+
71
+ main() {
72
+ open_timeline "canon bootstrap"
73
+ trap close_timeline EXIT
74
+
75
+ check_dependencies
76
+ install_cli
77
+ install_aliases
78
+ verify_cli
79
+ }
80
+
81
+ main "$@"
@@ -0,0 +1,41 @@
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
+ SCRIPTS_ROOT="$PROJECT_ROOT/scripts"
9
+ PALETTE_SOURCE="$SCRIPTS_ROOT/lib/ui.sh"
10
+
11
+ # `find` writes to stderr and returns non-zero for a missing root, inside a
12
+ # process substitution whose status nothing reads. Without this the walk covers
13
+ # nothing and the check reports the tree clean having never measured it.
14
+ if [ ! -f "$PALETTE_SOURCE" ]; then
15
+ echo "No palette source at ${PALETTE_SOURCE#"$PROJECT_ROOT/"}, color sourcing unverifiable." >&2
16
+ exit 1
17
+ fi
18
+
19
+ # Any SGR sequence in either spelling. The cursor and erase sequences an
20
+ # interactive prompt writes end in a letter instead, and they run only where a
21
+ # terminal already exists, so they are not what this measures.
22
+ SGR='\\(033|e|x1b)\[[0-9;]*m'
23
+
24
+ # Sixteen copies of one decision is what made color impossible to turn off on
25
+ # the TypeScript side. A rule nothing enforces rebuilds them the next time a
26
+ # script wants grey, so the escape lives in the shared library and every other
27
+ # script reads the palette that library derives for its stream.
28
+ offenders=""
29
+ while IFS= read -r file; do
30
+ [ "$file" = "$PALETTE_SOURCE" ] && continue
31
+ if grep -qE "$SGR" "$file"; then
32
+ offenders="$offenders ${file#"$PROJECT_ROOT/"}"$'\n'
33
+ fi
34
+ done < <(find "$SCRIPTS_ROOT" -type f -name '*.sh')
35
+
36
+ if [ -n "$offenders" ]; then
37
+ echo "A color escape is defined outside the shared library:" >&2
38
+ printf '%s' "$offenders" >&2
39
+ echo "Source scripts/lib/ui.sh and read its palette, so one answer covers every writer." >&2
40
+ exit 1
41
+ fi