@heyai-rules/pilo-masterkit 1.2.2 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (594) hide show
  1. package/.agent/agents/architect.md +211 -211
  2. package/.agent/agents/build-error-resolver.md +114 -114
  3. package/.agent/agents/chief-of-staff.md +151 -151
  4. package/.agent/agents/code-reviewer.md +237 -237
  5. package/.agent/agents/cpp-build-resolver.md +90 -90
  6. package/.agent/agents/cpp-reviewer.md +72 -72
  7. package/.agent/agents/csharp-reviewer.md +101 -0
  8. package/.agent/agents/dart-build-resolver.md +201 -0
  9. package/.agent/agents/database-reviewer.md +91 -91
  10. package/.agent/agents/doc-updater.md +107 -107
  11. package/.agent/agents/docs-lookup.md +68 -68
  12. package/.agent/agents/e2e-runner.md +107 -107
  13. package/.agent/agents/flutter-reviewer.md +243 -243
  14. package/.agent/agents/gan-evaluator.md +209 -0
  15. package/.agent/agents/gan-generator.md +131 -0
  16. package/.agent/agents/gan-planner.md +99 -0
  17. package/.agent/agents/go-build-resolver.md +94 -94
  18. package/.agent/agents/go-reviewer.md +76 -76
  19. package/.agent/agents/harness-optimizer.md +35 -35
  20. package/.agent/agents/healthcare-reviewer.md +83 -0
  21. package/.agent/agents/java-build-resolver.md +153 -153
  22. package/.agent/agents/java-reviewer.md +92 -92
  23. package/.agent/agents/kotlin-build-resolver.md +118 -118
  24. package/.agent/agents/kotlin-reviewer.md +159 -159
  25. package/.agent/agents/loop-operator.md +36 -36
  26. package/.agent/agents/opensource-forker.md +198 -0
  27. package/.agent/agents/opensource-packager.md +249 -0
  28. package/.agent/agents/opensource-sanitizer.md +188 -0
  29. package/.agent/agents/performance-optimizer.md +392 -133
  30. package/.agent/agents/personas/athena-agent/agent.json +10 -0
  31. package/.agent/agents/personas/athena-agent/athena-backend-logic-architecture-profile.md +189 -0
  32. package/.agent/agents/personas/athena-agent/context-files/agents.md +55 -0
  33. package/.agent/agents/personas/athena-agent/context-files/identity.md +23 -0
  34. package/.agent/agents/personas/athena-agent/context-files/soul.md +51 -0
  35. package/.agent/agents/personas/athena-agent/context-files/user-predefined.md +15 -0
  36. package/.agent/agents/personas/athena-agent/user-context-files/system/bootstrap.md +37 -0
  37. package/.agent/agents/personas/athena-agent/user-context-files/system/user.md +45 -0
  38. package/.agent/agents/personas/da-vinci-agent/agent.json +10 -0
  39. package/.agent/agents/personas/da-vinci-agent/context-files/agents.md +55 -0
  40. package/.agent/agents/personas/da-vinci-agent/context-files/identity.md +23 -0
  41. package/.agent/agents/personas/da-vinci-agent/context-files/soul.md +51 -0
  42. package/.agent/agents/personas/da-vinci-agent/context-files/user-predefined.md +15 -0
  43. package/.agent/agents/personas/da-vinci-agent/da-vinci-frontend-ui-ux-design-profile.md +189 -0
  44. package/.agent/agents/personas/da-vinci-agent/user-context-files/system/bootstrap.md +37 -0
  45. package/.agent/agents/personas/da-vinci-agent/user-context-files/system/user.md +45 -0
  46. package/.agent/agents/personas/duong-tang-agent/agent.json +10 -0
  47. package/.agent/agents/personas/duong-tang-agent/context-files/agents.md +55 -0
  48. package/.agent/agents/personas/duong-tang-agent/context-files/identity.md +23 -0
  49. package/.agent/agents/personas/duong-tang-agent/context-files/soul.md +51 -0
  50. package/.agent/agents/personas/duong-tang-agent/context-files/user-predefined.md +15 -0
  51. package/.agent/agents/personas/duong-tang-agent/tang-monk-quality-testing-documentation-profile.md +189 -0
  52. package/.agent/agents/personas/duong-tang-agent/user-context-files/system/bootstrap.md +37 -0
  53. package/.agent/agents/personas/duong-tang-agent/user-context-files/system/user.md +45 -0
  54. package/.agent/agents/personas/gia-cat-luong-agent/agent.json +10 -0
  55. package/.agent/agents/personas/gia-cat-luong-agent/context-files/agents.md +55 -0
  56. package/.agent/agents/personas/gia-cat-luong-agent/context-files/identity.md +23 -0
  57. package/.agent/agents/personas/gia-cat-luong-agent/context-files/soul.md +51 -0
  58. package/.agent/agents/personas/gia-cat-luong-agent/context-files/user-predefined.md +15 -0
  59. package/.agent/agents/personas/gia-cat-luong-agent/kongming-research-strategy-analysis-profile.md +189 -0
  60. package/.agent/agents/personas/gia-cat-luong-agent/user-context-files/system/bootstrap.md +37 -0
  61. package/.agent/agents/personas/gia-cat-luong-agent/user-context-files/system/user.md +45 -0
  62. package/.agent/agents/personas/mihata-agent/agent.json +10 -0
  63. package/.agent/agents/personas/mihata-agent/context-files/agents.md +55 -0
  64. package/.agent/agents/personas/mihata-agent/context-files/identity.md +23 -0
  65. package/.agent/agents/personas/mihata-agent/context-files/soul.md +51 -0
  66. package/.agent/agents/personas/mihata-agent/context-files/user-predefined.md +15 -0
  67. package/.agent/agents/personas/mihata-agent/mihata-multi-agent-orchestration-profile.md +189 -0
  68. package/.agent/agents/personas/mihata-agent/user-context-files/system/bootstrap.md +37 -0
  69. package/.agent/agents/personas/mihata-agent/user-context-files/system/user.md +45 -0
  70. package/.agent/agents/personas/tesla-agent/agent.json +10 -0
  71. package/.agent/agents/personas/tesla-agent/context-files/agents.md +55 -0
  72. package/.agent/agents/personas/tesla-agent/context-files/identity.md +23 -0
  73. package/.agent/agents/personas/tesla-agent/context-files/soul.md +51 -0
  74. package/.agent/agents/personas/tesla-agent/context-files/user-predefined.md +15 -0
  75. package/.agent/agents/personas/tesla-agent/tesla-fullstack-system-optimization-profile.md +189 -0
  76. package/.agent/agents/personas/tesla-agent/user-context-files/system/bootstrap.md +37 -0
  77. package/.agent/agents/personas/tesla-agent/user-context-files/system/user.md +45 -0
  78. package/.agent/agents/personas/tu-ma-y-agent/agent.json +10 -0
  79. package/.agent/agents/personas/tu-ma-y-agent/context-files/agents.md +55 -0
  80. package/.agent/agents/personas/tu-ma-y-agent/context-files/identity.md +23 -0
  81. package/.agent/agents/personas/tu-ma-y-agent/context-files/soul.md +51 -0
  82. package/.agent/agents/personas/tu-ma-y-agent/context-files/user-predefined.md +15 -0
  83. package/.agent/agents/personas/tu-ma-y-agent/simayi-feasibility-risk-control-profile.md +189 -0
  84. package/.agent/agents/personas/tu-ma-y-agent/user-context-files/system/bootstrap.md +37 -0
  85. package/.agent/agents/personas/tu-ma-y-agent/user-context-files/system/user.md +45 -0
  86. package/.agent/agents/personas/venti-agent/agent.json +10 -0
  87. package/.agent/agents/personas/venti-agent/context-files/agents.md +55 -0
  88. package/.agent/agents/personas/venti-agent/context-files/identity.md +23 -0
  89. package/.agent/agents/personas/venti-agent/context-files/soul.md +51 -0
  90. package/.agent/agents/personas/venti-agent/context-files/user-predefined.md +15 -0
  91. package/.agent/agents/personas/venti-agent/user-context-files/system/bootstrap.md +37 -0
  92. package/.agent/agents/personas/venti-agent/user-context-files/system/user.md +45 -0
  93. package/.agent/agents/personas/venti-agent/venti-learning-communication-mentoring-profile.md +189 -0
  94. package/.agent/agents/planner.md +212 -212
  95. package/.agent/agents/python-reviewer.md +98 -98
  96. package/.agent/agents/pytorch-build-resolver.md +120 -120
  97. package/.agent/agents/refactor-cleaner.md +85 -85
  98. package/.agent/agents/rust-build-resolver.md +148 -148
  99. package/.agent/agents/rust-reviewer.md +94 -94
  100. package/.agent/agents/security-reviewer.md +108 -108
  101. package/.agent/agents/tdd-guide.md +91 -91
  102. package/.agent/agents/typescript-reviewer.md +112 -112
  103. package/.agent/contexts/dev.md +20 -0
  104. package/.agent/contexts/research.md +26 -0
  105. package/.agent/contexts/review.md +22 -0
  106. package/.agent/hooks/hooks.json +395 -0
  107. package/.agent/hooks/readme.md +222 -0
  108. package/.agent/mcp-configs/mcp-servers.json +181 -0
  109. package/.agent/rules/common/agents.md +50 -0
  110. package/.agent/rules/common/code-review.md +124 -0
  111. package/.agent/rules/common/coding-style.md +48 -0
  112. package/.agent/rules/common/development-workflow.md +44 -0
  113. package/.agent/rules/common/git-workflow.md +24 -0
  114. package/.agent/rules/common/hooks.md +30 -0
  115. package/.agent/rules/common/patterns.md +31 -0
  116. package/.agent/rules/common/performance.md +55 -0
  117. package/.agent/rules/common/security.md +29 -0
  118. package/.agent/rules/common/testing.md +29 -0
  119. package/.agent/rules/cpp/coding-style.md +44 -0
  120. package/.agent/rules/cpp/hooks.md +39 -0
  121. package/.agent/rules/cpp/patterns.md +51 -0
  122. package/.agent/rules/cpp/security.md +51 -0
  123. package/.agent/rules/cpp/testing.md +44 -0
  124. package/.agent/rules/csharp/coding-style.md +72 -0
  125. package/.agent/rules/csharp/hooks.md +25 -0
  126. package/.agent/rules/csharp/patterns.md +50 -0
  127. package/.agent/rules/csharp/security.md +58 -0
  128. package/.agent/rules/csharp/testing.md +46 -0
  129. package/.agent/rules/dart/coding-style.md +159 -0
  130. package/.agent/rules/dart/hooks.md +66 -0
  131. package/.agent/rules/dart/patterns.md +261 -0
  132. package/.agent/rules/dart/security.md +135 -0
  133. package/.agent/rules/dart/testing.md +215 -0
  134. package/.agent/rules/golang/coding-style.md +32 -0
  135. package/.agent/rules/golang/hooks.md +17 -0
  136. package/.agent/rules/golang/patterns.md +45 -0
  137. package/.agent/rules/golang/security.md +34 -0
  138. package/.agent/rules/golang/testing.md +31 -0
  139. package/.agent/rules/java/coding-style.md +114 -0
  140. package/.agent/rules/java/hooks.md +18 -0
  141. package/.agent/rules/java/patterns.md +146 -0
  142. package/.agent/rules/java/security.md +100 -0
  143. package/.agent/rules/java/testing.md +131 -0
  144. package/.agent/rules/kotlin/coding-style.md +86 -0
  145. package/.agent/rules/kotlin/hooks.md +17 -0
  146. package/.agent/rules/kotlin/patterns.md +146 -0
  147. package/.agent/rules/kotlin/security.md +82 -0
  148. package/.agent/rules/kotlin/testing.md +128 -0
  149. package/.agent/rules/perl/coding-style.md +46 -0
  150. package/.agent/rules/perl/hooks.md +22 -0
  151. package/.agent/rules/perl/patterns.md +76 -0
  152. package/.agent/rules/perl/security.md +69 -0
  153. package/.agent/rules/perl/testing.md +54 -0
  154. package/.agent/rules/php/coding-style.md +40 -0
  155. package/.agent/rules/php/hooks.md +24 -0
  156. package/.agent/rules/php/patterns.md +33 -0
  157. package/.agent/rules/php/security.md +37 -0
  158. package/.agent/rules/php/testing.md +39 -0
  159. package/.agent/rules/python/coding-style.md +42 -0
  160. package/.agent/rules/python/hooks.md +19 -0
  161. package/.agent/rules/python/patterns.md +39 -0
  162. package/.agent/rules/python/security.md +30 -0
  163. package/.agent/rules/python/testing.md +38 -0
  164. package/.agent/rules/readme.md +111 -0
  165. package/.agent/rules/rust/coding-style.md +151 -0
  166. package/.agent/rules/rust/hooks.md +16 -0
  167. package/.agent/rules/rust/patterns.md +168 -0
  168. package/.agent/rules/rust/security.md +141 -0
  169. package/.agent/rules/rust/testing.md +154 -0
  170. package/.agent/rules/swift/coding-style.md +47 -0
  171. package/.agent/rules/swift/hooks.md +20 -0
  172. package/.agent/rules/swift/patterns.md +66 -0
  173. package/.agent/rules/swift/security.md +33 -0
  174. package/.agent/rules/swift/testing.md +45 -0
  175. package/.agent/rules/typescript/coding-style.md +199 -0
  176. package/.agent/rules/typescript/hooks.md +22 -0
  177. package/.agent/rules/typescript/patterns.md +52 -0
  178. package/.agent/rules/typescript/security.md +28 -0
  179. package/.agent/rules/typescript/testing.md +18 -0
  180. package/.agent/rules/web/coding-style.md +96 -0
  181. package/.agent/rules/web/design-quality.md +63 -0
  182. package/.agent/rules/web/hooks.md +120 -0
  183. package/.agent/rules/web/patterns.md +79 -0
  184. package/.agent/rules/web/performance.md +64 -0
  185. package/.agent/rules/web/security.md +57 -0
  186. package/.agent/rules/web/testing.md +55 -0
  187. package/.agent/rules/zh/agents.md +50 -0
  188. package/.agent/rules/zh/code-review.md +124 -0
  189. package/.agent/rules/zh/coding-style.md +48 -0
  190. package/.agent/rules/zh/development-workflow.md +44 -0
  191. package/.agent/rules/zh/git-workflow.md +24 -0
  192. package/.agent/rules/zh/hooks.md +30 -0
  193. package/.agent/rules/zh/patterns.md +31 -0
  194. package/.agent/rules/zh/performance.md +55 -0
  195. package/.agent/rules/zh/readme.md +108 -0
  196. package/.agent/rules/zh/security.md +29 -0
  197. package/.agent/rules/zh/testing.md +29 -0
  198. package/.agent/skills/agent-eval/SKILL.md +145 -0
  199. package/.agent/skills/agent-harness-construction/SKILL.md +73 -0
  200. package/.agent/skills/agent-payment-x402/SKILL.md +178 -0
  201. package/.agent/skills/agentic-engineering/SKILL.md +63 -0
  202. package/.agent/skills/ai-first-engineering/SKILL.md +51 -0
  203. package/.agent/skills/ai-regression-testing/SKILL.md +385 -0
  204. package/.agent/skills/android-clean-architecture/SKILL.md +339 -0
  205. package/.agent/skills/api-design/SKILL.md +523 -0
  206. package/.agent/skills/architecture-decision-records/SKILL.md +179 -0
  207. package/.agent/skills/article-writing/SKILL.md +79 -0
  208. package/.agent/skills/autonomous-agent-harness/SKILL.md +267 -0
  209. package/.agent/skills/autonomous-loops/SKILL.md +610 -0
  210. package/.agent/skills/backend-patterns/SKILL.md +598 -0
  211. package/.agent/skills/benchmark/SKILL.md +93 -0
  212. package/.agent/skills/blueprint/SKILL.md +105 -0
  213. package/.agent/skills/brand-voice/SKILL.md +97 -0
  214. package/.agent/skills/brand-voice/references/voice-profile-schema.md +55 -0
  215. package/.agent/skills/browser-qa/SKILL.md +87 -0
  216. package/.agent/skills/bun-runtime/SKILL.md +84 -0
  217. package/.agent/skills/canary-watch/SKILL.md +99 -0
  218. package/.agent/skills/carrier-relationship-management/SKILL.md +212 -0
  219. package/.agent/skills/ck/SKILL.md +147 -0
  220. package/.agent/skills/ck/commands/forget.mjs +44 -0
  221. package/.agent/skills/ck/commands/info.mjs +24 -0
  222. package/.agent/skills/ck/commands/init.mjs +143 -0
  223. package/.agent/skills/ck/commands/list.mjs +40 -0
  224. package/.agent/skills/ck/commands/migrate.mjs +202 -0
  225. package/.agent/skills/ck/commands/resume.mjs +36 -0
  226. package/.agent/skills/ck/commands/save.mjs +210 -0
  227. package/.agent/skills/ck/commands/shared.mjs +387 -0
  228. package/.agent/skills/ck/hooks/session-start.mjs +224 -0
  229. package/.agent/skills/claude-api/SKILL.md +337 -0
  230. package/.agent/skills/claude-devfleet/SKILL.md +103 -0
  231. package/.agent/skills/click-path-audit/SKILL.md +244 -0
  232. package/.agent/skills/clickhouse-io/SKILL.md +439 -0
  233. package/.agent/skills/codebase-onboarding/SKILL.md +233 -0
  234. package/.agent/skills/coding-standards/SKILL.md +530 -0
  235. package/.agent/skills/compose-multiplatform-patterns/SKILL.md +299 -0
  236. package/.agent/skills/configure-ecc/SKILL.md +367 -0
  237. package/.agent/skills/connections-optimizer/SKILL.md +189 -0
  238. package/.agent/skills/content-engine/SKILL.md +131 -0
  239. package/.agent/skills/content-hash-cache-pattern/SKILL.md +161 -0
  240. package/.agent/skills/context-budget/SKILL.md +135 -0
  241. package/.agent/skills/continuous-agent-loop/SKILL.md +45 -0
  242. package/.agent/skills/continuous-learning/SKILL.md +119 -0
  243. package/.agent/skills/continuous-learning/config.json +18 -0
  244. package/.agent/skills/continuous-learning/evaluate-session.sh +69 -0
  245. package/.agent/skills/continuous-learning-v2/SKILL.md +365 -0
  246. package/.agent/skills/continuous-learning-v2/agents/observer-loop.sh +271 -0
  247. package/.agent/skills/continuous-learning-v2/agents/observer.md +198 -0
  248. package/.agent/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
  249. package/.agent/skills/continuous-learning-v2/agents/start-observer.sh +244 -0
  250. package/.agent/skills/continuous-learning-v2/config.json +8 -0
  251. package/.agent/skills/continuous-learning-v2/hooks/observe.sh +428 -0
  252. package/.agent/skills/continuous-learning-v2/scripts/detect-project.sh +228 -0
  253. package/.agent/skills/continuous-learning-v2/scripts/instinct-cli.py +1426 -0
  254. package/.agent/skills/continuous-learning-v2/scripts/test-parse-instinct.py +984 -0
  255. package/.agent/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
  256. package/.agent/skills/cpp-coding-standards/SKILL.md +723 -0
  257. package/.agent/skills/cpp-testing/SKILL.md +324 -0
  258. package/.agent/skills/crosspost/SKILL.md +111 -0
  259. package/.agent/skills/csharp-testing/SKILL.md +321 -0
  260. package/.agent/skills/customer-billing-ops/SKILL.md +140 -0
  261. package/.agent/skills/customs-trade-compliance/SKILL.md +263 -0
  262. package/.agent/skills/dart-flutter-patterns/SKILL.md +563 -0
  263. package/.agent/skills/data-scraper-agent/SKILL.md +764 -0
  264. package/.agent/skills/database-migrations/SKILL.md +429 -0
  265. package/.agent/skills/deep-research/SKILL.md +155 -0
  266. package/.agent/skills/deployment-patterns/SKILL.md +427 -0
  267. package/.agent/skills/design-system/SKILL.md +82 -0
  268. package/.agent/skills/django-patterns/SKILL.md +734 -0
  269. package/.agent/skills/django-security/SKILL.md +593 -0
  270. package/.agent/skills/django-tdd/SKILL.md +729 -0
  271. package/.agent/skills/django-verification/SKILL.md +469 -0
  272. package/.agent/skills/dmux-workflows/SKILL.md +191 -0
  273. package/.agent/skills/docker-patterns/SKILL.md +364 -0
  274. package/.agent/skills/documentation-lookup/SKILL.md +90 -0
  275. package/.agent/skills/dotnet-patterns/SKILL.md +321 -0
  276. package/.agent/skills/e2e-testing/SKILL.md +326 -0
  277. package/.agent/skills/energy-procurement/SKILL.md +228 -0
  278. package/.agent/skills/enterprise-agent-ops/SKILL.md +50 -0
  279. package/.agent/skills/eval-harness/SKILL.md +270 -0
  280. package/.agent/skills/exa-search/SKILL.md +103 -0
  281. package/.agent/skills/fal-ai-media/SKILL.md +284 -0
  282. package/.agent/skills/flutter-dart-code-review/SKILL.md +435 -0
  283. package/.agent/skills/foundation-models-on-device/SKILL.md +243 -0
  284. package/.agent/skills/frontend-patterns/SKILL.md +642 -0
  285. package/.agent/skills/frontend-slides/SKILL.md +184 -0
  286. package/.agent/skills/frontend-slides/style-presets.md +330 -0
  287. package/.agent/skills/gan-style-harness/SKILL.md +278 -0
  288. package/.agent/skills/git-workflow/SKILL.md +715 -0
  289. package/.agent/skills/golang-patterns/SKILL.md +674 -0
  290. package/.agent/skills/golang-testing/SKILL.md +720 -0
  291. package/.agent/skills/google-workspace-ops/SKILL.md +95 -0
  292. package/.agent/skills/healthcare-cdss-patterns/SKILL.md +245 -0
  293. package/.agent/skills/healthcare-emr-patterns/SKILL.md +159 -0
  294. package/.agent/skills/healthcare-eval-harness/SKILL.md +207 -0
  295. package/.agent/skills/healthcare-phi-compliance/SKILL.md +145 -0
  296. package/.agent/skills/hexagonal-architecture/SKILL.md +276 -0
  297. package/.agent/skills/inventory-demand-planning/SKILL.md +247 -0
  298. package/.agent/skills/investor-materials/SKILL.md +96 -0
  299. package/.agent/skills/investor-outreach/SKILL.md +91 -0
  300. package/.agent/skills/iterative-retrieval/SKILL.md +211 -0
  301. package/.agent/skills/java-coding-standards/SKILL.md +147 -0
  302. package/.agent/skills/jira-integration/SKILL.md +293 -0
  303. package/.agent/skills/jpa-patterns/SKILL.md +151 -0
  304. package/.agent/skills/kotlin-coroutines-flows/SKILL.md +284 -0
  305. package/.agent/skills/kotlin-exposed-patterns/SKILL.md +719 -0
  306. package/.agent/skills/kotlin-ktor-patterns/SKILL.md +689 -0
  307. package/.agent/skills/kotlin-patterns/SKILL.md +711 -0
  308. package/.agent/skills/kotlin-testing/SKILL.md +824 -0
  309. package/.agent/skills/laravel-patterns/SKILL.md +415 -0
  310. package/.agent/skills/laravel-plugin-discovery/SKILL.md +229 -0
  311. package/.agent/skills/laravel-security/SKILL.md +285 -0
  312. package/.agent/skills/laravel-tdd/SKILL.md +283 -0
  313. package/.agent/skills/laravel-verification/SKILL.md +179 -0
  314. package/.agent/skills/lead-intelligence/SKILL.md +321 -0
  315. package/.agent/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
  316. package/.agent/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
  317. package/.agent/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
  318. package/.agent/skills/lead-intelligence/agents/signal-scorer.md +60 -0
  319. package/.agent/skills/liquid-glass-design/SKILL.md +279 -0
  320. package/.agent/skills/logistics-exception-management/SKILL.md +222 -0
  321. package/.agent/skills/manim-video/SKILL.md +89 -0
  322. package/.agent/skills/manim-video/assets/network-graph-scene.py +52 -0
  323. package/.agent/skills/market-research/SKILL.md +75 -0
  324. package/.agent/skills/mcp-builder/SKILL.md +173 -113
  325. package/.agent/skills/mcp-builder/license.txt +202 -0
  326. package/.agent/skills/mcp-builder/reference/evaluation.md +602 -0
  327. package/.agent/skills/mcp-builder/reference/mcp-best-practices.md +249 -0
  328. package/.agent/skills/mcp-builder/reference/node-mcp-server.md +970 -0
  329. package/.agent/skills/mcp-builder/reference/python-mcp-server.md +719 -0
  330. package/.agent/skills/mcp-builder/scripts/connections.py +151 -0
  331. package/.agent/skills/mcp-builder/scripts/evaluation.py +373 -0
  332. package/.agent/skills/mcp-builder/scripts/example-evaluation.xml +22 -0
  333. package/.agent/skills/mcp-builder/scripts/requirements.txt +2 -0
  334. package/.agent/skills/mcp-server-patterns/SKILL.md +67 -0
  335. package/.agent/skills/nanoclaw-repl/SKILL.md +33 -0
  336. package/.agent/skills/nestjs-patterns/SKILL.md +230 -0
  337. package/.agent/skills/nextjs-turbopack/SKILL.md +44 -0
  338. package/.agent/skills/nutrient-document-processing/SKILL.md +167 -0
  339. package/.agent/skills/nuxt4-patterns/SKILL.md +100 -0
  340. package/.agent/skills/openclaw-persona-forge/SKILL.md +296 -0
  341. package/.agent/skills/openclaw-persona-forge/gacha.py +224 -0
  342. package/.agent/skills/openclaw-persona-forge/gacha.sh +5 -0
  343. package/.agent/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
  344. package/.agent/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
  345. package/.agent/skills/openclaw-persona-forge/references/error-handling.md +53 -0
  346. package/.agent/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
  347. package/.agent/skills/openclaw-persona-forge/references/naming-system.md +39 -0
  348. package/.agent/skills/openclaw-persona-forge/references/output-template.md +166 -0
  349. package/.agent/skills/opensource-pipeline/SKILL.md +255 -0
  350. package/.agent/skills/perl-patterns/SKILL.md +504 -0
  351. package/.agent/skills/perl-security/SKILL.md +503 -0
  352. package/.agent/skills/perl-testing/SKILL.md +475 -0
  353. package/.agent/skills/plankton-code-quality/SKILL.md +236 -0
  354. package/.agent/skills/postgres-patterns/SKILL.md +147 -0
  355. package/.agent/skills/product-lens/SKILL.md +85 -0
  356. package/.agent/skills/production-scheduling/SKILL.md +238 -0
  357. package/.agent/skills/project-flow-ops/SKILL.md +111 -0
  358. package/.agent/skills/project-guidelines-example/SKILL.md +349 -0
  359. package/.agent/skills/prompt-optimizer/SKILL.md +397 -0
  360. package/.agent/skills/python-patterns/SKILL.md +622 -313
  361. package/.agent/skills/python-testing/SKILL.md +816 -0
  362. package/.agent/skills/pytorch-patterns/SKILL.md +396 -0
  363. package/.agent/skills/quality-nonconformance/SKILL.md +260 -0
  364. package/.agent/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
  365. package/.agent/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
  366. package/.agent/skills/remotion-video-creation/SKILL.md +43 -0
  367. package/.agent/skills/remotion-video-creation/rules/3d.md +86 -0
  368. package/.agent/skills/remotion-video-creation/rules/animations.md +29 -0
  369. package/.agent/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
  370. package/.agent/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
  371. package/.agent/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
  372. package/.agent/skills/remotion-video-creation/rules/assets.md +78 -0
  373. package/.agent/skills/remotion-video-creation/rules/audio.md +172 -0
  374. package/.agent/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
  375. package/.agent/skills/remotion-video-creation/rules/can-decode.md +75 -0
  376. package/.agent/skills/remotion-video-creation/rules/charts.md +58 -0
  377. package/.agent/skills/remotion-video-creation/rules/compositions.md +146 -0
  378. package/.agent/skills/remotion-video-creation/rules/display-captions.md +126 -0
  379. package/.agent/skills/remotion-video-creation/rules/extract-frames.md +229 -0
  380. package/.agent/skills/remotion-video-creation/rules/fonts.md +152 -0
  381. package/.agent/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
  382. package/.agent/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
  383. package/.agent/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
  384. package/.agent/skills/remotion-video-creation/rules/gifs.md +138 -0
  385. package/.agent/skills/remotion-video-creation/rules/images.md +130 -0
  386. package/.agent/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
  387. package/.agent/skills/remotion-video-creation/rules/lottie.md +67 -0
  388. package/.agent/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
  389. package/.agent/skills/remotion-video-creation/rules/measuring-text.md +143 -0
  390. package/.agent/skills/remotion-video-creation/rules/sequencing.md +106 -0
  391. package/.agent/skills/remotion-video-creation/rules/tailwind.md +11 -0
  392. package/.agent/skills/remotion-video-creation/rules/text-animations.md +20 -0
  393. package/.agent/skills/remotion-video-creation/rules/timing.md +179 -0
  394. package/.agent/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
  395. package/.agent/skills/remotion-video-creation/rules/transitions.md +122 -0
  396. package/.agent/skills/remotion-video-creation/rules/trimming.md +52 -0
  397. package/.agent/skills/remotion-video-creation/rules/videos.md +171 -0
  398. package/.agent/skills/repo-scan/SKILL.md +78 -0
  399. package/.agent/skills/returns-reverse-logistics/SKILL.md +240 -0
  400. package/.agent/skills/rules-distill/SKILL.md +264 -0
  401. package/.agent/skills/rules-distill/scripts/scan-rules.sh +58 -0
  402. package/.agent/skills/rules-distill/scripts/scan-skills.sh +129 -0
  403. package/.agent/skills/rust-patterns/SKILL.md +499 -0
  404. package/.agent/skills/rust-testing/SKILL.md +500 -0
  405. package/.agent/skills/safety-guard/SKILL.md +75 -0
  406. package/.agent/skills/santa-method/SKILL.md +306 -0
  407. package/.agent/skills/search-first/SKILL.md +161 -0
  408. package/.agent/skills/security-review/SKILL.md +495 -0
  409. package/.agent/skills/security-review/cloud-infrastructure-security.md +361 -0
  410. package/.agent/skills/security-scan/SKILL.md +165 -0
  411. package/.agent/skills/skill-comply/SKILL.md +58 -0
  412. package/.agent/skills/skill-comply/fixtures/compliant-trace.jsonl +5 -0
  413. package/.agent/skills/skill-comply/fixtures/noncompliant-trace.jsonl +3 -0
  414. package/.agent/skills/skill-comply/fixtures/tdd-spec.yaml +44 -0
  415. package/.agent/skills/skill-comply/prompts/classifier.md +24 -0
  416. package/.agent/skills/skill-comply/prompts/scenario-generator.md +62 -0
  417. package/.agent/skills/skill-comply/prompts/spec-generator.md +42 -0
  418. package/.agent/skills/skill-comply/pyproject.toml +15 -0
  419. package/.agent/skills/skill-comply/scripts/classifier.py +85 -0
  420. package/.agent/skills/skill-comply/scripts/grader.py +122 -0
  421. package/.agent/skills/skill-comply/scripts/init.py +0 -0
  422. package/.agent/skills/skill-comply/scripts/parser.py +107 -0
  423. package/.agent/skills/skill-comply/scripts/report.py +170 -0
  424. package/.agent/skills/skill-comply/scripts/run.py +127 -0
  425. package/.agent/skills/skill-comply/scripts/runner.py +161 -0
  426. package/.agent/skills/skill-comply/scripts/scenario-generator.py +70 -0
  427. package/.agent/skills/skill-comply/scripts/spec-generator.py +72 -0
  428. package/.agent/skills/skill-comply/scripts/utils.py +13 -0
  429. package/.agent/skills/skill-comply/tests/test-grader.py +137 -0
  430. package/.agent/skills/skill-comply/tests/test-parser.py +90 -0
  431. package/.agent/skills/skill-creator/SKILL.md +485 -0
  432. package/.agent/skills/skill-creator/agents/analyzer.md +274 -0
  433. package/.agent/skills/skill-creator/agents/comparator.md +202 -0
  434. package/.agent/skills/skill-creator/agents/grader.md +223 -0
  435. package/.agent/skills/skill-creator/assets/eval-review.html +146 -0
  436. package/.agent/skills/skill-creator/eval-viewer/generate-review.py +471 -0
  437. package/.agent/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  438. package/.agent/skills/skill-creator/license.txt +202 -0
  439. package/.agent/skills/skill-creator/references/schemas.md +430 -0
  440. package/.agent/skills/skill-creator/scripts/aggregate-benchmark.py +401 -0
  441. package/.agent/skills/skill-creator/scripts/generate-report.py +326 -0
  442. package/.agent/skills/skill-creator/scripts/improve-description.py +247 -0
  443. package/.agent/skills/skill-creator/scripts/init.py +0 -0
  444. package/.agent/skills/skill-creator/scripts/package-skill.py +136 -0
  445. package/.agent/skills/skill-creator/scripts/quick-validate.py +103 -0
  446. package/.agent/skills/skill-creator/scripts/run-eval.py +310 -0
  447. package/.agent/skills/skill-creator/scripts/run-loop.py +328 -0
  448. package/.agent/skills/skill-creator/scripts/utils.py +47 -0
  449. package/.agent/skills/skill-stocktake/SKILL.md +193 -0
  450. package/.agent/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
  451. package/.agent/skills/skill-stocktake/scripts/save-results.sh +56 -0
  452. package/.agent/skills/skill-stocktake/scripts/scan.sh +170 -0
  453. package/.agent/skills/social-graph-ranker/SKILL.md +154 -0
  454. package/.agent/skills/springboot-patterns/SKILL.md +314 -0
  455. package/.agent/skills/springboot-security/SKILL.md +272 -0
  456. package/.agent/skills/springboot-tdd/SKILL.md +158 -0
  457. package/.agent/skills/springboot-verification/SKILL.md +231 -0
  458. package/.agent/skills/strategic-compact/SKILL.md +131 -0
  459. package/.agent/skills/strategic-compact/suggest-compact.sh +54 -0
  460. package/.agent/skills/swift-actor-persistence/SKILL.md +143 -0
  461. package/.agent/skills/swift-concurrency-6-2/SKILL.md +216 -0
  462. package/.agent/skills/swift-protocol-di-testing/SKILL.md +190 -0
  463. package/.agent/skills/swiftui-patterns/SKILL.md +259 -0
  464. package/.agent/skills/tdd-workflow/SKILL.md +412 -98
  465. package/.agent/skills/team-builder/SKILL.md +168 -0
  466. package/.agent/skills/token-budget-advisor/SKILL.md +133 -0
  467. package/.agent/skills/ui-demo/SKILL.md +465 -0
  468. package/.agent/skills/ui-ux-pro-max/data/charts.csv +26 -26
  469. package/.agent/skills/ui-ux-pro-max/data/colors.csv +97 -97
  470. package/.agent/skills/ui-ux-pro-max/data/landing.csv +28 -28
  471. package/.agent/skills/ui-ux-pro-max/data/products.csv +96 -96
  472. package/.agent/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  473. package/.agent/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  474. package/.agent/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  475. package/.agent/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  476. package/.agent/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  477. package/.agent/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  478. package/.agent/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  479. package/.agent/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  480. package/.agent/skills/ui-ux-pro-max/data/styles.csv +68 -68
  481. package/.agent/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  482. package/.agent/skills/ui-ux-pro-max/scripts/search.py +114 -114
  483. package/.agent/skills/verification-loop/SKILL.md +126 -0
  484. package/.agent/skills/video-editing/SKILL.md +310 -0
  485. package/.agent/skills/videodb/SKILL.md +374 -0
  486. package/.agent/skills/videodb/reference/api-reference.md +550 -0
  487. package/.agent/skills/videodb/reference/capture-reference.md +407 -0
  488. package/.agent/skills/videodb/reference/capture.md +101 -0
  489. package/.agent/skills/videodb/reference/editor.md +443 -0
  490. package/.agent/skills/videodb/reference/generative.md +331 -0
  491. package/.agent/skills/videodb/reference/rtstream-reference.md +564 -0
  492. package/.agent/skills/videodb/reference/rtstream.md +65 -0
  493. package/.agent/skills/videodb/reference/search.md +230 -0
  494. package/.agent/skills/videodb/reference/streaming.md +406 -0
  495. package/.agent/skills/videodb/reference/use-cases.md +118 -0
  496. package/.agent/skills/videodb/scripts/ws-listener.py +282 -0
  497. package/.agent/skills/visa-doc-translate/SKILL.md +117 -0
  498. package/.agent/skills/visa-doc-translate/readme.md +86 -0
  499. package/.agent/skills/workspace-surface-audit/SKILL.md +125 -0
  500. package/.agent/skills/x-api/SKILL.md +230 -0
  501. package/.agent/tasks/two-track-merge-contract.md +29 -0
  502. package/.agent/workflows/aside.md +164 -164
  503. package/.agent/workflows/build-fix.md +62 -62
  504. package/.agent/workflows/checkpoint.md +74 -74
  505. package/.agent/workflows/claw.md +23 -51
  506. package/.agent/workflows/clean-memory.md +34 -0
  507. package/.agent/workflows/code-review.md +289 -40
  508. package/.agent/workflows/context-budget.md +23 -29
  509. package/.agent/workflows/cpp-build.md +173 -173
  510. package/.agent/workflows/cpp-review.md +132 -132
  511. package/.agent/workflows/cpp-test.md +251 -251
  512. package/.agent/workflows/devfleet.md +23 -92
  513. package/.agent/workflows/docs.md +23 -31
  514. package/.agent/workflows/e2e.md +268 -365
  515. package/.agent/workflows/eval.md +23 -120
  516. package/.agent/workflows/evolve.md +178 -178
  517. package/.agent/workflows/flutter-build.md +164 -0
  518. package/.agent/workflows/flutter-review.md +116 -0
  519. package/.agent/workflows/flutter-test.md +144 -0
  520. package/.agent/workflows/gan-build.md +99 -0
  521. package/.agent/workflows/gan-design.md +35 -0
  522. package/.agent/workflows/go-build.md +183 -183
  523. package/.agent/workflows/go-review.md +148 -148
  524. package/.agent/workflows/go-test.md +268 -268
  525. package/.agent/workflows/gradle-build.md +70 -70
  526. package/.agent/workflows/harness-audit.md +73 -71
  527. package/.agent/workflows/instinct-export.md +66 -66
  528. package/.agent/workflows/instinct-import.md +114 -114
  529. package/.agent/workflows/instinct-status.md +59 -59
  530. package/.agent/workflows/jira.md +106 -0
  531. package/.agent/workflows/kotlin-build.md +174 -174
  532. package/.agent/workflows/kotlin-review.md +140 -140
  533. package/.agent/workflows/kotlin-test.md +312 -312
  534. package/.agent/workflows/learn-eval.md +116 -116
  535. package/.agent/workflows/learn.md +70 -70
  536. package/.agent/workflows/loop-start.md +32 -32
  537. package/.agent/workflows/loop-status.md +24 -24
  538. package/.agent/workflows/model-route.md +26 -26
  539. package/.agent/workflows/multi-backend.md +158 -158
  540. package/.agent/workflows/multi-execute.md +315 -315
  541. package/.agent/workflows/multi-frontend.md +158 -158
  542. package/.agent/workflows/multi-plan.md +268 -268
  543. package/.agent/workflows/multi-workflow.md +191 -191
  544. package/.agent/workflows/orchestrate.md +135 -231
  545. package/.agent/workflows/plan.md +117 -115
  546. package/.agent/workflows/pm2.md +272 -272
  547. package/.agent/workflows/projects.md +39 -39
  548. package/.agent/workflows/promote.md +41 -41
  549. package/.agent/workflows/prompt-optimize.md +23 -38
  550. package/.agent/workflows/prp-commit.md +112 -0
  551. package/.agent/workflows/prp-implement.md +385 -0
  552. package/.agent/workflows/prp-plan.md +502 -0
  553. package/.agent/workflows/prp-pr.md +184 -0
  554. package/.agent/workflows/prp-prd.md +447 -0
  555. package/.agent/workflows/prune.md +31 -31
  556. package/.agent/workflows/python-review.md +297 -297
  557. package/.agent/workflows/quality-gate.md +29 -29
  558. package/.agent/workflows/refactor-clean.md +80 -80
  559. package/.agent/workflows/resume-session.md +156 -156
  560. package/.agent/workflows/rules-distill.md +20 -11
  561. package/.agent/workflows/rust-build.md +187 -187
  562. package/.agent/workflows/rust-review.md +142 -142
  563. package/.agent/workflows/rust-test.md +308 -308
  564. package/.agent/workflows/santa-loop.md +175 -0
  565. package/.agent/workflows/save-session.md +275 -275
  566. package/.agent/workflows/sessions.md +333 -333
  567. package/.agent/workflows/setup-pm.md +80 -80
  568. package/.agent/workflows/skill-create.md +174 -174
  569. package/.agent/workflows/skill-health.md +54 -54
  570. package/.agent/workflows/tdd.md +231 -328
  571. package/.agent/workflows/test-coverage.md +69 -69
  572. package/.agent/workflows/update-codemaps.md +72 -72
  573. package/.agent/workflows/update-docs.md +84 -84
  574. package/.agent/workflows/verify.md +23 -59
  575. package/LICENSE +176 -176
  576. package/README.md +28 -20
  577. package/RELEASE.md +32 -36
  578. package/package.json +87 -79
  579. package/scripts/release-check.js +55 -55
  580. package/src/bin/cli.js +399 -53
  581. package/src/lib/installer.js +360 -114
  582. package/src/lib/manifests/stacks.js +122 -0
  583. package/src/lib/slash-commands.js +28 -0
  584. package/src/templates/claude/CLAUDE.en.md +42 -0
  585. package/src/templates/claude/CLAUDE.md +42 -0
  586. package/src/templates/claude/CLAUDE.vi.md +42 -0
  587. package/src/templates/codex/AGENTS.en.md +40 -0
  588. package/src/templates/codex/AGENTS.md +40 -0
  589. package/src/templates/codex/AGENTS.vi.md +40 -0
  590. package/src/templates/cursor/pilo-masterkit.mdc +20 -0
  591. package/src/templates/gemini/GEMINI.en.md +56 -0
  592. package/src/templates/gemini/GEMINI.md +56 -0
  593. package/src/templates/gemini/GEMINI.vi.md +56 -0
  594. package/src/templates/github/copilot-instructions.md +16 -0
