@jahanxu/trellis 0.4.1
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 +235 -0
- package/README.md +212 -0
- package/bin/trellis.js +3 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +97 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/init.d.ts +21 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +527 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/update.d.ts +27 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +1289 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/configurators/antigravity.d.ts +8 -0
- package/dist/configurators/antigravity.d.ts.map +1 -0
- package/dist/configurators/antigravity.js +18 -0
- package/dist/configurators/antigravity.js.map +1 -0
- package/dist/configurators/claude.d.ts +32 -0
- package/dist/configurators/claude.d.ts.map +1 -0
- package/dist/configurators/claude.js +98 -0
- package/dist/configurators/claude.js.map +1 -0
- package/dist/configurators/codex.d.ts +8 -0
- package/dist/configurators/codex.d.ts.map +1 -0
- package/dist/configurators/codex.js +20 -0
- package/dist/configurators/codex.js.map +1 -0
- package/dist/configurators/cursor.d.ts +5 -0
- package/dist/configurators/cursor.d.ts.map +1 -0
- package/dist/configurators/cursor.js +52 -0
- package/dist/configurators/cursor.js.map +1 -0
- package/dist/configurators/gemini.d.ts +8 -0
- package/dist/configurators/gemini.d.ts.map +1 -0
- package/dist/configurators/gemini.js +52 -0
- package/dist/configurators/gemini.js.map +1 -0
- package/dist/configurators/iflow.d.ts +33 -0
- package/dist/configurators/iflow.d.ts.map +1 -0
- package/dist/configurators/iflow.js +99 -0
- package/dist/configurators/iflow.js.map +1 -0
- package/dist/configurators/index.d.ts +55 -0
- package/dist/configurators/index.d.ts.map +1 -0
- package/dist/configurators/index.js +220 -0
- package/dist/configurators/index.js.map +1 -0
- package/dist/configurators/kilo.d.ts +8 -0
- package/dist/configurators/kilo.d.ts.map +1 -0
- package/dist/configurators/kilo.js +51 -0
- package/dist/configurators/kilo.js.map +1 -0
- package/dist/configurators/kiro.d.ts +8 -0
- package/dist/configurators/kiro.d.ts.map +1 -0
- package/dist/configurators/kiro.js +20 -0
- package/dist/configurators/kiro.js.map +1 -0
- package/dist/configurators/opencode.d.ts +32 -0
- package/dist/configurators/opencode.d.ts.map +1 -0
- package/dist/configurators/opencode.js +92 -0
- package/dist/configurators/opencode.js.map +1 -0
- package/dist/configurators/shared.d.ts +12 -0
- package/dist/configurators/shared.d.ts.map +1 -0
- package/dist/configurators/shared.js +21 -0
- package/dist/configurators/shared.js.map +1 -0
- package/dist/configurators/workflow.d.ts +28 -0
- package/dist/configurators/workflow.d.ts.map +1 -0
- package/dist/configurators/workflow.js +134 -0
- package/dist/configurators/workflow.js.map +1 -0
- package/dist/constants/paths.d.ts +68 -0
- package/dist/constants/paths.d.ts.map +1 -0
- package/dist/constants/paths.js +77 -0
- package/dist/constants/paths.js.map +1 -0
- package/dist/constants/version.d.ts +9 -0
- package/dist/constants/version.d.ts.map +1 -0
- package/dist/constants/version.js +15 -0
- package/dist/constants/version.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/index.d.ts +54 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +160 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/manifests/0.1.9.json +30 -0
- package/dist/migrations/manifests/0.2.0.json +49 -0
- package/dist/migrations/manifests/0.2.12.json +9 -0
- package/dist/migrations/manifests/0.2.13.json +9 -0
- package/dist/migrations/manifests/0.2.14.json +175 -0
- package/dist/migrations/manifests/0.2.15.json +33 -0
- package/dist/migrations/manifests/0.3.0-beta.0.json +278 -0
- package/dist/migrations/manifests/0.3.0-beta.1.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.11.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.12.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.13.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.14.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.15.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.16.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.5.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.6.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.7.json +11 -0
- package/dist/migrations/manifests/0.3.0-beta.8.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.9.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.0.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.1.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.2.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.3.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.4.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.5.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.6.json +9 -0
- package/dist/migrations/manifests/0.3.0.json +11 -0
- package/dist/templates/antigravity/index.d.ts +12 -0
- package/dist/templates/antigravity/index.d.ts.map +1 -0
- package/dist/templates/antigravity/index.js +29 -0
- package/dist/templates/antigravity/index.js.map +1 -0
- package/dist/templates/claude/agents/check.md +122 -0
- package/dist/templates/claude/agents/debug.md +106 -0
- package/dist/templates/claude/agents/dispatch.md +214 -0
- package/dist/templates/claude/agents/implement.md +96 -0
- package/dist/templates/claude/agents/plan.md +396 -0
- package/dist/templates/claude/agents/research.md +120 -0
- package/dist/templates/claude/commands/trellis/before-backend-dev.md +13 -0
- package/dist/templates/claude/commands/trellis/before-frontend-dev.md +13 -0
- package/dist/templates/claude/commands/trellis/before-role-work.md +364 -0
- package/dist/templates/claude/commands/trellis/brainstorm.md +474 -0
- package/dist/templates/claude/commands/trellis/break-loop.md +125 -0
- package/dist/templates/claude/commands/trellis/check-backend.md +13 -0
- package/dist/templates/claude/commands/trellis/check-cross-layer.md +153 -0
- package/dist/templates/claude/commands/trellis/check-frontend.md +13 -0
- package/dist/templates/claude/commands/trellis/create-command.md +154 -0
- package/dist/templates/claude/commands/trellis/finish-work.md +153 -0
- package/dist/templates/claude/commands/trellis/handoff.md +445 -0
- package/dist/templates/claude/commands/trellis/integrate-skill.md +219 -0
- package/dist/templates/claude/commands/trellis/onboard.md +358 -0
- package/dist/templates/claude/commands/trellis/parallel.md +193 -0
- package/dist/templates/claude/commands/trellis/pick-task.md +515 -0
- package/dist/templates/claude/commands/trellis/record-session.md +62 -0
- package/dist/templates/claude/commands/trellis/start.md +373 -0
- package/dist/templates/claude/commands/trellis/update-spec.md +354 -0
- package/dist/templates/claude/hooks/inject-subagent-context.py +873 -0
- package/dist/templates/claude/hooks/ralph-loop.py +388 -0
- package/dist/templates/claude/hooks/session-start.py +200 -0
- package/dist/templates/claude/index.d.ts +54 -0
- package/dist/templates/claude/index.d.ts.map +1 -0
- package/dist/templates/claude/index.js +85 -0
- package/dist/templates/claude/index.js.map +1 -0
- package/dist/templates/claude/settings.json +41 -0
- package/dist/templates/codex/index.d.ts +18 -0
- package/dist/templates/codex/index.d.ts.map +1 -0
- package/dist/templates/codex/index.js +40 -0
- package/dist/templates/codex/index.js.map +1 -0
- package/dist/templates/codex/skills/before-backend-dev/SKILL.md +18 -0
- package/dist/templates/codex/skills/before-frontend-dev/SKILL.md +18 -0
- package/dist/templates/codex/skills/brainstorm/SKILL.md +479 -0
- package/dist/templates/codex/skills/break-loop/SKILL.md +130 -0
- package/dist/templates/codex/skills/check-backend/SKILL.md +18 -0
- package/dist/templates/codex/skills/check-cross-layer/SKILL.md +158 -0
- package/dist/templates/codex/skills/check-frontend/SKILL.md +18 -0
- package/dist/templates/codex/skills/create-command/SKILL.md +101 -0
- package/dist/templates/codex/skills/finish-work/SKILL.md +148 -0
- package/dist/templates/codex/skills/integrate-skill/SKILL.md +221 -0
- package/dist/templates/codex/skills/onboard/SKILL.md +363 -0
- package/dist/templates/codex/skills/record-session/SKILL.md +67 -0
- package/dist/templates/codex/skills/start/SKILL.md +330 -0
- package/dist/templates/codex/skills/update-spec/SKILL.md +335 -0
- package/dist/templates/cursor/commands/trellis-before-backend-dev.md +13 -0
- package/dist/templates/cursor/commands/trellis-before-frontend-dev.md +13 -0
- package/dist/templates/cursor/commands/trellis-brainstorm.md +474 -0
- package/dist/templates/cursor/commands/trellis-break-loop.md +107 -0
- package/dist/templates/cursor/commands/trellis-check-backend.md +13 -0
- package/dist/templates/cursor/commands/trellis-check-cross-layer.md +153 -0
- package/dist/templates/cursor/commands/trellis-check-frontend.md +13 -0
- package/dist/templates/cursor/commands/trellis-create-command.md +154 -0
- package/dist/templates/cursor/commands/trellis-finish-work.md +143 -0
- package/dist/templates/cursor/commands/trellis-integrate-skill.md +219 -0
- package/dist/templates/cursor/commands/trellis-onboard.md +358 -0
- package/dist/templates/cursor/commands/trellis-record-session.md +62 -0
- package/dist/templates/cursor/commands/trellis-start.md +366 -0
- package/dist/templates/cursor/commands/trellis-update-spec.md +354 -0
- package/dist/templates/cursor/index.d.ts +24 -0
- package/dist/templates/cursor/index.d.ts.map +1 -0
- package/dist/templates/cursor/index.js +44 -0
- package/dist/templates/cursor/index.js.map +1 -0
- package/dist/templates/extract.d.ts +166 -0
- package/dist/templates/extract.d.ts.map +1 -0
- package/dist/templates/extract.js +296 -0
- package/dist/templates/extract.js.map +1 -0
- package/dist/templates/gemini/commands/trellis/before-backend-dev.toml +17 -0
- package/dist/templates/gemini/commands/trellis/before-frontend-dev.toml +17 -0
- package/dist/templates/gemini/commands/trellis/brainstorm.toml +420 -0
- package/dist/templates/gemini/commands/trellis/break-loop.toml +129 -0
- package/dist/templates/gemini/commands/trellis/check-backend.toml +17 -0
- package/dist/templates/gemini/commands/trellis/check-cross-layer.toml +147 -0
- package/dist/templates/gemini/commands/trellis/check-frontend.toml +17 -0
- package/dist/templates/gemini/commands/trellis/create-command.toml +119 -0
- package/dist/templates/gemini/commands/trellis/finish-work.toml +133 -0
- package/dist/templates/gemini/commands/trellis/integrate-skill.toml +104 -0
- package/dist/templates/gemini/commands/trellis/onboard.toml +111 -0
- package/dist/templates/gemini/commands/trellis/record-session.toml +66 -0
- package/dist/templates/gemini/commands/trellis/start.toml +292 -0
- package/dist/templates/gemini/commands/trellis/update-spec.toml +132 -0
- package/dist/templates/gemini/index.d.ts +21 -0
- package/dist/templates/gemini/index.d.ts.map +1 -0
- package/dist/templates/gemini/index.js +44 -0
- package/dist/templates/gemini/index.js.map +1 -0
- package/dist/templates/iflow/agents/check.md +122 -0
- package/dist/templates/iflow/agents/debug.md +106 -0
- package/dist/templates/iflow/agents/dispatch.md +214 -0
- package/dist/templates/iflow/agents/implement.md +96 -0
- package/dist/templates/iflow/agents/plan.md +396 -0
- package/dist/templates/iflow/agents/research.md +120 -0
- package/dist/templates/iflow/commands/trellis/before-backend-dev.md +13 -0
- package/dist/templates/iflow/commands/trellis/before-frontend-dev.md +13 -0
- package/dist/templates/iflow/commands/trellis/brainstorm.md +474 -0
- package/dist/templates/iflow/commands/trellis/break-loop.md +125 -0
- package/dist/templates/iflow/commands/trellis/check-backend.md +13 -0
- package/dist/templates/iflow/commands/trellis/check-cross-layer.md +153 -0
- package/dist/templates/iflow/commands/trellis/check-frontend.md +13 -0
- package/dist/templates/iflow/commands/trellis/create-command.md +152 -0
- package/dist/templates/iflow/commands/trellis/finish-work.md +153 -0
- package/dist/templates/iflow/commands/trellis/integrate-skill.md +219 -0
- package/dist/templates/iflow/commands/trellis/onboard.md +358 -0
- package/dist/templates/iflow/commands/trellis/parallel.md +193 -0
- package/dist/templates/iflow/commands/trellis/record-session.md +62 -0
- package/dist/templates/iflow/commands/trellis/start.md +373 -0
- package/dist/templates/iflow/commands/trellis/update-spec.md +354 -0
- package/dist/templates/iflow/hooks/inject-subagent-context.py +788 -0
- package/dist/templates/iflow/hooks/ralph-loop.py +388 -0
- package/dist/templates/iflow/hooks/session-start.py +143 -0
- package/dist/templates/iflow/index.d.ts +54 -0
- package/dist/templates/iflow/index.d.ts.map +1 -0
- package/dist/templates/iflow/index.js +85 -0
- package/dist/templates/iflow/index.js.map +1 -0
- package/dist/templates/iflow/settings.json +40 -0
- package/dist/templates/kilo/commands/trellis/before-backend-dev.md +13 -0
- package/dist/templates/kilo/commands/trellis/before-frontend-dev.md +13 -0
- package/dist/templates/kilo/commands/trellis/brainstorm.md +474 -0
- package/dist/templates/kilo/commands/trellis/break-loop.md +125 -0
- package/dist/templates/kilo/commands/trellis/check-backend.md +13 -0
- package/dist/templates/kilo/commands/trellis/check-cross-layer.md +153 -0
- package/dist/templates/kilo/commands/trellis/check-frontend.md +13 -0
- package/dist/templates/kilo/commands/trellis/create-command.md +152 -0
- package/dist/templates/kilo/commands/trellis/finish-work.md +129 -0
- package/dist/templates/kilo/commands/trellis/integrate-skill.md +219 -0
- package/dist/templates/kilo/commands/trellis/onboard.md +358 -0
- package/dist/templates/kilo/commands/trellis/parallel.md +194 -0
- package/dist/templates/kilo/commands/trellis/record-session.md +62 -0
- package/dist/templates/kilo/commands/trellis/start.md +321 -0
- package/dist/templates/kilo/commands/trellis/update-spec.md +285 -0
- package/dist/templates/kilo/index.d.ts +16 -0
- package/dist/templates/kilo/index.d.ts.map +1 -0
- package/dist/templates/kilo/index.js +39 -0
- package/dist/templates/kilo/index.js.map +1 -0
- package/dist/templates/kiro/index.d.ts +18 -0
- package/dist/templates/kiro/index.d.ts.map +1 -0
- package/dist/templates/kiro/index.js +40 -0
- package/dist/templates/kiro/index.js.map +1 -0
- package/dist/templates/kiro/skills/before-backend-dev/SKILL.md +18 -0
- package/dist/templates/kiro/skills/before-frontend-dev/SKILL.md +18 -0
- package/dist/templates/kiro/skills/brainstorm/SKILL.md +479 -0
- package/dist/templates/kiro/skills/break-loop/SKILL.md +130 -0
- package/dist/templates/kiro/skills/check-backend/SKILL.md +18 -0
- package/dist/templates/kiro/skills/check-cross-layer/SKILL.md +158 -0
- package/dist/templates/kiro/skills/check-frontend/SKILL.md +18 -0
- package/dist/templates/kiro/skills/create-command/SKILL.md +101 -0
- package/dist/templates/kiro/skills/finish-work/SKILL.md +148 -0
- package/dist/templates/kiro/skills/integrate-skill/SKILL.md +221 -0
- package/dist/templates/kiro/skills/onboard/SKILL.md +363 -0
- package/dist/templates/kiro/skills/record-session/SKILL.md +67 -0
- package/dist/templates/kiro/skills/start/SKILL.md +330 -0
- package/dist/templates/kiro/skills/update-spec/SKILL.md +335 -0
- package/dist/templates/markdown/agents.md +18 -0
- package/dist/templates/markdown/gitignore.txt +12 -0
- package/dist/templates/markdown/index.d.ts +27 -0
- package/dist/templates/markdown/index.d.ts.map +1 -0
- package/dist/templates/markdown/index.js +52 -0
- package/dist/templates/markdown/index.js.map +1 -0
- package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/index.md +40 -0
- package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
- package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/script-conventions.md +467 -0
- package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
- package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
- package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md +118 -0
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +92 -0
- package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +94 -0
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md +394 -0
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +319 -0
- package/dist/templates/markdown/spec/guides/index.md.txt +79 -0
- package/dist/templates/markdown/workspace-index.md +123 -0
- package/dist/templates/markdown/worktree.yaml.txt +58 -0
- package/dist/templates/opencode/agents/check.md +146 -0
- package/dist/templates/opencode/agents/debug.md +129 -0
- package/dist/templates/opencode/agents/dispatch.md +223 -0
- package/dist/templates/opencode/agents/implement.md +120 -0
- package/dist/templates/opencode/agents/research.md +147 -0
- package/dist/templates/opencode/agents/trellis-plan.md +427 -0
- package/dist/templates/opencode/commands/trellis/before-backend-dev.md +13 -0
- package/dist/templates/opencode/commands/trellis/before-frontend-dev.md +13 -0
- package/dist/templates/opencode/commands/trellis/brainstorm.md +474 -0
- package/dist/templates/opencode/commands/trellis/break-loop.md +125 -0
- package/dist/templates/opencode/commands/trellis/check-backend.md +13 -0
- package/dist/templates/opencode/commands/trellis/check-cross-layer.md +153 -0
- package/dist/templates/opencode/commands/trellis/check-frontend.md +13 -0
- package/dist/templates/opencode/commands/trellis/create-command.md +154 -0
- package/dist/templates/opencode/commands/trellis/finish-work.md +144 -0
- package/dist/templates/opencode/commands/trellis/integrate-skill.md +219 -0
- package/dist/templates/opencode/commands/trellis/migrate-specs.md +0 -0
- package/dist/templates/opencode/commands/trellis/onboard.md +358 -0
- package/dist/templates/opencode/commands/trellis/parallel.md +194 -0
- package/dist/templates/opencode/commands/trellis/record-session.md +62 -0
- package/dist/templates/opencode/commands/trellis/start.md +338 -0
- package/dist/templates/opencode/commands/trellis/update-spec.md +354 -0
- package/dist/templates/opencode/lib/trellis-context.js +436 -0
- package/dist/templates/opencode/package.json +5 -0
- package/dist/templates/opencode/plugin/inject-subagent-context.js +538 -0
- package/dist/templates/opencode/plugin/session-start.js +192 -0
- package/dist/templates/trellis/VERSION +1 -0
- package/dist/templates/trellis/deliverables/README.md +51 -0
- package/dist/templates/trellis/gitignore.txt +29 -0
- package/dist/templates/trellis/index.d.ts +49 -0
- package/dist/templates/trellis/index.d.ts.map +1 -0
- package/dist/templates/trellis/index.js +92 -0
- package/dist/templates/trellis/index.js.map +1 -0
- package/dist/templates/trellis/paths.README.md +277 -0
- package/dist/templates/trellis/paths.yaml +41 -0
- package/dist/templates/trellis/pool/implementations.json +5 -0
- package/dist/templates/trellis/pool/prototypes.json +5 -0
- package/dist/templates/trellis/pool/requirements.json +5 -0
- package/dist/templates/trellis/scripts/__init__.py +5 -0
- package/dist/templates/trellis/scripts/add_session.py +391 -0
- package/dist/templates/trellis/scripts/common/__init__.py +80 -0
- package/dist/templates/trellis/scripts/common/cli_adapter.py +522 -0
- package/dist/templates/trellis/scripts/common/developer.py +189 -0
- package/dist/templates/trellis/scripts/common/git_context.py +383 -0
- package/dist/templates/trellis/scripts/common/paths.py +346 -0
- package/dist/templates/trellis/scripts/common/phase.py +253 -0
- package/dist/templates/trellis/scripts/common/project_paths.py +189 -0
- package/dist/templates/trellis/scripts/common/registry.py +365 -0
- package/dist/templates/trellis/scripts/common/task_queue.py +255 -0
- package/dist/templates/trellis/scripts/common/task_utils.py +177 -0
- package/dist/templates/trellis/scripts/common/worktree.py +218 -0
- package/dist/templates/trellis/scripts/create_bootstrap.py +290 -0
- package/dist/templates/trellis/scripts/get_context.py +16 -0
- package/dist/templates/trellis/scripts/get_developer.py +26 -0
- package/dist/templates/trellis/scripts/handoff_generator.py +380 -0
- package/dist/templates/trellis/scripts/init_developer.py +51 -0
- package/dist/templates/trellis/scripts/multi_agent/__init__.py +5 -0
- package/dist/templates/trellis/scripts/multi_agent/cleanup.py +403 -0
- package/dist/templates/trellis/scripts/multi_agent/create_pr.py +329 -0
- package/dist/templates/trellis/scripts/multi_agent/plan.py +233 -0
- package/dist/templates/trellis/scripts/multi_agent/start.py +461 -0
- package/dist/templates/trellis/scripts/multi_agent/status.py +817 -0
- package/dist/templates/trellis/scripts/pool.py +373 -0
- package/dist/templates/trellis/scripts/task.py +1162 -0
- package/dist/templates/trellis/scripts-shell-archive/add-session.sh +384 -0
- package/dist/templates/trellis/scripts-shell-archive/common/developer.sh +129 -0
- package/dist/templates/trellis/scripts-shell-archive/common/git-context.sh +263 -0
- package/dist/templates/trellis/scripts-shell-archive/common/paths.sh +208 -0
- package/dist/templates/trellis/scripts-shell-archive/common/phase.sh +150 -0
- package/dist/templates/trellis/scripts-shell-archive/common/registry.sh +247 -0
- package/dist/templates/trellis/scripts-shell-archive/common/task-queue.sh +142 -0
- package/dist/templates/trellis/scripts-shell-archive/common/task-utils.sh +151 -0
- package/dist/templates/trellis/scripts-shell-archive/common/worktree.sh +128 -0
- package/dist/templates/trellis/scripts-shell-archive/create-bootstrap.sh +299 -0
- package/dist/templates/trellis/scripts-shell-archive/get-context.sh +7 -0
- package/dist/templates/trellis/scripts-shell-archive/get-developer.sh +15 -0
- package/dist/templates/trellis/scripts-shell-archive/init-developer.sh +34 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/cleanup.sh +396 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/create-pr.sh +241 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/plan.sh +207 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/start.sh +317 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/status.sh +828 -0
- package/dist/templates/trellis/scripts-shell-archive/task.sh +1204 -0
- package/dist/templates/trellis/spec/roles/designer/index.md +243 -0
- package/dist/templates/trellis/spec/roles/designer/mock-data-standards.md +481 -0
- package/dist/templates/trellis/spec/roles/designer/prototype-guidelines.md +429 -0
- package/dist/templates/trellis/spec/roles/frontend-impl/api-integration.md +565 -0
- package/dist/templates/trellis/spec/roles/frontend-impl/index.md +321 -0
- package/dist/templates/trellis/spec/roles/frontend-impl/state-management.md +599 -0
- package/dist/templates/trellis/spec/roles/pm/index.md +112 -0
- package/dist/templates/trellis/spec/roles/pm/prd-template.md +124 -0
- package/dist/templates/trellis/tasks/.gitkeep +0 -0
- package/dist/templates/trellis/workflow.md +416 -0
- package/dist/templates/trellis/worktree.yaml +47 -0
- package/dist/types/ai-tools.d.ts +56 -0
- package/dist/types/ai-tools.d.ts.map +1 -0
- package/dist/types/ai-tools.js +103 -0
- package/dist/types/ai-tools.js.map +1 -0
- package/dist/types/migration.d.ts +86 -0
- package/dist/types/migration.d.ts.map +1 -0
- package/dist/types/migration.js +8 -0
- package/dist/types/migration.js.map +1 -0
- package/dist/utils/compare-versions.d.ts +12 -0
- package/dist/utils/compare-versions.d.ts.map +1 -0
- package/dist/utils/compare-versions.js +76 -0
- package/dist/utils/compare-versions.js.map +1 -0
- package/dist/utils/file-writer.d.ts +23 -0
- package/dist/utils/file-writer.d.ts.map +1 -0
- package/dist/utils/file-writer.js +140 -0
- package/dist/utils/file-writer.js.map +1 -0
- package/dist/utils/project-detector.d.ts +16 -0
- package/dist/utils/project-detector.d.ts.map +1 -0
- package/dist/utils/project-detector.js +186 -0
- package/dist/utils/project-detector.js.map +1 -0
- package/dist/utils/template-fetcher.d.ts +51 -0
- package/dist/utils/template-fetcher.d.ts.map +1 -0
- package/dist/utils/template-fetcher.js +174 -0
- package/dist/utils/template-fetcher.js.map +1 -0
- package/dist/utils/template-hash.d.ts +78 -0
- package/dist/utils/template-hash.d.ts.map +1 -0
- package/dist/utils/template-hash.js +233 -0
- package/dist/utils/template-hash.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trellis Context Injection Plugin
|
|
3
|
+
*
|
|
4
|
+
* Injects context when Task tool is called with supported subagent types.
|
|
5
|
+
* Uses OpenCode's tool.execute.before hook.
|
|
6
|
+
*
|
|
7
|
+
* Compatibility:
|
|
8
|
+
* - If oh-my-opencode handles via .claude/hooks/, this plugin skips
|
|
9
|
+
* - Otherwise, this plugin handles injection
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { existsSync, writeFileSync } from "fs"
|
|
13
|
+
import { join } from "path"
|
|
14
|
+
import { TrellisContext, debugLog } from "../lib/trellis-context.js"
|
|
15
|
+
|
|
16
|
+
// Supported subagent types
|
|
17
|
+
const AGENTS_ALL = ["implement", "check", "debug", "research"]
|
|
18
|
+
const AGENTS_REQUIRE_TASK = ["implement", "check", "debug"]
|
|
19
|
+
// Agents that don't update phase (can be called at any time)
|
|
20
|
+
const AGENTS_NO_PHASE_UPDATE = ["debug", "research"]
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Update current_phase in task.json based on subagent_type
|
|
24
|
+
*/
|
|
25
|
+
function updateCurrentPhase(ctx, taskDir, subagentType) {
|
|
26
|
+
if (AGENTS_NO_PHASE_UPDATE.includes(subagentType)) {
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const taskJsonPath = join(ctx.directory, taskDir, "task.json")
|
|
31
|
+
const content = ctx.readFile(taskJsonPath)
|
|
32
|
+
if (!content) return
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
const taskData = JSON.parse(content)
|
|
36
|
+
const currentPhase = taskData.current_phase || 0
|
|
37
|
+
const nextActions = taskData.next_action || []
|
|
38
|
+
|
|
39
|
+
// Map action names to subagent types
|
|
40
|
+
const actionToAgent = {
|
|
41
|
+
"implement": "implement",
|
|
42
|
+
"check": "check",
|
|
43
|
+
"finish": "check" // finish uses check agent
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Find the next phase that matches this subagent_type
|
|
47
|
+
let newPhase = null
|
|
48
|
+
for (const action of nextActions) {
|
|
49
|
+
const phaseNum = action.phase || 0
|
|
50
|
+
const actionName = action.action || ""
|
|
51
|
+
const expectedAgent = actionToAgent[actionName]
|
|
52
|
+
|
|
53
|
+
// Only consider phases after current_phase
|
|
54
|
+
if (phaseNum > currentPhase && expectedAgent === subagentType) {
|
|
55
|
+
newPhase = phaseNum
|
|
56
|
+
break
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (newPhase !== null) {
|
|
61
|
+
taskData.current_phase = newPhase
|
|
62
|
+
writeFileSync(taskJsonPath, JSON.stringify(taskData, null, 2))
|
|
63
|
+
debugLog("inject", "Updated current_phase to:", newPhase)
|
|
64
|
+
}
|
|
65
|
+
} catch (e) {
|
|
66
|
+
debugLog("inject", "Error updating phase:", e.message)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Get context for implement agent
|
|
72
|
+
*/
|
|
73
|
+
function getImplementContext(ctx, taskDir) {
|
|
74
|
+
const parts = []
|
|
75
|
+
|
|
76
|
+
// 1. Read implement.jsonl (or fallback to spec.jsonl)
|
|
77
|
+
let jsonlPath = join(ctx.directory, taskDir, "implement.jsonl")
|
|
78
|
+
let entries = ctx.readJsonlWithFiles(jsonlPath)
|
|
79
|
+
|
|
80
|
+
if (entries.length === 0) {
|
|
81
|
+
// Fallback to spec.jsonl
|
|
82
|
+
jsonlPath = join(ctx.directory, taskDir, "spec.jsonl")
|
|
83
|
+
entries = ctx.readJsonlWithFiles(jsonlPath)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (entries.length > 0) {
|
|
87
|
+
parts.push(ctx.buildContextFromEntries(entries))
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// 2. Requirements document
|
|
91
|
+
const prd = ctx.readProjectFile(join(taskDir, "prd.md"))
|
|
92
|
+
if (prd) {
|
|
93
|
+
parts.push(`=== ${taskDir}/prd.md (Requirements) ===\n${prd}`)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// 3. Technical design
|
|
97
|
+
const info = ctx.readProjectFile(join(taskDir, "info.md"))
|
|
98
|
+
if (info) {
|
|
99
|
+
parts.push(`=== ${taskDir}/info.md (Technical Design) ===\n${info}`)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return parts.join("\n\n")
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Get context for check agent
|
|
107
|
+
*/
|
|
108
|
+
function getCheckContext(ctx, taskDir) {
|
|
109
|
+
const parts = []
|
|
110
|
+
|
|
111
|
+
// 1. Read check.jsonl
|
|
112
|
+
const jsonlPath = join(ctx.directory, taskDir, "check.jsonl")
|
|
113
|
+
const entries = ctx.readJsonlWithFiles(jsonlPath)
|
|
114
|
+
|
|
115
|
+
if (entries.length > 0) {
|
|
116
|
+
parts.push(ctx.buildContextFromEntries(entries))
|
|
117
|
+
} else {
|
|
118
|
+
// Fallback: hardcoded check files + spec.jsonl
|
|
119
|
+
const checkFiles = [
|
|
120
|
+
[".opencode/commands/trellis/finish-work.md", "Finish work checklist"],
|
|
121
|
+
[".opencode/commands/trellis/check-cross-layer.md", "Cross-layer check spec"],
|
|
122
|
+
[".opencode/commands/trellis/check-backend.md", "Backend check spec"],
|
|
123
|
+
[".opencode/commands/trellis/check-frontend.md", "Frontend check spec"],
|
|
124
|
+
]
|
|
125
|
+
for (const [f, description] of checkFiles) {
|
|
126
|
+
const content = ctx.readProjectFile(f)
|
|
127
|
+
if (content) {
|
|
128
|
+
parts.push(`=== ${f} (${description}) ===\n${content}`)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Add spec.jsonl
|
|
133
|
+
const specJsonlPath = join(ctx.directory, taskDir, "spec.jsonl")
|
|
134
|
+
const specEntries = ctx.readJsonlWithFiles(specJsonlPath)
|
|
135
|
+
for (const entry of specEntries) {
|
|
136
|
+
parts.push(`=== ${entry.path} (Dev spec) ===\n${entry.content}`)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// 2. Requirements document
|
|
141
|
+
const prd = ctx.readProjectFile(join(taskDir, "prd.md"))
|
|
142
|
+
if (prd) {
|
|
143
|
+
parts.push(`=== ${taskDir}/prd.md (Requirements - for understanding intent) ===\n${prd}`)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return parts.join("\n\n")
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Get context for finish phase (final check before PR)
|
|
151
|
+
*/
|
|
152
|
+
function getFinishContext(ctx, taskDir) {
|
|
153
|
+
const parts = []
|
|
154
|
+
|
|
155
|
+
// 1. Try finish.jsonl first
|
|
156
|
+
const jsonlPath = join(ctx.directory, taskDir, "finish.jsonl")
|
|
157
|
+
const entries = ctx.readJsonlWithFiles(jsonlPath)
|
|
158
|
+
|
|
159
|
+
if (entries.length > 0) {
|
|
160
|
+
parts.push(ctx.buildContextFromEntries(entries))
|
|
161
|
+
} else {
|
|
162
|
+
// Fallback: only finish-work.md (lightweight)
|
|
163
|
+
const finishWork = ctx.readProjectFile(".opencode/commands/trellis/finish-work.md")
|
|
164
|
+
if (finishWork) {
|
|
165
|
+
parts.push(`=== .opencode/commands/trellis/finish-work.md (Finish checklist) ===\n${finishWork}`)
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// 2. Spec update process (for active spec sync)
|
|
170
|
+
const updateSpec = ctx.readProjectFile(".opencode/commands/trellis/update-spec.md")
|
|
171
|
+
if (updateSpec) {
|
|
172
|
+
parts.push(`=== .opencode/commands/trellis/update-spec.md (Spec update process) ===\n${updateSpec}`)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// 3. Requirements document (for verifying requirements are met)
|
|
176
|
+
const prd = ctx.readProjectFile(join(taskDir, "prd.md"))
|
|
177
|
+
if (prd) {
|
|
178
|
+
parts.push(`=== ${taskDir}/prd.md (Requirements - verify all met) ===\n${prd}`)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return parts.join("\n\n")
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Get context for debug agent
|
|
186
|
+
*/
|
|
187
|
+
function getDebugContext(ctx, taskDir) {
|
|
188
|
+
const parts = []
|
|
189
|
+
|
|
190
|
+
// 1. Read debug.jsonl (or fallback to spec.jsonl + check files)
|
|
191
|
+
const jsonlPath = join(ctx.directory, taskDir, "debug.jsonl")
|
|
192
|
+
const entries = ctx.readJsonlWithFiles(jsonlPath)
|
|
193
|
+
|
|
194
|
+
if (entries.length > 0) {
|
|
195
|
+
parts.push(ctx.buildContextFromEntries(entries))
|
|
196
|
+
} else {
|
|
197
|
+
// Fallback: use spec.jsonl + hardcoded check files
|
|
198
|
+
const specJsonlPath = join(ctx.directory, taskDir, "spec.jsonl")
|
|
199
|
+
const specEntries = ctx.readJsonlWithFiles(specJsonlPath)
|
|
200
|
+
for (const entry of specEntries) {
|
|
201
|
+
parts.push(`=== ${entry.path} (Dev spec) ===\n${entry.content}`)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const checkFiles = [
|
|
205
|
+
[".opencode/commands/trellis/check-backend.md", "Backend check spec"],
|
|
206
|
+
[".opencode/commands/trellis/check-frontend.md", "Frontend check spec"],
|
|
207
|
+
[".opencode/commands/trellis/check-cross-layer.md", "Cross-layer check spec"],
|
|
208
|
+
]
|
|
209
|
+
for (const [f, description] of checkFiles) {
|
|
210
|
+
const content = ctx.readProjectFile(f)
|
|
211
|
+
if (content) {
|
|
212
|
+
parts.push(`=== ${f} (${description}) ===\n${content}`)
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// 2. Codex review output (if exists)
|
|
218
|
+
const codex = ctx.readProjectFile(join(taskDir, "codex-review-output.txt"))
|
|
219
|
+
if (codex) {
|
|
220
|
+
parts.push(`=== ${taskDir}/codex-review-output.txt (Codex Review Results) ===\n${codex}`)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return parts.join("\n\n")
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Get context for research agent
|
|
228
|
+
*/
|
|
229
|
+
function getResearchContext(ctx, taskDir) {
|
|
230
|
+
const parts = []
|
|
231
|
+
|
|
232
|
+
parts.push(`## Project Spec Directory Structure
|
|
233
|
+
|
|
234
|
+
\`\`\`
|
|
235
|
+
.trellis/spec/
|
|
236
|
+
├── shared/ # Cross-project common specs
|
|
237
|
+
├── frontend/ # Frontend standards
|
|
238
|
+
├── backend/ # Backend standards
|
|
239
|
+
└── guides/ # Thinking guides
|
|
240
|
+
|
|
241
|
+
.trellis/big-question/ # Known issues and pitfalls
|
|
242
|
+
\`\`\`
|
|
243
|
+
|
|
244
|
+
## Search Tips
|
|
245
|
+
|
|
246
|
+
- Spec files: \`.trellis/spec/**/*.md\`
|
|
247
|
+
- Known issues: \`.trellis/big-question/\`
|
|
248
|
+
- Code search: Use Glob and Grep tools
|
|
249
|
+
- Tech solutions: Use mcp__exa__web_search_exa or mcp__exa__get_code_context_exa`)
|
|
250
|
+
|
|
251
|
+
if (taskDir) {
|
|
252
|
+
const jsonlPath = join(ctx.directory, taskDir, "research.jsonl")
|
|
253
|
+
const entries = ctx.readJsonlWithFiles(jsonlPath)
|
|
254
|
+
if (entries.length > 0) {
|
|
255
|
+
parts.push("\n## Additional Search Context\n")
|
|
256
|
+
parts.push(ctx.buildContextFromEntries(entries))
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return parts.join("\n\n")
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Build enhanced prompt with context
|
|
265
|
+
*/
|
|
266
|
+
function buildPrompt(agentType, originalPrompt, context, isFinish = false) {
|
|
267
|
+
const templates = {
|
|
268
|
+
implement: `# Implement Agent Task
|
|
269
|
+
|
|
270
|
+
You are the Implement Agent in the Multi-Agent Pipeline.
|
|
271
|
+
|
|
272
|
+
## Your Context
|
|
273
|
+
|
|
274
|
+
${context}
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Your Task
|
|
279
|
+
|
|
280
|
+
${originalPrompt}
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Workflow
|
|
285
|
+
|
|
286
|
+
1. **Understand specs** - All dev specs are injected above
|
|
287
|
+
2. **Understand requirements** - Read requirements and technical design
|
|
288
|
+
3. **Implement feature** - Follow specs and design
|
|
289
|
+
4. **Self-check** - Ensure code quality
|
|
290
|
+
|
|
291
|
+
## Important Constraints
|
|
292
|
+
|
|
293
|
+
- Do NOT execute git commit
|
|
294
|
+
- Follow all dev specs injected above
|
|
295
|
+
- Report list of modified/created files when done`,
|
|
296
|
+
|
|
297
|
+
check: isFinish ? `# Finish Agent Task
|
|
298
|
+
|
|
299
|
+
You are performing the final check before creating a PR.
|
|
300
|
+
|
|
301
|
+
## Your Context
|
|
302
|
+
|
|
303
|
+
${context}
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Your Task
|
|
308
|
+
|
|
309
|
+
${originalPrompt}
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Workflow
|
|
314
|
+
|
|
315
|
+
1. **Review changes** - Run \`git diff --name-only\` to see all changed files
|
|
316
|
+
2. **Verify requirements** - Check each requirement in prd.md is implemented
|
|
317
|
+
3. **Spec sync** - Analyze whether changes introduce new patterns, contracts, or conventions
|
|
318
|
+
- If new pattern/convention found: read target spec file → update it → update index.md if needed
|
|
319
|
+
- If infra/cross-layer change: follow the 7-section mandatory template from update-spec.md
|
|
320
|
+
- If pure code fix with no new patterns: skip this step
|
|
321
|
+
4. **Run final checks** - Execute lint and typecheck
|
|
322
|
+
5. **Confirm ready** - Ensure code is ready for PR
|
|
323
|
+
|
|
324
|
+
## Important Constraints
|
|
325
|
+
|
|
326
|
+
- You MAY update spec files when gaps are detected (use update-spec.md as guide)
|
|
327
|
+
- MUST read the target spec file BEFORE editing (avoid duplicating existing content)
|
|
328
|
+
- Do NOT update specs for trivial changes (typos, formatting, obvious fixes)
|
|
329
|
+
- If critical CODE issues found, report them clearly (fix specs, not code)
|
|
330
|
+
- Verify all acceptance criteria in prd.md are met` :
|
|
331
|
+
`# Check Agent Task
|
|
332
|
+
|
|
333
|
+
You are the Check Agent in the Multi-Agent Pipeline.
|
|
334
|
+
|
|
335
|
+
## Your Context
|
|
336
|
+
|
|
337
|
+
${context}
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## Your Task
|
|
342
|
+
|
|
343
|
+
${originalPrompt}
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Workflow
|
|
348
|
+
|
|
349
|
+
1. **Get changes** - Run \`git diff --name-only\` and \`git diff\`
|
|
350
|
+
2. **Check against specs** - Check item by item
|
|
351
|
+
3. **Self-fix** - Fix issues directly, don't just report
|
|
352
|
+
4. **Run verification** - Run lint and typecheck
|
|
353
|
+
|
|
354
|
+
## Important Constraints
|
|
355
|
+
|
|
356
|
+
- Fix issues yourself, don't just report
|
|
357
|
+
- Must execute complete checklist`,
|
|
358
|
+
|
|
359
|
+
debug: `# Debug Agent Task
|
|
360
|
+
|
|
361
|
+
You are the Debug Agent in the Multi-Agent Pipeline.
|
|
362
|
+
|
|
363
|
+
## Your Context
|
|
364
|
+
|
|
365
|
+
${context}
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## Your Task
|
|
370
|
+
|
|
371
|
+
${originalPrompt}
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## Workflow
|
|
376
|
+
|
|
377
|
+
1. **Understand issues** - Analyze issues pointed out
|
|
378
|
+
2. **Locate code** - Find positions that need fixing
|
|
379
|
+
3. **Fix against specs** - Fix following dev specs
|
|
380
|
+
4. **Verify fixes** - Run typecheck
|
|
381
|
+
|
|
382
|
+
## Important Constraints
|
|
383
|
+
|
|
384
|
+
- Do NOT execute git commit
|
|
385
|
+
- Run typecheck after each fix`,
|
|
386
|
+
|
|
387
|
+
research: `# Research Agent Task
|
|
388
|
+
|
|
389
|
+
You are the Research Agent in the Multi-Agent Pipeline.
|
|
390
|
+
|
|
391
|
+
## Core Principle
|
|
392
|
+
|
|
393
|
+
**You do one thing: find and explain information.**
|
|
394
|
+
|
|
395
|
+
## Project Info
|
|
396
|
+
|
|
397
|
+
${context}
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
## Your Task
|
|
402
|
+
|
|
403
|
+
${originalPrompt}
|
|
404
|
+
|
|
405
|
+
---
|
|
406
|
+
|
|
407
|
+
## Workflow
|
|
408
|
+
|
|
409
|
+
1. **Understand query** - Determine search type and scope
|
|
410
|
+
2. **Plan search** - List search steps
|
|
411
|
+
3. **Execute search** - Run multiple searches in parallel
|
|
412
|
+
4. **Organize results** - Output structured report
|
|
413
|
+
|
|
414
|
+
## Strict Boundaries
|
|
415
|
+
|
|
416
|
+
**Only allowed**: Describe what exists, where it is, how it works
|
|
417
|
+
|
|
418
|
+
**Forbidden**: Suggest improvements, criticize implementation, modify files`
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
return templates[agentType] || originalPrompt
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
export default async ({ directory }) => {
|
|
425
|
+
const ctx = new TrellisContext(directory)
|
|
426
|
+
debugLog("inject", "Plugin loaded, directory:", directory)
|
|
427
|
+
|
|
428
|
+
return {
|
|
429
|
+
// ==========================================================================
|
|
430
|
+
// ⚠️ KNOWN LIMITATION: OpenCode project-level plugins cannot intercept subagents
|
|
431
|
+
//
|
|
432
|
+
// This hook will NOT be triggered because:
|
|
433
|
+
// 1. Project-level plugins (.opencode/plugin/) don't support tool.execute.before
|
|
434
|
+
// 2. Only global plugins (npm packages) have full hook permissions
|
|
435
|
+
// 3. This is a known OpenCode architecture limitation (see Issue #5894)
|
|
436
|
+
//
|
|
437
|
+
// SOLUTION: Trellis + OpenCode users must install oh-my-opencode (omo)
|
|
438
|
+
// - omo is a global plugin with full hook permissions
|
|
439
|
+
// - omo reads .claude/settings.json and executes Python hooks
|
|
440
|
+
// - .claude/hooks/inject-subagent-context.py handles the actual injection
|
|
441
|
+
//
|
|
442
|
+
// References:
|
|
443
|
+
// - https://github.com/sst/opencode/issues/5894 (plugin hooks don't intercept subagent)
|
|
444
|
+
// - https://github.com/sst/opencode/issues/2588 (subagent inherit context)
|
|
445
|
+
// ==========================================================================
|
|
446
|
+
"tool.execute.before": async (input, output) => {
|
|
447
|
+
try {
|
|
448
|
+
debugLog("inject", "tool.execute.before called, tool:", input?.tool)
|
|
449
|
+
|
|
450
|
+
// Only handle Task tool
|
|
451
|
+
const toolName = input?.tool?.toLowerCase()
|
|
452
|
+
if (toolName !== "task") {
|
|
453
|
+
return
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
const args = output?.args || {}
|
|
457
|
+
const subagentType = args.subagent_type
|
|
458
|
+
const originalPrompt = args.prompt || ""
|
|
459
|
+
|
|
460
|
+
debugLog("inject", "Task tool called, subagent_type:", subagentType)
|
|
461
|
+
|
|
462
|
+
// Only handle supported agent types
|
|
463
|
+
if (!AGENTS_ALL.includes(subagentType)) {
|
|
464
|
+
debugLog("inject", "Skipping - unsupported subagent_type")
|
|
465
|
+
return
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// Check if we should skip (omo will handle)
|
|
469
|
+
if (ctx.shouldSkipHook("inject-subagent-context")) {
|
|
470
|
+
debugLog("inject", "Skipping - omo will handle via .claude/hooks/")
|
|
471
|
+
return
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// Read current task
|
|
475
|
+
const taskDir = ctx.getCurrentTask()
|
|
476
|
+
|
|
477
|
+
// Agents requiring task directory
|
|
478
|
+
if (AGENTS_REQUIRE_TASK.includes(subagentType)) {
|
|
479
|
+
if (!taskDir) {
|
|
480
|
+
debugLog("inject", "Skipping - no current task")
|
|
481
|
+
return
|
|
482
|
+
}
|
|
483
|
+
const taskDirFull = join(directory, taskDir)
|
|
484
|
+
if (!existsSync(taskDirFull)) {
|
|
485
|
+
debugLog("inject", "Skipping - task directory not found")
|
|
486
|
+
return
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// Update current_phase in task.json
|
|
490
|
+
updateCurrentPhase(ctx, taskDir, subagentType)
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// Check for [finish] marker
|
|
494
|
+
const isFinish = originalPrompt.toLowerCase().includes("[finish]")
|
|
495
|
+
|
|
496
|
+
// Get context based on agent type
|
|
497
|
+
let context = ""
|
|
498
|
+
switch (subagentType) {
|
|
499
|
+
case "implement":
|
|
500
|
+
context = getImplementContext(ctx, taskDir)
|
|
501
|
+
break
|
|
502
|
+
case "check":
|
|
503
|
+
// Use finish context for [finish] phase (lighter, focused on final verification)
|
|
504
|
+
// Use check context for regular check (full specs for self-fix loop)
|
|
505
|
+
context = isFinish
|
|
506
|
+
? getFinishContext(ctx, taskDir)
|
|
507
|
+
: getCheckContext(ctx, taskDir)
|
|
508
|
+
break
|
|
509
|
+
case "debug":
|
|
510
|
+
context = getDebugContext(ctx, taskDir)
|
|
511
|
+
break
|
|
512
|
+
case "research":
|
|
513
|
+
context = getResearchContext(ctx, taskDir)
|
|
514
|
+
break
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
if (!context) {
|
|
518
|
+
debugLog("inject", "No context to inject")
|
|
519
|
+
return
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// Build enhanced prompt
|
|
523
|
+
const newPrompt = buildPrompt(subagentType, originalPrompt, context, isFinish)
|
|
524
|
+
|
|
525
|
+
// Update the tool input
|
|
526
|
+
output.args = {
|
|
527
|
+
...args,
|
|
528
|
+
prompt: newPrompt
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
debugLog("inject", "Injected context for", subagentType, "prompt length:", newPrompt.length)
|
|
532
|
+
|
|
533
|
+
} catch (error) {
|
|
534
|
+
debugLog("inject", "Error in tool.execute.before:", error.message, error.stack)
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|