trellis-herbivore 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +174 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/channel/adapters/claude.d.ts +38 -0
- package/dist/commands/channel/adapters/claude.d.ts.map +1 -0
- package/dist/commands/channel/adapters/claude.js +209 -0
- package/dist/commands/channel/adapters/claude.js.map +1 -0
- package/dist/commands/channel/adapters/codex.d.ts +77 -0
- package/dist/commands/channel/adapters/codex.d.ts.map +1 -0
- package/dist/commands/channel/adapters/codex.js +495 -0
- package/dist/commands/channel/adapters/codex.js.map +1 -0
- package/dist/commands/channel/adapters/index.d.ts +79 -0
- package/dist/commands/channel/adapters/index.d.ts.map +1 -0
- package/dist/commands/channel/adapters/index.js +109 -0
- package/dist/commands/channel/adapters/index.js.map +1 -0
- package/dist/commands/channel/adapters/types.d.ts +33 -0
- package/dist/commands/channel/adapters/types.d.ts.map +1 -0
- package/dist/commands/channel/adapters/types.js +2 -0
- package/dist/commands/channel/adapters/types.js.map +1 -0
- package/dist/commands/channel/agent-loader.d.ts +32 -0
- package/dist/commands/channel/agent-loader.d.ts.map +1 -0
- package/dist/commands/channel/agent-loader.js +154 -0
- package/dist/commands/channel/agent-loader.js.map +1 -0
- package/dist/commands/channel/context-loader.d.ts +26 -0
- package/dist/commands/channel/context-loader.d.ts.map +1 -0
- package/dist/commands/channel/context-loader.js +290 -0
- package/dist/commands/channel/context-loader.js.map +1 -0
- package/dist/commands/channel/context.d.ts +16 -0
- package/dist/commands/channel/context.d.ts.map +1 -0
- package/dist/commands/channel/context.js +83 -0
- package/dist/commands/channel/context.js.map +1 -0
- package/dist/commands/channel/create.d.ts +27 -0
- package/dist/commands/channel/create.d.ts.map +1 -0
- package/dist/commands/channel/create.js +39 -0
- package/dist/commands/channel/create.js.map +1 -0
- package/dist/commands/channel/dev-parse-trace.d.ts +14 -0
- package/dist/commands/channel/dev-parse-trace.d.ts.map +1 -0
- package/dist/commands/channel/dev-parse-trace.js +70 -0
- package/dist/commands/channel/dev-parse-trace.js.map +1 -0
- package/dist/commands/channel/index.d.ts +3 -0
- package/dist/commands/channel/index.d.ts.map +1 -0
- package/dist/commands/channel/index.js +496 -0
- package/dist/commands/channel/index.js.map +1 -0
- package/dist/commands/channel/kill.d.ts +7 -0
- package/dist/commands/channel/kill.d.ts.map +1 -0
- package/dist/commands/channel/kill.js +121 -0
- package/dist/commands/channel/kill.js.map +1 -0
- package/dist/commands/channel/list.d.ts +17 -0
- package/dist/commands/channel/list.d.ts.map +1 -0
- package/dist/commands/channel/list.js +233 -0
- package/dist/commands/channel/list.js.map +1 -0
- package/dist/commands/channel/messages.d.ts +16 -0
- package/dist/commands/channel/messages.d.ts.map +1 -0
- package/dist/commands/channel/messages.js +237 -0
- package/dist/commands/channel/messages.js.map +1 -0
- package/dist/commands/channel/rm.d.ts +27 -0
- package/dist/commands/channel/rm.d.ts.map +1 -0
- package/dist/commands/channel/rm.js +216 -0
- package/dist/commands/channel/rm.js.map +1 -0
- package/dist/commands/channel/run.d.ts +31 -0
- package/dist/commands/channel/run.d.ts.map +1 -0
- package/dist/commands/channel/run.js +137 -0
- package/dist/commands/channel/run.js.map +1 -0
- package/dist/commands/channel/send.d.ts +12 -0
- package/dist/commands/channel/send.d.ts.map +1 -0
- package/dist/commands/channel/send.js +24 -0
- package/dist/commands/channel/send.js.map +1 -0
- package/dist/commands/channel/spawn.d.ts +25 -0
- package/dist/commands/channel/spawn.d.ts.map +1 -0
- package/dist/commands/channel/spawn.js +192 -0
- package/dist/commands/channel/spawn.js.map +1 -0
- package/dist/commands/channel/store/events.d.ts +39 -0
- package/dist/commands/channel/store/events.d.ts.map +1 -0
- package/dist/commands/channel/store/events.js +87 -0
- package/dist/commands/channel/store/events.js.map +1 -0
- package/dist/commands/channel/store/filter.d.ts +3 -0
- package/dist/commands/channel/store/filter.d.ts.map +1 -0
- package/dist/commands/channel/store/filter.js +2 -0
- package/dist/commands/channel/store/filter.js.map +1 -0
- package/dist/commands/channel/store/lock.d.ts +23 -0
- package/dist/commands/channel/store/lock.d.ts.map +1 -0
- package/dist/commands/channel/store/lock.js +99 -0
- package/dist/commands/channel/store/lock.js.map +1 -0
- package/dist/commands/channel/store/paths.d.ts +63 -0
- package/dist/commands/channel/store/paths.d.ts.map +1 -0
- package/dist/commands/channel/store/paths.js +246 -0
- package/dist/commands/channel/store/paths.js.map +1 -0
- package/dist/commands/channel/store/schema.d.ts +27 -0
- package/dist/commands/channel/store/schema.d.ts.map +1 -0
- package/dist/commands/channel/store/schema.js +34 -0
- package/dist/commands/channel/store/schema.js.map +1 -0
- package/dist/commands/channel/store/thread-state.d.ts +5 -0
- package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
- package/dist/commands/channel/store/thread-state.js +16 -0
- package/dist/commands/channel/store/thread-state.js.map +1 -0
- package/dist/commands/channel/store/watch.d.ts +19 -0
- package/dist/commands/channel/store/watch.d.ts.map +1 -0
- package/dist/commands/channel/store/watch.js +130 -0
- package/dist/commands/channel/store/watch.js.map +1 -0
- package/dist/commands/channel/supervisor/inbox.d.ts +25 -0
- package/dist/commands/channel/supervisor/inbox.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/inbox.js +99 -0
- package/dist/commands/channel/supervisor/inbox.js.map +1 -0
- package/dist/commands/channel/supervisor/shutdown.d.ts +66 -0
- package/dist/commands/channel/supervisor/shutdown.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/shutdown.js +143 -0
- package/dist/commands/channel/supervisor/shutdown.js.map +1 -0
- package/dist/commands/channel/supervisor/stdout.d.ts +49 -0
- package/dist/commands/channel/supervisor/stdout.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/stdout.js +107 -0
- package/dist/commands/channel/supervisor/stdout.js.map +1 -0
- package/dist/commands/channel/supervisor.d.ts +47 -0
- package/dist/commands/channel/supervisor.d.ts.map +1 -0
- package/dist/commands/channel/supervisor.js +283 -0
- package/dist/commands/channel/supervisor.js.map +1 -0
- package/dist/commands/channel/text-body.d.ts +13 -0
- package/dist/commands/channel/text-body.d.ts.map +1 -0
- package/dist/commands/channel/text-body.js +47 -0
- package/dist/commands/channel/text-body.js.map +1 -0
- package/dist/commands/channel/threads.d.ts +39 -0
- package/dist/commands/channel/threads.d.ts.map +1 -0
- package/dist/commands/channel/threads.js +106 -0
- package/dist/commands/channel/threads.js.map +1 -0
- package/dist/commands/channel/title.d.ts +12 -0
- package/dist/commands/channel/title.d.ts.map +1 -0
- package/dist/commands/channel/title.js +24 -0
- package/dist/commands/channel/title.js.map +1 -0
- package/dist/commands/channel/wait.d.ts +18 -0
- package/dist/commands/channel/wait.d.ts.map +1 -0
- package/dist/commands/channel/wait.js +76 -0
- package/dist/commands/channel/wait.js.map +1 -0
- package/dist/commands/init.d.ts +57 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +1466 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mem.d.ts +234 -0
- package/dist/commands/mem.d.ts.map +1 -0
- package/dist/commands/mem.js +1869 -0
- package/dist/commands/mem.js.map +1 -0
- package/dist/commands/uninstall.d.ts +27 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +339 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +72 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +1926 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/upgrade.d.ts +28 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +84 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/configurators/antigravity.d.ts +7 -0
- package/dist/configurators/antigravity.d.ts.map +1 -0
- package/dist/configurators/antigravity.js +19 -0
- package/dist/configurators/antigravity.js.map +1 -0
- package/dist/configurators/claude.d.ts +9 -0
- package/dist/configurators/claude.d.ts.map +1 -0
- package/dist/configurators/claude.js +72 -0
- package/dist/configurators/claude.js.map +1 -0
- package/dist/configurators/codebuddy.d.ts +10 -0
- package/dist/configurators/codebuddy.d.ts.map +1 -0
- package/dist/configurators/codebuddy.js +30 -0
- package/dist/configurators/codebuddy.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 +87 -0
- package/dist/configurators/codex.js.map +1 -0
- package/dist/configurators/copilot.d.ts +10 -0
- package/dist/configurators/copilot.d.ts.map +1 -0
- package/dist/configurators/copilot.js +51 -0
- package/dist/configurators/copilot.js.map +1 -0
- package/dist/configurators/cursor.d.ts +10 -0
- package/dist/configurators/cursor.d.ts.map +1 -0
- package/dist/configurators/cursor.js +29 -0
- package/dist/configurators/cursor.js.map +1 -0
- package/dist/configurators/droid.d.ts +10 -0
- package/dist/configurators/droid.d.ts.map +1 -0
- package/dist/configurators/droid.js +30 -0
- package/dist/configurators/droid.js.map +1 -0
- package/dist/configurators/gemini.d.ts +16 -0
- package/dist/configurators/gemini.d.ts.map +1 -0
- package/dist/configurators/gemini.js +38 -0
- package/dist/configurators/gemini.js.map +1 -0
- package/dist/configurators/index.d.ts +65 -0
- package/dist/configurators/index.d.ts.map +1 -0
- package/dist/configurators/index.js +367 -0
- package/dist/configurators/index.js.map +1 -0
- package/dist/configurators/kilo.d.ts +7 -0
- package/dist/configurators/kilo.d.ts.map +1 -0
- package/dist/configurators/kilo.js +19 -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 +24 -0
- package/dist/configurators/kiro.js.map +1 -0
- package/dist/configurators/opencode.d.ts +14 -0
- package/dist/configurators/opencode.d.ts.map +1 -0
- package/dist/configurators/opencode.js +96 -0
- package/dist/configurators/opencode.js.map +1 -0
- package/dist/configurators/pi.d.ts +3 -0
- package/dist/configurators/pi.d.ts.map +1 -0
- package/dist/configurators/pi.js +45 -0
- package/dist/configurators/pi.js.map +1 -0
- package/dist/configurators/qoder.d.ts +11 -0
- package/dist/configurators/qoder.d.ts.map +1 -0
- package/dist/configurators/qoder.js +31 -0
- package/dist/configurators/qoder.js.map +1 -0
- package/dist/configurators/shared.d.ts +178 -0
- package/dist/configurators/shared.d.ts.map +1 -0
- package/dist/configurators/shared.js +538 -0
- package/dist/configurators/shared.js.map +1 -0
- package/dist/configurators/windsurf.d.ts +7 -0
- package/dist/configurators/windsurf.d.ts.map +1 -0
- package/dist/configurators/windsurf.js +19 -0
- package/dist/configurators/windsurf.js.map +1 -0
- package/dist/configurators/workflow.d.ts +29 -0
- package/dist/configurators/workflow.d.ts.map +1 -0
- package/dist/configurators/workflow.js +163 -0
- package/dist/configurators/workflow.js.map +1 -0
- package/dist/constants/paths.d.ts +70 -0
- package/dist/constants/paths.d.ts.map +1 -0
- package/dist/constants/paths.js +79 -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 +62 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +187 -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 +297 -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/migrations/manifests/0.3.1.json +9 -0
- package/dist/migrations/manifests/0.3.10.json +9 -0
- package/dist/migrations/manifests/0.3.2.json +9 -0
- package/dist/migrations/manifests/0.3.3.json +9 -0
- package/dist/migrations/manifests/0.3.4.json +21 -0
- package/dist/migrations/manifests/0.3.5.json +9 -0
- package/dist/migrations/manifests/0.3.6.json +9 -0
- package/dist/migrations/manifests/0.3.7.json +9 -0
- package/dist/migrations/manifests/0.3.8.json +9 -0
- package/dist/migrations/manifests/0.3.9.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.1.json +228 -0
- package/dist/migrations/manifests/0.4.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.5.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.6.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.7.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.8.json +34 -0
- package/dist/migrations/manifests/0.4.0-beta.9.json +9 -0
- package/dist/migrations/manifests/0.4.0-rc.0.json +9 -0
- package/dist/migrations/manifests/0.4.0-rc.1.json +9 -0
- package/dist/migrations/manifests/0.4.0.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.0.json +1646 -0
- package/dist/migrations/manifests/0.5.0-beta.1.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.11.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.12.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.13.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.14.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.15.json +116 -0
- package/dist/migrations/manifests/0.5.0-beta.16.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.17.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.18.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.19.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.5.json +222 -0
- package/dist/migrations/manifests/0.5.0-beta.6.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.7.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.8.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.9.json +48 -0
- package/dist/migrations/manifests/0.5.0-rc.0.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.1.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.2.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.3.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.4.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.5.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.6.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.7.json +9 -0
- package/dist/migrations/manifests/0.5.0.json +9 -0
- package/dist/migrations/manifests/0.5.1.json +9 -0
- package/dist/migrations/manifests/0.5.10.json +9 -0
- package/dist/migrations/manifests/0.5.11.json +16 -0
- package/dist/migrations/manifests/0.5.12.json +9 -0
- package/dist/migrations/manifests/0.5.13.json +9 -0
- package/dist/migrations/manifests/0.5.14.json +9 -0
- package/dist/migrations/manifests/0.5.15.json +9 -0
- package/dist/migrations/manifests/0.5.2.json +9 -0
- package/dist/migrations/manifests/0.5.3.json +9 -0
- package/dist/migrations/manifests/0.5.4.json +9 -0
- package/dist/migrations/manifests/0.5.5.json +9 -0
- package/dist/migrations/manifests/0.5.6.json +9 -0
- package/dist/migrations/manifests/0.5.7.json +16 -0
- package/dist/migrations/manifests/0.5.8.json +9 -0
- package/dist/migrations/manifests/0.5.9.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.0.json +16 -0
- package/dist/migrations/manifests/0.6.0-beta.1.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.11.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.12.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.13.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.14.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.5.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.6.json +16 -0
- package/dist/migrations/manifests/0.6.0-beta.7.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.8.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.9.json +9 -0
- package/dist/templates/claude/agents/trellis-check.md +114 -0
- package/dist/templates/claude/agents/trellis-implement.md +113 -0
- package/dist/templates/claude/agents/trellis-research.md +137 -0
- package/dist/templates/claude/index.d.ts +22 -0
- package/dist/templates/claude/index.d.ts.map +1 -0
- package/dist/templates/claude/index.js +46 -0
- package/dist/templates/claude/index.js.map +1 -0
- package/dist/templates/claude/settings.json +73 -0
- package/dist/templates/codebuddy/agents/trellis-check.md +109 -0
- package/dist/templates/codebuddy/agents/trellis-implement.md +110 -0
- package/dist/templates/codebuddy/agents/trellis-research.md +137 -0
- package/dist/templates/codebuddy/index.d.ts +15 -0
- package/dist/templates/codebuddy/index.d.ts.map +1 -0
- package/dist/templates/codebuddy/index.js +15 -0
- package/dist/templates/codebuddy/index.js.map +1 -0
- package/dist/templates/codebuddy/settings.json +59 -0
- package/dist/templates/codex/agents/trellis-check.toml +84 -0
- package/dist/templates/codex/agents/trellis-implement.toml +65 -0
- package/dist/templates/codex/agents/trellis-research.toml +73 -0
- package/dist/templates/codex/config.toml +35 -0
- package/dist/templates/codex/hooks/session-start.py +545 -0
- package/dist/templates/codex/hooks.json +15 -0
- package/dist/templates/codex/index.d.ts +39 -0
- package/dist/templates/codex/index.d.ts.map +1 -0
- package/dist/templates/codex/index.js +85 -0
- package/dist/templates/codex/index.js.map +1 -0
- package/dist/templates/codex/skills/before-dev/SKILL.md +40 -0
- package/dist/templates/codex/skills/brainstorm/SKILL.md +112 -0
- package/dist/templates/codex/skills/break-loop/SKILL.md +130 -0
- package/dist/templates/codex/skills/check/SKILL.md +98 -0
- package/dist/templates/codex/skills/check-cross-layer/SKILL.md +158 -0
- package/dist/templates/codex/skills/create-command/SKILL.md +101 -0
- package/dist/templates/codex/skills/finish-work/SKILL.md +90 -0
- package/dist/templates/codex/skills/improve-ut/SKILL.md +69 -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 +64 -0
- package/dist/templates/codex/skills/update-spec/SKILL.md +335 -0
- package/dist/templates/common/bundled-skills/trellis-meta/SKILL.md +73 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/add-project-local-conventions.md +83 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-agents.md +54 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-context-loading.md +84 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-hooks.md +57 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-skills-or-commands.md +78 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-spec-structure.md +83 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-task-lifecycle.md +90 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-workflow.md +65 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/overview.md +55 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/context-injection.md +68 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/generated-files.md +80 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/overview.md +51 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/spec-system.md +102 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/task-system.md +103 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workflow.md +75 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workspace-memory.md +71 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/agents.md +80 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/hooks-and-settings.md +69 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/overview.md +59 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/platform-map.md +74 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/skills-and-commands.md +83 -0
- package/dist/templates/common/commands/continue.md +56 -0
- package/dist/templates/common/commands/finish-work.md +66 -0
- package/dist/templates/common/commands/start.md +59 -0
- package/dist/templates/common/index.d.ts +48 -0
- package/dist/templates/common/index.d.ts.map +1 -0
- package/dist/templates/common/index.js +104 -0
- package/dist/templates/common/index.js.map +1 -0
- package/dist/templates/common/skills/before-dev.md +35 -0
- package/dist/templates/common/skills/brainstorm.md +112 -0
- package/dist/templates/common/skills/break-loop.md +125 -0
- package/dist/templates/common/skills/check.md +93 -0
- package/dist/templates/common/skills/update-spec.md +351 -0
- package/dist/templates/copilot/hooks/session-start.py +547 -0
- package/dist/templates/copilot/hooks.json +19 -0
- package/dist/templates/copilot/index.d.ts +23 -0
- package/dist/templates/copilot/index.d.ts.map +1 -0
- package/dist/templates/copilot/index.js +54 -0
- package/dist/templates/copilot/index.js.map +1 -0
- package/dist/templates/copilot/prompts/before-dev.prompt.md +39 -0
- package/dist/templates/copilot/prompts/brainstorm.prompt.md +111 -0
- package/dist/templates/copilot/prompts/break-loop.prompt.md +129 -0
- package/dist/templates/copilot/prompts/check-cross-layer.prompt.md +157 -0
- package/dist/templates/copilot/prompts/check.prompt.md +97 -0
- package/dist/templates/copilot/prompts/create-command.prompt.md +116 -0
- package/dist/templates/copilot/prompts/finish-work.prompt.md +99 -0
- package/dist/templates/copilot/prompts/integrate-skill.prompt.md +223 -0
- package/dist/templates/copilot/prompts/onboard.prompt.md +362 -0
- package/dist/templates/copilot/prompts/parallel.prompt.md +204 -0
- package/dist/templates/copilot/prompts/record-session.prompt.md +66 -0
- package/dist/templates/copilot/prompts/start.prompt.md +63 -0
- package/dist/templates/copilot/prompts/update-spec.prompt.md +358 -0
- package/dist/templates/cursor/agents/trellis-check.md +108 -0
- package/dist/templates/cursor/agents/trellis-implement.md +109 -0
- package/dist/templates/cursor/agents/trellis-research.md +136 -0
- package/dist/templates/cursor/hooks.json +30 -0
- package/dist/templates/cursor/index.d.ts +13 -0
- package/dist/templates/cursor/index.d.ts.map +1 -0
- package/dist/templates/cursor/index.js +13 -0
- package/dist/templates/cursor/index.js.map +1 -0
- package/dist/templates/droid/droids/trellis-check.md +101 -0
- package/dist/templates/droid/droids/trellis-implement.md +102 -0
- package/dist/templates/droid/droids/trellis-research.md +137 -0
- package/dist/templates/droid/index.d.ts +15 -0
- package/dist/templates/droid/index.d.ts.map +1 -0
- package/dist/templates/droid/index.js +15 -0
- package/dist/templates/droid/index.js.map +1 -0
- package/dist/templates/droid/settings.json +59 -0
- package/dist/templates/extract.d.ts +40 -0
- package/dist/templates/extract.d.ts.map +1 -0
- package/dist/templates/extract.js +106 -0
- package/dist/templates/extract.js.map +1 -0
- package/dist/templates/gemini/agents/trellis-check.md +101 -0
- package/dist/templates/gemini/agents/trellis-implement.md +102 -0
- package/dist/templates/gemini/agents/trellis-research.md +136 -0
- package/dist/templates/gemini/index.d.ts +13 -0
- package/dist/templates/gemini/index.d.ts.map +1 -0
- package/dist/templates/gemini/index.js +13 -0
- package/dist/templates/gemini/index.js.map +1 -0
- package/dist/templates/gemini/settings.json +28 -0
- package/dist/templates/kiro/agents/trellis-check.json +26 -0
- package/dist/templates/kiro/agents/trellis-implement.json +26 -0
- package/dist/templates/kiro/agents/trellis-research.json +30 -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 +18 -0
- package/dist/templates/kiro/index.js.map +1 -0
- package/dist/templates/markdown/agents.md +21 -0
- package/dist/templates/markdown/gitignore.txt +15 -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.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/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.txt +223 -0
- package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +259 -0
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +595 -0
- package/dist/templates/markdown/spec/guides/index.md.txt +97 -0
- package/dist/templates/markdown/workspace-index.md +125 -0
- package/dist/templates/markdown/worktree.yaml.txt +58 -0
- package/dist/templates/opencode/agents/trellis-check.md +116 -0
- package/dist/templates/opencode/agents/trellis-implement.md +118 -0
- package/dist/templates/opencode/agents/trellis-research.md +145 -0
- package/dist/templates/opencode/lib/session-utils.js +521 -0
- package/dist/templates/opencode/lib/trellis-context.js +381 -0
- package/dist/templates/opencode/package.json +5 -0
- package/dist/templates/opencode/plugins/inject-subagent-context.js +513 -0
- package/dist/templates/opencode/plugins/inject-workflow-state.js +159 -0
- package/dist/templates/opencode/plugins/session-start.js +101 -0
- package/dist/templates/pi/agents/trellis-check.md +36 -0
- package/dist/templates/pi/agents/trellis-implement.md +41 -0
- package/dist/templates/pi/agents/trellis-research.md +25 -0
- package/dist/templates/pi/extensions/trellis/index.ts.txt +1174 -0
- package/dist/templates/pi/index.d.ts +5 -0
- package/dist/templates/pi/index.d.ts.map +1 -0
- package/dist/templates/pi/index.js +12 -0
- package/dist/templates/pi/index.js.map +1 -0
- package/dist/templates/pi/settings.json +21 -0
- package/dist/templates/qoder/agents/trellis-check.md +102 -0
- package/dist/templates/qoder/agents/trellis-implement.md +103 -0
- package/dist/templates/qoder/agents/trellis-research.md +137 -0
- package/dist/templates/qoder/index.d.ts +15 -0
- package/dist/templates/qoder/index.d.ts.map +1 -0
- package/dist/templates/qoder/index.js +15 -0
- package/dist/templates/qoder/index.js.map +1 -0
- package/dist/templates/qoder/settings.json +47 -0
- package/dist/templates/shared-hooks/index.d.ts +50 -0
- package/dist/templates/shared-hooks/index.d.ts.map +1 -0
- package/dist/templates/shared-hooks/index.js +89 -0
- package/dist/templates/shared-hooks/index.js.map +1 -0
- package/dist/templates/shared-hooks/inject-shell-session-context.py +183 -0
- package/dist/templates/shared-hooks/inject-subagent-context.py +771 -0
- package/dist/templates/shared-hooks/inject-workflow-state.py +363 -0
- package/dist/templates/shared-hooks/session-start.py +827 -0
- package/dist/templates/template-utils.d.ts +26 -0
- package/dist/templates/template-utils.d.ts.map +1 -0
- package/dist/templates/template-utils.js +60 -0
- package/dist/templates/template-utils.js.map +1 -0
- package/dist/templates/trellis/config.yaml +90 -0
- package/dist/templates/trellis/gitignore.txt +32 -0
- package/dist/templates/trellis/index.d.ts +52 -0
- package/dist/templates/trellis/index.d.ts.map +1 -0
- package/dist/templates/trellis/index.js +97 -0
- package/dist/templates/trellis/index.js.map +1 -0
- package/dist/templates/trellis/scripts/__init__.py +5 -0
- package/dist/templates/trellis/scripts/add_session.py +547 -0
- package/dist/templates/trellis/scripts/common/__init__.py +92 -0
- package/dist/templates/trellis/scripts/common/active_task.py +626 -0
- package/dist/templates/trellis/scripts/common/cli_adapter.py +811 -0
- package/dist/templates/trellis/scripts/common/config.py +445 -0
- package/dist/templates/trellis/scripts/common/developer.py +190 -0
- package/dist/templates/trellis/scripts/common/git.py +31 -0
- package/dist/templates/trellis/scripts/common/git_context.py +106 -0
- package/dist/templates/trellis/scripts/common/io.py +37 -0
- package/dist/templates/trellis/scripts/common/log.py +45 -0
- package/dist/templates/trellis/scripts/common/packages_context.py +238 -0
- package/dist/templates/trellis/scripts/common/paths.py +447 -0
- package/dist/templates/trellis/scripts/common/safe_commit.py +285 -0
- package/dist/templates/trellis/scripts/common/session_context.py +821 -0
- package/dist/templates/trellis/scripts/common/task_context.py +223 -0
- package/dist/templates/trellis/scripts/common/task_queue.py +188 -0
- package/dist/templates/trellis/scripts/common/task_store.py +698 -0
- package/dist/templates/trellis/scripts/common/task_utils.py +274 -0
- package/dist/templates/trellis/scripts/common/tasks.py +112 -0
- package/dist/templates/trellis/scripts/common/trellis_config.py +131 -0
- package/dist/templates/trellis/scripts/common/types.py +110 -0
- package/dist/templates/trellis/scripts/common/workflow_phase.py +212 -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/hooks/linear_sync.py +243 -0
- package/dist/templates/trellis/scripts/init_developer.py +51 -0
- package/dist/templates/trellis/scripts/task.py +500 -0
- package/dist/templates/trellis/tasks/.gitkeep +0 -0
- package/dist/templates/trellis/workflow.md +690 -0
- package/dist/types/ai-tools.d.ts +95 -0
- package/dist/types/ai-tools.d.ts.map +1 -0
- package/dist/types/ai-tools.js +280 -0
- package/dist/types/ai-tools.js.map +1 -0
- package/dist/types/migration.d.ts +125 -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 +86 -0
- package/dist/utils/compare-versions.js.map +1 -0
- package/dist/utils/cwd-guard.d.ts +38 -0
- package/dist/utils/cwd-guard.d.ts.map +1 -0
- package/dist/utils/cwd-guard.js +62 -0
- package/dist/utils/cwd-guard.js.map +1 -0
- package/dist/utils/file-writer.d.ts +36 -0
- package/dist/utils/file-writer.d.ts.map +1 -0
- package/dist/utils/file-writer.js +203 -0
- package/dist/utils/file-writer.js.map +1 -0
- package/dist/utils/manifest-prune.d.ts +61 -0
- package/dist/utils/manifest-prune.d.ts.map +1 -0
- package/dist/utils/manifest-prune.js +136 -0
- package/dist/utils/manifest-prune.js.map +1 -0
- package/dist/utils/posix.d.ts +13 -0
- package/dist/utils/posix.d.ts.map +1 -0
- package/dist/utils/posix.js +15 -0
- package/dist/utils/posix.js.map +1 -0
- package/dist/utils/project-detector.d.ts +46 -0
- package/dist/utils/project-detector.d.ts.map +1 -0
- package/dist/utils/project-detector.js +666 -0
- package/dist/utils/project-detector.js.map +1 -0
- package/dist/utils/proxy.d.ts +25 -0
- package/dist/utils/proxy.d.ts.map +1 -0
- package/dist/utils/proxy.js +60 -0
- package/dist/utils/proxy.js.map +1 -0
- package/dist/utils/task-json.d.ts +13 -0
- package/dist/utils/task-json.d.ts.map +1 -0
- package/dist/utils/task-json.js +12 -0
- package/dist/utils/task-json.js.map +1 -0
- package/dist/utils/template-fetcher.d.ts +150 -0
- package/dist/utils/template-fetcher.d.ts.map +1 -0
- package/dist/utils/template-fetcher.js +907 -0
- package/dist/utils/template-fetcher.js.map +1 -0
- package/dist/utils/template-hash.d.ts +123 -0
- package/dist/utils/template-hash.d.ts.map +1 -0
- package/dist/utils/template-hash.js +334 -0
- package/dist/utils/template-hash.js.map +1 -0
- package/dist/utils/uninstall-scrubbers.d.ts +66 -0
- package/dist/utils/uninstall-scrubbers.d.ts.map +1 -0
- package/dist/utils/uninstall-scrubbers.js +342 -0
- package/dist/utils/uninstall-scrubbers.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
/* global process */
|
|
2
|
+
/**
|
|
3
|
+
* Trellis Context Injection Plugin
|
|
4
|
+
*
|
|
5
|
+
* Injects context when Task tool is called with supported subagent types.
|
|
6
|
+
* Uses OpenCode's tool.execute.before hook.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { existsSync, readdirSync } from "fs"
|
|
10
|
+
import { join } from "path"
|
|
11
|
+
import { TrellisContext, debugLog } from "../lib/trellis-context.js"
|
|
12
|
+
|
|
13
|
+
// Supported subagent types
|
|
14
|
+
const AGENTS_ALL = ["implement", "check", "research"]
|
|
15
|
+
const AGENTS_REQUIRE_TASK = ["implement", "check"]
|
|
16
|
+
|
|
17
|
+
// Match `Active task: <path>` on the first non-empty line of the dispatch
|
|
18
|
+
// prompt. Mirrors the contract in workflow.md's [workflow-state:in_progress]
|
|
19
|
+
// breadcrumb so multi-window users can disambiguate which task is targeted.
|
|
20
|
+
const ACTIVE_TASK_HINT_RE = /^\s*Active task:\s*(\S+)\s*$/m
|
|
21
|
+
|
|
22
|
+
function extractActiveTaskHint(prompt) {
|
|
23
|
+
if (typeof prompt !== "string" || !prompt) return null
|
|
24
|
+
const match = prompt.match(ACTIVE_TASK_HINT_RE)
|
|
25
|
+
return match ? match[1].trim() : null
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Get context for implement agent. `taskDir` may be relative
|
|
30
|
+
* (`.trellis/tasks/foo`) or absolute; both are resolved via
|
|
31
|
+
* `ctx.resolveTaskDir`.
|
|
32
|
+
*/
|
|
33
|
+
function getImplementContext(ctx, taskDir) {
|
|
34
|
+
const parts = []
|
|
35
|
+
const taskDirFull = ctx.resolveTaskDir(taskDir)
|
|
36
|
+
if (!taskDirFull) return ""
|
|
37
|
+
|
|
38
|
+
const jsonlPath = join(taskDirFull, "implement.jsonl")
|
|
39
|
+
const entries = ctx.readJsonlWithFiles(jsonlPath)
|
|
40
|
+
if (entries.length > 0) {
|
|
41
|
+
parts.push(ctx.buildContextFromEntries(entries))
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const prd = ctx.readFile(join(taskDirFull, "prd.md"))
|
|
45
|
+
if (prd) {
|
|
46
|
+
parts.push(`=== ${taskDir}/prd.md (Requirements) ===\n${prd}`)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const design = ctx.readFile(join(taskDirFull, "design.md"))
|
|
50
|
+
if (design) {
|
|
51
|
+
parts.push(`=== ${taskDir}/design.md (Technical Design) ===\n${design}`)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const implementPlan = ctx.readFile(join(taskDirFull, "implement.md"))
|
|
55
|
+
if (implementPlan) {
|
|
56
|
+
parts.push(`=== ${taskDir}/implement.md (Execution Plan) ===\n${implementPlan}`)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return parts.join("\n\n")
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Get context for check agent. `taskDir` may be relative or absolute.
|
|
64
|
+
*/
|
|
65
|
+
function getCheckContext(ctx, taskDir) {
|
|
66
|
+
const parts = []
|
|
67
|
+
const taskDirFull = ctx.resolveTaskDir(taskDir)
|
|
68
|
+
if (!taskDirFull) return ""
|
|
69
|
+
|
|
70
|
+
const jsonlPath = join(taskDirFull, "check.jsonl")
|
|
71
|
+
const entries = ctx.readJsonlWithFiles(jsonlPath)
|
|
72
|
+
if (entries.length > 0) {
|
|
73
|
+
parts.push(ctx.buildContextFromEntries(entries))
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const prd = ctx.readFile(join(taskDirFull, "prd.md"))
|
|
77
|
+
if (prd) {
|
|
78
|
+
parts.push(`=== ${taskDir}/prd.md (Requirements) ===\n${prd}`)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const design = ctx.readFile(join(taskDirFull, "design.md"))
|
|
82
|
+
if (design) {
|
|
83
|
+
parts.push(`=== ${taskDir}/design.md (Technical Design) ===\n${design}`)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const implementPlan = ctx.readFile(join(taskDirFull, "implement.md"))
|
|
87
|
+
if (implementPlan) {
|
|
88
|
+
parts.push(`=== ${taskDir}/implement.md (Execution Plan) ===\n${implementPlan}`)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return parts.join("\n\n")
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Get context for finish phase (final check before PR)
|
|
96
|
+
*/
|
|
97
|
+
function getFinishContext(ctx, taskDir) {
|
|
98
|
+
// Finish reuses check context (same JSONL source)
|
|
99
|
+
return getCheckContext(ctx, taskDir)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Get context for research agent
|
|
105
|
+
*/
|
|
106
|
+
function getResearchContext(ctx) {
|
|
107
|
+
const parts = []
|
|
108
|
+
|
|
109
|
+
// Dynamic project structure (scan actual spec directory)
|
|
110
|
+
const specPath = ".trellis/spec"
|
|
111
|
+
const specFull = join(ctx.directory, specPath)
|
|
112
|
+
|
|
113
|
+
const structureLines = [`## Project Spec Directory Structure\n\n\`\`\`\n${specPath}/`]
|
|
114
|
+
if (existsSync(specFull)) {
|
|
115
|
+
try {
|
|
116
|
+
const entries = readdirSync(specFull, { withFileTypes: true })
|
|
117
|
+
.filter(d => d.isDirectory() && !d.name.startsWith("."))
|
|
118
|
+
.sort((a, b) => a.name.localeCompare(b.name))
|
|
119
|
+
|
|
120
|
+
for (const entry of entries) {
|
|
121
|
+
const entryPath = join(specFull, entry.name)
|
|
122
|
+
if (existsSync(join(entryPath, "index.md"))) {
|
|
123
|
+
structureLines.push(`├── ${entry.name}/`)
|
|
124
|
+
} else {
|
|
125
|
+
try {
|
|
126
|
+
const nested = readdirSync(entryPath, { withFileTypes: true })
|
|
127
|
+
.filter(d => d.isDirectory() && existsSync(join(entryPath, d.name, "index.md")))
|
|
128
|
+
.sort((a, b) => a.name.localeCompare(b.name))
|
|
129
|
+
if (nested.length > 0) {
|
|
130
|
+
structureLines.push(`├── ${entry.name}/`)
|
|
131
|
+
for (const n of nested) {
|
|
132
|
+
structureLines.push(`│ ├── ${n.name}/`)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
} catch {
|
|
136
|
+
// Ignore nested read errors
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
} catch {
|
|
141
|
+
// Ignore read errors
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
structureLines.push("```")
|
|
145
|
+
|
|
146
|
+
parts.push(structureLines.join("\n") + `
|
|
147
|
+
|
|
148
|
+
## Search Tips
|
|
149
|
+
|
|
150
|
+
- Spec files: \`.trellis/spec/**/*.md\`
|
|
151
|
+
- Known issues: \`.trellis/big-question/\`
|
|
152
|
+
- Code search: Use Glob and Grep tools
|
|
153
|
+
- Tech solutions: Use mcp__exa__web_search_exa or mcp__exa__get_code_context_exa`)
|
|
154
|
+
|
|
155
|
+
return parts.join("\n\n")
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Build enhanced prompt with context
|
|
160
|
+
*/
|
|
161
|
+
function buildPrompt(agentType, originalPrompt, context, isFinish = false) {
|
|
162
|
+
const templates = {
|
|
163
|
+
implement: `<!-- trellis-hook-injected -->
|
|
164
|
+
# Implement Agent Task
|
|
165
|
+
|
|
166
|
+
You are the Implement Agent in the Multi-Agent Pipeline.
|
|
167
|
+
|
|
168
|
+
## Your Context
|
|
169
|
+
|
|
170
|
+
${context}
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Your Task
|
|
175
|
+
|
|
176
|
+
${originalPrompt}
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Workflow
|
|
181
|
+
|
|
182
|
+
1. **Understand specs** - All dev specs are injected above
|
|
183
|
+
2. **Understand task artifacts** - Read requirements, technical design if present, and execution plan if present
|
|
184
|
+
3. **Implement feature** - Follow specs and task artifacts
|
|
185
|
+
4. **Self-check** - Ensure code quality
|
|
186
|
+
|
|
187
|
+
## Important Constraints
|
|
188
|
+
|
|
189
|
+
- Do NOT execute git commit
|
|
190
|
+
- Follow all dev specs injected above
|
|
191
|
+
- Report list of modified/created files when done`,
|
|
192
|
+
|
|
193
|
+
check: isFinish ? `<!-- trellis-hook-injected -->
|
|
194
|
+
# Finish Agent Task
|
|
195
|
+
|
|
196
|
+
You are performing the final check before creating a PR.
|
|
197
|
+
|
|
198
|
+
## Your Context
|
|
199
|
+
|
|
200
|
+
${context}
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Your Task
|
|
205
|
+
|
|
206
|
+
${originalPrompt}
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Workflow
|
|
211
|
+
|
|
212
|
+
1. **Review changes** - Run \`git diff --name-only\` to see all changed files
|
|
213
|
+
2. **Verify task artifacts** - Check prd.md and, when present, design.md / implement.md
|
|
214
|
+
3. **Spec sync** - Analyze whether changes introduce new patterns, contracts, or conventions
|
|
215
|
+
- If new pattern/convention found: read target spec file → update it → update index.md if needed
|
|
216
|
+
- If infra/cross-layer change: follow the 7-section mandatory template from update-spec.md
|
|
217
|
+
- If pure code fix with no new patterns: skip this step
|
|
218
|
+
4. **Run final checks** - Execute lint and typecheck
|
|
219
|
+
5. **Confirm ready** - Ensure code is ready for PR
|
|
220
|
+
|
|
221
|
+
## Important Constraints
|
|
222
|
+
|
|
223
|
+
- You MAY update spec files when gaps are detected (use update-spec.md as guide)
|
|
224
|
+
- MUST read the target spec file BEFORE editing (avoid duplicating existing content)
|
|
225
|
+
- Do NOT update specs for trivial changes (typos, formatting, obvious fixes)
|
|
226
|
+
- If critical CODE issues found, report them clearly (fix specs, not code)
|
|
227
|
+
- Verify all acceptance criteria in prd.md are met
|
|
228
|
+
- Verify design.md and implement.md constraints when those files are present` :
|
|
229
|
+
`<!-- trellis-hook-injected -->
|
|
230
|
+
# Check Agent Task
|
|
231
|
+
|
|
232
|
+
You are the Check Agent in the Multi-Agent Pipeline.
|
|
233
|
+
|
|
234
|
+
## Your Context
|
|
235
|
+
|
|
236
|
+
${context}
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Your Task
|
|
241
|
+
|
|
242
|
+
${originalPrompt}
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Workflow
|
|
247
|
+
|
|
248
|
+
1. **Get changes** - Run \`git diff --name-only\` and \`git diff\`
|
|
249
|
+
2. **Check against specs** - Check item by item
|
|
250
|
+
3. **Self-fix** - Fix issues directly, don't just report
|
|
251
|
+
4. **Run verification** - Run lint and typecheck
|
|
252
|
+
|
|
253
|
+
## Important Constraints
|
|
254
|
+
|
|
255
|
+
- Fix issues yourself, don't just report
|
|
256
|
+
- Must execute complete checklist`,
|
|
257
|
+
|
|
258
|
+
research: `<!-- trellis-hook-injected -->
|
|
259
|
+
# Research Agent Task
|
|
260
|
+
|
|
261
|
+
You are the Research Agent in the Multi-Agent Pipeline.
|
|
262
|
+
|
|
263
|
+
## Core Principle
|
|
264
|
+
|
|
265
|
+
**You do one thing: find and explain information.**
|
|
266
|
+
|
|
267
|
+
## Project Info
|
|
268
|
+
|
|
269
|
+
${context}
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Your Task
|
|
274
|
+
|
|
275
|
+
${originalPrompt}
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Workflow
|
|
280
|
+
|
|
281
|
+
1. **Understand query** - Determine search type and scope
|
|
282
|
+
2. **Plan search** - List search steps
|
|
283
|
+
3. **Execute search** - Run multiple searches in parallel
|
|
284
|
+
4. **Organize results** - Output structured report
|
|
285
|
+
|
|
286
|
+
## Strict Boundaries
|
|
287
|
+
|
|
288
|
+
**Only allowed**: Describe what exists, where it is, how it works
|
|
289
|
+
|
|
290
|
+
**Forbidden**: Suggest improvements, criticize implementation, modify files`
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return templates[agentType] || originalPrompt
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
function shellQuote(value) {
|
|
297
|
+
return `'${String(value).replace(/'/g, "'\\''")}'`
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
function powershellQuote(value) {
|
|
301
|
+
return `'${String(value).replace(/'/g, "''")}'`
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
function envValue(env, key) {
|
|
305
|
+
const value = env?.[key]
|
|
306
|
+
return typeof value === "string" && value.trim() ? value.trim() : null
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function shellBasename(value) {
|
|
310
|
+
return value.replace(/\\/g, "/").split("/").pop()?.toLowerCase() || ""
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function isWindowsPosixShell(env = process.env) {
|
|
314
|
+
if (envValue(env, "MSYSTEM")) return true
|
|
315
|
+
if (envValue(env, "MINGW_PREFIX")) return true
|
|
316
|
+
if (envValue(env, "OPENCODE_GIT_BASH_PATH")) return true
|
|
317
|
+
|
|
318
|
+
const ostype = envValue(env, "OSTYPE")?.toLowerCase() || ""
|
|
319
|
+
if (/(msys|mingw|cygwin)/.test(ostype)) return true
|
|
320
|
+
|
|
321
|
+
const shell = shellBasename(envValue(env, "SHELL") || "")
|
|
322
|
+
return /^(bash|sh|zsh)(\.exe)?$/.test(shell)
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
function buildTrellisContextPrefix(contextKey, hostPlatform = process.platform, env = process.env) {
|
|
326
|
+
if (hostPlatform === "win32" && !isWindowsPosixShell(env)) {
|
|
327
|
+
return `$env:TRELLIS_CONTEXT_ID = ${powershellQuote(contextKey)}; `
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return `export TRELLIS_CONTEXT_ID=${shellQuote(contextKey)}; `
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function getBashCommandKey(args) {
|
|
334
|
+
if (!args || typeof args !== "object") return null
|
|
335
|
+
if (typeof args.command === "string") return "command"
|
|
336
|
+
if (typeof args.cmd === "string") return "cmd"
|
|
337
|
+
return null
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function commandStartsWithTrellisContext(command) {
|
|
341
|
+
const firstCommand = command.trimStart().split(/[;&|]/, 1)[0].trimStart()
|
|
342
|
+
return (
|
|
343
|
+
/^TRELLIS_CONTEXT_ID\s*=/.test(firstCommand) ||
|
|
344
|
+
/^export\s+TRELLIS_CONTEXT_ID\s*=/.test(firstCommand) ||
|
|
345
|
+
/^env\s+(?:(?:-\S+|[A-Za-z_][A-Za-z0-9_]*=\S*)\s+)*TRELLIS_CONTEXT_ID\s*=/.test(firstCommand) ||
|
|
346
|
+
/^\$env:TRELLIS_CONTEXT_ID\s*=/i.test(firstCommand)
|
|
347
|
+
)
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* OpenCode TUI may not expose OPENCODE_RUN_ID to Bash. The plugin hook still
|
|
352
|
+
* receives session identity, so inject it into Bash commands before execution.
|
|
353
|
+
*/
|
|
354
|
+
function injectTrellisContextIntoBash(ctx, input, output, hostPlatform, env) {
|
|
355
|
+
const args = output?.args
|
|
356
|
+
const commandKey = getBashCommandKey(args)
|
|
357
|
+
if (!commandKey) return false
|
|
358
|
+
|
|
359
|
+
const command = args[commandKey]
|
|
360
|
+
if (!command.trim()) return false
|
|
361
|
+
if (commandStartsWithTrellisContext(command)) return false
|
|
362
|
+
|
|
363
|
+
const contextKey = ctx.getContextKey(input)
|
|
364
|
+
if (!contextKey) return false
|
|
365
|
+
|
|
366
|
+
args[commandKey] = `${buildTrellisContextPrefix(contextKey, hostPlatform, env)}${command}`
|
|
367
|
+
return true
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// OpenCode plugin factory: `export default async (input) => hooks`.
|
|
371
|
+
// OpenCode 1.2.x iterates every module export and invokes it as a function
|
|
372
|
+
// (packages/opencode/src/plugin/index.ts — `for ([_, fn] of Object.entries(mod)) await fn(input)`);
|
|
373
|
+
// the previous `{ id, server }` object shape failed with
|
|
374
|
+
// `TypeError: fn is not a function` in 1.2.x.
|
|
375
|
+
export default async ({ directory, platform: hostPlatform = process.platform, env = process.env }) => {
|
|
376
|
+
const ctx = new TrellisContext(directory)
|
|
377
|
+
debugLog("inject", "Plugin loaded, directory:", directory)
|
|
378
|
+
|
|
379
|
+
return {
|
|
380
|
+
"tool.execute.before": async (input, output) => {
|
|
381
|
+
try {
|
|
382
|
+
if (process.env.TRELLIS_HOOKS === "0" || process.env.TRELLIS_DISABLE_HOOKS === "1") {
|
|
383
|
+
return
|
|
384
|
+
}
|
|
385
|
+
debugLog("inject", "tool.execute.before called, tool:", input?.tool)
|
|
386
|
+
|
|
387
|
+
const toolName = input?.tool?.toLowerCase()
|
|
388
|
+
if (toolName === "bash") {
|
|
389
|
+
if (injectTrellisContextIntoBash(ctx, input, output, hostPlatform, env)) {
|
|
390
|
+
debugLog("inject", "Injected TRELLIS_CONTEXT_ID into Bash command")
|
|
391
|
+
}
|
|
392
|
+
return
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
if (toolName !== "task") {
|
|
396
|
+
return
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
const args = output?.args
|
|
400
|
+
if (!args) return
|
|
401
|
+
|
|
402
|
+
const rawSubagentType = args.subagent_type
|
|
403
|
+
// Strip "trellis-" prefix added by v0.5.0-beta.5 agent rename migration
|
|
404
|
+
const subagentType = (rawSubagentType || "").replace(/^trellis-/, "")
|
|
405
|
+
const originalPrompt = args.prompt || ""
|
|
406
|
+
|
|
407
|
+
debugLog("inject", "Task tool called, subagent_type:", rawSubagentType)
|
|
408
|
+
|
|
409
|
+
if (!AGENTS_ALL.includes(subagentType)) {
|
|
410
|
+
debugLog("inject", "Skipping - unsupported subagent_type")
|
|
411
|
+
return
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Resolve active task in this priority order (only later steps
|
|
415
|
+
// run when earlier ones miss):
|
|
416
|
+
// 1. Exact session runtime context lookup for input.sessionID
|
|
417
|
+
// 2. `Active task: <path>` hint in the dispatch prompt
|
|
418
|
+
// (explicit per-dispatch override — beats single-session
|
|
419
|
+
// inference so multi-window users can disambiguate)
|
|
420
|
+
// 3. Single-session fallback — only when exactly 1 session
|
|
421
|
+
// runtime file exists locally
|
|
422
|
+
let taskDir = null
|
|
423
|
+
let taskSource = null
|
|
424
|
+
|
|
425
|
+
const contextKey = ctx.getContextKey(input)
|
|
426
|
+
if (contextKey) {
|
|
427
|
+
const context = ctx.readContext(contextKey)
|
|
428
|
+
const exactRef = ctx.normalizeTaskRef(context?.current_task || "")
|
|
429
|
+
if (exactRef) {
|
|
430
|
+
taskDir = exactRef
|
|
431
|
+
taskSource = `session:${contextKey}`
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
if (!taskDir) {
|
|
436
|
+
const hintRef = extractActiveTaskHint(originalPrompt)
|
|
437
|
+
if (hintRef) {
|
|
438
|
+
const hintNormalized = ctx.normalizeTaskRef(hintRef)
|
|
439
|
+
if (hintNormalized) {
|
|
440
|
+
const hintDir = ctx.resolveTaskDir(hintNormalized)
|
|
441
|
+
if (hintDir && existsSync(hintDir)) {
|
|
442
|
+
taskDir = hintNormalized
|
|
443
|
+
taskSource = "prompt-hint"
|
|
444
|
+
debugLog("inject", "Resolved task from Active task: hint:", hintNormalized)
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
if (!taskDir) {
|
|
451
|
+
const fallback = ctx._resolveSingleSessionFallback()
|
|
452
|
+
if (fallback?.taskPath) {
|
|
453
|
+
const fallbackDir = ctx.resolveTaskDir(fallback.taskPath)
|
|
454
|
+
if (fallbackDir && existsSync(fallbackDir)) {
|
|
455
|
+
taskDir = fallback.taskPath
|
|
456
|
+
taskSource = fallback.source
|
|
457
|
+
debugLog("inject", "Resolved task via single-session fallback:", taskDir, "source:", taskSource)
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
// Agents requiring task directory
|
|
463
|
+
if (AGENTS_REQUIRE_TASK.includes(subagentType)) {
|
|
464
|
+
// subagentType is already stripped of "trellis-" prefix above
|
|
465
|
+
if (!taskDir) {
|
|
466
|
+
debugLog("inject", "Skipping - no current task")
|
|
467
|
+
return
|
|
468
|
+
}
|
|
469
|
+
const taskDirFull = ctx.resolveTaskDir(taskDir)
|
|
470
|
+
if (!taskDirFull || !existsSync(taskDirFull)) {
|
|
471
|
+
debugLog("inject", "Skipping - task directory not found")
|
|
472
|
+
return
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// Check for [finish] marker
|
|
477
|
+
const isFinish = originalPrompt.toLowerCase().includes("[finish]")
|
|
478
|
+
|
|
479
|
+
// Get context based on agent type
|
|
480
|
+
let context = ""
|
|
481
|
+
switch (subagentType) {
|
|
482
|
+
case "implement":
|
|
483
|
+
context = getImplementContext(ctx, taskDir)
|
|
484
|
+
break
|
|
485
|
+
case "check":
|
|
486
|
+
context = isFinish
|
|
487
|
+
? getFinishContext(ctx, taskDir)
|
|
488
|
+
: getCheckContext(ctx, taskDir)
|
|
489
|
+
break
|
|
490
|
+
case "research":
|
|
491
|
+
context = getResearchContext(ctx, taskDir)
|
|
492
|
+
break
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
if (!context) {
|
|
496
|
+
debugLog("inject", "No context to inject")
|
|
497
|
+
return
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
const newPrompt = buildPrompt(subagentType, originalPrompt, context, isFinish)
|
|
501
|
+
|
|
502
|
+
// Mutate args in-place — whole-object replacement does NOT work for the task tool
|
|
503
|
+
// because the runtime holds a local reference to the same args object.
|
|
504
|
+
args.prompt = newPrompt
|
|
505
|
+
|
|
506
|
+
debugLog("inject", "Injected context for", subagentType, "prompt length:", newPrompt.length)
|
|
507
|
+
|
|
508
|
+
} catch (error) {
|
|
509
|
+
debugLog("inject", "Error in tool.execute.before:", error.message, error.stack)
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/* global process */
|
|
2
|
+
/**
|
|
3
|
+
* Trellis Workflow State Injection Plugin
|
|
4
|
+
*
|
|
5
|
+
* Per-turn UserPromptSubmit equivalent for OpenCode.
|
|
6
|
+
*
|
|
7
|
+
* On every chat.message, if a Trellis task is active, inject a short
|
|
8
|
+
* <workflow-state> breadcrumb reminding the main AI what task is
|
|
9
|
+
* active and its expected flow. Breadcrumb text is pulled exclusively
|
|
10
|
+
* from the project's workflow.md [workflow-state:STATUS] tag blocks —
|
|
11
|
+
* workflow.md is the single source of truth. There are no fallback
|
|
12
|
+
* tables in this plugin: when workflow.md is missing or a tag is
|
|
13
|
+
* absent, the breadcrumb degrades to a generic
|
|
14
|
+
* "Refer to workflow.md for current step." line so users see (and fix)
|
|
15
|
+
* the broken state instead of the plugin silently masking it.
|
|
16
|
+
*
|
|
17
|
+
* Unlike session-start, this plugin does NOT dedupe — the breadcrumb
|
|
18
|
+
* should surface on every turn so long conversations don't drift.
|
|
19
|
+
*
|
|
20
|
+
* Silently skips when:
|
|
21
|
+
* - No .trellis/ directory
|
|
22
|
+
* - No active task in the session runtime context
|
|
23
|
+
* - task.json malformed or missing status
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { existsSync, readFileSync } from "fs"
|
|
27
|
+
import { join } from "path"
|
|
28
|
+
import { TrellisContext, debugLog, isTrellisSubagent } from "../lib/trellis-context.js"
|
|
29
|
+
|
|
30
|
+
// Supports STATUS values with letters, digits, underscores, hyphens
|
|
31
|
+
// (so "in-review" / "blocked-by-team" work alongside "in_progress").
|
|
32
|
+
const TAG_RE = /\[workflow-state:([A-Za-z0-9_-]+)\]\s*\n([\s\S]*?)\n\s*\[\/workflow-state:\1\]/g
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Parse workflow.md for [workflow-state:STATUS] blocks.
|
|
36
|
+
*
|
|
37
|
+
* Returns {status: body}. workflow.md is the single source of truth —
|
|
38
|
+
* there are no fallback tables here. Missing tags (or a missing /
|
|
39
|
+
* unreadable workflow.md) fall back to a generic line in
|
|
40
|
+
* buildBreadcrumb so users see the broken state and fix workflow.md
|
|
41
|
+
* rather than the plugin silently masking it.
|
|
42
|
+
*/
|
|
43
|
+
function loadBreadcrumbs(directory) {
|
|
44
|
+
const workflowPath = join(directory, ".trellis", "workflow.md")
|
|
45
|
+
if (!existsSync(workflowPath)) return {}
|
|
46
|
+
let content
|
|
47
|
+
try {
|
|
48
|
+
content = readFileSync(workflowPath, "utf-8")
|
|
49
|
+
} catch {
|
|
50
|
+
return {}
|
|
51
|
+
}
|
|
52
|
+
const result = {}
|
|
53
|
+
for (const match of content.matchAll(TAG_RE)) {
|
|
54
|
+
const status = match[1]
|
|
55
|
+
const body = match[2].trim()
|
|
56
|
+
if (body) result[status] = body
|
|
57
|
+
}
|
|
58
|
+
return result
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Get (taskId, status) from active task, or null if no active task.
|
|
63
|
+
*/
|
|
64
|
+
function getActiveTask(ctx, platformInput = null) {
|
|
65
|
+
const active = ctx.getActiveTask(platformInput)
|
|
66
|
+
const taskRef = active.taskPath
|
|
67
|
+
if (!taskRef) return null
|
|
68
|
+
const taskDir = ctx.resolveTaskDir(taskRef)
|
|
69
|
+
if (active.stale || !taskDir || !existsSync(taskDir)) {
|
|
70
|
+
return { id: taskRef.split("/").pop(), status: "stale", source: active.source }
|
|
71
|
+
}
|
|
72
|
+
const taskJsonPath = join(taskDir, "task.json")
|
|
73
|
+
if (!existsSync(taskJsonPath)) return null
|
|
74
|
+
try {
|
|
75
|
+
const data = JSON.parse(readFileSync(taskJsonPath, "utf-8"))
|
|
76
|
+
const status = typeof data.status === "string" ? data.status : ""
|
|
77
|
+
if (!status) return null
|
|
78
|
+
const id = data.id || taskRef.split("/").pop()
|
|
79
|
+
return { id, status, source: active.source }
|
|
80
|
+
} catch {
|
|
81
|
+
return null
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Build the <workflow-state>...</workflow-state> block.
|
|
87
|
+
* - Known status (tag present in workflow.md) → detailed body
|
|
88
|
+
* - Unknown status (no tag, or workflow.md missing) → generic
|
|
89
|
+
* "Refer to workflow.md for current step." line
|
|
90
|
+
* - no_task pseudo-status (id === null) → header omits task info
|
|
91
|
+
*/
|
|
92
|
+
function buildBreadcrumb(id, status, templates) {
|
|
93
|
+
let body = templates[status]
|
|
94
|
+
if (body === undefined) {
|
|
95
|
+
body = "Refer to workflow.md for current step."
|
|
96
|
+
}
|
|
97
|
+
let header = id === null ? `Status: ${status}` : `Task: ${id} (${status})`
|
|
98
|
+
return `<workflow-state>\n${header}\n${body}\n</workflow-state>`
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// OpenCode 1.2.x expects plugins to be factory functions (see inject-subagent-context.js comment).
|
|
102
|
+
export default async ({ directory }) => {
|
|
103
|
+
const ctx = new TrellisContext(directory)
|
|
104
|
+
debugLog("workflow-state", "Plugin loaded, directory:", directory)
|
|
105
|
+
|
|
106
|
+
return {
|
|
107
|
+
// chat.message fires on every user message. Inject breadcrumb in-place
|
|
108
|
+
// so it persists in conversation history.
|
|
109
|
+
"chat.message": async (input, output) => {
|
|
110
|
+
try {
|
|
111
|
+
// Skip Trellis sub-agent turns — the per-turn breadcrumb is for the
|
|
112
|
+
// main session only; sub-agent context comes from the parent's
|
|
113
|
+
// tool.execute.before injection.
|
|
114
|
+
if (isTrellisSubagent(input)) {
|
|
115
|
+
debugLog("workflow-state", "Skipping trellis subagent turn:", input?.agent)
|
|
116
|
+
return
|
|
117
|
+
}
|
|
118
|
+
if (process.env.TRELLIS_HOOKS === "0" || process.env.TRELLIS_DISABLE_HOOKS === "1") {
|
|
119
|
+
return
|
|
120
|
+
}
|
|
121
|
+
if (process.env.OPENCODE_NON_INTERACTIVE === "1") {
|
|
122
|
+
return
|
|
123
|
+
}
|
|
124
|
+
if (!ctx.isTrellisProject()) {
|
|
125
|
+
return
|
|
126
|
+
}
|
|
127
|
+
const templates = loadBreadcrumbs(directory)
|
|
128
|
+
const task = getActiveTask(ctx, input)
|
|
129
|
+
const breadcrumb = task
|
|
130
|
+
? buildBreadcrumb(task.id, task.status, templates, task.source)
|
|
131
|
+
: buildBreadcrumb(null, "no_task", templates)
|
|
132
|
+
|
|
133
|
+
const parts = output?.parts || []
|
|
134
|
+
const textPartIndex = parts.findIndex(
|
|
135
|
+
p => p.type === "text" && p.text !== undefined,
|
|
136
|
+
)
|
|
137
|
+
if (textPartIndex !== -1) {
|
|
138
|
+
const originalText = parts[textPartIndex].text || ""
|
|
139
|
+
parts[textPartIndex].text = `${breadcrumb}\n\n${originalText}`
|
|
140
|
+
} else {
|
|
141
|
+
parts.unshift({ type: "text", text: breadcrumb })
|
|
142
|
+
}
|
|
143
|
+
debugLog(
|
|
144
|
+
"workflow-state",
|
|
145
|
+
"Injected breadcrumb for task",
|
|
146
|
+
task ? task.id : "none",
|
|
147
|
+
"status",
|
|
148
|
+
task ? task.status : "no_task",
|
|
149
|
+
)
|
|
150
|
+
} catch (error) {
|
|
151
|
+
debugLog(
|
|
152
|
+
"workflow-state",
|
|
153
|
+
"Error in chat.message:",
|
|
154
|
+
error instanceof Error ? error.message : String(error),
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
}
|
|
159
|
+
}
|