@@ -1,441 +1,750 @@
1
1
  ---
2
2
  name: python-patterns
3
- description: Python development principles and decision-making. Framework selection, async patterns, type hints, project structure. Teaches thinking, not copying.
4
- allowed-tools: Read, Write, Edit, Glob, Grep
3
+ description: Pythonic idioms, PEP 8 standards, type hints, and best practices for building robust, efficient, and maintainable Python applications.
4
+ origin: ECC
5
5
  ---
6
6
 
7
- # Python Patterns
7
+ # Python Development Patterns
8
8
 
9
- > Python development principles and decision-making for 2025.
10
- > **Learn to THINK, not memorize patterns.**
9
+ Idiomatic Python patterns and best practices for building robust, efficient, and maintainable applications.
11
10
 
12
- ---
11
+ ## When to Activate
13
12
 
14
- ## ⚠️ How to Use This Skill
13
+ - Writing new Python code
14
+ - Reviewing Python code
15
+ - Refactoring existing Python code
16
+ - Designing Python packages/modules
15
17
 
16
- This skill teaches **decision-making principles**, not fixed code to copy.
18
+ ## Core Principles
17
19
 
18
- - ASK user for framework preference when unclear
19
- - Choose async vs sync based on CONTEXT
20
- - Don't default to same framework every time
20
+ ### 1. Readability Counts
21
21
 
