@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,116 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Build SQLite FTS5 index from knowledge.jsonl
|
|
4
|
+
#
|
|
5
|
+
# Usage: build-index.sh /path/to/knowledge.jsonl /path/to/output.db
|
|
6
|
+
#
|
|
7
|
+
# Creates a SQLite database with:
|
|
8
|
+
# - knowledge table with all fields
|
|
9
|
+
# - knowledge_fts FTS5 virtual table for full-text search
|
|
10
|
+
#
|
|
11
|
+
|
|
12
|
+
KNOWLEDGE_FILE="$1"
|
|
13
|
+
DB_FILE="$2"
|
|
14
|
+
|
|
15
|
+
if [[ -z "$KNOWLEDGE_FILE" ]] || [[ -z "$DB_FILE" ]]; then
|
|
16
|
+
echo "Usage: build-index.sh /path/to/knowledge.jsonl /path/to/output.db" >&2
|
|
17
|
+
exit 1
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
if [[ ! -f "$KNOWLEDGE_FILE" ]]; then
|
|
21
|
+
echo "File not found: $KNOWLEDGE_FILE" >&2
|
|
22
|
+
exit 1
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
if ! command -v python3 &>/dev/null; then
|
|
26
|
+
echo "Required: python3" >&2
|
|
27
|
+
exit 1
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# Remove existing db to start fresh
|
|
31
|
+
rm -f "$DB_FILE"
|
|
32
|
+
|
|
33
|
+
# Use Python for proper parameterized SQL (no escaping issues)
|
|
34
|
+
python3 - "$KNOWLEDGE_FILE" "$DB_FILE" <<'PYEOF'
|
|
35
|
+
import json
|
|
36
|
+
import sqlite3
|
|
37
|
+
import sys
|
|
38
|
+
|
|
39
|
+
knowledge_file = sys.argv[1]
|
|
40
|
+
db_file = sys.argv[2]
|
|
41
|
+
|
|
42
|
+
conn = sqlite3.connect(db_file)
|
|
43
|
+
cur = conn.cursor()
|
|
44
|
+
|
|
45
|
+
cur.executescript("""
|
|
46
|
+
CREATE TABLE knowledge(
|
|
47
|
+
key TEXT PRIMARY KEY,
|
|
48
|
+
type TEXT,
|
|
49
|
+
content TEXT,
|
|
50
|
+
source TEXT,
|
|
51
|
+
tags_text TEXT,
|
|
52
|
+
ts INTEGER,
|
|
53
|
+
bead TEXT
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
CREATE VIRTUAL TABLE knowledge_fts USING fts5(
|
|
57
|
+
content, tags_text, type, key,
|
|
58
|
+
content=knowledge,
|
|
59
|
+
content_rowid=rowid,
|
|
60
|
+
tokenize='porter unicode61'
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
CREATE TRIGGER knowledge_ai AFTER INSERT ON knowledge BEGIN
|
|
64
|
+
INSERT INTO knowledge_fts(rowid, content, tags_text, type, key)
|
|
65
|
+
VALUES (new.rowid, new.content, new.tags_text, new.type, new.key);
|
|
66
|
+
END;
|
|
67
|
+
""")
|
|
68
|
+
|
|
69
|
+
inserted = 0
|
|
70
|
+
skipped = 0
|
|
71
|
+
|
|
72
|
+
with open(knowledge_file, encoding="utf-8") as f:
|
|
73
|
+
for line in f:
|
|
74
|
+
line = line.strip()
|
|
75
|
+
if not line:
|
|
76
|
+
continue
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
entry = json.loads(line)
|
|
80
|
+
except json.JSONDecodeError:
|
|
81
|
+
skipped += 1
|
|
82
|
+
continue
|
|
83
|
+
|
|
84
|
+
key = entry.get("key", "")
|
|
85
|
+
if not key:
|
|
86
|
+
skipped += 1
|
|
87
|
+
continue
|
|
88
|
+
|
|
89
|
+
tags = entry.get("tags", [])
|
|
90
|
+
tags_text = " ".join(tags) if isinstance(tags, list) else str(tags)
|
|
91
|
+
|
|
92
|
+
try:
|
|
93
|
+
cur.execute(
|
|
94
|
+
"INSERT OR IGNORE INTO knowledge(key, type, content, source, tags_text, ts, bead) VALUES(?, ?, ?, ?, ?, ?, ?)",
|
|
95
|
+
(
|
|
96
|
+
key,
|
|
97
|
+
entry.get("type", ""),
|
|
98
|
+
entry.get("content", ""),
|
|
99
|
+
entry.get("source", ""),
|
|
100
|
+
tags_text,
|
|
101
|
+
entry.get("ts", 0),
|
|
102
|
+
entry.get("bead", ""),
|
|
103
|
+
),
|
|
104
|
+
)
|
|
105
|
+
inserted += 1
|
|
106
|
+
except Exception as e:
|
|
107
|
+
print(f" Warning: skipped {key}: {e}", file=sys.stderr)
|
|
108
|
+
skipped += 1
|
|
109
|
+
|
|
110
|
+
conn.commit()
|
|
111
|
+
conn.close()
|
|
112
|
+
|
|
113
|
+
print(f"Built FTS5 index: {db_file}")
|
|
114
|
+
print(f" Entries indexed: {inserted}")
|
|
115
|
+
print(f" Entries skipped: {skipped}")
|
|
116
|
+
PYEOF
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Memory Recall Benchmark - compare grep vs FTS5 search quality
|
|
4
|
+
#
|
|
5
|
+
# Usage: recall-bench.sh /path/to/knowledge.jsonl
|
|
6
|
+
#
|
|
7
|
+
# Runs curated test queries against both grep and FTS5 backends,
|
|
8
|
+
# scores results against human-judged relevance labels, and outputs
|
|
9
|
+
# a comparison report with precision@5, recall@5, and MRR.
|
|
10
|
+
#
|
|
11
|
+
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
|
|
14
|
+
KNOWLEDGE_FILE="$1"
|
|
15
|
+
|
|
16
|
+
if [[ -z "$KNOWLEDGE_FILE" ]]; then
|
|
17
|
+
echo "Usage: recall-bench.sh /path/to/knowledge.jsonl" >&2
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
if [[ ! -f "$KNOWLEDGE_FILE" ]]; then
|
|
22
|
+
echo "File not found: $KNOWLEDGE_FILE" >&2
|
|
23
|
+
exit 1
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
27
|
+
TEST_QUERIES="$SCRIPT_DIR/test-queries.jsonl"
|
|
28
|
+
GREP_SEARCH="$SCRIPT_DIR/search-grep.sh"
|
|
29
|
+
FTS5_SEARCH="$SCRIPT_DIR/search-fts5.sh"
|
|
30
|
+
BUILD_INDEX="$SCRIPT_DIR/build-index.sh"
|
|
31
|
+
|
|
32
|
+
TOP_K=5
|
|
33
|
+
DB_FILE=$(mktemp /tmp/recall-bench-XXXXXX.db)
|
|
34
|
+
trap 'rm -f "$DB_FILE"' EXIT
|
|
35
|
+
|
|
36
|
+
# Verify dependencies
|
|
37
|
+
for FILE in "$TEST_QUERIES" "$GREP_SEARCH" "$FTS5_SEARCH" "$BUILD_INDEX"; do
|
|
38
|
+
if [[ ! -f "$FILE" ]]; then
|
|
39
|
+
echo "Missing: $FILE" >&2
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
done
|
|
43
|
+
|
|
44
|
+
for CMD in sqlite3 jq; do
|
|
45
|
+
if ! command -v "$CMD" &>/dev/null; then
|
|
46
|
+
echo "Required: $CMD" >&2
|
|
47
|
+
exit 1
|
|
48
|
+
fi
|
|
49
|
+
done
|
|
50
|
+
|
|
51
|
+
# Build FTS5 index
|
|
52
|
+
echo "Building FTS5 index..."
|
|
53
|
+
bash "$BUILD_INDEX" "$KNOWLEDGE_FILE" "$DB_FILE"
|
|
54
|
+
echo ""
|
|
55
|
+
|
|
56
|
+
# Scoring functions using awk for floating point
|
|
57
|
+
calc_precision() {
|
|
58
|
+
local hits="$1"
|
|
59
|
+
local returned="$2"
|
|
60
|
+
if [[ "$returned" -eq 0 ]]; then
|
|
61
|
+
echo "0.000"
|
|
62
|
+
else
|
|
63
|
+
awk "BEGIN { printf \"%.3f\", $hits / $returned }"
|
|
64
|
+
fi
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
calc_recall() {
|
|
68
|
+
local hits="$1"
|
|
69
|
+
local total_relevant="$2"
|
|
70
|
+
if [[ "$total_relevant" -eq 0 ]]; then
|
|
71
|
+
echo "1.000"
|
|
72
|
+
else
|
|
73
|
+
awk "BEGIN { printf \"%.3f\", $hits / $total_relevant }"
|
|
74
|
+
fi
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
calc_rr() {
|
|
78
|
+
# Reciprocal rank: 1/rank of first relevant result, 0 if none
|
|
79
|
+
local rank="$1"
|
|
80
|
+
if [[ "$rank" -eq 0 ]]; then
|
|
81
|
+
echo "0.000"
|
|
82
|
+
else
|
|
83
|
+
awk "BEGIN { printf \"%.3f\", 1.0 / $rank }"
|
|
84
|
+
fi
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
# Run benchmark
|
|
88
|
+
TOTAL_QUERIES=0
|
|
89
|
+
GREP_P_SUM=0
|
|
90
|
+
GREP_R_SUM=0
|
|
91
|
+
GREP_RR_SUM=0
|
|
92
|
+
FTS5_P_SUM=0
|
|
93
|
+
FTS5_R_SUM=0
|
|
94
|
+
FTS5_RR_SUM=0
|
|
95
|
+
|
|
96
|
+
# Header
|
|
97
|
+
printf "%-45s | %-17s | %-17s | %-17s\n" "" "Precision@$TOP_K" "Recall@$TOP_K" "MRR"
|
|
98
|
+
printf "%-45s | %-8s %-8s | %-8s %-8s | %-8s %-8s\n" "Query" "grep" "fts5" "grep" "fts5" "grep" "fts5"
|
|
99
|
+
printf "%s\n" "$(printf '%.0s-' {1..120})"
|
|
100
|
+
|
|
101
|
+
while IFS= read -r QUERY_LINE; do
|
|
102
|
+
[[ -z "$QUERY_LINE" ]] && continue
|
|
103
|
+
|
|
104
|
+
QUERY=$(echo "$QUERY_LINE" | jq -r '.query')
|
|
105
|
+
RELEVANT_KEYS=$(echo "$QUERY_LINE" | jq -r '.relevant_keys[]')
|
|
106
|
+
TOTAL_RELEVANT=$(echo "$QUERY_LINE" | jq -r '.relevant_keys | length')
|
|
107
|
+
|
|
108
|
+
# Run grep search
|
|
109
|
+
GREP_RESULTS=$(bash "$GREP_SEARCH" "$QUERY" "$KNOWLEDGE_FILE" "$TOP_K" 2>/dev/null || true)
|
|
110
|
+
|
|
111
|
+
# Run FTS5 search
|
|
112
|
+
FTS5_RESULTS=$(bash "$FTS5_SEARCH" "$QUERY" "$DB_FILE" "$TOP_K" 2>/dev/null || true)
|
|
113
|
+
|
|
114
|
+
# Score grep results
|
|
115
|
+
GREP_HITS=0
|
|
116
|
+
GREP_FIRST_RANK=0
|
|
117
|
+
GREP_RANK=0
|
|
118
|
+
GREP_RETURNED=0
|
|
119
|
+
|
|
120
|
+
while IFS= read -r RESULT_KEY; do
|
|
121
|
+
[[ -z "$RESULT_KEY" ]] && continue
|
|
122
|
+
GREP_RETURNED=$((GREP_RETURNED + 1))
|
|
123
|
+
GREP_RANK=$((GREP_RANK + 1))
|
|
124
|
+
|
|
125
|
+
IS_RELEVANT=false
|
|
126
|
+
while IFS= read -r REL_KEY; do
|
|
127
|
+
if [[ "$RESULT_KEY" == "$REL_KEY" ]]; then
|
|
128
|
+
IS_RELEVANT=true
|
|
129
|
+
break
|
|
130
|
+
fi
|
|
131
|
+
done <<< "$RELEVANT_KEYS"
|
|
132
|
+
|
|
133
|
+
if $IS_RELEVANT; then
|
|
134
|
+
GREP_HITS=$((GREP_HITS + 1))
|
|
135
|
+
if [[ "$GREP_FIRST_RANK" -eq 0 ]]; then
|
|
136
|
+
GREP_FIRST_RANK=$GREP_RANK
|
|
137
|
+
fi
|
|
138
|
+
fi
|
|
139
|
+
done <<< "$GREP_RESULTS"
|
|
140
|
+
|
|
141
|
+
# Score FTS5 results
|
|
142
|
+
FTS5_HITS=0
|
|
143
|
+
FTS5_FIRST_RANK=0
|
|
144
|
+
FTS5_RANK=0
|
|
145
|
+
FTS5_RETURNED=0
|
|
146
|
+
|
|
147
|
+
while IFS= read -r RESULT_KEY; do
|
|
148
|
+
[[ -z "$RESULT_KEY" ]] && continue
|
|
149
|
+
FTS5_RETURNED=$((FTS5_RETURNED + 1))
|
|
150
|
+
FTS5_RANK=$((FTS5_RANK + 1))
|
|
151
|
+
|
|
152
|
+
IS_RELEVANT=false
|
|
153
|
+
while IFS= read -r REL_KEY; do
|
|
154
|
+
if [[ "$RESULT_KEY" == "$REL_KEY" ]]; then
|
|
155
|
+
IS_RELEVANT=true
|
|
156
|
+
break
|
|
157
|
+
fi
|
|
158
|
+
done <<< "$RELEVANT_KEYS"
|
|
159
|
+
|
|
160
|
+
if $IS_RELEVANT; then
|
|
161
|
+
FTS5_HITS=$((FTS5_HITS + 1))
|
|
162
|
+
if [[ "$FTS5_FIRST_RANK" -eq 0 ]]; then
|
|
163
|
+
FTS5_FIRST_RANK=$FTS5_RANK
|
|
164
|
+
fi
|
|
165
|
+
fi
|
|
166
|
+
done <<< "$FTS5_RESULTS"
|
|
167
|
+
|
|
168
|
+
# Compute metrics
|
|
169
|
+
G_P=$(calc_precision $GREP_HITS $GREP_RETURNED)
|
|
170
|
+
G_R=$(calc_recall $GREP_HITS $TOTAL_RELEVANT)
|
|
171
|
+
G_RR=$(calc_rr $GREP_FIRST_RANK)
|
|
172
|
+
|
|
173
|
+
F_P=$(calc_precision $FTS5_HITS $FTS5_RETURNED)
|
|
174
|
+
F_R=$(calc_recall $FTS5_HITS $TOTAL_RELEVANT)
|
|
175
|
+
F_RR=$(calc_rr $FTS5_FIRST_RANK)
|
|
176
|
+
|
|
177
|
+
# Print row
|
|
178
|
+
QUERY_DISPLAY="$QUERY"
|
|
179
|
+
if [[ ${#QUERY_DISPLAY} -gt 43 ]]; then
|
|
180
|
+
QUERY_DISPLAY="${QUERY_DISPLAY:0:40}..."
|
|
181
|
+
fi
|
|
182
|
+
printf "%-45s | %-8s %-8s | %-8s %-8s | %-8s %-8s\n" "$QUERY_DISPLAY" "$G_P" "$F_P" "$G_R" "$F_R" "$G_RR" "$F_RR"
|
|
183
|
+
|
|
184
|
+
# Accumulate for averages
|
|
185
|
+
GREP_P_SUM=$(awk "BEGIN { print $GREP_P_SUM + $G_P }")
|
|
186
|
+
GREP_R_SUM=$(awk "BEGIN { print $GREP_R_SUM + $G_R }")
|
|
187
|
+
GREP_RR_SUM=$(awk "BEGIN { print $GREP_RR_SUM + $G_RR }")
|
|
188
|
+
FTS5_P_SUM=$(awk "BEGIN { print $FTS5_P_SUM + $F_P }")
|
|
189
|
+
FTS5_R_SUM=$(awk "BEGIN { print $FTS5_R_SUM + $F_R }")
|
|
190
|
+
FTS5_RR_SUM=$(awk "BEGIN { print $FTS5_RR_SUM + $F_RR }")
|
|
191
|
+
TOTAL_QUERIES=$((TOTAL_QUERIES + 1))
|
|
192
|
+
|
|
193
|
+
done < "$TEST_QUERIES"
|
|
194
|
+
|
|
195
|
+
# Summary
|
|
196
|
+
printf "%s\n" "$(printf '%.0s-' {1..120})"
|
|
197
|
+
|
|
198
|
+
if [[ $TOTAL_QUERIES -gt 0 ]]; then
|
|
199
|
+
AVG_GP=$(awk "BEGIN { printf \"%.3f\", $GREP_P_SUM / $TOTAL_QUERIES }")
|
|
200
|
+
AVG_GR=$(awk "BEGIN { printf \"%.3f\", $GREP_R_SUM / $TOTAL_QUERIES }")
|
|
201
|
+
AVG_GRR=$(awk "BEGIN { printf \"%.3f\", $GREP_RR_SUM / $TOTAL_QUERIES }")
|
|
202
|
+
AVG_FP=$(awk "BEGIN { printf \"%.3f\", $FTS5_P_SUM / $TOTAL_QUERIES }")
|
|
203
|
+
AVG_FR=$(awk "BEGIN { printf \"%.3f\", $FTS5_R_SUM / $TOTAL_QUERIES }")
|
|
204
|
+
AVG_FRR=$(awk "BEGIN { printf \"%.3f\", $FTS5_RR_SUM / $TOTAL_QUERIES }")
|
|
205
|
+
|
|
206
|
+
printf "%-45s | %-8s %-8s | %-8s %-8s | %-8s %-8s\n" "AVERAGE ($TOTAL_QUERIES queries)" "$AVG_GP" "$AVG_FP" "$AVG_GR" "$AVG_FR" "$AVG_GRR" "$AVG_FRR"
|
|
207
|
+
|
|
208
|
+
echo ""
|
|
209
|
+
echo "Legend:"
|
|
210
|
+
echo " Precision@$TOP_K = relevant results / returned results (higher = less noise)"
|
|
211
|
+
echo " Recall@$TOP_K = relevant results / total relevant (higher = more complete)"
|
|
212
|
+
echo " MRR = 1/rank of first relevant result (higher = faster to find)"
|
|
213
|
+
|
|
214
|
+
# Delta summary
|
|
215
|
+
DELTA_P=$(awk "BEGIN { printf \"%+.3f\", $AVG_FP - $AVG_GP }")
|
|
216
|
+
DELTA_R=$(awk "BEGIN { printf \"%+.3f\", $AVG_FR - $AVG_GR }")
|
|
217
|
+
DELTA_RR=$(awk "BEGIN { printf \"%+.3f\", $AVG_FRR - $AVG_GRR }")
|
|
218
|
+
|
|
219
|
+
echo ""
|
|
220
|
+
echo "FTS5 vs grep delta:"
|
|
221
|
+
echo " Precision: $DELTA_P"
|
|
222
|
+
echo " Recall: $DELTA_R"
|
|
223
|
+
echo " MRR: $DELTA_RR"
|
|
224
|
+
fi
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# FTS5 search backend - SQLite full-text search with BM25 ranking
|
|
4
|
+
#
|
|
5
|
+
# Usage: search-fts5.sh "query string" /path/to/knowledge.db [N]
|
|
6
|
+
#
|
|
7
|
+
# Runs FTS5 MATCH query with BM25 ranking, returns top N keys ordered by relevance.
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
QUERY="$1"
|
|
11
|
+
DB_FILE="$2"
|
|
12
|
+
TOP_N="${3:-5}"
|
|
13
|
+
|
|
14
|
+
if [[ -z "$QUERY" ]] || [[ -z "$DB_FILE" ]]; then
|
|
15
|
+
echo "Usage: search-fts5.sh \"query\" /path/to/knowledge.db [N]" >&2
|
|
16
|
+
exit 1
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
if [[ ! -f "$DB_FILE" ]]; then
|
|
20
|
+
echo "Database not found: $DB_FILE" >&2
|
|
21
|
+
exit 1
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
# Use Python for proper FTS5 query construction and parameterized execution
|
|
25
|
+
python3 - "$QUERY" "$DB_FILE" "$TOP_N" <<'PYEOF'
|
|
26
|
+
import sqlite3
|
|
27
|
+
import re
|
|
28
|
+
import sys
|
|
29
|
+
|
|
30
|
+
query = sys.argv[1]
|
|
31
|
+
db_file = sys.argv[2]
|
|
32
|
+
top_n = int(sys.argv[3])
|
|
33
|
+
|
|
34
|
+
# Extract terms (2+ alphanumeric chars)
|
|
35
|
+
terms = re.findall(r'\b[a-zA-Z0-9_.]{2,}\b', query.lower())
|
|
36
|
+
|
|
37
|
+
if not terms:
|
|
38
|
+
sys.exit(0)
|
|
39
|
+
|
|
40
|
+
# Build FTS5 query: join with OR
|
|
41
|
+
# Quote each term to handle special chars
|
|
42
|
+
fts_query = " OR ".join(f'"{t}"' for t in terms)
|
|
43
|
+
|
|
44
|
+
conn = sqlite3.connect(db_file)
|
|
45
|
+
cur = conn.cursor()
|
|
46
|
+
|
|
47
|
+
# BM25 weights: content=10, tags_text=5, type=2, key=1
|
|
48
|
+
try:
|
|
49
|
+
cur.execute("""
|
|
50
|
+
SELECT k.key
|
|
51
|
+
FROM knowledge_fts fts
|
|
52
|
+
JOIN knowledge k ON k.rowid = fts.rowid
|
|
53
|
+
WHERE knowledge_fts MATCH ?
|
|
54
|
+
ORDER BY bm25(knowledge_fts, -10.0, -5.0, -2.0, -1.0)
|
|
55
|
+
LIMIT ?
|
|
56
|
+
""", (fts_query, top_n))
|
|
57
|
+
|
|
58
|
+
for row in cur.fetchall():
|
|
59
|
+
print(row[0])
|
|
60
|
+
|
|
61
|
+
except Exception:
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
conn.close()
|
|
65
|
+
PYEOF
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Grep search backend - mirrors the current recall.sh/auto-recall.sh logic
|
|
4
|
+
#
|
|
5
|
+
# Usage: search-grep.sh "query string" /path/to/knowledge.jsonl [N]
|
|
6
|
+
#
|
|
7
|
+
# Splits query into terms, greps each, deduplicates by key, returns top N keys.
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
QUERY="$1"
|
|
11
|
+
KNOWLEDGE_FILE="$2"
|
|
12
|
+
TOP_N="${3:-5}"
|
|
13
|
+
|
|
14
|
+
if [[ -z "$QUERY" ]] || [[ -z "$KNOWLEDGE_FILE" ]]; then
|
|
15
|
+
echo "Usage: search-grep.sh \"query\" /path/to/knowledge.jsonl [N]" >&2
|
|
16
|
+
exit 1
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
if [[ ! -f "$KNOWLEDGE_FILE" ]]; then
|
|
20
|
+
echo "File not found: $KNOWLEDGE_FILE" >&2
|
|
21
|
+
exit 1
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
# Split query into terms (matching auto-recall.sh approach)
|
|
25
|
+
TERMS=$(echo "$QUERY" | tr '[:upper:]' '[:lower:]' | grep -oE '\b[a-zA-Z0-9_.]{2,}\b')
|
|
26
|
+
|
|
27
|
+
SEEN_KEYS=""
|
|
28
|
+
RESULT_KEYS=""
|
|
29
|
+
COUNT=0
|
|
30
|
+
|
|
31
|
+
for TERM in $TERMS; do
|
|
32
|
+
[[ $COUNT -ge $TOP_N ]] && break
|
|
33
|
+
|
|
34
|
+
# grep -i for case-insensitive matching (mirrors recall.sh line 96)
|
|
35
|
+
MATCHES=$(grep -i "$TERM" "$KNOWLEDGE_FILE" 2>/dev/null)
|
|
36
|
+
|
|
37
|
+
while IFS= read -r LINE; do
|
|
38
|
+
[[ -z "$LINE" ]] && continue
|
|
39
|
+
[[ $COUNT -ge $TOP_N ]] && break
|
|
40
|
+
|
|
41
|
+
KEY=$(echo "$LINE" | jq -r '.key // empty' 2>/dev/null)
|
|
42
|
+
[[ -z "$KEY" ]] && continue
|
|
43
|
+
|
|
44
|
+
# Deduplicate
|
|
45
|
+
if [[ "$SEEN_KEYS" != *"|$KEY|"* ]]; then
|
|
46
|
+
SEEN_KEYS="${SEEN_KEYS}|${KEY}|"
|
|
47
|
+
RESULT_KEYS="${RESULT_KEYS}${KEY}"$'\n'
|
|
48
|
+
COUNT=$((COUNT + 1))
|
|
49
|
+
fi
|
|
50
|
+
done <<< "$MATCHES"
|
|
51
|
+
done
|
|
52
|
+
|
|
53
|
+
# Output keys, one per line, trimming trailing newline
|
|
54
|
+
echo "$RESULT_KEYS" | sed '/^$/d'
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{"query": "ViaCEP", "description": "Exact match - find entries about ViaCEP API", "relevant_keys": ["learned-fact-viacep-api-returns-400-bad-request-when-street-city-co", "fact-brasilapi-open-cep-service-does-not-return-ibge-city-codes"]}
|
|
2
|
+
{"query": "E0014", "description": "Exact match - government NFSe error code", "relevant_keys": ["learned-government-nfse-api-e0014-rejects-any-resubmission-of-same-d", "fact-nfse-government-api-error-e0014-rejects-any-dps-with-same-se"]}
|
|
3
|
+
{"query": "pynfse-nacional", "description": "Exact match - the NFSe library name", "relevant_keys": ["learned-pynfse-nacional-0-4-0-had-bug-xml-element-subst1-should-b", "decision-client-code-medsimples-generates-dps-numero-not-the-libra"]}
|
|
4
|
+
{"query": "db commit RLS reset", "description": "Partial terms - find entries about RLS context lost after commit", "relevant_keys": ["investigation-postgresql-set-session-variables-app-is-superadmin-app-org", "pattern-whenever-a-background-task-or-service-method-calls-db-commit", "learned-rls-session-variables-app-org-id-app-is-superadmin-reset", "pattern-in-substitute-nfse-use-db-flush-instead-of-db-commit-be", "pattern-in-routers-that-create-records-and-need-to-re-query-with-rel"]}
|
|
5
|
+
{"query": "payment methods Brazil", "description": "Partial terms - find Stripe/PIX/Boleto payment entries", "relevant_keys": ["decision-payment-method-priority-for-brazil-implementation-1-primary", "fact-stripe-connect-brazil-regulatory-restrictions-platforms-ou", "learned-stripe-payment-methods-in-brazil-require-proper-portuguese-a", "investigation-iof-tax-currency-considerations-iof-imposto-sobre-opera", "pattern-python-sdk-paymentintent-implementation-create-paymentinte"]}
|
|
6
|
+
{"query": "how to avoid data loss in phone migration", "description": "Conceptual - migration safety for phone number changes", "relevant_keys": ["fact-common-migration-pitfalls-1-data-loss-from-aggressive-no", "pattern-migration-from-single-field-to-country-code-split-1-add", "learned-always-analyze-production-data-before-writing-migration-stra", "decision-created-phone-migration-strategy-md-and-pre-migration-phone", "investigation-production-database-analysis-completed-results-1-country"]}
|
|
7
|
+
{"query": "query returns null after saving", "description": "Conceptual - cache/flush issues after database writes", "relevant_keys": ["investigation-root-cause-is-missing-clearapicache-call-after-cachedaxios", "pattern-in-routers-that-create-records-and-need-to-re-query-with-rel", "investigation-post-api-visits-rxvisits-returned-200-but-pydantic-serializ", "learned-pydantic-with-from-attributes-true-only-serializes-fields-ex"]}
|
|
8
|
+
{"query": "Stripe Brazil restrictions", "description": "Multi-word - Stripe platform limitations in Brazil", "relevant_keys": ["fact-stripe-connect-brazil-regulatory-restrictions-platforms-ou", "decision-payment-method-priority-for-brazil-implementation-1-primary", "learned-stripe-payment-methods-in-brazil-require-proper-portuguese-a", "investigation-iof-tax-currency-considerations-iof-imposto-sobre-opera"]}
|
|
9
|
+
{"query": "phone number validation", "description": "Multi-word - phone validation across frontend and backend", "relevant_keys": ["learned-backend-phone-validation-tests-now-comprehensive-added-tes", "learned-phoneinput-accessibility-requires-consistent-errorid-across", "learned-pydantic-field-validator-with-validationinfo-allows-accessin", "investigation-e-164-format-is-itu-t-international-phone-standard-structur", "fact-brazil-55-has-special-validation-rules-for-whatsapp-braz", "decision-added-phone-number-max-length-validation-in-format-phone-e16", "pattern-best-practices-for-e-164-normalization-before-whatsapp-api-c"]}
|
|
10
|
+
{"query": "RLS", "description": "Abbreviation - row level security entries", "relevant_keys": ["investigation-postgresql-set-session-variables-app-is-superadmin-app-org", "pattern-whenever-a-background-task-or-service-method-calls-db-commit", "learned-rls-session-variables-app-org-id-app-is-superadmin-reset", "fact-rls-policy-on-rx-visits-rx-visits-tenant-isolation-checks", "fact-rls-context-is-set-by-require-clinical-access-via-get-curren", "pattern-in-substitute-nfse-use-db-flush-instead-of-db-commit-be"]}
|
|
11
|
+
{"query": "NFSe fiscal invoice", "description": "Abbreviation + related terms - fiscal document issuance", "relevant_keys": ["investigation-nfse-error-e0240-cep-nao-existe-ou-nao-pertence-ao-municip", "learned-government-nfse-api-e0014-rejects-any-resubmission-of-same-d", "fact-nfse-substitution-has-35-day-limit-calculated-using-brazilia", "fact-nfse-government-api-error-e0014-rejects-any-dps-with-same-se", "fact-nfse-service-description-now-includes-visit-date-in-format", "decision-allow-retry-of-stuck-processing-issuances-by-removing-the-ha", "learned-pynfse-nacional-0-4-0-had-bug-xml-element-subst1-should-b"]}
|
|
12
|
+
{"query": "cursor pointer text selection", "description": "UI pattern - specific CSS interaction issue", "relevant_keys": ["pattern-cursor-pointer-on-tablerow-elements-prevents-text-selection"]}
|
|
13
|
+
{"query": "Portuguese accents i18n", "description": "UI pattern - accent/internationalization issues", "relevant_keys": ["pattern-portuguese-accents-missing-in-several-ui-strings-check-for", "learned-stripe-payment-methods-in-brazil-require-proper-portuguese-a"]}
|
|
14
|
+
{"query": "webhook secret authentication", "description": "Cross-domain - service-to-service auth", "relevant_keys": ["learned-cognitest-assignment-uses-x-webhook-secret-header-for-servic", "decision-unify-on-one-shared-secret-cognitest-webhook-secret-with-o", "pattern-service-to-service-webhook-pattern-graceful-degradation-on", "pattern-service-to-service-endpoints-post-api-cognitest-resource"]}
|
|
15
|
+
{"query": "security phone masking XSS", "description": "Cross-domain - security across different features", "relevant_keys": ["fact-security-considerations-phone-numbers-are-injection-vector", "learned-phone-masking-implementation-verified-with-unit-tests-all-r", "learned-security-through-defense-in-depth-is-more-practical-than-sin", "pattern-pii-in-audit-logs-requires-balancing-privacy-with-operationa"]}
|
|
16
|
+
{"query": "Pydantic serialization validation", "description": "Technical - Pydantic-specific issues", "relevant_keys": ["learned-pydantic-with-from-attributes-true-only-serializes-fields-ex", "investigation-post-api-visits-rxvisits-returned-200-but-pydantic-serializ", "learned-pydantic-field-validator-with-validationinfo-allows-accessin", "learned-pydantic-v2-field-validator-order-can-be-controlled-with-mod"]}
|
|
17
|
+
{"query": "flush instead of commit", "description": "Specific pattern - db.flush vs db.commit", "relevant_keys": ["pattern-in-substitute-nfse-use-db-flush-instead-of-db-commit-be", "pattern-in-routers-that-create-records-and-need-to-re-query-with-rel", "pattern-atomic-onboarding-transaction-pattern-use-db-flush-betwe", "learned-rls-session-variables-app-org-id-app-is-superadmin-reset"]}
|
|
18
|
+
{"query": "GDPR LGPD data retention", "description": "Compliance - privacy regulation entries", "relevant_keys": ["learned-gdpr-lgpd-medical-records-deletion-requires-1-response-wit", "fact-brazilian-lgpd-requires-20-year-minimum-retention-for-medica", "fact-gdpr-article-20-requires-data-portability-in-structured-com", "pattern-gdpr-compliance-requires-multi-phase-implementation-phase-1", "pattern-gdpr-audit-logs-must-contain-metadata-without-pii-log-requ", "investigation-no-deletion-endpoints-exist-currently-patients-and-doctors"]}
|
|
19
|
+
{"query": "CEP address lookup", "description": "Feature-specific - postal code validation", "relevant_keys": ["learned-fact-viacep-api-returns-400-bad-request-when-street-city-co", "investigation-nfse-error-e0240-cep-nao-existe-ou-nao-pertence-ao-municip", "fact-brasilapi-open-cep-service-does-not-return-ibge-city-codes", "pattern-cep-validation-uses-sync-wrapper-validate-cep-sync-that-ru"]}
|
|
20
|
+
{"query": "structured logging event names", "description": "Logging patterns - event naming conventions", "relevant_keys": ["pattern-event-names-use-snake-case-past-tense-domain-prefix-when-h", "pattern-migrate-logging-with-event-names-snake-case-past-tense-do", "pattern-use-logger-bind-for-request-scoped-context-with-entity-ids", "learned-structured-logging-epic-pattern-wave-1-deps-config-prin", "decision-downgrade-router-inclusion-and-static-file-discovery-logs-to"]}
|
|
21
|
+
{"query": "CogniTest credits free", "description": "Feature - credits system and free tier", "relevant_keys": ["fact-free-credits-system-is-broken-new-orgs-registered-via-meds", "learned-frontend-credits-widget-complete-created-creditswidget-svel", "learned-backend-integration-complete-modified-create-session-endpoi", "learned-cognitest-pricing-uses-lazy-initialization-call-post-api"]}
|
|
22
|
+
{"query": "environment variables production deploy", "description": "DevOps - env var configuration for deployment", "relevant_keys": ["fact-for-prod-builds-set-env-inline-vite-cognitest-api-url-http", "pattern-vite-bakes-vite-env-vars-into-the-js-bundle-at-build-time", "decision-used-env-production-as-single-source-of-truth-for-prod-fron", "learned-fastapi-s-pydantic-settings-are-loaded-at-startup-changing", "fact-vite-api-url-is-only-used-in-vite-config-ts-dev-proxy-not-i", "pattern-when-one-frontend-needs-to-call-another-service-s-api-both"]}
|
|
23
|
+
{"query": "React useCallback re-render", "description": "React-specific performance pattern", "relevant_keys": ["learned-functions-created-during-render-cause-unnecessary-re-renders", "learned-controlled-components-should-not-maintain-internal-state-for", "learned-react-keys-must-be-unique-across-all-items-in-a-list-not-ju"]}
|
|
24
|
+
{"query": "Alembic migration model columns", "description": "Database migration patterns", "relevant_keys": ["learned-when-adding-columns-via-alembic-migration-must-also-add-cor", "pattern-backend-schema-changes-require-1-model-update-2-alembic", "decision-added-phone-and-phone-country-columns-to-user-model-at-lines", "decision-converted-cognitest-from-varchar-36-to-native-postgresql-uu"]}
|
|
25
|
+
{"query": "WhatsApp E.164 format", "description": "Integration - WhatsApp phone formatting requirements", "relevant_keys": ["investigation-whatsapp-business-api-requires-e-164-format-for-all-phone-nu", "investigation-e-164-format-is-itu-t-international-phone-standard-structur", "fact-whatsapp-api-excludes-certain-countries-from-messaging-crim", "pattern-best-practices-for-e-164-normalization-before-whatsapp-api-c", "learned-e-164-formatting-should-happen-at-validation-time-not-at-ap"]}
|