@mindfoldhq/trellis 0.4.0 → 0.5.0-beta.10
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/dist/cli/index.js +0 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/init.d.ts +10 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +382 -120
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/update.d.ts +5 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +178 -61
- package/dist/commands/update.js.map +1 -1
- package/dist/configurators/antigravity.d.ts +3 -4
- package/dist/configurators/antigravity.d.ts.map +1 -1
- package/dist/configurators/antigravity.js +17 -10
- package/dist/configurators/antigravity.js.map +1 -1
- package/dist/configurators/claude.d.ts +5 -28
- package/dist/configurators/claude.d.ts.map +1 -1
- package/dist/configurators/claude.js +30 -51
- package/dist/configurators/claude.js.map +1 -1
- package/dist/configurators/codebuddy.d.ts +6 -7
- package/dist/configurators/codebuddy.d.ts.map +1 -1
- package/dist/configurators/codebuddy.js +23 -51
- package/dist/configurators/codebuddy.js.map +1 -1
- package/dist/configurators/codex.d.ts +3 -6
- package/dist/configurators/codex.d.ts.map +1 -1
- package/dist/configurators/codex.js +29 -12
- package/dist/configurators/codex.js.map +1 -1
- package/dist/configurators/copilot.d.ts +6 -5
- package/dist/configurators/copilot.d.ts.map +1 -1
- package/dist/configurators/copilot.js +42 -13
- package/dist/configurators/copilot.js.map +1 -1
- package/dist/configurators/cursor.d.ts +6 -1
- package/dist/configurators/cursor.d.ts.map +1 -1
- package/dist/configurators/cursor.js +22 -45
- package/dist/configurators/cursor.js.map +1 -1
- package/dist/configurators/droid.d.ts +6 -1
- package/dist/configurators/droid.d.ts.map +1 -1
- package/dist/configurators/droid.js +23 -41
- package/dist/configurators/droid.js.map +1 -1
- package/dist/configurators/gemini.d.ts +8 -4
- package/dist/configurators/gemini.d.ts.map +1 -1
- package/dist/configurators/gemini.js +28 -47
- package/dist/configurators/gemini.js.map +1 -1
- package/dist/configurators/index.d.ts +1 -1
- package/dist/configurators/index.d.ts.map +1 -1
- package/dist/configurators/index.js +146 -100
- package/dist/configurators/index.js.map +1 -1
- package/dist/configurators/kilo.d.ts +3 -4
- package/dist/configurators/kilo.d.ts.map +1 -1
- package/dist/configurators/kilo.js +19 -46
- package/dist/configurators/kilo.js.map +1 -1
- package/dist/configurators/kiro.d.ts +4 -4
- package/dist/configurators/kiro.d.ts.map +1 -1
- package/dist/configurators/kiro.js +18 -14
- package/dist/configurators/kiro.js.map +1 -1
- package/dist/configurators/opencode.d.ts +7 -25
- package/dist/configurators/opencode.d.ts.map +1 -1
- package/dist/configurators/opencode.js +57 -56
- package/dist/configurators/opencode.js.map +1 -1
- package/dist/configurators/qoder.d.ts +6 -3
- package/dist/configurators/qoder.d.ts.map +1 -1
- package/dist/configurators/qoder.js +27 -46
- package/dist/configurators/qoder.js.map +1 -1
- package/dist/configurators/shared.d.ts +68 -3
- package/dist/configurators/shared.d.ts.map +1 -1
- package/dist/configurators/shared.js +274 -3
- package/dist/configurators/shared.js.map +1 -1
- package/dist/configurators/windsurf.d.ts +3 -4
- package/dist/configurators/windsurf.d.ts.map +1 -1
- package/dist/configurators/windsurf.js +17 -10
- package/dist/configurators/windsurf.js.map +1 -1
- package/dist/configurators/workflow.d.ts +0 -3
- package/dist/configurators/workflow.d.ts.map +1 -1
- package/dist/configurators/workflow.js +1 -7
- package/dist/configurators/workflow.js.map +1 -1
- package/dist/migrations/manifests/0.4.0.json +1 -1
- 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.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/templates/claude/agents/{check.md → trellis-check.md} +3 -31
- package/dist/templates/claude/agents/{implement.md → trellis-implement.md} +1 -2
- package/dist/templates/claude/agents/trellis-research.md +137 -0
- package/dist/templates/claude/index.d.ts +5 -37
- package/dist/templates/claude/index.d.ts.map +1 -1
- package/dist/templates/claude/index.js +3 -42
- package/dist/templates/claude/index.js.map +1 -1
- package/dist/templates/claude/settings.json +6 -4
- package/dist/templates/{iflow/agents/check.md → codebuddy/agents/trellis-check.md} +3 -31
- package/dist/templates/{iflow/agents/implement.md → codebuddy/agents/trellis-implement.md} +1 -2
- package/dist/templates/codebuddy/agents/trellis-research.md +137 -0
- package/dist/templates/codebuddy/index.d.ts +6 -16
- package/dist/templates/codebuddy/index.d.ts.map +1 -1
- package/dist/templates/codebuddy/index.js +6 -36
- package/dist/templates/codebuddy/index.js.map +1 -1
- package/dist/templates/codebuddy/settings.json +59 -0
- package/dist/templates/codex/agents/trellis-check.toml +38 -0
- package/dist/templates/codex/agents/{implement.toml → trellis-implement.toml} +1 -1
- package/dist/templates/codex/agents/trellis-research.toml +60 -0
- package/dist/templates/codex/config.toml +10 -0
- package/dist/templates/codex/hooks/session-start.py +65 -29
- package/dist/templates/codex/hooks.json +11 -0
- package/dist/templates/codex/index.d.ts +0 -1
- package/dist/templates/codex/index.d.ts.map +1 -1
- package/dist/templates/codex/index.js +1 -8
- package/dist/templates/codex/index.js.map +1 -1
- package/dist/templates/codex/skills/start/SKILL.md +1 -1
- package/dist/templates/common/commands/continue.md +51 -0
- package/dist/templates/common/commands/finish-work.md +32 -0
- package/dist/templates/common/commands/start.md +56 -0
- package/dist/templates/common/index.d.ts +28 -0
- package/dist/templates/common/index.d.ts.map +1 -0
- package/dist/templates/common/index.js +55 -0
- package/dist/templates/common/index.js.map +1 -0
- package/dist/templates/{droid/commands/trellis → common/skills}/brainstorm.md +51 -12
- package/dist/templates/{iflow/commands/trellis → common/skills}/break-loop.md +4 -4
- package/dist/templates/common/skills/check.md +87 -0
- package/dist/templates/{codebuddy/commands/trellis → common/skills}/update-spec.md +18 -21
- package/dist/templates/copilot/hooks/session-start.py +65 -29
- package/dist/templates/copilot/hooks.json +8 -0
- package/dist/templates/copilot/prompts/start.prompt.md +13 -16
- package/dist/templates/cursor/agents/trellis-check.md +94 -0
- package/dist/templates/cursor/agents/trellis-implement.md +94 -0
- package/dist/templates/cursor/agents/trellis-research.md +137 -0
- package/dist/templates/cursor/hooks.json +24 -0
- package/dist/templates/cursor/index.d.ts +6 -17
- package/dist/templates/cursor/index.d.ts.map +1 -1
- package/dist/templates/cursor/index.js +6 -37
- package/dist/templates/cursor/index.js.map +1 -1
- package/dist/templates/droid/droids/trellis-check.md +94 -0
- package/dist/templates/droid/droids/trellis-implement.md +94 -0
- package/dist/templates/droid/droids/trellis-research.md +137 -0
- package/dist/templates/droid/index.d.ts +7 -19
- package/dist/templates/droid/index.d.ts.map +1 -1
- package/dist/templates/droid/index.js +7 -39
- package/dist/templates/droid/index.js.map +1 -1
- package/dist/templates/droid/settings.json +59 -0
- package/dist/templates/extract.d.ts +7 -193
- package/dist/templates/extract.d.ts.map +1 -1
- package/dist/templates/extract.js +7 -310
- package/dist/templates/extract.js.map +1 -1
- package/dist/templates/gemini/agents/trellis-check.md +94 -0
- package/dist/templates/gemini/agents/trellis-implement.md +94 -0
- package/dist/templates/gemini/agents/trellis-research.md +137 -0
- package/dist/templates/gemini/index.d.ts +6 -14
- package/dist/templates/gemini/index.d.ts.map +1 -1
- package/dist/templates/gemini/index.js +6 -37
- package/dist/templates/gemini/index.js.map +1 -1
- package/dist/templates/gemini/settings.json +28 -0
- package/dist/templates/kiro/agents/trellis-check.json +13 -0
- package/dist/templates/kiro/agents/trellis-implement.json +13 -0
- package/dist/templates/kiro/agents/trellis-research.json +21 -0
- package/dist/templates/kiro/index.d.ts +11 -11
- package/dist/templates/kiro/index.d.ts.map +1 -1
- package/dist/templates/kiro/index.js +11 -33
- package/dist/templates/kiro/index.js.map +1 -1
- package/dist/templates/opencode/agents/{check.md → trellis-check.md} +3 -30
- package/dist/templates/opencode/agents/{implement.md → trellis-implement.md} +1 -1
- package/dist/templates/opencode/agents/{research.md → trellis-research.md} +1 -2
- package/dist/templates/opencode/plugins/inject-subagent-context.js +18 -190
- package/dist/templates/opencode/plugins/inject-workflow-state.js +172 -0
- package/dist/templates/opencode/plugins/session-start.js +76 -39
- package/dist/templates/qoder/agents/trellis-check.md +94 -0
- package/dist/templates/qoder/agents/trellis-implement.md +94 -0
- package/dist/templates/qoder/agents/trellis-research.md +137 -0
- package/dist/templates/qoder/index.d.ts +7 -10
- package/dist/templates/qoder/index.d.ts.map +1 -1
- package/dist/templates/qoder/index.js +7 -32
- package/dist/templates/qoder/index.js.map +1 -1
- package/dist/templates/qoder/settings.json +47 -0
- package/dist/templates/shared-hooks/index.d.ts +19 -0
- package/dist/templates/shared-hooks/index.d.ts.map +1 -0
- package/dist/templates/shared-hooks/index.js +30 -0
- package/dist/templates/shared-hooks/index.js.map +1 -0
- package/dist/templates/{iflow/hooks → shared-hooks}/inject-subagent-context.py +77 -266
- package/dist/templates/shared-hooks/inject-workflow-state.py +244 -0
- package/dist/templates/{claude/hooks → shared-hooks}/session-start.py +172 -55
- 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 +6 -0
- package/dist/templates/trellis/index.d.ts +1 -15
- package/dist/templates/trellis/index.d.ts.map +1 -1
- package/dist/templates/trellis/index.js +2 -29
- package/dist/templates/trellis/index.js.map +1 -1
- package/dist/templates/trellis/scripts/common/cli_adapter.py +31 -8
- package/dist/templates/trellis/scripts/common/config.py +126 -1
- package/dist/templates/trellis/scripts/common/git_context.py +25 -2
- package/dist/templates/trellis/scripts/common/task_context.py +23 -28
- package/dist/templates/trellis/scripts/common/task_store.py +0 -12
- package/dist/templates/trellis/scripts/common/types.py +0 -2
- package/dist/templates/trellis/scripts/common/workflow_phase.py +176 -0
- package/dist/templates/trellis/scripts/task.py +13 -35
- package/dist/templates/trellis/workflow.md +283 -298
- package/dist/types/ai-tools.d.ts +30 -3
- package/dist/types/ai-tools.d.ts.map +1 -1
- package/dist/types/ai-tools.js +119 -15
- package/dist/types/ai-tools.js.map +1 -1
- package/dist/types/migration.d.ts +8 -1
- package/dist/types/migration.d.ts.map +1 -1
- package/dist/utils/project-detector.d.ts +2 -0
- package/dist/utils/project-detector.d.ts.map +1 -1
- package/dist/utils/project-detector.js +120 -11
- package/dist/utils/project-detector.js.map +1 -1
- package/dist/utils/task-json.d.ts +46 -0
- package/dist/utils/task-json.d.ts.map +1 -0
- package/dist/utils/task-json.js +49 -0
- package/dist/utils/task-json.js.map +1 -0
- package/package.json +3 -2
- package/dist/configurators/iflow.d.ts +0 -33
- package/dist/configurators/iflow.d.ts.map +0 -1
- package/dist/configurators/iflow.js +0 -99
- package/dist/configurators/iflow.js.map +0 -1
- package/dist/templates/antigravity/index.d.ts +0 -12
- package/dist/templates/antigravity/index.d.ts.map +0 -1
- package/dist/templates/antigravity/index.js +0 -29
- package/dist/templates/antigravity/index.js.map +0 -1
- package/dist/templates/claude/agents/debug.md +0 -106
- package/dist/templates/claude/agents/dispatch.md +0 -213
- package/dist/templates/claude/agents/plan.md +0 -396
- package/dist/templates/claude/agents/research.md +0 -120
- package/dist/templates/claude/commands/trellis/brainstorm.md +0 -487
- package/dist/templates/claude/commands/trellis/break-loop.md +0 -125
- package/dist/templates/claude/commands/trellis/check-cross-layer.md +0 -153
- package/dist/templates/claude/commands/trellis/check.md +0 -25
- package/dist/templates/claude/commands/trellis/create-command.md +0 -154
- package/dist/templates/claude/commands/trellis/finish-work.md +0 -153
- package/dist/templates/claude/commands/trellis/integrate-skill.md +0 -219
- package/dist/templates/claude/commands/trellis/onboard.md +0 -358
- package/dist/templates/claude/commands/trellis/parallel.md +0 -192
- package/dist/templates/claude/commands/trellis/record-session.md +0 -62
- package/dist/templates/claude/commands/trellis/start.md +0 -393
- package/dist/templates/claude/commands/trellis/update-spec.md +0 -354
- package/dist/templates/claude/hooks/inject-subagent-context.py +0 -803
- package/dist/templates/claude/hooks/ralph-loop.py +0 -396
- package/dist/templates/codebuddy/commands/trellis/before-dev.md +0 -29
- package/dist/templates/codebuddy/commands/trellis/brainstorm.md +0 -487
- package/dist/templates/codebuddy/commands/trellis/break-loop.md +0 -107
- package/dist/templates/codebuddy/commands/trellis/check-cross-layer.md +0 -153
- package/dist/templates/codebuddy/commands/trellis/check.md +0 -25
- package/dist/templates/codebuddy/commands/trellis/create-command.md +0 -154
- package/dist/templates/codebuddy/commands/trellis/finish-work.md +0 -143
- package/dist/templates/codebuddy/commands/trellis/integrate-skill.md +0 -219
- package/dist/templates/codebuddy/commands/trellis/onboard.md +0 -358
- package/dist/templates/codebuddy/commands/trellis/record-session.md +0 -61
- package/dist/templates/codebuddy/commands/trellis/start.md +0 -373
- package/dist/templates/codex/agents/check.toml +0 -23
- package/dist/templates/codex/agents/research.toml +0 -26
- package/dist/templates/codex/codex-skills/parallel/SKILL.md +0 -194
- package/dist/templates/cursor/commands/trellis-before-dev.md +0 -29
- package/dist/templates/cursor/commands/trellis-brainstorm.md +0 -487
- package/dist/templates/cursor/commands/trellis-break-loop.md +0 -107
- package/dist/templates/cursor/commands/trellis-check-cross-layer.md +0 -153
- package/dist/templates/cursor/commands/trellis-check.md +0 -25
- package/dist/templates/cursor/commands/trellis-create-command.md +0 -154
- package/dist/templates/cursor/commands/trellis-finish-work.md +0 -143
- package/dist/templates/cursor/commands/trellis-integrate-skill.md +0 -219
- package/dist/templates/cursor/commands/trellis-onboard.md +0 -358
- package/dist/templates/cursor/commands/trellis-record-session.md +0 -62
- package/dist/templates/cursor/commands/trellis-start.md +0 -373
- package/dist/templates/cursor/commands/trellis-update-spec.md +0 -354
- package/dist/templates/droid/commands/trellis/before-dev.md +0 -33
- package/dist/templates/droid/commands/trellis/break-loop.md +0 -111
- package/dist/templates/droid/commands/trellis/check-cross-layer.md +0 -157
- package/dist/templates/droid/commands/trellis/check.md +0 -29
- package/dist/templates/droid/commands/trellis/create-command.md +0 -158
- package/dist/templates/droid/commands/trellis/finish-work.md +0 -147
- package/dist/templates/droid/commands/trellis/integrate-skill.md +0 -223
- package/dist/templates/droid/commands/trellis/onboard.md +0 -362
- package/dist/templates/droid/commands/trellis/record-session.md +0 -66
- package/dist/templates/droid/commands/trellis/start.md +0 -377
- package/dist/templates/droid/commands/trellis/update-spec.md +0 -358
- package/dist/templates/gemini/commands/trellis/before-dev.toml +0 -33
- package/dist/templates/gemini/commands/trellis/brainstorm.toml +0 -435
- package/dist/templates/gemini/commands/trellis/break-loop.toml +0 -129
- package/dist/templates/gemini/commands/trellis/check-cross-layer.toml +0 -147
- package/dist/templates/gemini/commands/trellis/check.toml +0 -29
- package/dist/templates/gemini/commands/trellis/create-command.toml +0 -119
- package/dist/templates/gemini/commands/trellis/finish-work.toml +0 -133
- package/dist/templates/gemini/commands/trellis/integrate-skill.toml +0 -104
- package/dist/templates/gemini/commands/trellis/onboard.toml +0 -111
- package/dist/templates/gemini/commands/trellis/record-session.toml +0 -66
- package/dist/templates/gemini/commands/trellis/start.toml +0 -354
- package/dist/templates/gemini/commands/trellis/update-spec.toml +0 -132
- package/dist/templates/iflow/agents/debug.md +0 -106
- package/dist/templates/iflow/agents/dispatch.md +0 -213
- package/dist/templates/iflow/agents/plan.md +0 -396
- package/dist/templates/iflow/agents/research.md +0 -120
- package/dist/templates/iflow/commands/trellis/before-dev.md +0 -29
- package/dist/templates/iflow/commands/trellis/brainstorm.md +0 -487
- package/dist/templates/iflow/commands/trellis/check-cross-layer.md +0 -153
- package/dist/templates/iflow/commands/trellis/check.md +0 -25
- package/dist/templates/iflow/commands/trellis/create-command.md +0 -152
- package/dist/templates/iflow/commands/trellis/finish-work.md +0 -153
- package/dist/templates/iflow/commands/trellis/integrate-skill.md +0 -219
- package/dist/templates/iflow/commands/trellis/onboard.md +0 -358
- package/dist/templates/iflow/commands/trellis/parallel.md +0 -192
- package/dist/templates/iflow/commands/trellis/record-session.md +0 -62
- package/dist/templates/iflow/commands/trellis/start.md +0 -393
- package/dist/templates/iflow/commands/trellis/update-spec.md +0 -354
- package/dist/templates/iflow/hooks/ralph-loop.py +0 -395
- package/dist/templates/iflow/hooks/session-start.py +0 -403
- package/dist/templates/iflow/index.d.ts +0 -54
- package/dist/templates/iflow/index.d.ts.map +0 -1
- package/dist/templates/iflow/index.js +0 -85
- package/dist/templates/iflow/index.js.map +0 -1
- package/dist/templates/iflow/settings.json +0 -60
- package/dist/templates/kilo/index.d.ts +0 -16
- package/dist/templates/kilo/index.d.ts.map +0 -1
- package/dist/templates/kilo/index.js +0 -39
- package/dist/templates/kilo/index.js.map +0 -1
- package/dist/templates/kilo/workflows/before-dev.md +0 -29
- package/dist/templates/kilo/workflows/brainstorm.md +0 -487
- package/dist/templates/kilo/workflows/break-loop.md +0 -125
- package/dist/templates/kilo/workflows/check-cross-layer.md +0 -153
- package/dist/templates/kilo/workflows/check.md +0 -25
- package/dist/templates/kilo/workflows/create-command.md +0 -152
- package/dist/templates/kilo/workflows/finish-work.md +0 -129
- package/dist/templates/kilo/workflows/integrate-skill.md +0 -219
- package/dist/templates/kilo/workflows/onboard.md +0 -358
- package/dist/templates/kilo/workflows/parallel.md +0 -193
- package/dist/templates/kilo/workflows/record-session.md +0 -62
- package/dist/templates/kilo/workflows/start.md +0 -387
- package/dist/templates/kilo/workflows/update-spec.md +0 -285
- package/dist/templates/kiro/skills/before-dev/SKILL.md +0 -34
- package/dist/templates/kiro/skills/brainstorm/SKILL.md +0 -492
- package/dist/templates/kiro/skills/break-loop/SKILL.md +0 -130
- package/dist/templates/kiro/skills/check/SKILL.md +0 -30
- package/dist/templates/kiro/skills/check-cross-layer/SKILL.md +0 -158
- package/dist/templates/kiro/skills/create-command/SKILL.md +0 -101
- package/dist/templates/kiro/skills/finish-work/SKILL.md +0 -148
- package/dist/templates/kiro/skills/integrate-skill/SKILL.md +0 -221
- package/dist/templates/kiro/skills/onboard/SKILL.md +0 -363
- package/dist/templates/kiro/skills/record-session/SKILL.md +0 -67
- package/dist/templates/kiro/skills/start/SKILL.md +0 -351
- package/dist/templates/kiro/skills/update-spec/SKILL.md +0 -335
- package/dist/templates/markdown/spec/backend/directory-structure.md +0 -292
- package/dist/templates/markdown/spec/backend/index.md +0 -40
- package/dist/templates/markdown/spec/backend/script-conventions.md +0 -742
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md +0 -118
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md +0 -394
- package/dist/templates/opencode/agents/debug.md +0 -129
- package/dist/templates/opencode/agents/dispatch.md +0 -223
- package/dist/templates/opencode/agents/trellis-plan.md +0 -427
- package/dist/templates/opencode/commands/trellis/before-dev.md +0 -29
- package/dist/templates/opencode/commands/trellis/brainstorm.md +0 -487
- package/dist/templates/opencode/commands/trellis/break-loop.md +0 -125
- package/dist/templates/opencode/commands/trellis/check-cross-layer.md +0 -153
- package/dist/templates/opencode/commands/trellis/check.md +0 -25
- package/dist/templates/opencode/commands/trellis/create-command.md +0 -154
- package/dist/templates/opencode/commands/trellis/finish-work.md +0 -144
- package/dist/templates/opencode/commands/trellis/integrate-skill.md +0 -219
- package/dist/templates/opencode/commands/trellis/migrate-specs.md +0 -0
- package/dist/templates/opencode/commands/trellis/onboard.md +0 -358
- package/dist/templates/opencode/commands/trellis/parallel.md +0 -193
- package/dist/templates/opencode/commands/trellis/record-session.md +0 -62
- package/dist/templates/opencode/commands/trellis/start.md +0 -351
- package/dist/templates/opencode/commands/trellis/update-spec.md +0 -354
- package/dist/templates/qoder/skills/before-dev/SKILL.md +0 -34
- package/dist/templates/qoder/skills/brainstorm/SKILL.md +0 -492
- package/dist/templates/qoder/skills/break-loop/SKILL.md +0 -130
- package/dist/templates/qoder/skills/check/SKILL.md +0 -30
- package/dist/templates/qoder/skills/check-cross-layer/SKILL.md +0 -158
- package/dist/templates/qoder/skills/create-command/SKILL.md +0 -101
- package/dist/templates/qoder/skills/finish-work/SKILL.md +0 -134
- package/dist/templates/qoder/skills/integrate-skill/SKILL.md +0 -221
- package/dist/templates/qoder/skills/onboard/SKILL.md +0 -363
- package/dist/templates/qoder/skills/record-session/SKILL.md +0 -67
- package/dist/templates/qoder/skills/start/SKILL.md +0 -388
- package/dist/templates/qoder/skills/update-spec/SKILL.md +0 -290
- package/dist/templates/trellis/scripts/common/phase.py +0 -254
- package/dist/templates/trellis/scripts/common/registry.py +0 -335
- package/dist/templates/trellis/scripts/common/worktree.py +0 -305
- package/dist/templates/trellis/scripts/create_bootstrap.py +0 -298
- package/dist/templates/trellis/scripts/multi_agent/__init__.py +0 -5
- package/dist/templates/trellis/scripts/multi_agent/_bootstrap.py +0 -17
- package/dist/templates/trellis/scripts/multi_agent/cleanup.py +0 -398
- package/dist/templates/trellis/scripts/multi_agent/create_pr.py +0 -620
- package/dist/templates/trellis/scripts/multi_agent/plan.py +0 -213
- package/dist/templates/trellis/scripts/multi_agent/start.py +0 -539
- package/dist/templates/trellis/scripts/multi_agent/status.py +0 -76
- package/dist/templates/trellis/scripts/multi_agent/status_display.py +0 -542
- package/dist/templates/trellis/scripts/multi_agent/status_monitor.py +0 -225
- package/dist/templates/trellis/scripts-shell-archive/add-session.sh +0 -384
- package/dist/templates/trellis/scripts-shell-archive/common/developer.sh +0 -129
- package/dist/templates/trellis/scripts-shell-archive/common/git-context.sh +0 -263
- package/dist/templates/trellis/scripts-shell-archive/common/paths.sh +0 -208
- package/dist/templates/trellis/scripts-shell-archive/common/phase.sh +0 -150
- package/dist/templates/trellis/scripts-shell-archive/common/registry.sh +0 -247
- package/dist/templates/trellis/scripts-shell-archive/common/task-queue.sh +0 -142
- package/dist/templates/trellis/scripts-shell-archive/common/task-utils.sh +0 -151
- package/dist/templates/trellis/scripts-shell-archive/common/worktree.sh +0 -128
- package/dist/templates/trellis/scripts-shell-archive/create-bootstrap.sh +0 -299
- package/dist/templates/trellis/scripts-shell-archive/get-context.sh +0 -7
- package/dist/templates/trellis/scripts-shell-archive/get-developer.sh +0 -15
- package/dist/templates/trellis/scripts-shell-archive/init-developer.sh +0 -34
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/cleanup.sh +0 -396
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/create-pr.sh +0 -241
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/plan.sh +0 -207
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/start.sh +0 -317
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/status.sh +0 -828
- package/dist/templates/trellis/scripts-shell-archive/task.sh +0 -1204
- package/dist/templates/trellis/worktree.yaml +0 -47
- package/dist/templates/windsurf/index.d.ts +0 -21
- package/dist/templates/windsurf/index.d.ts.map +0 -1
- package/dist/templates/windsurf/index.js +0 -44
- package/dist/templates/windsurf/index.js.map +0 -1
- package/dist/templates/windsurf/workflows/trellis-before-dev.md +0 -31
- package/dist/templates/windsurf/workflows/trellis-brainstorm.md +0 -491
- package/dist/templates/windsurf/workflows/trellis-break-loop.md +0 -111
- package/dist/templates/windsurf/workflows/trellis-check-cross-layer.md +0 -157
- package/dist/templates/windsurf/workflows/trellis-check.md +0 -27
- package/dist/templates/windsurf/workflows/trellis-create-command.md +0 -154
- package/dist/templates/windsurf/workflows/trellis-finish-work.md +0 -147
- package/dist/templates/windsurf/workflows/trellis-integrate-skill.md +0 -220
- package/dist/templates/windsurf/workflows/trellis-onboard.md +0 -362
- package/dist/templates/windsurf/workflows/trellis-record-session.md +0 -66
- package/dist/templates/windsurf/workflows/trellis-start.md +0 -373
- package/dist/templates/windsurf/workflows/trellis-update-spec.md +0 -358
- /package/dist/templates/{claude/commands/trellis → common/skills}/before-dev.md +0 -0
- /package/dist/templates/{claude/hooks → shared-hooks}/statusline.py +0 -0
|
@@ -22,7 +22,7 @@ You are the Implement Agent in the Trellis workflow.
|
|
|
22
22
|
Otherwise, load context yourself:
|
|
23
23
|
|
|
24
24
|
1. Read `.trellis/.current-task` → get task directory (e.g., `.trellis/tasks/xxx`)
|
|
25
|
-
2. Read `{task_dir}/implement.jsonl`
|
|
25
|
+
2. Read `{task_dir}/implement.jsonl`
|
|
26
26
|
3. For each entry in JSONL:
|
|
27
27
|
- If `path` is a file → Read it
|
|
28
28
|
- If `path` is a directory → Read all `.md` files in it
|
|
@@ -23,8 +23,7 @@ You are the Research Agent in the Trellis workflow.
|
|
|
23
23
|
Otherwise, if task-specific research is needed:
|
|
24
24
|
|
|
25
25
|
1. Read `.trellis/.current-task` → get task directory (if exists)
|
|
26
|
-
2.
|
|
27
|
-
3. For each entry in JSONL:
|
|
26
|
+
2. For each entry in JSONL (if task dir exists):
|
|
28
27
|
- If `path` is a file → Read it
|
|
29
28
|
- If `path` is a directory → Read all `.md` files in it
|
|
30
29
|
|
|
@@ -5,60 +5,13 @@
|
|
|
5
5
|
* Uses OpenCode's tool.execute.before hook.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { existsSync,
|
|
8
|
+
import { existsSync, readdirSync } from "fs"
|
|
9
9
|
import { join } from "path"
|
|
10
10
|
import { TrellisContext, debugLog } from "../lib/trellis-context.js"
|
|
11
11
|
|
|
12
12
|
// Supported subagent types
|
|
13
|
-
const AGENTS_ALL = ["implement", "check", "
|
|
14
|
-
const AGENTS_REQUIRE_TASK = ["implement", "check"
|
|
15
|
-
// Agents that don't update phase (can be called at any time)
|
|
16
|
-
const AGENTS_NO_PHASE_UPDATE = ["debug", "research"]
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Update current_phase in task.json based on subagent_type
|
|
20
|
-
*/
|
|
21
|
-
function updateCurrentPhase(ctx, taskDir, subagentType) {
|
|
22
|
-
if (AGENTS_NO_PHASE_UPDATE.includes(subagentType)) {
|
|
23
|
-
return
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const taskJsonPath = join(ctx.directory, taskDir, "task.json")
|
|
27
|
-
const content = ctx.readFile(taskJsonPath)
|
|
28
|
-
if (!content) return
|
|
29
|
-
|
|
30
|
-
try {
|
|
31
|
-
const taskData = JSON.parse(content)
|
|
32
|
-
const currentPhase = taskData.current_phase || 0
|
|
33
|
-
const nextActions = taskData.next_action || []
|
|
34
|
-
|
|
35
|
-
const actionToAgent = {
|
|
36
|
-
"implement": "implement",
|
|
37
|
-
"check": "check",
|
|
38
|
-
"finish": "check"
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
let newPhase = null
|
|
42
|
-
for (const action of nextActions) {
|
|
43
|
-
const phaseNum = action.phase || 0
|
|
44
|
-
const actionName = action.action || ""
|
|
45
|
-
const expectedAgent = actionToAgent[actionName]
|
|
46
|
-
|
|
47
|
-
if (phaseNum > currentPhase && expectedAgent === subagentType) {
|
|
48
|
-
newPhase = phaseNum
|
|
49
|
-
break
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (newPhase !== null) {
|
|
54
|
-
taskData.current_phase = newPhase
|
|
55
|
-
writeFileSync(taskJsonPath, JSON.stringify(taskData, null, 2))
|
|
56
|
-
debugLog("inject", "Updated current_phase to:", newPhase)
|
|
57
|
-
}
|
|
58
|
-
} catch (e) {
|
|
59
|
-
debugLog("inject", "Error updating phase:", e.message)
|
|
60
|
-
}
|
|
61
|
-
}
|
|
13
|
+
const AGENTS_ALL = ["implement", "check", "research"]
|
|
14
|
+
const AGENTS_REQUIRE_TASK = ["implement", "check"]
|
|
62
15
|
|
|
63
16
|
/**
|
|
64
17
|
* Get context for implement agent
|
|
@@ -66,14 +19,8 @@ function updateCurrentPhase(ctx, taskDir, subagentType) {
|
|
|
66
19
|
function getImplementContext(ctx, taskDir) {
|
|
67
20
|
const parts = []
|
|
68
21
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if (entries.length === 0) {
|
|
73
|
-
jsonlPath = join(ctx.directory, taskDir, "spec.jsonl")
|
|
74
|
-
entries = ctx.readJsonlWithFiles(jsonlPath)
|
|
75
|
-
}
|
|
76
|
-
|
|
22
|
+
const jsonlPath = join(ctx.directory, taskDir, "implement.jsonl")
|
|
23
|
+
const entries = ctx.readJsonlWithFiles(jsonlPath)
|
|
77
24
|
if (entries.length > 0) {
|
|
78
25
|
parts.push(ctx.buildContextFromEntries(entries))
|
|
79
26
|
}
|
|
@@ -99,32 +46,13 @@ function getCheckContext(ctx, taskDir) {
|
|
|
99
46
|
|
|
100
47
|
const jsonlPath = join(ctx.directory, taskDir, "check.jsonl")
|
|
101
48
|
const entries = ctx.readJsonlWithFiles(jsonlPath)
|
|
102
|
-
|
|
103
49
|
if (entries.length > 0) {
|
|
104
50
|
parts.push(ctx.buildContextFromEntries(entries))
|
|
105
|
-
} else {
|
|
106
|
-
const checkFiles = [
|
|
107
|
-
[".opencode/commands/trellis/finish-work.md", "Finish work checklist"],
|
|
108
|
-
[".opencode/commands/trellis/check-cross-layer.md", "Cross-layer check spec"],
|
|
109
|
-
[".opencode/commands/trellis/check.md", "Check spec"],
|
|
110
|
-
]
|
|
111
|
-
for (const [f, description] of checkFiles) {
|
|
112
|
-
const content = ctx.readProjectFile(f)
|
|
113
|
-
if (content) {
|
|
114
|
-
parts.push(`=== ${f} (${description}) ===\n${content}`)
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const specJsonlPath = join(ctx.directory, taskDir, "spec.jsonl")
|
|
119
|
-
const specEntries = ctx.readJsonlWithFiles(specJsonlPath)
|
|
120
|
-
for (const entry of specEntries) {
|
|
121
|
-
parts.push(`=== ${entry.path} (Dev spec) ===\n${entry.content}`)
|
|
122
|
-
}
|
|
123
51
|
}
|
|
124
52
|
|
|
125
53
|
const prd = ctx.readProjectFile(join(taskDir, "prd.md"))
|
|
126
54
|
if (prd) {
|
|
127
|
-
parts.push(`=== ${taskDir}/prd.md (Requirements
|
|
55
|
+
parts.push(`=== ${taskDir}/prd.md (Requirements) ===\n${prd}`)
|
|
128
56
|
}
|
|
129
57
|
|
|
130
58
|
return parts.join("\n\n")
|
|
@@ -134,75 +62,15 @@ function getCheckContext(ctx, taskDir) {
|
|
|
134
62
|
* Get context for finish phase (final check before PR)
|
|
135
63
|
*/
|
|
136
64
|
function getFinishContext(ctx, taskDir) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const jsonlPath = join(ctx.directory, taskDir, "finish.jsonl")
|
|
140
|
-
const entries = ctx.readJsonlWithFiles(jsonlPath)
|
|
141
|
-
|
|
142
|
-
if (entries.length > 0) {
|
|
143
|
-
parts.push(ctx.buildContextFromEntries(entries))
|
|
144
|
-
} else {
|
|
145
|
-
const finishWork = ctx.readProjectFile(".opencode/commands/trellis/finish-work.md")
|
|
146
|
-
if (finishWork) {
|
|
147
|
-
parts.push(`=== .opencode/commands/trellis/finish-work.md (Finish checklist) ===\n${finishWork}`)
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const updateSpec = ctx.readProjectFile(".opencode/commands/trellis/update-spec.md")
|
|
152
|
-
if (updateSpec) {
|
|
153
|
-
parts.push(`=== .opencode/commands/trellis/update-spec.md (Spec update process) ===\n${updateSpec}`)
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
const prd = ctx.readProjectFile(join(taskDir, "prd.md"))
|
|
157
|
-
if (prd) {
|
|
158
|
-
parts.push(`=== ${taskDir}/prd.md (Requirements - verify all met) ===\n${prd}`)
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
return parts.join("\n\n")
|
|
65
|
+
// Finish reuses check context (same JSONL source)
|
|
66
|
+
return getCheckContext(ctx, taskDir)
|
|
162
67
|
}
|
|
163
68
|
|
|
164
|
-
/**
|
|
165
|
-
* Get context for debug agent
|
|
166
|
-
*/
|
|
167
|
-
function getDebugContext(ctx, taskDir) {
|
|
168
|
-
const parts = []
|
|
169
|
-
|
|
170
|
-
const jsonlPath = join(ctx.directory, taskDir, "debug.jsonl")
|
|
171
|
-
const entries = ctx.readJsonlWithFiles(jsonlPath)
|
|
172
|
-
|
|
173
|
-
if (entries.length > 0) {
|
|
174
|
-
parts.push(ctx.buildContextFromEntries(entries))
|
|
175
|
-
} else {
|
|
176
|
-
const specJsonlPath = join(ctx.directory, taskDir, "spec.jsonl")
|
|
177
|
-
const specEntries = ctx.readJsonlWithFiles(specJsonlPath)
|
|
178
|
-
for (const entry of specEntries) {
|
|
179
|
-
parts.push(`=== ${entry.path} (Dev spec) ===\n${entry.content}`)
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
const checkFiles = [
|
|
183
|
-
[".opencode/commands/trellis/check.md", "Check spec"],
|
|
184
|
-
[".opencode/commands/trellis/check-cross-layer.md", "Cross-layer check spec"],
|
|
185
|
-
]
|
|
186
|
-
for (const [f, description] of checkFiles) {
|
|
187
|
-
const content = ctx.readProjectFile(f)
|
|
188
|
-
if (content) {
|
|
189
|
-
parts.push(`=== ${f} (${description}) ===\n${content}`)
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
const codex = ctx.readProjectFile(join(taskDir, "codex-review-output.txt"))
|
|
195
|
-
if (codex) {
|
|
196
|
-
parts.push(`=== ${taskDir}/codex-review-output.txt (Codex Review Results) ===\n${codex}`)
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
return parts.join("\n\n")
|
|
200
|
-
}
|
|
201
69
|
|
|
202
70
|
/**
|
|
203
71
|
* Get context for research agent
|
|
204
72
|
*/
|
|
205
|
-
function getResearchContext(ctx
|
|
73
|
+
function getResearchContext(ctx) {
|
|
206
74
|
const parts = []
|
|
207
75
|
|
|
208
76
|
// Dynamic project structure (scan actual spec directory)
|
|
@@ -251,15 +119,6 @@ function getResearchContext(ctx, taskDir) {
|
|
|
251
119
|
- Code search: Use Glob and Grep tools
|
|
252
120
|
- Tech solutions: Use mcp__exa__web_search_exa or mcp__exa__get_code_context_exa`)
|
|
253
121
|
|
|
254
|
-
if (taskDir) {
|
|
255
|
-
const jsonlPath = join(ctx.directory, taskDir, "research.jsonl")
|
|
256
|
-
const researchEntries = ctx.readJsonlWithFiles(jsonlPath)
|
|
257
|
-
if (researchEntries.length > 0) {
|
|
258
|
-
parts.push("\n## Additional Search Context\n")
|
|
259
|
-
parts.push(ctx.buildContextFromEntries(researchEntries))
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
122
|
return parts.join("\n\n")
|
|
264
123
|
}
|
|
265
124
|
|
|
@@ -359,34 +218,6 @@ ${originalPrompt}
|
|
|
359
218
|
- Fix issues yourself, don't just report
|
|
360
219
|
- Must execute complete checklist`,
|
|
361
220
|
|
|
362
|
-
debug: `# Debug Agent Task
|
|
363
|
-
|
|
364
|
-
You are the Debug Agent in the Multi-Agent Pipeline.
|
|
365
|
-
|
|
366
|
-
## Your Context
|
|
367
|
-
|
|
368
|
-
${context}
|
|
369
|
-
|
|
370
|
-
---
|
|
371
|
-
|
|
372
|
-
## Your Task
|
|
373
|
-
|
|
374
|
-
${originalPrompt}
|
|
375
|
-
|
|
376
|
-
---
|
|
377
|
-
|
|
378
|
-
## Workflow
|
|
379
|
-
|
|
380
|
-
1. **Understand issues** - Analyze issues pointed out
|
|
381
|
-
2. **Locate code** - Find positions that need fixing
|
|
382
|
-
3. **Fix against specs** - Fix following dev specs
|
|
383
|
-
4. **Verify fixes** - Run typecheck
|
|
384
|
-
|
|
385
|
-
## Important Constraints
|
|
386
|
-
|
|
387
|
-
- Do NOT execute git commit
|
|
388
|
-
- Run typecheck after each fix`,
|
|
389
|
-
|
|
390
221
|
research: `# Research Agent Task
|
|
391
222
|
|
|
392
223
|
You are the Research Agent in the Multi-Agent Pipeline.
|
|
@@ -424,13 +255,16 @@ ${originalPrompt}
|
|
|
424
255
|
return templates[agentType] || originalPrompt
|
|
425
256
|
}
|
|
426
257
|
|
|
427
|
-
export default
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
258
|
+
// OpenCode plugin factory: `export default async (input) => hooks`.
|
|
259
|
+
// OpenCode 1.2.x iterates every module export and invokes it as a function
|
|
260
|
+
// (packages/opencode/src/plugin/index.ts — `for ([_, fn] of Object.entries(mod)) await fn(input)`);
|
|
261
|
+
// the previous `{ id, server }` object shape failed with
|
|
262
|
+
// `TypeError: fn is not a function` in 1.2.x.
|
|
263
|
+
export default async ({ directory }) => {
|
|
264
|
+
const ctx = new TrellisContext(directory)
|
|
265
|
+
debugLog("inject", "Plugin loaded, directory:", directory)
|
|
432
266
|
|
|
433
|
-
|
|
267
|
+
return {
|
|
434
268
|
"tool.execute.before": async (input, output) => {
|
|
435
269
|
try {
|
|
436
270
|
debugLog("inject", "tool.execute.before called, tool:", input?.tool)
|
|
@@ -467,8 +301,6 @@ export default {
|
|
|
467
301
|
debugLog("inject", "Skipping - task directory not found")
|
|
468
302
|
return
|
|
469
303
|
}
|
|
470
|
-
|
|
471
|
-
updateCurrentPhase(ctx, taskDir, subagentType)
|
|
472
304
|
}
|
|
473
305
|
|
|
474
306
|
// Check for [finish] marker
|
|
@@ -485,9 +317,6 @@ export default {
|
|
|
485
317
|
? getFinishContext(ctx, taskDir)
|
|
486
318
|
: getCheckContext(ctx, taskDir)
|
|
487
319
|
break
|
|
488
|
-
case "debug":
|
|
489
|
-
context = getDebugContext(ctx, taskDir)
|
|
490
|
-
break
|
|
491
320
|
case "research":
|
|
492
321
|
context = getResearchContext(ctx, taskDir)
|
|
493
322
|
break
|
|
@@ -511,5 +340,4 @@ export default {
|
|
|
511
340
|
}
|
|
512
341
|
}
|
|
513
342
|
}
|
|
514
|
-
}
|
|
515
343
|
}
|
|
@@ -0,0 +1,172 @@
|
|
|
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 active
|
|
9
|
+
* and its expected flow. Breadcrumb text is pulled from the project's
|
|
10
|
+
* workflow.md [workflow-state:STATUS] tag blocks (single source of
|
|
11
|
+
* truth for users who fork the Trellis workflow), with hardcoded
|
|
12
|
+
* fallbacks so the hook never breaks when workflow.md is missing or
|
|
13
|
+
* malformed.
|
|
14
|
+
*
|
|
15
|
+
* Unlike session-start, this plugin does NOT dedupe — breadcrumb
|
|
16
|
+
* should surface on every turn so long conversations don't drift.
|
|
17
|
+
*
|
|
18
|
+
* Silently skips when:
|
|
19
|
+
* - No .trellis/ directory
|
|
20
|
+
* - No active task (.trellis/.current-task missing or stale)
|
|
21
|
+
* - task.json malformed or missing status
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { existsSync, readFileSync } from "fs"
|
|
25
|
+
import { join } from "path"
|
|
26
|
+
import { TrellisContext, debugLog } from "../lib/trellis-context.js"
|
|
27
|
+
|
|
28
|
+
// Supports STATUS values with letters, digits, underscores, hyphens
|
|
29
|
+
// (so "in-review" / "blocked-by-team" work alongside "in_progress").
|
|
30
|
+
const TAG_RE = /\[workflow-state:([A-Za-z0-9_-]+)\]\s*\n([\s\S]*?)\n\s*\[\/workflow-state:\1\]/g
|
|
31
|
+
|
|
32
|
+
// Hardcoded defaults for built-in Trellis statuses. Used when workflow.md
|
|
33
|
+
// is missing, malformed, or lacks the tag for this status.
|
|
34
|
+
//
|
|
35
|
+
// `no_task` is a pseudo-status emitted when .current-task is missing — keeps
|
|
36
|
+
// the Next-Action reminder flowing per-turn even without an active task.
|
|
37
|
+
const FALLBACK_BREADCRUMBS = {
|
|
38
|
+
no_task:
|
|
39
|
+
"No active task.\n" +
|
|
40
|
+
"Trigger words in the user message that REQUIRE creating a task " +
|
|
41
|
+
"(non-negotiable, do NOT self-exempt): 重构 / 抽成 / 独立 / 分发 / " +
|
|
42
|
+
"拆出来 / 搞一个 / 做成 / 接入 / 集成 / refactor / rewrite / extract / " +
|
|
43
|
+
"productize / publish / build X / design Y.\n" +
|
|
44
|
+
"Task is NOT required ONLY if ALL three hold: (a) zero file writes " +
|
|
45
|
+
"this turn, (b) answer fits in one reply with no multi-round plan, " +
|
|
46
|
+
"(c) no research beyond reading 1-2 repo files.\n" +
|
|
47
|
+
"When in doubt: create task. Over-tasking is cheap; under-tasking " +
|
|
48
|
+
"leaks plans and research into main context.\n" +
|
|
49
|
+
"Flow: load `trellis-brainstorm` skill → it creates the task via " +
|
|
50
|
+
"`python3 ./.trellis/scripts/task.py create` and drives requirements Q&A. " +
|
|
51
|
+
"For research-heavy work (tool comparison, docs, cross-platform survey), " +
|
|
52
|
+
"spawn `trellis-research` sub-agents via Task tool — NEVER do 3+ inline " +
|
|
53
|
+
"WebFetch/WebSearch/`gh api` calls in the main conversation.",
|
|
54
|
+
planning:
|
|
55
|
+
"Complete prd.md via trellis-brainstorm skill; then run task.py start.\n" +
|
|
56
|
+
"Research belongs in `{task_dir}/research/*.md`, written by " +
|
|
57
|
+
"`trellis-research` sub-agents. Do NOT inline WebFetch/WebSearch in " +
|
|
58
|
+
"main session — PRD only links to research files.",
|
|
59
|
+
in_progress:
|
|
60
|
+
"Flow: trellis-implement → trellis-check → trellis-update-spec → finish\n" +
|
|
61
|
+
"Check conversation history + git status to determine current step; do NOT skip trellis-check.",
|
|
62
|
+
completed:
|
|
63
|
+
"User commits changes; then run task.py archive.",
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Parse workflow.md for [workflow-state:STATUS] blocks.
|
|
68
|
+
* Returns {status: body}. Missing tags fall back to hardcoded defaults.
|
|
69
|
+
*/
|
|
70
|
+
function loadBreadcrumbs(directory) {
|
|
71
|
+
const result = { ...FALLBACK_BREADCRUMBS }
|
|
72
|
+
const workflowPath = join(directory, ".trellis", "workflow.md")
|
|
73
|
+
if (!existsSync(workflowPath)) return result
|
|
74
|
+
let content
|
|
75
|
+
try {
|
|
76
|
+
content = readFileSync(workflowPath, "utf-8")
|
|
77
|
+
} catch {
|
|
78
|
+
return result
|
|
79
|
+
}
|
|
80
|
+
for (const match of content.matchAll(TAG_RE)) {
|
|
81
|
+
const status = match[1]
|
|
82
|
+
const body = match[2].trim()
|
|
83
|
+
if (body) result[status] = body
|
|
84
|
+
}
|
|
85
|
+
return result
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Get (taskId, status) from active task, or null if no active task.
|
|
90
|
+
*/
|
|
91
|
+
function getActiveTask(ctx) {
|
|
92
|
+
const taskRef = ctx.getCurrentTask()
|
|
93
|
+
if (!taskRef) return null
|
|
94
|
+
const taskDir = ctx.resolveTaskDir(taskRef)
|
|
95
|
+
if (!taskDir || !existsSync(taskDir)) return null
|
|
96
|
+
const taskJsonPath = join(taskDir, "task.json")
|
|
97
|
+
if (!existsSync(taskJsonPath)) return null
|
|
98
|
+
try {
|
|
99
|
+
const data = JSON.parse(readFileSync(taskJsonPath, "utf-8"))
|
|
100
|
+
const status = typeof data.status === "string" ? data.status : ""
|
|
101
|
+
if (!status) return null
|
|
102
|
+
const id = data.id || taskRef.split("/").pop()
|
|
103
|
+
return { id, status }
|
|
104
|
+
} catch {
|
|
105
|
+
return null
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Build the <workflow-state>...</workflow-state> block.
|
|
111
|
+
* - Known status (templates or fallback) → detailed body
|
|
112
|
+
* - Unknown status → generic "refer to workflow.md"
|
|
113
|
+
* - no_task pseudo-status (id === null) → header omits task info
|
|
114
|
+
*/
|
|
115
|
+
function buildBreadcrumb(id, status, templates) {
|
|
116
|
+
let body = templates[status]
|
|
117
|
+
if (body === undefined) {
|
|
118
|
+
body = "Refer to workflow.md for current step."
|
|
119
|
+
}
|
|
120
|
+
const header = id === null ? `Status: ${status}` : `Task: ${id} (${status})`
|
|
121
|
+
return `<workflow-state>\n${header}\n${body}\n</workflow-state>`
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// OpenCode 1.2.x expects plugins to be factory functions (see inject-subagent-context.js comment).
|
|
125
|
+
export default async ({ directory }) => {
|
|
126
|
+
const ctx = new TrellisContext(directory)
|
|
127
|
+
debugLog("workflow-state", "Plugin loaded, directory:", directory)
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
// chat.message fires on every user message. Inject breadcrumb in-place
|
|
131
|
+
// so it persists in conversation history.
|
|
132
|
+
"chat.message": async (input, output) => {
|
|
133
|
+
try {
|
|
134
|
+
if (process.env.OPENCODE_NON_INTERACTIVE === "1") {
|
|
135
|
+
return
|
|
136
|
+
}
|
|
137
|
+
if (!ctx.isTrellisProject()) {
|
|
138
|
+
return
|
|
139
|
+
}
|
|
140
|
+
const templates = loadBreadcrumbs(directory)
|
|
141
|
+
const task = getActiveTask(ctx)
|
|
142
|
+
const breadcrumb = task
|
|
143
|
+
? buildBreadcrumb(task.id, task.status, templates)
|
|
144
|
+
: buildBreadcrumb(null, "no_task", templates)
|
|
145
|
+
|
|
146
|
+
const parts = output?.parts || []
|
|
147
|
+
const textPartIndex = parts.findIndex(
|
|
148
|
+
p => p.type === "text" && p.text !== undefined,
|
|
149
|
+
)
|
|
150
|
+
if (textPartIndex !== -1) {
|
|
151
|
+
const originalText = parts[textPartIndex].text || ""
|
|
152
|
+
parts[textPartIndex].text = `${breadcrumb}\n\n${originalText}`
|
|
153
|
+
} else {
|
|
154
|
+
parts.unshift({ type: "text", text: breadcrumb })
|
|
155
|
+
}
|
|
156
|
+
debugLog(
|
|
157
|
+
"workflow-state",
|
|
158
|
+
"Injected breadcrumb for task",
|
|
159
|
+
task.id,
|
|
160
|
+
"status",
|
|
161
|
+
task.status,
|
|
162
|
+
)
|
|
163
|
+
} catch (error) {
|
|
164
|
+
debugLog(
|
|
165
|
+
"workflow-state",
|
|
166
|
+
"Error in chat.message:",
|
|
167
|
+
error instanceof Error ? error.message : String(error),
|
|
168
|
+
)
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -50,7 +50,7 @@ function getTaskStatus(ctx) {
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
let hasContext = false
|
|
53
|
-
for (const jsonlName of ["implement.jsonl", "check.jsonl"
|
|
53
|
+
for (const jsonlName of ["implement.jsonl", "check.jsonl"]) {
|
|
54
54
|
const jsonlPath = join(taskDir, jsonlName)
|
|
55
55
|
if (existsSync(jsonlPath)) {
|
|
56
56
|
try {
|
|
@@ -227,29 +227,74 @@ Read and follow all instructions below carefully.
|
|
|
227
227
|
}
|
|
228
228
|
}
|
|
229
229
|
|
|
230
|
-
// 3. Workflow Guide
|
|
230
|
+
// 3. Workflow Guide — TOC + Phase Index + Phase 1/2/3 step details.
|
|
231
|
+
// Meta sections (Core Principles / Trellis System / Breadcrumbs) are NOT
|
|
232
|
+
// injected: Core Principles is short prose; Trellis System duplicates
|
|
233
|
+
// commands in step bodies; Breadcrumbs are consumed by UserPromptSubmit hook.
|
|
231
234
|
const workflowContent = ctx.readProjectFile(".trellis/workflow.md")
|
|
232
235
|
if (workflowContent) {
|
|
233
|
-
const
|
|
236
|
+
const allLines = workflowContent.split("\n")
|
|
237
|
+
const overviewLines = [
|
|
234
238
|
"# Development Workflow — Section Index",
|
|
235
239
|
"Full guide: .trellis/workflow.md (read on demand)",
|
|
236
240
|
"",
|
|
241
|
+
"## Table of Contents",
|
|
237
242
|
]
|
|
238
|
-
for (const line of
|
|
239
|
-
if (line.startsWith("## "))
|
|
243
|
+
for (const line of allLines) {
|
|
244
|
+
if (line.startsWith("## ")) overviewLines.push(line)
|
|
240
245
|
}
|
|
241
|
-
|
|
246
|
+
overviewLines.push("", "---", "")
|
|
247
|
+
|
|
248
|
+
// Extract range from "## Phase Index" up to (but excluding)
|
|
249
|
+
// "## Workflow State Breadcrumbs". Captures Phase Index + Phase 1/2/3.
|
|
250
|
+
let rangeStart = -1
|
|
251
|
+
let rangeEnd = allLines.length
|
|
252
|
+
for (let i = 0; i < allLines.length; i++) {
|
|
253
|
+
const stripped = allLines[i].trim()
|
|
254
|
+
if (rangeStart === -1 && stripped === "## Phase Index") {
|
|
255
|
+
rangeStart = i
|
|
256
|
+
} else if (rangeStart !== -1 && stripped === "## Workflow State Breadcrumbs") {
|
|
257
|
+
rangeEnd = i
|
|
258
|
+
break
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (rangeStart !== -1) {
|
|
262
|
+
overviewLines.push(...allLines.slice(rangeStart, rangeEnd))
|
|
263
|
+
}
|
|
264
|
+
|
|
242
265
|
parts.push("<workflow>")
|
|
243
|
-
parts.push(
|
|
266
|
+
parts.push(overviewLines.join("\n").trimEnd())
|
|
244
267
|
parts.push("</workflow>")
|
|
245
268
|
}
|
|
246
269
|
|
|
247
|
-
// 4. Guidelines
|
|
270
|
+
// 4. Guidelines — paths-only for most indexes; guides/ inlined (cross-package,
|
|
271
|
+
// broadly useful). Sub-agents get their specific specs via jsonl injection —
|
|
272
|
+
// main agent reads paths on demand when editing code directly.
|
|
248
273
|
parts.push("<guidelines>")
|
|
249
|
-
parts.push(
|
|
250
|
-
|
|
274
|
+
parts.push(
|
|
275
|
+
"Project spec indexes are listed by path below. Each index contains a " +
|
|
276
|
+
"**Pre-Development Checklist** listing the specific guideline files to " +
|
|
277
|
+
"read before coding.\n\n" +
|
|
278
|
+
"- If you're spawning an implement/check sub-agent, context is injected " +
|
|
279
|
+
"automatically via `{task}/implement.jsonl` / `check.jsonl`. You do NOT " +
|
|
280
|
+
"need to read these indexes yourself.\n" +
|
|
281
|
+
"- If you're editing code directly in the main session, Read the relevant " +
|
|
282
|
+
"index(es) on-demand and follow their Pre-Dev Checklist.\n"
|
|
283
|
+
)
|
|
251
284
|
|
|
252
285
|
const specDir = join(directory, ".trellis", "spec")
|
|
286
|
+
|
|
287
|
+
// guides/ inlined
|
|
288
|
+
const guidesIndex = join(specDir, "guides", "index.md")
|
|
289
|
+
if (existsSync(guidesIndex)) {
|
|
290
|
+
const content = ctx.readFile(guidesIndex)
|
|
291
|
+
if (content) {
|
|
292
|
+
parts.push(`## guides (inlined — cross-package thinking guides)\n${content}\n`)
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Other indexes — paths only
|
|
297
|
+
const paths = []
|
|
253
298
|
if (existsSync(specDir)) {
|
|
254
299
|
try {
|
|
255
300
|
const subs = readdirSync(specDir).filter(name => {
|
|
@@ -262,27 +307,13 @@ Read and follow all instructions below carefully.
|
|
|
262
307
|
}).sort()
|
|
263
308
|
|
|
264
309
|
for (const sub of subs) {
|
|
265
|
-
if (sub === "guides")
|
|
266
|
-
const indexFile = join(specDir, sub, "index.md")
|
|
267
|
-
if (existsSync(indexFile)) {
|
|
268
|
-
const content = ctx.readFile(indexFile)
|
|
269
|
-
if (content) {
|
|
270
|
-
parts.push(`## ${sub}\n${content}\n`)
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
continue
|
|
274
|
-
}
|
|
310
|
+
if (sub === "guides") continue // already inlined above
|
|
275
311
|
|
|
276
312
|
const indexFile = join(specDir, sub, "index.md")
|
|
277
313
|
if (existsSync(indexFile)) {
|
|
278
|
-
|
|
279
|
-
if (content) {
|
|
280
|
-
parts.push(`## ${sub}\n${content}\n`)
|
|
281
|
-
}
|
|
314
|
+
paths.push(`.trellis/spec/${sub}/index.md`)
|
|
282
315
|
} else {
|
|
283
|
-
if (allowedPkgs !== null && !allowedPkgs.has(sub))
|
|
284
|
-
continue
|
|
285
|
-
}
|
|
316
|
+
if (allowedPkgs !== null && !allowedPkgs.has(sub)) continue
|
|
286
317
|
try {
|
|
287
318
|
const nested = readdirSync(join(specDir, sub)).filter(name => {
|
|
288
319
|
try {
|
|
@@ -291,14 +322,10 @@ Read and follow all instructions below carefully.
|
|
|
291
322
|
return false
|
|
292
323
|
}
|
|
293
324
|
}).sort()
|
|
294
|
-
|
|
295
325
|
for (const layer of nested) {
|
|
296
326
|
const nestedIndex = join(specDir, sub, layer, "index.md")
|
|
297
327
|
if (existsSync(nestedIndex)) {
|
|
298
|
-
|
|
299
|
-
if (content) {
|
|
300
|
-
parts.push(`## ${sub}/${layer}\n${content}\n`)
|
|
301
|
-
}
|
|
328
|
+
paths.push(`.trellis/spec/${sub}/${layer}/index.md`)
|
|
302
329
|
}
|
|
303
330
|
}
|
|
304
331
|
} catch {
|
|
@@ -311,6 +338,18 @@ Read and follow all instructions below carefully.
|
|
|
311
338
|
}
|
|
312
339
|
}
|
|
313
340
|
|
|
341
|
+
if (paths.length > 0) {
|
|
342
|
+
parts.push("## Available spec indexes (read on demand)")
|
|
343
|
+
for (const p of paths) {
|
|
344
|
+
parts.push(`- ${p}`)
|
|
345
|
+
}
|
|
346
|
+
parts.push("")
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
parts.push(
|
|
350
|
+
"Discover more via: " +
|
|
351
|
+
"`python3 ./.trellis/scripts/get_context.py --mode packages`"
|
|
352
|
+
)
|
|
314
353
|
parts.push("</guidelines>")
|
|
315
354
|
|
|
316
355
|
// 6. Task status
|
|
@@ -393,13 +432,12 @@ async function hasPersistedInjectedContext(client, directory, sessionID) {
|
|
|
393
432
|
}
|
|
394
433
|
}
|
|
395
434
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
debugLog("session", "Plugin loaded, directory:", directory)
|
|
435
|
+
// OpenCode 1.2.x expects plugins to be factory functions (see inject-subagent-context.js comment).
|
|
436
|
+
export default async ({ directory, client }) => {
|
|
437
|
+
const ctx = new TrellisContext(directory)
|
|
438
|
+
debugLog("session", "Plugin loaded, directory:", directory)
|
|
401
439
|
|
|
402
|
-
|
|
440
|
+
return {
|
|
403
441
|
// Clear in-memory dedupe after compaction so context can be re-injected.
|
|
404
442
|
event: ({ event }) => {
|
|
405
443
|
try {
|
|
@@ -472,6 +510,5 @@ export default {
|
|
|
472
510
|
debugLog("session", "Error in chat.message:", error.message, error.stack)
|
|
473
511
|
}
|
|
474
512
|
}
|
|
475
|
-
}
|
|
476
513
|
}
|
|
477
514
|
}
|