@mindfoldhq/trellis 0.4.0 → 0.5.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +83 -22
- 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
|
@@ -1,396 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
"""
|
|
4
|
-
Ralph Loop - SubagentStop Hook for Check Agent Loop Control
|
|
5
|
-
|
|
6
|
-
Based on the Ralph Wiggum technique for autonomous agent loops.
|
|
7
|
-
Uses completion promises to control when the check agent can stop.
|
|
8
|
-
|
|
9
|
-
Mechanism:
|
|
10
|
-
- Intercepts when check subagent tries to stop (SubagentStop event)
|
|
11
|
-
- If verify commands configured in worktree.yaml, runs them to verify
|
|
12
|
-
- Otherwise, reads check.jsonl to get dynamic completion markers ({reason}_FINISH)
|
|
13
|
-
- Blocks stopping until verification passes or all markers found
|
|
14
|
-
- Has max iterations as safety limit
|
|
15
|
-
|
|
16
|
-
State file: .trellis/.ralph-state.json
|
|
17
|
-
- Tracks current iteration count per session
|
|
18
|
-
- Resets when task changes
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
# IMPORTANT: Suppress all warnings FIRST
|
|
22
|
-
import warnings
|
|
23
|
-
warnings.filterwarnings("ignore")
|
|
24
|
-
|
|
25
|
-
import json
|
|
26
|
-
import os
|
|
27
|
-
import subprocess
|
|
28
|
-
import sys
|
|
29
|
-
from datetime import datetime
|
|
30
|
-
from pathlib import Path
|
|
31
|
-
|
|
32
|
-
# IMPORTANT: Force stdout to use UTF-8 on Windows
|
|
33
|
-
# This fixes UnicodeEncodeError when outputting non-ASCII characters
|
|
34
|
-
if sys.platform == "win32":
|
|
35
|
-
import io as _io
|
|
36
|
-
if hasattr(sys.stdout, "reconfigure"):
|
|
37
|
-
sys.stdout.reconfigure(encoding="utf-8", errors="replace") # type: ignore[union-attr]
|
|
38
|
-
elif hasattr(sys.stdout, "detach"):
|
|
39
|
-
sys.stdout = _io.TextIOWrapper(sys.stdout.detach(), encoding="utf-8", errors="replace") # type: ignore[union-attr]
|
|
40
|
-
|
|
41
|
-
# =============================================================================
|
|
42
|
-
# Configuration
|
|
43
|
-
# =============================================================================
|
|
44
|
-
|
|
45
|
-
MAX_ITERATIONS = 5 # Safety limit to prevent infinite loops
|
|
46
|
-
STATE_TIMEOUT_MINUTES = 30 # Reset state if older than this
|
|
47
|
-
STATE_FILE = ".trellis/.ralph-state.json"
|
|
48
|
-
WORKTREE_YAML = ".trellis/worktree.yaml"
|
|
49
|
-
DIR_WORKFLOW = ".trellis"
|
|
50
|
-
FILE_CURRENT_TASK = ".current-task"
|
|
51
|
-
|
|
52
|
-
# Only control loop for check agent
|
|
53
|
-
TARGET_AGENT = "check"
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def find_repo_root(start_path: str) -> str | None:
|
|
57
|
-
"""Find git repo root from start_path upwards"""
|
|
58
|
-
current = Path(start_path).resolve()
|
|
59
|
-
while current != current.parent:
|
|
60
|
-
if (current / ".git").exists():
|
|
61
|
-
return str(current)
|
|
62
|
-
current = current.parent
|
|
63
|
-
return None
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def get_current_task(repo_root: str) -> str | None:
|
|
67
|
-
"""Read current task directory path"""
|
|
68
|
-
current_task_file = os.path.join(repo_root, DIR_WORKFLOW, FILE_CURRENT_TASK)
|
|
69
|
-
if not os.path.exists(current_task_file):
|
|
70
|
-
return None
|
|
71
|
-
|
|
72
|
-
try:
|
|
73
|
-
with open(current_task_file, "r", encoding="utf-8") as f:
|
|
74
|
-
content = f.read().strip()
|
|
75
|
-
if not content:
|
|
76
|
-
return None
|
|
77
|
-
normalized = content.replace("\\", "/")
|
|
78
|
-
while normalized.startswith("./"):
|
|
79
|
-
normalized = normalized[2:]
|
|
80
|
-
if normalized.startswith("tasks/"):
|
|
81
|
-
normalized = f".trellis/{normalized}"
|
|
82
|
-
return normalized
|
|
83
|
-
except Exception:
|
|
84
|
-
return None
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
def get_verify_commands(repo_root: str) -> list[str]:
|
|
88
|
-
"""
|
|
89
|
-
Read verify commands from worktree.yaml.
|
|
90
|
-
|
|
91
|
-
Returns list of commands to run, or empty list if not configured.
|
|
92
|
-
Uses simple YAML parsing without external dependencies.
|
|
93
|
-
"""
|
|
94
|
-
yaml_path = os.path.join(repo_root, WORKTREE_YAML)
|
|
95
|
-
if not os.path.exists(yaml_path):
|
|
96
|
-
return []
|
|
97
|
-
|
|
98
|
-
try:
|
|
99
|
-
with open(yaml_path, "r", encoding="utf-8") as f:
|
|
100
|
-
content = f.read()
|
|
101
|
-
|
|
102
|
-
# Simple YAML parsing for verify section
|
|
103
|
-
# Look for "verify:" followed by list items
|
|
104
|
-
lines = content.split("\n")
|
|
105
|
-
in_verify_section = False
|
|
106
|
-
commands = []
|
|
107
|
-
|
|
108
|
-
for line in lines:
|
|
109
|
-
stripped = line.strip()
|
|
110
|
-
|
|
111
|
-
# Check for section start
|
|
112
|
-
if stripped.startswith("verify:"):
|
|
113
|
-
in_verify_section = True
|
|
114
|
-
continue
|
|
115
|
-
|
|
116
|
-
# Check for new section (not indented, ends with :)
|
|
117
|
-
if (
|
|
118
|
-
not line.startswith(" ")
|
|
119
|
-
and not line.startswith("\t")
|
|
120
|
-
and stripped.endswith(":")
|
|
121
|
-
and stripped != ""
|
|
122
|
-
):
|
|
123
|
-
in_verify_section = False
|
|
124
|
-
continue
|
|
125
|
-
|
|
126
|
-
# If in verify section, look for list items
|
|
127
|
-
if in_verify_section:
|
|
128
|
-
# Skip comments and empty lines
|
|
129
|
-
if stripped.startswith("#") or stripped == "":
|
|
130
|
-
continue
|
|
131
|
-
# Parse list item (- command)
|
|
132
|
-
if stripped.startswith("- "):
|
|
133
|
-
cmd = stripped[2:].strip()
|
|
134
|
-
if cmd:
|
|
135
|
-
commands.append(cmd)
|
|
136
|
-
|
|
137
|
-
return commands
|
|
138
|
-
except Exception:
|
|
139
|
-
return []
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
def run_verify_commands(repo_root: str, commands: list[str]) -> tuple[bool, str]:
|
|
143
|
-
"""
|
|
144
|
-
Run verify commands and return (success, message).
|
|
145
|
-
|
|
146
|
-
All commands must pass for success.
|
|
147
|
-
"""
|
|
148
|
-
for cmd in commands:
|
|
149
|
-
try:
|
|
150
|
-
result = subprocess.run(
|
|
151
|
-
cmd,
|
|
152
|
-
shell=True,
|
|
153
|
-
cwd=repo_root,
|
|
154
|
-
capture_output=True,
|
|
155
|
-
timeout=120, # 2 minute timeout per command
|
|
156
|
-
)
|
|
157
|
-
if result.returncode != 0:
|
|
158
|
-
stderr = result.stderr.decode("utf-8", errors="replace")
|
|
159
|
-
stdout = result.stdout.decode("utf-8", errors="replace")
|
|
160
|
-
error_output = stderr or stdout
|
|
161
|
-
# Truncate long output
|
|
162
|
-
if len(error_output) > 500:
|
|
163
|
-
error_output = error_output[:500] + "..."
|
|
164
|
-
return False, f"Command failed: {cmd}\n{error_output}"
|
|
165
|
-
except subprocess.TimeoutExpired:
|
|
166
|
-
return False, f"Command timed out: {cmd}"
|
|
167
|
-
except Exception as e:
|
|
168
|
-
return False, f"Command error: {cmd} - {str(e)}"
|
|
169
|
-
|
|
170
|
-
return True, "All verify commands passed"
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
def get_completion_markers(repo_root: str, task_dir: str) -> list[str]:
|
|
174
|
-
"""
|
|
175
|
-
Read check.jsonl and generate completion markers from reasons.
|
|
176
|
-
|
|
177
|
-
Each entry's "reason" field becomes {REASON}_FINISH marker.
|
|
178
|
-
Example: {"file": "...", "reason": "TypeCheck"} -> "TYPECHECK_FINISH"
|
|
179
|
-
"""
|
|
180
|
-
check_jsonl_path = os.path.join(repo_root, task_dir, "check.jsonl")
|
|
181
|
-
markers = []
|
|
182
|
-
|
|
183
|
-
if not os.path.exists(check_jsonl_path):
|
|
184
|
-
# Fallback: if no check.jsonl, use default marker
|
|
185
|
-
return ["ALL_CHECKS_FINISH"]
|
|
186
|
-
|
|
187
|
-
try:
|
|
188
|
-
with open(check_jsonl_path, "r", encoding="utf-8") as f:
|
|
189
|
-
for line in f:
|
|
190
|
-
line = line.strip()
|
|
191
|
-
if not line:
|
|
192
|
-
continue
|
|
193
|
-
try:
|
|
194
|
-
item = json.loads(line)
|
|
195
|
-
reason = item.get("reason", "")
|
|
196
|
-
if reason:
|
|
197
|
-
# Convert to uppercase and add _FINISH suffix
|
|
198
|
-
marker = f"{reason.upper().replace(' ', '_')}_FINISH"
|
|
199
|
-
if marker not in markers:
|
|
200
|
-
markers.append(marker)
|
|
201
|
-
except json.JSONDecodeError:
|
|
202
|
-
continue
|
|
203
|
-
except Exception:
|
|
204
|
-
pass
|
|
205
|
-
|
|
206
|
-
# If no markers found, use default
|
|
207
|
-
if not markers:
|
|
208
|
-
markers = ["ALL_CHECKS_FINISH"]
|
|
209
|
-
|
|
210
|
-
return markers
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
def load_state(repo_root: str) -> dict:
|
|
214
|
-
"""Load Ralph Loop state from file"""
|
|
215
|
-
state_path = os.path.join(repo_root, STATE_FILE)
|
|
216
|
-
if not os.path.exists(state_path):
|
|
217
|
-
return {"task": None, "iteration": 0, "started_at": None}
|
|
218
|
-
|
|
219
|
-
try:
|
|
220
|
-
with open(state_path, "r", encoding="utf-8") as f:
|
|
221
|
-
return json.load(f)
|
|
222
|
-
except Exception:
|
|
223
|
-
return {"task": None, "iteration": 0, "started_at": None}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
def save_state(repo_root: str, state: dict) -> None:
|
|
227
|
-
"""Save Ralph Loop state to file"""
|
|
228
|
-
state_path = os.path.join(repo_root, STATE_FILE)
|
|
229
|
-
try:
|
|
230
|
-
# Ensure directory exists
|
|
231
|
-
os.makedirs(os.path.dirname(state_path), exist_ok=True)
|
|
232
|
-
with open(state_path, "w", encoding="utf-8") as f:
|
|
233
|
-
json.dump(state, f, indent=2, ensure_ascii=False)
|
|
234
|
-
except Exception:
|
|
235
|
-
pass
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
def check_completion(agent_output: str, markers: list[str]) -> tuple[bool, list[str]]:
|
|
239
|
-
"""
|
|
240
|
-
Check if all completion markers are present in agent output.
|
|
241
|
-
|
|
242
|
-
Returns:
|
|
243
|
-
(all_complete, missing_markers)
|
|
244
|
-
"""
|
|
245
|
-
missing = []
|
|
246
|
-
for marker in markers:
|
|
247
|
-
if marker not in agent_output:
|
|
248
|
-
missing.append(marker)
|
|
249
|
-
|
|
250
|
-
return len(missing) == 0, missing
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
def main():
|
|
254
|
-
try:
|
|
255
|
-
input_data = json.load(sys.stdin)
|
|
256
|
-
except json.JSONDecodeError:
|
|
257
|
-
# If can't parse input, allow stop
|
|
258
|
-
sys.exit(0)
|
|
259
|
-
|
|
260
|
-
# Get event info
|
|
261
|
-
hook_event = input_data.get("hook_event_name", "")
|
|
262
|
-
|
|
263
|
-
# Only handle SubagentStop event
|
|
264
|
-
if hook_event != "SubagentStop":
|
|
265
|
-
sys.exit(0)
|
|
266
|
-
|
|
267
|
-
# Get subagent info
|
|
268
|
-
# Field names per Claude Code SubagentStop event schema:
|
|
269
|
-
# agent_type, last_assistant_message, agent_id, agent_transcript_path, cwd
|
|
270
|
-
# The event does NOT carry a `prompt` field, so finish-phase detection
|
|
271
|
-
# based on a `[finish]` marker in the user prompt is no longer possible
|
|
272
|
-
# here; finish-phase skip logic should be reintroduced via task.json
|
|
273
|
-
# state (e.g. current_phase) in a follow-up.
|
|
274
|
-
agent_type = input_data.get("agent_type", "")
|
|
275
|
-
last_assistant_message = input_data.get("last_assistant_message", "")
|
|
276
|
-
cwd = input_data.get("cwd", os.getcwd())
|
|
277
|
-
|
|
278
|
-
# Only control check agent
|
|
279
|
-
if agent_type != TARGET_AGENT:
|
|
280
|
-
sys.exit(0)
|
|
281
|
-
|
|
282
|
-
# Find repo root
|
|
283
|
-
repo_root = find_repo_root(cwd)
|
|
284
|
-
if not repo_root:
|
|
285
|
-
sys.exit(0)
|
|
286
|
-
|
|
287
|
-
# Get current task
|
|
288
|
-
task_dir = get_current_task(repo_root)
|
|
289
|
-
if not task_dir:
|
|
290
|
-
sys.exit(0)
|
|
291
|
-
|
|
292
|
-
# Load state
|
|
293
|
-
state = load_state(repo_root)
|
|
294
|
-
|
|
295
|
-
# Reset state if task changed or state is too old
|
|
296
|
-
should_reset = False
|
|
297
|
-
if state.get("task") != task_dir:
|
|
298
|
-
should_reset = True
|
|
299
|
-
elif state.get("started_at"):
|
|
300
|
-
try:
|
|
301
|
-
started = datetime.fromisoformat(state["started_at"])
|
|
302
|
-
if (datetime.now() - started).total_seconds() > STATE_TIMEOUT_MINUTES * 60:
|
|
303
|
-
should_reset = True
|
|
304
|
-
except (ValueError, TypeError):
|
|
305
|
-
should_reset = True
|
|
306
|
-
|
|
307
|
-
if should_reset:
|
|
308
|
-
state = {
|
|
309
|
-
"task": task_dir,
|
|
310
|
-
"iteration": 0,
|
|
311
|
-
"started_at": datetime.now().isoformat(),
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
# Increment iteration
|
|
315
|
-
state["iteration"] = state.get("iteration", 0) + 1
|
|
316
|
-
current_iteration = state["iteration"]
|
|
317
|
-
|
|
318
|
-
# Save state
|
|
319
|
-
save_state(repo_root, state)
|
|
320
|
-
|
|
321
|
-
# Safety check: max iterations
|
|
322
|
-
if current_iteration >= MAX_ITERATIONS:
|
|
323
|
-
# Allow stop, reset state for next run
|
|
324
|
-
state["iteration"] = 0
|
|
325
|
-
save_state(repo_root, state)
|
|
326
|
-
output = {
|
|
327
|
-
"decision": "allow",
|
|
328
|
-
"reason": f"Max iterations ({MAX_ITERATIONS}) reached. Stopping to prevent infinite loop.",
|
|
329
|
-
}
|
|
330
|
-
print(json.dumps(output, ensure_ascii=False))
|
|
331
|
-
sys.exit(0)
|
|
332
|
-
|
|
333
|
-
# Check if verify commands are configured
|
|
334
|
-
verify_commands = get_verify_commands(repo_root)
|
|
335
|
-
|
|
336
|
-
if verify_commands:
|
|
337
|
-
# Use programmatic verification
|
|
338
|
-
passed, message = run_verify_commands(repo_root, verify_commands)
|
|
339
|
-
|
|
340
|
-
if passed:
|
|
341
|
-
# All verify commands passed, allow stop
|
|
342
|
-
state["iteration"] = 0
|
|
343
|
-
save_state(repo_root, state)
|
|
344
|
-
output = {
|
|
345
|
-
"decision": "allow",
|
|
346
|
-
"reason": "All verify commands passed. Check phase complete.",
|
|
347
|
-
}
|
|
348
|
-
print(json.dumps(output, ensure_ascii=False))
|
|
349
|
-
sys.exit(0)
|
|
350
|
-
else:
|
|
351
|
-
# Verification failed, block stop
|
|
352
|
-
output = {
|
|
353
|
-
"decision": "block",
|
|
354
|
-
"reason": f"Iteration {current_iteration}/{MAX_ITERATIONS}. Verification failed:\n{message}\n\nPlease fix the issues and try again.",
|
|
355
|
-
}
|
|
356
|
-
print(json.dumps(output, ensure_ascii=False))
|
|
357
|
-
sys.exit(0)
|
|
358
|
-
else:
|
|
359
|
-
# No verify commands, fall back to completion markers
|
|
360
|
-
markers = get_completion_markers(repo_root, task_dir)
|
|
361
|
-
all_complete, missing = check_completion(last_assistant_message, markers)
|
|
362
|
-
|
|
363
|
-
if all_complete:
|
|
364
|
-
# All checks complete, allow stop
|
|
365
|
-
state["iteration"] = 0
|
|
366
|
-
save_state(repo_root, state)
|
|
367
|
-
output = {
|
|
368
|
-
"decision": "allow",
|
|
369
|
-
"reason": "All completion markers found. Check phase complete.",
|
|
370
|
-
}
|
|
371
|
-
print(json.dumps(output, ensure_ascii=False))
|
|
372
|
-
sys.exit(0)
|
|
373
|
-
else:
|
|
374
|
-
# Missing markers, block stop and continue
|
|
375
|
-
output = {
|
|
376
|
-
"decision": "block",
|
|
377
|
-
"reason": f"""Iteration {current_iteration}/{MAX_ITERATIONS}. Missing completion markers: {", ".join(missing)}.
|
|
378
|
-
|
|
379
|
-
IMPORTANT: You must ACTUALLY run the checks, not just output the markers.
|
|
380
|
-
- Did you run lint? What was the output?
|
|
381
|
-
- Did you run typecheck? What was the output?
|
|
382
|
-
- Did they actually pass with zero errors?
|
|
383
|
-
|
|
384
|
-
Only output a marker (e.g., LINT_FINISH) AFTER:
|
|
385
|
-
1. You have executed the corresponding command
|
|
386
|
-
2. The command completed with zero errors
|
|
387
|
-
3. You have shown the command output in your response
|
|
388
|
-
|
|
389
|
-
Do NOT output markers just to escape the loop. The loop exists to ensure quality.""",
|
|
390
|
-
}
|
|
391
|
-
print(json.dumps(output, ensure_ascii=False))
|
|
392
|
-
sys.exit(0)
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
if __name__ == "__main__":
|
|
396
|
-
main()
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
Read the relevant development guidelines before starting your task.
|
|
2
|
-
|
|
3
|
-
Execute these steps:
|
|
4
|
-
|
|
5
|
-
1. **Discover packages and their spec layers**:
|
|
6
|
-
```bash
|
|
7
|
-
python3 ./.trellis/scripts/get_context.py --mode packages
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
2. **Identify which specs apply** to your task based on:
|
|
11
|
-
- Which package you're modifying (e.g., `cli/`, `docs-site/`)
|
|
12
|
-
- What type of work (backend, frontend, unit-test, docs, etc.)
|
|
13
|
-
|
|
14
|
-
3. **Read the spec index** for each relevant module:
|
|
15
|
-
```bash
|
|
16
|
-
cat .trellis/spec/<package>/<layer>/index.md
|
|
17
|
-
```
|
|
18
|
-
Follow the **"Pre-Development Checklist"** section in the index.
|
|
19
|
-
|
|
20
|
-
4. **Read the specific guideline files** listed in the Pre-Development Checklist that are relevant to your task. The index is NOT the goal — it points you to the actual guideline files (e.g., `error-handling.md`, `conventions.md`, `mock-strategies.md`). Read those files to understand the coding standards and patterns.
|
|
21
|
-
|
|
22
|
-
5. **Always read shared guides**:
|
|
23
|
-
```bash
|
|
24
|
-
cat .trellis/spec/guides/index.md
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
6. Understand the coding standards and patterns you need to follow, then proceed with your development plan.
|
|
28
|
-
|
|
29
|
-
This step is **mandatory** before writing any code.
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
# Break the Loop - Deep Bug Analysis
|
|
2
|
-
|
|
3
|
-
When debug is complete, use this command for deep analysis to break the "fix bug -> forget -> repeat" cycle.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Analysis Framework
|
|
8
|
-
|
|
9
|
-
Analyze the bug you just fixed from these 5 dimensions:
|
|
10
|
-
|
|
11
|
-
### 1. Root Cause Category
|
|
12
|
-
|
|
13
|
-
Which category does this bug belong to?
|
|
14
|
-
|
|
15
|
-
| Category | Characteristics | Example |
|
|
16
|
-
|----------|-----------------|---------|
|
|
17
|
-
| **A. Missing Spec** | No documentation on how to do it | New feature without checklist |
|
|
18
|
-
| **B. Cross-Layer Contract** | Interface between layers unclear | API returns different format than expected |
|
|
19
|
-
| **C. Change Propagation Failure** | Changed one place, missed others | Changed function signature, missed call sites |
|
|
20
|
-
| **D. Test Coverage Gap** | Unit test passes, integration fails | Works alone, breaks when combined |
|
|
21
|
-
| **E. Implicit Assumption** | Code relies on undocumented assumption | Timestamp seconds vs milliseconds |
|
|
22
|
-
|
|
23
|
-
### 2. Why Fixes Failed (if applicable)
|
|
24
|
-
|
|
25
|
-
If you tried multiple fixes before succeeding, analyze each failure:
|
|
26
|
-
|
|
27
|
-
- **Surface Fix**: Fixed symptom, not root cause
|
|
28
|
-
- **Incomplete Scope**: Found root cause, didn't cover all cases
|
|
29
|
-
- **Tool Limitation**: grep missed it, type check wasn't strict
|
|
30
|
-
- **Mental Model**: Kept looking in same layer, didn't think cross-layer
|
|
31
|
-
|
|
32
|
-
### 3. Prevention Mechanisms
|
|
33
|
-
|
|
34
|
-
What mechanisms would prevent this from happening again?
|
|
35
|
-
|
|
36
|
-
| Type | Description | Example |
|
|
37
|
-
|------|-------------|---------|
|
|
38
|
-
| **Documentation** | Write it down so people know | Update thinking guide |
|
|
39
|
-
| **Architecture** | Make the error impossible structurally | Type-safe wrappers |
|
|
40
|
-
| **Compile-time** | TypeScript strict, no any | Signature change causes compile error |
|
|
41
|
-
| **Runtime** | Monitoring, alerts, scans | Detect orphan entities |
|
|
42
|
-
| **Test Coverage** | E2E tests, integration tests | Verify full flow |
|
|
43
|
-
| **Code Review** | Checklist, PR template | "Did you check X?" |
|
|
44
|
-
|
|
45
|
-
### 4. Systematic Expansion
|
|
46
|
-
|
|
47
|
-
What broader problems does this bug reveal?
|
|
48
|
-
|
|
49
|
-
- **Similar Issues**: Where else might this problem exist?
|
|
50
|
-
- **Design Flaw**: Is there a fundamental architecture issue?
|
|
51
|
-
- **Process Flaw**: Is there a development process improvement?
|
|
52
|
-
- **Knowledge Gap**: Is the team missing some understanding?
|
|
53
|
-
|
|
54
|
-
### 5. Knowledge Capture
|
|
55
|
-
|
|
56
|
-
Solidify insights into the system:
|
|
57
|
-
|
|
58
|
-
- [ ] Update `.trellis/spec/guides/` thinking guides
|
|
59
|
-
- [ ] Update `.trellis/spec/backend/` or `frontend/` docs
|
|
60
|
-
- [ ] Create issue record (if applicable)
|
|
61
|
-
- [ ] Create feature ticket for root fix
|
|
62
|
-
- [ ] Update check commands if needed
|
|
63
|
-
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
## Output Format
|
|
67
|
-
|
|
68
|
-
Please output analysis in this format:
|
|
69
|
-
|
|
70
|
-
```markdown
|
|
71
|
-
## Bug Analysis: [Short Description]
|
|
72
|
-
|
|
73
|
-
### 1. Root Cause Category
|
|
74
|
-
- **Category**: [A/B/C/D/E] - [Category Name]
|
|
75
|
-
- **Specific Cause**: [Detailed description]
|
|
76
|
-
|
|
77
|
-
### 2. Why Fixes Failed (if applicable)
|
|
78
|
-
1. [First attempt]: [Why it failed]
|
|
79
|
-
2. [Second attempt]: [Why it failed]
|
|
80
|
-
...
|
|
81
|
-
|
|
82
|
-
### 3. Prevention Mechanisms
|
|
83
|
-
| Priority | Mechanism | Specific Action | Status |
|
|
84
|
-
|----------|-----------|-----------------|--------|
|
|
85
|
-
| P0 | ... | ... | TODO/DONE |
|
|
86
|
-
|
|
87
|
-
### 4. Systematic Expansion
|
|
88
|
-
- **Similar Issues**: [List places with similar problems]
|
|
89
|
-
- **Design Improvement**: [Architecture-level suggestions]
|
|
90
|
-
- **Process Improvement**: [Development process suggestions]
|
|
91
|
-
|
|
92
|
-
### 5. Knowledge Capture
|
|
93
|
-
- [ ] [Documents to update / tickets to create]
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## Core Philosophy
|
|
99
|
-
|
|
100
|
-
> **The value of debugging is not in fixing the bug, but in making this class of bugs never happen again.**
|
|
101
|
-
|
|
102
|
-
Three levels of insight:
|
|
103
|
-
1. **Tactical**: How to fix THIS bug
|
|
104
|
-
2. **Strategic**: How to prevent THIS CLASS of bugs
|
|
105
|
-
3. **Philosophical**: How to expand thinking patterns
|
|
106
|
-
|
|
107
|
-
30 minutes of analysis saves 30 hours of future debugging.
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
# Cross-Layer Check
|
|
2
|
-
|
|
3
|
-
Check if your changes considered all dimensions. Most bugs come from "didn't think of it", not lack of technical skill.
|
|
4
|
-
|
|
5
|
-
> **Note**: This is a **post-implementation** safety net. Ideally, read the [Pre-Implementation Checklist](.trellis/spec/guides/pre-implementation-checklist.md) **before** writing code.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Related Documents
|
|
10
|
-
|
|
11
|
-
| Document | Purpose | Timing |
|
|
12
|
-
|----------|---------|--------|
|
|
13
|
-
| [Pre-Implementation Checklist](.trellis/spec/guides/pre-implementation-checklist.md) | Questions before coding | **Before** writing code |
|
|
14
|
-
| [Code Reuse Thinking Guide](.trellis/spec/guides/code-reuse-thinking-guide.md) | Pattern recognition | During implementation |
|
|
15
|
-
| **`/trellis:check-cross-layer`** (this) | Verification check | **After** implementation |
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Execution Steps
|
|
20
|
-
|
|
21
|
-
### 1. Identify Change Scope
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
git status
|
|
25
|
-
git diff --name-only
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### 2. Select Applicable Check Dimensions
|
|
29
|
-
|
|
30
|
-
Based on your change type, execute relevant checks below:
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## Dimension A: Cross-Layer Data Flow (Required when 3+ layers)
|
|
35
|
-
|
|
36
|
-
**Trigger**: Changes involve 3 or more layers
|
|
37
|
-
|
|
38
|
-
| Layer | Common Locations |
|
|
39
|
-
|-------|------------------|
|
|
40
|
-
| API/Routes | `routes/`, `api/`, `handlers/`, `controllers/` |
|
|
41
|
-
| Service/Business Logic | `services/`, `lib/`, `core/`, `domain/` |
|
|
42
|
-
| Database/Storage | `db/`, `models/`, `repositories/`, `schema/` |
|
|
43
|
-
| UI/Presentation | `components/`, `views/`, `templates/`, `pages/` |
|
|
44
|
-
| Utility | `utils/`, `helpers/`, `common/` |
|
|
45
|
-
|
|
46
|
-
**Checklist**:
|
|
47
|
-
- [ ] Read flow: Database -> Service -> API -> UI
|
|
48
|
-
- [ ] Write flow: UI -> API -> Service -> Database
|
|
49
|
-
- [ ] Types/schemas correctly passed between layers?
|
|
50
|
-
- [ ] Errors properly propagated to caller?
|
|
51
|
-
- [ ] Loading/pending states handled at each layer?
|
|
52
|
-
|
|
53
|
-
**Detailed Guide**: `.trellis/spec/guides/cross-layer-thinking-guide.md`
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## Dimension B: Code Reuse (Required when modifying constants/config)
|
|
58
|
-
|
|
59
|
-
**Trigger**:
|
|
60
|
-
- Modifying UI constants (label, icon, color)
|
|
61
|
-
- Modifying any hardcoded value
|
|
62
|
-
- Seeing similar code in multiple places
|
|
63
|
-
- Creating a new utility/helper function
|
|
64
|
-
- Just finished batch modifications across files
|
|
65
|
-
|
|
66
|
-
**Checklist**:
|
|
67
|
-
- [ ] Search first: How many places define this value?
|
|
68
|
-
```bash
|
|
69
|
-
# Search in source files (adjust extensions for your project)
|
|
70
|
-
grep -r "value-to-change" src/
|
|
71
|
-
```
|
|
72
|
-
- [ ] If 2+ places define same value -> Should extract to shared constant
|
|
73
|
-
- [ ] After modification, all usage sites updated?
|
|
74
|
-
- [ ] If creating utility: Does similar utility already exist?
|
|
75
|
-
|
|
76
|
-
**Detailed Guide**: `.trellis/spec/guides/code-reuse-thinking-guide.md`
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## Dimension B2: New Utility Functions
|
|
81
|
-
|
|
82
|
-
**Trigger**: About to create a new utility/helper function
|
|
83
|
-
|
|
84
|
-
**Checklist**:
|
|
85
|
-
- [ ] Search for existing similar utilities first
|
|
86
|
-
```bash
|
|
87
|
-
grep -r "functionNamePattern" src/
|
|
88
|
-
```
|
|
89
|
-
- [ ] If similar exists, can you extend it instead?
|
|
90
|
-
- [ ] If creating new, is it in the right location (shared vs domain-specific)?
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## Dimension B3: After Batch Modifications
|
|
95
|
-
|
|
96
|
-
**Trigger**: Just modified similar patterns in multiple files
|
|
97
|
-
|
|
98
|
-
**Checklist**:
|
|
99
|
-
- [ ] Did you check ALL files with similar patterns?
|
|
100
|
-
```bash
|
|
101
|
-
grep -r "patternYouChanged" src/
|
|
102
|
-
```
|
|
103
|
-
- [ ] Any files missed that should also be updated?
|
|
104
|
-
- [ ] Should this pattern be abstracted to prevent future duplication?
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
## Dimension C: Import/Dependency Paths (Required when creating new files)
|
|
109
|
-
|
|
110
|
-
**Trigger**: Creating new source files
|
|
111
|
-
|
|
112
|
-
**Checklist**:
|
|
113
|
-
- [ ] Using correct import paths (relative vs absolute)?
|
|
114
|
-
- [ ] No circular dependencies?
|
|
115
|
-
- [ ] Consistent with project's module organization?
|
|
116
|
-
|
|
117
|
-
---
|
|
118
|
-
|
|
119
|
-
## Dimension D: Same-Layer Consistency
|
|
120
|
-
|
|
121
|
-
**Trigger**:
|
|
122
|
-
- Modifying display logic or formatting
|
|
123
|
-
- Same domain concept used in multiple places
|
|
124
|
-
|
|
125
|
-
**Checklist**:
|
|
126
|
-
- [ ] Search for other places using same concept
|
|
127
|
-
```bash
|
|
128
|
-
grep -r "ConceptName" src/
|
|
129
|
-
```
|
|
130
|
-
- [ ] Are these usages consistent?
|
|
131
|
-
- [ ] Should they share configuration/constants?
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
## Common Issues Quick Reference
|
|
136
|
-
|
|
137
|
-
| Issue | Root Cause | Prevention |
|
|
138
|
-
|-------|------------|------------|
|
|
139
|
-
| Changed one place, missed others | Didn't search impact scope | `grep` before changing |
|
|
140
|
-
| Data lost at some layer | Didn't check data flow | Trace data source to destination |
|
|
141
|
-
| Type/schema mismatch | Cross-layer types inconsistent | Use shared type definitions |
|
|
142
|
-
| UI/output inconsistent | Same concept in multiple places | Extract shared constants |
|
|
143
|
-
| Similar utility exists | Didn't search first | Search before creating |
|
|
144
|
-
| Batch fix incomplete | Didn't verify all occurrences | grep after fixing |
|
|
145
|
-
|
|
146
|
-
---
|
|
147
|
-
|
|
148
|
-
## Output
|
|
149
|
-
|
|
150
|
-
Report:
|
|
151
|
-
1. Which dimensions your changes involve
|
|
152
|
-
2. Check results for each dimension
|
|
153
|
-
3. Issues found and fix suggestions
|