@hivehub/rulebook 5.1.2 → 5.1.3

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 (406) hide show
  1. package/.claude/commands/continue.md +33 -33
  2. package/.claude/commands/ralph-config.md +112 -112
  3. package/.claude/commands/ralph-history.md +110 -110
  4. package/.claude/commands/ralph-init.md +72 -72
  5. package/.claude/commands/ralph-pause-resume.md +105 -105
  6. package/.claude/commands/ralph-run.md +101 -101
  7. package/.claude/commands/ralph-status.md +76 -76
  8. package/.claude/commands/rulebook-decision-create.md +55 -55
  9. package/.claude/commands/rulebook-decision-list.md +15 -15
  10. package/.claude/commands/rulebook-knowledge-add.md +41 -41
  11. package/.claude/commands/rulebook-knowledge-list.md +15 -15
  12. package/.claude/commands/rulebook-learn-capture.md +48 -48
  13. package/.claude/commands/rulebook-learn-list.md +13 -13
  14. package/.claude/commands/rulebook-memory-save.md +48 -48
  15. package/.claude/commands/rulebook-memory-search.md +47 -47
  16. package/.claude/commands/rulebook-task-apply.md +67 -67
  17. package/.claude/commands/rulebook-task-archive.md +94 -94
  18. package/.claude/commands/rulebook-task-create.md +93 -93
  19. package/.claude/commands/rulebook-task-list.md +42 -42
  20. package/.claude/commands/rulebook-task-show.md +52 -52
  21. package/.claude/commands/rulebook-task-validate.md +53 -53
  22. package/.claude-plugin/marketplace.json +28 -28
  23. package/.claude-plugin/plugin.json +8 -8
  24. package/README.md +4 -0
  25. package/dist/cli/commands.d.ts.map +1 -1
  26. package/dist/cli/commands.js +39 -8
  27. package/dist/cli/commands.js.map +1 -1
  28. package/dist/core/agent-template-engine.d.ts.map +1 -1
  29. package/dist/core/agent-template-engine.js +36 -30
  30. package/dist/core/agent-template-engine.js.map +1 -1
  31. package/dist/core/complexity-detector.d.ts.map +1 -1
  32. package/dist/core/complexity-detector.js +109 -29
  33. package/dist/core/complexity-detector.js.map +1 -1
  34. package/dist/core/decision-manager.d.ts.map +1 -1
  35. package/dist/core/decision-manager.js +2 -7
  36. package/dist/core/decision-manager.js.map +1 -1
  37. package/dist/core/generator.d.ts.map +1 -1
  38. package/dist/core/generator.js +28 -28
  39. package/dist/core/generator.js.map +1 -1
  40. package/dist/core/indexer/background-indexer.d.ts +1 -0
  41. package/dist/core/indexer/background-indexer.d.ts.map +1 -1
  42. package/dist/core/indexer/background-indexer.js +107 -19
  43. package/dist/core/indexer/background-indexer.js.map +1 -1
  44. package/dist/core/indexer/indexer-types.d.ts +2 -0
  45. package/dist/core/indexer/indexer-types.d.ts.map +1 -1
  46. package/dist/core/knowledge-manager.d.ts.map +1 -1
  47. package/dist/core/knowledge-manager.js +1 -1
  48. package/dist/core/knowledge-manager.js.map +1 -1
  49. package/dist/core/learn-manager.d.ts.map +1 -1
  50. package/dist/core/learn-manager.js +1 -1
  51. package/dist/core/learn-manager.js.map +1 -1
  52. package/dist/core/rule-engine.d.ts.map +1 -1
  53. package/dist/core/rule-engine.js +1 -3
  54. package/dist/core/rule-engine.js.map +1 -1
  55. package/dist/core/task-manager.d.ts.map +1 -1
  56. package/dist/core/task-manager.js +24 -24
  57. package/dist/core/task-manager.js.map +1 -1
  58. package/dist/index.js +23 -7
  59. package/dist/index.js.map +1 -1
  60. package/dist/mcp/rulebook-server.d.ts.map +1 -1
  61. package/dist/mcp/rulebook-server.js +18 -6
  62. package/dist/mcp/rulebook-server.js.map +1 -1
  63. package/dist/memory/hnsw-index.d.ts.map +1 -1
  64. package/dist/memory/hnsw-index.js +12 -4
  65. package/dist/memory/hnsw-index.js.map +1 -1
  66. package/dist/memory/memory-store.d.ts.map +1 -1
  67. package/dist/memory/memory-store.js +136 -107
  68. package/dist/memory/memory-store.js.map +1 -1
  69. package/dist/types.d.ts +7 -0
  70. package/dist/types.d.ts.map +1 -1
  71. package/package.json +22 -21
  72. package/templates/agents/accessibility-reviewer.md +43 -43
  73. package/templates/agents/api-designer.md +42 -42
  74. package/templates/agents/architect.md +51 -51
  75. package/templates/agents/build-engineer.md +36 -36
  76. package/templates/agents/code-reviewer.md +47 -47
  77. package/templates/agents/compiler/codegen-debugger.md +34 -34
  78. package/templates/agents/compiler/stdlib-engineer.md +28 -28
  79. package/templates/agents/compiler/test-coverage-guardian.md +31 -31
  80. package/templates/agents/context-intelligence.md +52 -52
  81. package/templates/agents/database-architect.md +41 -41
  82. package/templates/agents/devops-engineer.md +42 -42
  83. package/templates/agents/docs-writer.md +38 -38
  84. package/templates/agents/game-engine/cpp-core-expert.md +35 -35
  85. package/templates/agents/game-engine/render-engineer.md +22 -22
  86. package/templates/agents/game-engine/shader-engineer.md +38 -38
  87. package/templates/agents/game-engine/systems-integration.md +43 -43
  88. package/templates/agents/generic/code-reviewer.md +41 -41
  89. package/templates/agents/generic/docs-writer.md +25 -25
  90. package/templates/agents/generic/project-manager.md +36 -36
  91. package/templates/agents/generic/researcher.md +34 -34
  92. package/templates/agents/generic/test-engineer.md +41 -41
  93. package/templates/agents/i18n-engineer.md +42 -42
  94. package/templates/agents/implementer.md +42 -42
  95. package/templates/agents/migration-engineer.md +42 -42
  96. package/templates/agents/mobile/platform-specialist.md +22 -22
  97. package/templates/agents/mobile/ui-engineer.md +22 -22
  98. package/templates/agents/performance-engineer.md +49 -49
  99. package/templates/agents/refactoring-agent.md +41 -41
  100. package/templates/agents/researcher.md +38 -38
  101. package/templates/agents/security-reviewer.md +40 -40
  102. package/templates/agents/team-lead.md +37 -37
  103. package/templates/agents/tester.md +48 -48
  104. package/templates/agents/ux-reviewer.md +43 -43
  105. package/templates/agents/web-app/api-designer.md +22 -22
  106. package/templates/agents/web-app/backend-engineer.md +30 -30
  107. package/templates/agents/web-app/database-engineer.md +22 -22
  108. package/templates/agents/web-app/frontend-engineer.md +29 -29
  109. package/templates/agents/web-app/security-reviewer.md +32 -32
  110. package/templates/ci/rulebook-review.yml +26 -26
  111. package/templates/cli/AIDER.md +49 -49
  112. package/templates/cli/AMAZON_Q.md +25 -25
  113. package/templates/cli/AUGGIE.md +32 -32
  114. package/templates/cli/CLAUDE.md +117 -117
  115. package/templates/cli/CLINE.md +99 -99
  116. package/templates/cli/CODEBUDDY.md +20 -20
  117. package/templates/cli/CODEIUM.md +20 -20
  118. package/templates/cli/CODEX.md +21 -21
  119. package/templates/cli/CONTINUE.md +34 -34
  120. package/templates/cli/CURSOR_CLI.md +62 -62
  121. package/templates/cli/FACTORY.md +18 -18
  122. package/templates/cli/GEMINI.md +35 -35
  123. package/templates/cli/KILOCODE.md +18 -18
  124. package/templates/cli/OPENCODE.md +18 -18
  125. package/templates/cli/_GENERIC_TEMPLATE.md +29 -29
  126. package/templates/commands/rulebook-decision-create.md +55 -55
  127. package/templates/commands/rulebook-decision-list.md +15 -15
  128. package/templates/commands/rulebook-knowledge-add.md +41 -41
  129. package/templates/commands/rulebook-knowledge-list.md +15 -15
  130. package/templates/commands/rulebook-learn-capture.md +48 -48
  131. package/templates/commands/rulebook-learn-list.md +13 -13
  132. package/templates/commands/rulebook-memory-save.md +48 -48
  133. package/templates/commands/rulebook-memory-search.md +47 -47
  134. package/templates/commands/rulebook-task-apply.md +67 -67
  135. package/templates/commands/rulebook-task-archive.md +94 -94
  136. package/templates/commands/rulebook-task-create.md +93 -93
  137. package/templates/commands/rulebook-task-list.md +42 -42
  138. package/templates/commands/rulebook-task-show.md +52 -52
  139. package/templates/commands/rulebook-task-validate.md +53 -53
  140. package/templates/core/AGENTS_LEAN.md +25 -25
  141. package/templates/core/AGENTS_OVERRIDE.md +16 -16
  142. package/templates/core/AGENT_AUTOMATION.md +296 -296
  143. package/templates/core/DAG.md +304 -304
  144. package/templates/core/DECISIONS.md +38 -38
  145. package/templates/core/DOCUMENTATION_RULES.md +36 -36
  146. package/templates/core/KNOWLEDGE.md +49 -49
  147. package/templates/core/MULTI_AGENT.md +74 -74
  148. package/templates/core/PLANS.md +28 -28
  149. package/templates/core/QUALITY_ENFORCEMENT.md +68 -68
  150. package/templates/core/RALPH.md +471 -471
  151. package/templates/core/RULEBOOK.md +1947 -1947
  152. package/templates/core/TIER1_PROHIBITIONS.md +154 -154
  153. package/templates/core/TOKEN_OPTIMIZATION.md +49 -49
  154. package/templates/frameworks/ANGULAR.md +36 -36
  155. package/templates/frameworks/DJANGO.md +83 -83
  156. package/templates/frameworks/ELECTRON.md +147 -147
  157. package/templates/frameworks/FLASK.md +38 -38
  158. package/templates/frameworks/FLUTTER.md +55 -55
  159. package/templates/frameworks/JQUERY.md +32 -32
  160. package/templates/frameworks/LARAVEL.md +38 -38
  161. package/templates/frameworks/NESTJS.md +43 -43
  162. package/templates/frameworks/NEXTJS.md +127 -127
  163. package/templates/frameworks/NUXT.md +40 -40
  164. package/templates/frameworks/RAILS.md +66 -66
  165. package/templates/frameworks/REACT.md +38 -38
  166. package/templates/frameworks/REACT_NATIVE.md +47 -47
  167. package/templates/frameworks/SPRING.md +39 -39
  168. package/templates/frameworks/SYMFONY.md +36 -36
  169. package/templates/frameworks/VUE.md +36 -36
  170. package/templates/frameworks/ZEND.md +35 -35
  171. package/templates/git/CI_CD_PATTERNS.md +661 -661
  172. package/templates/git/GITHUB_ACTIONS.md +728 -728
  173. package/templates/git/GITLAB_CI.md +730 -730
  174. package/templates/git/GIT_WORKFLOW.md +1192 -1192
  175. package/templates/git/SECRETS_MANAGEMENT.md +585 -585
  176. package/templates/hooks/COMMIT_MSG.md +530 -530
  177. package/templates/hooks/POST_CHECKOUT.md +546 -546
  178. package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -619
  179. package/templates/hooks/PRE_COMMIT.md +414 -414
  180. package/templates/hooks/PRE_PUSH.md +601 -601
  181. package/templates/ides/CONTINUE_RULES.md +16 -16
  182. package/templates/ides/COPILOT.md +37 -37
  183. package/templates/ides/COPILOT_INSTRUCTIONS.md +23 -23
  184. package/templates/ides/CURSOR.md +43 -43
  185. package/templates/ides/GEMINI_RULES.md +17 -17
  186. package/templates/ides/JETBRAINS_AI.md +35 -35
  187. package/templates/ides/REPLIT.md +36 -36
  188. package/templates/ides/TABNINE.md +29 -29
  189. package/templates/ides/VSCODE.md +40 -40
  190. package/templates/ides/WINDSURF.md +36 -36
  191. package/templates/ides/WINDSURF_RULES.md +14 -14
  192. package/templates/ides/ZED.md +32 -32
  193. package/templates/ides/cursor-mdc/go.mdc +24 -24
  194. package/templates/ides/cursor-mdc/python.mdc +24 -24
  195. package/templates/ides/cursor-mdc/quality.mdc +25 -25
  196. package/templates/ides/cursor-mdc/ralph.mdc +39 -39
  197. package/templates/ides/cursor-mdc/rulebook.mdc +38 -38
  198. package/templates/ides/cursor-mdc/rust.mdc +24 -24
  199. package/templates/ides/cursor-mdc/typescript.mdc +25 -25
  200. package/templates/languages/C.md +333 -333
  201. package/templates/languages/CPP.md +743 -743
  202. package/templates/languages/CSHARP.md +417 -417
  203. package/templates/languages/ELIXIR.md +454 -454
  204. package/templates/languages/ERLANG.md +361 -361
  205. package/templates/languages/GO.md +645 -645
  206. package/templates/languages/HASKELL.md +177 -177
  207. package/templates/languages/JAVA.md +607 -607
  208. package/templates/languages/JAVASCRIPT.md +631 -631
  209. package/templates/languages/JULIA.md +97 -97
  210. package/templates/languages/KOTLIN.md +511 -511
  211. package/templates/languages/LISP.md +100 -100
  212. package/templates/languages/LUA.md +74 -74
  213. package/templates/languages/OBJECTIVEC.md +90 -90
  214. package/templates/languages/PHP.md +416 -416
  215. package/templates/languages/PYTHON.md +682 -682
  216. package/templates/languages/RUBY.md +421 -421
  217. package/templates/languages/RUST.md +477 -477
  218. package/templates/languages/SAS.md +73 -73
  219. package/templates/languages/SCALA.md +348 -348
  220. package/templates/languages/SOLIDITY.md +580 -580
  221. package/templates/languages/SQL.md +137 -137
  222. package/templates/languages/SWIFT.md +466 -466
  223. package/templates/languages/TYPESCRIPT.md +591 -591
  224. package/templates/languages/ZIG.md +265 -265
  225. package/templates/modules/ATLASSIAN.md +255 -255
  226. package/templates/modules/CONTEXT7.md +54 -54
  227. package/templates/modules/FIGMA.md +267 -267
  228. package/templates/modules/GITHUB_MCP.md +64 -64
  229. package/templates/modules/GRAFANA.md +328 -328
  230. package/templates/modules/MEMORY.md +126 -126
  231. package/templates/modules/NOTION.md +247 -247
  232. package/templates/modules/PLAYWRIGHT.md +90 -90
  233. package/templates/modules/RULEBOOK_MCP.md +156 -156
  234. package/templates/modules/SERENA.md +337 -337
  235. package/templates/modules/SUPABASE.md +223 -223
  236. package/templates/modules/SYNAP.md +69 -69
  237. package/templates/modules/VECTORIZER.md +63 -63
  238. package/templates/modules/sequential-thinking.md +42 -42
  239. package/templates/ralph/ralph-history.bat +4 -4
  240. package/templates/ralph/ralph-history.sh +5 -5
  241. package/templates/ralph/ralph-init.bat +5 -5
  242. package/templates/ralph/ralph-init.sh +5 -5
  243. package/templates/ralph/ralph-pause.bat +5 -5
  244. package/templates/ralph/ralph-pause.sh +5 -5
  245. package/templates/ralph/ralph-run.bat +5 -5
  246. package/templates/ralph/ralph-run.sh +5 -5
  247. package/templates/ralph/ralph-status.bat +4 -4
  248. package/templates/ralph/ralph-status.sh +5 -5
  249. package/templates/rules/follow-task-sequence.md +36 -36
  250. package/templates/rules/git-safety.md +29 -29
  251. package/templates/rules/incremental-tests.md +29 -29
  252. package/templates/rules/no-deferred.md +31 -31
  253. package/templates/rules/no-shortcuts.md +30 -30
  254. package/templates/rules/research-first.md +30 -30
  255. package/templates/rules/sequential-editing.md +21 -21
  256. package/templates/rules/session-workflow.md +24 -24
  257. package/templates/rules/task-decomposition.md +32 -32
  258. package/templates/services/AZURE_BLOB.md +184 -184
  259. package/templates/services/CASSANDRA.md +239 -239
  260. package/templates/services/DATADOG.md +26 -26
  261. package/templates/services/DOCKER.md +124 -124
  262. package/templates/services/DOCKER_COMPOSE.md +168 -168
  263. package/templates/services/DYNAMODB.md +308 -308
  264. package/templates/services/ELASTICSEARCH.md +347 -347
  265. package/templates/services/GCS.md +178 -178
  266. package/templates/services/HELM.md +194 -194
  267. package/templates/services/INFLUXDB.md +265 -265
  268. package/templates/services/KAFKA.md +341 -341
  269. package/templates/services/KUBERNETES.md +208 -208
  270. package/templates/services/MARIADB.md +183 -183
  271. package/templates/services/MEMCACHED.md +242 -242
  272. package/templates/services/MINIO.md +201 -201
  273. package/templates/services/MONGODB.md +268 -268
  274. package/templates/services/MYSQL.md +358 -358
  275. package/templates/services/NEO4J.md +247 -247
  276. package/templates/services/OPENTELEMETRY.md +25 -25
  277. package/templates/services/ORACLE.md +290 -290
  278. package/templates/services/PINO.md +24 -24
  279. package/templates/services/POSTGRESQL.md +326 -326
  280. package/templates/services/PROMETHEUS.md +33 -33
  281. package/templates/services/RABBITMQ.md +286 -286
  282. package/templates/services/REDIS.md +292 -292
  283. package/templates/services/S3.md +298 -298
  284. package/templates/services/SENTRY.md +23 -23
  285. package/templates/services/SQLITE.md +294 -294
  286. package/templates/services/SQLSERVER.md +294 -294
  287. package/templates/services/WINSTON.md +30 -30
  288. package/templates/skills/cli/aider/SKILL.md +59 -59
  289. package/templates/skills/cli/amazon-q/SKILL.md +35 -35
  290. package/templates/skills/cli/auggie/SKILL.md +42 -42
  291. package/templates/skills/cli/claude/SKILL.md +42 -42
  292. package/templates/skills/cli/cline/SKILL.md +42 -42
  293. package/templates/skills/cli/codebuddy/SKILL.md +30 -30
  294. package/templates/skills/cli/codeium/SKILL.md +30 -30
  295. package/templates/skills/cli/codex/SKILL.md +31 -31
  296. package/templates/skills/cli/continue/SKILL.md +44 -44
  297. package/templates/skills/cli/cursor-cli/SKILL.md +38 -38
  298. package/templates/skills/cli/factory/SKILL.md +28 -28
  299. package/templates/skills/cli/gemini/SKILL.md +45 -45
  300. package/templates/skills/cli/kilocode/SKILL.md +28 -28
  301. package/templates/skills/cli/opencode/SKILL.md +28 -28
  302. package/templates/skills/core/agent-automation/SKILL.md +194 -194
  303. package/templates/skills/core/dag/SKILL.md +314 -314
  304. package/templates/skills/core/documentation-rules/SKILL.md +46 -46
  305. package/templates/skills/core/quality-enforcement/SKILL.md +78 -78
  306. package/templates/skills/core/rulebook/SKILL.md +176 -176
  307. package/templates/skills/dev/accessibility/SKILL.md +17 -17
  308. package/templates/skills/dev/api-design/SKILL.md +15 -15
  309. package/templates/skills/dev/architect/SKILL.md +17 -17
  310. package/templates/skills/dev/build-fix/SKILL.md +17 -17
  311. package/templates/skills/dev/db-design/SKILL.md +15 -15
  312. package/templates/skills/dev/debug/SKILL.md +16 -16
  313. package/templates/skills/dev/deploy/SKILL.md +17 -17
  314. package/templates/skills/dev/docs/SKILL.md +17 -17
  315. package/templates/skills/dev/migrate/SKILL.md +15 -15
  316. package/templates/skills/dev/perf/SKILL.md +17 -17
  317. package/templates/skills/dev/refactor/SKILL.md +17 -17
  318. package/templates/skills/dev/research/SKILL.md +14 -14
  319. package/templates/skills/dev/review/SKILL.md +18 -18
  320. package/templates/skills/dev/security-audit/SKILL.md +17 -17
  321. package/templates/skills/frameworks/angular/SKILL.md +46 -46
  322. package/templates/skills/frameworks/django/SKILL.md +93 -93
  323. package/templates/skills/frameworks/electron/SKILL.md +157 -157
  324. package/templates/skills/frameworks/flask/SKILL.md +48 -48
  325. package/templates/skills/frameworks/flutter/SKILL.md +65 -65
  326. package/templates/skills/frameworks/jquery/SKILL.md +42 -42
  327. package/templates/skills/frameworks/laravel/SKILL.md +48 -48
  328. package/templates/skills/frameworks/nestjs/SKILL.md +53 -53
  329. package/templates/skills/frameworks/nextjs/SKILL.md +137 -137
  330. package/templates/skills/frameworks/nuxt/SKILL.md +50 -50
  331. package/templates/skills/frameworks/rails/SKILL.md +76 -76
  332. package/templates/skills/frameworks/react/SKILL.md +48 -48
  333. package/templates/skills/frameworks/react-native/SKILL.md +57 -57
  334. package/templates/skills/frameworks/spring/SKILL.md +49 -49
  335. package/templates/skills/frameworks/symfony/SKILL.md +46 -46
  336. package/templates/skills/frameworks/vue/SKILL.md +46 -46
  337. package/templates/skills/frameworks/zend/SKILL.md +45 -45
  338. package/templates/skills/ides/copilot/SKILL.md +47 -47
  339. package/templates/skills/ides/cursor/SKILL.md +53 -53
  340. package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -45
  341. package/templates/skills/ides/replit/SKILL.md +46 -46
  342. package/templates/skills/ides/tabnine/SKILL.md +39 -39
  343. package/templates/skills/ides/vscode/SKILL.md +50 -50
  344. package/templates/skills/ides/windsurf/SKILL.md +46 -46
  345. package/templates/skills/ides/zed/SKILL.md +42 -42
  346. package/templates/skills/languages/c/SKILL.md +343 -343
  347. package/templates/skills/languages/cpp/SKILL.md +753 -753
  348. package/templates/skills/languages/csharp/SKILL.md +427 -427
  349. package/templates/skills/languages/elixir/SKILL.md +464 -464
  350. package/templates/skills/languages/erlang/SKILL.md +371 -371
  351. package/templates/skills/languages/go/SKILL.md +655 -655
  352. package/templates/skills/languages/haskell/SKILL.md +187 -187
  353. package/templates/skills/languages/java/SKILL.md +617 -617
  354. package/templates/skills/languages/javascript/SKILL.md +641 -641
  355. package/templates/skills/languages/julia/SKILL.md +107 -107
  356. package/templates/skills/languages/kotlin/SKILL.md +521 -521
  357. package/templates/skills/languages/lisp/SKILL.md +110 -110
  358. package/templates/skills/languages/lua/SKILL.md +84 -84
  359. package/templates/skills/languages/objectivec/SKILL.md +100 -100
  360. package/templates/skills/languages/php/SKILL.md +426 -426
  361. package/templates/skills/languages/python/SKILL.md +692 -692
  362. package/templates/skills/languages/ruby/SKILL.md +431 -431
  363. package/templates/skills/languages/rust/SKILL.md +487 -487
  364. package/templates/skills/languages/sas/SKILL.md +83 -83
  365. package/templates/skills/languages/scala/SKILL.md +358 -358
  366. package/templates/skills/languages/solidity/SKILL.md +590 -590
  367. package/templates/skills/languages/sql/SKILL.md +147 -147
  368. package/templates/skills/languages/swift/SKILL.md +476 -476
  369. package/templates/skills/languages/typescript/SKILL.md +302 -302
  370. package/templates/skills/languages/zig/SKILL.md +275 -275
  371. package/templates/skills/modules/atlassian/SKILL.md +265 -265
  372. package/templates/skills/modules/context7/SKILL.md +64 -64
  373. package/templates/skills/modules/figma/SKILL.md +277 -277
  374. package/templates/skills/modules/github-mcp/SKILL.md +74 -74
  375. package/templates/skills/modules/grafana/SKILL.md +338 -338
  376. package/templates/skills/modules/memory/SKILL.md +73 -73
  377. package/templates/skills/modules/notion/SKILL.md +257 -257
  378. package/templates/skills/modules/playwright/SKILL.md +100 -100
  379. package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -166
  380. package/templates/skills/modules/serena/SKILL.md +347 -347
  381. package/templates/skills/modules/supabase/SKILL.md +233 -233
  382. package/templates/skills/modules/synap/SKILL.md +79 -79
  383. package/templates/skills/modules/vectorizer/SKILL.md +73 -73
  384. package/templates/skills/services/azure-blob/SKILL.md +194 -194
  385. package/templates/skills/services/cassandra/SKILL.md +249 -249
  386. package/templates/skills/services/dynamodb/SKILL.md +318 -318
  387. package/templates/skills/services/elasticsearch/SKILL.md +357 -357
  388. package/templates/skills/services/gcs/SKILL.md +188 -188
  389. package/templates/skills/services/influxdb/SKILL.md +275 -275
  390. package/templates/skills/services/kafka/SKILL.md +351 -351
  391. package/templates/skills/services/mariadb/SKILL.md +193 -193
  392. package/templates/skills/services/memcached/SKILL.md +252 -252
  393. package/templates/skills/services/minio/SKILL.md +211 -211
  394. package/templates/skills/services/mongodb/SKILL.md +278 -278
  395. package/templates/skills/services/mysql/SKILL.md +368 -368
  396. package/templates/skills/services/neo4j/SKILL.md +257 -257
  397. package/templates/skills/services/oracle/SKILL.md +300 -300
  398. package/templates/skills/services/postgresql/SKILL.md +336 -336
  399. package/templates/skills/services/rabbitmq/SKILL.md +296 -296
  400. package/templates/skills/services/redis/SKILL.md +302 -302
  401. package/templates/skills/services/s3/SKILL.md +308 -308
  402. package/templates/skills/services/sqlite/SKILL.md +304 -304
  403. package/templates/skills/services/sqlserver/SKILL.md +304 -304
  404. package/templates/skills/workflows/ralph/SKILL.md +309 -309
  405. package/templates/skills/workflows/ralph/install.sh +87 -87
  406. package/templates/skills/workflows/ralph/manifest.json +158 -158
