@erclx/aitk 0.8.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 (359) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +99 -0
  3. package/claude/.claude-plugin/plugin.json +19 -0
  4. package/claude/skills/bash-script/SKILL.md +96 -0
  5. package/claude/skills/bash-script/references/patterns.md +349 -0
  6. package/claude/skills/ci-workflow/SKILL.md +52 -0
  7. package/claude/skills/ci-workflow/references/workflows.md +74 -0
  8. package/claude/skills/claude-address-review/SKILL.md +107 -0
  9. package/claude/skills/claude-autoship/SKILL.md +137 -0
  10. package/claude/skills/claude-design-extract/SKILL.md +69 -0
  11. package/claude/skills/claude-design-propose/SKILL.md +75 -0
  12. package/claude/skills/claude-diagram/SKILL.md +126 -0
  13. package/claude/skills/claude-docs/SKILL.md +204 -0
  14. package/claude/skills/claude-feature/REQUIREMENT.md +35 -0
  15. package/claude/skills/claude-feature/SKILL.md +148 -0
  16. package/claude/skills/claude-groundwork/SKILL.md +148 -0
  17. package/claude/skills/claude-groundwork/references/folder-format.md +107 -0
  18. package/claude/skills/claude-memory-capture/SKILL.md +80 -0
  19. package/claude/skills/claude-memory-review/REQUIREMENT.md +37 -0
  20. package/claude/skills/claude-memory-review/SKILL.md +206 -0
  21. package/claude/skills/claude-orchestrate/SKILL.md +125 -0
  22. package/claude/skills/claude-pr-review/SKILL.md +150 -0
  23. package/claude/skills/claude-review/SKILL.md +136 -0
  24. package/claude/skills/claude-roadmap/SKILL.md +61 -0
  25. package/claude/skills/claude-roadmap/references/roadmap.md +52 -0
  26. package/claude/skills/claude-screencast/SKILL.md +160 -0
  27. package/claude/skills/claude-seed-sync/SKILL.md +141 -0
  28. package/claude/skills/claude-slides-draft/SKILL.md +62 -0
  29. package/claude/skills/claude-standards-audit/REQUIREMENT.md +33 -0
  30. package/claude/skills/claude-standards-audit/SKILL.md +79 -0
  31. package/claude/skills/claude-standards-audit/references/branch.md +49 -0
  32. package/claude/skills/claude-standards-audit/references/pr.md +124 -0
  33. package/claude/skills/claude-tasks/SKILL.md +123 -0
  34. package/claude/skills/claude-ui-test/SKILL.md +75 -0
  35. package/claude/skills/claude-ux-audit/SKILL.md +78 -0
  36. package/claude/skills/claude-worktree/SKILL.md +79 -0
  37. package/claude/skills/cli-script/SKILL.md +47 -0
  38. package/claude/skills/cli-script/references/template.md +43 -0
  39. package/claude/skills/create-rule/SKILL.md +68 -0
  40. package/claude/skills/create-skill/REQUIREMENT.md +30 -0
  41. package/claude/skills/create-skill/SKILL.md +24 -0
  42. package/claude/skills/create-snippet/SKILL.md +28 -0
  43. package/claude/skills/create-snippet/references/snippets.md +57 -0
  44. package/claude/skills/create-standard/SKILL.md +31 -0
  45. package/claude/skills/create-standard/references/standard.md +52 -0
  46. package/claude/skills/docs-sync/SKILL.md +87 -0
  47. package/claude/skills/git-branch/REQUIREMENT.md +38 -0
  48. package/claude/skills/git-branch/SKILL.md +60 -0
  49. package/claude/skills/git-branch/references/branch.md +49 -0
  50. package/claude/skills/git-commit/REQUIREMENT.md +33 -0
  51. package/claude/skills/git-commit/SKILL.md +51 -0
  52. package/claude/skills/git-commit/references/commit.md +63 -0
  53. package/claude/skills/git-followup/REQUIREMENT.md +38 -0
  54. package/claude/skills/git-followup/SKILL.md +35 -0
  55. package/claude/skills/git-issue/REQUIREMENT.md +38 -0
  56. package/claude/skills/git-issue/SKILL.md +69 -0
  57. package/claude/skills/git-issue/references/issue.md +84 -0
  58. package/claude/skills/git-pr/REQUIREMENT.md +37 -0
  59. package/claude/skills/git-pr/SKILL.md +119 -0
  60. package/claude/skills/git-pr/references/branch.md +49 -0
  61. package/claude/skills/git-pr/references/pr.md +124 -0
  62. package/claude/skills/git-ship/REQUIREMENT.md +34 -0
  63. package/claude/skills/git-ship/SKILL.md +39 -0
  64. package/claude/skills/git-split/REQUIREMENT.md +38 -0
  65. package/claude/skills/git-split/SKILL.md +160 -0
  66. package/claude/skills/git-split/references/branch.md +49 -0
  67. package/claude/skills/git-split/references/pr.md +124 -0
  68. package/claude/skills/git-stage/REQUIREMENT.md +36 -0
  69. package/claude/skills/git-stage/SKILL.md +74 -0
  70. package/claude/skills/git-stage/references/commit.md +63 -0
  71. package/claude/skills/git-worktree/REQUIREMENT.md +37 -0
  72. package/claude/skills/git-worktree/SKILL.md +120 -0
  73. package/claude/skills/migration-claude-md/SKILL.md +74 -0
  74. package/claude/skills/migration-context/SKILL.md +93 -0
  75. package/claude/skills/migration-standards/SKILL.md +75 -0
  76. package/claude/skills/project-commands/SKILL.md +73 -0
  77. package/claude/skills/session-resume/SKILL.md +36 -0
  78. package/claude/skills/setup-gov/SKILL.md +71 -0
  79. package/claude/skills/setup-indexes/SKILL.md +148 -0
  80. package/claude/skills/setup-init/SKILL.md +114 -0
  81. package/claude/skills/setup-plugins/SKILL.md +81 -0
  82. package/claude/skills/setup-plugins/references/plugin-catalog.md +53 -0
  83. package/claude/skills/setup-verify/SKILL.md +51 -0
  84. package/claude/skills/systematic-debugging/SKILL.md +70 -0
  85. package/claude/skills/toolkit-cli/SKILL.md +38 -0
  86. package/claude/skills/toolkit-feedback/SKILL.md +80 -0
  87. package/claude/skills/toolkit-operator/SKILL.md +45 -0
  88. package/claude/skills/toolkit-triage/SKILL.md +63 -0
  89. package/claude/skills/youtube-transcripts/SKILL.md +34 -0
  90. package/docs/agents.md +371 -0
  91. package/docs/ai-workflow.md +157 -0
  92. package/docs/index.md +20 -0
  93. package/docs/operating-model.md +106 -0
  94. package/docs/target-projects.md +183 -0
  95. package/docs/visual-design-workflow.md +136 -0
  96. package/docs/zshrc-aliases.md +65 -0
  97. package/governance/rules/claude/500-prose.md +12 -0
  98. package/governance/rules/claude/510-context.md +16 -0
  99. package/governance/rules/claude/520-wireframes.md +12 -0
  100. package/governance/rules/claude/530-requirements.md +11 -0
  101. package/governance/rules/claude/540-architecture.md +11 -0
  102. package/governance/rules/claude/550-design.md +11 -0
  103. package/governance/rules/claude/555-tasks.md +12 -0
  104. package/governance/rules/claude/560-diagrams.md +11 -0
  105. package/governance/rules/claude/570-skill.md +18 -0
  106. package/governance/rules/claude/580-readme.md +11 -0
  107. package/governance/rules/claude/590-rule-authoring.md +12 -0
  108. package/governance/rules/core/000-constitution.md +30 -0
  109. package/governance/rules/core/010-testing.md +35 -0
  110. package/governance/rules/core/020-concurrency.md +22 -0
  111. package/governance/rules/core/030-error-handling.md +31 -0
  112. package/governance/rules/core/040-performance.md +20 -0
  113. package/governance/rules/core/050-logging.md +20 -0
  114. package/governance/rules/core/060-naming.md +19 -0
  115. package/governance/rules/core/070-planning.md +13 -0
  116. package/governance/rules/core/080-config-comments.md +22 -0
  117. package/governance/rules/framework/200-react.md +51 -0
  118. package/governance/rules/framework/210-astro.md +41 -0
  119. package/governance/rules/framework/220-fastapi.md +43 -0
  120. package/governance/rules/framework/230-nextjs.md +48 -0
  121. package/governance/rules/framework/250-tailwind.md +32 -0
  122. package/governance/rules/framework/260-shadcn.md +34 -0
  123. package/governance/rules/lang/100-typescript.md +40 -0
  124. package/governance/rules/lang/110-python.md +42 -0
  125. package/governance/rules/lib/300-testing-ts.md +38 -0
  126. package/governance/rules/lib/310-zod.md +25 -0
  127. package/governance/rules/lib/320-tanstack-query.md +32 -0
  128. package/governance/rules/lib/330-testing-py.md +44 -0
  129. package/governance/rules/lib/340-pydantic.md +38 -0
  130. package/governance/rules/lib/350-security-web.md +31 -0
  131. package/governance/rules/ui/400-ui.md +34 -0
  132. package/governance/rules/ui/410-a11y.md +44 -0
  133. package/governance/rules/ui/420-forms.md +34 -0
  134. package/governance/rules/ui/430-ux-completeness.md +62 -0
  135. package/governance/stacks/astro.toml +2 -0
  136. package/governance/stacks/base.toml +2 -0
  137. package/governance/stacks/node.toml +2 -0
  138. package/governance/stacks/python-fastapi.toml +2 -0
  139. package/governance/stacks/python.toml +2 -0
  140. package/governance/stacks/react.toml +2 -0
  141. package/package.json +67 -0
  142. package/scripts/config.sh +11 -0
  143. package/scripts/core/bootstrap.sh +81 -0
  144. package/scripts/core/check-plugin-boundary.sh +45 -0
  145. package/scripts/core/check-skill-paths.sh +25 -0
  146. package/scripts/core/clean.sh +36 -0
  147. package/scripts/core/install-check.sh +93 -0
  148. package/scripts/core/regen-claude-copies.sh +26 -0
  149. package/scripts/core/regen-indexes.sh +10 -0
  150. package/scripts/core/regen-skill-references.sh +27 -0
  151. package/scripts/core/snapshot.sh +132 -0
  152. package/scripts/core/update.sh +35 -0
  153. package/scripts/core/verify.sh +201 -0
  154. package/scripts/docs/list.sh +129 -0
  155. package/scripts/gov/list.sh +234 -0
  156. package/scripts/lib/frontmatter.sh +30 -0
  157. package/scripts/lib/gov.sh +14 -0
  158. package/scripts/lib/sandbox-fixtures.sh +109 -0
  159. package/scripts/lib/sandbox-git.sh +73 -0
  160. package/scripts/lib/tooling.sh +24 -0
  161. package/scripts/lib/ui.sh +173 -0
  162. package/scripts/lib/worktree.sh +20 -0
  163. package/scripts/manage-sandbox.sh +453 -0
  164. package/scripts/snippets/create.sh +156 -0
  165. package/scripts/standards/list.sh +91 -0
  166. package/scripts/tooling/create.sh +109 -0
  167. package/scripts/tooling/ref.sh +141 -0
  168. package/scripts/tooling/verify.sh +179 -0
  169. package/snippets/claude/decision-memo.md +39 -0
  170. package/snippets/claude/feature-recap.md +19 -0
  171. package/snippets/claude/figma-steps.md +18 -0
  172. package/snippets/claude/orchestrator-resume.md +23 -0
  173. package/snippets/claude/orchestrator-sweep.md +10 -0
  174. package/snippets/compact-summary.md +5 -0
  175. package/snippets/create-snippet.md +7 -0
  176. package/snippets/decision-help.md +6 -0
  177. package/snippets/meta-prompt.md +14 -0
  178. package/snippets/research-prompt.md +7 -0
  179. package/snippets/session-notes.md +11 -0
  180. package/snippets/snippets.toml +6 -0
  181. package/snippets/step-by-step.md +10 -0
  182. package/snippets/web-research.md +21 -0
  183. package/src/claude/gitignore.ts +51 -0
  184. package/src/claude/seeds-list.ts +47 -0
  185. package/src/claude/seeds.ts +124 -0
  186. package/src/claude/settings.ts +151 -0
  187. package/src/cli-run.ts +43 -0
  188. package/src/cli.ts +111 -0
  189. package/src/commands/claude.ts +349 -0
  190. package/src/commands/design.ts +39 -0
  191. package/src/commands/docs.ts +59 -0
  192. package/src/commands/feedback-format.ts +23 -0
  193. package/src/commands/feedback.ts +103 -0
  194. package/src/commands/gov.ts +268 -0
  195. package/src/commands/indexes.ts +182 -0
  196. package/src/commands/init.ts +117 -0
  197. package/src/commands/pass-through.ts +39 -0
  198. package/src/commands/sandbox.ts +315 -0
  199. package/src/commands/slides.ts +106 -0
  200. package/src/commands/snippets.ts +236 -0
  201. package/src/commands/standards.ts +89 -0
  202. package/src/commands/sync.ts +211 -0
  203. package/src/commands/tasks.ts +185 -0
  204. package/src/commands/tooling.ts +432 -0
  205. package/src/commands/transcripts.ts +48 -0
  206. package/src/commands/wiki.ts +101 -0
  207. package/src/copy.ts +30 -0
  208. package/src/design/parse.ts +79 -0
  209. package/src/design/render.ts +170 -0
  210. package/src/docs/read.ts +59 -0
  211. package/src/exec.ts +17 -0
  212. package/src/frontmatter.ts +13 -0
  213. package/src/github-format.ts +13 -0
  214. package/src/github.ts +20 -0
  215. package/src/gov/adapter.ts +73 -0
  216. package/src/gov/install.ts +103 -0
  217. package/src/gov/payload.ts +39 -0
  218. package/src/gov/stacks.ts +124 -0
  219. package/src/indexes/frontmatter.ts +46 -0
  220. package/src/indexes/regen.ts +84 -0
  221. package/src/indexes/render.ts +181 -0
  222. package/src/indexes/walk.ts +111 -0
  223. package/src/init/flags.ts +66 -0
  224. package/src/init/plan.ts +128 -0
  225. package/src/init/run.ts +46 -0
  226. package/src/init/steps.ts +91 -0
  227. package/src/sandbox/coverage.ts +115 -0
  228. package/src/sandbox/expect.ts +412 -0
  229. package/src/slides/layouts.ts +391 -0
  230. package/src/slides/open.ts +18 -0
  231. package/src/slides/parse.ts +84 -0
  232. package/src/slides/render.ts +88 -0
  233. package/src/slides/styles.ts +44 -0
  234. package/src/snippets/adapter.ts +34 -0
  235. package/src/snippets/categories.ts +59 -0
  236. package/src/snippets/install.ts +125 -0
  237. package/src/snippets/list.ts +32 -0
  238. package/src/snippets/presets.ts +50 -0
  239. package/src/standards/adapter.ts +51 -0
  240. package/src/standards/index-refresh.ts +44 -0
  241. package/src/standards/install.ts +52 -0
  242. package/src/sync/check.ts +269 -0
  243. package/src/sync/engine.ts +416 -0
  244. package/src/sync/git.ts +204 -0
  245. package/src/sync/stamp.ts +202 -0
  246. package/src/sync/target.ts +79 -0
  247. package/src/sync/workflow.ts +201 -0
  248. package/src/target.ts +43 -0
  249. package/src/tasks/archive.ts +304 -0
  250. package/src/tooling/gitignore.ts +122 -0
  251. package/src/tooling/inject.ts +214 -0
  252. package/src/tooling/list.ts +39 -0
  253. package/src/tooling/manifest.ts +178 -0
  254. package/src/tooling/package.ts +166 -0
  255. package/src/tooling/scan.ts +186 -0
  256. package/src/transcripts/fetch.ts +156 -0
  257. package/src/transcripts/metadata.ts +54 -0
  258. package/src/transcripts/vtt.ts +114 -0
  259. package/src/ui.ts +187 -0
  260. package/src/wiki/init.ts +85 -0
  261. package/standards/architecture.md +41 -0
  262. package/standards/bundled/branch.md +49 -0
  263. package/standards/bundled/commit.md +63 -0
  264. package/standards/bundled/issue.md +84 -0
  265. package/standards/bundled/pr.md +124 -0
  266. package/standards/bundled/roadmap.md +52 -0
  267. package/standards/bundled/snippets.md +57 -0
  268. package/standards/bundled/standard.md +52 -0
  269. package/standards/context.md +132 -0
  270. package/standards/design.md +31 -0
  271. package/standards/diagrams.md +55 -0
  272. package/standards/index.md +21 -0
  273. package/standards/prose.md +122 -0
  274. package/standards/readme.md +163 -0
  275. package/standards/requirements.md +61 -0
  276. package/standards/rule.md +79 -0
  277. package/standards/skill.md +257 -0
  278. package/standards/tasks.md +140 -0
  279. package/standards/versioning.md +47 -0
  280. package/standards/wireframes.md +67 -0
  281. package/tooling/astro/configs/astro.config.mjs +17 -0
  282. package/tooling/astro/configs/eslint.config.js +79 -0
  283. package/tooling/astro/configs/playwright.config.ts +25 -0
  284. package/tooling/astro/configs/tsconfig.json +12 -0
  285. package/tooling/astro/configs/vitest.config.ts +22 -0
  286. package/tooling/astro/manifest.toml +32 -0
  287. package/tooling/astro/reference.md +60 -0
  288. package/tooling/base/configs/.editorconfig +5 -0
  289. package/tooling/base/configs/.github/pull_request_template.md +18 -0
  290. package/tooling/base/configs/.github/workflows/verify.yml +35 -0
  291. package/tooling/base/configs/.husky/commit-msg +1 -0
  292. package/tooling/base/configs/.husky/post-merge +61 -0
  293. package/tooling/base/configs/.husky/post-rewrite +21 -0
  294. package/tooling/base/configs/.husky/pre-commit +1 -0
  295. package/tooling/base/configs/.husky/pre-push +1 -0
  296. package/tooling/base/configs/.prettierrc +12 -0
  297. package/tooling/base/configs/.shellcheckrc +1 -0
  298. package/tooling/base/configs/.vscode/extensions.json +9 -0
  299. package/tooling/base/configs/.vscode/settings.json +3 -0
  300. package/tooling/base/configs/commitlint.config.js +11 -0
  301. package/tooling/base/configs/scripts/clean.sh +45 -0
  302. package/tooling/base/configs/scripts/update.sh +49 -0
  303. package/tooling/base/configs/scripts/verify.sh +64 -0
  304. package/tooling/base/manifest.toml +32 -0
  305. package/tooling/base/reference.md +114 -0
  306. package/tooling/base/seeds/.claude/context/ci.md +27 -0
  307. package/tooling/base/seeds/.claude/context/development.md +32 -0
  308. package/tooling/base/seeds/.cspell/project-terms.txt +0 -0
  309. package/tooling/base/seeds/.cspell/tech-stack.txt +19 -0
  310. package/tooling/base/seeds/.lintstagedrc +8 -0
  311. package/tooling/base/seeds/.prettierignore +0 -0
  312. package/tooling/base/seeds/cspell.json +20 -0
  313. package/tooling/claude/manifest.toml +11 -0
  314. package/tooling/claude/reference.md +62 -0
  315. package/tooling/claude/seeds/.claude/ARCHITECTURE.md +13 -0
  316. package/tooling/claude/seeds/.claude/DESIGN.md +62 -0
  317. package/tooling/claude/seeds/.claude/REQUIREMENTS.md +18 -0
  318. package/tooling/claude/seeds/.claude/context/index.md +8 -0
  319. package/tooling/claude/seeds/.claude/hooks/index-reminder.sh +43 -0
  320. package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +45 -0
  321. package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +61 -0
  322. package/tooling/claude/seeds/.claude/hooks/tasks-index.sh +60 -0
  323. package/tooling/claude/seeds/.claude/settings.json +39 -0
  324. package/tooling/claude/seeds/.claude/tasks/index.md +8 -0
  325. package/tooling/claude/seeds/.claude/wireframes/index.md +8 -0
  326. package/tooling/claude/seeds/CLAUDE.md +87 -0
  327. package/tooling/claude/user/settings.template.json +10 -0
  328. package/tooling/claude/user/statusline-command.sh +53 -0
  329. package/tooling/python/configs/.coveragerc +14 -0
  330. package/tooling/python/configs/.python-version +1 -0
  331. package/tooling/python/configs/mypy.ini +6 -0
  332. package/tooling/python/configs/pytest.ini +4 -0
  333. package/tooling/python/configs/ruff.toml +15 -0
  334. package/tooling/python/configs/scripts/verify.sh +77 -0
  335. package/tooling/python/manifest.toml +16 -0
  336. package/tooling/python/reference.md +66 -0
  337. package/tooling/python/seeds/.cspell/tech-stack.txt +19 -0
  338. package/tooling/python/seeds/tests/test_smoke.py +2 -0
  339. package/tooling/vite-react/configs/playwright.config.ts +25 -0
  340. package/tooling/vite-react/configs/tsconfig.json +35 -0
  341. package/tooling/vite-react/configs/vite.config.ts +14 -0
  342. package/tooling/vite-react/configs/vitest.config.ts +26 -0
  343. package/tooling/vite-react/manifest.toml +21 -0
  344. package/tooling/vite-react/reference.md +55 -0
  345. package/tooling/vite-react/seeds/.cspell/project-terms.txt +1 -0
  346. package/tooling/vite-react/seeds/.cspell/tech-stack.txt +1 -0
  347. package/tooling/web/configs/.github/workflows/verify.yml +134 -0
  348. package/tooling/web/configs/.vscode/extensions.json +13 -0
  349. package/tooling/web/configs/.vscode/settings.json +10 -0
  350. package/tooling/web/configs/e2e/home.spec.ts +6 -0
  351. package/tooling/web/configs/e2e/screenshot.ts +41 -0
  352. package/tooling/web/configs/eslint.config.js +82 -0
  353. package/tooling/web/configs/scripts/screenshot.sh +28 -0
  354. package/tooling/web/configs/scripts/verify.sh +80 -0
  355. package/tooling/web/configs/src/test/setup.ts +8 -0
  356. package/tooling/web/manifest.toml +57 -0
  357. package/tooling/web/reference.md +95 -0
  358. package/tooling/web/seeds/.cspell/tech-stack.txt +18 -0
  359. package/tsconfig.json +14 -0
