@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,345 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Apply context optimizations from compound-engineering-plugin PR #161.
|
|
4
|
+
Phase 1: Trim agent descriptions and move examples to body.
|
|
5
|
+
Phase 2: Add disable-model-invocation to manual commands.
|
|
6
|
+
Phase 3: Add disable-model-invocation to manual skills.
|
|
7
|
+
"""
|
|
8
|
+
import re
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Dict, Tuple
|
|
11
|
+
|
|
12
|
+
BASE = Path("/Users/rbm/Documents/projects/lavra/plugins/lavra")
|
|
13
|
+
|
|
14
|
+
# Phase 1: Agent descriptions (based on compound-engineering patterns)
|
|
15
|
+
AGENT_DESCRIPTIONS = {
|
|
16
|
+
# Review agents (14)
|
|
17
|
+
"kieran-rails-reviewer": "Reviews Rails code with an extremely high quality bar for conventions, clarity, and maintainability. Use after implementing features, modifying code, or creating new Rails components.",
|
|
18
|
+
"agent-native-reviewer": "Reviews code for agent-native compliance - ensuring user actions have agent equivalents and agents see what users see. Checks action parity, context parity, and shared workspace design.",
|
|
19
|
+
"architecture-strategist": "Analyzes code changes from an architectural perspective - evaluating system design, component boundaries, SOLID compliance, and dependency analysis. Use for structural changes, new services, or refactorings.",
|
|
20
|
+
"code-simplicity-reviewer": "Final review ensuring code is as simple and minimal as possible. Identifies unnecessary complexity, challenges premature abstractions, applies YAGNI rigorously. Use after implementation.",
|
|
21
|
+
"data-integrity-guardian": "Reviews database migrations, data models, and persistent data manipulation. Checks migration safety, validates constraints, verifies referential integrity, audits privacy compliance.",
|
|
22
|
+
"data-migration-expert": "Reviews PRs touching database migrations, data backfills, or production data transformations. Validates ID mappings, checks for swapped values, verifies rollback safety.",
|
|
23
|
+
"deployment-verification-agent": "Produces pre/post-deploy checklists with SQL verification queries, rollback procedures, and monitoring plans. Use when PRs touch production data, migrations, or behavior that could silently fail.",
|
|
24
|
+
"dhh-rails-reviewer": "Brutally honest Rails code review from DHH's perspective. Identifies anti-patterns, JavaScript framework contamination, unnecessary abstractions, and Rails convention violations.",
|
|
25
|
+
"julik-frontend-races-reviewer": "Reviews JavaScript and Stimulus code for race conditions, timing issues, and DOM irregularities. Checks Hotwire/Turbo compatibility, event handler cleanup, timer cancellation. Use after JavaScript changes.",
|
|
26
|
+
"kieran-python-reviewer": "Python code review enforcing strict conventions: mandatory type hints (modern 3.10+ syntax), Pythonic patterns, proper module organization, testability, naming clarity. Use after Python changes.",
|
|
27
|
+
"kieran-typescript-reviewer": "TypeScript code review enforcing strict conventions: no-any policy, proper type safety, modern TS 5+ patterns, import organization, testability, naming clarity. Use after TypeScript changes.",
|
|
28
|
+
"pattern-recognition-specialist": "Analyzes code for design patterns, anti-patterns, naming conventions, code duplication, and architectural boundary violations. Produces structured reports with actionable refactoring recommendations.",
|
|
29
|
+
"performance-oracle": "Analyzes code for performance bottlenecks, algorithmic complexity, N+1 queries, memory leaks, caching opportunities, and scalability concerns. Projects performance at 10x/100x/1000x volumes.",
|
|
30
|
+
"security-sentinel": "Performs security audits covering input validation, SQL injection, XSS, authentication/authorization, hardcoded secrets, and OWASP Top 10 compliance. Use for code handling user input, auth, payments, or sensitive data.",
|
|
31
|
+
|
|
32
|
+
# Research agents (5)
|
|
33
|
+
"best-practices-researcher": "Researches external best practices, documentation, and examples for any technology, framework, or development practice. Checks available skills first, then official docs and community standards.",
|
|
34
|
+
"framework-docs-researcher": "Gathers comprehensive documentation and best practices for frameworks, libraries, or project dependencies. Fetches official docs via Context7, explores source code, checks for API deprecations.",
|
|
35
|
+
"git-history-analyzer": "Analyzes git history to understand code evolution, trace origins of specific code patterns, identify key contributors and their expertise areas, and extract development patterns from commit history.",
|
|
36
|
+
"learnings-researcher": "Searches institutional learnings in .lavra/memory/knowledge.jsonl for relevant past solutions. Finds applicable patterns, gotchas, and lessons learned to prevent repeated mistakes.",
|
|
37
|
+
"repo-research-analyst": "Conducts thorough research on repository structure, documentation, and patterns. Analyzes architecture files, examines GitHub issues, reviews contribution guidelines, discovers templates.",
|
|
38
|
+
|
|
39
|
+
# Design agents (3)
|
|
40
|
+
"design-implementation-reviewer": "Verifies UI implementations match Figma design specifications. Use after HTML/CSS/React components are created or modified to compare implementation against Figma and identify discrepancies.",
|
|
41
|
+
"design-iterator": "Iteratively refines UI design through N screenshot-analyze-improve cycles. Use PROACTIVELY when design changes aren't coming together after 1-2 attempts, or when user requests iterative refinement.",
|
|
42
|
+
"figma-design-sync": "Detects and fixes visual differences between web implementation and Figma design. Use iteratively when syncing implementation to match Figma specs.",
|
|
43
|
+
|
|
44
|
+
# Workflow agents (5)
|
|
45
|
+
"bug-reproduction-validator": "Systematically attempts to reproduce reported bugs, validates steps to reproduce, and confirms whether behavior deviates from expected functionality. Classifies issues appropriately.",
|
|
46
|
+
"every-style-editor": "Reviews and edits text content to conform to Every's house style guide - checking headline casing, company usage, adverbs, active voice, number formatting, and punctuation rules.",
|
|
47
|
+
"lint": "Runs linting and code quality checks on Ruby and ERB files. Use before pushing to origin to catch style violations, syntax errors, and code quality issues.",
|
|
48
|
+
"pr-comment-resolver": "Addresses pull request review comments by implementing requested changes and reporting back. Handles understanding the comment, implementing fixes, verifying correctness, and providing resolution summary.",
|
|
49
|
+
"spec-flow-analyzer": "Analyzes specifications, plans, and feature descriptions to map all possible user flows, identify gaps and ambiguities, and surface critical questions. Use when reviewing feature specs or validating implementation plans.",
|
|
50
|
+
|
|
51
|
+
# Docs agents (1)
|
|
52
|
+
"ankane-readme-writer": "Creates or updates README files following Ankane-style template for Ruby gems. Enforces imperative voice, sentences under 15 words, proper section ordering, and single-purpose code fences.",
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
# Phase 2: Commands that should have disable-model-invocation: true
|
|
56
|
+
# (Manual commands with side effects that shouldn't be auto-suggested)
|
|
57
|
+
DISABLE_COMMANDS = [
|
|
58
|
+
"lfg",
|
|
59
|
+
"lavra-checkpoint",
|
|
60
|
+
"deploy-docs",
|
|
61
|
+
"release-docs",
|
|
62
|
+
"changelog",
|
|
63
|
+
"lavra-triage",
|
|
64
|
+
"test-browser",
|
|
65
|
+
"xcode-test",
|
|
66
|
+
"report-bug",
|
|
67
|
+
"reproduce-bug",
|
|
68
|
+
"resolve-pr-parallel",
|
|
69
|
+
"resolve-todo-parallel",
|
|
70
|
+
"generate-command",
|
|
71
|
+
"heal-skill",
|
|
72
|
+
"feature-video",
|
|
73
|
+
"agent-native-audit",
|
|
74
|
+
"create-agent-skill",
|
|
75
|
+
"session-start",
|
|
76
|
+
"session-end",
|
|
77
|
+
"cleanproject",
|
|
78
|
+
"cleanup-types",
|
|
79
|
+
"context-cache",
|
|
80
|
+
"find-todos",
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
# Phase 3: Skills that should have disable-model-invocation: true
|
|
84
|
+
DISABLE_SKILLS = [
|
|
85
|
+
"lavra-knowledge", # compound-docs equivalent
|
|
86
|
+
"create-agent-skills", # matches their pattern
|
|
87
|
+
"file-todos", # matches their pattern
|
|
88
|
+
"skill-creator", # matches their pattern
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
def extract_frontmatter_and_body(content: str) -> Tuple[str, str]:
|
|
92
|
+
"""Extract YAML frontmatter and body from markdown file."""
|
|
93
|
+
match = re.match(r'^---\n(.*?)\n---\n(.*)$', content, re.DOTALL)
|
|
94
|
+
if not match:
|
|
95
|
+
raise ValueError("Could not parse frontmatter")
|
|
96
|
+
return match.group(1), match.group(2)
|
|
97
|
+
|
|
98
|
+
def parse_frontmatter(frontmatter: str) -> Dict[str, str]:
|
|
99
|
+
"""Parse YAML frontmatter into dict, handling quoted multiline strings."""
|
|
100
|
+
fields = {}
|
|
101
|
+
current_key = None
|
|
102
|
+
current_value = []
|
|
103
|
+
in_quotes = False
|
|
104
|
+
|
|
105
|
+
for line in frontmatter.split('\n'):
|
|
106
|
+
# Check if this is a new key
|
|
107
|
+
if ':' in line and not line.startswith(' ') and not in_quotes:
|
|
108
|
+
# Save previous key if exists
|
|
109
|
+
if current_key:
|
|
110
|
+
value = '\n'.join(current_value).strip()
|
|
111
|
+
# Remove surrounding quotes if present
|
|
112
|
+
if value.startswith('"') and value.endswith('"'):
|
|
113
|
+
value = value[1:-1]
|
|
114
|
+
fields[current_key] = value
|
|
115
|
+
|
|
116
|
+
# Start new key
|
|
117
|
+
key, value = line.split(':', 1)
|
|
118
|
+
current_key = key.strip()
|
|
119
|
+
value = value.strip()
|
|
120
|
+
|
|
121
|
+
# Check if value starts with a quote
|
|
122
|
+
if value.startswith('"'):
|
|
123
|
+
in_quotes = True
|
|
124
|
+
if value.endswith('"') and len(value) > 1:
|
|
125
|
+
# Single-line quoted value
|
|
126
|
+
in_quotes = False
|
|
127
|
+
current_value = [value]
|
|
128
|
+
else:
|
|
129
|
+
current_value = [value]
|
|
130
|
+
else:
|
|
131
|
+
current_value = [value] if value else []
|
|
132
|
+
elif current_key:
|
|
133
|
+
# Continuation of current value
|
|
134
|
+
current_value.append(line)
|
|
135
|
+
if in_quotes and line.rstrip().endswith('"'):
|
|
136
|
+
in_quotes = False
|
|
137
|
+
|
|
138
|
+
# Save last key
|
|
139
|
+
if current_key:
|
|
140
|
+
value = '\n'.join(current_value).strip()
|
|
141
|
+
if value.startswith('"') and value.endswith('"'):
|
|
142
|
+
value = value[1:-1]
|
|
143
|
+
fields[current_key] = value
|
|
144
|
+
|
|
145
|
+
return fields
|
|
146
|
+
|
|
147
|
+
def build_frontmatter(fields: Dict[str, str]) -> str:
|
|
148
|
+
"""Build YAML frontmatter from dict."""
|
|
149
|
+
lines = ['---']
|
|
150
|
+
for key, value in fields.items():
|
|
151
|
+
if not value:
|
|
152
|
+
lines.append(f'{key}:')
|
|
153
|
+
elif '\n' in value or len(value) > 80 or '"' in value:
|
|
154
|
+
# Multiline or long string - use quoted format
|
|
155
|
+
escaped = value.replace('"', '\\"')
|
|
156
|
+
lines.append(f'{key}: "{escaped}"')
|
|
157
|
+
else:
|
|
158
|
+
lines.append(f'{key}: {value}')
|
|
159
|
+
lines.append('---')
|
|
160
|
+
return '\n'.join(lines)
|
|
161
|
+
|
|
162
|
+
def remove_delegation_examples_section(body: str) -> str:
|
|
163
|
+
"""Remove ## Delegation Examples section from body."""
|
|
164
|
+
# Remove the section header and all examples under it until next ## or end
|
|
165
|
+
pattern = r'## Delegation Examples\s*\n\n(?:<example>.*?</example>\s*\n*)*'
|
|
166
|
+
return re.sub(pattern, '', body, flags=re.DOTALL)
|
|
167
|
+
|
|
168
|
+
def extract_examples_from_body(body: str) -> list:
|
|
169
|
+
"""Extract all <example> blocks from body."""
|
|
170
|
+
pattern = r'<example>.*?</example>'
|
|
171
|
+
return re.findall(pattern, body, re.DOTALL)
|
|
172
|
+
|
|
173
|
+
def process_agent(file_path: Path, new_description: str) -> None:
|
|
174
|
+
"""Process a single agent file."""
|
|
175
|
+
print(f" Processing {file_path.relative_to(BASE)}...")
|
|
176
|
+
|
|
177
|
+
content = file_path.read_text()
|
|
178
|
+
frontmatter, body = extract_frontmatter_and_body(content)
|
|
179
|
+
fields = parse_frontmatter(frontmatter)
|
|
180
|
+
|
|
181
|
+
# Extract examples from body if they exist
|
|
182
|
+
examples = extract_examples_from_body(body)
|
|
183
|
+
|
|
184
|
+
# Update description
|
|
185
|
+
old_desc_len = len(fields.get('description', ''))
|
|
186
|
+
fields['description'] = new_description
|
|
187
|
+
|
|
188
|
+
# Remove ## Delegation Examples section from body
|
|
189
|
+
body = remove_delegation_examples_section(body)
|
|
190
|
+
|
|
191
|
+
# Add examples section to body if examples exist
|
|
192
|
+
if examples:
|
|
193
|
+
examples_section = '<examples>\n' + '\n\n'.join(examples) + '\n</examples>\n\n'
|
|
194
|
+
body = examples_section + body
|
|
195
|
+
|
|
196
|
+
# Rebuild file
|
|
197
|
+
new_frontmatter = build_frontmatter(fields)
|
|
198
|
+
new_content = f"{new_frontmatter}\n{body}"
|
|
199
|
+
|
|
200
|
+
file_path.write_text(new_content)
|
|
201
|
+
print(f" ✓ {old_desc_len} chars → {len(new_description)} chars")
|
|
202
|
+
|
|
203
|
+
def add_disable_to_command(file_path: Path) -> None:
|
|
204
|
+
"""Add disable-model-invocation: true to a command file."""
|
|
205
|
+
print(f" Processing {file_path.relative_to(BASE)}...")
|
|
206
|
+
|
|
207
|
+
content = file_path.read_text()
|
|
208
|
+
frontmatter, body = extract_frontmatter_and_body(content)
|
|
209
|
+
fields = parse_frontmatter(frontmatter)
|
|
210
|
+
|
|
211
|
+
# Add disable-model-invocation if not present
|
|
212
|
+
if 'disable-model-invocation' not in fields:
|
|
213
|
+
fields['disable-model-invocation'] = 'true'
|
|
214
|
+
|
|
215
|
+
# Rebuild file
|
|
216
|
+
new_frontmatter = build_frontmatter(fields)
|
|
217
|
+
new_content = f"{new_frontmatter}\n{body}"
|
|
218
|
+
|
|
219
|
+
file_path.write_text(new_content)
|
|
220
|
+
print(f" ✓ Added disable-model-invocation: true")
|
|
221
|
+
else:
|
|
222
|
+
print(f" - Already has disable-model-invocation")
|
|
223
|
+
|
|
224
|
+
def add_disable_to_skill(file_path: Path) -> None:
|
|
225
|
+
"""Add disable-model-invocation: true to a skill SKILL.md file."""
|
|
226
|
+
print(f" Processing {file_path.relative_to(BASE)}...")
|
|
227
|
+
|
|
228
|
+
content = file_path.read_text()
|
|
229
|
+
frontmatter, body = extract_frontmatter_and_body(content)
|
|
230
|
+
fields = parse_frontmatter(frontmatter)
|
|
231
|
+
|
|
232
|
+
# Add disable-model-invocation if not present
|
|
233
|
+
if 'disable-model-invocation' not in fields:
|
|
234
|
+
fields['disable-model-invocation'] = 'true'
|
|
235
|
+
|
|
236
|
+
# Rebuild file
|
|
237
|
+
new_frontmatter = build_frontmatter(fields)
|
|
238
|
+
new_content = f"{new_frontmatter}\n{body}"
|
|
239
|
+
|
|
240
|
+
file_path.write_text(new_content)
|
|
241
|
+
print(f" ✓ Added disable-model-invocation: true")
|
|
242
|
+
else:
|
|
243
|
+
print(f" - Already has disable-model-invocation")
|
|
244
|
+
|
|
245
|
+
def main():
|
|
246
|
+
print("=" * 80)
|
|
247
|
+
print("PHASE 1: Trimming agent descriptions")
|
|
248
|
+
print("=" * 80)
|
|
249
|
+
|
|
250
|
+
agents_processed = 0
|
|
251
|
+
agents_errors = 0
|
|
252
|
+
old_total = 0
|
|
253
|
+
new_total = 0
|
|
254
|
+
|
|
255
|
+
for agent_name, description in AGENT_DESCRIPTIONS.items():
|
|
256
|
+
matches = list(BASE.glob(f"agents/**/{agent_name}.md"))
|
|
257
|
+
if not matches:
|
|
258
|
+
print(f" ERROR: Could not find {agent_name}.md")
|
|
259
|
+
agents_errors += 1
|
|
260
|
+
continue
|
|
261
|
+
|
|
262
|
+
if len(matches) > 1:
|
|
263
|
+
print(f" ERROR: Found multiple files for {agent_name}")
|
|
264
|
+
agents_errors += 1
|
|
265
|
+
continue
|
|
266
|
+
|
|
267
|
+
try:
|
|
268
|
+
# Calculate old length
|
|
269
|
+
content = matches[0].read_text()
|
|
270
|
+
fm, _ = extract_frontmatter_and_body(content)
|
|
271
|
+
fields = parse_frontmatter(fm)
|
|
272
|
+
old_total += len(fields.get('description', ''))
|
|
273
|
+
new_total += len(description)
|
|
274
|
+
|
|
275
|
+
process_agent(matches[0], description)
|
|
276
|
+
agents_processed += 1
|
|
277
|
+
except Exception as e:
|
|
278
|
+
print(f" ERROR processing {agent_name}: {e}")
|
|
279
|
+
agents_errors += 1
|
|
280
|
+
|
|
281
|
+
print(f"\n✓ Processed {agents_processed} agents")
|
|
282
|
+
print(f" Total: {old_total:,} chars → {new_total:,} chars ({100*(old_total-new_total)/old_total:.1f}% reduction)")
|
|
283
|
+
if agents_errors:
|
|
284
|
+
print(f"✗ {agents_errors} errors")
|
|
285
|
+
|
|
286
|
+
print("\n" + "=" * 80)
|
|
287
|
+
print("PHASE 2: Adding disable-model-invocation to manual commands")
|
|
288
|
+
print("=" * 80)
|
|
289
|
+
|
|
290
|
+
commands_processed = 0
|
|
291
|
+
commands_errors = 0
|
|
292
|
+
|
|
293
|
+
for command_name in DISABLE_COMMANDS:
|
|
294
|
+
matches = list(BASE.glob(f"commands/{command_name}.md"))
|
|
295
|
+
if not matches:
|
|
296
|
+
print(f" WARNING: Could not find commands/{command_name}.md")
|
|
297
|
+
continue
|
|
298
|
+
|
|
299
|
+
try:
|
|
300
|
+
add_disable_to_command(matches[0])
|
|
301
|
+
commands_processed += 1
|
|
302
|
+
except Exception as e:
|
|
303
|
+
print(f" ERROR processing {command_name}: {e}")
|
|
304
|
+
commands_errors += 1
|
|
305
|
+
|
|
306
|
+
print(f"\n✓ Processed {commands_processed} commands")
|
|
307
|
+
if commands_errors:
|
|
308
|
+
print(f"✗ {commands_errors} errors")
|
|
309
|
+
|
|
310
|
+
print("\n" + "=" * 80)
|
|
311
|
+
print("PHASE 3: Adding disable-model-invocation to manual skills")
|
|
312
|
+
print("=" * 80)
|
|
313
|
+
|
|
314
|
+
skills_processed = 0
|
|
315
|
+
skills_errors = 0
|
|
316
|
+
|
|
317
|
+
for skill_name in DISABLE_SKILLS:
|
|
318
|
+
matches = list(BASE.glob(f"skills/{skill_name}/SKILL.md"))
|
|
319
|
+
if not matches:
|
|
320
|
+
print(f" WARNING: Could not find skills/{skill_name}/SKILL.md")
|
|
321
|
+
continue
|
|
322
|
+
|
|
323
|
+
try:
|
|
324
|
+
add_disable_to_skill(matches[0])
|
|
325
|
+
skills_processed += 1
|
|
326
|
+
except Exception as e:
|
|
327
|
+
print(f" ERROR processing {skill_name}: {e}")
|
|
328
|
+
skills_errors += 1
|
|
329
|
+
|
|
330
|
+
print(f"\n✓ Processed {skills_processed} skills")
|
|
331
|
+
if skills_errors:
|
|
332
|
+
print(f"✗ {skills_errors} errors")
|
|
333
|
+
|
|
334
|
+
print("\n" + "=" * 80)
|
|
335
|
+
print("SUMMARY")
|
|
336
|
+
print("=" * 80)
|
|
337
|
+
print(f"Agents: {agents_processed} processed, {agents_errors} errors")
|
|
338
|
+
print(f"Commands: {commands_processed} processed, {commands_errors} errors")
|
|
339
|
+
print(f"Skills: {skills_processed} processed, {skills_errors} errors")
|
|
340
|
+
print(f"\nAgent descriptions: {old_total:,} → {new_total:,} chars ({100*(old_total-new_total)/old_total:.1f}% reduction)")
|
|
341
|
+
|
|
342
|
+
return 0 if (agents_errors + commands_errors + skills_errors) == 0 else 1
|
|
343
|
+
|
|
344
|
+
if __name__ == "__main__":
|
|
345
|
+
exit(main())
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* convert-cortex.ts
|
|
5
|
+
* Converts lavra plugin files from Claude Code format to Cortex Code 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 } 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 { mapToCortex } 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/cortex");
|
|
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 Cortex Code
|
|
122
|
+
const cortexFrontmatter: Record<string, any> = {};
|
|
123
|
+
|
|
124
|
+
// Preserve name if present
|
|
125
|
+
if (frontmatter.name) {
|
|
126
|
+
cortexFrontmatter.name = frontmatter.name;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Preserve description
|
|
130
|
+
if (frontmatter.description) {
|
|
131
|
+
cortexFrontmatter.description = frontmatter.description;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Map model if present and not inherit
|
|
135
|
+
if (frontmatter.model && frontmatter.model !== "inherit") {
|
|
136
|
+
const mappedModel = mapToCortex(frontmatter.model);
|
|
137
|
+
validateModelName(mappedModel);
|
|
138
|
+
cortexFrontmatter.model = mappedModel;
|
|
139
|
+
} else {
|
|
140
|
+
cortexFrontmatter.model = "inherit";
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Preserve tools if present
|
|
144
|
+
if (frontmatter.tools) {
|
|
145
|
+
cortexFrontmatter.tools = frontmatter.tools;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Build output
|
|
149
|
+
const output = buildMarkdown(cortexFrontmatter, body);
|
|
150
|
+
|
|
151
|
+
// Add generation header
|
|
152
|
+
const withHeader = `<!-- Generated by lavra v${PLUGIN_VERSION} -->
|
|
153
|
+
<!-- Source: ${category}/${file} -->
|
|
154
|
+
<!-- DO NOT EDIT - changes will be overwritten on next install -->
|
|
155
|
+
|
|
156
|
+
${output}`;
|
|
157
|
+
|
|
158
|
+
await writeFileSafe(outputPath, withHeader, 0o644);
|
|
159
|
+
console.log(` ✓ ${category}/${file}`);
|
|
160
|
+
})
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
totalConverted += mdFiles.length;
|
|
164
|
+
})
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
console.log(` Converted ${totalConverted} agents\n`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Converts skills (direct copy)
|
|
172
|
+
*/
|
|
173
|
+
async function convertSkills() {
|
|
174
|
+
console.log("Converting skills...");
|
|
175
|
+
|
|
176
|
+
const skillsDir = validatePath(SOURCE_DIR, "skills");
|
|
177
|
+
const outputDir = validatePath(OUTPUT_DIR, "skills");
|
|
178
|
+
|
|
179
|
+
await mkdir(outputDir, { recursive: true, mode: 0o755 });
|
|
180
|
+
|
|
181
|
+
const skillDirs = await readdir(skillsDir, { withFileTypes: true });
|
|
182
|
+
const skills = skillDirs.filter((d) => d.isDirectory() && d.name !== "optional").map((d) => d.name);
|
|
183
|
+
|
|
184
|
+
// Process each skill directory in parallel
|
|
185
|
+
await Promise.all(
|
|
186
|
+
skills.map(async (skill) => {
|
|
187
|
+
const skillDir = validatePath(skillsDir, skill);
|
|
188
|
+
const outputSkillDir = validatePath(outputDir, sanitizeFilename(skill));
|
|
189
|
+
|
|
190
|
+
await mkdir(outputSkillDir, { recursive: true, mode: 0o755 });
|
|
191
|
+
|
|
192
|
+
// Copy SKILL.md
|
|
193
|
+
const skillMd = join(skillDir, "SKILL.md");
|
|
194
|
+
const outputSkillMd = join(outputSkillDir, "SKILL.md");
|
|
195
|
+
|
|
196
|
+
try {
|
|
197
|
+
const content = await readFileSafe(skillMd);
|
|
198
|
+
|
|
199
|
+
// Add generation header
|
|
200
|
+
const withHeader = `<!-- Generated by lavra v${PLUGIN_VERSION} -->
|
|
201
|
+
<!-- Source: ${skill}/SKILL.md -->
|
|
202
|
+
<!-- DO NOT EDIT - changes will be overwritten on next install -->
|
|
203
|
+
|
|
204
|
+
${content}`;
|
|
205
|
+
|
|
206
|
+
await writeFileSafe(outputSkillMd, withHeader, 0o644);
|
|
207
|
+
console.log(` ✓ ${skill}/SKILL.md`);
|
|
208
|
+
} catch (err) {
|
|
209
|
+
console.warn(` ⚠️ Skipping ${skill} (no SKILL.md found): ${err}`);
|
|
210
|
+
}
|
|
211
|
+
})
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
console.log(` Converted ${skills.length} skills\n`);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Main conversion function
|
|
219
|
+
*/
|
|
220
|
+
async function main() {
|
|
221
|
+
console.log("🔄 Converting lavra to Cortex Code format\n");
|
|
222
|
+
console.log(`Source: ${SOURCE_DIR}`);
|
|
223
|
+
console.log(`Output: ${OUTPUT_DIR}\n`);
|
|
224
|
+
|
|
225
|
+
try {
|
|
226
|
+
// Create root output directory
|
|
227
|
+
await mkdir(OUTPUT_DIR, { recursive: true, mode: 0o755 });
|
|
228
|
+
|
|
229
|
+
// Run all conversions in parallel (no MCP docs for Cortex)
|
|
230
|
+
await Promise.all([
|
|
231
|
+
convertCommands(),
|
|
232
|
+
convertAgents(),
|
|
233
|
+
convertSkills(),
|
|
234
|
+
]);
|
|
235
|
+
|
|
236
|
+
console.log("✅ Conversion complete!");
|
|
237
|
+
console.log(`\nGenerated files in: ${OUTPUT_DIR}`);
|
|
238
|
+
|
|
239
|
+
// Only show manual copy instructions if running standalone (not during install)
|
|
240
|
+
if (!process.env.LAVRA_INSTALLING) {
|
|
241
|
+
console.log("\nNext steps:");
|
|
242
|
+
console.log("1. Review the generated files");
|
|
243
|
+
console.log("2. Copy to your Cortex Code project:");
|
|
244
|
+
console.log(` cp -r ${OUTPUT_DIR}/* <project>/.cortex/`);
|
|
245
|
+
}
|
|
246
|
+
} catch (err: any) {
|
|
247
|
+
console.error("❌ Conversion failed:", err.message);
|
|
248
|
+
process.exit(1);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Run if executed directly
|
|
253
|
+
if (import.meta.main) {
|
|
254
|
+
main();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export { convertCommands, convertAgents, convertSkills };
|