@mindfoldhq/trellis 0.4.0 → 0.5.0-beta.2
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 +0 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +2 -4
- 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 +100 -24
- 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 +142 -98
- 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 +3 -28
- package/dist/configurators/opencode.d.ts.map +1 -1
- package/dist/configurators/opencode.js +23 -48
- package/dist/configurators/opencode.js.map +1 -1
- package/dist/configurators/qoder.d.ts +6 -4
- package/dist/configurators/qoder.d.ts.map +1 -1
- package/dist/configurators/qoder.js +20 -47
- package/dist/configurators/qoder.js.map +1 -1
- package/dist/configurators/shared.d.ts +66 -3
- package/dist/configurators/shared.d.ts.map +1 -1
- package/dist/configurators/shared.js +251 -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 +1644 -0
- package/dist/templates/claude/agents/check.md +2 -29
- package/dist/templates/claude/agents/research.md +70 -52
- 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 +3 -4
- package/dist/templates/{iflow → codebuddy}/agents/check.md +3 -30
- package/dist/templates/{iflow → codebuddy}/agents/implement.md +1 -1
- package/dist/templates/codebuddy/agents/research.md +138 -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/research.toml +50 -16
- 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/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/{codebuddy/commands/trellis → common/skills}/brainstorm.md +4 -4
- package/dist/templates/{opencode/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/cursor/agents/check.md +95 -0
- package/dist/templates/cursor/agents/implement.md +95 -0
- package/dist/templates/cursor/agents/research.md +138 -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/check.md +95 -0
- package/dist/templates/droid/droids/implement.md +95 -0
- package/dist/templates/droid/droids/research.md +138 -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/check.md +95 -0
- package/dist/templates/gemini/agents/implement.md +95 -0
- package/dist/templates/gemini/agents/research.md +138 -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/check.json +13 -0
- package/dist/templates/kiro/agents/implement.json +13 -0
- package/dist/templates/kiro/agents/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 +3 -30
- package/dist/templates/opencode/agents/implement.md +1 -1
- package/dist/templates/opencode/agents/research.md +1 -2
- package/dist/templates/opencode/plugins/inject-subagent-context.js +9 -183
- package/dist/templates/opencode/plugins/inject-workflow-state.js +160 -0
- package/dist/templates/opencode/plugins/session-start.js +71 -32
- package/dist/templates/qoder/agents/check.md +95 -0
- package/dist/templates/qoder/agents/implement.md +95 -0
- package/dist/templates/qoder/agents/research.md +138 -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 +74 -263
- package/dist/templates/shared-hooks/inject-workflow-state.py +231 -0
- package/dist/templates/{claude/hooks → shared-hooks}/session-start.py +162 -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/index.d.ts +1 -14
- package/dist/templates/trellis/index.d.ts.map +1 -1
- package/dist/templates/trellis/index.js +2 -27
- package/dist/templates/trellis/index.js.map +1 -1
- package/dist/templates/trellis/scripts/common/cli_adapter.py +2 -2
- 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 +3 -23
- package/dist/templates/trellis/scripts/common/task_store.py +0 -12
- package/dist/templates/trellis/scripts/common/workflow_phase.py +176 -0
- package/dist/templates/trellis/scripts/task.py +6 -35
- package/dist/templates/trellis/workflow.md +274 -297
- package/dist/types/ai-tools.d.ts +21 -3
- package/dist/types/ai-tools.d.ts.map +1 -1
- package/dist/types/ai-tools.js +106 -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/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/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/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/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/brainstorm.md +0 -491
- 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/break-loop.md +0 -125
- 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/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/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/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 Check 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}/check.jsonl`
|
|
25
|
+
2. Read `{task_dir}/check.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
|
|
@@ -89,32 +89,6 @@ If failed, fix issues and re-run.
|
|
|
89
89
|
|
|
90
90
|
---
|
|
91
91
|
|
|
92
|
-
## Completion Markers (Ralph Loop)
|
|
93
|
-
|
|
94
|
-
**CRITICAL**: You are in a loop controlled by the Ralph Loop system.
|
|
95
|
-
The loop will NOT stop until you output ALL required completion markers.
|
|
96
|
-
|
|
97
|
-
Completion markers are generated from `check.jsonl` in the task directory.
|
|
98
|
-
Each entry's `reason` field becomes a marker: `{REASON}_FINISH`
|
|
99
|
-
|
|
100
|
-
For example, if check.jsonl contains:
|
|
101
|
-
```json
|
|
102
|
-
{"file": "...", "reason": "TypeCheck"}
|
|
103
|
-
{"file": "...", "reason": "Lint"}
|
|
104
|
-
{"file": "...", "reason": "CodeReview"}
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
You MUST output these markers when each check passes:
|
|
108
|
-
- `TYPECHECK_FINISH` - After typecheck passes
|
|
109
|
-
- `LINT_FINISH` - After lint passes
|
|
110
|
-
- `CODEREVIEW_FINISH` - After code review passes
|
|
111
|
-
|
|
112
|
-
If check.jsonl doesn't exist or has no reasons, output: `ALL_CHECKS_FINISH`
|
|
113
|
-
|
|
114
|
-
**The loop will block you from stopping until all markers are present in your output.**
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
92
|
## Report Format
|
|
119
93
|
|
|
120
94
|
```markdown
|
|
@@ -136,11 +110,10 @@ If check.jsonl doesn't exist or has no reasons, output: `ALL_CHECKS_FINISH`
|
|
|
136
110
|
|
|
137
111
|
### Verification Results
|
|
138
112
|
|
|
139
|
-
- TypeCheck: Passed
|
|
140
|
-
- Lint: Passed
|
|
113
|
+
- TypeCheck: Passed
|
|
114
|
+
- Lint: Passed
|
|
141
115
|
|
|
142
116
|
### Summary
|
|
143
117
|
|
|
144
118
|
Checked X files, found Y issues, all fixed.
|
|
145
|
-
ALL_CHECKS_FINISH
|
|
146
119
|
```
|
|
@@ -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.
|
|
@@ -467,8 +298,6 @@ export default {
|
|
|
467
298
|
debugLog("inject", "Skipping - task directory not found")
|
|
468
299
|
return
|
|
469
300
|
}
|
|
470
|
-
|
|
471
|
-
updateCurrentPhase(ctx, taskDir, subagentType)
|
|
472
301
|
}
|
|
473
302
|
|
|
474
303
|
// Check for [finish] marker
|
|
@@ -485,9 +314,6 @@ export default {
|
|
|
485
314
|
? getFinishContext(ctx, taskDir)
|
|
486
315
|
: getCheckContext(ctx, taskDir)
|
|
487
316
|
break
|
|
488
|
-
case "debug":
|
|
489
|
-
context = getDebugContext(ctx, taskDir)
|
|
490
|
-
break
|
|
491
317
|
case "research":
|
|
492
318
|
context = getResearchContext(ctx, taskDir)
|
|
493
319
|
break
|
|
@@ -0,0 +1,160 @@
|
|
|
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. If the user describes multi-step work, load " +
|
|
40
|
+
"trellis-brainstorm skill to clarify requirements and create a task " +
|
|
41
|
+
"via `python3 ./.trellis/scripts/task.py create`. Simple one-off " +
|
|
42
|
+
"questions or trivial edits don't need a task — just answer directly.",
|
|
43
|
+
planning:
|
|
44
|
+
"Complete prd.md via trellis-brainstorm skill; then run task.py start.",
|
|
45
|
+
in_progress:
|
|
46
|
+
"Flow: implement → check → update-spec → finish\n" +
|
|
47
|
+
"Check conversation history + git status to determine current step; do NOT skip check.",
|
|
48
|
+
completed:
|
|
49
|
+
"User commits changes; then run task.py archive.",
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Parse workflow.md for [workflow-state:STATUS] blocks.
|
|
54
|
+
* Returns {status: body}. Missing tags fall back to hardcoded defaults.
|
|
55
|
+
*/
|
|
56
|
+
function loadBreadcrumbs(directory) {
|
|
57
|
+
const result = { ...FALLBACK_BREADCRUMBS }
|
|
58
|
+
const workflowPath = join(directory, ".trellis", "workflow.md")
|
|
59
|
+
if (!existsSync(workflowPath)) return result
|
|
60
|
+
let content
|
|
61
|
+
try {
|
|
62
|
+
content = readFileSync(workflowPath, "utf-8")
|
|
63
|
+
} catch {
|
|
64
|
+
return result
|
|
65
|
+
}
|
|
66
|
+
for (const match of content.matchAll(TAG_RE)) {
|
|
67
|
+
const status = match[1]
|
|
68
|
+
const body = match[2].trim()
|
|
69
|
+
if (body) result[status] = body
|
|
70
|
+
}
|
|
71
|
+
return result
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get (taskId, status) from active task, or null if no active task.
|
|
76
|
+
*/
|
|
77
|
+
function getActiveTask(ctx) {
|
|
78
|
+
const taskRef = ctx.getCurrentTask()
|
|
79
|
+
if (!taskRef) return null
|
|
80
|
+
const taskDir = ctx.resolveTaskDir(taskRef)
|
|
81
|
+
if (!taskDir || !existsSync(taskDir)) return null
|
|
82
|
+
const taskJsonPath = join(taskDir, "task.json")
|
|
83
|
+
if (!existsSync(taskJsonPath)) return null
|
|
84
|
+
try {
|
|
85
|
+
const data = JSON.parse(readFileSync(taskJsonPath, "utf-8"))
|
|
86
|
+
const status = typeof data.status === "string" ? data.status : ""
|
|
87
|
+
if (!status) return null
|
|
88
|
+
const id = data.id || taskRef.split("/").pop()
|
|
89
|
+
return { id, status }
|
|
90
|
+
} catch {
|
|
91
|
+
return null
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Build the <workflow-state>...</workflow-state> block.
|
|
97
|
+
* - Known status (templates or fallback) → detailed body
|
|
98
|
+
* - Unknown status → generic "refer to workflow.md"
|
|
99
|
+
* - no_task pseudo-status (id === null) → header omits task info
|
|
100
|
+
*/
|
|
101
|
+
function buildBreadcrumb(id, status, templates) {
|
|
102
|
+
let body = templates[status]
|
|
103
|
+
if (body === undefined) {
|
|
104
|
+
body = "Refer to workflow.md for current step."
|
|
105
|
+
}
|
|
106
|
+
const header = id === null ? `Status: ${status}` : `Task: ${id} (${status})`
|
|
107
|
+
return `<workflow-state>\n${header}\n${body}\n</workflow-state>`
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export default {
|
|
111
|
+
id: "trellis.inject-workflow-state",
|
|
112
|
+
server: async ({ directory }) => {
|
|
113
|
+
const ctx = new TrellisContext(directory)
|
|
114
|
+
debugLog("workflow-state", "Plugin loaded, directory:", directory)
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
// chat.message fires on every user message. Inject breadcrumb in-place
|
|
118
|
+
// so it persists in conversation history.
|
|
119
|
+
"chat.message": async (input, output) => {
|
|
120
|
+
try {
|
|
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)
|
|
129
|
+
const breadcrumb = task
|
|
130
|
+
? buildBreadcrumb(task.id, task.status, templates)
|
|
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.id,
|
|
147
|
+
"status",
|
|
148
|
+
task.status,
|
|
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
|
+
},
|
|
160
|
+
}
|
|
@@ -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
|