trellis-hgl 0.6.0-beta.18
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/LICENSE +235 -0
- package/README.md +149 -0
- package/bin/trellis.js +3 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +207 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/channel/adapters/claude.d.ts +38 -0
- package/dist/commands/channel/adapters/claude.d.ts.map +1 -0
- package/dist/commands/channel/adapters/claude.js +209 -0
- package/dist/commands/channel/adapters/claude.js.map +1 -0
- package/dist/commands/channel/adapters/codex.d.ts +81 -0
- package/dist/commands/channel/adapters/codex.d.ts.map +1 -0
- package/dist/commands/channel/adapters/codex.js +512 -0
- package/dist/commands/channel/adapters/codex.js.map +1 -0
- package/dist/commands/channel/adapters/index.d.ts +79 -0
- package/dist/commands/channel/adapters/index.d.ts.map +1 -0
- package/dist/commands/channel/adapters/index.js +109 -0
- package/dist/commands/channel/adapters/index.js.map +1 -0
- package/dist/commands/channel/adapters/types.d.ts +33 -0
- package/dist/commands/channel/adapters/types.d.ts.map +1 -0
- package/dist/commands/channel/adapters/types.js +2 -0
- package/dist/commands/channel/adapters/types.js.map +1 -0
- package/dist/commands/channel/agent-loader.d.ts +32 -0
- package/dist/commands/channel/agent-loader.d.ts.map +1 -0
- package/dist/commands/channel/agent-loader.js +154 -0
- package/dist/commands/channel/agent-loader.js.map +1 -0
- package/dist/commands/channel/context-loader.d.ts +26 -0
- package/dist/commands/channel/context-loader.d.ts.map +1 -0
- package/dist/commands/channel/context-loader.js +290 -0
- package/dist/commands/channel/context-loader.js.map +1 -0
- package/dist/commands/channel/context.d.ts +16 -0
- package/dist/commands/channel/context.d.ts.map +1 -0
- package/dist/commands/channel/context.js +83 -0
- package/dist/commands/channel/context.js.map +1 -0
- package/dist/commands/channel/create.d.ts +27 -0
- package/dist/commands/channel/create.d.ts.map +1 -0
- package/dist/commands/channel/create.js +39 -0
- package/dist/commands/channel/create.js.map +1 -0
- package/dist/commands/channel/dev-parse-trace.d.ts +14 -0
- package/dist/commands/channel/dev-parse-trace.d.ts.map +1 -0
- package/dist/commands/channel/dev-parse-trace.js +70 -0
- package/dist/commands/channel/dev-parse-trace.js.map +1 -0
- package/dist/commands/channel/index.d.ts +3 -0
- package/dist/commands/channel/index.d.ts.map +1 -0
- package/dist/commands/channel/index.js +503 -0
- package/dist/commands/channel/index.js.map +1 -0
- package/dist/commands/channel/kill.d.ts +7 -0
- package/dist/commands/channel/kill.d.ts.map +1 -0
- package/dist/commands/channel/kill.js +121 -0
- package/dist/commands/channel/kill.js.map +1 -0
- package/dist/commands/channel/list.d.ts +17 -0
- package/dist/commands/channel/list.d.ts.map +1 -0
- package/dist/commands/channel/list.js +233 -0
- package/dist/commands/channel/list.js.map +1 -0
- package/dist/commands/channel/messages.d.ts +16 -0
- package/dist/commands/channel/messages.d.ts.map +1 -0
- package/dist/commands/channel/messages.js +249 -0
- package/dist/commands/channel/messages.js.map +1 -0
- package/dist/commands/channel/rm.d.ts +27 -0
- package/dist/commands/channel/rm.d.ts.map +1 -0
- package/dist/commands/channel/rm.js +216 -0
- package/dist/commands/channel/rm.js.map +1 -0
- package/dist/commands/channel/run.d.ts +31 -0
- package/dist/commands/channel/run.d.ts.map +1 -0
- package/dist/commands/channel/run.js +137 -0
- package/dist/commands/channel/run.js.map +1 -0
- package/dist/commands/channel/send.d.ts +13 -0
- package/dist/commands/channel/send.d.ts.map +1 -0
- package/dist/commands/channel/send.js +26 -0
- package/dist/commands/channel/send.js.map +1 -0
- package/dist/commands/channel/spawn.d.ts +30 -0
- package/dist/commands/channel/spawn.d.ts.map +1 -0
- package/dist/commands/channel/spawn.js +194 -0
- package/dist/commands/channel/spawn.js.map +1 -0
- package/dist/commands/channel/store/events.d.ts +39 -0
- package/dist/commands/channel/store/events.d.ts.map +1 -0
- package/dist/commands/channel/store/events.js +87 -0
- package/dist/commands/channel/store/events.js.map +1 -0
- package/dist/commands/channel/store/filter.d.ts +3 -0
- package/dist/commands/channel/store/filter.d.ts.map +1 -0
- package/dist/commands/channel/store/filter.js +2 -0
- package/dist/commands/channel/store/filter.js.map +1 -0
- package/dist/commands/channel/store/lock.d.ts +23 -0
- package/dist/commands/channel/store/lock.d.ts.map +1 -0
- package/dist/commands/channel/store/lock.js +99 -0
- package/dist/commands/channel/store/lock.js.map +1 -0
- package/dist/commands/channel/store/paths.d.ts +63 -0
- package/dist/commands/channel/store/paths.d.ts.map +1 -0
- package/dist/commands/channel/store/paths.js +246 -0
- package/dist/commands/channel/store/paths.js.map +1 -0
- package/dist/commands/channel/store/schema.d.ts +27 -0
- package/dist/commands/channel/store/schema.d.ts.map +1 -0
- package/dist/commands/channel/store/schema.js +34 -0
- package/dist/commands/channel/store/schema.js.map +1 -0
- package/dist/commands/channel/store/thread-state.d.ts +5 -0
- package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
- package/dist/commands/channel/store/thread-state.js +16 -0
- package/dist/commands/channel/store/thread-state.js.map +1 -0
- package/dist/commands/channel/store/watch.d.ts +19 -0
- package/dist/commands/channel/store/watch.d.ts.map +1 -0
- package/dist/commands/channel/store/watch.js +146 -0
- package/dist/commands/channel/store/watch.js.map +1 -0
- package/dist/commands/channel/supervisor/inbox.d.ts +30 -0
- package/dist/commands/channel/supervisor/inbox.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/inbox.js +160 -0
- package/dist/commands/channel/supervisor/inbox.js.map +1 -0
- package/dist/commands/channel/supervisor/shutdown.d.ts +66 -0
- package/dist/commands/channel/supervisor/shutdown.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/shutdown.js +143 -0
- package/dist/commands/channel/supervisor/shutdown.js.map +1 -0
- package/dist/commands/channel/supervisor/stdout.d.ts +51 -0
- package/dist/commands/channel/supervisor/stdout.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/stdout.js +121 -0
- package/dist/commands/channel/supervisor/stdout.js.map +1 -0
- package/dist/commands/channel/supervisor/turns.d.ts +20 -0
- package/dist/commands/channel/supervisor/turns.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/turns.js +28 -0
- package/dist/commands/channel/supervisor/turns.js.map +1 -0
- package/dist/commands/channel/supervisor/warning.d.ts +48 -0
- package/dist/commands/channel/supervisor/warning.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/warning.js +77 -0
- package/dist/commands/channel/supervisor/warning.js.map +1 -0
- package/dist/commands/channel/supervisor.d.ts +53 -0
- package/dist/commands/channel/supervisor.d.ts.map +1 -0
- package/dist/commands/channel/supervisor.js +304 -0
- package/dist/commands/channel/supervisor.js.map +1 -0
- package/dist/commands/channel/text-body.d.ts +13 -0
- package/dist/commands/channel/text-body.d.ts.map +1 -0
- package/dist/commands/channel/text-body.js +47 -0
- package/dist/commands/channel/text-body.js.map +1 -0
- package/dist/commands/channel/threads.d.ts +39 -0
- package/dist/commands/channel/threads.d.ts.map +1 -0
- package/dist/commands/channel/threads.js +106 -0
- package/dist/commands/channel/threads.js.map +1 -0
- package/dist/commands/channel/title.d.ts +12 -0
- package/dist/commands/channel/title.d.ts.map +1 -0
- package/dist/commands/channel/title.js +24 -0
- package/dist/commands/channel/title.js.map +1 -0
- package/dist/commands/channel/wait.d.ts +18 -0
- package/dist/commands/channel/wait.d.ts.map +1 -0
- package/dist/commands/channel/wait.js +76 -0
- package/dist/commands/channel/wait.js.map +1 -0
- package/dist/commands/init.d.ts +59 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +1459 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mem.d.ts +30 -0
- package/dist/commands/mem.d.ts.map +1 -0
- package/dist/commands/mem.js +424 -0
- package/dist/commands/mem.js.map +1 -0
- package/dist/commands/uninstall.d.ts +27 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +339 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +72 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +1926 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/upgrade.d.ts +28 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +84 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/workflow.d.ts +35 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +219 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/configurators/antigravity.d.ts +7 -0
- package/dist/configurators/antigravity.d.ts.map +1 -0
- package/dist/configurators/antigravity.js +19 -0
- package/dist/configurators/antigravity.js.map +1 -0
- package/dist/configurators/claude.d.ts +9 -0
- package/dist/configurators/claude.d.ts.map +1 -0
- package/dist/configurators/claude.js +72 -0
- package/dist/configurators/claude.js.map +1 -0
- package/dist/configurators/codebuddy.d.ts +10 -0
- package/dist/configurators/codebuddy.d.ts.map +1 -0
- package/dist/configurators/codebuddy.js +30 -0
- package/dist/configurators/codebuddy.js.map +1 -0
- package/dist/configurators/codex.d.ts +8 -0
- package/dist/configurators/codex.d.ts.map +1 -0
- package/dist/configurators/codex.js +87 -0
- package/dist/configurators/codex.js.map +1 -0
- package/dist/configurators/copilot.d.ts +10 -0
- package/dist/configurators/copilot.d.ts.map +1 -0
- package/dist/configurators/copilot.js +51 -0
- package/dist/configurators/copilot.js.map +1 -0
- package/dist/configurators/cursor.d.ts +10 -0
- package/dist/configurators/cursor.d.ts.map +1 -0
- package/dist/configurators/cursor.js +29 -0
- package/dist/configurators/cursor.js.map +1 -0
- package/dist/configurators/droid.d.ts +10 -0
- package/dist/configurators/droid.d.ts.map +1 -0
- package/dist/configurators/droid.js +30 -0
- package/dist/configurators/droid.js.map +1 -0
- package/dist/configurators/gemini.d.ts +16 -0
- package/dist/configurators/gemini.d.ts.map +1 -0
- package/dist/configurators/gemini.js +38 -0
- package/dist/configurators/gemini.js.map +1 -0
- package/dist/configurators/index.d.ts +65 -0
- package/dist/configurators/index.d.ts.map +1 -0
- package/dist/configurators/index.js +367 -0
- package/dist/configurators/index.js.map +1 -0
- package/dist/configurators/kilo.d.ts +7 -0
- package/dist/configurators/kilo.d.ts.map +1 -0
- package/dist/configurators/kilo.js +19 -0
- package/dist/configurators/kilo.js.map +1 -0
- package/dist/configurators/kiro.d.ts +8 -0
- package/dist/configurators/kiro.d.ts.map +1 -0
- package/dist/configurators/kiro.js +24 -0
- package/dist/configurators/kiro.js.map +1 -0
- package/dist/configurators/opencode.d.ts +14 -0
- package/dist/configurators/opencode.d.ts.map +1 -0
- package/dist/configurators/opencode.js +96 -0
- package/dist/configurators/opencode.js.map +1 -0
- package/dist/configurators/pi.d.ts +3 -0
- package/dist/configurators/pi.d.ts.map +1 -0
- package/dist/configurators/pi.js +45 -0
- package/dist/configurators/pi.js.map +1 -0
- package/dist/configurators/qoder.d.ts +11 -0
- package/dist/configurators/qoder.d.ts.map +1 -0
- package/dist/configurators/qoder.js +31 -0
- package/dist/configurators/qoder.js.map +1 -0
- package/dist/configurators/shared.d.ts +178 -0
- package/dist/configurators/shared.d.ts.map +1 -0
- package/dist/configurators/shared.js +541 -0
- package/dist/configurators/shared.js.map +1 -0
- package/dist/configurators/windsurf.d.ts +7 -0
- package/dist/configurators/windsurf.d.ts.map +1 -0
- package/dist/configurators/windsurf.js +19 -0
- package/dist/configurators/windsurf.js.map +1 -0
- package/dist/configurators/workflow.d.ts +37 -0
- package/dist/configurators/workflow.d.ts.map +1 -0
- package/dist/configurators/workflow.js +164 -0
- package/dist/configurators/workflow.js.map +1 -0
- package/dist/constants/paths.d.ts +70 -0
- package/dist/constants/paths.d.ts.map +1 -0
- package/dist/constants/paths.js +79 -0
- package/dist/constants/paths.js.map +1 -0
- package/dist/constants/version.d.ts +9 -0
- package/dist/constants/version.d.ts.map +1 -0
- package/dist/constants/version.js +15 -0
- package/dist/constants/version.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/index.d.ts +62 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +187 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/manifests/0.1.9.json +30 -0
- package/dist/migrations/manifests/0.2.0.json +49 -0
- package/dist/migrations/manifests/0.2.12.json +9 -0
- package/dist/migrations/manifests/0.2.13.json +9 -0
- package/dist/migrations/manifests/0.2.14.json +175 -0
- package/dist/migrations/manifests/0.2.15.json +33 -0
- package/dist/migrations/manifests/0.3.0-beta.0.json +297 -0
- package/dist/migrations/manifests/0.3.0-beta.1.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.11.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.12.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.13.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.14.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.15.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.16.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.5.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.6.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.7.json +11 -0
- package/dist/migrations/manifests/0.3.0-beta.8.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.9.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.0.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.1.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.2.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.3.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.4.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.5.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.6.json +9 -0
- package/dist/migrations/manifests/0.3.0.json +11 -0
- package/dist/migrations/manifests/0.3.1.json +9 -0
- package/dist/migrations/manifests/0.3.10.json +9 -0
- package/dist/migrations/manifests/0.3.2.json +9 -0
- package/dist/migrations/manifests/0.3.3.json +9 -0
- package/dist/migrations/manifests/0.3.4.json +21 -0
- package/dist/migrations/manifests/0.3.5.json +9 -0
- package/dist/migrations/manifests/0.3.6.json +9 -0
- package/dist/migrations/manifests/0.3.7.json +9 -0
- package/dist/migrations/manifests/0.3.8.json +9 -0
- package/dist/migrations/manifests/0.3.9.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.1.json +228 -0
- package/dist/migrations/manifests/0.4.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.5.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.6.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.7.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.8.json +34 -0
- package/dist/migrations/manifests/0.4.0-beta.9.json +9 -0
- package/dist/migrations/manifests/0.4.0-rc.0.json +9 -0
- package/dist/migrations/manifests/0.4.0-rc.1.json +9 -0
- package/dist/migrations/manifests/0.4.0.json +9 -0
- 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.10.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.11.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.12.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.13.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.14.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.15.json +116 -0
- package/dist/migrations/manifests/0.5.0-beta.16.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.17.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.18.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.19.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/migrations/manifests/0.5.0-rc.0.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.1.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.2.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.3.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.4.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.5.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.6.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.7.json +9 -0
- package/dist/migrations/manifests/0.5.0.json +9 -0
- package/dist/migrations/manifests/0.5.1.json +9 -0
- package/dist/migrations/manifests/0.5.10.json +9 -0
- package/dist/migrations/manifests/0.5.11.json +16 -0
- package/dist/migrations/manifests/0.5.12.json +9 -0
- package/dist/migrations/manifests/0.5.13.json +9 -0
- package/dist/migrations/manifests/0.5.14.json +9 -0
- package/dist/migrations/manifests/0.5.15.json +9 -0
- package/dist/migrations/manifests/0.5.2.json +9 -0
- package/dist/migrations/manifests/0.5.3.json +9 -0
- package/dist/migrations/manifests/0.5.4.json +9 -0
- package/dist/migrations/manifests/0.5.5.json +9 -0
- package/dist/migrations/manifests/0.5.6.json +9 -0
- package/dist/migrations/manifests/0.5.7.json +16 -0
- package/dist/migrations/manifests/0.5.8.json +9 -0
- package/dist/migrations/manifests/0.5.9.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.0.json +16 -0
- package/dist/migrations/manifests/0.6.0-beta.1.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.11.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.12.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.13.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.14.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.15.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.16.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.17.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.5.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.6.json +16 -0
- package/dist/migrations/manifests/0.6.0-beta.7.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.8.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.9.json +9 -0
- package/dist/templates/claude/agents/trellis-check.md +123 -0
- package/dist/templates/claude/agents/trellis-code-architecture-review.md +71 -0
- package/dist/templates/claude/agents/trellis-code-review.md +71 -0
- package/dist/templates/claude/agents/trellis-implement.md +118 -0
- package/dist/templates/claude/agents/trellis-merge-review.md +72 -0
- package/dist/templates/claude/agents/trellis-research.md +137 -0
- package/dist/templates/claude/agents/trellis-spec-review.md +71 -0
- package/dist/templates/claude/index.d.ts +22 -0
- package/dist/templates/claude/index.d.ts.map +1 -0
- package/dist/templates/claude/index.js +46 -0
- package/dist/templates/claude/index.js.map +1 -0
- package/dist/templates/claude/settings.json +73 -0
- package/dist/templates/codebuddy/agents/trellis-check.md +115 -0
- package/dist/templates/codebuddy/agents/trellis-implement.md +110 -0
- package/dist/templates/codebuddy/agents/trellis-research.md +137 -0
- package/dist/templates/codebuddy/index.d.ts +15 -0
- package/dist/templates/codebuddy/index.d.ts.map +1 -0
- package/dist/templates/codebuddy/index.js +15 -0
- package/dist/templates/codebuddy/index.js.map +1 -0
- package/dist/templates/codebuddy/settings.json +59 -0
- package/dist/templates/codex/agents/trellis-check.toml +84 -0
- package/dist/templates/codex/agents/trellis-implement.toml +65 -0
- package/dist/templates/codex/agents/trellis-research.toml +73 -0
- package/dist/templates/codex/config.toml +35 -0
- package/dist/templates/codex/hooks/session-start.py +545 -0
- package/dist/templates/codex/hooks.json +15 -0
- package/dist/templates/codex/index.d.ts +39 -0
- package/dist/templates/codex/index.d.ts.map +1 -0
- package/dist/templates/codex/index.js +85 -0
- package/dist/templates/codex/index.js.map +1 -0
- package/dist/templates/codex/skills/before-dev/SKILL.md +40 -0
- package/dist/templates/codex/skills/brainstorm/SKILL.md +112 -0
- package/dist/templates/codex/skills/break-loop/SKILL.md +130 -0
- package/dist/templates/codex/skills/check/SKILL.md +98 -0
- package/dist/templates/codex/skills/check-cross-layer/SKILL.md +158 -0
- package/dist/templates/codex/skills/create-command/SKILL.md +101 -0
- package/dist/templates/codex/skills/finish-work/SKILL.md +90 -0
- package/dist/templates/codex/skills/improve-ut/SKILL.md +69 -0
- package/dist/templates/codex/skills/integrate-skill/SKILL.md +221 -0
- package/dist/templates/codex/skills/onboard/SKILL.md +363 -0
- package/dist/templates/codex/skills/record-session/SKILL.md +67 -0
- package/dist/templates/codex/skills/start/SKILL.md +64 -0
- package/dist/templates/codex/skills/update-spec/SKILL.md +335 -0
- package/dist/templates/common/bundled-skills/trellis-meta/SKILL.md +73 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/add-project-local-conventions.md +83 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-agents.md +54 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-context-loading.md +84 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-hooks.md +57 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-skills-or-commands.md +78 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-spec-structure.md +83 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-task-lifecycle.md +90 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-workflow.md +65 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/overview.md +55 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/context-injection.md +68 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/generated-files.md +80 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/overview.md +51 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/spec-system.md +102 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/task-system.md +130 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workflow.md +75 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workspace-memory.md +71 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/agents.md +80 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/hooks-and-settings.md +69 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/overview.md +59 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/platform-map.md +74 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/skills-and-commands.md +83 -0
- package/dist/templates/common/commands/continue.md +56 -0
- package/dist/templates/common/commands/finish-work.md +66 -0
- package/dist/templates/common/commands/start.md +59 -0
- package/dist/templates/common/index.d.ts +48 -0
- package/dist/templates/common/index.d.ts.map +1 -0
- package/dist/templates/common/index.js +104 -0
- package/dist/templates/common/index.js.map +1 -0
- package/dist/templates/common/skills/before-dev.md +41 -0
- package/dist/templates/common/skills/brainstorm.md +112 -0
- package/dist/templates/common/skills/break-loop.md +125 -0
- package/dist/templates/common/skills/check.md +93 -0
- package/dist/templates/common/skills/grill-me.md +49 -0
- package/dist/templates/common/skills/improve-codebase-architecture.md +38 -0
- package/dist/templates/common/skills/tdd.md +34 -0
- package/dist/templates/common/skills/update-spec.md +351 -0
- package/dist/templates/copilot/hooks/session-start.py +547 -0
- package/dist/templates/copilot/hooks.json +19 -0
- package/dist/templates/copilot/index.d.ts +23 -0
- package/dist/templates/copilot/index.d.ts.map +1 -0
- package/dist/templates/copilot/index.js +54 -0
- package/dist/templates/copilot/index.js.map +1 -0
- package/dist/templates/copilot/prompts/before-dev.prompt.md +39 -0
- package/dist/templates/copilot/prompts/brainstorm.prompt.md +111 -0
- package/dist/templates/copilot/prompts/break-loop.prompt.md +129 -0
- package/dist/templates/copilot/prompts/check-cross-layer.prompt.md +157 -0
- package/dist/templates/copilot/prompts/check.prompt.md +97 -0
- package/dist/templates/copilot/prompts/create-command.prompt.md +116 -0
- package/dist/templates/copilot/prompts/finish-work.prompt.md +99 -0
- package/dist/templates/copilot/prompts/integrate-skill.prompt.md +223 -0
- package/dist/templates/copilot/prompts/onboard.prompt.md +362 -0
- package/dist/templates/copilot/prompts/parallel.prompt.md +204 -0
- package/dist/templates/copilot/prompts/record-session.prompt.md +66 -0
- package/dist/templates/copilot/prompts/start.prompt.md +63 -0
- package/dist/templates/copilot/prompts/update-spec.prompt.md +358 -0
- package/dist/templates/cursor/agents/trellis-check.md +114 -0
- package/dist/templates/cursor/agents/trellis-implement.md +109 -0
- package/dist/templates/cursor/agents/trellis-research.md +136 -0
- package/dist/templates/cursor/hooks.json +24 -0
- package/dist/templates/cursor/index.d.ts +13 -0
- package/dist/templates/cursor/index.d.ts.map +1 -0
- package/dist/templates/cursor/index.js +13 -0
- package/dist/templates/cursor/index.js.map +1 -0
- package/dist/templates/droid/droids/trellis-check.md +107 -0
- package/dist/templates/droid/droids/trellis-implement.md +102 -0
- package/dist/templates/droid/droids/trellis-research.md +137 -0
- package/dist/templates/droid/index.d.ts +15 -0
- package/dist/templates/droid/index.d.ts.map +1 -0
- package/dist/templates/droid/index.js +15 -0
- package/dist/templates/droid/index.js.map +1 -0
- package/dist/templates/droid/settings.json +59 -0
- package/dist/templates/extract.d.ts +40 -0
- package/dist/templates/extract.d.ts.map +1 -0
- package/dist/templates/extract.js +106 -0
- package/dist/templates/extract.js.map +1 -0
- package/dist/templates/gemini/agents/trellis-check.md +107 -0
- package/dist/templates/gemini/agents/trellis-implement.md +102 -0
- package/dist/templates/gemini/agents/trellis-research.md +136 -0
- package/dist/templates/gemini/index.d.ts +13 -0
- package/dist/templates/gemini/index.d.ts.map +1 -0
- package/dist/templates/gemini/index.js +13 -0
- package/dist/templates/gemini/index.js.map +1 -0
- package/dist/templates/gemini/settings.json +28 -0
- package/dist/templates/kiro/agents/trellis-check.json +26 -0
- package/dist/templates/kiro/agents/trellis-implement.json +26 -0
- package/dist/templates/kiro/agents/trellis-research.json +30 -0
- package/dist/templates/kiro/index.d.ts +18 -0
- package/dist/templates/kiro/index.d.ts.map +1 -0
- package/dist/templates/kiro/index.js +18 -0
- package/dist/templates/kiro/index.js.map +1 -0
- package/dist/templates/markdown/agents.md +21 -0
- package/dist/templates/markdown/gitignore.txt +15 -0
- package/dist/templates/markdown/index.d.ts +27 -0
- package/dist/templates/markdown/index.d.ts.map +1 -0
- package/dist/templates/markdown/index.js +52 -0
- package/dist/templates/markdown/index.js.map +1 -0
- package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
- package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
- package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
- package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +223 -0
- package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +259 -0
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +595 -0
- package/dist/templates/markdown/spec/guides/index.md.txt +97 -0
- package/dist/templates/markdown/workspace-index.md +125 -0
- package/dist/templates/markdown/worktree.yaml.txt +58 -0
- package/dist/templates/opencode/agents/trellis-check.md +122 -0
- package/dist/templates/opencode/agents/trellis-implement.md +118 -0
- package/dist/templates/opencode/agents/trellis-research.md +145 -0
- package/dist/templates/opencode/lib/session-utils.js +521 -0
- package/dist/templates/opencode/lib/trellis-context.js +381 -0
- package/dist/templates/opencode/package.json +5 -0
- package/dist/templates/opencode/plugins/inject-subagent-context.js +513 -0
- package/dist/templates/opencode/plugins/inject-workflow-state.js +159 -0
- package/dist/templates/opencode/plugins/session-start.js +101 -0
- package/dist/templates/pi/agents/trellis-check.md +37 -0
- package/dist/templates/pi/agents/trellis-implement.md +42 -0
- package/dist/templates/pi/agents/trellis-research.md +25 -0
- package/dist/templates/pi/extensions/trellis/index.ts.txt +1174 -0
- package/dist/templates/pi/index.d.ts +5 -0
- package/dist/templates/pi/index.d.ts.map +1 -0
- package/dist/templates/pi/index.js +12 -0
- package/dist/templates/pi/index.js.map +1 -0
- package/dist/templates/pi/settings.json +21 -0
- package/dist/templates/qoder/agents/trellis-check.md +108 -0
- package/dist/templates/qoder/agents/trellis-implement.md +103 -0
- package/dist/templates/qoder/agents/trellis-research.md +137 -0
- package/dist/templates/qoder/index.d.ts +15 -0
- package/dist/templates/qoder/index.d.ts.map +1 -0
- package/dist/templates/qoder/index.js +15 -0
- package/dist/templates/qoder/index.js.map +1 -0
- package/dist/templates/qoder/settings.json +47 -0
- package/dist/templates/shared-hooks/index.d.ts +50 -0
- package/dist/templates/shared-hooks/index.d.ts.map +1 -0
- package/dist/templates/shared-hooks/index.js +88 -0
- package/dist/templates/shared-hooks/index.js.map +1 -0
- package/dist/templates/shared-hooks/inject-shell-session-context.py +183 -0
- package/dist/templates/shared-hooks/inject-subagent-context.py +771 -0
- package/dist/templates/shared-hooks/inject-workflow-state.py +363 -0
- package/dist/templates/shared-hooks/session-start.py +832 -0
- 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 +90 -0
- package/dist/templates/trellis/gitignore.txt +32 -0
- package/dist/templates/trellis/index.d.ts +52 -0
- package/dist/templates/trellis/index.d.ts.map +1 -0
- package/dist/templates/trellis/index.js +97 -0
- package/dist/templates/trellis/index.js.map +1 -0
- package/dist/templates/trellis/scripts/__init__.py +5 -0
- package/dist/templates/trellis/scripts/add_session.py +547 -0
- package/dist/templates/trellis/scripts/common/__init__.py +92 -0
- package/dist/templates/trellis/scripts/common/active_task.py +626 -0
- package/dist/templates/trellis/scripts/common/cli_adapter.py +811 -0
- package/dist/templates/trellis/scripts/common/config.py +445 -0
- package/dist/templates/trellis/scripts/common/developer.py +190 -0
- package/dist/templates/trellis/scripts/common/git.py +31 -0
- package/dist/templates/trellis/scripts/common/git_context.py +106 -0
- package/dist/templates/trellis/scripts/common/io.py +37 -0
- package/dist/templates/trellis/scripts/common/log.py +45 -0
- package/dist/templates/trellis/scripts/common/packages_context.py +238 -0
- package/dist/templates/trellis/scripts/common/paths.py +447 -0
- package/dist/templates/trellis/scripts/common/safe_commit.py +285 -0
- package/dist/templates/trellis/scripts/common/session_context.py +821 -0
- package/dist/templates/trellis/scripts/common/task_context.py +223 -0
- package/dist/templates/trellis/scripts/common/task_queue.py +188 -0
- package/dist/templates/trellis/scripts/common/task_store.py +698 -0
- package/dist/templates/trellis/scripts/common/task_utils.py +274 -0
- package/dist/templates/trellis/scripts/common/tasks.py +112 -0
- package/dist/templates/trellis/scripts/common/trellis_config.py +131 -0
- package/dist/templates/trellis/scripts/common/types.py +110 -0
- package/dist/templates/trellis/scripts/common/workflow_phase.py +212 -0
- package/dist/templates/trellis/scripts/get_context.py +16 -0
- package/dist/templates/trellis/scripts/get_developer.py +26 -0
- package/dist/templates/trellis/scripts/hooks/linear_sync.py +243 -0
- package/dist/templates/trellis/scripts/init_developer.py +51 -0
- package/dist/templates/trellis/scripts/task.py +500 -0
- package/dist/templates/trellis/tasks/.gitkeep +0 -0
- package/dist/templates/trellis/workflow.md +750 -0
- package/dist/types/ai-tools.d.ts +95 -0
- package/dist/types/ai-tools.d.ts.map +1 -0
- package/dist/types/ai-tools.js +280 -0
- package/dist/types/ai-tools.js.map +1 -0
- package/dist/types/migration.d.ts +125 -0
- package/dist/types/migration.d.ts.map +1 -0
- package/dist/types/migration.js +8 -0
- package/dist/types/migration.js.map +1 -0
- package/dist/utils/compare-versions.d.ts +12 -0
- package/dist/utils/compare-versions.d.ts.map +1 -0
- package/dist/utils/compare-versions.js +86 -0
- package/dist/utils/compare-versions.js.map +1 -0
- package/dist/utils/cwd-guard.d.ts +38 -0
- package/dist/utils/cwd-guard.d.ts.map +1 -0
- package/dist/utils/cwd-guard.js +62 -0
- package/dist/utils/cwd-guard.js.map +1 -0
- package/dist/utils/file-writer.d.ts +36 -0
- package/dist/utils/file-writer.d.ts.map +1 -0
- package/dist/utils/file-writer.js +203 -0
- package/dist/utils/file-writer.js.map +1 -0
- package/dist/utils/manifest-prune.d.ts +61 -0
- package/dist/utils/manifest-prune.d.ts.map +1 -0
- package/dist/utils/manifest-prune.js +136 -0
- package/dist/utils/manifest-prune.js.map +1 -0
- package/dist/utils/posix.d.ts +13 -0
- package/dist/utils/posix.d.ts.map +1 -0
- package/dist/utils/posix.js +15 -0
- package/dist/utils/posix.js.map +1 -0
- package/dist/utils/project-detector.d.ts +46 -0
- package/dist/utils/project-detector.d.ts.map +1 -0
- package/dist/utils/project-detector.js +666 -0
- package/dist/utils/project-detector.js.map +1 -0
- package/dist/utils/proxy.d.ts +25 -0
- package/dist/utils/proxy.d.ts.map +1 -0
- package/dist/utils/proxy.js +60 -0
- package/dist/utils/proxy.js.map +1 -0
- package/dist/utils/task-json.d.ts +13 -0
- package/dist/utils/task-json.d.ts.map +1 -0
- package/dist/utils/task-json.js +12 -0
- package/dist/utils/task-json.js.map +1 -0
- package/dist/utils/template-fetcher.d.ts +150 -0
- package/dist/utils/template-fetcher.d.ts.map +1 -0
- package/dist/utils/template-fetcher.js +907 -0
- package/dist/utils/template-fetcher.js.map +1 -0
- package/dist/utils/template-hash.d.ts +123 -0
- package/dist/utils/template-hash.d.ts.map +1 -0
- package/dist/utils/template-hash.js +334 -0
- package/dist/utils/template-hash.js.map +1 -0
- package/dist/utils/uninstall-scrubbers.d.ts +66 -0
- package/dist/utils/uninstall-scrubbers.d.ts.map +1 -0
- package/dist/utils/uninstall-scrubbers.js +342 -0
- package/dist/utils/uninstall-scrubbers.js.map +1 -0
- package/dist/utils/workflow-resolver.d.ts +86 -0
- package/dist/utils/workflow-resolver.d.ts.map +1 -0
- package/dist/utils/workflow-resolver.js +265 -0
- package/dist/utils/workflow-resolver.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Trellis configuration reader.
|
|
4
|
+
|
|
5
|
+
Reads settings from .trellis/config.yaml with sensible defaults.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
from .paths import DIR_WORKFLOW, get_repo_root
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# =============================================================================
|
|
17
|
+
# YAML Simple Parser (no dependencies)
|
|
18
|
+
# =============================================================================
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _unquote(s: str) -> str:
|
|
22
|
+
"""Remove exactly one layer of matching surrounding quotes.
|
|
23
|
+
|
|
24
|
+
Unlike str.strip('"'), this only removes the outermost pair,
|
|
25
|
+
preserving any nested quotes inside the value.
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
_unquote('"hello"') -> 'hello'
|
|
29
|
+
_unquote("'hello'") -> 'hello'
|
|
30
|
+
_unquote('"echo \\'hi\\'"') -> "echo 'hi'"
|
|
31
|
+
_unquote('hello') -> 'hello'
|
|
32
|
+
_unquote('"hello\\'') -> '"hello\\'' (mismatched, unchanged)
|
|
33
|
+
"""
|
|
34
|
+
if len(s) >= 2 and s[0] == s[-1] and s[0] in ('"', "'"):
|
|
35
|
+
return s[1:-1]
|
|
36
|
+
return s
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _strip_inline_comment(value: str) -> str:
|
|
40
|
+
"""Strip ` # …` inline comments while preserving `#` inside quoted strings.
|
|
41
|
+
|
|
42
|
+
YAML treats ` #` (space-hash) as a comment opener; bare `#` inside a token
|
|
43
|
+
is part of the value. Quoted strings are immune.
|
|
44
|
+
|
|
45
|
+
Mirrors :func:`common.trellis_config._strip_inline_comment` so both
|
|
46
|
+
parsers handle ``key: value # comment`` identically.
|
|
47
|
+
"""
|
|
48
|
+
in_quote: str | None = None
|
|
49
|
+
for idx, ch in enumerate(value):
|
|
50
|
+
if in_quote:
|
|
51
|
+
if ch == in_quote:
|
|
52
|
+
in_quote = None
|
|
53
|
+
continue
|
|
54
|
+
if ch in ('"', "'"):
|
|
55
|
+
in_quote = ch
|
|
56
|
+
continue
|
|
57
|
+
if ch == "#" and (idx == 0 or value[idx - 1].isspace()):
|
|
58
|
+
return value[:idx]
|
|
59
|
+
return value
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def parse_simple_yaml(content: str) -> dict:
|
|
63
|
+
"""Parse simple YAML with nested dict support (no dependencies).
|
|
64
|
+
|
|
65
|
+
Supports:
|
|
66
|
+
- key: value (string)
|
|
67
|
+
- key: (followed by list items)
|
|
68
|
+
- item1
|
|
69
|
+
- item2
|
|
70
|
+
- key: (followed by nested dict)
|
|
71
|
+
nested_key: value
|
|
72
|
+
nested_key2:
|
|
73
|
+
- item
|
|
74
|
+
|
|
75
|
+
Uses indentation to detect nesting (2+ spaces deeper = child).
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
content: YAML content string.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
Parsed dict (values can be str, list[str], or dict).
|
|
82
|
+
"""
|
|
83
|
+
lines = content.splitlines()
|
|
84
|
+
result: dict = {}
|
|
85
|
+
_parse_yaml_block(lines, 0, 0, result)
|
|
86
|
+
return result
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _parse_yaml_block(
|
|
90
|
+
lines: list[str], start: int, min_indent: int, target: dict
|
|
91
|
+
) -> int:
|
|
92
|
+
"""Parse a YAML block into target dict, returning next line index."""
|
|
93
|
+
i = start
|
|
94
|
+
current_list: list | None = None
|
|
95
|
+
|
|
96
|
+
while i < len(lines):
|
|
97
|
+
line = lines[i]
|
|
98
|
+
stripped = line.strip()
|
|
99
|
+
|
|
100
|
+
# Skip empty lines and comments
|
|
101
|
+
if not stripped or stripped.startswith("#"):
|
|
102
|
+
i += 1
|
|
103
|
+
continue
|
|
104
|
+
|
|
105
|
+
# Calculate indentation
|
|
106
|
+
indent = len(line) - len(line.lstrip())
|
|
107
|
+
|
|
108
|
+
# If dedented past our block, we're done
|
|
109
|
+
if indent < min_indent:
|
|
110
|
+
break
|
|
111
|
+
|
|
112
|
+
if stripped.startswith("- "):
|
|
113
|
+
if current_list is not None:
|
|
114
|
+
current_list.append(_unquote(stripped[2:].strip()))
|
|
115
|
+
i += 1
|
|
116
|
+
elif ":" in stripped:
|
|
117
|
+
key, _, value = stripped.partition(":")
|
|
118
|
+
key = key.strip()
|
|
119
|
+
value = _strip_inline_comment(value).strip()
|
|
120
|
+
value = _unquote(value)
|
|
121
|
+
current_list = None
|
|
122
|
+
|
|
123
|
+
if value:
|
|
124
|
+
# key: value
|
|
125
|
+
target[key] = value
|
|
126
|
+
i += 1
|
|
127
|
+
else:
|
|
128
|
+
# key: (no value) — peek ahead to determine list vs nested dict
|
|
129
|
+
next_i, next_line = _next_content_line(lines, i + 1)
|
|
130
|
+
if next_i >= len(lines):
|
|
131
|
+
target[key] = {}
|
|
132
|
+
i = next_i
|
|
133
|
+
elif next_line.strip().startswith("- "):
|
|
134
|
+
# It's a list
|
|
135
|
+
current_list = []
|
|
136
|
+
target[key] = current_list
|
|
137
|
+
i += 1
|
|
138
|
+
else:
|
|
139
|
+
next_indent = len(next_line) - len(next_line.lstrip())
|
|
140
|
+
if next_indent > indent:
|
|
141
|
+
# It's a nested dict
|
|
142
|
+
nested: dict = {}
|
|
143
|
+
target[key] = nested
|
|
144
|
+
i = _parse_yaml_block(lines, i + 1, next_indent, nested)
|
|
145
|
+
else:
|
|
146
|
+
# Empty value, same or less indent follows
|
|
147
|
+
target[key] = {}
|
|
148
|
+
i += 1
|
|
149
|
+
else:
|
|
150
|
+
i += 1
|
|
151
|
+
|
|
152
|
+
return i
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def _next_content_line(lines: list[str], start: int) -> tuple[int, str]:
|
|
156
|
+
"""Find the next non-empty, non-comment line."""
|
|
157
|
+
i = start
|
|
158
|
+
while i < len(lines):
|
|
159
|
+
stripped = lines[i].strip()
|
|
160
|
+
if stripped and not stripped.startswith("#"):
|
|
161
|
+
return i, lines[i]
|
|
162
|
+
i += 1
|
|
163
|
+
return i, ""
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
# Defaults
|
|
167
|
+
DEFAULT_SESSION_COMMIT_MESSAGE = "chore: record journal"
|
|
168
|
+
DEFAULT_MAX_JOURNAL_LINES = 2000
|
|
169
|
+
DEFAULT_SESSION_AUTO_COMMIT = True
|
|
170
|
+
|
|
171
|
+
CONFIG_FILE = "config.yaml"
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def _is_true_config_value(value: object) -> bool:
|
|
175
|
+
"""Return True when a config value represents an enabled flag."""
|
|
176
|
+
if isinstance(value, bool):
|
|
177
|
+
return value
|
|
178
|
+
if isinstance(value, str):
|
|
179
|
+
return value.strip().lower() == "true"
|
|
180
|
+
return False
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def _get_config_path(repo_root: Path | None = None) -> Path:
|
|
184
|
+
"""Get path to config.yaml."""
|
|
185
|
+
root = repo_root or get_repo_root()
|
|
186
|
+
return root / DIR_WORKFLOW / CONFIG_FILE
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _load_config(repo_root: Path | None = None) -> dict:
|
|
190
|
+
"""Load and parse config.yaml. Returns empty dict on any error."""
|
|
191
|
+
config_file = _get_config_path(repo_root)
|
|
192
|
+
try:
|
|
193
|
+
content = config_file.read_text(encoding="utf-8")
|
|
194
|
+
return parse_simple_yaml(content)
|
|
195
|
+
except (OSError, IOError):
|
|
196
|
+
return {}
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def get_session_commit_message(repo_root: Path | None = None) -> str:
|
|
200
|
+
"""Get the commit message for auto-committing session records."""
|
|
201
|
+
config = _load_config(repo_root)
|
|
202
|
+
return config.get("session_commit_message", DEFAULT_SESSION_COMMIT_MESSAGE)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def get_max_journal_lines(repo_root: Path | None = None) -> int:
|
|
206
|
+
"""Get the maximum lines per journal file."""
|
|
207
|
+
config = _load_config(repo_root)
|
|
208
|
+
value = config.get("max_journal_lines", DEFAULT_MAX_JOURNAL_LINES)
|
|
209
|
+
try:
|
|
210
|
+
return int(value)
|
|
211
|
+
except (ValueError, TypeError):
|
|
212
|
+
return DEFAULT_MAX_JOURNAL_LINES
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def get_session_auto_commit(repo_root: Path | None = None) -> bool:
|
|
216
|
+
"""Whether scripts should auto-stage + auto-commit session/task changes.
|
|
217
|
+
|
|
218
|
+
Governs both ``add_session.py:_auto_commit_workspace`` and
|
|
219
|
+
``task_store.py:_auto_commit_archive``.
|
|
220
|
+
|
|
221
|
+
Default: ``True`` (existing behavior — auto-stage + auto-commit).
|
|
222
|
+
Set ``session_auto_commit: false`` in ``.trellis/config.yaml`` to skip
|
|
223
|
+
auto-staging entirely; the journal/archive files are still written to
|
|
224
|
+
disk, but the user manages ``git add`` / ``git commit`` themselves.
|
|
225
|
+
|
|
226
|
+
Accepts native YAML booleans (``true`` / ``false``) and the string
|
|
227
|
+
aliases ``true / false / yes / no / 1 / 0 / on / off`` (case-insensitive).
|
|
228
|
+
Invalid values fall back to ``True`` with a stderr warning.
|
|
229
|
+
"""
|
|
230
|
+
config = _load_config(repo_root)
|
|
231
|
+
raw = config.get("session_auto_commit", DEFAULT_SESSION_AUTO_COMMIT)
|
|
232
|
+
if isinstance(raw, bool):
|
|
233
|
+
return raw
|
|
234
|
+
s = str(raw).strip().lower()
|
|
235
|
+
if s in ("true", "yes", "1", "on"):
|
|
236
|
+
return True
|
|
237
|
+
if s in ("false", "no", "0", "off"):
|
|
238
|
+
return False
|
|
239
|
+
print(
|
|
240
|
+
f"[WARN] invalid session_auto_commit value: {raw!r}; using true (default)",
|
|
241
|
+
file=sys.stderr,
|
|
242
|
+
)
|
|
243
|
+
return DEFAULT_SESSION_AUTO_COMMIT
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def get_hooks(event: str, repo_root: Path | None = None) -> list[str]:
|
|
247
|
+
"""Get hook commands for a lifecycle event.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
event: Event name (e.g. "after_create", "after_archive").
|
|
251
|
+
repo_root: Repository root path.
|
|
252
|
+
|
|
253
|
+
Returns:
|
|
254
|
+
List of shell commands to execute, empty if none configured.
|
|
255
|
+
"""
|
|
256
|
+
config = _load_config(repo_root)
|
|
257
|
+
hooks = config.get("hooks")
|
|
258
|
+
if not isinstance(hooks, dict):
|
|
259
|
+
return []
|
|
260
|
+
commands = hooks.get(event)
|
|
261
|
+
if isinstance(commands, list):
|
|
262
|
+
return [str(c) for c in commands]
|
|
263
|
+
return []
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
# =============================================================================
|
|
267
|
+
# Monorepo / Packages
|
|
268
|
+
# =============================================================================
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def get_packages(repo_root: Path | None = None) -> dict[str, dict] | None:
|
|
272
|
+
"""Get monorepo package declarations.
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
Dict mapping package name to its config (path, type, etc.),
|
|
276
|
+
or None if not configured (single-repo mode).
|
|
277
|
+
|
|
278
|
+
Example return:
|
|
279
|
+
{"cli": {"path": "packages/cli"}, "docs-site": {"path": "docs-site", "type": "submodule"}}
|
|
280
|
+
"""
|
|
281
|
+
config = _load_config(repo_root)
|
|
282
|
+
packages = config.get("packages")
|
|
283
|
+
if not isinstance(packages, dict):
|
|
284
|
+
return None
|
|
285
|
+
# Ensure each value is a dict (filter out scalar entries)
|
|
286
|
+
filtered = {k: v for k, v in packages.items() if isinstance(v, dict)}
|
|
287
|
+
if not filtered:
|
|
288
|
+
return None
|
|
289
|
+
return filtered
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def get_default_package(repo_root: Path | None = None) -> str | None:
|
|
293
|
+
"""Get the default package name from config.
|
|
294
|
+
|
|
295
|
+
Returns:
|
|
296
|
+
Package name string, or None if not configured.
|
|
297
|
+
"""
|
|
298
|
+
config = _load_config(repo_root)
|
|
299
|
+
value = config.get("default_package")
|
|
300
|
+
return str(value) if value else None
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
def get_submodule_packages(repo_root: Path | None = None) -> dict[str, str]:
|
|
304
|
+
"""Get packages that are git submodules.
|
|
305
|
+
|
|
306
|
+
Returns:
|
|
307
|
+
Dict mapping package name to its path for submodule-type packages.
|
|
308
|
+
Empty dict if none configured.
|
|
309
|
+
|
|
310
|
+
Example return:
|
|
311
|
+
{"docs-site": "docs-site"}
|
|
312
|
+
"""
|
|
313
|
+
packages = get_packages(repo_root)
|
|
314
|
+
if packages is None:
|
|
315
|
+
return {}
|
|
316
|
+
return {
|
|
317
|
+
name: cfg.get("path", name)
|
|
318
|
+
for name, cfg in packages.items()
|
|
319
|
+
if cfg.get("type") == "submodule"
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
def get_git_packages(repo_root: Path | None = None) -> dict[str, str]:
|
|
324
|
+
"""Get packages that have their own independent git repository.
|
|
325
|
+
|
|
326
|
+
These are sub-directories with their own .git (not submodules),
|
|
327
|
+
marked with ``git: true`` in config.yaml.
|
|
328
|
+
|
|
329
|
+
Returns:
|
|
330
|
+
Dict mapping package name to its path for git-repo packages.
|
|
331
|
+
Empty dict if none configured.
|
|
332
|
+
|
|
333
|
+
Example config::
|
|
334
|
+
|
|
335
|
+
packages:
|
|
336
|
+
backend:
|
|
337
|
+
path: iqs
|
|
338
|
+
git: true
|
|
339
|
+
|
|
340
|
+
Example return::
|
|
341
|
+
|
|
342
|
+
{"backend": "iqs"}
|
|
343
|
+
"""
|
|
344
|
+
packages = get_packages(repo_root)
|
|
345
|
+
if packages is None:
|
|
346
|
+
return {}
|
|
347
|
+
return {
|
|
348
|
+
name: cfg.get("path", name)
|
|
349
|
+
for name, cfg in packages.items()
|
|
350
|
+
if _is_true_config_value(cfg.get("git"))
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def is_monorepo(repo_root: Path | None = None) -> bool:
|
|
355
|
+
"""Check if the project is configured as a monorepo (has packages in config)."""
|
|
356
|
+
return get_packages(repo_root) is not None
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def get_spec_base(package: str | None = None, repo_root: Path | None = None) -> str:
|
|
360
|
+
"""Get the spec directory base path relative to .trellis/.
|
|
361
|
+
|
|
362
|
+
Single-repo: returns "spec"
|
|
363
|
+
Monorepo with package: returns "spec/<package>"
|
|
364
|
+
Monorepo without package: returns "spec" (caller should specify package)
|
|
365
|
+
"""
|
|
366
|
+
if package and is_monorepo(repo_root):
|
|
367
|
+
return f"spec/{package}"
|
|
368
|
+
return "spec"
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def validate_package(package: str, repo_root: Path | None = None) -> bool:
|
|
372
|
+
"""Check if a package name is valid in this project.
|
|
373
|
+
|
|
374
|
+
Single-repo (no packages configured): always returns True.
|
|
375
|
+
Monorepo: returns True only if package exists in config.yaml packages.
|
|
376
|
+
"""
|
|
377
|
+
packages = get_packages(repo_root)
|
|
378
|
+
if packages is None:
|
|
379
|
+
return True # Single-repo, no validation needed
|
|
380
|
+
return package in packages
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
def resolve_package(
|
|
384
|
+
task_package: str | None = None,
|
|
385
|
+
repo_root: Path | None = None,
|
|
386
|
+
) -> str | None:
|
|
387
|
+
"""Resolve package from inferred sources with validation.
|
|
388
|
+
|
|
389
|
+
Checks in order: task_package → default_package.
|
|
390
|
+
Invalid inferred values print a warning to stderr and are skipped.
|
|
391
|
+
|
|
392
|
+
Returns:
|
|
393
|
+
Resolved package name, or None if no valid package found.
|
|
394
|
+
|
|
395
|
+
Note:
|
|
396
|
+
CLI --package should be validated separately by the caller
|
|
397
|
+
(fail-fast with available packages list on error).
|
|
398
|
+
"""
|
|
399
|
+
packages = get_packages(repo_root)
|
|
400
|
+
if packages is None:
|
|
401
|
+
return None # Single-repo, no package needed
|
|
402
|
+
|
|
403
|
+
# Try task_package (guard against non-string values from malformed JSON)
|
|
404
|
+
if task_package and isinstance(task_package, str):
|
|
405
|
+
if task_package in packages:
|
|
406
|
+
return task_package
|
|
407
|
+
print(
|
|
408
|
+
f"Warning: task.json package '{task_package}' not found in config, skipping",
|
|
409
|
+
file=sys.stderr,
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
# Try default_package
|
|
413
|
+
default = get_default_package(repo_root)
|
|
414
|
+
if default:
|
|
415
|
+
if default in packages:
|
|
416
|
+
return default
|
|
417
|
+
print(
|
|
418
|
+
f"Warning: default_package '{default}' not found in config, skipping",
|
|
419
|
+
file=sys.stderr,
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
return None
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
def get_spec_scope(repo_root: Path | None = None) -> list[str] | str | None:
|
|
426
|
+
"""Get session.spec_scope configuration.
|
|
427
|
+
|
|
428
|
+
Returns:
|
|
429
|
+
list[str]: Package names to include in spec scanning.
|
|
430
|
+
str: "active_task" to use current task's package.
|
|
431
|
+
None: No scope configured (scan all packages).
|
|
432
|
+
"""
|
|
433
|
+
config = _load_config(repo_root)
|
|
434
|
+
session = config.get("session")
|
|
435
|
+
if not isinstance(session, dict):
|
|
436
|
+
return None
|
|
437
|
+
|
|
438
|
+
scope = session.get("spec_scope")
|
|
439
|
+
if scope is None:
|
|
440
|
+
return None
|
|
441
|
+
if isinstance(scope, str):
|
|
442
|
+
return scope # e.g. "active_task"
|
|
443
|
+
if isinstance(scope, list):
|
|
444
|
+
return [str(s) for s in scope]
|
|
445
|
+
return None
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Developer management utilities.
|
|
4
|
+
|
|
5
|
+
Provides:
|
|
6
|
+
init_developer - Initialize developer
|
|
7
|
+
ensure_developer - Ensure developer is initialized (exit if not)
|
|
8
|
+
show_developer_info - Show developer information
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import sys
|
|
14
|
+
from datetime import datetime
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
from .paths import (
|
|
18
|
+
DIR_WORKFLOW,
|
|
19
|
+
DIR_WORKSPACE,
|
|
20
|
+
DIR_TASKS,
|
|
21
|
+
FILE_DEVELOPER,
|
|
22
|
+
FILE_JOURNAL_PREFIX,
|
|
23
|
+
get_repo_root,
|
|
24
|
+
get_developer,
|
|
25
|
+
check_developer,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# =============================================================================
|
|
30
|
+
# Developer Initialization
|
|
31
|
+
# =============================================================================
|
|
32
|
+
|
|
33
|
+
def init_developer(name: str, repo_root: Path | None = None) -> bool:
|
|
34
|
+
"""Initialize developer.
|
|
35
|
+
|
|
36
|
+
Creates:
|
|
37
|
+
- .trellis/.developer file with developer info
|
|
38
|
+
- .trellis/workspace/<name>/ directory structure
|
|
39
|
+
- Initial journal file and index.md
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
name: Developer name.
|
|
43
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
True on success, False on error.
|
|
47
|
+
"""
|
|
48
|
+
if not name:
|
|
49
|
+
print("Error: developer name is required", file=sys.stderr)
|
|
50
|
+
return False
|
|
51
|
+
|
|
52
|
+
if repo_root is None:
|
|
53
|
+
repo_root = get_repo_root()
|
|
54
|
+
|
|
55
|
+
dev_file = repo_root / DIR_WORKFLOW / FILE_DEVELOPER
|
|
56
|
+
workspace_dir = repo_root / DIR_WORKFLOW / DIR_WORKSPACE / name
|
|
57
|
+
|
|
58
|
+
# Create .developer file
|
|
59
|
+
initialized_at = datetime.now().isoformat()
|
|
60
|
+
try:
|
|
61
|
+
dev_file.write_text(
|
|
62
|
+
f"name={name}\ninitialized_at={initialized_at}\n",
|
|
63
|
+
encoding="utf-8"
|
|
64
|
+
)
|
|
65
|
+
except (OSError, IOError) as e:
|
|
66
|
+
print(f"Error: Failed to create .developer file: {e}", file=sys.stderr)
|
|
67
|
+
return False
|
|
68
|
+
|
|
69
|
+
# Create workspace directory structure
|
|
70
|
+
try:
|
|
71
|
+
workspace_dir.mkdir(parents=True, exist_ok=True)
|
|
72
|
+
except (OSError, IOError) as e:
|
|
73
|
+
print(f"Error: Failed to create workspace directory: {e}", file=sys.stderr)
|
|
74
|
+
return False
|
|
75
|
+
|
|
76
|
+
# Create initial journal file
|
|
77
|
+
journal_file = workspace_dir / f"{FILE_JOURNAL_PREFIX}1.md"
|
|
78
|
+
if not journal_file.exists():
|
|
79
|
+
today = datetime.now().strftime("%Y-%m-%d")
|
|
80
|
+
journal_content = f"""# Journal - {name} (Part 1)
|
|
81
|
+
|
|
82
|
+
> AI development session journal
|
|
83
|
+
> Started: {today}
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
"""
|
|
88
|
+
try:
|
|
89
|
+
journal_file.write_text(journal_content, encoding="utf-8")
|
|
90
|
+
except (OSError, IOError) as e:
|
|
91
|
+
print(f"Error: Failed to create journal file: {e}", file=sys.stderr)
|
|
92
|
+
return False
|
|
93
|
+
|
|
94
|
+
# Create index.md with markers for auto-update
|
|
95
|
+
index_file = workspace_dir / "index.md"
|
|
96
|
+
if not index_file.exists():
|
|
97
|
+
index_content = f"""# Workspace Index - {name}
|
|
98
|
+
|
|
99
|
+
> Journal tracking for AI development sessions.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Current Status
|
|
104
|
+
|
|
105
|
+
<!-- @@@auto:current-status -->
|
|
106
|
+
- **Active File**: `journal-1.md`
|
|
107
|
+
- **Total Sessions**: 0
|
|
108
|
+
- **Last Active**: -
|
|
109
|
+
<!-- @@@/auto:current-status -->
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Active Documents
|
|
114
|
+
|
|
115
|
+
<!-- @@@auto:active-documents -->
|
|
116
|
+
| File | Lines | Status |
|
|
117
|
+
|------|-------|--------|
|
|
118
|
+
| `journal-1.md` | ~0 | Active |
|
|
119
|
+
<!-- @@@/auto:active-documents -->
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Session History
|
|
124
|
+
|
|
125
|
+
<!-- @@@auto:session-history -->
|
|
126
|
+
| # | Date | Title | Commits | Branch |
|
|
127
|
+
|---|------|-------|---------|--------|
|
|
128
|
+
<!-- @@@/auto:session-history -->
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Notes
|
|
133
|
+
|
|
134
|
+
- Sessions are appended to journal files
|
|
135
|
+
- New journal file created when current exceeds 2000 lines
|
|
136
|
+
- Use `add_session.py` to record sessions
|
|
137
|
+
"""
|
|
138
|
+
try:
|
|
139
|
+
index_file.write_text(index_content, encoding="utf-8")
|
|
140
|
+
except (OSError, IOError) as e:
|
|
141
|
+
print(f"Error: Failed to create index.md: {e}", file=sys.stderr)
|
|
142
|
+
return False
|
|
143
|
+
|
|
144
|
+
print(f"Developer initialized: {name}")
|
|
145
|
+
print(f" .developer file: {dev_file}")
|
|
146
|
+
print(f" Workspace dir: {workspace_dir}")
|
|
147
|
+
|
|
148
|
+
return True
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def ensure_developer(repo_root: Path | None = None) -> None:
|
|
152
|
+
"""Ensure developer is initialized, exit if not.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
156
|
+
"""
|
|
157
|
+
if repo_root is None:
|
|
158
|
+
repo_root = get_repo_root()
|
|
159
|
+
|
|
160
|
+
if not check_developer(repo_root):
|
|
161
|
+
print("Error: Developer not initialized.", file=sys.stderr)
|
|
162
|
+
print(f"Run: python3 ./{DIR_WORKFLOW}/scripts/init_developer.py <your-name>", file=sys.stderr)
|
|
163
|
+
sys.exit(1)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def show_developer_info(repo_root: Path | None = None) -> None:
|
|
167
|
+
"""Show developer information.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
171
|
+
"""
|
|
172
|
+
if repo_root is None:
|
|
173
|
+
repo_root = get_repo_root()
|
|
174
|
+
|
|
175
|
+
developer = get_developer(repo_root)
|
|
176
|
+
|
|
177
|
+
if not developer:
|
|
178
|
+
print("Developer: (not initialized)")
|
|
179
|
+
else:
|
|
180
|
+
print(f"Developer: {developer}")
|
|
181
|
+
print(f"Workspace: {DIR_WORKFLOW}/{DIR_WORKSPACE}/{developer}/")
|
|
182
|
+
print(f"Tasks: {DIR_WORKFLOW}/{DIR_TASKS}/")
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
# =============================================================================
|
|
186
|
+
# Main Entry (for testing)
|
|
187
|
+
# =============================================================================
|
|
188
|
+
|
|
189
|
+
if __name__ == "__main__":
|
|
190
|
+
show_developer_info()
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Git command execution utility.
|
|
3
|
+
|
|
4
|
+
Single source of truth for running git commands across all Trellis scripts.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import subprocess
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def run_git(args: list[str], cwd: Path | None = None) -> tuple[int, str, str]:
|
|
14
|
+
"""Run a git command and return (returncode, stdout, stderr).
|
|
15
|
+
|
|
16
|
+
Uses UTF-8 encoding with -c i18n.logOutputEncoding=UTF-8 to ensure
|
|
17
|
+
consistent output across all platforms (Windows, macOS, Linux).
|
|
18
|
+
"""
|
|
19
|
+
try:
|
|
20
|
+
git_args = ["git", "-c", "i18n.logOutputEncoding=UTF-8"] + args
|
|
21
|
+
result = subprocess.run(
|
|
22
|
+
git_args,
|
|
23
|
+
cwd=cwd,
|
|
24
|
+
capture_output=True,
|
|
25
|
+
text=True,
|
|
26
|
+
encoding="utf-8",
|
|
27
|
+
errors="replace",
|
|
28
|
+
)
|
|
29
|
+
return result.returncode, result.stdout, result.stderr
|
|
30
|
+
except Exception as e:
|
|
31
|
+
return 1, "", str(e)
|