voidmachine 0.0.0 → 5.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/LICENSE +21 -0
- package/README.md +123 -4
- package/bin/void-harness.mjs +12 -0
- package/bin/void-machine.mjs +12 -0
- package/core-assets/.claude-plugin/plugin.json +285 -0
- package/core-assets/.gitkeep +0 -0
- package/core-assets/PHILOSOPHY.md +218 -0
- package/core-assets/PROJECT-DOCTRINE.template.md +14 -0
- package/core-assets/adapters/security/manifest.yaml +96 -0
- package/core-assets/agents/.gitkeep +0 -0
- package/core-assets/agents/accessibility-specialist.md +59 -0
- package/core-assets/agents/api-integration-engineer.md +59 -0
- package/core-assets/agents/code-explorer.md +94 -0
- package/core-assets/agents/code-explorer.source +7 -0
- package/core-assets/agents/data-migration-engineer.md +59 -0
- package/core-assets/agents/devex-docs-engineer.md +57 -0
- package/core-assets/agents/doctrine-critic.md +91 -0
- package/core-assets/agents/doctrine-critic.source +11 -0
- package/core-assets/agents/domain-architect.md +56 -0
- package/core-assets/agents/experience-designer.md +59 -0
- package/core-assets/agents/frontend-engineer.md +60 -0
- package/core-assets/agents/independent-code-reviewer.md +62 -0
- package/core-assets/agents/migration-planner.md +97 -0
- package/core-assets/agents/migration-planner.source +7 -0
- package/core-assets/agents/observability-sre-engineer.md +59 -0
- package/core-assets/agents/pdf-specialist.md +58 -0
- package/core-assets/agents/performance-engineer.md +58 -0
- package/core-assets/agents/product-challenger.md +55 -0
- package/core-assets/agents/security-engineer.md +66 -0
- package/core-assets/agents/silent-failure-hunter.md +94 -0
- package/core-assets/agents/silent-failure-hunter.source +8 -0
- package/core-assets/agents/solution-architect.md +57 -0
- package/core-assets/agents/test-qa-engineer.md +60 -0
- package/core-assets/agents/type-design-analyzer.md +93 -0
- package/core-assets/agents/type-design-analyzer.source +8 -0
- package/core-assets/agents/visual-craft-director.md +62 -0
- package/core-assets/codex/hooks.json +172 -0
- package/core-assets/contract-history/visual-craft-director/v2.yaml +43 -0
- package/core-assets/data/catalog.v3.json +10527 -0
- package/core-assets/data/certification.json +1826 -0
- package/core-assets/data/identity.json +8 -0
- package/core-assets/data/model.json +4256 -0
- package/core-assets/enforce/ci-enforce.sh +183 -0
- package/core-assets/hooks/_checks.sh +145 -0
- package/core-assets/hooks/_hooklib.sh +163 -0
- package/core-assets/hooks/_syntax-worker.cjs +503 -0
- package/core-assets/hooks/_void-hook.mjs +15448 -0
- package/core-assets/hooks/activation-meter.sh +13 -0
- package/core-assets/hooks/anti-ai-slop-grep.sh +38 -0
- package/core-assets/hooks/auto-format.sh +9 -0
- package/core-assets/hooks/axe-precommit.sh +35 -0
- package/core-assets/hooks/block-dangerous-bash.sh +10 -0
- package/core-assets/hooks/block-protected-push.sh +81 -0
- package/core-assets/hooks/boundary-direction-check.sh +10 -0
- package/core-assets/hooks/control-character-grep.sh +10 -0
- package/core-assets/hooks/fowler-refactors.txt +71 -0
- package/core-assets/hooks/large-cl-grep.sh +9 -0
- package/core-assets/hooks/llm-cost-precommit.sh +55 -0
- package/core-assets/hooks/migration-lint.sh +58 -0
- package/core-assets/hooks/migration-pr-template.sh +55 -0
- package/core-assets/hooks/no-ai-design-slop.sh +10 -0
- package/core-assets/hooks/no-any-grep.sh +10 -0
- package/core-assets/hooks/no-as-cast-grep.sh +10 -0
- package/core-assets/hooks/no-console-log-grep.sh +10 -0
- package/core-assets/hooks/no-null-grep.sh +10 -0
- package/core-assets/hooks/no-only-no-skip.sh +10 -0
- package/core-assets/hooks/outcome-meter.sh +13 -0
- package/core-assets/hooks/pre-PR-review-evidence.sh +47 -0
- package/core-assets/hooks/protect-sensitive-files.sh +10 -0
- package/core-assets/hooks/refactor-named-grep.sh +49 -0
- package/core-assets/hooks/secret-in-content.sh +10 -0
- package/core-assets/hooks/sessionstart-context.sh +9 -0
- package/core-assets/hooks/stop-typecheck.sh +9 -0
- package/core-assets/hooks/tdd-guard.md +90 -0
- package/core-assets/hooks/tdd-guard.sh +10 -0
- package/core-assets/hooks/test-name-lint.sh +10 -0
- package/core-assets/hooks/tidying-commit-prefix.sh +37 -0
- package/core-assets/hooks/trim-large-output.sh +9 -0
- package/core-assets/hooks/tsc-noemit-precommit.sh +22 -0
- package/core-assets/hooks/ubiquitous-language-lint.sh +58 -0
- package/core-assets/hooks/viewport-screenshot-gate.sh +48 -0
- package/core-assets/modules/.gitkeep +0 -0
- package/core-assets/packs/pack-mobile/skills/void-eas-build-profile/.source +7 -0
- package/core-assets/packs/pack-mobile/skills/void-eas-build-profile/SKILL.md +164 -0
- package/core-assets/packs/pack-mobile/skills/void-eas-build-profile/harness.yaml +14 -0
- package/core-assets/packs/pack-mobile/skills/void-expo-config-plugins/.source +7 -0
- package/core-assets/packs/pack-mobile/skills/void-expo-config-plugins/SKILL.md +178 -0
- package/core-assets/packs/pack-mobile/skills/void-expo-config-plugins/harness.yaml +14 -0
- package/core-assets/packs/pack-mobile/skills/void-expo-router-pattern/.source +8 -0
- package/core-assets/packs/pack-mobile/skills/void-expo-router-pattern/SKILL.md +209 -0
- package/core-assets/packs/pack-mobile/skills/void-expo-router-pattern/harness.yaml +14 -0
- package/core-assets/packs/pack-mobile/skills/void-ota-update-strategy/.source +7 -0
- package/core-assets/packs/pack-mobile/skills/void-ota-update-strategy/SKILL.md +194 -0
- package/core-assets/packs/pack-mobile/skills/void-ota-update-strategy/harness.yaml +14 -0
- package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/.source +5 -0
- package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/SKILL.md +160 -0
- package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/harness.yaml +14 -0
- package/core-assets/packs/pack-monorepo/skills/void-package-extraction/.source +5 -0
- package/core-assets/packs/pack-monorepo/skills/void-package-extraction/SKILL.md +70 -0
- package/core-assets/packs/pack-monorepo/skills/void-package-extraction/harness.yaml +14 -0
- package/core-assets/packs/pack-monorepo/skills/void-service-package/.source +5 -0
- package/core-assets/packs/pack-monorepo/skills/void-service-package/SKILL.md +122 -0
- package/core-assets/packs/pack-monorepo/skills/void-service-package/harness.yaml +14 -0
- package/core-assets/packs/pack-monorepo/skills/void-turbo-pipeline-tuning/.source +7 -0
- package/core-assets/packs/pack-monorepo/skills/void-turbo-pipeline-tuning/SKILL.md +116 -0
- package/core-assets/packs/pack-monorepo/skills/void-turbo-pipeline-tuning/harness.yaml +14 -0
- package/core-assets/packs/pack-nextjs/skills/void-cache-component-pattern/.source +5 -0
- package/core-assets/packs/pack-nextjs/skills/void-cache-component-pattern/SKILL.md +162 -0
- package/core-assets/packs/pack-nextjs/skills/void-cache-component-pattern/harness.yaml +14 -0
- package/core-assets/packs/pack-nextjs/skills/void-instrumentation-setup/.source +5 -0
- package/core-assets/packs/pack-nextjs/skills/void-instrumentation-setup/SKILL.md +161 -0
- package/core-assets/packs/pack-nextjs/skills/void-instrumentation-setup/harness.yaml +14 -0
- package/core-assets/packs/pack-nextjs/skills/void-loading-error-boundaries/.source +5 -0
- package/core-assets/packs/pack-nextjs/skills/void-loading-error-boundaries/SKILL.md +176 -0
- package/core-assets/packs/pack-nextjs/skills/void-loading-error-boundaries/harness.yaml +14 -0
- package/core-assets/packs/pack-nextjs/skills/void-parallel-routes-slots/.source +5 -0
- package/core-assets/packs/pack-nextjs/skills/void-parallel-routes-slots/SKILL.md +129 -0
- package/core-assets/packs/pack-nextjs/skills/void-parallel-routes-slots/harness.yaml +14 -0
- package/core-assets/packs/pack-nextjs/skills/void-route-group-decision/.source +5 -0
- package/core-assets/packs/pack-nextjs/skills/void-route-group-decision/SKILL.md +107 -0
- package/core-assets/packs/pack-nextjs/skills/void-route-group-decision/harness.yaml +14 -0
- package/core-assets/packs/pack-pwa/skills/void-install-prompt-ux/.source +5 -0
- package/core-assets/packs/pack-pwa/skills/void-install-prompt-ux/SKILL.md +153 -0
- package/core-assets/packs/pack-pwa/skills/void-install-prompt-ux/harness.yaml +14 -0
- package/core-assets/packs/pack-pwa/skills/void-manifest-checklist/.source +5 -0
- package/core-assets/packs/pack-pwa/skills/void-manifest-checklist/SKILL.md +204 -0
- package/core-assets/packs/pack-pwa/skills/void-manifest-checklist/harness.yaml +14 -0
- package/core-assets/packs/pack-pwa/skills/void-offline-first-mutation/.source +8 -0
- package/core-assets/packs/pack-pwa/skills/void-offline-first-mutation/SKILL.md +266 -0
- package/core-assets/packs/pack-pwa/skills/void-offline-first-mutation/harness.yaml +14 -0
- package/core-assets/packs/pack-pwa/skills/void-service-worker-strategy/.source +5 -0
- package/core-assets/packs/pack-pwa/skills/void-service-worker-strategy/SKILL.md +178 -0
- package/core-assets/packs/pack-pwa/skills/void-service-worker-strategy/harness.yaml +14 -0
- package/core-assets/packs/pack-react/skills/void-accessibility-check/.source +8 -0
- package/core-assets/packs/pack-react/skills/void-accessibility-check/SKILL.md +136 -0
- package/core-assets/packs/pack-react/skills/void-accessibility-check/harness.yaml +14 -0
- package/core-assets/packs/pack-react/skills/void-client-vs-server-component/.source +5 -0
- package/core-assets/packs/pack-react/skills/void-client-vs-server-component/SKILL.md +116 -0
- package/core-assets/packs/pack-react/skills/void-client-vs-server-component/harness.yaml +14 -0
- package/core-assets/packs/pack-react/skills/void-form-pattern/.source +7 -0
- package/core-assets/packs/pack-react/skills/void-form-pattern/SKILL.md +157 -0
- package/core-assets/packs/pack-react/skills/void-form-pattern/harness.yaml +14 -0
- package/core-assets/packs/pack-react/skills/void-state-architecture/.source +5 -0
- package/core-assets/packs/pack-react/skills/void-state-architecture/SKILL.md +160 -0
- package/core-assets/packs/pack-react/skills/void-state-architecture/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-background-job-pattern/.source +6 -0
- package/core-assets/packs/pack-server/skills/void-background-job-pattern/SKILL.md +214 -0
- package/core-assets/packs/pack-server/skills/void-background-job-pattern/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-drizzle-migration-safe/.source +6 -0
- package/core-assets/packs/pack-server/skills/void-drizzle-migration-safe/SKILL.md +168 -0
- package/core-assets/packs/pack-server/skills/void-drizzle-migration-safe/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-env-validation/.source +6 -0
- package/core-assets/packs/pack-server/skills/void-env-validation/SKILL.md +131 -0
- package/core-assets/packs/pack-server/skills/void-env-validation/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-rate-limit-strategy/.source +6 -0
- package/core-assets/packs/pack-server/skills/void-rate-limit-strategy/SKILL.md +149 -0
- package/core-assets/packs/pack-server/skills/void-rate-limit-strategy/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-server-action/.source +7 -0
- package/core-assets/packs/pack-server/skills/void-server-action/SKILL.md +181 -0
- package/core-assets/packs/pack-server/skills/void-server-action/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-testing-server-modules/.source +7 -0
- package/core-assets/packs/pack-server/skills/void-testing-server-modules/SKILL.md +73 -0
- package/core-assets/packs/pack-server/skills/void-testing-server-modules/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/.source +7 -0
- package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/SKILL.md +205 -0
- package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/harness.yaml +14 -0
- package/core-assets/policies/core.yaml +95 -0
- package/core-assets/policies/ui.yaml +23 -0
- package/core-assets/profiles/base.yaml +29 -0
- package/core-assets/profiles/expo-config.yaml +36 -0
- package/core-assets/profiles/expo.yaml +35 -0
- package/core-assets/profiles/monorepo.yaml +33 -0
- package/core-assets/profiles/nextjs-config.yaml +31 -0
- package/core-assets/profiles/nextjs.yaml +31 -0
- package/core-assets/profiles/node-server.yaml +31 -0
- package/core-assets/profiles/pwa.yaml +33 -0
- package/core-assets/profiles/react.yaml +39 -0
- package/core-assets/profiles/sql.yaml +39 -0
- package/core-assets/profiles/typescript.yaml +39 -0
- package/core-assets/skills/.gitkeep +0 -0
- package/core-assets/skills/void-accessibility/.source +15 -0
- package/core-assets/skills/void-accessibility/SKILL.md +275 -0
- package/core-assets/skills/void-accessibility/harness.yaml +17 -0
- package/core-assets/skills/void-api-and-interface-design/.source +13 -0
- package/core-assets/skills/void-api-and-interface-design/SKILL.md +231 -0
- package/core-assets/skills/void-api-and-interface-design/harness.yaml +16 -0
- package/core-assets/skills/void-async-safety/.source +13 -0
- package/core-assets/skills/void-async-safety/SKILL.md +287 -0
- package/core-assets/skills/void-async-safety/harness.yaml +16 -0
- package/core-assets/skills/void-audit/.source +15 -0
- package/core-assets/skills/void-audit/SKILL.md +83 -0
- package/core-assets/skills/void-audit/harness.yaml +14 -0
- package/core-assets/skills/void-autopilot/.source +21 -0
- package/core-assets/skills/void-autopilot/SKILL.md +394 -0
- package/core-assets/skills/void-autopilot/harness.yaml +14 -0
- package/core-assets/skills/void-brainstorm/.source +14 -0
- package/core-assets/skills/void-brainstorm/SKILL.md +278 -0
- package/core-assets/skills/void-brainstorm/harness.yaml +14 -0
- package/core-assets/skills/void-checkpoint/.source +39 -0
- package/core-assets/skills/void-checkpoint/SKILL.md +227 -0
- package/core-assets/skills/void-checkpoint/harness.yaml +14 -0
- package/core-assets/skills/void-claude-md/.source +15 -0
- package/core-assets/skills/void-claude-md/SKILL.md +180 -0
- package/core-assets/skills/void-claude-md/harness.yaml +14 -0
- package/core-assets/skills/void-code-review/.source +14 -0
- package/core-assets/skills/void-code-review/SKILL.md +232 -0
- package/core-assets/skills/void-code-review/harness.yaml +15 -0
- package/core-assets/skills/void-commit-discipline/.source +9 -0
- package/core-assets/skills/void-commit-discipline/SKILL.md +211 -0
- package/core-assets/skills/void-commit-discipline/harness.yaml +15 -0
- package/core-assets/skills/void-context/.source +15 -0
- package/core-assets/skills/void-context/SKILL.md +166 -0
- package/core-assets/skills/void-context/harness.yaml +14 -0
- package/core-assets/skills/void-debug/.source +11 -0
- package/core-assets/skills/void-debug/SKILL.md +211 -0
- package/core-assets/skills/void-debug/harness.yaml +14 -0
- package/core-assets/skills/void-decide/.source +9 -0
- package/core-assets/skills/void-decide/SKILL.md +147 -0
- package/core-assets/skills/void-decide/harness.yaml +14 -0
- package/core-assets/skills/void-devex-audit/.source +8 -0
- package/core-assets/skills/void-devex-audit/SKILL.md +113 -0
- package/core-assets/skills/void-devex-audit/harness.yaml +15 -0
- package/core-assets/skills/void-doctor/.source +15 -0
- package/core-assets/skills/void-doctor/SKILL.md +83 -0
- package/core-assets/skills/void-doctor/harness.yaml +14 -0
- package/core-assets/skills/void-domain-driven-design/.source +13 -0
- package/core-assets/skills/void-domain-driven-design/SKILL.md +292 -0
- package/core-assets/skills/void-domain-driven-design/harness.yaml +15 -0
- package/core-assets/skills/void-frontend-design/.source +19 -0
- package/core-assets/skills/void-frontend-design/SKILL.md +274 -0
- package/core-assets/skills/void-frontend-design/harness.yaml +17 -0
- package/core-assets/skills/void-functional/.source +14 -0
- package/core-assets/skills/void-functional/SKILL.md +312 -0
- package/core-assets/skills/void-functional/harness.yaml +15 -0
- package/core-assets/skills/void-graph/.source +15 -0
- package/core-assets/skills/void-graph/SKILL.md +80 -0
- package/core-assets/skills/void-graph/harness.yaml +14 -0
- package/core-assets/skills/void-hexagonal-architecture/.source +12 -0
- package/core-assets/skills/void-hexagonal-architecture/SKILL.md +276 -0
- package/core-assets/skills/void-hexagonal-architecture/harness.yaml +15 -0
- package/core-assets/skills/void-implement/.source +39 -0
- package/core-assets/skills/void-implement/SKILL.md +192 -0
- package/core-assets/skills/void-implement/harness.yaml +14 -0
- package/core-assets/skills/void-learn/.source +13 -0
- package/core-assets/skills/void-learn/SKILL.md +226 -0
- package/core-assets/skills/void-learn/harness.yaml +14 -0
- package/core-assets/skills/void-llm-cost-discipline/.source +13 -0
- package/core-assets/skills/void-llm-cost-discipline/SKILL.md +299 -0
- package/core-assets/skills/void-llm-cost-discipline/harness.yaml +15 -0
- package/core-assets/skills/void-make-pdf/.source +9 -0
- package/core-assets/skills/void-make-pdf/SKILL.md +52 -0
- package/core-assets/skills/void-make-pdf/harness.yaml +15 -0
- package/core-assets/skills/void-merge/.source +8 -0
- package/core-assets/skills/void-merge/SKILL.md +111 -0
- package/core-assets/skills/void-merge/harness.yaml +14 -0
- package/core-assets/skills/void-migrations/.source +13 -0
- package/core-assets/skills/void-migrations/SKILL.md +264 -0
- package/core-assets/skills/void-migrations/harness.yaml +17 -0
- package/core-assets/skills/void-observability/.source +12 -0
- package/core-assets/skills/void-observability/SKILL.md +245 -0
- package/core-assets/skills/void-observability/harness.yaml +15 -0
- package/core-assets/skills/void-orchestrate/.source +16 -0
- package/core-assets/skills/void-orchestrate/SKILL.md +311 -0
- package/core-assets/skills/void-orchestrate/harness.yaml +10 -0
- package/core-assets/skills/void-plan/.source +15 -0
- package/core-assets/skills/void-plan/SKILL.md +246 -0
- package/core-assets/skills/void-plan/harness.yaml +14 -0
- package/core-assets/skills/void-plan-review/.source +12 -0
- package/core-assets/skills/void-plan-review/SKILL.md +128 -0
- package/core-assets/skills/void-plan-review/harness.yaml +15 -0
- package/core-assets/skills/void-qa/.source +15 -0
- package/core-assets/skills/void-qa/SKILL.md +103 -0
- package/core-assets/skills/void-qa/harness.yaml +15 -0
- package/core-assets/skills/void-refactor/.source +9 -0
- package/core-assets/skills/void-refactor/SKILL.md +220 -0
- package/core-assets/skills/void-refactor/harness.yaml +15 -0
- package/core-assets/skills/void-retrospective/.source +9 -0
- package/core-assets/skills/void-retrospective/SKILL.md +71 -0
- package/core-assets/skills/void-retrospective/harness.yaml +15 -0
- package/core-assets/skills/void-security-audit/.source +12 -0
- package/core-assets/skills/void-security-audit/SKILL.md +138 -0
- package/core-assets/skills/void-security-audit/harness.yaml +15 -0
- package/core-assets/skills/void-security-guidance/.source +13 -0
- package/core-assets/skills/void-security-guidance/SKILL.md +294 -0
- package/core-assets/skills/void-security-guidance/harness.yaml +15 -0
- package/core-assets/skills/void-source-driven-development/.source +12 -0
- package/core-assets/skills/void-source-driven-development/SKILL.md +158 -0
- package/core-assets/skills/void-source-driven-development/harness.yaml +15 -0
- package/core-assets/skills/void-tdd/.source +15 -0
- package/core-assets/skills/void-tdd/SKILL.md +394 -0
- package/core-assets/skills/void-tdd/harness.yaml +15 -0
- package/core-assets/skills/void-testing/.source +19 -0
- package/core-assets/skills/void-testing/SKILL.md +301 -0
- package/core-assets/skills/void-testing/harness.yaml +17 -0
- package/core-assets/skills/void-ticket/.source +18 -0
- package/core-assets/skills/void-ticket/SKILL.md +238 -0
- package/core-assets/skills/void-ticket/harness.yaml +14 -0
- package/core-assets/skills/void-typescript-strict/.source +10 -0
- package/core-assets/skills/void-typescript-strict/SKILL.md +294 -0
- package/core-assets/skills/void-typescript-strict/harness.yaml +17 -0
- package/core-assets/skills/void-ui-review/.source +12 -0
- package/core-assets/skills/void-ui-review/SKILL.md +97 -0
- package/core-assets/skills/void-ui-review/harness.yaml +15 -0
- package/core-assets/skills/void-verify/.source +12 -0
- package/core-assets/skills/void-verify/SKILL.md +184 -0
- package/core-assets/skills/void-verify/harness.yaml +15 -0
- package/core-assets/specialists/accessibility-specialist.source +11 -0
- package/core-assets/specialists/accessibility-specialist.yaml +30 -0
- package/core-assets/specialists/api-integration-engineer.source +11 -0
- package/core-assets/specialists/api-integration-engineer.yaml +30 -0
- package/core-assets/specialists/data-migration-engineer.source +11 -0
- package/core-assets/specialists/data-migration-engineer.yaml +30 -0
- package/core-assets/specialists/devex-docs-engineer.source +11 -0
- package/core-assets/specialists/devex-docs-engineer.yaml +29 -0
- package/core-assets/specialists/domain-architect.source +11 -0
- package/core-assets/specialists/domain-architect.yaml +28 -0
- package/core-assets/specialists/experience-designer.source +15 -0
- package/core-assets/specialists/experience-designer.yaml +38 -0
- package/core-assets/specialists/frontend-engineer.source +11 -0
- package/core-assets/specialists/frontend-engineer.yaml +32 -0
- package/core-assets/specialists/independent-code-reviewer.source +10 -0
- package/core-assets/specialists/independent-code-reviewer.yaml +38 -0
- package/core-assets/specialists/migrations.json +15 -0
- package/core-assets/specialists/observability-sre-engineer.source +11 -0
- package/core-assets/specialists/observability-sre-engineer.yaml +30 -0
- package/core-assets/specialists/pdf-specialist.source +11 -0
- package/core-assets/specialists/pdf-specialist.yaml +29 -0
- package/core-assets/specialists/performance-engineer.source +11 -0
- package/core-assets/specialists/performance-engineer.yaml +29 -0
- package/core-assets/specialists/product-challenger.source +10 -0
- package/core-assets/specialists/product-challenger.yaml +27 -0
- package/core-assets/specialists/security-engineer.source +13 -0
- package/core-assets/specialists/security-engineer.yaml +41 -0
- package/core-assets/specialists/solution-architect.source +13 -0
- package/core-assets/specialists/solution-architect.yaml +32 -0
- package/core-assets/specialists/test-qa-engineer.source +14 -0
- package/core-assets/specialists/test-qa-engineer.yaml +35 -0
- package/core-assets/specialists/visual-craft-director.source +17 -0
- package/core-assets/specialists/visual-craft-director.yaml +60 -0
- package/core-assets/templates/github/dependency-audit.mjs +54 -0
- package/core-assets/templates/github/void-dependency-audit.yml +35 -0
- package/core-assets/templates/github/void-security.yml +85 -0
- package/dist/main.js +70173 -0
- package/package.json +68 -4
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: void-source-driven-development
|
|
3
|
+
description: Ground every third-party config or API usage in the official docs for the installed version, not training memory. Verify the version; cite the reference when it helps. Use before writing any tool config.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# source-driven-development
|
|
7
|
+
|
|
8
|
+
Training memory drifts. It blends three minor versions of a framework into one plausible-looking config that compiles, runs, and is subtly wrong: a renamed option, a removed flag, a default that flipped between majors. This skill makes the official documentation of the **installed version** the source of truth for any third-party tool. The read is mandatory; the citation is not. Where a choice is not obvious, a brief reference in the commit lets the "why" outlive the session.
|
|
9
|
+
|
|
10
|
+
This encodes the repo hard rule: *read the official documentation of any third-party tool before writing its config.*
|
|
11
|
+
|
|
12
|
+
**Attribution**: see `.source` in this directory.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## The rule
|
|
17
|
+
|
|
18
|
+
When you configure or call a third-party tool (framework, library, CLI, API, build tool):
|
|
19
|
+
|
|
20
|
+
1. **Find the installed version.** Read the lockfile (`pnpm-lock.yaml`, `package-lock.json`, `Cargo.lock`) or the resolved entry, not just the `^x` range in `package.json`. Options change between majors; the range lies about what is actually resolved.
|
|
21
|
+
2. **Read the docs for that version.** Pin the docs to the resolved major/minor. Latest-docs for an older installed version is a silent mismatch.
|
|
22
|
+
3. **Prefer a clean read.** Use the `defuddle` skill (or WebFetch) on the official docs. Strip nav and ads to the load-bearing prose. Distrust third-party tutorials, blog posts, and Stack Overflow answers: they are dated by construction and rarely say which version they target.
|
|
23
|
+
4. **Cite when it helps.** For a non-obvious choice, put the URL + section (or doc path) in the commit body, the PR, or a comment next to the config, so the next reader can re-derive it. A missing citation never blocks on its own.
|
|
24
|
+
|
|
25
|
+
Memory proposes; docs dispose.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Conflict resolution
|
|
30
|
+
|
|
31
|
+
| Conflict | Winner | Why |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| Memory vs official docs | Docs | Memory is a lossy average of many versions; docs describe one. |
|
|
34
|
+
| Two sources disagree | Official + version-matched | Vendor docs for the installed version beat any third party. |
|
|
35
|
+
| Docs vs a stale tutorial | Docs | Tutorials freeze a moment; the tool moved on. |
|
|
36
|
+
| Latest docs vs installed-version docs | Installed-version docs | You ship what is installed, not what is newest. |
|
|
37
|
+
|
|
38
|
+
When the docs and a working example genuinely conflict and you cannot resolve it, that uncertainty is a finding: surface it, do not paper over it with a guess.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## What "cite the reference" looks like
|
|
43
|
+
|
|
44
|
+
In a commit (composes with `void-commit-discipline` — the "why" carries the source):
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
chore(build): set vite `build.target` to es2022
|
|
48
|
+
|
|
49
|
+
Vite 7 dropped the old `esbuild.target` shorthand; the documented field
|
|
50
|
+
is now build.target. Ref: vitejs.dev/config/build-options#build-target
|
|
51
|
+
(v7 docs, matches pnpm-lock resolved 7.0.x).
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Next to non-obvious config:
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
// retries default changed to 0 in playwright 1.45; opt back in explicitly.
|
|
58
|
+
// ref: playwright.dev/docs/test-retries (v1.45 docs)
|
|
59
|
+
retries: 2,
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
What verifies a config line is the read of the version-matched docs, not the presence of a citation. A reviewer who doubts an option checks it against those docs; a concrete mismatch is a defect, a missing reference is not.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## When this applies
|
|
67
|
+
|
|
68
|
+
- Writing or changing any tool config (bundler, test runner, linter, ORM, CI, framework).
|
|
69
|
+
- Calling a third-party API or SDK where parameter names, defaults, or auth flow matter.
|
|
70
|
+
- Choosing options that differ across major versions.
|
|
71
|
+
- Upgrading a dependency across a major (re-read; do not assume the old config carries).
|
|
72
|
+
|
|
73
|
+
## When this does NOT apply
|
|
74
|
+
|
|
75
|
+
- First-party code in this repo (you own it; read the source, not "docs").
|
|
76
|
+
- Stable, well-internalized language built-ins where no version ambiguity exists.
|
|
77
|
+
- Throwaway exploration you will delete (but the moment it lands, the rule applies).
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Offline / no-network
|
|
82
|
+
|
|
83
|
+
Some runs have no egress: a sandboxed autonomous worker, an air-gapped CI step. You still must not write config from memory. Two moves keep the rule intact without opening the network:
|
|
84
|
+
|
|
85
|
+
1. **Inject the doc, do not fetch it.** Treat the version-matched reference as an *input*, not a side effect: pass the doc text (or a curated, version-pinned excerpt committed to the repo) into the decision as a parameter — a port — and validate its shape at the boundary with Zod before you trust it (e.g. assert the option you are about to set actually appears in the supplied reference). This is functional core / imperative shell: fetching is an adapter concern, the choice logic takes the doc as data. It composes with `void-hexagonal-architecture` and `void-security-guidance` (untrusted input is validated at the edge).
|
|
86
|
+
|
|
87
|
+
2. **If no version-matched doc is reachable and the semantics you are writing are genuinely uncertain, incur a `source-debt`.** A missing citation is not a source-debt. A `source-debt` is a short, honest note, in the commit body or the PR, naming exactly which `tool@version` option was authored offline and what remains uncertain about it. It is the alternative to guessing silently, not a mandatory field: a label or checkbox may carry it if the project uses one, but neither is the authority.
|
|
88
|
+
|
|
89
|
+
What matters is the verification itself: the real uncertainty is resolved against the version-matched official docs before the change ships. Once that read is done, a note, label or checkbox not yet updated never blocks on its own. The offline bypass is for *authoring* without egress, never for *shipping* config whose semantics remain unverified.
|
|
90
|
+
|
|
91
|
+
This widens egress by **zero** (decision A3): offline work defers the verification behind an explicit, reviewable IOU; it never reaches for the network it was denied.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Composition
|
|
96
|
+
|
|
97
|
+
- **Upstream of `void-plan`** — stack decisions in a plan must be grounded in current official docs, not remembered defaults. A plan step that pins a library cites the doc that justifies the choice.
|
|
98
|
+
- **With `void-commit-discipline`** — the mandatory "why" in the commit body is where the source citation lives. The git log becomes the audit trail of *why this config*, traceable to a versioned doc.
|
|
99
|
+
- **With `void-decide`** (pack-monorepo) — a structural tool choice becomes an ADR whose "Alternatives considered" cites the official docs of each option, not folklore.
|
|
100
|
+
- **Contrast with memory-driven work** — the failure mode this skill replaces is writing config from training recall and only checking docs when it breaks. Invert that order.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Rationalizations
|
|
105
|
+
|
|
106
|
+
| Rationalization | Reality |
|
|
107
|
+
|---|---|
|
|
108
|
+
| "I know this API, I've used it many times" | You know an average of several versions. The installed one has its own truths. |
|
|
109
|
+
| "The docs will just say what I already think" | Then the read costs seconds and confirms it. When they don't, you just dodged a bug. |
|
|
110
|
+
| "It compiled / it ran, so it's right" | Wrong defaults compile fine. Deprecated-but-still-working options run fine. Until they don't. |
|
|
111
|
+
| "This tutorial does exactly this" | Tutorials rarely state their version and rot silently. Match the vendor docs to your lockfile. |
|
|
112
|
+
| "Checking the version is overkill for a config tweak" | The tweak that broke prod was a flag renamed between minors. The check is cheap. |
|
|
113
|
+
| "I'll read the docs later" | Later never comes. The read happens before the line; a citation, when useful, lands in the same commit. |
|
|
114
|
+
| "Latest docs are close enough" | "Close enough" between majors is how a removed option ships to prod. |
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Verification
|
|
119
|
+
|
|
120
|
+
The work is not done until the source check is done. Before marking any third-party config or usage complete:
|
|
121
|
+
|
|
122
|
+
- [ ] Installed version identified from the lockfile (not the `package.json` range).
|
|
123
|
+
- [ ] Official docs for **that** version read (via `/defuddle` / WebFetch, not memory or a tutorial).
|
|
124
|
+
- [ ] Every non-obvious option checked against that doc; cited briefly where it helps the next reader (never blocking on its own).
|
|
125
|
+
- [ ] Any memory-vs-docs conflict resolved in favor of the docs, or surfaced as an open question if irresolvable.
|
|
126
|
+
|
|
127
|
+
If the version check or the read is missing, the config is written from memory. That is the state this skill exists to prevent.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Anti-rules
|
|
132
|
+
|
|
133
|
+
- MUST NOT write tool config from training memory alone — read the version-matched docs first.
|
|
134
|
+
- MUST NOT skip the installed-version check — the `^` range is not the resolved version.
|
|
135
|
+
- MUST NOT cite a third-party tutorial as authoritative — the official, versioned doc is the source.
|
|
136
|
+
- MUST NOT land config whose semantics were not checked against the version-matched docs. A missing citation alone is not that failure.
|
|
137
|
+
- MUST NOT silently pick a side when sources genuinely conflict — surface the divergence.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## When you are stuck
|
|
142
|
+
|
|
143
|
+
| Problem | Solution |
|
|
144
|
+
|---|---|
|
|
145
|
+
| Cannot find the official docs | Start from the package homepage / repo README, follow to the versioned docs site. Avoid SEO tutorials. |
|
|
146
|
+
| Docs only cover "latest" | Check the changelog / migration guide for your installed major; or read the versioned docs branch / tag. |
|
|
147
|
+
| Docs and a working snippet conflict | Trust the versioned official docs. If still unresolved, surface it as an open question, do not guess. |
|
|
148
|
+
| The option I remember doesn't exist | It was renamed or removed. Read the migration guide for your major. |
|
|
149
|
+
| No time to read everything | Read the one section governing the option you are setting. Targeted, not exhaustive. |
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Final rule
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
Third-party config → installed version found, version-matched official docs read, source cited when it helps.
|
|
157
|
+
Otherwise → it was written from memory, and memory is not a source.
|
|
158
|
+
```
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Harness metadata for this skill. Not part of the Agent Skills
|
|
2
|
+
# specification, and never copied into a consumer project: the SKILL.md
|
|
3
|
+
# beside it stays portable and validates against the official six fields.
|
|
4
|
+
# Read by this repository's graph, and by the installer for `runtimes`.
|
|
5
|
+
kind: standard
|
|
6
|
+
activation: always
|
|
7
|
+
owner: folpe
|
|
8
|
+
runtimes: [claude, codex]
|
|
9
|
+
enforcement:
|
|
10
|
+
floor: ci
|
|
11
|
+
inline:
|
|
12
|
+
claude: active
|
|
13
|
+
codex: active
|
|
14
|
+
hermes: ci-only
|
|
15
|
+
eval_targets: [claude/anthropic/opus]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Sources for `void-tdd` skill (see `docs/plans/skill-audits/void-tdd.md` for full audit):
|
|
2
|
+
|
|
3
|
+
- DECLIK port — /Users/folpe/Developer/DECLIK/.claude/skills/tdd/SKILL.md (377 LOC, top-5%, distills the below)
|
|
4
|
+
- superpowers/test-driven-development — Iron Law + Red Flags + Common Rationalizations
|
|
5
|
+
- citypaul/.dotfiles tdd — TDD Evidence in commit history pattern
|
|
6
|
+
- nizos/tdd-guard — https://github.com/nizos/tdd-guard — companion hook (PreToolUse Edit/Write, 10 bypasses)
|
|
7
|
+
- Kent Beck "Test-Driven Development: By Example" (2002) — foundation
|
|
8
|
+
- morodomi/tdd-skills — reviewed, rejected as primary (too rigid phase-by-phase commit gates)
|
|
9
|
+
|
|
10
|
+
Strategy: port-DECLIK with three minimal stack-agnostic adaptations (paths/commands read from voidcorp.config.json, DECLIK-specific refs moved to pack-monorepo).
|
|
11
|
+
|
|
12
|
+
Companion hook: packages/core/claude/hooks/tdd-guard.sh (94 LOC, all 10 bypasses).
|
|
13
|
+
|
|
14
|
+
DEV-444 adaptation: frontend RED now targets component/hook/store/a11y/state behavior, requires a
|
|
15
|
+
keyboard regression before E2E for interactive controls, and binds proof to the current diff.
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: void-tdd
|
|
3
|
+
description: TDD in three modes (strict/souple/exploratory) chosen by path. Iron Law in strict (no prod code without a failing test), mutation gate if tooled, anti-rustine. Use for any feature, bugfix, refactor.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# tdd — voidcorp craftsman edition
|
|
7
|
+
|
|
8
|
+
Curated aggregate of the best TDD practices for the TypeScript/web stack 2026. Ported from the DECLIK `void-tdd` skill (377 LOC, already top-5%), adapted to be stack-agnostic via `.void/config.json`.
|
|
9
|
+
|
|
10
|
+
**Attribution**: see `.source` in this directory. Primary sources: DECLIK port (which itself distills superpowers/test-driven-development + citypaul/tdd + nizos/tdd-guard). This skill **does not reinvent**; it composes at the right level for void-machine consumers.
|
|
11
|
+
|
|
12
|
+
The companion hook `tdd-guard` (see `../../hooks/tdd-guard.sh`) materializes the structural floor at the Edit/Write level: a sibling test file or an explicitly declared E2E test file MUST exist before governed production code is edited. It does not run the suite, so the failing-first (RED) step stays the engineer's discipline.
|
|
13
|
+
|
|
14
|
+
For E2E coverage, put `// tdd-cover: e2e tests/e2e/route.spec.ts` on the production
|
|
15
|
+
file's first line. The literal project-relative path must name an existing regular
|
|
16
|
+
`.test`/`.spec` JS/TS file inside the physical project root. One valid declaration
|
|
17
|
+
satisfies the structural floor; malformed, misplaced or conflicting declarations
|
|
18
|
+
refuse. It does not prove the route is covered or the suite passed. Keep real
|
|
19
|
+
test evidence, and never use exploratory mode to mean "tested elsewhere".
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Modes
|
|
24
|
+
|
|
25
|
+
Three postures, chosen by context. If unsure of the mode, ask explicitly before coding.
|
|
26
|
+
|
|
27
|
+
| Mode | When | Posture |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| **strict** | New behavior on production code, hotfix on paying surface, refactor that changes observable behavior, DB integration that affects business invariants | Iron Law (zero line of production code without a failing test that requested it) + mutation testing when the project has a mutation runner + 100% coverage + commit/PR evidence trail |
|
|
30
|
+
| **souple** | Integration glue tested at a higher level (E2E + handler covers the chain), framework wiring, config | RED-GREEN-REFACTOR without mutation gate, ≥ 80% coverage on business code, no commit-by-phase ritual |
|
|
31
|
+
| **exploratory** | Documented spike, throwaway POC, scripts marked as such, draft work | No TDD obligation. The file MUST declare throwaway status + deletion date in a header comment. If the code survives the spike, it transitions to strict before merging to prod. |
|
|
32
|
+
|
|
33
|
+
### Auto-detection heuristic
|
|
34
|
+
|
|
35
|
+
If no explicit `Mode:` marker is in the task or a file header comment, apply:
|
|
36
|
+
|
|
37
|
+
- Path matches `<config.paths.business>` and not in `<config.paths.spikes>` nor in `docs/` → **strict**
|
|
38
|
+
- Path matches `<config.paths.spikes>`, draft folder, or scaffolds → **exploratory**
|
|
39
|
+
- Path matches `<config.paths.serverActions>` (boundary HTTP / Server Action) AND the pure logic is in `services/` with strict tests → **souple** on the handler, **strict** on the service
|
|
40
|
+
- Otherwise → **souple** + ask confirmation if in doubt
|
|
41
|
+
|
|
42
|
+
Paths come from `voidcorp.config.json`. Defaults are documented in `packages/core/claude/skills/void-tdd/defaults.md`.
|
|
43
|
+
|
|
44
|
+
### Override
|
|
45
|
+
|
|
46
|
+
The user can impose a mode via:
|
|
47
|
+
|
|
48
|
+
- Prompt marker: "implement X in strict mode" / "spike in exploratory mode"
|
|
49
|
+
- File header comment: `// tdd-mode: strict`
|
|
50
|
+
- Repo-wide: `.void/config.json` → `{ "modes": { "tdd": "strict" } }`
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Iron Law (strict only)
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
ZERO LINE OF PRODUCTION CODE WITHOUT A FAILING TEST THAT REQUESTED IT.
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**No exception without explicit permission.** Keep the spirit AND the letter — violating one violates both.
|
|
61
|
+
|
|
62
|
+
### If you wrote code before the test (strict)
|
|
63
|
+
|
|
64
|
+
- You **delete** it. Delete means delete.
|
|
65
|
+
- Do not keep anything "as reference"
|
|
66
|
+
- Do not "adapt" existing code while writing the tests
|
|
67
|
+
- Do not look at the deleted code while re-implementing
|
|
68
|
+
- Implement fresh from the tests
|
|
69
|
+
|
|
70
|
+
Sunk-cost fallacy: the time is already lost. Keeping unverified code is technical debt, not an asset.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Cycle
|
|
75
|
+
|
|
76
|
+
### Strict mode
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
RED → Verify RED → GREEN → Verify GREEN → [MUTATE → KILL MUTANTS] → REFACTOR
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
The bracketed steps run only when the project has a mutation runner (see MUTATE below).
|
|
83
|
+
|
|
84
|
+
### Souple mode
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
RED → GREEN → REFACTOR (if it has value)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Exploratory mode
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
Code → [does the demo prove the idea?] → either transition to strict before merge, or delete.
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### RED — write the failing test
|
|
97
|
+
|
|
98
|
+
One thing tested, a name that states the behavior, real code — assert on the observable
|
|
99
|
+
outcome, never on a mock's call count (that tests the mock, not the behavior). Mocks live
|
|
100
|
+
only at infrastructure boundaries. The full technique (how to express the test, factories,
|
|
101
|
+
mocking policy) is the `void-testing` skill's job; TDD owns only *when* and *that* it fails first.
|
|
102
|
+
|
|
103
|
+
Before finalizing the test, scan the mutator rules (boundaries, boolean combinations, equality, arithmetic identities, array/string ops, optional chaining, side effects). This scan needs no tooling and no runner: it is how you write a test that a mutant could not survive, whether or not the project can actually run one.
|
|
104
|
+
|
|
105
|
+
### Verify RED — watch it fail
|
|
106
|
+
|
|
107
|
+
**Strict: mandatory. Never skip.**
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
<config.commands.testUnit> path/to/file.test.ts
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Confirm:
|
|
114
|
+
|
|
115
|
+
- Test fails (not a syntax error)
|
|
116
|
+
- The failure message matches what you expect
|
|
117
|
+
- Fails because the feature is missing, not because of a typo
|
|
118
|
+
|
|
119
|
+
### GREEN — minimal code
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
async function retryOperation<T>(fn: () => Promise<T>): Promise<T> {
|
|
123
|
+
for (let i = 0; i < 3; i++) {
|
|
124
|
+
try { return await fn(); }
|
|
125
|
+
catch (e) { if (i === 2) throw e; }
|
|
126
|
+
}
|
|
127
|
+
throw new Error('unreachable');
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**No more.** No speculative configuration options. No refactor during GREEN.
|
|
132
|
+
|
|
133
|
+
### Verify GREEN
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
<config.commands.testUnit> path/to/file.test.ts
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Confirm:
|
|
140
|
+
|
|
141
|
+
- Test passes
|
|
142
|
+
- Other tests still pass
|
|
143
|
+
- Pristine output (no warnings, no errors)
|
|
144
|
+
|
|
145
|
+
### MUTATE (strict, only when a mutation runner is present)
|
|
146
|
+
|
|
147
|
+
The harness ships no mutation runner and installs none. `init` detects Stryker in the project's
|
|
148
|
+
dependencies and writes `commands.mutation` into `.void/config.json` only on that signal, so the
|
|
149
|
+
presence of that key *is* the capability check.
|
|
150
|
+
|
|
151
|
+
- Key present → run `<config.commands.mutation> --mutate <path>`, produce a killed/survived/score
|
|
152
|
+
report, and treat the gate as mandatory in strict.
|
|
153
|
+
- Key absent → the gate does not apply. Never invent a `stryker` command and never block the cycle
|
|
154
|
+
on it; the mutator scan at RED carries the intent instead. Adopting a runner is a project
|
|
155
|
+
decision, not something this skill performs.
|
|
156
|
+
|
|
157
|
+
### KILL MUTANTS (strict, when MUTATE ran)
|
|
158
|
+
|
|
159
|
+
For each survivor:
|
|
160
|
+
|
|
161
|
+
- If the case value is clear → add a test
|
|
162
|
+
- If ambiguous (business judgment) → ask the user via AskUserQuestion before patching
|
|
163
|
+
|
|
164
|
+
All tests must pass after fix.
|
|
165
|
+
|
|
166
|
+
### REFACTOR
|
|
167
|
+
|
|
168
|
+
After GREEN (and after MUTATE/KILL in strict), assess the improvements.
|
|
169
|
+
|
|
170
|
+
| Priority | Action | Examples |
|
|
171
|
+
|---|---|---|
|
|
172
|
+
| Critical | Now | Knowledge duplication, > 3 nesting levels, critical surviving mutations |
|
|
173
|
+
| High | This session | Magic numbers, unclear names, functions > 30 lines |
|
|
174
|
+
| Nice | Later | Minor renames, single-use helpers |
|
|
175
|
+
| Skip | Do not touch | Already clean code |
|
|
176
|
+
|
|
177
|
+
Tests must stay green at every step.
|
|
178
|
+
|
|
179
|
+
Load the `void-refactor` skill for the detailed methodology (RED-GREEN-REFACTOR strict commit boundaries).
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Stack glue
|
|
184
|
+
|
|
185
|
+
### Commands (read from `voidcorp.config.json`)
|
|
186
|
+
|
|
187
|
+
- Unit: `<config.commands.testUnit>` (e.g. `bunx vitest run`, `pnpm vitest`, `npm test`)
|
|
188
|
+
- E2E: `<config.commands.testE2e>` (e.g. `bunx playwright test`)
|
|
189
|
+
- Mutation: `<config.commands.mutation>` (e.g. `bunx stryker run`) — absent when no mutation runner is detected
|
|
190
|
+
- Watch: `<config.commands.testWatch>` (e.g. `bunx vitest --watch`)
|
|
191
|
+
|
|
192
|
+
### Conventions
|
|
193
|
+
|
|
194
|
+
- Test files: `Name.test.ts` co-located with the source file
|
|
195
|
+
- Real-I/O integration tests: `Name.integration.test.ts`
|
|
196
|
+
- E2E Playwright: `<config.paths.e2e>` (e.g. `apps/*/tests/e2e/*.spec.ts`)
|
|
197
|
+
|
|
198
|
+
See the `void-testing` skill for the full technique catalog (factories over `beforeEach`, fixture externalization, behavior-first naming, snapshot policy).
|
|
199
|
+
|
|
200
|
+
### Schema contracts at trust boundaries
|
|
201
|
+
|
|
202
|
+
If you touch a schema in `<config.paths.contracts>` (Zod schemas at trust boundaries):
|
|
203
|
+
|
|
204
|
+
1. RED: add a `parse()` case that should fail (invalid data) or succeed (valid data)
|
|
205
|
+
2. GREEN: modify the schema
|
|
206
|
+
3. Verify: every downstream call site that consumes this type must compile AND pass its tests
|
|
207
|
+
|
|
208
|
+
The contract is the **single source of truth**, never redefined in tests.
|
|
209
|
+
|
|
210
|
+
### Frontend behavior (strict)
|
|
211
|
+
|
|
212
|
+
For a UI change, RED lives at the smallest observable surface: component, hook, store, accessibility
|
|
213
|
+
contract, or rendered state. Cover every applicable loading/empty/error/success/partial state named
|
|
214
|
+
by the pre-build experience brief. An interactive control needs a role-first keyboard regression
|
|
215
|
+
test before any E2E proof; E2E may confirm the journey but cannot be the first place a keyboard bug
|
|
216
|
+
is caught. Record passing test evidence against the current diff hash so a later UI edit invalidates
|
|
217
|
+
the proof instead of inheriting green.
|
|
218
|
+
|
|
219
|
+
### Anti-pattern detected too often
|
|
220
|
+
|
|
221
|
+
Mocking the DB or Server Actions to make a test pass: it breaks at the next refactor without
|
|
222
|
+
protecting anything. Prefer integration tests (pglite / dev DB branch) or invoking the action
|
|
223
|
+
directly. Full anti-mock-business rationale: the `void-testing` skill.
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Coverage (strict)
|
|
228
|
+
|
|
229
|
+
100% by default on the business layer (services + domain). Verification before PR approval:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
<config.commands.testUnit> --coverage
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Target reading:
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
All files | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
|
|
239
|
+
----------|---------|----------|---------|---------|---
|
|
240
|
+
All files | 100 | 100 | 100 | 100 |
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Exception
|
|
244
|
+
|
|
245
|
+
If 100% is impossible (e.g. a Sentry wrapper whose init branch is not testable without an HTTP cassette):
|
|
246
|
+
|
|
247
|
+
1. Document in the package README: why + where the missing coverage is compensated (integration/E2E)
|
|
248
|
+
2. Explicit Folpe approval
|
|
249
|
+
3. List in repo CLAUDE.md under "Test coverage exceptions"
|
|
250
|
+
|
|
251
|
+
Burden of proof on the requester. 100% remains the default.
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## TDD Evidence (strict)
|
|
256
|
+
|
|
257
|
+
The commit history must show the RED → GREEN → [MUTATE → KILL] → REFACTOR progression.
|
|
258
|
+
|
|
259
|
+
```
|
|
260
|
+
abc123 test: add failing test for retryOperation backoff
|
|
261
|
+
def456 feat: implement retryOperation exponential backoff
|
|
262
|
+
ghi789 test: strengthen boundary tests post-mutation (kills 3 survivors)
|
|
263
|
+
jkl012 refactor: extract backoff helper for clarity
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Documented exceptions
|
|
267
|
+
|
|
268
|
+
If evidence is not linear (multi-session, grouped refactor, context resume), document in the PR:
|
|
269
|
+
|
|
270
|
+
```markdown
|
|
271
|
+
## TDD Evidence
|
|
272
|
+
|
|
273
|
+
RED phase: commit c925187
|
|
274
|
+
GREEN phase: commits 5e0055b, 9a246d0
|
|
275
|
+
MUTATE + KILL: commit 7b8c9d0
|
|
276
|
+
REFACTOR: commit 11dbd1a
|
|
277
|
+
|
|
278
|
+
Test Evidence:
|
|
279
|
+
- 4/4 tests passing (vitest run, 7.7s)
|
|
280
|
+
- Mutation score: 94% (3/52 documented survivors)
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Exception on the evidence presentation, **never on the process**.
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Anti-rustine integrated
|
|
288
|
+
|
|
289
|
+
If you are tempted to:
|
|
290
|
+
|
|
291
|
+
- Skip TDD "just this once"
|
|
292
|
+
- Mock everything to "make the test pass"
|
|
293
|
+
- Cast `as any` to avoid real modeling
|
|
294
|
+
- Add a test after the fact that passes immediately
|
|
295
|
+
|
|
296
|
+
→ Stop signal. Redesign the approach. Source: project-level "no rustine" rule.
|
|
297
|
+
|
|
298
|
+
A test that is hard to write = a design that is hard to use. The test is the API oracle.
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Red Flags (strict)
|
|
303
|
+
|
|
304
|
+
Source: superpowers/test-driven-development. Keep the full list — this is the anti-drift psychology.
|
|
305
|
+
|
|
306
|
+
- Code written before the test
|
|
307
|
+
- Test written after the implementation
|
|
308
|
+
- Test that passes immediately
|
|
309
|
+
- Cannot explain why the test failed
|
|
310
|
+
- Tests added "later"
|
|
311
|
+
- Rationalization "just this once"
|
|
312
|
+
- "I already tested it manually"
|
|
313
|
+
- "Tests after reach the same goal"
|
|
314
|
+
- "It is the spirit, not the ritual"
|
|
315
|
+
- "Keep as reference" / "adapt the existing code"
|
|
316
|
+
- "I already spent X hours, deleting is a waste"
|
|
317
|
+
- "TDD is dogmatic, I am pragmatic"
|
|
318
|
+
- "This case is different because..."
|
|
319
|
+
|
|
320
|
+
→ **All these phrases mean: delete, start over in strict.**
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## Common Rationalizations
|
|
325
|
+
|
|
326
|
+
| Excuse | Reality |
|
|
327
|
+
|---|---|
|
|
328
|
+
| "Too simple to test" | Simple code breaks. The test takes 30 seconds. |
|
|
329
|
+
| "I test afterward" | Tests that pass immediately prove nothing. |
|
|
330
|
+
| "Tests after reach the same goal" | After-tests answer "what does this code do." Before-tests answer "what should this code do." |
|
|
331
|
+
| "I tested it manually" | Manual ≠ systematic. No trace, not re-executable. |
|
|
332
|
+
| "X hours of work to delete = waste" | Sunk-cost fallacy. Keeping unverified code is debt. |
|
|
333
|
+
| "Keep as reference, write tests first" | You will adapt it. That is testing-after. Delete = delete. |
|
|
334
|
+
| "Need to explore first" | OK. Throw away the exploration, restart in strict. |
|
|
335
|
+
| "Hard to test = design not clear" | Listen to the test. Hard to test = hard to use. |
|
|
336
|
+
| "TDD will slow me down" | TDD is faster than debugging in prod. Pragmatic = test-first. |
|
|
337
|
+
| "Manual is faster" | Manual does not prove edge cases. You will re-test on every change. |
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## Verification checklist
|
|
342
|
+
|
|
343
|
+
Before marking the work complete:
|
|
344
|
+
|
|
345
|
+
- [ ] TDD mode identified at start (strict / souple / exploratory)
|
|
346
|
+
- [ ] Every line of production code has a test that requested it (strict)
|
|
347
|
+
- [ ] Watched every test fail before impl (strict)
|
|
348
|
+
- [ ] Every test fails for the right reason (feature missing, not typo)
|
|
349
|
+
- [ ] Minimal code to pass each test
|
|
350
|
+
- [ ] All tests pass
|
|
351
|
+
- [ ] Pristine output (no warnings, no errors)
|
|
352
|
+
- [ ] Tests use real code (mocks only where unavoidable)
|
|
353
|
+
- [ ] Edge cases and errors covered
|
|
354
|
+
- [ ] Mutation testing run + survivors handled (strict, when `commands.mutation` exists)
|
|
355
|
+
- [ ] Coverage verified 100% or exception documented (strict)
|
|
356
|
+
- [ ] Commit history shows TDD evidence or documented exception (strict)
|
|
357
|
+
- [ ] Refactor evaluated and applied where it has value (all Critical/High priorities addressed)
|
|
358
|
+
|
|
359
|
+
Cannot check every box in strict? You skipped TDD. Restart.
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## When you are stuck
|
|
364
|
+
|
|
365
|
+
| Problem | Solution |
|
|
366
|
+
|---|---|
|
|
367
|
+
| Do not know how to test | Write the desired signature. Write the assertion first. Ask the user. |
|
|
368
|
+
| Test too complex | Design too complex. Simplify the API. |
|
|
369
|
+
| Must mock everything | Code too coupled. Use parameter injection (see `void-hexagonal-architecture` skill). |
|
|
370
|
+
| Huge test setup | Extract helpers. Still complex? Rethink the design. |
|
|
371
|
+
| Mode not obvious | Ask the user. Default to souple > strict when in doubt. |
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## Debugging integration
|
|
376
|
+
|
|
377
|
+
Bug found? **Write a failing test that reproduces it before any fix.** Follow the TDD cycle of the applicable mode. The test proves the fix and prevents the regression.
|
|
378
|
+
|
|
379
|
+
Never fix a bug without a reproducing test.
|
|
380
|
+
|
|
381
|
+
See the `void-debug` skill for the upstream root-cause discipline.
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## Final rule
|
|
386
|
+
|
|
387
|
+
```
|
|
388
|
+
Production code → a test exists and failed first (strict)
|
|
389
|
+
→ a test exists (souple)
|
|
390
|
+
→ the code is marked as throwaway (exploratory)
|
|
391
|
+
Otherwise → this is not voidcorp tdd.
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
No exception without explicit permission from the human partner.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Harness metadata for this skill. Not part of the Agent Skills
|
|
2
|
+
# specification, and never copied into a consumer project: the SKILL.md
|
|
3
|
+
# beside it stays portable and validates against the official six fields.
|
|
4
|
+
# Read by this repository's graph, and by the installer for `runtimes`.
|
|
5
|
+
kind: standard
|
|
6
|
+
activation: always
|
|
7
|
+
owner: folpe
|
|
8
|
+
runtimes: [claude, codex]
|
|
9
|
+
enforcement:
|
|
10
|
+
floor: ci
|
|
11
|
+
inline:
|
|
12
|
+
claude: pretooluse
|
|
13
|
+
codex: pretooluse
|
|
14
|
+
hermes: ci-only
|
|
15
|
+
eval_targets: [claude/anthropic/opus]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Sources for `void-testing` skill (see `docs/plans/skill-audits/void-testing.md` for full audit):
|
|
2
|
+
|
|
3
|
+
- Kent C. Dodds "Common Testing Mistakes" + Testing Library philosophy — https://kentcdodds.com/blog/common-mistakes-with-react-testing-library
|
|
4
|
+
- James Shore "Testing Without Mocks" (Art of Agile Development 2nd ed.) — https://www.jamesshore.com/v2/books/aoad2/testing_without_mocks — sociable tests, nullable infrastructure
|
|
5
|
+
- Martin Fowler "Mocks Aren't Stubs" — https://martinfowler.com/articles/mocksArentStubs.html — terminology baseline (dummy / stub / spy / mock / fake)
|
|
6
|
+
- citypaul/.dotfiles testing notes — pyramid ratios, fixture externalization
|
|
7
|
+
- superpowers test patterns — verify-test-fails-for-right-reason, pristine output
|
|
8
|
+
- Vitest docs — https://vitest.dev — tactical specifics in pack-monorepo
|
|
9
|
+
- Playwright docs — https://playwright.dev — tactical specifics in pack-nextjs-pwa
|
|
10
|
+
- Next.js CLI — https://nextjs.org/docs/app/api-reference/cli/next — build and serve the deployment-equivalent artifact
|
|
11
|
+
- Playwright fixtures, parallelism and auth — https://playwright.dev/docs/test-fixtures, https://playwright.dev/docs/test-parallel, https://playwright.dev/docs/auth — isolated worker state and authentication setup
|
|
12
|
+
- Better Auth rate limits — https://better-auth.com/docs/concepts/rate-limit — preserve production defaults and prove client-facing denial
|
|
13
|
+
- MSW (Mock Service Worker) — https://mswjs.io — HTTP boundary mocking
|
|
14
|
+
- pglite — https://pglite.dev — in-memory Postgres for fast integration tests
|
|
15
|
+
|
|
16
|
+
Strategy: distill. Author from sources; framework specifics live in packs. Hooks: no-only-no-skip, test-name-lint, no-business-mock, no-snapshot-default.
|
|
17
|
+
|
|
18
|
+
DEV-444 adaptation: Testing Library's role-first principle is extended to keyboard input and explicit
|
|
19
|
+
applicable-state coverage without moving TDD cycle ownership into this skill.
|