22
- ---
22
+ Python prioritizes readability. Code should be obvious and easy to understand.
23
23
 
24
- ## 1. Framework Selection (2025)
25
-
26
- ### Decision Tree
27
-
28
- ```
29
- What are you building?
30
-
31
- ├── API-first / Microservices
32
- │ └── FastAPI (async, modern, fast)
33
-
34
- ├── Full-stack web / CMS / Admin
35
- │ └── Django (batteries-included)
36
-
37
- ├── Simple / Script / Learning
38
- │ └── Flask (minimal, flexible)
39
-
40
- ├── AI/ML API serving
41
- │ └── FastAPI (Pydantic, async, uvicorn)
42
-
43
- └── Background workers
44
- └── Celery + any framework
45
- ```
46
-
47
- ### Comparison Principles
48
-
49
- | Factor | FastAPI | Django | Flask |
50
- |--------|---------|--------|-------|
51
- | **Best for** | APIs, microservices | Full-stack, CMS | Simple, learning |
52
- | **Async** | Native | Django 5.0+ | Via extensions |
53
- | **Admin** | Manual | Built-in | Via extensions |
54
- | **ORM** | Choose your own | Django ORM | Choose your own |
55
- | **Learning curve** | Low | Medium | Low |
56
-
57
- ### Selection Questions to Ask:
58
- 1. Is this API-only or full-stack?
59
- 2. Need admin interface?
60
- 3. Team familiar with async?
61
- 4. Existing infrastructure?
24
+ ```python
25
+ # Good: Clear and readable
26
+ def get_active_users(users: list[User]) -> list[User]:
27
+ """Return only active users from the provided list."""
28
+ return [user for user in users if user.is_active]
62
29
 
63
- ---
64
30
 
65
- ## 2. Async vs Sync Decision
31
+ # Bad: Clever but confusing
32
+ def get_active_users(u):
33
+ return [x for x in u if x.a]
34
+ ```
66
35
 
