@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.
- package/CHANGELOG.md +680 -0
- package/LICENSE +21 -0
- package/README.md +316 -2
- package/bin/claude-packs.mjs +204 -0
- package/configurations/base/config.json +85 -0
- package/configurations/cpp/config.json +92 -0
- package/configurations/full-stack/config.json +152 -0
- package/configurations/go/config.json +96 -0
- package/configurations/node/config.json +100 -0
- package/configurations/python/config.json +97 -0
- package/configurations/synth-creator/config.json +148 -0
- package/global/hooks/gnu-shell.mjs +131 -0
- package/global/hooks/lib/program-read.mjs +196 -0
- package/global/hooks/lib/program-writes.mjs +177 -0
- package/global/hooks/lib/shell-writes.mjs +293 -0
- package/global/hooks/shell-traps.mjs +79 -0
- package/global/hooks/version-pin-guard.mjs +280 -0
- package/global/skills/latest-versions/SKILL.md +49 -0
- package/lib/backup.mjs +34 -0
- package/lib/claude-md.mjs +58 -0
- package/lib/config-cli.mjs +36 -0
- package/lib/configs.mjs +145 -0
- package/lib/coverage.mjs +86 -0
- package/lib/custom-packs.mjs +93 -0
- package/lib/doctor.mjs +115 -0
- package/lib/fix-plan.mjs +71 -0
- package/lib/git-tokens.mjs +64 -0
- package/lib/global.mjs +125 -0
- package/lib/hook-proof.mjs +28 -0
- package/lib/hook-timing.mjs +42 -0
- package/lib/hover-gate.mjs +29 -0
- package/lib/kit-lock.mjs +149 -0
- package/lib/layout.mjs +75 -0
- package/lib/logs.mjs +69 -0
- package/lib/manifest.mjs +24 -0
- package/lib/new.mjs +49 -0
- package/lib/once-only-report.mjs +54 -0
- package/lib/pack-manifest.mjs +20 -0
- package/lib/packs.mjs +107 -0
- package/lib/planner.mjs +59 -0
- package/lib/repeats.mjs +65 -0
- package/lib/repo-weight.mjs +28 -0
- package/lib/rules.mjs +40 -0
- package/lib/scan-detect.mjs +94 -0
- package/lib/scan.mjs +168 -0
- package/lib/selftest-cache.mjs +39 -0
- package/lib/settings.mjs +138 -0
- package/lib/shape-cli.mjs +76 -0
- package/lib/shape.mjs +4 -0
- package/lib/suggest.mjs +18 -0
- package/lib/switches.mjs +44 -0
- package/lib/symmetry-doctor.mjs +26 -0
- package/lib/sync.mjs +130 -0
- package/package.json +34 -4
- package/packs/ai/checks/boundary-computes-its-own-hash.json +30 -0
- package/packs/ai/checks/model-call-needs-boundary.json +29 -0
- package/packs/ai/checks/model-id-from-config.json +28 -0
- package/packs/ai/checks/model-output-validated.json +26 -0
- package/packs/ai/pack.json +38 -0
- package/packs/ai/rules/ai-input-sha-boundary.md +31 -0
- package/packs/ai/rules/llm-pipeline-security.md +26 -0
- package/packs/audio-core/checks/denormals-not-in-prepare.json +12 -0
- package/packs/audio-core/checks/dsp-without-apvts.json +12 -0
- package/packs/audio-core/checks/float-phase-or-rate.json +12 -0
- package/packs/audio-core/checks/juce-snap-to-zero-off.json +12 -0
- package/packs/audio-core/checks/keep-werror.json +12 -0
- package/packs/audio-core/checks/no-fast-math.json +14 -0
- package/packs/audio-core/checks/no-locale-change.json +12 -0
- package/packs/audio-core/checks/no-march-native.json +14 -0
- package/packs/audio-core/clang-tidy +28 -0
- package/packs/audio-core/hooks/lib/realtime-checks.mjs +56 -0
- package/packs/audio-core/hooks/param-id-lock.mjs +129 -0
- package/packs/audio-core/hooks/realtime-guard.mjs +67 -0
- package/packs/audio-core/pack.json +187 -0
- package/packs/audio-core/rules/audio-thread-realtime-safe.md +27 -0
- package/packs/audio-core/rules/audio-ui-thread-handoff.md +21 -0
- package/packs/audio-core/rules/boundary-tests-cross-the-boundary.md +16 -0
- package/packs/audio-core/rules/build-flags-safe.md +20 -0
- package/packs/audio-core/rules/cached-parameter-pointers.md +28 -0
- package/packs/audio-core/rules/clang-tidy-core-guidelines.md +21 -0
- package/packs/audio-core/rules/control-reaches-every-surface.md +23 -0
- package/packs/audio-core/rules/cpu-worst-case-per-block.md +26 -0
- package/packs/audio-core/rules/dc-block-after-asymmetry.md +22 -0
- package/packs/audio-core/rules/discrete-params-snap.md +19 -0
- package/packs/audio-core/rules/double-where-precision-matters.md +20 -0
- package/packs/audio-core/rules/filters-stable-under-modulation.md +29 -0
- package/packs/audio-core/rules/host-parameters-at-scale.md +24 -0
- package/packs/audio-core/rules/house-control-behaviours.md +34 -0
- package/packs/audio-core/rules/math-domain-guards.md +19 -0
- package/packs/audio-core/rules/modulated-delay-interpolation.md +22 -0
- package/packs/audio-core/rules/multiband-phase-coherent.md +22 -0
- package/packs/audio-core/rules/nonlinear-stages-antialiased.md +28 -0
- package/packs/audio-core/rules/note-ledger-and-pedals.md +22 -0
- package/packs/audio-core/rules/one-formula-per-value.md +20 -0
- package/packs/audio-core/rules/optimisations-are-null-tested.md +23 -0
- package/packs/audio-core/rules/oscillators-bandlimited.md +23 -0
- package/packs/audio-core/rules/output-limiter.md +23 -0
- package/packs/audio-core/rules/parameter-ids-never-change.md +20 -0
- package/packs/audio-core/rules/params-and-state-thread-safe.md +19 -0
- package/packs/audio-core/rules/params-snapshot-per-block.md +21 -0
- package/packs/audio-core/rules/patch-excludes-performance-controls.md +18 -0
- package/packs/audio-core/rules/per-sample-code-inlinable.md +22 -0
- package/packs/audio-core/rules/prepare-is-repeatable.md +23 -0
- package/packs/audio-core/rules/recursive-state-nan-guard.md +20 -0
- package/packs/audio-core/rules/reverb-loop-gain-bounded.md +24 -0
- package/packs/audio-core/rules/sample-accurate-midi.md +22 -0
- package/packs/audio-core/rules/sample-rate-and-block-size-from-host.md +23 -0
- package/packs/audio-core/rules/scoped-no-denormals.md +26 -0
- package/packs/audio-core/rules/smooth-continuous-parameters.md +22 -0
- package/packs/audio-core/rules/state-load-versioned-and-safe.md +22 -0
- package/packs/audio-core/rules/straight-on-and-aligned.md +21 -0
- package/packs/audio-core/rules/ui-matches-reference-look.md +21 -0
- package/packs/audio-core/rules/undo-one-gesture-one-step.md +21 -0
- package/packs/audio-core/rules/voice-steal-fades.md +21 -0
- package/packs/audio-core/rules/voice-sum-headroom.md +20 -0
- package/packs/audio-core/skills/analyse-reference-look/SKILL.md +21 -0
- package/packs/audio-core/skills/copy-and-prove/SKILL.md +98 -0
- package/packs/audio-core/skills/juce-realtime-audit/SKILL.md +22 -0
- package/packs/audio-core/skills/measure-tone/SKILL.md +20 -0
- package/packs/audio-core/skills/new-panel-control/SKILL.md +15 -0
- package/packs/audio-core/skills/prove-control/SKILL.md +23 -0
- package/packs/audio-core/skills/trace-parameter/SKILL.md +29 -0
- package/packs/audio-core/tools/lib/spectrum.mjs +112 -0
- package/packs/audio-core/tools/lib/wav.mjs +41 -0
- package/packs/audio-core/tools/tone-report.mjs +47 -0
- package/packs/base/checks/field-map-over-if-runs.json +25 -0
- package/packs/base/checks/lookup-over-if-chains.json +25 -0
- package/packs/base/checks/lookup-over-ternary-chains.json +20 -0
- package/packs/base/checks/no-code-after-midline-comment.json +12 -0
- package/packs/base/checks/one-walk-per-template.json +23 -0
- package/packs/base/checks/stub-reports-success.json +31 -0
- package/packs/base/checks/test-skip-on-failed-setup.json +17 -0
- package/packs/base/hooks/brief-guard.mjs +96 -0
- package/packs/base/hooks/code-shape.mjs +95 -0
- package/packs/base/hooks/dispatch-once.mjs +87 -0
- package/packs/base/hooks/file-size-guard.mjs +61 -0
- package/packs/base/hooks/folder-law.mjs +74 -0
- package/packs/base/hooks/git-guard.mjs +289 -0
- package/packs/base/hooks/lesson-checks.mjs +174 -0
- package/packs/base/hooks/lib/apply-edit.mjs +20 -0
- package/packs/base/hooks/lib/code-shapes.mjs +137 -0
- package/packs/base/hooks/lib/content.mjs +14 -0
- package/packs/base/hooks/lib/cpp-scan.mjs +94 -0
- package/packs/base/hooks/lib/dup-index.mjs +199 -0
- package/packs/base/hooks/lib/dup.mjs +127 -0
- package/packs/base/hooks/lib/elements.mjs +87 -0
- package/packs/base/hooks/lib/event-log.mjs +67 -0
- package/packs/base/hooks/lib/function-shapes.mjs +90 -0
- package/packs/base/hooks/lib/git-adds.mjs +20 -0
- package/packs/base/hooks/lib/git-guard-selftest.mjs +99 -0
- package/packs/base/hooks/lib/glob.mjs +33 -0
- package/packs/base/hooks/lib/hook-log.mjs +100 -0
- package/packs/base/hooks/lib/house.py +77 -0
- package/packs/base/hooks/lib/languages.mjs +66 -0
- package/packs/base/hooks/lib/layout.mjs +54 -0
- package/packs/base/hooks/lib/making-check-selftest.mjs +109 -0
- package/packs/base/hooks/lib/near-copies.mjs +76 -0
- package/packs/base/hooks/lib/program-read.mjs +196 -0
- package/packs/base/hooks/lib/program-writes.mjs +177 -0
- package/packs/base/hooks/lib/project.mjs +81 -0
- package/packs/base/hooks/lib/prose.mjs +11 -0
- package/packs/base/hooks/lib/pushed.mjs +201 -0
- package/packs/base/hooks/lib/repo-index.mjs +52 -0
- package/packs/base/hooks/lib/secret-patterns.mjs +18 -0
- package/packs/base/hooks/lib/selftest.mjs +45 -0
- package/packs/base/hooks/lib/shape-code.mjs +126 -0
- package/packs/base/hooks/lib/shape.mjs +294 -0
- package/packs/base/hooks/lib/shell-writes-selftest.mjs +65 -0
- package/packs/base/hooks/lib/shell-writes.mjs +293 -0
- package/packs/base/hooks/lib/turn.mjs +81 -0
- package/packs/base/hooks/lib/writes.mjs +71 -0
- package/packs/base/hooks/making-check.mjs +243 -0
- package/packs/base/hooks/making.mjs +106 -0
- package/packs/base/hooks/once-only.mjs +150 -0
- package/packs/base/hooks/placement-law.mjs +84 -0
- package/packs/base/hooks/repo-litter.mjs +75 -0
- package/packs/base/hooks/reuse-hint.mjs +75 -0
- package/packs/base/hooks/run-hooks.mjs +132 -0
- package/packs/base/hooks/secrets-guard.mjs +99 -0
- package/packs/base/hooks/shape-law.mjs +133 -0
- package/packs/base/hooks/suite-once.mjs +80 -0
- package/packs/base/hooks/template-law.mjs +148 -0
- package/packs/base/hooks/untrusted-boundary.mjs +53 -0
- package/packs/base/pack.json +214 -0
- package/packs/base/rules/a-control-is-seen-to-fire.md +27 -0
- package/packs/base/rules/behaviour-lives-with-its-kind.md +51 -0
- package/packs/base/rules/bug-fix-starts-red.md +25 -0
- package/packs/base/rules/field-map-over-if-runs.md +47 -0
- package/packs/base/rules/finished-work-lands.md +17 -0
- package/packs/base/rules/git-right-first-time.md +19 -0
- package/packs/base/rules/instances-by-index-identities-by-id.md +54 -0
- package/packs/base/rules/lookup-over-if-chains.md +49 -0
- package/packs/base/rules/making-line-first.md +14 -0
- package/packs/base/rules/open-items-tagged.md +17 -0
- package/packs/base/rules/plan-and-logs.md +22 -0
- package/packs/base/rules/references-use-anchors.md +19 -0
- package/packs/base/rules/refusals-are-judged.md +18 -0
- package/packs/base/rules/reuse-before-writing.md +15 -0
- package/packs/base/rules/secrets-never-committed.md +16 -0
- package/packs/base/rules/skill-writing.md +23 -0
- package/packs/base/rules/split-before-the-limit.md +14 -0
- package/packs/base/rules/subagent-dispatch.md +26 -0
- package/packs/base/rules/test-only-what-changed.md +17 -0
- package/packs/base/rules/test-the-template-once.md +22 -0
- package/packs/base/rules/untrusted-content-boundary.md +15 -0
- package/packs/base/skills/add-lesson-check/SKILL.md +26 -0
- package/packs/base/skills/fix-from-scan/SKILL.md +25 -0
- package/packs/base/skills/land-branch/SKILL.md +24 -0
- package/packs/base/skills/make-it-a-template/SKILL.md +23 -0
- package/packs/base/skills/pdf-to-md/SKILL.md +25 -0
- package/packs/base/skills/pick-tests/SKILL.md +20 -0
- package/packs/base/skills/pressure-test-skill/SKILL.md +23 -0
- package/packs/base/skills/prove-instances-identical/SKILL.md +37 -0
- package/packs/base/tools/shape-symmetry-selftest.mjs +66 -0
- package/packs/base/tools/shape-symmetry.mjs +178 -0
- package/packs/base/tools/test-verdict.mjs +75 -0
- package/packs/ci/checks/ci-permissions-stated.json +18 -0
- package/packs/ci/checks/ci-tools-pinned.json +14 -0
- package/packs/ci/pack.json +21 -0
- package/packs/ci/rules/ci-covers-what-ships.md +20 -0
- package/packs/ci/rules/generated-files-have-no-diff.md +15 -0
- package/packs/content-site/checks/captcha-is-not-constant.json +27 -0
- package/packs/content-site/checks/img-has-size.json +20 -0
- package/packs/content-site/checks/page-head-complete.json +26 -0
- package/packs/content-site/pack.json +22 -0
- package/packs/content-site/rules/content-has-one-source.md +23 -0
- package/packs/content-site/rules/media-is-sized.md +24 -0
- package/packs/content-site/rules/page-head-is-complete.md +26 -0
- package/packs/content-site/rules/public-forms-are-defended.md +27 -0
- package/packs/content-site/skills/publish-a-page/SKILL.md +21 -0
- package/packs/cpp/checks/cpp-clamp-before-cast.json +16 -0
- package/packs/cpp/checks/cpp-find-with-the-library.json +12 -0
- package/packs/cpp/checks/cpp-hardened-test-build.json +18 -0
- package/packs/cpp/checks/cpp-m-pi-not-standard.json +23 -0
- package/packs/cpp/checks/cpp-no-atoi.json +16 -0
- package/packs/cpp/checks/cpp-no-const-cast.json +16 -0
- package/packs/cpp/checks/cpp-no-float-loop-counter.json +16 -0
- package/packs/cpp/checks/cpp-no-getenv-in-product.json +22 -0
- package/packs/cpp/checks/cpp-no-mutable-global.json +20 -0
- package/packs/cpp/checks/cpp-no-mutable-local-static.json +23 -0
- package/packs/cpp/checks/cpp-no-unchecked-fwrite.json +17 -0
- package/packs/cpp/checks/cpp-no-using-namespace-in-header.json +19 -0
- package/packs/cpp/checks/cpp-no-zero-size-array.json +23 -0
- package/packs/cpp/checks/cpp-numbers-pi.json +16 -0
- package/packs/cpp/pack.json +22 -0
- package/packs/cpp/rules/cpp-absent-and-failed-are-types.md +24 -0
- package/packs/cpp/rules/cpp-builds-everywhere.md +26 -0
- package/packs/cpp/rules/cpp-faults-only-in-the-test-build.md +21 -0
- package/packs/cpp/rules/cpp-find-with-the-library.md +19 -0
- package/packs/cpp/rules/cpp-gates-share-one-reader.md +22 -0
- package/packs/cpp/rules/cpp-headers-declare.md +22 -0
- package/packs/cpp/rules/cpp-numbers-and-casts.md +22 -0
- package/packs/cpp/rules/cpp-repeats-become-templates.md +33 -0
- package/packs/cpp/rules/cpp-static-analysis-runs.md +22 -0
- package/packs/cpp/rules/cpp-thread-contracts-are-code.md +23 -0
- package/packs/cpp/skills/cpp-extract-template/SKILL.md +38 -0
- package/packs/docker/checks/alpine-with-native-build.json +13 -0
- package/packs/docker/checks/compose-db-needs-auth.json +14 -0
- package/packs/docker/checks/compose-image-pinned.json +14 -0
- package/packs/docker/checks/compose-no-hardcoded-ip.json +12 -0
- package/packs/docker/checks/compose-no-host-bind-for-data.json +18 -0
- package/packs/docker/checks/compose-no-plaintext-secret.json +13 -0
- package/packs/docker/checks/compose-no-swarm-ignored-keys.json +13 -0
- package/packs/docker/checks/compose-overlay-not-bridge.json +13 -0
- package/packs/docker/checks/compose-service-needs-healthcheck.json +11 -0
- package/packs/docker/checks/compose-service-needs-init.json +11 -0
- package/packs/docker/checks/copy-needs-chown-with-user.json +17 -0
- package/packs/docker/checks/copy-source-before-deps.json +13 -0
- package/packs/docker/checks/docker-exec-form.json +16 -0
- package/packs/docker/checks/dockerfile-needs-healthcheck.json +17 -0
- package/packs/docker/checks/dockerfile-needs-user.json +21 -0
- package/packs/docker/checks/dockerignore-has-the-basics.json +21 -0
- package/packs/docker/checks/gitattributes-forces-lf.json +17 -0
- package/packs/docker/checks/health-checks-nothing.json +25 -0
- package/packs/docker/checks/no-crlf-in-scripts.json +15 -0
- package/packs/docker/checks/no-latest-base.json +13 -0
- package/packs/docker/checks/no-secret-in-image.json +13 -0
- package/packs/docker/checks/no-sensitive-file-copy.json +13 -0
- package/packs/docker/checks/node-env-before-install.json +13 -0
- package/packs/docker/checks/npm-ci-not-install.json +13 -0
- package/packs/docker/pack.json +46 -0
- package/packs/docker/rules/compose-pinned-and-closed.md +21 -0
- package/packs/docker/rules/compose-swarm-safe.md +26 -0
- package/packs/docker/rules/docker-exec-form.md +19 -0
- package/packs/docker/rules/dockerfile-multistage.md +13 -0
- package/packs/docker/rules/dockerfile-production.md +25 -0
- package/packs/docker/skills/docker-diagnose/SKILL.md +23 -0
- package/packs/dynamic-data/checks/draft-on-the-server.json +27 -0
- package/packs/dynamic-data/checks/guard-does-its-job.json +28 -0
- package/packs/dynamic-data/checks/key-is-not-a-display-name.json +28 -0
- package/packs/dynamic-data/checks/no-code-from-data.json +29 -0
- package/packs/dynamic-data/checks/no-collection-from-request.json +27 -0
- package/packs/dynamic-data/checks/no-pipeline-from-stored-text.json +27 -0
- package/packs/dynamic-data/checks/no-regexp-from-stored-config.json +27 -0
- package/packs/dynamic-data/checks/no-template-from-stored-text.json +27 -0
- package/packs/dynamic-data/checks/save-takes-named-paths.json +27 -0
- package/packs/dynamic-data/pack.json +23 -0
- package/packs/dynamic-data/rules/a-list-is-a-saved-query.md +23 -0
- package/packs/dynamic-data/rules/definitions-are-validated-data.md +24 -0
- package/packs/dynamic-data/rules/every-dynamic-surface-has-a-boundary.md +29 -0
- package/packs/dynamic-data/rules/fields-have-owners.md +22 -0
- package/packs/dynamic-data/rules/imports-drop-nothing.md +26 -0
- package/packs/dynamic-data/rules/one-definition-many-surfaces.md +24 -0
- package/packs/dynamic-data/rules/one-fact-one-place.md +28 -0
- package/packs/dynamic-data/rules/rules-live-in-the-engine.md +29 -0
- package/packs/dynamic-data/rules/saves-are-patches.md +28 -0
- package/packs/dynamic-data/rules/tenant-costs-one-document.md +22 -0
- package/packs/dynamic-data/skills/design-a-definition/SKILL.md +24 -0
- package/packs/fastify/checks/api-routes-versioned.json +28 -0
- package/packs/fastify/checks/cookie-host-prefix.json +24 -0
- package/packs/fastify/checks/hijack-needs-try.json +28 -0
- package/packs/fastify/checks/no-cast-at-route-boundary.json +24 -0
- package/packs/fastify/checks/no-db-in-route-file.json +28 -0
- package/packs/fastify/checks/no-err-message-to-client.json +24 -0
- package/packs/fastify/checks/no-regexp-from-input.json +24 -0
- package/packs/fastify/checks/no-trust-proxy-true.json +25 -0
- package/packs/fastify/checks/one-error-body.json +26 -0
- package/packs/fastify/checks/origin-from-config-not-host.json +31 -0
- package/packs/fastify/checks/password-needs-slow-hash.json +30 -0
- package/packs/fastify/checks/sec-headers-present.json +28 -0
- package/packs/fastify/checks/secrets-compared-constant-time.json +24 -0
- package/packs/fastify/checks/sse-needs-error-listener.json +28 -0
- package/packs/fastify/checks/user-bytes-need-disposition.json +29 -0
- package/packs/fastify/pack.json +41 -0
- package/packs/fastify/rules/credentials-and-input.md +23 -0
- package/packs/fastify/rules/security-one-switch.md +28 -0
- package/packs/fastify/rules/streams-and-hijacks.md +22 -0
- package/packs/fastify/rules/tests-use-inject.md +13 -0
- package/packs/fastify/rules/three-layers.md +20 -0
- package/packs/fastify/rules/trust-config-not-headers.md +24 -0
- package/packs/full-stack/checks/no-express-no-vite.json +23 -0
- package/packs/full-stack/hooks/stack-guard.mjs +90 -0
- package/packs/full-stack/pack.json +76 -0
- package/packs/full-stack/rules/stack-is-fastify-and-nextjs.md +20 -0
- package/packs/go/checks/go-exec-result-ignored.json +15 -0
- package/packs/go/checks/go-unmarshal-error-ignored.json +15 -0
- package/packs/go/pack.json +21 -0
- package/packs/go/rules/go-errors-are-handled.md +22 -0
- package/packs/gpu-painter/checks/dawn-backends-and-validation.json +9 -0
- package/packs/gpu-painter/checks/dawn-no-spontaneous.json +10 -0
- package/packs/gpu-painter/checks/dawn-present-on-render-thread.json +17 -0
- package/packs/gpu-painter/checks/gpu-no-frame-stalls.json +12 -0
- package/packs/gpu-painter/checks/no-opengl-link.json +11 -0
- package/packs/gpu-painter/checks/no-opengl.json +13 -0
- package/packs/gpu-painter/hooks/browser-guard.py +196 -0
- package/packs/gpu-painter/pack.json +91 -0
- package/packs/gpu-painter/rules/dawn-build-and-shaders.md +27 -0
- package/packs/gpu-painter/rules/dawn-device-and-render-thread.md +26 -0
- package/packs/gpu-painter/rules/gpu-antialiasing.md +20 -0
- package/packs/gpu-painter/rules/gpu-blend-order.md +22 -0
- package/packs/gpu-painter/rules/gpu-bloom.md +20 -0
- package/packs/gpu-painter/rules/gpu-frame-budget.md +25 -0
- package/packs/gpu-painter/rules/gpu-frame-pacing-and-power.md +27 -0
- package/packs/gpu-painter/rules/gpu-frame-work.md +30 -0
- package/packs/gpu-painter/rules/gpu-golden-images.md +21 -0
- package/packs/gpu-painter/rules/gpu-hdr-and-tonemap.md +23 -0
- package/packs/gpu-painter/rules/gpu-picking-on-cpu.md +19 -0
- package/packs/gpu-painter/rules/gpu-render-lifecycle.md +25 -0
- package/packs/gpu-painter/rules/gpu-text-atlas.md +24 -0
- package/packs/gpu-painter/rules/gpu-travellers-from-snapshot.md +24 -0
- package/packs/gpu-painter/rules/hover-every-pressable.md +25 -0
- package/packs/gpu-painter/skills/gpu-capture/SKILL.md +15 -0
- package/packs/gpu-painter/skills/gpu-frame-bench/SKILL.md +14 -0
- package/packs/gpu-painter/skills/gpu-golden-check/SKILL.md +13 -0
- package/packs/gpu-painter/skills/gpu-golden-update/SKILL.md +16 -0
- package/packs/gpu-painter/skills/gpu-lifecycle-stress/SKILL.md +15 -0
- package/packs/gpu-painter/skills/hover-state/SKILL.md +33 -0
- package/packs/hook-proof/checks/hook-catch-must-not-allow.json +16 -0
- package/packs/hook-proof/checks/hook-command-no-pipe.json +16 -0
- package/packs/hook-proof/checks/hook-exit-1-does-not-block.json +17 -0
- package/packs/hook-proof/checks/hook-no-or-true.json +18 -0
- package/packs/hook-proof/checks/hook-refusal-on-stderr.json +17 -0
- package/packs/hook-proof/pack.json +38 -0
- package/packs/hook-proof/rules/a-refusal-is-exit-2.md +28 -0
- package/packs/hook-proof/skills/prove-a-hook/SKILL.md +21 -0
- package/packs/host-agent/checks/file-path-from-param.json +27 -0
- package/packs/host-agent/checks/integrity-check-optional.json +27 -0
- package/packs/host-agent/checks/quoted-value-into-config.json +24 -0
- package/packs/host-agent/checks/secret-on-argv.json +28 -0
- package/packs/host-agent/checks/ssh-verifies-host-key.json +27 -0
- package/packs/host-agent/checks/system-file-written-in-place.json +26 -0
- package/packs/host-agent/checks/tmp-path-predictable.json +27 -0
- package/packs/host-agent/pack.json +22 -0
- package/packs/host-agent/rules/root-on-other-machines.md +27 -0
- package/packs/html-ui/checks/email-html-escapes.json +25 -0
- package/packs/html-ui/checks/external-link-rel.json +21 -0
- package/packs/html-ui/checks/no-duplicate-escape.json +26 -0
- package/packs/html-ui/checks/no-inline-client-script.json +21 -0
- package/packs/html-ui/checks/no-inline-style.json +23 -0
- package/packs/html-ui/pack.json +33 -0
- package/packs/html-ui/rules/email-html-escapes.md +19 -0
- package/packs/html-ui/rules/server-html-escapes-everything.md +22 -0
- package/packs/http-api/checks/api-path-versioned.json +31 -0
- package/packs/http-api/checks/authz-from-request-body.json +26 -0
- package/packs/http-api/checks/client-calls-a-version.json +28 -0
- package/packs/http-api/checks/client-ip-not-leftmost-xff.json +28 -0
- package/packs/http-api/checks/cors-needs-origin.json +26 -0
- package/packs/http-api/checks/csp-not-switched-off.json +28 -0
- package/packs/http-api/checks/debug-route-not-shipped.json +26 -0
- package/packs/http-api/checks/encrypted-name-plaintext-value.json +26 -0
- package/packs/http-api/checks/err-text-stays-server-side.json +27 -0
- package/packs/http-api/checks/failure-is-not-empty.json +28 -0
- package/packs/http-api/checks/gate-is-not-a-todo.json +27 -0
- package/packs/http-api/checks/guard-fails-open.json +28 -0
- package/packs/http-api/checks/hmac-over-reserialised-body.json +26 -0
- package/packs/http-api/checks/jwt-verify-pins-algorithm.json +26 -0
- package/packs/http-api/checks/middleware-skips-without-user.json +26 -0
- package/packs/http-api/checks/next-api-route-versioned.json +47 -0
- package/packs/http-api/checks/no-security-off-switch.json +28 -0
- package/packs/http-api/checks/oauth-state-signed.json +26 -0
- package/packs/http-api/checks/one-time-code-compared-raw.json +26 -0
- package/packs/http-api/checks/query-cast-is-not-validation.json +28 -0
- package/packs/http-api/checks/queue-action-from-client.json +26 -0
- package/packs/http-api/checks/rate-limit-one-module.json +28 -0
- package/packs/http-api/checks/role-checked-in-one-guard.json +27 -0
- package/packs/http-api/checks/route-body-needs-schema.json +31 -0
- package/packs/http-api/checks/route-scopes-to-the-caller.json +31 -0
- package/packs/http-api/checks/secret-compared-constant-time-any.json +28 -0
- package/packs/http-api/checks/secret-in-job-record.json +27 -0
- package/packs/http-api/checks/server-fetches-tenant-url.json +30 -0
- package/packs/http-api/checks/short-code-needs-limit.json +26 -0
- package/packs/http-api/checks/user-url-through-safe-fetch.json +28 -0
- package/packs/http-api/checks/webhook-dedupes-event-id.json +30 -0
- package/packs/http-api/pack.json +45 -0
- package/packs/http-api/rules/adapters-one-db-gateway.md +18 -0
- package/packs/http-api/rules/apis-are-versioned.md +27 -0
- package/packs/http-api/rules/credentials-handled-safely.md +22 -0
- package/packs/http-api/rules/handlers-own-the-work.md +17 -0
- package/packs/http-api/rules/health-and-correlation.md +17 -0
- package/packs/http-api/rules/one-error-contract.md +17 -0
- package/packs/http-api/rules/routes-are-thin.md +17 -0
- package/packs/http-api/rules/routes-scope-to-the-caller.md +26 -0
- package/packs/http-api/rules/routes-validate-and-answer.md +25 -0
- package/packs/http-api/skills/change-an-api/SKILL.md +20 -0
- package/packs/http-api/skills/secure-a-route/SKILL.md +21 -0
- package/packs/instrument-shell/checks/no-raw-struct-blob.json +23 -0
- package/packs/instrument-shell/pack.json +22 -0
- package/packs/instrument-shell/rules/fold-keeps-every-route.md +24 -0
- package/packs/instrument-shell/rules/quiet-announces-itself.md +22 -0
- package/packs/instrument-shell/rules/render-the-extremes.md +25 -0
- package/packs/instrument-shell/rules/seams-are-declared.md +27 -0
- package/packs/instrument-shell/rules/session-blob-append-only.md +25 -0
- package/packs/instrument-shell/skills/gates-from-commit-one/SKILL.md +20 -0
- package/packs/instrument-shell/skills/hit-the-painted-control/SKILL.md +18 -0
- package/packs/js-ts/checks/async-callback-unguarded.json +26 -0
- package/packs/js-ts/checks/background-loop-needs-stop.json +28 -0
- package/packs/js-ts/checks/child-process-error-handler.json +28 -0
- package/packs/js-ts/checks/entry-registers-shutdown.json +31 -0
- package/packs/js-ts/checks/fetch-needs-timeout.json +30 -0
- package/packs/js-ts/checks/job-only-in-memory.json +28 -0
- package/packs/js-ts/checks/json-only-through-helper.json +29 -0
- package/packs/js-ts/checks/line-under-200-chars.json +34 -0
- package/packs/js-ts/checks/localhost-default-in-server.json +29 -0
- package/packs/js-ts/checks/no-any.json +27 -0
- package/packs/js-ts/checks/no-cast-escape-hatches.json +24 -0
- package/packs/js-ts/checks/no-console-in-app.json +31 -0
- package/packs/js-ts/checks/no-dynamic-import-node-builtin.json +25 -0
- package/packs/js-ts/checks/no-inline-binary.json +20 -0
- package/packs/js-ts/checks/no-inline-zod-outside-schemas.json +27 -0
- package/packs/js-ts/checks/no-local-sleep.json +25 -0
- package/packs/js-ts/checks/no-nested-ternary.json +20 -0
- package/packs/js-ts/checks/no-secret-in-log.json +24 -0
- package/packs/js-ts/checks/no-shell-string-interpolation.json +24 -0
- package/packs/js-ts/checks/no-swallowed-errors.json +25 -0
- package/packs/js-ts/checks/no-ts-enum.json +20 -0
- package/packs/js-ts/checks/process-env-only-in-config.json +31 -0
- package/packs/js-ts/checks/race-leaves-work-running.json +23 -0
- package/packs/js-ts/checks/reject-as-catch-all-exists.json +24 -0
- package/packs/js-ts/checks/secret-has-no-fallback.json +24 -0
- package/packs/js-ts/checks/secret-needs-crypto-random.json +24 -0
- package/packs/js-ts/checks/server-close-awaited.json +27 -0
- package/packs/js-ts/checks/session-user-typed-once.json +24 -0
- package/packs/js-ts/checks/switch-is-a-table.json +24 -0
- package/packs/js-ts/checks/test-imports-the-source.json +19 -0
- package/packs/js-ts/checks/test-name-says-behaviour.json +16 -0
- package/packs/js-ts/checks/tsconfig-flags.json +21 -0
- package/packs/js-ts/checks/void-needs-catch.json +24 -0
- package/packs/js-ts/checks/zod-string-needs-max.json +25 -0
- package/packs/js-ts/checks/zod-v4-formats.json +23 -0
- package/packs/js-ts/pack.json +84 -0
- package/packs/js-ts/rules/await-handled-at-a-boundary.md +66 -0
- package/packs/js-ts/rules/env-through-config.md +36 -0
- package/packs/js-ts/rules/errors-never-swallowed.md +33 -0
- package/packs/js-ts/rules/files-under-300-lines.md +18 -0
- package/packs/js-ts/rules/guard-clauses-over-nesting.md +34 -0
- package/packs/js-ts/rules/js-repeats-become-templates.md +26 -0
- package/packs/js-ts/rules/json-only-through-one-helper.md +62 -0
- package/packs/js-ts/rules/named-constants-not-magic-numbers.md +34 -0
- package/packs/js-ts/rules/no-any.md +34 -0
- package/packs/js-ts/rules/no-console.md +30 -0
- package/packs/js-ts/rules/no-floating-promises.md +31 -0
- package/packs/js-ts/rules/no-param-mutation.md +28 -0
- package/packs/js-ts/rules/no-unsafe-assertions.md +30 -0
- package/packs/js-ts/rules/one-logger.md +24 -0
- package/packs/js-ts/rules/outbound-calls-have-a-limit.md +20 -0
- package/packs/js-ts/rules/parallel-independent-awaits.md +29 -0
- package/packs/js-ts/rules/process-lifecycle.md +47 -0
- package/packs/js-ts/rules/schema-single-source-of-truth.md +36 -0
- package/packs/js-ts/rules/secrets-stay-secret.md +22 -0
- package/packs/js-ts/rules/small-functions.md +20 -0
- package/packs/js-ts/rules/test-names-describe-behavior.md +28 -0
- package/packs/js-ts/rules/tests-can-fail.md +19 -0
- package/packs/js-ts/rules/tsconfig-strict.md +32 -0
- package/packs/js-ts/rules/typed-exports.md +27 -0
- package/packs/js-ts/rules/types-once-at-the-edge.md +18 -0
- package/packs/js-ts/rules/unions-over-enums.md +29 -0
- package/packs/js-ts/rules/zod-at-route-boundaries.md +40 -0
- package/packs/midi/checks/active-sensing-no-pulse.json +24 -0
- package/packs/midi/checks/clock-not-at-sample-zero.json +23 -0
- package/packs/midi/checks/midi-realtime-first.json +27 -0
- package/packs/midi/checks/no-tempo-writeback.json +23 -0
- package/packs/midi/checks/position-not-integrated.json +25 -0
- package/packs/midi/checks/stub-playhead-advances.json +27 -0
- package/packs/midi/checks/sysex-length-literal.json +23 -0
- package/packs/midi/checks/sysex-not-on-audio.json +24 -0
- package/packs/midi/checks/sysex-survives-realtime.json +27 -0
- package/packs/midi/pack.json +22 -0
- package/packs/midi/rules/clock-is-a-pulse-stream.md +30 -0
- package/packs/midi/rules/imports-count-every-loss.md +25 -0
- package/packs/midi/rules/measure-the-clock-in-audio.md +30 -0
- package/packs/midi/rules/sync-is-a-mode.md +29 -0
- package/packs/midi/rules/sysex-is-a-record.md +29 -0
- package/packs/midi/skills/clock-probe/SKILL.md +23 -0
- package/packs/midi/skills/clock-probe/clock-law.md +417 -0
- package/packs/midi/skills/does-it-sync/SKILL.md +19 -0
- package/packs/mongo/checks/bulk-over-many.json +28 -0
- package/packs/mongo/checks/created-at-immutable.json +25 -0
- package/packs/mongo/checks/driver-outside-gateway.json +24 -0
- package/packs/mongo/checks/key-lookup-is-hashed.json +24 -0
- package/packs/mongo/checks/mongoclient-cached-and-named.json +34 -0
- package/packs/mongo/checks/mongoclient-outside-gateway.json +24 -0
- package/packs/mongo/checks/no-count-plus-one-ids.json +25 -0
- package/packs/mongo/checks/no-db-write-in-loop.json +25 -0
- package/packs/mongo/checks/no-drop-in-code.json +27 -0
- package/packs/mongo/checks/no-empty-deletemany.json +26 -0
- package/packs/mongo/checks/no-find-reads.json +26 -0
- package/packs/mongo/checks/no-input-spread-into-write.json +24 -0
- package/packs/mongo/checks/no-mongoose.json +23 -0
- package/packs/mongo/checks/no-negation-delete.json +26 -0
- package/packs/mongo/checks/no-non-null-after-findone.json +25 -0
- package/packs/mongo/checks/objectid-equals.json +26 -0
- package/packs/mongo/checks/update-then-reread.json +24 -0
- package/packs/mongo/checks/watch-not-poll.json +25 -0
- package/packs/mongo/pack.json +52 -0
- package/packs/mongo/rules/deletes-name-what-dies.md +21 -0
- package/packs/mongo/rules/driver-only-in-gateway.md +26 -0
- package/packs/mongo/rules/keys-hashed-input-picked.md +21 -0
- package/packs/mongo/rules/one-client-one-pool.md +32 -0
- package/packs/mongo/rules/reads-aggregate-writes-bulk.md +25 -0
- package/packs/mongo/rules/writes-are-atomic.md +27 -0
- package/packs/multi-tenant/checks/role-sees-all-tenants.json +26 -0
- package/packs/multi-tenant/checks/tenant-filter-from-url.json +25 -0
- package/packs/multi-tenant/pack.json +22 -0
- package/packs/multi-tenant/rules/no-role-crosses-a-tenant.md +21 -0
- package/packs/multi-tenant/skills/prove-tenant-isolation/SKILL.md +19 -0
- package/packs/nginx/checks/modsec-no-blanket-off.json +16 -0
- package/packs/nginx/checks/nginx-csp-no-unsafe.json +15 -0
- package/packs/nginx/checks/nginx-headers-always.json +15 -0
- package/packs/nginx/checks/nginx-keepalive-http11.json +20 -0
- package/packs/nginx/checks/nginx-logs-to-stdout.json +15 -0
- package/packs/nginx/checks/nginx-no-crlf.json +17 -0
- package/packs/nginx/checks/nginx-resolver-ttl.json +19 -0
- package/packs/nginx/pack.json +43 -0
- package/packs/nginx/rules/modsecurity-tuning.md +22 -0
- package/packs/nginx/rules/nginx-production.md +26 -0
- package/packs/nginx/skills/waf-rollout/SKILL.md +20 -0
- package/packs/python/checks/py-no-bare-except.json +18 -0
- package/packs/python/checks/py-no-eval.json +18 -0
- package/packs/python/checks/py-no-mutable-default.json +18 -0
- package/packs/python/checks/py-no-shell-true.json +18 -0
- package/packs/python/checks/py-no-star-import.json +18 -0
- package/packs/python/checks/py-no-swallowed-exception.json +18 -0
- package/packs/python/checks/py-none-by-is.json +18 -0
- package/packs/python/checks/py-open-with-with.json +18 -0
- package/packs/python/checks/py-requests-timeout.json +18 -0
- package/packs/python/checks/py-subprocess-output-checked.json +18 -0
- package/packs/python/checks/py-yaml-safe-load.json +18 -0
- package/packs/python/pack.json +26 -0
- package/packs/python/rules/python-errors-and-resources.md +26 -0
- package/packs/python/rules/python-repeats-become-templates.md +27 -0
- package/packs/python/skills/python-extract-template/SKILL.md +35 -0
- package/packs/react/checks/dialog-needs-role.json +28 -0
- package/packs/react/checks/effect-not-for-derived-state.json +24 -0
- package/packs/react/checks/icon-button-needs-name.json +24 -0
- package/packs/react/checks/label-needs-a-field.json +24 -0
- package/packs/react/checks/ui-failed-fetch-says-so.json +23 -0
- package/packs/react/checks/ui-ok-branch-has-an-else.json +23 -0
- package/packs/react/pack.json +20 -0
- package/packs/react/rules/react-accessible-controls.md +20 -0
- package/packs/react/rules/react-state-and-effects.md +23 -0
- package/packs/reverse-engineering/checks/ear-constant-tagged.json +23 -0
- package/packs/reverse-engineering/checks/no-default-on-distrust.json +24 -0
- package/packs/reverse-engineering/checks/no-rom-table-literal.json +29 -0
- package/packs/reverse-engineering/checks/prose-never-decides.json +22 -0
- package/packs/reverse-engineering/hooks/firmware-out-of-git.mjs +49 -0
- package/packs/reverse-engineering/pack.json +35 -0
- package/packs/reverse-engineering/rules/a-negative-names-what-was-scanned.md +19 -0
- package/packs/reverse-engineering/rules/account-every-term.md +20 -0
- package/packs/reverse-engineering/rules/addresses-name-their-space.md +21 -0
- package/packs/reverse-engineering/rules/every-law-has-a-source.md +18 -0
- package/packs/reverse-engineering/rules/findings-are-withdrawn-in-place.md +17 -0
- package/packs/reverse-engineering/rules/firmware-stays-out.md +18 -0
- package/packs/reverse-engineering/rules/names-before-code.md +19 -0
- package/packs/reverse-engineering/rules/reproduction-or-original.md +18 -0
- package/packs/reverse-engineering/rules/two-sources-before-naming.md +21 -0
- package/packs/reverse-engineering/skills/bank-census/SKILL.md +18 -0
- package/packs/reverse-engineering/skills/gather-sources/SKILL.md +21 -0
- package/packs/reverse-engineering/skills/menu-map/SKILL.md +28 -0
- package/packs/reverse-engineering/skills/names-first/SKILL.md +41 -0
- package/packs/reverse-engineering/skills/re-deliverables/SKILL.md +21 -0
- package/packs/reverse-engineering/skills/tripwire-the-law/SKILL.md +19 -0
- package/packs/reverse-engineering/tools/lib/unwrap.mjs +115 -0
- package/packs/reverse-engineering/tools/names-sweep.mjs +264 -0
- package/packs/shell/checks/sh-mktemp.json +18 -0
- package/packs/shell/checks/sh-no-backticks.json +18 -0
- package/packs/shell/checks/sh-no-eval.json +18 -0
- package/packs/shell/checks/sh-no-parse-ls.json +18 -0
- package/packs/shell/checks/sh-no-pipe-to-shell.json +18 -0
- package/packs/shell/checks/sh-no-program-in-heredoc.json +18 -0
- package/packs/shell/checks/sh-quote-arguments.json +18 -0
- package/packs/shell/checks/sh-rm-guarded.json +18 -0
- package/packs/shell/checks/sh-strict-mode.json +20 -0
- package/packs/shell/pack.json +28 -0
- package/packs/shell/rules/shell-repeats-become-templates.md +23 -0
- package/packs/shell/rules/shell-strict-and-quoted.md +27 -0
- package/packs/shell/skills/shell-extract-template/SKILL.md +32 -0
- package/packs/shell-hooks/checks/gnu-only-in-shell.json +18 -0
- package/packs/shell-hooks/checks/hook-command-anchored.json +12 -0
- package/packs/shell-hooks/checks/hook-json-by-tool.json +18 -0
- package/packs/shell-hooks/checks/no-bash-c-with-variable.json +20 -0
- package/packs/shell-hooks/pack.json +36 -0
- package/packs/shell-hooks/rules/hooks-portable-anchored-quoted.md +26 -0
- package/packs/sound-design/checks/audio-seed-fixed.json +23 -0
- package/packs/sound-design/checks/mix-is-a-crossfade.json +30 -0
- package/packs/sound-design/checks/no-hash-in-the-signal.json +30 -0
- package/packs/sound-design/checks/no-literal-key-anchor.json +30 -0
- package/packs/sound-design/checks/test-compares-a-function-with-itself.json +22 -0
- package/packs/sound-design/pack.json +22 -0
- package/packs/sound-design/rules/algorithms-are-data.md +26 -0
- package/packs/sound-design/rules/meter-before-engine.md +27 -0
- package/packs/sound-design/rules/neutral-is-exact.md +26 -0
- package/packs/sound-design/rules/test-off-the-easy-point.md +28 -0
- package/packs/sound-design/rules/unreachable-is-said.md +25 -0
- package/packs/sound-design/rules/waveforms-and-octaves.md +24 -0
- package/packs/sound-design/skills/choose-observable/SKILL.md +18 -0
- package/packs/sound-design/skills/measure-a-law/SKILL.md +18 -0
- package/packs/sound-design/skills/measure-reverb/SKILL.md +19 -0
- package/packs/sound-design/skills/spread-probe/SKILL.md +18 -0
- package/packs/stellix/checks/no-keyboard-focus.json +12 -0
- package/packs/stellix/checks/one-seeded-random.json +16 -0
- package/packs/stellix/checks/world-never-includes-painter.json +12 -0
- package/packs/stellix/checks/world-no-libm.json +15 -0
- package/packs/stellix/checks/world-no-unordered.json +10 -0
- package/packs/stellix/hooks/no-shipped-images.mjs +88 -0
- package/packs/stellix/pack.json +61 -0
- package/packs/stellix/rules/stellix-deterministic-world.md +29 -0
- package/packs/stellix/rules/stellix-reset-generated.md +24 -0
- package/packs/stellix/rules/stellix-world-snapshot.md +27 -0
- package/packs/stellix/rules/world-continuous-collision.md +26 -0
- package/packs/stellix/rules/world-fp-determinism.md +28 -0
- package/packs/stored-text/checks/no-raw-html-from-data.json +31 -0
- package/packs/stored-text/checks/stored-text-libs-only-in-renderer.json +31 -0
- package/packs/stored-text/checks/stored-text-renderer-complete.json +24 -0
- package/packs/stored-text/checks/stored-text-through-renderer.json +25 -0
- package/packs/stored-text/pack.json +41 -0
- package/packs/stored-text/rules/stored-text-renders-once.md +26 -0
- package/packs/stored-text/skills/render-stored-text/SKILL.md +24 -0
- package/packs/synth-creator/checks/timing-from-synthcore.json +24 -0
- package/packs/synth-creator/checks/ui-drawn-in-code.json +23 -0
- package/packs/synth-creator/hooks/build-guard.mjs +232 -0
- package/packs/synth-creator/hooks/build-sweep.mjs +166 -0
- package/packs/synth-creator/hooks/frozen-files.mjs +63 -0
- package/packs/synth-creator/hooks/idle-wake.mjs +90 -0
- package/packs/synth-creator/hooks/protect-vendor.mjs +174 -0
- package/packs/synth-creator/hooks/spec-lock.mjs +117 -0
- package/packs/synth-creator/hooks/stage-guard.mjs +50 -0
- package/packs/synth-creator/hooks/time-guard.mjs +292 -0
- package/packs/synth-creator/hooks/user-asks.mjs +165 -0
- package/packs/synth-creator/pack.json +136 -0
- package/packs/synth-creator/rules/copy-trees-read-only.md +25 -0
- package/packs/synth-creator/rules/debug-by-measurement.md +20 -0
- package/packs/synth-creator/rules/done-means-fresh-evidence.md +18 -0
- package/packs/synth-creator/rules/hooks-and-gates.md +21 -0
- package/packs/synth-creator/rules/long-work-in-the-background.md +16 -0
- package/packs/synth-creator/rules/timing-from-synthcore.md +16 -0
- package/packs/synth-creator/skills/build-step/SKILL.md +125 -0
- package/packs/synth-creator/skills/build-through-the-queue/SKILL.md +19 -0
- package/packs/synth-creator/tools/freeze.mjs +36 -0
- package/packs/tui/checks/tui-entry-restores-terminal.json +27 -0
- package/packs/tui/checks/tui-gates-on-tty.json +25 -0
- package/packs/tui/checks/tui-no-ris-reset.json +22 -0
- package/packs/tui/checks/tui-resize-listener-removed.json +26 -0
- package/packs/tui/checks/tui-width-is-state.json +33 -0
- package/packs/tui/pack.json +44 -0
- package/packs/tui/rules/tui-resize-and-screen.md +25 -0
- package/packs/tui/skills/build-tui/SKILL.md +21 -0
- package/packs/ui-craft/checks/ui-input-needs-autocomplete.json +23 -0
- package/packs/ui-craft/checks/ui-intl-for-dates.json +21 -0
- package/packs/ui-craft/checks/ui-no-ai-palette.json +22 -0
- package/packs/ui-craft/checks/ui-no-animate-layout.json +22 -0
- package/packs/ui-craft/checks/ui-no-assistant-palette.json +23 -0
- package/packs/ui-craft/checks/ui-no-bounce-easing.json +22 -0
- package/packs/ui-craft/checks/ui-no-custom-cursor.json +22 -0
- package/packs/ui-craft/checks/ui-no-emoji-as-ui.json +22 -0
- package/packs/ui-craft/checks/ui-no-empty-image.json +21 -0
- package/packs/ui-craft/checks/ui-no-eyebrow.json +21 -0
- package/packs/ui-craft/checks/ui-no-furniture-text.json +22 -0
- package/packs/ui-craft/checks/ui-no-gradient-text.json +22 -0
- package/packs/ui-craft/checks/ui-no-index-numbering.json +21 -0
- package/packs/ui-craft/checks/ui-no-lorem.json +22 -0
- package/packs/ui-craft/checks/ui-no-marketing-buzzword.json +22 -0
- package/packs/ui-craft/checks/ui-no-paste-block.json +21 -0
- package/packs/ui-craft/checks/ui-no-placeholder-names.json +21 -0
- package/packs/ui-craft/checks/ui-no-scroll-hijack.json +21 -0
- package/packs/ui-craft/checks/ui-no-side-tab.json +21 -0
- package/packs/ui-craft/checks/ui-no-stock-labels.json +22 -0
- package/packs/ui-craft/checks/ui-no-transition-all.json +22 -0
- package/packs/ui-craft/checks/ui-no-uppercase-table-header.json +21 -0
- package/packs/ui-craft/checks/ui-no-zebra-rows.json +22 -0
- package/packs/ui-craft/checks/ui-no-zoom-lock.json +21 -0
- package/packs/ui-craft/pack.json +43 -0
- package/packs/ui-craft/rules/apps-are-not-pages.md +26 -0
- package/packs/ui-craft/rules/data-tells-the-truth.md +26 -0
- package/packs/ui-craft/rules/dates-and-numbers.md +18 -0
- package/packs/ui-craft/rules/forms-never-fight.md +22 -0
- package/packs/ui-craft/rules/interface-copy.md +26 -0
- package/packs/ui-craft/rules/motion-is-rare.md +31 -0
- package/packs/ui-craft/rules/no-generated-look.md +37 -0
- package/packs/ui-craft/rules/page-holds-its-frame.md +28 -0
- package/packs/ui-craft/rules/page-proved-rendered.md +19 -0
- package/packs/ui-craft/rules/pictures-do-a-job.md +25 -0
- package/packs/ui-craft/rules/pointer-feedback.md +28 -0
- package/packs/ui-craft/rules/screen-answers-one-question.md +24 -0
- package/packs/ui-craft/rules/survives-real-data.md +23 -0
- package/packs/ui-craft/rules/touch-and-small-screens.md +19 -0
- package/packs/ui-craft/rules/type-space-colour.md +26 -0
- package/packs/ui-craft/rules/url-holds-the-state.md +19 -0
- package/packs/ui-craft/skills/app-screen/SKILL.md +33 -0
- package/packs/ui-craft/skills/build-from-reference/SKILL.md +28 -0
- package/packs/ui-craft/skills/chart-choice/SKILL.md +34 -0
- package/packs/ui-craft/skills/hover-state/SKILL.md +28 -0
- package/packs/ui-craft/skills/page-critique/SKILL.md +33 -0
- package/packs/ui-craft/skills/prove-page/SKILL.md +23 -0
- package/packs/ui-craft/skills/redesign-page/SKILL.md +19 -0
- package/packs/ui-craft/skills/ui-code-review/SKILL.md +22 -0
- package/packs/ui-craft/skills/write-the-page/SKILL.md +21 -0
- package/packs/ui-craft/tools/page-measure.mjs +41 -0
- package/packs/web/checks/a11y-img-needs-alt.json +26 -0
- package/packs/web/checks/a11y-no-bare-outline-none.json +21 -0
- package/packs/web/checks/a11y-no-clickable-div.json +26 -0
- package/packs/web/checks/a11y-no-positive-tabindex.json +26 -0
- package/packs/web/checks/client-no-api-key.json +29 -0
- package/packs/web/checks/client-no-browser-global-at-module-scope.json +28 -0
- package/packs/web/checks/client-no-server-import.json +31 -0
- package/packs/web/checks/client-no-window-location-nav.json +28 -0
- package/packs/web/checks/css-no-inline-style.json +30 -0
- package/packs/web/checks/ds-pages-compose-primitives.json +28 -0
- package/packs/web/checks/key-from-index.json +23 -0
- package/packs/web/checks/prodbuild-no-cdn-runtime-deps.json +21 -0
- package/packs/web/checks/prodbuild-no-dev-flags.json +21 -0
- package/packs/web/checks/prodbuild-no-remote-fonts.json +22 -0
- package/packs/web/checks/rcss-button-cursor.json +30 -0
- package/packs/web/checks/rcss-no-100vw.json +21 -0
- package/packs/web/checks/rcss-no-fixed-wide-width.json +21 -0
- package/packs/web/checks/rcss-viewport-meta.json +28 -0
- package/packs/web/checks/secret-not-in-web-storage.json +25 -0
- package/packs/web/checks/tw-no-raw-hex-in-markup.json +34 -0
- package/packs/web/checks/wp-hero-not-lazy.json +27 -0
- package/packs/web/checks/wp-img-needs-dimensions.json +26 -0
- package/packs/web/pack.json +73 -0
- package/packs/web/rules/accessibility.md +26 -0
- package/packs/web/rules/client-boundaries.md +23 -0
- package/packs/web/rules/production-build.md +22 -0
- package/packs/web/rules/secrets-not-in-the-browser.md +18 -0
- package/packs/web/rules/styles-live-in-stylesheets.md +23 -0
- package/packs/web/rules/tailwind-v4.md +23 -0
- package/packs/web/rules/ui-primitives-one-module.md +30 -0
- package/packs/web/rules/web-performance.md +21 -0
- package/packs/web/skills/design-direction/SKILL.md +30 -0
- package/packs/web/skills/design-review/SKILL.md +28 -0
- package/packs/web/skills/pick-rendering-mode/SKILL.md +21 -0
- package/packs/web/skills/preflight-build/SKILL.md +23 -0
- package/packs/web/skills/seo-audit/SKILL.md +22 -0
- package/packs/websocket/checks/no-token-in-query.json +26 -0
- package/packs/websocket/checks/stale-socket-deletes-new-entry.json +25 -0
- package/packs/websocket/checks/ws-identity-from-message.json +26 -0
- package/packs/websocket/pack.json +21 -0
- package/packs/websocket/rules/identity-comes-from-the-connection.md +24 -0
- package/packs/writing/checks/ascii-no-em-dash.json +17 -0
- package/packs/writing/checks/no-copula-dodging.json +18 -0
- package/packs/writing/checks/no-dramatic-colon.json +18 -0
- package/packs/writing/checks/no-not-x-but-y.json +18 -0
- package/packs/writing/checks/no-participial-opener.json +18 -0
- package/packs/writing/checks/no-pseudo-wisdom.json +18 -0
- package/packs/writing/checks/no-slop-words.json +18 -0
- package/packs/writing/checks/no-stock-connectors.json +18 -0
- package/packs/writing/checks/no-time-or-date.json +27 -0
- package/packs/writing/checks/no-trailing-ing.json +18 -0
- package/packs/writing/checks/no-vague-attribution.json +18 -0
- package/packs/writing/pack.json +43 -0
- package/packs/writing/rules/ascii-no-em-dash.md +21 -0
- package/packs/writing/rules/cut-the-padding.md +20 -0
- package/packs/writing/rules/direct-voice.md +22 -0
- package/packs/writing/rules/no-cargo-cult.md +16 -0
- package/packs/writing/rules/no-scaffolding.md +19 -0
- package/packs/writing/rules/no-stock-language.md +27 -0
- package/packs/writing/rules/no-time-or-date.md +18 -0
- package/packs/writing/rules/rhythm-like-talk.md +20 -0
- package/packs/writing/rules/write-from-your-own-corner.md +20 -0
- package/packs/writing/skills/argument-post/SKILL.md +28 -0
- package/packs/writing/skills/humanize/SKILL.md +28 -0
- package/packs/writing/skills/launch-post/SKILL.md +38 -0
- package/packs/writing/skills/pick-subreddit/SKILL.md +69 -0
- package/packs/writing/skills/post-voice/SKILL.md +22 -0
- package/packs/writing/skills/reddit-post/SKILL.md +63 -0
- package/packs/writing/skills/reddit-title/SKILL.md +23 -0
- package/packs/writing/skills/reply-moves/SKILL.md +40 -0
- package/packs/writing/skills/reply-stance/SKILL.md +23 -0
- package/packs/writing/skills/should-i-reply/SKILL.md +21 -0
- package/packs/zod/hooks/schemas-only.mjs +53 -0
- package/packs/zod/pack.json +44 -0
- package/packs/zod/rules/env-shapes-only.md +14 -0
- package/packs/zod/rules/zod-4-schemas.md +14 -0
- package/profiles/stellix.layout.json +315 -0
- package/profiles/sub37.layout.json +247 -0
- package/prompts/scan-review.md +40 -0
- package/prompts/survey.md +82 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,680 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 1.0.0 (2026-11-05)
|
|
4
|
+
|
|
5
|
+
The first public release. From here versions follow semver: a change that can break an installed project is a major version.
|
|
6
|
+
|
|
7
|
+
- The package is public on npm: `npm i -D @thedecipherist/claude-packs`.
|
|
8
|
+
- Breaking: `git-guard` has no default GitHub owner. A project with `guards.git.house` that wants pushes and new repos held to an owner names it in `guards.git.owner`.
|
|
9
|
+
- Nothing in the package assumes one person's machine or accounts. The hooks and their selftests name no real account or organisation, and `no-personal-name` also catches a lowercase name.
|
|
10
|
+
|
|
11
|
+
## 0.36.1 (2026-11-05)
|
|
12
|
+
|
|
13
|
+
- git-guard: a commit in a repo other than the project's is not judged against the project's `guards.git.repo`. A repo with no remote was
|
|
14
|
+
told to push its history into the project's repo (KWB-48, Stellix WB-108).
|
|
15
|
+
|
|
16
|
+
## 0.36.0 (2026-11-05)
|
|
17
|
+
|
|
18
|
+
The MPX 500 panel, rebuilt from one worn photograph taken off-axis, copied the camera's angle and a bent rack ear, and passed its look gate. A rule that said one size for one component was loaded and lost to the photograph.
|
|
19
|
+
|
|
20
|
+
- New rule `straight-on-and-aligned` in `audio-core`: basic UX before the picture. A UI is drawn straight on, everything aligns horizontally and vertically, whatever looks grouped is a group, size comes from the kind, and a round control's parts share a centre.
|
|
21
|
+
- `analyse-reference-look` separates the object from the photograph first, finds the grid and snaps to it, and has the gate check alignment, sizes and centres on their own.
|
|
22
|
+
- `type-space-colour` and `build-from-reference` say the same for the web.
|
|
23
|
+
|
|
24
|
+
## 0.35.1 (2026-11-05)
|
|
25
|
+
|
|
26
|
+
- `making-check` no longer sends back a turn for giving a view or quoting words (KWB-47). An estimate that differed from the user's, in the words of the override pattern, was read as ignoring an instruction, and a reply quoting those words fired it again. What a turn did is still judged.
|
|
27
|
+
|
|
28
|
+
## 0.35.0 (2026-11-05)
|
|
29
|
+
|
|
30
|
+
- New rule and check `timing-from-synthcore`, in the `synth-creator` pack: tempo, MIDI clock, transport and keys come from `synthcore`. The kit never named it, so nothing stopped a unit writing a second clock. The check has no hit on seven real units.
|
|
31
|
+
- New opt-in check `ui-drawn-in-code`: no images, sprites or embedded assets in a project that draws its UI in code. Switch it on with `"enable": ["checks/ui-drawn-in-code.json"]`.
|
|
32
|
+
- `copy-and-prove` names `synthcore` as the linked foundation.
|
|
33
|
+
|
|
34
|
+
## 0.34.0 (2026-11-05)
|
|
35
|
+
|
|
36
|
+
Trying to reverse engineer a real machine from nothing found what no test had: the pack could not reach a new project.
|
|
37
|
+
|
|
38
|
+
- The base configuration offers `reverse-engineering`. A new project has no code to read, so it was given plain `base`, and `add reverse-engineering` was refused: nobody starting from a ROM and a manual got any of it.
|
|
39
|
+
- `names-sweep --banked` reads a ROM larger than the CPU's address space. It tries each bank at each window. A negative `--base` used to crash it.
|
|
40
|
+
|
|
41
|
+
## 0.33.0 (2026-11-05)
|
|
42
|
+
|
|
43
|
+
- New base skill `pdf-to-md`: a PDF is read with docling, which keeps tables as tables. It says how to spot a download that is not a PDF and a scan with no text, and leaves images out: 79 KB and 37 seconds on an 87-page manual, against 2.2 MB and 114 seconds by default.
|
|
44
|
+
|
|
45
|
+
## 0.32.0 (2026-11-05)
|
|
46
|
+
|
|
47
|
+
Six more real repos were read with the kit, and it was wrong about them in ways no test had seen.
|
|
48
|
+
|
|
49
|
+
- `suggest` and `scan` read a project as it is. The kit's own files in `.claude/` are no longer evidence: `audio-thread-realtime-safe.md` had counted as reverse-engineering notes because the name holds `-re`. A reverse-engineering project is known by `[FW]` findings and its disassemblers, MIDI by what the code does, and a configuration named in `layout.json` stands.
|
|
50
|
+
- A long identifier is no longer a secret: control names in panel JSON were reported as keys, 11,410 of them in one repo. A key's random part runs unbroken.
|
|
51
|
+
- A build folder is known by what the build leaves, whatever it is called. `scan` leaves it out and reports it: one repo held 1,663 tracked build files, 43% of the repo.
|
|
52
|
+
- `names-sweep` reports where names sit densest, so a common word elsewhere does not hide the table; tries names with vowels dropped; wants most gaps to agree before calling a stride; says when an image looks compressed or encrypted and to stop; and reads three bytes per 16-bit word.
|
|
53
|
+
- New rule `addresses-name-their-space`. `names-first`, `menu-map`, `gather-sources`, `bank-census` and `findings-are-withdrawn-in-place` corrected against what these repos and two bug logs record, including where 0.31.0 said too much.
|
|
54
|
+
- `no-rom-table-literal` reads decimal tables, and `firmware-out-of-git` knows `.lst`, `.wiz`, `.mfw` and `.raf`.
|
|
55
|
+
- Reverse-engineering rules load where the work is: research notes and tools as well as code, through concepts. They were scoped to code files alone, so they did not load in research notes, and their hand-written paths hid stray files from `doctor`. Only `names-before-code` loads at launch, because it applies before any file is opened.
|
|
56
|
+
|
|
57
|
+
## 0.31.0 (2026-11-05)
|
|
58
|
+
|
|
59
|
+
0.30.0 was written from the playbook, without the two repos where this work was done and documented. Read against them and run on their real images, it was missing most of the method, and its tool could not read one of the updates it was meant for.
|
|
60
|
+
|
|
61
|
+
- `names-sweep` searches a name as a display prints it: squeezed and cut to a column. On a real image that took the names read from 10 to 142 of 226.
|
|
62
|
+
- It tries both bit orders of 7-to-8 packing. Roland's order was missing, so a real OS update read as nothing; it now reads through the packing its research recorded.
|
|
63
|
+
- It keeps a message's short last group and drops a trailing checksum. Without them an update read names while 63% of its bytes were wrong; with them the eight files of a real update decode to the EPROM, 524,288 of 524,288.
|
|
64
|
+
- It reports a pool: names in one unbroken printable run, to be read whole because a name that fills its field has no terminator.
|
|
65
|
+
- One or two names reading no longer counts as proof. They can read by chance, and the tool says so and exits 1.
|
|
66
|
+
- `names-first` adds name pools and value blobs, completing a manual's cut lists from the firmware, using a list's item count, pairing N names with N numbers to find a unit, and proving a table across images. It warns against the manual's prose order and against tables built by walking its names.
|
|
67
|
+
- New skill `menu-map`: the tree from the manual's sections, joined by its own display drawings, with both mismatch lists: on a page but in no dump, and in the patch map with no page.
|
|
68
|
+
|
|
69
|
+
## 0.30.0 (2026-11-05)
|
|
70
|
+
|
|
71
|
+
The reverse-engineering pack held the audit rules and almost none of the finding techniques, and the fastest one was missing: a machine has to print what it calls things, so its names are in the image as text.
|
|
72
|
+
|
|
73
|
+
- New skill `names-first` and rule `names-before-code`: the manual's names (patches, arp patterns, delay and reverb programs, menus, parameters) are listed and searched for before any disassembly.
|
|
74
|
+
- New tool `names-sweep`: searches an image for those names as stored and through every wrapping the rebuilds met (an EPROM pair, a set high bit, swapped and reversed words, 7-bit packing, nibbles, each sysex message opened behind its own header, a custom character set). It reports the wrapping, each group's stride and order, the pointer table, and the entries past the manual's list. A name that reads proves the unwrapping, and when none reads it says what was searched.
|
|
75
|
+
- Measured on a real EPROM: 255 of a manual's factory patch names read as stored, 222 of 254 in the manual's order, which locates the factory bank with no disassembly. One real OS update file reads under none of the 118 wrappings, and the tool says so.
|
|
76
|
+
- `gather-sources` puts the names first, and `re-deliverables` keeps the names file.
|
|
77
|
+
|
|
78
|
+
## 0.29.0 (2026-11-04)
|
|
79
|
+
|
|
80
|
+
The kit could not say which of its hooks work. `hooks.log` cut itself to 16 hours, a refusal left no reason or file, and only the shape hooks counted what they refused: 89 refusals on one project against a handful ever written down.
|
|
81
|
+
|
|
82
|
+
- Logs are never cleared. A log past 1 MB moves whole to `.claude/logs/` under a dated name, and stays there (`guards.logs.maxKb`). This holds for `hooks.log`, `usage.log` and the new logs, from Node and from Python.
|
|
83
|
+
- Every call is a line of `.claude/logs/events.jsonl`: session, agent, working folder, event, tool, the file or command or prompt, and each hook's time, exit code, reason and output. Secrets are masked, and file contents are not kept, only their size.
|
|
84
|
+
- Every refusal and crash is also a line of `refusals.jsonl`, with an id, branch, commit, kit version and the hash of the hook that decided.
|
|
85
|
+
- New `logs` command: per hook, over all the history, calls, refusals, verdicts, and how often the same file then passed. `logs refusals [--hook <h>] [--open]` lists them, and `logs mark <id> right|wrong "<why>"` records a verdict.
|
|
86
|
+
- New base rule `refusals-are-judged`.
|
|
87
|
+
|
|
88
|
+
## 0.28.0 (2026-11-04)
|
|
89
|
+
|
|
90
|
+
Four packs from the playbook of rebuilding classic machines from their firmware. Most of their laws come from failures that passed every test: nine units deaf to the transport, 272 of 625 presets silently on defaults, 15 algorithms on one DSP path.
|
|
91
|
+
|
|
92
|
+
- `reverse-engineering`: two sources before naming, a source tag on every law and a ledger for what was tuned by ear, a negative names what was scanned, every term of a sum accounted for, findings withdrawn in place. The `gather-sources`, `bank-census`, `tripwire-the-law` and `re-deliverables` skills, and the `firmware-out-of-git` hook, with small named test fixtures allowed.
|
|
93
|
+
- `midi`: the law of clock and sync, with the full reference beside the `clock-probe` skill; sysex as records that round-trip byte for byte; imports that count every loss. Nine checks.
|
|
94
|
+
- `sound-design`: algorithms are data, neutral is exact, the meter before the engine, tests off the easy point. The `choose-observable`, `measure-reverb`, `spread-probe` and `measure-a-law` skills.
|
|
95
|
+
- `instrument-shell`: sessions stay loadable, a collapse keeps every route, quiet says why, seams are declared. The `hit-the-painted-control` and `gates-from-commit-one` skills.
|
|
96
|
+
- A project declares `guards.instrument.kind`, `reproduction` or `original`, and `oscillators-bandlimited` follows it: on a reproduction the machine is the spec.
|
|
97
|
+
- `cpp` gains `cpp-builds-everywhere`, with `cpp-no-zero-size-array` and `cpp-m-pi-not-standard`. `repo-litter` refuses `:Zone.Identifier` files, which break a Windows checkout. `ci` gains `generated-files-have-no-diff`, and `a-control-is-seen-to-fire` the laws on injected faults.
|
|
98
|
+
- Most of the new checks found little on four real repos, so they guard against regressions. They did find ROM tables in source, a raw struct in a session blob, and a hard-coded key anchor. One check was dropped after 213 false hits.
|
|
99
|
+
|
|
100
|
+
## 0.27.0 (2026-11-04)
|
|
101
|
+
|
|
102
|
+
From the scan of a content-heavy site, the first of its kind, where the kit judged published text as code.
|
|
103
|
+
|
|
104
|
+
- Content folders. `isContent` (`hooks/lib/content.mjs`) is one rule for the whole kit: `articles/`, `blog/`, `posts/`, `content/`, `tutorials/`, `examples/` and `samples/` hold text and samples, unless they sit under a code root. `template-law`, `code-shape`, `once-only`, `file-size-guard` and the code checks leave them alone at the write; the writing laws still read them. On that site, 50 "secrets" in code became 0, and 973 sample hits left the count. `guards.content` adds a project's own.
|
|
105
|
+
- `scan` reports code first and public text last, and `suggest` takes no evidence from samples. It now finds plain HTML sites, which got no UI pack before.
|
|
106
|
+
- `no-time-or-date` is opt-in, and leaves articles alone even when on: dates there are the subject. A date that is a fact is fine; the rule now refuses invented ones.
|
|
107
|
+
- A placeholder password in a connection string is no longer a secret.
|
|
108
|
+
- New `content-site` pack: complete page heads, one source per page, defended public forms, sized media, and the `publish-a-page` skill.
|
|
109
|
+
- New base hook `repo-litter`: `git add` of a file over 10 MB, a working screenshot in the repo root, or a debug dump is refused. `scan` reports the repo's weight. Held back in existing projects.
|
|
110
|
+
- New checks in `http-api`: `failure-is-not-empty` (an empty 200 when the database is down) and `csp-not-switched-off`. `api-path-versioned` now reads paths like `/adminTools/api/`: every API is versioned, an internal one too.
|
|
111
|
+
- `hmac-over-reserialised-body` no longer fires on a plain proxy forward. `scan --prompt` now asks whether CLAUDE.md and the README still tell the truth.
|
|
112
|
+
|
|
113
|
+
## 0.26.0 (2026-11-04)
|
|
114
|
+
|
|
115
|
+
- New `dynamic-data` pack, from the post-mortem of a 20-year CMS and its successor's design: one definition drives every surface, definitions are validated data, the engine enforces and the UI reflects, every dynamic surface has a boundary, fields have owners, saves are patches, a fact is stored once, imports drop nothing, a list is a saved query, and a new tenant costs one document. Ten rules, nine checks and the `design-a-definition` skill. It finds little on the three repos measured, which are not definition-driven; its checks are proved by their examples, drawn from that system's real faults.
|
|
116
|
+
- API versioning in any framework: `api-path-versioned`, `next-api-route-versioned` and `client-calls-a-version` in `http-api`, the `apis-are-versioned` rule and the `change-an-api` skill. Only Fastify routes were judged before, and nothing covered a breaking change inside a version.
|
|
117
|
+
- `full-stack` is split. Most of its rules held for any project, so they moved to packs anyone can take: the layered API laws to `http-api`, `tests-use-inject` to `fastify`, `dockerfile-multistage` to `docker`, the schema laws and `schemas-only` to a new `zod` pack, and the hover law into `ui-craft`'s `pointer-feedback`. The `full-stack` pack is now only the stack choice. The configuration always takes `http-api`, `fastify`, `zod` and `docker`, and `js-ts` by default: it could not take `fastify` before.
|
|
118
|
+
- `replaces` on a check: a wider check stands in for a narrower one, so a project with both sees a hit once.
|
|
119
|
+
|
|
120
|
+
## 0.25.1 (2026-11-04)
|
|
121
|
+
|
|
122
|
+
- The README is a front page for everyone: what the kit does, how to start, every pack, configuration, preset, command and base hook. The notes from earlier releases moved to `docs/history.md`. `test/readme.test.mjs` fails when the page falls behind.
|
|
123
|
+
- CLAUDE.md is up to date with the scan, suggest and fix commands, the language table and the invariants the tests hold.
|
|
124
|
+
- The licence holder is TheDecipherist, and the `humanize` skill no longer carries one employer's context.
|
|
125
|
+
|
|
126
|
+
## 0.25.0 (2026-11-04)
|
|
127
|
+
|
|
128
|
+
Every language, and repetition stopped before it is written: AI writes the same thing over and over, in any language.
|
|
129
|
+
|
|
130
|
+
- One language table (`hooks/lib/languages.mjs`) feeds the statement reader: C and C++, JS and TS, Python, shell, Go, Rust, Java, C#, Scala, Dart, Kotlin, Swift, Ruby, PHP, Lua. A new language is one row. In shell the command and its flags are the shape, and its arguments are what differs.
|
|
131
|
+
- `template-law` catches more at the write. Near copies: most of a stretch of statements matches another file in order, with lines changed, so no stretch is exact. Re-made functions: a compound name the repo already defines (`escapeHtml`, `parse_config`). Plain words and names in many files are left alone. On the kit it finds no near copy; on the real repos measured, every near copy read was real.
|
|
132
|
+
- New hook `reuse-hint`, at the prompt: when a prompt's words name a function the repo has, what exists goes in front of it, before a line is drafted. Six at most, and nothing when nothing matches. New to a project, so held back until `enable` names it.
|
|
133
|
+
- New `python` and `shell` packs and a `python` configuration: rules, 19 checks, and `python-extract-template` and `shell-extract-template`. `js-ts` gains `js-repeats-become-templates`. The presets are `python-app` and `shell-tools`, and language packs can be chosen in every configuration that holds code.
|
|
134
|
+
- New `suggest` command and `init --auto`: the configuration and packs a project needs, read from its own files, with the evidence, so nobody picks them by hand. The configuration follows the language most of its files are in.
|
|
135
|
+
- New `fix` command and `fix-from-scan` skill: the last scan as a work order, `.claude/fix-plan.md`, in the order to work it, every finding a box. `scan` also lists near copies and functions made again.
|
|
136
|
+
- No person is named: rules, skills, hooks, comments and logs say "the user", and the writing pack is about the author's voice, whoever that is. `test/no-personal-name.test.mjs` holds it. The hook that repeats what the user asked is now `user-asks`, and the voice rule is now `direct-voice`; an `enable` list with the old name still works. Stock packs' author is `claude-packs`.
|
|
137
|
+
- Packs from senior reviews of three real repos, which found the worst faults had no check (one customer reading another's data, a guard that passed on an empty list, a password in a log): new `http-api` (any framework: every record tied to its caller, guards fail closed, validated input, safe credentials, SSRF, webhooks) with the `secure-a-route` skill; `react`; `multi-tenant` with `prove-tenant-isolation`; `websocket`; `host-agent` (root on other people's machines); `go` with a `go` configuration; and `ci`. `suggest` finds each from the project's files.
|
|
138
|
+
- New checks in `cpp` from the review of a large C++ repo: faults only in the test build (`cpp-no-getenv-in-product`), mutable statics and globals, `using namespace` in a header, `atoi`, unchecked `fwrite`, clamp before cast, typed pi, `const_cast`, float loop counters, a hardened test build, and rules on thread contracts, header hygiene and running static analysis. `base` gains `lookup-over-ternary-chains`, `stub-reports-success` and `test-skip-on-failed-setup`; `js-ts`, `mongo`, `docker`, `web` and `html-ui` gain checks too.
|
|
139
|
+
- New hook `code-shape`: a write that adds a line over 120 columns of code, a line with more than two statements, a function over 50 statements or over 6 parameters is refused; what stands is judged only if it gets worse. One repo's 300-line limit was being beaten by width: 21% of its code lines held two or more statements. Limits are in `guards.codeShape`. Held back in existing projects. The kit itself runs it with looser limits for now: its own lines are wider than the default.
|
|
140
|
+
- Kit faults those reviews found: `blankCode` read a `//` inside a string as a comment, so every check on strings or code could miss what followed a URL. `sh-strict-mode` could never fire. A private key header with no body is no longer a secret, a key under a custom prefix or in a `.private` file is. `file-size-guard` counts `.inc`, `.inl`, `.ipp` and `.tpp`. The clang-tidy header filter matched nothing on absolute paths. A check can state its `kind`, and `whenDep` limits one to a dependency's major version.
|
|
141
|
+
- Noise cut from what was read as false: `no-express-no-vite` and its rule moved to `full-stack`, since they are one stack's choice; `json-only-through-helper`, `ui-no-eyebrow`, `switch-is-a-table`, `no-shell-string-interpolation`, `client-no-api-key`, `stored-text-through-renderer`, `child-process-error-handler` and others tightened; a duplicate pair of checks no longer counts one line twice.
|
|
142
|
+
- KWB-43: `client-no-server-import` looked across the whole file at every position, so one scan never finished. `test/check-speed.test.mjs` holds every check to a budget.
|
|
143
|
+
- KWB-44: a shell write to a path in a variable was judged as if inside the project.
|
|
144
|
+
|
|
145
|
+
## 0.24.0 (2026-11-04)
|
|
146
|
+
|
|
147
|
+
Anything repeated becomes a template, in C++ above all ("we need to thoroughly do c++", "anything you find that is repeated should have something that makes it reuseable and template like", "maybe make a specific c++ pack"). Measured on Stellix: 523 files, 51,492 lines.
|
|
148
|
+
|
|
149
|
+
- `template-law` reads statements, not lines (`lib/code-shapes.mjs`). It now sees many statements on one line, and three kinds of repeat in code: an object set up field by field, a run of statements with one shape (a copied helper, whole or in part), and one call repeated with other arguments (a table written as code). Data tables, includes, imports, macros and JS template strings are not statements here. On Stellix it finds 302 repeats, 950 copies, where 0.23.0 found 10 and 68. Of 26 sampled by reading, none was a false match and 3 were borderline. A hook call there takes about 100 ms warm, 520 ms cold.
|
|
150
|
+
- A refusal says what to do: what the repeat should become, what differs between the copies (the template's parameters), and to take the copies out first. `scan` lists every repeat the same way, and in `claude-packs-scan.json`.
|
|
151
|
+
- A copy with the same name in another file now counts: 20 `bd` descriptors were invisible to 0.23.0 because they shared a name. Folders of kind `copy` and `guards.templates.exclude` are left alone.
|
|
152
|
+
- New `cpp` pack and `cpp` configuration: `cpp-repeats-become-templates`, `cpp-gates-share-one-reader`, `cpp-find-with-the-library` (with its check) and the `cpp-extract-template` skill. `synth-creator` offers it by default, the `synth` preset takes it, and `scan` recommends it for C++ sources.
|
|
153
|
+
- New base skill `make-it-a-template`, and the check `one-walk-per-template`: a test or gate that presses, clicks or drags every instance of a template is refused. On Stellix it finds the one such walk, in the press gate. New to a project, so held back until `enable` names it.
|
|
154
|
+
- The hover gate covers `ui-craft`: doctor is red for web UI code with no hover gate. `hover-state` moved from `full-stack` to `ui-craft`, which `full-stack` takes.
|
|
155
|
+
- The kit's own repeats are gone: selftests call `verdicts`, and the making-check limit cases share `sendBacks`.
|
|
156
|
+
|
|
157
|
+
## 0.23.0 (2026-11-04)
|
|
158
|
+
|
|
159
|
+
template-law (anything "component" used more than once is a template, enforced, in html, c++ and apps).
|
|
160
|
+
|
|
161
|
+
- New base hook `template-law`: a write that adds an element built by hand, in the shape of one already in this file or another of the checkout, is refused. It strips names and text (lib/elements.mjs), so copies that once-only cannot see look the same: markup by tags, attribute names and nesting (HTML, JSX, Vue, Svelte, template strings), and code by the members set on one object in a row (a C++ control, a widget). Using a component, a `.map()`, data rows and one object used twice are left alone; `one-off: <reason>` on a line marks a real exception. A new hook: held back in an existing project until `enable` names it. On AdmiralMCP's 175 files it finds 3 shapes, in 111 ms, and none in the kit.
|
|
162
|
+
- `scan` reports elements built by hand more than once. dispatch-once takes its walk from the shared lib.
|
|
163
|
+
|
|
164
|
+
## 0.22.1 (2026-11-04)
|
|
165
|
+
|
|
166
|
+
- One template, all the way through: `house-control-behaviours`, `prove-control`, `hover-state` and `hover-every-pressable` still asked to walk every control. They now walk one per template and every one-off, and prove the rest by a table read that each is built from its template and wired, which is what catches a control wired to nothing. `pointer-feedback`: the hover lives in the template.
|
|
167
|
+
|
|
168
|
+
## 0.22.0 (2026-11-04)
|
|
169
|
+
|
|
170
|
+
The depth of ui-craft (everything in taste-skill is useful; a hovered element says so; anything used twice is one template, tested once).
|
|
171
|
+
|
|
172
|
+
- Rules: `pointer-feedback`, `screen-answers-one-question`, `data-tells-the-truth`, `apps-are-not-pages`, `page-holds-its-frame`, `pictures-do-a-job`; deeper `motion-is-rare`, `survives-real-data`, `interface-copy`, `no-generated-look`, `type-space-colour`.
|
|
173
|
+
- Skills: `app-screen`, `chart-choice`, `page-critique`, `redesign-page`, `build-from-reference`, `write-the-page`. Tool `page-measure` for a `prove-page` gate, proved in real Chrome.
|
|
174
|
+
- Twelve checks from taste-skill's lint rules, and `no-ts-enum` and `test-name-says-behaviour` in js-ts.
|
|
175
|
+
- `test-the-template-once` (base): behaviour is tested on the template, once; a structural pass proves the instances are that template. `instances-by-index`, `subagent-dispatch` and `prove-instances-identical` say so.
|
|
176
|
+
- `shape_symmetry` scales: over 8 instances `members` compares each with the first and `swap` takes a spread of 8, so 1,000 instances cost under 20 swaps, not 499,500.
|
|
177
|
+
- `scan` lists secret-shaped text in test files apart. docs/rules-without-checks.md lists the rules no regex can hold. README: the packs table from the manifests, credits.
|
|
178
|
+
|
|
179
|
+
## 0.21.0 (2026-11-04)
|
|
180
|
+
|
|
181
|
+
Custom packs (if a person makes something for their employer's internals, it should be easy to make a repo and share it with their team).
|
|
182
|
+
|
|
183
|
+
- `new-pack <name> [--repo <git-url>]`: a ready repository for a team's own packs (`packs/<name>/`, a manifest, an example rule, check and skill).
|
|
184
|
+
- `add <name> --from <git-url>`: fetches the repository to a cache, never runs it, checks the manifest, and installs the pack in any configuration. The lock records its url and commit, so a
|
|
185
|
+
teammate's checkout restores the same pack; `update` pulls the newest. Access is the git host's. A custom pack's hooks stay off until the project's `"enable"` names them.
|
|
186
|
+
|
|
187
|
+
## 0.20.0 (2026-11-04)
|
|
188
|
+
|
|
189
|
+
What a real install found (AdmiralMCP on 0.14.0, its build/kit-review-plan.md Phase 5).
|
|
190
|
+
|
|
191
|
+
- Bugs: `entry-registers-shutdown` read its signal names with strings blanked, so handlers never counted; `no-nested-ternary` missed `a ? b : c ? d : e`; `no-swallowed-errors`
|
|
192
|
+
missed `.catch(() => ({}))`.
|
|
193
|
+
- The lock records the kit version. git-guard: `guards.git.ghAuth: "cli"` for a machine where gh is logged in; `guards.git.trunkNeedsYes` so neither a commit nor the session's end waits on a
|
|
194
|
+
trunk only the owner pushes.
|
|
195
|
+
- Checks that missed what they exist for: `driver-outside-gateway` (accessor functions), `no-db-in-route-file` and `origin-from-config-not-host` (`ui/`), `no-inline-client-script`,
|
|
196
|
+
`stored-text-through-renderer` (more fields, `esc(a ?? b)`), `no-latest-base` (`--platform`), `dockerignore-has-the-basics` (`**/` forms).
|
|
197
|
+
- Tuned: `line-under-200-chars` and `json-only-through-helper` leave tests, scripts and templates alone; `no-express-no-vite` allows vitest and the word; `lookup-over-if-chains` skips null guards;
|
|
198
|
+
`model-call-needs-boundary` takes an imported boundary; `mongoclient-cached-and-named` takes a module cache; `copy-needs-chown-with-user`, `user-bytes-need-disposition`, `docker-exec-form` on HEALTHCHECK.
|
|
199
|
+
- `no-find-reads` and `reads-aggregate-writes-bulk`: a `find` that sorts or limits in the database is fine; the check is for unbounded reads.
|
|
200
|
+
- Rules that named files a project may not have say to create them. kit-lock adopts its own lease after a session id change (KWB-40). The shape `ids` (KWB-16) and a row's `senses` (KWB-20).
|
|
201
|
+
|
|
202
|
+
## 0.19.0 (2026-11-04)
|
|
203
|
+
|
|
204
|
+
The pack manifest (pack.json says if a pack is stock or custom, has a git url, fields like a package.json, and who made it).
|
|
205
|
+
|
|
206
|
+
- Every `pack.json` now carries `name`, `version`, `description`, `type` (`stock` or `custom`), `author`, `license`, `homepage`, `repository` (`type`, `url`, optional
|
|
207
|
+
`directory`), `keywords` and `engines` (`claude-packs`, the lowest kit version it works on). `lib/pack-manifest.mjs` checks them; doctor checks the installed packs;
|
|
208
|
+
`list` shows version, type and author. The kit's own packs start at 1.0.0.
|
|
209
|
+
|
|
210
|
+
## 0.18.0 (2026-11-04)
|
|
211
|
+
|
|
212
|
+
hook-proof (whenever a hook is supposed to exit 2 and it exits 0, it is caught). Only exit 2 blocks, so a guard fails open and in silence.
|
|
213
|
+
|
|
214
|
+
- doctor is red for a hook no settings entry runs, and for a hook that crashed since it last changed (its exit code in `.claude/hooks.log`): those calls were not
|
|
215
|
+
judged, and went through. A hook killed at its timeout leaves no line and is not seen.
|
|
216
|
+
- New pack `hook-proof`, in every configuration: rule `a-refusal-is-exit-2`, skill `prove-a-hook`, and five checks on hook files and settings:
|
|
217
|
+
`hook-exit-1-does-not-block`, `hook-catch-must-not-allow`, `hook-no-or-true`, `hook-command-no-pipe`, `hook-refusal-on-stderr`.
|
|
218
|
+
- A work branch never needs a yes to push; only the trunk can, and only where a project's CLAUDE.md says so ("a project should not need a yes before pushing, only to main"): `finished-work-lands`, `land-branch`, `git-right-first-time`.
|
|
219
|
+
|
|
220
|
+
## 0.17.0 (2026-11-04)
|
|
221
|
+
|
|
222
|
+
ui-craft and landing.
|
|
223
|
+
|
|
224
|
+
- New pack `ui-craft` (build the UI/UX additions from the best public skills; docs/ui-craft-sources.md says what came from each): ten rules (forms, motion,
|
|
225
|
+
real data, URL state, touch, dates and numbers, interface copy, type and space, the generated look, the rendered page), skills `ui-code-review` and
|
|
226
|
+
`prove-page`, twelve checks. A check blocks only what is objective or what the sources agree on. The `node-ui` and `next-app` presets bring it; node
|
|
227
|
+
and full-stack take it (full-stack by default); `scan` recommends it for a UI.
|
|
228
|
+
- `layout.json` `"gates": { "a11y": "<command>" }`: doctor is red for UI code with no page gate, as for hover; `"none: <reason>"` declines.
|
|
229
|
+
- `design-direction` reviews the plan against the brief; `design-review` says which findings are law and which taste, and judges the production build.
|
|
230
|
+
- Rule `finished-work-lands` and skill `land-branch` (base: whenever a work branch is finished it is merged into main and pushed).
|
|
231
|
+
|
|
232
|
+
## 0.16.0 (2026-11-04)
|
|
233
|
+
|
|
234
|
+
Scan (a real install's review found security bugs that could have been very bad in production, so a project owner should get that review before choosing to install anything).
|
|
235
|
+
|
|
236
|
+
- `claude-packs scan [--out <file>]`: copies the project (what git tracks or would track; never .env, key files, node_modules or build output) to a temp
|
|
237
|
+
folder, installs the recommended configuration and packs there, runs every check over every file with the secret patterns, the line limit
|
|
238
|
+
and coverage, and writes a report and every hit beside the copy. The project, its .git included, is never written to. The recommendation
|
|
239
|
+
gives its evidence per pack (lib/scan-detect.mjs). A hit is reported as a candidate; a secret by file and line, never its value.
|
|
240
|
+
- `scan --prompt` prints the review brief (prompts/scan-review.md) for what no check can see: reviewers by concern (security, runaway work, work that
|
|
241
|
+
disappears, platform and operations), read-only, on the copy, every finding marked measured, read in the code, or claim.
|
|
242
|
+
- lesson-checks exports `loadChecks` and `hitsOf`, with line numbers.
|
|
243
|
+
- Fix: `no-find-reads` had `\bollection\b` for `collection`, so `collection.find(q)` got through; found by a real install's review.
|
|
244
|
+
|
|
245
|
+
## 0.15.0 (2026-11-04)
|
|
246
|
+
|
|
247
|
+
Writing (whatever goes public, a manual, a md file, a reply, reads and is formatted properly; split humanize into small pieces).
|
|
248
|
+
|
|
249
|
+
- New pack `writing`, in every configuration's `always` packs. Nine rules on public text (README, `*.mdx`, docs/manual, docs/guide, manual,
|
|
250
|
+
content, blog, posts, articles, drafts; internal specs, logs and briefs stay plain): `cut-the-padding`, `rhythm-like-talk`, `no-stock-language`,
|
|
251
|
+
`no-scaffolding`, `no-time-or-date`, `ascii-no-em-dash`, `write-from-your-own-corner`, `direct-voice`, `no-cargo-cult`.
|
|
252
|
+
- Ten one-job skills: `humanize` (the last pass), `reply-stance`, `should-i-reply`, `reply-moves`, `reddit-post`, `pick-subreddit`, `reddit-title`,
|
|
253
|
+
`argument-post`, `launch-post`, `post-voice`.
|
|
254
|
+
- Eleven lesson checks for the tells a regex can see, held back in existing projects until `enable` names them.
|
|
255
|
+
- lesson-checks: `"prose": true` (lib/prose.mjs) leaves frontmatter, code, comments, link targets and URLs out, so `npm test -- x` is no double dash.
|
|
256
|
+
|
|
257
|
+
## 0.14.1 (2026-11-04)
|
|
258
|
+
|
|
259
|
+
- The project is under the MIT license: LICENSE at the root; package.json and the lock say MIT (they said UNLICENSED).
|
|
260
|
+
|
|
261
|
+
## 0.14.0 (2026-11-04)
|
|
262
|
+
|
|
263
|
+
Stored text (UIs render what comes from a database with \r correct, code highlighted and markdown parsed).
|
|
264
|
+
|
|
265
|
+
- New pack `stored-text`: rule `stored-text-renders-once` (one renderer, `stored-text.*`: normalise line endings; markdown with raw HTML off;
|
|
266
|
+
highlight fenced code by language on the server; sanitize last; a terminal's lone `\r` overwrites its line; a visible backslash-r is a
|
|
267
|
+
write bug, fixed at the source), skill `render-stored-text` (how to build it, and the fixture row that proves it), and four checks:
|
|
268
|
+
`stored-text-renderer-complete` (needs mode: the renderer does all four jobs), `stored-text-libs-only-in-renderer`,
|
|
269
|
+
`no-raw-html-from-data` (`dangerouslySetInnerHTML`, `innerHTML`, `v-html` take only the renderer's output) and
|
|
270
|
+
`stored-text-through-renderer` (a `content`, `body`, `markdown` or `transcript` field straight into markup; it reads names, not data
|
|
271
|
+
flow; a `plain text:` comment marks a field that is plain).
|
|
272
|
+
- The `node-ui` and `next-app` presets bring it; the node and full-stack configurations take it (full-stack by default).
|
|
273
|
+
## 0.13.1 (2026-11-04)
|
|
274
|
+
|
|
275
|
+
- git-guard: a commit in a Claude agent's isolated worktree (.claude/worktrees/agent-*) is not refused for its branch being ahead of
|
|
276
|
+
GitHub: the harness refuses pushes there, so the lead pushes the branch; Stop still holds every branch to GitHub (KWB-42).
|
|
277
|
+
|
|
278
|
+
## 0.13.0 (2026-11-04)
|
|
279
|
+
|
|
280
|
+
The time laws (KWB-41: "Anything like tests that consume a ton of time that could/should be avoided should have a small skill or rule or both").
|
|
281
|
+
|
|
282
|
+
- doctor remembers a passed selftest (lib/selftest-cache.mjs) by the hash of the hook, hooks/lib, the runner, node, the detector and the
|
|
283
|
+
project's guards: an unchanged hook is not proved again (7.5 s to 1.9 s per doctor, on every init, update and test). A failure is never
|
|
284
|
+
remembered; `doctor --fresh` runs them all. `npm test` keeps one memory per run.
|
|
285
|
+
- Hook `suite-once` (base): a whole-suite command (`npm test`, a bare `ctest`, the project's `commands.test`) is refused on uncommitted
|
|
286
|
+
work: the whole suite runs once, as the gate before landing. Named tests and changed-only runs pass. Rule `test-only-what-changed`,
|
|
287
|
+
skill `pick-tests`. New to a project, so held back until `enable` names it; the kit runs it on itself.
|
|
288
|
+
- `test:changed`: a version bump alone chooses no test; a pack other than base chooses only the tests that bring it in, by name, preset
|
|
289
|
+
or configuration (nginx 29 of 35 files to 6).
|
|
290
|
+
- Rules behind the hooks that cost the most turns, each installed with its hook: `git-right-first-time`, `reuse-before-writing`,
|
|
291
|
+
`making-line-first`, `split-before-the-limit`, `long-work-in-the-background` (synth-creator). Skill `build-through-the-queue`.
|
|
292
|
+
|
|
293
|
+
## 0.12.0 (2026-11-04)
|
|
294
|
+
|
|
295
|
+
The v8 additions (claude-packs-kit-v8-additions.zip: the web side of mddkit), merged by hand on top of 0.11.0.
|
|
296
|
+
|
|
297
|
+
- fastify: security is one `isProd` switch (mddkit http-security's iron rule), not "always on": rule `security-one-switch` and
|
|
298
|
+
checks `sec-headers-present` (needs mode: `Fastify(` needs `helmet`), `no-trust-proxy-true`, `no-err-message-to-client` replace
|
|
299
|
+
`security-always-on` and `security-not-behind-node-env` (deleted). `one-error-body` cites the new rule. Rules
|
|
300
|
+
`credentials-and-input` and `three-layers` with checks `no-regexp-from-input`, `password-needs-slow-hash`,
|
|
301
|
+
`secrets-compared-constant-time`, `api-routes-versioned`, `no-db-in-route-file`.
|
|
302
|
+
- New packs: `web` (Next.js/React: accessibility, styles in stylesheets, Tailwind 4, one UI-primitives module, web performance,
|
|
303
|
+
production build, client boundaries; 7 rules, 20 checks, skills design-direction, design-review, pick-rendering-mode,
|
|
304
|
+
preflight-build, seo-audit), `tui` (1 rule, 5 checks, skill build-tui), `nginx` (nginx-production and modsecurity-tuning;
|
|
305
|
+
7 checks, skill waf-rollout). The node configuration takes them.
|
|
306
|
+
- js-ts: rule `one-logger`, check `tsconfig-flags` (strict, noUncheckedIndexedAccess, verbatimModuleSyntax). ai: rule
|
|
307
|
+
`llm-pipeline-security`, check `model-output-validated`.
|
|
308
|
+
- Presets: eight (`next-app`, `node-cli` and `edge` added).
|
|
309
|
+
- docker's per-service compose checks arrived already in the kit (0.11.0): the same JSON, the kit's formatting kept.
|
|
310
|
+
- Not taken: the zip's lib/packs.mjs beyond its PRESETS block (the kit's is newer). `seo-audit` has no `checks.md` beside it
|
|
311
|
+
(mddkit's references/checks.md was not in the zip; the skill says so and falls back).
|
|
312
|
+
|
|
313
|
+
## 0.11.0 (2026-11-04)
|
|
314
|
+
|
|
315
|
+
The v7 additions (claude-packs-kit-v7-additions.zip, merged by hand: the kit's own files kept wherever the zip's were older).
|
|
316
|
+
|
|
317
|
+
- Dispatch laws in base, for C++ and JS/TS: rules `lookup-over-if-chains` (three branches on one value are a lookup),
|
|
318
|
+
`field-map-over-if-runs` (three ifs on one object's fields are a field table and one loop) and `behaviour-lives-with-its-kind`
|
|
319
|
+
(each kind owns its behaviour in one object, table or class, chosen once). Checks `lookup-over-if-chains` (also catches ifs in a
|
|
320
|
+
row that each return on the same value, the act-line renderer's shape the zip's version missed) and `field-map-over-if-runs`.
|
|
321
|
+
Hook `dispatch-once`: a write that adds a `switch` on a kind another code file of the same checkout already switches on is
|
|
322
|
+
refused; every write route, worktree-aware, through the runner, with a selftest (seen red on a planted fault). The rules' hot-loop
|
|
323
|
+
exception points at audio-core's `per-sample-code-inlinable`; their examples name no synth word (base-neutral).
|
|
324
|
+
- lesson-checks: `mode: "needs"` (when `pattern` appears, every regex in `needs` must too; a write is refused only for a need it
|
|
325
|
+
newly leaves missing), ported into the kit's lesson-checks; the modes are one table.
|
|
326
|
+
- Seven new packs: `js-ts` (22 rules, 22 checks), `mongo` (5, 16), `fastify` (3, 8), `ai` (1, 3), `docker` (3, 21, skill
|
|
327
|
+
`docker-diagnose`), `shell-hooks` (1, 4), `html-ui` (1, 4). Configuration `node` takes them (base always; init takes js-ts).
|
|
328
|
+
- Presets: `init node-api` (js-ts, mongo, fastify, ai, docker), `node-ui` (js-ts, mongo, fastify, html-ui, docker), `mcp-server`
|
|
329
|
+
(js-ts, mongo, ai, shell-hooks), `node-lib` (js-ts), `synth` (audio-core); `list` shows them. A preset's configuration is the
|
|
330
|
+
smallest one that takes its packs.
|
|
331
|
+
- docker: `compose-service-needs-init` and `compose-service-needs-healthcheck` judge each service, not the file: a compose file where
|
|
332
|
+
only one service has `init: true` (or a healthcheck) is refused, naming the service that lacks it.
|
|
333
|
+
- base's `js` concept is scoped like `cpp` (src/, tests/, test/), so doctor's coverage still finds a source file outside the
|
|
334
|
+
structure; full-stack maps it to its code folders. js-ts's own `js` concept stays repo-wide.
|
|
335
|
+
- The kit's own if-chains are tables: the WAV reader (one reader per encoding, chosen once per file), the glob matcher, freeze.mjs,
|
|
336
|
+
version-pin-guard's manifest parsers and git-guard's token-storing subcommands. Left as they are: shell-writes.mjs's tokenizer
|
|
337
|
+
(character and operator dispatch with control flow in each branch; a table would not make it clearer).
|
|
338
|
+
- The kit runs the three new laws on itself (layout `enable`).
|
|
339
|
+
- Not taken from the zip, the kit's being newer: lesson-checks.mjs, lib/packs.mjs, bin/claude-packs.mjs (presets merged in),
|
|
340
|
+
coverage, project.mjs, placement-law, file-size-guard, version-pin-guard, prove-control, subagent-dispatch and three tests; the
|
|
341
|
+
synth-creator pieces 0.10.0 moved out of base (frozen-files, stage-guard, freeze, two rules) stay out; the global `new-project`
|
|
342
|
+
skill stays the `new` command (the global part is three pieces).
|
|
343
|
+
|
|
344
|
+
## 0.10.1 (2026-11-03)
|
|
345
|
+
|
|
346
|
+
The hover law (2026-11-03; the kit half of Stellix B-261): "Controls dont have a hover state ... all controls and screens that
|
|
347
|
+
has points that can be interacted with needs to not only change the cursor to what the interaction is but also some kind of small
|
|
348
|
+
effect on whats actually hovered."
|
|
349
|
+
|
|
350
|
+
- Rule `hover-every-pressable` (gpu-painter, concept `ui`) and `web-hover-every-pressable` (full-stack, concept `ui`, now the
|
|
351
|
+
`channel` folder): every element the pointer can act on has a cursor naming its interaction and a small visible effect on the
|
|
352
|
+
hovered thing itself; the hover follows the press's own hit test (one function, never a second list); the disabled look is only
|
|
353
|
+
for what is truly disabled.
|
|
354
|
+
- Skill `hover-state` (gpu-painter, full-stack): how to add the hover to a new control and how to prove it with a hover walk
|
|
355
|
+
(the pointer over every pressable item; the cursor and the drawn pixels change; the ring round it does not; it returns to rest;
|
|
356
|
+
the faults planted so the gate is seen red). Cites Stellix's `tools/gates/hover_gate.sh` and
|
|
357
|
+
`lib/app/gates/editor_hoverwalk_read.h` as the worked example.
|
|
358
|
+
- Check: `layout.json` `"gates": { "hover": "<command>" }` (a project-owned key, kept by every update). doctor is red when the hover
|
|
359
|
+
rule is installed, a file stands under its paths and no hover gate is declared, or the declared command names a file that is not
|
|
360
|
+
there; `"none: <reason>"` declines with its reason. A fresh project with no UI code yet stays green (`doctor --strict` on a fresh
|
|
361
|
+
install of each configuration is unchanged). The Stellix profile declares `bash tools/gates/hover_gate.sh`.
|
|
362
|
+
- `test/hover.test.mjs`: 7 tests, red on 0.10.0, green.
|
|
363
|
+
|
|
364
|
+
## 0.10.0 (2026-11-03)
|
|
365
|
+
|
|
366
|
+
Configurations (STEP 3: "Today the kit is one configuration pretending to be general. Build it as data."; KWB-31).
|
|
367
|
+
|
|
368
|
+
- `configurations/<name>/config.json`: a kind of project as data: its packs (`always`, `choose`, `default`), its layout template
|
|
369
|
+
(the folders `init` creates), `hookOrder` (its hooks' order per settings entry), `sourceFiles` (what doctor's coverage counts
|
|
370
|
+
as source) and the `preamble` (the house rules of the CLAUDE.md block). `init --config <name>` stores it in layout.json
|
|
371
|
+
`"configuration"`; `update` applies that one (an install that names none gets the smallest configuration that takes its
|
|
372
|
+
packs, and writes it); `config <name> [--dry-run]` lists what changes (packs, rules, hooks, checks, skills, preamble, template
|
|
373
|
+
folders), then switches; `configs` lists them; doctor prints the configuration and fails on an unknown one or a pack outside it.
|
|
374
|
+
- Three configurations: `base` (universal engineering only; the kit's own repo is on it), `synth-creator` (everything installed
|
|
375
|
+
before; Stellix and Sub37) and `full-stack` (Fastify + Next.js).
|
|
376
|
+
- base holds only universal engineering: git-guard, file-size-guard, folder-law, placement-law, the shape law (shape-law,
|
|
377
|
+
brief-guard, making, making-check, once-only, shape-symmetry), lesson-checks, and two new laws. Everything synth-specific
|
|
378
|
+
moved, byte for byte, to the new `synth-creator` pack (installed only by that configuration): build-guard, time-guard,
|
|
379
|
+
spec-lock, frozen-files (+ freeze.mjs), protect-vendor, stage-guard, build-sweep, idle-wake, user-asks; the rules
|
|
380
|
+
debug-by-measurement, done-means-fresh-evidence, hooks-and-gates, copy-trees-read-only; the build-step skill.
|
|
381
|
+
realtime-checks.mjs moved to audio-core beside realtime-guard. The synth examples left in base (src/dsp, Voice.cpp, "sounds",
|
|
382
|
+
synth.git) were made neutral; test/base-neutral.test.mjs refuses a synth word (sound, panel, patch, voice, DSP, synth) in base.
|
|
383
|
+
- `secrets-guard` (base, KWB-33): no .env, key file or credentials file staged (`git add`, also `-f`, and `-A`/`.` while one is
|
|
384
|
+
not ignored); no literal GitHub, Anthropic, OpenAI, AWS, Slack or Stripe key, private key block or connection-string password
|
|
385
|
+
written into a file; no .env written while git does not ignore it. Rule: secrets-never-committed.
|
|
386
|
+
- `untrusted-boundary` (base, KWB-34): a model call (Anthropic, OpenAI, AI SDK) added to a JS, TS or Python file that has no
|
|
387
|
+
per-call SHA-256 boundary (`wrapUntrusted(...)`) and no `untrusted: none` line is refused. Rule: untrusted-content-boundary.
|
|
388
|
+
- A rule may state one hook's law (`# hook: <file>` in its frontmatter): it is held back, left out or switched on with that hook.
|
|
389
|
+
Both new laws are on in a new project and held back in one that had base before (name them in `"enable"`).
|
|
390
|
+
- `full-stack` pack: `stack-guard` (no express or vite in a package.json, an import or an install; no zod below 4),
|
|
391
|
+
`schemas-only` (z.object only in the schemas folder; env.ts excepted), and ten rules per folder: the stack, thin routes,
|
|
392
|
+
handlers, one database gateway with chain keys first, one error contract, Zod 4 schemas, env.ts shapes only, health and
|
|
393
|
+
correlation id and remote_ip on every log line with helmet and rate-limit behind isProd, multistage Dockerfile, inject() tests.
|
|
394
|
+
Layout template: packages/core/src/schemas, api/src/{routes,handlers,adapters,auth}, api/test, channel.
|
|
395
|
+
- doctor's coverage reads what is source from the configuration (`sourceFiles`): TypeScript and JavaScript in full-stack (KWB-32).
|
|
396
|
+
- `planner-skills [--out <dir>]` (KWB-35): one project-layout skill body per configuration, from its layout template, packs and
|
|
397
|
+
preamble.
|
|
398
|
+
- Stellix and Sub37: update in synth-creator makes what 0.9.15 made, the `"configuration"` key aside: the same settings.json,
|
|
399
|
+
CLAUDE.md and file set; content changes only in the base files made neutral (test/noop.test.mjs, fixtures from both projects).
|
|
400
|
+
- Tests: configs (8), base-neutral (2), base-laws (2), noop (3), full-stack (3), configurations (5); each seen red on 0.9.15.
|
|
401
|
+
|
|
402
|
+
## 0.9.15 (2026-11-03)
|
|
403
|
+
|
|
404
|
+
- The kit lock is a lease (KWB-29): `.claude-packs-lock` carries `started_at` and `last_seen`; the holder's kit-lock hook (now on
|
|
405
|
+
every tool call) renews `last_seen` at most once a minute, and a holder whose hooks are another project's (a Stellix lead and
|
|
406
|
+
its agents) renews it by working: its transcript or a subagent's, written later, counts as seen. No renewal for 30 minutes
|
|
407
|
+
and the lease is stale: the next session that writes or commits takes it over, logged in `.claude/kit-lock.log` (who held it,
|
|
408
|
+
branch, since, last seen, by whom). A live lease is never taken or deleted; `lock release --force` is the only way, and says
|
|
409
|
+
so. Nothing prints "since undefined": a lock with no start reads "start unknown". `lock status` prints held since, last seen
|
|
410
|
+
and live or stale; `lock take [--branch <b>]` takes the lock for a session whose hooks are not the kit's. The lock and its
|
|
411
|
+
log are runtime state, ignored by git (renewing a committed lock would dirty the tree every minute).
|
|
412
|
+
- kit-lock guards commits, merges and releases only (KWB-30): `git commit`, `merge`, `pull`, `cherry-pick`, `revert`, `am`,
|
|
413
|
+
`rebase`, `git tag <name>`, `npm version`, `publish`, `pack`, and removing another session's live lease. Editing files and
|
|
414
|
+
`git push` of commits that exist pass whoever holds the lock (a push in a command that also wrote a log in the repo was
|
|
415
|
+
refused).
|
|
416
|
+
- Tests: test/lock-release.test.mjs, four new (a lease 31 min old taken over and logged, 29 min held; the holder's activity renews it,
|
|
417
|
+
throttled; "start unknown", never "undefined"; a push passes and a commit, merge, tag and npm release are refused while
|
|
418
|
+
another live session holds the lock), each seen red on 0.9.14.
|
|
419
|
+
|
|
420
|
+
## 0.9.14 (2026-11-03)
|
|
421
|
+
|
|
422
|
+
- The kit is a project like any other (KWB-26): its own `.claude/` carries the base pack (`.claude/layout.json` names the kit's
|
|
423
|
+
folders, the house git laws and the trunk refusal on), so every base hook judges work on the kit, kit-lock beside them, and
|
|
424
|
+
`doctor --strict` passes on it.
|
|
425
|
+
- git-guard, two house laws (KWB-26): a `git commit` is refused while the branch has commits that are on no GitHub branch (the
|
|
426
|
+
first commit of a new branch passes, the next waits for its push; a push earlier in the same command counts), naming the
|
|
427
|
+
commits and the push with the token named; the end of a session (Stop) is refused while any local branch is ahead of GitHub or
|
|
428
|
+
missing there, listing them with one push command and never offering a delete (three identical refusals end the session, the
|
|
429
|
+
list going to the user). GitHub's heads come from `git ls-remote` (protocol v0, one request; the token from the environment or
|
|
430
|
+
~/.env as a header in the child's environment, never on the command line or stored). The last look is kept in the git dir and
|
|
431
|
+
only ever lets work through: anything it would refuse is looked up live, so a push seconds ago counts at once and a commit or
|
|
432
|
+
Stop the last look clears makes no network call. GitHub out of reach (offline, no token): a warning, and the work goes ahead.
|
|
433
|
+
git-guard is registered on Stop in the base pack.
|
|
434
|
+
- settings: the runner folds in only a hook that exports `hook(text)`; any other node hook keeps its own entry (the kit's
|
|
435
|
+
kit-lock was folded in and failed as exit 1, so it never refused). An update unfolds a runner command into one entry per hook
|
|
436
|
+
before it rebuilds the kit's entries, so a project's own hook in it is kept (it was dropped). kit-lock exports `hook`.
|
|
437
|
+
- Every doc, hook message, rule, skill and command text names the kit as `npx --no-install @thedecipherist/claude-packs ...`
|
|
438
|
+
(KWB-28: a bare `npx claude-packs` in a project without node_modules downloaded and ran an unrelated public package).
|
|
439
|
+
- Tests: test/kit-guards.test.mjs (own hooks through init and two updates; the kit's own install and doctor --strict; no kit
|
|
440
|
+
command, hook, skill or doc deletes a branch), test/npx-name.test.mjs (no bare `npx claude-packs` anywhere in the kit).
|
|
441
|
+
|
|
442
|
+
## 0.9.13 (2026-11-03)
|
|
443
|
+
|
|
444
|
+
- gnu-shell works on Linux as well as macOS (KWB-27): on Linux the system tools are GNU already, so no Homebrew is looked for and
|
|
445
|
+
nothing says the tools are BSD; `~/.claude/bin` still goes first on the Bash tool's PATH, a zsh session is still warned on every
|
|
446
|
+
command, and the shell is still checked for bash 5 (any bash 5). macOS is unchanged. The selftest fakes each bash version instead
|
|
447
|
+
of reading the machine's `/bin/bash`, so `global doctor` and `npm test` pass on Linux (they failed there on "Apple's bash 3.2").
|
|
448
|
+
- CLAUDE.md for working on the kit itself.
|
|
449
|
+
|
|
450
|
+
## 0.9.12 (2026-11-03)
|
|
451
|
+
|
|
452
|
+
- Hook timing (KWB-24): every installed hook writes one line per call to `.claude/hooks.log` (ISO time, event, hook, ms, exit
|
|
453
|
+
code, tool), through one helper per language (`hooks/lib/hook-log.mjs`, `hooks/lib/house.py` `log_hook`); the log is cut to
|
|
454
|
+
its newest half past 256 KB and is git-ignored. `doctor` prints each hook's median and worst over its last 100 calls, and a
|
|
455
|
+
hook whose MEDIAN is over 500 ms is a red check (the median is what every call pays; the worst is printed, never judged: one
|
|
456
|
+
call on a loaded machine is a spike, not the hook's cost).
|
|
457
|
+
- One node process per settings entry: `hooks/run-hooks.mjs` runs every kit node hook of an entry in turn (each hook exports
|
|
458
|
+
`hook(text)`; its stdout and stderr are caught, its timing line written; the runner exits 2 when any hook refused). settings.json
|
|
459
|
+
names the runner and its hooks (`node ".../run-hooks.mjs" .claude/hooks/a.mjs ...`); an async hook (idle-wake) and the Python
|
|
460
|
+
hook keep their own entries. Every hook still runs on its own, and every selftest's hook calls go through the runner. Measured
|
|
461
|
+
on a copy of Stellix (load 14 to 25): the 15 hooks on a Bash rm, 1676 ms wall and 3468 ms one by one before, 423 ms and 777 ms
|
|
462
|
+
after; no hook process over 500 ms median.
|
|
463
|
+
- once-only keeps an index (per source file, the hashes of its 20-token windows, in the temp folder, keyed by modification time
|
|
464
|
+
and size): built once (1.7 s on Stellix's 752 sources), then only files that changed are read again (a walk that stats, about
|
|
465
|
+
100 ms). The index finds candidates, looser than jscpd so it holds every clone jscpd finds (measured: all 55 files jscpd flags on
|
|
466
|
+
Stellix); jscpd then confirms on those files alone, so a write is refused when jscpd over the repo would refuse it, and a write
|
|
467
|
+
with no candidate never starts jscpd. making-check judges the turn's writes the same way, with one git diff for all its files.
|
|
468
|
+
- making-check reads the transcript from its end (1 MB, more only when the turn's prompt is further back): 1.7 s to 4 ms on a
|
|
469
|
+
277 MB transcript. A transcript over 512 MB could not be read at all before, so making-check judged nothing in those sessions.
|
|
470
|
+
The branch comes from the HEAD file, not a git process.
|
|
471
|
+
- time-guard: the controller's scan of every worktree (a git status in each: over a minute for Stellix's 125 worktrees, killed at
|
|
472
|
+
the hook's timeout before it saved, so every call scanned again) runs in its own background process; its finding is told on the
|
|
473
|
+
next call, once. An agent's own worktree is looked at once a minute, not on every call.
|
|
474
|
+
- `claude-packs lock status` and `lock release [--force]` (KWB-25): each checkout's kit lock, its holder, branch, start and
|
|
475
|
+
whether the session is live (its pid runs, or its transcript was written in the last 15 min). release takes away the caller's
|
|
476
|
+
own lock or a gone session's; another live session's lock stays unless --force. The lock's form is extensible
|
|
477
|
+
(`version`, `holder: { session, pid }`, `branch`, `started_at`, with the old keys beside them); the old form is still read.
|
|
478
|
+
|
|
479
|
+
## 0.9.11 (2026-11-03)
|
|
480
|
+
|
|
481
|
+
- lib/shape.mjs back under 300 lines (0.9.10 took it to 301, past a project's line limit); a test now holds every installed file to 300 lines.
|
|
482
|
+
|
|
483
|
+
## 0.9.10 (2026-11-03)
|
|
484
|
+
|
|
485
|
+
- shape-law and brief-guard judge what a write adds by what each finding names (concept, instance, reason), not by its line's
|
|
486
|
+
text: a line that was there, then edited or moved (a bug row closed and moved to Fixed with its cause), names nothing new; a
|
|
487
|
+
second copy of a literal is still refused (KWB-23).
|
|
488
|
+
|
|
489
|
+
## 0.9.9 (2026-11-03)
|
|
490
|
+
|
|
491
|
+
- shape-law reads a multi-word all-caps label as a control's name, not an instance: "AIM EFFECTS 100" (a value) and "a NOTES MONO
|
|
492
|
+
oscillator" (a setting) are let through; a single role word ("the PAD slot") and "SLOTS 2" are still refused. A number past a
|
|
493
|
+
concept's count is a value, not an instance ("slot 40 ms") (KWB-22).
|
|
494
|
+
|
|
495
|
+
## 0.9.8 (2026-11-03)
|
|
496
|
+
|
|
497
|
+
- protect-vendor reads a layout key `writeOnce` (globs): evidence a command leaves. A new file there may be written by any route;
|
|
498
|
+
an existing one is never overwritten, edited, appended to, moved or deleted (KWB-21). A project that listed its evidence folder
|
|
499
|
+
under `protected` (every write refused, so no evidence could be added) moves it to `writeOnce`.
|
|
500
|
+
|
|
501
|
+
## 0.9.7 (2026-11-02)
|
|
502
|
+
|
|
503
|
+
- The shell reader (every hook that judges a shell write) reads a path through the variables the command set earlier
|
|
504
|
+
(`S=/tmp/x; cat > $S/a.md`), so a write outside the project is no longer judged as `<project>/$S/a.md` (KWB-18).
|
|
505
|
+
- Several shell writes to one file in one command (`sed -i A f && sed -i B f`) are judged as one change: once-only no longer
|
|
506
|
+
reads them as two copies of the file (KWB-13).
|
|
507
|
+
- making-check judges the concepts of code writes only: docs, briefs, build/, inbox/ and notes are not judged (KWB-19).
|
|
508
|
+
|
|
509
|
+
## 0.9.6 (2026-11-02)
|
|
510
|
+
|
|
511
|
+
- making-check reads a making line's concepts with bracketed text stripped first, nested brackets too, so a ";" inside a shape
|
|
512
|
+
("slot (many, 4; slotId(i, field))") no longer ends the list and turns "4" into an unknown concept (KWB-17).
|
|
513
|
+
|
|
514
|
+
## 0.9.5 (2026-11-02)
|
|
515
|
+
|
|
516
|
+
- build-guard takes `build.sh build <one target>`: the single word is read as a build folder only when it is a path or a folder that
|
|
517
|
+
exists; a target name builds that target (KWB-14; Stellix WB-90, WB-95).
|
|
518
|
+
- shape-law's role-name check leaves a gate's verdict word before a concept word alone ("FAIL slot 2"; KWB-15).
|
|
519
|
+
|
|
520
|
+
## 0.9.4 (2026-11-01)
|
|
521
|
+
|
|
522
|
+
- The write hooks judge an inline program that writes files (python3 -c / a heredoc, node -e, perl -e/-i, ruby -e/-i): its open-for-write,
|
|
523
|
+
write_text, shutil, fs.writeFileSync and the like are writes to their paths, with the new content where the program states it (KWB-8:
|
|
524
|
+
agents had made whole fixes through Python and the hooks never saw them). Script files and `-m` modules are not judged as writes.
|
|
525
|
+
- The no-code-after-midline-comment check stays on one line; a line-end comment followed by a `return` or a call is no longer refused (KWB-9).
|
|
526
|
+
- design/shape.json `"values"`: plain value types the new-type check skips (KWB-10).
|
|
527
|
+
- design/shape.json `"names"` on a concept: its instances' identity names (a planet's kind: the DELAY planet); the role-name check allows a
|
|
528
|
+
listed name and still refuses an unlisted one (KWB-12: different things by ID).
|
|
529
|
+
- The release steps fast-forward the local main as well as the remote (KWB-11).
|
|
530
|
+
|
|
531
|
+
## 0.9.3 (2026-11-01)
|
|
532
|
+
|
|
533
|
+
- The shape reader's "seen in:" / "example:" test is linear: a long row of dashes (a 75-dash comment in a CMakeLists) made its regex
|
|
534
|
+
backtrack exponentially and hung `shape scan`, shape-law and brief-guard (KWB-6: 202 characters took 109 s). test/example-line.test.mjs.
|
|
535
|
+
- making-check's limit of three identical send-backs holds when the host delivers each send-back as a new turn (KWB-7); its selftest names
|
|
536
|
+
its sessions per run, so repeated runs in one temp folder no longer add to each other's counts).
|
|
537
|
+
|
|
538
|
+
## 0.9.2 (2026-11-01)
|
|
539
|
+
|
|
540
|
+
- brief-guard excuses a declared constant read by name (the number rule's third form), as well as a `seen in:` / `example:` line; a
|
|
541
|
+
selector still does not excuse an instance in a brief (KWB-4). Selftest 17 cases.
|
|
542
|
+
- An install adds `.claude/usage.log` (brief-guard's refusal counter, a local log) to the project's .gitignore, so a step's save never
|
|
543
|
+
stops on it (KWB-4). test/gitignore.test.mjs.
|
|
544
|
+
- making-check judges each write against its own checkout's build.md, manifest and layout, not the session's working folder: a lead
|
|
545
|
+
in the main checkout writing in a worktree was sent back for a making line that was there (KWB-5). test/worktrees covers it.
|
|
546
|
+
|
|
547
|
+
## 0.9.1 (2026-11-01)
|
|
548
|
+
|
|
549
|
+
- layout: `keepWorktrees` (build-sweep's never-swept worktrees, 0.8.0) is project-owned and kept through `update`; the first update after
|
|
550
|
+
0.8.0 dropped it, as 0.7.2 dropped `buildOutput`. test/layout-owned.test.mjs covers it (red without the fix), and a new test fails
|
|
551
|
+
when any layout key the kit's hooks or tools read is neither written by the layout builder nor project-owned, so a third key cannot be lost.
|
|
552
|
+
|
|
553
|
+
## 0.9.0 (2026-11-01): the shape law
|
|
554
|
+
|
|
555
|
+
**What this prevents** (KWB-1): a day lost to a hard-coded instance. One spec sentence named "slot 2"; it spread through 9 agent
|
|
556
|
+
briefs and about 50 tests into code that knew slot 2, and the instance checks, scoped to the engine folders, let the world and the
|
|
557
|
+
space code through. From this release whether a thing is ONE or MANY is written down before it is built, every check reads it, and
|
|
558
|
+
no folder list decides what is checked.
|
|
559
|
+
|
|
560
|
+
- `design/shape.json` per synth: every concept once, `one` (a frozen id) or `many` (N instances of one shape, reached only by its
|
|
561
|
+
generator or a loop), with its generator, selectors (named rules that pick an instance) and declared constants (a named instance with
|
|
562
|
+
a reason). `new` and a synth's `init` write an empty one; doctor fails a synth without one, or with a row that breaks the contract.
|
|
563
|
+
- The number rule (`lib/shape.mjs`, one reader for every hook): a literal instance in code, test, doc, brief or making line is an
|
|
564
|
+
example (a `seen in:` / `example:` line), a selection rule (a selector in the manifest) or a declared constant (read by name);
|
|
565
|
+
anything else is refused with "example, rule, or constant?". `claude-packs shape scan` lists every finding in a repo.
|
|
566
|
+
- Hook `shape-law` (write-time, every write route, every folder but the manifest's `exclude`): refuses an instance literal, a test that
|
|
567
|
+
drives one instance, an unlisted selector and an instance type with no manifest row. It replaces the engine-scoped
|
|
568
|
+
`no-instance-index-literal` and `no-instance-id-literal` checks (retired; `update` removes them). Selftest 31 cases.
|
|
569
|
+
- Hook `brief-guard` (PreToolUse on Agent; writes to docs/ and inbox/): a brief, spec or recipe names an instance only on a `seen in:`
|
|
570
|
+
or `example:` line; the refusal quotes the manifest row and the fix; refusals counted per concept in .claude/usage.log. Selftest 15.
|
|
571
|
+
- Gate `shape_symmetry`, generated at configure time from the manifest (`claude-packs symmetry gen --cmake|--list`, run by
|
|
572
|
+
`.claude/tools/shape-symmetry.mjs`): every instance has the same members, every one of the N·(N-1)/2 pairs swaps the same; a many
|
|
573
|
+
concept with no symmetry commands is red until it has them. Red on a planted missing member and a planted swap difference. It
|
|
574
|
+
replaces the instances-by-index swap check.
|
|
575
|
+
- Hook `making` (UserPromptSubmit, 62 words; 77 with the echo): what are you making, each concept's shape, a new concept's row first, a
|
|
576
|
+
brief naming an instance is wrong, a thing used twice is one parameterized function; when the prompt names an instance it echoes
|
|
577
|
+
"you named X: building for all <shape>, X is the reproduction". doctor prints its cost (about 107 tokens per prompt, estimated).
|
|
578
|
+
- Hook `making-check` (Stop): the concepts written this turn match the `making:` line and have manifest rows, the writes passed
|
|
579
|
+
once-only, and an override cites a law file line (shape.json, the spec, docs/laws.md) or an overnight Decisions entry; otherwise
|
|
580
|
+
the turn is sent back, naming what is missing (after three identical send-backs the findings go to the user). Selftest 24.
|
|
581
|
+
- Hook `once-only` (write-time, every write route): a new block that nearly repeats code already in the repo (jscpd 5.4.2; 6 lines or
|
|
582
|
+
50 tokens; C++, Python, JS) is refused with the existing location and the fix (call it, or extract one function both call). doctor
|
|
583
|
+
prints the repo's duplicate count; `claude-packs dup scan` lists them. Selftest 17.
|
|
584
|
+
- build-step and subagent-dispatch: a step that introduces a concept adds its shape.json row as its first commit; briefs quote the row.
|
|
585
|
+
- shape-law, brief-guard, once-only, making and making-check are on by default (`onByDefault`); `update` switches them on.
|
|
586
|
+
- `npm run test:changed` (`scripts/test-changed.mjs`): runs only the tests that reach the changed files, with the fresh-tmp preload,
|
|
587
|
+
printing why each was chosen; the full `npm test` stays the release gate (KWB-2).
|
|
588
|
+
- version-pin-guard (global): reads a `cd`'s target before `npm install`, and no longer reads "npm install" inside a heredoc (KWB-3;
|
|
589
|
+
takes effect after `claude-packs global add`).
|
|
590
|
+
|
|
591
|
+
## 0.8.0 (2026-11-01)
|
|
592
|
+
|
|
593
|
+
- build-sweep (base, opt-in; SessionStart and SubagentStop): removes the build output of agent worktrees under `.claude/worktrees`
|
|
594
|
+
that have been quiet for 2 hours (no source change to depth 3, nothing written at the top of the build folder), in the background.
|
|
595
|
+
Never sources, never a worktree itself, never the main checkout's build. Warns at session start when the disk has under 40 GB free.
|
|
596
|
+
`node .claude/hooks/build-sweep.mjs --now [--dry-run]` sweeps by hand. Worktree builds had filled a 2 TB disk (283 GB and 642 GB in
|
|
597
|
+
two projects). Selftest: 9 cases (a quiet worktree's out/ and build-* go, sources and a look-alike folder stay, a worktree edited or
|
|
598
|
+
building keeps its build, the main checkout keeps its build, a dry run removes nothing).
|
|
599
|
+
- doctor (and so init and update) runs the hooks' selftests 4 at a time with 180 s each (CLAUDE_PACKS_SELFTEST_JOBS, _S), and names a
|
|
600
|
+
selftest killed for time as timed out (it said "fails its selftest" with no output). Found when the suite failed a different 1 to 5
|
|
601
|
+
init tests on every release since 0.7.1; the main cause of those was the runs themselves: they called `node --test` directly instead
|
|
602
|
+
of `npm test`, which skips test/fresh-tmp.mjs, so doctor read the shared system temp folder (other tests' repos, a planted token).
|
|
603
|
+
Releases are tested with `npm test` from now on. test/doctor-timeout.test.mjs (seen red without the fix).
|
|
604
|
+
- house-control-behaviours and prove-control: a choice control (dropdown, select, menu) opens its list on a press and never steps to
|
|
605
|
+
the next value; every control of every page is walked in the real window on a loaded patch, not only on INIT (B-210, B-211 in the project that found it).
|
|
606
|
+
- build-sweep never sweeps the newest finished build (the one most likely being played) or a worktree named in layout.json
|
|
607
|
+
"keepWorktrees" (a sweep had removed the build being played); selftest 11 cases, both kept cases seen red when planted.
|
|
608
|
+
|
|
609
|
+
## 0.7.4 (2026-11-01)
|
|
610
|
+
|
|
611
|
+
- time-guard: an agent's claim on a worktree lapses after 15 quiet minutes as well as when it is known to have stopped. The agent-cap state that said "stopped" is no longer written, so a finished agent kept its worktree for ever and a successor could not reuse its build (Stellix WB-81). Selftest: a successor after 16 quiet minutes takes the worktree; the first agent coming back finds it taken.
|
|
612
|
+
|
|
613
|
+
## 0.7.3 (2026-11-01)
|
|
614
|
+
|
|
615
|
+
- layout: `buildOutput` is a project-owned key, kept through `update` (0.7.2 dropped it on the first update); test/layout-owned.test.mjs.
|
|
616
|
+
|
|
617
|
+
## 0.7.2 (2026-11-01)
|
|
618
|
+
|
|
619
|
+
- build-guard: a quoted note or title that names the test runner is not a test run (`step.py save "... ctest ..."`, `--take '...'`,
|
|
620
|
+
`git commit -m`); quoted text is masked before the width and light-agent checks, keeping its length so `-R '<pattern>'` is still read
|
|
621
|
+
(Stellix WB-78).
|
|
622
|
+
- protect-vendor: layout.json `buildOutput` names the build output (default `build/**`), so a project whose build lives in `out/` can
|
|
623
|
+
write its own `build/` (a report, pictures); `build/_deps` stays vendored either way (Stellix WB-79).
|
|
624
|
+
|
|
625
|
+
## 0.7.1 (2026-10-31)
|
|
626
|
+
|
|
627
|
+
- gpu-frame-bench: step 2 reads GPU time from Dawn timestamp queries (the painter is Dawn/WebGPU); it said GL timer queries, left from the OpenGL painter (found in Stellix's install).
|
|
628
|
+
|
|
629
|
+
## 0.7.0 (2026-10-31): the two 0.6.0 lines, merged
|
|
630
|
+
|
|
631
|
+
Two sessions each released a claude-packs 0.6.0 on 2026-10-31, from different bases: main's line (from 0.5.0) and the
|
|
632
|
+
`work/0.5.1-instances` line (from 0.5.2). 0.7.0 is their merge, with every test of both lines passing on it.
|
|
633
|
+
|
|
634
|
+
- **Both lines kept:** main's shared selftest library (`hooks/lib/selftest.mjs`) and its nested-repo `checkoutRoot`, and
|
|
635
|
+
this line's write-route reader (`hooks/lib/writes.mjs`, `shell-writes.mjs`). Hooks both lines changed carry both: main's
|
|
636
|
+
selftests and this line's routes.
|
|
637
|
+
- **One git-guard, in Node.** `git-guard.mjs` keeps main's token law (always on) and takes the house laws from the
|
|
638
|
+
Python git-guard, switched on per project (`guards.git.house`; the trunk refusal with `guards.git.refuseTrunk`).
|
|
639
|
+
- **Every kit hook is Node:** git-guard, build-guard, time-guard, user-asks, idle-wake (base), gnu-shell and shell-traps
|
|
640
|
+
(global) are ported, each with its selftest. One is left: `browser-guard.py` (gpu-painter). Its port waits until Stellix
|
|
641
|
+
runs 0.7.0, because Stellix's installed browser-guard refuses writing a file that holds the selftest's planted launch
|
|
642
|
+
samples (probed: exit 2 on `browser-guard.mjs`; it exempts only its own Python file name).
|
|
643
|
+
- **`claude-packs new <name>`** scaffolds a project (the house files, a git repo on a `work/` branch) and installs the
|
|
644
|
+
kit. It replaces the global new-project skill; the global part is exactly three pieces.
|
|
645
|
+
- **One session changes the kit at a time:** `.claude-packs-lock` at a checkout's root, and the repo's own
|
|
646
|
+
`.claude/hooks/kit-lock.mjs` (committed `.claude/settings.json`), which refuses every write route while another
|
|
647
|
+
session's lock is in any checkout of the repo. The release merge removes the lock.
|
|
648
|
+
- Settings entries of the Python forerunners (`git-guard.py`, `build-guard.py`, `time-guard.py`, `user-asks.py`,
|
|
649
|
+
`idle-wake.py`) and of project copies of `shell-traps` and `gnu-shell` are retired on update; a Node hook counts as
|
|
650
|
+
"had" when the project ran its forerunner, so it stays on without an `enable` line.
|
|
651
|
+
|
|
652
|
+
## 0.6.0, main's line (2026-10-31): fixes from Sub37's first install (WB-1 to WB-4)
|
|
653
|
+
|
|
654
|
+
- **WB-2** `checkoutRoot` counts a nested `.git` only when it is a git worktree of this repo, so a FetchContent clone
|
|
655
|
+
under `build/_deps`, a vendored repo or a submodule is judged by the project (protect-vendor refuses edits there again).
|
|
656
|
+
- **WB-1** coverage walks `.claude/skills`, `.claude/rules` and `.claude/agents`, so rules on the `claude` concept no
|
|
657
|
+
longer look dead in `doctor --strict`.
|
|
658
|
+
- **WB-3** new base hook `git-guard.mjs` refuses `push -u`, `remote add/set-url`, `clone`, `submodule` and `config` with a
|
|
659
|
+
token-bearing URL; doctor sweeps `.git/config` of the project, nested repos and `layout.siblings` for a token.
|
|
660
|
+
- **WB-4** `--selftest` for folder-law, frozen-files, protect-vendor, spec-lock, realtime-guard, param-id-lock and
|
|
661
|
+
no-shipped-images, on `hooks/lib/selftest.mjs`; doctor runs every hook's selftest in parallel.
|
|
662
|
+
- `npm test` preloads `test/fresh-tmp.mjs`, so each test process has its own temp folder.
|
|
663
|
+
|
|
664
|
+
## 0.6.0, this line's (2026-10-31): the instances rule, Stellix's house tooling, opt-in hooks, write routes, a global part of three
|
|
665
|
+
|
|
666
|
+
- **Instances (0.5.1):** identical containers by index, different things by ID (Stellix B-178): the rule, two lesson checks
|
|
667
|
+
and the `prove-instances-identical` skill. **0.5.2:** CLAUDE.md names claude-packs as the source of truth.
|
|
668
|
+
- **Moved from Stellix, project-neutral** (a project's values in `layout.json` "guards"): git-guard, time-guard, user-asks,
|
|
669
|
+
idle-wake, build-guard (base); browser-guard and the no-opengl checks (gpu-painter); copy-and-prove (audio-core) and
|
|
670
|
+
build-step (base) skills; the rules hooks-and-gates, plan-and-logs, copy-trees-read-only; copy-tree-guard merged into
|
|
671
|
+
protect-vendor (folders of kind "copy"); from source-guard: file-size-guard counts scripts and CMake, no-shipped-images
|
|
672
|
+
takes `guards.images`, one-seeded-random catches what source_rules caught, `no-code-after-midline-comment`.
|
|
673
|
+
- **Opt-in:** user-asks and idle-wake wait for `"enable"`; `update` switches on a hook or check new to a project only when
|
|
674
|
+
its layout enables it, and prints what it switches on and what it holds back before it changes anything.
|
|
675
|
+
- **WB-69, every route:** every guard that refuses a write covers Write, Edit, MultiEdit, NotebookEdit and the shell
|
|
676
|
+
(`>`, `>>`, `tee`, `sed -i`, `cp`, `mv`, a heredoc into a file); `test/routes.test.mjs` tries each route on each guard.
|
|
677
|
+
- **Global part of three:** latest-versions (with version-pin-guard), gnu-shell, shell-traps. Global by design: they fix
|
|
678
|
+
this machine's shell for Claude, not any project's rules.
|
|
679
|
+
- **Fixes:** version-pin-guard read `2>&1` as a package and a `$&` in an Edit's new_string as a pattern; `update`
|
|
680
|
+
re-created `.pack-new` for a file that is the pack's own version; `doctor --strict` counted git-ignored build output.
|