@lavralabs/lavra 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (452) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/bin/install.js +302 -0
  4. package/bin/plan-export.js +300 -0
  5. package/bin/plan-view.js +695 -0
  6. package/install.sh +136 -0
  7. package/package.json +28 -0
  8. package/plugins/lavra/.claude-plugin/plugin.json +22 -0
  9. package/plugins/lavra/.mcp.json +8 -0
  10. package/plugins/lavra/README.md +125 -0
  11. package/plugins/lavra/agents/design/design-implementation-reviewer.md +123 -0
  12. package/plugins/lavra/agents/design/design-iterator.md +219 -0
  13. package/plugins/lavra/agents/design/figma-design-sync.md +212 -0
  14. package/plugins/lavra/agents/docs/ankane-readme-writer.md +90 -0
  15. package/plugins/lavra/agents/research/best-practices-researcher.md +131 -0
  16. package/plugins/lavra/agents/research/framework-docs-researcher.md +111 -0
  17. package/plugins/lavra/agents/research/git-history-analyzer.md +73 -0
  18. package/plugins/lavra/agents/research/learnings-researcher.md +255 -0
  19. package/plugins/lavra/agents/research/repo-research-analyst.md +157 -0
  20. package/plugins/lavra/agents/review/agent-native-reviewer.md +274 -0
  21. package/plugins/lavra/agents/review/architecture-strategist.md +82 -0
  22. package/plugins/lavra/agents/review/code-simplicity-reviewer.md +109 -0
  23. package/plugins/lavra/agents/review/data-integrity-guardian.md +89 -0
  24. package/plugins/lavra/agents/review/data-migration-expert.md +118 -0
  25. package/plugins/lavra/agents/review/deployment-verification-agent.md +178 -0
  26. package/plugins/lavra/agents/review/dhh-rails-reviewer.md +94 -0
  27. package/plugins/lavra/agents/review/goal-verifier.md +109 -0
  28. package/plugins/lavra/agents/review/julik-frontend-races-reviewer.md +239 -0
  29. package/plugins/lavra/agents/review/kieran-python-reviewer.md +148 -0
  30. package/plugins/lavra/agents/review/kieran-rails-reviewer.md +130 -0
  31. package/plugins/lavra/agents/review/kieran-typescript-reviewer.md +139 -0
  32. package/plugins/lavra/agents/review/migration-drift-detector.md +307 -0
  33. package/plugins/lavra/agents/review/pattern-recognition-specialist.md +87 -0
  34. package/plugins/lavra/agents/review/performance-oracle.md +154 -0
  35. package/plugins/lavra/agents/review/security-sentinel.md +125 -0
  36. package/plugins/lavra/agents/workflow/bug-reproduction-validator.md +119 -0
  37. package/plugins/lavra/agents/workflow/every-style-editor.md +97 -0
  38. package/plugins/lavra/agents/workflow/lint.md +30 -0
  39. package/plugins/lavra/agents/workflow/pr-comment-resolver.md +95 -0
  40. package/plugins/lavra/agents/workflow/spec-flow-analyzer.md +156 -0
  41. package/plugins/lavra/commands/changelog.md +149 -0
  42. package/plugins/lavra/commands/heal-skill.md +130 -0
  43. package/plugins/lavra/commands/lavra-brainstorm.md +388 -0
  44. package/plugins/lavra/commands/lavra-ceo-review.md +388 -0
  45. package/plugins/lavra/commands/lavra-checkpoint.md +162 -0
  46. package/plugins/lavra/commands/lavra-design.md +621 -0
  47. package/plugins/lavra/commands/lavra-eng-review.md +262 -0
  48. package/plugins/lavra/commands/lavra-import.md +194 -0
  49. package/plugins/lavra/commands/lavra-learn.md +176 -0
  50. package/plugins/lavra/commands/lavra-plan.md +515 -0
  51. package/plugins/lavra/commands/lavra-qa.md +357 -0
  52. package/plugins/lavra/commands/lavra-quick.md +178 -0
  53. package/plugins/lavra/commands/lavra-recall.md +279 -0
  54. package/plugins/lavra/commands/lavra-research.md +267 -0
  55. package/plugins/lavra/commands/lavra-retro.md +400 -0
  56. package/plugins/lavra/commands/lavra-review.md +401 -0
  57. package/plugins/lavra/commands/lavra-ship.md +330 -0
  58. package/plugins/lavra/commands/lavra-triage.md +159 -0
  59. package/plugins/lavra/commands/lavra-work-ralph.md +521 -0
  60. package/plugins/lavra/commands/lavra-work-teams.md +504 -0
  61. package/plugins/lavra/commands/lavra-work.md +1019 -0
  62. package/plugins/lavra/commands/optional/agent-native-audit.md +282 -0
  63. package/plugins/lavra/commands/optional/feature-video.md +262 -0
  64. package/plugins/lavra/commands/optional/generate-command.md +146 -0
  65. package/plugins/lavra/commands/optional/reproduce-bug.md +97 -0
  66. package/plugins/lavra/commands/optional/xcode-test.md +287 -0
  67. package/plugins/lavra/commands/report-bug.md +155 -0
  68. package/plugins/lavra/commands/test-browser.md +305 -0
  69. package/plugins/lavra/cortex/agents/design/design-implementation-reviewer.md +127 -0
  70. package/plugins/lavra/cortex/agents/design/design-iterator.md +222 -0
  71. package/plugins/lavra/cortex/agents/design/figma-design-sync.md +215 -0
  72. package/plugins/lavra/cortex/agents/docs/ankane-readme-writer.md +93 -0
  73. package/plugins/lavra/cortex/agents/research/best-practices-researcher.md +135 -0
  74. package/plugins/lavra/cortex/agents/research/framework-docs-researcher.md +115 -0
  75. package/plugins/lavra/cortex/agents/research/git-history-analyzer.md +77 -0
  76. package/plugins/lavra/cortex/agents/research/learnings-researcher.md +259 -0
  77. package/plugins/lavra/cortex/agents/research/repo-research-analyst.md +161 -0
  78. package/plugins/lavra/cortex/agents/review/agent-native-reviewer.md +278 -0
  79. package/plugins/lavra/cortex/agents/review/architecture-strategist.md +86 -0
  80. package/plugins/lavra/cortex/agents/review/code-simplicity-reviewer.md +113 -0
  81. package/plugins/lavra/cortex/agents/review/data-integrity-guardian.md +93 -0
  82. package/plugins/lavra/cortex/agents/review/data-migration-expert.md +122 -0
  83. package/plugins/lavra/cortex/agents/review/deployment-verification-agent.md +182 -0
  84. package/plugins/lavra/cortex/agents/review/dhh-rails-reviewer.md +98 -0
  85. package/plugins/lavra/cortex/agents/review/goal-verifier.md +113 -0
  86. package/plugins/lavra/cortex/agents/review/julik-frontend-races-reviewer.md +243 -0
  87. package/plugins/lavra/cortex/agents/review/kieran-python-reviewer.md +152 -0
  88. package/plugins/lavra/cortex/agents/review/kieran-rails-reviewer.md +134 -0
  89. package/plugins/lavra/cortex/agents/review/kieran-typescript-reviewer.md +143 -0
  90. package/plugins/lavra/cortex/agents/review/migration-drift-detector.md +311 -0
  91. package/plugins/lavra/cortex/agents/review/pattern-recognition-specialist.md +91 -0
  92. package/plugins/lavra/cortex/agents/review/performance-oracle.md +158 -0
  93. package/plugins/lavra/cortex/agents/review/security-sentinel.md +129 -0
  94. package/plugins/lavra/cortex/agents/workflow/bug-reproduction-validator.md +123 -0
  95. package/plugins/lavra/cortex/agents/workflow/every-style-editor.md +101 -0
  96. package/plugins/lavra/cortex/agents/workflow/lint.md +33 -0
  97. package/plugins/lavra/cortex/agents/workflow/pr-comment-resolver.md +98 -0
  98. package/plugins/lavra/cortex/agents/workflow/spec-flow-analyzer.md +160 -0
  99. package/plugins/lavra/cortex/commands/agent-native-audit.md +286 -0
  100. package/plugins/lavra/cortex/commands/changelog.md +153 -0
  101. package/plugins/lavra/cortex/commands/create-agent-skill.md +21 -0
  102. package/plugins/lavra/cortex/commands/deploy-docs.md +69 -0
  103. package/plugins/lavra/cortex/commands/feature-video.md +266 -0
  104. package/plugins/lavra/cortex/commands/generate-command.md +150 -0
  105. package/plugins/lavra/cortex/commands/heal-skill.md +134 -0
  106. package/plugins/lavra/cortex/commands/lavra-brainstorm.md +392 -0
  107. package/plugins/lavra/cortex/commands/lavra-ceo-review.md +392 -0
  108. package/plugins/lavra/cortex/commands/lavra-checkpoint.md +166 -0
  109. package/plugins/lavra/cortex/commands/lavra-compound.md +168 -0
  110. package/plugins/lavra/cortex/commands/lavra-deepen.md +389 -0
  111. package/plugins/lavra/cortex/commands/lavra-design.md +625 -0
  112. package/plugins/lavra/cortex/commands/lavra-eng-review.md +266 -0
  113. package/plugins/lavra/cortex/commands/lavra-import.md +198 -0
  114. package/plugins/lavra/cortex/commands/lavra-learn.md +180 -0
  115. package/plugins/lavra/cortex/commands/lavra-parallel.md +910 -0
  116. package/plugins/lavra/cortex/commands/lavra-plan.md +519 -0
  117. package/plugins/lavra/cortex/commands/lavra-qa.md +361 -0
  118. package/plugins/lavra/cortex/commands/lavra-quick.md +182 -0
  119. package/plugins/lavra/cortex/commands/lavra-recall.md +283 -0
  120. package/plugins/lavra/cortex/commands/lavra-research.md +271 -0
  121. package/plugins/lavra/cortex/commands/lavra-retro.md +404 -0
  122. package/plugins/lavra/cortex/commands/lavra-review.md +405 -0
  123. package/plugins/lavra/cortex/commands/lavra-ship.md +334 -0
  124. package/plugins/lavra/cortex/commands/lavra-triage.md +163 -0
  125. package/plugins/lavra/cortex/commands/lavra-work-ralph.md +525 -0
  126. package/plugins/lavra/cortex/commands/lavra-work-teams.md +508 -0
  127. package/plugins/lavra/cortex/commands/lavra-work.md +1023 -0
  128. package/plugins/lavra/cortex/commands/lfg.md +30 -0
  129. package/plugins/lavra/cortex/commands/release-docs.md +148 -0
  130. package/plugins/lavra/cortex/commands/report-bug.md +159 -0
  131. package/plugins/lavra/cortex/commands/reproduce-bug.md +101 -0
  132. package/plugins/lavra/cortex/commands/resolve-pr-parallel.md +58 -0
  133. package/plugins/lavra/cortex/commands/resolve-todo-parallel.md +56 -0
  134. package/plugins/lavra/cortex/commands/test-browser.md +309 -0
  135. package/plugins/lavra/cortex/commands/xcode-test.md +291 -0
  136. package/plugins/lavra/cortex/skills/agent-browser/SKILL.md +227 -0
  137. package/plugins/lavra/cortex/skills/agent-native-architecture/SKILL.md +439 -0
  138. package/plugins/lavra/cortex/skills/andrew-kane-gem-writer/SKILL.md +188 -0
  139. package/plugins/lavra/cortex/skills/brainstorming/SKILL.md +197 -0
  140. package/plugins/lavra/cortex/skills/create-agent-skills/SKILL.md +304 -0
  141. package/plugins/lavra/cortex/skills/dhh-rails-style/SKILL.md +189 -0
  142. package/plugins/lavra/cortex/skills/dspy-ruby/SKILL.md +741 -0
  143. package/plugins/lavra/cortex/skills/every-style-editor/SKILL.md +138 -0
  144. package/plugins/lavra/cortex/skills/file-todos/SKILL.md +256 -0
  145. package/plugins/lavra/cortex/skills/frontend-design/SKILL.md +46 -0
  146. package/plugins/lavra/cortex/skills/gemini-imagegen/SKILL.md +242 -0
  147. package/plugins/lavra/cortex/skills/git-worktree/SKILL.md +307 -0
  148. package/plugins/lavra/cortex/skills/lavra-knowledge/SKILL.md +464 -0
  149. package/plugins/lavra/cortex/skills/project-setup/SKILL.md +418 -0
  150. package/plugins/lavra/cortex/skills/rclone/SKILL.md +155 -0
  151. package/plugins/lavra/docs/quickstart.md +267 -0
  152. package/plugins/lavra/examples/example-plan.md +197 -0
  153. package/plugins/lavra/gemini/agents/design/design-implementation-reviewer.md +130 -0
  154. package/plugins/lavra/gemini/agents/design/design-iterator.md +225 -0
  155. package/plugins/lavra/gemini/agents/design/figma-design-sync.md +218 -0
  156. package/plugins/lavra/gemini/agents/docs/ankane-readme-writer.md +96 -0
  157. package/plugins/lavra/gemini/agents/research/best-practices-researcher.md +138 -0
  158. package/plugins/lavra/gemini/agents/research/framework-docs-researcher.md +118 -0
  159. package/plugins/lavra/gemini/agents/research/git-history-analyzer.md +80 -0
  160. package/plugins/lavra/gemini/agents/research/learnings-researcher.md +262 -0
  161. package/plugins/lavra/gemini/agents/research/repo-research-analyst.md +164 -0
  162. package/plugins/lavra/gemini/agents/review/agent-native-reviewer.md +281 -0
  163. package/plugins/lavra/gemini/agents/review/architecture-strategist.md +89 -0
  164. package/plugins/lavra/gemini/agents/review/code-simplicity-reviewer.md +116 -0
  165. package/plugins/lavra/gemini/agents/review/data-integrity-guardian.md +96 -0
  166. package/plugins/lavra/gemini/agents/review/data-migration-expert.md +125 -0
  167. package/plugins/lavra/gemini/agents/review/deployment-verification-agent.md +185 -0
  168. package/plugins/lavra/gemini/agents/review/dhh-rails-reviewer.md +101 -0
  169. package/plugins/lavra/gemini/agents/review/goal-verifier.md +116 -0
  170. package/plugins/lavra/gemini/agents/review/julik-frontend-races-reviewer.md +246 -0
  171. package/plugins/lavra/gemini/agents/review/kieran-python-reviewer.md +155 -0
  172. package/plugins/lavra/gemini/agents/review/kieran-rails-reviewer.md +137 -0
  173. package/plugins/lavra/gemini/agents/review/kieran-typescript-reviewer.md +146 -0
  174. package/plugins/lavra/gemini/agents/review/migration-drift-detector.md +314 -0
  175. package/plugins/lavra/gemini/agents/review/pattern-recognition-specialist.md +94 -0
  176. package/plugins/lavra/gemini/agents/review/performance-oracle.md +161 -0
  177. package/plugins/lavra/gemini/agents/review/security-sentinel.md +132 -0
  178. package/plugins/lavra/gemini/agents/workflow/bug-reproduction-validator.md +126 -0
  179. package/plugins/lavra/gemini/agents/workflow/every-style-editor.md +103 -0
  180. package/plugins/lavra/gemini/agents/workflow/lint.md +36 -0
  181. package/plugins/lavra/gemini/agents/workflow/pr-comment-resolver.md +101 -0
  182. package/plugins/lavra/gemini/agents/workflow/spec-flow-analyzer.md +163 -0
  183. package/plugins/lavra/gemini/commands/agent-native-audit.toml +284 -0
  184. package/plugins/lavra/gemini/commands/beads-brainstorm.toml +292 -0
  185. package/plugins/lavra/gemini/commands/beads-checkpoint.toml +145 -0
  186. package/plugins/lavra/gemini/commands/beads-compound.toml +167 -0
  187. package/plugins/lavra/gemini/commands/beads-deepen.toml +388 -0
  188. package/plugins/lavra/gemini/commands/beads-design.toml +295 -0
  189. package/plugins/lavra/gemini/commands/beads-import.toml +197 -0
  190. package/plugins/lavra/gemini/commands/beads-parallel.toml +909 -0
  191. package/plugins/lavra/gemini/commands/beads-plan-review.toml +201 -0
  192. package/plugins/lavra/gemini/commands/beads-plan.toml +391 -0
  193. package/plugins/lavra/gemini/commands/beads-quick.toml +134 -0
  194. package/plugins/lavra/gemini/commands/beads-recall.toml +281 -0
  195. package/plugins/lavra/gemini/commands/beads-review.toml +338 -0
  196. package/plugins/lavra/gemini/commands/beads-triage.toml +161 -0
  197. package/plugins/lavra/gemini/commands/beads-work.toml +347 -0
  198. package/plugins/lavra/gemini/commands/changelog.toml +151 -0
  199. package/plugins/lavra/gemini/commands/create-agent-skill.toml +18 -0
  200. package/plugins/lavra/gemini/commands/deploy-docs.toml +68 -0
  201. package/plugins/lavra/gemini/commands/feature-video.toml +264 -0
  202. package/plugins/lavra/gemini/commands/generate-command.toml +148 -0
  203. package/plugins/lavra/gemini/commands/heal-skill.toml +131 -0
  204. package/plugins/lavra/gemini/commands/lavra-brainstorm.toml +391 -0
  205. package/plugins/lavra/gemini/commands/lavra-ceo-review.toml +391 -0
  206. package/plugins/lavra/gemini/commands/lavra-checkpoint.toml +165 -0
  207. package/plugins/lavra/gemini/commands/lavra-design.toml +624 -0
  208. package/plugins/lavra/gemini/commands/lavra-eng-review.toml +265 -0
  209. package/plugins/lavra/gemini/commands/lavra-import.toml +197 -0
  210. package/plugins/lavra/gemini/commands/lavra-learn.toml +179 -0
  211. package/plugins/lavra/gemini/commands/lavra-plan-review.toml +201 -0
  212. package/plugins/lavra/gemini/commands/lavra-plan.toml +518 -0
  213. package/plugins/lavra/gemini/commands/lavra-qa.toml +360 -0
  214. package/plugins/lavra/gemini/commands/lavra-quick.toml +181 -0
  215. package/plugins/lavra/gemini/commands/lavra-recall.toml +281 -0
  216. package/plugins/lavra/gemini/commands/lavra-research.toml +270 -0
  217. package/plugins/lavra/gemini/commands/lavra-retro.toml +403 -0
  218. package/plugins/lavra/gemini/commands/lavra-review.toml +404 -0
  219. package/plugins/lavra/gemini/commands/lavra-ship.toml +333 -0
  220. package/plugins/lavra/gemini/commands/lavra-triage.toml +161 -0
  221. package/plugins/lavra/gemini/commands/lavra-work-ralph.toml +523 -0
  222. package/plugins/lavra/gemini/commands/lavra-work-teams.toml +507 -0
  223. package/plugins/lavra/gemini/commands/lavra-work.toml +1022 -0
  224. package/plugins/lavra/gemini/commands/lfg.toml +28 -0
  225. package/plugins/lavra/gemini/commands/release-docs.toml +146 -0
  226. package/plugins/lavra/gemini/commands/report-bug.toml +157 -0
  227. package/plugins/lavra/gemini/commands/reproduce-bug.toml +99 -0
  228. package/plugins/lavra/gemini/commands/resolve-pr-parallel.toml +56 -0
  229. package/plugins/lavra/gemini/commands/resolve-todo-parallel.toml +54 -0
  230. package/plugins/lavra/gemini/commands/test-browser.toml +307 -0
  231. package/plugins/lavra/gemini/commands/xcode-test.toml +289 -0
  232. package/plugins/lavra/gemini/docs/MCP_SETUP.md +41 -0
  233. package/plugins/lavra/gemini/skills/agent-browser/SKILL.md +227 -0
  234. package/plugins/lavra/gemini/skills/agent-native-architecture/SKILL.md +439 -0
  235. package/plugins/lavra/gemini/skills/andrew-kane-gem-writer/SKILL.md +188 -0
  236. package/plugins/lavra/gemini/skills/beads-knowledge/SKILL.md +464 -0
  237. package/plugins/lavra/gemini/skills/brainstorming/SKILL.md +197 -0
  238. package/plugins/lavra/gemini/skills/create-agent-skills/SKILL.md +304 -0
  239. package/plugins/lavra/gemini/skills/dhh-rails-style/SKILL.md +189 -0
  240. package/plugins/lavra/gemini/skills/dspy-ruby/SKILL.md +741 -0
  241. package/plugins/lavra/gemini/skills/every-style-editor/SKILL.md +138 -0
  242. package/plugins/lavra/gemini/skills/file-todos/SKILL.md +256 -0
  243. package/plugins/lavra/gemini/skills/frontend-design/SKILL.md +46 -0
  244. package/plugins/lavra/gemini/skills/gemini-imagegen/SKILL.md +242 -0
  245. package/plugins/lavra/gemini/skills/git-worktree/SKILL.md +307 -0
  246. package/plugins/lavra/gemini/skills/lavra-knowledge/SKILL.md +464 -0
  247. package/plugins/lavra/gemini/skills/project-setup/SKILL.md +418 -0
  248. package/plugins/lavra/gemini/skills/rclone/SKILL.md +155 -0
  249. package/plugins/lavra/gemini-extension.json +50 -0
  250. package/plugins/lavra/gemini-src/settings.json +37 -0
  251. package/plugins/lavra/hooks/auto-recall.sh +210 -0
  252. package/plugins/lavra/hooks/check-memory.sh +169 -0
  253. package/plugins/lavra/hooks/hooks.json +47 -0
  254. package/plugins/lavra/hooks/knowledge-db.sh +255 -0
  255. package/plugins/lavra/hooks/memory-capture.sh +132 -0
  256. package/plugins/lavra/hooks/provision-memory.sh +144 -0
  257. package/plugins/lavra/hooks/recall.sh +152 -0
  258. package/plugins/lavra/hooks/subagent-wrapup.sh +44 -0
  259. package/plugins/lavra/hooks/teammate-idle-check.sh +29 -0
  260. package/plugins/lavra/opencode/agents/design/design-implementation-reviewer.md +127 -0
  261. package/plugins/lavra/opencode/agents/design/design-iterator.md +222 -0
  262. package/plugins/lavra/opencode/agents/design/figma-design-sync.md +215 -0
  263. package/plugins/lavra/opencode/agents/docs/ankane-readme-writer.md +93 -0
  264. package/plugins/lavra/opencode/agents/research/best-practices-researcher.md +135 -0
  265. package/plugins/lavra/opencode/agents/research/framework-docs-researcher.md +115 -0
  266. package/plugins/lavra/opencode/agents/research/git-history-analyzer.md +77 -0
  267. package/plugins/lavra/opencode/agents/research/learnings-researcher.md +259 -0
  268. package/plugins/lavra/opencode/agents/research/repo-research-analyst.md +161 -0
  269. package/plugins/lavra/opencode/agents/review/agent-native-reviewer.md +278 -0
  270. package/plugins/lavra/opencode/agents/review/architecture-strategist.md +86 -0
  271. package/plugins/lavra/opencode/agents/review/code-simplicity-reviewer.md +113 -0
  272. package/plugins/lavra/opencode/agents/review/data-integrity-guardian.md +93 -0
  273. package/plugins/lavra/opencode/agents/review/data-migration-expert.md +122 -0
  274. package/plugins/lavra/opencode/agents/review/deployment-verification-agent.md +182 -0
  275. package/plugins/lavra/opencode/agents/review/dhh-rails-reviewer.md +98 -0
  276. package/plugins/lavra/opencode/agents/review/goal-verifier.md +113 -0
  277. package/plugins/lavra/opencode/agents/review/julik-frontend-races-reviewer.md +243 -0
  278. package/plugins/lavra/opencode/agents/review/kieran-python-reviewer.md +152 -0
  279. package/plugins/lavra/opencode/agents/review/kieran-rails-reviewer.md +134 -0
  280. package/plugins/lavra/opencode/agents/review/kieran-typescript-reviewer.md +143 -0
  281. package/plugins/lavra/opencode/agents/review/migration-drift-detector.md +311 -0
  282. package/plugins/lavra/opencode/agents/review/pattern-recognition-specialist.md +91 -0
  283. package/plugins/lavra/opencode/agents/review/performance-oracle.md +158 -0
  284. package/plugins/lavra/opencode/agents/review/security-sentinel.md +129 -0
  285. package/plugins/lavra/opencode/agents/workflow/bug-reproduction-validator.md +123 -0
  286. package/plugins/lavra/opencode/agents/workflow/every-style-editor.md +100 -0
  287. package/plugins/lavra/opencode/agents/workflow/lint.md +33 -0
  288. package/plugins/lavra/opencode/agents/workflow/pr-comment-resolver.md +98 -0
  289. package/plugins/lavra/opencode/agents/workflow/spec-flow-analyzer.md +160 -0
  290. package/plugins/lavra/opencode/commands/agent-native-audit.md +286 -0
  291. package/plugins/lavra/opencode/commands/changelog.md +153 -0
  292. package/plugins/lavra/opencode/commands/create-agent-skill.md +21 -0
  293. package/plugins/lavra/opencode/commands/deploy-docs.md +69 -0
  294. package/plugins/lavra/opencode/commands/feature-video.md +266 -0
  295. package/plugins/lavra/opencode/commands/generate-command.md +150 -0
  296. package/plugins/lavra/opencode/commands/heal-skill.md +134 -0
  297. package/plugins/lavra/opencode/commands/lavra-brainstorm.md +392 -0
  298. package/plugins/lavra/opencode/commands/lavra-ceo-review.md +392 -0
  299. package/plugins/lavra/opencode/commands/lavra-checkpoint.md +166 -0
  300. package/plugins/lavra/opencode/commands/lavra-compound.md +168 -0
  301. package/plugins/lavra/opencode/commands/lavra-deepen.md +389 -0
  302. package/plugins/lavra/opencode/commands/lavra-design.md +625 -0
  303. package/plugins/lavra/opencode/commands/lavra-eng-review.md +266 -0
  304. package/plugins/lavra/opencode/commands/lavra-import.md +198 -0
  305. package/plugins/lavra/opencode/commands/lavra-learn.md +180 -0
  306. package/plugins/lavra/opencode/commands/lavra-parallel.md +910 -0
  307. package/plugins/lavra/opencode/commands/lavra-plan.md +519 -0
  308. package/plugins/lavra/opencode/commands/lavra-qa.md +361 -0
  309. package/plugins/lavra/opencode/commands/lavra-quick.md +182 -0
  310. package/plugins/lavra/opencode/commands/lavra-recall.md +283 -0
  311. package/plugins/lavra/opencode/commands/lavra-research.md +271 -0
  312. package/plugins/lavra/opencode/commands/lavra-retro.md +404 -0
  313. package/plugins/lavra/opencode/commands/lavra-review.md +405 -0
  314. package/plugins/lavra/opencode/commands/lavra-ship.md +334 -0
  315. package/plugins/lavra/opencode/commands/lavra-triage.md +163 -0
  316. package/plugins/lavra/opencode/commands/lavra-work-ralph.md +525 -0
  317. package/plugins/lavra/opencode/commands/lavra-work-teams.md +508 -0
  318. package/plugins/lavra/opencode/commands/lavra-work.md +1023 -0
  319. package/plugins/lavra/opencode/commands/lfg.md +30 -0
  320. package/plugins/lavra/opencode/commands/release-docs.md +148 -0
  321. package/plugins/lavra/opencode/commands/report-bug.md +159 -0
  322. package/plugins/lavra/opencode/commands/reproduce-bug.md +101 -0
  323. package/plugins/lavra/opencode/commands/resolve-pr-parallel.md +58 -0
  324. package/plugins/lavra/opencode/commands/resolve-todo-parallel.md +56 -0
  325. package/plugins/lavra/opencode/commands/test-browser.md +309 -0
  326. package/plugins/lavra/opencode/commands/xcode-test.md +291 -0
  327. package/plugins/lavra/opencode/docs/MCP_SETUP.md +48 -0
  328. package/plugins/lavra/opencode/skills/agent-browser/SKILL.md +227 -0
  329. package/plugins/lavra/opencode/skills/agent-native-architecture/SKILL.md +439 -0
  330. package/plugins/lavra/opencode/skills/andrew-kane-gem-writer/SKILL.md +188 -0
  331. package/plugins/lavra/opencode/skills/brainstorming/SKILL.md +197 -0
  332. package/plugins/lavra/opencode/skills/create-agent-skills/SKILL.md +304 -0
  333. package/plugins/lavra/opencode/skills/dhh-rails-style/SKILL.md +189 -0
  334. package/plugins/lavra/opencode/skills/dspy-ruby/SKILL.md +741 -0
  335. package/plugins/lavra/opencode/skills/every-style-editor/SKILL.md +138 -0
  336. package/plugins/lavra/opencode/skills/file-todos/SKILL.md +256 -0
  337. package/plugins/lavra/opencode/skills/frontend-design/SKILL.md +46 -0
  338. package/plugins/lavra/opencode/skills/gemini-imagegen/SKILL.md +242 -0
  339. package/plugins/lavra/opencode/skills/git-worktree/SKILL.md +307 -0
  340. package/plugins/lavra/opencode/skills/lavra-knowledge/SKILL.md +464 -0
  341. package/plugins/lavra/opencode/skills/project-setup/SKILL.md +418 -0
  342. package/plugins/lavra/opencode/skills/rclone/SKILL.md +155 -0
  343. package/plugins/lavra/opencode-src/package.json +13 -0
  344. package/plugins/lavra/opencode-src/plugin.ts +176 -0
  345. package/plugins/lavra/scripts/import-plan.sh +141 -0
  346. package/plugins/lavra/skills/agent-browser/SKILL.md +223 -0
  347. package/plugins/lavra/skills/agent-native-architecture/SKILL.md +435 -0
  348. package/plugins/lavra/skills/agent-native-architecture/references/action-parity-discipline.md +353 -0
  349. package/plugins/lavra/skills/agent-native-architecture/references/agent-execution-patterns.md +362 -0
  350. package/plugins/lavra/skills/agent-native-architecture/references/agent-native-testing.md +508 -0
  351. package/plugins/lavra/skills/agent-native-architecture/references/architecture-patterns.md +478 -0
  352. package/plugins/lavra/skills/agent-native-architecture/references/dynamic-context-injection.md +281 -0
  353. package/plugins/lavra/skills/agent-native-architecture/references/files-universal-interface.md +301 -0
  354. package/plugins/lavra/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +227 -0
  355. package/plugins/lavra/skills/agent-native-architecture/references/mcp-tool-design.md +427 -0
  356. package/plugins/lavra/skills/agent-native-architecture/references/mobile-patterns.md +410 -0
  357. package/plugins/lavra/skills/agent-native-architecture/references/product-implications.md +341 -0
  358. package/plugins/lavra/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +317 -0
  359. package/plugins/lavra/skills/agent-native-architecture/references/self-modification.md +269 -0
  360. package/plugins/lavra/skills/agent-native-architecture/references/shared-workspace-architecture.md +517 -0
  361. package/plugins/lavra/skills/agent-native-architecture/references/system-prompt-design.md +250 -0
  362. package/plugins/lavra/skills/brainstorming/SKILL.md +193 -0
  363. package/plugins/lavra/skills/create-agent-skills/SKILL.md +300 -0
  364. package/plugins/lavra/skills/create-agent-skills/references/api-security.md +60 -0
  365. package/plugins/lavra/skills/create-agent-skills/references/be-clear-and-direct.md +84 -0
  366. package/plugins/lavra/skills/create-agent-skills/references/best-practices.md +404 -0
  367. package/plugins/lavra/skills/create-agent-skills/references/common-patterns.md +121 -0
  368. package/plugins/lavra/skills/create-agent-skills/references/core-principles.md +103 -0
  369. package/plugins/lavra/skills/create-agent-skills/references/executable-code.md +92 -0
  370. package/plugins/lavra/skills/create-agent-skills/references/iteration-and-testing.md +164 -0
  371. package/plugins/lavra/skills/create-agent-skills/references/official-spec.md +185 -0
  372. package/plugins/lavra/skills/create-agent-skills/references/recommended-structure.md +168 -0
  373. package/plugins/lavra/skills/create-agent-skills/references/skill-structure.md +215 -0
  374. package/plugins/lavra/skills/create-agent-skills/references/using-scripts.md +113 -0
  375. package/plugins/lavra/skills/create-agent-skills/references/using-templates.md +112 -0
  376. package/plugins/lavra/skills/create-agent-skills/references/workflows-and-validation.md +122 -0
  377. package/plugins/lavra/skills/create-agent-skills/templates/router-skill.md +73 -0
  378. package/plugins/lavra/skills/create-agent-skills/templates/simple-skill.md +33 -0
  379. package/plugins/lavra/skills/create-agent-skills/workflows/add-reference.md +55 -0
  380. package/plugins/lavra/skills/create-agent-skills/workflows/add-script.md +59 -0
  381. package/plugins/lavra/skills/create-agent-skills/workflows/add-template.md +51 -0
  382. package/plugins/lavra/skills/create-agent-skills/workflows/add-workflow.md +54 -0
  383. package/plugins/lavra/skills/create-agent-skills/workflows/audit-skill.md +63 -0
  384. package/plugins/lavra/skills/create-agent-skills/workflows/create-domain-expertise-skill.md +68 -0
  385. package/plugins/lavra/skills/create-agent-skills/workflows/create-new-skill.md +92 -0
  386. package/plugins/lavra/skills/create-agent-skills/workflows/get-guidance.md +70 -0
  387. package/plugins/lavra/skills/create-agent-skills/workflows/upgrade-to-router.md +68 -0
  388. package/plugins/lavra/skills/create-agent-skills/workflows/verify-skill.md +63 -0
  389. package/plugins/lavra/skills/file-todos/SKILL.md +252 -0
  390. package/plugins/lavra/skills/file-todos/assets/todo-template.md +155 -0
  391. package/plugins/lavra/skills/git-worktree/SKILL.md +303 -0
  392. package/plugins/lavra/skills/git-worktree/scripts/worktree-manager.sh +345 -0
  393. package/plugins/lavra/skills/lavra-knowledge/SKILL.md +460 -0
  394. package/plugins/lavra/skills/lavra-knowledge/references/jsonl-schema.md +104 -0
  395. package/plugins/lavra/skills/optional/andrew-kane-gem-writer/SKILL.md +184 -0
  396. package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/database-adapters.md +231 -0
  397. package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/module-organization.md +121 -0
  398. package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/rails-integration.md +183 -0
  399. package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/resources.md +119 -0
  400. package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
  401. package/plugins/lavra/skills/optional/dhh-rails-style/SKILL.md +185 -0
  402. package/plugins/lavra/skills/optional/dhh-rails-style/references/architecture.md +653 -0
  403. package/plugins/lavra/skills/optional/dhh-rails-style/references/controllers.md +303 -0
  404. package/plugins/lavra/skills/optional/dhh-rails-style/references/frontend.md +510 -0
  405. package/plugins/lavra/skills/optional/dhh-rails-style/references/gems.md +266 -0
  406. package/plugins/lavra/skills/optional/dhh-rails-style/references/models.md +359 -0
  407. package/plugins/lavra/skills/optional/dhh-rails-style/references/testing.md +338 -0
  408. package/plugins/lavra/skills/optional/dspy-ruby/SKILL.md +737 -0
  409. package/plugins/lavra/skills/optional/dspy-ruby/assets/config-template.rb +187 -0
  410. package/plugins/lavra/skills/optional/dspy-ruby/assets/module-template.rb +300 -0
  411. package/plugins/lavra/skills/optional/dspy-ruby/assets/signature-template.rb +221 -0
  412. package/plugins/lavra/skills/optional/dspy-ruby/references/core-concepts.md +674 -0
  413. package/plugins/lavra/skills/optional/dspy-ruby/references/observability.md +366 -0
  414. package/plugins/lavra/skills/optional/dspy-ruby/references/optimization.md +603 -0
  415. package/plugins/lavra/skills/optional/dspy-ruby/references/providers.md +418 -0
  416. package/plugins/lavra/skills/optional/dspy-ruby/references/toolsets.md +502 -0
  417. package/plugins/lavra/skills/optional/every-style-editor/SKILL.md +134 -0
  418. package/plugins/lavra/skills/optional/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
  419. package/plugins/lavra/skills/optional/frontend-design/SKILL.md +42 -0
  420. package/plugins/lavra/skills/optional/gemini-imagegen/SKILL.md +238 -0
  421. package/plugins/lavra/skills/optional/gemini-imagegen/requirements.txt +2 -0
  422. package/plugins/lavra/skills/optional/gemini-imagegen/scripts/compose_images.py +157 -0
  423. package/plugins/lavra/skills/optional/gemini-imagegen/scripts/edit_image.py +144 -0
  424. package/plugins/lavra/skills/optional/gemini-imagegen/scripts/gemini_images.py +263 -0
  425. package/plugins/lavra/skills/optional/gemini-imagegen/scripts/generate_image.py +133 -0
  426. package/plugins/lavra/skills/optional/gemini-imagegen/scripts/multi_turn_chat.py +216 -0
  427. package/plugins/lavra/skills/optional/rclone/SKILL.md +151 -0
  428. package/plugins/lavra/skills/optional/rclone/scripts/check_setup.sh +60 -0
  429. package/plugins/lavra/skills/project-setup/SKILL.md +414 -0
  430. package/plugins/lavra/tests/build-index.sh +116 -0
  431. package/plugins/lavra/tests/recall-bench.sh +224 -0
  432. package/plugins/lavra/tests/search-fts5.sh +65 -0
  433. package/plugins/lavra/tests/search-grep.sh +54 -0
  434. package/plugins/lavra/tests/test-queries.jsonl +25 -0
  435. package/scripts/apply-context-optimizations.py +345 -0
  436. package/scripts/convert-cortex.ts +257 -0
  437. package/scripts/convert-gemini.ts +369 -0
  438. package/scripts/convert-opencode.ts +313 -0
  439. package/scripts/package.json +27 -0
  440. package/scripts/pre-release-check.sh +176 -0
  441. package/scripts/select-opencode-models.sh +178 -0
  442. package/scripts/shared/model-config.json +17 -0
  443. package/scripts/shared/model-mapping.ts +129 -0
  444. package/scripts/shared/security.ts +97 -0
  445. package/scripts/shared/yaml-parser.ts +55 -0
  446. package/scripts/sqlite-to-jsonl.py +207 -0
  447. package/scripts/test-compatibility.ts +539 -0
  448. package/scripts/test-features.sh +342 -0
  449. package/scripts/test-installation.sh +514 -0
  450. package/scripts/test-security.ts +275 -0
  451. package/scripts/trim-agent-descriptions.py +177 -0
  452. package/uninstall.sh +133 -0