67
- ### When to Use Async
36
+ ### 2. Explicit is Better Than Implicit
68
37
 
69
- ```
70
- async def is better when:
71
- ├── I/O-bound operations (database, HTTP, file)
72
- ├── Many concurrent connections
73
- ├── Real-time features
74
- ├── Microservices communication
75
- └── FastAPI/Starlette/Django ASGI
38
+ Avoid magic; be clear about what your code does.
76
39
 
77
- def (sync) is better when:
78
- ├── CPU-bound operations
79
- ├── Simple scripts
80
- ├── Legacy codebase
81
- ├── Team unfamiliar with async
82
- └── Blocking libraries (no async version)
83
- ```
40
+ ```python
41
+ # Good: Explicit configuration
42
+ import logging
84
43
 
85
- ### The Golden Rule
44
+ logging.basicConfig(
45
+ level=logging.INFO,
46
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
47
+ )
86
48
 
49
+ # Bad: Hidden side effects
50
+ import some_module
51
+ some_module.setup() # What does this do?
87
52
  ```
88
- I/O-bound → async (waiting for external)
89
- CPU-bound → sync + multiprocessing (computing)
90
53
 
91
- Don't:
92
- ├── Mix sync and async carelessly
93
- ├── Use sync libraries in async code
94
- └── Force async for CPU work
95
- ```
54
+ ### 3. EAFP - Easier to Ask Forgiveness Than Permission
96
55
 
97
- ### Async Library Selection
56
+ Python prefers exception handling over checking conditions.
98
57
 
99
- | Need | Async Library |
100
- |------|---------------|
101
- | HTTP client | httpx |
102
- | PostgreSQL | asyncpg |
103
- | Redis | aioredis / redis-py async |
104
- | File I/O | aiofiles |
105
- | Database ORM | SQLAlchemy 2.0 async, Tortoise |
58
+ ```python
59
+ # Good: EAFP style
60
+ def get_value(dictionary: dict, key: str) -> Any:
61
+ try:
62
+ return dictionary[key]
63
+ except KeyError:
64
+ return default_value
106
65
 
