@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,305 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Worktree utilities for Multi-Agent Pipeline.
|
|
4
|
-
|
|
5
|
-
Provides:
|
|
6
|
-
get_worktree_config - Get worktree.yaml path
|
|
7
|
-
get_worktree_base_dir - Get worktree storage directory
|
|
8
|
-
get_worktree_copy_files - Get files to copy list
|
|
9
|
-
get_worktree_post_create_hooks - Get post-create hooks
|
|
10
|
-
get_agents_dir - Get agents registry directory
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
from __future__ import annotations
|
|
14
|
-
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
|
|
17
|
-
from .paths import (
|
|
18
|
-
DIR_WORKFLOW,
|
|
19
|
-
get_repo_root,
|
|
20
|
-
get_workspace_dir,
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
# =============================================================================
|
|
25
|
-
# YAML Simple Parser (no dependencies)
|
|
26
|
-
# =============================================================================
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def _unquote(s: str) -> str:
|
|
30
|
-
"""Remove exactly one layer of matching surrounding quotes.
|
|
31
|
-
|
|
32
|
-
Unlike str.strip('"'), this only removes the outermost pair,
|
|
33
|
-
preserving any nested quotes inside the value.
|
|
34
|
-
|
|
35
|
-
Examples:
|
|
36
|
-
_unquote('"hello"') -> 'hello'
|
|
37
|
-
_unquote("'hello'") -> 'hello'
|
|
38
|
-
_unquote('"echo \\'hi\\'"') -> "echo 'hi'"
|
|
39
|
-
_unquote('hello') -> 'hello'
|
|
40
|
-
_unquote('"hello\\'') -> '"hello\\'' (mismatched, unchanged)
|
|
41
|
-
"""
|
|
42
|
-
if len(s) >= 2 and s[0] == s[-1] and s[0] in ('"', "'"):
|
|
43
|
-
return s[1:-1]
|
|
44
|
-
return s
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
def parse_simple_yaml(content: str) -> dict:
|
|
48
|
-
"""Parse simple YAML with nested dict support (no dependencies).
|
|
49
|
-
|
|
50
|
-
Supports:
|
|
51
|
-
- key: value (string)
|
|
52
|
-
- key: (followed by list items)
|
|
53
|
-
- item1
|
|
54
|
-
- item2
|
|
55
|
-
- key: (followed by nested dict)
|
|
56
|
-
nested_key: value
|
|
57
|
-
nested_key2:
|
|
58
|
-
- item
|
|
59
|
-
|
|
60
|
-
Uses indentation to detect nesting (2+ spaces deeper = child).
|
|
61
|
-
|
|
62
|
-
Args:
|
|
63
|
-
content: YAML content string.
|
|
64
|
-
|
|
65
|
-
Returns:
|
|
66
|
-
Parsed dict (values can be str, list[str], or dict).
|
|
67
|
-
"""
|
|
68
|
-
lines = content.splitlines()
|
|
69
|
-
result: dict = {}
|
|
70
|
-
_parse_yaml_block(lines, 0, 0, result)
|
|
71
|
-
return result
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def _parse_yaml_block(
|
|
75
|
-
lines: list[str], start: int, min_indent: int, target: dict
|
|
76
|
-
) -> int:
|
|
77
|
-
"""Parse a YAML block into target dict, returning next line index."""
|
|
78
|
-
i = start
|
|
79
|
-
current_list: list | None = None
|
|
80
|
-
|
|
81
|
-
while i < len(lines):
|
|
82
|
-
line = lines[i]
|
|
83
|
-
stripped = line.strip()
|
|
84
|
-
|
|
85
|
-
# Skip empty lines and comments
|
|
86
|
-
if not stripped or stripped.startswith("#"):
|
|
87
|
-
i += 1
|
|
88
|
-
continue
|
|
89
|
-
|
|
90
|
-
# Calculate indentation
|
|
91
|
-
indent = len(line) - len(line.lstrip())
|
|
92
|
-
|
|
93
|
-
# If dedented past our block, we're done
|
|
94
|
-
if indent < min_indent:
|
|
95
|
-
break
|
|
96
|
-
|
|
97
|
-
if stripped.startswith("- "):
|
|
98
|
-
if current_list is not None:
|
|
99
|
-
current_list.append(_unquote(stripped[2:].strip()))
|
|
100
|
-
i += 1
|
|
101
|
-
elif ":" in stripped:
|
|
102
|
-
key, _, value = stripped.partition(":")
|
|
103
|
-
key = key.strip()
|
|
104
|
-
value = _unquote(value.strip())
|
|
105
|
-
current_list = None
|
|
106
|
-
|
|
107
|
-
if value:
|
|
108
|
-
# key: value
|
|
109
|
-
target[key] = value
|
|
110
|
-
i += 1
|
|
111
|
-
else:
|
|
112
|
-
# key: (no value) — peek ahead to determine list vs nested dict
|
|
113
|
-
next_i, next_line = _next_content_line(lines, i + 1)
|
|
114
|
-
if next_i >= len(lines):
|
|
115
|
-
target[key] = {}
|
|
116
|
-
i = next_i
|
|
117
|
-
elif next_line.strip().startswith("- "):
|
|
118
|
-
# It's a list
|
|
119
|
-
current_list = []
|
|
120
|
-
target[key] = current_list
|
|
121
|
-
i += 1
|
|
122
|
-
else:
|
|
123
|
-
next_indent = len(next_line) - len(next_line.lstrip())
|
|
124
|
-
if next_indent > indent:
|
|
125
|
-
# It's a nested dict
|
|
126
|
-
nested: dict = {}
|
|
127
|
-
target[key] = nested
|
|
128
|
-
i = _parse_yaml_block(lines, i + 1, next_indent, nested)
|
|
129
|
-
else:
|
|
130
|
-
# Empty value, same or less indent follows
|
|
131
|
-
target[key] = {}
|
|
132
|
-
i += 1
|
|
133
|
-
else:
|
|
134
|
-
i += 1
|
|
135
|
-
|
|
136
|
-
return i
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
def _next_content_line(lines: list[str], start: int) -> tuple[int, str]:
|
|
140
|
-
"""Find the next non-empty, non-comment line."""
|
|
141
|
-
i = start
|
|
142
|
-
while i < len(lines):
|
|
143
|
-
stripped = lines[i].strip()
|
|
144
|
-
if stripped and not stripped.startswith("#"):
|
|
145
|
-
return i, lines[i]
|
|
146
|
-
i += 1
|
|
147
|
-
return i, ""
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
def _yaml_get_value(config_file: Path, key: str) -> str | None:
|
|
151
|
-
"""Read simple value from worktree.yaml.
|
|
152
|
-
|
|
153
|
-
Args:
|
|
154
|
-
config_file: Path to config file.
|
|
155
|
-
key: Key to read.
|
|
156
|
-
|
|
157
|
-
Returns:
|
|
158
|
-
Value string or None.
|
|
159
|
-
"""
|
|
160
|
-
try:
|
|
161
|
-
content = config_file.read_text(encoding="utf-8")
|
|
162
|
-
data = parse_simple_yaml(content)
|
|
163
|
-
value = data.get(key)
|
|
164
|
-
if isinstance(value, str):
|
|
165
|
-
return value
|
|
166
|
-
except (OSError, IOError):
|
|
167
|
-
pass
|
|
168
|
-
return None
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
def _yaml_get_list(config_file: Path, section: str) -> list[str]:
|
|
172
|
-
"""Read list from worktree.yaml.
|
|
173
|
-
|
|
174
|
-
Args:
|
|
175
|
-
config_file: Path to config file.
|
|
176
|
-
section: Section name.
|
|
177
|
-
|
|
178
|
-
Returns:
|
|
179
|
-
List of items.
|
|
180
|
-
"""
|
|
181
|
-
try:
|
|
182
|
-
content = config_file.read_text(encoding="utf-8")
|
|
183
|
-
data = parse_simple_yaml(content)
|
|
184
|
-
value = data.get(section)
|
|
185
|
-
if isinstance(value, list):
|
|
186
|
-
return [str(item) for item in value]
|
|
187
|
-
except (OSError, IOError):
|
|
188
|
-
pass
|
|
189
|
-
return []
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
# =============================================================================
|
|
193
|
-
# Worktree Configuration
|
|
194
|
-
# =============================================================================
|
|
195
|
-
|
|
196
|
-
# Worktree config file relative path (relative to repo root)
|
|
197
|
-
WORKTREE_CONFIG_PATH = f"{DIR_WORKFLOW}/worktree.yaml"
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
def get_worktree_config(repo_root: Path | None = None) -> Path:
|
|
201
|
-
"""Get worktree.yaml config file path.
|
|
202
|
-
|
|
203
|
-
Args:
|
|
204
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
205
|
-
|
|
206
|
-
Returns:
|
|
207
|
-
Absolute path to config file.
|
|
208
|
-
"""
|
|
209
|
-
if repo_root is None:
|
|
210
|
-
repo_root = get_repo_root()
|
|
211
|
-
return repo_root / WORKTREE_CONFIG_PATH
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
def get_worktree_base_dir(repo_root: Path | None = None) -> Path:
|
|
215
|
-
"""Get worktree base directory.
|
|
216
|
-
|
|
217
|
-
Args:
|
|
218
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
219
|
-
|
|
220
|
-
Returns:
|
|
221
|
-
Absolute path to worktree base directory.
|
|
222
|
-
"""
|
|
223
|
-
if repo_root is None:
|
|
224
|
-
repo_root = get_repo_root()
|
|
225
|
-
|
|
226
|
-
config = get_worktree_config(repo_root)
|
|
227
|
-
worktree_dir = _yaml_get_value(config, "worktree_dir")
|
|
228
|
-
|
|
229
|
-
# Default value
|
|
230
|
-
if not worktree_dir:
|
|
231
|
-
worktree_dir = "../worktrees"
|
|
232
|
-
|
|
233
|
-
# Handle relative path
|
|
234
|
-
if worktree_dir.startswith("../") or worktree_dir.startswith("./"):
|
|
235
|
-
# Relative to repo_root
|
|
236
|
-
return repo_root / worktree_dir
|
|
237
|
-
else:
|
|
238
|
-
# Absolute path
|
|
239
|
-
return Path(worktree_dir)
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
def get_worktree_copy_files(repo_root: Path | None = None) -> list[str]:
|
|
243
|
-
"""Get files to copy list.
|
|
244
|
-
|
|
245
|
-
Args:
|
|
246
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
247
|
-
|
|
248
|
-
Returns:
|
|
249
|
-
List of file paths to copy.
|
|
250
|
-
"""
|
|
251
|
-
if repo_root is None:
|
|
252
|
-
repo_root = get_repo_root()
|
|
253
|
-
config = get_worktree_config(repo_root)
|
|
254
|
-
return _yaml_get_list(config, "copy")
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
def get_worktree_post_create_hooks(repo_root: Path | None = None) -> list[str]:
|
|
258
|
-
"""Get post_create hooks.
|
|
259
|
-
|
|
260
|
-
Args:
|
|
261
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
262
|
-
|
|
263
|
-
Returns:
|
|
264
|
-
List of commands to run.
|
|
265
|
-
"""
|
|
266
|
-
if repo_root is None:
|
|
267
|
-
repo_root = get_repo_root()
|
|
268
|
-
config = get_worktree_config(repo_root)
|
|
269
|
-
return _yaml_get_list(config, "post_create")
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
# =============================================================================
|
|
273
|
-
# Agents Registry
|
|
274
|
-
# =============================================================================
|
|
275
|
-
|
|
276
|
-
def get_agents_dir(repo_root: Path | None = None) -> Path | None:
|
|
277
|
-
"""Get agents directory for current developer.
|
|
278
|
-
|
|
279
|
-
Args:
|
|
280
|
-
repo_root: Repository root path. Defaults to auto-detected.
|
|
281
|
-
|
|
282
|
-
Returns:
|
|
283
|
-
Absolute path to agents directory, or None if no workspace.
|
|
284
|
-
"""
|
|
285
|
-
if repo_root is None:
|
|
286
|
-
repo_root = get_repo_root()
|
|
287
|
-
|
|
288
|
-
workspace_dir = get_workspace_dir(repo_root)
|
|
289
|
-
if workspace_dir:
|
|
290
|
-
return workspace_dir / ".agents"
|
|
291
|
-
return None
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
# =============================================================================
|
|
295
|
-
# Main Entry (for testing)
|
|
296
|
-
# =============================================================================
|
|
297
|
-
|
|
298
|
-
if __name__ == "__main__":
|
|
299
|
-
repo = get_repo_root()
|
|
300
|
-
print(f"Repository root: {repo}")
|
|
301
|
-
print(f"Worktree config: {get_worktree_config(repo)}")
|
|
302
|
-
print(f"Worktree base dir: {get_worktree_base_dir(repo)}")
|
|
303
|
-
print(f"Copy files: {get_worktree_copy_files(repo)}")
|
|
304
|
-
print(f"Post create hooks: {get_worktree_post_create_hooks(repo)}")
|
|
305
|
-
print(f"Agents dir: {get_agents_dir(repo)}")
|
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Create Bootstrap Task for First-Time Setup.
|
|
4
|
-
|
|
5
|
-
Creates a guided task to help users fill in project guidelines
|
|
6
|
-
after initializing Trellis for the first time.
|
|
7
|
-
|
|
8
|
-
Usage:
|
|
9
|
-
python3 create_bootstrap.py [project-type]
|
|
10
|
-
|
|
11
|
-
Arguments:
|
|
12
|
-
project-type: frontend | backend | fullstack (default: fullstack)
|
|
13
|
-
|
|
14
|
-
Prerequisites:
|
|
15
|
-
- .trellis/.developer must exist (run init_developer.py first)
|
|
16
|
-
|
|
17
|
-
Creates:
|
|
18
|
-
.trellis/tasks/00-bootstrap-guidelines/
|
|
19
|
-
- task.json # Task metadata
|
|
20
|
-
- prd.md # Task description and guidance
|
|
21
|
-
"""
|
|
22
|
-
|
|
23
|
-
from __future__ import annotations
|
|
24
|
-
|
|
25
|
-
import json
|
|
26
|
-
import sys
|
|
27
|
-
from datetime import datetime
|
|
28
|
-
from pathlib import Path
|
|
29
|
-
|
|
30
|
-
from common.paths import (
|
|
31
|
-
DIR_WORKFLOW,
|
|
32
|
-
DIR_SCRIPTS,
|
|
33
|
-
DIR_TASKS,
|
|
34
|
-
get_repo_root,
|
|
35
|
-
get_developer,
|
|
36
|
-
get_tasks_dir,
|
|
37
|
-
set_current_task,
|
|
38
|
-
)
|
|
39
|
-
from common.config import get_spec_base, resolve_package
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
# =============================================================================
|
|
43
|
-
# Constants
|
|
44
|
-
# =============================================================================
|
|
45
|
-
|
|
46
|
-
TASK_NAME = "00-bootstrap-guidelines"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
# =============================================================================
|
|
50
|
-
# PRD Content
|
|
51
|
-
# =============================================================================
|
|
52
|
-
|
|
53
|
-
def write_prd_header() -> str:
|
|
54
|
-
"""Write PRD header section."""
|
|
55
|
-
return """# Bootstrap: Fill Project Development Guidelines
|
|
56
|
-
|
|
57
|
-
## Purpose
|
|
58
|
-
|
|
59
|
-
Welcome to Trellis! This is your first task.
|
|
60
|
-
|
|
61
|
-
AI agents use `.trellis/spec/` to understand YOUR project's coding conventions.
|
|
62
|
-
**Starting from scratch = AI writes generic code that doesn't match your project style.**
|
|
63
|
-
|
|
64
|
-
Filling these guidelines is a one-time setup that pays off for every future AI session.
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## Your Task
|
|
69
|
-
|
|
70
|
-
Fill in the guideline files based on your **existing codebase**.
|
|
71
|
-
"""
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def write_prd_backend_section(spec_base: str) -> str:
|
|
75
|
-
"""Write PRD backend section."""
|
|
76
|
-
return f"""
|
|
77
|
-
|
|
78
|
-
### Backend Guidelines
|
|
79
|
-
|
|
80
|
-
| File | What to Document |
|
|
81
|
-
|------|------------------|
|
|
82
|
-
| `.trellis/{spec_base}/backend/directory-structure.md` | Where different file types go (routes, services, utils) |
|
|
83
|
-
| `.trellis/{spec_base}/backend/database-guidelines.md` | ORM, migrations, query patterns, naming conventions |
|
|
84
|
-
| `.trellis/{spec_base}/backend/error-handling.md` | How errors are caught, logged, and returned |
|
|
85
|
-
| `.trellis/{spec_base}/backend/logging-guidelines.md` | Log levels, format, what to log |
|
|
86
|
-
| `.trellis/{spec_base}/backend/quality-guidelines.md` | Code review standards, testing requirements |
|
|
87
|
-
"""
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
def write_prd_frontend_section(spec_base: str) -> str:
|
|
91
|
-
"""Write PRD frontend section."""
|
|
92
|
-
return f"""
|
|
93
|
-
|
|
94
|
-
### Frontend Guidelines
|
|
95
|
-
|
|
96
|
-
| File | What to Document |
|
|
97
|
-
|------|------------------|
|
|
98
|
-
| `.trellis/{spec_base}/frontend/directory-structure.md` | Component/page/hook organization |
|
|
99
|
-
| `.trellis/{spec_base}/frontend/component-guidelines.md` | Component patterns, props conventions |
|
|
100
|
-
| `.trellis/{spec_base}/frontend/hook-guidelines.md` | Custom hook naming, patterns |
|
|
101
|
-
| `.trellis/{spec_base}/frontend/state-management.md` | State library, patterns, what goes where |
|
|
102
|
-
| `.trellis/{spec_base}/frontend/type-safety.md` | TypeScript conventions, type organization |
|
|
103
|
-
| `.trellis/{spec_base}/frontend/quality-guidelines.md` | Linting, testing, accessibility |
|
|
104
|
-
"""
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
def write_prd_footer() -> str:
|
|
108
|
-
"""Write PRD footer section."""
|
|
109
|
-
return """
|
|
110
|
-
|
|
111
|
-
### Thinking Guides (Optional)
|
|
112
|
-
|
|
113
|
-
The `.trellis/spec/guides/` directory contains thinking guides that are already
|
|
114
|
-
filled with general best practices. You can customize them for your project if needed.
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## How to Fill Guidelines
|
|
119
|
-
|
|
120
|
-
### Principle: Document Reality, Not Ideals
|
|
121
|
-
|
|
122
|
-
Write what your codebase **actually does**, not what you wish it did.
|
|
123
|
-
AI needs to match existing patterns, not introduce new ones.
|
|
124
|
-
|
|
125
|
-
### Steps
|
|
126
|
-
|
|
127
|
-
1. **Look at existing code** - Find 2-3 examples of each pattern
|
|
128
|
-
2. **Document the pattern** - Describe what you see
|
|
129
|
-
3. **Include file paths** - Reference real files as examples
|
|
130
|
-
4. **List anti-patterns** - What does your team avoid?
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## Tips for Using AI
|
|
135
|
-
|
|
136
|
-
Ask AI to help analyze your codebase:
|
|
137
|
-
|
|
138
|
-
- "Look at my codebase and document the patterns you see"
|
|
139
|
-
- "Analyze my code structure and summarize the conventions"
|
|
140
|
-
- "Find error handling patterns and document them"
|
|
141
|
-
|
|
142
|
-
The AI will read your code and help you document it.
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
|
-
## Completion Checklist
|
|
147
|
-
|
|
148
|
-
- [ ] Guidelines filled for your project type
|
|
149
|
-
- [ ] At least 2-3 real code examples in each guideline
|
|
150
|
-
- [ ] Anti-patterns documented
|
|
151
|
-
|
|
152
|
-
When done:
|
|
153
|
-
|
|
154
|
-
```bash
|
|
155
|
-
python3 ./.trellis/scripts/task.py finish
|
|
156
|
-
python3 ./.trellis/scripts/task.py archive 00-bootstrap-guidelines
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
---
|
|
160
|
-
|
|
161
|
-
## Why This Matters
|
|
162
|
-
|
|
163
|
-
After completing this task:
|
|
164
|
-
|
|
165
|
-
1. AI will write code that matches your project style
|
|
166
|
-
2. Relevant `/trellis:before-*-dev` commands will inject real context
|
|
167
|
-
3. `/trellis:check-*` commands will validate against your actual standards
|
|
168
|
-
4. Future developers (human or AI) will onboard faster
|
|
169
|
-
"""
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
def write_prd(task_dir: Path, project_type: str, spec_base: str) -> None:
|
|
173
|
-
"""Write prd.md file."""
|
|
174
|
-
content = write_prd_header()
|
|
175
|
-
|
|
176
|
-
if project_type == "frontend":
|
|
177
|
-
content += write_prd_frontend_section(spec_base)
|
|
178
|
-
elif project_type == "backend":
|
|
179
|
-
content += write_prd_backend_section(spec_base)
|
|
180
|
-
else: # fullstack
|
|
181
|
-
content += write_prd_backend_section(spec_base)
|
|
182
|
-
content += write_prd_frontend_section(spec_base)
|
|
183
|
-
|
|
184
|
-
content += write_prd_footer()
|
|
185
|
-
|
|
186
|
-
prd_file = task_dir / "prd.md"
|
|
187
|
-
prd_file.write_text(content, encoding="utf-8")
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
# =============================================================================
|
|
191
|
-
# Task JSON
|
|
192
|
-
# =============================================================================
|
|
193
|
-
|
|
194
|
-
def write_task_json(task_dir: Path, developer: str, project_type: str, spec_base: str) -> None:
|
|
195
|
-
"""Write task.json file."""
|
|
196
|
-
today = datetime.now().strftime("%Y-%m-%d")
|
|
197
|
-
|
|
198
|
-
# Generate subtasks and related files based on project type
|
|
199
|
-
if project_type == "frontend":
|
|
200
|
-
subtasks = [
|
|
201
|
-
{"name": "Fill frontend guidelines", "status": "pending"},
|
|
202
|
-
{"name": "Add code examples", "status": "pending"},
|
|
203
|
-
]
|
|
204
|
-
related_files = [f".trellis/{spec_base}/frontend/"]
|
|
205
|
-
elif project_type == "backend":
|
|
206
|
-
subtasks = [
|
|
207
|
-
{"name": "Fill backend guidelines", "status": "pending"},
|
|
208
|
-
{"name": "Add code examples", "status": "pending"},
|
|
209
|
-
]
|
|
210
|
-
related_files = [f".trellis/{spec_base}/backend/"]
|
|
211
|
-
else: # fullstack
|
|
212
|
-
subtasks = [
|
|
213
|
-
{"name": "Fill backend guidelines", "status": "pending"},
|
|
214
|
-
{"name": "Fill frontend guidelines", "status": "pending"},
|
|
215
|
-
{"name": "Add code examples", "status": "pending"},
|
|
216
|
-
]
|
|
217
|
-
related_files = [f".trellis/{spec_base}/backend/", f".trellis/{spec_base}/frontend/"]
|
|
218
|
-
|
|
219
|
-
task_data = {
|
|
220
|
-
"id": TASK_NAME,
|
|
221
|
-
"name": "Bootstrap Guidelines",
|
|
222
|
-
"description": "Fill in project development guidelines for AI agents",
|
|
223
|
-
"status": "in_progress",
|
|
224
|
-
"dev_type": "docs",
|
|
225
|
-
"priority": "P1",
|
|
226
|
-
"creator": developer,
|
|
227
|
-
"assignee": developer,
|
|
228
|
-
"createdAt": today,
|
|
229
|
-
"completedAt": None,
|
|
230
|
-
"commit": None,
|
|
231
|
-
"subtasks": subtasks,
|
|
232
|
-
"children": [],
|
|
233
|
-
"parent": None,
|
|
234
|
-
"relatedFiles": related_files,
|
|
235
|
-
"notes": f"First-time setup task created by trellis init ({project_type} project)",
|
|
236
|
-
"meta": {},
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
task_json = task_dir / "task.json"
|
|
240
|
-
task_json.write_text(json.dumps(task_data, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
# =============================================================================
|
|
244
|
-
# Main
|
|
245
|
-
# =============================================================================
|
|
246
|
-
|
|
247
|
-
def main() -> int:
|
|
248
|
-
"""Main entry point."""
|
|
249
|
-
# Parse project type argument
|
|
250
|
-
project_type = "fullstack"
|
|
251
|
-
if len(sys.argv) > 1:
|
|
252
|
-
project_type = sys.argv[1]
|
|
253
|
-
|
|
254
|
-
# Validate project type
|
|
255
|
-
if project_type not in ("frontend", "backend", "fullstack"):
|
|
256
|
-
print(f"Unknown project type: {project_type}, defaulting to fullstack")
|
|
257
|
-
project_type = "fullstack"
|
|
258
|
-
|
|
259
|
-
repo_root = get_repo_root()
|
|
260
|
-
developer = get_developer(repo_root)
|
|
261
|
-
|
|
262
|
-
# Check developer initialized
|
|
263
|
-
if not developer:
|
|
264
|
-
print("Error: Developer not initialized")
|
|
265
|
-
print(f"Run: python3 ./{DIR_WORKFLOW}/{DIR_SCRIPTS}/init_developer.py <your-name>")
|
|
266
|
-
return 1
|
|
267
|
-
|
|
268
|
-
# Resolve spec base path (monorepo: spec/<package>, single-repo: spec)
|
|
269
|
-
package = resolve_package(repo_root=repo_root)
|
|
270
|
-
spec_base = get_spec_base(package, repo_root)
|
|
271
|
-
|
|
272
|
-
tasks_dir = get_tasks_dir(repo_root)
|
|
273
|
-
task_dir = tasks_dir / TASK_NAME
|
|
274
|
-
relative_path = f"{DIR_WORKFLOW}/{DIR_TASKS}/{TASK_NAME}"
|
|
275
|
-
|
|
276
|
-
# Check if already exists
|
|
277
|
-
if task_dir.exists():
|
|
278
|
-
print(f"Bootstrap task already exists: {relative_path}")
|
|
279
|
-
return 0
|
|
280
|
-
|
|
281
|
-
# Create task directory
|
|
282
|
-
task_dir.mkdir(parents=True, exist_ok=True)
|
|
283
|
-
|
|
284
|
-
# Write files
|
|
285
|
-
write_task_json(task_dir, developer, project_type, spec_base)
|
|
286
|
-
write_prd(task_dir, project_type, spec_base)
|
|
287
|
-
|
|
288
|
-
# Set as current task
|
|
289
|
-
set_current_task(relative_path, repo_root)
|
|
290
|
-
|
|
291
|
-
# Silent output - init command handles user-facing messages
|
|
292
|
-
# Only output the task path for programmatic use
|
|
293
|
-
print(relative_path)
|
|
294
|
-
return 0
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
if __name__ == "__main__":
|
|
298
|
-
sys.exit(main())
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"""Bootstrap path setup for multi_agent scripts.
|
|
2
|
-
|
|
3
|
-
Import this module before importing from common/:
|
|
4
|
-
|
|
5
|
-
import _bootstrap # noqa: F401
|
|
6
|
-
|
|
7
|
-
This adds the parent scripts/ directory to sys.path so that
|
|
8
|
-
`from common.xxx import yyy` works when running scripts directly
|
|
9
|
-
via `python3 .trellis/scripts/multi_agent/some_script.py`.
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
import sys
|
|
13
|
-
from pathlib import Path
|
|
14
|
-
|
|
15
|
-
_scripts_dir = str(Path(__file__).resolve().parent.parent)
|
|
16
|
-
if _scripts_dir not in sys.path:
|
|
17
|
-
sys.path.insert(0, _scripts_dir)
|