voidmachine 0.0.0 → 4.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 +253 -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 +61 -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 +157 -0
- package/core-assets/contract-history/visual-craft-director/v2.yaml +43 -0
- package/core-assets/data/catalog.v3.json +10479 -0
- package/core-assets/data/certification.json +1800 -0
- package/core-assets/data/identity.json +8 -0
- package/core-assets/data/model.json +4226 -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 +5459 -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 +358 -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 +271 -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 +167 -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 +183 -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-plan/.source +15 -0
- package/core-assets/skills/void-plan/SKILL.md +239 -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 +12 -0
- package/core-assets/skills/void-security-guidance/SKILL.md +255 -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 +239 -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 +37 -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 +57001 -0
- package/package.json +66 -4
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: void-functional
|
|
3
|
+
description: Pure-by-default, errors as values (Result<T, E>), discriminated unions for state, immutability defaults, functional core / imperative shell. Side effects at adapters. Use for data flow or state.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# functional — voidcorp craftsman edition
|
|
7
|
+
|
|
8
|
+
The domain decides in pure code. The world translates in adapters. Expected failures are values, not exceptions. Choices are types, not flags. Immutability is the default; mutation earns its place.
|
|
9
|
+
|
|
10
|
+
This is `void-hexagonal-architecture`'s boundary viewed through a different lens — Bernhardt's functional core / imperative shell. Inside the hexagon: pure. At the adapters: effects.
|
|
11
|
+
|
|
12
|
+
**Attribution**: see `.source` in this directory. Foundation: Wlaschin "Domain Modeling Made Functional," Mark Seemann "Code That Fits in Your Head," Bernhardt "Functional Core, Imperative Shell," Khorikov.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Pure by default
|
|
17
|
+
|
|
18
|
+
A function is **pure** if (a) same input → same output, (b) no observable side effects.
|
|
19
|
+
|
|
20
|
+
Most domain logic should be pure. Side effects (DB writes, network calls, logging, time, randomness) live at adapter boundaries — outside the pure core.
|
|
21
|
+
|
|
22
|
+
### Pure-in-effect
|
|
23
|
+
|
|
24
|
+
An async function that only `await`s injected ports is pure-in-effect: deterministic given the same ports. This is the practical equivalent of pure code in an async TS context.
|
|
25
|
+
|
|
26
|
+
### Red Flag — side effect inside a "pure" function
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
function calculateInvoice(order: Order): Invoice {
|
|
30
|
+
const id = randomUUID(); // RED FLAG — impure
|
|
31
|
+
const at = Date.now(); // RED FLAG — impure
|
|
32
|
+
fetch('https://analytics/...'); // RED FLAG — side effect
|
|
33
|
+
return { id, at, ... };
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Fix: inject the ports.
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
function calculateInvoice(
|
|
41
|
+
deps: { ids: IdPort; clock: ClockPort },
|
|
42
|
+
order: Order,
|
|
43
|
+
): Invoice {
|
|
44
|
+
return { id: deps.ids.newInvoiceId(), at: deps.clock.now(), ... };
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Now `calculateInvoice` is pure-in-effect: deterministic given the same `deps`.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Functional Core / Imperative Shell (Bernhardt)
|
|
53
|
+
|
|
54
|
+
All decisions happen in pure code (the "core"). All side effects happen in the "shell" (adapters).
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
shell (adapters) → core (pure decisions) → shell (effects)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The shell:
|
|
61
|
+
- Reads from outside (HTTP request, DB row, queue message)
|
|
62
|
+
- Calls the core with the relevant input
|
|
63
|
+
- Writes the result back outside (HTTP response, DB write, queue publish)
|
|
64
|
+
|
|
65
|
+
The core:
|
|
66
|
+
- Takes typed input
|
|
67
|
+
- Returns typed output (often `Result<T, E>`)
|
|
68
|
+
- No I/O, no side effects, no time / randomness without an injected port
|
|
69
|
+
|
|
70
|
+
This boundary IS the `void-hexagonal-architecture` boundary. Same line, different framing.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Errors as values — `Result<T, E>`
|
|
75
|
+
|
|
76
|
+
Expected failures (validation error, business rule violation, expected external failure) are values.
|
|
77
|
+
|
|
78
|
+
The standardized shape, published in `@voidcorp/core/result`:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
type Result<T, E> =
|
|
82
|
+
| { ok: true; value: T }
|
|
83
|
+
| { ok: false; error: E };
|
|
84
|
+
|
|
85
|
+
export const ok = <T>(value: T): Result<T, never> => ({ ok: true, value });
|
|
86
|
+
export const err = <E>(error: E): Result<never, E> => ({ ok: false, error });
|
|
87
|
+
|
|
88
|
+
export function map<T, U, E>(r: Result<T, E>, fn: (t: T) => U): Result<U, E> {
|
|
89
|
+
return r.ok ? ok(fn(r.value)) : r;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function flatMap<T, U, E>(
|
|
93
|
+
r: Result<T, E>,
|
|
94
|
+
fn: (t: T) => Result<U, E>,
|
|
95
|
+
): Result<U, E> {
|
|
96
|
+
return r.ok ? fn(r.value) : r;
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Usage
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
async function checkout(
|
|
104
|
+
deps: CheckoutDeps,
|
|
105
|
+
input: { cartId: CartId },
|
|
106
|
+
): Promise<Result<OrderConfirmation, CheckoutError>> {
|
|
107
|
+
const cart = await deps.orders.findCartById(input.cartId);
|
|
108
|
+
if (!cart.ok) return cart;
|
|
109
|
+
|
|
110
|
+
const payment = await deps.payment.charge(cart.value.total);
|
|
111
|
+
if (!payment.ok) return err({ kind: 'payment_failed', cause: payment.error });
|
|
112
|
+
|
|
113
|
+
return ok({ orderId: cart.value.id, confirmedAt: deps.clock.now() });
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
The signature tells the caller everything: the input is what it claims, the output is either the typed success or the typed failure, no exception hidden in the implementation.
|
|
118
|
+
|
|
119
|
+
### Exceptions for the unexpected
|
|
120
|
+
|
|
121
|
+
Exceptions remain for truly unexpected bugs (DB down, network timeout, invariant violation that should be impossible). Sentry catches them. Domain code does not litter `try/catch` for these.
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
// expected business failure → Result
|
|
125
|
+
function withdraw(account: Account, amount: Money): Result<Account, InsufficientFundsError>;
|
|
126
|
+
|
|
127
|
+
// unexpected technical failure → throw, let it bubble
|
|
128
|
+
async function chargeWithRetry(stripe: StripeClient, ...): Promise<Charge> {
|
|
129
|
+
// network errors, retries, etc. — exceptions are fine here
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Algebraic Data Types (sum types)
|
|
136
|
+
|
|
137
|
+
A choice with N variants is a discriminated union. Not a flag bag.
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
type Order =
|
|
141
|
+
| { kind: 'draft'; id: OrderId; items: LineItem[] }
|
|
142
|
+
| { kind: 'submitted'; id: OrderId; items: LineItem[]; submittedAt: IsoDate }
|
|
143
|
+
| { kind: 'confirmed'; id: OrderId; items: LineItem[]; confirmedAt: IsoDate; tableNumber: number }
|
|
144
|
+
| { kind: 'cancelled'; id: OrderId; reason: string; cancelledAt: IsoDate };
|
|
145
|
+
|
|
146
|
+
// transitions are functions on specific variants
|
|
147
|
+
function confirm(
|
|
148
|
+
o: Order & { kind: 'submitted' },
|
|
149
|
+
tableNumber: number,
|
|
150
|
+
now: IsoDate,
|
|
151
|
+
): Order & { kind: 'confirmed' } {
|
|
152
|
+
return { kind: 'confirmed', id: o.id, items: o.items, confirmedAt: now, tableNumber };
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
The compiler refuses `confirm(draftOrder, ...)`. State transitions are mechanical, exhaustive switches cover every case. Composes with `void-typescript-strict` exhaustive-switch enforcement and `void-domain-driven-design` aggregate state machines.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Immutability defaults
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
// preferred
|
|
164
|
+
type User = { readonly id: UserId; readonly email: Email; readonly createdAt: IsoDate };
|
|
165
|
+
const users: readonly User[] = [...];
|
|
166
|
+
|
|
167
|
+
// updates produce new values
|
|
168
|
+
const updated = { ...user, email: newEmail };
|
|
169
|
+
const usersPlusOne = [...users, newUser];
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Mutation in place is an exception:
|
|
173
|
+
|
|
174
|
+
- Performance hot paths (large array transforms, with tests proving the win)
|
|
175
|
+
- Builder-style construction inside a private scope (then `return` an immutable result)
|
|
176
|
+
|
|
177
|
+
The companion `void-code-review` flags mutation in domain code without justification.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## No `null`
|
|
182
|
+
|
|
183
|
+
`null` duplicates the optionality concept and creates `null | undefined` ambiguity. Banned.
|
|
184
|
+
|
|
185
|
+
Use `T | undefined` with `exactOptionalPropertyTypes` semantics:
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
type User = { id: UserId; email: Email; nickname?: string };
|
|
189
|
+
// nickname property may be absent OR present (with a value), never explicitly undefined or null
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Or `Option<T>` (also in `@voidcorp/core`):
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
type Option<T> = { kind: 'some'; value: T } | { kind: 'none' };
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
When to choose:
|
|
199
|
+
|
|
200
|
+
- `T | undefined` for "may not be set yet" / optional configuration / props
|
|
201
|
+
- `Option<T>` for domain optionality where you want to discriminate explicitly (and prevent forgetting to handle the `none` case via exhaustive switch)
|
|
202
|
+
|
|
203
|
+
The companion hook `no-null-grep` warns on `null` literals in domain code.
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Composition over inheritance
|
|
208
|
+
|
|
209
|
+
Build behavior by composing functions.
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
// composition
|
|
213
|
+
const sendWelcomeEmail = pipe(
|
|
214
|
+
buildEmailPayload,
|
|
215
|
+
withWelcomeTemplate,
|
|
216
|
+
withSignature,
|
|
217
|
+
send,
|
|
218
|
+
);
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
A `pipe` helper is in `@voidcorp/core`:
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
export function pipe<A>(value: A): A;
|
|
225
|
+
export function pipe<A, B>(value: A, f1: (a: A) => B): B;
|
|
226
|
+
export function pipe<A, B, C>(value: A, f1: (a: A) => B, f2: (b: B) => C): C;
|
|
227
|
+
// ... up to ~10 stages, fully typed
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Class hierarchies are an exception with a documented reason (framework integration, React error boundary).
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Banned (by default)
|
|
235
|
+
|
|
236
|
+
### Effect-TS / fp-ts as runtime dependency
|
|
237
|
+
|
|
238
|
+
Rejected as default. Available as opt-in via a future pack when a project needs structured concurrency, layered effects, or rich combinators.
|
|
239
|
+
|
|
240
|
+
### Haskell-style point-free / monad transformers / `traverse` / `applicative`
|
|
241
|
+
|
|
242
|
+
Reject as default vocabulary. Use plain TS function parameters and the minimal `Result` / `Option` / `pipe` helpers. Consumers reaching for richer combinators adopt fp-ts or Effect-TS as a pack.
|
|
243
|
+
|
|
244
|
+
### `null`
|
|
245
|
+
|
|
246
|
+
Banned in domain code.
|
|
247
|
+
|
|
248
|
+
### Throwing for expected domain failures
|
|
249
|
+
|
|
250
|
+
Use `Result<T, E>`. Throw only for the unexpected.
|
|
251
|
+
|
|
252
|
+
### Currying as default
|
|
253
|
+
|
|
254
|
+
Curry when partial application is actually used at multiple call sites. Otherwise plain multi-arg.
|
|
255
|
+
|
|
256
|
+
### Side effects inside "pure" functions
|
|
257
|
+
|
|
258
|
+
Inject ports.
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Companion hooks
|
|
263
|
+
|
|
264
|
+
- **`no-null-grep`** (pre-commit) — warn on `null` literal in domain code (`config.paths.business`). Tag `// allow-null: <reason>` to suppress.
|
|
265
|
+
|
|
266
|
+
(Most functional rules surface via `void-typescript-strict` enforcement and `void-code-review` flags.)
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## Composition with other skills
|
|
271
|
+
|
|
272
|
+
- **`void-typescript-strict`**: provides the type machinery (discriminated unions, exhaustive switches, branded types, `satisfies`). This skill says when to use them.
|
|
273
|
+
- **`void-hexagonal-architecture`**: the boundary is the same. Functional core = pure domain inside hex. Imperative shell = adapters at the edge.
|
|
274
|
+
- **`void-domain-driven-design`**: value objects as branded types + smart constructors returning `Result`. Aggregates as discriminated unions for stateful workflows. Always-valid domain.
|
|
275
|
+
- **`void-tdd`**: pure functions are trivially testable. RED writes a property-style or example-based test; GREEN implements pure.
|
|
276
|
+
- **`void-testing`**: pure functions need no mocks. Sociable tests by default.
|
|
277
|
+
- **`void-refactor`**: common moves — Replace Loop with Pipeline, Replace Conditional with Polymorphism (via discriminated-union dispatch), Replace Throw with Result, Extract Pure Function.
|
|
278
|
+
- **`void-security-guidance`**: pure validation at trust boundaries returning `Result<Validated, ValidationError>`.
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## Anti-rules
|
|
283
|
+
|
|
284
|
+
- MUST NOT impose Effect-TS / fp-ts / monad transformers / point-free style as defaults.
|
|
285
|
+
- MUST NOT decide where the functional / imperative split sits — that is `void-hexagonal-architecture`'s call.
|
|
286
|
+
- MUST NOT decide what an aggregate is — that is `void-domain-driven-design`'s call.
|
|
287
|
+
- MUST NOT decide test ergonomics — that is `void-testing`'s call.
|
|
288
|
+
- MUST NOT silently allow side effects in supposedly-pure functions.
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## When you are stuck
|
|
293
|
+
|
|
294
|
+
| Problem | Solution |
|
|
295
|
+
|---|---|
|
|
296
|
+
| Should I throw or return Result? | Expected failure (validation, business rule) = Result. Unexpected (DB down) = throw, Sentry catches. |
|
|
297
|
+
| Need time / randomness in pure code | Inject a ClockPort / RandomPort. Configure with a fake in tests. |
|
|
298
|
+
| Discriminated union with 10 variants | Either: smaller domain (the cases are unrelated, separate types), or genuinely a 10-state machine — keep it, but document. |
|
|
299
|
+
| Pipeline becomes 12 stages | Probably mixing concerns. Split into two pipelines, name the intermediate type. |
|
|
300
|
+
| Need point-free for clarity | Try named partial application first. Adopt Effect-TS / fp-ts pack only if multiple use-cases benefit. |
|
|
301
|
+
| Cannot avoid mutation | Confine it to a private scope. Return immutable result. Add a test proving the perf win if performance-driven. |
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## Final rule
|
|
306
|
+
|
|
307
|
+
```
|
|
308
|
+
Pure by default. Errors as values. Choices as types. Effects at the boundary.
|
|
309
|
+
Otherwise → it is not voidcorp functional.
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
The discipline is small. The payoff is exhaustively testable domain code and a typesystem that reflects what is actually true.
|
|
@@ -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,15 @@
|
|
|
1
|
+
Sources for `void-graph` (see `docs/plans/skill-audits/void-graph.md` for the full audit).
|
|
2
|
+
|
|
3
|
+
Original to void-machine. It wraps this repository's own CLI, so there is no upstream skill to
|
|
4
|
+
distil: the subject did not exist anywhere else.
|
|
5
|
+
|
|
6
|
+
Provenance rather than inspiration: it was a slash command under `packages/core/commands/`,
|
|
7
|
+
shipped there on 2026-06-04 because the plugin carried no in-session ergonomics at the time and a
|
|
8
|
+
skill was not invocable from the keyboard. Claude Code has since merged commands into skills, and
|
|
9
|
+
neither Codex nor Kimi ever had the command format, so the command was Claude-only for a reason
|
|
10
|
+
that had expired. Converted on 2026-08-19, keeping its name and its `allowed-tools`, gaining
|
|
11
|
+
`disable-model-invocation: true` — the gesture is typed by a human, never guessed by the model.
|
|
12
|
+
|
|
13
|
+
Rejected while converting: letting the model invoke it on its own. A health check, an audit or a
|
|
14
|
+
graph report that fires unprompted arrives when nobody asked and nobody acts on it, and it spends
|
|
15
|
+
a screen doing so.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: void-graph
|
|
3
|
+
description: Read the installed harness as a graph and report what is dead, underused or expensive. No argument opens the local live studio; audit, cost and behavior print a terminal report.
|
|
4
|
+
allowed-tools: Bash(void-machine:*) Bash(npx:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# void-graph
|
|
8
|
+
|
|
9
|
+
The harness is a graph: skills, agents, hooks, and the edges between them. This reads that graph
|
|
10
|
+
against what actually ran here.
|
|
11
|
+
|
|
12
|
+
**Attribution**: see `.source`.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## When it fires
|
|
17
|
+
|
|
18
|
+
Only when a human asks. It answers a question about the harness itself, not about the work in
|
|
19
|
+
progress, and it costs a terminal for as long as someone reads it.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Run it
|
|
24
|
+
|
|
25
|
+
Everything goes through the CLI, which every install has:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
void-machine graph audit # dead, dead-hook, underused, low-yield components
|
|
29
|
+
void-machine graph cost # token weight per component
|
|
30
|
+
void-machine graph behavior # what actually fired, against what was declared
|
|
31
|
+
void-machine graph live # local studio, served on localhost, offline
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`npx voidmachine graph <sub>` when the binary is not on PATH.
|
|
35
|
+
|
|
36
|
+
For `live`, run it in the background so the session is not blocked, read the
|
|
37
|
+
`serving on http://localhost:<port>` line, and give the human that URL.
|
|
38
|
+
|
|
39
|
+
Everything is local. No npm, no network, no account. The analyzer reads the installed model and
|
|
40
|
+
correlates it with this project's own events under `.void/machine/runs/*/events.jsonl`.
|
|
41
|
+
|
|
42
|
+
> Do not reach for a path inside a plugin directory. The bundled analyzer used to be invoked
|
|
43
|
+
> through the plugin-root variable, which a runtime substitutes for plugin assets only: on a local
|
|
44
|
+
> install it stayed literal and pointed at nothing. The CLI is the one entry point that resolves
|
|
45
|
+
> on every channel and every runtime.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Read it
|
|
50
|
+
|
|
51
|
+
Say what the report flags, and say what the reading can support:
|
|
52
|
+
|
|
53
|
+
- **dead / dead-hook** — declared and never observed. Which is a statement about the observation
|
|
54
|
+
window, not about the component's worth. Give the window.
|
|
55
|
+
- **underused / low-yield** — observed rarely, or observed often for little effect.
|
|
56
|
+
- **expensive** — carries token weight out of proportion to what it returns.
|
|
57
|
+
|
|
58
|
+
Every finding is **advisory**. It is a candidate for trimming or tuning, never an instruction,
|
|
59
|
+
and nothing is applied from here.
|
|
60
|
+
|
|
61
|
+
If the report says the data is insufficient, that is the answer: the activation meter needs
|
|
62
|
+
enough sessions before absence means anything. `--min-sessions 1 --min-events 1` previews on a
|
|
63
|
+
single session and should be labelled as a preview when you show it.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Red flags
|
|
68
|
+
|
|
69
|
+
| Rationalization | Reality |
|
|
70
|
+
|---|---|
|
|
71
|
+
| "It is dead, remove it" | It was not observed in this window. Removal is a human decision, taken with the reason it exists. |
|
|
72
|
+
| "Insufficient data, the command failed" | It reported an absence of evidence, which is a real answer and often the useful one. |
|
|
73
|
+
| "I'll run the bundled .mjs directly, it is faster" | That path only exists under a plugin install. The CLI resolves everywhere. |
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Composition
|
|
78
|
+
|
|
79
|
+
Adjacent: `void-audit` proposes what to do about staleness; this shows the shape it sits in.
|
|
80
|
+
Downstream: an accepted trim is filed through `void-learn`.
|
|
@@ -0,0 +1,14 @@
|
|
|
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: action
|
|
6
|
+
owner: folpe
|
|
7
|
+
runtimes: [claude, codex]
|
|
8
|
+
enforcement:
|
|
9
|
+
floor: ci
|
|
10
|
+
inline:
|
|
11
|
+
claude: active
|
|
12
|
+
codex: active
|
|
13
|
+
hermes: ci-only
|
|
14
|
+
eval_targets: [claude/anthropic/opus]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Sources for `void-hexagonal-architecture` skill (see `docs/plans/skill-audits/void-hexagonal-architecture.md` for full audit):
|
|
2
|
+
|
|
3
|
+
- Alistair Cockburn "Hexagonal Architecture" 2005 — https://alistair.cockburn.us/hexagonal-architecture/ — original ports + adapters definition
|
|
4
|
+
- Bruno Boucard & Thomas Pierrain workshops/talks — testing strategy at the boundary
|
|
5
|
+
- Herberto Graca "Explicit Architecture" — https://herbertograca.com/2017/11/16/explicit-architecture-01-ddd-hexagonal-onion-clean-cqrs-how-i-put-it-all-together/ — layered hex with use-cases
|
|
6
|
+
- Gary Bernhardt "Functional Core, Imperative Shell" — DCDC 2012 talk — mental model twin of hex
|
|
7
|
+
- Vladimir Khorikov "Enterprise Craftsmanship" — functional / architecture framing
|
|
8
|
+
- citypaul/.dotfiles hex notes — cross-package import enforcement via tsconfig paths
|
|
9
|
+
|
|
10
|
+
Strategy: distill. Reject DI containers, CQRS, mediator, event sourcing as defaults (per docs/PHILOSOPHY.md Wing Chun). Function-parameter injection only.
|
|
11
|
+
|
|
12
|
+
Companion hook: boundary-direction-check (greps domain → infrastructure imports).
|