107
- ---
66
+ # Bad: LBYL (Look Before You Leap) style
67
+ def get_value(dictionary: dict, key: str) -> Any:
68
+ if key in dictionary:
69
+ return dictionary[key]
70
+ else:
71
+ return default_value
72
+ ```
108
73
 
109
- ## 3. Type Hints Strategy
74
+ ## Type Hints
110
75
 
111
- ### When to Type
76
+ ### Basic Type Annotations
112
77
 
78
+ ```python
79
+ from typing import Optional, List, Dict, Any
80
+
81
+ def process_user(
82
+ user_id: str,
83
+ data: Dict[str, Any],
84
+ active: bool = True
85
+ ) -> Optional[User]:
86
+ """Process a user and return the updated User or None."""
87
+ if not active:
88
+ return None
89
+ return User(user_id, data)
113
90
  ```
114
- Always type:
115
- ├── Function parameters
116
- ├── Return types
117
- ├── Class attributes
118
- ├── Public APIs
119
91
 
120
- Can skip:
121
- ├── Local variables (let inference work)
122
- ├── One-off scripts
123
- ├── Tests (usually)
92
+ ### Modern Type Hints (Python 3.9+)
93
+
94
+ ```python
95
+ # Python 3.9+ - Use built-in types
96
+ def process_items(items: list[str]) -> dict[str, int]:
97
+ return {item: len(item) for item in items}
98
+
99
+ # Python 3.8 and earlier - Use typing module
100
+ from typing import List, Dict
101
+
102
+ def process_items(items: List[str]) -> Dict[str, int]:
103
+ return {item: len(item) for item in items}
124
104
  ```
125
105
 
126
- ### Common Type Patterns
106
+ ### Type Aliases and TypeVar
127
107
 
128
108
  ```python
