compound-engineering-pi 0.2.3
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 +124 -0
- package/bin/compound-engineering-pi +12 -0
- package/bin/compound-plugin +12 -0
- package/compound-engineering-pi +12 -0
- package/compound-plugin +5 -0
- package/docs/pi.md +152 -0
- package/extensions/compound-engineering-compat.ts +452 -0
- package/package.json +84 -0
- package/pi-resources/compound-engineering/mcporter.json +7 -0
- package/plugins/coding-tutor/.claude-plugin/plugin.json +9 -0
- package/plugins/coding-tutor/README.md +37 -0
- package/plugins/coding-tutor/commands/quiz-me.md +1 -0
- package/plugins/coding-tutor/commands/sync-tutorials.md +25 -0
- package/plugins/coding-tutor/commands/teach-me.md +1 -0
- package/plugins/coding-tutor/skills/coding-tutor/SKILL.md +214 -0
- package/plugins/coding-tutor/skills/coding-tutor/scripts/create_tutorial.py +207 -0
- package/plugins/coding-tutor/skills/coding-tutor/scripts/index_tutorials.py +193 -0
- package/plugins/coding-tutor/skills/coding-tutor/scripts/quiz_priority.py +190 -0
- package/plugins/coding-tutor/skills/coding-tutor/scripts/setup_tutorials.py +118 -0
- package/plugins/compound-engineering/.claude-plugin/plugin.json +33 -0
- package/plugins/compound-engineering/CHANGELOG.md +457 -0
- package/plugins/compound-engineering/CLAUDE.md +89 -0
- package/plugins/compound-engineering/LICENSE +21 -0
- package/plugins/compound-engineering/README.md +232 -0
- package/plugins/compound-engineering/agents/design/design-implementation-reviewer.md +109 -0
- package/plugins/compound-engineering/agents/design/design-iterator.md +224 -0
- package/plugins/compound-engineering/agents/design/figma-design-sync.md +190 -0
- package/plugins/compound-engineering/agents/docs/ankane-readme-writer.md +65 -0
- package/plugins/compound-engineering/agents/research/best-practices-researcher.md +126 -0
- package/plugins/compound-engineering/agents/research/framework-docs-researcher.md +106 -0
- package/plugins/compound-engineering/agents/research/git-history-analyzer.md +59 -0
- package/plugins/compound-engineering/agents/research/learnings-researcher.md +264 -0
- package/plugins/compound-engineering/agents/research/repo-research-analyst.md +135 -0
- package/plugins/compound-engineering/agents/review/agent-native-reviewer.md +261 -0
- package/plugins/compound-engineering/agents/review/architecture-strategist.md +67 -0
- package/plugins/compound-engineering/agents/review/code-simplicity-reviewer.md +101 -0
- package/plugins/compound-engineering/agents/review/data-integrity-guardian.md +85 -0
- package/plugins/compound-engineering/agents/review/data-migration-expert.md +112 -0
- package/plugins/compound-engineering/agents/review/deployment-verification-agent.md +174 -0
- package/plugins/compound-engineering/agents/review/dhh-rails-reviewer.md +66 -0
- package/plugins/compound-engineering/agents/review/julik-frontend-races-reviewer.md +221 -0
- package/plugins/compound-engineering/agents/review/kieran-python-reviewer.md +133 -0
- package/plugins/compound-engineering/agents/review/kieran-rails-reviewer.md +115 -0
- package/plugins/compound-engineering/agents/review/kieran-typescript-reviewer.md +124 -0
- package/plugins/compound-engineering/agents/review/pattern-recognition-specialist.md +72 -0
- package/plugins/compound-engineering/agents/review/performance-oracle.md +137 -0
- package/plugins/compound-engineering/agents/review/schema-drift-detector.md +154 -0
- package/plugins/compound-engineering/agents/review/security-sentinel.md +114 -0
- package/plugins/compound-engineering/agents/workflow/bug-reproduction-validator.md +82 -0
- package/plugins/compound-engineering/agents/workflow/every-style-editor.md +64 -0
- package/plugins/compound-engineering/agents/workflow/lint.md +16 -0
- package/plugins/compound-engineering/agents/workflow/pr-comment-resolver.md +84 -0
- package/plugins/compound-engineering/agents/workflow/spec-flow-analyzer.md +134 -0
- package/plugins/compound-engineering/commands/agent-native-audit.md +278 -0
- package/plugins/compound-engineering/commands/changelog.md +138 -0
- package/plugins/compound-engineering/commands/create-agent-skill.md +9 -0
- package/plugins/compound-engineering/commands/deepen-plan.md +546 -0
- package/plugins/compound-engineering/commands/deploy-docs.md +113 -0
- package/plugins/compound-engineering/commands/feature-video.md +342 -0
- package/plugins/compound-engineering/commands/generate_command.md +163 -0
- package/plugins/compound-engineering/commands/heal-skill.md +143 -0
- package/plugins/compound-engineering/commands/lfg.md +20 -0
- package/plugins/compound-engineering/commands/release-docs.md +212 -0
- package/plugins/compound-engineering/commands/report-bug.md +151 -0
- package/plugins/compound-engineering/commands/reproduce-bug.md +100 -0
- package/plugins/compound-engineering/commands/resolve_parallel.md +35 -0
- package/plugins/compound-engineering/commands/resolve_todo_parallel.md +37 -0
- package/plugins/compound-engineering/commands/slfg.md +32 -0
- package/plugins/compound-engineering/commands/technical_review.md +8 -0
- package/plugins/compound-engineering/commands/test-browser.md +339 -0
- package/plugins/compound-engineering/commands/test-xcode.md +332 -0
- package/plugins/compound-engineering/commands/triage.md +311 -0
- package/plugins/compound-engineering/commands/workflows/brainstorm.md +124 -0
- package/plugins/compound-engineering/commands/workflows/compound.md +239 -0
- package/plugins/compound-engineering/commands/workflows/plan.md +551 -0
- package/plugins/compound-engineering/commands/workflows/review.md +526 -0
- package/plugins/compound-engineering/commands/workflows/work.md +433 -0
- package/plugins/compound-engineering/skills/agent-browser/SKILL.md +223 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/SKILL.md +435 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/action-parity-discipline.md +409 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/agent-execution-patterns.md +467 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/agent-native-testing.md +582 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/architecture-patterns.md +478 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/dynamic-context-injection.md +338 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/files-universal-interface.md +301 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +359 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/mcp-tool-design.md +506 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/mobile-patterns.md +871 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/product-implications.md +443 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +317 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/self-modification.md +269 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/shared-workspace-architecture.md +680 -0
- package/plugins/compound-engineering/skills/agent-native-architecture/references/system-prompt-design.md +250 -0
- package/plugins/compound-engineering/skills/andrew-kane-gem-writer/SKILL.md +184 -0
- package/plugins/compound-engineering/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
- package/plugins/compound-engineering/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
- package/plugins/compound-engineering/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
- package/plugins/compound-engineering/skills/andrew-kane-gem-writer/references/resources.md +119 -0
- package/plugins/compound-engineering/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
- package/plugins/compound-engineering/skills/brainstorming/SKILL.md +190 -0
- package/plugins/compound-engineering/skills/compound-docs/SKILL.md +511 -0
- package/plugins/compound-engineering/skills/compound-docs/assets/critical-pattern-template.md +34 -0
- package/plugins/compound-engineering/skills/compound-docs/assets/resolution-template.md +93 -0
- package/plugins/compound-engineering/skills/compound-docs/references/yaml-schema.md +65 -0
- package/plugins/compound-engineering/skills/compound-docs/schema.yaml +176 -0
- package/plugins/compound-engineering/skills/create-agent-skills/SKILL.md +275 -0
- package/plugins/compound-engineering/skills/create-agent-skills/references/api-security.md +226 -0
- package/plugins/compound-engineering/skills/create-agent-skills/references/be-clear-and-direct.md +531 -0
- package/plugins/compound-engineering/skills/create-agent-skills/references/best-practices.md +404 -0
- package/plugins/compound-engineering/skills/create-agent-skills/references/common-patterns.md +595 -0
- package/plugins/compound-engineering/skills/create-agent-skills/references/core-principles.md +437 -0
- package/plugins/compound-engineering/skills/create-agent-skills/references/executable-code.md +175 -0
- package/plugins/compound-engineering/skills/create-agent-skills/references/iteration-and-testing.md +474 -0
- package/plugins/compound-engineering/skills/create-agent-skills/references/official-spec.md +134 -0
- package/plugins/compound-engineering/skills/create-agent-skills/references/recommended-structure.md +168 -0
- package/plugins/compound-engineering/skills/create-agent-skills/references/skill-structure.md +152 -0
- package/plugins/compound-engineering/skills/create-agent-skills/references/using-scripts.md +113 -0
- package/plugins/compound-engineering/skills/create-agent-skills/references/using-templates.md +112 -0
- package/plugins/compound-engineering/skills/create-agent-skills/references/workflows-and-validation.md +510 -0
- package/plugins/compound-engineering/skills/create-agent-skills/templates/router-skill.md +73 -0
- package/plugins/compound-engineering/skills/create-agent-skills/templates/simple-skill.md +33 -0
- package/plugins/compound-engineering/skills/create-agent-skills/workflows/add-reference.md +96 -0
- package/plugins/compound-engineering/skills/create-agent-skills/workflows/add-script.md +93 -0
- package/plugins/compound-engineering/skills/create-agent-skills/workflows/add-template.md +74 -0
- package/plugins/compound-engineering/skills/create-agent-skills/workflows/add-workflow.md +120 -0
- package/plugins/compound-engineering/skills/create-agent-skills/workflows/audit-skill.md +138 -0
- package/plugins/compound-engineering/skills/create-agent-skills/workflows/create-domain-expertise-skill.md +605 -0
- package/plugins/compound-engineering/skills/create-agent-skills/workflows/create-new-skill.md +191 -0
- package/plugins/compound-engineering/skills/create-agent-skills/workflows/get-guidance.md +121 -0
- package/plugins/compound-engineering/skills/create-agent-skills/workflows/upgrade-to-router.md +161 -0
- package/plugins/compound-engineering/skills/create-agent-skills/workflows/verify-skill.md +204 -0
- package/plugins/compound-engineering/skills/dhh-rails-style/SKILL.md +185 -0
- package/plugins/compound-engineering/skills/dhh-rails-style/references/architecture.md +653 -0
- package/plugins/compound-engineering/skills/dhh-rails-style/references/controllers.md +303 -0
- package/plugins/compound-engineering/skills/dhh-rails-style/references/frontend.md +510 -0
- package/plugins/compound-engineering/skills/dhh-rails-style/references/gems.md +266 -0
- package/plugins/compound-engineering/skills/dhh-rails-style/references/models.md +359 -0
- package/plugins/compound-engineering/skills/dhh-rails-style/references/testing.md +338 -0
- package/plugins/compound-engineering/skills/document-review/SKILL.md +87 -0
- package/plugins/compound-engineering/skills/dspy-ruby/SKILL.md +737 -0
- package/plugins/compound-engineering/skills/dspy-ruby/assets/config-template.rb +187 -0
- package/plugins/compound-engineering/skills/dspy-ruby/assets/module-template.rb +300 -0
- package/plugins/compound-engineering/skills/dspy-ruby/assets/signature-template.rb +221 -0
- package/plugins/compound-engineering/skills/dspy-ruby/references/core-concepts.md +674 -0
- package/plugins/compound-engineering/skills/dspy-ruby/references/observability.md +366 -0
- package/plugins/compound-engineering/skills/dspy-ruby/references/optimization.md +603 -0
- package/plugins/compound-engineering/skills/dspy-ruby/references/providers.md +418 -0
- package/plugins/compound-engineering/skills/dspy-ruby/references/toolsets.md +502 -0
- package/plugins/compound-engineering/skills/every-style-editor/SKILL.md +134 -0
- package/plugins/compound-engineering/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
- package/plugins/compound-engineering/skills/file-todos/SKILL.md +252 -0
- package/plugins/compound-engineering/skills/file-todos/assets/todo-template.md +155 -0
- package/plugins/compound-engineering/skills/frontend-design/SKILL.md +42 -0
- package/plugins/compound-engineering/skills/gemini-imagegen/SKILL.md +237 -0
- package/plugins/compound-engineering/skills/gemini-imagegen/requirements.txt +2 -0
- package/plugins/compound-engineering/skills/gemini-imagegen/scripts/compose_images.py +157 -0
- package/plugins/compound-engineering/skills/gemini-imagegen/scripts/edit_image.py +144 -0
- package/plugins/compound-engineering/skills/gemini-imagegen/scripts/gemini_images.py +263 -0
- package/plugins/compound-engineering/skills/gemini-imagegen/scripts/generate_image.py +133 -0
- package/plugins/compound-engineering/skills/gemini-imagegen/scripts/multi_turn_chat.py +216 -0
- package/plugins/compound-engineering/skills/git-worktree/SKILL.md +302 -0
- package/plugins/compound-engineering/skills/git-worktree/scripts/worktree-manager.sh +337 -0
- package/plugins/compound-engineering/skills/orchestrating-swarms/SKILL.md +1718 -0
- package/plugins/compound-engineering/skills/rclone/SKILL.md +150 -0
- package/plugins/compound-engineering/skills/rclone/scripts/check_setup.sh +60 -0
- package/plugins/compound-engineering/skills/resolve-pr-parallel/SKILL.md +89 -0
- package/plugins/compound-engineering/skills/resolve-pr-parallel/scripts/get-pr-comments +68 -0
- package/plugins/compound-engineering/skills/resolve-pr-parallel/scripts/resolve-pr-thread +23 -0
- package/plugins/compound-engineering/skills/skill-creator/SKILL.md +210 -0
- package/plugins/compound-engineering/skills/skill-creator/scripts/init_skill.py +303 -0
- package/plugins/compound-engineering/skills/skill-creator/scripts/package_skill.py +110 -0
- package/plugins/compound-engineering/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/prompts/deepen-plan.md +549 -0
- package/prompts/feature-video.md +341 -0
- package/prompts/resolve_todo_parallel.md +36 -0
- package/prompts/test-browser.md +342 -0
- package/prompts/workflows-brainstorm.md +123 -0
- package/prompts/workflows-compound.md +238 -0
- package/prompts/workflows-plan.md +550 -0
- package/prompts/workflows-review.md +529 -0
- package/prompts/workflows-work.md +432 -0
- package/skills/agent-browser/SKILL.md +223 -0
- package/skills/agent-native-architecture/SKILL.md +435 -0
- package/skills/agent-native-architecture/references/action-parity-discipline.md +409 -0
- package/skills/agent-native-architecture/references/agent-execution-patterns.md +467 -0
- package/skills/agent-native-architecture/references/agent-native-testing.md +582 -0
- package/skills/agent-native-architecture/references/architecture-patterns.md +478 -0
- package/skills/agent-native-architecture/references/dynamic-context-injection.md +338 -0
- package/skills/agent-native-architecture/references/files-universal-interface.md +301 -0
- package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +359 -0
- package/skills/agent-native-architecture/references/mcp-tool-design.md +506 -0
- package/skills/agent-native-architecture/references/mobile-patterns.md +871 -0
- package/skills/agent-native-architecture/references/product-implications.md +443 -0
- package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +317 -0
- package/skills/agent-native-architecture/references/self-modification.md +269 -0
- package/skills/agent-native-architecture/references/shared-workspace-architecture.md +680 -0
- package/skills/agent-native-architecture/references/system-prompt-design.md +250 -0
- package/skills/agent-native-reviewer/SKILL.md +260 -0
- package/skills/andrew-kane-gem-writer/SKILL.md +184 -0
- package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
- package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
- package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
- package/skills/andrew-kane-gem-writer/references/resources.md +119 -0
- package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
- package/skills/ankane-readme-writer/SKILL.md +63 -0
- package/skills/architecture-strategist/SKILL.md +66 -0
- package/skills/best-practices-researcher/SKILL.md +125 -0
- package/skills/brainstorming/SKILL.md +190 -0
- package/skills/bug-reproduction-validator/SKILL.md +81 -0
- package/skills/code-simplicity-reviewer/SKILL.md +100 -0
- package/skills/compound-docs/SKILL.md +511 -0
- package/skills/compound-docs/assets/critical-pattern-template.md +34 -0
- package/skills/compound-docs/assets/resolution-template.md +93 -0
- package/skills/compound-docs/references/yaml-schema.md +65 -0
- package/skills/compound-docs/schema.yaml +176 -0
- package/skills/create-agent-skills/SKILL.md +275 -0
- package/skills/create-agent-skills/references/api-security.md +226 -0
- package/skills/create-agent-skills/references/be-clear-and-direct.md +531 -0
- package/skills/create-agent-skills/references/best-practices.md +404 -0
- package/skills/create-agent-skills/references/common-patterns.md +595 -0
- package/skills/create-agent-skills/references/core-principles.md +437 -0
- package/skills/create-agent-skills/references/executable-code.md +175 -0
- package/skills/create-agent-skills/references/iteration-and-testing.md +474 -0
- package/skills/create-agent-skills/references/official-spec.md +134 -0
- package/skills/create-agent-skills/references/recommended-structure.md +168 -0
- package/skills/create-agent-skills/references/skill-structure.md +152 -0
- package/skills/create-agent-skills/references/using-scripts.md +113 -0
- package/skills/create-agent-skills/references/using-templates.md +112 -0
- package/skills/create-agent-skills/references/workflows-and-validation.md +510 -0
- package/skills/create-agent-skills/templates/router-skill.md +73 -0
- package/skills/create-agent-skills/templates/simple-skill.md +33 -0
- package/skills/create-agent-skills/workflows/add-reference.md +96 -0
- package/skills/create-agent-skills/workflows/add-script.md +93 -0
- package/skills/create-agent-skills/workflows/add-template.md +74 -0
- package/skills/create-agent-skills/workflows/add-workflow.md +120 -0
- package/skills/create-agent-skills/workflows/audit-skill.md +138 -0
- package/skills/create-agent-skills/workflows/create-domain-expertise-skill.md +605 -0
- package/skills/create-agent-skills/workflows/create-new-skill.md +191 -0
- package/skills/create-agent-skills/workflows/get-guidance.md +121 -0
- package/skills/create-agent-skills/workflows/upgrade-to-router.md +161 -0
- package/skills/create-agent-skills/workflows/verify-skill.md +204 -0
- package/skills/data-integrity-guardian/SKILL.md +84 -0
- package/skills/data-migration-expert/SKILL.md +111 -0
- package/skills/deployment-verification-agent/SKILL.md +173 -0
- package/skills/design-implementation-reviewer/SKILL.md +107 -0
- package/skills/design-iterator/SKILL.md +222 -0
- package/skills/dhh-rails-reviewer/SKILL.md +65 -0
- package/skills/dhh-rails-style/SKILL.md +185 -0
- package/skills/dhh-rails-style/references/architecture.md +653 -0
- package/skills/dhh-rails-style/references/controllers.md +303 -0
- package/skills/dhh-rails-style/references/frontend.md +510 -0
- package/skills/dhh-rails-style/references/gems.md +266 -0
- package/skills/dhh-rails-style/references/models.md +359 -0
- package/skills/dhh-rails-style/references/testing.md +338 -0
- package/skills/document-review/SKILL.md +87 -0
- package/skills/dspy-ruby/SKILL.md +737 -0
- package/skills/dspy-ruby/assets/config-template.rb +187 -0
- package/skills/dspy-ruby/assets/module-template.rb +300 -0
- package/skills/dspy-ruby/assets/signature-template.rb +221 -0
- package/skills/dspy-ruby/references/core-concepts.md +674 -0
- package/skills/dspy-ruby/references/observability.md +366 -0
- package/skills/dspy-ruby/references/optimization.md +603 -0
- package/skills/dspy-ruby/references/providers.md +418 -0
- package/skills/dspy-ruby/references/toolsets.md +502 -0
- package/skills/every-style-editor/SKILL.md +134 -0
- package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
- package/skills/every-style-editor-2/SKILL.md +62 -0
- package/skills/figma-design-sync/SKILL.md +188 -0
- package/skills/file-todos/SKILL.md +252 -0
- package/skills/file-todos/assets/todo-template.md +155 -0
- package/skills/framework-docs-researcher/SKILL.md +105 -0
- package/skills/frontend-design/SKILL.md +42 -0
- package/skills/gemini-imagegen/SKILL.md +237 -0
- package/skills/gemini-imagegen/requirements.txt +2 -0
- package/skills/gemini-imagegen/scripts/compose_images.py +157 -0
- package/skills/gemini-imagegen/scripts/edit_image.py +144 -0
- package/skills/gemini-imagegen/scripts/gemini_images.py +263 -0
- package/skills/gemini-imagegen/scripts/generate_image.py +133 -0
- package/skills/gemini-imagegen/scripts/multi_turn_chat.py +216 -0
- package/skills/git-history-analyzer/SKILL.md +58 -0
- package/skills/git-worktree/SKILL.md +302 -0
- package/skills/git-worktree/scripts/worktree-manager.sh +337 -0
- package/skills/julik-frontend-races-reviewer/SKILL.md +220 -0
- package/skills/kieran-python-reviewer/SKILL.md +132 -0
- package/skills/kieran-rails-reviewer/SKILL.md +114 -0
- package/skills/kieran-typescript-reviewer/SKILL.md +123 -0
- package/skills/learnings-researcher/SKILL.md +263 -0
- package/skills/lint/SKILL.md +14 -0
- package/skills/orchestrating-swarms/SKILL.md +1718 -0
- package/skills/pattern-recognition-specialist/SKILL.md +71 -0
- package/skills/performance-oracle/SKILL.md +136 -0
- package/skills/pr-comment-resolver/SKILL.md +82 -0
- package/skills/rclone/SKILL.md +150 -0
- package/skills/rclone/scripts/check_setup.sh +60 -0
- package/skills/repo-research-analyst/SKILL.md +134 -0
- package/skills/resolve_pr_parallel/SKILL.md +89 -0
- package/skills/resolve_pr_parallel/scripts/get-pr-comments +68 -0
- package/skills/resolve_pr_parallel/scripts/resolve-pr-thread +23 -0
- package/skills/schema-drift-detector/SKILL.md +153 -0
- package/skills/security-sentinel/SKILL.md +113 -0
- package/skills/skill-creator/SKILL.md +210 -0
- package/skills/skill-creator/scripts/init_skill.py +303 -0
- package/skills/skill-creator/scripts/package_skill.py +110 -0
- package/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/skills/spec-flow-analyzer/SKILL.md +133 -0
- package/src/commands/convert.ts +183 -0
- package/src/commands/install.ts +273 -0
- package/src/commands/list.ts +37 -0
- package/src/commands/sync.ts +89 -0
- package/src/converters/claude-to-codex.ts +182 -0
- package/src/converters/claude-to-opencode.ts +395 -0
- package/src/converters/claude-to-pi.ts +205 -0
- package/src/index.ts +22 -0
- package/src/parsers/claude-home.ts +65 -0
- package/src/parsers/claude.ts +252 -0
- package/src/sync/codex.ts +92 -0
- package/src/sync/opencode.ts +75 -0
- package/src/sync/pi.ts +88 -0
- package/src/targets/codex.ts +96 -0
- package/src/targets/index.ts +38 -0
- package/src/targets/opencode.ts +57 -0
- package/src/targets/pi.ts +131 -0
- package/src/templates/pi/compat-extension.ts +452 -0
- package/src/types/claude.ts +90 -0
- package/src/types/codex.ts +23 -0
- package/src/types/opencode.ts +54 -0
- package/src/types/pi.ts +40 -0
- package/src/utils/codex-agents.ts +64 -0
- package/src/utils/files.ts +77 -0
- package/src/utils/frontmatter.ts +65 -0
- package/src/utils/symlink.ts +43 -0
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
# DSPy.rb Optimization
|
|
2
|
+
|
|
3
|
+
## MIPROv2
|
|
4
|
+
|
|
5
|
+
MIPROv2 (Multi-prompt Instruction Proposal with Retrieval Optimization) is the primary instruction tuner in DSPy.rb. It proposes new instructions and few-shot demonstrations per predictor, evaluates them on mini-batches, and retains candidates that improve the metric. It ships as a separate gem to keep the Gaussian Process dependency tree out of apps that do not need it.
|
|
6
|
+
|
|
7
|
+
### Installation
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
# Gemfile
|
|
11
|
+
gem "dspy"
|
|
12
|
+
gem "dspy-miprov2"
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Bundler auto-requires `dspy/miprov2`. No additional `require` statement is needed.
|
|
16
|
+
|
|
17
|
+
### AutoMode presets
|
|
18
|
+
|
|
19
|
+
Use `DSPy::Teleprompt::MIPROv2::AutoMode` for preconfigured optimizers:
|
|
20
|
+
|
|
21
|
+
```ruby
|
|
22
|
+
light = DSPy::Teleprompt::MIPROv2::AutoMode.light(metric: metric) # 6 trials, greedy
|
|
23
|
+
medium = DSPy::Teleprompt::MIPROv2::AutoMode.medium(metric: metric) # 12 trials, adaptive
|
|
24
|
+
heavy = DSPy::Teleprompt::MIPROv2::AutoMode.heavy(metric: metric) # 18 trials, Bayesian
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
| Preset | Trials | Strategy | Use case |
|
|
28
|
+
|----------|--------|------------|-----------------------------------------------------|
|
|
29
|
+
| `light` | 6 | `:greedy` | Quick wins on small datasets or during prototyping. |
|
|
30
|
+
| `medium` | 12 | `:adaptive`| Balanced exploration vs. runtime for most pilots. |
|
|
31
|
+
| `heavy` | 18 | `:bayesian`| Highest accuracy targets or multi-stage programs. |
|
|
32
|
+
|
|
33
|
+
### Manual configuration with dry-configurable
|
|
34
|
+
|
|
35
|
+
`DSPy::Teleprompt::MIPROv2` includes `Dry::Configurable`. Configure at the class level (defaults for all instances) or instance level (overrides class defaults).
|
|
36
|
+
|
|
37
|
+
**Class-level defaults:**
|
|
38
|
+
|
|
39
|
+
```ruby
|
|
40
|
+
DSPy::Teleprompt::MIPROv2.configure do |config|
|
|
41
|
+
config.optimization_strategy = :bayesian
|
|
42
|
+
config.num_trials = 30
|
|
43
|
+
config.bootstrap_sets = 10
|
|
44
|
+
end
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Instance-level overrides:**
|
|
48
|
+
|
|
49
|
+
```ruby
|
|
50
|
+
optimizer = DSPy::Teleprompt::MIPROv2.new(metric: metric)
|
|
51
|
+
optimizer.configure do |config|
|
|
52
|
+
config.num_trials = 15
|
|
53
|
+
config.num_instruction_candidates = 6
|
|
54
|
+
config.bootstrap_sets = 5
|
|
55
|
+
config.max_bootstrapped_examples = 4
|
|
56
|
+
config.max_labeled_examples = 16
|
|
57
|
+
config.optimization_strategy = :adaptive # :greedy, :adaptive, :bayesian
|
|
58
|
+
config.early_stopping_patience = 3
|
|
59
|
+
config.init_temperature = 1.0
|
|
60
|
+
config.final_temperature = 0.1
|
|
61
|
+
config.minibatch_size = nil # nil = auto
|
|
62
|
+
config.auto_seed = 42
|
|
63
|
+
end
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The `optimization_strategy` setting accepts symbols (`:greedy`, `:adaptive`, `:bayesian`) and coerces them internally to `DSPy::Teleprompt::OptimizationStrategy` T::Enum values.
|
|
67
|
+
|
|
68
|
+
The old `config:` constructor parameter is removed. Passing `config:` raises `ArgumentError`.
|
|
69
|
+
|
|
70
|
+
### Auto presets via configure
|
|
71
|
+
|
|
72
|
+
Instead of `AutoMode`, set the preset through the configure block:
|
|
73
|
+
|
|
74
|
+
```ruby
|
|
75
|
+
optimizer = DSPy::Teleprompt::MIPROv2.new(metric: metric)
|
|
76
|
+
optimizer.configure do |config|
|
|
77
|
+
config.auto_preset = DSPy::Teleprompt::AutoPreset.deserialize("medium")
|
|
78
|
+
end
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Compile and inspect
|
|
82
|
+
|
|
83
|
+
```ruby
|
|
84
|
+
program = DSPy::Predict.new(MySignature)
|
|
85
|
+
|
|
86
|
+
result = optimizer.compile(
|
|
87
|
+
program,
|
|
88
|
+
trainset: train_examples,
|
|
89
|
+
valset: val_examples
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
optimized_program = result.optimized_program
|
|
93
|
+
puts "Best score: #{result.best_score_value}"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The `result` object exposes:
|
|
97
|
+
- `optimized_program` -- ready-to-use predictor with updated instruction and demos.
|
|
98
|
+
- `optimization_trace[:trial_logs]` -- per-trial record of instructions, demos, and scores.
|
|
99
|
+
- `metadata[:optimizer]` -- `"MIPROv2"`, useful when persisting experiments from multiple optimizers.
|
|
100
|
+
|
|
101
|
+
### Multi-stage programs
|
|
102
|
+
|
|
103
|
+
MIPROv2 generates dataset summaries for each predictor and proposes per-stage instructions. For a ReAct agent with `thought_generator` and `observation_processor` predictors, the optimizer handles credit assignment internally. The metric only needs to evaluate the final output.
|
|
104
|
+
|
|
105
|
+
### Bootstrap sampling
|
|
106
|
+
|
|
107
|
+
During the bootstrap phase MIPROv2:
|
|
108
|
+
1. Generates dataset summaries from the training set.
|
|
109
|
+
2. Bootstraps few-shot demonstrations by running the baseline program.
|
|
110
|
+
3. Proposes candidate instructions grounded in the summaries and bootstrapped examples.
|
|
111
|
+
4. Evaluates each candidate on mini-batches drawn from the validation set.
|
|
112
|
+
|
|
113
|
+
Control the bootstrap phase with `bootstrap_sets`, `max_bootstrapped_examples`, and `max_labeled_examples`.
|
|
114
|
+
|
|
115
|
+
### Bayesian optimization
|
|
116
|
+
|
|
117
|
+
When `optimization_strategy` is `:bayesian` (or when using the `heavy` preset), MIPROv2 fits a Gaussian Process surrogate over past trial scores to select the next candidate. This replaces random search with informed exploration, reducing the number of trials needed to find high-scoring instructions.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## GEPA
|
|
122
|
+
|
|
123
|
+
GEPA (Genetic-Pareto Reflective Prompt Evolution) is a feedback-driven optimizer. It runs the program on a small batch, collects scores and textual feedback, and asks a reflection LM to rewrite the instruction. Improved candidates are retained on a Pareto frontier.
|
|
124
|
+
|
|
125
|
+
### Installation
|
|
126
|
+
|
|
127
|
+
```ruby
|
|
128
|
+
# Gemfile
|
|
129
|
+
gem "dspy"
|
|
130
|
+
gem "dspy-gepa"
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
The `dspy-gepa` gem depends on the `gepa` core optimizer gem automatically.
|
|
134
|
+
|
|
135
|
+
### Metric contract
|
|
136
|
+
|
|
137
|
+
GEPA metrics return `DSPy::Prediction` with both a numeric score and a feedback string. Do not return a plain boolean.
|
|
138
|
+
|
|
139
|
+
```ruby
|
|
140
|
+
metric = lambda do |example, prediction|
|
|
141
|
+
expected = example.expected_values[:label]
|
|
142
|
+
predicted = prediction.label
|
|
143
|
+
|
|
144
|
+
score = predicted == expected ? 1.0 : 0.0
|
|
145
|
+
feedback = if score == 1.0
|
|
146
|
+
"Correct (#{expected}) for: \"#{example.input_values[:text][0..60]}\""
|
|
147
|
+
else
|
|
148
|
+
"Misclassified (expected #{expected}, got #{predicted}) for: \"#{example.input_values[:text][0..60]}\""
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
DSPy::Prediction.new(score: score, feedback: feedback)
|
|
152
|
+
end
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Keep the score in `[0, 1]`. Always include a short feedback message explaining what happened -- GEPA hands this text to the reflection model so it can reason about failures.
|
|
156
|
+
|
|
157
|
+
### Feedback maps
|
|
158
|
+
|
|
159
|
+
`feedback_map` targets individual predictors inside a composite module. Each entry receives keyword arguments and returns a `DSPy::Prediction`:
|
|
160
|
+
|
|
161
|
+
```ruby
|
|
162
|
+
feedback_map = {
|
|
163
|
+
'self' => lambda do |predictor_output:, predictor_inputs:, module_inputs:, module_outputs:, captured_trace:|
|
|
164
|
+
expected = module_inputs.expected_values[:label]
|
|
165
|
+
predicted = predictor_output.label
|
|
166
|
+
|
|
167
|
+
DSPy::Prediction.new(
|
|
168
|
+
score: predicted == expected ? 1.0 : 0.0,
|
|
169
|
+
feedback: "Classifier saw \"#{predictor_inputs[:text][0..80]}\" -> #{predicted} (expected #{expected})"
|
|
170
|
+
)
|
|
171
|
+
end
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
For single-predictor programs, key the map with `'self'`. For multi-predictor chains, add entries per component so the reflection LM sees localized context at each step. Omit `feedback_map` entirely if the top-level metric already covers the basics.
|
|
176
|
+
|
|
177
|
+
### Configuring the teleprompter
|
|
178
|
+
|
|
179
|
+
```ruby
|
|
180
|
+
teleprompter = DSPy::Teleprompt::GEPA.new(
|
|
181
|
+
metric: metric,
|
|
182
|
+
reflection_lm: DSPy::ReflectionLM.new('openai/gpt-4o-mini', api_key: ENV['OPENAI_API_KEY']),
|
|
183
|
+
feedback_map: feedback_map,
|
|
184
|
+
config: {
|
|
185
|
+
max_metric_calls: 600,
|
|
186
|
+
minibatch_size: 6,
|
|
187
|
+
skip_perfect_score: false
|
|
188
|
+
}
|
|
189
|
+
)
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Key configuration knobs:
|
|
193
|
+
|
|
194
|
+
| Knob | Purpose |
|
|
195
|
+
|----------------------|-------------------------------------------------------------------------------------------|
|
|
196
|
+
| `max_metric_calls` | Hard budget on evaluation calls. Set to at least the validation set size plus a few minibatches. |
|
|
197
|
+
| `minibatch_size` | Examples per reflective replay batch. Smaller = cheaper iterations, noisier scores. |
|
|
198
|
+
| `skip_perfect_score` | Set `true` to stop early when a candidate reaches score `1.0`. |
|
|
199
|
+
|
|
200
|
+
### Minibatch sizing
|
|
201
|
+
|
|
202
|
+
| Goal | Suggested size | Rationale |
|
|
203
|
+
|-------------------------------------------------|----------------|------------------------------------------------------------|
|
|
204
|
+
| Explore many candidates within a tight budget | 3--6 | Cheap iterations, more prompt variants, noisier metrics. |
|
|
205
|
+
| Stable metrics when each rollout is costly | 8--12 | Smoother scores, fewer candidates unless budget is raised. |
|
|
206
|
+
| Investigate specific failure modes | 3--4 then 8+ | Start with breadth, increase once patterns emerge. |
|
|
207
|
+
|
|
208
|
+
### Compile and evaluate
|
|
209
|
+
|
|
210
|
+
```ruby
|
|
211
|
+
program = DSPy::Predict.new(MySignature)
|
|
212
|
+
|
|
213
|
+
result = teleprompter.compile(program, trainset: train, valset: val)
|
|
214
|
+
optimized_program = result.optimized_program
|
|
215
|
+
|
|
216
|
+
test_metrics = evaluate(optimized_program, test)
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
The `result` object exposes:
|
|
220
|
+
- `optimized_program` -- predictor with updated instruction and few-shot examples.
|
|
221
|
+
- `best_score_value` -- validation score for the best candidate.
|
|
222
|
+
- `metadata` -- candidate counts, trace hashes, and telemetry IDs.
|
|
223
|
+
|
|
224
|
+
### Reflection LM
|
|
225
|
+
|
|
226
|
+
Swap `DSPy::ReflectionLM` for any callable object that accepts the reflection prompt hash and returns a string. The default reflection signature extracts the new instruction from triple backticks in the response.
|
|
227
|
+
|
|
228
|
+
### Experiment tracking
|
|
229
|
+
|
|
230
|
+
Plug `GEPA::Logging::ExperimentTracker` into a persistence layer:
|
|
231
|
+
|
|
232
|
+
```ruby
|
|
233
|
+
tracker = GEPA::Logging::ExperimentTracker.new
|
|
234
|
+
tracker.with_subscriber { |event| MyModel.create!(payload: event) }
|
|
235
|
+
|
|
236
|
+
teleprompter = DSPy::Teleprompt::GEPA.new(
|
|
237
|
+
metric: metric,
|
|
238
|
+
reflection_lm: reflection_lm,
|
|
239
|
+
experiment_tracker: tracker,
|
|
240
|
+
config: { max_metric_calls: 900 }
|
|
241
|
+
)
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
The tracker emits Pareto update events, merge decisions, and candidate evolution records as JSONL.
|
|
245
|
+
|
|
246
|
+
### Pareto frontier
|
|
247
|
+
|
|
248
|
+
GEPA maintains a diverse candidate pool and samples from the Pareto frontier instead of mutating only the top-scoring program. This balances exploration and prevents the search from collapsing onto a single lineage.
|
|
249
|
+
|
|
250
|
+
Enable the merge proposer after multiple strong lineages emerge:
|
|
251
|
+
|
|
252
|
+
```ruby
|
|
253
|
+
config: {
|
|
254
|
+
max_metric_calls: 900,
|
|
255
|
+
enable_merge_proposer: true
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Premature merges eat budget without meaningful gains. Gate merge on having several validated candidates first.
|
|
260
|
+
|
|
261
|
+
### Advanced options
|
|
262
|
+
|
|
263
|
+
- `acceptance_strategy:` -- plug in bespoke Pareto filters or early-stop heuristics.
|
|
264
|
+
- Telemetry spans emit via `GEPA::Telemetry`. Enable global observability with `DSPy.configure { |c| c.observability = true }` to stream spans to an OpenTelemetry exporter.
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Evaluation Framework
|
|
269
|
+
|
|
270
|
+
`DSPy::Evals` provides batch evaluation of predictors against test datasets with built-in and custom metrics.
|
|
271
|
+
|
|
272
|
+
### Basic usage
|
|
273
|
+
|
|
274
|
+
```ruby
|
|
275
|
+
metric = proc do |example, prediction|
|
|
276
|
+
prediction.answer == example.expected_values[:answer]
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
evaluator = DSPy::Evals.new(predictor, metric: metric)
|
|
280
|
+
|
|
281
|
+
result = evaluator.evaluate(
|
|
282
|
+
test_examples,
|
|
283
|
+
display_table: true,
|
|
284
|
+
display_progress: true
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
puts "Pass rate: #{(result.pass_rate * 100).round(1)}%"
|
|
288
|
+
puts "Passed: #{result.passed_examples}/#{result.total_examples}"
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### DSPy::Example
|
|
292
|
+
|
|
293
|
+
Convert raw data into `DSPy::Example` instances before passing to optimizers or evaluators. Each example carries `input_values` and `expected_values`:
|
|
294
|
+
|
|
295
|
+
```ruby
|
|
296
|
+
examples = rows.map do |row|
|
|
297
|
+
DSPy::Example.new(
|
|
298
|
+
input_values: { text: row[:text] },
|
|
299
|
+
expected_values: { label: row[:label] }
|
|
300
|
+
)
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
train, val, test = split_examples(examples, train_ratio: 0.6, val_ratio: 0.2, seed: 42)
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
Hold back a test set from the optimization loop. Optimizers work on train/val; only the test set proves generalization.
|
|
307
|
+
|
|
308
|
+
### Built-in metrics
|
|
309
|
+
|
|
310
|
+
```ruby
|
|
311
|
+
# Exact match -- prediction must exactly equal expected value
|
|
312
|
+
metric = DSPy::Metrics.exact_match(field: :answer, case_sensitive: true)
|
|
313
|
+
|
|
314
|
+
# Contains -- prediction must contain expected substring
|
|
315
|
+
metric = DSPy::Metrics.contains(field: :answer, case_sensitive: false)
|
|
316
|
+
|
|
317
|
+
# Numeric difference -- numeric output within tolerance
|
|
318
|
+
metric = DSPy::Metrics.numeric_difference(field: :answer, tolerance: 0.01)
|
|
319
|
+
|
|
320
|
+
# Composite AND -- all sub-metrics must pass
|
|
321
|
+
metric = DSPy::Metrics.composite_and(
|
|
322
|
+
DSPy::Metrics.exact_match(field: :answer),
|
|
323
|
+
DSPy::Metrics.contains(field: :reasoning)
|
|
324
|
+
)
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Custom metrics
|
|
328
|
+
|
|
329
|
+
```ruby
|
|
330
|
+
quality_metric = lambda do |example, prediction|
|
|
331
|
+
return false unless prediction
|
|
332
|
+
|
|
333
|
+
score = 0.0
|
|
334
|
+
score += 0.5 if prediction.answer == example.expected_values[:answer]
|
|
335
|
+
score += 0.3 if prediction.explanation && prediction.explanation.length > 50
|
|
336
|
+
score += 0.2 if prediction.confidence && prediction.confidence > 0.8
|
|
337
|
+
score >= 0.7
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
evaluator = DSPy::Evals.new(predictor, metric: quality_metric)
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
Access prediction fields with dot notation (`prediction.answer`), not hash notation.
|
|
344
|
+
|
|
345
|
+
### Observability hooks
|
|
346
|
+
|
|
347
|
+
Register callbacks without editing the evaluator:
|
|
348
|
+
|
|
349
|
+
```ruby
|
|
350
|
+
DSPy::Evals.before_example do |payload|
|
|
351
|
+
example = payload[:example]
|
|
352
|
+
DSPy.logger.info("Evaluating example #{example.id}") if example.respond_to?(:id)
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
DSPy::Evals.after_batch do |payload|
|
|
356
|
+
result = payload[:result]
|
|
357
|
+
Langfuse.event(
|
|
358
|
+
name: 'eval.batch',
|
|
359
|
+
metadata: {
|
|
360
|
+
total: result.total_examples,
|
|
361
|
+
passed: result.passed_examples,
|
|
362
|
+
score: result.score
|
|
363
|
+
}
|
|
364
|
+
)
|
|
365
|
+
end
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
Available hooks: `before_example`, `after_example`, `before_batch`, `after_batch`.
|
|
369
|
+
|
|
370
|
+
### Langfuse score export
|
|
371
|
+
|
|
372
|
+
Enable `export_scores: true` to emit `score.create` events for each evaluated example and a batch score at the end:
|
|
373
|
+
|
|
374
|
+
```ruby
|
|
375
|
+
evaluator = DSPy::Evals.new(
|
|
376
|
+
predictor,
|
|
377
|
+
metric: metric,
|
|
378
|
+
export_scores: true,
|
|
379
|
+
score_name: 'qa_accuracy' # default: 'evaluation'
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
result = evaluator.evaluate(test_examples)
|
|
383
|
+
# Emits per-example scores + overall batch score via DSPy::Scores::Exporter
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
Scores attach to the current trace context automatically and flow to Langfuse asynchronously.
|
|
387
|
+
|
|
388
|
+
### Evaluation results
|
|
389
|
+
|
|
390
|
+
```ruby
|
|
391
|
+
result = evaluator.evaluate(test_examples)
|
|
392
|
+
|
|
393
|
+
result.score # Overall score (0.0 to 1.0)
|
|
394
|
+
result.passed_count # Examples that passed
|
|
395
|
+
result.failed_count # Examples that failed
|
|
396
|
+
result.error_count # Examples that errored
|
|
397
|
+
|
|
398
|
+
result.results.each do |r|
|
|
399
|
+
r.passed # Boolean
|
|
400
|
+
r.score # Numeric score
|
|
401
|
+
r.error # Error message if the example errored
|
|
402
|
+
end
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Integration with optimizers
|
|
406
|
+
|
|
407
|
+
```ruby
|
|
408
|
+
metric = proc do |example, prediction|
|
|
409
|
+
expected = example.expected_values[:answer].to_s.strip.downcase
|
|
410
|
+
predicted = prediction.answer.to_s.strip.downcase
|
|
411
|
+
!expected.empty? && predicted.include?(expected)
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
optimizer = DSPy::Teleprompt::MIPROv2::AutoMode.medium(metric: metric)
|
|
415
|
+
|
|
416
|
+
result = optimizer.compile(
|
|
417
|
+
DSPy::Predict.new(QASignature),
|
|
418
|
+
trainset: train_examples,
|
|
419
|
+
valset: val_examples
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
evaluator = DSPy::Evals.new(result.optimized_program, metric: metric)
|
|
423
|
+
test_result = evaluator.evaluate(test_examples, display_table: true)
|
|
424
|
+
puts "Test accuracy: #{(test_result.pass_rate * 100).round(2)}%"
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
## Storage System
|
|
430
|
+
|
|
431
|
+
`DSPy::Storage` persists optimization results, tracks history, and manages multiple versions of optimized programs.
|
|
432
|
+
|
|
433
|
+
### ProgramStorage (low-level)
|
|
434
|
+
|
|
435
|
+
```ruby
|
|
436
|
+
storage = DSPy::Storage::ProgramStorage.new(storage_path: "./dspy_storage")
|
|
437
|
+
|
|
438
|
+
# Save
|
|
439
|
+
saved = storage.save_program(
|
|
440
|
+
result.optimized_program,
|
|
441
|
+
result,
|
|
442
|
+
metadata: {
|
|
443
|
+
signature_class: 'ClassifyText',
|
|
444
|
+
optimizer: 'MIPROv2',
|
|
445
|
+
examples_count: examples.size
|
|
446
|
+
}
|
|
447
|
+
)
|
|
448
|
+
puts "Stored with ID: #{saved.program_id}"
|
|
449
|
+
|
|
450
|
+
# Load
|
|
451
|
+
saved = storage.load_program(program_id)
|
|
452
|
+
predictor = saved.program
|
|
453
|
+
score = saved.optimization_result[:best_score_value]
|
|
454
|
+
|
|
455
|
+
# List
|
|
456
|
+
storage.list_programs.each do |p|
|
|
457
|
+
puts "#{p[:program_id]} -- score: #{p[:best_score]} -- saved: #{p[:saved_at]}"
|
|
458
|
+
end
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### StorageManager (recommended)
|
|
462
|
+
|
|
463
|
+
```ruby
|
|
464
|
+
manager = DSPy::Storage::StorageManager.new
|
|
465
|
+
|
|
466
|
+
# Save with tags
|
|
467
|
+
saved = manager.save_optimization_result(
|
|
468
|
+
result,
|
|
469
|
+
tags: ['production', 'sentiment-analysis'],
|
|
470
|
+
description: 'Optimized sentiment classifier v2'
|
|
471
|
+
)
|
|
472
|
+
|
|
473
|
+
# Find programs
|
|
474
|
+
programs = manager.find_programs(
|
|
475
|
+
optimizer: 'MIPROv2',
|
|
476
|
+
min_score: 0.85,
|
|
477
|
+
tags: ['production']
|
|
478
|
+
)
|
|
479
|
+
|
|
480
|
+
recent = manager.find_programs(
|
|
481
|
+
max_age_days: 7,
|
|
482
|
+
signature_class: 'ClassifyText'
|
|
483
|
+
)
|
|
484
|
+
|
|
485
|
+
# Get best program for a signature
|
|
486
|
+
best = manager.get_best_program('ClassifyText')
|
|
487
|
+
predictor = best.program
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
Global shorthand:
|
|
491
|
+
|
|
492
|
+
```ruby
|
|
493
|
+
DSPy::Storage::StorageManager.save(result, metadata: { version: '2.0' })
|
|
494
|
+
DSPy::Storage::StorageManager.load(program_id)
|
|
495
|
+
DSPy::Storage::StorageManager.best('ClassifyText')
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
### Checkpoints
|
|
499
|
+
|
|
500
|
+
Create and restore checkpoints during long-running optimizations:
|
|
501
|
+
|
|
502
|
+
```ruby
|
|
503
|
+
# Save a checkpoint
|
|
504
|
+
manager.create_checkpoint(
|
|
505
|
+
current_result,
|
|
506
|
+
'iteration_50',
|
|
507
|
+
metadata: { iteration: 50, current_score: 0.87 }
|
|
508
|
+
)
|
|
509
|
+
|
|
510
|
+
# Restore
|
|
511
|
+
restored = manager.restore_checkpoint('iteration_50')
|
|
512
|
+
program = restored.program
|
|
513
|
+
|
|
514
|
+
# Auto-checkpoint every N iterations
|
|
515
|
+
if iteration % 10 == 0
|
|
516
|
+
manager.create_checkpoint(current_result, "auto_checkpoint_#{iteration}")
|
|
517
|
+
end
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
### Import and export
|
|
521
|
+
|
|
522
|
+
Share programs between environments:
|
|
523
|
+
|
|
524
|
+
```ruby
|
|
525
|
+
storage = DSPy::Storage::ProgramStorage.new
|
|
526
|
+
|
|
527
|
+
# Export
|
|
528
|
+
storage.export_programs(['abc123', 'def456'], './export_backup.json')
|
|
529
|
+
|
|
530
|
+
# Import
|
|
531
|
+
imported = storage.import_programs('./export_backup.json')
|
|
532
|
+
puts "Imported #{imported.size} programs"
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
### Optimization history
|
|
536
|
+
|
|
537
|
+
```ruby
|
|
538
|
+
history = manager.get_optimization_history
|
|
539
|
+
|
|
540
|
+
history[:summary][:total_programs]
|
|
541
|
+
history[:summary][:avg_score]
|
|
542
|
+
|
|
543
|
+
history[:optimizer_stats].each do |optimizer, stats|
|
|
544
|
+
puts "#{optimizer}: #{stats[:count]} programs, best: #{stats[:best_score]}"
|
|
545
|
+
end
|
|
546
|
+
|
|
547
|
+
history[:trends][:improvement_percentage]
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
### Program comparison
|
|
551
|
+
|
|
552
|
+
```ruby
|
|
553
|
+
comparison = manager.compare_programs(id_a, id_b)
|
|
554
|
+
comparison[:comparison][:score_difference]
|
|
555
|
+
comparison[:comparison][:better_program]
|
|
556
|
+
comparison[:comparison][:age_difference_hours]
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
### Storage configuration
|
|
560
|
+
|
|
561
|
+
```ruby
|
|
562
|
+
config = DSPy::Storage::StorageManager::StorageConfig.new
|
|
563
|
+
config.storage_path = Rails.root.join('dspy_storage')
|
|
564
|
+
config.auto_save = true
|
|
565
|
+
config.save_intermediate_results = false
|
|
566
|
+
config.max_stored_programs = 100
|
|
567
|
+
|
|
568
|
+
manager = DSPy::Storage::StorageManager.new(config: config)
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
### Cleanup
|
|
572
|
+
|
|
573
|
+
Remove old programs. Cleanup retains the best performing and most recent programs using a weighted score (70% performance, 30% recency):
|
|
574
|
+
|
|
575
|
+
```ruby
|
|
576
|
+
deleted_count = manager.cleanup_old_programs
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
### Storage events
|
|
580
|
+
|
|
581
|
+
The storage system emits structured log events for monitoring:
|
|
582
|
+
- `dspy.storage.save_start`, `dspy.storage.save_complete`, `dspy.storage.save_error`
|
|
583
|
+
- `dspy.storage.load_start`, `dspy.storage.load_complete`, `dspy.storage.load_error`
|
|
584
|
+
- `dspy.storage.delete`, `dspy.storage.export`, `dspy.storage.import`, `dspy.storage.cleanup`
|
|
585
|
+
|
|
586
|
+
### File layout
|
|
587
|
+
|
|
588
|
+
```
|
|
589
|
+
dspy_storage/
|
|
590
|
+
programs/
|
|
591
|
+
abc123def456.json
|
|
592
|
+
789xyz012345.json
|
|
593
|
+
history.json
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
---
|
|
597
|
+
|
|
598
|
+
## API rules
|
|
599
|
+
|
|
600
|
+
- Call predictors with `.call()`, not `.forward()`.
|
|
601
|
+
- Access prediction fields with dot notation (`result.answer`), not hash notation (`result[:answer]`).
|
|
602
|
+
- GEPA metrics return `DSPy::Prediction.new(score:, feedback:)`, not a boolean.
|
|
603
|
+
- MIPROv2 metrics may return `true`/`false`, a numeric score, or `DSPy::Prediction`.
|