@@ -1,692 +1,692 @@
1
- ---
2
- name: "Python"
3
- description: "Execute these commands after EVERY implementation (see AGENT_AUTOMATION module for full workflow)."
4
- version: "1.0.0"
5
- category: "languages"
6
- author: "Rulebook"
7
- tags: ["languages", "language"]
8
- dependencies: []
9
- conflicts: []
10
- ---
11
- <!-- PYTHON:START -->
12
- # Python Project Rules
13
-
14
- ## Agent Automation Commands
15
-
16
- **CRITICAL**: Execute these commands after EVERY implementation (see AGENT_AUTOMATION module for full workflow).
17
-
18
- ```bash
19
- # Complete quality check sequence:
20
- ruff format --check . # Format check
21
- ruff check . # Linting
22
- mypy . # Type checking
23
- pytest # All tests (100% pass required)
24
- pytest --cov # Coverage check (95%+ required)
25
-
26
- # Security audit:
27
- pip-audit # Vulnerability scan
28
- pip list --outdated # Check outdated deps
29
- ```
30
-
31
- ## Python Version
32
-
33
- **CRITICAL**: Use Python 3.11+ for modern features and performance.
34
-
35
- - **Minimum Version**: Python 3.11+
36
- - **Recommended**: Python 3.12+
37
- - **Type Hints**: Required for all public APIs
38
-
39
- ### Formatting
40
-
41
- - Use `ruff format` (fast, modern) or `black` (traditional)
42
- - Line length: 100 characters (configurable)
43
- - Consistent formatting across entire project
44
- - Format before committing
45
-
46
- Configuration in `pyproject.toml`:
47
- ```toml
48
- [tool.ruff]
49
- line-length = 100
50
- target-version = "py311"
51
-
52
- [tool.ruff.format]
53
- quote-style = "double"
54
- indent-style = "space"
55
- ```
56
-
57
- ### Linting
58
-
59
- - Use `ruff check` (fast, comprehensive) or `ruff` + `flake8`
60
- - Fix all linting errors before committing
61
- - Document any disabled rules with justification
62
-
63
- Configuration in `pyproject.toml`:
64
- ```toml
65
- [tool.ruff.lint]
66
- select = ["E", "F", "I", "N", "W", "UP", "B", "A", "C4", "SIM"]
67
- ignore = ["E501"] # Line too long (handled by formatter)
68
-
69
- [tool.ruff.lint.per-file-ignores]
70
- "tests/*" = ["S101"] # Allow assert in tests
71
- ```
72
-
73
- ### Type Checking
74
-
75
- - Use `mypy` for static type checking
76
- - All public APIs must have type hints
77
- - Use `typing` module for complex types
78
- - Gradual typing allowed for legacy code
79
-
80
- Configuration in `pyproject.toml`:
81
- ```toml
82
- [tool.mypy]
83
- python_version = "3.11"
84
- strict = true
85
- warn_return_any = true
86
- warn_unused_configs = true
87
- disallow_untyped_defs = true
88
- ```
89
-
90
- Example:
91
- ```python
92
- from typing import Optional, List, Dict, Any
93
-
94
- def process_data(
95
- input_data: str,
96
- options: Optional[Dict[str, Any]] = None
97
- ) -> List[str]:
98
- """Process input data and return results."""
99
- # Implementation
100
- return []
101
- ```
102
-
103
- ### Testing
104
-
105
- - **Framework**: pytest
106
- - **Location**: `/tests` directory
107
- - **Coverage**: Must meet project threshold (default 95%)
108
- - **Fixtures**: Use pytest fixtures for setup/teardown
109
- - **Parametrize**: Use `@pytest.mark.parametrize` for multiple test cases
110
-
111
- Example test structure:
112
- ```python
113
- import pytest
114
- from mymodule import process_data
115
-
116
- @pytest.fixture
117
- def sample_data():
118
- """Provide sample data for tests."""
119
- return "test input"
120
-
121
- def test_process_data_valid_input(sample_data):
122
- """Test process_data with valid input."""
123
- result = process_data(sample_data)
124
- assert result == ["expected"]
125
-
126
- @pytest.mark.parametrize("input_val,expected", [
127
- ("hello", ["HELLO"]),
128
- ("world", ["WORLD"]),
129
- ])
130
- def test_process_data_parametrized(input_val, expected):
131
- """Test multiple input cases."""
132
- result = process_data(input_val)
133
- assert result == expected
134
- ```
135
-
136
- ### Test Categories: S2S and Slow Tests
137
-
138
- **CRITICAL**: Tests must be categorized based on execution time and dependencies.
139
-
140
- #### Test Time Limits
141
-
142
- - **Fast Tests**: Must complete in ≤ 10-20 seconds
143
- - **Slow Tests**: Any test taking > 10-20 seconds must be marked as slow
144
- - **S2S Tests**: Tests requiring active server/database must be isolated and run on-demand
145
-
146
- #### S2S (Server-to-Server) Tests
147
-
148
- **Tests that require active servers, databases, or external services must be isolated using pytest markers.**
149
-
150
- **Implementation**:
151
-
152
- 1. **Mark S2S tests with pytest markers**:
153
- ```python
154
- import pytest
155
- import os
156
-
157
- # Regular fast test (always runs)
158
- def test_local_computation():
159
- """Fast test, no external dependencies."""
160
- result = compute_locally("input")
161
- assert result == "expected"
162
-
163
- # S2S test (only runs with -m s2s)
164
- @pytest.mark.s2s
165
- def test_database_connection():
166
- """Requires active database server."""
167
- db = connect_to_database()
168
- # ... test implementation
169
-
170
- @pytest.mark.s2s
171
- def test_api_integration():
172
- """Requires active API server."""
173
- client = create_api_client()
174
- # ... test implementation
175
- ```
176
-
177
- 2. **Configure `pytest.ini` or `pyproject.toml`**:
178
- ```ini
179
- # pytest.ini
180
- [pytest]
181
- markers =
182
- s2s: Server-to-server tests requiring active services
183
- slow: Slow tests taking > 20 seconds
184
- ```
185
-
186
- Or in `pyproject.toml`:
187
- ```toml
188
- [tool.pytest.ini_options]
189
- markers = [
190
- "s2s: Server-to-server tests requiring active services",
191
- "slow: Slow tests taking > 20 seconds",
192
- ]
193
- ```
194
-
195
- 3. **Run tests**:
196
- ```bash
197
- # Regular tests (excludes S2S)
198
- pytest
199
-
200
- # Include S2S tests (requires active servers)
201
- pytest -m s2s
202
-
203
- # Run all tests including S2S
204
- pytest -m "not slow" # Fast + S2S, excludes slow
205
- ```
206
-
207
- #### Slow Tests
208
-
209
- **Tests that take > 10-20 seconds must be marked and run separately.**
210
-
211
- **Implementation**:
212
-
213
- 1. **Mark slow tests with pytest markers**:
214
- ```python
215
- import pytest
216
-
217
- # Fast test (always runs)
218
- def test_quick_operation():
219
- """Completes in < 1 second."""
220
- result = quick_compute("input")
221
- assert result == "expected"
222
-
223
- # Slow test (only runs with -m slow)
224
- @pytest.mark.slow
225
- def test_heavy_computation():
226
- """Takes 30+ seconds."""
227
- # Heavy processing, large dataset, etc.
228
- result = process_large_dataset()
229
- assert result is not None
230
-
231
- @pytest.mark.slow
232
- def test_large_file_processing():
233
- """Processes large files, takes > 20 seconds."""
234
- result = process_file("large_file.dat")
235
- assert result.success
236
- ```
237
-
238
- 2. **Run tests**:
239
- ```bash
240
- # Regular tests (excludes slow and S2S)
241
- pytest -m "not slow and not s2s"
242
-
243
- # Include slow tests
244
- pytest -m slow
245
-
246
- # Run all tests
247
- pytest -m "" # Empty marker means all tests
248
- ```
249
-
250
- 3. **Add pytest configuration for timeouts**:
251
- ```python
252
- # conftest.py
253
- import pytest
254
-
255
- @pytest.fixture(autouse=True)
256
- def configure_timeouts(request):
257
- """Configure timeouts based on test markers."""
258
- if 'slow' in request.keywords:
259
- request.node.add_marker(pytest.mark.timeout(300)) # 5 minutes
260
- elif 's2s' in request.keywords:
261
- request.node.add_marker(pytest.mark.timeout(60)) # 1 minute
262
- else:
263
- request.node.add_marker(pytest.mark.timeout(20)) # 20 seconds
264
- ```
265
-
266
- 4. **Add scripts in `pyproject.toml` or `setup.py`**:
267
- ```toml
268
- [tool.poetry.scripts]
269
- test = "pytest -m 'not slow and not s2s'"
270
- test-s2s = "pytest -m s2s"
271
- test-slow = "pytest -m slow"
272
- test-all = "pytest"
273
- ```
274
-
275
- #### Best Practices
276
-
277
- - ✅ **Always run fast tests** in CI/CD by default
278
- - ✅ **Isolate S2S tests** - never run them in standard test suite
279
- - ✅ **Mark slow tests** - prevent CI/CD timeouts
280
- - ✅ **Document requirements** - specify which servers/services are needed for S2S tests
281
- - ✅ **Use timeouts** - Set appropriate timeouts: `@pytest.mark.timeout(60)`
282
- - ✅ **Use pytest markers** - `@pytest.mark.s2s` and `@pytest.mark.slow`
283
- - ✅ **Skip conditionally** - `@pytest.mark.skipif(not os.getenv('RUN_S2S_TESTS'), reason='S2S tests disabled')`
284
- - ❌ **Never mix** fast and slow/S2S tests in same test run
285
- - ❌ **Never require** external services for standard test suite
286
- - ❌ **Never exceed** 10-20 seconds for regular tests
287
-
288
- ## Dependency Management
289
-
290
- **CRITICAL**: Use modern dependency management tools.
291
-
292
- ### Recommended: Poetry
293
-
294
- ```toml
295
- [tool.poetry]
296
- name = "myproject"
297
- version = "0.1.0"
298
- description = ""
299
- authors = ["Your Name <you@example.com>"]
300
-
301
- [tool.poetry.dependencies]
302
- python = "^3.11"
303
- requests = "^2.31.0"
304
-
305
- [tool.poetry.group.dev.dependencies]
306
- pytest = "^7.4.0"
307
- mypy = "^1.5.0"
308
- ruff = "^0.1.0"
309
- ```
310
-
311
- Commands:
312
- ```bash
313
- poetry install # Install dependencies
314
- poetry add requests # Add dependency
315
- poetry add --group dev pytest # Add dev dependency
316
- poetry update # Update dependencies
317
- ```
318
-
319
- ### Alternative: pip-tools
320
-
321
- ```
322
- # requirements.in
323
- requests>=2.31.0
324
- pydantic>=2.0.0
325
-
326
- # requirements-dev.in
327
- -r requirements.in
328
- pytest>=7.4.0
329
- mypy>=1.5.0
330
- ```
331
-
332
- Commands:
333
- ```bash
334
- pip-compile requirements.in
335
- pip-compile requirements-dev.in
336
- pip-sync requirements-dev.txt
337
- ```
338
-
339
- ### Dependency Guidelines
340
-
341
- 1. **Check for latest versions**:
342
- - Use Context7 MCP tool if available
343
- - Check PyPI: `pip index versions <package>`
344
- - Review changelog for breaking changes
345
-
346
- 2. **Version pinning**:
347
- - ✅ Pin exact versions in applications
348
- - ✅ Use ranges in libraries (`>=1.0,<2.0`)
349
- - ✅ Keep dependencies updated regularly
350
- - ❌ Don't use outdated packages with security issues
351
-
352
- ## Error Handling
353
-
354
- - Use specific exception types
355
- - Create custom exceptions when needed
356
- - Document exceptions in docstrings
357
- - Never use bare `except:`
358
-
359
- Example:
360
- ```python
361
- class ValidationError(Exception):
362
- """Raised when data validation fails."""
363
-
364
- def __init__(self, message: str, field: str):
365
- super().__init__(message)
366
- self.field = field
367
-
368
- def validate_data(data: dict[str, Any]) -> None:
369
- """
370
- Validate input data.
371
-
372
- Args:
373
- data: The data to validate
374
-
375
- Raises:
376
- ValidationError: If validation fails
377
- """
378
- if not isinstance(data, dict):
379
- raise ValidationError("Data must be a dictionary", "data")
380
- ```
381
-
382
- ## Documentation
383
-
384
- - **Docstrings**: Google or NumPy style
385
- - **Type hints**: Required for public APIs
386
- - **README**: Include installation and usage
387
- - **API docs**: Consider Sphinx for large projects
388
-
389
- Example (Google style):
390
- ```python
391
- def process_data(input_data: str, options: dict[str, Any] | None = None) -> list[str]:
392
- """
393
- Process input data and return results.
394
-
395
- Args:
396
- input_data: The input string to process
397
- options: Optional processing options
398
-
399
- Returns:
400
- A list of processed strings
401
-
402
- Raises:
403
- ValidationError: If input_data is empty
404
-
405
- Examples:
406
- >>> process_data("hello")
407
- ['HELLO']
408
- >>> process_data("world", {"lowercase": True})
409
- ['world']
410
- """
411
- # Implementation
412
- return []
413
- ```
414
-
415
- ## Project Structure
416
-
417
- ```
418
- project/
419
- ├── pyproject.toml # Project metadata and dependencies
420
- ├── README.md # Project overview (allowed in root)
421
- ├── CHANGELOG.md # Version history (allowed in root)
422
- ├── AGENTS.md # AI assistant rules (allowed in root)
423
- ├── LICENSE # Project license (allowed in root)
424
- ├── CONTRIBUTING.md # Contribution guidelines (allowed in root)
425
- ├── CODE_OF_CONDUCT.md # Code of conduct (allowed in root)
426
- ├── SECURITY.md # Security policy (allowed in root)
427
- ├── src/
428
- │ └── mypackage/
429
- │ ├── __init__.py
430
- │ ├── module.py
431
- │ └── py.typed # PEP 561 marker for type hints
432
- ├── tests/ # Test files
433
- │ ├── __init__.py
434
- │ └── test_module.py
435
- └── docs/ # Documentation
436
- ```
437
-
438
- ## Async Programming
439
-
440
- - Use `asyncio` for async code
441
- - Type hints: `async def func() -> Coroutine`
442
- - Testing: Use `pytest-asyncio`
443
-
444
- Example:
445
- ```python
446
- import asyncio
447
- from typing import List
448
-
449
- async def fetch_data(url: str) -> dict[str, Any]:
450
- """Fetch data asynchronously."""
451
- # Implementation
452
- return {}
453
-
454
- async def main() -> None:
455
- """Main async function."""
456
- results = await asyncio.gather(
457
- fetch_data("url1"),
458
- fetch_data("url2"),
459
- )
460
- print(results)
461
-
462
- if __name__ == "__main__":
463
- asyncio.run(main())
464
- ```
465
-
466
- ## CI/CD Requirements
467
-
468
- Must include GitHub Actions workflows for:
469
-
470
- 1. **Testing** (`python-test.yml`):
471
- - Test on ubuntu-latest, windows-latest, macos-latest
472
- - Test on Python 3.11, 3.12
473
- - Upload coverage reports
474
-
475
- 2. **Linting** (`python-lint.yml`):
476
- - Format check: `ruff format --check .`
477
- - Lint: `ruff check .`
478
- - Type check: `mypy .`
479
-
480
- 3. **Security** (`python-security.yml`):
481
- - Check for vulnerabilities: `pip-audit`
482
- - Scan dependencies: `safety check`
483
-
484
- ## Package Publication
485
-
486
- ### Publishing to PyPI
487
-
488
- **Prerequisites:**
489
- 1. Create account at https://pypi.org
490
- 2. Enable 2FA for security
491
- 3. Configure trusted publishing (recommended) or create API token
492
- 4. For trusted publishing: Add GitHub as publisher in PyPI settings
493
-
494
- **pyproject.toml Configuration:**
495
-
496
- ```toml
497
- [build-system]
498
- requires = ["setuptools>=68.0", "wheel"]
499
- build-backend = "setuptools.build_meta"
500
-
501
- [project]
502
- name = "your-package-name"
503
- version = "1.0.0"
504
- description = "A short description of your package"
505
- readme = "README.md"
506
- requires-python = ">=3.11"
507
- license = {text = "MIT"}
508
- authors = [
509
- {name = "Your Name", email = "your.email@example.com"}
510
- ]
511
- keywords = ["your", "keywords"]
512
- classifiers = [
513
- "Development Status :: 4 - Beta",
514
- "Intended Audience :: Developers",
515
- "License :: OSI Approved :: MIT License",
516
- "Programming Language :: Python :: 3",
517
- "Programming Language :: Python :: 3.11",
518
- "Programming Language :: Python :: 3.12",
519
- ]
520
- dependencies = [
521
- "requests>=2.31.0",
522
- ]
523
-
524
- [project.optional-dependencies]
525
- dev = [
526
- "pytest>=7.4.0",
527
- "pytest-cov>=4.1.0",
528
- "ruff>=0.1.0",
529
- "mypy>=1.7.0",
530
- "black>=23.12.0",
531
- ]
532
-
533
- [project.urls]
534
- Homepage = "https://github.com/your-org/your-package"
535
- Documentation = "https://your-package.readthedocs.io"
536
- Repository = "https://github.com/your-org/your-package"
537
- "Bug Tracker" = "https://github.com/your-org/your-package/issues"
538
-
539
- [tool.setuptools.packages.find]
540
- where = ["src"]
541
-
542
- [tool.setuptools.package-data]
543
- your_package = ["py.typed"]
544
- ```
545
-
546
- ### PEP 625 Package Naming Convention
547
-
548
- **CRITICAL**: Package names must be normalized according to PEP 625.
549
-
550
- PyPI requires source distribution filenames to use normalized package names (underscores instead of hyphens).
551
-
552
- **Naming Rules:**
553
-
554
- 1. **Package name in `pyproject.toml`**: Use underscores (`_`)
555
- ```toml
556
- [project]
557
- name = "my_package_name" # Correct
558
- # NOT: name = "my-package-name" # Will cause deprecation warning
559
- ```
560
-
561
- 2. **Package directory**: Must match with underscores
562
- ```
563
- src/
564
- └── my_package_name/ # Correct
565
- ├── __init__.py
566
- └── ...
567
- ```
568
-
569
- 3. **Import statement**: Uses underscores
570
- ```python
571
- import my_package_name
572
- from my_package_name import something
573
- ```
574
-
575
- 4. **Distribution filename**: Will be `my_package_name-1.0.0.tar.gz` ✅
576
-
577
- **Common Issue:**
578
-
579
- If you use hyphens in the package name, PyPI will reject new uploads:
580
- ```toml
581
- # ❌ WRONG - Will fail PEP 625 compliance
582
- [project]
583
- name = "my-package-name"
584
-
585
- # Result: my-package-name-1.0.0.tar.gz (non-compliant)
586
- # PyPI Error: "Filename does not contain normalized project name"
587
- ```
588
-
589
- **Correct Approach:**
590
- ```toml
591
- # ✅ CORRECT - PEP 625 compliant
592
- [project]
593
- name = "my_package_name"
594
-
595
- # Result: my_package_name-1.0.0.tar.gz (compliant)
596
- # PyPI: Accepts upload without warnings
597
- ```
598
-
599
- **Migration from Hyphenated Names:**
600
-
601
- If you previously published with hyphens:
602
-
603
- 1. Update `pyproject.toml` and `setup.py` to use underscores
604
- 2. Existing uploads remain on PyPI (no action needed)
605
- 3. Future uploads will use normalized name
606
- 4. PyPI will automatically redirect:
607
- - `pip install my-package-name` → works (auto-normalized)
608
- - `pip install my_package_name` → works (canonical form)
609
- 5. Import statement unchanged: `import my_package_name`
610
-
611
- **Reference**: [PEP 625 - File name of a Source Distribution](https://peps.python.org/pep-0625/)
612
-
613
- **Publishing Workflow:**
614
-
615
- 1. Update version in pyproject.toml
616
- 2. Update CHANGELOG.md
617
- 3. Run quality checks:
618
- ```bash
619
- ruff check .
620
- ruff format --check .
621
- mypy .
622
- pytest
623
- ```
624
- 4. Build package:
625
- ```bash
626
- python -m build
627
- twine check dist/*
628
- ```
629
- 5. Test on Test PyPI (optional):
630
- ```bash
631
- twine upload --repository testpypi dist/*
632
- ```
633
- 6. Create git tag: `git tag v1.0.0 && git push --tags`
634
- 7. GitHub Actions automatically publishes to PyPI
635
- 8. Or manual publish: `twine upload dist/*`
636
-
637
- **Publishing Checklist:**
638
-
639
- - ✅ All tests passing (`pytest`)
640
- - ✅ Type checking passes (`mypy .`)
641
- - ✅ Linting passes (`ruff check .`)
642
- - ✅ Code formatted (`ruff format .`)
643
- - ✅ Version updated in pyproject.toml
644
- - ✅ CHANGELOG.md updated
645
- - ✅ README.md up to date
646
- - ✅ LICENSE file present
647
- - ✅ **Package name uses underscores (PEP 625 compliant)**
648
- - ✅ `py.typed` marker for type hints
649
- - ✅ Package builds successfully (`python -m build`)
650
- - ✅ Package checks pass (`twine check dist/*`)
651
- - ✅ Manifest complete (`check-manifest`)
652
- - ✅ **Verify dist filename**: `my_package-1.0.0.tar.gz` (underscores) ✅
653
-
654
- **Trusted Publishing (Recommended):**
655
-
656
- PyPI trusted publishing eliminates the need for API tokens:
657
-
658
- 1. Go to PyPI → Your Account → Publishing
659
- 2. Add a new pending publisher:
660
- - PyPI Project Name: `your-package-name`
661
- - Owner: `your-github-org`
662
- - Repository: `your-repo-name`
663
- - Workflow: `python-publish.yml`
664
- - Environment: `release` (optional)
665
-
666
- 3. GitHub Actions will authenticate automatically using OIDC
667
-
668
- **Versioning:**
669
-
670
- Use semantic versioning and consider:
671
- - **Automated versioning**: Use tools like `bump2version` or `setuptools_scm`
672
- - **Version from git tags**: Configure `setuptools_scm` in pyproject.toml:
673
-
674
- ```toml
675
- [build-system]
676
- requires = ["setuptools>=68.0", "setuptools_scm>=8.0"]
677
-
678
- [tool.setuptools_scm]
679
- version_file = "src/your_package/_version.py"
680
- ```
681
-
682
- **Type Hints:**
683
-
684
- Include `py.typed` marker for PEP 561 compliance:
685
- ```bash
686
- touch src/your_package/py.typed
687
- ```
688
-
689
- This tells type checkers your package includes type information.
690
-
691
- <!-- PYTHON:END -->
692
-
1
+ ---
2
+ name: "Python"
3
+ description: "Execute these commands after EVERY implementation (see AGENT_AUTOMATION module for full workflow)."
4
+ version: "1.0.0"
5
+ category: "languages"
6
+ author: "Rulebook"
7
+ tags: ["languages", "language"]
8
+ dependencies: []
9
+ conflicts: []
10
+ ---
11
+ <!-- PYTHON:START -->
12
+ # Python Project Rules
13
+
14
+ ## Agent Automation Commands
15
+
16
+ **CRITICAL**: Execute these commands after EVERY implementation (see AGENT_AUTOMATION module for full workflow).
17
+
18
+ ```bash
19
+ # Complete quality check sequence:
20
+ ruff format --check . # Format check
21
+ ruff check . # Linting
22
+ mypy . # Type checking
23
+ pytest # All tests (100% pass required)
24
+ pytest --cov # Coverage check (95%+ required)
25
+
26
+ # Security audit:
27
+ pip-audit # Vulnerability scan
28
+ pip list --outdated # Check outdated deps
29
+ ```
30
+
31
+ ## Python Version
32
+
33
+ **CRITICAL**: Use Python 3.11+ for modern features and performance.
34
+
35
+ - **Minimum Version**: Python 3.11+
36
+ - **Recommended**: Python 3.12+
37
+ - **Type Hints**: Required for all public APIs
38
+
39
+ ### Formatting
40
+
41
+ - Use `ruff format` (fast, modern) or `black` (traditional)
42
+ - Line length: 100 characters (configurable)
43
+ - Consistent formatting across entire project
44
+ - Format before committing
45
+
46
+ Configuration in `pyproject.toml`:
47
+ ```toml
48
+ [tool.ruff]
49
+ line-length = 100
50
+ target-version = "py311"
51
+
52
+ [tool.ruff.format]
53
+ quote-style = "double"
54
+ indent-style = "space"
55
+ ```
56
+
57
+ ### Linting
58
+
59
+ - Use `ruff check` (fast, comprehensive) or `ruff` + `flake8`
60
+ - Fix all linting errors before committing
61
+ - Document any disabled rules with justification
62
+
63
+ Configuration in `pyproject.toml`:
64
+ ```toml
65
+ [tool.ruff.lint]
66
+ select = ["E", "F", "I", "N", "W", "UP", "B", "A", "C4", "SIM"]
67
+ ignore = ["E501"] # Line too long (handled by formatter)
68
+
69
+ [tool.ruff.lint.per-file-ignores]
70
+ "tests/*" = ["S101"] # Allow assert in tests
71
+ ```
72
+
73
+ ### Type Checking
74
+
75
+ - Use `mypy` for static type checking
76
+ - All public APIs must have type hints
77
+ - Use `typing` module for complex types
78
+ - Gradual typing allowed for legacy code
79
+
80
+ Configuration in `pyproject.toml`:
81
+ ```toml
82
+ [tool.mypy]
83
+ python_version = "3.11"
84
+ strict = true
85
+ warn_return_any = true
86
+ warn_unused_configs = true
87
+ disallow_untyped_defs = true
88
+ ```
89
+
90
+ Example:
91
+ ```python
92
+ from typing import Optional, List, Dict, Any
93
+
94
+ def process_data(
95
+ input_data: str,
96
+ options: Optional[Dict[str, Any]] = None
97
+ ) -> List[str]:
98
+ """Process input data and return results."""
99
+ # Implementation
100
+ return []
101
+ ```
102
+
103
+ ### Testing
104
+
105
+ - **Framework**: pytest
106
+ - **Location**: `/tests` directory
107
+ - **Coverage**: Must meet project threshold (default 95%)
108
+ - **Fixtures**: Use pytest fixtures for setup/teardown
109
+ - **Parametrize**: Use `@pytest.mark.parametrize` for multiple test cases
110
+
111
+ Example test structure:
112
+ ```python
113
+ import pytest
114
+ from mymodule import process_data
115
+
116
+ @pytest.fixture
117
+ def sample_data():
118
+ """Provide sample data for tests."""
119
+ return "test input"
120
+
121
+ def test_process_data_valid_input(sample_data):
122
+ """Test process_data with valid input."""
123
+ result = process_data(sample_data)
124
+ assert result == ["expected"]
125
+
126
+ @pytest.mark.parametrize("input_val,expected", [
127
+ ("hello", ["HELLO"]),
128
+ ("world", ["WORLD"]),
129
+ ])
130
+ def test_process_data_parametrized(input_val, expected):
131
+ """Test multiple input cases."""
132
+ result = process_data(input_val)
133
+ assert result == expected
134
+ ```
135
+
136
+ ### Test Categories: S2S and Slow Tests
137
+
138
+ **CRITICAL**: Tests must be categorized based on execution time and dependencies.
139
+
140
+ #### Test Time Limits
141
+
142
+ - **Fast Tests**: Must complete in ≤ 10-20 seconds
143
+ - **Slow Tests**: Any test taking > 10-20 seconds must be marked as slow
144
+ - **S2S Tests**: Tests requiring active server/database must be isolated and run on-demand
145
+
146
+ #### S2S (Server-to-Server) Tests
147
+
148
+ **Tests that require active servers, databases, or external services must be isolated using pytest markers.**
149
+
150
+ **Implementation**:
151
+
152
+ 1. **Mark S2S tests with pytest markers**:
153
+ ```python
154
+ import pytest
155
+ import os
156
+
157
+ # Regular fast test (always runs)
158
+ def test_local_computation():
159
+ """Fast test, no external dependencies."""
160
+ result = compute_locally("input")
161
+ assert result == "expected"
162
+
163
+ # S2S test (only runs with -m s2s)
164
+ @pytest.mark.s2s
165
+ def test_database_connection():
166
+ """Requires active database server."""
167
+ db = connect_to_database()
168
+ # ... test implementation
169
+
170
+ @pytest.mark.s2s
171
+ def test_api_integration():
172
+ """Requires active API server."""
173
+ client = create_api_client()
174
+ # ... test implementation
175
+ ```
176
+
177
+ 2. **Configure `pytest.ini` or `pyproject.toml`**:
178
+ ```ini
179
+ # pytest.ini
180
+ [pytest]
181
+ markers =
182
+ s2s: Server-to-server tests requiring active services
183
+ slow: Slow tests taking > 20 seconds
184
+ ```
185
+
186
+ Or in `pyproject.toml`:
187
+ ```toml
188
+ [tool.pytest.ini_options]
189
+ markers = [
190
+ "s2s: Server-to-server tests requiring active services",
191
+ "slow: Slow tests taking > 20 seconds",
192
+ ]
193
+ ```
194
+
195
+ 3. **Run tests**:
196
+ ```bash
197
+ # Regular tests (excludes S2S)
198
+ pytest
199
+
200
+ # Include S2S tests (requires active servers)
201
+ pytest -m s2s
202
+
203
+ # Run all tests including S2S
204
+ pytest -m "not slow" # Fast + S2S, excludes slow
205
+ ```
206
+
207
+ #### Slow Tests
208
+
209
+ **Tests that take > 10-20 seconds must be marked and run separately.**
210
+
211
+ **Implementation**:
212
+
213
+ 1. **Mark slow tests with pytest markers**:
214
+ ```python
215
+ import pytest
216
+
217
+ # Fast test (always runs)
218
+ def test_quick_operation():
219
+ """Completes in < 1 second."""
220
+ result = quick_compute("input")
221
+ assert result == "expected"
222
+
223
+ # Slow test (only runs with -m slow)
224
+ @pytest.mark.slow
225
+ def test_heavy_computation():
226
+ """Takes 30+ seconds."""
227
+ # Heavy processing, large dataset, etc.
228
+ result = process_large_dataset()
229
+ assert result is not None
230
+
231
+ @pytest.mark.slow
232
+ def test_large_file_processing():
233
+ """Processes large files, takes > 20 seconds."""
234
+ result = process_file("large_file.dat")
235
+ assert result.success
236
+ ```
237
+
238
+ 2. **Run tests**:
239
+ ```bash
240
+ # Regular tests (excludes slow and S2S)
241
+ pytest -m "not slow and not s2s"
242
+
243
+ # Include slow tests
244
+ pytest -m slow
245
+
246
+ # Run all tests
247
+ pytest -m "" # Empty marker means all tests
248
+ ```
249
+
250
+ 3. **Add pytest configuration for timeouts**:
251
+ ```python
252
+ # conftest.py
253
+ import pytest
254
+
255
+ @pytest.fixture(autouse=True)
256
+ def configure_timeouts(request):
257
+ """Configure timeouts based on test markers."""
258
+ if 'slow' in request.keywords:
259
+ request.node.add_marker(pytest.mark.timeout(300)) # 5 minutes
260
+ elif 's2s' in request.keywords:
261
+ request.node.add_marker(pytest.mark.timeout(60)) # 1 minute
262
+ else:
263
+ request.node.add_marker(pytest.mark.timeout(20)) # 20 seconds
264
+ ```
265
+
266
+ 4. **Add scripts in `pyproject.toml` or `setup.py`**:
267
+ ```toml
268
+ [tool.poetry.scripts]
269
+ test = "pytest -m 'not slow and not s2s'"
270
+ test-s2s = "pytest -m s2s"
271
+ test-slow = "pytest -m slow"
272
+ test-all = "pytest"
273
+ ```
274
+
275
+ #### Best Practices
276
+
277
+ - ✅ **Always run fast tests** in CI/CD by default
278
+ - ✅ **Isolate S2S tests** - never run them in standard test suite
279
+ - ✅ **Mark slow tests** - prevent CI/CD timeouts
280
+ - ✅ **Document requirements** - specify which servers/services are needed for S2S tests
281
+ - ✅ **Use timeouts** - Set appropriate timeouts: `@pytest.mark.timeout(60)`
282
+ - ✅ **Use pytest markers** - `@pytest.mark.s2s` and `@pytest.mark.slow`
283
+ - ✅ **Skip conditionally** - `@pytest.mark.skipif(not os.getenv('RUN_S2S_TESTS'), reason='S2S tests disabled')`
284
+ - ❌ **Never mix** fast and slow/S2S tests in same test run
285
+ - ❌ **Never require** external services for standard test suite
286
+ - ❌ **Never exceed** 10-20 seconds for regular tests
287
+
288
+ ## Dependency Management
289
+
290
+ **CRITICAL**: Use modern dependency management tools.
291
+
292
+ ### Recommended: Poetry
293
+
294
+ ```toml
295
+ [tool.poetry]
296
+ name = "myproject"
297
+ version = "0.1.0"
298
+ description = ""
299
+ authors = ["Your Name <you@example.com>"]
300
+
301
+ [tool.poetry.dependencies]
302
+ python = "^3.11"
303
+ requests = "^2.31.0"
304
+
305
+ [tool.poetry.group.dev.dependencies]
306
+ pytest = "^7.4.0"
307
+ mypy = "^1.5.0"
308
+ ruff = "^0.1.0"
309
+ ```
310
+
311
+ Commands:
312
+ ```bash
313
+ poetry install # Install dependencies
314
+ poetry add requests # Add dependency
315
+ poetry add --group dev pytest # Add dev dependency
316
+ poetry update # Update dependencies
317
+ ```
318
+
319
+ ### Alternative: pip-tools
320
+
321
+ ```
322
+ # requirements.in
323
+ requests>=2.31.0
324
+ pydantic>=2.0.0
325
+
326
+ # requirements-dev.in
327
+ -r requirements.in
328
+ pytest>=7.4.0
329
+ mypy>=1.5.0
330
+ ```
331
+
332
+ Commands:
333
+ ```bash
334
+ pip-compile requirements.in
335
+ pip-compile requirements-dev.in
336
+ pip-sync requirements-dev.txt
337
+ ```
338
+
339
+ ### Dependency Guidelines
340
+
341
+ 1. **Check for latest versions**:
342
+ - Use Context7 MCP tool if available
343
+ - Check PyPI: `pip index versions <package>`
344
+ - Review changelog for breaking changes
345
+
346
+ 2. **Version pinning**:
347
+ - ✅ Pin exact versions in applications
348
+ - ✅ Use ranges in libraries (`>=1.0,<2.0`)
349
+ - ✅ Keep dependencies updated regularly
350
+ - ❌ Don't use outdated packages with security issues
351
+
352
+ ## Error Handling
353
+
354
+ - Use specific exception types
355
+ - Create custom exceptions when needed
356
+ - Document exceptions in docstrings
357
+ - Never use bare `except:`
358
+
359
+ Example:
360
+ ```python
361
+ class ValidationError(Exception):
362
+ """Raised when data validation fails."""
363
+
364
+ def __init__(self, message: str, field: str):
365
+ super().__init__(message)
366
+ self.field = field
367
+
368
+ def validate_data(data: dict[str, Any]) -> None:
369
+ """
370
+ Validate input data.
371
+
372
+ Args:
373
+ data: The data to validate
374
+
375
+ Raises:
376
+ ValidationError: If validation fails
377
+ """
378
+ if not isinstance(data, dict):
379
+ raise ValidationError("Data must be a dictionary", "data")
380
+ ```
381
+
382
+ ## Documentation
383
+
384
+ - **Docstrings**: Google or NumPy style
385
+ - **Type hints**: Required for public APIs
386
+ - **README**: Include installation and usage
387
+ - **API docs**: Consider Sphinx for large projects
388
+
389
+ Example (Google style):
390
+ ```python
391
+ def process_data(input_data: str, options: dict[str, Any] | None = None) -> list[str]:
392
+ """
393
+ Process input data and return results.
394
+
395
+ Args:
396
+ input_data: The input string to process
397
+ options: Optional processing options
398
+
399
+ Returns:
400
+ A list of processed strings
401
+
402
+ Raises:
403
+ ValidationError: If input_data is empty
404
+
405
+ Examples:
406
+ >>> process_data("hello")
407
+ ['HELLO']
408
+ >>> process_data("world", {"lowercase": True})
409
+ ['world']
410
+ """
411
+ # Implementation
412
+ return []
413
+ ```
414
+
415
+ ## Project Structure
416
+
417
+ ```
418
+ project/
419
+ ├── pyproject.toml # Project metadata and dependencies
420
+ ├── README.md # Project overview (allowed in root)
421
+ ├── CHANGELOG.md # Version history (allowed in root)
422
+ ├── AGENTS.md # AI assistant rules (allowed in root)
423
+ ├── LICENSE # Project license (allowed in root)
424
+ ├── CONTRIBUTING.md # Contribution guidelines (allowed in root)
425
+ ├── CODE_OF_CONDUCT.md # Code of conduct (allowed in root)
426
+ ├── SECURITY.md # Security policy (allowed in root)
427
+ ├── src/
428
+ │ └── mypackage/
429
+ │ ├── __init__.py
430
+ │ ├── module.py
431
+ │ └── py.typed # PEP 561 marker for type hints
432
+ ├── tests/ # Test files
433
+ │ ├── __init__.py
434
+ │ └── test_module.py
435
+ └── docs/ # Documentation
436
+ ```
437
+
438
+ ## Async Programming
439
+
440
+ - Use `asyncio` for async code
441
+ - Type hints: `async def func() -> Coroutine`
442
+ - Testing: Use `pytest-asyncio`
443
+
444
+ Example:
445
+ ```python
446
+ import asyncio
447
+ from typing import List
448
+
449
+ async def fetch_data(url: str) -> dict[str, Any]:
450
+ """Fetch data asynchronously."""
451
+ # Implementation
452
+ return {}
453
+
454
+ async def main() -> None:
455
+ """Main async function."""
456
+ results = await asyncio.gather(
457
+ fetch_data("url1"),
458
+ fetch_data("url2"),
459
+ )
460
+ print(results)
461
+
462
+ if __name__ == "__main__":
463
+ asyncio.run(main())
464
+ ```
465
+
466
+ ## CI/CD Requirements
467
+
468
+ Must include GitHub Actions workflows for:
469
+
470
+ 1. **Testing** (`python-test.yml`):
471
+ - Test on ubuntu-latest, windows-latest, macos-latest
472
+ - Test on Python 3.11, 3.12
473
+ - Upload coverage reports
474
+
475
+ 2. **Linting** (`python-lint.yml`):
476
+ - Format check: `ruff format --check .`
477
+ - Lint: `ruff check .`
478
+ - Type check: `mypy .`
479
+
480
+ 3. **Security** (`python-security.yml`):
481
+ - Check for vulnerabilities: `pip-audit`
482
+ - Scan dependencies: `safety check`
483
+
484
+ ## Package Publication
485
+
486
+ ### Publishing to PyPI
487
+
488
+ **Prerequisites:**
489
+ 1. Create account at https://pypi.org
490
+ 2. Enable 2FA for security
491
+ 3. Configure trusted publishing (recommended) or create API token
492
+ 4. For trusted publishing: Add GitHub as publisher in PyPI settings
493
+
494
+ **pyproject.toml Configuration:**
495
+
496
+ ```toml
497
+ [build-system]
498
+ requires = ["setuptools>=68.0", "wheel"]
499
+ build-backend = "setuptools.build_meta"
500
+
501
+ [project]
502
+ name = "your-package-name"
503
+ version = "1.0.0"
504
+ description = "A short description of your package"
505
+ readme = "README.md"
506
+ requires-python = ">=3.11"
507
+ license = {text = "MIT"}
508
+ authors = [
509
+ {name = "Your Name", email = "your.email@example.com"}
510
+ ]
511
+ keywords = ["your", "keywords"]
512
+ classifiers = [
513
+ "Development Status :: 4 - Beta",
514
+ "Intended Audience :: Developers",
515
+ "License :: OSI Approved :: MIT License",
516
+ "Programming Language :: Python :: 3",
517
+ "Programming Language :: Python :: 3.11",
518
+ "Programming Language :: Python :: 3.12",
519
+ ]
520
+ dependencies = [
521
+ "requests>=2.31.0",
522
+ ]
523
+
524
+ [project.optional-dependencies]
525
+ dev = [
526
+ "pytest>=7.4.0",
527
+ "pytest-cov>=4.1.0",
528
+ "ruff>=0.1.0",
529
+ "mypy>=1.7.0",
530
+ "black>=23.12.0",
531
+ ]
532
+
533
+ [project.urls]
534
+ Homepage = "https://github.com/your-org/your-package"
535
+ Documentation = "https://your-package.readthedocs.io"
536
+ Repository = "https://github.com/your-org/your-package"
537
+ "Bug Tracker" = "https://github.com/your-org/your-package/issues"
538
+
539
+ [tool.setuptools.packages.find]
540
+ where = ["src"]
541
+
542
+ [tool.setuptools.package-data]
543
+ your_package = ["py.typed"]
544
+ ```
545
+
546
+ ### PEP 625 Package Naming Convention
547
+
548
+ **CRITICAL**: Package names must be normalized according to PEP 625.
549
+
550
+ PyPI requires source distribution filenames to use normalized package names (underscores instead of hyphens).
551
+
552
+ **Naming Rules:**
553
+
554
+ 1. **Package name in `pyproject.toml`**: Use underscores (`_`)
555
+ ```toml
556
+ [project]
557
+ name = "my_package_name" # Correct
558
+ # NOT: name = "my-package-name" # Will cause deprecation warning
559
+ ```
560
+
561
+ 2. **Package directory**: Must match with underscores
562
+ ```
563
+ src/
564
+ └── my_package_name/ # Correct
565
+ ├── __init__.py
566
+ └── ...
567
+ ```
568
+
569
+ 3. **Import statement**: Uses underscores
570
+ ```python
571
+ import my_package_name
572
+ from my_package_name import something
573
+ ```
574
+
575
+ 4. **Distribution filename**: Will be `my_package_name-1.0.0.tar.gz` ✅
576
+
577
+ **Common Issue:**
578
+
579
+ If you use hyphens in the package name, PyPI will reject new uploads:
580
+ ```toml
581
+ # ❌ WRONG - Will fail PEP 625 compliance
582
+ [project]
583
+ name = "my-package-name"
584
+
585
+ # Result: my-package-name-1.0.0.tar.gz (non-compliant)
586
+ # PyPI Error: "Filename does not contain normalized project name"
587
+ ```
588
+
589
+ **Correct Approach:**
590
+ ```toml
591
+ # ✅ CORRECT - PEP 625 compliant
592
+ [project]
593
+ name = "my_package_name"
594
+
595
+ # Result: my_package_name-1.0.0.tar.gz (compliant)
596
+ # PyPI: Accepts upload without warnings
597
+ ```
598
+
599
+ **Migration from Hyphenated Names:**
600
+
601
+ If you previously published with hyphens:
602
+
603
+ 1. Update `pyproject.toml` and `setup.py` to use underscores
604
+ 2. Existing uploads remain on PyPI (no action needed)
605
+ 3. Future uploads will use normalized name
606
+ 4. PyPI will automatically redirect:
607
+ - `pip install my-package-name` → works (auto-normalized)
608
+ - `pip install my_package_name` → works (canonical form)
609
+ 5. Import statement unchanged: `import my_package_name`
610
+
611
+ **Reference**: [PEP 625 - File name of a Source Distribution](https://peps.python.org/pep-0625/)
612
+
613
+ **Publishing Workflow:**
614
+
615
+ 1. Update version in pyproject.toml
616
+ 2. Update CHANGELOG.md
617
+ 3. Run quality checks:
618
+ ```bash
619
+ ruff check .
620
+ ruff format --check .
621
+ mypy .
622
+ pytest
623
+ ```
624
+ 4. Build package:
625
+ ```bash
626
+ python -m build
627
+ twine check dist/*
628
+ ```
629
+ 5. Test on Test PyPI (optional):
630
+ ```bash
631
+ twine upload --repository testpypi dist/*
632
+ ```
633
+ 6. Create git tag: `git tag v1.0.0 && git push --tags`
634
+ 7. GitHub Actions automatically publishes to PyPI
635
+ 8. Or manual publish: `twine upload dist/*`
636
+
637
+ **Publishing Checklist:**
638
+
639
+ - ✅ All tests passing (`pytest`)
640
+ - ✅ Type checking passes (`mypy .`)
641
+ - ✅ Linting passes (`ruff check .`)
642
+ - ✅ Code formatted (`ruff format .`)
643
+ - ✅ Version updated in pyproject.toml
644
+ - ✅ CHANGELOG.md updated
645
+ - ✅ README.md up to date
646
+ - ✅ LICENSE file present
647
+ - ✅ **Package name uses underscores (PEP 625 compliant)**
648
+ - ✅ `py.typed` marker for type hints
649
+ - ✅ Package builds successfully (`python -m build`)
650
+ - ✅ Package checks pass (`twine check dist/*`)
651
+ - ✅ Manifest complete (`check-manifest`)
652
+ - ✅ **Verify dist filename**: `my_package-1.0.0.tar.gz` (underscores) ✅
653
+
654
+ **Trusted Publishing (Recommended):**
655
+
656
+ PyPI trusted publishing eliminates the need for API tokens:
657
+
658
+ 1. Go to PyPI → Your Account → Publishing
659
+ 2. Add a new pending publisher:
660
+ - PyPI Project Name: `your-package-name`
661
+ - Owner: `your-github-org`
662
+ - Repository: `your-repo-name`
663
+ - Workflow: `python-publish.yml`
664
+ - Environment: `release` (optional)
665
+
666
+ 3. GitHub Actions will authenticate automatically using OIDC
667
+
668
+ **Versioning:**
669
+
670
+ Use semantic versioning and consider:
671
+ - **Automated versioning**: Use tools like `bump2version` or `setuptools_scm`
672
+ - **Version from git tags**: Configure `setuptools_scm` in pyproject.toml:
673
+
674
+ ```toml
675
+ [build-system]
676
+ requires = ["setuptools>=68.0", "setuptools_scm>=8.0"]
677
+
678
+ [tool.setuptools_scm]
679
+ version_file = "src/your_package/_version.py"
680
+ ```
681
+
682
+ **Type Hints:**
683
+
684
+ Include `py.typed` marker for PEP 561 compliance:
685
+ ```bash
686
+ touch src/your_package/py.typed
687
+ ```
688
+
689
+ This tells type checkers your package includes type information.
690
+
691
+ <!-- PYTHON:END -->
692
+