129
- # These are patterns, understand them:
109
+ from typing import TypeVar, Union
130
110
 
131
- # Optional might be None
132
- from typing import Optional
133
- def find_user(id: int) -> Optional[User]: ...
111
+ # Type alias for complex types
112
+ JSON = Union[dict[str, Any], list[Any], str, int, float, bool, None]
134
113
 
135
- # Union one of multiple types
136
- def process(data: str | dict) -> None: ...
114
+ def parse_json(data: str) -> JSON:
115
+ return json.loads(data)
137
116
 
138
- # Generic collections
139
- def get_items() -> list[Item]: ...
140
- def get_mapping() -> dict[str, int]: ...
117
+ # Generic types
118
+ T = TypeVar('T')
141
119
 
142
- # Callable
143
- from typing import Callable
144
- def apply(fn: Callable[[int], str]) -> str: ...
120
+ def first(items: list[T]) -> T | None:
121
+ """Return the first item or None if list is empty."""
122
+ return items[0] if items else None
145
123
  ```
146
124
 
147
- ### Pydantic for Validation
125
+ ### Protocol-Based Duck Typing
148
126
 
149
- ```
150
- When to use Pydantic:
151
- ├── API request/response models
152
- ├── Configuration/settings
153
- ├── Data validation
154
- ├── Serialization
127
+ ```python
128
+ from typing import Protocol
155
129
 
156
- Benefits:
157
- ├── Runtime validation
158
- ├── Auto-generated JSON schema
159
- ├── Works with FastAPI natively
160
- └── Clear error messages
130
+ class Renderable(Protocol):
131
+ def render(self) -> str:
132
+ """Render the object to a string."""
133
+
134
+ def render_all(items: list[Renderable]) -> str:
135
+ """Render all items that implement the Renderable protocol."""
136
+ return "\n".join(item.render() for item in items)
161
137
  ```
162
138
 
163
- ---
139
+ ## Error Handling Patterns
164
140
 
165
- ## 4. Project Structure Principles
141
+ ### Specific Exception Handling
166
142
 
167
- ### Structure Selection
143
+ ```python
144
+ # Good: Catch specific exceptions
145
+ def load_config(path: str) -> Config:
146
+ try:
147
+ with open(path) as f:
148
+ return Config.from_json(f.read())
149
+ except FileNotFoundError as e:
150
+ raise ConfigError(f"Config file not found: {path}") from e
151
+ except json.JSONDecodeError as e:
152
+ raise ConfigError(f"Invalid JSON in config: {path}") from e
153
+
154
+ # Bad: Bare except
155
+ def load_config(path: str) -> Config:
156
+ try:
157
+ with open(path) as f:
158
+ return Config.from_json(f.read())
159
+ except:
160
+ return None # Silent failure!
161
+ ```
162
+
163
+ ### Exception Chaining
168
164
 
165
+ ```python
166
+ def process_data(data: str) -> Result:
167
+ try:
168
+ parsed = json.loads(data)
169
+ except json.JSONDecodeError as e:
170
+ # Chain exceptions to preserve the traceback
171
+ raise ValueError(f"Failed to parse data: {data}") from e
169
172
  ```
170
- Small project / Script:
171
- ├── main.py
172
- ├── utils.py
173
- └── requirements.txt
174
173
 
175
- Medium API:
176
- ├── app/
177
- │ ├── __init__.py
178
- │ ├── main.py
179
- │ ├── models/
180
- │ ├── routes/
181
- │ ├── services/
182
- │ └── schemas/
183
- ├── tests/
184
- └── pyproject.toml
174
+ ### Custom Exception Hierarchy
185
175
 
186
- Large application:
187
- ├── src/
188
- │ └── myapp/
189
- │ ├── core/
190
- │ ├── api/
191
- │ ├── services/
192
- │ ├── models/
193
- │ └── ...
194
- ├── tests/
195
- └── pyproject.toml
176
+ ```python
177
+ class AppError(Exception):
178
+ """Base exception for all application errors."""
179
+ pass
180
+
181
+ class ValidationError(AppError):
182
+ """Raised when input validation fails."""
183
+ pass
184
+
185
+ class NotFoundError(AppError):
186
+ """Raised when a requested resource is not found."""
187
+ pass
188
+
189
+ # Usage
190
+ def get_user(user_id: str) -> User:
191
+ user = db.find_user(user_id)
192
+ if not user:
193
+ raise NotFoundError(f"User not found: {user_id}")
194
+ return user
196
195
  ```
197
196
 
198
- ### FastAPI Structure Principles
197
+ ## Context Managers
198
+
199
+ ### Resource Management
199
200
 
201
+ ```python
202
+ # Good: Using context managers
203
+ def process_file(path: str) -> str:
204
+ with open(path, 'r') as f:
205
+ return f.read()
206
+
207
+ # Bad: Manual resource management
208
+ def process_file(path: str) -> str:
209
+ f = open(path, 'r')
210
+ try:
211
+ return f.read()
212
+ finally:
213
+ f.close()
200
214
  ```
201
- Organize by feature or layer:
202
215
 
203
- By layer:
204
- ├── routes/ (API endpoints)
205
- ├── services/ (business logic)
206
- ├── models/ (database models)
207
- ├── schemas/ (Pydantic models)
208
- └── dependencies/ (shared deps)
216
+ ### Custom Context Managers
217
+
218
+ ```python
219
+ from contextlib import contextmanager
209
220
 
210
- By feature:
211
- ├── users/
212
- │ ├── routes.py
213
- │ ├── service.py
214
- │ └── schemas.py
215
- └── products/
216
- └── ...
221
+ @contextmanager
222
+ def timer(name: str):
223
+ """Context manager to time a block of code."""
224
+ start = time.perf_counter()
225
+ yield
226
+ elapsed = time.perf_counter() - start
227
+ print(f"{name} took {elapsed:.4f} seconds")
228
+
229
+ # Usage
230
+ with timer("data processing"):
231
+ process_large_dataset()
217
232
  ```
218
233
 
219
- ---
234
+ ### Context Manager Classes
235
+
236
+ ```python
237
+ class DatabaseTransaction:
238
+ def __init__(self, connection):
239
+ self.connection = connection
220
240
 
221
- ## 5. Django Principles (2025)
241
+ def __enter__(self):
242
+ self.connection.begin_transaction()
243
+ return self
222
244
 
223
- ### Django Async (Django 5.0+)
245
+ def __exit__(self, exc_type, exc_val, exc_tb):
246
+ if exc_type is None:
247
+ self.connection.commit()
248
+ else:
249
+ self.connection.rollback()
250
+ return False # Don't suppress exceptions
224
251
 
252
+ # Usage
253
+ with DatabaseTransaction(conn):
254
+ user = conn.create_user(user_data)
255
+ conn.create_profile(user.id, profile_data)
225
256
  ```
226
- Django supports async:
227
- ├── Async views
228
- ├── Async middleware
229
- ├── Async ORM (limited)
230
- └── ASGI deployment
231
257
 
232
- When to use async in Django:
233
- ├── External API calls
234
- ├── WebSocket (Channels)
235
- ├── High-concurrency views
236
- └── Background task triggering
258
+ ## Comprehensions and Generators
259
+
260
+ ### List Comprehensions
261
+
262
+ ```python
263
+ # Good: List comprehension for simple transformations
264
+ names = [user.name for user in users if user.is_active]
265
+
266
+ # Bad: Manual loop
267
+ names = []
268
+ for user in users:
269
+ if user.is_active:
270
+ names.append(user.name)
271
+
272
+ # Complex comprehensions should be expanded
273
+ # Bad: Too complex
274
+ result = [x * 2 for x in items if x > 0 if x % 2 == 0]
275
+
276
+ # Good: Use a generator function
277
+ def filter_and_transform(items: Iterable[int]) -> list[int]:
278
+ result = []
279
+ for x in items:
280
+ if x > 0 and x % 2 == 0:
281
+ result.append(x * 2)
282
+ return result
237
283
  ```
238
284
 