@@ -0,0 +1,741 @@
1
+ <!-- Generated by lavra-compound v0.6.0 -->
2
+ <!-- Source: dspy-ruby/SKILL.md -->
3
+ <!-- DO NOT EDIT - changes will be overwritten on next install -->
4
+
5
+ ---
6
+ name: dspy-ruby
7
+ description: Build type-safe LLM applications with DSPy.rb — Ruby's programmatic prompt framework with signatures, modules, agents, and optimization. Use when implementing predictable AI features, creating LLM signatures and modules, configuring language model providers, building agent systems with tools, optimizing prompts, or testing LLM-powered functionality in Ruby applications.
8
+ ---
9
+
10
+ # DSPy.rb
11
+
12
+ > Build LLM apps like you build software. Type-safe, modular, testable.
13
+
14
+ DSPy.rb brings software engineering best practices to LLM development. Instead of tweaking prompts, define what you want with Ruby types and let DSPy handle the rest.
15
+
16
+ ## Overview
17
+
18
+ DSPy.rb is a Ruby framework for building language model applications with programmatic prompts. It provides:
19
+
20
+ - **Type-safe signatures** — Define inputs/outputs with Sorbet types
21
+ - **Modular components** — Compose and reuse LLM logic
22
+ - **Automatic optimization** — Use data to improve prompts, not guesswork
23
+ - **Production-ready** — Built-in observability, testing, and error handling
24
+
25
+ ## Core Concepts
26
+
27
+ ### 1. Signatures
28
+
29
+ Define interfaces between your app and LLMs using Ruby types:
30
+
31
+ ```ruby
32
+ class EmailClassifier < DSPy::Signature
33
+ description "Classify customer support emails by category and priority"
34
+
35
+ class Priority < T::Enum
36
+ enums do
37
+ Low = new('low')
38
+ Medium = new('medium')
39
+ High = new('high')
40
+ Urgent = new('urgent')
41
+ end
42
+ end
43
+
44
+ input do
45
+ const :email_content, String
46
+ const :sender, String
47
+ end
48
+
49
+ output do
50
+ const :category, String
51
+ const :priority, Priority # Type-safe enum with defined values
52
+ const :confidence, Float
53
+ end
54
+ end
55
+ ```
56
+
57
+ ### 2. Modules
58
+
59
+ Build complex workflows from simple building blocks:
60
+
61
+ - **Predict** — Basic LLM calls with signatures
62
+ - **ChainOfThought** — Step-by-step reasoning
63
+ - **ReAct** — Tool-using agents
64
+ - **CodeAct** — Dynamic code generation agents (install the `dspy-code_act` gem)
65
+
66
+ ### 3. Tools & Toolsets
67
+
68
+ Create type-safe tools for agents with comprehensive Sorbet support:
69
+
70
+ ```ruby
71
+ # Enum-based tool with automatic type conversion
72
+ class CalculatorTool < DSPy::Tools::Base
73
+ tool_name 'calculator'
74
+ tool_description 'Performs arithmetic operations with type-safe enum inputs'
75
+
76
+ class Operation < T::Enum
77
+ enums do
78
+ Add = new('add')
79
+ Subtract = new('subtract')
80
+ Multiply = new('multiply')
81
+ Divide = new('divide')
82
+ end
83
+ end
84
+
85
+ sig { params(operation: Operation, num1: Float, num2: Float).returns(T.any(Float, String)) }
86
+ def call(operation:, num1:, num2:)
87
+ case operation
88
+ when Operation::Add then num1 + num2
89
+ when Operation::Subtract then num1 - num2
90
+ when Operation::Multiply then num1 * num2
91
+ when Operation::Divide
92
+ return "Error: Division by zero" if num2 == 0
93
+ num1 / num2
94
+ end
95
+ end
96
+ end
97
+
98
+ # Multi-tool toolset with rich types
99
+ class DataToolset < DSPy::Tools::Toolset
100
+ toolset_name "data_processing"
101
+
102
+ class Format < T::Enum
103
+ enums do
104
+ JSON = new('json')
105
+ CSV = new('csv')
106
+ XML = new('xml')
107
+ end
108
+ end
109
+
110
+ tool :convert, description: "Convert data between formats"
111
+ tool :validate, description: "Validate data structure"
112
+
113
+ sig { params(data: String, from: Format, to: Format).returns(String) }
114
+ def convert(data:, from:, to:)
115
+ "Converted from #{from.serialize} to #{to.serialize}"
116
+ end
117
+
118
+ sig { params(data: String, format: Format).returns(T::Hash[String, T.any(String, Integer, T::Boolean)]) }
119
+ def validate(data:, format:)
120
+ { valid: true, format: format.serialize, row_count: 42, message: "Data validation passed" }
121
+ end
122
+ end
123
+ ```
124
+
125
+ ### 4. Type System & Discriminators
126
+
127
+ DSPy.rb uses sophisticated type discrimination for complex data structures:
128
+
129
+ - **Automatic `_type` field injection** — DSPy adds discriminator fields to structs for type safety
130
+ - **Union type support** — `T.any()` types automatically disambiguated by `_type`
131
+ - **Reserved field name** — Avoid defining your own `_type` fields in structs
132
+ - **Recursive filtering** — `_type` fields filtered during deserialization at all nesting levels
133
+
134
+ ### 5. Optimization
135
+
136
+ Improve accuracy with real data:
137
+
138
+ - **MIPROv2** — Advanced multi-prompt optimization with bootstrap sampling and Bayesian optimization
139
+ - **GEPA** — Genetic-Pareto Reflective Prompt Evolution with feedback maps, experiment tracking, and telemetry
140
+ - **Evaluation** — Comprehensive framework with built-in and custom metrics, error handling, and batch processing
141
+
142
+ ## Quick Start
143
+
144
+ ```ruby
145
+ # Install
146
+ gem 'dspy'
147
+
148
+ # Configure
149
+ DSPy.configure do |c|
150
+ c.lm = DSPy::LM.new('openai/gpt-4o-mini', api_key: ENV['OPENAI_API_KEY'])
151
+ end
152
+
153
+ # Define a task
154
+ class SentimentAnalysis < DSPy::Signature
155
+ description "Analyze sentiment of text"
156
+
157
+ input do
158
+ const :text, String
159
+ end
160
+
161
+ output do
162
+ const :sentiment, String # positive, negative, neutral
163
+ const :score, Float # 0.0 to 1.0
164
+ end
165
+ end
166
+
167
+ # Use it
168
+ analyzer = DSPy::Predict.new(SentimentAnalysis)
169
+ result = analyzer.call(text: "This product is amazing!")
170
+ puts result.sentiment # => "positive"
171
+ puts result.score # => 0.92
172
+ ```
173
+
174
+ ## Provider Adapter Gems
175
+
176
+ Two strategies for connecting to LLM providers:
177
+
178
+ ### Per-provider adapters (direct SDK access)
179
+
180
+ ```ruby
181
+ # Gemfile
182
+ gem 'dspy'
183
+ gem 'dspy-openai' # OpenAI, OpenRouter, Ollama
184
+ gem 'dspy-anthropic' # Claude
185
+ gem 'dspy-gemini' # Gemini
186
+ ```
187
+
188
+ Each adapter gem pulls in the official SDK (`openai`, `anthropic`, `gemini-ai`).
189
+
190
+ ### Unified adapter via RubyLLM (recommended for multi-provider)
191
+
192
+ ```ruby
193
+ # Gemfile
194
+ gem 'dspy'
195
+ gem 'dspy-ruby_llm' # Routes to any provider via ruby_llm
196
+ gem 'ruby_llm'
197
+ ```
198
+
199
+ RubyLLM handles provider routing based on the model name. Use the `ruby_llm/` prefix:
200
+
201
+ ```ruby
202
+ DSPy.configure do |c|
203
+ c.lm = DSPy::LM.new('ruby_llm/gemini-2.5-flash', structured_outputs: true)
204
+ # c.lm = DSPy::LM.new('ruby_llm/claude-sonnet-4-20250514', structured_outputs: true)
205
+ # c.lm = DSPy::LM.new('ruby_llm/gpt-4o-mini', structured_outputs: true)
206
+ end
207
+ ```
208
+
209
+ ## Events System
210
+
211
+ DSPy.rb ships with a structured event bus for observing runtime behavior.
212
+
213
+ ### Module-Scoped Subscriptions (preferred for agents)
214
+
215
+ ```ruby
216
+ class MyAgent < DSPy::Module
217
+ subscribe 'lm.tokens', :track_tokens, scope: :descendants
218
+
219
+ def track_tokens(_event, attrs)
220
+ @total_tokens += attrs.fetch(:total_tokens, 0)
221
+ end
222
+ end
223
+ ```
224
+
225
+ ### Global Subscriptions (for observability/integrations)
226
+
227
+ ```ruby
228
+ subscription_id = DSPy.events.subscribe('score.create') do |event, attrs|
229
+ Langfuse.export_score(attrs)
230
+ end
231
+
232
+ # Wildcards supported
233
+ DSPy.events.subscribe('llm.*') { |name, attrs| puts "[#{name}] tokens=#{attrs[:total_tokens]}" }
234
+ ```
235
+
236
+ Event names use dot-separated namespaces (`llm.generate`, `react.iteration_complete`). Every event includes module metadata (`module_path`, `module_leaf`, `module_scope.ancestry_token`) for filtering.
237
+
238
+ ## Lifecycle Callbacks
239
+
240
+ Rails-style lifecycle hooks ship with every `DSPy::Module`:
241
+
242
+ - **`before`** — Runs ahead of `forward` for setup (metrics, context loading)
243
+ - **`around`** — Wraps `forward`, calls `yield`, and lets you pair setup/teardown logic
244
+ - **`after`** — Fires after `forward` returns for cleanup or persistence
245
+
246
+ ```ruby
247
+ class InstrumentedModule < DSPy::Module
248
+ before :setup_metrics
249
+ around :manage_context
250
+ after :log_metrics
251
+
252
+ def forward(question:)
253
+ @predictor.call(question: question)
254
+ end
255
+
256
+ private
257
+
258
+ def setup_metrics
259
+ @start_time = Time.now
260
+ end
261
+
262
+ def manage_context
263
+ load_context
264
+ result = yield
265
+ save_context
266
+ result
267
+ end
268
+
269
+ def log_metrics
270
+ duration = Time.now - @start_time
271
+ Rails.logger.info "Prediction completed in #{duration}s"
272
+ end
273
+ end
274
+ ```
275
+
276
+ Execution order: before → around (before yield) → forward → around (after yield) → after. Callbacks are inherited from parent classes and execute in registration order.
277
+
278
+ ## Fiber-Local LM Context
279
+
280
+ Override the language model temporarily using fiber-local storage:
281
+
282
+ ```ruby
283
+ fast_model = DSPy::LM.new("openai/gpt-4o-mini", api_key: ENV['OPENAI_API_KEY'])
284
+
285
+ DSPy.with_lm(fast_model) do
286
+ result = classifier.call(text: "test") # Uses fast_model inside this block
287
+ end
288
+ # Back to global LM outside the block
289
+ ```
290
+
291
+ **LM resolution hierarchy**: Instance-level LM → Fiber-local LM (`DSPy.with_lm`) → Global LM (`DSPy.configure`).
292
+
293
+ Use `configure_predictor` for fine-grained control over agent internals:
294
+
295
+ ```ruby
296
+ agent = DSPy::ReAct.new(MySignature, tools: tools)
297
+ agent.configure { |c| c.lm = default_model }
298
+ agent.configure_predictor('thought_generator') { |c| c.lm = powerful_model }
299
+ ```
300
+
301
+ ## Evaluation Framework
302
+
303
+ Systematically test LLM application performance with `DSPy::Evals`:
304
+
305
+ ```ruby
306
+ metric = DSPy::Metrics.exact_match(field: :answer, case_sensitive: false)
307
+ evaluator = DSPy::Evals.new(predictor, metric: metric)
308
+ result = evaluator.evaluate(test_examples, display_table: true)
309
+ puts "Pass Rate: #{(result.pass_rate * 100).round(1)}%"
310
+ ```
311
+
312
+ Built-in metrics: `exact_match`, `contains`, `numeric_difference`, `composite_and`. Custom metrics return `true`/`false` or a `DSPy::Prediction` with `score:` and `feedback:` fields.
313
+
314
+ Use `DSPy::Example` for typed test data and `export_scores: true` to push results to Langfuse.
315
+
316
+ ## GEPA Optimization
317
+
318
+ GEPA (Genetic-Pareto Reflective Prompt Evolution) uses reflection-driven instruction rewrites:
319
+
320
+ ```ruby
321
+ gem 'dspy-gepa'
322
+
323
+ teleprompter = DSPy::Teleprompt::GEPA.new(
324
+ metric: metric,
325
+ reflection_lm: DSPy::ReflectionLM.new('openai/gpt-4o-mini', api_key: ENV['OPENAI_API_KEY']),
326
+ feedback_map: feedback_map,
327
+ config: { max_metric_calls: 600, minibatch_size: 6 }
328
+ )
329
+
330
+ result = teleprompter.compile(program, trainset: train, valset: val)
331
+ optimized_program = result.optimized_program
332
+ ```
333
+
334
+ The metric must return `DSPy::Prediction.new(score:, feedback:)` so the reflection model can reason about failures. Use `feedback_map` to target individual predictors in composite modules.
335
+
336
+ ## Typed Context Pattern
337
+
338
+ Replace opaque string context blobs with `T::Struct` inputs. Each field gets its own `description:` annotation in the JSON schema the LLM sees:
339
+
340
+ ```ruby
341
+ class NavigationContext < T::Struct
342
+ const :workflow_hint, T.nilable(String),
343
+ description: "Current workflow phase guidance for the agent"
344
+ const :action_log, T::Array[String], default: [],
345
+ description: "Compact one-line-per-action history of research steps taken"
346
+ const :iterations_remaining, Integer,
347
+ description: "Budget remaining. Each tool call costs 1 iteration."
348
+ end
349
+
350
+ class ToolSelectionSignature < DSPy::Signature
351
+ input do
352
+ const :query, String
353
+ const :context, NavigationContext # Structured, not an opaque string
354
+ end
355
+
356
+ output do
357
+ const :tool_name, String
358
+ const :tool_args, String, description: "JSON-encoded arguments"
359
+ end
360
+ end
361
+ ```
362
+
363
+ Benefits: type safety at compile time, per-field descriptions in the LLM schema, easy to test as value objects, extensible by adding `const` declarations.
364
+
365
+ ## Schema Formats (BAML / TOON)
366
+
367
+ Control how DSPy describes signature structure to the LLM:
368
+
369
+ - **JSON Schema** (default) — Standard format, works with `structured_outputs: true`
370
+ - **BAML** (`schema_format: :baml`) — 84% token reduction for Enhanced Prompting mode. Requires `sorbet-baml` gem.
371
+ - **TOON** (`schema_format: :toon, data_format: :toon`) — Table-oriented format for both schemas and data. Enhanced Prompting mode only.
372
+
373
+ BAML and TOON apply only when `structured_outputs: false`. With `structured_outputs: true`, the provider receives JSON Schema directly.
374
+
375
+ ## Storage System
376
+
377
+ Persist and reload optimized programs with `DSPy::Storage::ProgramStorage`:
378
+
379
+ ```ruby
380
+ storage = DSPy::Storage::ProgramStorage.new(storage_path: "./dspy_storage")
381
+ storage.save_program(result.optimized_program, result, metadata: { optimizer: 'MIPROv2' })
382
+ ```
383
+
384
+ Supports checkpoint management, optimization history tracking, and import/export between environments.
385
+
386
+ ## Rails Integration
387
+
388
+ ### Directory Structure
389
+
390
+ Organize DSPy components using Rails conventions:
391
+
392
+ ```
393
+ app/
394
+ entities/ # T::Struct types shared across signatures
395
+ signatures/ # DSPy::Signature definitions
396
+ tools/ # DSPy::Tools::Base implementations
397
+ concerns/ # Shared tool behaviors (error handling, etc.)
398
+ modules/ # DSPy::Module orchestrators
399
+ services/ # Plain Ruby services that compose DSPy modules
400
+ config/
401
+ initializers/
402
+ dspy.rb # DSPy + provider configuration
403
+ feature_flags.rb # Model selection per role
404
+ spec/
405
+ signatures/ # Schema validation tests
406
+ tools/ # Tool unit tests
407
+ modules/ # Integration tests with VCR
408
+ vcr_cassettes/ # Recorded HTTP interactions
409
+ ```
410
+
411
+ ### Initializer
412
+
413
+ ```ruby
414
+ # config/initializers/dspy.rb
415
+ Rails.application.config.after_initialize do
416
+ next if Rails.env.test? && ENV["DSPY_ENABLE_IN_TEST"].blank?
417
+
418
+ RubyLLM.configure do |config|
419
+ config.gemini_api_key = ENV["GEMINI_API_KEY"] if ENV["GEMINI_API_KEY"].present?
420
+ config.anthropic_api_key = ENV["ANTHROPIC_API_KEY"] if ENV["ANTHROPIC_API_KEY"].present?
421
+ config.openai_api_key = ENV["OPENAI_API_KEY"] if ENV["OPENAI_API_KEY"].present?
422
+ end
423
+
424
+ model = ENV.fetch("DSPY_MODEL", "ruby_llm/gemini-2.5-flash")
425
+ DSPy.configure do |config|
426
+ config.lm = DSPy::LM.new(model, structured_outputs: true)
427
+ config.logger = Rails.logger
428
+ end
429
+
430
+ # Langfuse observability (optional)
431
+ if ENV["LANGFUSE_PUBLIC_KEY"].present? && ENV["LANGFUSE_SECRET_KEY"].present?
432
+ DSPy::Observability.configure!
433
+ end
434
+ end
435
+ ```
436
+
437
+ ### Feature-Flagged Model Selection
438
+
439
+ Use different models for different roles (fast/cheap for classification, powerful for synthesis):
440
+
441
+ ```ruby
442
+ # config/initializers/feature_flags.rb
443
+ module FeatureFlags
444
+ SELECTOR_MODEL = ENV.fetch("DSPY_SELECTOR_MODEL", "ruby_llm/gemini-2.5-flash-lite")
445
+ SYNTHESIZER_MODEL = ENV.fetch("DSPY_SYNTHESIZER_MODEL", "ruby_llm/gemini-2.5-flash")
446
+ end
447
+ ```
448
+
449
+ Then override per-tool or per-predictor:
450
+
451
+ ```ruby
452
+ class ClassifyTool < DSPy::Tools::Base
453
+ def call(query:)
454
+ predictor = DSPy::Predict.new(ClassifyQuery)
455
+ predictor.configure { |c| c.lm = DSPy::LM.new(FeatureFlags::SELECTOR_MODEL, structured_outputs: true) }
456
+ predictor.call(query: query)
457
+ end
458
+ end
459
+ ```
460
+
461
+ ## Schema-Driven Signatures
462
+
463
+ **Prefer typed schemas over string descriptions.** Let the type system communicate structure to the LLM rather than prose in the signature description.
464
+
465
+ ### Entities as Shared Types
466
+
467
+ Define reusable `T::Struct` and `T::Enum` types in `app/entities/` and reference them across signatures:
468
+
469
+ ```ruby
470
+ # app/entities/search_strategy.rb
471
+ class SearchStrategy < T::Enum
472
+ enums do
473
+ SingleSearch = new("single_search")
474
+ DateDecomposition = new("date_decomposition")
475
+ end
476
+ end
477
+
478
+ # app/entities/scored_item.rb
479
+ class ScoredItem < T::Struct
480
+ const :id, String
481
+ const :score, Float, description: "Relevance score 0.0-1.0"
482
+ const :verdict, String, description: "relevant, maybe, or irrelevant"
483
+ const :reason, String, default: ""
484
+ end
485
+ ```
486
+
487
+ ### Schema vs Description: When to Use Each
488
+
489
+ **Use schemas (T::Struct/T::Enum)** for:
490
+ - Multi-field outputs with specific types
491
+ - Enums with defined values the LLM must pick from
492
+ - Nested structures, arrays of typed objects
493
+ - Outputs consumed by code (not displayed to users)
494
+
495
+ **Use string descriptions** for:
496
+ - Simple single-field outputs where the type is `String`
497
+ - Natural language generation (summaries, answers)
498
+ - Fields where constraint guidance helps (e.g., `description: "YYYY-MM-DD format"`)
499
+
500
+ **Rule of thumb**: If you'd write a `case` statement on the output, it should be a `T::Enum`. If you'd call `.each` on it, it should be `T::Array[SomeStruct]`.
501
+
502
+ ## Tool Patterns
503
+
504
+ ### Tools That Wrap Predictions
505
+
506
+ A common pattern: tools encapsulate a DSPy prediction, adding error handling, model selection, and serialization:
507
+
508
+ ```ruby
509
+ class RerankTool < DSPy::Tools::Base
510
+ tool_name "rerank"
511
+ tool_description "Score and rank search results by relevance"
512
+
513
+ MAX_ITEMS = 200
514
+ MIN_ITEMS_FOR_LLM = 5
515
+
516
+ sig { params(query: String, items: T::Array[T::Hash[Symbol, T.untyped]]).returns(T::Hash[Symbol, T.untyped]) }
517
+ def call(query:, items: [])
518
+ return { scored_items: items, reranked: false } if items.size < MIN_ITEMS_FOR_LLM
519
+
520
+ capped_items = items.first(MAX_ITEMS)
521
+ predictor = DSPy::Predict.new(RerankSignature)
522
+ predictor.configure { |c| c.lm = DSPy::LM.new(FeatureFlags::SYNTHESIZER_MODEL, structured_outputs: true) }
523
+
524
+ result = predictor.call(query: query, items: capped_items)
525
+ { scored_items: result.scored_items, reranked: true }
526
+ rescue => e
527
+ Rails.logger.warn "[RerankTool] LLM rerank failed: #{e.message}"
528
+ { error: "Rerank failed: #{e.message}", scored_items: items, reranked: false }
529
+ end
530
+ end
531
+ ```
532
+
533
+ **Key patterns:**
534
+ - Short-circuit LLM calls when unnecessary (small data, trivial cases)
535
+ - Cap input size to prevent token overflow
536
+ - Per-tool model selection via `configure`
537
+ - Graceful error handling with fallback data
538
+
539
+ ### Error Handling Concern
540
+
541
+ ```ruby
542
+ module ErrorHandling
543
+ extend ActiveSupport::Concern
544
+
545
+ private
546
+
547
+ def safe_predict(signature_class, **inputs)
548
+ predictor = DSPy::Predict.new(signature_class)
549
+ yield predictor if block_given?
550
+ predictor.call(**inputs)
551
+ rescue Faraday::Error, Net::HTTPError => e
552
+ Rails.logger.error "[#{self.class.name}] API error: #{e.message}"
553
+ nil
554
+ rescue JSON::ParserError => e
555
+ Rails.logger.error "[#{self.class.name}] Invalid LLM output: #{e.message}"
556
+ nil
557
+ end
558
+ end
559
+ ```
560
+
561
+ ## Observability
562
+
563
+ ### Tracing with DSPy::Context
564
+
565
+ Wrap operations in spans for Langfuse/OpenTelemetry visibility:
566
+
567
+ ```ruby
568
+ result = DSPy::Context.with_span(
569
+ operation: "tool_selector.select",
570
+ "dspy.module" => "ToolSelector",
571
+ "tool_selector.tools" => tool_names.join(",")
572
+ ) do
573
+ @predictor.call(query: query, context: context, available_tools: schemas)
574
+ end
575
+ ```
576
+
577
+ ### Setup for Langfuse
578
+
579
+ ```ruby
580
+ # Gemfile
581
+ gem 'dspy-o11y'
582
+ gem 'dspy-o11y-langfuse'
583
+
584
+ # .env
585
+ LANGFUSE_PUBLIC_KEY=pk-...
586
+ LANGFUSE_SECRET_KEY=sk-...
587
+ DSPY_TELEMETRY_BATCH_SIZE=5
588
+ ```
589
+
590
+ Every `DSPy::Predict`, `DSPy::ReAct`, and tool call is automatically traced when observability is configured.
591
+
592
+ ### Score Reporting
593
+
594
+ Report evaluation scores to Langfuse:
595
+
596
+ ```ruby
597
+ DSPy.score(name: "relevance", value: 0.85, trace_id: current_trace_id)
598
+ ```
599
+
600
+ ## Testing
601
+
602
+ ### VCR Setup for Rails
603
+
604
+ ```ruby
605
+ VCR.configure do |config|
606
+ config.cassette_library_dir = "spec/vcr_cassettes"
607
+ config.hook_into :webmock
608
+ config.configure_rspec_metadata!
609
+ config.filter_sensitive_data('<GEMINI_API_KEY>') { ENV['GEMINI_API_KEY'] }
610
+ config.filter_sensitive_data('<OPENAI_API_KEY>') { ENV['OPENAI_API_KEY'] }
611
+ end
612
+ ```
613
+
614
+ ### Signature Schema Tests
615
+
616
+ Test that signatures produce valid schemas without calling any LLM:
617
+
618
+ ```ruby
619
+ RSpec.describe ClassifyResearchQuery do
620
+ it "has required input fields" do
621
+ schema = described_class.input_json_schema
622
+ expect(schema[:required]).to include("query")
623
+ end
624
+
625
+ it "has typed output fields" do
626
+ schema = described_class.output_json_schema
627
+ expect(schema[:properties]).to have_key(:search_strategy)
628
+ end
629
+ end
630
+ ```
631
+
632
+ ### Tool Tests with Mocked Predictions
633
+
634
+ ```ruby
635
+ RSpec.describe RerankTool do
636
+ let(:tool) { described_class.new }
637
+
638
+ it "skips LLM for small result sets" do
639
+ expect(DSPy::Predict).not_to receive(:new)
640
+ result = tool.call(query: "test", items: [{ id: "1" }])
641
+ expect(result[:reranked]).to be false
642
+ end
643
+
644
+ it "calls LLM for large result sets", :vcr do
645
+ items = 10.times.map { |i| { id: i.to_s, title: "Item #{i}" } }
646
+ result = tool.call(query: "relevant items", items: items)
647
+ expect(result[:reranked]).to be true
648
+ end
649
+ end
650
+ ```
651
+
652
+ ## Resources
653
+
654
+ - [core-concepts.md](./references/core-concepts.md) — Signatures, modules, predictors, type system deep-dive
655
+ - [toolsets.md](./references/toolsets.md) — Tools::Base, Tools::Toolset DSL, type safety, testing
656
+ - [providers.md](./references/providers.md) — Provider adapters, RubyLLM, fiber-local LM context, compatibility matrix
657
+ - [optimization.md](./references/optimization.md) — MIPROv2, GEPA, evaluation framework, storage system
658
+ - [observability.md](./references/observability.md) — Event system, dspy-o11y gems, Langfuse, score reporting
659
+ - [signature-template.rb](./assets/signature-template.rb) — Signature scaffold with T::Enum, Date/Time, defaults, union types
660
+ - [module-template.rb](./assets/module-template.rb) — Module scaffold with .call(), lifecycle callbacks, fiber-local LM
661
+ - [config-template.rb](./assets/config-template.rb) — Rails initializer with RubyLLM, observability, feature flags
662
+
663
+ ## Key URLs
664
+
665
+ - Homepage: https://oss.vicente.services/dspy.rb/
666
+ - GitHub: https://github.com/vicentereig/dspy.rb
667
+ - Documentation: https://oss.vicente.services/dspy.rb/getting-started/
668
+
669
+ ## Guidelines for Claude
670
+
671
+ When helping users with DSPy.rb:
672
+
673
+ 1. **Schema over prose** — Define output structure with `T::Struct` and `T::Enum` types, not string descriptions
674
+ 2. **Entities in `app/entities/`** — Extract shared types so signatures stay thin
675
+ 3. **Per-tool model selection** — Use `predictor.configure { |c| c.lm = ... }` to pick the right model per task
676
+ 4. **Short-circuit LLM calls** — Skip the LLM for trivial cases (small data, cached results)
677
+ 5. **Cap input sizes** — Prevent token overflow by limiting array sizes before sending to LLM
678
+ 6. **Test schemas without LLM** — Validate `input_json_schema` and `output_json_schema` in unit tests
679
+ 7. **VCR for integration tests** — Record real HTTP interactions, never mock LLM responses by hand
680
+ 8. **Trace with spans** — Wrap tool calls in `DSPy::Context.with_span` for observability
681
+ 9. **Graceful degradation** — Always rescue LLM errors and return fallback data
682
+
683
+ ### Signature Best Practices
684
+
685
+ **Keep description concise** — The signature `description` should state the goal, not the field details:
686
+
687
+ ```ruby
688
+ # Good — concise goal
689
+ class ParseOutline < DSPy::Signature
690
+ description 'Extract block-level structure from HTML as a flat list of skeleton sections.'
691
+
692
+ input do
693
+ const :html, String, description: 'Raw HTML to parse'
694
+ end
695
+
696
+ output do
697
+ const :sections, T::Array[Section], description: 'Block elements: headings, paragraphs, code blocks, lists'
698
+ end
699
+ end
700
+ ```
701
+
702
+ **Use defaults over nilable arrays** — For OpenAI structured outputs compatibility:
703
+
704
+ ```ruby
705
+ # Good — works with OpenAI structured outputs
706
+ class ASTNode < T::Struct
707
+ const :children, T::Array[ASTNode], default: []
708
+ end
709
+ ```
710
+
711
+ ### Recursive Types with `$defs`
712
+
713
+ DSPy.rb supports recursive types in structured outputs using JSON Schema `$defs`:
714
+
715
+ ```ruby
716
+ class TreeNode < T::Struct
717
+ const :value, String
718
+ const :children, T::Array[TreeNode], default: [] # Self-reference
719
+ end
720
+ ```
721
+
722
+ The schema generator automatically creates `#/$defs/TreeNode` references for recursive types, compatible with OpenAI and Gemini structured outputs.
723
+
724
+ ### Field Descriptions for T::Struct
725
+
726
+ DSPy.rb extends T::Struct to support field-level `description:` kwargs that flow to JSON Schema:
727
+
728
+ ```ruby
729
+ class ASTNode < T::Struct
730
+ const :node_type, NodeType, description: 'The type of node (heading, paragraph, etc.)'
731
+ const :text, String, default: "", description: 'Text content of the node'
732
+ const :level, Integer, default: 0 # No description — field is self-explanatory
733
+ const :children, T::Array[ASTNode], default: []
734
+ end
735
+ ```
736
+
737
+ **When to use field descriptions**: complex field semantics, enum-like strings, constrained values, nested structs with ambiguous names. **When to skip**: self-explanatory fields like `name`, `id`, `url`, or boolean flags.
738
+
739
+ ## Version
740
+
741
+ Current: 0.34.3