exonous 0.0.0-stage → 2.10.4
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/README.md +100 -2
- package/assets/THIRD-PARTY-NOTICES.md +29 -0
- package/assets/adapters/opencode/exonous.js +54 -0
- package/assets/agents/exo-backend.md +22 -0
- package/assets/agents/exo-cto.md +22 -0
- package/assets/agents/exo-data-ai.md +22 -0
- package/assets/agents/exo-designer.md +22 -0
- package/assets/agents/exo-devops.md +22 -0
- package/assets/agents/exo-frontend.md +22 -0
- package/assets/agents/exo-infra.md +22 -0
- package/assets/agents/exo-mobile.md +22 -0
- package/assets/agents/exo-pm.md +22 -0
- package/assets/agents/exo-qa.md +22 -0
- package/assets/agents/exo-researcher.md +22 -0
- package/assets/agents/exo-security.md +22 -0
- package/assets/agents/roster.json +209 -0
- package/assets/agents/taxis.js +189 -0
- package/assets/editors/cursor/frontend-skills.mdc +27 -0
- package/assets/editors/hooks/cursor/hooks.json +11 -0
- package/assets/machine/PR-TEMPLATE.md +21 -0
- package/assets/machine/hooks/anamnesis.cjs +61 -0
- package/assets/machine/hooks/ethos.cjs +48 -0
- package/assets/machine/hooks/kairos.cjs +46 -0
- package/assets/machine/hooks/lib/cli-options.cjs +133 -0
- package/assets/machine/hooks/lib/memory.cjs +488 -0
- package/assets/machine/hooks/lib/metron.cjs +52 -0
- package/assets/machine/hooks/lib/paths.cjs +99 -0
- package/assets/machine/hooks/lib/payload.cjs +81 -0
- package/assets/machine/hooks/lib/pr-template-validate.cjs +103 -0
- package/assets/machine/hooks/lib/release.cjs +58 -0
- package/assets/machine/hooks/lib/repo.cjs +138 -0
- package/assets/machine/hooks/lib/sanitize.cjs +37 -0
- package/assets/machine/hooks/lib/selfupdate.cjs +354 -0
- package/assets/machine/hooks/lib/shell.cjs +722 -0
- package/assets/machine/hooks/lib/template.cjs +70 -0
- package/assets/machine/hooks/lib/token.cjs +110 -0
- package/assets/machine/hooks/lib/validate-pr-body.cjs +21 -0
- package/assets/machine/hooks/pyle.cjs +302 -0
- package/assets/rules/nomos.md +59 -0
- package/assets/rules/praxis.md +38 -0
- package/assets/skills/code-review/SKILL.md +124 -0
- package/assets/skills/commit-changes/SKILL.md +49 -0
- package/assets/skills/deliver/SKILL.md +114 -0
- package/assets/skills/deliver/references/parallel.md +37 -0
- package/assets/skills/doc/SKILL.md +140 -0
- package/assets/skills/doc/doc.mjs +277 -0
- package/assets/skills/issue-board/SKILL.md +84 -0
- package/assets/skills/issue-board/board.mjs +389 -0
- package/assets/skills/issue-board/config.example.json +9 -0
- package/assets/skills/issue-board/render.py +189 -0
- package/assets/skills/make-pr/SKILL.md +24 -0
- package/assets/skills/native-ui/SKILL.md +67 -0
- package/assets/skills/native-ui/reference/apple.md +180 -0
- package/assets/skills/native-ui/reference/mobile-feel.md +221 -0
- package/assets/skills/native-ui/reference/swift.md +289 -0
- package/assets/skills/project-memory/SKILL.md +59 -0
- package/assets/skills/project-memory/config.example.json +4 -0
- package/assets/skills/project-memory/project-memory.mjs +478 -0
- package/assets/skills/security-review/SKILL.md +102 -0
- package/assets/skills/session-handoff/SKILL.md +23 -0
- package/assets/skills/session-handoff/config.example.json +3 -0
- package/assets/skills/ui-design/SKILL.md +75 -0
- package/assets/skills/ui-design/reference/adapt.md +151 -0
- package/assets/skills/ui-design/reference/adapt.native.md +35 -0
- package/assets/skills/ui-design/reference/android.md +50 -0
- package/assets/skills/ui-design/reference/animate.md +87 -0
- package/assets/skills/ui-design/reference/audit.md +76 -0
- package/assets/skills/ui-design/reference/audit.native.md +126 -0
- package/assets/skills/ui-design/reference/bolder.md +33 -0
- package/assets/skills/ui-design/reference/clarify.md +84 -0
- package/assets/skills/ui-design/reference/colorize.md +86 -0
- package/assets/skills/ui-design/reference/craft-floor.md +25 -0
- package/assets/skills/ui-design/reference/critique.md +345 -0
- package/assets/skills/ui-design/reference/degraded/asset-producer.md +35 -0
- package/assets/skills/ui-design/reference/degraded/documenter.md +23 -0
- package/assets/skills/ui-design/reference/degraded/finish-reviewer.md +43 -0
- package/assets/skills/ui-design/reference/degraded/manual-edit-applier.md +56 -0
- package/assets/skills/ui-design/reference/delight.md +63 -0
- package/assets/skills/ui-design/reference/distill.md +98 -0
- package/assets/skills/ui-design/reference/doctor.md +49 -0
- package/assets/skills/ui-design/reference/document.md +273 -0
- package/assets/skills/ui-design/reference/extract.md +52 -0
- package/assets/skills/ui-design/reference/harden.md +122 -0
- package/assets/skills/ui-design/reference/hooks.md +114 -0
- package/assets/skills/ui-design/reference/init.md +47 -0
- package/assets/skills/ui-design/reference/ios.md +55 -0
- package/assets/skills/ui-design/reference/layout.md +81 -0
- package/assets/skills/ui-design/reference/live-setup.md +75 -0
- package/assets/skills/ui-design/reference/live.md +326 -0
- package/assets/skills/ui-design/reference/new-work.md +350 -0
- package/assets/skills/ui-design/reference/onboard.md +85 -0
- package/assets/skills/ui-design/reference/operate.md +29 -0
- package/assets/skills/ui-design/reference/optimize.md +101 -0
- package/assets/skills/ui-design/reference/overdrive.md +83 -0
- package/assets/skills/ui-design/reference/polish.md +77 -0
- package/assets/skills/ui-design/reference/quieter.md +95 -0
- package/assets/skills/ui-design/reference/routing.md +37 -0
- package/assets/skills/ui-design/reference/shape.md +43 -0
- package/assets/skills/ui-design/reference/styles/brutalist.md +45 -0
- package/assets/skills/ui-design/reference/styles/design-md.md +70 -0
- package/assets/skills/ui-design/reference/styles/direction.md +95 -0
- package/assets/skills/ui-design/reference/styles/full-output.md +42 -0
- package/assets/skills/ui-design/reference/styles/minimalist.md +64 -0
- package/assets/skills/ui-design/reference/styles/premium.md +65 -0
- package/assets/skills/ui-design/reference/styles/redesign.md +59 -0
- package/assets/skills/ui-design/reference/typeset.md +73 -0
- package/assets/skills/ui-design/reference/visualize.md +156 -0
- package/assets/skills/ui-design/scripts/ENGINE-LICENSE +191 -0
- package/assets/skills/ui-design/scripts/VERSION +1 -0
- package/assets/skills/ui-design/scripts/bin/darwin-arm64/impeccable +0 -0
- package/assets/skills/ui-design/scripts/command-metadata.json +94 -0
- package/assets/skills/ui-design/scripts/data/font-index-failures.json +121 -0
- package/assets/skills/ui-design/scripts/data/font-index.json +1 -0
- package/assets/skills/ui-design/scripts/impeccable +206 -0
- package/assets/skills/ui-design/scripts/impeccable.cmd +214 -0
- package/assets/skills/ui-design/scripts/live-browser-dom.js +167 -0
- package/assets/skills/ui-design/scripts/live-browser-ignores.js +242 -0
- package/assets/skills/ui-design/scripts/live-browser-session.js +144 -0
- package/assets/skills/ui-design/scripts/live-browser.js +12990 -0
- package/assets/skills/ui-design/scripts/modern-screenshot.umd.js +14 -0
- package/assets/skills/ui-design/scripts/ui-design +6 -0
- package/assets/skills/ui-design/scripts/ui-design.cmd +3 -0
- package/assets/skills/ui-design/scripts/ui-design.mjs +124 -0
- package/assets/skills/ui-mockup/SKILL.md +68 -0
- package/assets/skills/ui-mockup/reference/brandkit.md +101 -0
- package/assets/skills/ui-mockup/reference/image-to-code.md +83 -0
- package/assets/skills/ui-mockup/reference/mobile-comps.md +94 -0
- package/assets/skills/ui-mockup/reference/web-comps.md +83 -0
- package/assets/skills/ui-motion/SKILL.md +112 -0
- package/assets/skills/ui-motion/reference/expo.md +224 -0
- package/assets/skills/ui-motion/reference/opportunities.md +81 -0
- package/assets/skills/ui-motion/reference/prototype.md +238 -0
- package/assets/skills/ui-motion/reference/review.md +163 -0
- package/assets/skills/ui-motion/reference/toasts.md +144 -0
- package/assets/skills/ui-motion/reference/ui-libraries.md +71 -0
- package/assets/skills/ui-motion/reference/vocabulary.md +130 -0
- package/assets/skills/ui-motion/reference/web.md +294 -0
- package/assets/skills/ui-patterns/SKILL.md +105 -0
- package/assets/skills/ui-patterns/references/stacks/html-tailwind.md +40 -0
- package/assets/skills/ui-patterns/references/stacks/nextjs.md +52 -0
- package/assets/skills/ui-patterns/references/stacks/nuxt.md +100 -0
- package/assets/skills/ui-patterns/references/stacks/react-native.md +48 -0
- package/assets/skills/ui-patterns/references/stacks/react.md +49 -0
- package/assets/skills/ui-patterns/references/stacks/shadcn.md +57 -0
- package/assets/skills/ui-patterns/references/stacks/vue.md +37 -0
- package/assets/techne/.claude-plugin/marketplace.json +31 -0
- package/assets/techne/.claude-plugin/plugin.json +24 -0
- package/assets/techne/.mcp.json +8 -0
- package/assets/techne/commands/build-fix.md +48 -0
- package/assets/techne/commands/refactor-clean.md +46 -0
- package/assets/techne/commands/test-coverage.md +42 -0
- package/assets/techne/hooks/hooks.json +49 -0
- package/assets/techne/rules/angular/coding-style.md +49 -0
- package/assets/techne/rules/angular/hooks.md +23 -0
- package/assets/techne/rules/angular/patterns.md +48 -0
- package/assets/techne/rules/angular/security.md +26 -0
- package/assets/techne/rules/angular/testing.md +46 -0
- package/assets/techne/rules/arkts/coding-style.md +63 -0
- package/assets/techne/rules/arkts/hooks.md +38 -0
- package/assets/techne/rules/arkts/patterns.md +42 -0
- package/assets/techne/rules/arkts/security.md +35 -0
- package/assets/techne/rules/arkts/testing.md +39 -0
- package/assets/techne/rules/common/agents.md +6 -0
- package/assets/techne/rules/common/code-review.md +15 -0
- package/assets/techne/rules/common/coding-style.md +13 -0
- package/assets/techne/rules/common/development-workflow.md +5 -0
- package/assets/techne/rules/common/git-workflow.md +30 -0
- package/assets/techne/rules/common/hooks.md +7 -0
- package/assets/techne/rules/common/patterns.md +3 -0
- package/assets/techne/rules/common/performance.md +3 -0
- package/assets/techne/rules/common/security.md +5 -0
- package/assets/techne/rules/common/testing.md +3 -0
- package/assets/techne/rules/cpp/coding-style.md +31 -0
- package/assets/techne/rules/cpp/hooks.md +26 -0
- package/assets/techne/rules/cpp/patterns.md +31 -0
- package/assets/techne/rules/cpp/security.md +37 -0
- package/assets/techne/rules/cpp/testing.md +31 -0
- package/assets/techne/rules/csharp/coding-style.md +30 -0
- package/assets/techne/rules/csharp/hooks.md +24 -0
- package/assets/techne/rules/csharp/patterns.md +28 -0
- package/assets/techne/rules/csharp/security.md +32 -0
- package/assets/techne/rules/csharp/testing.md +27 -0
- package/assets/techne/rules/dart/coding-style.md +47 -0
- package/assets/techne/rules/dart/hooks.md +26 -0
- package/assets/techne/rules/dart/patterns.md +38 -0
- package/assets/techne/rules/dart/security.md +44 -0
- package/assets/techne/rules/dart/testing.md +39 -0
- package/assets/techne/rules/fsharp/coding-style.md +34 -0
- package/assets/techne/rules/fsharp/hooks.md +25 -0
- package/assets/techne/rules/fsharp/patterns.md +43 -0
- package/assets/techne/rules/fsharp/security.md +32 -0
- package/assets/techne/rules/fsharp/testing.md +27 -0
- package/assets/techne/rules/golang/coding-style.md +30 -0
- package/assets/techne/rules/golang/hooks.md +17 -0
- package/assets/techne/rules/golang/patterns.md +43 -0
- package/assets/techne/rules/golang/security.md +33 -0
- package/assets/techne/rules/golang/testing.md +20 -0
- package/assets/techne/rules/java/coding-style.md +51 -0
- package/assets/techne/rules/java/hooks.md +18 -0
- package/assets/techne/rules/java/patterns.md +55 -0
- package/assets/techne/rules/java/security.md +33 -0
- package/assets/techne/rules/java/testing.md +33 -0
- package/assets/techne/rules/kotlin/coding-style.md +50 -0
- package/assets/techne/rules/kotlin/hooks.md +17 -0
- package/assets/techne/rules/kotlin/patterns.md +44 -0
- package/assets/techne/rules/kotlin/security.md +34 -0
- package/assets/techne/rules/kotlin/testing.md +38 -0
- package/assets/techne/rules/nuxt/coding-style.md +20 -0
- package/assets/techne/rules/nuxt/hooks.md +16 -0
- package/assets/techne/rules/nuxt/patterns.md +46 -0
- package/assets/techne/rules/nuxt/security.md +19 -0
- package/assets/techne/rules/nuxt/testing.md +15 -0
- package/assets/techne/rules/perl/coding-style.md +33 -0
- package/assets/techne/rules/perl/hooks.md +22 -0
- package/assets/techne/rules/perl/patterns.md +43 -0
- package/assets/techne/rules/perl/security.md +39 -0
- package/assets/techne/rules/perl/testing.md +42 -0
- package/assets/techne/rules/php/coding-style.md +30 -0
- package/assets/techne/rules/php/hooks.md +24 -0
- package/assets/techne/rules/php/patterns.md +26 -0
- package/assets/techne/rules/php/security.md +27 -0
- package/assets/techne/rules/php/testing.md +28 -0
- package/assets/techne/rules/python/coding-style.md +38 -0
- package/assets/techne/rules/python/fastapi.md +57 -0
- package/assets/techne/rules/python/hooks.md +19 -0
- package/assets/techne/rules/python/patterns.md +37 -0
- package/assets/techne/rules/python/security.md +26 -0
- package/assets/techne/rules/python/testing.md +32 -0
- package/assets/techne/rules/react/coding-style.md +24 -0
- package/assets/techne/rules/react/hooks.md +62 -0
- package/assets/techne/rules/react/patterns.md +48 -0
- package/assets/techne/rules/react/security.md +45 -0
- package/assets/techne/rules/react/testing.md +42 -0
- package/assets/techne/rules/react-native/accessibility.md +14 -0
- package/assets/techne/rules/react-native/coding-style.md +16 -0
- package/assets/techne/rules/react-native/hooks.md +16 -0
- package/assets/techne/rules/react-native/patterns.md +18 -0
- package/assets/techne/rules/react-native/performance.md +14 -0
- package/assets/techne/rules/react-native/production-readiness.md +16 -0
- package/assets/techne/rules/react-native/security.md +16 -0
- package/assets/techne/rules/react-native/testing.md +14 -0
- package/assets/techne/rules/ruby/coding-style.md +40 -0
- package/assets/techne/rules/ruby/hooks.md +33 -0
- package/assets/techne/rules/ruby/patterns.md +33 -0
- package/assets/techne/rules/ruby/security.md +39 -0
- package/assets/techne/rules/ruby/testing.md +35 -0
- package/assets/techne/rules/rust/coding-style.md +41 -0
- package/assets/techne/rules/rust/hooks.md +16 -0
- package/assets/techne/rules/rust/patterns.md +42 -0
- package/assets/techne/rules/rust/security.md +33 -0
- package/assets/techne/rules/rust/testing.md +30 -0
- package/assets/techne/rules/swift/coding-style.md +30 -0
- package/assets/techne/rules/swift/hooks.md +20 -0
- package/assets/techne/rules/swift/patterns.md +30 -0
- package/assets/techne/rules/swift/security.md +22 -0
- package/assets/techne/rules/swift/testing.md +28 -0
- package/assets/techne/rules/typescript/coding-style.md +38 -0
- package/assets/techne/rules/typescript/hooks.md +14 -0
- package/assets/techne/rules/typescript/patterns.md +12 -0
- package/assets/techne/rules/typescript/security.md +14 -0
- package/assets/techne/rules/typescript/testing.md +12 -0
- package/assets/techne/rules/vue/coding-style.md +19 -0
- package/assets/techne/rules/vue/hooks.md +13 -0
- package/assets/techne/rules/vue/patterns.md +29 -0
- package/assets/techne/rules/vue/security.md +11 -0
- package/assets/techne/rules/vue/testing.md +11 -0
- package/assets/techne/rules/web/coding-style.md +25 -0
- package/assets/techne/rules/web/design-quality.md +21 -0
- package/assets/techne/rules/web/hooks.md +39 -0
- package/assets/techne/rules/web/patterns.md +23 -0
- package/assets/techne/rules/web/performance.md +25 -0
- package/assets/techne/rules/web/security.md +23 -0
- package/assets/techne/rules/web/testing.md +21 -0
- package/assets/techne/scripts/hooks/config-guard.js +50 -0
- package/assets/techne/scripts/hooks/edit-tracker.js +26 -0
- package/assets/techne/scripts/hooks/lib/shell.js +204 -0
- package/assets/techne/scripts/hooks/no-verify-guard.js +205 -0
- package/assets/techne/scripts/hooks/run.js +92 -0
- package/assets/techne/scripts/hooks/stop-checks.js +136 -0
- package/assets/techne/skills/angular/SKILL.md +34 -0
- package/assets/techne/skills/angular/reference/components-and-templates.md +63 -0
- package/assets/techne/skills/angular/reference/dependency-injection.md +44 -0
- package/assets/techne/skills/angular/reference/forms.md +97 -0
- package/assets/techne/skills/angular/reference/routing.md +50 -0
- package/assets/techne/skills/angular/reference/signals-and-state.md +59 -0
- package/assets/techne/skills/angular/reference/styling-motion-a11y.md +54 -0
- package/assets/techne/skills/angular/reference/testing.md +52 -0
- package/assets/techne/skills/angular/reference/tooling.md +31 -0
- package/assets/techne/skills/cpp/SKILL.md +27 -0
- package/assets/techne/skills/cpp/reference/coding-standards.md +160 -0
- package/assets/techne/skills/databases/SKILL.md +35 -0
- package/assets/techne/skills/databases/reference/clickhouse.md +102 -0
- package/assets/techne/skills/databases/reference/migrations.md +94 -0
- package/assets/techne/skills/databases/reference/mysql.md +101 -0
- package/assets/techne/skills/databases/reference/postgres.md +72 -0
- package/assets/techne/skills/databases/reference/prisma.md +105 -0
- package/assets/techne/skills/databases/reference/redis.md +108 -0
- package/assets/techne/skills/delivery/SKILL.md +35 -0
- package/assets/techne/skills/delivery/reference/deployment-patterns.md +58 -0
- package/assets/techne/skills/delivery/reference/docker-patterns.md +77 -0
- package/assets/techne/skills/delivery/reference/git-workflow.md +64 -0
- package/assets/techne/skills/delivery/reference/github-ops.md +67 -0
- package/assets/techne/skills/delivery/reference/jira-integration.md +53 -0
- package/assets/techne/skills/delivery/reference/kubernetes-patterns.md +67 -0
- package/assets/techne/skills/dotnet/SKILL.md +27 -0
- package/assets/techne/skills/dotnet/reference/dotnet-core.md +131 -0
- package/assets/techne/skills/flutter/SKILL.md +29 -0
- package/assets/techne/skills/flutter/reference/code-review.md +76 -0
- package/assets/techne/skills/flutter/reference/patterns.md +201 -0
- package/assets/techne/skills/go/SKILL.md +28 -0
- package/assets/techne/skills/go/reference/patterns.md +87 -0
- package/assets/techne/skills/go/reference/testing.md +142 -0
- package/assets/techne/skills/java/SKILL.md +29 -0
- package/assets/techne/skills/java/reference/java-standards.md +117 -0
- package/assets/techne/skills/java/reference/springboot.md +108 -0
- package/assets/techne/skills/kotlin/SKILL.md +35 -0
- package/assets/techne/skills/kotlin/reference/android-clean-architecture.md +115 -0
- package/assets/techne/skills/kotlin/reference/compose-multiplatform-patterns.md +113 -0
- package/assets/techne/skills/kotlin/reference/kotlin-coroutines-flows.md +93 -0
- package/assets/techne/skills/kotlin/reference/kotlin-patterns.md +74 -0
- package/assets/techne/skills/kotlin/reference/kotlin-testing.md +115 -0
- package/assets/techne/skills/ml/SKILL.md +34 -0
- package/assets/techne/skills/ml/reference/ai-regression-testing.md +99 -0
- package/assets/techne/skills/ml/reference/cost-aware-llm-pipeline.md +133 -0
- package/assets/techne/skills/ml/reference/eval-harness.md +94 -0
- package/assets/techne/skills/ml/reference/mle-workflow.md +177 -0
- package/assets/techne/skills/ml/reference/prompt-optimizer.md +107 -0
- package/assets/techne/skills/ml/reference/pytorch-patterns.md +164 -0
- package/assets/techne/skills/php/SKILL.md +27 -0
- package/assets/techne/skills/php/reference/laravel.md +142 -0
- package/assets/techne/skills/python/SKILL.md +33 -0
- package/assets/techne/skills/python/reference/django.md +104 -0
- package/assets/techne/skills/python/reference/fastapi.md +118 -0
- package/assets/techne/skills/python/reference/python-core.md +88 -0
- package/assets/techne/skills/python/reference/python-testing.md +105 -0
- package/assets/techne/skills/quality/SKILL.md +34 -0
- package/assets/techne/skills/quality/reference/benchmark.md +55 -0
- package/assets/techne/skills/quality/reference/browser-qa.md +60 -0
- package/assets/techne/skills/quality/reference/coding-standards.md +88 -0
- package/assets/techne/skills/quality/reference/e2e-testing.md +99 -0
- package/assets/techne/skills/quality/reference/tdd-workflow.md +89 -0
- package/assets/techne/skills/quality/reference/verification-loop.md +80 -0
- package/assets/techne/skills/react/SKILL.md +30 -0
- package/assets/techne/skills/react/reference/nextjs-turbopack.md +42 -0
- package/assets/techne/skills/react/reference/react-patterns.md +139 -0
- package/assets/techne/skills/react/reference/react-performance.md +101 -0
- package/assets/techne/skills/react/reference/react-testing.md +139 -0
- package/assets/techne/skills/react-native/SKILL.md +28 -0
- package/assets/techne/skills/react-native/reference/expo-patterns.md +196 -0
- package/assets/techne/skills/research/SKILL.md +35 -0
- package/assets/techne/skills/research/reference/architecture-decision-records.md +65 -0
- package/assets/techne/skills/research/reference/codebase-onboarding.md +44 -0
- package/assets/techne/skills/research/reference/deep-research.md +50 -0
- package/assets/techne/skills/research/reference/iterative-retrieval.md +62 -0
- package/assets/techne/skills/research/reference/product-lens.md +38 -0
- package/assets/techne/skills/research/reference/search-first.md +50 -0
- package/assets/techne/skills/rust/SKILL.md +28 -0
- package/assets/techne/skills/rust/reference/patterns.md +108 -0
- package/assets/techne/skills/rust/reference/testing.md +142 -0
- package/assets/techne/skills/services/SKILL.md +32 -0
- package/assets/techne/skills/services/reference/api-contracts.md +139 -0
- package/assets/techne/skills/services/reference/backend-layers.md +95 -0
- package/assets/techne/skills/services/reference/errors-and-resilience.md +146 -0
- package/assets/techne/skills/services/reference/hexagonal-boundaries.md +93 -0
- package/assets/techne/skills/services/reference/mcp-servers.md +50 -0
- package/assets/techne/skills/services/reference/nestjs.md +96 -0
- package/assets/techne/skills/swift/SKILL.md +29 -0
- package/assets/techne/skills/swift/reference/concurrency.md +83 -0
- package/assets/techne/skills/swift/reference/swiftui.md +139 -0
- package/assets/techne/skills/vue/SKILL.md +29 -0
- package/assets/techne/skills/vue/reference/nuxt4-patterns.md +90 -0
- package/assets/techne/skills/vue/reference/ui-to-vue.md +90 -0
- package/assets/techne/skills/vue/reference/vue-patterns.md +151 -0
- package/assets/techne/skills/web/SKILL.md +30 -0
- package/assets/techne/skills/web/reference/bun-runtime.md +55 -0
- package/assets/techne/skills/web/reference/frontend-patterns.md +54 -0
- package/assets/techne/skills/web/reference/seo.md +77 -0
- package/assets/techne/skills/web/reference/vite-patterns.md +96 -0
- package/bin/native.cjs +30 -0
- package/native/aarch64-apple-darwin/exonous +0 -0
- package/native/aarch64-unknown-linux-gnu/exonous +0 -0
- package/native/x86_64-apple-darwin/exonous +0 -0
- package/native/x86_64-pc-windows-msvc/exonous.exe +0 -0
- package/native/x86_64-unknown-linux-gnu/exonous +0 -0
- package/package.json +1 -6
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Prompt optimizer (advisory)
|
|
2
|
+
|
|
3
|
+
Analyze a draft user prompt and return a **better prompt to paste** — plus diagnosis. **Do not execute** the underlying task, write production code, or mutate the repo unless the user starts a normal task request.
|
|
4
|
+
|
|
5
|
+
## Triggers
|
|
6
|
+
|
|
7
|
+
- “Optimize / improve / rewrite my prompt”
|
|
8
|
+
- User pastes a vague instruction and asks how to ask the agent better
|
|
9
|
+
- **Not** for “optimize this code/performance” — that is implementation work
|
|
10
|
+
- **Not** when user says “just do it” — tell them to send a standard task message instead
|
|
11
|
+
|
|
12
|
+
## Pipeline
|
|
13
|
+
|
|
14
|
+
### 0 — Context
|
|
15
|
+
|
|
16
|
+
- Read project `CLAUDE.md` when present
|
|
17
|
+
- Infer stack from manifests (`package.json`, `pyproject.toml`, `go.mod`, etc.)
|
|
18
|
+
- If greenfield, mark stack unknown in output
|
|
19
|
+
|
|
20
|
+
### 1 — Intent
|
|
21
|
+
|
|
22
|
+
| Intent | Signals |
|
|
23
|
+
|--------|---------|
|
|
24
|
+
| Feature | build, add, implement |
|
|
25
|
+
| Bug | fix, broken, error |
|
|
26
|
+
| Refactor | restructure, clean up |
|
|
27
|
+
| Research | how, explore, investigate |
|
|
28
|
+
| Test | coverage, verify |
|
|
29
|
+
| Review | audit, PR review |
|
|
30
|
+
| Docs | document, README |
|
|
31
|
+
| Infra | deploy, CI, database |
|
|
32
|
+
| Design | architecture, data model |
|
|
33
|
+
|
|
34
|
+
### 2 — Scope
|
|
35
|
+
|
|
36
|
+
| Scope | Heuristic | Orchestration |
|
|
37
|
+
|-------|-----------|---------------|
|
|
38
|
+
| Trivial | one file | direct task |
|
|
39
|
+
| Low | one module | single skill |
|
|
40
|
+
| Medium | multi-file, one domain | skill chain + **techne:quality** verify |
|
|
41
|
+
| High | cross-domain | plan first (**techne:research** / **exo-pm**) |
|
|
42
|
+
| Epic | multi-session | phased plan, **/session-handoff** between sessions |
|
|
43
|
+
|
|
44
|
+
### 3 — Kit mapping (techne names)
|
|
45
|
+
|
|
46
|
+
| Intent | Skills / agents |
|
|
47
|
+
|--------|-----------------|
|
|
48
|
+
| Feature | **techne:quality**, stack skill (**techne:web**, **techne:react**, **techne:python**, …), **exo-qa** review |
|
|
49
|
+
| Bug | **techne:quality**, stack skill |
|
|
50
|
+
| Refactor | **techne:quality**, **code-review** |
|
|
51
|
+
| Research | **techne:research**, **atlas**, **biblos** |
|
|
52
|
+
| Test | **techne:quality** |
|
|
53
|
+
| Review | **code-review**, **security-review**, **exo-qa**, **exo-security** |
|
|
54
|
+
| Infra | **techne:delivery**, **exo-infra**, **exo-devops** |
|
|
55
|
+
| ML / LLM | **techne:ml**, **exo-data-ai** |
|
|
56
|
+
|
|
57
|
+
Add stack skill from detection table (e.g. Python → **techne:python**, Postgres → **techne:databases**).
|
|
58
|
+
|
|
59
|
+
### 4 — Missing context scan
|
|
60
|
+
|
|
61
|
+
Flag gaps: acceptance criteria, scope boundaries, error handling, security, tests, performance, a11y (**ui-design** `audit`/`harden` for UI), migrations. If **3+** critical gaps, ask up to **3** clarifying questions before emitting the optimized prompt.
|
|
62
|
+
|
|
63
|
+
### 5 — Model recommendation (house rule)
|
|
64
|
+
|
|
65
|
+
| Scope | Agent model tier |
|
|
66
|
+
|-------|-------------------|
|
|
67
|
+
| Trivial–medium planning, research, prompt writing | Economical |
|
|
68
|
+
| Production code implementation | Robust |
|
|
69
|
+
| Epic architecture | Robust for plan; economical for doc-only phases unless deep reasoning required |
|
|
70
|
+
|
|
71
|
+
Split HIGH/EPIC work into sequential prompts (research → plan → implement phases → integration review).
|
|
72
|
+
|
|
73
|
+
## Output format (match user language)
|
|
74
|
+
|
|
75
|
+
### 1. Diagnosis
|
|
76
|
+
|
|
77
|
+
Strengths; issues table (problem / impact / fix); clarification list (or auto-detected facts).
|
|
78
|
+
|
|
79
|
+
### 2. Recommended kit
|
|
80
|
+
|
|
81
|
+
| Type | Name | Purpose |
|
|
82
|
+
|
|
83
|
+
### 3. Optimized prompt — full
|
|
84
|
+
|
|
85
|
+
Single fenced block, self-contained: context, stack, acceptance criteria, verification, explicit “do not” scope, skill/agent hints.
|
|
86
|
+
|
|
87
|
+
### 4. Optimized prompt — quick
|
|
88
|
+
|
|
89
|
+
One-liner patterns per intent (e.g. feature: plan → TDD → code-review → verify).
|
|
90
|
+
|
|
91
|
+
### 5. Rationale table
|
|
92
|
+
|
|
93
|
+
| Enhancement | Why |
|
|
94
|
+
|
|
95
|
+
Footer: user may request edits or switch to a normal execution request.
|
|
96
|
+
|
|
97
|
+
## Example (English, abbreviated)
|
|
98
|
+
|
|
99
|
+
**In:** “Add profile PATCH API with validation”
|
|
100
|
+
|
|
101
|
+
**Out (full prompt sketch):** stack-detected Go + chi; PATCH `/api/users/:id`; authz self-only; table-driven tests; follow existing handlers; **techne:services** + **techne:go**; acceptance = 200/400/401 paths; do not change schema; run tests + build before review.
|
|
102
|
+
|
|
103
|
+
## Related
|
|
104
|
+
|
|
105
|
+
- **techne:research** — discovery before large prompts
|
|
106
|
+
- **techne:ml** `cost-aware-llm-pipeline` — token spend when prompts embed huge context
|
|
107
|
+
- **/session-handoff** — multi-session epic work
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# PyTorch patterns
|
|
2
|
+
|
|
3
|
+
Idiomatic training and inference: portable devices, reproducible seeds, explicit modes, and memory-aware loops. Confirm API details via **biblos** for your installed PyTorch major version.
|
|
4
|
+
|
|
5
|
+
## Principles
|
|
6
|
+
|
|
7
|
+
**Device-agnostic**
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
|
11
|
+
net = Model().to(device)
|
|
12
|
+
batch_x = batch_x.to(device)
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**Reproducibility** (document GPU nondeterminism)
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
def seed_all(seed: int) -> None:
|
|
19
|
+
torch.manual_seed(seed)
|
|
20
|
+
torch.cuda.manual_seed_all(seed)
|
|
21
|
+
import numpy as np, random
|
|
22
|
+
np.random.seed(seed)
|
|
23
|
+
random.seed(seed)
|
|
24
|
+
torch.backends.cudnn.deterministic = True
|
|
25
|
+
torch.backends.cudnn.benchmark = False
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Shapes** — comment tensor ranks in `forward`; verify after refactors.
|
|
29
|
+
|
|
30
|
+
## Module layout
|
|
31
|
+
|
|
32
|
+
Split feature blocks and heads; initialize weights explicitly; never allocate parameters inside `forward`.
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
class ConvNet(nn.Module):
|
|
36
|
+
def __init__(self, n_classes: int, drop: float = 0.5) -> None:
|
|
37
|
+
super().__init__()
|
|
38
|
+
self.backbone = nn.Sequential(
|
|
39
|
+
nn.Conv2d(3, 64, 3, padding=1),
|
|
40
|
+
nn.BatchNorm2d(64),
|
|
41
|
+
nn.ReLU(inplace=False),
|
|
42
|
+
nn.MaxPool2d(2),
|
|
43
|
+
)
|
|
44
|
+
self.head = nn.Sequential(nn.Dropout(drop), nn.Linear(64 * 16 * 16, n_classes))
|
|
45
|
+
|
|
46
|
+
def forward(self, x: torch.Tensor) -> torch.Tensor:
|
|
47
|
+
x = self.backbone(x)
|
|
48
|
+
return self.head(x.flatten(1))
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Training loop
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
def train_epoch(
|
|
55
|
+
net: nn.Module,
|
|
56
|
+
loader: DataLoader,
|
|
57
|
+
opt: torch.optim.Optimizer,
|
|
58
|
+
loss_fn: nn.Module,
|
|
59
|
+
device: torch.device,
|
|
60
|
+
scaler: torch.amp.GradScaler | None = None,
|
|
61
|
+
) -> float:
|
|
62
|
+
net.train()
|
|
63
|
+
running = 0.0
|
|
64
|
+
for x, y in loader:
|
|
65
|
+
x, y = x.to(device), y.to(device)
|
|
66
|
+
opt.zero_grad(set_to_none=True)
|
|
67
|
+
with torch.amp.autocast("cuda", enabled=scaler is not None):
|
|
68
|
+
logits = net(x)
|
|
69
|
+
loss = loss_fn(logits, y)
|
|
70
|
+
if scaler:
|
|
71
|
+
scaler.scale(loss).backward()
|
|
72
|
+
scaler.unscale_(opt)
|
|
73
|
+
nn.utils.clip_grad_norm_(net.parameters(), 1.0)
|
|
74
|
+
scaler.step(opt)
|
|
75
|
+
scaler.update()
|
|
76
|
+
else:
|
|
77
|
+
loss.backward()
|
|
78
|
+
nn.utils.clip_grad_norm_(net.parameters(), 1.0)
|
|
79
|
+
opt.step()
|
|
80
|
+
running += loss.item()
|
|
81
|
+
return running / len(loader)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Evaluation
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
@torch.no_grad()
|
|
88
|
+
def eval_epoch(net, loader, loss_fn, device) -> tuple[float, float]:
|
|
89
|
+
net.eval()
|
|
90
|
+
total_loss, correct, n = 0.0, 0, 0
|
|
91
|
+
for x, y in loader:
|
|
92
|
+
x, y = x.to(device), y.to(device)
|
|
93
|
+
logits = net(x)
|
|
94
|
+
total_loss += loss_fn(logits, y).item()
|
|
95
|
+
correct += (logits.argmax(1) == y).sum().item()
|
|
96
|
+
n += y.size(0)
|
|
97
|
+
return total_loss / len(loader), correct / n
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Data loading
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
loader = DataLoader(
|
|
104
|
+
ds,
|
|
105
|
+
batch_size=32,
|
|
106
|
+
shuffle=True,
|
|
107
|
+
num_workers=4,
|
|
108
|
+
pin_memory=True,
|
|
109
|
+
persistent_workers=True,
|
|
110
|
+
drop_last=True,
|
|
111
|
+
)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Variable-length batches: pad in `collate_fn` with `nn.utils.rnn.pad_sequence`.
|
|
115
|
+
|
|
116
|
+
## Checkpoints
|
|
117
|
+
|
|
118
|
+
Save full training state when resuming; load on CPU with safe weights:
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
def persist(path: str, net, opt, epoch: int, loss: float) -> None:
|
|
122
|
+
torch.save(
|
|
123
|
+
{"epoch": epoch, "net": net.state_dict(), "opt": opt.state_dict(), "loss": loss},
|
|
124
|
+
path,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
def restore(path: str, net, opt=None) -> dict:
|
|
128
|
+
blob = torch.load(path, map_location="cpu", weights_only=True)
|
|
129
|
+
net.load_state_dict(blob["net"])
|
|
130
|
+
if opt and "opt" in blob:
|
|
131
|
+
opt.load_state_dict(blob["opt"])
|
|
132
|
+
return blob
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Prefer `state_dict` over pickling whole modules.
|
|
136
|
+
|
|
137
|
+
## Performance knobs
|
|
138
|
+
|
|
139
|
+
| Technique | When |
|
|
140
|
+
|-----------|------|
|
|
141
|
+
| `torch.amp.autocast` + `GradScaler` | GPU training throughput |
|
|
142
|
+
| `torch.utils.checkpoint.checkpoint` | OOM on large models |
|
|
143
|
+
| `torch.compile(net, mode="reduce-overhead")` | PyTorch 2+ stable graphs |
|
|
144
|
+
| `pin_memory=True` | Host→device copies |
|
|
145
|
+
|
|
146
|
+
Profile with `torch.profiler`; inspect VRAM via `torch.cuda.memory_summary()`.
|
|
147
|
+
|
|
148
|
+
## Idiom quick reference
|
|
149
|
+
|
|
150
|
+
| Practice | Reason |
|
|
151
|
+
|----------|--------|
|
|
152
|
+
| `net.train()` / `net.eval()` | Dropout & BatchNorm behavior |
|
|
153
|
+
| `torch.no_grad()` | Inference / metrics |
|
|
154
|
+
| `zero_grad(set_to_none=True)` | Less alloc on large models |
|
|
155
|
+
| Avoid inplace ops on tensors needing grad | Broken autograd |
|
|
156
|
+
| `.item()` only for logging after `backward` | Keeps graph intact |
|
|
157
|
+
| Move model once before epoch loop | Avoid per-step `.cuda()` |
|
|
158
|
+
|
|
159
|
+
## Anti-patterns
|
|
160
|
+
|
|
161
|
+
- Validation while `train()` mode active
|
|
162
|
+
- `torch.save(net, path)` portability trap
|
|
163
|
+
- Hardcoded `.cuda()` without fallback
|
|
164
|
+
- Creating weights inside `forward` each call
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: php
|
|
3
|
+
description: Laravel HTTP layer, Eloquent, form requests, API resources, queues, and caching for production APIs. Use when building or reviewing Laravel apps, routes, or Eloquent models.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# techne:php
|
|
7
|
+
|
|
8
|
+
Laravel-specific patterns. Generic HTTP/API design: **techne:services**; migrations and SQL tuning: **techne:databases**; CI/deploy: **techne:delivery**.
|
|
9
|
+
|
|
10
|
+
## Non-negotiables
|
|
11
|
+
|
|
12
|
+
1. Thin controllers: validate in **FormRequest**, orchestrate in **Actions** or **Services**, persist via repositories or Eloquent as appropriate.
|
|
13
|
+
2. Authorize in `authorize()` on form requests or policies—route-model binding alone is not access control.
|
|
14
|
+
3. Nested routes: enable `scopeBindings()` (or equivalent) so child models cannot be accessed across parent tenants.
|
|
15
|
+
4. Eloquent lists: eager-load relationships (`with([...])`) before loops; paginate with explicit `latest()` / indexed order columns.
|
|
16
|
+
5. Multi-step writes: `DB::transaction()`; keep side effects (mail, webhooks) in queued jobs with idempotent handlers.
|
|
17
|
+
6. API shape: **JsonResource** + consistent envelope (`data`, `meta`, errors); never leak stack traces in production JSON.
|
|
18
|
+
7. Casts: enums/value objects on models; avoid stringly-typed status fields in business logic.
|
|
19
|
+
8. Config in `config/*.php`, secrets in `.env`; run `config:cache` in production after deploy.
|
|
20
|
+
9. Migrations: anonymous classes, reversible `down()`, foreign keys with explicit `constrained()` behavior.
|
|
21
|
+
10. **biblos** MCP for Laravel APIs; security regressions: **security-review** / **exo-security**.
|
|
22
|
+
|
|
23
|
+
## References
|
|
24
|
+
|
|
25
|
+
| File | Load when |
|
|
26
|
+
|------|-----------|
|
|
27
|
+
| [reference/laravel.md](reference/laravel.md) | Structure, routing, Eloquent, resources, jobs, cache |
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Laravel patterns
|
|
2
|
+
|
|
3
|
+
## Layers
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
app/Actions/ # single use-case classes
|
|
7
|
+
app/Services/ # coordination across models/gateways
|
|
8
|
+
app/Http/Requests/ # validation + authorize()
|
|
9
|
+
app/Http/Resources/ # JSON transformers
|
|
10
|
+
app/Models/
|
|
11
|
+
app/Jobs/
|
|
12
|
+
routes/api.php
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Flow: **Route → Controller → FormRequest → Action/Service → Model/Repository → Resource response**.
|
|
16
|
+
|
|
17
|
+
## Routing
|
|
18
|
+
|
|
19
|
+
```php
|
|
20
|
+
Route::middleware('auth:sanctum')->group(function (): void {
|
|
21
|
+
Route::apiResource('orders', OrderController::class);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
Route::scopeBindings()->prefix('accounts/{account}')->group(function (): void {
|
|
25
|
+
Route::get('projects/{project}', [ProjectController::class, 'show']);
|
|
26
|
+
});
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- Parameter names match model keys (`{conversation}` → `Conversation`).
|
|
30
|
+
- `Route::model()` or `resolveRouteBinding()` when parameter names differ from class names.
|
|
31
|
+
|
|
32
|
+
## Controller + action
|
|
33
|
+
|
|
34
|
+
```php
|
|
35
|
+
final class OrderController extends Controller
|
|
36
|
+
{
|
|
37
|
+
public function __construct(private PlaceOrderAction $placeOrder) {}
|
|
38
|
+
|
|
39
|
+
public function store(StoreOrderRequest $request): JsonResponse
|
|
40
|
+
{
|
|
41
|
+
$order = $this->placeOrder->handle($request->toDto());
|
|
42
|
+
|
|
43
|
+
return response()->json([
|
|
44
|
+
'data' => OrderResource::make($order),
|
|
45
|
+
'meta' => null,
|
|
46
|
+
], 201);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Form requests
|
|
52
|
+
|
|
53
|
+
```php
|
|
54
|
+
final class StoreOrderRequest extends FormRequest
|
|
55
|
+
{
|
|
56
|
+
public function authorize(): bool
|
|
57
|
+
{
|
|
58
|
+
return $this->user()?->can('create', Order::class) ?? false;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public function rules(): array
|
|
62
|
+
{
|
|
63
|
+
return [
|
|
64
|
+
'customer_id' => ['required', 'integer', 'exists:customers,id'],
|
|
65
|
+
'items' => ['required', 'array', 'min:1'],
|
|
66
|
+
'items.*.sku' => ['required', 'string'],
|
|
67
|
+
'items.*.qty' => ['required', 'integer', 'min:1'],
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Eloquent
|
|
74
|
+
|
|
75
|
+
```php
|
|
76
|
+
final class Project extends Model
|
|
77
|
+
{
|
|
78
|
+
use SoftDeletes;
|
|
79
|
+
|
|
80
|
+
protected $fillable = ['name', 'owner_id', 'status'];
|
|
81
|
+
|
|
82
|
+
protected $casts = ['status' => ProjectStatus::class];
|
|
83
|
+
|
|
84
|
+
public function owner(): BelongsTo
|
|
85
|
+
{
|
|
86
|
+
return $this->belongsTo(User::class);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public function scopeActive(Builder $query): Builder
|
|
90
|
+
{
|
|
91
|
+
return $query->whereNull('archived_at');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
- Prefer one mechanism for default filters (global scope **or** named scope, not redundant both).
|
|
97
|
+
- Custom `Attribute` casts for money/value objects.
|
|
98
|
+
|
|
99
|
+
## Queries
|
|
100
|
+
|
|
101
|
+
```php
|
|
102
|
+
Order::query()
|
|
103
|
+
->with(['customer', 'items.product'])
|
|
104
|
+
->latest('id')
|
|
105
|
+
->paginate(25);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Extract complex filters into query objects returning cloned builders.
|
|
109
|
+
|
|
110
|
+
## Transactions and events
|
|
111
|
+
|
|
112
|
+
```php
|
|
113
|
+
DB::transaction(function () use ($order): void {
|
|
114
|
+
$order->markPaid();
|
|
115
|
+
$order->items()->update(['paid_at' => now()]);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
event(new OrderPaid($order));
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Dispatch slow listeners as queued jobs (`ShouldQueue`); make handlers idempotent (unique job keys).
|
|
122
|
+
|
|
123
|
+
## API resources
|
|
124
|
+
|
|
125
|
+
Wrap collections; include pagination meta (`currentPage`, `perPage`, `total`).
|
|
126
|
+
|
|
127
|
+
## Caching
|
|
128
|
+
|
|
129
|
+
- Remember/cache expensive aggregates with TTL; tag caches when driver supports tags.
|
|
130
|
+
- Flush related keys on `created/updated/deleted` model events.
|
|
131
|
+
|
|
132
|
+
## Migrations
|
|
133
|
+
|
|
134
|
+
Anonymous migration classes; plural `snake_case` tables; foreign IDs `constrained()` with explicit `cascadeOnDelete()` where intended.
|
|
135
|
+
|
|
136
|
+
## Container bindings
|
|
137
|
+
|
|
138
|
+
Register interfaces → implementations in `AppServiceProvider::register()`.
|
|
139
|
+
|
|
140
|
+
## Testing pointers
|
|
141
|
+
|
|
142
|
+
Use **techne:quality** for PHPUnit/Pest strategy; feature tests hit HTTP kernel with `RefreshDatabase` or transactions per project convention.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: python
|
|
3
|
+
description: Python idioms, pytest, Django/DRF, and FastAPI patterns for typed, testable backends. Use when writing or reviewing Python services, ORM/API layers, or pytest suites.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# techne:python
|
|
7
|
+
|
|
8
|
+
Covers general Python style, pytest strategy, Django (including DRF), and FastAPI. For cross-stack API design, errors, and hexagonal boundaries see **techne:services**; databases and migrations see **techne:databases**; TDD and browser QA see **techne:quality**.
|
|
9
|
+
|
|
10
|
+
## Non-negotiables
|
|
11
|
+
|
|
12
|
+
1. Type-annotate public functions and data crossing module boundaries; enforce with mypy (or pyright) in CI.
|
|
13
|
+
2. Ship `src/` layout + `pyproject.toml`; pin Python with `requires-python`; run **ruff** (lint + import sort) and **black** (or ruff format) before merge.
|
|
14
|
+
3. Catch specific exceptions only; wrap domain failures in a small hierarchy; always chain with `raise ... from exc`.
|
|
15
|
+
4. Release files, sockets, and DB sessions via `with` / async context managers; roll back failed transactions explicitly.
|
|
16
|
+
5. No mutable defaults (`def f(x, items=None)`); compare singletons with `is`; prefer `isinstance` over `type() ==`.
|
|
17
|
+
6. Unit tests: mock outbound HTTP, email, and payment clients; keep tests independent; name tests by behavior.
|
|
18
|
+
7. Aim ≥80% line coverage; auth, billing, and permission paths require full branch coverage.
|
|
19
|
+
8. Mark `@pytest.mark.integration` / `slow`; default CI runs `pytest -m "not slow"`.
|
|
20
|
+
9. **Django**: split settings (`base` / `dev` / `prod` / `test`); list endpoints must `select_related` / `prefetch_related`; put multi-step rules in services + `@transaction.atomic`.
|
|
21
|
+
10. **FastAPI**: routers stay thin; mutations live in services; use Pydantic v2 response models; async routes need async SQLAlchemy (no blocking ORM in `async def`).
|
|
22
|
+
11. Production Django: `DEBUG=False`, secure cookies, HSTS; prod FastAPI schema changes via Alembic—not ad-hoc `create_all`.
|
|
23
|
+
12. Library/API details: **biblos** MCP; repo structure: **atlas** MCP.
|
|
24
|
+
13. Security-sensitive endpoints: **security-review** skill or **exo-security** agent before merge.
|
|
25
|
+
|
|
26
|
+
## References
|
|
27
|
+
|
|
28
|
+
| File | Load when |
|
|
29
|
+
|------|-----------|
|
|
30
|
+
| [reference/python-core.md](reference/python-core.md) | Typing, errors, concurrency, packaging, tooling |
|
|
31
|
+
| [reference/python-testing.md](reference/python-testing.md) | pytest fixtures, mocks, async tests, coverage |
|
|
32
|
+
| [reference/django.md](reference/django.md) | Models, DRF, caching, signals, ORM performance |
|
|
33
|
+
| [reference/fastapi.md](reference/fastapi.md) | App factory, DI, Pydantic v2, services, httpx tests |
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Django and DRF
|
|
2
|
+
|
|
3
|
+
## Project layout
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
config/settings/{base,development,production,test}.py
|
|
7
|
+
apps/<domain>/{models,views,serializers,urls,services,tests}
|
|
8
|
+
manage.py
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
- `base.py`: installed apps, middleware, DB, REST defaults.
|
|
12
|
+
- `production.py`: `DEBUG=False`, TLS cookies, HSTS, structured logging.
|
|
13
|
+
- `test.py`: fast password hasher, in-memory email backend.
|
|
14
|
+
|
|
15
|
+
## Models and queries
|
|
16
|
+
|
|
17
|
+
- Custom `QuerySet` methods chained on managers (`active()`, `with_owner()`).
|
|
18
|
+
- Indexes on filter/sort columns; `CheckConstraint` for invariants SQL can enforce.
|
|
19
|
+
- Slug generation in `save()` only when empty.
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
class InvoiceQuerySet(models.QuerySet):
|
|
23
|
+
def open(self):
|
|
24
|
+
return self.filter(status=Invoice.Status.OPEN)
|
|
25
|
+
|
|
26
|
+
def for_tenant(self, tenant_id: int):
|
|
27
|
+
return self.filter(tenant_id=tenant_id)
|
|
28
|
+
|
|
29
|
+
class Invoice(models.Model):
|
|
30
|
+
objects = InvoiceQuerySet.as_manager()
|
|
31
|
+
tenant = models.ForeignKey("Tenant", on_delete=models.CASCADE)
|
|
32
|
+
total = models.DecimalField(max_digits=12, decimal_places=2)
|
|
33
|
+
|
|
34
|
+
class Meta:
|
|
35
|
+
indexes = [models.Index(fields=["tenant", "-created_at"])]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
List views: `select_related` for FK, `prefetch_related` for M2M/reverse FK.
|
|
39
|
+
|
|
40
|
+
## DRF
|
|
41
|
+
|
|
42
|
+
- Separate serializers for read vs create/update when fields differ.
|
|
43
|
+
- ViewSets: set `queryset` with optimizations; swap serializer in `get_serializer_class`.
|
|
44
|
+
- Custom `@action` for non-CRUD operations; keep bodies thin—call services.
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
class InvoiceViewSet(viewsets.ModelViewSet):
|
|
48
|
+
permission_classes = [IsAuthenticated, IsTenantMember]
|
|
49
|
+
filterset_fields = ["status"]
|
|
50
|
+
ordering = ["-created_at"]
|
|
51
|
+
|
|
52
|
+
def get_queryset(self):
|
|
53
|
+
return (
|
|
54
|
+
Invoice.objects.for_tenant(self.request.user.tenant_id)
|
|
55
|
+
.select_related("tenant")
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
def perform_create(self, serializer):
|
|
59
|
+
serializer.save(created_by=self.request.user)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Service layer
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
from django.db import transaction
|
|
66
|
+
|
|
67
|
+
class BillingService:
|
|
68
|
+
@staticmethod
|
|
69
|
+
@transaction.atomic
|
|
70
|
+
def close_invoice(invoice: Invoice) -> Invoice:
|
|
71
|
+
invoice.status = Invoice.Status.CLOSED
|
|
72
|
+
invoice.save(update_fields=["status", "updated_at"])
|
|
73
|
+
LedgerEntry.objects.create(invoice=invoice, amount=invoice.total)
|
|
74
|
+
return invoice
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Caching
|
|
78
|
+
|
|
79
|
+
- Per-view: `cache_page` for stable public lists.
|
|
80
|
+
- Low-level: cache keys namespaced by tenant; invalidate on model save signals when needed.
|
|
81
|
+
- Do not cache unbounded querysets—store IDs or paginated slices.
|
|
82
|
+
|
|
83
|
+
## Signals
|
|
84
|
+
|
|
85
|
+
- Keep receivers idempotent; defer heavy work to Celery/RQ.
|
|
86
|
+
- Import signals in `AppConfig.ready()`.
|
|
87
|
+
|
|
88
|
+
## Middleware
|
|
89
|
+
|
|
90
|
+
- Request timing + structured log line (method, path, status, ms).
|
|
91
|
+
- Avoid ORM writes on every request unless required—prefer async tasks.
|
|
92
|
+
|
|
93
|
+
## Performance checklist
|
|
94
|
+
|
|
95
|
+
| Symptom | Fix |
|
|
96
|
+
|---------|-----|
|
|
97
|
+
| N+1 in templates/serializers | prefetch/select |
|
|
98
|
+
| Slow counts | annotate + index, or cached counter |
|
|
99
|
+
| Bulk imports | `bulk_create` / `bulk_update` in batches |
|
|
100
|
+
|
|
101
|
+
## Security notes
|
|
102
|
+
|
|
103
|
+
- CSRF on session-auth forms; token auth for SPA APIs as configured.
|
|
104
|
+
- Never expose raw tracebacks in API responses in production.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# FastAPI
|
|
2
|
+
|
|
3
|
+
## Layout
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
app/
|
|
7
|
+
main.py # create_app(), lifespan
|
|
8
|
+
config.py # pydantic-settings
|
|
9
|
+
dependencies.py
|
|
10
|
+
database.py
|
|
11
|
+
routers/
|
|
12
|
+
models/ # SQLAlchemy
|
|
13
|
+
schemas/ # Pydantic v2
|
|
14
|
+
services/
|
|
15
|
+
tests/conftest.py
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## App factory and settings
|
|
19
|
+
|
|
20
|
+
```python
|
|
21
|
+
from contextlib import asynccontextmanager
|
|
22
|
+
from fastapi import FastAPI
|
|
23
|
+
|
|
24
|
+
@asynccontextmanager
|
|
25
|
+
async def lifespan(app: FastAPI):
|
|
26
|
+
yield
|
|
27
|
+
await engine.dispose()
|
|
28
|
+
|
|
29
|
+
def create_app() -> FastAPI:
|
|
30
|
+
app = FastAPI(title=settings.app_name, lifespan=lifespan)
|
|
31
|
+
app.include_router(invoices.router, prefix="/invoices", tags=["invoices"])
|
|
32
|
+
return app
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`Settings` via `pydantic_settings.BaseSettings`; load `.env` in dev only—inject secrets from environment in prod.
|
|
36
|
+
|
|
37
|
+
## Schemas (Pydantic v2)
|
|
38
|
+
|
|
39
|
+
- `model_config = ConfigDict(from_attributes=True)` on ORM response models.
|
|
40
|
+
- Cross-field rules: `@model_validator(mode="after")`.
|
|
41
|
+
- Separate `Create`, `Update` (`exclude_unset` on patch), and `Read` models.
|
|
42
|
+
|
|
43
|
+
## Dependencies
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
from typing import Annotated
|
|
47
|
+
|
|
48
|
+
DbSession = Annotated[AsyncSession, Depends(get_session)]
|
|
49
|
+
|
|
50
|
+
async def current_user(
|
|
51
|
+
token: Annotated[str, Depends(oauth2_scheme)],
|
|
52
|
+
db: DbSession,
|
|
53
|
+
) -> User:
|
|
54
|
+
...
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Type aliases (`DbSession`, `ActiveUser`) reduce router noise.
|
|
58
|
+
|
|
59
|
+
## Routers
|
|
60
|
+
|
|
61
|
+
- Always set `response_model` and explicit status codes.
|
|
62
|
+
- Map domain errors to `HTTPException` or registered handlers—401 vs 403 must differ.
|
|
63
|
+
- Pagination: `Query(ge=0)` / `le=100`; **stable `order_by` column** on every offset query.
|
|
64
|
+
|
|
65
|
+
## Services and transactions
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
class InvoiceService:
|
|
69
|
+
def __init__(self, db: AsyncSession):
|
|
70
|
+
self.db = db
|
|
71
|
+
|
|
72
|
+
async def create(self, payload: InvoiceCreate) -> Invoice:
|
|
73
|
+
row = Invoice(**payload.model_dump())
|
|
74
|
+
self.db.add(row)
|
|
75
|
+
try:
|
|
76
|
+
await self.db.commit()
|
|
77
|
+
except IntegrityError as exc:
|
|
78
|
+
await self.db.rollback()
|
|
79
|
+
raise DuplicateInvoiceError from exc
|
|
80
|
+
await self.db.refresh(row)
|
|
81
|
+
return row
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Unique constraints belong in the database; catch `IntegrityError` instead of check-then-insert races.
|
|
85
|
+
|
|
86
|
+
## Async rules
|
|
87
|
+
|
|
88
|
+
- Use `AsyncSession` + `await session.execute(select(...))`.
|
|
89
|
+
- Blocking libraries → thread pool or swap library.
|
|
90
|
+
|
|
91
|
+
## Testing (httpx)
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
@pytest_asyncio.fixture
|
|
95
|
+
async def client(db_session):
|
|
96
|
+
app = create_app()
|
|
97
|
+
app.dependency_overrides[get_session] = lambda: _override(db_session)
|
|
98
|
+
async with AsyncClient(
|
|
99
|
+
transport=ASGITransport(app=app), base_url="http://test"
|
|
100
|
+
) as ac:
|
|
101
|
+
yield ac
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Override DB and auth dependencies; use in-memory SQLite (`aiosqlite`) or test container per project policy.
|
|
105
|
+
|
|
106
|
+
## Lifespan vs migrations
|
|
107
|
+
|
|
108
|
+
- Dev-only: metadata `create_all` in lifespan is acceptable for demos.
|
|
109
|
+
- Production: Alembic (or equivalent) owns schema; lifespan only opens/closes pools.
|
|
110
|
+
|
|
111
|
+
## Anti-patterns
|
|
112
|
+
|
|
113
|
+
| Bad | Good |
|
|
114
|
+
|-----|------|
|
|
115
|
+
| ORM logic in route | service method |
|
|
116
|
+
| sync `Session` in async route | AsyncSession |
|
|
117
|
+
| returning ORM model directly | response schema |
|
|
118
|
+
| unbounded list endpoints | limit + sort + filters |
|