@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.
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/bin/install.js +302 -0
- package/bin/plan-export.js +300 -0
- package/bin/plan-view.js +695 -0
- package/install.sh +136 -0
- package/package.json +28 -0
- package/plugins/lavra/.claude-plugin/plugin.json +22 -0
- package/plugins/lavra/.mcp.json +8 -0
- package/plugins/lavra/README.md +125 -0
- package/plugins/lavra/agents/design/design-implementation-reviewer.md +123 -0
- package/plugins/lavra/agents/design/design-iterator.md +219 -0
- package/plugins/lavra/agents/design/figma-design-sync.md +212 -0
- package/plugins/lavra/agents/docs/ankane-readme-writer.md +90 -0
- package/plugins/lavra/agents/research/best-practices-researcher.md +131 -0
- package/plugins/lavra/agents/research/framework-docs-researcher.md +111 -0
- package/plugins/lavra/agents/research/git-history-analyzer.md +73 -0
- package/plugins/lavra/agents/research/learnings-researcher.md +255 -0
- package/plugins/lavra/agents/research/repo-research-analyst.md +157 -0
- package/plugins/lavra/agents/review/agent-native-reviewer.md +274 -0
- package/plugins/lavra/agents/review/architecture-strategist.md +82 -0
- package/plugins/lavra/agents/review/code-simplicity-reviewer.md +109 -0
- package/plugins/lavra/agents/review/data-integrity-guardian.md +89 -0
- package/plugins/lavra/agents/review/data-migration-expert.md +118 -0
- package/plugins/lavra/agents/review/deployment-verification-agent.md +178 -0
- package/plugins/lavra/agents/review/dhh-rails-reviewer.md +94 -0
- package/plugins/lavra/agents/review/goal-verifier.md +109 -0
- package/plugins/lavra/agents/review/julik-frontend-races-reviewer.md +239 -0
- package/plugins/lavra/agents/review/kieran-python-reviewer.md +148 -0
- package/plugins/lavra/agents/review/kieran-rails-reviewer.md +130 -0
- package/plugins/lavra/agents/review/kieran-typescript-reviewer.md +139 -0
- package/plugins/lavra/agents/review/migration-drift-detector.md +307 -0
- package/plugins/lavra/agents/review/pattern-recognition-specialist.md +87 -0
- package/plugins/lavra/agents/review/performance-oracle.md +154 -0
- package/plugins/lavra/agents/review/security-sentinel.md +125 -0
- package/plugins/lavra/agents/workflow/bug-reproduction-validator.md +119 -0
- package/plugins/lavra/agents/workflow/every-style-editor.md +97 -0
- package/plugins/lavra/agents/workflow/lint.md +30 -0
- package/plugins/lavra/agents/workflow/pr-comment-resolver.md +95 -0
- package/plugins/lavra/agents/workflow/spec-flow-analyzer.md +156 -0
- package/plugins/lavra/commands/changelog.md +149 -0
- package/plugins/lavra/commands/heal-skill.md +130 -0
- package/plugins/lavra/commands/lavra-brainstorm.md +388 -0
- package/plugins/lavra/commands/lavra-ceo-review.md +388 -0
- package/plugins/lavra/commands/lavra-checkpoint.md +162 -0
- package/plugins/lavra/commands/lavra-design.md +621 -0
- package/plugins/lavra/commands/lavra-eng-review.md +262 -0
- package/plugins/lavra/commands/lavra-import.md +194 -0
- package/plugins/lavra/commands/lavra-learn.md +176 -0
- package/plugins/lavra/commands/lavra-plan.md +515 -0
- package/plugins/lavra/commands/lavra-qa.md +357 -0
- package/plugins/lavra/commands/lavra-quick.md +178 -0
- package/plugins/lavra/commands/lavra-recall.md +279 -0
- package/plugins/lavra/commands/lavra-research.md +267 -0
- package/plugins/lavra/commands/lavra-retro.md +400 -0
- package/plugins/lavra/commands/lavra-review.md +401 -0
- package/plugins/lavra/commands/lavra-ship.md +330 -0
- package/plugins/lavra/commands/lavra-triage.md +159 -0
- package/plugins/lavra/commands/lavra-work-ralph.md +521 -0
- package/plugins/lavra/commands/lavra-work-teams.md +504 -0
- package/plugins/lavra/commands/lavra-work.md +1019 -0
- package/plugins/lavra/commands/optional/agent-native-audit.md +282 -0
- package/plugins/lavra/commands/optional/feature-video.md +262 -0
- package/plugins/lavra/commands/optional/generate-command.md +146 -0
- package/plugins/lavra/commands/optional/reproduce-bug.md +97 -0
- package/plugins/lavra/commands/optional/xcode-test.md +287 -0
- package/plugins/lavra/commands/report-bug.md +155 -0
- package/plugins/lavra/commands/test-browser.md +305 -0
- package/plugins/lavra/cortex/agents/design/design-implementation-reviewer.md +127 -0
- package/plugins/lavra/cortex/agents/design/design-iterator.md +222 -0
- package/plugins/lavra/cortex/agents/design/figma-design-sync.md +215 -0
- package/plugins/lavra/cortex/agents/docs/ankane-readme-writer.md +93 -0
- package/plugins/lavra/cortex/agents/research/best-practices-researcher.md +135 -0
- package/plugins/lavra/cortex/agents/research/framework-docs-researcher.md +115 -0
- package/plugins/lavra/cortex/agents/research/git-history-analyzer.md +77 -0
- package/plugins/lavra/cortex/agents/research/learnings-researcher.md +259 -0
- package/plugins/lavra/cortex/agents/research/repo-research-analyst.md +161 -0
- package/plugins/lavra/cortex/agents/review/agent-native-reviewer.md +278 -0
- package/plugins/lavra/cortex/agents/review/architecture-strategist.md +86 -0
- package/plugins/lavra/cortex/agents/review/code-simplicity-reviewer.md +113 -0
- package/plugins/lavra/cortex/agents/review/data-integrity-guardian.md +93 -0
- package/plugins/lavra/cortex/agents/review/data-migration-expert.md +122 -0
- package/plugins/lavra/cortex/agents/review/deployment-verification-agent.md +182 -0
- package/plugins/lavra/cortex/agents/review/dhh-rails-reviewer.md +98 -0
- package/plugins/lavra/cortex/agents/review/goal-verifier.md +113 -0
- package/plugins/lavra/cortex/agents/review/julik-frontend-races-reviewer.md +243 -0
- package/plugins/lavra/cortex/agents/review/kieran-python-reviewer.md +152 -0
- package/plugins/lavra/cortex/agents/review/kieran-rails-reviewer.md +134 -0
- package/plugins/lavra/cortex/agents/review/kieran-typescript-reviewer.md +143 -0
- package/plugins/lavra/cortex/agents/review/migration-drift-detector.md +311 -0
- package/plugins/lavra/cortex/agents/review/pattern-recognition-specialist.md +91 -0
- package/plugins/lavra/cortex/agents/review/performance-oracle.md +158 -0
- package/plugins/lavra/cortex/agents/review/security-sentinel.md +129 -0
- package/plugins/lavra/cortex/agents/workflow/bug-reproduction-validator.md +123 -0
- package/plugins/lavra/cortex/agents/workflow/every-style-editor.md +101 -0
- package/plugins/lavra/cortex/agents/workflow/lint.md +33 -0
- package/plugins/lavra/cortex/agents/workflow/pr-comment-resolver.md +98 -0
- package/plugins/lavra/cortex/agents/workflow/spec-flow-analyzer.md +160 -0
- package/plugins/lavra/cortex/commands/agent-native-audit.md +286 -0
- package/plugins/lavra/cortex/commands/changelog.md +153 -0
- package/plugins/lavra/cortex/commands/create-agent-skill.md +21 -0
- package/plugins/lavra/cortex/commands/deploy-docs.md +69 -0
- package/plugins/lavra/cortex/commands/feature-video.md +266 -0
- package/plugins/lavra/cortex/commands/generate-command.md +150 -0
- package/plugins/lavra/cortex/commands/heal-skill.md +134 -0
- package/plugins/lavra/cortex/commands/lavra-brainstorm.md +392 -0
- package/plugins/lavra/cortex/commands/lavra-ceo-review.md +392 -0
- package/plugins/lavra/cortex/commands/lavra-checkpoint.md +166 -0
- package/plugins/lavra/cortex/commands/lavra-compound.md +168 -0
- package/plugins/lavra/cortex/commands/lavra-deepen.md +389 -0
- package/plugins/lavra/cortex/commands/lavra-design.md +625 -0
- package/plugins/lavra/cortex/commands/lavra-eng-review.md +266 -0
- package/plugins/lavra/cortex/commands/lavra-import.md +198 -0
- package/plugins/lavra/cortex/commands/lavra-learn.md +180 -0
- package/plugins/lavra/cortex/commands/lavra-parallel.md +910 -0
- package/plugins/lavra/cortex/commands/lavra-plan.md +519 -0
- package/plugins/lavra/cortex/commands/lavra-qa.md +361 -0
- package/plugins/lavra/cortex/commands/lavra-quick.md +182 -0
- package/plugins/lavra/cortex/commands/lavra-recall.md +283 -0
- package/plugins/lavra/cortex/commands/lavra-research.md +271 -0
- package/plugins/lavra/cortex/commands/lavra-retro.md +404 -0
- package/plugins/lavra/cortex/commands/lavra-review.md +405 -0
- package/plugins/lavra/cortex/commands/lavra-ship.md +334 -0
- package/plugins/lavra/cortex/commands/lavra-triage.md +163 -0
- package/plugins/lavra/cortex/commands/lavra-work-ralph.md +525 -0
- package/plugins/lavra/cortex/commands/lavra-work-teams.md +508 -0
- package/plugins/lavra/cortex/commands/lavra-work.md +1023 -0
- package/plugins/lavra/cortex/commands/lfg.md +30 -0
- package/plugins/lavra/cortex/commands/release-docs.md +148 -0
- package/plugins/lavra/cortex/commands/report-bug.md +159 -0
- package/plugins/lavra/cortex/commands/reproduce-bug.md +101 -0
- package/plugins/lavra/cortex/commands/resolve-pr-parallel.md +58 -0
- package/plugins/lavra/cortex/commands/resolve-todo-parallel.md +56 -0
- package/plugins/lavra/cortex/commands/test-browser.md +309 -0
- package/plugins/lavra/cortex/commands/xcode-test.md +291 -0
- package/plugins/lavra/cortex/skills/agent-browser/SKILL.md +227 -0
- package/plugins/lavra/cortex/skills/agent-native-architecture/SKILL.md +439 -0
- package/plugins/lavra/cortex/skills/andrew-kane-gem-writer/SKILL.md +188 -0
- package/plugins/lavra/cortex/skills/brainstorming/SKILL.md +197 -0
- package/plugins/lavra/cortex/skills/create-agent-skills/SKILL.md +304 -0
- package/plugins/lavra/cortex/skills/dhh-rails-style/SKILL.md +189 -0
- package/plugins/lavra/cortex/skills/dspy-ruby/SKILL.md +741 -0
- package/plugins/lavra/cortex/skills/every-style-editor/SKILL.md +138 -0
- package/plugins/lavra/cortex/skills/file-todos/SKILL.md +256 -0
- package/plugins/lavra/cortex/skills/frontend-design/SKILL.md +46 -0
- package/plugins/lavra/cortex/skills/gemini-imagegen/SKILL.md +242 -0
- package/plugins/lavra/cortex/skills/git-worktree/SKILL.md +307 -0
- package/plugins/lavra/cortex/skills/lavra-knowledge/SKILL.md +464 -0
- package/plugins/lavra/cortex/skills/project-setup/SKILL.md +418 -0
- package/plugins/lavra/cortex/skills/rclone/SKILL.md +155 -0
- package/plugins/lavra/docs/quickstart.md +267 -0
- package/plugins/lavra/examples/example-plan.md +197 -0
- package/plugins/lavra/gemini/agents/design/design-implementation-reviewer.md +130 -0
- package/plugins/lavra/gemini/agents/design/design-iterator.md +225 -0
- package/plugins/lavra/gemini/agents/design/figma-design-sync.md +218 -0
- package/plugins/lavra/gemini/agents/docs/ankane-readme-writer.md +96 -0
- package/plugins/lavra/gemini/agents/research/best-practices-researcher.md +138 -0
- package/plugins/lavra/gemini/agents/research/framework-docs-researcher.md +118 -0
- package/plugins/lavra/gemini/agents/research/git-history-analyzer.md +80 -0
- package/plugins/lavra/gemini/agents/research/learnings-researcher.md +262 -0
- package/plugins/lavra/gemini/agents/research/repo-research-analyst.md +164 -0
- package/plugins/lavra/gemini/agents/review/agent-native-reviewer.md +281 -0
- package/plugins/lavra/gemini/agents/review/architecture-strategist.md +89 -0
- package/plugins/lavra/gemini/agents/review/code-simplicity-reviewer.md +116 -0
- package/plugins/lavra/gemini/agents/review/data-integrity-guardian.md +96 -0
- package/plugins/lavra/gemini/agents/review/data-migration-expert.md +125 -0
- package/plugins/lavra/gemini/agents/review/deployment-verification-agent.md +185 -0
- package/plugins/lavra/gemini/agents/review/dhh-rails-reviewer.md +101 -0
- package/plugins/lavra/gemini/agents/review/goal-verifier.md +116 -0
- package/plugins/lavra/gemini/agents/review/julik-frontend-races-reviewer.md +246 -0
- package/plugins/lavra/gemini/agents/review/kieran-python-reviewer.md +155 -0
- package/plugins/lavra/gemini/agents/review/kieran-rails-reviewer.md +137 -0
- package/plugins/lavra/gemini/agents/review/kieran-typescript-reviewer.md +146 -0
- package/plugins/lavra/gemini/agents/review/migration-drift-detector.md +314 -0
- package/plugins/lavra/gemini/agents/review/pattern-recognition-specialist.md +94 -0
- package/plugins/lavra/gemini/agents/review/performance-oracle.md +161 -0
- package/plugins/lavra/gemini/agents/review/security-sentinel.md +132 -0
- package/plugins/lavra/gemini/agents/workflow/bug-reproduction-validator.md +126 -0
- package/plugins/lavra/gemini/agents/workflow/every-style-editor.md +103 -0
- package/plugins/lavra/gemini/agents/workflow/lint.md +36 -0
- package/plugins/lavra/gemini/agents/workflow/pr-comment-resolver.md +101 -0
- package/plugins/lavra/gemini/agents/workflow/spec-flow-analyzer.md +163 -0
- package/plugins/lavra/gemini/commands/agent-native-audit.toml +284 -0
- package/plugins/lavra/gemini/commands/beads-brainstorm.toml +292 -0
- package/plugins/lavra/gemini/commands/beads-checkpoint.toml +145 -0
- package/plugins/lavra/gemini/commands/beads-compound.toml +167 -0
- package/plugins/lavra/gemini/commands/beads-deepen.toml +388 -0
- package/plugins/lavra/gemini/commands/beads-design.toml +295 -0
- package/plugins/lavra/gemini/commands/beads-import.toml +197 -0
- package/plugins/lavra/gemini/commands/beads-parallel.toml +909 -0
- package/plugins/lavra/gemini/commands/beads-plan-review.toml +201 -0
- package/plugins/lavra/gemini/commands/beads-plan.toml +391 -0
- package/plugins/lavra/gemini/commands/beads-quick.toml +134 -0
- package/plugins/lavra/gemini/commands/beads-recall.toml +281 -0
- package/plugins/lavra/gemini/commands/beads-review.toml +338 -0
- package/plugins/lavra/gemini/commands/beads-triage.toml +161 -0
- package/plugins/lavra/gemini/commands/beads-work.toml +347 -0
- package/plugins/lavra/gemini/commands/changelog.toml +151 -0
- package/plugins/lavra/gemini/commands/create-agent-skill.toml +18 -0
- package/plugins/lavra/gemini/commands/deploy-docs.toml +68 -0
- package/plugins/lavra/gemini/commands/feature-video.toml +264 -0
- package/plugins/lavra/gemini/commands/generate-command.toml +148 -0
- package/plugins/lavra/gemini/commands/heal-skill.toml +131 -0
- package/plugins/lavra/gemini/commands/lavra-brainstorm.toml +391 -0
- package/plugins/lavra/gemini/commands/lavra-ceo-review.toml +391 -0
- package/plugins/lavra/gemini/commands/lavra-checkpoint.toml +165 -0
- package/plugins/lavra/gemini/commands/lavra-design.toml +624 -0
- package/plugins/lavra/gemini/commands/lavra-eng-review.toml +265 -0
- package/plugins/lavra/gemini/commands/lavra-import.toml +197 -0
- package/plugins/lavra/gemini/commands/lavra-learn.toml +179 -0
- package/plugins/lavra/gemini/commands/lavra-plan-review.toml +201 -0
- package/plugins/lavra/gemini/commands/lavra-plan.toml +518 -0
- package/plugins/lavra/gemini/commands/lavra-qa.toml +360 -0
- package/plugins/lavra/gemini/commands/lavra-quick.toml +181 -0
- package/plugins/lavra/gemini/commands/lavra-recall.toml +281 -0
- package/plugins/lavra/gemini/commands/lavra-research.toml +270 -0
- package/plugins/lavra/gemini/commands/lavra-retro.toml +403 -0
- package/plugins/lavra/gemini/commands/lavra-review.toml +404 -0
- package/plugins/lavra/gemini/commands/lavra-ship.toml +333 -0
- package/plugins/lavra/gemini/commands/lavra-triage.toml +161 -0
- package/plugins/lavra/gemini/commands/lavra-work-ralph.toml +523 -0
- package/plugins/lavra/gemini/commands/lavra-work-teams.toml +507 -0
- package/plugins/lavra/gemini/commands/lavra-work.toml +1022 -0
- package/plugins/lavra/gemini/commands/lfg.toml +28 -0
- package/plugins/lavra/gemini/commands/release-docs.toml +146 -0
- package/plugins/lavra/gemini/commands/report-bug.toml +157 -0
- package/plugins/lavra/gemini/commands/reproduce-bug.toml +99 -0
- package/plugins/lavra/gemini/commands/resolve-pr-parallel.toml +56 -0
- package/plugins/lavra/gemini/commands/resolve-todo-parallel.toml +54 -0
- package/plugins/lavra/gemini/commands/test-browser.toml +307 -0
- package/plugins/lavra/gemini/commands/xcode-test.toml +289 -0
- package/plugins/lavra/gemini/docs/MCP_SETUP.md +41 -0
- package/plugins/lavra/gemini/skills/agent-browser/SKILL.md +227 -0
- package/plugins/lavra/gemini/skills/agent-native-architecture/SKILL.md +439 -0
- package/plugins/lavra/gemini/skills/andrew-kane-gem-writer/SKILL.md +188 -0
- package/plugins/lavra/gemini/skills/beads-knowledge/SKILL.md +464 -0
- package/plugins/lavra/gemini/skills/brainstorming/SKILL.md +197 -0
- package/plugins/lavra/gemini/skills/create-agent-skills/SKILL.md +304 -0
- package/plugins/lavra/gemini/skills/dhh-rails-style/SKILL.md +189 -0
- package/plugins/lavra/gemini/skills/dspy-ruby/SKILL.md +741 -0
- package/plugins/lavra/gemini/skills/every-style-editor/SKILL.md +138 -0
- package/plugins/lavra/gemini/skills/file-todos/SKILL.md +256 -0
- package/plugins/lavra/gemini/skills/frontend-design/SKILL.md +46 -0
- package/plugins/lavra/gemini/skills/gemini-imagegen/SKILL.md +242 -0
- package/plugins/lavra/gemini/skills/git-worktree/SKILL.md +307 -0
- package/plugins/lavra/gemini/skills/lavra-knowledge/SKILL.md +464 -0
- package/plugins/lavra/gemini/skills/project-setup/SKILL.md +418 -0
- package/plugins/lavra/gemini/skills/rclone/SKILL.md +155 -0
- package/plugins/lavra/gemini-extension.json +50 -0
- package/plugins/lavra/gemini-src/settings.json +37 -0
- package/plugins/lavra/hooks/auto-recall.sh +210 -0
- package/plugins/lavra/hooks/check-memory.sh +169 -0
- package/plugins/lavra/hooks/hooks.json +47 -0
- package/plugins/lavra/hooks/knowledge-db.sh +255 -0
- package/plugins/lavra/hooks/memory-capture.sh +132 -0
- package/plugins/lavra/hooks/provision-memory.sh +144 -0
- package/plugins/lavra/hooks/recall.sh +152 -0
- package/plugins/lavra/hooks/subagent-wrapup.sh +44 -0
- package/plugins/lavra/hooks/teammate-idle-check.sh +29 -0
- package/plugins/lavra/opencode/agents/design/design-implementation-reviewer.md +127 -0
- package/plugins/lavra/opencode/agents/design/design-iterator.md +222 -0
- package/plugins/lavra/opencode/agents/design/figma-design-sync.md +215 -0
- package/plugins/lavra/opencode/agents/docs/ankane-readme-writer.md +93 -0
- package/plugins/lavra/opencode/agents/research/best-practices-researcher.md +135 -0
- package/plugins/lavra/opencode/agents/research/framework-docs-researcher.md +115 -0
- package/plugins/lavra/opencode/agents/research/git-history-analyzer.md +77 -0
- package/plugins/lavra/opencode/agents/research/learnings-researcher.md +259 -0
- package/plugins/lavra/opencode/agents/research/repo-research-analyst.md +161 -0
- package/plugins/lavra/opencode/agents/review/agent-native-reviewer.md +278 -0
- package/plugins/lavra/opencode/agents/review/architecture-strategist.md +86 -0
- package/plugins/lavra/opencode/agents/review/code-simplicity-reviewer.md +113 -0
- package/plugins/lavra/opencode/agents/review/data-integrity-guardian.md +93 -0
- package/plugins/lavra/opencode/agents/review/data-migration-expert.md +122 -0
- package/plugins/lavra/opencode/agents/review/deployment-verification-agent.md +182 -0
- package/plugins/lavra/opencode/agents/review/dhh-rails-reviewer.md +98 -0
- package/plugins/lavra/opencode/agents/review/goal-verifier.md +113 -0
- package/plugins/lavra/opencode/agents/review/julik-frontend-races-reviewer.md +243 -0
- package/plugins/lavra/opencode/agents/review/kieran-python-reviewer.md +152 -0
- package/plugins/lavra/opencode/agents/review/kieran-rails-reviewer.md +134 -0
- package/plugins/lavra/opencode/agents/review/kieran-typescript-reviewer.md +143 -0
- package/plugins/lavra/opencode/agents/review/migration-drift-detector.md +311 -0
- package/plugins/lavra/opencode/agents/review/pattern-recognition-specialist.md +91 -0
- package/plugins/lavra/opencode/agents/review/performance-oracle.md +158 -0
- package/plugins/lavra/opencode/agents/review/security-sentinel.md +129 -0
- package/plugins/lavra/opencode/agents/workflow/bug-reproduction-validator.md +123 -0
- package/plugins/lavra/opencode/agents/workflow/every-style-editor.md +100 -0
- package/plugins/lavra/opencode/agents/workflow/lint.md +33 -0
- package/plugins/lavra/opencode/agents/workflow/pr-comment-resolver.md +98 -0
- package/plugins/lavra/opencode/agents/workflow/spec-flow-analyzer.md +160 -0
- package/plugins/lavra/opencode/commands/agent-native-audit.md +286 -0
- package/plugins/lavra/opencode/commands/changelog.md +153 -0
- package/plugins/lavra/opencode/commands/create-agent-skill.md +21 -0
- package/plugins/lavra/opencode/commands/deploy-docs.md +69 -0
- package/plugins/lavra/opencode/commands/feature-video.md +266 -0
- package/plugins/lavra/opencode/commands/generate-command.md +150 -0
- package/plugins/lavra/opencode/commands/heal-skill.md +134 -0
- package/plugins/lavra/opencode/commands/lavra-brainstorm.md +392 -0
- package/plugins/lavra/opencode/commands/lavra-ceo-review.md +392 -0
- package/plugins/lavra/opencode/commands/lavra-checkpoint.md +166 -0
- package/plugins/lavra/opencode/commands/lavra-compound.md +168 -0
- package/plugins/lavra/opencode/commands/lavra-deepen.md +389 -0
- package/plugins/lavra/opencode/commands/lavra-design.md +625 -0
- package/plugins/lavra/opencode/commands/lavra-eng-review.md +266 -0
- package/plugins/lavra/opencode/commands/lavra-import.md +198 -0
- package/plugins/lavra/opencode/commands/lavra-learn.md +180 -0
- package/plugins/lavra/opencode/commands/lavra-parallel.md +910 -0
- package/plugins/lavra/opencode/commands/lavra-plan.md +519 -0
- package/plugins/lavra/opencode/commands/lavra-qa.md +361 -0
- package/plugins/lavra/opencode/commands/lavra-quick.md +182 -0
- package/plugins/lavra/opencode/commands/lavra-recall.md +283 -0
- package/plugins/lavra/opencode/commands/lavra-research.md +271 -0
- package/plugins/lavra/opencode/commands/lavra-retro.md +404 -0
- package/plugins/lavra/opencode/commands/lavra-review.md +405 -0
- package/plugins/lavra/opencode/commands/lavra-ship.md +334 -0
- package/plugins/lavra/opencode/commands/lavra-triage.md +163 -0
- package/plugins/lavra/opencode/commands/lavra-work-ralph.md +525 -0
- package/plugins/lavra/opencode/commands/lavra-work-teams.md +508 -0
- package/plugins/lavra/opencode/commands/lavra-work.md +1023 -0
- package/plugins/lavra/opencode/commands/lfg.md +30 -0
- package/plugins/lavra/opencode/commands/release-docs.md +148 -0
- package/plugins/lavra/opencode/commands/report-bug.md +159 -0
- package/plugins/lavra/opencode/commands/reproduce-bug.md +101 -0
- package/plugins/lavra/opencode/commands/resolve-pr-parallel.md +58 -0
- package/plugins/lavra/opencode/commands/resolve-todo-parallel.md +56 -0
- package/plugins/lavra/opencode/commands/test-browser.md +309 -0
- package/plugins/lavra/opencode/commands/xcode-test.md +291 -0
- package/plugins/lavra/opencode/docs/MCP_SETUP.md +48 -0
- package/plugins/lavra/opencode/skills/agent-browser/SKILL.md +227 -0
- package/plugins/lavra/opencode/skills/agent-native-architecture/SKILL.md +439 -0
- package/plugins/lavra/opencode/skills/andrew-kane-gem-writer/SKILL.md +188 -0
- package/plugins/lavra/opencode/skills/brainstorming/SKILL.md +197 -0
- package/plugins/lavra/opencode/skills/create-agent-skills/SKILL.md +304 -0
- package/plugins/lavra/opencode/skills/dhh-rails-style/SKILL.md +189 -0
- package/plugins/lavra/opencode/skills/dspy-ruby/SKILL.md +741 -0
- package/plugins/lavra/opencode/skills/every-style-editor/SKILL.md +138 -0
- package/plugins/lavra/opencode/skills/file-todos/SKILL.md +256 -0
- package/plugins/lavra/opencode/skills/frontend-design/SKILL.md +46 -0
- package/plugins/lavra/opencode/skills/gemini-imagegen/SKILL.md +242 -0
- package/plugins/lavra/opencode/skills/git-worktree/SKILL.md +307 -0
- package/plugins/lavra/opencode/skills/lavra-knowledge/SKILL.md +464 -0
- package/plugins/lavra/opencode/skills/project-setup/SKILL.md +418 -0
- package/plugins/lavra/opencode/skills/rclone/SKILL.md +155 -0
- package/plugins/lavra/opencode-src/package.json +13 -0
- package/plugins/lavra/opencode-src/plugin.ts +176 -0
- package/plugins/lavra/scripts/import-plan.sh +141 -0
- package/plugins/lavra/skills/agent-browser/SKILL.md +223 -0
- package/plugins/lavra/skills/agent-native-architecture/SKILL.md +435 -0
- package/plugins/lavra/skills/agent-native-architecture/references/action-parity-discipline.md +353 -0
- package/plugins/lavra/skills/agent-native-architecture/references/agent-execution-patterns.md +362 -0
- package/plugins/lavra/skills/agent-native-architecture/references/agent-native-testing.md +508 -0
- package/plugins/lavra/skills/agent-native-architecture/references/architecture-patterns.md +478 -0
- package/plugins/lavra/skills/agent-native-architecture/references/dynamic-context-injection.md +281 -0
- package/plugins/lavra/skills/agent-native-architecture/references/files-universal-interface.md +301 -0
- package/plugins/lavra/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +227 -0
- package/plugins/lavra/skills/agent-native-architecture/references/mcp-tool-design.md +427 -0
- package/plugins/lavra/skills/agent-native-architecture/references/mobile-patterns.md +410 -0
- package/plugins/lavra/skills/agent-native-architecture/references/product-implications.md +341 -0
- package/plugins/lavra/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +317 -0
- package/plugins/lavra/skills/agent-native-architecture/references/self-modification.md +269 -0
- package/plugins/lavra/skills/agent-native-architecture/references/shared-workspace-architecture.md +517 -0
- package/plugins/lavra/skills/agent-native-architecture/references/system-prompt-design.md +250 -0
- package/plugins/lavra/skills/brainstorming/SKILL.md +193 -0
- package/plugins/lavra/skills/create-agent-skills/SKILL.md +300 -0
- package/plugins/lavra/skills/create-agent-skills/references/api-security.md +60 -0
- package/plugins/lavra/skills/create-agent-skills/references/be-clear-and-direct.md +84 -0
- package/plugins/lavra/skills/create-agent-skills/references/best-practices.md +404 -0
- package/plugins/lavra/skills/create-agent-skills/references/common-patterns.md +121 -0
- package/plugins/lavra/skills/create-agent-skills/references/core-principles.md +103 -0
- package/plugins/lavra/skills/create-agent-skills/references/executable-code.md +92 -0
- package/plugins/lavra/skills/create-agent-skills/references/iteration-and-testing.md +164 -0
- package/plugins/lavra/skills/create-agent-skills/references/official-spec.md +185 -0
- package/plugins/lavra/skills/create-agent-skills/references/recommended-structure.md +168 -0
- package/plugins/lavra/skills/create-agent-skills/references/skill-structure.md +215 -0
- package/plugins/lavra/skills/create-agent-skills/references/using-scripts.md +113 -0
- package/plugins/lavra/skills/create-agent-skills/references/using-templates.md +112 -0
- package/plugins/lavra/skills/create-agent-skills/references/workflows-and-validation.md +122 -0
- package/plugins/lavra/skills/create-agent-skills/templates/router-skill.md +73 -0
- package/plugins/lavra/skills/create-agent-skills/templates/simple-skill.md +33 -0
- package/plugins/lavra/skills/create-agent-skills/workflows/add-reference.md +55 -0
- package/plugins/lavra/skills/create-agent-skills/workflows/add-script.md +59 -0
- package/plugins/lavra/skills/create-agent-skills/workflows/add-template.md +51 -0
- package/plugins/lavra/skills/create-agent-skills/workflows/add-workflow.md +54 -0
- package/plugins/lavra/skills/create-agent-skills/workflows/audit-skill.md +63 -0
- package/plugins/lavra/skills/create-agent-skills/workflows/create-domain-expertise-skill.md +68 -0
- package/plugins/lavra/skills/create-agent-skills/workflows/create-new-skill.md +92 -0
- package/plugins/lavra/skills/create-agent-skills/workflows/get-guidance.md +70 -0
- package/plugins/lavra/skills/create-agent-skills/workflows/upgrade-to-router.md +68 -0
- package/plugins/lavra/skills/create-agent-skills/workflows/verify-skill.md +63 -0
- package/plugins/lavra/skills/file-todos/SKILL.md +252 -0
- package/plugins/lavra/skills/file-todos/assets/todo-template.md +155 -0
- package/plugins/lavra/skills/git-worktree/SKILL.md +303 -0
- package/plugins/lavra/skills/git-worktree/scripts/worktree-manager.sh +345 -0
- package/plugins/lavra/skills/lavra-knowledge/SKILL.md +460 -0
- package/plugins/lavra/skills/lavra-knowledge/references/jsonl-schema.md +104 -0
- package/plugins/lavra/skills/optional/andrew-kane-gem-writer/SKILL.md +184 -0
- package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/database-adapters.md +231 -0
- package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/module-organization.md +121 -0
- package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/rails-integration.md +183 -0
- package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/resources.md +119 -0
- package/plugins/lavra/skills/optional/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
- package/plugins/lavra/skills/optional/dhh-rails-style/SKILL.md +185 -0
- package/plugins/lavra/skills/optional/dhh-rails-style/references/architecture.md +653 -0
- package/plugins/lavra/skills/optional/dhh-rails-style/references/controllers.md +303 -0
- package/plugins/lavra/skills/optional/dhh-rails-style/references/frontend.md +510 -0
- package/plugins/lavra/skills/optional/dhh-rails-style/references/gems.md +266 -0
- package/plugins/lavra/skills/optional/dhh-rails-style/references/models.md +359 -0
- package/plugins/lavra/skills/optional/dhh-rails-style/references/testing.md +338 -0
- package/plugins/lavra/skills/optional/dspy-ruby/SKILL.md +737 -0
- package/plugins/lavra/skills/optional/dspy-ruby/assets/config-template.rb +187 -0
- package/plugins/lavra/skills/optional/dspy-ruby/assets/module-template.rb +300 -0
- package/plugins/lavra/skills/optional/dspy-ruby/assets/signature-template.rb +221 -0
- package/plugins/lavra/skills/optional/dspy-ruby/references/core-concepts.md +674 -0
- package/plugins/lavra/skills/optional/dspy-ruby/references/observability.md +366 -0
- package/plugins/lavra/skills/optional/dspy-ruby/references/optimization.md +603 -0
- package/plugins/lavra/skills/optional/dspy-ruby/references/providers.md +418 -0
- package/plugins/lavra/skills/optional/dspy-ruby/references/toolsets.md +502 -0
- package/plugins/lavra/skills/optional/every-style-editor/SKILL.md +134 -0
- package/plugins/lavra/skills/optional/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
- package/plugins/lavra/skills/optional/frontend-design/SKILL.md +42 -0
- package/plugins/lavra/skills/optional/gemini-imagegen/SKILL.md +238 -0
- package/plugins/lavra/skills/optional/gemini-imagegen/requirements.txt +2 -0
- package/plugins/lavra/skills/optional/gemini-imagegen/scripts/compose_images.py +157 -0
- package/plugins/lavra/skills/optional/gemini-imagegen/scripts/edit_image.py +144 -0
- package/plugins/lavra/skills/optional/gemini-imagegen/scripts/gemini_images.py +263 -0
- package/plugins/lavra/skills/optional/gemini-imagegen/scripts/generate_image.py +133 -0
- package/plugins/lavra/skills/optional/gemini-imagegen/scripts/multi_turn_chat.py +216 -0
- package/plugins/lavra/skills/optional/rclone/SKILL.md +151 -0
- package/plugins/lavra/skills/optional/rclone/scripts/check_setup.sh +60 -0
- package/plugins/lavra/skills/project-setup/SKILL.md +414 -0
- package/plugins/lavra/tests/build-index.sh +116 -0
- package/plugins/lavra/tests/recall-bench.sh +224 -0
- package/plugins/lavra/tests/search-fts5.sh +65 -0
- package/plugins/lavra/tests/search-grep.sh +54 -0
- package/plugins/lavra/tests/test-queries.jsonl +25 -0
- package/scripts/apply-context-optimizations.py +345 -0
- package/scripts/convert-cortex.ts +257 -0
- package/scripts/convert-gemini.ts +369 -0
- package/scripts/convert-opencode.ts +313 -0
- package/scripts/package.json +27 -0
- package/scripts/pre-release-check.sh +176 -0
- package/scripts/select-opencode-models.sh +178 -0
- package/scripts/shared/model-config.json +17 -0
- package/scripts/shared/model-mapping.ts +129 -0
- package/scripts/shared/security.ts +97 -0
- package/scripts/shared/yaml-parser.ts +55 -0
- package/scripts/sqlite-to-jsonl.py +207 -0
- package/scripts/test-compatibility.ts +539 -0
- package/scripts/test-features.sh +342 -0
- package/scripts/test-installation.sh +514 -0
- package/scripts/test-security.ts +275 -0
- package/scripts/trim-agent-descriptions.py +177 -0
- 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
|
+
}
|