@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,369 @@
1
+ #!/usr/bin/env bun
2
+
3
+ /**
4
+ * convert-gemini.ts
5
+ * Converts lavra plugin files from Claude Code format to Gemini CLI format
6
+ *
7
+ * Security controls:
8
+ * - Path traversal protection
9
+ * - File size limits (10MB)
10
+ * - YAML SAFE_SCHEMA parsing
11
+ * - Template injection prevention (escape {{ }})
12
+ * - Model name validation
13
+ * - Explicit file permissions (644)
14
+ */
15
+
16
+ import { readdir, mkdir } from "node:fs/promises";
17
+ import { join } from "node:path";
18
+ import {
19
+ validatePath,
20
+ sanitizeFilename,
21
+ readFileSafe,
22
+ writeFileSafe,
23
+ validateModelName,
24
+ validateFilename,
25
+ } from "./shared/security";
26
+ import {
27
+ parseFrontmatter,
28
+ extractBody,
29
+ buildMarkdown,
30
+ } from "./shared/yaml-parser";
31
+ import { mapToGemini } from "./shared/model-mapping";
32
+
33
+ const PLUGIN_VERSION = "0.6.0";
34
+ const SOURCE_DIR = join(import.meta.dir, "../plugins/lavra");
35
+ const OUTPUT_DIR = join(import.meta.dir, "../plugins/lavra/gemini");
36
+
37
+ /**
38
+ * Safely converts template syntax while preventing injection
39
+ * Escapes existing {{ }} syntax before adding new template variables
40
+ */
41
+ function convertTemplateSyntax(content: string): string {
42
+ // First, escape any existing template syntax to prevent injection
43
+ let safe = content
44
+ .replace(/\{\{/g, "\\{\\{")
45
+ .replace(/\}\}/g, "\\}\\}");
46
+
47
+ // Then perform safe substitutions for known variables
48
+ // Only convert $ARGUMENTS if it's not inside a code block
49
+ const lines = safe.split("\n");
50
+ const converted: string[] = [];
51
+ let inCodeBlock = false;
52
+
53
+ for (const line of lines) {
54
+ // Track code blocks
55
+ if (line.trim().startsWith("```")) {
56
+ inCodeBlock = !inCodeBlock;
57
+ converted.push(line);
58
+ continue;
59
+ }
60
+
61
+ // Only convert outside code blocks
62
+ if (!inCodeBlock) {
63
+ converted.push(line.replace(/\$ARGUMENTS(?!\w)/g, "{{args}}"));
64
+ } else {
65
+ converted.push(line);
66
+ }
67
+ }
68
+
69
+ return converted.join("\n");
70
+ }
71
+
72
+ /**
73
+ * Generates TOML format for Gemini commands
74
+ */
75
+ function generateTOML(description: string, prompt: string): string {
76
+ // Escape double quotes in strings
77
+ const escapedDesc = description.replace(/"/g, '\\"');
78
+ const escapedPrompt = prompt.replace(/"""/g, '\\"\\"\\"');
79
+
80
+ return `# Generated by lavra v${PLUGIN_VERSION}
81
+ # DO NOT EDIT - changes will be overwritten on next install
82
+
83
+ description = "${escapedDesc}"
84
+
85
+ prompt = """
86
+ ${escapedPrompt}
87
+ """
88
+ `;
89
+ }
90
+
91
+ /**
92
+ * Converts commands (.md → .toml with template syntax conversion)
93
+ */
94
+ async function convertCommands() {
95
+ console.log("Converting commands...");
96
+
97
+ const commandsDir = validatePath(SOURCE_DIR, "commands");
98
+ const outputDir = validatePath(OUTPUT_DIR, "commands");
99
+
100
+ await mkdir(outputDir, { recursive: true, mode: 0o755 });
101
+
102
+ const files = await readdir(commandsDir);
103
+ const mdFiles = files.filter((f) => f.endsWith(".md"));
104
+
105
+ // Parallel processing for performance
106
+ await Promise.all(
107
+ mdFiles.map(async (file) => {
108
+ if (!validateFilename(file)) {
109
+ console.warn(` ⚠️ Skipping invalid filename: ${file}`);
110
+ return;
111
+ }
112
+
113
+ const sourcePath = validatePath(commandsDir, file);
114
+ const baseName = file.replace(/\.md$/, "");
115
+ const outputPath = validatePath(
116
+ outputDir,
117
+ sanitizeFilename(baseName) + ".toml"
118
+ );
119
+
120
+ const content = await readFileSafe(sourcePath);
121
+ const frontmatter = parseFrontmatter(content);
122
+ const body = extractBody(content);
123
+
124
+ // Extract description from frontmatter
125
+ const description = frontmatter.description || baseName;
126
+
127
+ // Convert template syntax safely
128
+ const convertedPrompt = convertTemplateSyntax(body);
129
+
130
+ // Generate TOML
131
+ const toml = generateTOML(description, convertedPrompt);
132
+
133
+ await writeFileSafe(outputPath, toml, 0o644);
134
+ console.log(` ✓ ${file} → ${baseName}.toml`);
135
+ })
136
+ );
137
+
138
+ console.log(` Converted ${mdFiles.length} commands\n`);
139
+ }
140
+
141
+ /**
142
+ * Converts agents (field mapping required)
143
+ */
144
+ async function convertAgents() {
145
+ console.log("Converting agents...");
146
+
147
+ const categories = ["review", "research", "design", "workflow", "docs"];
148
+ let totalConverted = 0;
149
+
150
+ // Create all category directories upfront
151
+ await Promise.all(
152
+ categories.map((category) =>
153
+ mkdir(join(OUTPUT_DIR, "agents", category), {
154
+ recursive: true,
155
+ mode: 0o755,
156
+ })
157
+ )
158
+ );
159
+
160
+ // Process each category in parallel
161
+ await Promise.all(
162
+ categories.map(async (category) => {
163
+ const categoryDir = validatePath(SOURCE_DIR, `agents/${category}`);
164
+ const outputCategoryDir = validatePath(OUTPUT_DIR, `agents/${category}`);
165
+
166
+ const files = await readdir(categoryDir);
167
+ const mdFiles = files.filter((f) => f.endsWith(".md"));
168
+
169
+ // Process files in parallel
170
+ await Promise.all(
171
+ mdFiles.map(async (file) => {
172
+ if (!validateFilename(file)) {
173
+ console.warn(` ⚠️ Skipping invalid filename: ${file}`);
174
+ return;
175
+ }
176
+
177
+ const sourcePath = validatePath(categoryDir, file);
178
+ const outputPath = validatePath(outputCategoryDir, sanitizeFilename(file));
179
+
180
+ const content = await readFileSafe(sourcePath);
181
+ const frontmatter = parseFrontmatter(content);
182
+ const body = extractBody(content);
183
+
184
+ // Transform frontmatter for Gemini
185
+ const geminiFrontmatter: Record<string, any> = {
186
+ name: frontmatter.name || file.replace(/\.md$/, ""),
187
+ description: frontmatter.description || "",
188
+ kind: "local",
189
+ };
190
+
191
+ // Map model if present
192
+ if (frontmatter.model) {
193
+ const mappedModel = mapToGemini(frontmatter.model);
194
+ validateModelName(mappedModel);
195
+ geminiFrontmatter.model = mappedModel;
196
+ } else {
197
+ geminiFrontmatter.model = "gemini-2.5-pro";
198
+ }
199
+
200
+ // Add Gemini-specific fields
201
+ geminiFrontmatter.max_turns = 30;
202
+ geminiFrontmatter.timeout_mins = 10;
203
+
204
+ // Build output
205
+ const output = buildMarkdown(geminiFrontmatter, body);
206
+
207
+ // Add generation header
208
+ const withHeader = `<!-- Generated by lavra v${PLUGIN_VERSION} -->
209
+ <!-- Source: ${category}/${file} -->
210
+ <!-- DO NOT EDIT - changes will be overwritten on next install -->
211
+
212
+ ${output}`;
213
+
214
+ await writeFileSafe(outputPath, withHeader, 0o644);
215
+ console.log(` ✓ ${category}/${file}`);
216
+ })
217
+ );
218
+
219
+ totalConverted += mdFiles.length;
220
+ })
221
+ );
222
+
223
+ console.log(` Converted ${totalConverted} agents\n`);
224
+ }
225
+
226
+ /**
227
+ * Converts skills (direct copy - same format)
228
+ */
229
+ async function convertSkills() {
230
+ console.log("Converting skills...");
231
+
232
+ const skillsDir = validatePath(SOURCE_DIR, "skills");
233
+ const outputDir = validatePath(OUTPUT_DIR, "skills");
234
+
235
+ await mkdir(outputDir, { recursive: true, mode: 0o755 });
236
+
237
+ const skillDirs = await readdir(skillsDir, { withFileTypes: true });
238
+ const skills = skillDirs.filter((d) => d.isDirectory() && d.name !== "optional").map((d) => d.name);
239
+
240
+ // Process each skill directory in parallel
241
+ await Promise.all(
242
+ skills.map(async (skill) => {
243
+ const skillDir = validatePath(skillsDir, skill);
244
+ const outputSkillDir = validatePath(outputDir, sanitizeFilename(skill));
245
+
246
+ await mkdir(outputSkillDir, { recursive: true, mode: 0o755 });
247
+
248
+ // Copy SKILL.md
249
+ const skillMd = join(skillDir, "SKILL.md");
250
+ const outputSkillMd = join(outputSkillDir, "SKILL.md");
251
+
252
+ try {
253
+ const content = await readFileSafe(skillMd);
254
+
255
+ // Add generation header
256
+ const withHeader = `<!-- Generated by lavra v${PLUGIN_VERSION} -->
257
+ <!-- Source: ${skill}/SKILL.md -->
258
+ <!-- DO NOT EDIT - changes will be overwritten on next install -->
259
+
260
+ ${content}`;
261
+
262
+ await writeFileSafe(outputSkillMd, withHeader, 0o644); // Standard permissions
263
+ console.log(` ✓ ${skill}/SKILL.md`);
264
+ } catch (err) {
265
+ console.warn(` ⚠️ Skipping ${skill} (no SKILL.md found): ${err}`);
266
+ }
267
+ })
268
+ );
269
+
270
+ console.log(` Converted ${skills.length} skills\n`);
271
+ }
272
+
273
+ /**
274
+ * Generates documentation about MCP server configuration
275
+ */
276
+ async function generateMCPDocs() {
277
+ console.log("Generating MCP configuration docs...");
278
+
279
+ const docsDir = validatePath(OUTPUT_DIR, "docs");
280
+ await mkdir(docsDir, { recursive: true, mode: 0o755 });
281
+
282
+ const mcpDocs = `# MCP Server Configuration for Gemini CLI
283
+
284
+ The lavra plugin uses the Context7 MCP server for framework documentation.
285
+
286
+ ## Manual Configuration Required
287
+
288
+ Gemini CLI does not support automatic MCP server installation. You need to manually add the server to your Gemini configuration.
289
+
290
+ ### Configuration File
291
+
292
+ Add to \`~/.config/gemini/settings.json\`:
293
+
294
+ \`\`\`json
295
+ {
296
+ "mcpServers": {
297
+ "context7": {
298
+ "command": "npx",
299
+ "args": ["-y", "@upwithcrowd/context7-mcp@latest"],
300
+ "env": {}
301
+ }
302
+ }
303
+ }
304
+ \`\`\`
305
+
306
+ ### What Context7 Provides
307
+
308
+ - Semantic search across PostgreSQL and TimescaleDB documentation
309
+ - Framework-specific best practices and patterns
310
+ - API reference lookups
311
+
312
+ ### Usage in Gemini CLI
313
+
314
+ Once configured, use the \`@context7\` MCP tool to search documentation:
315
+
316
+ \`\`\`
317
+ @context7 search_docs source=postgres query="create hypertable" search_type=semantic
318
+ \`\`\`
319
+
320
+ ## Security Note
321
+
322
+ The Context7 MCP server runs as a subprocess with access to your environment. Only install if you trust the source.
323
+ `;
324
+
325
+ const docsPath = join(docsDir, "MCP_SETUP.md");
326
+ await writeFileSafe(docsPath, mcpDocs, 0o644);
327
+
328
+ console.log(` ✓ Generated MCP_SETUP.md\n`);
329
+ }
330
+
331
+ /**
332
+ * Main conversion function
333
+ */
334
+ async function main() {
335
+ console.log("🔄 Converting lavra to Gemini CLI format\n");
336
+ console.log(`Source: ${SOURCE_DIR}`);
337
+ console.log(`Output: ${OUTPUT_DIR}\n`);
338
+
339
+ try {
340
+ // Create root output directory
341
+ await mkdir(OUTPUT_DIR, { recursive: true, mode: 0o755 });
342
+
343
+ // Run all conversions in parallel
344
+ await Promise.all([
345
+ convertCommands(),
346
+ convertAgents(),
347
+ convertSkills(),
348
+ generateMCPDocs(),
349
+ ]);
350
+
351
+ console.log("✅ Conversion complete!");
352
+ console.log(`\nGenerated files in: ${OUTPUT_DIR}`);
353
+ console.log("\nNext steps:");
354
+ console.log("1. Review the generated files");
355
+ console.log("2. Install as Gemini extension:");
356
+ console.log(" gemini extensions install https://github.com/roberto-mello/lavra");
357
+ console.log("3. Configure MCP servers (see gemini/docs/MCP_SETUP.md)");
358
+ } catch (err: any) {
359
+ console.error("❌ Conversion failed:", err.message);
360
+ process.exit(1);
361
+ }
362
+ }
363
+
364
+ // Run if executed directly
365
+ if (import.meta.main) {
366
+ main();
367
+ }
368
+
369
+ export { convertCommands, convertAgents, convertSkills };
@@ -0,0 +1,313 @@
1
+ #!/usr/bin/env bun
2
+
3
+ /**
4
+ * convert-opencode.ts
5
+ * Converts lavra plugin files from Claude Code format to OpenCode format
6
+ *
7
+ * Security controls:
8
+ * - Path traversal protection
9
+ * - File size limits (10MB)
10
+ * - YAML SAFE_SCHEMA parsing
11
+ * - Model name validation
12
+ * - Explicit file permissions (644)
13
+ */
14
+
15
+ import { readdir, mkdir } from "node:fs/promises";
16
+ import { join, basename } from "node:path";
17
+ import {
18
+ validatePath,
19
+ sanitizeFilename,
20
+ readFileSafe,
21
+ writeFileSafe,
22
+ validateModelName,
23
+ validateFilename,
24
+ } from "./shared/security";
25
+ import {
26
+ parseFrontmatter,
27
+ extractBody,
28
+ buildMarkdown,
29
+ } from "./shared/yaml-parser";
30
+ import { mapToOpenCode } from "./shared/model-mapping";
31
+
32
+ const PLUGIN_VERSION = "0.6.0";
33
+ const SOURCE_DIR = join(import.meta.dir, "../plugins/lavra");
34
+ const OUTPUT_DIR = join(import.meta.dir, "../plugins/lavra/opencode");
35
+
36
+ /**
37
+ * Converts commands (direct copy - formats are identical)
38
+ */
39
+ async function convertCommands() {
40
+ console.log("Converting commands...");
41
+
42
+ const commandsDir = validatePath(SOURCE_DIR, "commands");
43
+ const outputDir = validatePath(OUTPUT_DIR, "commands");
44
+
45
+ await mkdir(outputDir, { recursive: true, mode: 0o755 });
46
+
47
+ const files = await readdir(commandsDir);
48
+ const mdFiles = files.filter((f) => f.endsWith(".md"));
49
+
50
+ // Parallel processing for performance
51
+ await Promise.all(
52
+ mdFiles.map(async (file) => {
53
+ if (!validateFilename(file)) {
54
+ console.warn(` ⚠️ Skipping invalid filename: ${file}`);
55
+ return;
56
+ }
57
+
58
+ const sourcePath = validatePath(commandsDir, file);
59
+ const outputPath = validatePath(outputDir, sanitizeFilename(file));
60
+
61
+ const content = await readFileSafe(sourcePath);
62
+
63
+ // Add generation header
64
+ const withHeader = `<!-- Generated by lavra v${PLUGIN_VERSION} -->
65
+ <!-- Source: ${file} -->
66
+ <!-- DO NOT EDIT - changes will be overwritten on next install -->
67
+
68
+ ${content}`;
69
+
70
+ await writeFileSafe(outputPath, withHeader, 0o644);
71
+ console.log(` ✓ ${file}`);
72
+ })
73
+ );
74
+
75
+ console.log(` Converted ${mdFiles.length} commands\n`);
76
+ }
77
+
78
+ /**
79
+ * Converts agents (field mapping required)
80
+ */
81
+ async function convertAgents() {
82
+ console.log("Converting agents...");
83
+
84
+ const categories = ["review", "research", "design", "workflow", "docs"];
85
+ let totalConverted = 0;
86
+
87
+ // Create all category directories upfront
88
+ await Promise.all(
89
+ categories.map((category) =>
90
+ mkdir(join(OUTPUT_DIR, "agents", category), {
91
+ recursive: true,
92
+ mode: 0o755,
93
+ })
94
+ )
95
+ );
96
+
97
+ // Process each category in parallel
98
+ await Promise.all(
99
+ categories.map(async (category) => {
100
+ const categoryDir = validatePath(SOURCE_DIR, `agents/${category}`);
101
+ const outputCategoryDir = validatePath(OUTPUT_DIR, `agents/${category}`);
102
+
103
+ const files = await readdir(categoryDir);
104
+ const mdFiles = files.filter((f) => f.endsWith(".md"));
105
+
106
+ // Process files in parallel
107
+ await Promise.all(
108
+ mdFiles.map(async (file) => {
109
+ if (!validateFilename(file)) {
110
+ console.warn(` ⚠️ Skipping invalid filename: ${file}`);
111
+ return;
112
+ }
113
+
114
+ const sourcePath = validatePath(categoryDir, file);
115
+ const outputPath = validatePath(outputCategoryDir, sanitizeFilename(file));
116
+
117
+ const content = await readFileSafe(sourcePath);
118
+ const frontmatter = parseFrontmatter(content);
119
+ const body = extractBody(content);
120
+
121
+ // Transform frontmatter for OpenCode
122
+ const opencodeFrontmatter: Record<string, any> = {
123
+ description: frontmatter.description || "",
124
+ mode: "subagent",
125
+ };
126
+
127
+ // Map model if present and not inherit
128
+ if (frontmatter.model && frontmatter.model !== "inherit") {
129
+ const mappedModel = mapToOpenCode(frontmatter.model);
130
+ validateModelName(mappedModel);
131
+ opencodeFrontmatter.model = mappedModel;
132
+ } else {
133
+ opencodeFrontmatter.model = "inherit";
134
+ }
135
+
136
+ // Build output
137
+ const output = buildMarkdown(opencodeFrontmatter, body);
138
+
139
+ // Add generation header
140
+ const withHeader = `<!-- Generated by lavra v${PLUGIN_VERSION} -->
141
+ <!-- Source: ${category}/${file} -->
142
+ <!-- DO NOT EDIT - changes will be overwritten on next install -->
143
+
144
+ ${output}`;
145
+
146
+ await writeFileSafe(outputPath, withHeader, 0o644);
147
+ console.log(` ✓ ${category}/${file}`);
148
+ })
149
+ );
150
+
151
+ totalConverted += mdFiles.length;
152
+ })
153
+ );
154
+
155
+ console.log(` Converted ${totalConverted} agents\n`);
156
+ }
157
+
158
+ /**
159
+ * Converts skills (direct copy - OpenCode searches .claude/skills/ automatically)
160
+ * We still copy them for completeness and to allow .opencode/ to be standalone
161
+ */
162
+ async function convertSkills() {
163
+ console.log("Converting skills...");
164
+
165
+ const skillsDir = validatePath(SOURCE_DIR, "skills");
166
+ const outputDir = validatePath(OUTPUT_DIR, "skills");
167
+
168
+ await mkdir(outputDir, { recursive: true, mode: 0o755 });
169
+
170
+ const skillDirs = await readdir(skillsDir, { withFileTypes: true });
171
+ const skills = skillDirs.filter((d) => d.isDirectory() && d.name !== "optional").map((d) => d.name);
172
+
173
+ // Process each skill directory in parallel
174
+ await Promise.all(
175
+ skills.map(async (skill) => {
176
+ const skillDir = validatePath(skillsDir, skill);
177
+ const outputSkillDir = validatePath(outputDir, sanitizeFilename(skill));
178
+
179
+ await mkdir(outputSkillDir, { recursive: true, mode: 0o755 });
180
+
181
+ // Copy SKILL.md
182
+ const skillMd = join(skillDir, "SKILL.md");
183
+ const outputSkillMd = join(outputSkillDir, "SKILL.md");
184
+
185
+ try {
186
+ const content = await readFileSafe(skillMd);
187
+
188
+ // Add generation header
189
+ const withHeader = `<!-- Generated by lavra v${PLUGIN_VERSION} -->
190
+ <!-- Source: ${skill}/SKILL.md -->
191
+ <!-- DO NOT EDIT - changes will be overwritten on next install -->
192
+
193
+ ${content}`;
194
+
195
+ await writeFileSafe(outputSkillMd, withHeader, 0o644); // Standard permissions
196
+ console.log(` ✓ ${skill}/SKILL.md`);
197
+ } catch (err) {
198
+ console.warn(` ⚠️ Skipping ${skill} (no SKILL.md found): ${err}`);
199
+ }
200
+ })
201
+ );
202
+
203
+ console.log(` Converted ${skills.length} skills\n`);
204
+ }
205
+
206
+ /**
207
+ * Generates documentation about MCP server configuration
208
+ */
209
+ async function generateMCPDocs() {
210
+ console.log("Generating MCP configuration docs...");
211
+
212
+ const docsDir = validatePath(OUTPUT_DIR, "docs");
213
+ await mkdir(docsDir, { recursive: true, mode: 0o755 });
214
+
215
+ const mcpDocs = `# MCP Server Configuration for OpenCode
216
+
217
+ The lavra plugin uses the Context7 MCP server for framework documentation.
218
+
219
+ ## Manual Configuration Required
220
+
221
+ OpenCode does not support automatic MCP server installation. You need to manually add the server to your OpenCode configuration.
222
+
223
+ ### Configuration File
224
+
225
+ Add to \`~/.config/opencode/config.json\` or your project's \`opencode.json\`:
226
+
227
+ \`\`\`json
228
+ {
229
+ "mcpServers": {
230
+ "context7": {
231
+ "command": "npx",
232
+ "args": ["-y", "@upwithcrowd/context7-mcp@latest"],
233
+ "env": {}
234
+ }
235
+ }
236
+ }
237
+ \`\`\`
238
+
239
+ ### What Context7 Provides
240
+
241
+ - Semantic search across PostgreSQL and TimescaleDB documentation
242
+ - Framework-specific best practices and patterns
243
+ - API reference lookups
244
+
245
+ ### Usage in OpenCode
246
+
247
+ Once configured, agents can use the Context7 tools to search documentation:
248
+
249
+ \`\`\`typescript
250
+ // Example: Search PostgreSQL docs
251
+ await mcp.call("context7", "search_docs", {
252
+ source: "postgres",
253
+ search_type: "semantic",
254
+ query: "create hypertable with compression",
255
+ version: "latest",
256
+ limit: 5
257
+ });
258
+ \`\`\`
259
+
260
+ ## Security Note
261
+
262
+ The Context7 MCP server runs as a subprocess with access to your environment. Only install if you trust the source.
263
+ `;
264
+
265
+ const docsPath = join(docsDir, "MCP_SETUP.md");
266
+ await writeFileSafe(docsPath, mcpDocs, 0o644);
267
+
268
+ console.log(` ✓ Generated MCP_SETUP.md\n`);
269
+ }
270
+
271
+ /**
272
+ * Main conversion function
273
+ */
274
+ async function main() {
275
+ console.log("🔄 Converting lavra to OpenCode format\n");
276
+ console.log(`Source: ${SOURCE_DIR}`);
277
+ console.log(`Output: ${OUTPUT_DIR}\n`);
278
+
279
+ try {
280
+ // Create root output directory
281
+ await mkdir(OUTPUT_DIR, { recursive: true, mode: 0o755 });
282
+
283
+ // Run all conversions in parallel
284
+ await Promise.all([
285
+ convertCommands(),
286
+ convertAgents(),
287
+ convertSkills(),
288
+ generateMCPDocs(),
289
+ ]);
290
+
291
+ console.log("✅ Conversion complete!");
292
+ console.log(`\nGenerated files in: ${OUTPUT_DIR}`);
293
+
294
+ // Only show manual copy instructions if running standalone (not during install)
295
+ if (!process.env.LAVRA_INSTALLING) {
296
+ console.log("\nNext steps:");
297
+ console.log("1. Review the generated files");
298
+ console.log("2. Copy to your OpenCode project:");
299
+ console.log(` cp -r ${OUTPUT_DIR}/* <project>/.opencode/`);
300
+ console.log("3. Configure MCP servers (see opencode/docs/MCP_SETUP.md)");
301
+ }
302
+ } catch (err: any) {
303
+ console.error("❌ Conversion failed:", err.message);
304
+ process.exit(1);
305
+ }
306
+ }
307
+
308
+ // Run if executed directly
309
+ if (import.meta.main) {
310
+ main();
311
+ }
312
+
313
+ export { convertCommands, convertAgents, convertSkills };
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "lavra-converters",
3
+ "version": "0.6.0",
4
+ "description": "Conversion scripts for lavra multi-platform support",
5
+ "type": "module",
6
+ "scripts": {
7
+ "convert:opencode": "bun run convert-opencode.ts",
8
+ "convert:gemini": "bun run convert-gemini.ts",
9
+ "convert:all": "bun run convert-opencode.ts && bun run convert-gemini.ts",
10
+ "test:security": "bun run test-security.ts",
11
+ "test:compatibility": "bun run test-compatibility.ts",
12
+ "test:all": "bun run test-security.ts && bun run test-compatibility.ts"
13
+ },
14
+ "dependencies": {
15
+ "js-yaml": "4.1.0"
16
+ },
17
+ "devDependencies": {
18
+ "@types/bun": "latest",
19
+ "@types/js-yaml": "4.0.9"
20
+ },
21
+ "engines": {
22
+ "bun": ">=1.0.0"
23
+ },
24
+ "overrides": {
25
+ "js-yaml": "4.1.0"
26
+ }
27
+ }