@mindfoldhq/trellis 0.4.0 → 0.5.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +0 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/init.d.ts +10 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +382 -120
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/update.d.ts +5 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +178 -61
- package/dist/commands/update.js.map +1 -1
- package/dist/configurators/antigravity.d.ts +3 -4
- package/dist/configurators/antigravity.d.ts.map +1 -1
- package/dist/configurators/antigravity.js +17 -10
- package/dist/configurators/antigravity.js.map +1 -1
- package/dist/configurators/claude.d.ts +5 -28
- package/dist/configurators/claude.d.ts.map +1 -1
- package/dist/configurators/claude.js +30 -51
- package/dist/configurators/claude.js.map +1 -1
- package/dist/configurators/codebuddy.d.ts +6 -7
- package/dist/configurators/codebuddy.d.ts.map +1 -1
- package/dist/configurators/codebuddy.js +23 -51
- package/dist/configurators/codebuddy.js.map +1 -1
- package/dist/configurators/codex.d.ts +3 -6
- package/dist/configurators/codex.d.ts.map +1 -1
- package/dist/configurators/codex.js +29 -12
- package/dist/configurators/codex.js.map +1 -1
- package/dist/configurators/copilot.d.ts +6 -5
- package/dist/configurators/copilot.d.ts.map +1 -1
- package/dist/configurators/copilot.js +42 -13
- package/dist/configurators/copilot.js.map +1 -1
- package/dist/configurators/cursor.d.ts +6 -1
- package/dist/configurators/cursor.d.ts.map +1 -1
- package/dist/configurators/cursor.js +22 -45
- package/dist/configurators/cursor.js.map +1 -1
- package/dist/configurators/droid.d.ts +6 -1
- package/dist/configurators/droid.d.ts.map +1 -1
- package/dist/configurators/droid.js +23 -41
- package/dist/configurators/droid.js.map +1 -1
- package/dist/configurators/gemini.d.ts +8 -4
- package/dist/configurators/gemini.d.ts.map +1 -1
- package/dist/configurators/gemini.js +28 -47
- package/dist/configurators/gemini.js.map +1 -1
- package/dist/configurators/index.d.ts +1 -1
- package/dist/configurators/index.d.ts.map +1 -1
- package/dist/configurators/index.js +146 -100
- package/dist/configurators/index.js.map +1 -1
- package/dist/configurators/kilo.d.ts +3 -4
- package/dist/configurators/kilo.d.ts.map +1 -1
- package/dist/configurators/kilo.js +19 -46
- package/dist/configurators/kilo.js.map +1 -1
- package/dist/configurators/kiro.d.ts +4 -4
- package/dist/configurators/kiro.d.ts.map +1 -1
- package/dist/configurators/kiro.js +18 -14
- package/dist/configurators/kiro.js.map +1 -1
- package/dist/configurators/opencode.d.ts +7 -25
- package/dist/configurators/opencode.d.ts.map +1 -1
- package/dist/configurators/opencode.js +57 -56
- package/dist/configurators/opencode.js.map +1 -1
- package/dist/configurators/qoder.d.ts +6 -3
- package/dist/configurators/qoder.d.ts.map +1 -1
- package/dist/configurators/qoder.js +27 -46
- package/dist/configurators/qoder.js.map +1 -1
- package/dist/configurators/shared.d.ts +68 -3
- package/dist/configurators/shared.d.ts.map +1 -1
- package/dist/configurators/shared.js +274 -3
- package/dist/configurators/shared.js.map +1 -1
- package/dist/configurators/windsurf.d.ts +3 -4
- package/dist/configurators/windsurf.d.ts.map +1 -1
- package/dist/configurators/windsurf.js +17 -10
- package/dist/configurators/windsurf.js.map +1 -1
- package/dist/configurators/workflow.d.ts +0 -3
- package/dist/configurators/workflow.d.ts.map +1 -1
- package/dist/configurators/workflow.js +1 -7
- package/dist/configurators/workflow.js.map +1 -1
- package/dist/migrations/manifests/0.4.0.json +1 -1
- package/dist/migrations/manifests/0.5.0-beta.0.json +1646 -0
- package/dist/migrations/manifests/0.5.0-beta.1.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.5.json +222 -0
- package/dist/migrations/manifests/0.5.0-beta.6.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.7.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.8.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.9.json +48 -0
- package/dist/templates/claude/agents/{check.md → trellis-check.md} +3 -31
- package/dist/templates/claude/agents/{implement.md → trellis-implement.md} +1 -2
- package/dist/templates/claude/agents/trellis-research.md +137 -0
- package/dist/templates/claude/index.d.ts +5 -37
- package/dist/templates/claude/index.d.ts.map +1 -1
- package/dist/templates/claude/index.js +3 -42
- package/dist/templates/claude/index.js.map +1 -1
- package/dist/templates/claude/settings.json +6 -4
- package/dist/templates/{iflow/agents/check.md → codebuddy/agents/trellis-check.md} +3 -31
- package/dist/templates/{iflow/agents/implement.md → codebuddy/agents/trellis-implement.md} +1 -2
- package/dist/templates/codebuddy/agents/trellis-research.md +137 -0
- package/dist/templates/codebuddy/index.d.ts +6 -16
- package/dist/templates/codebuddy/index.d.ts.map +1 -1
- package/dist/templates/codebuddy/index.js +6 -36
- package/dist/templates/codebuddy/index.js.map +1 -1
- package/dist/templates/codebuddy/settings.json +59 -0
- package/dist/templates/codex/agents/trellis-check.toml +38 -0
- package/dist/templates/codex/agents/{implement.toml → trellis-implement.toml} +1 -1
- package/dist/templates/codex/agents/trellis-research.toml +60 -0
- package/dist/templates/codex/config.toml +10 -0
- package/dist/templates/codex/hooks/session-start.py +65 -29
- package/dist/templates/codex/hooks.json +11 -0
- package/dist/templates/codex/index.d.ts +0 -1
- package/dist/templates/codex/index.d.ts.map +1 -1
- package/dist/templates/codex/index.js +1 -8
- package/dist/templates/codex/index.js.map +1 -1
- package/dist/templates/codex/skills/start/SKILL.md +1 -1
- package/dist/templates/common/commands/continue.md +51 -0
- package/dist/templates/common/commands/finish-work.md +32 -0
- package/dist/templates/common/commands/start.md +56 -0
- package/dist/templates/common/index.d.ts +28 -0
- package/dist/templates/common/index.d.ts.map +1 -0
- package/dist/templates/common/index.js +55 -0
- package/dist/templates/common/index.js.map +1 -0
- package/dist/templates/{droid/commands/trellis → common/skills}/brainstorm.md +51 -12
- package/dist/templates/{iflow/commands/trellis → common/skills}/break-loop.md +4 -4
- package/dist/templates/common/skills/check.md +87 -0
- package/dist/templates/{codebuddy/commands/trellis → common/skills}/update-spec.md +18 -21
- package/dist/templates/copilot/hooks/session-start.py +65 -29
- package/dist/templates/copilot/hooks.json +8 -0
- package/dist/templates/copilot/prompts/start.prompt.md +13 -16
- package/dist/templates/cursor/agents/trellis-check.md +94 -0
- package/dist/templates/cursor/agents/trellis-implement.md +94 -0
- package/dist/templates/cursor/agents/trellis-research.md +137 -0
- package/dist/templates/cursor/hooks.json +24 -0
- package/dist/templates/cursor/index.d.ts +6 -17
- package/dist/templates/cursor/index.d.ts.map +1 -1
- package/dist/templates/cursor/index.js +6 -37
- package/dist/templates/cursor/index.js.map +1 -1
- package/dist/templates/droid/droids/trellis-check.md +94 -0
- package/dist/templates/droid/droids/trellis-implement.md +94 -0
- package/dist/templates/droid/droids/trellis-research.md +137 -0
- package/dist/templates/droid/index.d.ts +7 -19
- package/dist/templates/droid/index.d.ts.map +1 -1
- package/dist/templates/droid/index.js +7 -39
- package/dist/templates/droid/index.js.map +1 -1
- package/dist/templates/droid/settings.json +59 -0
- package/dist/templates/extract.d.ts +7 -193
- package/dist/templates/extract.d.ts.map +1 -1
- package/dist/templates/extract.js +7 -310
- package/dist/templates/extract.js.map +1 -1
- package/dist/templates/gemini/agents/trellis-check.md +94 -0
- package/dist/templates/gemini/agents/trellis-implement.md +94 -0
- package/dist/templates/gemini/agents/trellis-research.md +137 -0
- package/dist/templates/gemini/index.d.ts +6 -14
- package/dist/templates/gemini/index.d.ts.map +1 -1
- package/dist/templates/gemini/index.js +6 -37
- package/dist/templates/gemini/index.js.map +1 -1
- package/dist/templates/gemini/settings.json +28 -0
- package/dist/templates/kiro/agents/trellis-check.json +13 -0
- package/dist/templates/kiro/agents/trellis-implement.json +13 -0
- package/dist/templates/kiro/agents/trellis-research.json +21 -0
- package/dist/templates/kiro/index.d.ts +11 -11
- package/dist/templates/kiro/index.d.ts.map +1 -1
- package/dist/templates/kiro/index.js +11 -33
- package/dist/templates/kiro/index.js.map +1 -1
- package/dist/templates/opencode/agents/{check.md → trellis-check.md} +3 -30
- package/dist/templates/opencode/agents/{implement.md → trellis-implement.md} +1 -1
- package/dist/templates/opencode/agents/{research.md → trellis-research.md} +1 -2
- package/dist/templates/opencode/plugins/inject-subagent-context.js +18 -190
- package/dist/templates/opencode/plugins/inject-workflow-state.js +172 -0
- package/dist/templates/opencode/plugins/session-start.js +76 -39
- package/dist/templates/qoder/agents/trellis-check.md +94 -0
- package/dist/templates/qoder/agents/trellis-implement.md +94 -0
- package/dist/templates/qoder/agents/trellis-research.md +137 -0
- package/dist/templates/qoder/index.d.ts +7 -10
- package/dist/templates/qoder/index.d.ts.map +1 -1
- package/dist/templates/qoder/index.js +7 -32
- package/dist/templates/qoder/index.js.map +1 -1
- package/dist/templates/qoder/settings.json +47 -0
- package/dist/templates/shared-hooks/index.d.ts +19 -0
- package/dist/templates/shared-hooks/index.d.ts.map +1 -0
- package/dist/templates/shared-hooks/index.js +30 -0
- package/dist/templates/shared-hooks/index.js.map +1 -0
- package/dist/templates/{iflow/hooks → shared-hooks}/inject-subagent-context.py +77 -266
- package/dist/templates/shared-hooks/inject-workflow-state.py +244 -0
- package/dist/templates/{claude/hooks → shared-hooks}/session-start.py +172 -55
- package/dist/templates/template-utils.d.ts +26 -0
- package/dist/templates/template-utils.d.ts.map +1 -0
- package/dist/templates/template-utils.js +60 -0
- package/dist/templates/template-utils.js.map +1 -0
- package/dist/templates/trellis/config.yaml +6 -0
- package/dist/templates/trellis/index.d.ts +1 -15
- package/dist/templates/trellis/index.d.ts.map +1 -1
- package/dist/templates/trellis/index.js +2 -29
- package/dist/templates/trellis/index.js.map +1 -1
- package/dist/templates/trellis/scripts/common/cli_adapter.py +31 -8
- package/dist/templates/trellis/scripts/common/config.py +126 -1
- package/dist/templates/trellis/scripts/common/git_context.py +25 -2
- package/dist/templates/trellis/scripts/common/task_context.py +23 -28
- package/dist/templates/trellis/scripts/common/task_store.py +0 -12
- package/dist/templates/trellis/scripts/common/types.py +0 -2
- package/dist/templates/trellis/scripts/common/workflow_phase.py +176 -0
- package/dist/templates/trellis/scripts/task.py +13 -35
- package/dist/templates/trellis/workflow.md +283 -298
- package/dist/types/ai-tools.d.ts +30 -3
- package/dist/types/ai-tools.d.ts.map +1 -1
- package/dist/types/ai-tools.js +119 -15
- package/dist/types/ai-tools.js.map +1 -1
- package/dist/types/migration.d.ts +8 -1
- package/dist/types/migration.d.ts.map +1 -1
- package/dist/utils/project-detector.d.ts +2 -0
- package/dist/utils/project-detector.d.ts.map +1 -1
- package/dist/utils/project-detector.js +120 -11
- package/dist/utils/project-detector.js.map +1 -1
- package/dist/utils/task-json.d.ts +46 -0
- package/dist/utils/task-json.d.ts.map +1 -0
- package/dist/utils/task-json.js +49 -0
- package/dist/utils/task-json.js.map +1 -0
- package/package.json +3 -2
- package/dist/configurators/iflow.d.ts +0 -33
- package/dist/configurators/iflow.d.ts.map +0 -1
- package/dist/configurators/iflow.js +0 -99
- package/dist/configurators/iflow.js.map +0 -1
- package/dist/templates/antigravity/index.d.ts +0 -12
- package/dist/templates/antigravity/index.d.ts.map +0 -1
- package/dist/templates/antigravity/index.js +0 -29
- package/dist/templates/antigravity/index.js.map +0 -1
- package/dist/templates/claude/agents/debug.md +0 -106
- package/dist/templates/claude/agents/dispatch.md +0 -213
- package/dist/templates/claude/agents/plan.md +0 -396
- package/dist/templates/claude/agents/research.md +0 -120
- package/dist/templates/claude/commands/trellis/brainstorm.md +0 -487
- package/dist/templates/claude/commands/trellis/break-loop.md +0 -125
- package/dist/templates/claude/commands/trellis/check-cross-layer.md +0 -153
- package/dist/templates/claude/commands/trellis/check.md +0 -25
- package/dist/templates/claude/commands/trellis/create-command.md +0 -154
- package/dist/templates/claude/commands/trellis/finish-work.md +0 -153
- package/dist/templates/claude/commands/trellis/integrate-skill.md +0 -219
- package/dist/templates/claude/commands/trellis/onboard.md +0 -358
- package/dist/templates/claude/commands/trellis/parallel.md +0 -192
- package/dist/templates/claude/commands/trellis/record-session.md +0 -62
- package/dist/templates/claude/commands/trellis/start.md +0 -393
- package/dist/templates/claude/commands/trellis/update-spec.md +0 -354
- package/dist/templates/claude/hooks/inject-subagent-context.py +0 -803
- package/dist/templates/claude/hooks/ralph-loop.py +0 -396
- package/dist/templates/codebuddy/commands/trellis/before-dev.md +0 -29
- package/dist/templates/codebuddy/commands/trellis/brainstorm.md +0 -487
- package/dist/templates/codebuddy/commands/trellis/break-loop.md +0 -107
- package/dist/templates/codebuddy/commands/trellis/check-cross-layer.md +0 -153
- package/dist/templates/codebuddy/commands/trellis/check.md +0 -25
- package/dist/templates/codebuddy/commands/trellis/create-command.md +0 -154
- package/dist/templates/codebuddy/commands/trellis/finish-work.md +0 -143
- package/dist/templates/codebuddy/commands/trellis/integrate-skill.md +0 -219
- package/dist/templates/codebuddy/commands/trellis/onboard.md +0 -358
- package/dist/templates/codebuddy/commands/trellis/record-session.md +0 -61
- package/dist/templates/codebuddy/commands/trellis/start.md +0 -373
- package/dist/templates/codex/agents/check.toml +0 -23
- package/dist/templates/codex/agents/research.toml +0 -26
- package/dist/templates/codex/codex-skills/parallel/SKILL.md +0 -194
- package/dist/templates/cursor/commands/trellis-before-dev.md +0 -29
- package/dist/templates/cursor/commands/trellis-brainstorm.md +0 -487
- package/dist/templates/cursor/commands/trellis-break-loop.md +0 -107
- package/dist/templates/cursor/commands/trellis-check-cross-layer.md +0 -153
- package/dist/templates/cursor/commands/trellis-check.md +0 -25
- package/dist/templates/cursor/commands/trellis-create-command.md +0 -154
- package/dist/templates/cursor/commands/trellis-finish-work.md +0 -143
- package/dist/templates/cursor/commands/trellis-integrate-skill.md +0 -219
- package/dist/templates/cursor/commands/trellis-onboard.md +0 -358
- package/dist/templates/cursor/commands/trellis-record-session.md +0 -62
- package/dist/templates/cursor/commands/trellis-start.md +0 -373
- package/dist/templates/cursor/commands/trellis-update-spec.md +0 -354
- package/dist/templates/droid/commands/trellis/before-dev.md +0 -33
- package/dist/templates/droid/commands/trellis/break-loop.md +0 -111
- package/dist/templates/droid/commands/trellis/check-cross-layer.md +0 -157
- package/dist/templates/droid/commands/trellis/check.md +0 -29
- package/dist/templates/droid/commands/trellis/create-command.md +0 -158
- package/dist/templates/droid/commands/trellis/finish-work.md +0 -147
- package/dist/templates/droid/commands/trellis/integrate-skill.md +0 -223
- package/dist/templates/droid/commands/trellis/onboard.md +0 -362
- package/dist/templates/droid/commands/trellis/record-session.md +0 -66
- package/dist/templates/droid/commands/trellis/start.md +0 -377
- package/dist/templates/droid/commands/trellis/update-spec.md +0 -358
- package/dist/templates/gemini/commands/trellis/before-dev.toml +0 -33
- package/dist/templates/gemini/commands/trellis/brainstorm.toml +0 -435
- package/dist/templates/gemini/commands/trellis/break-loop.toml +0 -129
- package/dist/templates/gemini/commands/trellis/check-cross-layer.toml +0 -147
- package/dist/templates/gemini/commands/trellis/check.toml +0 -29
- package/dist/templates/gemini/commands/trellis/create-command.toml +0 -119
- package/dist/templates/gemini/commands/trellis/finish-work.toml +0 -133
- package/dist/templates/gemini/commands/trellis/integrate-skill.toml +0 -104
- package/dist/templates/gemini/commands/trellis/onboard.toml +0 -111
- package/dist/templates/gemini/commands/trellis/record-session.toml +0 -66
- package/dist/templates/gemini/commands/trellis/start.toml +0 -354
- package/dist/templates/gemini/commands/trellis/update-spec.toml +0 -132
- package/dist/templates/iflow/agents/debug.md +0 -106
- package/dist/templates/iflow/agents/dispatch.md +0 -213
- package/dist/templates/iflow/agents/plan.md +0 -396
- package/dist/templates/iflow/agents/research.md +0 -120
- package/dist/templates/iflow/commands/trellis/before-dev.md +0 -29
- package/dist/templates/iflow/commands/trellis/brainstorm.md +0 -487
- package/dist/templates/iflow/commands/trellis/check-cross-layer.md +0 -153
- package/dist/templates/iflow/commands/trellis/check.md +0 -25
- package/dist/templates/iflow/commands/trellis/create-command.md +0 -152
- package/dist/templates/iflow/commands/trellis/finish-work.md +0 -153
- package/dist/templates/iflow/commands/trellis/integrate-skill.md +0 -219
- package/dist/templates/iflow/commands/trellis/onboard.md +0 -358
- package/dist/templates/iflow/commands/trellis/parallel.md +0 -192
- package/dist/templates/iflow/commands/trellis/record-session.md +0 -62
- package/dist/templates/iflow/commands/trellis/start.md +0 -393
- package/dist/templates/iflow/commands/trellis/update-spec.md +0 -354
- package/dist/templates/iflow/hooks/ralph-loop.py +0 -395
- package/dist/templates/iflow/hooks/session-start.py +0 -403
- package/dist/templates/iflow/index.d.ts +0 -54
- package/dist/templates/iflow/index.d.ts.map +0 -1
- package/dist/templates/iflow/index.js +0 -85
- package/dist/templates/iflow/index.js.map +0 -1
- package/dist/templates/iflow/settings.json +0 -60
- package/dist/templates/kilo/index.d.ts +0 -16
- package/dist/templates/kilo/index.d.ts.map +0 -1
- package/dist/templates/kilo/index.js +0 -39
- package/dist/templates/kilo/index.js.map +0 -1
- package/dist/templates/kilo/workflows/before-dev.md +0 -29
- package/dist/templates/kilo/workflows/brainstorm.md +0 -487
- package/dist/templates/kilo/workflows/break-loop.md +0 -125
- package/dist/templates/kilo/workflows/check-cross-layer.md +0 -153
- package/dist/templates/kilo/workflows/check.md +0 -25
- package/dist/templates/kilo/workflows/create-command.md +0 -152
- package/dist/templates/kilo/workflows/finish-work.md +0 -129
- package/dist/templates/kilo/workflows/integrate-skill.md +0 -219
- package/dist/templates/kilo/workflows/onboard.md +0 -358
- package/dist/templates/kilo/workflows/parallel.md +0 -193
- package/dist/templates/kilo/workflows/record-session.md +0 -62
- package/dist/templates/kilo/workflows/start.md +0 -387
- package/dist/templates/kilo/workflows/update-spec.md +0 -285
- package/dist/templates/kiro/skills/before-dev/SKILL.md +0 -34
- package/dist/templates/kiro/skills/brainstorm/SKILL.md +0 -492
- package/dist/templates/kiro/skills/break-loop/SKILL.md +0 -130
- package/dist/templates/kiro/skills/check/SKILL.md +0 -30
- package/dist/templates/kiro/skills/check-cross-layer/SKILL.md +0 -158
- package/dist/templates/kiro/skills/create-command/SKILL.md +0 -101
- package/dist/templates/kiro/skills/finish-work/SKILL.md +0 -148
- package/dist/templates/kiro/skills/integrate-skill/SKILL.md +0 -221
- package/dist/templates/kiro/skills/onboard/SKILL.md +0 -363
- package/dist/templates/kiro/skills/record-session/SKILL.md +0 -67
- package/dist/templates/kiro/skills/start/SKILL.md +0 -351
- package/dist/templates/kiro/skills/update-spec/SKILL.md +0 -335
- package/dist/templates/markdown/spec/backend/directory-structure.md +0 -292
- package/dist/templates/markdown/spec/backend/index.md +0 -40
- package/dist/templates/markdown/spec/backend/script-conventions.md +0 -742
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md +0 -118
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md +0 -394
- package/dist/templates/opencode/agents/debug.md +0 -129
- package/dist/templates/opencode/agents/dispatch.md +0 -223
- package/dist/templates/opencode/agents/trellis-plan.md +0 -427
- package/dist/templates/opencode/commands/trellis/before-dev.md +0 -29
- package/dist/templates/opencode/commands/trellis/brainstorm.md +0 -487
- package/dist/templates/opencode/commands/trellis/break-loop.md +0 -125
- package/dist/templates/opencode/commands/trellis/check-cross-layer.md +0 -153
- package/dist/templates/opencode/commands/trellis/check.md +0 -25
- package/dist/templates/opencode/commands/trellis/create-command.md +0 -154
- package/dist/templates/opencode/commands/trellis/finish-work.md +0 -144
- package/dist/templates/opencode/commands/trellis/integrate-skill.md +0 -219
- package/dist/templates/opencode/commands/trellis/migrate-specs.md +0 -0
- package/dist/templates/opencode/commands/trellis/onboard.md +0 -358
- package/dist/templates/opencode/commands/trellis/parallel.md +0 -193
- package/dist/templates/opencode/commands/trellis/record-session.md +0 -62
- package/dist/templates/opencode/commands/trellis/start.md +0 -351
- package/dist/templates/opencode/commands/trellis/update-spec.md +0 -354
- package/dist/templates/qoder/skills/before-dev/SKILL.md +0 -34
- package/dist/templates/qoder/skills/brainstorm/SKILL.md +0 -492
- package/dist/templates/qoder/skills/break-loop/SKILL.md +0 -130
- package/dist/templates/qoder/skills/check/SKILL.md +0 -30
- package/dist/templates/qoder/skills/check-cross-layer/SKILL.md +0 -158
- package/dist/templates/qoder/skills/create-command/SKILL.md +0 -101
- package/dist/templates/qoder/skills/finish-work/SKILL.md +0 -134
- package/dist/templates/qoder/skills/integrate-skill/SKILL.md +0 -221
- package/dist/templates/qoder/skills/onboard/SKILL.md +0 -363
- package/dist/templates/qoder/skills/record-session/SKILL.md +0 -67
- package/dist/templates/qoder/skills/start/SKILL.md +0 -388
- package/dist/templates/qoder/skills/update-spec/SKILL.md +0 -290
- package/dist/templates/trellis/scripts/common/phase.py +0 -254
- package/dist/templates/trellis/scripts/common/registry.py +0 -335
- package/dist/templates/trellis/scripts/common/worktree.py +0 -305
- package/dist/templates/trellis/scripts/create_bootstrap.py +0 -298
- package/dist/templates/trellis/scripts/multi_agent/__init__.py +0 -5
- package/dist/templates/trellis/scripts/multi_agent/_bootstrap.py +0 -17
- package/dist/templates/trellis/scripts/multi_agent/cleanup.py +0 -398
- package/dist/templates/trellis/scripts/multi_agent/create_pr.py +0 -620
- package/dist/templates/trellis/scripts/multi_agent/plan.py +0 -213
- package/dist/templates/trellis/scripts/multi_agent/start.py +0 -539
- package/dist/templates/trellis/scripts/multi_agent/status.py +0 -76
- package/dist/templates/trellis/scripts/multi_agent/status_display.py +0 -542
- package/dist/templates/trellis/scripts/multi_agent/status_monitor.py +0 -225
- package/dist/templates/trellis/scripts-shell-archive/add-session.sh +0 -384
- package/dist/templates/trellis/scripts-shell-archive/common/developer.sh +0 -129
- package/dist/templates/trellis/scripts-shell-archive/common/git-context.sh +0 -263
- package/dist/templates/trellis/scripts-shell-archive/common/paths.sh +0 -208
- package/dist/templates/trellis/scripts-shell-archive/common/phase.sh +0 -150
- package/dist/templates/trellis/scripts-shell-archive/common/registry.sh +0 -247
- package/dist/templates/trellis/scripts-shell-archive/common/task-queue.sh +0 -142
- package/dist/templates/trellis/scripts-shell-archive/common/task-utils.sh +0 -151
- package/dist/templates/trellis/scripts-shell-archive/common/worktree.sh +0 -128
- package/dist/templates/trellis/scripts-shell-archive/create-bootstrap.sh +0 -299
- package/dist/templates/trellis/scripts-shell-archive/get-context.sh +0 -7
- package/dist/templates/trellis/scripts-shell-archive/get-developer.sh +0 -15
- package/dist/templates/trellis/scripts-shell-archive/init-developer.sh +0 -34
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/cleanup.sh +0 -396
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/create-pr.sh +0 -241
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/plan.sh +0 -207
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/start.sh +0 -317
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/status.sh +0 -828
- package/dist/templates/trellis/scripts-shell-archive/task.sh +0 -1204
- package/dist/templates/trellis/worktree.yaml +0 -47
- package/dist/templates/windsurf/index.d.ts +0 -21
- package/dist/templates/windsurf/index.d.ts.map +0 -1
- package/dist/templates/windsurf/index.js +0 -44
- package/dist/templates/windsurf/index.js.map +0 -1
- package/dist/templates/windsurf/workflows/trellis-before-dev.md +0 -31
- package/dist/templates/windsurf/workflows/trellis-brainstorm.md +0 -491
- package/dist/templates/windsurf/workflows/trellis-break-loop.md +0 -111
- package/dist/templates/windsurf/workflows/trellis-check-cross-layer.md +0 -157
- package/dist/templates/windsurf/workflows/trellis-check.md +0 -27
- package/dist/templates/windsurf/workflows/trellis-create-command.md +0 -154
- package/dist/templates/windsurf/workflows/trellis-finish-work.md +0 -147
- package/dist/templates/windsurf/workflows/trellis-integrate-skill.md +0 -220
- package/dist/templates/windsurf/workflows/trellis-onboard.md +0 -362
- package/dist/templates/windsurf/workflows/trellis-record-session.md +0 -66
- package/dist/templates/windsurf/workflows/trellis-start.md +0 -373
- package/dist/templates/windsurf/workflows/trellis-update-spec.md +0 -358
- /package/dist/templates/{claude/commands/trellis → common/skills}/before-dev.md +0 -0
- /package/dist/templates/{claude/hooks → shared-hooks}/statusline.py +0 -0
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Phase Management Utilities.
|
|
4
|
-
|
|
5
|
-
Centralized phase tracking for multi-agent pipeline.
|
|
6
|
-
|
|
7
|
-
Provides:
|
|
8
|
-
get_current_phase - Returns current phase number
|
|
9
|
-
get_total_phases - Returns total phase count
|
|
10
|
-
get_phase_action - Returns action name for phase
|
|
11
|
-
get_phase_info - Returns "N/M (action)" format
|
|
12
|
-
set_phase - Sets current_phase
|
|
13
|
-
advance_phase - Advances to next phase
|
|
14
|
-
get_phase_for_action - Returns phase number for action
|
|
15
|
-
map_subagent_to_action - Map subagent type to action name
|
|
16
|
-
is_phase_completed - Check if phase is completed
|
|
17
|
-
is_current_action - Check if at specific action
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
from __future__ import annotations
|
|
21
|
-
|
|
22
|
-
from pathlib import Path
|
|
23
|
-
|
|
24
|
-
from .io import read_json, write_json
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
# =============================================================================
|
|
28
|
-
# Internal Helpers (operate on pre-loaded data dict)
|
|
29
|
-
# =============================================================================
|
|
30
|
-
|
|
31
|
-
def _total_phases(data: dict) -> int:
|
|
32
|
-
"""Get total phases from pre-loaded data."""
|
|
33
|
-
next_action = data.get("next_action", [])
|
|
34
|
-
return len(next_action) if isinstance(next_action, list) else 0
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def _phase_action(data: dict, phase: int) -> str:
|
|
38
|
-
"""Get action name for a phase from pre-loaded data."""
|
|
39
|
-
next_action = data.get("next_action", [])
|
|
40
|
-
if isinstance(next_action, list):
|
|
41
|
-
for item in next_action:
|
|
42
|
-
if isinstance(item, dict) and item.get("phase") == phase:
|
|
43
|
-
return item.get("action", "unknown")
|
|
44
|
-
return "unknown"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
def _phase_for_action(data: dict, action: str) -> int:
|
|
48
|
-
"""Get phase number for an action name from pre-loaded data."""
|
|
49
|
-
next_action = data.get("next_action", [])
|
|
50
|
-
if isinstance(next_action, list):
|
|
51
|
-
for item in next_action:
|
|
52
|
-
if isinstance(item, dict) and item.get("action") == action:
|
|
53
|
-
return item.get("phase", 0)
|
|
54
|
-
return 0
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
# =============================================================================
|
|
58
|
-
# Phase Functions
|
|
59
|
-
# =============================================================================
|
|
60
|
-
|
|
61
|
-
def get_current_phase(task_json: Path) -> int:
|
|
62
|
-
"""Get current phase number.
|
|
63
|
-
|
|
64
|
-
Args:
|
|
65
|
-
task_json: Path to task.json file.
|
|
66
|
-
|
|
67
|
-
Returns:
|
|
68
|
-
Current phase number, or 0 if not found.
|
|
69
|
-
"""
|
|
70
|
-
data = read_json(task_json)
|
|
71
|
-
if not data:
|
|
72
|
-
return 0
|
|
73
|
-
return data.get("current_phase", 0) or 0
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def get_total_phases(task_json: Path) -> int:
|
|
77
|
-
"""Get total number of phases.
|
|
78
|
-
|
|
79
|
-
Args:
|
|
80
|
-
task_json: Path to task.json file.
|
|
81
|
-
|
|
82
|
-
Returns:
|
|
83
|
-
Total phase count, or 0 if not found.
|
|
84
|
-
"""
|
|
85
|
-
data = read_json(task_json)
|
|
86
|
-
if not data:
|
|
87
|
-
return 0
|
|
88
|
-
return _total_phases(data)
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
def get_phase_action(task_json: Path, phase: int) -> str:
|
|
92
|
-
"""Get action name for a specific phase.
|
|
93
|
-
|
|
94
|
-
Args:
|
|
95
|
-
task_json: Path to task.json file.
|
|
96
|
-
phase: Phase number.
|
|
97
|
-
|
|
98
|
-
Returns:
|
|
99
|
-
Action name, or "unknown" if not found.
|
|
100
|
-
"""
|
|
101
|
-
data = read_json(task_json)
|
|
102
|
-
if not data:
|
|
103
|
-
return "unknown"
|
|
104
|
-
return _phase_action(data, phase)
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
def get_phase_info(task_json: Path) -> str:
|
|
108
|
-
"""Get formatted phase info: "N/M (action)".
|
|
109
|
-
|
|
110
|
-
Args:
|
|
111
|
-
task_json: Path to task.json file.
|
|
112
|
-
|
|
113
|
-
Returns:
|
|
114
|
-
Formatted string like "1/4 (implement)".
|
|
115
|
-
"""
|
|
116
|
-
data = read_json(task_json)
|
|
117
|
-
if not data:
|
|
118
|
-
return "N/A"
|
|
119
|
-
|
|
120
|
-
current_phase = data.get("current_phase", 0) or 0
|
|
121
|
-
total = _total_phases(data)
|
|
122
|
-
action_name = _phase_action(data, current_phase)
|
|
123
|
-
|
|
124
|
-
if current_phase == 0 or current_phase is None:
|
|
125
|
-
return f"0/{total} (pending)"
|
|
126
|
-
else:
|
|
127
|
-
return f"{current_phase}/{total} ({action_name})"
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def set_phase(task_json: Path, phase: int) -> bool:
|
|
131
|
-
"""Set current phase to a specific value.
|
|
132
|
-
|
|
133
|
-
Args:
|
|
134
|
-
task_json: Path to task.json file.
|
|
135
|
-
phase: Phase number to set.
|
|
136
|
-
|
|
137
|
-
Returns:
|
|
138
|
-
True on success, False on error.
|
|
139
|
-
"""
|
|
140
|
-
data = read_json(task_json)
|
|
141
|
-
if not data:
|
|
142
|
-
return False
|
|
143
|
-
|
|
144
|
-
data["current_phase"] = phase
|
|
145
|
-
return write_json(task_json, data)
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
def advance_phase(task_json: Path) -> bool:
|
|
149
|
-
"""Advance to next phase.
|
|
150
|
-
|
|
151
|
-
Args:
|
|
152
|
-
task_json: Path to task.json file.
|
|
153
|
-
|
|
154
|
-
Returns:
|
|
155
|
-
True on success, False on error or at final phase.
|
|
156
|
-
"""
|
|
157
|
-
data = read_json(task_json)
|
|
158
|
-
if not data:
|
|
159
|
-
return False
|
|
160
|
-
|
|
161
|
-
current = data.get("current_phase", 0) or 0
|
|
162
|
-
total = _total_phases(data)
|
|
163
|
-
next_phase = current + 1
|
|
164
|
-
|
|
165
|
-
if next_phase > total:
|
|
166
|
-
return False # Already at final phase
|
|
167
|
-
|
|
168
|
-
data["current_phase"] = next_phase
|
|
169
|
-
return write_json(task_json, data)
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
def get_phase_for_action(task_json: Path, action: str) -> int:
|
|
173
|
-
"""Get phase number for a specific action name.
|
|
174
|
-
|
|
175
|
-
Args:
|
|
176
|
-
task_json: Path to task.json file.
|
|
177
|
-
action: Action name.
|
|
178
|
-
|
|
179
|
-
Returns:
|
|
180
|
-
Phase number, or 0 if not found.
|
|
181
|
-
"""
|
|
182
|
-
data = read_json(task_json)
|
|
183
|
-
if not data:
|
|
184
|
-
return 0
|
|
185
|
-
return _phase_for_action(data, action)
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
def map_subagent_to_action(subagent_type: str) -> str:
|
|
189
|
-
"""Map subagent type to action name.
|
|
190
|
-
|
|
191
|
-
Used by hooks to determine which action a subagent corresponds to.
|
|
192
|
-
|
|
193
|
-
Args:
|
|
194
|
-
subagent_type: Subagent type string.
|
|
195
|
-
|
|
196
|
-
Returns:
|
|
197
|
-
Corresponding action name.
|
|
198
|
-
"""
|
|
199
|
-
mapping = {
|
|
200
|
-
"implement": "implement",
|
|
201
|
-
"check": "check",
|
|
202
|
-
"debug": "debug",
|
|
203
|
-
"research": "research",
|
|
204
|
-
}
|
|
205
|
-
return mapping.get(subagent_type, subagent_type)
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
def is_phase_completed(task_json: Path, phase: int) -> bool:
|
|
209
|
-
"""Check if a phase is completed (current_phase > phase).
|
|
210
|
-
|
|
211
|
-
Args:
|
|
212
|
-
task_json: Path to task.json file.
|
|
213
|
-
phase: Phase number to check.
|
|
214
|
-
|
|
215
|
-
Returns:
|
|
216
|
-
True if phase is completed.
|
|
217
|
-
"""
|
|
218
|
-
current = get_current_phase(task_json)
|
|
219
|
-
return current > phase
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
def is_current_action(task_json: Path, action: str) -> bool:
|
|
223
|
-
"""Check if we're at a specific action.
|
|
224
|
-
|
|
225
|
-
Args:
|
|
226
|
-
task_json: Path to task.json file.
|
|
227
|
-
action: Action name to check.
|
|
228
|
-
|
|
229
|
-
Returns:
|
|
230
|
-
True if current phase matches the action.
|
|
231
|
-
"""
|
|
232
|
-
data = read_json(task_json)
|
|
233
|
-
if not data:
|
|
234
|
-
return False
|
|
235
|
-
current = data.get("current_phase", 0) or 0
|
|
236
|
-
action_phase = _phase_for_action(data, action)
|
|
237
|
-
return current == action_phase
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
# =============================================================================
|
|
241
|
-
# Main Entry (for testing)
|
|
242
|
-
# =============================================================================
|
|
243
|
-
|
|
244
|
-
if __name__ == "__main__":
|
|
245
|
-
import sys
|
|
246
|
-
|
|
247
|
-
if len(sys.argv) > 1:
|
|
248
|
-
path = Path(sys.argv[1])
|
|
249
|
-
print(f"Task JSON: {path}")
|
|
250
|
-
print(f"Phase info: {get_phase_info(path)}")
|
|
251
|
-
print(f"Current phase: {get_current_phase(path)}")
|
|
252
|
-
print(f"Total phases: {get_total_phases(path)}")
|
|
253
|
-
else:
|
|
254
|
-
print("Usage: python3 phase.py <task.json>")
|
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Registry utility functions for multi-agent pipeline.
|
|
4
|
-
|
|
5
|
-
Provides:
|
|
6
|
-
registry_get_file - Get registry file path
|
|
7
|
-
registry_get_agent_by_id - Find agent by ID
|
|
8
|
-
registry_get_agent_by_worktree - Find agent by worktree path
|
|
9
|
-
registry_get_task_dir - Get task dir for a worktree
|
|
10
|
-
registry_remove_by_id - Remove agent by ID
|
|
11
|
-
registry_remove_by_worktree - Remove agent by worktree path
|
|
12
|
-
registry_add_agent - Add agent to registry
|
|
13
|
-
registry_search_agent - Search agent by ID or task_dir
|
|
14
|
-
registry_list_agents - List all agents
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
from datetime import datetime
|
|
20
|
-
from pathlib import Path
|
|
21
|
-
|
|
22
|
-
from .io import read_json, write_json
|
|
23
|
-
from .paths import get_repo_root
|
|
24
|
-
from .worktree import get_agents_dir
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
# =============================================================================
|
|
28
|
-
# Internal Helpers
|
|
29
|
-
# =============================================================================
|
|
30
|
-
|
|
31
|
-
def _load_registry(
|
|
32
|
-
repo_root: Path | None = None,
|
|
33
|
-
) -> tuple[Path | None, dict | None]:
|
|
34
|
-
"""Load registry file and data in one step.
|
|
35
|
-
|
|
36
|
-
Returns:
|
|
37
|
-
(registry_file_path, data_dict) — either may be None.
|
|
38
|
-
"""
|
|
39
|
-
if repo_root is None:
|
|
40
|
-
repo_root = get_repo_root()
|
|
41
|
-
|
|
42
|
-
registry_file = registry_get_file(repo_root)
|
|
43
|
-
if not registry_file or not registry_file.is_file():
|
|
44
|
-
return registry_file, None
|
|
45
|
-
|
|
46
|
-
data = read_json(registry_file)
|
|
47
|
-
return registry_file, data
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
# =============================================================================
|
|
51
|
-
# Registry File Access
|
|
52
|
-
# =============================================================================
|
|
53
|
-
|
|
54
|
-
def registry_get_file(repo_root: Path | None = None) -> Path | None:
|
|
55
|
-
"""Get registry file path.
|
|
56
|
-
|
|
57
|
-
Args:
|
|
58
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
59
|
-
|
|
60
|
-
Returns:
|
|
61
|
-
Path to registry.json, or None if agents dir not found.
|
|
62
|
-
"""
|
|
63
|
-
if repo_root is None:
|
|
64
|
-
repo_root = get_repo_root()
|
|
65
|
-
|
|
66
|
-
agents_dir = get_agents_dir(repo_root)
|
|
67
|
-
if agents_dir:
|
|
68
|
-
return agents_dir / "registry.json"
|
|
69
|
-
return None
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
def _ensure_registry(repo_root: Path | None = None) -> Path | None:
|
|
73
|
-
"""Ensure registry file exists with valid structure.
|
|
74
|
-
|
|
75
|
-
Args:
|
|
76
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
77
|
-
|
|
78
|
-
Returns:
|
|
79
|
-
Path to registry file, or None if cannot create.
|
|
80
|
-
"""
|
|
81
|
-
if repo_root is None:
|
|
82
|
-
repo_root = get_repo_root()
|
|
83
|
-
|
|
84
|
-
registry_file = registry_get_file(repo_root)
|
|
85
|
-
if not registry_file:
|
|
86
|
-
return None
|
|
87
|
-
|
|
88
|
-
agents_dir = registry_file.parent
|
|
89
|
-
|
|
90
|
-
try:
|
|
91
|
-
agents_dir.mkdir(parents=True, exist_ok=True)
|
|
92
|
-
|
|
93
|
-
if not registry_file.exists():
|
|
94
|
-
write_json(registry_file, {"agents": []})
|
|
95
|
-
|
|
96
|
-
return registry_file
|
|
97
|
-
except (OSError, IOError):
|
|
98
|
-
return None
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
# =============================================================================
|
|
102
|
-
# Agent Lookup
|
|
103
|
-
# =============================================================================
|
|
104
|
-
|
|
105
|
-
def registry_get_agent_by_id(
|
|
106
|
-
agent_id: str,
|
|
107
|
-
repo_root: Path | None = None
|
|
108
|
-
) -> dict | None:
|
|
109
|
-
"""Get agent by ID.
|
|
110
|
-
|
|
111
|
-
Args:
|
|
112
|
-
agent_id: Agent ID.
|
|
113
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
114
|
-
|
|
115
|
-
Returns:
|
|
116
|
-
Agent dict, or None if not found.
|
|
117
|
-
"""
|
|
118
|
-
_, data = _load_registry(repo_root)
|
|
119
|
-
if not data:
|
|
120
|
-
return None
|
|
121
|
-
|
|
122
|
-
for agent in data.get("agents", []):
|
|
123
|
-
if agent.get("id") == agent_id:
|
|
124
|
-
return agent
|
|
125
|
-
|
|
126
|
-
return None
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
def registry_get_agent_by_worktree(
|
|
130
|
-
worktree_path: str,
|
|
131
|
-
repo_root: Path | None = None
|
|
132
|
-
) -> dict | None:
|
|
133
|
-
"""Get agent by worktree path.
|
|
134
|
-
|
|
135
|
-
Args:
|
|
136
|
-
worktree_path: Worktree path.
|
|
137
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
138
|
-
|
|
139
|
-
Returns:
|
|
140
|
-
Agent dict, or None if not found.
|
|
141
|
-
"""
|
|
142
|
-
_, data = _load_registry(repo_root)
|
|
143
|
-
if not data:
|
|
144
|
-
return None
|
|
145
|
-
|
|
146
|
-
for agent in data.get("agents", []):
|
|
147
|
-
if agent.get("worktree_path") == worktree_path:
|
|
148
|
-
return agent
|
|
149
|
-
|
|
150
|
-
return None
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
def registry_search_agent(
|
|
154
|
-
search: str,
|
|
155
|
-
repo_root: Path | None = None
|
|
156
|
-
) -> dict | None:
|
|
157
|
-
"""Search agent by ID or task_dir containing search term.
|
|
158
|
-
|
|
159
|
-
Args:
|
|
160
|
-
search: Search term.
|
|
161
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
162
|
-
|
|
163
|
-
Returns:
|
|
164
|
-
First matching agent dict, or None if not found.
|
|
165
|
-
"""
|
|
166
|
-
_, data = _load_registry(repo_root)
|
|
167
|
-
if not data:
|
|
168
|
-
return None
|
|
169
|
-
|
|
170
|
-
for agent in data.get("agents", []):
|
|
171
|
-
# Exact ID match
|
|
172
|
-
if agent.get("id") == search:
|
|
173
|
-
return agent
|
|
174
|
-
# Partial match on task_dir
|
|
175
|
-
task_dir = agent.get("task_dir", "")
|
|
176
|
-
if search in task_dir:
|
|
177
|
-
return agent
|
|
178
|
-
|
|
179
|
-
return None
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
def registry_get_task_dir(
|
|
183
|
-
worktree_path: str,
|
|
184
|
-
repo_root: Path | None = None
|
|
185
|
-
) -> str | None:
|
|
186
|
-
"""Get task directory for a worktree.
|
|
187
|
-
|
|
188
|
-
Args:
|
|
189
|
-
worktree_path: Worktree path.
|
|
190
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
191
|
-
|
|
192
|
-
Returns:
|
|
193
|
-
Task directory path, or None if not found.
|
|
194
|
-
"""
|
|
195
|
-
_, data = _load_registry(repo_root)
|
|
196
|
-
if not data:
|
|
197
|
-
return None
|
|
198
|
-
|
|
199
|
-
for agent in data.get("agents", []):
|
|
200
|
-
if agent.get("worktree_path") == worktree_path:
|
|
201
|
-
return agent.get("task_dir")
|
|
202
|
-
|
|
203
|
-
return None
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
# =============================================================================
|
|
207
|
-
# Agent Modification
|
|
208
|
-
# =============================================================================
|
|
209
|
-
|
|
210
|
-
def registry_remove_by_id(agent_id: str, repo_root: Path | None = None) -> bool:
|
|
211
|
-
"""Remove agent by ID.
|
|
212
|
-
|
|
213
|
-
Args:
|
|
214
|
-
agent_id: Agent ID.
|
|
215
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
216
|
-
|
|
217
|
-
Returns:
|
|
218
|
-
True on success.
|
|
219
|
-
"""
|
|
220
|
-
registry_file, data = _load_registry(repo_root)
|
|
221
|
-
if not registry_file or not data:
|
|
222
|
-
return True # Nothing to remove
|
|
223
|
-
|
|
224
|
-
agents = data.get("agents", [])
|
|
225
|
-
data["agents"] = [a for a in agents if a.get("id") != agent_id]
|
|
226
|
-
|
|
227
|
-
return write_json(registry_file, data)
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
def registry_remove_by_worktree(
|
|
231
|
-
worktree_path: str,
|
|
232
|
-
repo_root: Path | None = None
|
|
233
|
-
) -> bool:
|
|
234
|
-
"""Remove agent by worktree path.
|
|
235
|
-
|
|
236
|
-
Args:
|
|
237
|
-
worktree_path: Worktree path.
|
|
238
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
239
|
-
|
|
240
|
-
Returns:
|
|
241
|
-
True on success.
|
|
242
|
-
"""
|
|
243
|
-
registry_file, data = _load_registry(repo_root)
|
|
244
|
-
if not registry_file or not data:
|
|
245
|
-
return True # Nothing to remove
|
|
246
|
-
|
|
247
|
-
agents = data.get("agents", [])
|
|
248
|
-
data["agents"] = [a for a in agents if a.get("worktree_path") != worktree_path]
|
|
249
|
-
|
|
250
|
-
return write_json(registry_file, data)
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
def registry_add_agent(
|
|
254
|
-
agent_id: str,
|
|
255
|
-
worktree_path: str,
|
|
256
|
-
pid: int,
|
|
257
|
-
task_dir: str,
|
|
258
|
-
repo_root: Path | None = None,
|
|
259
|
-
platform: str = "claude",
|
|
260
|
-
) -> bool:
|
|
261
|
-
"""Add agent to registry (replaces if same ID exists).
|
|
262
|
-
|
|
263
|
-
Args:
|
|
264
|
-
agent_id: Agent ID.
|
|
265
|
-
worktree_path: Worktree path.
|
|
266
|
-
pid: Process ID.
|
|
267
|
-
task_dir: Task directory path.
|
|
268
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
269
|
-
platform: Platform used (e.g., 'claude', 'opencode', 'codex', 'kiro', 'antigravity'). Defaults to 'claude'.
|
|
270
|
-
|
|
271
|
-
Returns:
|
|
272
|
-
True on success.
|
|
273
|
-
"""
|
|
274
|
-
if repo_root is None:
|
|
275
|
-
repo_root = get_repo_root()
|
|
276
|
-
|
|
277
|
-
registry_file = _ensure_registry(repo_root)
|
|
278
|
-
if not registry_file:
|
|
279
|
-
return False
|
|
280
|
-
|
|
281
|
-
data = read_json(registry_file)
|
|
282
|
-
if not data:
|
|
283
|
-
data = {"agents": []}
|
|
284
|
-
|
|
285
|
-
# Remove existing agent with same ID
|
|
286
|
-
agents = data.get("agents", [])
|
|
287
|
-
agents = [a for a in agents if a.get("id") != agent_id]
|
|
288
|
-
|
|
289
|
-
# Create new agent record
|
|
290
|
-
started_at = datetime.now().isoformat()
|
|
291
|
-
new_agent = {
|
|
292
|
-
"id": agent_id,
|
|
293
|
-
"worktree_path": worktree_path,
|
|
294
|
-
"pid": pid,
|
|
295
|
-
"started_at": started_at,
|
|
296
|
-
"task_dir": task_dir,
|
|
297
|
-
"platform": platform,
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
agents.append(new_agent)
|
|
301
|
-
data["agents"] = agents
|
|
302
|
-
|
|
303
|
-
return write_json(registry_file, data)
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
def registry_list_agents(repo_root: Path | None = None) -> list[dict]:
|
|
307
|
-
"""List all agents.
|
|
308
|
-
|
|
309
|
-
Args:
|
|
310
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
311
|
-
|
|
312
|
-
Returns:
|
|
313
|
-
List of agent dicts.
|
|
314
|
-
"""
|
|
315
|
-
_, data = _load_registry(repo_root)
|
|
316
|
-
if not data:
|
|
317
|
-
return []
|
|
318
|
-
|
|
319
|
-
return data.get("agents", [])
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
# =============================================================================
|
|
323
|
-
# Main Entry (for testing)
|
|
324
|
-
# =============================================================================
|
|
325
|
-
|
|
326
|
-
if __name__ == "__main__":
|
|
327
|
-
import json as json_mod
|
|
328
|
-
|
|
329
|
-
repo = get_repo_root()
|
|
330
|
-
print(f"Repository root: {repo}")
|
|
331
|
-
print(f"Registry file: {registry_get_file(repo)}")
|
|
332
|
-
print()
|
|
333
|
-
print("Agents:")
|
|
334
|
-
agents = registry_list_agents(repo)
|
|
335
|
-
print(json_mod.dumps(agents, indent=2))
|