239
- ### Django Best Practices
285
+ ### Generator Expressions
286
+
287
+ ```python
288
+ # Good: Generator for lazy evaluation
289
+ total = sum(x * x for x in range(1_000_000))
240
290
 
291
+ # Bad: Creates large intermediate list
292
+ total = sum([x * x for x in range(1_000_000)])
241
293
  ```
242
- Model design:
243
- ├── Fat models, thin views
244
- ├── Use managers for common queries
245
- ├── Abstract base classes for shared fields
246
294
 
247
- Views:
248
- ├── Class-based for complex CRUD
249
- ├── Function-based for simple endpoints
250
- ├── Use viewsets with DRF
295
+ ### Generator Functions
296
+
297
+ ```python
298
+ def read_large_file(path: str) -> Iterator[str]:
299
+ """Read a large file line by line."""
300
+ with open(path) as f:
301
+ for line in f:
302
+ yield line.strip()
251
303
 
252
- Queries:
253
- ├── select_related() for FKs
254
- ├── prefetch_related() for M2M
255
- ├── Avoid N+1 queries
256
- └── Use .only() for specific fields
304
+ # Usage
305
+ for line in read_large_file("huge.txt"):
306
+ process(line)
257
307
  ```
258
308
 
259
- ---
309
+ ## Data Classes and Named Tuples
260
310
 
261
- ## 6. FastAPI Principles
311
+ ### Data Classes
262
312
 
263
- ### async def vs def in FastAPI
313
+ ```python
314
+ from dataclasses import dataclass, field
315
+ from datetime import datetime
264
316
 
265
- ```
266
- Use async def when:
267
- ├── Using async database drivers
268
- ├── Making async HTTP calls
269
- ├── I/O-bound operations
270
- └── Want to handle concurrency
317
+ @dataclass
318
+ class User:
319
+ """User entity with automatic __init__, __repr__, and __eq__."""
320
+ id: str
321
+ name: str
322
+ email: str
323
+ created_at: datetime = field(default_factory=datetime.now)
324
+ is_active: bool = True
271
325
 
272
- Use def when:
273
- ├── Blocking operations
274
- ├── Sync database drivers
275
- ├── CPU-bound work
276
- └── FastAPI runs in threadpool automatically
326
+ # Usage
327
+ user = User(
328
+ id="123",
329
+ name="Alice",
330
+ email="alice@example.com"
331
+ )
277
332
  ```
278
333
 
279
- ### Dependency Injection
334
+ ### Data Classes with Validation
280
335
 
281
- ```
282
- Use dependencies for:
283
- ├── Database sessions
284
- ├── Current user / Auth
285
- ├── Configuration
286
- ├── Shared resources
336
+ ```python
337
+ @dataclass
338
+ class User:
339
+ email: str
340
+ age: int
287
341
 
288
- Benefits:
289
- ├── Testability (mock dependencies)
290
- ├── Clean separation
291
- ├── Automatic cleanup (yield)
342
+ def __post_init__(self):
343
+ # Validate email format
344
+ if "@" not in self.email:
345
+ raise ValueError(f"Invalid email: {self.email}")
346
+ # Validate age range
347
+ if self.age < 0 or self.age > 150:
348
+ raise ValueError(f"Invalid age: {self.age}")
292
349
  ```
293
350
 
294
- ### Pydantic v2 Integration
351
+ ### Named Tuples
295
352
 
296
353
  ```python
297
- # FastAPI + Pydantic are tightly integrated:
354
+ from typing import NamedTuple
298
355
 
299
- # Request validation
300
- @app.post("/users")
301
- async def create(user: UserCreate) -> UserResponse:
302
- # user is already validated
303
- ...
356
+ class Point(NamedTuple):
357
+ """Immutable 2D point."""
358
+ x: float
359
+ y: float
304
360
 
305
- # Response serialization
306
- # Return type becomes response schema
361
+ def distance(self, other: 'Point') -> float:
362
+ return ((self.x - other.x) ** 2 + (self.y - other.y) ** 2) ** 0.5
363
+
364
+ # Usage
365
+ p1 = Point(0, 0)
366
+ p2 = Point(3, 4)
367
+ print(p1.distance(p2)) # 5.0
307
368
  ```
308
369
 
309
- ---
370
+ ## Decorators
310
371
 
311
- ## 7. Background Tasks
372
+ ### Function Decorators
312
373
 
313
- ### Selection Guide
374
+ ```python
375
+ import functools
376
+ import time
314
377
 
315
- | Solution | Best For |
316
- |----------|----------|
317
- | **BackgroundTasks** | Simple, in-process tasks |
318
- | **Celery** | Distributed, complex workflows |
319
- | **ARQ** | Async, Redis-based |
320
- | **RQ** | Simple Redis queue |
321
- | **Dramatiq** | Actor-based, simpler than Celery |
378
+ def timer(func: Callable) -> Callable:
379
+ """Decorator to time function execution."""
380
+ @functools.wraps(func)
381
+ def wrapper(*args, **kwargs):
382
+ start = time.perf_counter()
383
+ result = func(*args, **kwargs)
384
+ elapsed = time.perf_counter() - start
385
+ print(f"{func.__name__} took {elapsed:.4f}s")
386
+ return result
387
+ return wrapper
322
388
 
323
- ### When to Use Each
389
+ @timer
390
+ def slow_function():
391
+ time.sleep(1)
324
392
 
393
+ # slow_function() prints: slow_function took 1.0012s
325
394
  ```
326
- FastAPI BackgroundTasks:
327
- ├── Quick operations
328
- ├── No persistence needed
329
- ├── Fire-and-forget
330
- └── Same process
331
395
 
332
- Celery/ARQ:
333
- ├── Long-running tasks
334
- ├── Need retry logic
335
- ├── Distributed workers
336
- ├── Persistent queue
337
- └── Complex workflows
396
+ ### Parameterized Decorators
397
+
398
+ ```python
399
+ def repeat(times: int):
400
+ """Decorator to repeat a function multiple times."""
401
+ def decorator(func: Callable) -> Callable:
402
+ @functools.wraps(func)
403
+ def wrapper(*args, **kwargs):
404
+ results = []
405
+ for _ in range(times):
406
+ results.append(func(*args, **kwargs))
407
+ return results
408
+ return wrapper
409
+ return decorator
410
+
411
+ @repeat(times=3)
412
+ def greet(name: str) -> str:
413
+ return f"Hello, {name}!"
414
+
415
+ # greet("Alice") returns ["Hello, Alice!", "Hello, Alice!", "Hello, Alice!"]
338
416
  ```
339
417
 
340
- ---
418
+ ### Class-Based Decorators
419
+
420
+ ```python
421
+ class CountCalls:
422
+ """Decorator that counts how many times a function is called."""
423
+ def __init__(self, func: Callable):
424
+ functools.update_wrapper(self, func)
425
+ self.func = func
426
+ self.count = 0
427
+
428
+ def __call__(self, *args, **kwargs):
429
+ self.count += 1
430
+ print(f"{self.func.__name__} has been called {self.count} times")
431
+ return self.func(*args, **kwargs)
341
432
 
342
- ## 8. Error Handling Principles
433
+ @CountCalls
434
+ def process():
435
+ pass
343
436
 
344
- ### Exception Strategy
437
+ # Each call to process() prints the call count
438
+ ```
439
+
440
+ ## Concurrency Patterns
441
+
442
+ ### Threading for I/O-Bound Tasks
443
+
444
+ ```python
445
+ import concurrent.futures
446
+ import threading
447
+
448
+ def fetch_url(url: str) -> str:
449
+ """Fetch a URL (I/O-bound operation)."""
450
+ import urllib.request
451
+ with urllib.request.urlopen(url) as response:
452
+ return response.read().decode()
453
+
454
+ def fetch_all_urls(urls: list[str]) -> dict[str, str]:
455
+ """Fetch multiple URLs concurrently using threads."""
456
+ with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
457
+ future_to_url = {executor.submit(fetch_url, url): url for url in urls}
458
+ results = {}
459
+ for future in concurrent.futures.as_completed(future_to_url):
460
+ url = future_to_url[future]
461
+ try:
462
+ results[url] = future.result()
463
+ except Exception as e:
464
+ results[url] = f"Error: {e}"
465
+ return results
466
+ ```
467
+
468
+ ### Multiprocessing for CPU-Bound Tasks
469
+
470
+ ```python
471
+ def process_data(data: list[int]) -> int:
472
+ """CPU-intensive computation."""
473
+ return sum(x ** 2 for x in data)
345
474
 
475
+ def process_all(datasets: list[list[int]]) -> list[int]:
476
+ """Process multiple datasets using multiple processes."""
477
+ with concurrent.futures.ProcessPoolExecutor() as executor:
478
+ results = list(executor.map(process_data, datasets))
479
+ return results
346
480
  ```
347
- In FastAPI:
348
- ├── Create custom exception classes
349
- ├── Register exception handlers
350
- ├── Return consistent error format
351
- └── Log without exposing internals
352
481
 
353
- Pattern:
354
- ├── Raise domain exceptions in services
355
- ├── Catch and transform in handlers
356
- └── Client gets clean error response
482
+ ### Async/Await for Concurrent I/O
483
+
484
+ ```python
485
+ import asyncio
486
+
487
+ async def fetch_async(url: str) -> str:
488
+ """Fetch a URL asynchronously."""
489
+ import aiohttp
490
+ async with aiohttp.ClientSession() as session:
491
+ async with session.get(url) as response:
492
+ return await response.text()
493
+
494
+ async def fetch_all(urls: list[str]) -> dict[str, str]:
495
+ """Fetch multiple URLs concurrently."""
496
+ tasks = [fetch_async(url) for url in urls]
497
+ results = await asyncio.gather(*tasks, return_exceptions=True)
498
+ return dict(zip(urls, results))
357
499
  ```
