@thedecipherist/claude-packs 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (827) hide show
  1. package/CHANGELOG.md +680 -0
  2. package/LICENSE +21 -0
  3. package/README.md +316 -2
  4. package/bin/claude-packs.mjs +204 -0
  5. package/configurations/base/config.json +85 -0
  6. package/configurations/cpp/config.json +92 -0
  7. package/configurations/full-stack/config.json +152 -0
  8. package/configurations/go/config.json +96 -0
  9. package/configurations/node/config.json +100 -0
  10. package/configurations/python/config.json +97 -0
  11. package/configurations/synth-creator/config.json +148 -0
  12. package/global/hooks/gnu-shell.mjs +131 -0
  13. package/global/hooks/lib/program-read.mjs +196 -0
  14. package/global/hooks/lib/program-writes.mjs +177 -0
  15. package/global/hooks/lib/shell-writes.mjs +293 -0
  16. package/global/hooks/shell-traps.mjs +79 -0
  17. package/global/hooks/version-pin-guard.mjs +280 -0
  18. package/global/skills/latest-versions/SKILL.md +49 -0
  19. package/lib/backup.mjs +34 -0
  20. package/lib/claude-md.mjs +58 -0
  21. package/lib/config-cli.mjs +36 -0
  22. package/lib/configs.mjs +145 -0
  23. package/lib/coverage.mjs +86 -0
  24. package/lib/custom-packs.mjs +93 -0
  25. package/lib/doctor.mjs +115 -0
  26. package/lib/fix-plan.mjs +71 -0
  27. package/lib/git-tokens.mjs +64 -0
  28. package/lib/global.mjs +125 -0
  29. package/lib/hook-proof.mjs +28 -0
  30. package/lib/hook-timing.mjs +42 -0
  31. package/lib/hover-gate.mjs +29 -0
  32. package/lib/kit-lock.mjs +149 -0
  33. package/lib/layout.mjs +75 -0
  34. package/lib/logs.mjs +69 -0
  35. package/lib/manifest.mjs +24 -0
  36. package/lib/new.mjs +49 -0
  37. package/lib/once-only-report.mjs +54 -0
  38. package/lib/pack-manifest.mjs +20 -0
  39. package/lib/packs.mjs +107 -0
  40. package/lib/planner.mjs +59 -0
  41. package/lib/repeats.mjs +65 -0
  42. package/lib/repo-weight.mjs +28 -0
  43. package/lib/rules.mjs +40 -0
  44. package/lib/scan-detect.mjs +94 -0
  45. package/lib/scan.mjs +168 -0
  46. package/lib/selftest-cache.mjs +39 -0
  47. package/lib/settings.mjs +138 -0
  48. package/lib/shape-cli.mjs +76 -0
  49. package/lib/shape.mjs +4 -0
  50. package/lib/suggest.mjs +18 -0
  51. package/lib/switches.mjs +44 -0
  52. package/lib/symmetry-doctor.mjs +26 -0
  53. package/lib/sync.mjs +130 -0
  54. package/package.json +34 -4
  55. package/packs/ai/checks/boundary-computes-its-own-hash.json +30 -0
  56. package/packs/ai/checks/model-call-needs-boundary.json +29 -0
  57. package/packs/ai/checks/model-id-from-config.json +28 -0
  58. package/packs/ai/checks/model-output-validated.json +26 -0
  59. package/packs/ai/pack.json +38 -0
  60. package/packs/ai/rules/ai-input-sha-boundary.md +31 -0
  61. package/packs/ai/rules/llm-pipeline-security.md +26 -0
  62. package/packs/audio-core/checks/denormals-not-in-prepare.json +12 -0
  63. package/packs/audio-core/checks/dsp-without-apvts.json +12 -0
  64. package/packs/audio-core/checks/float-phase-or-rate.json +12 -0
  65. package/packs/audio-core/checks/juce-snap-to-zero-off.json +12 -0
  66. package/packs/audio-core/checks/keep-werror.json +12 -0
  67. package/packs/audio-core/checks/no-fast-math.json +14 -0
  68. package/packs/audio-core/checks/no-locale-change.json +12 -0
  69. package/packs/audio-core/checks/no-march-native.json +14 -0
  70. package/packs/audio-core/clang-tidy +28 -0
  71. package/packs/audio-core/hooks/lib/realtime-checks.mjs +56 -0
  72. package/packs/audio-core/hooks/param-id-lock.mjs +129 -0
  73. package/packs/audio-core/hooks/realtime-guard.mjs +67 -0
  74. package/packs/audio-core/pack.json +187 -0
  75. package/packs/audio-core/rules/audio-thread-realtime-safe.md +27 -0
  76. package/packs/audio-core/rules/audio-ui-thread-handoff.md +21 -0
  77. package/packs/audio-core/rules/boundary-tests-cross-the-boundary.md +16 -0
  78. package/packs/audio-core/rules/build-flags-safe.md +20 -0
  79. package/packs/audio-core/rules/cached-parameter-pointers.md +28 -0
  80. package/packs/audio-core/rules/clang-tidy-core-guidelines.md +21 -0
  81. package/packs/audio-core/rules/control-reaches-every-surface.md +23 -0
  82. package/packs/audio-core/rules/cpu-worst-case-per-block.md +26 -0
  83. package/packs/audio-core/rules/dc-block-after-asymmetry.md +22 -0
  84. package/packs/audio-core/rules/discrete-params-snap.md +19 -0
  85. package/packs/audio-core/rules/double-where-precision-matters.md +20 -0
  86. package/packs/audio-core/rules/filters-stable-under-modulation.md +29 -0
  87. package/packs/audio-core/rules/host-parameters-at-scale.md +24 -0
  88. package/packs/audio-core/rules/house-control-behaviours.md +34 -0
  89. package/packs/audio-core/rules/math-domain-guards.md +19 -0
  90. package/packs/audio-core/rules/modulated-delay-interpolation.md +22 -0
  91. package/packs/audio-core/rules/multiband-phase-coherent.md +22 -0
  92. package/packs/audio-core/rules/nonlinear-stages-antialiased.md +28 -0
  93. package/packs/audio-core/rules/note-ledger-and-pedals.md +22 -0
  94. package/packs/audio-core/rules/one-formula-per-value.md +20 -0
  95. package/packs/audio-core/rules/optimisations-are-null-tested.md +23 -0
  96. package/packs/audio-core/rules/oscillators-bandlimited.md +23 -0
  97. package/packs/audio-core/rules/output-limiter.md +23 -0
  98. package/packs/audio-core/rules/parameter-ids-never-change.md +20 -0
  99. package/packs/audio-core/rules/params-and-state-thread-safe.md +19 -0
  100. package/packs/audio-core/rules/params-snapshot-per-block.md +21 -0
  101. package/packs/audio-core/rules/patch-excludes-performance-controls.md +18 -0
  102. package/packs/audio-core/rules/per-sample-code-inlinable.md +22 -0
  103. package/packs/audio-core/rules/prepare-is-repeatable.md +23 -0
  104. package/packs/audio-core/rules/recursive-state-nan-guard.md +20 -0
  105. package/packs/audio-core/rules/reverb-loop-gain-bounded.md +24 -0
  106. package/packs/audio-core/rules/sample-accurate-midi.md +22 -0
  107. package/packs/audio-core/rules/sample-rate-and-block-size-from-host.md +23 -0
  108. package/packs/audio-core/rules/scoped-no-denormals.md +26 -0
  109. package/packs/audio-core/rules/smooth-continuous-parameters.md +22 -0
  110. package/packs/audio-core/rules/state-load-versioned-and-safe.md +22 -0
  111. package/packs/audio-core/rules/straight-on-and-aligned.md +21 -0
  112. package/packs/audio-core/rules/ui-matches-reference-look.md +21 -0
  113. package/packs/audio-core/rules/undo-one-gesture-one-step.md +21 -0
  114. package/packs/audio-core/rules/voice-steal-fades.md +21 -0
  115. package/packs/audio-core/rules/voice-sum-headroom.md +20 -0
  116. package/packs/audio-core/skills/analyse-reference-look/SKILL.md +21 -0
  117. package/packs/audio-core/skills/copy-and-prove/SKILL.md +98 -0
  118. package/packs/audio-core/skills/juce-realtime-audit/SKILL.md +22 -0
  119. package/packs/audio-core/skills/measure-tone/SKILL.md +20 -0
  120. package/packs/audio-core/skills/new-panel-control/SKILL.md +15 -0
  121. package/packs/audio-core/skills/prove-control/SKILL.md +23 -0
  122. package/packs/audio-core/skills/trace-parameter/SKILL.md +29 -0
  123. package/packs/audio-core/tools/lib/spectrum.mjs +112 -0
  124. package/packs/audio-core/tools/lib/wav.mjs +41 -0
  125. package/packs/audio-core/tools/tone-report.mjs +47 -0
  126. package/packs/base/checks/field-map-over-if-runs.json +25 -0
  127. package/packs/base/checks/lookup-over-if-chains.json +25 -0
  128. package/packs/base/checks/lookup-over-ternary-chains.json +20 -0
  129. package/packs/base/checks/no-code-after-midline-comment.json +12 -0
  130. package/packs/base/checks/one-walk-per-template.json +23 -0
  131. package/packs/base/checks/stub-reports-success.json +31 -0
  132. package/packs/base/checks/test-skip-on-failed-setup.json +17 -0
  133. package/packs/base/hooks/brief-guard.mjs +96 -0
  134. package/packs/base/hooks/code-shape.mjs +95 -0
  135. package/packs/base/hooks/dispatch-once.mjs +87 -0
  136. package/packs/base/hooks/file-size-guard.mjs +61 -0
  137. package/packs/base/hooks/folder-law.mjs +74 -0
  138. package/packs/base/hooks/git-guard.mjs +289 -0
  139. package/packs/base/hooks/lesson-checks.mjs +174 -0
  140. package/packs/base/hooks/lib/apply-edit.mjs +20 -0
  141. package/packs/base/hooks/lib/code-shapes.mjs +137 -0
  142. package/packs/base/hooks/lib/content.mjs +14 -0
  143. package/packs/base/hooks/lib/cpp-scan.mjs +94 -0
  144. package/packs/base/hooks/lib/dup-index.mjs +199 -0
  145. package/packs/base/hooks/lib/dup.mjs +127 -0
  146. package/packs/base/hooks/lib/elements.mjs +87 -0
  147. package/packs/base/hooks/lib/event-log.mjs +67 -0
  148. package/packs/base/hooks/lib/function-shapes.mjs +90 -0
  149. package/packs/base/hooks/lib/git-adds.mjs +20 -0
  150. package/packs/base/hooks/lib/git-guard-selftest.mjs +99 -0
  151. package/packs/base/hooks/lib/glob.mjs +33 -0
  152. package/packs/base/hooks/lib/hook-log.mjs +100 -0
  153. package/packs/base/hooks/lib/house.py +77 -0
  154. package/packs/base/hooks/lib/languages.mjs +66 -0
  155. package/packs/base/hooks/lib/layout.mjs +54 -0
  156. package/packs/base/hooks/lib/making-check-selftest.mjs +109 -0
  157. package/packs/base/hooks/lib/near-copies.mjs +76 -0
  158. package/packs/base/hooks/lib/program-read.mjs +196 -0
  159. package/packs/base/hooks/lib/program-writes.mjs +177 -0
  160. package/packs/base/hooks/lib/project.mjs +81 -0
  161. package/packs/base/hooks/lib/prose.mjs +11 -0
  162. package/packs/base/hooks/lib/pushed.mjs +201 -0
  163. package/packs/base/hooks/lib/repo-index.mjs +52 -0
  164. package/packs/base/hooks/lib/secret-patterns.mjs +18 -0
  165. package/packs/base/hooks/lib/selftest.mjs +45 -0
  166. package/packs/base/hooks/lib/shape-code.mjs +126 -0
  167. package/packs/base/hooks/lib/shape.mjs +294 -0
  168. package/packs/base/hooks/lib/shell-writes-selftest.mjs +65 -0
  169. package/packs/base/hooks/lib/shell-writes.mjs +293 -0
  170. package/packs/base/hooks/lib/turn.mjs +81 -0
  171. package/packs/base/hooks/lib/writes.mjs +71 -0
  172. package/packs/base/hooks/making-check.mjs +243 -0
  173. package/packs/base/hooks/making.mjs +106 -0
  174. package/packs/base/hooks/once-only.mjs +150 -0
  175. package/packs/base/hooks/placement-law.mjs +84 -0
  176. package/packs/base/hooks/repo-litter.mjs +75 -0
  177. package/packs/base/hooks/reuse-hint.mjs +75 -0
  178. package/packs/base/hooks/run-hooks.mjs +132 -0
  179. package/packs/base/hooks/secrets-guard.mjs +99 -0
  180. package/packs/base/hooks/shape-law.mjs +133 -0
  181. package/packs/base/hooks/suite-once.mjs +80 -0
  182. package/packs/base/hooks/template-law.mjs +148 -0
  183. package/packs/base/hooks/untrusted-boundary.mjs +53 -0
  184. package/packs/base/pack.json +214 -0
  185. package/packs/base/rules/a-control-is-seen-to-fire.md +27 -0
  186. package/packs/base/rules/behaviour-lives-with-its-kind.md +51 -0
  187. package/packs/base/rules/bug-fix-starts-red.md +25 -0
  188. package/packs/base/rules/field-map-over-if-runs.md +47 -0
  189. package/packs/base/rules/finished-work-lands.md +17 -0
  190. package/packs/base/rules/git-right-first-time.md +19 -0
  191. package/packs/base/rules/instances-by-index-identities-by-id.md +54 -0
  192. package/packs/base/rules/lookup-over-if-chains.md +49 -0
  193. package/packs/base/rules/making-line-first.md +14 -0
  194. package/packs/base/rules/open-items-tagged.md +17 -0
  195. package/packs/base/rules/plan-and-logs.md +22 -0
  196. package/packs/base/rules/references-use-anchors.md +19 -0
  197. package/packs/base/rules/refusals-are-judged.md +18 -0
  198. package/packs/base/rules/reuse-before-writing.md +15 -0
  199. package/packs/base/rules/secrets-never-committed.md +16 -0
  200. package/packs/base/rules/skill-writing.md +23 -0
  201. package/packs/base/rules/split-before-the-limit.md +14 -0
  202. package/packs/base/rules/subagent-dispatch.md +26 -0
  203. package/packs/base/rules/test-only-what-changed.md +17 -0
  204. package/packs/base/rules/test-the-template-once.md +22 -0
  205. package/packs/base/rules/untrusted-content-boundary.md +15 -0
  206. package/packs/base/skills/add-lesson-check/SKILL.md +26 -0
  207. package/packs/base/skills/fix-from-scan/SKILL.md +25 -0
  208. package/packs/base/skills/land-branch/SKILL.md +24 -0
  209. package/packs/base/skills/make-it-a-template/SKILL.md +23 -0
  210. package/packs/base/skills/pdf-to-md/SKILL.md +25 -0
  211. package/packs/base/skills/pick-tests/SKILL.md +20 -0
  212. package/packs/base/skills/pressure-test-skill/SKILL.md +23 -0
  213. package/packs/base/skills/prove-instances-identical/SKILL.md +37 -0
  214. package/packs/base/tools/shape-symmetry-selftest.mjs +66 -0
  215. package/packs/base/tools/shape-symmetry.mjs +178 -0
  216. package/packs/base/tools/test-verdict.mjs +75 -0
  217. package/packs/ci/checks/ci-permissions-stated.json +18 -0
  218. package/packs/ci/checks/ci-tools-pinned.json +14 -0
  219. package/packs/ci/pack.json +21 -0
  220. package/packs/ci/rules/ci-covers-what-ships.md +20 -0
  221. package/packs/ci/rules/generated-files-have-no-diff.md +15 -0
  222. package/packs/content-site/checks/captcha-is-not-constant.json +27 -0
  223. package/packs/content-site/checks/img-has-size.json +20 -0
  224. package/packs/content-site/checks/page-head-complete.json +26 -0
  225. package/packs/content-site/pack.json +22 -0
  226. package/packs/content-site/rules/content-has-one-source.md +23 -0
  227. package/packs/content-site/rules/media-is-sized.md +24 -0
  228. package/packs/content-site/rules/page-head-is-complete.md +26 -0
  229. package/packs/content-site/rules/public-forms-are-defended.md +27 -0
  230. package/packs/content-site/skills/publish-a-page/SKILL.md +21 -0
  231. package/packs/cpp/checks/cpp-clamp-before-cast.json +16 -0
  232. package/packs/cpp/checks/cpp-find-with-the-library.json +12 -0
  233. package/packs/cpp/checks/cpp-hardened-test-build.json +18 -0
  234. package/packs/cpp/checks/cpp-m-pi-not-standard.json +23 -0
  235. package/packs/cpp/checks/cpp-no-atoi.json +16 -0
  236. package/packs/cpp/checks/cpp-no-const-cast.json +16 -0
  237. package/packs/cpp/checks/cpp-no-float-loop-counter.json +16 -0
  238. package/packs/cpp/checks/cpp-no-getenv-in-product.json +22 -0
  239. package/packs/cpp/checks/cpp-no-mutable-global.json +20 -0
  240. package/packs/cpp/checks/cpp-no-mutable-local-static.json +23 -0
  241. package/packs/cpp/checks/cpp-no-unchecked-fwrite.json +17 -0
  242. package/packs/cpp/checks/cpp-no-using-namespace-in-header.json +19 -0
  243. package/packs/cpp/checks/cpp-no-zero-size-array.json +23 -0
  244. package/packs/cpp/checks/cpp-numbers-pi.json +16 -0
  245. package/packs/cpp/pack.json +22 -0
  246. package/packs/cpp/rules/cpp-absent-and-failed-are-types.md +24 -0
  247. package/packs/cpp/rules/cpp-builds-everywhere.md +26 -0
  248. package/packs/cpp/rules/cpp-faults-only-in-the-test-build.md +21 -0
  249. package/packs/cpp/rules/cpp-find-with-the-library.md +19 -0
  250. package/packs/cpp/rules/cpp-gates-share-one-reader.md +22 -0
  251. package/packs/cpp/rules/cpp-headers-declare.md +22 -0
  252. package/packs/cpp/rules/cpp-numbers-and-casts.md +22 -0
  253. package/packs/cpp/rules/cpp-repeats-become-templates.md +33 -0
  254. package/packs/cpp/rules/cpp-static-analysis-runs.md +22 -0
  255. package/packs/cpp/rules/cpp-thread-contracts-are-code.md +23 -0
  256. package/packs/cpp/skills/cpp-extract-template/SKILL.md +38 -0
  257. package/packs/docker/checks/alpine-with-native-build.json +13 -0
  258. package/packs/docker/checks/compose-db-needs-auth.json +14 -0
  259. package/packs/docker/checks/compose-image-pinned.json +14 -0
  260. package/packs/docker/checks/compose-no-hardcoded-ip.json +12 -0
  261. package/packs/docker/checks/compose-no-host-bind-for-data.json +18 -0
  262. package/packs/docker/checks/compose-no-plaintext-secret.json +13 -0
  263. package/packs/docker/checks/compose-no-swarm-ignored-keys.json +13 -0
  264. package/packs/docker/checks/compose-overlay-not-bridge.json +13 -0
  265. package/packs/docker/checks/compose-service-needs-healthcheck.json +11 -0
  266. package/packs/docker/checks/compose-service-needs-init.json +11 -0
  267. package/packs/docker/checks/copy-needs-chown-with-user.json +17 -0
  268. package/packs/docker/checks/copy-source-before-deps.json +13 -0
  269. package/packs/docker/checks/docker-exec-form.json +16 -0
  270. package/packs/docker/checks/dockerfile-needs-healthcheck.json +17 -0
  271. package/packs/docker/checks/dockerfile-needs-user.json +21 -0
  272. package/packs/docker/checks/dockerignore-has-the-basics.json +21 -0
  273. package/packs/docker/checks/gitattributes-forces-lf.json +17 -0
  274. package/packs/docker/checks/health-checks-nothing.json +25 -0
  275. package/packs/docker/checks/no-crlf-in-scripts.json +15 -0
  276. package/packs/docker/checks/no-latest-base.json +13 -0
  277. package/packs/docker/checks/no-secret-in-image.json +13 -0
  278. package/packs/docker/checks/no-sensitive-file-copy.json +13 -0
  279. package/packs/docker/checks/node-env-before-install.json +13 -0
  280. package/packs/docker/checks/npm-ci-not-install.json +13 -0
  281. package/packs/docker/pack.json +46 -0
  282. package/packs/docker/rules/compose-pinned-and-closed.md +21 -0
  283. package/packs/docker/rules/compose-swarm-safe.md +26 -0
  284. package/packs/docker/rules/docker-exec-form.md +19 -0
  285. package/packs/docker/rules/dockerfile-multistage.md +13 -0
  286. package/packs/docker/rules/dockerfile-production.md +25 -0
  287. package/packs/docker/skills/docker-diagnose/SKILL.md +23 -0
  288. package/packs/dynamic-data/checks/draft-on-the-server.json +27 -0
  289. package/packs/dynamic-data/checks/guard-does-its-job.json +28 -0
  290. package/packs/dynamic-data/checks/key-is-not-a-display-name.json +28 -0
  291. package/packs/dynamic-data/checks/no-code-from-data.json +29 -0
  292. package/packs/dynamic-data/checks/no-collection-from-request.json +27 -0
  293. package/packs/dynamic-data/checks/no-pipeline-from-stored-text.json +27 -0
  294. package/packs/dynamic-data/checks/no-regexp-from-stored-config.json +27 -0
  295. package/packs/dynamic-data/checks/no-template-from-stored-text.json +27 -0
  296. package/packs/dynamic-data/checks/save-takes-named-paths.json +27 -0
  297. package/packs/dynamic-data/pack.json +23 -0
  298. package/packs/dynamic-data/rules/a-list-is-a-saved-query.md +23 -0
  299. package/packs/dynamic-data/rules/definitions-are-validated-data.md +24 -0
  300. package/packs/dynamic-data/rules/every-dynamic-surface-has-a-boundary.md +29 -0
  301. package/packs/dynamic-data/rules/fields-have-owners.md +22 -0
  302. package/packs/dynamic-data/rules/imports-drop-nothing.md +26 -0
  303. package/packs/dynamic-data/rules/one-definition-many-surfaces.md +24 -0
  304. package/packs/dynamic-data/rules/one-fact-one-place.md +28 -0
  305. package/packs/dynamic-data/rules/rules-live-in-the-engine.md +29 -0
  306. package/packs/dynamic-data/rules/saves-are-patches.md +28 -0
  307. package/packs/dynamic-data/rules/tenant-costs-one-document.md +22 -0
  308. package/packs/dynamic-data/skills/design-a-definition/SKILL.md +24 -0
  309. package/packs/fastify/checks/api-routes-versioned.json +28 -0
  310. package/packs/fastify/checks/cookie-host-prefix.json +24 -0
  311. package/packs/fastify/checks/hijack-needs-try.json +28 -0
  312. package/packs/fastify/checks/no-cast-at-route-boundary.json +24 -0
  313. package/packs/fastify/checks/no-db-in-route-file.json +28 -0
  314. package/packs/fastify/checks/no-err-message-to-client.json +24 -0
  315. package/packs/fastify/checks/no-regexp-from-input.json +24 -0
  316. package/packs/fastify/checks/no-trust-proxy-true.json +25 -0
  317. package/packs/fastify/checks/one-error-body.json +26 -0
  318. package/packs/fastify/checks/origin-from-config-not-host.json +31 -0
  319. package/packs/fastify/checks/password-needs-slow-hash.json +30 -0
  320. package/packs/fastify/checks/sec-headers-present.json +28 -0
  321. package/packs/fastify/checks/secrets-compared-constant-time.json +24 -0
  322. package/packs/fastify/checks/sse-needs-error-listener.json +28 -0
  323. package/packs/fastify/checks/user-bytes-need-disposition.json +29 -0
  324. package/packs/fastify/pack.json +41 -0
  325. package/packs/fastify/rules/credentials-and-input.md +23 -0
  326. package/packs/fastify/rules/security-one-switch.md +28 -0
  327. package/packs/fastify/rules/streams-and-hijacks.md +22 -0
  328. package/packs/fastify/rules/tests-use-inject.md +13 -0
  329. package/packs/fastify/rules/three-layers.md +20 -0
  330. package/packs/fastify/rules/trust-config-not-headers.md +24 -0
  331. package/packs/full-stack/checks/no-express-no-vite.json +23 -0
  332. package/packs/full-stack/hooks/stack-guard.mjs +90 -0
  333. package/packs/full-stack/pack.json +76 -0
  334. package/packs/full-stack/rules/stack-is-fastify-and-nextjs.md +20 -0
  335. package/packs/go/checks/go-exec-result-ignored.json +15 -0
  336. package/packs/go/checks/go-unmarshal-error-ignored.json +15 -0
  337. package/packs/go/pack.json +21 -0
  338. package/packs/go/rules/go-errors-are-handled.md +22 -0
  339. package/packs/gpu-painter/checks/dawn-backends-and-validation.json +9 -0
  340. package/packs/gpu-painter/checks/dawn-no-spontaneous.json +10 -0
  341. package/packs/gpu-painter/checks/dawn-present-on-render-thread.json +17 -0
  342. package/packs/gpu-painter/checks/gpu-no-frame-stalls.json +12 -0
  343. package/packs/gpu-painter/checks/no-opengl-link.json +11 -0
  344. package/packs/gpu-painter/checks/no-opengl.json +13 -0
  345. package/packs/gpu-painter/hooks/browser-guard.py +196 -0
  346. package/packs/gpu-painter/pack.json +91 -0
  347. package/packs/gpu-painter/rules/dawn-build-and-shaders.md +27 -0
  348. package/packs/gpu-painter/rules/dawn-device-and-render-thread.md +26 -0
  349. package/packs/gpu-painter/rules/gpu-antialiasing.md +20 -0
  350. package/packs/gpu-painter/rules/gpu-blend-order.md +22 -0
  351. package/packs/gpu-painter/rules/gpu-bloom.md +20 -0
  352. package/packs/gpu-painter/rules/gpu-frame-budget.md +25 -0
  353. package/packs/gpu-painter/rules/gpu-frame-pacing-and-power.md +27 -0
  354. package/packs/gpu-painter/rules/gpu-frame-work.md +30 -0
  355. package/packs/gpu-painter/rules/gpu-golden-images.md +21 -0
  356. package/packs/gpu-painter/rules/gpu-hdr-and-tonemap.md +23 -0
  357. package/packs/gpu-painter/rules/gpu-picking-on-cpu.md +19 -0
  358. package/packs/gpu-painter/rules/gpu-render-lifecycle.md +25 -0
  359. package/packs/gpu-painter/rules/gpu-text-atlas.md +24 -0
  360. package/packs/gpu-painter/rules/gpu-travellers-from-snapshot.md +24 -0
  361. package/packs/gpu-painter/rules/hover-every-pressable.md +25 -0
  362. package/packs/gpu-painter/skills/gpu-capture/SKILL.md +15 -0
  363. package/packs/gpu-painter/skills/gpu-frame-bench/SKILL.md +14 -0
  364. package/packs/gpu-painter/skills/gpu-golden-check/SKILL.md +13 -0
  365. package/packs/gpu-painter/skills/gpu-golden-update/SKILL.md +16 -0
  366. package/packs/gpu-painter/skills/gpu-lifecycle-stress/SKILL.md +15 -0
  367. package/packs/gpu-painter/skills/hover-state/SKILL.md +33 -0
  368. package/packs/hook-proof/checks/hook-catch-must-not-allow.json +16 -0
  369. package/packs/hook-proof/checks/hook-command-no-pipe.json +16 -0
  370. package/packs/hook-proof/checks/hook-exit-1-does-not-block.json +17 -0
  371. package/packs/hook-proof/checks/hook-no-or-true.json +18 -0
  372. package/packs/hook-proof/checks/hook-refusal-on-stderr.json +17 -0
  373. package/packs/hook-proof/pack.json +38 -0
  374. package/packs/hook-proof/rules/a-refusal-is-exit-2.md +28 -0
  375. package/packs/hook-proof/skills/prove-a-hook/SKILL.md +21 -0
  376. package/packs/host-agent/checks/file-path-from-param.json +27 -0
  377. package/packs/host-agent/checks/integrity-check-optional.json +27 -0
  378. package/packs/host-agent/checks/quoted-value-into-config.json +24 -0
  379. package/packs/host-agent/checks/secret-on-argv.json +28 -0
  380. package/packs/host-agent/checks/ssh-verifies-host-key.json +27 -0
  381. package/packs/host-agent/checks/system-file-written-in-place.json +26 -0
  382. package/packs/host-agent/checks/tmp-path-predictable.json +27 -0
  383. package/packs/host-agent/pack.json +22 -0
  384. package/packs/host-agent/rules/root-on-other-machines.md +27 -0
  385. package/packs/html-ui/checks/email-html-escapes.json +25 -0
  386. package/packs/html-ui/checks/external-link-rel.json +21 -0
  387. package/packs/html-ui/checks/no-duplicate-escape.json +26 -0
  388. package/packs/html-ui/checks/no-inline-client-script.json +21 -0
  389. package/packs/html-ui/checks/no-inline-style.json +23 -0
  390. package/packs/html-ui/pack.json +33 -0
  391. package/packs/html-ui/rules/email-html-escapes.md +19 -0
  392. package/packs/html-ui/rules/server-html-escapes-everything.md +22 -0
  393. package/packs/http-api/checks/api-path-versioned.json +31 -0
  394. package/packs/http-api/checks/authz-from-request-body.json +26 -0
  395. package/packs/http-api/checks/client-calls-a-version.json +28 -0
  396. package/packs/http-api/checks/client-ip-not-leftmost-xff.json +28 -0
  397. package/packs/http-api/checks/cors-needs-origin.json +26 -0
  398. package/packs/http-api/checks/csp-not-switched-off.json +28 -0
  399. package/packs/http-api/checks/debug-route-not-shipped.json +26 -0
  400. package/packs/http-api/checks/encrypted-name-plaintext-value.json +26 -0
  401. package/packs/http-api/checks/err-text-stays-server-side.json +27 -0
  402. package/packs/http-api/checks/failure-is-not-empty.json +28 -0
  403. package/packs/http-api/checks/gate-is-not-a-todo.json +27 -0
  404. package/packs/http-api/checks/guard-fails-open.json +28 -0
  405. package/packs/http-api/checks/hmac-over-reserialised-body.json +26 -0
  406. package/packs/http-api/checks/jwt-verify-pins-algorithm.json +26 -0
  407. package/packs/http-api/checks/middleware-skips-without-user.json +26 -0
  408. package/packs/http-api/checks/next-api-route-versioned.json +47 -0
  409. package/packs/http-api/checks/no-security-off-switch.json +28 -0
  410. package/packs/http-api/checks/oauth-state-signed.json +26 -0
  411. package/packs/http-api/checks/one-time-code-compared-raw.json +26 -0
  412. package/packs/http-api/checks/query-cast-is-not-validation.json +28 -0
  413. package/packs/http-api/checks/queue-action-from-client.json +26 -0
  414. package/packs/http-api/checks/rate-limit-one-module.json +28 -0
  415. package/packs/http-api/checks/role-checked-in-one-guard.json +27 -0
  416. package/packs/http-api/checks/route-body-needs-schema.json +31 -0
  417. package/packs/http-api/checks/route-scopes-to-the-caller.json +31 -0
  418. package/packs/http-api/checks/secret-compared-constant-time-any.json +28 -0
  419. package/packs/http-api/checks/secret-in-job-record.json +27 -0
  420. package/packs/http-api/checks/server-fetches-tenant-url.json +30 -0
  421. package/packs/http-api/checks/short-code-needs-limit.json +26 -0
  422. package/packs/http-api/checks/user-url-through-safe-fetch.json +28 -0
  423. package/packs/http-api/checks/webhook-dedupes-event-id.json +30 -0
  424. package/packs/http-api/pack.json +45 -0
  425. package/packs/http-api/rules/adapters-one-db-gateway.md +18 -0
  426. package/packs/http-api/rules/apis-are-versioned.md +27 -0
  427. package/packs/http-api/rules/credentials-handled-safely.md +22 -0
  428. package/packs/http-api/rules/handlers-own-the-work.md +17 -0
  429. package/packs/http-api/rules/health-and-correlation.md +17 -0
  430. package/packs/http-api/rules/one-error-contract.md +17 -0
  431. package/packs/http-api/rules/routes-are-thin.md +17 -0
  432. package/packs/http-api/rules/routes-scope-to-the-caller.md +26 -0
  433. package/packs/http-api/rules/routes-validate-and-answer.md +25 -0
  434. package/packs/http-api/skills/change-an-api/SKILL.md +20 -0
  435. package/packs/http-api/skills/secure-a-route/SKILL.md +21 -0
  436. package/packs/instrument-shell/checks/no-raw-struct-blob.json +23 -0
  437. package/packs/instrument-shell/pack.json +22 -0
  438. package/packs/instrument-shell/rules/fold-keeps-every-route.md +24 -0
  439. package/packs/instrument-shell/rules/quiet-announces-itself.md +22 -0
  440. package/packs/instrument-shell/rules/render-the-extremes.md +25 -0
  441. package/packs/instrument-shell/rules/seams-are-declared.md +27 -0
  442. package/packs/instrument-shell/rules/session-blob-append-only.md +25 -0
  443. package/packs/instrument-shell/skills/gates-from-commit-one/SKILL.md +20 -0
  444. package/packs/instrument-shell/skills/hit-the-painted-control/SKILL.md +18 -0
  445. package/packs/js-ts/checks/async-callback-unguarded.json +26 -0
  446. package/packs/js-ts/checks/background-loop-needs-stop.json +28 -0
  447. package/packs/js-ts/checks/child-process-error-handler.json +28 -0
  448. package/packs/js-ts/checks/entry-registers-shutdown.json +31 -0
  449. package/packs/js-ts/checks/fetch-needs-timeout.json +30 -0
  450. package/packs/js-ts/checks/job-only-in-memory.json +28 -0
  451. package/packs/js-ts/checks/json-only-through-helper.json +29 -0
  452. package/packs/js-ts/checks/line-under-200-chars.json +34 -0
  453. package/packs/js-ts/checks/localhost-default-in-server.json +29 -0
  454. package/packs/js-ts/checks/no-any.json +27 -0
  455. package/packs/js-ts/checks/no-cast-escape-hatches.json +24 -0
  456. package/packs/js-ts/checks/no-console-in-app.json +31 -0
  457. package/packs/js-ts/checks/no-dynamic-import-node-builtin.json +25 -0
  458. package/packs/js-ts/checks/no-inline-binary.json +20 -0
  459. package/packs/js-ts/checks/no-inline-zod-outside-schemas.json +27 -0
  460. package/packs/js-ts/checks/no-local-sleep.json +25 -0
  461. package/packs/js-ts/checks/no-nested-ternary.json +20 -0
  462. package/packs/js-ts/checks/no-secret-in-log.json +24 -0
  463. package/packs/js-ts/checks/no-shell-string-interpolation.json +24 -0
  464. package/packs/js-ts/checks/no-swallowed-errors.json +25 -0
  465. package/packs/js-ts/checks/no-ts-enum.json +20 -0
  466. package/packs/js-ts/checks/process-env-only-in-config.json +31 -0
  467. package/packs/js-ts/checks/race-leaves-work-running.json +23 -0
  468. package/packs/js-ts/checks/reject-as-catch-all-exists.json +24 -0
  469. package/packs/js-ts/checks/secret-has-no-fallback.json +24 -0
  470. package/packs/js-ts/checks/secret-needs-crypto-random.json +24 -0
  471. package/packs/js-ts/checks/server-close-awaited.json +27 -0
  472. package/packs/js-ts/checks/session-user-typed-once.json +24 -0
  473. package/packs/js-ts/checks/switch-is-a-table.json +24 -0
  474. package/packs/js-ts/checks/test-imports-the-source.json +19 -0
  475. package/packs/js-ts/checks/test-name-says-behaviour.json +16 -0
  476. package/packs/js-ts/checks/tsconfig-flags.json +21 -0
  477. package/packs/js-ts/checks/void-needs-catch.json +24 -0
  478. package/packs/js-ts/checks/zod-string-needs-max.json +25 -0
  479. package/packs/js-ts/checks/zod-v4-formats.json +23 -0
  480. package/packs/js-ts/pack.json +84 -0
  481. package/packs/js-ts/rules/await-handled-at-a-boundary.md +66 -0
  482. package/packs/js-ts/rules/env-through-config.md +36 -0
  483. package/packs/js-ts/rules/errors-never-swallowed.md +33 -0
  484. package/packs/js-ts/rules/files-under-300-lines.md +18 -0
  485. package/packs/js-ts/rules/guard-clauses-over-nesting.md +34 -0
  486. package/packs/js-ts/rules/js-repeats-become-templates.md +26 -0
  487. package/packs/js-ts/rules/json-only-through-one-helper.md +62 -0
  488. package/packs/js-ts/rules/named-constants-not-magic-numbers.md +34 -0
  489. package/packs/js-ts/rules/no-any.md +34 -0
  490. package/packs/js-ts/rules/no-console.md +30 -0
  491. package/packs/js-ts/rules/no-floating-promises.md +31 -0
  492. package/packs/js-ts/rules/no-param-mutation.md +28 -0
  493. package/packs/js-ts/rules/no-unsafe-assertions.md +30 -0
  494. package/packs/js-ts/rules/one-logger.md +24 -0
  495. package/packs/js-ts/rules/outbound-calls-have-a-limit.md +20 -0
  496. package/packs/js-ts/rules/parallel-independent-awaits.md +29 -0
  497. package/packs/js-ts/rules/process-lifecycle.md +47 -0
  498. package/packs/js-ts/rules/schema-single-source-of-truth.md +36 -0
  499. package/packs/js-ts/rules/secrets-stay-secret.md +22 -0
  500. package/packs/js-ts/rules/small-functions.md +20 -0
  501. package/packs/js-ts/rules/test-names-describe-behavior.md +28 -0
  502. package/packs/js-ts/rules/tests-can-fail.md +19 -0
  503. package/packs/js-ts/rules/tsconfig-strict.md +32 -0
  504. package/packs/js-ts/rules/typed-exports.md +27 -0
  505. package/packs/js-ts/rules/types-once-at-the-edge.md +18 -0
  506. package/packs/js-ts/rules/unions-over-enums.md +29 -0
  507. package/packs/js-ts/rules/zod-at-route-boundaries.md +40 -0
  508. package/packs/midi/checks/active-sensing-no-pulse.json +24 -0
  509. package/packs/midi/checks/clock-not-at-sample-zero.json +23 -0
  510. package/packs/midi/checks/midi-realtime-first.json +27 -0
  511. package/packs/midi/checks/no-tempo-writeback.json +23 -0
  512. package/packs/midi/checks/position-not-integrated.json +25 -0
  513. package/packs/midi/checks/stub-playhead-advances.json +27 -0
  514. package/packs/midi/checks/sysex-length-literal.json +23 -0
  515. package/packs/midi/checks/sysex-not-on-audio.json +24 -0
  516. package/packs/midi/checks/sysex-survives-realtime.json +27 -0
  517. package/packs/midi/pack.json +22 -0
  518. package/packs/midi/rules/clock-is-a-pulse-stream.md +30 -0
  519. package/packs/midi/rules/imports-count-every-loss.md +25 -0
  520. package/packs/midi/rules/measure-the-clock-in-audio.md +30 -0
  521. package/packs/midi/rules/sync-is-a-mode.md +29 -0
  522. package/packs/midi/rules/sysex-is-a-record.md +29 -0
  523. package/packs/midi/skills/clock-probe/SKILL.md +23 -0
  524. package/packs/midi/skills/clock-probe/clock-law.md +417 -0
  525. package/packs/midi/skills/does-it-sync/SKILL.md +19 -0
  526. package/packs/mongo/checks/bulk-over-many.json +28 -0
  527. package/packs/mongo/checks/created-at-immutable.json +25 -0
  528. package/packs/mongo/checks/driver-outside-gateway.json +24 -0
  529. package/packs/mongo/checks/key-lookup-is-hashed.json +24 -0
  530. package/packs/mongo/checks/mongoclient-cached-and-named.json +34 -0
  531. package/packs/mongo/checks/mongoclient-outside-gateway.json +24 -0
  532. package/packs/mongo/checks/no-count-plus-one-ids.json +25 -0
  533. package/packs/mongo/checks/no-db-write-in-loop.json +25 -0
  534. package/packs/mongo/checks/no-drop-in-code.json +27 -0
  535. package/packs/mongo/checks/no-empty-deletemany.json +26 -0
  536. package/packs/mongo/checks/no-find-reads.json +26 -0
  537. package/packs/mongo/checks/no-input-spread-into-write.json +24 -0
  538. package/packs/mongo/checks/no-mongoose.json +23 -0
  539. package/packs/mongo/checks/no-negation-delete.json +26 -0
  540. package/packs/mongo/checks/no-non-null-after-findone.json +25 -0
  541. package/packs/mongo/checks/objectid-equals.json +26 -0
  542. package/packs/mongo/checks/update-then-reread.json +24 -0
  543. package/packs/mongo/checks/watch-not-poll.json +25 -0
  544. package/packs/mongo/pack.json +52 -0
  545. package/packs/mongo/rules/deletes-name-what-dies.md +21 -0
  546. package/packs/mongo/rules/driver-only-in-gateway.md +26 -0
  547. package/packs/mongo/rules/keys-hashed-input-picked.md +21 -0
  548. package/packs/mongo/rules/one-client-one-pool.md +32 -0
  549. package/packs/mongo/rules/reads-aggregate-writes-bulk.md +25 -0
  550. package/packs/mongo/rules/writes-are-atomic.md +27 -0
  551. package/packs/multi-tenant/checks/role-sees-all-tenants.json +26 -0
  552. package/packs/multi-tenant/checks/tenant-filter-from-url.json +25 -0
  553. package/packs/multi-tenant/pack.json +22 -0
  554. package/packs/multi-tenant/rules/no-role-crosses-a-tenant.md +21 -0
  555. package/packs/multi-tenant/skills/prove-tenant-isolation/SKILL.md +19 -0
  556. package/packs/nginx/checks/modsec-no-blanket-off.json +16 -0
  557. package/packs/nginx/checks/nginx-csp-no-unsafe.json +15 -0
  558. package/packs/nginx/checks/nginx-headers-always.json +15 -0
  559. package/packs/nginx/checks/nginx-keepalive-http11.json +20 -0
  560. package/packs/nginx/checks/nginx-logs-to-stdout.json +15 -0
  561. package/packs/nginx/checks/nginx-no-crlf.json +17 -0
  562. package/packs/nginx/checks/nginx-resolver-ttl.json +19 -0
  563. package/packs/nginx/pack.json +43 -0
  564. package/packs/nginx/rules/modsecurity-tuning.md +22 -0
  565. package/packs/nginx/rules/nginx-production.md +26 -0
  566. package/packs/nginx/skills/waf-rollout/SKILL.md +20 -0
  567. package/packs/python/checks/py-no-bare-except.json +18 -0
  568. package/packs/python/checks/py-no-eval.json +18 -0
  569. package/packs/python/checks/py-no-mutable-default.json +18 -0
  570. package/packs/python/checks/py-no-shell-true.json +18 -0
  571. package/packs/python/checks/py-no-star-import.json +18 -0
  572. package/packs/python/checks/py-no-swallowed-exception.json +18 -0
  573. package/packs/python/checks/py-none-by-is.json +18 -0
  574. package/packs/python/checks/py-open-with-with.json +18 -0
  575. package/packs/python/checks/py-requests-timeout.json +18 -0
  576. package/packs/python/checks/py-subprocess-output-checked.json +18 -0
  577. package/packs/python/checks/py-yaml-safe-load.json +18 -0
  578. package/packs/python/pack.json +26 -0
  579. package/packs/python/rules/python-errors-and-resources.md +26 -0
  580. package/packs/python/rules/python-repeats-become-templates.md +27 -0
  581. package/packs/python/skills/python-extract-template/SKILL.md +35 -0
  582. package/packs/react/checks/dialog-needs-role.json +28 -0
  583. package/packs/react/checks/effect-not-for-derived-state.json +24 -0
  584. package/packs/react/checks/icon-button-needs-name.json +24 -0
  585. package/packs/react/checks/label-needs-a-field.json +24 -0
  586. package/packs/react/checks/ui-failed-fetch-says-so.json +23 -0
  587. package/packs/react/checks/ui-ok-branch-has-an-else.json +23 -0
  588. package/packs/react/pack.json +20 -0
  589. package/packs/react/rules/react-accessible-controls.md +20 -0
  590. package/packs/react/rules/react-state-and-effects.md +23 -0
  591. package/packs/reverse-engineering/checks/ear-constant-tagged.json +23 -0
  592. package/packs/reverse-engineering/checks/no-default-on-distrust.json +24 -0
  593. package/packs/reverse-engineering/checks/no-rom-table-literal.json +29 -0
  594. package/packs/reverse-engineering/checks/prose-never-decides.json +22 -0
  595. package/packs/reverse-engineering/hooks/firmware-out-of-git.mjs +49 -0
  596. package/packs/reverse-engineering/pack.json +35 -0
  597. package/packs/reverse-engineering/rules/a-negative-names-what-was-scanned.md +19 -0
  598. package/packs/reverse-engineering/rules/account-every-term.md +20 -0
  599. package/packs/reverse-engineering/rules/addresses-name-their-space.md +21 -0
  600. package/packs/reverse-engineering/rules/every-law-has-a-source.md +18 -0
  601. package/packs/reverse-engineering/rules/findings-are-withdrawn-in-place.md +17 -0
  602. package/packs/reverse-engineering/rules/firmware-stays-out.md +18 -0
  603. package/packs/reverse-engineering/rules/names-before-code.md +19 -0
  604. package/packs/reverse-engineering/rules/reproduction-or-original.md +18 -0
  605. package/packs/reverse-engineering/rules/two-sources-before-naming.md +21 -0
  606. package/packs/reverse-engineering/skills/bank-census/SKILL.md +18 -0
  607. package/packs/reverse-engineering/skills/gather-sources/SKILL.md +21 -0
  608. package/packs/reverse-engineering/skills/menu-map/SKILL.md +28 -0
  609. package/packs/reverse-engineering/skills/names-first/SKILL.md +41 -0
  610. package/packs/reverse-engineering/skills/re-deliverables/SKILL.md +21 -0
  611. package/packs/reverse-engineering/skills/tripwire-the-law/SKILL.md +19 -0
  612. package/packs/reverse-engineering/tools/lib/unwrap.mjs +115 -0
  613. package/packs/reverse-engineering/tools/names-sweep.mjs +264 -0
  614. package/packs/shell/checks/sh-mktemp.json +18 -0
  615. package/packs/shell/checks/sh-no-backticks.json +18 -0
  616. package/packs/shell/checks/sh-no-eval.json +18 -0
  617. package/packs/shell/checks/sh-no-parse-ls.json +18 -0
  618. package/packs/shell/checks/sh-no-pipe-to-shell.json +18 -0
  619. package/packs/shell/checks/sh-no-program-in-heredoc.json +18 -0
  620. package/packs/shell/checks/sh-quote-arguments.json +18 -0
  621. package/packs/shell/checks/sh-rm-guarded.json +18 -0
  622. package/packs/shell/checks/sh-strict-mode.json +20 -0
  623. package/packs/shell/pack.json +28 -0
  624. package/packs/shell/rules/shell-repeats-become-templates.md +23 -0
  625. package/packs/shell/rules/shell-strict-and-quoted.md +27 -0
  626. package/packs/shell/skills/shell-extract-template/SKILL.md +32 -0
  627. package/packs/shell-hooks/checks/gnu-only-in-shell.json +18 -0
  628. package/packs/shell-hooks/checks/hook-command-anchored.json +12 -0
  629. package/packs/shell-hooks/checks/hook-json-by-tool.json +18 -0
  630. package/packs/shell-hooks/checks/no-bash-c-with-variable.json +20 -0
  631. package/packs/shell-hooks/pack.json +36 -0
  632. package/packs/shell-hooks/rules/hooks-portable-anchored-quoted.md +26 -0
  633. package/packs/sound-design/checks/audio-seed-fixed.json +23 -0
  634. package/packs/sound-design/checks/mix-is-a-crossfade.json +30 -0
  635. package/packs/sound-design/checks/no-hash-in-the-signal.json +30 -0
  636. package/packs/sound-design/checks/no-literal-key-anchor.json +30 -0
  637. package/packs/sound-design/checks/test-compares-a-function-with-itself.json +22 -0
  638. package/packs/sound-design/pack.json +22 -0
  639. package/packs/sound-design/rules/algorithms-are-data.md +26 -0
  640. package/packs/sound-design/rules/meter-before-engine.md +27 -0
  641. package/packs/sound-design/rules/neutral-is-exact.md +26 -0
  642. package/packs/sound-design/rules/test-off-the-easy-point.md +28 -0
  643. package/packs/sound-design/rules/unreachable-is-said.md +25 -0
  644. package/packs/sound-design/rules/waveforms-and-octaves.md +24 -0
  645. package/packs/sound-design/skills/choose-observable/SKILL.md +18 -0
  646. package/packs/sound-design/skills/measure-a-law/SKILL.md +18 -0
  647. package/packs/sound-design/skills/measure-reverb/SKILL.md +19 -0
  648. package/packs/sound-design/skills/spread-probe/SKILL.md +18 -0
  649. package/packs/stellix/checks/no-keyboard-focus.json +12 -0
  650. package/packs/stellix/checks/one-seeded-random.json +16 -0
  651. package/packs/stellix/checks/world-never-includes-painter.json +12 -0
  652. package/packs/stellix/checks/world-no-libm.json +15 -0
  653. package/packs/stellix/checks/world-no-unordered.json +10 -0
  654. package/packs/stellix/hooks/no-shipped-images.mjs +88 -0
  655. package/packs/stellix/pack.json +61 -0
  656. package/packs/stellix/rules/stellix-deterministic-world.md +29 -0
  657. package/packs/stellix/rules/stellix-reset-generated.md +24 -0
  658. package/packs/stellix/rules/stellix-world-snapshot.md +27 -0
  659. package/packs/stellix/rules/world-continuous-collision.md +26 -0
  660. package/packs/stellix/rules/world-fp-determinism.md +28 -0
  661. package/packs/stored-text/checks/no-raw-html-from-data.json +31 -0
  662. package/packs/stored-text/checks/stored-text-libs-only-in-renderer.json +31 -0
  663. package/packs/stored-text/checks/stored-text-renderer-complete.json +24 -0
  664. package/packs/stored-text/checks/stored-text-through-renderer.json +25 -0
  665. package/packs/stored-text/pack.json +41 -0
  666. package/packs/stored-text/rules/stored-text-renders-once.md +26 -0
  667. package/packs/stored-text/skills/render-stored-text/SKILL.md +24 -0
  668. package/packs/synth-creator/checks/timing-from-synthcore.json +24 -0
  669. package/packs/synth-creator/checks/ui-drawn-in-code.json +23 -0
  670. package/packs/synth-creator/hooks/build-guard.mjs +232 -0
  671. package/packs/synth-creator/hooks/build-sweep.mjs +166 -0
  672. package/packs/synth-creator/hooks/frozen-files.mjs +63 -0
  673. package/packs/synth-creator/hooks/idle-wake.mjs +90 -0
  674. package/packs/synth-creator/hooks/protect-vendor.mjs +174 -0
  675. package/packs/synth-creator/hooks/spec-lock.mjs +117 -0
  676. package/packs/synth-creator/hooks/stage-guard.mjs +50 -0
  677. package/packs/synth-creator/hooks/time-guard.mjs +292 -0
  678. package/packs/synth-creator/hooks/user-asks.mjs +165 -0
  679. package/packs/synth-creator/pack.json +136 -0
  680. package/packs/synth-creator/rules/copy-trees-read-only.md +25 -0
  681. package/packs/synth-creator/rules/debug-by-measurement.md +20 -0
  682. package/packs/synth-creator/rules/done-means-fresh-evidence.md +18 -0
  683. package/packs/synth-creator/rules/hooks-and-gates.md +21 -0
  684. package/packs/synth-creator/rules/long-work-in-the-background.md +16 -0
  685. package/packs/synth-creator/rules/timing-from-synthcore.md +16 -0
  686. package/packs/synth-creator/skills/build-step/SKILL.md +125 -0
  687. package/packs/synth-creator/skills/build-through-the-queue/SKILL.md +19 -0
  688. package/packs/synth-creator/tools/freeze.mjs +36 -0
  689. package/packs/tui/checks/tui-entry-restores-terminal.json +27 -0
  690. package/packs/tui/checks/tui-gates-on-tty.json +25 -0
  691. package/packs/tui/checks/tui-no-ris-reset.json +22 -0
  692. package/packs/tui/checks/tui-resize-listener-removed.json +26 -0
  693. package/packs/tui/checks/tui-width-is-state.json +33 -0
  694. package/packs/tui/pack.json +44 -0
  695. package/packs/tui/rules/tui-resize-and-screen.md +25 -0
  696. package/packs/tui/skills/build-tui/SKILL.md +21 -0
  697. package/packs/ui-craft/checks/ui-input-needs-autocomplete.json +23 -0
  698. package/packs/ui-craft/checks/ui-intl-for-dates.json +21 -0
  699. package/packs/ui-craft/checks/ui-no-ai-palette.json +22 -0
  700. package/packs/ui-craft/checks/ui-no-animate-layout.json +22 -0
  701. package/packs/ui-craft/checks/ui-no-assistant-palette.json +23 -0
  702. package/packs/ui-craft/checks/ui-no-bounce-easing.json +22 -0
  703. package/packs/ui-craft/checks/ui-no-custom-cursor.json +22 -0
  704. package/packs/ui-craft/checks/ui-no-emoji-as-ui.json +22 -0
  705. package/packs/ui-craft/checks/ui-no-empty-image.json +21 -0
  706. package/packs/ui-craft/checks/ui-no-eyebrow.json +21 -0
  707. package/packs/ui-craft/checks/ui-no-furniture-text.json +22 -0
  708. package/packs/ui-craft/checks/ui-no-gradient-text.json +22 -0
  709. package/packs/ui-craft/checks/ui-no-index-numbering.json +21 -0
  710. package/packs/ui-craft/checks/ui-no-lorem.json +22 -0
  711. package/packs/ui-craft/checks/ui-no-marketing-buzzword.json +22 -0
  712. package/packs/ui-craft/checks/ui-no-paste-block.json +21 -0
  713. package/packs/ui-craft/checks/ui-no-placeholder-names.json +21 -0
  714. package/packs/ui-craft/checks/ui-no-scroll-hijack.json +21 -0
  715. package/packs/ui-craft/checks/ui-no-side-tab.json +21 -0
  716. package/packs/ui-craft/checks/ui-no-stock-labels.json +22 -0
  717. package/packs/ui-craft/checks/ui-no-transition-all.json +22 -0
  718. package/packs/ui-craft/checks/ui-no-uppercase-table-header.json +21 -0
  719. package/packs/ui-craft/checks/ui-no-zebra-rows.json +22 -0
  720. package/packs/ui-craft/checks/ui-no-zoom-lock.json +21 -0
  721. package/packs/ui-craft/pack.json +43 -0
  722. package/packs/ui-craft/rules/apps-are-not-pages.md +26 -0
  723. package/packs/ui-craft/rules/data-tells-the-truth.md +26 -0
  724. package/packs/ui-craft/rules/dates-and-numbers.md +18 -0
  725. package/packs/ui-craft/rules/forms-never-fight.md +22 -0
  726. package/packs/ui-craft/rules/interface-copy.md +26 -0
  727. package/packs/ui-craft/rules/motion-is-rare.md +31 -0
  728. package/packs/ui-craft/rules/no-generated-look.md +37 -0
  729. package/packs/ui-craft/rules/page-holds-its-frame.md +28 -0
  730. package/packs/ui-craft/rules/page-proved-rendered.md +19 -0
  731. package/packs/ui-craft/rules/pictures-do-a-job.md +25 -0
  732. package/packs/ui-craft/rules/pointer-feedback.md +28 -0
  733. package/packs/ui-craft/rules/screen-answers-one-question.md +24 -0
  734. package/packs/ui-craft/rules/survives-real-data.md +23 -0
  735. package/packs/ui-craft/rules/touch-and-small-screens.md +19 -0
  736. package/packs/ui-craft/rules/type-space-colour.md +26 -0
  737. package/packs/ui-craft/rules/url-holds-the-state.md +19 -0
  738. package/packs/ui-craft/skills/app-screen/SKILL.md +33 -0
  739. package/packs/ui-craft/skills/build-from-reference/SKILL.md +28 -0
  740. package/packs/ui-craft/skills/chart-choice/SKILL.md +34 -0
  741. package/packs/ui-craft/skills/hover-state/SKILL.md +28 -0
  742. package/packs/ui-craft/skills/page-critique/SKILL.md +33 -0
  743. package/packs/ui-craft/skills/prove-page/SKILL.md +23 -0
  744. package/packs/ui-craft/skills/redesign-page/SKILL.md +19 -0
  745. package/packs/ui-craft/skills/ui-code-review/SKILL.md +22 -0
  746. package/packs/ui-craft/skills/write-the-page/SKILL.md +21 -0
  747. package/packs/ui-craft/tools/page-measure.mjs +41 -0
  748. package/packs/web/checks/a11y-img-needs-alt.json +26 -0
  749. package/packs/web/checks/a11y-no-bare-outline-none.json +21 -0
  750. package/packs/web/checks/a11y-no-clickable-div.json +26 -0
  751. package/packs/web/checks/a11y-no-positive-tabindex.json +26 -0
  752. package/packs/web/checks/client-no-api-key.json +29 -0
  753. package/packs/web/checks/client-no-browser-global-at-module-scope.json +28 -0
  754. package/packs/web/checks/client-no-server-import.json +31 -0
  755. package/packs/web/checks/client-no-window-location-nav.json +28 -0
  756. package/packs/web/checks/css-no-inline-style.json +30 -0
  757. package/packs/web/checks/ds-pages-compose-primitives.json +28 -0
  758. package/packs/web/checks/key-from-index.json +23 -0
  759. package/packs/web/checks/prodbuild-no-cdn-runtime-deps.json +21 -0
  760. package/packs/web/checks/prodbuild-no-dev-flags.json +21 -0
  761. package/packs/web/checks/prodbuild-no-remote-fonts.json +22 -0
  762. package/packs/web/checks/rcss-button-cursor.json +30 -0
  763. package/packs/web/checks/rcss-no-100vw.json +21 -0
  764. package/packs/web/checks/rcss-no-fixed-wide-width.json +21 -0
  765. package/packs/web/checks/rcss-viewport-meta.json +28 -0
  766. package/packs/web/checks/secret-not-in-web-storage.json +25 -0
  767. package/packs/web/checks/tw-no-raw-hex-in-markup.json +34 -0
  768. package/packs/web/checks/wp-hero-not-lazy.json +27 -0
  769. package/packs/web/checks/wp-img-needs-dimensions.json +26 -0
  770. package/packs/web/pack.json +73 -0
  771. package/packs/web/rules/accessibility.md +26 -0
  772. package/packs/web/rules/client-boundaries.md +23 -0
  773. package/packs/web/rules/production-build.md +22 -0
  774. package/packs/web/rules/secrets-not-in-the-browser.md +18 -0
  775. package/packs/web/rules/styles-live-in-stylesheets.md +23 -0
  776. package/packs/web/rules/tailwind-v4.md +23 -0
  777. package/packs/web/rules/ui-primitives-one-module.md +30 -0
  778. package/packs/web/rules/web-performance.md +21 -0
  779. package/packs/web/skills/design-direction/SKILL.md +30 -0
  780. package/packs/web/skills/design-review/SKILL.md +28 -0
  781. package/packs/web/skills/pick-rendering-mode/SKILL.md +21 -0
  782. package/packs/web/skills/preflight-build/SKILL.md +23 -0
  783. package/packs/web/skills/seo-audit/SKILL.md +22 -0
  784. package/packs/websocket/checks/no-token-in-query.json +26 -0
  785. package/packs/websocket/checks/stale-socket-deletes-new-entry.json +25 -0
  786. package/packs/websocket/checks/ws-identity-from-message.json +26 -0
  787. package/packs/websocket/pack.json +21 -0
  788. package/packs/websocket/rules/identity-comes-from-the-connection.md +24 -0
  789. package/packs/writing/checks/ascii-no-em-dash.json +17 -0
  790. package/packs/writing/checks/no-copula-dodging.json +18 -0
  791. package/packs/writing/checks/no-dramatic-colon.json +18 -0
  792. package/packs/writing/checks/no-not-x-but-y.json +18 -0
  793. package/packs/writing/checks/no-participial-opener.json +18 -0
  794. package/packs/writing/checks/no-pseudo-wisdom.json +18 -0
  795. package/packs/writing/checks/no-slop-words.json +18 -0
  796. package/packs/writing/checks/no-stock-connectors.json +18 -0
  797. package/packs/writing/checks/no-time-or-date.json +27 -0
  798. package/packs/writing/checks/no-trailing-ing.json +18 -0
  799. package/packs/writing/checks/no-vague-attribution.json +18 -0
  800. package/packs/writing/pack.json +43 -0
  801. package/packs/writing/rules/ascii-no-em-dash.md +21 -0
  802. package/packs/writing/rules/cut-the-padding.md +20 -0
  803. package/packs/writing/rules/direct-voice.md +22 -0
  804. package/packs/writing/rules/no-cargo-cult.md +16 -0
  805. package/packs/writing/rules/no-scaffolding.md +19 -0
  806. package/packs/writing/rules/no-stock-language.md +27 -0
  807. package/packs/writing/rules/no-time-or-date.md +18 -0
  808. package/packs/writing/rules/rhythm-like-talk.md +20 -0
  809. package/packs/writing/rules/write-from-your-own-corner.md +20 -0
  810. package/packs/writing/skills/argument-post/SKILL.md +28 -0
  811. package/packs/writing/skills/humanize/SKILL.md +28 -0
  812. package/packs/writing/skills/launch-post/SKILL.md +38 -0
  813. package/packs/writing/skills/pick-subreddit/SKILL.md +69 -0
  814. package/packs/writing/skills/post-voice/SKILL.md +22 -0
  815. package/packs/writing/skills/reddit-post/SKILL.md +63 -0
  816. package/packs/writing/skills/reddit-title/SKILL.md +23 -0
  817. package/packs/writing/skills/reply-moves/SKILL.md +40 -0
  818. package/packs/writing/skills/reply-stance/SKILL.md +23 -0
  819. package/packs/writing/skills/should-i-reply/SKILL.md +21 -0
  820. package/packs/zod/hooks/schemas-only.mjs +53 -0
  821. package/packs/zod/pack.json +44 -0
  822. package/packs/zod/rules/env-shapes-only.md +14 -0
  823. package/packs/zod/rules/zod-4-schemas.md +14 -0
  824. package/profiles/stellix.layout.json +315 -0
  825. package/profiles/sub37.layout.json +247 -0
  826. package/prompts/scan-review.md +40 -0
  827. package/prompts/survey.md +82 -0
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": "cpp-clamp-before-cast",
3
+ "why": "Casting a NaN or an out-of-range float to an integer is undefined, so a clamp after the cast comes too late. Clamp the float, then cast, and check a computed value is finite first.",
4
+ "rule": ".claude/rules/cpp-numbers-and-casts.md",
5
+ "concepts": [
6
+ "cpp"
7
+ ],
8
+ "globs": [],
9
+ "exclude": [
10
+ "**/build/**"
11
+ ],
12
+ "code": true,
13
+ "pattern": "std::(?:clamp|min|max)(?:<\\w+>)?\\s*\\(\\s*(?:-?[\\w.]+\\s*,\\s*)?(?:(?:int|long|int\\d+_t|size_t)\\s*\\(|static_cast<\\s*(?:int|long|std::int\\d+_t|int\\d+_t|std::size_t|size_t)\\s*>\\s*\\()(?!\\s*std::l+r(?:ound|int)\\b)(?=[^;\\n]*(?:\\d\\.\\d|std::(?:floor|ceil|round|trunc|log|log2|log10|sqrt|pow|exp)\\b|float\\s*\\(|double\\s*\\(|/))",
14
+ "bad": "const int steps = std::clamp (int (dist / 0.25f), 8, 240);",
15
+ "good": "const int steps = int (std::clamp (dist / 0.25f, 8.0f, 240.0f));\nstd::clamp (int (std::lround (x)), 0, 4);\nstd::max (0, int (list.size()) - 1);"
16
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "cpp-find-with-the-library",
3
+ "why": "A search loop over a list, compared on one member, is short enough to be copied everywhere, and every copy treats a miss its own way. std::ranges::find with a projection says it in one call; a search used twice is one named function.",
4
+ "rule": ".claude/rules/cpp-find-with-the-library.md",
5
+ "concepts": ["cpp"],
6
+ "globs": [],
7
+ "exclude": ["**/build/**"],
8
+ "code": true,
9
+ "pattern": "for\\s*\\(\\s*(?:const\\s+)?auto\\s*&&?\\s*(\\w+)\\s*:\\s*[^;{}\\n]+\\)\\s*\\{?\\s*if\\s*\\(\\s*\\1\\s*(?:\\.|->)\\s*\\w+\\s*==",
10
+ "bad": "for (const auto& c : shown().controls) if (c.id == id) return &c;",
11
+ "good": "const auto it = std::ranges::find (controls, id, &Control::id);\nfor (const auto& c : controls) total += c.width;\nfor (const auto& c : controls) if (c.width > limit) wide.push_back (c);"
12
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "id": "cpp-hardened-test-build",
3
+ "why": "Standard library hardening turns an out-of-range index into a stop instead of silent memory access. A test build should have it.",
4
+ "rule": ".claude/rules/cpp-absent-and-failed-are-types.md",
5
+ "concepts": [],
6
+ "globs": [
7
+ "**/CMakePresets.json"
8
+ ],
9
+ "exclude": [],
10
+ "code": false,
11
+ "pattern": "\"CMAKE_CXX_FLAGS\"\\s*:",
12
+ "bad": "{\"CMAKE_CXX_FLAGS\": \"-O2\"}",
13
+ "good": "{\"CMAKE_CXX_FLAGS\": \"-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_FAST\"}",
14
+ "mode": "needs",
15
+ "needs": [
16
+ "_LIBCPP_HARDENING_MODE|_GLIBCXX_ASSERTIONS"
17
+ ]
18
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "id": "cpp-m-pi-not-standard",
3
+ "why": "M_PI is not standard C++: MSVC hides it, and the missing name cascades into strange errors. std::numbers has it.",
4
+ "rule": ".claude/rules/cpp-builds-everywhere.md",
5
+ "globs": [
6
+ "**/*.cpp",
7
+ "**/*.cc",
8
+ "**/*.h",
9
+ "**/*.hpp",
10
+ "**/*.mm"
11
+ ],
12
+ "exclude": [
13
+ "**/build/**",
14
+ "**/out/**",
15
+ "**/_deps/**",
16
+ "**/JUCE/**",
17
+ "**/node_modules/**"
18
+ ],
19
+ "pattern": "\\bM_(?:PI|PI_2|PI_4|E|SQRT2|LN2)\\b",
20
+ "bad": "const double w = 2.0 * M_PI * f;",
21
+ "good": "const double w = 2.0 * std::numbers::pi * f;",
22
+ "code": true
23
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": "cpp-no-atoi",
3
+ "why": "atoi cannot report failure, and stoi reports it by throwing, so neither belongs on text the program did not write itself.",
4
+ "rule": ".claude/rules/cpp-absent-and-failed-are-types.md",
5
+ "concepts": [
6
+ "cpp"
7
+ ],
8
+ "globs": [],
9
+ "exclude": [
10
+ "**/build/**"
11
+ ],
12
+ "code": true,
13
+ "pattern": "(?<![\\w.>])(?:std::)?(?:atoi|atol|atoll|atof)\\s*\\(|\\bstd::sto(?:i|l|ll|ul|ull|f|d|ld)\\s*\\(",
14
+ "bad": "const int n = std::atoi (argv[1]);",
15
+ "good": "const auto [p, ec] = std::from_chars (s.data(), s.data() + s.size(), n);"
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": "cpp-no-const-cast",
3
+ "why": "const is a promise to the caller, and the compiler keeps trusting it after the cast has broken it. Take a non-const reference, or mark what really changes mutable.",
4
+ "rule": ".claude/rules/cpp-numbers-and-casts.md",
5
+ "concepts": [
6
+ "cpp"
7
+ ],
8
+ "globs": [],
9
+ "exclude": [
10
+ "**/build/**"
11
+ ],
12
+ "code": true,
13
+ "pattern": "\\bconst_cast\\s*<",
14
+ "bad": "auto& rng = const_cast<World&> (w).random();",
15
+ "good": "World& ww = world;"
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": "cpp-no-float-loop-counter",
3
+ "why": "A float counter drifts, so the trip count depends on accumulated rounding. Count integers and compute the value.",
4
+ "rule": ".claude/rules/cpp-numbers-and-casts.md",
5
+ "concepts": [
6
+ "cpp"
7
+ ],
8
+ "globs": [],
9
+ "exclude": [
10
+ "**/build/**"
11
+ ],
12
+ "code": true,
13
+ "pattern": "\\bfor\\s*\\(\\s*(?:const\\s+)?(?:float|double)\\s+\\w+\\s*=[^;\\n]*;[^;\\n]*;\\s*\\w+\\s*(?:\\+=|-=|\\*=|/=|\\+\\+|--)",
14
+ "bad": "for (float mag = lo; mag <= hi + 1e-4f; mag += 0.06f) {",
15
+ "good": "for (int k = 0; k < steps; k++) { const float mag = lo + float (k) * step; }\nfor (float v : values) total += v;"
16
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "cpp-no-getenv-in-product",
3
+ "why": "A shipped binary must not read switches from the environment: each one is a branch no customer needs, and some make it hang or lift a safety limit. Configuration comes in through one place; a test fault lives in the test build.",
4
+ "rule": ".claude/rules/cpp-faults-only-in-the-test-build.md",
5
+ "concepts": [
6
+ "cpp"
7
+ ],
8
+ "globs": [],
9
+ "exclude": [
10
+ "**/tests/**",
11
+ "**/test/**",
12
+ "**/probes/**",
13
+ "**/gates/**",
14
+ "**/harness/**",
15
+ "**/tools/**",
16
+ "**/build/**"
17
+ ],
18
+ "code": true,
19
+ "pattern": "(?<![\\w.>])(?:std::)?(?:secure_)?getenv\\s*\\(",
20
+ "bad": "const bool faultLate = std::getenv (\"APP_FAULT_LATE\") != nullptr;\nif (const char* e = getenv (\"APP_WORKERS\")) n = parse (e);",
21
+ "good": "const Config cfg = Config::fromArgs (argc, argv);"
22
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "id": "cpp-no-mutable-global",
3
+ "why": "A mutable global can be written by anything, from any thread, in any order. Own it in a class and pass it in.",
4
+ "rule": ".claude/rules/cpp-thread-contracts-are-code.md",
5
+ "concepts": [
6
+ "cpp"
7
+ ],
8
+ "globs": [],
9
+ "exclude": [
10
+ "**/tests/**",
11
+ "**/test/**",
12
+ "**/probes/**",
13
+ "**/build/**"
14
+ ],
15
+ "code": true,
16
+ "pattern": "^(?:inline[ \\t]+|static[ \\t]+)?(?!const\\b|constexpr\\b|constinit\\b|using\\b|typedef\\b|template\\b|namespace\\b|class\\b|struct\\b|enum\\b|union\\b|return\\b|extern\\b|public\\b|private\\b|protected\\b|friend\\b|thread_local\\b|std::atomic\\b|std::mutex\\b|std::recursive_mutex\\b|std::once_flag\\b|void\\b|else\\b|goto\\b|delete\\b|throw\\b|case\\b)[A-Za-z_][\\w:]*(?:<[^;()\\n]*>)?[ \\t*&]+[A-Za-z_]\\w*[ \\t]*(?:\\[[^\\]\\n]*\\][ \\t]*)*(?:=(?!=)|\\{[^}\\n]*\\}[ \\t]*;|;)",
17
+ "bad": "int gCount = 0;\nstd::vector<Item> gItems;\ninline bool useOldLayout = false;\nSettings gNow;",
18
+ "good": "const int kMax = 4;\nstd::atomic<int> gHits { 0 };\nstd::mutex gLock;\nint f();",
19
+ "flags": "m"
20
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "id": "cpp-no-mutable-local-static",
3
+ "why": "A mutable static is one value for the whole process, shared by every instance and every thread, with nothing to say so. Pass the state in, or make it atomic.",
4
+ "rule": ".claude/rules/cpp-thread-contracts-are-code.md",
5
+ "concepts": [
6
+ "cpp"
7
+ ],
8
+ "globs": [],
9
+ "exclude": [
10
+ "**/tests/**",
11
+ "**/test/**",
12
+ "**/probes/**",
13
+ "**/gates/**",
14
+ "**/harness/**",
15
+ "**/tools/**",
16
+ "**/build/**"
17
+ ],
18
+ "code": true,
19
+ "pattern": "^[ \\t]+(?:[^\\n]*[;{][ \\t]*)?static[ \\t]+(?!const\\b|constexpr\\b|constinit\\b|inline\\b|void\\b|assert\\b|std::atomic\\b|std::once_flag\\b|std::mutex\\b)[\\w:<>,*& ]+?[ \\t]+\\w+[ \\t]*(?:\\[[^\\]\\n]*\\][ \\t]*)*(?:=|\\{|;)",
20
+ "bad": " static std::vector<int> all; static bool built = false;",
21
+ "good": " static const std::vector<int> table = make();\n static std::atomic<int> count { 0 };\n static Impl& instance();",
22
+ "flags": "m"
23
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "id": "cpp-no-unchecked-fwrite",
3
+ "why": "A truncated output file is read later as data, far from the failure. Check what was written.",
4
+ "rule": ".claude/rules/cpp-absent-and-failed-are-types.md",
5
+ "concepts": [
6
+ "cpp"
7
+ ],
8
+ "globs": [],
9
+ "exclude": [
10
+ "**/build/**"
11
+ ],
12
+ "code": true,
13
+ "pattern": "(?:^|[;{}])[ \\t]*(?:std::)?fwrite\\s*\\(",
14
+ "bad": "std::fwrite (a.data(), 4, a.size(), f);",
15
+ "good": "if (std::fwrite (b, 1, n, f) != n) return false;",
16
+ "flags": "m"
17
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "id": "cpp-no-using-namespace-in-header",
3
+ "why": "A using directive in a header changes name lookup in every file that includes it.",
4
+ "rule": ".claude/rules/cpp-headers-declare.md",
5
+ "concepts": [],
6
+ "globs": [
7
+ "**/*.h",
8
+ "**/*.hh",
9
+ "**/*.hpp"
10
+ ],
11
+ "exclude": [
12
+ "**/build/**"
13
+ ],
14
+ "code": true,
15
+ "pattern": "^using[ \\t]+namespace\\b",
16
+ "bad": "using namespace app;",
17
+ "good": "namespace e = app::engines;\nvoid f() {\n using namespace detail;\n}",
18
+ "flags": "m"
19
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "id": "cpp-no-zero-size-array",
3
+ "why": "GCC allows an empty array as an extension, and MSVC refuses it, so the build breaks on Windows only.",
4
+ "rule": ".claude/rules/cpp-builds-everywhere.md",
5
+ "globs": [
6
+ "**/*.cpp",
7
+ "**/*.cc",
8
+ "**/*.h",
9
+ "**/*.hpp",
10
+ "**/*.mm"
11
+ ],
12
+ "exclude": [
13
+ "**/build/**",
14
+ "**/out/**",
15
+ "**/_deps/**",
16
+ "**/JUCE/**",
17
+ "**/node_modules/**"
18
+ ],
19
+ "pattern": "\\w+\\s+\\w+\\s*\\[\\s*\\]\\s*=\\s*\\{\\s*\\}\\s*;",
20
+ "bad": "inline constexpr Preset kFactory[] = {};",
21
+ "good": "inline constexpr Preset kFactory[] = { Preset {} };",
22
+ "code": true
23
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": "cpp-numbers-pi",
3
+ "why": "A constant typed by hand comes in several spellings and precisions. std::numbers has them.",
4
+ "rule": ".claude/rules/cpp-numbers-and-casts.md",
5
+ "concepts": [
6
+ "cpp"
7
+ ],
8
+ "globs": [],
9
+ "exclude": [
10
+ "**/build/**"
11
+ ],
12
+ "code": true,
13
+ "pattern": "(?<![\\w.])(?:3\\.14159\\d*|6\\.2831\\d*|1\\.5707\\d*|0\\.70710\\d*|1\\.41421\\d*|2\\.71828\\d*|0\\.69314\\d*)(?:[fFlL])?\\b",
14
+ "bad": "const float tau = 2.0f * 3.14159265f;",
15
+ "good": "const float tau = 2.0f * std::numbers::pi_v<float>;"
16
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "cpp",
3
+ "version": "1.0.0",
4
+ "description": "Any C++ project: what is repeated becomes a template, in the forms C++ has for it (a factory, a shared header, a table and a loop, a class template), gates and probes share one reader, and the library does the finding.",
5
+ "type": "stock",
6
+ "author": "claude-packs",
7
+ "license": "MIT",
8
+ "homepage": "https://github.com/TheDecipherist/claude-packs",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/TheDecipherist/claude-packs.git",
12
+ "directory": "packs/cpp"
13
+ },
14
+ "keywords": [
15
+ "cpp",
16
+ "c++",
17
+ "templates"
18
+ ],
19
+ "engines": {
20
+ "claude-packs": ">=0.24.0"
21
+ }
22
+ }
@@ -0,0 +1,24 @@
1
+ ---
2
+ # concepts: cpp
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # "Maybe absent" and "may fail" are in the type
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Say "maybe absent" with `std::optional`, or a named index type, in new code.
12
+ - Mark a function whose result says whether it worked `[[nodiscard]]`, and return `std::expected` or a result type where the caller must decide.
13
+ - Parse text with `std::from_chars`, and handle what it returns.
14
+ - Check every write that matters, and close files through RAII.
15
+ - Build tests with standard library hardening on.
16
+
17
+ Never do:
18
+ - Use `-1` as "none" in new code, or index with it.
19
+ - Let a cast to `size_t` stand in for a bounds check.
20
+ - Open a file with no `else`: a failed save is lost silently.
21
+ </constraints>
22
+
23
+ ## Check
24
+ `cpp-no-atoi`, `cpp-no-unchecked-fwrite`, `cpp-hardened-test-build`.
@@ -0,0 +1,26 @@
1
+ ---
2
+ paths:
3
+ - "**/*.cpp"
4
+ - "**/*.cc"
5
+ - "**/*.h"
6
+ - "**/*.hpp"
7
+ - "**/*.mm"
8
+ - "**/CMakeLists.txt"
9
+ - "**/*.cmake"
10
+ ---
11
+
12
+ # A project builds on every platform it claims, from a fresh clone
13
+
14
+ <constraints>
15
+ Always do:
16
+ - Make a fresh clone configure with no setup: use a local dependency if it is there, and fetch a pinned version if not.
17
+ - Build on each platform you ship for, in CI where you can. A Linux binary proves nothing on Windows.
18
+ - Build a console tool as a console app: a GUI target wants `WinMain` on Windows.
19
+ - Use fonts that exist everywhere, or ship one.
20
+ - Build with `-Wshadow`, which MSVC reports as C4456 anyway.
21
+
22
+ Never do:
23
+ - Commit a `:Zone.Identifier` file: legal on Linux, an invalid path that breaks checkout on Windows.
24
+ - Hard-code a path that exists on one machine, with no fallback.
25
+ - Rely on a compiler extension.
26
+ </constraints>
@@ -0,0 +1,21 @@
1
+ ---
2
+ # concepts: cpp
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # A planted fault and a test lever compile only in the test build
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Plant faults through one macro or one `constexpr` flag that is false outside the test build, so the branch is gone from the shipped binary.
12
+ - Read the environment in one place, at start-up, into one configuration object.
13
+ - Prove it with a release gate: search the shipped binary for the fault names and the test prefix.
14
+
15
+ Never do:
16
+ - Call `getenv` in product code, least of all on a hot path.
17
+ - Ship a switch that can hang the program, change its output or lift a safety limit.
18
+ </constraints>
19
+
20
+ ## Check
21
+ `cpp-no-getenv-in-product`.
@@ -0,0 +1,19 @@
1
+ ---
2
+ # concepts: cpp
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Find with the library: a search loop is written once, if at all
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Find an element with `std::ranges::find` and a projection, or `std::ranges::find_if`: `std::ranges::find (controls, id, &Control::id)`.
12
+ - Wrap a search used in more than one place in one named function: `controlById (id)`.
13
+
14
+ Never do:
15
+ - Write `for (const auto& c : list) if (c.id == id)` by hand: the loop is short, so it gets copied, and each copy treats a miss its own way.
16
+ </constraints>
17
+
18
+ ## Check
19
+ `.claude/checks/cpp-find-with-the-library.json` refuses a new hand-written search loop.
@@ -0,0 +1,22 @@
1
+ ---
2
+ # concepts: cpp, tests
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Gates, probes and tests share one reader: find, press, drag and read are written once
8
+
9
+ Measured on a real C++ repo: the same find, press, drag and read lambdas were written at the top of five gates, and the same render loop and WAV writer in a dozen probes. A fix to one reached none of the others.
10
+
11
+ <constraints>
12
+ Always do:
13
+ - Keep one harness header for the project's gates and probes: finding a control by its ID, pressing, dragging, reading a value, rendering, writing a file.
14
+ - Start a new gate from the harness: it holds only what this gate measures.
15
+ - Move a helper into the harness the second time it is needed, and take the first copy out in the same change.
16
+ - Walk one control of each template. Prove the rest with a read of the table (`test-the-template-once`).
17
+
18
+ Never do:
19
+ - Open a gate with its own lambdas for what the harness does.
20
+ - Copy a gate to start the next one.
21
+ - Press, drag or render every instance of one template in a loop: `one-walk-per-template` refuses it.
22
+ </constraints>
@@ -0,0 +1,22 @@
1
+ ---
2
+ # concepts: cpp
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # A header declares and stands alone; a class that outgrows a file gets fewer jobs
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Keep function bodies past a few lines in a `.cpp`, unless they are templates or on a hot path.
12
+ - Make every header compile alone: include what it uses. Prove it with `CMAKE_VERIFY_INTERFACE_HEADER_SETS` or one `-fsyntax-only` per header.
13
+ - Split a class that outgrows a file into smaller classes with one job each.
14
+
15
+ Never do:
16
+ - Cut a class into fragments with `#include` inside its body, or `.inc` parts, to get under the line limit.
17
+ - Write `using namespace` at file scope in a header.
18
+ - Depend on include order.
19
+ </constraints>
20
+
21
+ ## Check
22
+ `cpp-no-using-namespace-in-header`; `file-size-guard` counts `.inc`, `.inl`, `.ipp` and `.tpp`.
@@ -0,0 +1,22 @@
1
+ ---
2
+ # concepts: cpp
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Numbers have names, and casts come after the range check
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Name a number that means something, with its unit, as a `constexpr`. A formula's own coefficients may stay, with their source.
12
+ - Use `std::numbers` for mathematical constants.
13
+ - Check a computed float is finite, clamp it, then cast it.
14
+ - Count loops with integers, and compute the value from the count.
15
+
16
+ Never do:
17
+ - Cast a float to an integer before its range is known.
18
+ - Write through a `const_cast`.
19
+ </constraints>
20
+
21
+ ## Check
22
+ `cpp-clamp-before-cast`, `cpp-numbers-pi`, `cpp-no-const-cast`, `cpp-no-float-loop-counter`.
@@ -0,0 +1,33 @@
1
+ ---
2
+ # concepts: cpp
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Anything repeated in C++ becomes a template: pick the form that fits the repeat
8
+
9
+ anything found repeated should have something that makes it reusable and template-like. Measured on a real C++ repo: 950 copies in 302 repeats, almost none of them whole classes. They were descriptors filled field by field, helpers copied from file to file, and tables written as calls.
10
+
11
+ <constraints>
12
+ Always do:
13
+ - Match the repeat to its form:
14
+ - An object filled field by field (`bd.label = ...; bd.size = ...; bd.usage = ...;`): one factory, `makeBuffer (device, label, size, usage)`, that returns it built.
15
+ - A lambda or helper in more than one file: one free function in the header those files already share, or a new one named for what it does.
16
+ - A block with the same statements and other names: one function, with what differs as its parameters. `template-law` and `scan` list what differs.
17
+ - One call repeated with other arguments: a `constexpr std::array` of rows and one loop.
18
+ - Near-identical classes: one class template over a traits struct, or one base class holding what they share. The class keeps only what is its own.
19
+ - Near-identical pages, panels or views: one builder that reads a table of rows.
20
+ - Keep the data in the table and the code in the template: a new instance is a new row, with no new code.
21
+ - Put the template where every user already includes from, so nobody needs a copy to reach it.
22
+ - Name the template for what it builds, never for where it was first used.
23
+
24
+ Never do:
25
+ - Copy a block and change its names. `template-law` compares shapes with names, numbers and strings stripped.
26
+ - Use a macro where a function, a `constexpr` table or a template does the job. A macro is right only to stamp out rows a table cannot express.
27
+ - Add a flag parameter to merge two things that are different. Two kinds with different behaviour are two kinds (`behaviour-lives-with-its-kind`).
28
+ - Put a `std::function` or a virtual call in a hot inner loop to share code: use a template parameter there.
29
+ </constraints>
30
+
31
+ ## Check
32
+ - `template-law` refuses a new copy, with the copies and what differs. The `cpp-extract-template` skill walks the change.
33
+ - `npx --no-install @thedecipherist/claude-packs scan` lists what a project already repeats, and the template each one becomes.
@@ -0,0 +1,22 @@
1
+ ---
2
+ # concepts: cpp, build
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Static analysis runs in the path of landing work, over every header
8
+
9
+ A check that is not in the path of landing work is a check that ran once.
10
+
11
+ <constraints>
12
+ Always do:
13
+ - Run `clang-tidy` on changed files before landing, and fail loudly if the tool is missing.
14
+ - Set `HeaderFilterRegex` to the project's own root, so every header is read, `include/` folders too. Test it: name a header and see a finding.
15
+ - Build with `-Wall -Wextra -Wpedantic -Wshadow -Wconversion -Wdouble-promotion -Werror`, in a preset, and keep sanitizer presets (`asan`, `ubsan`, `tsan`).
16
+ - Format with `.clang-format`: `ColumnLimit: 120`, `AllowShortBlocksOnASingleLine: Never`, `AllowShortIfStatementsOnASingleLine: Never`, `AllowShortLoopsOnASingleLine: false`.
17
+ - Turn a tidy check off only with a reason as narrow as the switch.
18
+
19
+ Never do:
20
+ - Anchor a header filter to a relative path: a compile database gives absolute ones, so it matches nothing and reports clean.
21
+ - Count a run that read no files as a pass.
22
+ </constraints>
@@ -0,0 +1,23 @@
1
+ ---
2
+ # concepts: cpp
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # A thread rule is something the compiler or a debug run can reject, not a comment
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Say which thread a function runs on with an assert at its top, in debug builds.
12
+ - Mark data behind a lock with a capability annotation (`GUARDED_BY`), and build with `-Wthread-safety` where the compiler has it.
13
+ - Keep a lock and what it guards in one class. Hand out copies, or take a callback that runs under the lock.
14
+ - Own state in an object and pass it in.
15
+
16
+ Never do:
17
+ - Return a reference to data a lock guards.
18
+ - Keep mutable state in a function-local `static` or a global: in a plugin it is shared by every instance.
19
+ - Use `volatile` for synchronisation, or a `recursive_mutex` to avoid thinking about who holds a lock.
20
+ </constraints>
21
+
22
+ ## Check
23
+ `cpp-no-mutable-local-static`, `cpp-no-mutable-global`.
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: cpp-extract-template
3
+ description: Use when template-law refuses C++ code, when scan lists repeated C++, or when copying a C++ class, lambda or block to change it.
4
+ ---
5
+
6
+ # Extract a C++ repeat into one template (one job: pick the C++ form, and move every copy to it)
7
+
8
+ Follow `make-it-a-template`. This skill is its C++ forms.
9
+
10
+ <constraints>
11
+ Always do:
12
+ 1. A struct filled field by field, the same fields each time: a factory.
13
+ ```cpp
14
+ wgpu::Buffer makeBuffer (const wgpu::Device& device, const char* label, uint64_t size, wgpu::BufferUsage usage) {
15
+ wgpu::BufferDescriptor d; d.label = label; d.size = size; d.usage = usage;
16
+ return device.CreateBuffer (&d);
17
+ }
18
+ ```
19
+ 2. A lambda repeated across files: a free function in a shared header. Pass what it captured as arguments, or make it a member of the class every copy sits in.
20
+ 3. One call with other arguments: rows and one loop.
21
+ ```cpp
22
+ struct Row { const char* id; float value; };
23
+ constexpr std::array kRows { Row { "kind", 0.0f }, Row { "key_hi", 87.0f } };
24
+ for (const Row& r : kRows) set (e, r.id, r.value);
25
+ ```
26
+ 4. Classes alike except for a few values: one class template over a traits struct. Except for a few methods: one base class, each kind overriding only what is its own.
27
+ ```cpp
28
+ template <typename Traits> class Pass { /* the shared body reads Traits::kLabel, Traits::kFormat */ };
29
+ ```
30
+ 5. Builders alike (pages, panels, views): one builder over a table of rows, one row per control.
31
+ 6. A hot inner loop: share through a template parameter, never a `std::function` or a virtual call, and null-test the change where the project does.
32
+ 7. Build, then run what the change reaches. A header change reaches everything that includes it, so read the include list before choosing the header.
33
+
34
+ Never do:
35
+ - Move code into a header the copies do not already reach, adding an include that crosses a layer.
36
+ - Use a macro where a function or a template works.
37
+ - Share code between a copy tree and the project: a copy tree stays as its source wrote it (`kind: copy`).
38
+ </constraints>
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "alpine-with-native-build",
3
+ "why": "Alpine (musl) plus native modules (bcrypt, sharp, canvas, better-sqlite3, node-gyp) means compiling in the image with build-base/python3 and prebuilt binaries that do not match. Use node:<version>-slim (Debian) instead.",
4
+ "rule": ".claude/rules/dockerfile-production.md",
5
+ "concepts": [
6
+ "dockerfile"
7
+ ],
8
+ "code": false,
9
+ "flags": "m",
10
+ "pattern": "^\\s*FROM\\s+\\S*alpine[\\s\\S]*?(?:node-gyp|npm\\s+rebuild|apk\\s+add[^\\n]*\\b(?:build-base|g\\+\\+|make|python3)\\b)",
11
+ "bad": "FROM node:24-alpine\nRUN apk add --no-cache python3 make g++\nRUN npm ci",
12
+ "good": "FROM node:24.11.0-slim\nRUN npm ci"
13
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "id": "compose-db-needs-auth",
3
+ "why": "A database with no auth belongs to every container on its network.",
4
+ "rule": ".claude/rules/compose-pinned-and-closed.md",
5
+ "globs": [
6
+ "**/*compose*.yml",
7
+ "**/*compose*.yaml"
8
+ ],
9
+ "exclude": [],
10
+ "pattern": "--bind_ip_all(?![\\s\\S]*--auth)",
11
+ "bad": "command: [\"--replSet\", \"rs0\", \"--bind_ip_all\"]",
12
+ "good": "command: [\"--replSet\", \"rs0\", \"--bind_ip_all\", \"--auth\", \"--keyFile\", \"/run/secrets/k\"]",
13
+ "kind": "security"
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "id": "compose-image-pinned",
3
+ "why": "A floating tag changes under a restart.",
4
+ "rule": ".claude/rules/compose-pinned-and-closed.md",
5
+ "globs": [
6
+ "**/*compose*.yml",
7
+ "**/*compose*.yaml"
8
+ ],
9
+ "exclude": [],
10
+ "pattern": "^\\s*image:\\s*(?:\\S+:latest|[\\w./-]+(?::\\d+)?)\\s*$",
11
+ "bad": " image: mongo:8\n",
12
+ "good": " image: mongo:8.0.4\n",
13
+ "flags": "m"
14
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "compose-no-hardcoded-ip",
3
+ "why": "Container IPs change on every restart, scale and update. The service name is the identity.",
4
+ "rule": ".claude/rules/compose-swarm-safe.md",
5
+ "concepts": [
6
+ "compose"
7
+ ],
8
+ "code": false,
9
+ "pattern": "\\b(?:10(?:\\.\\d{1,3}){3}|172\\.(?:1[6-9]|2\\d|3[01])(?:\\.\\d{1,3}){2}|192\\.168(?:\\.\\d{1,3}){2})\\b|\\b127\\.0\\.0\\.1:\\d",
10
+ "bad": " MONGODB_URI: mongodb://10.0.1.12:27017/app",
11
+ "good": " MONGODB_URI: mongodb://mongo:27017/app"
12
+ }