compound-engineering-pi 0.2.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 (332) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +124 -0
  3. package/bin/compound-engineering-pi +12 -0
  4. package/bin/compound-plugin +12 -0
  5. package/compound-engineering-pi +12 -0
  6. package/compound-plugin +5 -0
  7. package/docs/pi.md +152 -0
  8. package/extensions/compound-engineering-compat.ts +452 -0
  9. package/package.json +84 -0
  10. package/pi-resources/compound-engineering/mcporter.json +7 -0
  11. package/plugins/coding-tutor/.claude-plugin/plugin.json +9 -0
  12. package/plugins/coding-tutor/README.md +37 -0
  13. package/plugins/coding-tutor/commands/quiz-me.md +1 -0
  14. package/plugins/coding-tutor/commands/sync-tutorials.md +25 -0
  15. package/plugins/coding-tutor/commands/teach-me.md +1 -0
  16. package/plugins/coding-tutor/skills/coding-tutor/SKILL.md +214 -0
  17. package/plugins/coding-tutor/skills/coding-tutor/scripts/create_tutorial.py +207 -0
  18. package/plugins/coding-tutor/skills/coding-tutor/scripts/index_tutorials.py +193 -0
  19. package/plugins/coding-tutor/skills/coding-tutor/scripts/quiz_priority.py +190 -0
  20. package/plugins/coding-tutor/skills/coding-tutor/scripts/setup_tutorials.py +118 -0
  21. package/plugins/compound-engineering/.claude-plugin/plugin.json +33 -0
  22. package/plugins/compound-engineering/CHANGELOG.md +457 -0
  23. package/plugins/compound-engineering/CLAUDE.md +89 -0
  24. package/plugins/compound-engineering/LICENSE +21 -0
  25. package/plugins/compound-engineering/README.md +232 -0
  26. package/plugins/compound-engineering/agents/design/design-implementation-reviewer.md +109 -0
  27. package/plugins/compound-engineering/agents/design/design-iterator.md +224 -0
  28. package/plugins/compound-engineering/agents/design/figma-design-sync.md +190 -0
  29. package/plugins/compound-engineering/agents/docs/ankane-readme-writer.md +65 -0
  30. package/plugins/compound-engineering/agents/research/best-practices-researcher.md +126 -0
  31. package/plugins/compound-engineering/agents/research/framework-docs-researcher.md +106 -0
  32. package/plugins/compound-engineering/agents/research/git-history-analyzer.md +59 -0
  33. package/plugins/compound-engineering/agents/research/learnings-researcher.md +264 -0
  34. package/plugins/compound-engineering/agents/research/repo-research-analyst.md +135 -0
  35. package/plugins/compound-engineering/agents/review/agent-native-reviewer.md +261 -0
  36. package/plugins/compound-engineering/agents/review/architecture-strategist.md +67 -0
  37. package/plugins/compound-engineering/agents/review/code-simplicity-reviewer.md +101 -0
  38. package/plugins/compound-engineering/agents/review/data-integrity-guardian.md +85 -0
  39. package/plugins/compound-engineering/agents/review/data-migration-expert.md +112 -0
  40. package/plugins/compound-engineering/agents/review/deployment-verification-agent.md +174 -0
  41. package/plugins/compound-engineering/agents/review/dhh-rails-reviewer.md +66 -0
  42. package/plugins/compound-engineering/agents/review/julik-frontend-races-reviewer.md +221 -0
  43. package/plugins/compound-engineering/agents/review/kieran-python-reviewer.md +133 -0
  44. package/plugins/compound-engineering/agents/review/kieran-rails-reviewer.md +115 -0
  45. package/plugins/compound-engineering/agents/review/kieran-typescript-reviewer.md +124 -0
  46. package/plugins/compound-engineering/agents/review/pattern-recognition-specialist.md +72 -0
  47. package/plugins/compound-engineering/agents/review/performance-oracle.md +137 -0
  48. package/plugins/compound-engineering/agents/review/schema-drift-detector.md +154 -0
  49. package/plugins/compound-engineering/agents/review/security-sentinel.md +114 -0
  50. package/plugins/compound-engineering/agents/workflow/bug-reproduction-validator.md +82 -0
  51. package/plugins/compound-engineering/agents/workflow/every-style-editor.md +64 -0
  52. package/plugins/compound-engineering/agents/workflow/lint.md +16 -0
  53. package/plugins/compound-engineering/agents/workflow/pr-comment-resolver.md +84 -0
  54. package/plugins/compound-engineering/agents/workflow/spec-flow-analyzer.md +134 -0
  55. package/plugins/compound-engineering/commands/agent-native-audit.md +278 -0
  56. package/plugins/compound-engineering/commands/changelog.md +138 -0
  57. package/plugins/compound-engineering/commands/create-agent-skill.md +9 -0
  58. package/plugins/compound-engineering/commands/deepen-plan.md +546 -0
  59. package/plugins/compound-engineering/commands/deploy-docs.md +113 -0
  60. package/plugins/compound-engineering/commands/feature-video.md +342 -0
  61. package/plugins/compound-engineering/commands/generate_command.md +163 -0
  62. package/plugins/compound-engineering/commands/heal-skill.md +143 -0
  63. package/plugins/compound-engineering/commands/lfg.md +20 -0
  64. package/plugins/compound-engineering/commands/release-docs.md +212 -0
  65. package/plugins/compound-engineering/commands/report-bug.md +151 -0
  66. package/plugins/compound-engineering/commands/reproduce-bug.md +100 -0
  67. package/plugins/compound-engineering/commands/resolve_parallel.md +35 -0
  68. package/plugins/compound-engineering/commands/resolve_todo_parallel.md +37 -0
  69. package/plugins/compound-engineering/commands/slfg.md +32 -0
  70. package/plugins/compound-engineering/commands/technical_review.md +8 -0
  71. package/plugins/compound-engineering/commands/test-browser.md +339 -0
  72. package/plugins/compound-engineering/commands/test-xcode.md +332 -0
  73. package/plugins/compound-engineering/commands/triage.md +311 -0
  74. package/plugins/compound-engineering/commands/workflows/brainstorm.md +124 -0
  75. package/plugins/compound-engineering/commands/workflows/compound.md +239 -0
  76. package/plugins/compound-engineering/commands/workflows/plan.md +551 -0
  77. package/plugins/compound-engineering/commands/workflows/review.md +526 -0
  78. package/plugins/compound-engineering/commands/workflows/work.md +433 -0
  79. package/plugins/compound-engineering/skills/agent-browser/SKILL.md +223 -0
  80. package/plugins/compound-engineering/skills/agent-native-architecture/SKILL.md +435 -0
  81. package/plugins/compound-engineering/skills/agent-native-architecture/references/action-parity-discipline.md +409 -0
  82. package/plugins/compound-engineering/skills/agent-native-architecture/references/agent-execution-patterns.md +467 -0
  83. package/plugins/compound-engineering/skills/agent-native-architecture/references/agent-native-testing.md +582 -0
  84. package/plugins/compound-engineering/skills/agent-native-architecture/references/architecture-patterns.md +478 -0
  85. package/plugins/compound-engineering/skills/agent-native-architecture/references/dynamic-context-injection.md +338 -0
  86. package/plugins/compound-engineering/skills/agent-native-architecture/references/files-universal-interface.md +301 -0
  87. package/plugins/compound-engineering/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +359 -0
  88. package/plugins/compound-engineering/skills/agent-native-architecture/references/mcp-tool-design.md +506 -0
  89. package/plugins/compound-engineering/skills/agent-native-architecture/references/mobile-patterns.md +871 -0
  90. package/plugins/compound-engineering/skills/agent-native-architecture/references/product-implications.md +443 -0
  91. package/plugins/compound-engineering/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +317 -0
  92. package/plugins/compound-engineering/skills/agent-native-architecture/references/self-modification.md +269 -0
  93. package/plugins/compound-engineering/skills/agent-native-architecture/references/shared-workspace-architecture.md +680 -0
  94. package/plugins/compound-engineering/skills/agent-native-architecture/references/system-prompt-design.md +250 -0
  95. package/plugins/compound-engineering/skills/andrew-kane-gem-writer/SKILL.md +184 -0
  96. package/plugins/compound-engineering/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
  97. package/plugins/compound-engineering/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
  98. package/plugins/compound-engineering/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
  99. package/plugins/compound-engineering/skills/andrew-kane-gem-writer/references/resources.md +119 -0
  100. package/plugins/compound-engineering/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
  101. package/plugins/compound-engineering/skills/brainstorming/SKILL.md +190 -0
  102. package/plugins/compound-engineering/skills/compound-docs/SKILL.md +511 -0
  103. package/plugins/compound-engineering/skills/compound-docs/assets/critical-pattern-template.md +34 -0
  104. package/plugins/compound-engineering/skills/compound-docs/assets/resolution-template.md +93 -0
  105. package/plugins/compound-engineering/skills/compound-docs/references/yaml-schema.md +65 -0
  106. package/plugins/compound-engineering/skills/compound-docs/schema.yaml +176 -0
  107. package/plugins/compound-engineering/skills/create-agent-skills/SKILL.md +275 -0
  108. package/plugins/compound-engineering/skills/create-agent-skills/references/api-security.md +226 -0
  109. package/plugins/compound-engineering/skills/create-agent-skills/references/be-clear-and-direct.md +531 -0
  110. package/plugins/compound-engineering/skills/create-agent-skills/references/best-practices.md +404 -0
  111. package/plugins/compound-engineering/skills/create-agent-skills/references/common-patterns.md +595 -0
  112. package/plugins/compound-engineering/skills/create-agent-skills/references/core-principles.md +437 -0
  113. package/plugins/compound-engineering/skills/create-agent-skills/references/executable-code.md +175 -0
  114. package/plugins/compound-engineering/skills/create-agent-skills/references/iteration-and-testing.md +474 -0
  115. package/plugins/compound-engineering/skills/create-agent-skills/references/official-spec.md +134 -0
  116. package/plugins/compound-engineering/skills/create-agent-skills/references/recommended-structure.md +168 -0
  117. package/plugins/compound-engineering/skills/create-agent-skills/references/skill-structure.md +152 -0
  118. package/plugins/compound-engineering/skills/create-agent-skills/references/using-scripts.md +113 -0
  119. package/plugins/compound-engineering/skills/create-agent-skills/references/using-templates.md +112 -0
  120. package/plugins/compound-engineering/skills/create-agent-skills/references/workflows-and-validation.md +510 -0
  121. package/plugins/compound-engineering/skills/create-agent-skills/templates/router-skill.md +73 -0
  122. package/plugins/compound-engineering/skills/create-agent-skills/templates/simple-skill.md +33 -0
  123. package/plugins/compound-engineering/skills/create-agent-skills/workflows/add-reference.md +96 -0
  124. package/plugins/compound-engineering/skills/create-agent-skills/workflows/add-script.md +93 -0
  125. package/plugins/compound-engineering/skills/create-agent-skills/workflows/add-template.md +74 -0
  126. package/plugins/compound-engineering/skills/create-agent-skills/workflows/add-workflow.md +120 -0
  127. package/plugins/compound-engineering/skills/create-agent-skills/workflows/audit-skill.md +138 -0
  128. package/plugins/compound-engineering/skills/create-agent-skills/workflows/create-domain-expertise-skill.md +605 -0
  129. package/plugins/compound-engineering/skills/create-agent-skills/workflows/create-new-skill.md +191 -0
  130. package/plugins/compound-engineering/skills/create-agent-skills/workflows/get-guidance.md +121 -0
  131. package/plugins/compound-engineering/skills/create-agent-skills/workflows/upgrade-to-router.md +161 -0
  132. package/plugins/compound-engineering/skills/create-agent-skills/workflows/verify-skill.md +204 -0
  133. package/plugins/compound-engineering/skills/dhh-rails-style/SKILL.md +185 -0
  134. package/plugins/compound-engineering/skills/dhh-rails-style/references/architecture.md +653 -0
  135. package/plugins/compound-engineering/skills/dhh-rails-style/references/controllers.md +303 -0
  136. package/plugins/compound-engineering/skills/dhh-rails-style/references/frontend.md +510 -0
  137. package/plugins/compound-engineering/skills/dhh-rails-style/references/gems.md +266 -0
  138. package/plugins/compound-engineering/skills/dhh-rails-style/references/models.md +359 -0
  139. package/plugins/compound-engineering/skills/dhh-rails-style/references/testing.md +338 -0
  140. package/plugins/compound-engineering/skills/document-review/SKILL.md +87 -0
  141. package/plugins/compound-engineering/skills/dspy-ruby/SKILL.md +737 -0
  142. package/plugins/compound-engineering/skills/dspy-ruby/assets/config-template.rb +187 -0
  143. package/plugins/compound-engineering/skills/dspy-ruby/assets/module-template.rb +300 -0
  144. package/plugins/compound-engineering/skills/dspy-ruby/assets/signature-template.rb +221 -0
  145. package/plugins/compound-engineering/skills/dspy-ruby/references/core-concepts.md +674 -0
  146. package/plugins/compound-engineering/skills/dspy-ruby/references/observability.md +366 -0
  147. package/plugins/compound-engineering/skills/dspy-ruby/references/optimization.md +603 -0
  148. package/plugins/compound-engineering/skills/dspy-ruby/references/providers.md +418 -0
  149. package/plugins/compound-engineering/skills/dspy-ruby/references/toolsets.md +502 -0
  150. package/plugins/compound-engineering/skills/every-style-editor/SKILL.md +134 -0
  151. package/plugins/compound-engineering/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
  152. package/plugins/compound-engineering/skills/file-todos/SKILL.md +252 -0
  153. package/plugins/compound-engineering/skills/file-todos/assets/todo-template.md +155 -0
  154. package/plugins/compound-engineering/skills/frontend-design/SKILL.md +42 -0
  155. package/plugins/compound-engineering/skills/gemini-imagegen/SKILL.md +237 -0
  156. package/plugins/compound-engineering/skills/gemini-imagegen/requirements.txt +2 -0
  157. package/plugins/compound-engineering/skills/gemini-imagegen/scripts/compose_images.py +157 -0
  158. package/plugins/compound-engineering/skills/gemini-imagegen/scripts/edit_image.py +144 -0
  159. package/plugins/compound-engineering/skills/gemini-imagegen/scripts/gemini_images.py +263 -0
  160. package/plugins/compound-engineering/skills/gemini-imagegen/scripts/generate_image.py +133 -0
  161. package/plugins/compound-engineering/skills/gemini-imagegen/scripts/multi_turn_chat.py +216 -0
  162. package/plugins/compound-engineering/skills/git-worktree/SKILL.md +302 -0
  163. package/plugins/compound-engineering/skills/git-worktree/scripts/worktree-manager.sh +337 -0
  164. package/plugins/compound-engineering/skills/orchestrating-swarms/SKILL.md +1718 -0
  165. package/plugins/compound-engineering/skills/rclone/SKILL.md +150 -0
  166. package/plugins/compound-engineering/skills/rclone/scripts/check_setup.sh +60 -0
  167. package/plugins/compound-engineering/skills/resolve-pr-parallel/SKILL.md +89 -0
  168. package/plugins/compound-engineering/skills/resolve-pr-parallel/scripts/get-pr-comments +68 -0
  169. package/plugins/compound-engineering/skills/resolve-pr-parallel/scripts/resolve-pr-thread +23 -0
  170. package/plugins/compound-engineering/skills/skill-creator/SKILL.md +210 -0
  171. package/plugins/compound-engineering/skills/skill-creator/scripts/init_skill.py +303 -0
  172. package/plugins/compound-engineering/skills/skill-creator/scripts/package_skill.py +110 -0
  173. package/plugins/compound-engineering/skills/skill-creator/scripts/quick_validate.py +65 -0
  174. package/prompts/deepen-plan.md +549 -0
  175. package/prompts/feature-video.md +341 -0
  176. package/prompts/resolve_todo_parallel.md +36 -0
  177. package/prompts/test-browser.md +342 -0
  178. package/prompts/workflows-brainstorm.md +123 -0
  179. package/prompts/workflows-compound.md +238 -0
  180. package/prompts/workflows-plan.md +550 -0
  181. package/prompts/workflows-review.md +529 -0
  182. package/prompts/workflows-work.md +432 -0
  183. package/skills/agent-browser/SKILL.md +223 -0
  184. package/skills/agent-native-architecture/SKILL.md +435 -0
  185. package/skills/agent-native-architecture/references/action-parity-discipline.md +409 -0
  186. package/skills/agent-native-architecture/references/agent-execution-patterns.md +467 -0
  187. package/skills/agent-native-architecture/references/agent-native-testing.md +582 -0
  188. package/skills/agent-native-architecture/references/architecture-patterns.md +478 -0
  189. package/skills/agent-native-architecture/references/dynamic-context-injection.md +338 -0
  190. package/skills/agent-native-architecture/references/files-universal-interface.md +301 -0
  191. package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +359 -0
  192. package/skills/agent-native-architecture/references/mcp-tool-design.md +506 -0
  193. package/skills/agent-native-architecture/references/mobile-patterns.md +871 -0
  194. package/skills/agent-native-architecture/references/product-implications.md +443 -0
  195. package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +317 -0
  196. package/skills/agent-native-architecture/references/self-modification.md +269 -0
  197. package/skills/agent-native-architecture/references/shared-workspace-architecture.md +680 -0
  198. package/skills/agent-native-architecture/references/system-prompt-design.md +250 -0
  199. package/skills/agent-native-reviewer/SKILL.md +260 -0
  200. package/skills/andrew-kane-gem-writer/SKILL.md +184 -0
  201. package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
  202. package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
  203. package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
  204. package/skills/andrew-kane-gem-writer/references/resources.md +119 -0
  205. package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
  206. package/skills/ankane-readme-writer/SKILL.md +63 -0
  207. package/skills/architecture-strategist/SKILL.md +66 -0
  208. package/skills/best-practices-researcher/SKILL.md +125 -0
  209. package/skills/brainstorming/SKILL.md +190 -0
  210. package/skills/bug-reproduction-validator/SKILL.md +81 -0
  211. package/skills/code-simplicity-reviewer/SKILL.md +100 -0
  212. package/skills/compound-docs/SKILL.md +511 -0
  213. package/skills/compound-docs/assets/critical-pattern-template.md +34 -0
  214. package/skills/compound-docs/assets/resolution-template.md +93 -0
  215. package/skills/compound-docs/references/yaml-schema.md +65 -0
  216. package/skills/compound-docs/schema.yaml +176 -0
  217. package/skills/create-agent-skills/SKILL.md +275 -0
  218. package/skills/create-agent-skills/references/api-security.md +226 -0
  219. package/skills/create-agent-skills/references/be-clear-and-direct.md +531 -0
  220. package/skills/create-agent-skills/references/best-practices.md +404 -0
  221. package/skills/create-agent-skills/references/common-patterns.md +595 -0
  222. package/skills/create-agent-skills/references/core-principles.md +437 -0
  223. package/skills/create-agent-skills/references/executable-code.md +175 -0
  224. package/skills/create-agent-skills/references/iteration-and-testing.md +474 -0
  225. package/skills/create-agent-skills/references/official-spec.md +134 -0
  226. package/skills/create-agent-skills/references/recommended-structure.md +168 -0
  227. package/skills/create-agent-skills/references/skill-structure.md +152 -0
  228. package/skills/create-agent-skills/references/using-scripts.md +113 -0
  229. package/skills/create-agent-skills/references/using-templates.md +112 -0
  230. package/skills/create-agent-skills/references/workflows-and-validation.md +510 -0
  231. package/skills/create-agent-skills/templates/router-skill.md +73 -0
  232. package/skills/create-agent-skills/templates/simple-skill.md +33 -0
  233. package/skills/create-agent-skills/workflows/add-reference.md +96 -0
  234. package/skills/create-agent-skills/workflows/add-script.md +93 -0
  235. package/skills/create-agent-skills/workflows/add-template.md +74 -0
  236. package/skills/create-agent-skills/workflows/add-workflow.md +120 -0
  237. package/skills/create-agent-skills/workflows/audit-skill.md +138 -0
  238. package/skills/create-agent-skills/workflows/create-domain-expertise-skill.md +605 -0
  239. package/skills/create-agent-skills/workflows/create-new-skill.md +191 -0
  240. package/skills/create-agent-skills/workflows/get-guidance.md +121 -0
  241. package/skills/create-agent-skills/workflows/upgrade-to-router.md +161 -0
  242. package/skills/create-agent-skills/workflows/verify-skill.md +204 -0
  243. package/skills/data-integrity-guardian/SKILL.md +84 -0
  244. package/skills/data-migration-expert/SKILL.md +111 -0
  245. package/skills/deployment-verification-agent/SKILL.md +173 -0
  246. package/skills/design-implementation-reviewer/SKILL.md +107 -0
  247. package/skills/design-iterator/SKILL.md +222 -0
  248. package/skills/dhh-rails-reviewer/SKILL.md +65 -0
  249. package/skills/dhh-rails-style/SKILL.md +185 -0
  250. package/skills/dhh-rails-style/references/architecture.md +653 -0
  251. package/skills/dhh-rails-style/references/controllers.md +303 -0
  252. package/skills/dhh-rails-style/references/frontend.md +510 -0
  253. package/skills/dhh-rails-style/references/gems.md +266 -0
  254. package/skills/dhh-rails-style/references/models.md +359 -0
  255. package/skills/dhh-rails-style/references/testing.md +338 -0
  256. package/skills/document-review/SKILL.md +87 -0
  257. package/skills/dspy-ruby/SKILL.md +737 -0
  258. package/skills/dspy-ruby/assets/config-template.rb +187 -0
  259. package/skills/dspy-ruby/assets/module-template.rb +300 -0
  260. package/skills/dspy-ruby/assets/signature-template.rb +221 -0
  261. package/skills/dspy-ruby/references/core-concepts.md +674 -0
  262. package/skills/dspy-ruby/references/observability.md +366 -0
  263. package/skills/dspy-ruby/references/optimization.md +603 -0
  264. package/skills/dspy-ruby/references/providers.md +418 -0
  265. package/skills/dspy-ruby/references/toolsets.md +502 -0
  266. package/skills/every-style-editor/SKILL.md +134 -0
  267. package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
  268. package/skills/every-style-editor-2/SKILL.md +62 -0
  269. package/skills/figma-design-sync/SKILL.md +188 -0
  270. package/skills/file-todos/SKILL.md +252 -0
  271. package/skills/file-todos/assets/todo-template.md +155 -0
  272. package/skills/framework-docs-researcher/SKILL.md +105 -0
  273. package/skills/frontend-design/SKILL.md +42 -0
  274. package/skills/gemini-imagegen/SKILL.md +237 -0
  275. package/skills/gemini-imagegen/requirements.txt +2 -0
  276. package/skills/gemini-imagegen/scripts/compose_images.py +157 -0
  277. package/skills/gemini-imagegen/scripts/edit_image.py +144 -0
  278. package/skills/gemini-imagegen/scripts/gemini_images.py +263 -0
  279. package/skills/gemini-imagegen/scripts/generate_image.py +133 -0
  280. package/skills/gemini-imagegen/scripts/multi_turn_chat.py +216 -0
  281. package/skills/git-history-analyzer/SKILL.md +58 -0
  282. package/skills/git-worktree/SKILL.md +302 -0
  283. package/skills/git-worktree/scripts/worktree-manager.sh +337 -0
  284. package/skills/julik-frontend-races-reviewer/SKILL.md +220 -0
  285. package/skills/kieran-python-reviewer/SKILL.md +132 -0
  286. package/skills/kieran-rails-reviewer/SKILL.md +114 -0
  287. package/skills/kieran-typescript-reviewer/SKILL.md +123 -0
  288. package/skills/learnings-researcher/SKILL.md +263 -0
  289. package/skills/lint/SKILL.md +14 -0
  290. package/skills/orchestrating-swarms/SKILL.md +1718 -0
  291. package/skills/pattern-recognition-specialist/SKILL.md +71 -0
  292. package/skills/performance-oracle/SKILL.md +136 -0
  293. package/skills/pr-comment-resolver/SKILL.md +82 -0
  294. package/skills/rclone/SKILL.md +150 -0
  295. package/skills/rclone/scripts/check_setup.sh +60 -0
  296. package/skills/repo-research-analyst/SKILL.md +134 -0
  297. package/skills/resolve_pr_parallel/SKILL.md +89 -0
  298. package/skills/resolve_pr_parallel/scripts/get-pr-comments +68 -0
  299. package/skills/resolve_pr_parallel/scripts/resolve-pr-thread +23 -0
  300. package/skills/schema-drift-detector/SKILL.md +153 -0
  301. package/skills/security-sentinel/SKILL.md +113 -0
  302. package/skills/skill-creator/SKILL.md +210 -0
  303. package/skills/skill-creator/scripts/init_skill.py +303 -0
  304. package/skills/skill-creator/scripts/package_skill.py +110 -0
  305. package/skills/skill-creator/scripts/quick_validate.py +65 -0
  306. package/skills/spec-flow-analyzer/SKILL.md +133 -0
  307. package/src/commands/convert.ts +183 -0
  308. package/src/commands/install.ts +273 -0
  309. package/src/commands/list.ts +37 -0
  310. package/src/commands/sync.ts +89 -0
  311. package/src/converters/claude-to-codex.ts +182 -0
  312. package/src/converters/claude-to-opencode.ts +395 -0
  313. package/src/converters/claude-to-pi.ts +205 -0
  314. package/src/index.ts +22 -0
  315. package/src/parsers/claude-home.ts +65 -0
  316. package/src/parsers/claude.ts +252 -0
  317. package/src/sync/codex.ts +92 -0
  318. package/src/sync/opencode.ts +75 -0
  319. package/src/sync/pi.ts +88 -0
  320. package/src/targets/codex.ts +96 -0
  321. package/src/targets/index.ts +38 -0
  322. package/src/targets/opencode.ts +57 -0
  323. package/src/targets/pi.ts +131 -0
  324. package/src/templates/pi/compat-extension.ts +452 -0
  325. package/src/types/claude.ts +90 -0
  326. package/src/types/codex.ts +23 -0
  327. package/src/types/opencode.ts +54 -0
  328. package/src/types/pi.ts +40 -0
  329. package/src/utils/codex-agents.ts +64 -0
  330. package/src/utils/files.ts +77 -0
  331. package/src/utils/frontmatter.ts +65 -0
  332. package/src/utils/symlink.ts +43 -0