358
500
 
359
- ### Error Response Philosophy
501
+ ## Package Organization
502
+
503
+ ### Standard Project Layout
360
504
 
361
505
  ```
362
- Include:
363
- ├── Error code (programmatic)
364
- ├── Message (human readable)
365
- ├── Details (field-level when applicable)
366
- └── NOT stack traces (security)
506
+ myproject/
507
+ ├── src/
508
+ │ └── mypackage/
509
+ ├── __init__.py
510
+ │ ├── main.py
511
+ │ ├── api/
512
+ │ │ ├── __init__.py
513
+ │ │ └── routes.py
514
+ │ ├── models/
515
+ │ │ ├── __init__.py
516
+ │ │ └── user.py
517
+ │ └── utils/
518
+ │ ├── __init__.py
519
+ │ └── helpers.py
520
+ ├── tests/
521
+ │ ├── __init__.py
522
+ │ ├── conftest.py
523
+ │ ├── test_api.py
524
+ │ └── test_models.py
525
+ ├── pyproject.toml
526
+ ├── README.md
527
+ └── .gitignore
367
528
  ```
368
529
 
369
- ---
530
+ ### Import Conventions
531
+
532
+ ```python
533
+ # Good: Import order - stdlib, third-party, local
534
+ import os
535
+ import sys
536
+ from pathlib import Path
537
+
538
+ import requests
539
+ from fastapi import FastAPI
540
+
541
+ from mypackage.models import User
542
+ from mypackage.utils import format_name
370
543
 
371
- ## 9. Testing Principles
544
+ # Good: Use isort for automatic import sorting
545
+ # pip install isort
546
+ ```
547
+
548
+ ### __init__.py for Package Exports
549
+
550
+ ```python
551
+ # mypackage/__init__.py
552
+ """mypackage - A sample Python package."""
372
553
 
373
- ### Testing Strategy
554
+ __version__ = "1.0.0"
374
555
 
375
- | Type | Purpose | Tools |
376
- |------|---------|-------|
377
- | **Unit** | Business logic | pytest |
378
- | **Integration** | API endpoints | pytest + httpx/TestClient |
379
- | **E2E** | Full workflows | pytest + DB |
556
+ # Export main classes/functions at package level
557
+ from mypackage.models import User, Post
558
+ from mypackage.utils import format_name
380
559
 
381
- ### Async Testing
560
+ __all__ = ["User", "Post", "format_name"]
561
+ ```
562
+
563
+ ## Memory and Performance
564
+
565
+ ### Using __slots__ for Memory Efficiency
382
566
 
383
567
  ```python
384
- # Use pytest-asyncio for async tests
568
+ # Bad: Regular class uses __dict__ (more memory)
569
+ class Point:
570
+ def __init__(self, x: float, y: float):
571
+ self.x = x
572
+ self.y = y
385
573
 
386
- import pytest
387
- from httpx import AsyncClient
574
+ # Good: __slots__ reduces memory usage
575
+ class Point:
576
+ __slots__ = ['x', 'y']
388
577
 
389
- @pytest.mark.asyncio
390
- async def test_endpoint():
391
- async with AsyncClient(app=app, base_url="http://test") as client:
392
- response = await client.get("/users")
393
- assert response.status_code == 200
578
+ def __init__(self, x: float, y: float):
579
+ self.x = x
580
+ self.y = y
394
581
  ```
395
582
 
396
- ### Fixtures Strategy
583
+ ### Generator for Large Data
584
+
585
+ ```python
586
+ # Bad: Returns full list in memory
587
+ def read_lines(path: str) -> list[str]:
588
+ with open(path) as f:
589
+ return [line.strip() for line in f]
590
+
591
+ # Good: Yields lines one at a time
592
+ def read_lines(path: str) -> Iterator[str]:
593
+ with open(path) as f:
594
+ for line in f:
595
+ yield line.strip()
596
+ ```
597
+
598
+ ### Avoid String Concatenation in Loops
599
+
600
+ ```python
601
+ # Bad: O(n²) due to string immutability
602
+ result = ""
603
+ for item in items:
604
+ result += str(item)
605
+
606
+ # Good: O(n) using join
607
+ result = "".join(str(item) for item in items)
397
608
 
609
+ # Good: Using StringIO for building
610
+ from io import StringIO
611
+
612
+ buffer = StringIO()
613
+ for item in items:
614
+ buffer.write(str(item))
615
+ result = buffer.getvalue()
398
616
  ```
399
- Common fixtures:
400
- ├── db_session Database connection
401
- ├── client → Test client
402
- ├── authenticated_user → User with token
403
- └── sample_data → Test data setup
617
+
618
+ ## Python Tooling Integration
619
+
620
+ ### Essential Commands
621
+
622
+ ```bash
623
+ # Code formatting
624
+ black .
625
+ isort .
626
+
627
+ # Linting
628
+ ruff check .
629
+ pylint mypackage/
630
+
631
+ # Type checking
632
+ mypy .
633
+
634
+ # Testing
635
+ pytest --cov=mypackage --cov-report=html
636
+
637
+ # Security scanning
638
+ bandit -r .
639
+
640
+ # Dependency management
641
+ pip-audit
642
+ safety check
404
643
  ```
405
644
 
406
- ---
645
+ ### pyproject.toml Configuration
407
646
 
408
- ## 10. Decision Checklist
647
+ ```toml
648
+ [project]
649
+ name = "mypackage"
650
+ version = "1.0.0"
651
+ requires-python = ">=3.9"
652
+ dependencies = [
653
+ "requests>=2.31.0",
654
+ "pydantic>=2.0.0",
655
+ ]
409
656
 
410
- Before implementing:
657
+ [project.optional-dependencies]
658
+ dev = [
659
+ "pytest>=7.4.0",
660
+ "pytest-cov>=4.1.0",
661
+ "black>=23.0.0",
662
+ "ruff>=0.1.0",
663
+ "mypy>=1.5.0",
664
+ ]
411
665
 
412
- - [ ] **Asked user about framework preference?**
413
- - [ ] **Chosen framework for THIS context?** (not just default)
414
- - [ ] **Decided async vs sync?**
415
- - [ ] **Planned type hint strategy?**
416
- - [ ] **Defined project structure?**
417
- - [ ] **Planned error handling?**
418
- - [ ] **Considered background tasks?**
666
+ [tool.black]
667
+ line-length = 88
668
+ target-version = ['py39']
419
669
 
420
- ---
670
+ [tool.ruff]
671
+ line-length = 88
672
+ select = ["E", "F", "I", "N", "W"]
421
673
 
422
- ## 11. Anti-Patterns to Avoid
674
+ [tool.mypy]
675
+ python_version = "3.9"
676
+ warn_return_any = true
677
+ warn_unused_configs = true
678
+ disallow_untyped_defs = true
423
679
 
424
- ### ❌ DON'T:
425
- - Default to Django for simple APIs (FastAPI may be better)
426
- - Use sync libraries in async code
427
- - Skip type hints for public APIs
428
- - Put business logic in routes/views
429
- - Ignore N+1 queries
430
- - Mix async and sync carelessly
680
+ [tool.pytest.ini_options]
681
+ testpaths = ["tests"]
682
+ addopts = "--cov=mypackage --cov-report=term-missing"
683
+ ```
431
684
 
432
- ### DO:
433
- - Choose framework based on context
434
- - Ask about async requirements
435
- - Use Pydantic for validation
436
- - Separate concerns (routes → services → repos)
437
- - Test critical paths
685
+ ## Quick Reference: Python Idioms
438
686
 
439
- ---
687
+ | Idiom | Description |
688
+ |-------|-------------|
689
+ | EAFP | Easier to Ask Forgiveness than Permission |
690
+ | Context managers | Use `with` for resource management |
691
+ | List comprehensions | For simple transformations |
692
+ | Generators | For lazy evaluation and large datasets |
693
+ | Type hints | Annotate function signatures |
694
+ | Dataclasses | For data containers with auto-generated methods |
695
+ | `__slots__` | For memory optimization |
696
+ | f-strings | For string formatting (Python 3.6+) |
697
+ | `pathlib.Path` | For path operations (Python 3.4+) |
698
+ | `enumerate` | For index-element pairs in loops |
699
+
700
+ ## Anti-Patterns to Avoid
440
701
 
441
- > **Remember**: Python patterns are about decision-making for YOUR specific context. Don't copy code—think about what serves your application best.
702
+ ```python
703
+ # Bad: Mutable default arguments
704
+ def append_to(item, items=[]):
705
+ items.append(item)
706
+ return items
707
+
708
+ # Good: Use None and create new list
709
+ def append_to(item, items=None):
710
+ if items is None:
711
+ items = []
712
+ items.append(item)
713
+ return items
714
+
715
+ # Bad: Checking type with type()
716
+ if type(obj) == list:
717
+ process(obj)
718
+
719
+ # Good: Use isinstance
720
+ if isinstance(obj, list):
721
+ process(obj)
722
+
723
+ # Bad: Comparing to None with ==
724
+ if value == None:
725
+ process()
726
+
727
+ # Good: Use is
728
+ if value is None:
729
+ process()
730
+
731
+ # Bad: from module import *
732
+ from os.path import *
733
+
734
+ # Good: Explicit imports
735
+ from os.path import join, exists
736
+
737
+ # Bad: Bare except
738
+ try:
739
+ risky_operation()
740
+ except:
741
+ pass
742
+
743
+ # Good: Specific exception
744
+ try:
745
+ risky_operation()
746
+ except SpecificError as e:
747
+ logger.error(f"Operation failed: {e}")
748
+ ```
749
+
750
+ __Remember__: Python code should be readable, explicit, and follow the principle of least surprise. When in doubt, prioritize clarity over cleverness.