@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,275 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Security controls test suite
|
|
5
|
+
* Tests path traversal, file size limits, YAML parsing, and other security controls
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { mkdir, writeFile, rm } from "node:fs/promises";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import {
|
|
11
|
+
validatePath,
|
|
12
|
+
sanitizeFilename,
|
|
13
|
+
validateModelName,
|
|
14
|
+
readFileSafe,
|
|
15
|
+
} from "./shared/security";
|
|
16
|
+
import { parseFrontmatter } from "./shared/yaml-parser";
|
|
17
|
+
|
|
18
|
+
const TEST_DIR = join(import.meta.dir, "../test-output");
|
|
19
|
+
const PASSED: string[] = [];
|
|
20
|
+
const FAILED: string[] = [];
|
|
21
|
+
|
|
22
|
+
function pass(name: string) {
|
|
23
|
+
PASSED.push(name);
|
|
24
|
+
console.log(`ā ${name}`);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function fail(name: string, error: string) {
|
|
28
|
+
FAILED.push(name);
|
|
29
|
+
console.log(`ā ${name}: ${error}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function testPathTraversal() {
|
|
33
|
+
console.log("\nš Testing path traversal protection...");
|
|
34
|
+
|
|
35
|
+
// Test 1: Valid path should work
|
|
36
|
+
try {
|
|
37
|
+
const valid = validatePath(TEST_DIR, "test.md");
|
|
38
|
+
if (valid.includes(TEST_DIR)) {
|
|
39
|
+
pass("Valid path accepted");
|
|
40
|
+
} else {
|
|
41
|
+
fail("Valid path", "Path validation returned unexpected result");
|
|
42
|
+
}
|
|
43
|
+
} catch (err: any) {
|
|
44
|
+
fail("Valid path", err.message);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Test 2: Path traversal should be rejected
|
|
48
|
+
try {
|
|
49
|
+
validatePath(TEST_DIR, "../../../etc/passwd");
|
|
50
|
+
fail("Path traversal", "Should have thrown error");
|
|
51
|
+
} catch (err: any) {
|
|
52
|
+
if (err.message.includes("Path traversal detected")) {
|
|
53
|
+
pass("Path traversal rejected");
|
|
54
|
+
} else {
|
|
55
|
+
fail("Path traversal", `Wrong error: ${err.message}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Test 3: Symlink-style path should be rejected
|
|
60
|
+
try {
|
|
61
|
+
validatePath(TEST_DIR, "../../sensitive/data");
|
|
62
|
+
fail("Symlink path", "Should have thrown error");
|
|
63
|
+
} catch (err: any) {
|
|
64
|
+
if (err.message.includes("Path traversal detected")) {
|
|
65
|
+
pass("Symlink path rejected");
|
|
66
|
+
} else {
|
|
67
|
+
fail("Symlink path", `Wrong error: ${err.message}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function testFilenameSanitization() {
|
|
73
|
+
console.log("\nš§¹ Testing filename sanitization...");
|
|
74
|
+
|
|
75
|
+
// Test 1: Valid filename unchanged
|
|
76
|
+
const valid = sanitizeFilename("test-file_v2.md");
|
|
77
|
+
if (valid === "test-file_v2.md") {
|
|
78
|
+
pass("Valid filename unchanged");
|
|
79
|
+
} else {
|
|
80
|
+
fail("Valid filename", `Expected test-file_v2.md, got ${valid}`);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Test 2: Special characters removed
|
|
84
|
+
const malicious = sanitizeFilename("../../../etc/passwd");
|
|
85
|
+
if (malicious === ".._.._.._etc_passwd") {
|
|
86
|
+
pass("Special characters sanitized");
|
|
87
|
+
} else {
|
|
88
|
+
fail("Special characters", `Expected .._.._.._etc_passwd, got ${malicious}`);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Test 3: Spaces converted
|
|
92
|
+
const spaces = sanitizeFilename("file with spaces.md");
|
|
93
|
+
if (spaces === "file_with_spaces.md") {
|
|
94
|
+
pass("Spaces converted to underscores");
|
|
95
|
+
} else {
|
|
96
|
+
fail("Spaces", `Expected file_with_spaces.md, got ${spaces}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async function testFileSizeLimit() {
|
|
101
|
+
console.log("\nš Testing file size limits...");
|
|
102
|
+
|
|
103
|
+
await mkdir(TEST_DIR, { recursive: true, mode: 0o755 });
|
|
104
|
+
|
|
105
|
+
// Test 1: Small file accepted
|
|
106
|
+
const smallFile = join(TEST_DIR, "small.md");
|
|
107
|
+
await writeFile(smallFile, "# Small file\n\nContent here.");
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
const content = await readFileSafe(smallFile);
|
|
111
|
+
if (content.includes("Small file")) {
|
|
112
|
+
pass("Small file accepted");
|
|
113
|
+
} else {
|
|
114
|
+
fail("Small file", "Content not read correctly");
|
|
115
|
+
}
|
|
116
|
+
} catch (err: any) {
|
|
117
|
+
fail("Small file", err.message);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Test 2: Large file rejected (create 11MB file)
|
|
121
|
+
const largeFile = join(TEST_DIR, "large.md");
|
|
122
|
+
const largeContent = "x".repeat(11 * 1024 * 1024); // 11MB
|
|
123
|
+
await writeFile(largeFile, largeContent);
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
await readFileSafe(largeFile);
|
|
127
|
+
fail("Large file", "Should have thrown size limit error");
|
|
128
|
+
} catch (err: any) {
|
|
129
|
+
if (err.message.includes("File too large")) {
|
|
130
|
+
pass("Large file rejected (>10MB)");
|
|
131
|
+
} else {
|
|
132
|
+
fail("Large file", `Wrong error: ${err.message}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Cleanup
|
|
137
|
+
await rm(TEST_DIR, { recursive: true, force: true });
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async function testModelNameValidation() {
|
|
141
|
+
console.log("\nšÆ Testing model name validation...");
|
|
142
|
+
|
|
143
|
+
// Test 1: Valid model names accepted
|
|
144
|
+
const validModels = [
|
|
145
|
+
"sonnet",
|
|
146
|
+
"opus",
|
|
147
|
+
"haiku",
|
|
148
|
+
"inherit",
|
|
149
|
+
"anthropic/claude-sonnet-4-20250514",
|
|
150
|
+
"gemini-2.5-pro",
|
|
151
|
+
];
|
|
152
|
+
|
|
153
|
+
for (const model of validModels) {
|
|
154
|
+
try {
|
|
155
|
+
const result = validateModelName(model);
|
|
156
|
+
if (result === model) {
|
|
157
|
+
pass(`Valid model accepted: ${model}`);
|
|
158
|
+
} else {
|
|
159
|
+
fail(`Valid model: ${model}`, `Expected ${model}, got ${result}`);
|
|
160
|
+
}
|
|
161
|
+
} catch (err: any) {
|
|
162
|
+
fail(`Valid model: ${model}`, err.message);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Test 2: Invalid model names rejected
|
|
167
|
+
const invalidModels = [
|
|
168
|
+
"; rm -rf /",
|
|
169
|
+
"../../../etc/passwd",
|
|
170
|
+
"$(whoami)",
|
|
171
|
+
"malicious' OR '1'='1",
|
|
172
|
+
];
|
|
173
|
+
|
|
174
|
+
for (const model of invalidModels) {
|
|
175
|
+
try {
|
|
176
|
+
validateModelName(model);
|
|
177
|
+
fail(`Invalid model: ${model}`, "Should have thrown error");
|
|
178
|
+
} catch (err: any) {
|
|
179
|
+
if (
|
|
180
|
+
err.message.includes("Invalid model name format") ||
|
|
181
|
+
err.message.includes("Unsupported model")
|
|
182
|
+
) {
|
|
183
|
+
pass(`Invalid model rejected: ${model}`);
|
|
184
|
+
} else {
|
|
185
|
+
fail(`Invalid model: ${model}`, `Wrong error: ${err.message}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async function testYAMLParsing() {
|
|
192
|
+
console.log("\nš Testing YAML parsing security...");
|
|
193
|
+
|
|
194
|
+
// Test 1: Valid YAML accepted
|
|
195
|
+
const validYAML = `---
|
|
196
|
+
name: test-agent
|
|
197
|
+
description: Test agent description
|
|
198
|
+
model: sonnet
|
|
199
|
+
---
|
|
200
|
+
Body content here`;
|
|
201
|
+
|
|
202
|
+
try {
|
|
203
|
+
const parsed = parseFrontmatter(validYAML);
|
|
204
|
+
if (parsed.name === "test-agent" && parsed.model === "sonnet") {
|
|
205
|
+
pass("Valid YAML parsed correctly");
|
|
206
|
+
} else {
|
|
207
|
+
fail("Valid YAML", "Parsed values incorrect");
|
|
208
|
+
}
|
|
209
|
+
} catch (err: any) {
|
|
210
|
+
fail("Valid YAML", err.message);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Test 2: Malicious YAML rejected (code execution attempt)
|
|
214
|
+
const maliciousYAML = `---
|
|
215
|
+
!!python/object/apply:os.system
|
|
216
|
+
args: ['echo pwned']
|
|
217
|
+
---
|
|
218
|
+
Body`;
|
|
219
|
+
|
|
220
|
+
try {
|
|
221
|
+
parseFrontmatter(maliciousYAML);
|
|
222
|
+
fail("Malicious YAML", "Should have thrown error on unsafe tag");
|
|
223
|
+
} catch (err: any) {
|
|
224
|
+
if (err.message.includes("parse error") || err.message.toLowerCase().includes("unknown tag")) {
|
|
225
|
+
pass("Malicious YAML rejected (code execution blocked)");
|
|
226
|
+
} else {
|
|
227
|
+
fail("Malicious YAML", `Wrong error: ${err.message}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Test 3: Invalid structure rejected
|
|
232
|
+
const invalidYAML = `---
|
|
233
|
+
this is not valid yaml at all!!!
|
|
234
|
+
---
|
|
235
|
+
Body`;
|
|
236
|
+
|
|
237
|
+
try {
|
|
238
|
+
parseFrontmatter(invalidYAML);
|
|
239
|
+
fail("Invalid YAML", "Should have thrown parse error");
|
|
240
|
+
} catch (err: any) {
|
|
241
|
+
if (err.message.includes("parse error")) {
|
|
242
|
+
pass("Invalid YAML rejected");
|
|
243
|
+
} else {
|
|
244
|
+
fail("Invalid YAML", `Wrong error: ${err.message}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
async function main() {
|
|
250
|
+
console.log("š”ļø Security Controls Test Suite\n");
|
|
251
|
+
console.log("Testing lavra conversion script security...\n");
|
|
252
|
+
|
|
253
|
+
await testPathTraversal();
|
|
254
|
+
await testFilenameSanitization();
|
|
255
|
+
await testFileSizeLimit();
|
|
256
|
+
await testModelNameValidation();
|
|
257
|
+
await testYAMLParsing();
|
|
258
|
+
|
|
259
|
+
console.log("\n" + "=".repeat(60));
|
|
260
|
+
console.log(`ā Passed: ${PASSED.length}`);
|
|
261
|
+
console.log(`ā Failed: ${FAILED.length}`);
|
|
262
|
+
console.log("=".repeat(60));
|
|
263
|
+
|
|
264
|
+
if (FAILED.length > 0) {
|
|
265
|
+
console.log("\nā Some tests failed:");
|
|
266
|
+
FAILED.forEach((test) => console.log(` - ${test}`));
|
|
267
|
+
process.exit(1);
|
|
268
|
+
} else {
|
|
269
|
+
console.log("\nā
All security tests passed!");
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (import.meta.main) {
|
|
274
|
+
main();
|
|
275
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Trim agent descriptions to under 250 chars and move examples to body.
|
|
4
|
+
"""
|
|
5
|
+
import re
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
# Agent descriptions to use (1-2 sentences, under 250 chars)
|
|
9
|
+
DESCRIPTIONS = {
|
|
10
|
+
# Review agents (14)
|
|
11
|
+
"kieran-rails-reviewer": "Rails code review enforcing strict conventions: inline turbo streams, proper namespacing, service extraction signals, testability, naming clarity, and duplication over complexity. Use after implementing or modifying Rails code.",
|
|
12
|
+
"agent-native-reviewer": "Reviews code for agent-native compliance - ensuring any user action has an agent equivalent, and agents see what users see. Checks action parity, context parity, and shared workspace design.",
|
|
13
|
+
"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.",
|
|
14
|
+
"code-simplicity-reviewer": "Final review pass ensuring code is as simple and minimal as possible. Identifies unnecessary complexity, challenges premature abstractions, applies YAGNI rigorously. Use after implementation is complete.",
|
|
15
|
+
"data-integrity-guardian": "Reviews database migrations, data models, and code that manipulates persistent data. Checks migration safety, validates constraints, verifies referential integrity, and audits privacy compliance.",
|
|
16
|
+
"data-migration-expert": "Reviews PRs touching database migrations, data backfills, or production data transformations. Validates ID mappings, checks for swapped values, verifies rollback safety, ensures data integrity.",
|
|
17
|
+
"deployment-verification-agent": "Produces concrete 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.",
|
|
18
|
+
"dhh-rails-reviewer": "Brutally honest Rails code review from DHH's perspective. Identifies anti-patterns, JavaScript framework contamination, unnecessary abstractions, and Rails convention violations. Flags JWT over sessions, microservices over monoliths.",
|
|
19
|
+
"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, CSS animation races. Use after implementing or modifying JavaScript.",
|
|
20
|
+
"kieran-python-reviewer": "Python code review enforcing strict conventions: mandatory type hints (modern 3.10+ syntax), Pythonic patterns, proper module organization, testability, naming clarity, and duplication over complexity. Use after implementing or modifying Python code.",
|
|
21
|
+
"kieran-typescript-reviewer": "TypeScript code review enforcing strict conventions: no-any policy, proper type safety, modern TS 5+ patterns, import organization, testability, naming clarity, and duplication over complexity. Use after implementing or modifying TypeScript code.",
|
|
22
|
+
"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.",
|
|
23
|
+
"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 data volumes.",
|
|
24
|
+
"security-sentinel": "Performs security audits covering input validation, SQL injection, XSS, authentication/authorization, hardcoded secrets, and OWASP Top 10 compliance. Use when reviewing code that handles user input, authentication, payments, or sensitive data.",
|
|
25
|
+
|
|
26
|
+
# Research agents (5)
|
|
27
|
+
"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. Includes mandatory deprecation checks.",
|
|
28
|
+
"framework-docs-researcher": "Gathers comprehensive documentation and best practices for frameworks, libraries, or project dependencies. Fetches official docs via Context7, explores source code, identifies version-specific constraints, and checks for API deprecations.",
|
|
29
|
+
"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.",
|
|
30
|
+
"learnings-researcher": "Searches institutional learnings in .lavra/memory/knowledge.jsonl for relevant past solutions. Finds applicable patterns, gotchas, and lessons learned by type, tags, content, and bead references to prevent repeated mistakes.",
|
|
31
|
+
"repo-research-analyst": "Conducts thorough research on repository structure, documentation, and patterns. Analyzes architecture files, examines GitHub issues for conventions, reviews contribution guidelines, discovers templates, and searches for implementation patterns.",
|
|
32
|
+
|
|
33
|
+
# Design agents (3)
|
|
34
|
+
"design-implementation-reviewer": "Verifies UI implementations match Figma design specifications. Use after HTML/CSS/React components are created or modified to compare live implementation against Figma and identify visual discrepancies.",
|
|
35
|
+
"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.",
|
|
36
|
+
"figma-design-sync": "Detects and fixes visual differences between web implementation and Figma design. Use iteratively when syncing implementation to match Figma specs - captures screenshots, compares, and makes precise CSS/Tailwind corrections.",
|
|
37
|
+
|
|
38
|
+
# Workflow agents (5)
|
|
39
|
+
"bug-reproduction-validator": "Systematically attempts to reproduce reported bugs, validates steps to reproduce, and confirms whether behavior deviates from expected functionality. Classifies issues as confirmed bugs, cannot-reproduce, not-a-bug, environmental, data, or user error.",
|
|
40
|
+
"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.",
|
|
41
|
+
"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.",
|
|
42
|
+
"pr-comment-resolver": "Addresses pull request review comments by implementing requested changes and reporting back. Handles the full workflow: understanding the comment, implementing the fix, verifying correctness, and providing a structured resolution summary.",
|
|
43
|
+
"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, planning new features, or validating implementation plans.",
|
|
44
|
+
|
|
45
|
+
# Docs agents (1)
|
|
46
|
+
"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.",
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
def extract_frontmatter_and_body(content):
|
|
50
|
+
"""Extract frontmatter and body from markdown file."""
|
|
51
|
+
# Match YAML frontmatter between --- delimiters
|
|
52
|
+
match = re.match(r'^---\n(.*?)\n---\n(.*)$', content, re.DOTALL)
|
|
53
|
+
if not match:
|
|
54
|
+
raise ValueError("Could not parse frontmatter")
|
|
55
|
+
return match.group(1), match.group(2)
|
|
56
|
+
|
|
57
|
+
def parse_frontmatter(frontmatter):
|
|
58
|
+
"""Parse YAML frontmatter into dict."""
|
|
59
|
+
fields = {}
|
|
60
|
+
current_key = None
|
|
61
|
+
current_value = []
|
|
62
|
+
|
|
63
|
+
for line in frontmatter.split('\n'):
|
|
64
|
+
# Check if this is a new key
|
|
65
|
+
if ':' in line and not line.startswith(' '):
|
|
66
|
+
# Save previous key if exists
|
|
67
|
+
if current_key:
|
|
68
|
+
fields[current_key] = '\n'.join(current_value).strip()
|
|
69
|
+
|
|
70
|
+
# Start new key
|
|
71
|
+
key, value = line.split(':', 1)
|
|
72
|
+
current_key = key.strip()
|
|
73
|
+
current_value = [value.strip()] if value.strip() else []
|
|
74
|
+
elif current_key:
|
|
75
|
+
# Continuation of current value
|
|
76
|
+
current_value.append(line)
|
|
77
|
+
|
|
78
|
+
# Save last key
|
|
79
|
+
if current_key:
|
|
80
|
+
fields[current_key] = '\n'.join(current_value).strip()
|
|
81
|
+
|
|
82
|
+
return fields
|
|
83
|
+
|
|
84
|
+
def build_frontmatter(fields):
|
|
85
|
+
"""Build YAML frontmatter from dict."""
|
|
86
|
+
lines = ['---']
|
|
87
|
+
for key, value in fields.items():
|
|
88
|
+
if '\n' in value or len(value) > 80:
|
|
89
|
+
# Multiline string - use quoted format
|
|
90
|
+
lines.append(f'{key}: "{value}"')
|
|
91
|
+
else:
|
|
92
|
+
lines.append(f'{key}: {value}')
|
|
93
|
+
lines.append('---')
|
|
94
|
+
return '\n'.join(lines)
|
|
95
|
+
|
|
96
|
+
def extract_examples(body):
|
|
97
|
+
"""Extract <example> blocks from body."""
|
|
98
|
+
examples = []
|
|
99
|
+
# Find all <example>...</example> blocks
|
|
100
|
+
pattern = r'<example>.*?</example>'
|
|
101
|
+
matches = re.finditer(pattern, body, re.DOTALL)
|
|
102
|
+
for match in matches:
|
|
103
|
+
examples.append(match.group(0))
|
|
104
|
+
return examples
|
|
105
|
+
|
|
106
|
+
def remove_delegation_examples_section(body):
|
|
107
|
+
"""Remove ## Delegation Examples section from body."""
|
|
108
|
+
# Remove the section header and all examples under it until next ## or end
|
|
109
|
+
pattern = r'## Delegation Examples\s*\n\n(?:<example>.*?</example>\s*\n*)*'
|
|
110
|
+
return re.sub(pattern, '', body, flags=re.DOTALL)
|
|
111
|
+
|
|
112
|
+
def process_agent(file_path, new_description):
|
|
113
|
+
"""Process a single agent file."""
|
|
114
|
+
print(f"Processing {file_path.name}...")
|
|
115
|
+
|
|
116
|
+
content = file_path.read_text()
|
|
117
|
+
|
|
118
|
+
# Extract frontmatter and body
|
|
119
|
+
frontmatter, body = extract_frontmatter_and_body(content)
|
|
120
|
+
fields = parse_frontmatter(frontmatter)
|
|
121
|
+
|
|
122
|
+
# Extract examples from body if they exist
|
|
123
|
+
examples = extract_examples(body)
|
|
124
|
+
|
|
125
|
+
# Update description in frontmatter
|
|
126
|
+
fields['description'] = new_description
|
|
127
|
+
|
|
128
|
+
# Remove ## Delegation Examples section from body
|
|
129
|
+
body = remove_delegation_examples_section(body)
|
|
130
|
+
|
|
131
|
+
# Add examples section to body if examples exist
|
|
132
|
+
if examples:
|
|
133
|
+
examples_section = '\n<examples>\n' + '\n\n'.join(examples) + '\n</examples>\n\n'
|
|
134
|
+
body = examples_section + body
|
|
135
|
+
|
|
136
|
+
# Rebuild file
|
|
137
|
+
new_frontmatter = build_frontmatter(fields)
|
|
138
|
+
new_content = f"{new_frontmatter}\n{body}"
|
|
139
|
+
|
|
140
|
+
# Write back
|
|
141
|
+
file_path.write_text(new_content)
|
|
142
|
+
print(f" ā Description: {len(new_description)} chars")
|
|
143
|
+
|
|
144
|
+
def main():
|
|
145
|
+
base = Path("/Users/rbm/Documents/projects/lavra/plugins/lavra/agents")
|
|
146
|
+
|
|
147
|
+
processed = 0
|
|
148
|
+
errors = 0
|
|
149
|
+
|
|
150
|
+
for agent_name, description in DESCRIPTIONS.items():
|
|
151
|
+
# Find the agent file
|
|
152
|
+
matches = list(base.rglob(f"{agent_name}.md"))
|
|
153
|
+
if not matches:
|
|
154
|
+
print(f"ERROR: Could not find {agent_name}.md")
|
|
155
|
+
errors += 1
|
|
156
|
+
continue
|
|
157
|
+
|
|
158
|
+
if len(matches) > 1:
|
|
159
|
+
print(f"ERROR: Found multiple files for {agent_name}")
|
|
160
|
+
errors += 1
|
|
161
|
+
continue
|
|
162
|
+
|
|
163
|
+
try:
|
|
164
|
+
process_agent(matches[0], description)
|
|
165
|
+
processed += 1
|
|
166
|
+
except Exception as e:
|
|
167
|
+
print(f"ERROR processing {agent_name}: {e}")
|
|
168
|
+
errors += 1
|
|
169
|
+
|
|
170
|
+
print(f"\nā Processed {processed} agents")
|
|
171
|
+
if errors:
|
|
172
|
+
print(f"ā {errors} errors")
|
|
173
|
+
return 1
|
|
174
|
+
return 0
|
|
175
|
+
|
|
176
|
+
if __name__ == "__main__":
|
|
177
|
+
exit(main())
|
package/uninstall.sh
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# lavra plugin uninstaller router
|
|
4
|
+
#
|
|
5
|
+
# Routes to platform-specific uninstallers based on flags.
|
|
6
|
+
# Defaults to Claude Code for backwards compatibility.
|
|
7
|
+
#
|
|
8
|
+
# Usage:
|
|
9
|
+
# ./uninstall.sh # Claude Code (default)
|
|
10
|
+
# ./uninstall.sh -claude /path/to/project # Claude Code explicit
|
|
11
|
+
# ./uninstall.sh -opencode # OpenCode
|
|
12
|
+
# ./uninstall.sh -gemini # Gemini CLI
|
|
13
|
+
#
|
|
14
|
+
|
|
15
|
+
set -euo pipefail
|
|
16
|
+
|
|
17
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
18
|
+
PLATFORM=""
|
|
19
|
+
|
|
20
|
+
# Display help
|
|
21
|
+
show_help() {
|
|
22
|
+
cat <<EOF
|
|
23
|
+
lavra Plugin Uninstaller
|
|
24
|
+
|
|
25
|
+
Usage:
|
|
26
|
+
./uninstall.sh [PLATFORM] [TARGET]
|
|
27
|
+
|
|
28
|
+
Platforms:
|
|
29
|
+
-claude, --claude Uninstall from Claude Code (default)
|
|
30
|
+
-opencode, --opencode Uninstall from OpenCode
|
|
31
|
+
-gemini, --gemini Uninstall from Gemini CLI
|
|
32
|
+
-cortex, --cortex Uninstall from Cortex Code
|
|
33
|
+
|
|
34
|
+
Target:
|
|
35
|
+
[path] Uninstall from specific project directory
|
|
36
|
+
(omit) Uninstall from global install (~/.claude or platform equivalent)
|
|
37
|
+
|
|
38
|
+
Options:
|
|
39
|
+
-h, --help Show this help message
|
|
40
|
+
|
|
41
|
+
Examples:
|
|
42
|
+
./uninstall.sh # Global Claude Code uninstall
|
|
43
|
+
./uninstall.sh /path/to/project # Project-specific Claude Code
|
|
44
|
+
./uninstall.sh -opencode # Global OpenCode uninstall
|
|
45
|
+
./uninstall.sh -gemini /path/to/project # Project-specific Gemini uninstall
|
|
46
|
+
./uninstall.sh -cortex # Global Cortex Code uninstall
|
|
47
|
+
|
|
48
|
+
EOF
|
|
49
|
+
exit 0
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
# Validate platform name (security: prevent command injection)
|
|
53
|
+
validate_platform() {
|
|
54
|
+
local platform="$1"
|
|
55
|
+
|
|
56
|
+
case "$platform" in
|
|
57
|
+
claude|opencode|gemini|cortex)
|
|
58
|
+
return 0
|
|
59
|
+
;;
|
|
60
|
+
*)
|
|
61
|
+
echo "[!] Error: Invalid platform '$platform'"
|
|
62
|
+
echo " Allowed platforms: claude, opencode, gemini, cortex"
|
|
63
|
+
echo ""
|
|
64
|
+
echo "Run './uninstall.sh --help' for usage information."
|
|
65
|
+
exit 1
|
|
66
|
+
;;
|
|
67
|
+
esac
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# Parse arguments
|
|
71
|
+
while [[ $# -gt 0 ]]; do
|
|
72
|
+
case "$1" in
|
|
73
|
+
-h|--help)
|
|
74
|
+
show_help
|
|
75
|
+
;;
|
|
76
|
+
-claude|--claude)
|
|
77
|
+
PLATFORM="claude"
|
|
78
|
+
shift
|
|
79
|
+
;;
|
|
80
|
+
-opencode|--opencode)
|
|
81
|
+
PLATFORM="opencode"
|
|
82
|
+
shift
|
|
83
|
+
;;
|
|
84
|
+
-gemini|--gemini)
|
|
85
|
+
PLATFORM="gemini"
|
|
86
|
+
shift
|
|
87
|
+
;;
|
|
88
|
+
-cortex|--cortex)
|
|
89
|
+
PLATFORM="cortex"
|
|
90
|
+
shift
|
|
91
|
+
;;
|
|
92
|
+
*)
|
|
93
|
+
# Pass through to platform-specific uninstaller
|
|
94
|
+
break
|
|
95
|
+
;;
|
|
96
|
+
esac
|
|
97
|
+
done
|
|
98
|
+
|
|
99
|
+
# Default to Claude Code for backwards compatibility
|
|
100
|
+
if [ -z "$PLATFORM" ]; then
|
|
101
|
+
PLATFORM="claude"
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
# Validate platform name (security check)
|
|
105
|
+
validate_platform "$PLATFORM"
|
|
106
|
+
|
|
107
|
+
# Construct uninstaller path
|
|
108
|
+
UNINSTALLER="$SCRIPT_DIR/installers/uninstall-${PLATFORM}.sh"
|
|
109
|
+
|
|
110
|
+
# Verify uninstaller exists
|
|
111
|
+
if [[ ! -f "$UNINSTALLER" ]]; then
|
|
112
|
+
echo "[!] Error: Uninstaller not found: $UNINSTALLER"
|
|
113
|
+
echo " Platform '$PLATFORM' may not be supported yet."
|
|
114
|
+
exit 1
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
# Security: Verify uninstaller path is in expected directory
|
|
118
|
+
UNINSTALLER_REAL="$(realpath "$UNINSTALLER")"
|
|
119
|
+
EXPECTED_DIR="$(realpath "$SCRIPT_DIR/installers")"
|
|
120
|
+
|
|
121
|
+
if [[ ! "$UNINSTALLER_REAL" =~ ^"$EXPECTED_DIR"/uninstall-[a-z]+\.sh$ ]]; then
|
|
122
|
+
echo "[!] Error: Uninstaller path validation failed"
|
|
123
|
+
echo " Expected: $EXPECTED_DIR/uninstall-*.sh"
|
|
124
|
+
echo " Got: $UNINSTALLER_REAL"
|
|
125
|
+
exit 1
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
# Execute platform-specific uninstaller
|
|
129
|
+
# Use source instead of exec to allow better error handling
|
|
130
|
+
echo "š Uninstalling lavra for $PLATFORM..."
|
|
131
|
+
echo ""
|
|
132
|
+
|
|
133
|
+
source "$UNINSTALLER" "$@"
|