@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,63 @@
1
+ ---
2
+ title: Commit reference
3
+ description: Commit message format and type conventions
4
+ consumers: git-commit, git-stage
5
+ ---
6
+
7
+ # Commit message reference
8
+
9
+ ## Format
10
+
11
+ - Structure: `<type>(<scope>): <subject>`
12
+ - Casing: lowercase for `<type>`, `<scope>`, and first word of `<subject>`
13
+ - Subject: 72 characters maximum, no trailing period
14
+
15
+ ## Types
16
+
17
+ - `feat`: new feature or capability
18
+ - `fix`: bug fix
19
+ - `refactor`: structural changes (not a fix or feature)
20
+ - `docs`: documentation only (README)
21
+ - `chore`: maintenance tasks (deps, tooling, configs)
22
+ - `perf`: performance improvements
23
+ - `test`: add or modify tests
24
+ - `style`: code formatting (whitespace, semicolons)
25
+ - `build`: build system changes (webpack, npm scripts)
26
+ - `ci`: CI/CD pipeline changes (GitHub Actions)
27
+ - `revert`: revert a previous commit
28
+
29
+ ## Scope
30
+
31
+ - Single lowercase word representing a system component
32
+ - Prefer single word
33
+ - Use kebab-case only when two words are genuinely needed for specificity
34
+ - Do not use specific filenames as scopes
35
+ - Do not use a scope that duplicates the type
36
+ - Write scopes for release readability. They surface in `changelogithub` release notes.
37
+
38
+ ## Subject
39
+
40
+ - Use imperative mood (`add` not `added`)
41
+ - Describe the actual technical change, not that something changed
42
+ - Do not use vague verbs (`improve`, `refine`, `enhance`)
43
+ - Do not repeat the scope in the subject line
44
+ - Use single quotes if quoting
45
+ - No backslash escaping or internal double quotes
46
+ - No conversational filler or introductory phrases
47
+
48
+ ## Examples
49
+
50
+ ### Correct
51
+
52
+ ```plaintext
53
+ feat(api): add retry logic for failed webhooks # specific verb + clear change
54
+ fix(auth): update 'UserSession' validation logic # scoped + imperative + single quotes
55
+ ```
56
+
57
+ ### Incorrect
58
+
59
+ ```plaintext
60
+ fix(user-auth): Fixed the redirect loop. # wrong casing + period + multi-word scope
61
+ docs(docs): update the readme. # duplicate scope + period
62
+ docs(api): improve documentation # vague verb + lacks specificity
63
+ ```
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: git-followup
3
+ description: What the follow-up push is for, the gaps it closes, and how it splits from opening a pull request
4
+ ---
5
+
6
+ # Git followup requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, an edit made after a pull request is already open ships as a bare push. The body still describes the scope from before the edit, so a reviewer returning to the page reads a description the diff no longer matches. A reviewer who left comments gets no reply, and when a caller has already posted its own reply, a second one lands underneath it.
11
+
12
+ ## Must
13
+
14
+ - Refuse unless the branch has an upstream and an open pull request, since every later step addresses one of the two
15
+ - Delegate the message to `git-commit` rather than composing one, so a follow-up commit reads like every other commit
16
+ - Sync the body when the new commit moves the scope, and the title when the shift makes it inaccurate
17
+ - Reply on the pull request when it carries review comments, and scan that reply for the banned characters before posting. The hook watches files and never sees a comment body on its way to the remote.
18
+ - Suppress the reply when the caller owns it, and still run the push and the body sync
19
+
20
+ ## Must not
21
+
22
+ - Run on `main`
23
+ - Open a pull request. A missing one is the stop condition, not a step to add.
24
+ - Post a second reply when the caller has already replied
25
+ - Emit anything after the result line
26
+
27
+ ## Guards
28
+
29
+ - On `main`: stop and say to switch to a pull request branch
30
+ - Nothing changed: stop
31
+ - No upstream: stop and name both recoveries
32
+ - No open pull request: stop and route to the skill that opens one
33
+
34
+ ## Out of scope
35
+
36
+ - Opening the pull request, which `git-pr` owns and `git-ship` chains
37
+ - Deciding what to fix from a review, which `claude-address-review` owns. This skill is that flow's push leg and takes the fixes as already made.
38
+ - Grouping a multi-concern diff, which `git-stage` owns. A follow-up is one concern by definition, which is why this skill stages everything into a single commit.
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: git-followup
3
+ description: Ships a small self-review edit on the current PR branch by staging, committing, pushing, and syncing the open PR, replying on the PR when it carries review comments. Use when asked to "ship a followup", "push the PR fix", "followup", or "commit and push this small change". Do NOT use when there is no open PR for the branch (use git-ship instead).
4
+ ---
5
+
6
+ # Git followup
7
+
8
+ Ship a small self-review edit on the current PR branch in one pass.
9
+
10
+ When invoked with `reply-owned`, a caller such as `claude-address-review` posts
11
+ its own reply, so skip the comment in step 6. The push and body sync still run.
12
+
13
+ ## Guards
14
+
15
+ - If `git branch --show-current` returns `main`, stop: `❌ On main. Switch to a PR branch first.`
16
+ - If `git status --porcelain` is empty, stop: `❌ No changes to ship.`
17
+ - If `git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null` is empty, stop: `❌ No upstream. Push the branch first or use git-ship.`
18
+ - If `gh pr view --json state -q '.state' 2>/dev/null` is not `OPEN`, stop: `❌ No open PR for this branch. Use git-ship to open one.`
19
+
20
+ ## Sequence
21
+
22
+ 1. Run `git status` to confirm the changes are intentional
23
+ 2. Run `git add -A` to stage every change
24
+ 3. Invoke `aitk:git-commit` to generate one conventional commit from the staged diff
25
+ 4. Run `git push` to the tracking branch
26
+ 5. Check for existing review comments: `gh api 'repos/{owner}/{repo}/pulls/<number>/comments' --jq 'length'`, resolving `<number>` from `gh pr view --json number`.
27
+ 6. When invoked with `reply-owned`, skip this step's comment: the caller posts the reply. Otherwise, if the count is above zero, the followup addresses review feedback: post a one-line summary of the fix with `gh pr comment --body`, first scanning it for em dashes and semicolons and rewriting each since the hook does not see an inline comment body. If it is zero, run `gh pr view --json url,title,body` and update the body with `gh pr edit --body` when the new commit changes scope, and the title with `gh pr edit --title` when the scope shifted enough to make it inaccurate.
28
+
29
+ ## After completion
30
+
31
+ Output one line:
32
+
33
+ ```plaintext
34
+ ✅ Followup shipped: <pr-url>
35
+ ```
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: git-issue
3
+ description: What issue filing is for, the gaps it closes, and which reporting paths belong elsewhere
4
+ ---
5
+
6
+ # Git issue requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, an issue takes the shape of whatever the session was saying. It arrives with no label, so triage cannot filter it, and without the sections a triage pass reads, so the reader has to reconstruct the problem from narrative. Prose bans hold on files the hook watches and not on text leaving through `gh`, so a banned character survives into a published artifact that then has to be edited on the remote.
11
+
12
+ ## Must
13
+
14
+ - Read the issue reference and the prose standard before formatting
15
+ - Confirm a remote and an authenticated `gh` before composing, so the failure lands before a body is written rather than after
16
+ - Scan the title and body for banned characters as an explicit step. Reading the standard does not catch them, because the text is generated after the read.
17
+ - Map the type to exactly one label, so filing and filtering agree
18
+ - Ask once when the type is ambiguous between a bug and a task, since the label follows from it and a wrong label buries the issue
19
+ - Pass the body through a file and remove it afterward, so shell quoting cannot mangle it
20
+
21
+ ## Must not
22
+
23
+ - Invent an issue from a thin session. Nothing concrete in context is a stop rather than a prompt to elaborate.
24
+ - File anywhere other than the current origin
25
+ - Open a pull request
26
+ - Emit anything after the result line
27
+
28
+ ## Guards
29
+
30
+ - No concrete bug or task in session context: stop and say what to provide
31
+ - No remote: stop and name what `gh issue create` needs
32
+ - `gh` not authenticated: stop and name the command that authenticates
33
+
34
+ ## Out of scope
35
+
36
+ - Reporting a toolkit defect from a target project, which `toolkit-feedback` owns. That path writes into the toolkit rather than the current repository.
37
+ - Triaging issues already filed, which `toolkit-triage` owns
38
+ - Opening a pull request, which `git-pr` owns
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: git-issue
3
+ description: Format a bug or task from the current session into a GitHub issue and file it on the current repo via `gh issue create`. Use when asked to "file an issue", "open an issue", "log this bug", "raise an issue", or "track this as an issue". Do NOT use to report a toolkit defect from a target project (that is `toolkit-feedback`), or to open a pull request (that is `git-pr`).
4
+ ---
5
+
6
+ # Git issue
7
+
8
+ Format an issue from session context following the issue standard, then file it on the current repository with `gh issue create`.
9
+
10
+ ## Context
11
+
12
+ Read these in parallel:
13
+
14
+ - `${CLAUDE_SKILL_DIR}/references/issue.md`: issue title, labels, body sections, and banned phrases
15
+ - `.claude/standards/prose.md` from the project root: prose conventions for all generated text
16
+
17
+ Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
18
+
19
+ Then gather repo context in parallel:
20
+
21
+ - `git remote get-url origin 2>/dev/null || echo "NO_REMOTE"`
22
+ - `gh auth status >/dev/null 2>&1 && echo "AUTHED" || echo "NO_AUTH"`
23
+
24
+ ## Guards
25
+
26
+ - If nothing in session context describes a concrete bug or task, stop: `❌ No issue in session context. Describe the bug or task, then re-invoke.`
27
+ - If `git remote get-url origin` returns `NO_REMOTE`, stop: `❌ No GitHub remote. gh issue create needs an origin.`
28
+ - If `gh auth status` returns `NO_AUTH`, stop: `❌ gh is not authenticated. Run gh auth login.`
29
+ - If the type is ambiguous between a bug and a task, ask one line before formatting.
30
+
31
+ ## Response format
32
+
33
+ ### Preview
34
+
35
+ - **Title:** `<type>: <subject>`
36
+ - **Label:** <bug or enhancement>
37
+ - **Analysis:** <one line on what the issue captures>
38
+
39
+ After outputting the preview, execute the final command immediately. Claude Code's tool permission dialog is the confirmation gate. Do not wait for user input.
40
+
41
+ ### Pre-publish scan
42
+
43
+ Before running the final command, scan the title and body for banned characters and rewrite each occurrence:
44
+
45
+ - `—` (em dash): split into two sentences or use a comma
46
+ - `;` (semicolon): split into two sentences
47
+
48
+ These bans come from `.claude/standards/prose.md`. Reading it is not enough. The scan is an explicit step.
49
+
50
+ ### Final command
51
+
52
+ Map a bug to `--label bug` and a task to `--label enhancement`.
53
+
54
+ ```bash
55
+ mkdir -p .claude/.tmp/issue
56
+ cat <<'BODY' > .claude/.tmp/issue/body.md
57
+ <body following the issue.md sections>
58
+ BODY
59
+ gh issue create --title "<type>: <subject>" --label <bug or enhancement> --body-file .claude/.tmp/issue/body.md
60
+ rm -rf .claude/.tmp/issue
61
+ ```
62
+
63
+ ## After execution
64
+
65
+ Respond with exactly one line:
66
+
67
+ `✅ Issue: <url>`
68
+
69
+ Do not add any other text.
@@ -0,0 +1,84 @@
1
+ ---
2
+ title: Issue reference
3
+ description: GitHub issue title, labels, and body conventions
4
+ consumers: git-issue
5
+ ---
6
+
7
+ # Issue reference
8
+
9
+ ## Title
10
+
11
+ - Format: `<type>: <subject>`
12
+ - Type is `bug` or `task`. Lowercase the type and the first word of the subject.
13
+ - Length: 72 characters maximum, no trailing period.
14
+
15
+ ## Labels
16
+
17
+ - Apply `bug` for a defect and `enhancement` for a task or improvement.
18
+ - Both are GitHub default labels. A label that does not exist makes `gh` reject the issue. Create it once with `gh label create`.
19
+ - One label per issue unless a second genuinely applies.
20
+
21
+ ## Content
22
+
23
+ - Use imperative mood and describe the actual defect or work, not that something is wrong.
24
+ - Do not open with "This issue," "I want," or "We should."
25
+ - Do not use buzzwords or speculative future scope.
26
+ - State observable behavior for a bug, not a guessed cause.
27
+
28
+ ## Sections
29
+
30
+ - `## Summary`: one line naming what and why.
31
+ - `## Details`: for a bug, what happens versus what is expected. For a task, what to build.
32
+ - `## Context`: for a bug, repro steps or commands. For a task, the driving reason, or `none`.
33
+ - `## Proposed` (optional): one line naming a fix or approach. Omit when open.
34
+
35
+ ## Formatting
36
+
37
+ - End every bullet with a period.
38
+ - Keep each section to one or two lines.
39
+
40
+ ## Examples
41
+
42
+ ### Correct (bug)
43
+
44
+ ```markdown
45
+ ## Summary
46
+
47
+ Fix the feedback CLI so it applies the `feedback` label.
48
+
49
+ ## Details
50
+
51
+ `aitk feedback --github` opens an issue with no label, so `toolkit-triage` never lists it.
52
+
53
+ ## Context
54
+
55
+ Run a piped `aitk feedback --github`, then check the issue carries no `feedback` label.
56
+
57
+ ## Proposed
58
+
59
+ Pass `--label feedback` through the shared issue helper.
60
+ ```
61
+
62
+ ### Correct (task)
63
+
64
+ ```markdown
65
+ ## Summary
66
+
67
+ Add a git-issue skill so a session can file an issue on the current repo.
68
+
69
+ ## Details
70
+
71
+ Format an issue from session context and file it with `gh issue create`, next to git-pr in the git family.
72
+
73
+ ## Context
74
+
75
+ The toolkit-issue skill only files on the toolkit repo. A general path is needed for target projects.
76
+ ```
77
+
78
+ ### Incorrect
79
+
80
+ ```markdown
81
+ ## Summary
82
+
83
+ This issue is about the feedback system being kind of broken, and we should probably make it more robust.
84
+ ```
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: git-pr
3
+ description: What pull request generation is for, the gaps it closes, and what it requires upstream of itself
4
+ ---
5
+
6
+ # Git PR requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a pull request body is written from memory of the branch rather than from its diff, so it describes the intent and omits what the work turned into. Testing boxes get ticked from intent, which records what was meant to run instead of what ran, and a reviewer trusts the list. A second push either errors on create or opens a duplicate pull request, and banned characters survive into a body the hook never sees.
11
+
12
+ ## Must
13
+
14
+ - Refuse a branch name that does not conform, since the name lands on the pull request permanently and renaming it afterward breaks the link
15
+ - Derive the title and body from the commits and the diff against main, with lockfiles excluded
16
+ - Run each check before writing its line, then state the result the run reported
17
+ - Leave a box unchecked only for a human-only case, naming which human and why on the same line
18
+ - Scan the title and body for banned characters as an explicit step, on top of reading the prose standard
19
+ - Detect an open pull request and edit it in place, so a follow-up push keeps the body in sync instead of failing
20
+
21
+ ## Must not
22
+
23
+ - Tick a testing box from intent or from a past session. The box records a run.
24
+ - Put a request for the reviewer in the Testing list, since a request is not a result
25
+ - Create a second pull request when one is open
26
+ - Emit anything after the result line
27
+
28
+ ## Guards
29
+
30
+ - Branch name does not conform: stop and route to the skill that renames
31
+ - No commits ahead of main: stop
32
+
33
+ ## Out of scope
34
+
35
+ - Naming the branch, which `git-branch` owns. This skill requires a conforming name and refuses without one rather than fixing it.
36
+ - Grouping the diff into commits, which `git-stage` owns
37
+ - Pushing a later edit onto an already-open pull request, which `git-followup` owns. The overlap is real and the split is by state: this skill brings a pull request into existence and keeps it accurate, that one carries a fix onto one already under review.
@@ -0,0 +1,119 @@
1
+ ---
2
+ name: git-pr
3
+ description: Generates pull request titles and descriptions from git diffs. Use for any PR creation or update.
4
+ ---
5
+
6
+ # Git PR
7
+
8
+ ## Context
9
+
10
+ Read these files in parallel:
11
+
12
+ - `${CLAUDE_SKILL_DIR}/references/branch.md`: branch format, valid types, and constraints
13
+ - `${CLAUDE_SKILL_DIR}/references/pr.md`: structure, rules, and banned phrases
14
+ - `.claude/standards/prose.md` from the project root: prose conventions for all generated text
15
+ - `.claude/standards/versioning.md` from the project root: phase label vs semver discipline
16
+
17
+ Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
18
+
19
+ Resolve the base ref first, because the log range and the diff below both consume it:
20
+
21
+ ```bash
22
+ git merge-base HEAD origin/main 2>/dev/null || git merge-base HEAD main 2>/dev/null
23
+ ```
24
+
25
+ Then run these commands in parallel to gather git context:
26
+
27
+ - `git remote get-url origin 2>/dev/null || echo "NO_REMOTE"`
28
+ - `git branch --show-current 2>/dev/null || echo "unknown"`
29
+ - `git log <base>..HEAD --oneline 2>/dev/null || echo "NO_COMMITS"`
30
+ - `git diff <base> HEAD -- . ':(exclude)*.lock' ':(exclude)*-lock.json' 2>/dev/null || echo "NO_DIFF"`
31
+
32
+ ## Diff baseline
33
+
34
+ Prefer `origin/main` over local `main`. Both reads resolve against `<base>`, so the commits listed and the changes described come from one scope.
35
+
36
+ `git diff main..HEAD` is the form the diff replaces. A two-dot range compares tips and resolves no merge base, so once local `main` advances past the branch point it reports main's newer commits as reversed changes and the description describes work the branch never did. On `main` itself the local ref resolves to HEAD and every committed change drops out instead.
37
+
38
+ `git log main..HEAD` is the matching defect on the commit side. It excludes what local `main` reaches, so a local `main` trailing `origin/main` leaves commits in the range that are already on the remote and are not this branch's work. The diff resolved from `<base>` excludes those same commits, and the description then lists commits whose changes appear nowhere in it. Reading both against `<base>` is what keeps the two halves describing one branch.
39
+
40
+ The baseline is unusable in two cases:
41
+
42
+ - No merge base resolves against either ref.
43
+ - The base equals HEAD, whichever ref resolved it. Nothing is committed ahead of the base to compare against.
44
+
45
+ Either case leaves both reads empty, which the no-commits guard below catches. Stop there rather than composing a description from an empty diff.
46
+
47
+ ## Guards
48
+
49
+ - If branch name does not match `<type>/<description>` format (valid types are defined in `${CLAUDE_SKILL_DIR}/references/branch.md`), stop and output:
50
+ `❌ Branch name does not follow conventions. Run /git-branch to rename first.`
51
+ - If no commits ahead of main, stop and output:
52
+ `❌ No commits ahead of main. Nothing to PR.`
53
+
54
+ ## Response format
55
+
56
+ ### Preview
57
+
58
+ - **Title:** <title>
59
+ - **Files changed:** <count>
60
+ - **Analysis:** <brief summary of impact>
61
+
62
+ After outputting the preview, execute the final command immediately. Claude Code's tool permission dialog is the confirmation gate. Do not wait for user input.
63
+
64
+ ### Testing checkboxes
65
+
66
+ Follow Testing discipline in `${CLAUDE_SKILL_DIR}/references/pr.md`. Run each check before writing its line, then tick the box and state the result the run reported. Never pre-check based on intent or past sessions.
67
+
68
+ Leave a box unchecked only for the human-only cases the reference defines, and name which human and why on the same line. A request for the reviewer is not a test result, so it belongs under `## For the reviewer` rather than in the Testing list.
69
+
70
+ ### Pre-publish scan
71
+
72
+ Before running the final command, scan the PR title and body for banned characters and rewrite each occurrence:
73
+
74
+ - `—` (em dash): split into two sentences or use a comma
75
+ - `;` (semicolon): split into two sentences
76
+
77
+ These bans come from `.claude/standards/prose.md` and apply to PR text on top of `${CLAUDE_SKILL_DIR}/references/pr.md`. Reading `prose.md` is not enough. The scan is an explicit step.
78
+
79
+ ### Final command
80
+
81
+ Detect an existing PR and branch: edit it in place when one is open, create it otherwise. This keeps the body in sync on a follow-up push instead of erroring on `gh pr create`.
82
+
83
+ ```bash
84
+ mkdir -p .claude/.tmp/pr
85
+ cat <<'BODY' > .claude/.tmp/pr/body.md
86
+ <body content following pr.md template exactly>
87
+ BODY
88
+ git push -u origin HEAD || exit 1
89
+ if gh pr view --json number >/dev/null 2>&1; then
90
+ gh pr edit --title "<title>" --body-file .claude/.tmp/pr/body.md
91
+ else
92
+ gh pr create --title "<title>" --body-file .claude/.tmp/pr/body.md
93
+ fi
94
+ rm -rf .claude/.tmp/pr
95
+ ```
96
+
97
+ ### Record the number on the task
98
+
99
+ Resolve the number the run created or edited, then write it onto the task the branch is closing:
100
+
101
+ ```bash
102
+ gh pr view --json number --jq .number
103
+ ```
104
+
105
+ Find the task by reading `.claude/tasks/` at the main worktree root, resolved with `git worktree list --porcelain | grep -m 1 '^worktree ' | cut -d' ' -f2-`. The board is shared scratch, so a linked worktree writing to its own `pwd` creates a second board nothing reads.
106
+
107
+ Confirm the match against the task's `Plan:` line, which names the plan this branch implemented. A branch name does not derive a plan slug and a plan slug does not derive a branch, so neither one alone identifies the task. Add `Pull request: #NNN` under the existing `Plan:`, `Groundwork:`, or `Issue:` lines when the task carries no such line, and correct the number in place when it does.
108
+
109
+ Skip this silently in three cases: no `.claude/tasks/` folder, no task whose `Plan:` line matches, or more than one match. One task, one pull request, so a second match is a misfile that a guessed write would compound. A wrong match archives the wrong task unattended once the branch merges.
110
+
111
+ The number is what lets the merge close the task. Every merge on `main` is a squash carrying it in the subject, so the number survives where a branch name does not, and `post-merge` reads it back to call `aitk tasks archive`. Writing it here rather than at worktree time is what makes it a pull request number rather than a branch the squash discards.
112
+
113
+ ## After execution
114
+
115
+ Respond with exactly one line:
116
+
117
+ `✅ PR: <url>`
118
+
119
+ Do not add any other text.
@@ -0,0 +1,49 @@
1
+ ---
2
+ title: Branch reference
3
+ description: Branch naming format and type conventions
4
+ consumers: git-branch, git-split, git-pr, claude-standards-audit
5
+ ---
6
+
7
+ # Branch reference
8
+
9
+ ## Format
10
+
11
+ - Structure: `<type>/<description>` or `<type>/<ticket>-<description>`
12
+ - Length: 50 characters maximum
13
+ - Casing: kebab-case only, no underscores or camelCase
14
+ - Description: 2 words maximum, 3 only when genuinely needed for specificity
15
+ - Capture the core change, not the commit message verbatim
16
+ - For branches with multiple commits, use the unifying concern as the description.
17
+ - Do not duplicate type in description (e.g., `feat/feature-login`)
18
+
19
+ ## Types
20
+
21
+ - `feat`: new feature or capability
22
+ - `fix`: bug fix
23
+ - `refactor`: structural changes (not a fix or feature)
24
+ - `docs`: documentation only (README)
25
+ - `chore`: maintenance tasks (deps, tooling, configs)
26
+ - `perf`: performance improvements
27
+ - `test`: add or modify tests
28
+ - `style`: code formatting (whitespace, semicolons)
29
+ - `build`: build system changes (webpack, npm scripts)
30
+ - `ci`: CI/CD pipeline changes (GitHub Actions)
31
+ - `revert`: revert a previous commit
32
+
33
+ ## Examples
34
+
35
+ ### Correct
36
+
37
+ ```plaintext
38
+ feat/jwt-expiration # clear feature scope
39
+ fix/AUTH-123-connection-pool # includes ticket ID
40
+ refactor/remove-deprecated-endpoints # clear refactor intent
41
+ ```
42
+
43
+ ### Incorrect
44
+
45
+ ```plaintext
46
+ feature/auth_stuff # wrong type + underscore
47
+ feat/feature-add-login # duplicates type in description
48
+ fix/DB-456-fix-the-database-connection-pool-memory-leak # exceeds 50 chars + verbatim message
49
+ ```
@@ -0,0 +1,124 @@
1
+ ---
2
+ title: Pull request reference
3
+ description: Pull request title and body conventions
4
+ consumers: git-split, git-pr, claude-standards-audit
5
+ ---
6
+
7
+ # Pull request reference
8
+
9
+ ## Title
10
+
11
+ - Format: `<type>(<scope>): <subject>`
12
+ - Casing: lowercase for `<type>`, `<scope>`, and first word of `<subject>`
13
+ - Length: 72 characters maximum
14
+
15
+ ## Content
16
+
17
+ - Use imperative mood for all content (`add`, `fix`, `refactor`)
18
+ - Do not start with "This PR," "This commit," "Included are," or "I have"
19
+ - Do not use buzzwords (`seamless`, `robust`, `game-changer`, `enhanced`)
20
+ - Do not describe historical behavior or unchanged code. Describe new behavior only.
21
+ - Do not include future promises or speculative documentation
22
+ - Do not explain obvious changes (formatting, renaming variables)
23
+ - Do not duplicate commit messages verbatim
24
+
25
+ ## Sections
26
+
27
+ - `## Summary`: 1-2 sentences following `<Action Verb> <Direct Object> to <Result>`, expand for clarity if needed
28
+ - `## Key Changes`: name actual files, functions, or modules (e.g., `AuthService.verify()` not "auth handler"). Always use bullet points, never prose.
29
+ - `## Technical Context` (optional): 1-2 lines of architectural reasoning explaining why, not what
30
+ - Omit Technical Context for docs, config, or trivial changes
31
+ - Use bullet points for multiple reasons, one sentence for a single reason
32
+ - `## Testing` (optional): specify exact commands or test cases run
33
+ - Omit Testing for docs, config, or trivial sync changes
34
+ - Use checkboxes, never prose. See Testing discipline for which box gets ticked.
35
+ - `## For the reviewer` (optional): what the reviewer should confirm, one bullet per request
36
+ - Visuals: include only when they clarify architecture, UI, or complex logic flows
37
+
38
+ ## Testing discipline
39
+
40
+ - Run the check before writing its line. A `- [ ]` reports a check that has not run rather than one that is planned.
41
+ - Tick the box and state the observed result. `- [x] npm test passes, 42 tests` beats `- [ ] run npm test`.
42
+ - Quote the count or output the run reported, never a figure carried from elsewhere.
43
+ - Leave a box unchecked only when a human is required, and name which human and why on the same line.
44
+ - Human-only covers visual or aesthetic judgment, anything needing credentials or a live third-party service, anything needing a second machine or a fresh OS, and judgment about whether a boundary or an abstraction reads correctly. The agent runs everything else.
45
+ - Put a request for the reviewer under `## For the reviewer`. It is a request rather than unfinished testing, so it never appears as an unchecked Testing box.
46
+
47
+ ## Formatting
48
+
49
+ - End every bullet point with a period
50
+
51
+ ## Examples
52
+
53
+ ### Template
54
+
55
+ ```markdown
56
+ ## Summary
57
+
58
+ <Action Verb> <Direct Object> to <Result>.
59
+
60
+ ## Key Changes
61
+
62
+ - <Verb> <specific component/file/function> (<reason if non-obvious>)
63
+ - <Verb> <specific component/file/function>
64
+
65
+ ## Technical Context
66
+
67
+ - <Architectural reasoning explaining why, not what>
68
+
69
+ ## Testing
70
+
71
+ - [x] <Command run> <observed result>
72
+ - [x] <Edge case verified> <what was observed>
73
+ - [ ] <Human-only check> (<which human, why>)
74
+
75
+ ## For the reviewer
76
+
77
+ - <What the reviewer should confirm>
78
+ ```
79
+
80
+ ### Correct
81
+
82
+ ```markdown
83
+ ## Summary
84
+
85
+ Update auth middleware to enforce jwt expiration checks. # imperative + direct object + result
86
+
87
+ ## Key Changes
88
+
89
+ - Add `verifyExpiration()` to `src/auth/validators.ts`. # specific function + file path
90
+ - Refactor `AuthService.authenticate()` to handle 401 codes. # named component + clear change
91
+
92
+ ## Technical Context
93
+
94
+ - Migration to stateless session management for horizontal scalability. # why, not what
95
+
96
+ ## Testing
97
+
98
+ - [x] `npm run test:auth` passes, 42 tests. # command run + observed result
99
+ - [x] Expired token rejected with a 401 against a local server. # edge case + what happened
100
+ - [ ] Staging smoke test (release owner, needs staging credentials). # unchecked + which human + why
101
+
102
+ ## For the reviewer
103
+
104
+ - Confirm the 401 and 403 split reads correctly for the public API. # a request, not a test result
105
+ ```
106
+
107
+ ### Incorrect
108
+
109
+ ```markdown
110
+ ## Summary
111
+
112
+ This PR updates the authentication system to be more robust. # "This PR" opener + buzzword
113
+
114
+ ## Key Changes
115
+
116
+ - Updated auth middleware files # vague, no specific component, no period
117
+ - The old system used to check tokens differently # describes historical behavior
118
+
119
+ ## Testing
120
+
121
+ - Tested manually # no specific command or case
122
+ - [ ] `npm run test:auth` # unchecked box for a check the agent can run
123
+ - [ ] Reviewer confirms the error split reads correctly # a reviewer request, belongs under `## For the reviewer`
124
+ ```