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,502 @@
|
|
|
1
|
+
# DSPy.rb Toolsets
|
|
2
|
+
|
|
3
|
+
## Tools::Base
|
|
4
|
+
|
|
5
|
+
`DSPy::Tools::Base` is the base class for single-purpose tools. Each subclass exposes one operation to an LLM agent through a `call` method.
|
|
6
|
+
|
|
7
|
+
### Defining a Tool
|
|
8
|
+
|
|
9
|
+
Set the tool's identity with the `tool_name` and `tool_description` class-level DSL methods. Define the `call` instance method with a Sorbet `sig` declaration so DSPy.rb can generate the JSON schema the LLM uses to invoke the tool.
|
|
10
|
+
|
|
11
|
+
```ruby
|
|
12
|
+
class WeatherLookup < DSPy::Tools::Base
|
|
13
|
+
extend T::Sig
|
|
14
|
+
|
|
15
|
+
tool_name "weather_lookup"
|
|
16
|
+
tool_description "Look up current weather for a given city"
|
|
17
|
+
|
|
18
|
+
sig { params(city: String, units: T.nilable(String)).returns(String) }
|
|
19
|
+
def call(city:, units: nil)
|
|
20
|
+
# Fetch weather data and return a string summary
|
|
21
|
+
"72F and sunny in #{city}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Key points:
|
|
27
|
+
|
|
28
|
+
- Inherit from `DSPy::Tools::Base`, not `DSPy::Tool`.
|
|
29
|
+
- Use `tool_name` (class method) to set the name the LLM sees. Without it, the class name is lowercased as a fallback.
|
|
30
|
+
- Use `tool_description` (class method) to set the human-readable description surfaced in the tool schema.
|
|
31
|
+
- The `call` method must use **keyword arguments**. Positional arguments are supported but keyword arguments produce better schemas.
|
|
32
|
+
- Always attach a Sorbet `sig` to `call`. Without a signature, the generated schema has empty properties and the LLM cannot determine parameter types.
|
|
33
|
+
|
|
34
|
+
### Schema Generation
|
|
35
|
+
|
|
36
|
+
`call_schema_object` introspects the Sorbet signature on `call` and returns a hash representing the JSON Schema `parameters` object:
|
|
37
|
+
|
|
38
|
+
```ruby
|
|
39
|
+
WeatherLookup.call_schema_object
|
|
40
|
+
# => {
|
|
41
|
+
# type: "object",
|
|
42
|
+
# properties: {
|
|
43
|
+
# city: { type: "string", description: "Parameter city" },
|
|
44
|
+
# units: { type: "string", description: "Parameter units (optional)" }
|
|
45
|
+
# },
|
|
46
|
+
# required: ["city"]
|
|
47
|
+
# }
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
`call_schema` wraps this in the full LLM tool-calling format:
|
|
51
|
+
|
|
52
|
+
```ruby
|
|
53
|
+
WeatherLookup.call_schema
|
|
54
|
+
# => {
|
|
55
|
+
# type: "function",
|
|
56
|
+
# function: {
|
|
57
|
+
# name: "call",
|
|
58
|
+
# description: "Call the WeatherLookup tool",
|
|
59
|
+
# parameters: { ... }
|
|
60
|
+
# }
|
|
61
|
+
# }
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Using Tools with ReAct
|
|
65
|
+
|
|
66
|
+
Pass tool instances in an array to `DSPy::ReAct`:
|
|
67
|
+
|
|
68
|
+
```ruby
|
|
69
|
+
agent = DSPy::ReAct.new(
|
|
70
|
+
MySignature,
|
|
71
|
+
tools: [WeatherLookup.new, AnotherTool.new]
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
result = agent.call(question: "What is the weather in Berlin?")
|
|
75
|
+
puts result.answer
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Access output fields with dot notation (`result.answer`), not hash access (`result[:answer]`).
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Tools::Toolset
|
|
83
|
+
|
|
84
|
+
`DSPy::Tools::Toolset` groups multiple related methods into a single class. Each exposed method becomes an independent tool from the LLM's perspective.
|
|
85
|
+
|
|
86
|
+
### Defining a Toolset
|
|
87
|
+
|
|
88
|
+
```ruby
|
|
89
|
+
class DatabaseToolset < DSPy::Tools::Toolset
|
|
90
|
+
extend T::Sig
|
|
91
|
+
|
|
92
|
+
toolset_name "db"
|
|
93
|
+
|
|
94
|
+
tool :query, description: "Run a read-only SQL query"
|
|
95
|
+
tool :insert, description: "Insert a record into a table"
|
|
96
|
+
tool :delete, description: "Delete a record by ID"
|
|
97
|
+
|
|
98
|
+
sig { params(sql: String).returns(String) }
|
|
99
|
+
def query(sql:)
|
|
100
|
+
# Execute read query
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
sig { params(table: String, data: T::Hash[String, String]).returns(String) }
|
|
104
|
+
def insert(table:, data:)
|
|
105
|
+
# Insert record
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
sig { params(table: String, id: Integer).returns(String) }
|
|
109
|
+
def delete(table:, id:)
|
|
110
|
+
# Delete record
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### DSL Methods
|
|
116
|
+
|
|
117
|
+
**`toolset_name(name)`** -- Set the prefix for all generated tool names. If omitted, the class name minus `Toolset` suffix is lowercased (e.g., `DatabaseToolset` becomes `database`).
|
|
118
|
+
|
|
119
|
+
```ruby
|
|
120
|
+
toolset_name "db"
|
|
121
|
+
# tool :query produces a tool named "db_query"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**`tool(method_name, tool_name:, description:)`** -- Expose a method as a tool.
|
|
125
|
+
|
|
126
|
+
- `method_name` (Symbol, required) -- the instance method to expose.
|
|
127
|
+
- `tool_name:` (String, optional) -- override the default `<toolset_name>_<method_name>` naming.
|
|
128
|
+
- `description:` (String, optional) -- description shown to the LLM. Defaults to a humanized version of the method name.
|
|
129
|
+
|
|
130
|
+
```ruby
|
|
131
|
+
tool :word_count, tool_name: "text_wc", description: "Count lines, words, and characters"
|
|
132
|
+
# Produces a tool named "text_wc" instead of "text_word_count"
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Converting to a Tool Array
|
|
136
|
+
|
|
137
|
+
Call `to_tools` on the class (not an instance) to get an array of `ToolProxy` objects compatible with `DSPy::Tools::Base`:
|
|
138
|
+
|
|
139
|
+
```ruby
|
|
140
|
+
agent = DSPy::ReAct.new(
|
|
141
|
+
AnalyzeText,
|
|
142
|
+
tools: DatabaseToolset.to_tools
|
|
143
|
+
)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Each `ToolProxy` wraps one method, delegates `call` to the underlying toolset instance, and generates its own JSON schema from the method's Sorbet signature.
|
|
147
|
+
|
|
148
|
+
### Shared State
|
|
149
|
+
|
|
150
|
+
All tool proxies from a single `to_tools` call share one toolset instance. Store shared state (connections, caches, configuration) in the toolset's `initialize`:
|
|
151
|
+
|
|
152
|
+
```ruby
|
|
153
|
+
class ApiToolset < DSPy::Tools::Toolset
|
|
154
|
+
extend T::Sig
|
|
155
|
+
|
|
156
|
+
toolset_name "api"
|
|
157
|
+
|
|
158
|
+
tool :get, description: "Make a GET request"
|
|
159
|
+
tool :post, description: "Make a POST request"
|
|
160
|
+
|
|
161
|
+
sig { params(base_url: String).void }
|
|
162
|
+
def initialize(base_url:)
|
|
163
|
+
@base_url = base_url
|
|
164
|
+
@client = HTTP.persistent(base_url)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
sig { params(path: String).returns(String) }
|
|
168
|
+
def get(path:)
|
|
169
|
+
@client.get("#{@base_url}#{path}").body.to_s
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
sig { params(path: String, body: String).returns(String) }
|
|
173
|
+
def post(path:, body:)
|
|
174
|
+
@client.post("#{@base_url}#{path}", body: body).body.to_s
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Type Safety
|
|
182
|
+
|
|
183
|
+
Sorbet signatures on tool methods drive both JSON schema generation and automatic type coercion of LLM responses.
|
|
184
|
+
|
|
185
|
+
### Basic Types
|
|
186
|
+
|
|
187
|
+
```ruby
|
|
188
|
+
sig { params(
|
|
189
|
+
text: String,
|
|
190
|
+
count: Integer,
|
|
191
|
+
score: Float,
|
|
192
|
+
enabled: T::Boolean,
|
|
193
|
+
threshold: Numeric
|
|
194
|
+
).returns(String) }
|
|
195
|
+
def analyze(text:, count:, score:, enabled:, threshold:)
|
|
196
|
+
# ...
|
|
197
|
+
end
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
| Sorbet Type | JSON Schema |
|
|
201
|
+
|------------------|----------------------------------------------------|
|
|
202
|
+
| `String` | `{"type": "string"}` |
|
|
203
|
+
| `Integer` | `{"type": "integer"}` |
|
|
204
|
+
| `Float` | `{"type": "number"}` |
|
|
205
|
+
| `Numeric` | `{"type": "number"}` |
|
|
206
|
+
| `T::Boolean` | `{"type": "boolean"}` |
|
|
207
|
+
| `T::Enum` | `{"type": "string", "enum": [...]}` |
|
|
208
|
+
| `T::Struct` | `{"type": "object", "properties": {...}}` |
|
|
209
|
+
| `T::Array[Type]` | `{"type": "array", "items": {...}}` |
|
|
210
|
+
| `T::Hash[K, V]` | `{"type": "object", "additionalProperties": {...}}`|
|
|
211
|
+
| `T.nilable(Type)`| `{"type": [original, "null"]}` |
|
|
212
|
+
| `T.any(T1, T2)` | `{"oneOf": [{...}, {...}]}` |
|
|
213
|
+
| `T.class_of(X)` | `{"type": "string"}` |
|
|
214
|
+
|
|
215
|
+
### T::Enum Parameters
|
|
216
|
+
|
|
217
|
+
Define a `T::Enum` and reference it in a tool signature. DSPy.rb generates a JSON Schema `enum` constraint and automatically deserializes the LLM's string response into the correct enum instance.
|
|
218
|
+
|
|
219
|
+
```ruby
|
|
220
|
+
class Priority < T::Enum
|
|
221
|
+
enums do
|
|
222
|
+
Low = new('low')
|
|
223
|
+
Medium = new('medium')
|
|
224
|
+
High = new('high')
|
|
225
|
+
Critical = new('critical')
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
class Status < T::Enum
|
|
230
|
+
enums do
|
|
231
|
+
Pending = new('pending')
|
|
232
|
+
InProgress = new('in-progress')
|
|
233
|
+
Completed = new('completed')
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
sig { params(priority: Priority, status: Status).returns(String) }
|
|
238
|
+
def update_task(priority:, status:)
|
|
239
|
+
"Updated to #{priority.serialize} / #{status.serialize}"
|
|
240
|
+
end
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
The generated schema constrains the parameter to valid values:
|
|
244
|
+
|
|
245
|
+
```json
|
|
246
|
+
{
|
|
247
|
+
"priority": {
|
|
248
|
+
"type": "string",
|
|
249
|
+
"enum": ["low", "medium", "high", "critical"]
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**Case-insensitive matching**: When the LLM returns `"HIGH"` or `"High"` instead of `"high"`, DSPy.rb first tries an exact `try_deserialize`, then falls back to a case-insensitive lookup. This prevents failures caused by LLM casing variations.
|
|
255
|
+
|
|
256
|
+
### T::Struct Parameters
|
|
257
|
+
|
|
258
|
+
Use `T::Struct` for complex nested objects. DSPy.rb generates nested JSON Schema properties and recursively coerces the LLM's hash response into struct instances.
|
|
259
|
+
|
|
260
|
+
```ruby
|
|
261
|
+
class TaskMetadata < T::Struct
|
|
262
|
+
prop :id, String
|
|
263
|
+
prop :priority, Priority
|
|
264
|
+
prop :tags, T::Array[String]
|
|
265
|
+
prop :estimated_hours, T.nilable(Float), default: nil
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
class TaskRequest < T::Struct
|
|
269
|
+
prop :title, String
|
|
270
|
+
prop :description, String
|
|
271
|
+
prop :status, Status
|
|
272
|
+
prop :metadata, TaskMetadata
|
|
273
|
+
prop :assignees, T::Array[String]
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
sig { params(task: TaskRequest).returns(String) }
|
|
277
|
+
def create_task(task:)
|
|
278
|
+
"Created: #{task.title} (#{task.status.serialize})"
|
|
279
|
+
end
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
The LLM sees the full nested object schema and DSPy.rb reconstructs the struct tree from the JSON response, including enum fields inside nested structs.
|
|
283
|
+
|
|
284
|
+
### Nilable Parameters
|
|
285
|
+
|
|
286
|
+
Mark optional parameters with `T.nilable(...)` and provide a default value of `nil` in the method signature. These parameters are excluded from the JSON Schema `required` array.
|
|
287
|
+
|
|
288
|
+
```ruby
|
|
289
|
+
sig { params(
|
|
290
|
+
query: String,
|
|
291
|
+
max_results: T.nilable(Integer),
|
|
292
|
+
filter: T.nilable(String)
|
|
293
|
+
).returns(String) }
|
|
294
|
+
def search(query:, max_results: nil, filter: nil)
|
|
295
|
+
# query is required; max_results and filter are optional
|
|
296
|
+
end
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Collections
|
|
300
|
+
|
|
301
|
+
Typed arrays and hashes generate precise item/value schemas:
|
|
302
|
+
|
|
303
|
+
```ruby
|
|
304
|
+
sig { params(
|
|
305
|
+
tags: T::Array[String],
|
|
306
|
+
priorities: T::Array[Priority],
|
|
307
|
+
config: T::Hash[String, T.any(String, Integer, Float)]
|
|
308
|
+
).returns(String) }
|
|
309
|
+
def configure(tags:, priorities:, config:)
|
|
310
|
+
# Array elements and hash values are validated and coerced
|
|
311
|
+
end
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### Union Types
|
|
315
|
+
|
|
316
|
+
`T.any(...)` generates a `oneOf` JSON Schema. When one of the union members is a `T::Struct`, DSPy.rb uses the `_type` discriminator field to select the correct struct class during coercion.
|
|
317
|
+
|
|
318
|
+
```ruby
|
|
319
|
+
sig { params(value: T.any(String, Integer, Float)).returns(String) }
|
|
320
|
+
def handle_flexible(value:)
|
|
321
|
+
# Accepts multiple types
|
|
322
|
+
end
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## Built-in Toolsets
|
|
328
|
+
|
|
329
|
+
### TextProcessingToolset
|
|
330
|
+
|
|
331
|
+
`DSPy::Tools::TextProcessingToolset` provides Unix-style text analysis and manipulation operations. Toolset name prefix: `text`.
|
|
332
|
+
|
|
333
|
+
| Tool Name | Method | Description |
|
|
334
|
+
|-----------------------------------|-------------------|--------------------------------------------|
|
|
335
|
+
| `text_grep` | `grep` | Search for patterns with optional case-insensitive and count-only modes |
|
|
336
|
+
| `text_wc` | `word_count` | Count lines, words, and characters |
|
|
337
|
+
| `text_rg` | `ripgrep` | Fast pattern search with context lines |
|
|
338
|
+
| `text_extract_lines` | `extract_lines` | Extract a range of lines by number |
|
|
339
|
+
| `text_filter_lines` | `filter_lines` | Keep or reject lines matching a regex |
|
|
340
|
+
| `text_unique_lines` | `unique_lines` | Deduplicate lines, optionally preserving order |
|
|
341
|
+
| `text_sort_lines` | `sort_lines` | Sort lines alphabetically or numerically |
|
|
342
|
+
| `text_summarize_text` | `summarize_text` | Produce a statistical summary (counts, averages, frequent words) |
|
|
343
|
+
|
|
344
|
+
Usage:
|
|
345
|
+
|
|
346
|
+
```ruby
|
|
347
|
+
agent = DSPy::ReAct.new(
|
|
348
|
+
AnalyzeText,
|
|
349
|
+
tools: DSPy::Tools::TextProcessingToolset.to_tools
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
result = agent.call(text: log_contents, question: "How many error lines are there?")
|
|
353
|
+
puts result.answer
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### GitHubCLIToolset
|
|
357
|
+
|
|
358
|
+
`DSPy::Tools::GitHubCLIToolset` wraps the `gh` CLI for read-oriented GitHub operations. Toolset name prefix: `github`.
|
|
359
|
+
|
|
360
|
+
| Tool Name | Method | Description |
|
|
361
|
+
|------------------------|-------------------|---------------------------------------------------|
|
|
362
|
+
| `github_list_issues` | `list_issues` | List issues filtered by state, labels, assignee |
|
|
363
|
+
| `github_list_prs` | `list_prs` | List pull requests filtered by state, author, base|
|
|
364
|
+
| `github_get_issue` | `get_issue` | Retrieve details of a single issue |
|
|
365
|
+
| `github_get_pr` | `get_pr` | Retrieve details of a single pull request |
|
|
366
|
+
| `github_api_request` | `api_request` | Make an arbitrary GET request to the GitHub API |
|
|
367
|
+
| `github_traffic_views` | `traffic_views` | Fetch repository traffic view counts |
|
|
368
|
+
| `github_traffic_clones`| `traffic_clones` | Fetch repository traffic clone counts |
|
|
369
|
+
|
|
370
|
+
This toolset uses `T::Enum` parameters (`IssueState`, `PRState`, `ReviewState`) for state filters, demonstrating enum-based tool signatures in practice.
|
|
371
|
+
|
|
372
|
+
```ruby
|
|
373
|
+
agent = DSPy::ReAct.new(
|
|
374
|
+
RepoAnalysis,
|
|
375
|
+
tools: DSPy::Tools::GitHubCLIToolset.to_tools
|
|
376
|
+
)
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## Testing
|
|
382
|
+
|
|
383
|
+
### Unit Testing Individual Tools
|
|
384
|
+
|
|
385
|
+
Test `DSPy::Tools::Base` subclasses by instantiating and calling `call` directly:
|
|
386
|
+
|
|
387
|
+
```ruby
|
|
388
|
+
RSpec.describe WeatherLookup do
|
|
389
|
+
subject(:tool) { described_class.new }
|
|
390
|
+
|
|
391
|
+
it "returns weather for a city" do
|
|
392
|
+
result = tool.call(city: "Berlin")
|
|
393
|
+
expect(result).to include("Berlin")
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
it "exposes the correct tool name" do
|
|
397
|
+
expect(tool.name).to eq("weather_lookup")
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
it "generates a valid schema" do
|
|
401
|
+
schema = described_class.call_schema_object
|
|
402
|
+
expect(schema[:required]).to include("city")
|
|
403
|
+
expect(schema[:properties]).to have_key(:city)
|
|
404
|
+
end
|
|
405
|
+
end
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Unit Testing Toolsets
|
|
409
|
+
|
|
410
|
+
Test toolset methods directly on an instance. Verify tool generation with `to_tools`:
|
|
411
|
+
|
|
412
|
+
```ruby
|
|
413
|
+
RSpec.describe DatabaseToolset do
|
|
414
|
+
subject(:toolset) { described_class.new }
|
|
415
|
+
|
|
416
|
+
it "executes a query" do
|
|
417
|
+
result = toolset.query(sql: "SELECT 1")
|
|
418
|
+
expect(result).to be_a(String)
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
it "generates tools with correct names" do
|
|
422
|
+
tools = described_class.to_tools
|
|
423
|
+
names = tools.map(&:name)
|
|
424
|
+
expect(names).to contain_exactly("db_query", "db_insert", "db_delete")
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
it "generates tool descriptions" do
|
|
428
|
+
tools = described_class.to_tools
|
|
429
|
+
query_tool = tools.find { |t| t.name == "db_query" }
|
|
430
|
+
expect(query_tool.description).to eq("Run a read-only SQL query")
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Mocking Predictions Inside Tools
|
|
436
|
+
|
|
437
|
+
When a tool calls a DSPy predictor internally, stub the predictor to isolate tool logic from LLM calls:
|
|
438
|
+
|
|
439
|
+
```ruby
|
|
440
|
+
class SmartSearchTool < DSPy::Tools::Base
|
|
441
|
+
extend T::Sig
|
|
442
|
+
|
|
443
|
+
tool_name "smart_search"
|
|
444
|
+
tool_description "Search with query expansion"
|
|
445
|
+
|
|
446
|
+
sig { void }
|
|
447
|
+
def initialize
|
|
448
|
+
@expander = DSPy::Predict.new(QueryExpansionSignature)
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
sig { params(query: String).returns(String) }
|
|
452
|
+
def call(query:)
|
|
453
|
+
expanded = @expander.call(query: query)
|
|
454
|
+
perform_search(expanded.expanded_query)
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
private
|
|
458
|
+
|
|
459
|
+
def perform_search(query)
|
|
460
|
+
# actual search logic
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
RSpec.describe SmartSearchTool do
|
|
465
|
+
subject(:tool) { described_class.new }
|
|
466
|
+
|
|
467
|
+
before do
|
|
468
|
+
expansion_result = double("result", expanded_query: "expanded test query")
|
|
469
|
+
allow_any_instance_of(DSPy::Predict).to receive(:call).and_return(expansion_result)
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
it "expands the query before searching" do
|
|
473
|
+
allow(tool).to receive(:perform_search).with("expanded test query").and_return("found 3 results")
|
|
474
|
+
result = tool.call(query: "test")
|
|
475
|
+
expect(result).to eq("found 3 results")
|
|
476
|
+
end
|
|
477
|
+
end
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### Testing Enum Coercion
|
|
481
|
+
|
|
482
|
+
Verify that string values from LLM responses deserialize into the correct enum instances:
|
|
483
|
+
|
|
484
|
+
```ruby
|
|
485
|
+
RSpec.describe "enum coercion" do
|
|
486
|
+
it "handles case-insensitive enum values" do
|
|
487
|
+
toolset = GitHubCLIToolset.new
|
|
488
|
+
# The LLM may return "OPEN" instead of "open"
|
|
489
|
+
result = toolset.list_issues(state: IssueState::Open)
|
|
490
|
+
expect(result).to be_a(String)
|
|
491
|
+
end
|
|
492
|
+
end
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
---
|
|
496
|
+
|
|
497
|
+
## Constraints
|
|
498
|
+
|
|
499
|
+
- All exposed tool methods must use **keyword arguments**. Positional-only parameters generate schemas but keyword arguments produce more reliable LLM interactions.
|
|
500
|
+
- Each exposed method becomes a **separate, independent tool**. Method chaining or multi-step sequences within a single tool call are not supported.
|
|
501
|
+
- Shared state across tool proxies is scoped to a single `to_tools` call. Separate `to_tools` invocations create separate toolset instances.
|
|
502
|
+
- Methods without a Sorbet `sig` produce an empty parameter schema. The LLM will not know what arguments to pass.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: every-style-editor
|
|
3
|
+
description: This skill should be used when reviewing or editing copy to ensure adherence to Every's style guide. It provides a systematic line-by-line review process for grammar, punctuation, mechanics, and style guide compliance.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Every Style Editor
|
|
7
|
+
|
|
8
|
+
This skill provides a systematic approach to reviewing copy against Every's comprehensive style guide. It transforms Claude into a meticulous line editor and proofreader specializing in grammar, mechanics, and style guide compliance.
|
|
9
|
+
|
|
10
|
+
## When to Use This Skill
|
|
11
|
+
|
|
12
|
+
Use this skill when:
|
|
13
|
+
- Reviewing articles, blog posts, newsletters, or any written content
|
|
14
|
+
- Ensuring copy follows Every's specific style conventions
|
|
15
|
+
- Providing feedback on grammar, punctuation, and mechanics
|
|
16
|
+
- Flagging deviations from the Every style guide
|
|
17
|
+
- Preparing clean copy for human editorial review
|
|
18
|
+
|
|
19
|
+
## Skill Overview
|
|
20
|
+
|
|
21
|
+
This skill enables performing a comprehensive review of written content in four phases:
|
|
22
|
+
|
|
23
|
+
1. **Initial Assessment** - Understanding context and document type
|
|
24
|
+
2. **Detailed Line Edit** - Checking every sentence for compliance
|
|
25
|
+
3. **Mechanical Review** - Verifying formatting and consistency
|
|
26
|
+
4. **Recommendations** - Providing actionable improvement suggestions
|
|
27
|
+
|
|
28
|
+
## How to Use This Skill
|
|
29
|
+
|
|
30
|
+
### Step 1: Initial Assessment
|
|
31
|
+
|
|
32
|
+
Begin by reading the entire piece to understand:
|
|
33
|
+
- Document type (article, knowledge base entry, social post, etc.)
|
|
34
|
+
- Target audience
|
|
35
|
+
- Overall tone and voice
|
|
36
|
+
- Content context
|
|
37
|
+
|
|
38
|
+
### Step 2: Detailed Line Edit
|
|
39
|
+
|
|
40
|
+
Review each paragraph systematically, checking for:
|
|
41
|
+
- Sentence structure and grammar correctness
|
|
42
|
+
- Punctuation usage (commas, semicolons, em dashes, etc.)
|
|
43
|
+
- Capitalization rules (especially job titles, headlines)
|
|
44
|
+
- Word choice and usage (overused words, passive voice)
|
|
45
|
+
- Adherence to Every style guide rules
|
|
46
|
+
|
|
47
|
+
Reference the complete [EVERY_WRITE_STYLE.md](./references/EVERY_WRITE_STYLE.md) for specific rules when in doubt.
|
|
48
|
+
|
|
49
|
+
### Step 3: Mechanical Review
|
|
50
|
+
|
|
51
|
+
Verify:
|
|
52
|
+
- Spacing and formatting consistency
|
|
53
|
+
- Style choices applied uniformly throughout
|
|
54
|
+
- Special elements (lists, quotes, citations)
|
|
55
|
+
- Proper use of italics and formatting
|
|
56
|
+
- Number formatting (numerals vs. spelled out)
|
|
57
|
+
- Link formatting and descriptions
|
|
58
|
+
|
|
59
|
+
### Step 4: Output Results
|
|
60
|
+
|
|
61
|
+
Present findings using this structure:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
DOCUMENT REVIEW SUMMARY
|
|
65
|
+
=====================
|
|
66
|
+
Document Type: [type]
|
|
67
|
+
Word Count: [approximate]
|
|
68
|
+
Overall Assessment: [brief overview]
|
|
69
|
+
|
|
70
|
+
ERRORS FOUND: [total number]
|
|
71
|
+
|
|
72
|
+
DETAILED CORRECTIONS
|
|
73
|
+
===================
|
|
74
|
+
|
|
75
|
+
[For each error found:]
|
|
76
|
+
|
|
77
|
+
**Location**: [Paragraph #, Sentence #]
|
|
78
|
+
**Issue Type**: [Grammar/Punctuation/Mechanics/Style Guide]
|
|
79
|
+
**Original**: "[exact text with error]"
|
|
80
|
+
**Correction**: "[corrected text]"
|
|
81
|
+
**Rule Reference**: [Specific style guide rule violated]
|
|
82
|
+
**Explanation**: [Brief explanation of why this is an error]
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
RECURRING ISSUES
|
|
87
|
+
===============
|
|
88
|
+
[List patterns of errors that appear multiple times]
|
|
89
|
+
|
|
90
|
+
STYLE GUIDE COMPLIANCE CHECKLIST
|
|
91
|
+
==============================
|
|
92
|
+
✓ [Rule followed correctly]
|
|
93
|
+
✗ [Rule violated - with count of violations]
|
|
94
|
+
|
|
95
|
+
FINAL RECOMMENDATIONS
|
|
96
|
+
===================
|
|
97
|
+
[2-3 actionable suggestions for improving the draft]
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Style Guide Reference
|
|
101
|
+
|
|
102
|
+
The complete Every style guide is included in [EVERY_WRITE_STYLE.md](./references/EVERY_WRITE_STYLE.md). Key areas to focus on:
|
|
103
|
+
|
|
104
|
+
- **Quick Rules**: Title case for headlines, sentence case elsewhere
|
|
105
|
+
- **Tone**: Active voice, avoid overused words (actually, very, just), be specific
|
|
106
|
+
- **Numbers**: Spell out one through nine; use numerals for 10+
|
|
107
|
+
- **Punctuation**: Oxford commas, em dashes without spaces, proper quotation mark usage
|
|
108
|
+
- **Capitalization**: Lowercase job titles, company as singular (it), teams as plural (they)
|
|
109
|
+
- **Emphasis**: Italics only (no bold for emphasis)
|
|
110
|
+
- **Links**: 2-4 words, don't say "click here"
|
|
111
|
+
|
|
112
|
+
## Key Principles
|
|
113
|
+
|
|
114
|
+
- **Be specific**: Always quote the exact text with the error
|
|
115
|
+
- **Reference rules**: Cite the specific style guide rule for each correction
|
|
116
|
+
- **Maintain voice**: Preserve the author's voice while correcting errors
|
|
117
|
+
- **Prioritize clarity**: Focus on changes that improve readability
|
|
118
|
+
- **Be constructive**: Frame feedback to help writers improve
|
|
119
|
+
- **Flag ambiguous cases**: When style guide doesn't address an issue, explain options and recommend the clearest choice
|
|
120
|
+
|
|
121
|
+
## Common Areas to Focus On
|
|
122
|
+
|
|
123
|
+
Based on Every's style guide, pay special attention to:
|
|
124
|
+
|
|
125
|
+
- Punctuation (comma usage, semicolons, apostrophes, quotation marks)
|
|
126
|
+
- Capitalization (proper nouns, titles, sentence starts)
|
|
127
|
+
- Numbers (when to spell out vs. use numerals)
|
|
128
|
+
- Passive voice (replace with active whenever possible)
|
|
129
|
+
- Overused words (actually, very, just)
|
|
130
|
+
- Lists (parallel structure, punctuation, capitalization)
|
|
131
|
+
- Hyphenation (compound adjectives, except adverbs)
|
|
132
|
+
- Word usage (fewer vs. less, they vs. them)
|
|
133
|
+
- Company references (singular "it", teams as plural "they")
|
|
134
|
+
- Job title capitalization
|