@@ -0,0 +1,603 @@
1
+ # DSPy.rb Optimization
2
+
3
+ ## MIPROv2
4
+
5
+ MIPROv2 (Multi-prompt Instruction Proposal with Retrieval Optimization) is the primary instruction tuner in DSPy.rb. It proposes new instructions and few-shot demonstrations per predictor, evaluates them on mini-batches, and retains candidates that improve the metric. It ships as a separate gem to keep the Gaussian Process dependency tree out of apps that do not need it.
6
+
7
+ ### Installation
8
+
9
+ ```ruby
10
+ # Gemfile
11
+ gem "dspy"
12
+ gem "dspy-miprov2"
13
+ ```
14
+
15
+ Bundler auto-requires `dspy/miprov2`. No additional `require` statement is needed.
16
+
17
+ ### AutoMode presets
18
+
19
+ Use `DSPy::Teleprompt::MIPROv2::AutoMode` for preconfigured optimizers:
20
+
21
+ ```ruby
22
+ light = DSPy::Teleprompt::MIPROv2::AutoMode.light(metric: metric) # 6 trials, greedy
23
+ medium = DSPy::Teleprompt::MIPROv2::AutoMode.medium(metric: metric) # 12 trials, adaptive
24
+ heavy = DSPy::Teleprompt::MIPROv2::AutoMode.heavy(metric: metric) # 18 trials, Bayesian
25
+ ```
26
+
27
+ | Preset | Trials | Strategy | Use case |
28
+ |----------|--------|------------|-----------------------------------------------------|
29
+ | `light` | 6 | `:greedy` | Quick wins on small datasets or during prototyping. |
30
+ | `medium` | 12 | `:adaptive`| Balanced exploration vs. runtime for most pilots. |
31
+ | `heavy` | 18 | `:bayesian`| Highest accuracy targets or multi-stage programs. |
32
+
33
+ ### Manual configuration with dry-configurable
34
+
35
+ `DSPy::Teleprompt::MIPROv2` includes `Dry::Configurable`. Configure at the class level (defaults for all instances) or instance level (overrides class defaults).
36
+
37
+ **Class-level defaults:**
38
+
39
+ ```ruby
40
+ DSPy::Teleprompt::MIPROv2.configure do |config|
41
+ config.optimization_strategy = :bayesian
42
+ config.num_trials = 30
43
+ config.bootstrap_sets = 10
44
+ end
45
+ ```
46
+
47
+ **Instance-level overrides:**
48
+
49
+ ```ruby
50
+ optimizer = DSPy::Teleprompt::MIPROv2.new(metric: metric)
51
+ optimizer.configure do |config|
52
+ config.num_trials = 15
53
+ config.num_instruction_candidates = 6
54
+ config.bootstrap_sets = 5
55
+ config.max_bootstrapped_examples = 4
56
+ config.max_labeled_examples = 16
57
+ config.optimization_strategy = :adaptive # :greedy, :adaptive, :bayesian
58
+ config.early_stopping_patience = 3
59
+ config.init_temperature = 1.0
60
+ config.final_temperature = 0.1
61
+ config.minibatch_size = nil # nil = auto
62
+ config.auto_seed = 42
63
+ end
64
+ ```
65
+
66
+ The `optimization_strategy` setting accepts symbols (`:greedy`, `:adaptive`, `:bayesian`) and coerces them internally to `DSPy::Teleprompt::OptimizationStrategy` T::Enum values.
67
+
68
+ The old `config:` constructor parameter is removed. Passing `config:` raises `ArgumentError`.
69
+
70
+ ### Auto presets via configure
71
+
72
+ Instead of `AutoMode`, set the preset through the configure block:
73
+
74
+ ```ruby
75
+ optimizer = DSPy::Teleprompt::MIPROv2.new(metric: metric)
76
+ optimizer.configure do |config|
77
+ config.auto_preset = DSPy::Teleprompt::AutoPreset.deserialize("medium")
78
+ end
79
+ ```
80
+
81
+ ### Compile and inspect
82
+
83
+ ```ruby
84
+ program = DSPy::Predict.new(MySignature)
85
+
86
+ result = optimizer.compile(
87
+ program,
88
+ trainset: train_examples,
89
+ valset: val_examples
90
+ )
91
+
92
+ optimized_program = result.optimized_program
93
+ puts "Best score: #{result.best_score_value}"
94
+ ```
95
+
96
+ The `result` object exposes:
97
+ - `optimized_program` -- ready-to-use predictor with updated instruction and demos.
98
+ - `optimization_trace[:trial_logs]` -- per-trial record of instructions, demos, and scores.
99
+ - `metadata[:optimizer]` -- `"MIPROv2"`, useful when persisting experiments from multiple optimizers.
100
+
101
+ ### Multi-stage programs
102
+
103
+ MIPROv2 generates dataset summaries for each predictor and proposes per-stage instructions. For a ReAct agent with `thought_generator` and `observation_processor` predictors, the optimizer handles credit assignment internally. The metric only needs to evaluate the final output.
104
+
105
+ ### Bootstrap sampling
106
+
107
+ During the bootstrap phase MIPROv2:
108
+ 1. Generates dataset summaries from the training set.
109
+ 2. Bootstraps few-shot demonstrations by running the baseline program.
110
+ 3. Proposes candidate instructions grounded in the summaries and bootstrapped examples.
111
+ 4. Evaluates each candidate on mini-batches drawn from the validation set.
112
+
113
+ Control the bootstrap phase with `bootstrap_sets`, `max_bootstrapped_examples`, and `max_labeled_examples`.
114
+
115
+ ### Bayesian optimization
116
+
117
+ When `optimization_strategy` is `:bayesian` (or when using the `heavy` preset), MIPROv2 fits a Gaussian Process surrogate over past trial scores to select the next candidate. This replaces random search with informed exploration, reducing the number of trials needed to find high-scoring instructions.
118
+
119
+ ---
120
+
121
+ ## GEPA
122
+
123
+ GEPA (Genetic-Pareto Reflective Prompt Evolution) is a feedback-driven optimizer. It runs the program on a small batch, collects scores and textual feedback, and asks a reflection LM to rewrite the instruction. Improved candidates are retained on a Pareto frontier.
124
+
125
+ ### Installation
126
+
127
+ ```ruby
128
+ # Gemfile
129
+ gem "dspy"
130
+ gem "dspy-gepa"
131
+ ```
132
+
133
+ The `dspy-gepa` gem depends on the `gepa` core optimizer gem automatically.
134
+
135
+ ### Metric contract
136
+
137
+ GEPA metrics return `DSPy::Prediction` with both a numeric score and a feedback string. Do not return a plain boolean.
138
+
139
+ ```ruby
140
+ metric = lambda do |example, prediction|
141
+ expected = example.expected_values[:label]
142
+ predicted = prediction.label
143
+
144
+ score = predicted == expected ? 1.0 : 0.0
145
+ feedback = if score == 1.0
146
+ "Correct (#{expected}) for: \"#{example.input_values[:text][0..60]}\""
147
+ else
148
+ "Misclassified (expected #{expected}, got #{predicted}) for: \"#{example.input_values[:text][0..60]}\""
149
+ end
150
+
151
+ DSPy::Prediction.new(score: score, feedback: feedback)
152
+ end
153
+ ```
154
+
155
+ Keep the score in `[0, 1]`. Always include a short feedback message explaining what happened -- GEPA hands this text to the reflection model so it can reason about failures.
156
+
157
+ ### Feedback maps
158
+
159
+ `feedback_map` targets individual predictors inside a composite module. Each entry receives keyword arguments and returns a `DSPy::Prediction`:
160
+
161
+ ```ruby
162
+ feedback_map = {
163
+ 'self' => lambda do |predictor_output:, predictor_inputs:, module_inputs:, module_outputs:, captured_trace:|
164
+ expected = module_inputs.expected_values[:label]
165
+ predicted = predictor_output.label
166
+
167
+ DSPy::Prediction.new(
168
+ score: predicted == expected ? 1.0 : 0.0,
169
+ feedback: "Classifier saw \"#{predictor_inputs[:text][0..80]}\" -> #{predicted} (expected #{expected})"
170
+ )
171
+ end
172
+ }
173
+ ```
174
+
175
+ For single-predictor programs, key the map with `'self'`. For multi-predictor chains, add entries per component so the reflection LM sees localized context at each step. Omit `feedback_map` entirely if the top-level metric already covers the basics.
176
+
177
+ ### Configuring the teleprompter
178
+
179
+ ```ruby
180
+ teleprompter = DSPy::Teleprompt::GEPA.new(
181
+ metric: metric,
182
+ reflection_lm: DSPy::ReflectionLM.new('openai/gpt-4o-mini', api_key: ENV['OPENAI_API_KEY']),
183
+ feedback_map: feedback_map,
184
+ config: {
185
+ max_metric_calls: 600,
186
+ minibatch_size: 6,
187
+ skip_perfect_score: false
188
+ }
189
+ )
190
+ ```
191
+
192
+ Key configuration knobs:
193
+
194
+ | Knob | Purpose |
195
+ |----------------------|-------------------------------------------------------------------------------------------|
196
+ | `max_metric_calls` | Hard budget on evaluation calls. Set to at least the validation set size plus a few minibatches. |
197
+ | `minibatch_size` | Examples per reflective replay batch. Smaller = cheaper iterations, noisier scores. |
198
+ | `skip_perfect_score` | Set `true` to stop early when a candidate reaches score `1.0`. |
199
+
200
+ ### Minibatch sizing
201
+
202
+ | Goal | Suggested size | Rationale |
203
+ |-------------------------------------------------|----------------|------------------------------------------------------------|
204
+ | Explore many candidates within a tight budget | 3--6 | Cheap iterations, more prompt variants, noisier metrics. |
205
+ | Stable metrics when each rollout is costly | 8--12 | Smoother scores, fewer candidates unless budget is raised. |
206
+ | Investigate specific failure modes | 3--4 then 8+ | Start with breadth, increase once patterns emerge. |
207
+
208
+ ### Compile and evaluate
209
+
210
+ ```ruby
211
+ program = DSPy::Predict.new(MySignature)
212
+
213
+ result = teleprompter.compile(program, trainset: train, valset: val)
214
+ optimized_program = result.optimized_program
215
+
216
+ test_metrics = evaluate(optimized_program, test)
217
+ ```
218
+
219
+ The `result` object exposes:
220
+ - `optimized_program` -- predictor with updated instruction and few-shot examples.
221
+ - `best_score_value` -- validation score for the best candidate.
222
+ - `metadata` -- candidate counts, trace hashes, and telemetry IDs.
223
+
224
+ ### Reflection LM
225
+
226
+ Swap `DSPy::ReflectionLM` for any callable object that accepts the reflection prompt hash and returns a string. The default reflection signature extracts the new instruction from triple backticks in the response.
227
+
228
+ ### Experiment tracking
229
+
230
+ Plug `GEPA::Logging::ExperimentTracker` into a persistence layer:
231
+
232
+ ```ruby
233
+ tracker = GEPA::Logging::ExperimentTracker.new
234
+ tracker.with_subscriber { |event| MyModel.create!(payload: event) }
235
+
236
+ teleprompter = DSPy::Teleprompt::GEPA.new(
237
+ metric: metric,
238
+ reflection_lm: reflection_lm,
239
+ experiment_tracker: tracker,
240
+ config: { max_metric_calls: 900 }
241
+ )
242
+ ```
243
+
244
+ The tracker emits Pareto update events, merge decisions, and candidate evolution records as JSONL.
245
+
246
+ ### Pareto frontier
247
+
248
+ GEPA maintains a diverse candidate pool and samples from the Pareto frontier instead of mutating only the top-scoring program. This balances exploration and prevents the search from collapsing onto a single lineage.
249
+
250
+ Enable the merge proposer after multiple strong lineages emerge:
251
+
252
+ ```ruby
253
+ config: {
254
+ max_metric_calls: 900,
255
+ enable_merge_proposer: true
256
+ }
257
+ ```
258
+
259
+ Premature merges eat budget without meaningful gains. Gate merge on having several validated candidates first.
260
+
261
+ ### Advanced options
262
+
263
+ - `acceptance_strategy:` -- plug in bespoke Pareto filters or early-stop heuristics.
264
+ - Telemetry spans emit via `GEPA::Telemetry`. Enable global observability with `DSPy.configure { |c| c.observability = true }` to stream spans to an OpenTelemetry exporter.
265
+
266
+ ---
267
+
268
+ ## Evaluation Framework
269
+
270
+ `DSPy::Evals` provides batch evaluation of predictors against test datasets with built-in and custom metrics.
271
+
272
+ ### Basic usage
273
+
274
+ ```ruby
275
+ metric = proc do |example, prediction|
276
+ prediction.answer == example.expected_values[:answer]
277
+ end
278
+
279
+ evaluator = DSPy::Evals.new(predictor, metric: metric)
280
+
281
+ result = evaluator.evaluate(
282
+ test_examples,
283
+ display_table: true,
284
+ display_progress: true
285
+ )
286
+
287
+ puts "Pass rate: #{(result.pass_rate * 100).round(1)}%"
288
+ puts "Passed: #{result.passed_examples}/#{result.total_examples}"
289
+ ```
290
+
291
+ ### DSPy::Example
292
+
293
+ Convert raw data into `DSPy::Example` instances before passing to optimizers or evaluators. Each example carries `input_values` and `expected_values`:
294
+
295
+ ```ruby
296
+ examples = rows.map do |row|
297
+ DSPy::Example.new(
298
+ input_values: { text: row[:text] },
299
+ expected_values: { label: row[:label] }
300
+ )
301
+ end
302
+
303
+ train, val, test = split_examples(examples, train_ratio: 0.6, val_ratio: 0.2, seed: 42)
304
+ ```
305
+
306
+ Hold back a test set from the optimization loop. Optimizers work on train/val; only the test set proves generalization.
307
+
308
+ ### Built-in metrics
309
+
310
+ ```ruby
311
+ # Exact match -- prediction must exactly equal expected value
312
+ metric = DSPy::Metrics.exact_match(field: :answer, case_sensitive: true)
313
+
314
+ # Contains -- prediction must contain expected substring
315
+ metric = DSPy::Metrics.contains(field: :answer, case_sensitive: false)
316
+
317
+ # Numeric difference -- numeric output within tolerance
318
+ metric = DSPy::Metrics.numeric_difference(field: :answer, tolerance: 0.01)
319
+
320
+ # Composite AND -- all sub-metrics must pass
321
+ metric = DSPy::Metrics.composite_and(
322
+ DSPy::Metrics.exact_match(field: :answer),
323
+ DSPy::Metrics.contains(field: :reasoning)
324
+ )
325
+ ```
326
+
327
+ ### Custom metrics
328
+
329
+ ```ruby
330
+ quality_metric = lambda do |example, prediction|
331
+ return false unless prediction
332
+
333
+ score = 0.0
334
+ score += 0.5 if prediction.answer == example.expected_values[:answer]
335
+ score += 0.3 if prediction.explanation && prediction.explanation.length > 50
336
+ score += 0.2 if prediction.confidence && prediction.confidence > 0.8
337
+ score >= 0.7
338
+ end
339
+
340
+ evaluator = DSPy::Evals.new(predictor, metric: quality_metric)
341
+ ```
342
+
343
+ Access prediction fields with dot notation (`prediction.answer`), not hash notation.
344
+
345
+ ### Observability hooks
346
+
347
+ Register callbacks without editing the evaluator:
348
+
349
+ ```ruby
350
+ DSPy::Evals.before_example do |payload|
351
+ example = payload[:example]
352
+ DSPy.logger.info("Evaluating example #{example.id}") if example.respond_to?(:id)
353
+ end
354
+
355
+ DSPy::Evals.after_batch do |payload|
356
+ result = payload[:result]
357
+ Langfuse.event(
358
+ name: 'eval.batch',
359
+ metadata: {
360
+ total: result.total_examples,
361
+ passed: result.passed_examples,
362
+ score: result.score
363
+ }
364
+ )
365
+ end
366
+ ```
367
+
368
+ Available hooks: `before_example`, `after_example`, `before_batch`, `after_batch`.
369
+
370
+ ### Langfuse score export
371
+
372
+ Enable `export_scores: true` to emit `score.create` events for each evaluated example and a batch score at the end:
373
+
374
+ ```ruby
375
+ evaluator = DSPy::Evals.new(
376
+ predictor,
377
+ metric: metric,
378
+ export_scores: true,
379
+ score_name: 'qa_accuracy' # default: 'evaluation'
380
+ )
381
+
382
+ result = evaluator.evaluate(test_examples)
383
+ # Emits per-example scores + overall batch score via DSPy::Scores::Exporter
384
+ ```
385
+
386
+ Scores attach to the current trace context automatically and flow to Langfuse asynchronously.
387
+
388
+ ### Evaluation results
389
+
390
+ ```ruby
391
+ result = evaluator.evaluate(test_examples)
392
+
393
+ result.score # Overall score (0.0 to 1.0)
394
+ result.passed_count # Examples that passed
395
+ result.failed_count # Examples that failed
396
+ result.error_count # Examples that errored
397
+
398
+ result.results.each do |r|
399
+ r.passed # Boolean
400
+ r.score # Numeric score
401
+ r.error # Error message if the example errored
402
+ end
403
+ ```
404
+
405
+ ### Integration with optimizers
406
+
407
+ ```ruby
408
+ metric = proc do |example, prediction|
409
+ expected = example.expected_values[:answer].to_s.strip.downcase
410
+ predicted = prediction.answer.to_s.strip.downcase
411
+ !expected.empty? && predicted.include?(expected)
412
+ end
413
+
414
+ optimizer = DSPy::Teleprompt::MIPROv2::AutoMode.medium(metric: metric)
415
+
416
+ result = optimizer.compile(
417
+ DSPy::Predict.new(QASignature),
418
+ trainset: train_examples,
419
+ valset: val_examples
420
+ )
421
+
422
+ evaluator = DSPy::Evals.new(result.optimized_program, metric: metric)
423
+ test_result = evaluator.evaluate(test_examples, display_table: true)
424
+ puts "Test accuracy: #{(test_result.pass_rate * 100).round(2)}%"
425
+ ```
426
+
427
+ ---
428
+
429
+ ## Storage System
430
+
431
+ `DSPy::Storage` persists optimization results, tracks history, and manages multiple versions of optimized programs.
432
+
433
+ ### ProgramStorage (low-level)
434
+
435
+ ```ruby
436
+ storage = DSPy::Storage::ProgramStorage.new(storage_path: "./dspy_storage")
437
+
438
+ # Save
439
+ saved = storage.save_program(
440
+ result.optimized_program,
441
+ result,
442
+ metadata: {
443
+ signature_class: 'ClassifyText',
444
+ optimizer: 'MIPROv2',
445
+ examples_count: examples.size
446
+ }
447
+ )
448
+ puts "Stored with ID: #{saved.program_id}"
449
+
450
+ # Load
451
+ saved = storage.load_program(program_id)
452
+ predictor = saved.program
453
+ score = saved.optimization_result[:best_score_value]
454
+
455
+ # List
456
+ storage.list_programs.each do |p|
457
+ puts "#{p[:program_id]} -- score: #{p[:best_score]} -- saved: #{p[:saved_at]}"
458
+ end
459
+ ```
460
+
461
+ ### StorageManager (recommended)
462
+
463
+ ```ruby
464
+ manager = DSPy::Storage::StorageManager.new
465
+
466
+ # Save with tags
467
+ saved = manager.save_optimization_result(
468
+ result,
469
+ tags: ['production', 'sentiment-analysis'],
470
+ description: 'Optimized sentiment classifier v2'
471
+ )
472
+
473
+ # Find programs
474
+ programs = manager.find_programs(
475
+ optimizer: 'MIPROv2',
476
+ min_score: 0.85,
477
+ tags: ['production']
478
+ )
479
+
480
+ recent = manager.find_programs(
481
+ max_age_days: 7,
482
+ signature_class: 'ClassifyText'
483
+ )
484
+
485
+ # Get best program for a signature
486
+ best = manager.get_best_program('ClassifyText')
487
+ predictor = best.program
488
+ ```
489
+
490
+ Global shorthand:
491
+
492
+ ```ruby
493
+ DSPy::Storage::StorageManager.save(result, metadata: { version: '2.0' })
494
+ DSPy::Storage::StorageManager.load(program_id)
495
+ DSPy::Storage::StorageManager.best('ClassifyText')
496
+ ```
497
+
498
+ ### Checkpoints
499
+
500
+ Create and restore checkpoints during long-running optimizations:
501
+
502
+ ```ruby
503
+ # Save a checkpoint
504
+ manager.create_checkpoint(
505
+ current_result,
506
+ 'iteration_50',
507
+ metadata: { iteration: 50, current_score: 0.87 }
508
+ )
509
+
510
+ # Restore
511
+ restored = manager.restore_checkpoint('iteration_50')
512
+ program = restored.program
513
+
514
+ # Auto-checkpoint every N iterations
515
+ if iteration % 10 == 0
516
+ manager.create_checkpoint(current_result, "auto_checkpoint_#{iteration}")
517
+ end
518
+ ```
519
+
520
+ ### Import and export
521
+
522
+ Share programs between environments:
523
+
524
+ ```ruby
525
+ storage = DSPy::Storage::ProgramStorage.new
526
+
527
+ # Export
528
+ storage.export_programs(['abc123', 'def456'], './export_backup.json')
529
+
530
+ # Import
531
+ imported = storage.import_programs('./export_backup.json')
532
+ puts "Imported #{imported.size} programs"
533
+ ```
534
+
535
+ ### Optimization history
536
+
537
+ ```ruby
538
+ history = manager.get_optimization_history
539
+
540
+ history[:summary][:total_programs]
541
+ history[:summary][:avg_score]
542
+
543
+ history[:optimizer_stats].each do |optimizer, stats|
544
+ puts "#{optimizer}: #{stats[:count]} programs, best: #{stats[:best_score]}"
545
+ end
546
+
547
+ history[:trends][:improvement_percentage]
548
+ ```
549
+
550
+ ### Program comparison
551
+
552
+ ```ruby
553
+ comparison = manager.compare_programs(id_a, id_b)
554
+ comparison[:comparison][:score_difference]
555
+ comparison[:comparison][:better_program]
556
+ comparison[:comparison][:age_difference_hours]
557
+ ```
558
+
559
+ ### Storage configuration
560
+
561
+ ```ruby
562
+ config = DSPy::Storage::StorageManager::StorageConfig.new
563
+ config.storage_path = Rails.root.join('dspy_storage')
564
+ config.auto_save = true
565
+ config.save_intermediate_results = false
566
+ config.max_stored_programs = 100
567
+
568
+ manager = DSPy::Storage::StorageManager.new(config: config)
569
+ ```
570
+
571
+ ### Cleanup
572
+
573
+ Remove old programs. Cleanup retains the best performing and most recent programs using a weighted score (70% performance, 30% recency):
574
+
575
+ ```ruby
576
+ deleted_count = manager.cleanup_old_programs
577
+ ```
578
+
579
+ ### Storage events
580
+
581
+ The storage system emits structured log events for monitoring:
582
+ - `dspy.storage.save_start`, `dspy.storage.save_complete`, `dspy.storage.save_error`
583
+ - `dspy.storage.load_start`, `dspy.storage.load_complete`, `dspy.storage.load_error`
584
+ - `dspy.storage.delete`, `dspy.storage.export`, `dspy.storage.import`, `dspy.storage.cleanup`
585
+
586
+ ### File layout
587
+
588
+ ```
589
+ dspy_storage/
590
+ programs/
591
+ abc123def456.json
592
+ 789xyz012345.json
593
+ history.json
594
+ ```
595
+
596
+ ---
597
+
598
+ ## API rules
599
+
600
+ - Call predictors with `.call()`, not `.forward()`.
601
+ - Access prediction fields with dot notation (`result.answer`), not hash notation (`result[:answer]`).
602
+ - GEPA metrics return `DSPy::Prediction.new(score:, feedback:)`, not a boolean.
603
+ - MIPROv2 metrics may return `true`/`false`, a numeric score, or `DSPy::Prediction`.