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.
Files changed (385) hide show
  1. package/README.md +100 -2
  2. package/assets/THIRD-PARTY-NOTICES.md +29 -0
  3. package/assets/adapters/opencode/exonous.js +54 -0
  4. package/assets/agents/exo-backend.md +22 -0
  5. package/assets/agents/exo-cto.md +22 -0
  6. package/assets/agents/exo-data-ai.md +22 -0
  7. package/assets/agents/exo-designer.md +22 -0
  8. package/assets/agents/exo-devops.md +22 -0
  9. package/assets/agents/exo-frontend.md +22 -0
  10. package/assets/agents/exo-infra.md +22 -0
  11. package/assets/agents/exo-mobile.md +22 -0
  12. package/assets/agents/exo-pm.md +22 -0
  13. package/assets/agents/exo-qa.md +22 -0
  14. package/assets/agents/exo-researcher.md +22 -0
  15. package/assets/agents/exo-security.md +22 -0
  16. package/assets/agents/roster.json +209 -0
  17. package/assets/agents/taxis.js +189 -0
  18. package/assets/editors/cursor/frontend-skills.mdc +27 -0
  19. package/assets/editors/hooks/cursor/hooks.json +11 -0
  20. package/assets/machine/PR-TEMPLATE.md +21 -0
  21. package/assets/machine/hooks/anamnesis.cjs +61 -0
  22. package/assets/machine/hooks/ethos.cjs +48 -0
  23. package/assets/machine/hooks/kairos.cjs +46 -0
  24. package/assets/machine/hooks/lib/cli-options.cjs +133 -0
  25. package/assets/machine/hooks/lib/memory.cjs +488 -0
  26. package/assets/machine/hooks/lib/metron.cjs +52 -0
  27. package/assets/machine/hooks/lib/paths.cjs +99 -0
  28. package/assets/machine/hooks/lib/payload.cjs +81 -0
  29. package/assets/machine/hooks/lib/pr-template-validate.cjs +103 -0
  30. package/assets/machine/hooks/lib/release.cjs +58 -0
  31. package/assets/machine/hooks/lib/repo.cjs +138 -0
  32. package/assets/machine/hooks/lib/sanitize.cjs +37 -0
  33. package/assets/machine/hooks/lib/selfupdate.cjs +354 -0
  34. package/assets/machine/hooks/lib/shell.cjs +722 -0
  35. package/assets/machine/hooks/lib/template.cjs +70 -0
  36. package/assets/machine/hooks/lib/token.cjs +110 -0
  37. package/assets/machine/hooks/lib/validate-pr-body.cjs +21 -0
  38. package/assets/machine/hooks/pyle.cjs +302 -0
  39. package/assets/rules/nomos.md +59 -0
  40. package/assets/rules/praxis.md +38 -0
  41. package/assets/skills/code-review/SKILL.md +124 -0
  42. package/assets/skills/commit-changes/SKILL.md +49 -0
  43. package/assets/skills/deliver/SKILL.md +114 -0
  44. package/assets/skills/deliver/references/parallel.md +37 -0
  45. package/assets/skills/doc/SKILL.md +140 -0
  46. package/assets/skills/doc/doc.mjs +277 -0
  47. package/assets/skills/issue-board/SKILL.md +84 -0
  48. package/assets/skills/issue-board/board.mjs +389 -0
  49. package/assets/skills/issue-board/config.example.json +9 -0
  50. package/assets/skills/issue-board/render.py +189 -0
  51. package/assets/skills/make-pr/SKILL.md +24 -0
  52. package/assets/skills/native-ui/SKILL.md +67 -0
  53. package/assets/skills/native-ui/reference/apple.md +180 -0
  54. package/assets/skills/native-ui/reference/mobile-feel.md +221 -0
  55. package/assets/skills/native-ui/reference/swift.md +289 -0
  56. package/assets/skills/project-memory/SKILL.md +59 -0
  57. package/assets/skills/project-memory/config.example.json +4 -0
  58. package/assets/skills/project-memory/project-memory.mjs +478 -0
  59. package/assets/skills/security-review/SKILL.md +102 -0
  60. package/assets/skills/session-handoff/SKILL.md +23 -0
  61. package/assets/skills/session-handoff/config.example.json +3 -0
  62. package/assets/skills/ui-design/SKILL.md +75 -0
  63. package/assets/skills/ui-design/reference/adapt.md +151 -0
  64. package/assets/skills/ui-design/reference/adapt.native.md +35 -0
  65. package/assets/skills/ui-design/reference/android.md +50 -0
  66. package/assets/skills/ui-design/reference/animate.md +87 -0
  67. package/assets/skills/ui-design/reference/audit.md +76 -0
  68. package/assets/skills/ui-design/reference/audit.native.md +126 -0
  69. package/assets/skills/ui-design/reference/bolder.md +33 -0
  70. package/assets/skills/ui-design/reference/clarify.md +84 -0
  71. package/assets/skills/ui-design/reference/colorize.md +86 -0
  72. package/assets/skills/ui-design/reference/craft-floor.md +25 -0
  73. package/assets/skills/ui-design/reference/critique.md +345 -0
  74. package/assets/skills/ui-design/reference/degraded/asset-producer.md +35 -0
  75. package/assets/skills/ui-design/reference/degraded/documenter.md +23 -0
  76. package/assets/skills/ui-design/reference/degraded/finish-reviewer.md +43 -0
  77. package/assets/skills/ui-design/reference/degraded/manual-edit-applier.md +56 -0
  78. package/assets/skills/ui-design/reference/delight.md +63 -0
  79. package/assets/skills/ui-design/reference/distill.md +98 -0
  80. package/assets/skills/ui-design/reference/doctor.md +49 -0
  81. package/assets/skills/ui-design/reference/document.md +273 -0
  82. package/assets/skills/ui-design/reference/extract.md +52 -0
  83. package/assets/skills/ui-design/reference/harden.md +122 -0
  84. package/assets/skills/ui-design/reference/hooks.md +114 -0
  85. package/assets/skills/ui-design/reference/init.md +47 -0
  86. package/assets/skills/ui-design/reference/ios.md +55 -0
  87. package/assets/skills/ui-design/reference/layout.md +81 -0
  88. package/assets/skills/ui-design/reference/live-setup.md +75 -0
  89. package/assets/skills/ui-design/reference/live.md +326 -0
  90. package/assets/skills/ui-design/reference/new-work.md +350 -0
  91. package/assets/skills/ui-design/reference/onboard.md +85 -0
  92. package/assets/skills/ui-design/reference/operate.md +29 -0
  93. package/assets/skills/ui-design/reference/optimize.md +101 -0
  94. package/assets/skills/ui-design/reference/overdrive.md +83 -0
  95. package/assets/skills/ui-design/reference/polish.md +77 -0
  96. package/assets/skills/ui-design/reference/quieter.md +95 -0
  97. package/assets/skills/ui-design/reference/routing.md +37 -0
  98. package/assets/skills/ui-design/reference/shape.md +43 -0
  99. package/assets/skills/ui-design/reference/styles/brutalist.md +45 -0
  100. package/assets/skills/ui-design/reference/styles/design-md.md +70 -0
  101. package/assets/skills/ui-design/reference/styles/direction.md +95 -0
  102. package/assets/skills/ui-design/reference/styles/full-output.md +42 -0
  103. package/assets/skills/ui-design/reference/styles/minimalist.md +64 -0
  104. package/assets/skills/ui-design/reference/styles/premium.md +65 -0
  105. package/assets/skills/ui-design/reference/styles/redesign.md +59 -0
  106. package/assets/skills/ui-design/reference/typeset.md +73 -0
  107. package/assets/skills/ui-design/reference/visualize.md +156 -0
  108. package/assets/skills/ui-design/scripts/ENGINE-LICENSE +191 -0
  109. package/assets/skills/ui-design/scripts/VERSION +1 -0
  110. package/assets/skills/ui-design/scripts/bin/darwin-arm64/impeccable +0 -0
  111. package/assets/skills/ui-design/scripts/command-metadata.json +94 -0
  112. package/assets/skills/ui-design/scripts/data/font-index-failures.json +121 -0
  113. package/assets/skills/ui-design/scripts/data/font-index.json +1 -0
  114. package/assets/skills/ui-design/scripts/impeccable +206 -0
  115. package/assets/skills/ui-design/scripts/impeccable.cmd +214 -0
  116. package/assets/skills/ui-design/scripts/live-browser-dom.js +167 -0
  117. package/assets/skills/ui-design/scripts/live-browser-ignores.js +242 -0
  118. package/assets/skills/ui-design/scripts/live-browser-session.js +144 -0
  119. package/assets/skills/ui-design/scripts/live-browser.js +12990 -0
  120. package/assets/skills/ui-design/scripts/modern-screenshot.umd.js +14 -0
  121. package/assets/skills/ui-design/scripts/ui-design +6 -0
  122. package/assets/skills/ui-design/scripts/ui-design.cmd +3 -0
  123. package/assets/skills/ui-design/scripts/ui-design.mjs +124 -0
  124. package/assets/skills/ui-mockup/SKILL.md +68 -0
  125. package/assets/skills/ui-mockup/reference/brandkit.md +101 -0
  126. package/assets/skills/ui-mockup/reference/image-to-code.md +83 -0
  127. package/assets/skills/ui-mockup/reference/mobile-comps.md +94 -0
  128. package/assets/skills/ui-mockup/reference/web-comps.md +83 -0
  129. package/assets/skills/ui-motion/SKILL.md +112 -0
  130. package/assets/skills/ui-motion/reference/expo.md +224 -0
  131. package/assets/skills/ui-motion/reference/opportunities.md +81 -0
  132. package/assets/skills/ui-motion/reference/prototype.md +238 -0
  133. package/assets/skills/ui-motion/reference/review.md +163 -0
  134. package/assets/skills/ui-motion/reference/toasts.md +144 -0
  135. package/assets/skills/ui-motion/reference/ui-libraries.md +71 -0
  136. package/assets/skills/ui-motion/reference/vocabulary.md +130 -0
  137. package/assets/skills/ui-motion/reference/web.md +294 -0
  138. package/assets/skills/ui-patterns/SKILL.md +105 -0
  139. package/assets/skills/ui-patterns/references/stacks/html-tailwind.md +40 -0
  140. package/assets/skills/ui-patterns/references/stacks/nextjs.md +52 -0
  141. package/assets/skills/ui-patterns/references/stacks/nuxt.md +100 -0
  142. package/assets/skills/ui-patterns/references/stacks/react-native.md +48 -0
  143. package/assets/skills/ui-patterns/references/stacks/react.md +49 -0
  144. package/assets/skills/ui-patterns/references/stacks/shadcn.md +57 -0
  145. package/assets/skills/ui-patterns/references/stacks/vue.md +37 -0
  146. package/assets/techne/.claude-plugin/marketplace.json +31 -0
  147. package/assets/techne/.claude-plugin/plugin.json +24 -0
  148. package/assets/techne/.mcp.json +8 -0
  149. package/assets/techne/commands/build-fix.md +48 -0
  150. package/assets/techne/commands/refactor-clean.md +46 -0
  151. package/assets/techne/commands/test-coverage.md +42 -0
  152. package/assets/techne/hooks/hooks.json +49 -0
  153. package/assets/techne/rules/angular/coding-style.md +49 -0
  154. package/assets/techne/rules/angular/hooks.md +23 -0
  155. package/assets/techne/rules/angular/patterns.md +48 -0
  156. package/assets/techne/rules/angular/security.md +26 -0
  157. package/assets/techne/rules/angular/testing.md +46 -0
  158. package/assets/techne/rules/arkts/coding-style.md +63 -0
  159. package/assets/techne/rules/arkts/hooks.md +38 -0
  160. package/assets/techne/rules/arkts/patterns.md +42 -0
  161. package/assets/techne/rules/arkts/security.md +35 -0
  162. package/assets/techne/rules/arkts/testing.md +39 -0
  163. package/assets/techne/rules/common/agents.md +6 -0
  164. package/assets/techne/rules/common/code-review.md +15 -0
  165. package/assets/techne/rules/common/coding-style.md +13 -0
  166. package/assets/techne/rules/common/development-workflow.md +5 -0
  167. package/assets/techne/rules/common/git-workflow.md +30 -0
  168. package/assets/techne/rules/common/hooks.md +7 -0
  169. package/assets/techne/rules/common/patterns.md +3 -0
  170. package/assets/techne/rules/common/performance.md +3 -0
  171. package/assets/techne/rules/common/security.md +5 -0
  172. package/assets/techne/rules/common/testing.md +3 -0
  173. package/assets/techne/rules/cpp/coding-style.md +31 -0
  174. package/assets/techne/rules/cpp/hooks.md +26 -0
  175. package/assets/techne/rules/cpp/patterns.md +31 -0
  176. package/assets/techne/rules/cpp/security.md +37 -0
  177. package/assets/techne/rules/cpp/testing.md +31 -0
  178. package/assets/techne/rules/csharp/coding-style.md +30 -0
  179. package/assets/techne/rules/csharp/hooks.md +24 -0
  180. package/assets/techne/rules/csharp/patterns.md +28 -0
  181. package/assets/techne/rules/csharp/security.md +32 -0
  182. package/assets/techne/rules/csharp/testing.md +27 -0
  183. package/assets/techne/rules/dart/coding-style.md +47 -0
  184. package/assets/techne/rules/dart/hooks.md +26 -0
  185. package/assets/techne/rules/dart/patterns.md +38 -0
  186. package/assets/techne/rules/dart/security.md +44 -0
  187. package/assets/techne/rules/dart/testing.md +39 -0
  188. package/assets/techne/rules/fsharp/coding-style.md +34 -0
  189. package/assets/techne/rules/fsharp/hooks.md +25 -0
  190. package/assets/techne/rules/fsharp/patterns.md +43 -0
  191. package/assets/techne/rules/fsharp/security.md +32 -0
  192. package/assets/techne/rules/fsharp/testing.md +27 -0
  193. package/assets/techne/rules/golang/coding-style.md +30 -0
  194. package/assets/techne/rules/golang/hooks.md +17 -0
  195. package/assets/techne/rules/golang/patterns.md +43 -0
  196. package/assets/techne/rules/golang/security.md +33 -0
  197. package/assets/techne/rules/golang/testing.md +20 -0
  198. package/assets/techne/rules/java/coding-style.md +51 -0
  199. package/assets/techne/rules/java/hooks.md +18 -0
  200. package/assets/techne/rules/java/patterns.md +55 -0
  201. package/assets/techne/rules/java/security.md +33 -0
  202. package/assets/techne/rules/java/testing.md +33 -0
  203. package/assets/techne/rules/kotlin/coding-style.md +50 -0
  204. package/assets/techne/rules/kotlin/hooks.md +17 -0
  205. package/assets/techne/rules/kotlin/patterns.md +44 -0
  206. package/assets/techne/rules/kotlin/security.md +34 -0
  207. package/assets/techne/rules/kotlin/testing.md +38 -0
  208. package/assets/techne/rules/nuxt/coding-style.md +20 -0
  209. package/assets/techne/rules/nuxt/hooks.md +16 -0
  210. package/assets/techne/rules/nuxt/patterns.md +46 -0
  211. package/assets/techne/rules/nuxt/security.md +19 -0
  212. package/assets/techne/rules/nuxt/testing.md +15 -0
  213. package/assets/techne/rules/perl/coding-style.md +33 -0
  214. package/assets/techne/rules/perl/hooks.md +22 -0
  215. package/assets/techne/rules/perl/patterns.md +43 -0
  216. package/assets/techne/rules/perl/security.md +39 -0
  217. package/assets/techne/rules/perl/testing.md +42 -0
  218. package/assets/techne/rules/php/coding-style.md +30 -0
  219. package/assets/techne/rules/php/hooks.md +24 -0
  220. package/assets/techne/rules/php/patterns.md +26 -0
  221. package/assets/techne/rules/php/security.md +27 -0
  222. package/assets/techne/rules/php/testing.md +28 -0
  223. package/assets/techne/rules/python/coding-style.md +38 -0
  224. package/assets/techne/rules/python/fastapi.md +57 -0
  225. package/assets/techne/rules/python/hooks.md +19 -0
  226. package/assets/techne/rules/python/patterns.md +37 -0
  227. package/assets/techne/rules/python/security.md +26 -0
  228. package/assets/techne/rules/python/testing.md +32 -0
  229. package/assets/techne/rules/react/coding-style.md +24 -0
  230. package/assets/techne/rules/react/hooks.md +62 -0
  231. package/assets/techne/rules/react/patterns.md +48 -0
  232. package/assets/techne/rules/react/security.md +45 -0
  233. package/assets/techne/rules/react/testing.md +42 -0
  234. package/assets/techne/rules/react-native/accessibility.md +14 -0
  235. package/assets/techne/rules/react-native/coding-style.md +16 -0
  236. package/assets/techne/rules/react-native/hooks.md +16 -0
  237. package/assets/techne/rules/react-native/patterns.md +18 -0
  238. package/assets/techne/rules/react-native/performance.md +14 -0
  239. package/assets/techne/rules/react-native/production-readiness.md +16 -0
  240. package/assets/techne/rules/react-native/security.md +16 -0
  241. package/assets/techne/rules/react-native/testing.md +14 -0
  242. package/assets/techne/rules/ruby/coding-style.md +40 -0
  243. package/assets/techne/rules/ruby/hooks.md +33 -0
  244. package/assets/techne/rules/ruby/patterns.md +33 -0
  245. package/assets/techne/rules/ruby/security.md +39 -0
  246. package/assets/techne/rules/ruby/testing.md +35 -0
  247. package/assets/techne/rules/rust/coding-style.md +41 -0
  248. package/assets/techne/rules/rust/hooks.md +16 -0
  249. package/assets/techne/rules/rust/patterns.md +42 -0
  250. package/assets/techne/rules/rust/security.md +33 -0
  251. package/assets/techne/rules/rust/testing.md +30 -0
  252. package/assets/techne/rules/swift/coding-style.md +30 -0
  253. package/assets/techne/rules/swift/hooks.md +20 -0
  254. package/assets/techne/rules/swift/patterns.md +30 -0
  255. package/assets/techne/rules/swift/security.md +22 -0
  256. package/assets/techne/rules/swift/testing.md +28 -0
  257. package/assets/techne/rules/typescript/coding-style.md +38 -0
  258. package/assets/techne/rules/typescript/hooks.md +14 -0
  259. package/assets/techne/rules/typescript/patterns.md +12 -0
  260. package/assets/techne/rules/typescript/security.md +14 -0
  261. package/assets/techne/rules/typescript/testing.md +12 -0
  262. package/assets/techne/rules/vue/coding-style.md +19 -0
  263. package/assets/techne/rules/vue/hooks.md +13 -0
  264. package/assets/techne/rules/vue/patterns.md +29 -0
  265. package/assets/techne/rules/vue/security.md +11 -0
  266. package/assets/techne/rules/vue/testing.md +11 -0
  267. package/assets/techne/rules/web/coding-style.md +25 -0
  268. package/assets/techne/rules/web/design-quality.md +21 -0
  269. package/assets/techne/rules/web/hooks.md +39 -0
  270. package/assets/techne/rules/web/patterns.md +23 -0
  271. package/assets/techne/rules/web/performance.md +25 -0
  272. package/assets/techne/rules/web/security.md +23 -0
  273. package/assets/techne/rules/web/testing.md +21 -0
  274. package/assets/techne/scripts/hooks/config-guard.js +50 -0
  275. package/assets/techne/scripts/hooks/edit-tracker.js +26 -0
  276. package/assets/techne/scripts/hooks/lib/shell.js +204 -0
  277. package/assets/techne/scripts/hooks/no-verify-guard.js +205 -0
  278. package/assets/techne/scripts/hooks/run.js +92 -0
  279. package/assets/techne/scripts/hooks/stop-checks.js +136 -0
  280. package/assets/techne/skills/angular/SKILL.md +34 -0
  281. package/assets/techne/skills/angular/reference/components-and-templates.md +63 -0
  282. package/assets/techne/skills/angular/reference/dependency-injection.md +44 -0
  283. package/assets/techne/skills/angular/reference/forms.md +97 -0
  284. package/assets/techne/skills/angular/reference/routing.md +50 -0
  285. package/assets/techne/skills/angular/reference/signals-and-state.md +59 -0
  286. package/assets/techne/skills/angular/reference/styling-motion-a11y.md +54 -0
  287. package/assets/techne/skills/angular/reference/testing.md +52 -0
  288. package/assets/techne/skills/angular/reference/tooling.md +31 -0
  289. package/assets/techne/skills/cpp/SKILL.md +27 -0
  290. package/assets/techne/skills/cpp/reference/coding-standards.md +160 -0
  291. package/assets/techne/skills/databases/SKILL.md +35 -0
  292. package/assets/techne/skills/databases/reference/clickhouse.md +102 -0
  293. package/assets/techne/skills/databases/reference/migrations.md +94 -0
  294. package/assets/techne/skills/databases/reference/mysql.md +101 -0
  295. package/assets/techne/skills/databases/reference/postgres.md +72 -0
  296. package/assets/techne/skills/databases/reference/prisma.md +105 -0
  297. package/assets/techne/skills/databases/reference/redis.md +108 -0
  298. package/assets/techne/skills/delivery/SKILL.md +35 -0
  299. package/assets/techne/skills/delivery/reference/deployment-patterns.md +58 -0
  300. package/assets/techne/skills/delivery/reference/docker-patterns.md +77 -0
  301. package/assets/techne/skills/delivery/reference/git-workflow.md +64 -0
  302. package/assets/techne/skills/delivery/reference/github-ops.md +67 -0
  303. package/assets/techne/skills/delivery/reference/jira-integration.md +53 -0
  304. package/assets/techne/skills/delivery/reference/kubernetes-patterns.md +67 -0
  305. package/assets/techne/skills/dotnet/SKILL.md +27 -0
  306. package/assets/techne/skills/dotnet/reference/dotnet-core.md +131 -0
  307. package/assets/techne/skills/flutter/SKILL.md +29 -0
  308. package/assets/techne/skills/flutter/reference/code-review.md +76 -0
  309. package/assets/techne/skills/flutter/reference/patterns.md +201 -0
  310. package/assets/techne/skills/go/SKILL.md +28 -0
  311. package/assets/techne/skills/go/reference/patterns.md +87 -0
  312. package/assets/techne/skills/go/reference/testing.md +142 -0
  313. package/assets/techne/skills/java/SKILL.md +29 -0
  314. package/assets/techne/skills/java/reference/java-standards.md +117 -0
  315. package/assets/techne/skills/java/reference/springboot.md +108 -0
  316. package/assets/techne/skills/kotlin/SKILL.md +35 -0
  317. package/assets/techne/skills/kotlin/reference/android-clean-architecture.md +115 -0
  318. package/assets/techne/skills/kotlin/reference/compose-multiplatform-patterns.md +113 -0
  319. package/assets/techne/skills/kotlin/reference/kotlin-coroutines-flows.md +93 -0
  320. package/assets/techne/skills/kotlin/reference/kotlin-patterns.md +74 -0
  321. package/assets/techne/skills/kotlin/reference/kotlin-testing.md +115 -0
  322. package/assets/techne/skills/ml/SKILL.md +34 -0
  323. package/assets/techne/skills/ml/reference/ai-regression-testing.md +99 -0
  324. package/assets/techne/skills/ml/reference/cost-aware-llm-pipeline.md +133 -0
  325. package/assets/techne/skills/ml/reference/eval-harness.md +94 -0
  326. package/assets/techne/skills/ml/reference/mle-workflow.md +177 -0
  327. package/assets/techne/skills/ml/reference/prompt-optimizer.md +107 -0
  328. package/assets/techne/skills/ml/reference/pytorch-patterns.md +164 -0
  329. package/assets/techne/skills/php/SKILL.md +27 -0
  330. package/assets/techne/skills/php/reference/laravel.md +142 -0
  331. package/assets/techne/skills/python/SKILL.md +33 -0
  332. package/assets/techne/skills/python/reference/django.md +104 -0
  333. package/assets/techne/skills/python/reference/fastapi.md +118 -0
  334. package/assets/techne/skills/python/reference/python-core.md +88 -0
  335. package/assets/techne/skills/python/reference/python-testing.md +105 -0
  336. package/assets/techne/skills/quality/SKILL.md +34 -0
  337. package/assets/techne/skills/quality/reference/benchmark.md +55 -0
  338. package/assets/techne/skills/quality/reference/browser-qa.md +60 -0
  339. package/assets/techne/skills/quality/reference/coding-standards.md +88 -0
  340. package/assets/techne/skills/quality/reference/e2e-testing.md +99 -0
  341. package/assets/techne/skills/quality/reference/tdd-workflow.md +89 -0
  342. package/assets/techne/skills/quality/reference/verification-loop.md +80 -0
  343. package/assets/techne/skills/react/SKILL.md +30 -0
  344. package/assets/techne/skills/react/reference/nextjs-turbopack.md +42 -0
  345. package/assets/techne/skills/react/reference/react-patterns.md +139 -0
  346. package/assets/techne/skills/react/reference/react-performance.md +101 -0
  347. package/assets/techne/skills/react/reference/react-testing.md +139 -0
  348. package/assets/techne/skills/react-native/SKILL.md +28 -0
  349. package/assets/techne/skills/react-native/reference/expo-patterns.md +196 -0
  350. package/assets/techne/skills/research/SKILL.md +35 -0
  351. package/assets/techne/skills/research/reference/architecture-decision-records.md +65 -0
  352. package/assets/techne/skills/research/reference/codebase-onboarding.md +44 -0
  353. package/assets/techne/skills/research/reference/deep-research.md +50 -0
  354. package/assets/techne/skills/research/reference/iterative-retrieval.md +62 -0
  355. package/assets/techne/skills/research/reference/product-lens.md +38 -0
  356. package/assets/techne/skills/research/reference/search-first.md +50 -0
  357. package/assets/techne/skills/rust/SKILL.md +28 -0
  358. package/assets/techne/skills/rust/reference/patterns.md +108 -0
  359. package/assets/techne/skills/rust/reference/testing.md +142 -0
  360. package/assets/techne/skills/services/SKILL.md +32 -0
  361. package/assets/techne/skills/services/reference/api-contracts.md +139 -0
  362. package/assets/techne/skills/services/reference/backend-layers.md +95 -0
  363. package/assets/techne/skills/services/reference/errors-and-resilience.md +146 -0
  364. package/assets/techne/skills/services/reference/hexagonal-boundaries.md +93 -0
  365. package/assets/techne/skills/services/reference/mcp-servers.md +50 -0
  366. package/assets/techne/skills/services/reference/nestjs.md +96 -0
  367. package/assets/techne/skills/swift/SKILL.md +29 -0
  368. package/assets/techne/skills/swift/reference/concurrency.md +83 -0
  369. package/assets/techne/skills/swift/reference/swiftui.md +139 -0
  370. package/assets/techne/skills/vue/SKILL.md +29 -0
  371. package/assets/techne/skills/vue/reference/nuxt4-patterns.md +90 -0
  372. package/assets/techne/skills/vue/reference/ui-to-vue.md +90 -0
  373. package/assets/techne/skills/vue/reference/vue-patterns.md +151 -0
  374. package/assets/techne/skills/web/SKILL.md +30 -0
  375. package/assets/techne/skills/web/reference/bun-runtime.md +55 -0
  376. package/assets/techne/skills/web/reference/frontend-patterns.md +54 -0
  377. package/assets/techne/skills/web/reference/seo.md +77 -0
  378. package/assets/techne/skills/web/reference/vite-patterns.md +96 -0
  379. package/bin/native.cjs +30 -0
  380. package/native/aarch64-apple-darwin/exonous +0 -0
  381. package/native/aarch64-unknown-linux-gnu/exonous +0 -0
  382. package/native/x86_64-apple-darwin/exonous +0 -0
  383. package/native/x86_64-pc-windows-msvc/exonous.exe +0 -0
  384. package/native/x86_64-unknown-linux-gnu/exonous +0 -0
  385. 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 |