@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,508 @@
|
|
|
1
|
+
<overview>
|
|
2
|
+
Testing agent-native apps requires different approaches than traditional unit testing. You're testing whether the agent achieves outcomes, not whether it calls specific functions. This guide provides concrete testing patterns for verifying your app is truly agent-native.
|
|
3
|
+
</overview>
|
|
4
|
+
|
|
5
|
+
<testing_philosophy>
|
|
6
|
+
## Testing Philosophy
|
|
7
|
+
|
|
8
|
+
### Test Outcomes, Not Procedures
|
|
9
|
+
|
|
10
|
+
**Traditional (procedure-focused):**
|
|
11
|
+
```typescript
|
|
12
|
+
// Testing that a specific function was called with specific args
|
|
13
|
+
expect(mockProcessFeedback).toHaveBeenCalledWith({
|
|
14
|
+
message: "Great app!",
|
|
15
|
+
category: "praise",
|
|
16
|
+
priority: 2
|
|
17
|
+
});
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Agent-native (outcome-focused):**
|
|
21
|
+
```typescript
|
|
22
|
+
// Testing that the outcome was achieved
|
|
23
|
+
const result = await agent.process("Great app!");
|
|
24
|
+
const storedFeedback = await db.feedback.getLatest();
|
|
25
|
+
|
|
26
|
+
expect(storedFeedback.content).toContain("Great app");
|
|
27
|
+
expect(storedFeedback.importance).toBeGreaterThanOrEqual(1);
|
|
28
|
+
expect(storedFeedback.importance).toBeLessThanOrEqual(5);
|
|
29
|
+
// We don't care exactly how it categorized—just that it's reasonable
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Accept Variability
|
|
33
|
+
|
|
34
|
+
Agents may solve problems differently each time. Your tests should:
|
|
35
|
+
- Verify the end state, not the path
|
|
36
|
+
- Accept reasonable ranges, not exact values
|
|
37
|
+
- Check for presence of required elements, not exact format
|
|
38
|
+
</testing_philosophy>
|
|
39
|
+
|
|
40
|
+
<can_agent_do_it_test>
|
|
41
|
+
## The "Can Agent Do It?" Test
|
|
42
|
+
|
|
43
|
+
For each UI feature, write a test prompt and verify the agent can accomplish it.
|
|
44
|
+
|
|
45
|
+
### Template
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
describe('Agent Capability Tests', () => {
|
|
49
|
+
test('Agent can add a book to library', async () => {
|
|
50
|
+
const result = await agent.chat("Add 'Moby Dick' by Herman Melville to my library");
|
|
51
|
+
|
|
52
|
+
const library = await libraryService.getBooks();
|
|
53
|
+
const mobyDick = library.find(b => b.title.includes("Moby Dick"));
|
|
54
|
+
|
|
55
|
+
expect(mobyDick).toBeDefined();
|
|
56
|
+
expect(mobyDick.author).toContain("Melville");
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('Agent can publish to feed', async () => {
|
|
60
|
+
await libraryService.addBook({ id: "book_123", title: "1984" });
|
|
61
|
+
|
|
62
|
+
const result = await agent.chat("Write something about surveillance themes in my feed");
|
|
63
|
+
|
|
64
|
+
const feed = await feedService.getItems();
|
|
65
|
+
const newItem = feed.find(item => item.bookId === "book_123");
|
|
66
|
+
|
|
67
|
+
expect(newItem).toBeDefined();
|
|
68
|
+
expect(newItem.content.toLowerCase()).toMatch(/surveillance|watching|control/);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### The "Write to Location" Test
|
|
74
|
+
|
|
75
|
+
A key litmus test: can the agent create content in specific app locations?
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
describe('Location Awareness Tests', () => {
|
|
79
|
+
const locations = [
|
|
80
|
+
{ userPhrase: "my reading feed", expectedTool: "publish_to_feed" },
|
|
81
|
+
{ userPhrase: "my library", expectedTool: "add_book" },
|
|
82
|
+
{ userPhrase: "my research folder", expectedTool: "write_file" },
|
|
83
|
+
{ userPhrase: "my profile", expectedTool: "write_file" },
|
|
84
|
+
];
|
|
85
|
+
|
|
86
|
+
for (const { userPhrase, expectedTool } of locations) {
|
|
87
|
+
test(`Agent knows how to write to "${userPhrase}"`, async () => {
|
|
88
|
+
const prompt = `Write a test note to ${userPhrase}`;
|
|
89
|
+
const result = await agent.chat(prompt);
|
|
90
|
+
|
|
91
|
+
expect(result.toolCalls).toContainEqual(
|
|
92
|
+
expect.objectContaining({ name: expectedTool })
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
</can_agent_do_it_test>
|
|
99
|
+
|
|
100
|
+
<surprise_test>
|
|
101
|
+
## The "Surprise Test"
|
|
102
|
+
|
|
103
|
+
A well-designed agent-native app lets the agent figure out creative approaches. Test this by giving open-ended requests.
|
|
104
|
+
|
|
105
|
+
### The Test
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
describe('Agent Creativity Tests', () => {
|
|
109
|
+
test('Agent can handle open-ended requests', async () => {
|
|
110
|
+
await libraryService.addBook({ id: "1", title: "1984", author: "Orwell" });
|
|
111
|
+
await libraryService.addBook({ id: "2", title: "Brave New World", author: "Huxley" });
|
|
112
|
+
|
|
113
|
+
const result = await agent.chat("Help me organize my reading for next month");
|
|
114
|
+
|
|
115
|
+
expect(result.toolCalls.length).toBeGreaterThan(0);
|
|
116
|
+
|
|
117
|
+
const libraryTools = ["read_library", "write_file", "publish_to_feed"];
|
|
118
|
+
const usedLibraryTool = result.toolCalls.some(
|
|
119
|
+
call => libraryTools.includes(call.name)
|
|
120
|
+
);
|
|
121
|
+
expect(usedLibraryTool).toBe(true);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('Agent finds creative solutions', async () => {
|
|
125
|
+
const result = await agent.chat(
|
|
126
|
+
"I want to understand the dystopian themes across my sci-fi books"
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
// We just verify it did something substantive
|
|
130
|
+
expect(result.response.length).toBeGreaterThan(100);
|
|
131
|
+
expect(result.toolCalls.length).toBeGreaterThan(0);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### What Failure Looks Like
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
// FAILURE: Agent can only say it can't do that
|
|
140
|
+
const result = await agent.chat("Help me prepare for a book club discussion");
|
|
141
|
+
|
|
142
|
+
// Bad outcome:
|
|
143
|
+
expect(result.response).not.toContain("I can't");
|
|
144
|
+
expect(result.response).not.toContain("I don't have a tool");
|
|
145
|
+
expect(result.response).not.toContain("Could you clarify");
|
|
146
|
+
|
|
147
|
+
// If the agent asks for clarification on something it should understand,
|
|
148
|
+
// you have a context injection or capability gap
|
|
149
|
+
```
|
|
150
|
+
</surprise_test>
|
|
151
|
+
|
|
152
|
+
<parity_testing>
|
|
153
|
+
## Automated Parity Testing
|
|
154
|
+
|
|
155
|
+
Ensure every UI action has an agent equivalent.
|
|
156
|
+
|
|
157
|
+
### Capability Map Testing
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
// capability-map.ts
|
|
161
|
+
export const capabilityMap = {
|
|
162
|
+
"View library": "read_library",
|
|
163
|
+
"Add book": "add_book",
|
|
164
|
+
"Delete book": "delete_book",
|
|
165
|
+
"Publish insight": "publish_to_feed",
|
|
166
|
+
"Start research": "start_research",
|
|
167
|
+
"View highlights": "read_library",
|
|
168
|
+
"Edit profile": "write_file",
|
|
169
|
+
"Search web": "web_search",
|
|
170
|
+
"Export data": "N/A",
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
// parity.test.ts
|
|
174
|
+
import { capabilityMap } from './capability-map';
|
|
175
|
+
import { getAgentTools } from './agent-config';
|
|
176
|
+
import { getSystemPrompt } from './system-prompt';
|
|
177
|
+
|
|
178
|
+
describe('Action Parity', () => {
|
|
179
|
+
const agentTools = getAgentTools();
|
|
180
|
+
const systemPrompt = getSystemPrompt();
|
|
181
|
+
|
|
182
|
+
for (const [uiAction, toolName] of Object.entries(capabilityMap)) {
|
|
183
|
+
if (toolName === 'N/A') continue;
|
|
184
|
+
|
|
185
|
+
test(`"${uiAction}" has agent tool: ${toolName}`, () => {
|
|
186
|
+
const toolNames = agentTools.map(t => t.name);
|
|
187
|
+
expect(toolNames).toContain(toolName);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test(`${toolName} is documented in system prompt`, () => {
|
|
191
|
+
expect(systemPrompt).toContain(toolName);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Context Parity Testing
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
describe('Context Parity', () => {
|
|
201
|
+
test('Agent sees all data that UI shows', async () => {
|
|
202
|
+
await libraryService.addBook({ id: "1", title: "Test Book" });
|
|
203
|
+
await feedService.addItem({ id: "f1", content: "Test insight" });
|
|
204
|
+
|
|
205
|
+
const systemPrompt = await buildSystemPrompt();
|
|
206
|
+
|
|
207
|
+
expect(systemPrompt).toContain("Test Book");
|
|
208
|
+
expect(systemPrompt).toContain("Test insight");
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
```
|
|
212
|
+
</parity_testing>
|
|
213
|
+
|
|
214
|
+
<integration_testing>
|
|
215
|
+
## Integration Testing
|
|
216
|
+
|
|
217
|
+
Test the full flow from user request to outcome.
|
|
218
|
+
|
|
219
|
+
### End-to-End Flow Tests
|
|
220
|
+
|
|
221
|
+
```typescript
|
|
222
|
+
describe('End-to-End Flows', () => {
|
|
223
|
+
test('Research flow: request → web search → file creation', async () => {
|
|
224
|
+
const bookId = "book_123";
|
|
225
|
+
await libraryService.addBook({ id: bookId, title: "Moby Dick" });
|
|
226
|
+
|
|
227
|
+
await agent.chat("Research the historical context of whaling in Moby Dick");
|
|
228
|
+
|
|
229
|
+
const searchCalls = mockWebSearch.mock.calls;
|
|
230
|
+
expect(searchCalls.length).toBeGreaterThan(0);
|
|
231
|
+
|
|
232
|
+
const researchFiles = await fileService.listFiles(`Research/${bookId}/`);
|
|
233
|
+
expect(researchFiles.length).toBeGreaterThan(0);
|
|
234
|
+
|
|
235
|
+
const content = await fileService.readFile(researchFiles[0]);
|
|
236
|
+
expect(content.toLowerCase()).toMatch(/whale|whaling|nantucket|melville/);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
test('Publish flow: request → tool call → feed update', async () => {
|
|
240
|
+
await libraryService.addBook({ id: "book_1", title: "1984" });
|
|
241
|
+
|
|
242
|
+
const feedBefore = await feedService.getItems();
|
|
243
|
+
|
|
244
|
+
await agent.chat("Write something about Big Brother for my reading feed");
|
|
245
|
+
|
|
246
|
+
const feedAfter = await feedService.getItems();
|
|
247
|
+
expect(feedAfter.length).toBe(feedBefore.length + 1);
|
|
248
|
+
|
|
249
|
+
const newItem = feedAfter.find(item =>
|
|
250
|
+
!feedBefore.some(old => old.id === item.id)
|
|
251
|
+
);
|
|
252
|
+
expect(newItem).toBeDefined();
|
|
253
|
+
expect(newItem.content.toLowerCase()).toMatch(/big brother|surveillance|watching/);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Failure Recovery Tests
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
describe('Failure Recovery', () => {
|
|
262
|
+
test('Agent handles missing book gracefully', async () => {
|
|
263
|
+
const result = await agent.chat("Tell me about 'Nonexistent Book'");
|
|
264
|
+
|
|
265
|
+
expect(result.error).toBeUndefined();
|
|
266
|
+
expect(result.response.toLowerCase()).toMatch(
|
|
267
|
+
/not found|don't see|can't find|library/
|
|
268
|
+
);
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test('Agent recovers from API failure', async () => {
|
|
272
|
+
mockWebSearch.mockRejectedValueOnce(new Error("Network error"));
|
|
273
|
+
|
|
274
|
+
const result = await agent.chat("Research this topic");
|
|
275
|
+
|
|
276
|
+
expect(result.error).toBeUndefined();
|
|
277
|
+
expect(result.response).not.toContain("unhandled exception");
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
```
|
|
281
|
+
</integration_testing>
|
|
282
|
+
|
|
283
|
+
<snapshot_testing>
|
|
284
|
+
## Snapshot Testing for System Prompts
|
|
285
|
+
|
|
286
|
+
Track changes to system prompts and context injection over time.
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
describe('System Prompt Stability', () => {
|
|
290
|
+
test('System prompt structure matches snapshot', async () => {
|
|
291
|
+
const systemPrompt = await buildSystemPrompt();
|
|
292
|
+
|
|
293
|
+
const structure = systemPrompt
|
|
294
|
+
.replace(/id: \w+/g, 'id: [ID]')
|
|
295
|
+
.replace(/"[^"]+"/g, '"[TITLE]"')
|
|
296
|
+
.replace(/\d{4}-\d{2}-\d{2}/g, '[DATE]');
|
|
297
|
+
|
|
298
|
+
expect(structure).toMatchSnapshot();
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
test('All capability sections are present', async () => {
|
|
302
|
+
const systemPrompt = await buildSystemPrompt();
|
|
303
|
+
|
|
304
|
+
const requiredSections = [
|
|
305
|
+
"Your Capabilities",
|
|
306
|
+
"Available Books",
|
|
307
|
+
"Recent Activity",
|
|
308
|
+
];
|
|
309
|
+
|
|
310
|
+
for (const section of requiredSections) {
|
|
311
|
+
expect(systemPrompt).toContain(section);
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
```
|
|
316
|
+
</snapshot_testing>
|
|
317
|
+
|
|
318
|
+
<manual_testing>
|
|
319
|
+
## Manual Testing Checklist
|
|
320
|
+
|
|
321
|
+
Some things are best tested manually during development:
|
|
322
|
+
|
|
323
|
+
### Natural Language Variation Test
|
|
324
|
+
|
|
325
|
+
Try multiple phrasings for the same request:
|
|
326
|
+
|
|
327
|
+
```
|
|
328
|
+
"Add this to my feed"
|
|
329
|
+
"Write something in my reading feed"
|
|
330
|
+
"Publish an insight about this"
|
|
331
|
+
"Put this in the feed"
|
|
332
|
+
"I want this in my feed"
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
All should work if context injection is correct.
|
|
336
|
+
|
|
337
|
+
### Edge Case Prompts
|
|
338
|
+
|
|
339
|
+
```
|
|
340
|
+
"What can you do?"
|
|
341
|
+
→ Agent should describe capabilities
|
|
342
|
+
|
|
343
|
+
"Help me with my books"
|
|
344
|
+
→ Agent should engage with library, not ask what "books" means
|
|
345
|
+
|
|
346
|
+
"Write something"
|
|
347
|
+
→ Agent should ask WHERE (feed, file, etc.) if not clear
|
|
348
|
+
|
|
349
|
+
"Delete everything"
|
|
350
|
+
→ Agent should confirm before destructive actions
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Confusion Test
|
|
354
|
+
|
|
355
|
+
Ask about things that should exist but might not be properly connected:
|
|
356
|
+
|
|
357
|
+
```
|
|
358
|
+
"What's in my research folder?"
|
|
359
|
+
→ Should list files, not ask "what research folder?"
|
|
360
|
+
|
|
361
|
+
"Show me my recent reading"
|
|
362
|
+
→ Should show activity, not ask "what do you mean?"
|
|
363
|
+
|
|
364
|
+
"Continue where I left off"
|
|
365
|
+
→ Should reference recent activity if available
|
|
366
|
+
```
|
|
367
|
+
</manual_testing>
|
|
368
|
+
|
|
369
|
+
<ci_integration>
|
|
370
|
+
## CI/CD Integration
|
|
371
|
+
|
|
372
|
+
Add agent-native tests to your CI pipeline:
|
|
373
|
+
|
|
374
|
+
```yaml
|
|
375
|
+
# .github/workflows/test.yml
|
|
376
|
+
name: Agent-Native Tests
|
|
377
|
+
|
|
378
|
+
on: [push, pull_request]
|
|
379
|
+
|
|
380
|
+
jobs:
|
|
381
|
+
agent-tests:
|
|
382
|
+
runs-on: ubuntu-latest
|
|
383
|
+
steps:
|
|
384
|
+
- uses: actions/checkout@v3
|
|
385
|
+
|
|
386
|
+
- name: Setup
|
|
387
|
+
run: npm install
|
|
388
|
+
|
|
389
|
+
- name: Run Parity Tests
|
|
390
|
+
run: npm run test:parity
|
|
391
|
+
|
|
392
|
+
- name: Run Capability Tests
|
|
393
|
+
run: npm run test:capabilities
|
|
394
|
+
env:
|
|
395
|
+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
396
|
+
|
|
397
|
+
- name: Check System Prompt Completeness
|
|
398
|
+
run: npm run test:system-prompt
|
|
399
|
+
|
|
400
|
+
- name: Verify Capability Map
|
|
401
|
+
run: |
|
|
402
|
+
npm run generate:capability-map
|
|
403
|
+
git diff --exit-code capability-map.ts
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
### Cost-Aware Testing
|
|
407
|
+
|
|
408
|
+
Agent tests cost API tokens. Strategies to manage:
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
// Use smaller models for basic tests
|
|
412
|
+
const testConfig = {
|
|
413
|
+
model: process.env.CI ? "claude-3-haiku" : "claude-3-opus",
|
|
414
|
+
maxTokens: 500,
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
// Cache responses for deterministic tests
|
|
418
|
+
const cachedAgent = new CachedAgent({
|
|
419
|
+
cacheDir: ".test-cache",
|
|
420
|
+
ttl: 24 * 60 * 60 * 1000, // 24 hours
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
// Run expensive tests only on main branch
|
|
424
|
+
if (process.env.GITHUB_REF === 'refs/heads/main') {
|
|
425
|
+
describe('Full Integration Tests', () => { ... });
|
|
426
|
+
}
|
|
427
|
+
```
|
|
428
|
+
</ci_integration>
|
|
429
|
+
|
|
430
|
+
<test_utilities>
|
|
431
|
+
## Test Utilities
|
|
432
|
+
|
|
433
|
+
### Agent Test Harness
|
|
434
|
+
|
|
435
|
+
```typescript
|
|
436
|
+
class AgentTestHarness {
|
|
437
|
+
private agent: Agent;
|
|
438
|
+
private mockServices: MockServices;
|
|
439
|
+
|
|
440
|
+
async setup() {
|
|
441
|
+
this.mockServices = createMockServices();
|
|
442
|
+
this.agent = await createAgent({
|
|
443
|
+
services: this.mockServices,
|
|
444
|
+
model: "claude-3-haiku",
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
async chat(message: string): Promise<AgentResponse> {
|
|
449
|
+
return this.agent.chat(message);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
async expectToolCall(toolName: string) {
|
|
453
|
+
const lastResponse = this.agent.getLastResponse();
|
|
454
|
+
expect(lastResponse.toolCalls.map(t => t.name)).toContain(toolName);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
async expectOutcome(check: () => Promise<boolean>) {
|
|
458
|
+
const result = await check();
|
|
459
|
+
expect(result).toBe(true);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
getState() {
|
|
463
|
+
return {
|
|
464
|
+
library: this.mockServices.library.getBooks(),
|
|
465
|
+
feed: this.mockServices.feed.getItems(),
|
|
466
|
+
files: this.mockServices.files.listAll(),
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// Usage
|
|
472
|
+
test('full flow', async () => {
|
|
473
|
+
const harness = new AgentTestHarness();
|
|
474
|
+
await harness.setup();
|
|
475
|
+
|
|
476
|
+
await harness.chat("Add 'Moby Dick' to my library");
|
|
477
|
+
await harness.expectToolCall("add_book");
|
|
478
|
+
await harness.expectOutcome(async () => {
|
|
479
|
+
const state = harness.getState();
|
|
480
|
+
return state.library.some(b => b.title.includes("Moby"));
|
|
481
|
+
});
|
|
482
|
+
});
|
|
483
|
+
```
|
|
484
|
+
</test_utilities>
|
|
485
|
+
|
|
486
|
+
<checklist>
|
|
487
|
+
## Testing Checklist
|
|
488
|
+
|
|
489
|
+
Automated Tests:
|
|
490
|
+
- [ ] "Can Agent Do It?" tests for each UI action
|
|
491
|
+
- [ ] Location awareness tests ("write to my feed")
|
|
492
|
+
- [ ] Parity tests (tool exists, documented in prompt)
|
|
493
|
+
- [ ] Context parity tests (agent sees what UI shows)
|
|
494
|
+
- [ ] End-to-end flow tests
|
|
495
|
+
- [ ] Failure recovery tests
|
|
496
|
+
|
|
497
|
+
Manual Tests:
|
|
498
|
+
- [ ] Natural language variation (multiple phrasings work)
|
|
499
|
+
- [ ] Edge case prompts (open-ended requests)
|
|
500
|
+
- [ ] Confusion test (agent knows app vocabulary)
|
|
501
|
+
- [ ] Surprise test (agent can be creative)
|
|
502
|
+
|
|
503
|
+
CI Integration:
|
|
504
|
+
- [ ] Parity tests run on every PR
|
|
505
|
+
- [ ] Capability tests run with API key
|
|
506
|
+
- [ ] System prompt completeness check
|
|
507
|
+
- [ ] Capability map drift detection
|
|
508
|
+
</checklist>
|