@@ -0,0 +1,140 @@
1
+ ---
2
+ title: Tasks reference
3
+ description: Folder layout, filename convention, and content rules for .claude/tasks/
4
+ ---
5
+
6
+ # Tasks reference
7
+
8
+ Applies to `.claude/tasks/`. Tracks what is being built and why, at the level of features and outcomes. One file per task. Update when a task starts, completes, or changes scope. When to open a task at all is project policy, not a shape rule, and lives in `CLAUDE.md`.
9
+
10
+ The folder is gitignored. Board state changes when work ships rather than when a branch is written, so committing it would put a claim about the future into the diff of an unrelated pull request. The git log records what shipped.
11
+
12
+ ## Layout
13
+
14
+ ```plaintext
15
+ .claude/tasks/
16
+ ├── index.md ← generated, never hand-edited
17
+ ├── priority.md ← hand-maintained execution order
18
+ ├── v09.0-sync-paths.md
19
+ └── v13.0-toolkit-drift.md
20
+ ```
21
+
22
+ One file per task is what keeps the board safe under parallel sessions. Two sessions working different tasks never write the same file, which matters because a gitignored board has no history to recover a clobbered write from.
23
+
24
+ `index.md` is generated from sibling frontmatter. The folder is gitignored, so the whole-repo index walk skips it and a hook passing the changed path regenerates it instead. Never hand-edit it.
25
+
26
+ `priority.md` carries execution order and what each task is waiting on. The generated index sorts by filename and says nothing about order, so without this file board state gets reconstructed by hand every session. Why the order is what it is belongs in `.claude/ROADMAP.md`, which is committed because that rationale has no substitute record.
27
+
28
+ Group tasks by readiness rather than by status, one row per task, with a stated column for what each is blocked on. Keep it to links and blockers: tables, plus at most one sentence per section. A paragraph in `priority.md` is a defect whatever it says. Stating the shape this way is what lets a single diff fail, since a size cap only trips after the fact and every addition looks defensible on its own.
29
+
30
+ The `claude-tasks` skill creates and archives task files. `claude-docs` marks outcomes `[x]` in an existing file and sweeps the plans those tasks cite. Neither does the other's job.
31
+
32
+ ## Filenames
33
+
34
+ `vXX.Y-<slug>.md`, where the version is the phase label zero-padded to two digits and the slug is kebab-case.
35
+
36
+ Padding is load-bearing. Index entries sort by filename and nothing else, so a bare `v9.0` sorts after `v15.0` and the catalog reads out of board order. `standards/versioning.md` governs the label itself and permits free renumbering, so expect the occasional rename. Nothing points at a task filename, since a `Plan:` line runs from task to plan rather than the reverse.
37
+
38
+ ## Frontmatter
39
+
40
+ Every task file carries both fields. The index walker fails the whole folder when one is missing, which surfaces the gap on the next edit.
41
+
42
+ ```yaml
43
+ ---
44
+ title: 'v13.0: Detect and close toolkit drift in target projects'
45
+ description: Record what a target installed and report the delta against the toolkit
46
+ ---
47
+ ```
48
+
49
+ - `title`: the phase label and the task title, matching the H1. Quote it, since a leading `vX.Y:` reads as a key to a YAML parser.
50
+ - `description`: what the task achieves, in one line. A session reads this in the index to decide whether to open the file.
51
+
52
+ ## File format
53
+
54
+ Two headings, `## Outcomes` and `## Findings`. Outcomes are future and checkable, findings are past and factual, and as flat bullets at the same indent they are visually identical. A heading separates them at no cost. Add no third heading. Status stays inline on an outcome rather than becoming an "In progress" section.
55
+
56
+ Size the outcomes so one pull request closes all of them. A task whose outcomes span two pull requests ships the first half and leaves the rest open, with nothing recording which outcomes the merged work covered, so the board reads as in-progress work that no branch is carrying. Split the task before handing it off rather than after. This is what `## Archiving` below depends on, since a task closes whole or not at all.
57
+
58
+ Prefix the H1 with the `vX.Y:` phase label, then a short title whose form depends on the task type:
59
+
60
+ - Feature: an outcome describing what the user can now do
61
+ - Fix: a problem statement describing what is wrong
62
+ - Chore: an imperative describing what is being done
63
+
64
+ ```markdown
65
+ ---
66
+ title: 'vX.Y: Title'
67
+ description: One line on what this task achieves
68
+ ---
69
+
70
+ # vX.Y: Title
71
+
72
+ Plan: [feature-<slug>](../plans/feature-<slug>.md)
73
+ Groundwork: [<slug>](../.tmp/groundwork/<slug>/)
74
+ Issue: #NNN
75
+ Pull request: #NNN
76
+
77
+ Why this task exists and what it depends on.
78
+
79
+ ## Outcomes
80
+
81
+ - [ ] Outcome: what done looks like
82
+ - [ ] Outcome: what done looks like
83
+
84
+ ## Findings
85
+
86
+ - What constrains the task, dated where it matters.
87
+
88
+ > Test strategy: <unit | component | e2e | visual | manual>, what is being verified
89
+ ```
90
+
91
+ ## Origin
92
+
93
+ Every task names where it came from, through a `Plan:`, `Groundwork:`, or `Issue:` line under the title. Include each only when the file, folder, or issue it names exists.
94
+
95
+ A task with no origin is either lost context or work nobody decided to do. The invariant runs both ways, and the second direction is the one that bites: a groundwork track or an open issue that no task points at is work already decided and on its way to being forgotten.
96
+
97
+ `Plan:` and `Groundwork:` name their target as a markdown link whose text is the file or folder stem, so the line resolves on a ctrl-click the way `priority.md` rows already do. Write the path relative to `.claude/tasks/`, which makes it `../plans/` and `../.tmp/groundwork/`. A path written from the project root renders as a link and resolves to nothing in an editor rooted at the project. `Issue:` stays a bare `#NNN`, since an issue number is not a path and a full URL would write the remote into a gitignored file.
98
+
99
+ Phase-label format and where labels may appear are governed by `standards/versioning.md`.
100
+
101
+ `Plan:` points at `../plans/feature-<slug>.md` while the task is open. Once the task ships and the plan is archived, it points at `../.tmp/plans-archive/feature-<slug>.md`. Retarget both halves of the link rather than dropping it, so a completed task still leads to the reasoning behind it. One plan per task. A plan cited by two tasks is a misfile rather than a shape to design for, which is why the sweep counts citations before archiving: the count is a guard against the misfile stranding a pointer, not support for the shape.
102
+
103
+ `Groundwork:` points at `../.tmp/groundwork/<slug>/`, the folder `claude-groundwork` fills. It names the surface it points at the way `Plan:` does. Use this key alone. `Research record` and `Decision record` are earlier spellings of the same thing and both convert to it.
104
+
105
+ `Pull request:` records which pull request carries the task's work, as a bare `#NNN` the way `Issue:` does. It is not an origin, so a task without one is well-formed. `git-pr` writes it when a pull request opens, which is the one step that always runs whether the chain drives it or a person does.
106
+
107
+ The line is what lets a merge close its own task. Every merge on `main` is a squash carrying the number in its subject, so the number survives where a branch name does not, and `aitk tasks archive --pull-request <n>` resolves the task from it. Without the line the board can only be swept blind, and a blind sweep cannot tell a shipped task from an abandoned one. One task, one pull request: two tasks naming the same number refuse to archive rather than both moving.
108
+
109
+ ## What goes in
110
+
111
+ - Task entries describing observable behavior, one outcome per line
112
+ - A test strategy line naming the mechanism and what it verifies
113
+ - Findings stating what constrains the task, including blockers and dependencies
114
+
115
+ ## What does not go in
116
+
117
+ - Class names, file paths, function names, or prop names in any entry or title
118
+ - Code-level steps or implementation detail. Behavioral specifics are fine.
119
+ - Architectural reasoning that outlives the task. A finding explains why this task is shaped as it is. A decision the system keeps after the task closes belongs in `.claude/ARCHITECTURE.md`.
120
+ - Narrative of the session that produced the task. A finding states what constrains the task, so what was probed, what it cost, and who decided belongs in the groundwork folder the `Groundwork:` line names. A task with no groundwork folder cuts the narrative rather than relocating it, since the board is not the fallback destination for it.
121
+ - "In progress" or "Blocked" headings. Note status inline on the outcome instead.
122
+ - Sequencing rationale or which version is active. Those belong in `.claude/ROADMAP.md`, which is committed because that reasoning has no substitute record.
123
+
124
+ ## Archiving
125
+
126
+ Never delete a task file. A shipped task moves to `.claude/.tmp/task-archive/` under its own name, and the live index regenerates without it. `aitk tasks archive` owns the move, the ordering-row removal, and the index regen as one unit.
127
+
128
+ Two callers reach that command. The `claude-tasks` skill runs it inside a session, and the `post-merge` hook runs it unattended after a pull that merged the work. Both go through the command rather than moving the file themselves, so the two paths cannot drift into archiving differently. Every gate the command applies refuses with a non-zero exit rather than reporting, because a caller with nobody watching cannot act on a warning.
129
+
130
+ One destination rather than a per-project choice is what lets the move happen without asking. It mirrors the plans archive at `.claude/.tmp/plans-archive/` and stays gitignored, so an archived task does not start appearing in diffs. The cost is that scratch is unbacked, which is the same cost the plans archive already carries.
131
+
132
+ Archiving a task does not archive its plan. `claude-docs` owns the plans sweep and moves a plan only when the closing task is its last live citation. The archive clears the task's row from `priority.md` itself, since a shipped task left in the ordering reads as ready to hand a worker. It leaves prose naming the task alone for a person to resolve.
133
+
134
+ The row is matched by the link in its first cell rather than by a pattern against the whole line. A row names the task it is about in the first cell, so a link anywhere after that is a reference, such as a blocker pointing at what it waits on. Matching the line would delete the referring task's row too, on a board that is gitignored and has nothing to recover it from.
135
+
136
+ Sweep the plan before archiving the task. The sweep finds its work by scanning the live folder, so a task archived first is beyond its reach for good, and the plan is left with no live task citing it and an archived task pointing at a path nothing will retarget. The archive refuses a task whose `Plan:` line still resolves inside `.claude/plans/` for that reason, which puts the ordering under a gate rather than under a convention the unattended caller cannot follow.
137
+
138
+ That gate resolves the target against `.claude/tasks/` and against the project root both, so `../plans/x.md` and `.claude/plans/x.md` land on the same file. `claude-docs` reads the line the same way, and two halves of one ordering that parsed it differently would leave a plan stranded by the form it was written in.
139
+
140
+ A task with an open outcome stays on the board. Close it, or cut it from the task when the work is being abandoned, so what was dropped is recorded rather than inferred from an archived file. The sweep is gated on the same condition, so archiving around an open outcome also leaves the plan behind.
@@ -0,0 +1,47 @@
1
+ ---
2
+ title: Versioning reference
3
+ description: Phase label vs semver discipline across tasks, PRs, commits, and tags
4
+ ---
5
+
6
+ # Versioning reference
7
+
8
+ Two namespaces, kept separate.
9
+
10
+ ## Phase labels
11
+
12
+ Internal coordination vocabulary used in the task board and chat.
13
+
14
+ - Format is project-specific.
15
+ - Used to order work and disambiguate streams during planning.
16
+ - Re-numbers freely as scope shifts. Inserting a half-step between two existing labels (a `v1.5` between `v1` and `v2`) is fine.
17
+ - Does not have to map to any external release.
18
+
19
+ ## Semver tags
20
+
21
+ External release identity used in git tags and release notes. Independent of phase labels.
22
+
23
+ - Format is semver: `v<major>.<minor>.<patch>`.
24
+ - Tagged only when a real release is cut.
25
+ - Does not have to map to phase labels. A single semver tag may cover work that carried several internal phase labels.
26
+
27
+ ## Where each appears
28
+
29
+ | Surface | Phase labels | Semver tags |
30
+ | ------------------------- | ------------ | ----------------------------------- |
31
+ | `.claude/tasks/` | yes | no |
32
+ | Chat with the operator | yes | no |
33
+ | PR titles | no | only when the PR cuts a release |
34
+ | Commit messages | no | only when the commit cuts a release |
35
+ | Git tags | no | yes |
36
+ | README and `CHANGELOG.md` | no | yes |
37
+
38
+ ## Rules
39
+
40
+ - PR titles describe the user-observable change in conventional-commit form. Do not prefix or suffix with phase labels.
41
+ - Commit subjects do not embed phase labels.
42
+ - Git tags use semver only. Phase labels never become tags.
43
+ - A PR that cuts a release may reference its semver tag in the title or body. Phase labels still do not appear.
44
+
45
+ ## Why
46
+
47
+ Phase labels keep planning conversations efficient. They make `git log`, PR titles, and the tag list unreadable when they leak in. A future reader cannot reconstruct what an internal label meant without the matching task file, which is gitignored. Semver tags carry meaning independent of conversation state and survive in git history. Keeping the two namespaces apart preserves both.
@@ -0,0 +1,67 @@
1
+ ---
2
+ title: Wireframe reference
3
+ description: Shape and content rules for .claude/wireframes/<surface>.md files
4
+ ---
5
+
6
+ # Wireframe reference
7
+
8
+ Applies to per-surface entries under `.claude/wireframes/`. Skip for `index.md`, which is regenerated by `aitk indexes regen`.
9
+
10
+ A wireframe file captures the spatial layout and interaction intent of one UI surface. It is not an implementation log. The check for any single line: would it still be true if the surface were rebuilt in a different framework? If not, it belongs in `.claude/context/`.
11
+
12
+ ## What a working wireframe looks like
13
+
14
+ A wireframe works when someone can rebuild the surface from it without opening the components:
15
+
16
+ - What is on screen, and where does it sit relative to everything else?
17
+ - Which states can a visitor reach, and what does each one look like?
18
+ - What does it say, word for word?
19
+
20
+ A wireframe that fails these is non-conforming regardless of whether it satisfies every section rule below. The fences are the means. These three questions are the test.
21
+
22
+ ## Frontmatter
23
+
24
+ - `title` (required): sentence case, names the surface (`Header`, `Section nav`, `Footer`).
25
+ - `description` (required): one line on when and where the surface appears.
26
+
27
+ Both fields feed `.claude/wireframes/index.md` when regenerated.
28
+
29
+ ## Layout
30
+
31
+ - Draw each surface as an ASCII block inside a `plaintext` fence. One fence per distinct layout.
32
+ - Label regions with `←` annotations. Never use `#` for annotations.
33
+ - Show a region's role, not its styling. `← status pill` reads better than a class name or hex value.
34
+ - Keep the grid honest. The ASCII proportions should match the intended widths, since conveying proportion is the wireframe's job.
35
+
36
+ ## Variants
37
+
38
+ - Add a second fence only when the layout itself changes across a breakpoint or state. A wider gutter alone is not a new layout.
39
+ - Name each variant by what triggers it (`## Desktop (≥768px)`, `## Empty state`), not by an arbitrary label.
40
+ - One H2 per variant. Do not stack unrelated surfaces in one file. Keep one surface per file, indexed by `index.md`.
41
+
42
+ ## Copy
43
+
44
+ - Carry UI copy verbatim in the ASCII block or a short list below it. The wireframe is the source of truth for on-screen text.
45
+ - Mark copy that is dynamic or templated so a reader does not treat a placeholder as final text.
46
+
47
+ ## Behavior
48
+
49
+ - Describe interaction intent: what the visitor does, what changes on screen, what each state looks like.
50
+ - State the rule, not the mechanism. `The rail tracks the active section as the visitor scrolls` is intent. The scroll handler, throttle, and observer margins are not.
51
+ - Keep it to a short list. A Behavior section longer than the layout is a sign implementation detail has leaked in.
52
+
53
+ ## What moves to .claude/context/
54
+
55
+ Implementation detail that answers how the surface is built belongs in a `.claude/context/` entry, not the wireframe:
56
+
57
+ - Algorithms, event-handler code, and lifecycle ordering
58
+ - Framework component names, props, and CSS class or token names
59
+ - Pixel-exact spacing, timing constants, and observer thresholds
60
+ - Workarounds and rejected approaches
61
+
62
+ Reference the context entry from the wireframe by path when a reader needs the mechanism. The wireframe stays answerable on its own for layout and intent.
63
+
64
+ ## Maintenance
65
+
66
+ - When a surface's layout or interaction changes, update its wireframe file in the same PR. A wireframe showing a defunct layout is worse than none.
67
+ - ASCII blocks sit inside fenced code, so the prose-standards hook ignores them. The Behavior and Copy prose around them is still prose. Follow `standards/prose.md`.
@@ -0,0 +1,17 @@
1
+ import react from '@astrojs/react'
2
+ import tailwindcss from '@tailwindcss/vite'
3
+ import { defineConfig } from 'astro/config'
4
+ import path from 'path'
5
+
6
+ export default defineConfig({
7
+ integrations: [react()],
8
+ site: process.env.ASTRO_SITE,
9
+ vite: {
10
+ plugins: [tailwindcss()],
11
+ resolve: {
12
+ alias: {
13
+ '@': path.resolve('./src'),
14
+ },
15
+ },
16
+ },
17
+ })
@@ -0,0 +1,79 @@
1
+ import js from '@eslint/js'
2
+ import { defineConfig, globalIgnores } from 'eslint/config'
3
+ import astro from 'eslint-plugin-astro'
4
+ import prettier from 'eslint-config-prettier'
5
+ import checkFile from 'eslint-plugin-check-file'
6
+ import reactHooks from 'eslint-plugin-react-hooks'
7
+ import simpleImportSort from 'eslint-plugin-simple-import-sort'
8
+ import vitest from 'eslint-plugin-vitest'
9
+ import globals from 'globals'
10
+ import tseslint from 'typescript-eslint'
11
+
12
+ export default defineConfig([
13
+ globalIgnores([
14
+ 'dist',
15
+ '.astro',
16
+ 'coverage',
17
+ '.claude',
18
+ '.vscode',
19
+ '.husky',
20
+ 'test-results',
21
+ 'playwright-report',
22
+ 'blob-report',
23
+ 'playwright/.cache',
24
+ ]),
25
+ js.configs.recommended,
26
+ ...tseslint.configs.recommended,
27
+ ...astro.configs.recommended,
28
+ {
29
+ files: ['**/*.{ts,tsx,js,jsx}'],
30
+ plugins: {
31
+ 'simple-import-sort': simpleImportSort,
32
+ 'check-file': checkFile,
33
+ },
34
+ languageOptions: {
35
+ globals: {
36
+ ...globals.browser,
37
+ },
38
+ },
39
+ rules: {
40
+ 'simple-import-sort/imports': 'error',
41
+ 'simple-import-sort/exports': 'error',
42
+ '@typescript-eslint/no-unused-vars': [
43
+ 'error',
44
+ { varsIgnorePattern: '^_', argsIgnorePattern: '^_' },
45
+ ],
46
+ 'check-file/filename-naming-convention': [
47
+ 'error',
48
+ { '**/*.{ts,tsx,astro}': 'KEBAB_CASE' },
49
+ { ignoreMiddleExtensions: true },
50
+ ],
51
+ 'check-file/folder-naming-convention': [
52
+ 'error',
53
+ { 'src/**/!(__tests__|pages)': 'KEBAB_CASE' },
54
+ ],
55
+ },
56
+ },
57
+ {
58
+ files: ['**/*.{jsx,tsx}'],
59
+ plugins: {
60
+ 'react-hooks': reactHooks,
61
+ },
62
+ rules: {
63
+ ...reactHooks.configs.recommended.rules,
64
+ },
65
+ },
66
+ {
67
+ files: ['*.config.{js,mjs,cjs,ts}', 'astro.config.mjs'],
68
+ languageOptions: {
69
+ globals: {
70
+ ...globals.node,
71
+ },
72
+ },
73
+ },
74
+ {
75
+ files: ['**/*.test.{ts,tsx}', '**/*.spec.{ts,tsx}'],
76
+ ...vitest.configs.recommended,
77
+ },
78
+ prettier,
79
+ ])
@@ -0,0 +1,25 @@
1
+ import { defineConfig, devices } from '@playwright/test'
2
+
3
+ const isCI = !!process.env.CI
4
+
5
+ export default defineConfig({
6
+ testDir: 'e2e',
7
+ forbidOnly: isCI,
8
+ retries: isCI ? 2 : 0,
9
+ workers: isCI ? 1 : undefined,
10
+ reporter: isCI ? 'list' : 'html',
11
+ use: {
12
+ trace: 'on-first-retry',
13
+ baseURL: 'http://localhost:4321',
14
+ },
15
+ projects: [
16
+ { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
17
+ { name: 'firefox', use: { ...devices['Desktop Firefox'] } },
18
+ { name: 'webkit', use: { ...devices['Desktop Safari'] } },
19
+ ],
20
+ webServer: {
21
+ command: 'bun run build && bun run preview',
22
+ url: 'http://localhost:4321',
23
+ reuseExistingServer: !isCI,
24
+ },
25
+ })
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "astro/tsconfigs/strict",
3
+ "compilerOptions": {
4
+ "skipLibCheck": true,
5
+ "types": ["vitest/globals", "@testing-library/jest-dom"],
6
+ "paths": {
7
+ "@/*": ["./src/*"]
8
+ }
9
+ },
10
+ "include": ["src", "astro.config.mjs", "e2e", "playwright.config.ts"],
11
+ "exclude": ["dist", ".astro", "vitest.config.ts"]
12
+ }
@@ -0,0 +1,22 @@
1
+ import { getViteConfig } from 'astro/config'
2
+
3
+ export default getViteConfig({
4
+ test: {
5
+ environment: 'jsdom',
6
+ globals: true,
7
+ setupFiles: ['src/test/setup.ts'],
8
+ passWithNoTests: true,
9
+ exclude: [
10
+ '**/node_modules/**',
11
+ '**/dist/**',
12
+ '**/.astro/**',
13
+ '**/e2e/**',
14
+ '**/.{idea,git,cache,output,temp}/**',
15
+ ],
16
+ coverage: {
17
+ provider: 'v8',
18
+ reporter: ['text', 'json', 'html'],
19
+ exclude: ['node_modules/', 'src/test/setup.ts', 'e2e/', '**/*.astro'],
20
+ },
21
+ },
22
+ })
@@ -0,0 +1,32 @@
1
+ [stack]
2
+ name = "astro"
3
+ extends = "web"
4
+ runtime = "bun"
5
+ scaffold = "bun create astro@latest {{name}} -- --template minimal --typescript strict --no-install --no-git --skip-houston --yes"
6
+
7
+ [dependencies.dev]
8
+ packages = [
9
+ "astro",
10
+ "@astrojs/react",
11
+ "@astrojs/check",
12
+ "eslint-plugin-astro",
13
+ "astro-eslint-parser",
14
+ "prettier-plugin-astro",
15
+ ]
16
+
17
+ [scripts]
18
+ "dev" = "astro dev"
19
+ "build" = "astro check && astro build"
20
+ "preview" = "astro preview"
21
+ "astro" = "astro"
22
+ "typecheck" = "astro check"
23
+ "setup" = "./scripts/setup.sh"
24
+
25
+ [scripts.override]
26
+ "screenshot" = "PREVIEW_PORT=4321 bash scripts/screenshot.sh"
27
+
28
+ [gitignore]
29
+ "# Astro" = [".astro/"]
30
+
31
+ [verify]
32
+ prepare = "bunx astro add react --yes"
@@ -0,0 +1,60 @@
1
+ # Tooling Astro reference
2
+
3
+ > Extends: `web`. Apply web stack first.
4
+
5
+ ## Overview
6
+
7
+ The astro stack covers Astro + TypeScript projects: content sites, marketing sites, blogs, and docs. Interactive islands use React only. Output is static. It ships golden configs for `astro.config.mjs`, `vitest.config.ts` (using `getViteConfig` from `astro/config`), `playwright.config.ts` (preview-server backed), a `tsconfig.json` that extends `astro/tsconfigs/strict`, and an `eslint.config.js` that overrides the web layer's config to include `eslint-plugin-astro` and exclude React-refresh rules.
8
+
9
+ ## Scaffold checklist
10
+
11
+ 1. Scaffold with `bunx create-astro@latest`. Choose `TypeScript: Strict`. Skip git init and install.
12
+ 2. Add React integration: `bunx astro add react`. Do not use `astro add tailwind`. That command installs the v3 integration. Tailwind v4 arrives via the web manifest.
13
+ 3. Install web tooling: `aitk tooling sync web .`
14
+ 4. Install astro adapter: `aitk tooling sync astro .`
15
+ 5. Extend `.claude/context/ci.md` and `.claude/context/development.md` per the web reference's extend sections plus the astro rows below.
16
+ 6. Run `bun run lint:fix` then `bun run check`.
17
+
18
+ ## What ships as golden configs
19
+
20
+ - `astro.config.mjs`: `@astrojs/react` integration, `@tailwindcss/vite` in `vite.plugins`, `@/` path alias via `vite.resolve.alias`, `ASTRO_SITE` env for the `site` field.
21
+ - `vitest.config.ts`: uses `getViteConfig` from `astro/config` (not `mergeConfig`). jsdom, globals, setup file, `passWithNoTests: true`, v8 coverage, `**/*.astro` in coverage excludes.
22
+ - `playwright.config.ts`: all browsers, `webServer` runs `bun run build && bun run preview` on port 4321. Astro's dev/prod gap is wide (MDX, island hydration, asset optimization), so E2E always tests the built `dist/`.
23
+ - `tsconfig.json`: extends `astro/tsconfigs/strict`, adds `skipLibCheck`, `vitest/globals` and `@testing-library/jest-dom` in types, `@/` paths.
24
+ - `eslint.config.js`: overrides the web layer. Adds `eslint-plugin-astro` (`.astro` parser via `astro-eslint-parser`). React-hooks scoped to `.jsx`/`.tsx` only (`.astro` is not React). `src/pages/**` exempt from filename and folder naming conventions because Astro's file-based routing ties names to URL segments.
25
+
26
+ ## Typecheck
27
+
28
+ `astro check` replaces `tsc --noEmit` because `tsc` cannot parse `.astro` files. `build` runs `astro check && astro build`.
29
+
30
+ ## Vitest scope
31
+
32
+ Unit-test React island components (`.tsx`) only. Do not test `.astro` files. Page-level behavior is verified by Playwright against rendered output.
33
+
34
+ Vitest is pinned to `^3` in the web manifest. Vitest `^4` bundles rolldown-vite (vite@8), which ignores the esbuild JSX config in `@vitejs/plugin-react` and breaks `.tsx` tests, plus emits deprecation warnings. Unpin once `@astrojs/react` ships a rolldown-aware plugin (or astro's bundled vite reaches 8).
35
+
36
+ ## Setup script
37
+
38
+ - File: `scripts/setup.sh`. Destructive: deletes `.git` and self-removes after running. Run once immediately after scaffolding.
39
+ - Prompt for project name, normalize to kebab-case, derive title-cased display name.
40
+ - Update `package.json` name and version, inject verify/clean/update scripts, remove setup.
41
+ - Update `astro.config.mjs`: set `site` if provided.
42
+ - Update `<title>` and `<meta name="description">` in the default layout.
43
+
44
+ ## Prettier (extend)
45
+
46
+ Add `prettier-plugin-astro` first in plugins, then `prettier-plugin-tailwindcss` last (per its docs). Add a parser override for `.astro` files.
47
+
48
+ ## Development docs (extend)
49
+
50
+ Append to the `## Scripts` table:
51
+
52
+ | `bun run dev` | Start the Astro dev server on port 4321. |
53
+ | `bun run build` | Run `astro check` then build the static output. |
54
+ | `bun run preview` | Serve the built site locally. |
55
+ | `bun run astro` | Expose the Astro CLI. |
56
+ | `bun run typecheck` | Run `astro check`. |
57
+
58
+ ## CI docs (extend)
59
+
60
+ In `.claude/context/ci.md`, the Typecheck row's assertion reads: `` `astro check` passes ``. The Build row's assertion reads: `` `astro build` succeeds ``.
@@ -0,0 +1,5 @@
1
+ root = true
2
+
3
+ [*.sh]
4
+ indent_style = space
5
+ indent_size = 2
@@ -0,0 +1,18 @@
1
+ ## Summary
2
+
3
+ <Action Verb> <Direct Object> to <Result>.
4
+
5
+ ## Key Changes
6
+
7
+ - <Verb> <specific component/file/function> (<reason if non-obvious>)
8
+ - <Verb> <specific component/file/function>
9
+
10
+ <!-- ## Technical Context (optional, omit for docs/config/trivial changes) -->
11
+ <!-- - <Why this approach was taken, not what changed> -->
12
+
13
+ ## Testing
14
+
15
+ - [ ] <Specific command or test case>
16
+ - [ ] <Edge case verified>
17
+
18
+ <!-- Visuals: include only if clarifying architecture, UI, or complex logic flows -->
@@ -0,0 +1,35 @@
1
+ name: Verify
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - main
7
+ workflow_dispatch:
8
+
9
+ jobs:
10
+ static-checks:
11
+ name: 🛡️ Static Checks
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - name: Checkout
15
+ uses: actions/checkout@v4
16
+
17
+ - name: Setup Bun
18
+ uses: oven-sh/setup-bun@v2
19
+ with:
20
+ bun-version: latest
21
+
22
+ - name: Install Dependencies
23
+ run: bun install --frozen-lockfile
24
+
25
+ - name: Install Shell Tools
26
+ run: sudo apt-get install -y shfmt shellcheck
27
+
28
+ - name: Check Formatting
29
+ run: bun run check:format
30
+
31
+ - name: Check Spelling
32
+ run: bun run check:spell
33
+
34
+ - name: Check Shell
35
+ run: bun run check:shell
@@ -0,0 +1 @@
1
+ bunx commitlint --edit "$1"
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env sh
2
+
3
+ # Names archive candidates after a pull merges work in.
4
+ #
5
+ # Every step before the merge fires from a chain and the archive fires when a
6
+ # person remembers, so shipped tasks accumulate on a board that reads as ready
7
+ # to hand a worker. This is the only event that lands after a merge.
8
+ #
9
+ # Candidates rather than closed tasks, because an all-`[x]` board entry does not
10
+ # mean the work merged. `claude-docs` marks outcomes on the branch as step 1 of
11
+ # the ship chain, so a task can read closed while its pull request is still open
12
+ # or already abandoned. The board is gitignored and an archived task has nothing
13
+ # to recover it, so `claude-tasks` confirms the work is on `main` before moving
14
+ # anything and this output says so rather than implying the check is done.
15
+ #
16
+ # It announces and never moves a file. The board is gitignored, so a shell-side
17
+ # archive leaves no diff to review with nobody watching, and `index.md` is
18
+ # regenerated by a session-scoped hook that a `mv` from a shell never fires.
19
+ #
20
+ # Husky runs this as `sh -e`, so the shebang is advisory and any bare command
21
+ # returning non-zero aborts the hook and prints a husky failure. Keep every
22
+ # test inside an `if` condition, which errexit exempts.
23
+
24
+ root=$(git worktree list --porcelain 2>/dev/null | grep -m 1 '^worktree ' | cut -d' ' -f2-) || root=''
25
+ [ -n "$root" ] || exit 0
26
+
27
+ # The board is shared scratch at the main worktree root, and `git worktree
28
+ # list` puts that root first. A pull inside a linked worktree fires this same
29
+ # hook, so trusting the working directory would read a board that is not there.
30
+ board="$root/.claude/tasks"
31
+ [ -d "$board" ] || exit 0
32
+
33
+ closed=""
34
+ count=0
35
+
36
+ for file in "$board"/*.md; do
37
+ [ -f "$file" ] || continue
38
+
39
+ case "$file" in
40
+ */index.md | */priority.md) continue ;;
41
+ esac
42
+
43
+ # Gate on the same condition both archive verbs gate on: at least one closed
44
+ # outcome and none open. A file carrying no outcomes at all falls out here,
45
+ # which is what keeps notes on the board from being announced as tasks.
46
+ if grep -q '^- \[ \]' "$file"; then
47
+ continue
48
+ fi
49
+
50
+ if grep -q '^- \[x\]' "$file"; then
51
+ closed="$closed $(basename "$file" .md)
52
+ "
53
+ count=$((count + 1))
54
+ fi
55
+ done
56
+
57
+ [ "$count" -gt 0 ] || exit 0
58
+
59
+ printf '\n📋 %s archive candidate(s) on the board:\n%s\n' "$count" "$closed"
60
+ printf 'Outcomes are marked on the branch, so each still needs its work confirmed\n'
61
+ printf 'on main. Run /claude-tasks, which checks that and sweeps the plan first.\n\n'
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env sh
2
+
3
+ # Runs the `post-merge` board check for anyone pulling with rebase.
4
+ #
5
+ # `git pull` under `pull.rebase=true` runs `git rebase`, which fires this event
6
+ # and never `post-merge`. Without this the trigger is a silent no-op on that
7
+ # machine, which is the wrong failure mode for a hook whose whole purpose is to
8
+ # stop a shipped task being forgotten. The base stack ships both hooks to every
9
+ # target, where the pull style is not something this repository controls.
10
+ #
11
+ # Only the `rebase` argument delegates. `post-rewrite` also fires on
12
+ # `commit --amend`, which rewrites nothing on the board and would print the
13
+ # candidate list on an ordinary amend.
14
+
15
+ [ "$1" = "rebase" ] || exit 0
16
+
17
+ hook="$(dirname "$0")/post-merge"
18
+ [ -f "$hook" ] || exit 0
19
+
20
+ # shellcheck source=/dev/null
21
+ . "$hook"