@proletariat/cli 0.3.51 → 0.3.53
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/README.md +28 -0
- package/bin/run.js +21 -11
- package/dist/commands/action/create.js +1 -0
- package/dist/commands/action/create.js.map +1 -0
- package/dist/commands/action/delete.js +1 -0
- package/dist/commands/action/delete.js.map +1 -0
- package/dist/commands/action/index.js +1 -0
- package/dist/commands/action/index.js.map +1 -0
- package/dist/commands/action/list.js +1 -0
- package/dist/commands/action/list.js.map +1 -0
- package/dist/commands/action/run.js +1 -0
- package/dist/commands/action/run.js.map +1 -0
- package/dist/commands/action/show.js +1 -0
- package/dist/commands/action/show.js.map +1 -0
- package/dist/commands/action/update.js +1 -0
- package/dist/commands/action/update.js.map +1 -0
- package/dist/commands/agent/auth.js +1 -0
- package/dist/commands/agent/auth.js.map +1 -0
- package/dist/commands/agent/cleanup.js +1 -0
- package/dist/commands/agent/cleanup.js.map +1 -0
- package/dist/commands/agent/discover.js +1 -0
- package/dist/commands/agent/discover.js.map +1 -0
- package/dist/commands/agent/index.js +1 -0
- package/dist/commands/agent/index.js.map +1 -0
- package/dist/commands/agent/list.js +1 -0
- package/dist/commands/agent/list.js.map +1 -0
- package/dist/commands/agent/login.js +1 -0
- package/dist/commands/agent/login.js.map +1 -0
- package/dist/commands/agent/rebuild.js +1 -0
- package/dist/commands/agent/rebuild.js.map +1 -0
- package/dist/commands/agent/remove.js +1 -0
- package/dist/commands/agent/remove.js.map +1 -0
- package/dist/commands/agent/restart.js +1 -0
- package/dist/commands/agent/restart.js.map +1 -0
- package/dist/commands/agent/shell.js +5 -1
- package/dist/commands/agent/shell.js.map +1 -0
- package/dist/commands/agent/staff/add.js +1 -0
- package/dist/commands/agent/staff/add.js.map +1 -0
- package/dist/commands/agent/staff/index.js +1 -0
- package/dist/commands/agent/staff/index.js.map +1 -0
- package/dist/commands/agent/staff/list.js +1 -0
- package/dist/commands/agent/staff/list.js.map +1 -0
- package/dist/commands/agent/staff/remove.js +1 -0
- package/dist/commands/agent/staff/remove.js.map +1 -0
- package/dist/commands/agent/status.js +2 -0
- package/dist/commands/agent/status.js.map +1 -0
- package/dist/commands/agent/themes/add-names.js +1 -0
- package/dist/commands/agent/themes/add-names.js.map +1 -0
- package/dist/commands/agent/themes/create.js +1 -0
- package/dist/commands/agent/themes/create.js.map +1 -0
- package/dist/commands/agent/themes/index.js +1 -0
- package/dist/commands/agent/themes/index.js.map +1 -0
- package/dist/commands/agent/themes/list.js +1 -0
- package/dist/commands/agent/themes/list.js.map +1 -0
- package/dist/commands/agent/themes/set.js +1 -0
- package/dist/commands/agent/themes/set.js.map +1 -0
- package/dist/commands/agent/visit.js +1 -0
- package/dist/commands/agent/visit.js.map +1 -0
- package/dist/commands/agents/themes/add-names.js +1 -0
- package/dist/commands/agents/themes/add-names.js.map +1 -0
- package/dist/commands/agents/themes/create.js +1 -0
- package/dist/commands/agents/themes/create.js.map +1 -0
- package/dist/commands/agents/themes/list.js +1 -0
- package/dist/commands/agents/themes/list.js.map +1 -0
- package/dist/commands/asana/connect.d.ts +15 -0
- package/dist/commands/asana/connect.js +268 -0
- package/dist/commands/asana/connect.js.map +1 -0
- package/dist/commands/asana/sync.d.ts +15 -0
- package/dist/commands/asana/sync.js +190 -0
- package/dist/commands/asana/sync.js.map +1 -0
- package/dist/commands/autocomplete/setup.js +1 -0
- package/dist/commands/autocomplete/setup.js.map +1 -0
- package/dist/commands/board/index.js +1 -0
- package/dist/commands/board/index.js.map +1 -0
- package/dist/commands/board/view.js +1 -0
- package/dist/commands/board/view.js.map +1 -0
- package/dist/commands/board/watch.js +1 -0
- package/dist/commands/board/watch.js.map +1 -0
- package/dist/commands/branch/create.js +1 -0
- package/dist/commands/branch/create.js.map +1 -0
- package/dist/commands/branch/index.js +1 -0
- package/dist/commands/branch/index.js.map +1 -0
- package/dist/commands/branch/list.js +1 -0
- package/dist/commands/branch/list.js.map +1 -0
- package/dist/commands/branch/validate.js +1 -0
- package/dist/commands/branch/validate.js.map +1 -0
- package/dist/commands/branch/where.js +1 -0
- package/dist/commands/branch/where.js.map +1 -0
- package/dist/commands/caffeinate/index.js +1 -0
- package/dist/commands/caffeinate/index.js.map +1 -0
- package/dist/commands/caffeinate/start.js +1 -0
- package/dist/commands/caffeinate/start.js.map +1 -0
- package/dist/commands/caffeinate/status.js +1 -0
- package/dist/commands/caffeinate/status.js.map +1 -0
- package/dist/commands/caffeinate/stop.js +1 -0
- package/dist/commands/caffeinate/stop.js.map +1 -0
- package/dist/commands/category/create.js +1 -0
- package/dist/commands/category/create.js.map +1 -0
- package/dist/commands/category/delete.js +1 -0
- package/dist/commands/category/delete.js.map +1 -0
- package/dist/commands/category/index.js +1 -0
- package/dist/commands/category/index.js.map +1 -0
- package/dist/commands/category/list.js +1 -0
- package/dist/commands/category/list.js.map +1 -0
- package/dist/commands/category/rename.js +1 -0
- package/dist/commands/category/rename.js.map +1 -0
- package/dist/commands/claude/index.js +11 -5
- package/dist/commands/claude/index.js.map +1 -0
- package/dist/commands/claude/open.js +1 -0
- package/dist/commands/claude/open.js.map +1 -0
- package/dist/commands/commit.js +1 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/config/index.js +8 -1
- package/dist/commands/config/index.js.map +1 -0
- package/dist/commands/diet.js +1 -0
- package/dist/commands/diet.js.map +1 -0
- package/dist/commands/docker/clean.js +1 -0
- package/dist/commands/docker/clean.js.map +1 -0
- package/dist/commands/docker/index.js +1 -0
- package/dist/commands/docker/index.js.map +1 -0
- package/dist/commands/docker/list.js +1 -0
- package/dist/commands/docker/list.js.map +1 -0
- package/dist/commands/docker/logs.js +4 -1
- package/dist/commands/docker/logs.js.map +1 -0
- package/dist/commands/docker/prune.js +1 -0
- package/dist/commands/docker/prune.js.map +1 -0
- package/dist/commands/docker/restart.js +1 -0
- package/dist/commands/docker/restart.js.map +1 -0
- package/dist/commands/docker/shell.js +4 -1
- package/dist/commands/docker/shell.js.map +1 -0
- package/dist/commands/docker/start.js +1 -0
- package/dist/commands/docker/start.js.map +1 -0
- package/dist/commands/docker/status.js +1 -0
- package/dist/commands/docker/status.js.map +1 -0
- package/dist/commands/docker/stop.js +1 -0
- package/dist/commands/docker/stop.js.map +1 -0
- package/dist/commands/docker/sync.js +1 -0
- package/dist/commands/docker/sync.js.map +1 -0
- package/dist/commands/epic/activate.js +1 -0
- package/dist/commands/epic/activate.js.map +1 -0
- package/dist/commands/epic/archive.js +1 -0
- package/dist/commands/epic/archive.js.map +1 -0
- package/dist/commands/epic/create.js +1 -0
- package/dist/commands/epic/create.js.map +1 -0
- package/dist/commands/epic/delete.js +1 -0
- package/dist/commands/epic/delete.js.map +1 -0
- package/dist/commands/epic/index.js +1 -0
- package/dist/commands/epic/index.js.map +1 -0
- package/dist/commands/epic/list.js +1 -0
- package/dist/commands/epic/list.js.map +1 -0
- package/dist/commands/epic/move.js +1 -0
- package/dist/commands/epic/move.js.map +1 -0
- package/dist/commands/epic/progress.js +1 -0
- package/dist/commands/epic/progress.js.map +1 -0
- package/dist/commands/epic/project.js +1 -0
- package/dist/commands/epic/project.js.map +1 -0
- package/dist/commands/epic/reorder.js +1 -0
- package/dist/commands/epic/reorder.js.map +1 -0
- package/dist/commands/epic/show.js +1 -0
- package/dist/commands/epic/show.js.map +1 -0
- package/dist/commands/epic/spec.js +1 -0
- package/dist/commands/epic/spec.js.map +1 -0
- package/dist/commands/epic/ticket.js +1 -0
- package/dist/commands/epic/ticket.js.map +1 -0
- package/dist/commands/epic/view.js +1 -0
- package/dist/commands/epic/view.js.map +1 -0
- package/dist/commands/execution/config.js +1 -0
- package/dist/commands/execution/config.js.map +1 -0
- package/dist/commands/execution/index.js +1 -0
- package/dist/commands/execution/index.js.map +1 -0
- package/dist/commands/execution/kill.js +1 -0
- package/dist/commands/execution/kill.js.map +1 -0
- package/dist/commands/execution/list.js +4 -0
- package/dist/commands/execution/list.js.map +1 -0
- package/dist/commands/execution/logs.js +4 -5
- package/dist/commands/execution/logs.js.map +1 -0
- package/dist/commands/execution/stop.js +1 -0
- package/dist/commands/execution/stop.js.map +1 -0
- package/dist/commands/execution/view.js +11 -0
- package/dist/commands/execution/view.js.map +1 -0
- package/dist/commands/feedback/index.js +1 -0
- package/dist/commands/feedback/index.js.map +1 -0
- package/dist/commands/feedback/list.js +1 -0
- package/dist/commands/feedback/list.js.map +1 -0
- package/dist/commands/feedback/submit.js +1 -0
- package/dist/commands/feedback/submit.js.map +1 -0
- package/dist/commands/feedback/view.js +1 -0
- package/dist/commands/feedback/view.js.map +1 -0
- package/dist/commands/gh/index.js +1 -0
- package/dist/commands/gh/index.js.map +1 -0
- package/dist/commands/gh/login.js +4 -1
- package/dist/commands/gh/login.js.map +1 -0
- package/dist/commands/gh/status.js +1 -0
- package/dist/commands/gh/status.js.map +1 -0
- package/dist/commands/gh/token.js +1 -0
- package/dist/commands/gh/token.js.map +1 -0
- package/dist/commands/init.js +1 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/label/create.js +1 -0
- package/dist/commands/label/create.js.map +1 -0
- package/dist/commands/label/delete.js +1 -0
- package/dist/commands/label/delete.js.map +1 -0
- package/dist/commands/label/group/create.js +1 -0
- package/dist/commands/label/group/create.js.map +1 -0
- package/dist/commands/label/group/list.js +1 -0
- package/dist/commands/label/group/list.js.map +1 -0
- package/dist/commands/label/index.js +1 -0
- package/dist/commands/label/index.js.map +1 -0
- package/dist/commands/label/list.js +1 -0
- package/dist/commands/label/list.js.map +1 -0
- package/dist/commands/linear/auth.d.ts +1 -0
- package/dist/commands/linear/auth.js +7 -5
- package/dist/commands/linear/auth.js.map +1 -0
- package/dist/commands/linear/connect.d.ts +17 -0
- package/dist/commands/linear/connect.js +298 -0
- package/dist/commands/linear/connect.js.map +1 -0
- package/dist/commands/linear/import.js +3 -2
- package/dist/commands/linear/import.js.map +1 -0
- package/dist/commands/linear/status.js +42 -5
- package/dist/commands/linear/status.js.map +1 -0
- package/dist/commands/linear/sync.js +3 -2
- package/dist/commands/linear/sync.js.map +1 -0
- package/dist/commands/link/create.js +1 -0
- package/dist/commands/link/create.js.map +1 -0
- package/dist/commands/link/index.js +1 -0
- package/dist/commands/link/index.js.map +1 -0
- package/dist/commands/link/list.js +1 -0
- package/dist/commands/link/list.js.map +1 -0
- package/dist/commands/link/remove.js +1 -0
- package/dist/commands/link/remove.js.map +1 -0
- package/dist/commands/mcp-server.js +1 -0
- package/dist/commands/mcp-server.js.map +1 -0
- package/dist/commands/monday/connect.d.ts +16 -0
- package/dist/commands/monday/connect.js +213 -0
- package/dist/commands/monday/connect.js.map +1 -0
- package/dist/commands/monday/sync.d.ts +14 -0
- package/dist/commands/monday/sync.js +179 -0
- package/dist/commands/monday/sync.js.map +1 -0
- package/dist/commands/orchestrator/attach.js +50 -13
- package/dist/commands/orchestrator/attach.js.map +1 -0
- package/dist/commands/orchestrator/index.js +1 -0
- package/dist/commands/orchestrator/index.js.map +1 -0
- package/dist/commands/orchestrator/start.d.ts +15 -0
- package/dist/commands/orchestrator/start.js +187 -13
- package/dist/commands/orchestrator/start.js.map +1 -0
- package/dist/commands/orchestrator/status.js +63 -28
- package/dist/commands/orchestrator/status.js.map +1 -0
- package/dist/commands/orchestrator/stop.js +65 -17
- package/dist/commands/orchestrator/stop.js.map +1 -0
- package/dist/commands/phase/create.js +1 -0
- package/dist/commands/phase/create.js.map +1 -0
- package/dist/commands/phase/delete.js +1 -0
- package/dist/commands/phase/delete.js.map +1 -0
- package/dist/commands/phase/list.js +1 -0
- package/dist/commands/phase/list.js.map +1 -0
- package/dist/commands/phase/move.js +1 -0
- package/dist/commands/phase/move.js.map +1 -0
- package/dist/commands/phase/template/apply.js +1 -0
- package/dist/commands/phase/template/apply.js.map +1 -0
- package/dist/commands/phase/template/create.js +1 -0
- package/dist/commands/phase/template/create.js.map +1 -0
- package/dist/commands/phase/template/delete.js +1 -0
- package/dist/commands/phase/template/delete.js.map +1 -0
- package/dist/commands/phase/template/list.js +1 -0
- package/dist/commands/phase/template/list.js.map +1 -0
- package/dist/commands/phase/template/update.js +1 -0
- package/dist/commands/phase/template/update.js.map +1 -0
- package/dist/commands/phase/update.js +1 -0
- package/dist/commands/phase/update.js.map +1 -0
- package/dist/commands/pmo/init.js +1 -0
- package/dist/commands/pmo/init.js.map +1 -0
- package/dist/commands/pr/create.js +4 -0
- package/dist/commands/pr/create.js.map +1 -0
- package/dist/commands/pr/index.js +1 -0
- package/dist/commands/pr/index.js.map +1 -0
- package/dist/commands/pr/link.js +1 -0
- package/dist/commands/pr/link.js.map +1 -0
- package/dist/commands/pr/list.js +1 -0
- package/dist/commands/pr/list.js.map +1 -0
- package/dist/commands/pr/status.js +1 -0
- package/dist/commands/pr/status.js.map +1 -0
- package/dist/commands/priority/add.js +1 -0
- package/dist/commands/priority/add.js.map +1 -0
- package/dist/commands/priority/list.js +1 -0
- package/dist/commands/priority/list.js.map +1 -0
- package/dist/commands/priority/remove.js +1 -0
- package/dist/commands/priority/remove.js.map +1 -0
- package/dist/commands/priority/set.js +1 -0
- package/dist/commands/priority/set.js.map +1 -0
- package/dist/commands/project/archive.js +1 -0
- package/dist/commands/project/archive.js.map +1 -0
- package/dist/commands/project/create.js +1 -0
- package/dist/commands/project/create.js.map +1 -0
- package/dist/commands/project/delete.js +1 -0
- package/dist/commands/project/delete.js.map +1 -0
- package/dist/commands/project/index.js +1 -0
- package/dist/commands/project/index.js.map +1 -0
- package/dist/commands/project/list.js +1 -0
- package/dist/commands/project/list.js.map +1 -0
- package/dist/commands/project/spec.js +1 -0
- package/dist/commands/project/spec.js.map +1 -0
- package/dist/commands/project/unarchive.js +1 -0
- package/dist/commands/project/unarchive.js.map +1 -0
- package/dist/commands/project/update.js +1 -0
- package/dist/commands/project/update.js.map +1 -0
- package/dist/commands/project/view.js +1 -0
- package/dist/commands/project/view.js.map +1 -0
- package/dist/commands/pull.js +1 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/qa/index.js +11 -5
- package/dist/commands/qa/index.js.map +1 -0
- package/dist/commands/repo/add.js +1 -0
- package/dist/commands/repo/add.js.map +1 -0
- package/dist/commands/repo/create.js +1 -0
- package/dist/commands/repo/create.js.map +1 -0
- package/dist/commands/repo/index.js +1 -0
- package/dist/commands/repo/index.js.map +1 -0
- package/dist/commands/repo/list.js +1 -0
- package/dist/commands/repo/list.js.map +1 -0
- package/dist/commands/repo/remove.js +1 -0
- package/dist/commands/repo/remove.js.map +1 -0
- package/dist/commands/repo/view.js +1 -0
- package/dist/commands/repo/view.js.map +1 -0
- package/dist/commands/roadmap/add-project.js +1 -0
- package/dist/commands/roadmap/add-project.js.map +1 -0
- package/dist/commands/roadmap/create.js +1 -0
- package/dist/commands/roadmap/create.js.map +1 -0
- package/dist/commands/roadmap/delete.js +1 -0
- package/dist/commands/roadmap/delete.js.map +1 -0
- package/dist/commands/roadmap/generate.js +1 -0
- package/dist/commands/roadmap/generate.js.map +1 -0
- package/dist/commands/roadmap/index.js +1 -0
- package/dist/commands/roadmap/index.js.map +1 -0
- package/dist/commands/roadmap/list.js +1 -0
- package/dist/commands/roadmap/list.js.map +1 -0
- package/dist/commands/roadmap/remove-project.js +1 -0
- package/dist/commands/roadmap/remove-project.js.map +1 -0
- package/dist/commands/roadmap/reorder.js +1 -0
- package/dist/commands/roadmap/reorder.js.map +1 -0
- package/dist/commands/roadmap/update.js +1 -0
- package/dist/commands/roadmap/update.js.map +1 -0
- package/dist/commands/roadmap/view.js +1 -0
- package/dist/commands/roadmap/view.js.map +1 -0
- package/dist/commands/session/attach.js +1 -0
- package/dist/commands/session/attach.js.map +1 -0
- package/dist/commands/session/create.js +2 -1
- package/dist/commands/session/create.js.map +1 -0
- package/dist/commands/session/health.js +5 -7
- package/dist/commands/session/health.js.map +1 -0
- package/dist/commands/session/index.js +1 -0
- package/dist/commands/session/index.js.map +1 -0
- package/dist/commands/session/list.js +7 -5
- package/dist/commands/session/list.js.map +1 -0
- package/dist/commands/session/peek.js +1 -0
- package/dist/commands/session/peek.js.map +1 -0
- package/dist/commands/session/poke.js +20 -1
- package/dist/commands/session/poke.js.map +1 -0
- package/dist/commands/spec/create.js +1 -0
- package/dist/commands/spec/create.js.map +1 -0
- package/dist/commands/spec/delete.js +1 -0
- package/dist/commands/spec/delete.js.map +1 -0
- package/dist/commands/spec/edit.js +1 -0
- package/dist/commands/spec/edit.js.map +1 -0
- package/dist/commands/spec/index.js +1 -0
- package/dist/commands/spec/index.js.map +1 -0
- package/dist/commands/spec/link/depends.js +1 -0
- package/dist/commands/spec/link/depends.js.map +1 -0
- package/dist/commands/spec/link/index.js +1 -0
- package/dist/commands/spec/link/index.js.map +1 -0
- package/dist/commands/spec/link/remove.js +1 -0
- package/dist/commands/spec/link/remove.js.map +1 -0
- package/dist/commands/spec/list.js +1 -0
- package/dist/commands/spec/list.js.map +1 -0
- package/dist/commands/spec/plan.js +1 -0
- package/dist/commands/spec/plan.js.map +1 -0
- package/dist/commands/spec/ticket.js +1 -0
- package/dist/commands/spec/ticket.js.map +1 -0
- package/dist/commands/spec/view.js +1 -0
- package/dist/commands/spec/view.js.map +1 -0
- package/dist/commands/staff/add.js +1 -0
- package/dist/commands/staff/add.js.map +1 -0
- package/dist/commands/staff/index.js +1 -0
- package/dist/commands/staff/index.js.map +1 -0
- package/dist/commands/staff/list.js +1 -0
- package/dist/commands/staff/list.js.map +1 -0
- package/dist/commands/staff/remove.js +1 -0
- package/dist/commands/staff/remove.js.map +1 -0
- package/dist/commands/status/category.js +1 -0
- package/dist/commands/status/category.js.map +1 -0
- package/dist/commands/status/create.js +1 -0
- package/dist/commands/status/create.js.map +1 -0
- package/dist/commands/status/delete.js +1 -0
- package/dist/commands/status/delete.js.map +1 -0
- package/dist/commands/status/index.js +1 -0
- package/dist/commands/status/index.js.map +1 -0
- package/dist/commands/status/list.js +1 -0
- package/dist/commands/status/list.js.map +1 -0
- package/dist/commands/status/move.js +1 -0
- package/dist/commands/status/move.js.map +1 -0
- package/dist/commands/status/update.js +1 -0
- package/dist/commands/status/update.js.map +1 -0
- package/dist/commands/support/book.js +1 -0
- package/dist/commands/support/book.js.map +1 -0
- package/dist/commands/support/discord.js +1 -0
- package/dist/commands/support/discord.js.map +1 -0
- package/dist/commands/support/docs.js +1 -0
- package/dist/commands/support/docs.js.map +1 -0
- package/dist/commands/support/index.js +1 -0
- package/dist/commands/support/index.js.map +1 -0
- package/dist/commands/support/issues.js +1 -0
- package/dist/commands/support/issues.js.map +1 -0
- package/dist/commands/support/logs.js +1 -0
- package/dist/commands/support/logs.js.map +1 -0
- package/dist/commands/telemetry/disable.d.ts +10 -0
- package/dist/commands/telemetry/disable.js +27 -0
- package/dist/commands/telemetry/disable.js.map +1 -0
- package/dist/commands/telemetry/enable.d.ts +10 -0
- package/dist/commands/telemetry/enable.js +27 -0
- package/dist/commands/telemetry/enable.js.map +1 -0
- package/dist/commands/telemetry/index.d.ts +10 -0
- package/dist/commands/telemetry/index.js +41 -0
- package/dist/commands/telemetry/index.js.map +1 -0
- package/dist/commands/telemetry/status.d.ts +10 -0
- package/dist/commands/telemetry/status.js +42 -0
- package/dist/commands/telemetry/status.js.map +1 -0
- package/dist/commands/template/apply.js +1 -0
- package/dist/commands/template/apply.js.map +1 -0
- package/dist/commands/template/create.js +1 -0
- package/dist/commands/template/create.js.map +1 -0
- package/dist/commands/template/delete.js +1 -0
- package/dist/commands/template/delete.js.map +1 -0
- package/dist/commands/template/index.js +1 -0
- package/dist/commands/template/index.js.map +1 -0
- package/dist/commands/template/list.js +1 -0
- package/dist/commands/template/list.js.map +1 -0
- package/dist/commands/template/save.js +1 -0
- package/dist/commands/template/save.js.map +1 -0
- package/dist/commands/template/update.js +1 -0
- package/dist/commands/template/update.js.map +1 -0
- package/dist/commands/terminal/title.js +1 -0
- package/dist/commands/terminal/title.js.map +1 -0
- package/dist/commands/theme/add-names.js +1 -0
- package/dist/commands/theme/add-names.js.map +1 -0
- package/dist/commands/theme/create.js +1 -0
- package/dist/commands/theme/create.js.map +1 -0
- package/dist/commands/theme/index.js +1 -0
- package/dist/commands/theme/index.js.map +1 -0
- package/dist/commands/theme/list.js +1 -0
- package/dist/commands/theme/list.js.map +1 -0
- package/dist/commands/theme/set.js +1 -0
- package/dist/commands/theme/set.js.map +1 -0
- package/dist/commands/ticket/bulk.js +1 -0
- package/dist/commands/ticket/bulk.js.map +1 -0
- package/dist/commands/ticket/category.js +1 -0
- package/dist/commands/ticket/category.js.map +1 -0
- package/dist/commands/ticket/complete.js +1 -0
- package/dist/commands/ticket/complete.js.map +1 -0
- package/dist/commands/ticket/create.js +1 -0
- package/dist/commands/ticket/create.js.map +1 -0
- package/dist/commands/ticket/delete.js +1 -0
- package/dist/commands/ticket/delete.js.map +1 -0
- package/dist/commands/ticket/edit.js +1 -0
- package/dist/commands/ticket/edit.js.map +1 -0
- package/dist/commands/ticket/epic.js +1 -0
- package/dist/commands/ticket/epic.js.map +1 -0
- package/dist/commands/ticket/index.js +1 -0
- package/dist/commands/ticket/index.js.map +1 -0
- package/dist/commands/ticket/link/block.js +1 -0
- package/dist/commands/ticket/link/block.js.map +1 -0
- package/dist/commands/ticket/link/duplicates.js +1 -0
- package/dist/commands/ticket/link/duplicates.js.map +1 -0
- package/dist/commands/ticket/link/index.js +1 -0
- package/dist/commands/ticket/link/index.js.map +1 -0
- package/dist/commands/ticket/link/relates.js +1 -0
- package/dist/commands/ticket/link/relates.js.map +1 -0
- package/dist/commands/ticket/list.js +1 -0
- package/dist/commands/ticket/list.js.map +1 -0
- package/dist/commands/ticket/move.js +1 -0
- package/dist/commands/ticket/move.js.map +1 -0
- package/dist/commands/ticket/project.js +1 -0
- package/dist/commands/ticket/project.js.map +1 -0
- package/dist/commands/ticket/reassign.js +1 -0
- package/dist/commands/ticket/reassign.js.map +1 -0
- package/dist/commands/ticket/resolve.js +1 -0
- package/dist/commands/ticket/resolve.js.map +1 -0
- package/dist/commands/ticket/show.js +1 -0
- package/dist/commands/ticket/show.js.map +1 -0
- package/dist/commands/ticket/spec.js +1 -0
- package/dist/commands/ticket/spec.js.map +1 -0
- package/dist/commands/ticket/status.js +1 -0
- package/dist/commands/ticket/status.js.map +1 -0
- package/dist/commands/ticket/template/apply.js +1 -0
- package/dist/commands/ticket/template/apply.js.map +1 -0
- package/dist/commands/ticket/template/delete.js +1 -0
- package/dist/commands/ticket/template/delete.js.map +1 -0
- package/dist/commands/ticket/template/list.js +1 -0
- package/dist/commands/ticket/template/list.js.map +1 -0
- package/dist/commands/ticket/template/save.js +1 -0
- package/dist/commands/ticket/template/save.js.map +1 -0
- package/dist/commands/ticket/update.js +1 -0
- package/dist/commands/ticket/update.js.map +1 -0
- package/dist/commands/ticket/view.js +1 -0
- package/dist/commands/ticket/view.js.map +1 -0
- package/dist/commands/whoami.js +1 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/commands/work/complete.js +6 -0
- package/dist/commands/work/complete.js.map +1 -0
- package/dist/commands/work/index.js +8 -0
- package/dist/commands/work/index.js.map +1 -0
- package/dist/commands/work/jira.d.ts +28 -0
- package/dist/commands/work/jira.js +226 -0
- package/dist/commands/work/jira.js.map +1 -0
- package/dist/commands/work/linear.js +1 -0
- package/dist/commands/work/linear.js.map +1 -0
- package/dist/commands/work/ready.js +1 -0
- package/dist/commands/work/ready.js.map +1 -0
- package/dist/commands/work/resolve.js +1 -0
- package/dist/commands/work/resolve.js.map +1 -0
- package/dist/commands/work/review.js +1 -0
- package/dist/commands/work/review.js.map +1 -0
- package/dist/commands/work/revise.js +1 -0
- package/dist/commands/work/revise.js.map +1 -0
- package/dist/commands/work/source/set.d.ts +12 -0
- package/dist/commands/work/source/set.js +53 -0
- package/dist/commands/work/source/set.js.map +1 -0
- package/dist/commands/work/source.d.ts +11 -0
- package/dist/commands/work/source.js +54 -0
- package/dist/commands/work/source.js.map +1 -0
- package/dist/commands/work/spawn-all.js +1 -0
- package/dist/commands/work/spawn-all.js.map +1 -0
- package/dist/commands/work/spawn.d.ts +6 -0
- package/dist/commands/work/spawn.js +344 -34
- package/dist/commands/work/spawn.js.map +1 -0
- package/dist/commands/work/start.d.ts +9 -0
- package/dist/commands/work/start.js +619 -228
- package/dist/commands/work/start.js.map +1 -0
- package/dist/commands/work/status.js +1 -0
- package/dist/commands/work/status.js.map +1 -0
- package/dist/commands/work/watch.js +5 -8
- package/dist/commands/work/watch.js.map +1 -0
- package/dist/commands/workflow/create.js +1 -0
- package/dist/commands/workflow/create.js.map +1 -0
- package/dist/commands/workflow/delete.js +1 -0
- package/dist/commands/workflow/delete.js.map +1 -0
- package/dist/commands/workflow/index.js +1 -0
- package/dist/commands/workflow/index.js.map +1 -0
- package/dist/commands/workflow/list.js +1 -0
- package/dist/commands/workflow/list.js.map +1 -0
- package/dist/commands/workflow/show.js +1 -0
- package/dist/commands/workflow/show.js.map +1 -0
- package/dist/commands/workflow/switch.js +1 -0
- package/dist/commands/workflow/switch.js.map +1 -0
- package/dist/commands/workflow/view.js +1 -0
- package/dist/commands/workflow/view.js.map +1 -0
- package/dist/commands/workspace/add.js +1 -0
- package/dist/commands/workspace/add.js.map +1 -0
- package/dist/commands/workspace/list.js +1 -0
- package/dist/commands/workspace/list.js.map +1 -0
- package/dist/commands/workspace/prune.js +1 -0
- package/dist/commands/workspace/prune.js.map +1 -0
- package/dist/commands/workspace/remove.js +1 -0
- package/dist/commands/workspace/remove.js.map +1 -0
- package/dist/commands/workspace/use.js +1 -0
- package/dist/commands/workspace/use.js.map +1 -0
- package/dist/hooks/init.d.ts +6 -1
- package/dist/hooks/init.js +34 -2
- package/dist/hooks/init.js.map +1 -0
- package/dist/hooks/postrun.d.ts +9 -0
- package/dist/hooks/postrun.js +30 -0
- package/dist/hooks/postrun.js.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agents/commands.js +1 -0
- package/dist/lib/agents/commands.js.map +1 -0
- package/dist/lib/agents/index.js +1 -0
- package/dist/lib/agents/index.js.map +1 -0
- package/dist/lib/asana/client.d.ts +15 -0
- package/dist/lib/asana/client.js +121 -0
- package/dist/lib/asana/client.js.map +1 -0
- package/dist/lib/asana/config.d.ts +9 -0
- package/dist/lib/asana/config.js +62 -0
- package/dist/lib/asana/config.js.map +1 -0
- package/dist/lib/asana/index.d.ts +5 -0
- package/dist/lib/asana/index.js +5 -0
- package/dist/lib/asana/index.js.map +1 -0
- package/dist/lib/asana/mapper.d.ts +13 -0
- package/dist/lib/asana/mapper.js +71 -0
- package/dist/lib/asana/mapper.js.map +1 -0
- package/dist/lib/asana/sync.d.ts +13 -0
- package/dist/lib/asana/sync.js +37 -0
- package/dist/lib/asana/sync.js.map +1 -0
- package/dist/lib/asana/types.d.ts +40 -0
- package/dist/lib/asana/types.js +2 -0
- package/dist/lib/asana/types.js.map +1 -0
- package/dist/lib/branch/index.js +1 -0
- package/dist/lib/branch/index.js.map +1 -0
- package/dist/lib/caffeinate.js +1 -0
- package/dist/lib/caffeinate.js.map +1 -0
- package/dist/lib/colors.js +1 -0
- package/dist/lib/colors.js.map +1 -0
- package/dist/lib/commands/docker-command.js +1 -0
- package/dist/lib/commands/docker-command.js.map +1 -0
- package/dist/lib/database/drizzle-schema.d.ts +393 -0
- package/dist/lib/database/drizzle-schema.js +46 -0
- package/dist/lib/database/drizzle-schema.js.map +1 -0
- package/dist/lib/database/drizzle.js +1 -0
- package/dist/lib/database/drizzle.js.map +1 -0
- package/dist/lib/database/index.js +1 -0
- package/dist/lib/database/index.js.map +1 -0
- package/dist/lib/database/native-validation.js +1 -0
- package/dist/lib/database/native-validation.js.map +1 -0
- package/dist/lib/docker/resolve.js +1 -0
- package/dist/lib/docker/resolve.js.map +1 -0
- package/dist/lib/execution/codex-adapter.js +1 -0
- package/dist/lib/execution/codex-adapter.js.map +1 -0
- package/dist/lib/execution/config.d.ts +10 -0
- package/dist/lib/execution/config.js +20 -0
- package/dist/lib/execution/config.js.map +1 -0
- package/dist/lib/execution/context.js +1 -0
- package/dist/lib/execution/context.js.map +1 -0
- package/dist/lib/execution/devcontainer.js +1 -0
- package/dist/lib/execution/devcontainer.js.map +1 -0
- package/dist/lib/execution/index.js +1 -0
- package/dist/lib/execution/index.js.map +1 -0
- package/dist/lib/execution/runners.d.ts +10 -0
- package/dist/lib/execution/runners.js +162 -7
- package/dist/lib/execution/runners.js.map +1 -0
- package/dist/lib/execution/session-utils.js +1 -0
- package/dist/lib/execution/session-utils.js.map +1 -0
- package/dist/lib/execution/spawner.js +27 -0
- package/dist/lib/execution/spawner.js.map +1 -0
- package/dist/lib/execution/storage.d.ts +4 -0
- package/dist/lib/execution/storage.js +9 -3
- package/dist/lib/execution/storage.js.map +1 -0
- package/dist/lib/execution/types.d.ts +6 -0
- package/dist/lib/execution/types.js +1 -0
- package/dist/lib/execution/types.js.map +1 -0
- package/dist/lib/external-issues/adapters.d.ts +18 -1
- package/dist/lib/external-issues/adapters.js +50 -1
- package/dist/lib/external-issues/adapters.js.map +1 -0
- package/dist/lib/external-issues/index.d.ts +5 -1
- package/dist/lib/external-issues/index.js +8 -0
- package/dist/lib/external-issues/index.js.map +1 -0
- package/dist/lib/external-issues/jira.d.ts +23 -0
- package/dist/lib/external-issues/jira.js +224 -0
- package/dist/lib/external-issues/jira.js.map +1 -0
- package/dist/lib/external-issues/linear.js +17 -3
- package/dist/lib/external-issues/linear.js.map +1 -0
- package/dist/lib/external-issues/mapper.d.ts +3 -2
- package/dist/lib/external-issues/mapper.js +6 -2
- package/dist/lib/external-issues/mapper.js.map +1 -0
- package/dist/lib/external-issues/mapping-store.d.ts +12 -0
- package/dist/lib/external-issues/mapping-store.js +165 -0
- package/dist/lib/external-issues/mapping-store.js.map +1 -0
- package/dist/lib/external-issues/redact.d.ts +50 -0
- package/dist/lib/external-issues/redact.js +130 -0
- package/dist/lib/external-issues/redact.js.map +1 -0
- package/dist/lib/external-issues/types.d.ts +35 -1
- package/dist/lib/external-issues/types.js +1 -0
- package/dist/lib/external-issues/types.js.map +1 -0
- package/dist/lib/external-issues/validation.js +12 -0
- package/dist/lib/external-issues/validation.js.map +1 -0
- package/dist/lib/external-issues/work-start.d.ts +10 -0
- package/dist/lib/external-issues/work-start.js +13 -0
- package/dist/lib/external-issues/work-start.js.map +1 -0
- package/dist/lib/flags/index.js +1 -0
- package/dist/lib/flags/index.js.map +1 -0
- package/dist/lib/flags/resolver.js +4 -2
- package/dist/lib/flags/resolver.js.map +1 -0
- package/dist/lib/init/index.js +1 -0
- package/dist/lib/init/index.js.map +1 -0
- package/dist/lib/jira/config.d.ts +33 -0
- package/dist/lib/jira/config.js +97 -0
- package/dist/lib/jira/config.js.map +1 -0
- package/dist/lib/jira/index.d.ts +7 -0
- package/dist/lib/jira/index.js +7 -0
- package/dist/lib/jira/index.js.map +1 -0
- package/dist/lib/linear/client.js +1 -0
- package/dist/lib/linear/client.js.map +1 -0
- package/dist/lib/linear/config.js +1 -0
- package/dist/lib/linear/config.js.map +1 -0
- package/dist/lib/linear/index.js +1 -0
- package/dist/lib/linear/index.js.map +1 -0
- package/dist/lib/linear/mapper.d.ts +2 -0
- package/dist/lib/linear/mapper.js +67 -2
- package/dist/lib/linear/mapper.js.map +1 -0
- package/dist/lib/linear/sync.js +1 -0
- package/dist/lib/linear/sync.js.map +1 -0
- package/dist/lib/linear/types.js +1 -0
- package/dist/lib/linear/types.js.map +1 -0
- package/dist/lib/machine-config.js +1 -0
- package/dist/lib/machine-config.js.map +1 -0
- package/dist/lib/mcp/helpers.js +1 -0
- package/dist/lib/mcp/helpers.js.map +1 -0
- package/dist/lib/mcp/index.js +1 -0
- package/dist/lib/mcp/index.js.map +1 -0
- package/dist/lib/mcp/tools/action.js +1 -0
- package/dist/lib/mcp/tools/action.js.map +1 -0
- package/dist/lib/mcp/tools/board.js +1 -0
- package/dist/lib/mcp/tools/board.js.map +1 -0
- package/dist/lib/mcp/tools/category.js +1 -0
- package/dist/lib/mcp/tools/category.js.map +1 -0
- package/dist/lib/mcp/tools/cli-passthrough.js +1 -0
- package/dist/lib/mcp/tools/cli-passthrough.js.map +1 -0
- package/dist/lib/mcp/tools/diet.js +1 -0
- package/dist/lib/mcp/tools/diet.js.map +1 -0
- package/dist/lib/mcp/tools/epic.js +1 -0
- package/dist/lib/mcp/tools/epic.js.map +1 -0
- package/dist/lib/mcp/tools/index.js +1 -0
- package/dist/lib/mcp/tools/index.js.map +1 -0
- package/dist/lib/mcp/tools/label.js +1 -0
- package/dist/lib/mcp/tools/label.js.map +1 -0
- package/dist/lib/mcp/tools/phase.js +1 -0
- package/dist/lib/mcp/tools/phase.js.map +1 -0
- package/dist/lib/mcp/tools/project.js +1 -0
- package/dist/lib/mcp/tools/project.js.map +1 -0
- package/dist/lib/mcp/tools/roadmap.js +1 -0
- package/dist/lib/mcp/tools/roadmap.js.map +1 -0
- package/dist/lib/mcp/tools/spec.js +1 -0
- package/dist/lib/mcp/tools/spec.js.map +1 -0
- package/dist/lib/mcp/tools/status.js +1 -0
- package/dist/lib/mcp/tools/status.js.map +1 -0
- package/dist/lib/mcp/tools/template.js +1 -0
- package/dist/lib/mcp/tools/template.js.map +1 -0
- package/dist/lib/mcp/tools/ticket.js +1 -0
- package/dist/lib/mcp/tools/ticket.js.map +1 -0
- package/dist/lib/mcp/tools/tmux.js +1 -0
- package/dist/lib/mcp/tools/tmux.js.map +1 -0
- package/dist/lib/mcp/tools/view.js +1 -0
- package/dist/lib/mcp/tools/view.js.map +1 -0
- package/dist/lib/mcp/tools/work.js +1 -0
- package/dist/lib/mcp/tools/work.js.map +1 -0
- package/dist/lib/mcp/tools/workflow.js +1 -0
- package/dist/lib/mcp/tools/workflow.js.map +1 -0
- package/dist/lib/mcp/types.js +1 -0
- package/dist/lib/mcp/types.js.map +1 -0
- package/dist/lib/monday/client.d.ts +14 -0
- package/dist/lib/monday/client.js +114 -0
- package/dist/lib/monday/client.js.map +1 -0
- package/dist/lib/monday/config.d.ts +10 -0
- package/dist/lib/monday/config.js +65 -0
- package/dist/lib/monday/config.js.map +1 -0
- package/dist/lib/monday/index.d.ts +5 -0
- package/dist/lib/monday/index.js +5 -0
- package/dist/lib/monday/index.js.map +1 -0
- package/dist/lib/monday/mapper.d.ts +14 -0
- package/dist/lib/monday/mapper.js +90 -0
- package/dist/lib/monday/mapper.js.map +1 -0
- package/dist/lib/monday/sync.d.ts +13 -0
- package/dist/lib/monday/sync.js +46 -0
- package/dist/lib/monday/sync.js.map +1 -0
- package/dist/lib/monday/types.d.ts +38 -0
- package/dist/lib/monday/types.js +5 -0
- package/dist/lib/monday/types.js.map +1 -0
- package/dist/lib/multiline-input.js +1 -0
- package/dist/lib/multiline-input.js.map +1 -0
- package/dist/lib/pmo/base-command.js +8 -6
- package/dist/lib/pmo/base-command.js.map +1 -0
- package/dist/lib/pmo/create-spec-folders.js +1 -0
- package/dist/lib/pmo/create-spec-folders.js.map +1 -0
- package/dist/lib/pmo/diet.js +1 -0
- package/dist/lib/pmo/diet.js.map +1 -0
- package/dist/lib/pmo/epic-files.js +1 -0
- package/dist/lib/pmo/epic-files.js.map +1 -0
- package/dist/lib/pmo/find-pmo.js +1 -0
- package/dist/lib/pmo/find-pmo.js.map +1 -0
- package/dist/lib/pmo/index.js +1 -0
- package/dist/lib/pmo/index.js.map +1 -0
- package/dist/lib/pmo/markdown.js +1 -0
- package/dist/lib/pmo/markdown.js.map +1 -0
- package/dist/lib/pmo/pmo-context.js +1 -0
- package/dist/lib/pmo/pmo-context.js.map +1 -0
- package/dist/lib/pmo/schema.d.ts +10 -1
- package/dist/lib/pmo/schema.js +74 -0
- package/dist/lib/pmo/schema.js.map +1 -0
- package/dist/lib/pmo/spec-parser.js +1 -0
- package/dist/lib/pmo/spec-parser.js.map +1 -0
- package/dist/lib/pmo/spec-types.js +1 -0
- package/dist/lib/pmo/spec-types.js.map +1 -0
- package/dist/lib/pmo/storage/actions.js +1 -0
- package/dist/lib/pmo/storage/actions.js.map +1 -0
- package/dist/lib/pmo/storage/base.js +33 -0
- package/dist/lib/pmo/storage/base.js.map +1 -0
- package/dist/lib/pmo/storage/categories.js +1 -0
- package/dist/lib/pmo/storage/categories.js.map +1 -0
- package/dist/lib/pmo/storage/dependencies.js +1 -0
- package/dist/lib/pmo/storage/dependencies.js.map +1 -0
- package/dist/lib/pmo/storage/epics.js +1 -0
- package/dist/lib/pmo/storage/epics.js.map +1 -0
- package/dist/lib/pmo/storage/helpers.js +1 -0
- package/dist/lib/pmo/storage/helpers.js.map +1 -0
- package/dist/lib/pmo/storage/index.js +1 -0
- package/dist/lib/pmo/storage/index.js.map +1 -0
- package/dist/lib/pmo/storage/labels.js +1 -0
- package/dist/lib/pmo/storage/labels.js.map +1 -0
- package/dist/lib/pmo/storage/phases.js +1 -0
- package/dist/lib/pmo/storage/phases.js.map +1 -0
- package/dist/lib/pmo/storage/projects.js +1 -0
- package/dist/lib/pmo/storage/projects.js.map +1 -0
- package/dist/lib/pmo/storage/roadmaps.js +1 -0
- package/dist/lib/pmo/storage/roadmaps.js.map +1 -0
- package/dist/lib/pmo/storage/specs.js +1 -0
- package/dist/lib/pmo/storage/specs.js.map +1 -0
- package/dist/lib/pmo/storage/statuses.js +1 -0
- package/dist/lib/pmo/storage/statuses.js.map +1 -0
- package/dist/lib/pmo/storage/subtasks.js +1 -0
- package/dist/lib/pmo/storage/subtasks.js.map +1 -0
- package/dist/lib/pmo/storage/templates.js +1 -0
- package/dist/lib/pmo/storage/templates.js.map +1 -0
- package/dist/lib/pmo/storage/tickets.js +1 -0
- package/dist/lib/pmo/storage/tickets.js.map +1 -0
- package/dist/lib/pmo/storage/types.js +1 -0
- package/dist/lib/pmo/storage/types.js.map +1 -0
- package/dist/lib/pmo/storage/views.js +1 -0
- package/dist/lib/pmo/storage/views.js.map +1 -0
- package/dist/lib/pmo/storage-sqlite.js +1 -0
- package/dist/lib/pmo/storage-sqlite.js.map +1 -0
- package/dist/lib/pmo/sync-manager.js +1 -0
- package/dist/lib/pmo/sync-manager.js.map +1 -0
- package/dist/lib/pmo/templates-builtin.js +1 -0
- package/dist/lib/pmo/templates-builtin.js.map +1 -0
- package/dist/lib/pmo/types.js +1 -0
- package/dist/lib/pmo/types.js.map +1 -0
- package/dist/lib/pmo/utils.js +1 -0
- package/dist/lib/pmo/utils.js.map +1 -0
- package/dist/lib/pmo/watcher.d.ts +1 -1
- package/dist/lib/pmo/watcher.js +6 -7
- package/dist/lib/pmo/watcher.js.map +1 -0
- package/dist/lib/pr/index.js +1 -0
- package/dist/lib/pr/index.js.map +1 -0
- package/dist/lib/prompt-command.js +4 -2
- package/dist/lib/prompt-command.js.map +1 -0
- package/dist/lib/prompt-json.d.ts +16 -0
- package/dist/lib/prompt-json.js +1 -0
- package/dist/lib/prompt-json.js.map +1 -0
- package/dist/lib/repos/git.js +1 -0
- package/dist/lib/repos/git.js.map +1 -0
- package/dist/lib/repos/index.js +1 -0
- package/dist/lib/repos/index.js.map +1 -0
- package/dist/lib/signal-handler.d.ts +59 -0
- package/dist/lib/signal-handler.js +156 -0
- package/dist/lib/signal-handler.js.map +1 -0
- package/dist/lib/string-utils.js +1 -0
- package/dist/lib/string-utils.js.map +1 -0
- package/dist/lib/styles.js +1 -0
- package/dist/lib/styles.js.map +1 -0
- package/dist/lib/telemetry/analytics.d.ts +105 -0
- package/dist/lib/telemetry/analytics.js +289 -0
- package/dist/lib/telemetry/analytics.js.map +1 -0
- package/dist/lib/telemetry/feature-flags.d.ts +53 -0
- package/dist/lib/telemetry/feature-flags.js +83 -0
- package/dist/lib/telemetry/feature-flags.js.map +1 -0
- package/dist/lib/telemetry.d.ts +63 -0
- package/dist/lib/telemetry.js +217 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/lib/terminal.js +1 -0
- package/dist/lib/terminal.js.map +1 -0
- package/dist/lib/themes.js +1 -0
- package/dist/lib/themes.js.map +1 -0
- package/dist/lib/ui/BoardUI.js +1 -0
- package/dist/lib/ui/BoardUI.js.map +1 -0
- package/dist/lib/ui/ClaimTicketUI.js +1 -0
- package/dist/lib/ui/ClaimTicketUI.js.map +1 -0
- package/dist/lib/ui/CreateTicketUI.js +1 -0
- package/dist/lib/ui/CreateTicketUI.js.map +1 -0
- package/dist/lib/update-check.d.ts +83 -0
- package/dist/lib/update-check.js +275 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/update-prompt.d.ts +47 -0
- package/dist/lib/update-prompt.js +163 -0
- package/dist/lib/update-prompt.js.map +1 -0
- package/dist/lib/work-source/config.d.ts +14 -0
- package/dist/lib/work-source/config.js +79 -0
- package/dist/lib/work-source/config.js.map +1 -0
- package/dist/lib/work-source/index.d.ts +1 -0
- package/dist/lib/work-source/index.js +2 -0
- package/dist/lib/work-source/index.js.map +1 -0
- package/dist/lib/workspace-config.js +1 -0
- package/dist/lib/workspace-config.js.map +1 -0
- package/dist/lib/workspace.js +1 -0
- package/dist/lib/workspace.js.map +1 -0
- package/oclif.manifest.json +2164 -1331
- package/package.json +9 -9
|
@@ -5,6 +5,7 @@ import * as path from 'node:path';
|
|
|
5
5
|
import { execSync } from 'node:child_process';
|
|
6
6
|
import Database from 'better-sqlite3';
|
|
7
7
|
import { PMOCommand, pmoBaseFlags, autoExportToBoard } from '../../lib/pmo/index.js';
|
|
8
|
+
import { trackAgentSpawned } from '../../lib/telemetry/analytics.js';
|
|
8
9
|
import { shouldOutputJson, outputErrorAsJson, createMetadata, outputConfirmationNeededAsJson, outputExecutionResultAsJson, } from '../../lib/prompt-json.js';
|
|
9
10
|
import { FlagResolver } from '../../lib/flags/index.js';
|
|
10
11
|
import { getWorkColumnSetting, findColumnByName } from '../../lib/pmo/utils.js';
|
|
@@ -13,10 +14,15 @@ import { getWorkspaceInfo, createEphemeralAgent, getTicketTmuxSession, killTmuxS
|
|
|
13
14
|
import { generateBranchName, DEFAULT_EXECUTION_CONFIG, } from '../../lib/execution/types.js';
|
|
14
15
|
import { runExecution, isDockerRunning, isGitHubTokenAvailable, isDevcontainerCliInstalled, dockerCredentialsExist, getDockerCredentialInfo, isClaudeExecutor, getExecutorDisplayName } from '../../lib/execution/runners.js';
|
|
15
16
|
import { ExecutionStorage, ContainerStorage } from '../../lib/execution/storage.js';
|
|
16
|
-
import { loadExecutionConfig, getTerminalApp, promptTerminalPreference, getShell, promptShellPreference, hasTerminalPreference, hasShellPreference, getOrPromptCoderName, getAuthMethod, saveAuthMethod, getCreatePrDefault } from '../../lib/execution/config.js';
|
|
17
|
+
import { loadExecutionConfig, getTerminalApp, promptTerminalPreference, getShell, promptShellPreference, hasTerminalPreference, hasShellPreference, getOrPromptCoderName, getAuthMethod, saveAuthMethod, getCreatePrDefault, getMirrorToPmoDefault } from '../../lib/execution/config.js';
|
|
17
18
|
import { hasDevcontainerConfig } from '../../lib/execution/devcontainer.js';
|
|
18
19
|
import { detectRepoWorktrees, resolveWorktreePath } from '../../lib/execution/context.js';
|
|
19
20
|
import { isGHInstalled, isGHAuthenticated } from '../../lib/pr/index.js';
|
|
21
|
+
import { buildLinearMetadata, buildLinearSpawnContextMessage, buildLinearTicketDescription, getLinearIssueByIdentifier, } from '../../lib/external-issues/linear.js';
|
|
22
|
+
import { buildJiraMetadata, buildJiraSpawnContextMessage, buildJiraTicketDescription, getJiraIssueByKey, } from '../../lib/external-issues/jira.js';
|
|
23
|
+
import { resolveMirrorToPmo } from '../../lib/external-issues/work-start.js';
|
|
24
|
+
import { ExternalIssueAdapterError } from '../../lib/external-issues/types.js';
|
|
25
|
+
import { loadActiveWorkSource, saveActiveWorkSource, } from '../../lib/work-source/index.js';
|
|
20
26
|
/**
|
|
21
27
|
* Try to execute a git command, return true if successful
|
|
22
28
|
*/
|
|
@@ -67,6 +73,49 @@ function getActiveStaffAgents(workspaceInfo, log) {
|
|
|
67
73
|
}
|
|
68
74
|
return result;
|
|
69
75
|
}
|
|
76
|
+
function parseBooleanSetting(value) {
|
|
77
|
+
if (!value)
|
|
78
|
+
return null;
|
|
79
|
+
const normalized = value.trim().toLowerCase();
|
|
80
|
+
if (normalized === 'true')
|
|
81
|
+
return true;
|
|
82
|
+
if (normalized === 'false')
|
|
83
|
+
return false;
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
function isIssueSource(value) {
|
|
87
|
+
return value === 'linear' || value === 'jira';
|
|
88
|
+
}
|
|
89
|
+
function buildExternalMetadata(envelope) {
|
|
90
|
+
return envelope.source.name === 'jira'
|
|
91
|
+
? buildJiraMetadata(envelope)
|
|
92
|
+
: buildLinearMetadata(envelope);
|
|
93
|
+
}
|
|
94
|
+
function buildExternalTicketDescription(envelope) {
|
|
95
|
+
return envelope.source.name === 'jira'
|
|
96
|
+
? buildJiraTicketDescription(envelope)
|
|
97
|
+
: buildLinearTicketDescription(envelope);
|
|
98
|
+
}
|
|
99
|
+
function buildExternalSpawnContextMessage(envelope, additionalMessage) {
|
|
100
|
+
return envelope.source.name === 'jira'
|
|
101
|
+
? buildJiraSpawnContextMessage(envelope, additionalMessage)
|
|
102
|
+
: buildLinearSpawnContextMessage(envelope, additionalMessage);
|
|
103
|
+
}
|
|
104
|
+
function getTicketExternalMetadata(ticket) {
|
|
105
|
+
const metadata = (typeof ticket === 'object'
|
|
106
|
+
&& ticket !== null
|
|
107
|
+
&& 'metadata' in ticket
|
|
108
|
+
&& typeof ticket.metadata === 'object'
|
|
109
|
+
&& ticket.metadata !== null
|
|
110
|
+
? ticket.metadata
|
|
111
|
+
: {});
|
|
112
|
+
return {
|
|
113
|
+
source: typeof metadata.external_source === 'string' ? metadata.external_source : undefined,
|
|
114
|
+
key: typeof metadata.external_key === 'string' ? metadata.external_key : undefined,
|
|
115
|
+
id: typeof metadata.external_id === 'string' ? metadata.external_id : undefined,
|
|
116
|
+
url: typeof metadata.external_url === 'string' ? metadata.external_url : undefined,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
70
119
|
export default class WorkStart extends PMOCommand {
|
|
71
120
|
static description = 'Start work on a ticket (launches an agent to implement it)';
|
|
72
121
|
static examples = [
|
|
@@ -78,6 +127,11 @@ export default class WorkStart extends PMOCommand {
|
|
|
78
127
|
'<%= config.bin %> <%= command.id %> # Interactive mode',
|
|
79
128
|
'<%= config.bin %> <%= command.id %> --all # Spawn all backlog tickets',
|
|
80
129
|
'<%= config.bin %> <%= command.id %> TKT-001 --prompt "Add unit tests for the API" # Custom prompt',
|
|
130
|
+
'<%= config.bin %> <%= command.id %> --from-issue --source linear --key ENG-123',
|
|
131
|
+
'<%= config.bin %> <%= command.id %> --from-issue --source jira --key PROJ-123 --mirror-to-pmo',
|
|
132
|
+
'<%= config.bin %> <%= command.id %> --from linear:ENG-123 # Unified: provider:key shorthand',
|
|
133
|
+
'<%= config.bin %> <%= command.id %> --from jira:PROJ-123 # Unified: Jira shorthand',
|
|
134
|
+
'<%= config.bin %> <%= command.id %> --from-issue # Uses workspace active source',
|
|
81
135
|
];
|
|
82
136
|
static args = {
|
|
83
137
|
ticketId: Args.string({
|
|
@@ -108,6 +162,24 @@ export default class WorkStart extends PMOCommand {
|
|
|
108
162
|
message: Flags.string({
|
|
109
163
|
description: 'Additional instructions appended to any action prompt',
|
|
110
164
|
}),
|
|
165
|
+
from: Flags.string({
|
|
166
|
+
description: 'External issue ref in provider:key format (e.g., linear:ENG-123, jira:PROJ-456). Shorthand for --from-issue --source X --key Y.',
|
|
167
|
+
}),
|
|
168
|
+
'from-issue': Flags.boolean({
|
|
169
|
+
description: 'Start from external issue source instead of internal ticket id',
|
|
170
|
+
default: false,
|
|
171
|
+
}),
|
|
172
|
+
source: Flags.string({
|
|
173
|
+
description: 'External issue source',
|
|
174
|
+
options: ['linear', 'jira'],
|
|
175
|
+
}),
|
|
176
|
+
key: Flags.string({
|
|
177
|
+
description: 'External issue key (for example: ENG-123, PROJ-456)',
|
|
178
|
+
}),
|
|
179
|
+
'mirror-to-pmo': Flags.boolean({
|
|
180
|
+
description: 'Mirror external issue data into PMO ticket (default from execution.mirror_to_pmo_default or PRLT_MIRROR_TO_PMO_DEFAULT)',
|
|
181
|
+
allowNo: true,
|
|
182
|
+
}),
|
|
111
183
|
watch: Flags.boolean({
|
|
112
184
|
char: 'w',
|
|
113
185
|
description: 'Stream output in real-time',
|
|
@@ -187,9 +259,115 @@ export default class WorkStart extends PMOCommand {
|
|
|
187
259
|
hidden: true,
|
|
188
260
|
}),
|
|
189
261
|
};
|
|
262
|
+
async findLinkedTicketByEnvelope(projectId, envelope) {
|
|
263
|
+
const tickets = await this.storage.listTickets(projectId);
|
|
264
|
+
return tickets.find((ticket) => {
|
|
265
|
+
const external = getTicketExternalMetadata(ticket);
|
|
266
|
+
return external.source === envelope.source.name
|
|
267
|
+
&& (external.key === envelope.source.externalKey || external.id === envelope.source.externalId);
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
async createOrUpdateLinkedTicket(projectId, envelope) {
|
|
271
|
+
const existing = await this.findLinkedTicketByEnvelope(projectId, envelope);
|
|
272
|
+
const description = buildExternalTicketDescription(envelope);
|
|
273
|
+
const metadata = buildExternalMetadata(envelope);
|
|
274
|
+
if (existing) {
|
|
275
|
+
return this.storage.updateTicket(existing.id, {
|
|
276
|
+
title: envelope.title,
|
|
277
|
+
description,
|
|
278
|
+
priority: envelope.priority ?? undefined,
|
|
279
|
+
category: envelope.category ?? undefined,
|
|
280
|
+
labels: envelope.labels,
|
|
281
|
+
metadata: {
|
|
282
|
+
...existing.metadata,
|
|
283
|
+
...metadata,
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
return this.storage.createTicket(projectId, {
|
|
288
|
+
title: envelope.title,
|
|
289
|
+
description,
|
|
290
|
+
priority: envelope.priority ?? undefined,
|
|
291
|
+
category: envelope.category ?? undefined,
|
|
292
|
+
labels: envelope.labels,
|
|
293
|
+
metadata,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
async fetchExternalIssue(source, key) {
|
|
297
|
+
if (source === 'jira') {
|
|
298
|
+
return getJiraIssueByKey({}, key);
|
|
299
|
+
}
|
|
300
|
+
return getLinearIssueByIdentifier({}, key);
|
|
301
|
+
}
|
|
302
|
+
async resolveIssueSourceAndKey(input, jsonMode) {
|
|
303
|
+
let source = input.source;
|
|
304
|
+
let key = input.key;
|
|
305
|
+
let sourceResolutionMethod = 'flag';
|
|
306
|
+
// If no explicit source flag, try workspace active source
|
|
307
|
+
if (!isIssueSource(source) && input.db) {
|
|
308
|
+
const activeSource = loadActiveWorkSource(input.db);
|
|
309
|
+
if (activeSource && isIssueSource(activeSource.provider)) {
|
|
310
|
+
source = activeSource.provider;
|
|
311
|
+
sourceResolutionMethod = 'active-source';
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
const sourceResolver = new FlagResolver({
|
|
315
|
+
commandName: 'work start',
|
|
316
|
+
baseCommand: 'prlt work start --from-issue',
|
|
317
|
+
jsonMode,
|
|
318
|
+
flags: {},
|
|
319
|
+
});
|
|
320
|
+
sourceResolver.addPrompt({
|
|
321
|
+
flagName: 'source',
|
|
322
|
+
type: 'list',
|
|
323
|
+
message: 'Select external issue source:',
|
|
324
|
+
default: isIssueSource(source) ? source : undefined,
|
|
325
|
+
when: () => !isIssueSource(source),
|
|
326
|
+
choices: () => [
|
|
327
|
+
{ name: 'Linear', value: 'linear', command: 'prlt work start --from linear:ISSUE-KEY --json' },
|
|
328
|
+
{ name: 'Jira', value: 'jira', command: 'prlt work start --from jira:ISSUE-KEY --json' },
|
|
329
|
+
],
|
|
330
|
+
});
|
|
331
|
+
const sourceResult = await sourceResolver.resolve();
|
|
332
|
+
if (!isIssueSource(source)) {
|
|
333
|
+
source = sourceResult.source;
|
|
334
|
+
sourceResolutionMethod = 'interactive';
|
|
335
|
+
// Persist selected source as default
|
|
336
|
+
if (input.db && isIssueSource(source)) {
|
|
337
|
+
saveActiveWorkSource(input.db, { provider: source });
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (!isIssueSource(source)) {
|
|
341
|
+
throw new Error('Invalid source');
|
|
342
|
+
}
|
|
343
|
+
const keyResolver = new FlagResolver({
|
|
344
|
+
commandName: 'work start',
|
|
345
|
+
baseCommand: `prlt work start --from ${source}:`,
|
|
346
|
+
jsonMode,
|
|
347
|
+
flags: {},
|
|
348
|
+
});
|
|
349
|
+
keyResolver.addPrompt({
|
|
350
|
+
flagName: 'key',
|
|
351
|
+
type: 'input',
|
|
352
|
+
message: `Enter ${source === 'linear' ? 'Linear' : 'Jira'} issue key:`,
|
|
353
|
+
default: key,
|
|
354
|
+
when: () => !key?.trim(),
|
|
355
|
+
validate: (value) => value.trim().length > 0 ? true : 'Issue key is required',
|
|
356
|
+
});
|
|
357
|
+
const keyResult = await keyResolver.resolve();
|
|
358
|
+
const resolvedKey = (key ?? keyResult.key ?? '').trim();
|
|
359
|
+
if (!resolvedKey) {
|
|
360
|
+
throw new Error('Issue key is required');
|
|
361
|
+
}
|
|
362
|
+
return {
|
|
363
|
+
source,
|
|
364
|
+
key: resolvedKey,
|
|
365
|
+
sourceResolution: { method: sourceResolutionMethod, provider: source },
|
|
366
|
+
};
|
|
367
|
+
}
|
|
190
368
|
async execute() {
|
|
191
369
|
const { args, flags } = await this.parse(WorkStart);
|
|
192
|
-
|
|
370
|
+
let projectId = flags.project;
|
|
193
371
|
// Check for conflicting PR flags
|
|
194
372
|
if (flags['create-pr'] && flags['no-pr']) {
|
|
195
373
|
this.error('--create-pr and --no-pr are mutually exclusive');
|
|
@@ -239,6 +417,98 @@ export default class WorkStart extends PMOCommand {
|
|
|
239
417
|
}
|
|
240
418
|
// Get ticketId - prompt if not provided
|
|
241
419
|
let ticketId = args.ticketId;
|
|
420
|
+
let externalIssueContextMessage;
|
|
421
|
+
let fromIssueMirror;
|
|
422
|
+
let fromIssueMirrorSource;
|
|
423
|
+
let sourceResolutionMeta;
|
|
424
|
+
// Handle --from shorthand: parse provider:key into source + key
|
|
425
|
+
let fromFlag = flags.from;
|
|
426
|
+
let fromIssueActive = flags['from-issue'];
|
|
427
|
+
if (fromFlag) {
|
|
428
|
+
if (flags['from-issue'] || flags.source || flags.key) {
|
|
429
|
+
db.close();
|
|
430
|
+
return handleError('CONFLICTING_FLAGS', '--from cannot be used with --from-issue, --source, or --key. Use either --from provider:key or --from-issue --source X --key Y.');
|
|
431
|
+
}
|
|
432
|
+
fromIssueActive = true;
|
|
433
|
+
// Parse provider:key from --from value
|
|
434
|
+
const colonIndex = fromFlag.indexOf(':');
|
|
435
|
+
if (colonIndex !== -1) {
|
|
436
|
+
flags.source = fromFlag.slice(0, colonIndex).toLowerCase();
|
|
437
|
+
flags.key = fromFlag.slice(colonIndex + 1).trim();
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
// Provider only, no key - will prompt for key
|
|
441
|
+
flags.source = fromFlag.toLowerCase();
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
if (fromIssueActive) {
|
|
445
|
+
if (ticketId) {
|
|
446
|
+
db.close();
|
|
447
|
+
return handleError('INVALID_FLAGS', 'Cannot provide a ticket ID positional argument when using --from-issue or --from.');
|
|
448
|
+
}
|
|
449
|
+
const fromBaseCmd = fromFlag ? `prlt work start --from ${fromFlag}` : 'prlt work start --from-issue';
|
|
450
|
+
projectId = projectId || await this.requireProject({
|
|
451
|
+
jsonMode: {
|
|
452
|
+
flags,
|
|
453
|
+
commandName: 'work start',
|
|
454
|
+
baseCommand: fromBaseCmd,
|
|
455
|
+
},
|
|
456
|
+
});
|
|
457
|
+
const sourceAndKey = await this.resolveIssueSourceAndKey({
|
|
458
|
+
source: flags.source,
|
|
459
|
+
key: flags.key,
|
|
460
|
+
db,
|
|
461
|
+
}, jsonMode);
|
|
462
|
+
sourceResolutionMeta = sourceAndKey.sourceResolution;
|
|
463
|
+
if (!jsonMode && sourceResolutionMeta.method !== 'flag') {
|
|
464
|
+
this.log(styles.muted(`Source resolved via ${sourceResolutionMeta.method}: ${sourceResolutionMeta.provider}`));
|
|
465
|
+
}
|
|
466
|
+
const envMirrorDefault = parseBooleanSetting(process.env.PRLT_MIRROR_TO_PMO_DEFAULT);
|
|
467
|
+
const configMirrorDefault = getMirrorToPmoDefault(db);
|
|
468
|
+
const mirrorResolution = resolveMirrorToPmo({
|
|
469
|
+
flagValue: flags['mirror-to-pmo'],
|
|
470
|
+
envValue: envMirrorDefault,
|
|
471
|
+
configValue: configMirrorDefault,
|
|
472
|
+
});
|
|
473
|
+
const mirrorToPmo = mirrorResolution.enabled;
|
|
474
|
+
fromIssueMirror = mirrorToPmo;
|
|
475
|
+
fromIssueMirrorSource = mirrorResolution.source;
|
|
476
|
+
if (!jsonMode) {
|
|
477
|
+
this.log(styles.muted(`External issue mirror: ${mirrorToPmo ? 'enabled' : 'disabled'} (${mirrorResolution.source})`));
|
|
478
|
+
}
|
|
479
|
+
let envelope = null;
|
|
480
|
+
try {
|
|
481
|
+
envelope = await this.fetchExternalIssue(sourceAndKey.source, sourceAndKey.key);
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
if (error instanceof ExternalIssueAdapterError) {
|
|
485
|
+
db.close();
|
|
486
|
+
return handleError(`EXTERNAL_ISSUE_${error.code}`, `[${sourceAndKey.source}] ${error.message}`);
|
|
487
|
+
}
|
|
488
|
+
const message = error instanceof Error ? error.message : 'Failed to fetch external issue.';
|
|
489
|
+
db.close();
|
|
490
|
+
return handleError('EXTERNAL_ISSUE_REQUEST_FAILED', message);
|
|
491
|
+
}
|
|
492
|
+
if (!envelope) {
|
|
493
|
+
db.close();
|
|
494
|
+
return handleError('EXTERNAL_ISSUE_NOT_FOUND', `${sourceAndKey.source} issue "${sourceAndKey.key}" was not found.`);
|
|
495
|
+
}
|
|
496
|
+
const existingLinkedTicket = await this.findLinkedTicketByEnvelope(projectId, envelope);
|
|
497
|
+
let linkedTicket;
|
|
498
|
+
if (mirrorToPmo) {
|
|
499
|
+
linkedTicket = await this.createOrUpdateLinkedTicket(projectId, envelope);
|
|
500
|
+
await autoExportToBoard(this.pmoPath, this.storage);
|
|
501
|
+
}
|
|
502
|
+
else {
|
|
503
|
+
if (!existingLinkedTicket) {
|
|
504
|
+
db.close();
|
|
505
|
+
return handleError('EXTERNAL_ISSUE_NOT_MIRRORED', `No linked PMO ticket found for ${sourceAndKey.source} issue "${sourceAndKey.key}". Re-run with --mirror-to-pmo.`);
|
|
506
|
+
}
|
|
507
|
+
linkedTicket = existingLinkedTicket;
|
|
508
|
+
}
|
|
509
|
+
ticketId = linkedTicket.id;
|
|
510
|
+
externalIssueContextMessage = buildExternalSpawnContextMessage(envelope, flags.message);
|
|
511
|
+
}
|
|
242
512
|
if (!ticketId) {
|
|
243
513
|
// Get all tickets, optionally filtered by project if -P/--project flag is provided
|
|
244
514
|
const allTickets = await this.storage.listTickets(projectId);
|
|
@@ -285,6 +555,22 @@ export default class WorkStart extends PMOCommand {
|
|
|
285
555
|
: earlyConfigPrDefault === false ? 'no-pr'
|
|
286
556
|
: 'no-pr';
|
|
287
557
|
metadata.resolvedPRMode = earlyResolvedPr;
|
|
558
|
+
const externalMetadata = getTicketExternalMetadata(ticket);
|
|
559
|
+
if (externalMetadata.source || externalMetadata.key) {
|
|
560
|
+
metadata.externalIssue = {
|
|
561
|
+
source: externalMetadata.source ?? null,
|
|
562
|
+
key: externalMetadata.key ?? null,
|
|
563
|
+
id: externalMetadata.id ?? null,
|
|
564
|
+
url: externalMetadata.url ?? null,
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
if (fromIssueActive) {
|
|
568
|
+
metadata.mirrorToPmo = fromIssueMirror ?? null;
|
|
569
|
+
metadata.mirrorToPmoSource = fromIssueMirrorSource ?? null;
|
|
570
|
+
if (sourceResolutionMeta) {
|
|
571
|
+
metadata.sourceResolution = sourceResolutionMeta;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
288
574
|
// Build the confirm command with --yes
|
|
289
575
|
let confirmCmd = `prlt work start ${ticketId}`;
|
|
290
576
|
if (flags.action)
|
|
@@ -341,12 +627,14 @@ export default class WorkStart extends PMOCommand {
|
|
|
341
627
|
if (isBlocked && !flags.force) {
|
|
342
628
|
const blockers = await this.storage.getTicketBlockers(ticketId);
|
|
343
629
|
const incompleteBlockers = blockers.filter(b => b.status !== 'done' && b.status !== 'canceled');
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
630
|
+
if (!jsonMode) {
|
|
631
|
+
this.log('');
|
|
632
|
+
this.log(styles.warning(`⚠️ ${ticketId} is blocked by:`));
|
|
633
|
+
for (const blocker of incompleteBlockers) {
|
|
634
|
+
this.log(styles.muted(` - ${blocker.id}: ${blocker.title} (${blocker.status})`));
|
|
635
|
+
}
|
|
636
|
+
this.log('');
|
|
348
637
|
}
|
|
349
|
-
this.log('');
|
|
350
638
|
// Use FlagResolver for blocked ticket confirmation
|
|
351
639
|
const blockedResolver = new FlagResolver({
|
|
352
640
|
commandName: 'work start',
|
|
@@ -374,8 +662,10 @@ export default class WorkStart extends PMOCommand {
|
|
|
374
662
|
// Check for existing tmux session for this ticket
|
|
375
663
|
const existingSession = getTicketTmuxSession(ticketId);
|
|
376
664
|
if (existingSession && !flags.force) {
|
|
377
|
-
|
|
378
|
-
|
|
665
|
+
if (!jsonMode) {
|
|
666
|
+
this.log('');
|
|
667
|
+
this.log(styles.warning(`Ticket ${ticketId} has an active tmux session (${existingSession.agent})`));
|
|
668
|
+
}
|
|
379
669
|
// Use FlagResolver for session action
|
|
380
670
|
const sessionResolver = new FlagResolver({
|
|
381
671
|
commandName: 'work start',
|
|
@@ -403,7 +693,7 @@ export default class WorkStart extends PMOCommand {
|
|
|
403
693
|
}
|
|
404
694
|
if (sessionAction === 'attach') {
|
|
405
695
|
// Attach to existing session
|
|
406
|
-
execSync(`tmux attach -t "${existingSession.sessionName}"`, { stdio: 'inherit' });
|
|
696
|
+
execSync(`tmux attach -d -t "${existingSession.sessionName}"`, { stdio: 'inherit' });
|
|
407
697
|
db.close();
|
|
408
698
|
return;
|
|
409
699
|
}
|
|
@@ -468,12 +758,15 @@ export default class WorkStart extends PMOCommand {
|
|
|
468
758
|
// No agent specified - default to creating ephemeral agent (new behavior)
|
|
469
759
|
// Or prompt for agent selection if staff agents exist
|
|
470
760
|
// Get staff agents that exist on disk (warns about missing directories)
|
|
471
|
-
const activeStaffAgents = getActiveStaffAgents(workspaceInfo, (msg) =>
|
|
761
|
+
const activeStaffAgents = getActiveStaffAgents(workspaceInfo, (msg) => {
|
|
762
|
+
if (!jsonMode)
|
|
763
|
+
this.log(msg);
|
|
764
|
+
});
|
|
472
765
|
if (activeStaffAgents.length > 0) {
|
|
473
766
|
// Clean up stale executions before checking availability (TKT-604)
|
|
474
767
|
// This fixes agents appearing as "busy" when their sessions have terminated
|
|
475
768
|
const cleanedUp = executionStorage.cleanupStaleExecutions();
|
|
476
|
-
if (cleanedUp > 0) {
|
|
769
|
+
if (cleanedUp > 0 && !jsonMode) {
|
|
477
770
|
this.log(styles.muted(` Cleaned up ${cleanedUp} stale execution(s)`));
|
|
478
771
|
}
|
|
479
772
|
// Get list of busy agents (already running something)
|
|
@@ -516,16 +809,19 @@ export default class WorkStart extends PMOCommand {
|
|
|
516
809
|
const selectedAgent = agentResult.selectedAgent;
|
|
517
810
|
if (selectedAgent === '__ephemeral__') {
|
|
518
811
|
// Create ephemeral agent
|
|
519
|
-
|
|
812
|
+
if (!jsonMode)
|
|
813
|
+
this.log(styles.muted('Creating ephemeral agent...'));
|
|
520
814
|
const ephemeralResult = await createEphemeralAgent(workspaceInfo, {
|
|
521
815
|
skipDevcontainer: flags['run-on-host'],
|
|
522
|
-
log: (msg) =>
|
|
816
|
+
log: (msg) => { if (!jsonMode)
|
|
817
|
+
this.log(msg); },
|
|
523
818
|
mountMode: flags.clone ? 'clone' : 'worktree',
|
|
524
819
|
});
|
|
525
820
|
agentName = ephemeralResult.name;
|
|
526
821
|
agentWorktreePath = ephemeralResult.worktreePath;
|
|
527
822
|
isEphemeralAgent = true;
|
|
528
|
-
|
|
823
|
+
if (!jsonMode)
|
|
824
|
+
this.log(styles.success(`Created ephemeral agent: ${agentName}`));
|
|
529
825
|
}
|
|
530
826
|
else {
|
|
531
827
|
agentName = selectedAgent;
|
|
@@ -533,16 +829,19 @@ export default class WorkStart extends PMOCommand {
|
|
|
533
829
|
}
|
|
534
830
|
else {
|
|
535
831
|
// No pre-registered agents - create ephemeral agent by default
|
|
536
|
-
|
|
832
|
+
if (!jsonMode)
|
|
833
|
+
this.log(styles.muted('Creating ephemeral agent...'));
|
|
537
834
|
const ephemeralResult = await createEphemeralAgent(workspaceInfo, {
|
|
538
835
|
skipDevcontainer: flags['run-on-host'],
|
|
539
|
-
log: (msg) =>
|
|
836
|
+
log: (msg) => { if (!jsonMode)
|
|
837
|
+
this.log(msg); },
|
|
540
838
|
mountMode: flags.clone ? 'clone' : 'worktree',
|
|
541
839
|
});
|
|
542
840
|
agentName = ephemeralResult.name;
|
|
543
841
|
agentWorktreePath = ephemeralResult.worktreePath;
|
|
544
842
|
isEphemeralAgent = true;
|
|
545
|
-
|
|
843
|
+
if (!jsonMode)
|
|
844
|
+
this.log(styles.success(`Created ephemeral agent: ${agentName}`));
|
|
546
845
|
}
|
|
547
846
|
}
|
|
548
847
|
// At this point agentName is guaranteed to be set
|
|
@@ -556,7 +855,7 @@ export default class WorkStart extends PMOCommand {
|
|
|
556
855
|
}
|
|
557
856
|
// Check for running execution on this ticket (warning only, allows parallel work)
|
|
558
857
|
const runningExecution = executionStorage.getRunningExecution(ticketId);
|
|
559
|
-
if (runningExecution) {
|
|
858
|
+
if (runningExecution && !jsonMode) {
|
|
560
859
|
this.log(styles.warning(`⚠️ Ticket "${ticketId}" already has work in progress: ${runningExecution.id}`));
|
|
561
860
|
this.log(styles.muted(` Starting parallel execution. Note: status updates may conflict.`));
|
|
562
861
|
}
|
|
@@ -601,16 +900,18 @@ export default class WorkStart extends PMOCommand {
|
|
|
601
900
|
const { getAgentGitStatus, pushAgentWork } = await import('../../lib/agents/commands.js');
|
|
602
901
|
const gitStatus = getAgentGitStatus(workspaceInfo, assignedAgent);
|
|
603
902
|
if (gitStatus.hasUnsavedWork) {
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
903
|
+
if (!jsonMode) {
|
|
904
|
+
this.log(styles.warning(`\n⚠️ Agent "${assignedAgent}" has unsaved work:`));
|
|
905
|
+
for (const wt of gitStatus.worktrees) {
|
|
906
|
+
if (wt.hasUncommittedChanges) {
|
|
907
|
+
this.log(styles.muted(` ${wt.repoName}: ${wt.uncommittedFiles.length} uncommitted file(s)`));
|
|
908
|
+
}
|
|
909
|
+
if (wt.hasUnpushedCommits) {
|
|
910
|
+
this.log(styles.muted(` ${wt.repoName}: ${wt.unpushedCount} unpushed commit(s) on ${wt.branch}`));
|
|
911
|
+
}
|
|
611
912
|
}
|
|
913
|
+
this.log('');
|
|
612
914
|
}
|
|
613
|
-
this.log('');
|
|
614
915
|
// Use FlagResolver for unsaved work action
|
|
615
916
|
const unsavedResolver = new FlagResolver({
|
|
616
917
|
commandName: 'work start',
|
|
@@ -796,7 +1097,7 @@ export default class WorkStart extends PMOCommand {
|
|
|
796
1097
|
actionEndPrompt: customPrompt ? undefined : selectedAction?.endPrompt,
|
|
797
1098
|
modifiesCode: customPrompt ? true : selectedAction?.modifiesCode ?? true,
|
|
798
1099
|
// Additional instructions from --message flag
|
|
799
|
-
customMessage: flags.message,
|
|
1100
|
+
customMessage: externalIssueContextMessage ?? flags.message,
|
|
800
1101
|
};
|
|
801
1102
|
// Check if agent has devcontainer config
|
|
802
1103
|
const hasDevcontainer = hasDevcontainerConfig(agentDir);
|
|
@@ -1033,96 +1334,139 @@ export default class WorkStart extends PMOCommand {
|
|
|
1033
1334
|
// Auth method resolution for devcontainer environment
|
|
1034
1335
|
// Only needed for Claude Code executor - other executors handle auth differently
|
|
1035
1336
|
if (environment === 'devcontainer' && !useApiKey && isClaudeExecutor(executor)) {
|
|
1036
|
-
//
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
if (
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1337
|
+
// First, verify Docker daemon is actually running before checking credentials.
|
|
1338
|
+
// dockerCredentialsExist() runs a Docker command that fails silently when the daemon
|
|
1339
|
+
// is down, which would trigger a misleading OAuth credentials warning.
|
|
1340
|
+
if (!isDockerRunning()) {
|
|
1341
|
+
this.log('');
|
|
1342
|
+
this.log(styles.warning('Docker daemon is not running. Start Docker Desktop or use --run-on-host.'));
|
|
1343
|
+
this.log('');
|
|
1344
|
+
if (jsonMode && flags.yes) {
|
|
1345
|
+
// In JSON mode with --yes, auto-switch to host
|
|
1346
|
+
environment = 'host';
|
|
1347
|
+
this.log(styles.muted('Switched to host environment (Docker not running).'));
|
|
1047
1348
|
}
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1349
|
+
else {
|
|
1350
|
+
const dockerChoices = [
|
|
1351
|
+
{ name: '💻 Switch to host environment', value: 'host' },
|
|
1352
|
+
{ name: '✗ Cancel', value: 'cancel' },
|
|
1353
|
+
];
|
|
1354
|
+
const dockerMessage = 'Docker is not running. What would you like to do?';
|
|
1355
|
+
const dockerResolver = new FlagResolver({
|
|
1356
|
+
commandName: 'work start',
|
|
1357
|
+
baseCommand: `prlt work start ${ticketId}`,
|
|
1358
|
+
jsonMode,
|
|
1359
|
+
flags: {},
|
|
1360
|
+
});
|
|
1361
|
+
dockerResolver.addPrompt({
|
|
1362
|
+
flagName: 'dockerAction',
|
|
1363
|
+
type: 'list',
|
|
1364
|
+
message: dockerMessage,
|
|
1365
|
+
choices: () => dockerChoices,
|
|
1366
|
+
});
|
|
1367
|
+
const dockerResult = await dockerResolver.resolve();
|
|
1368
|
+
const dockerAction = dockerResult.dockerAction;
|
|
1369
|
+
if (dockerAction === 'cancel') {
|
|
1370
|
+
db.close();
|
|
1371
|
+
this.log(styles.muted('Cancelled.'));
|
|
1372
|
+
return;
|
|
1373
|
+
}
|
|
1374
|
+
environment = 'host';
|
|
1375
|
+
this.log(styles.muted('Switched to host environment.'));
|
|
1059
1376
|
}
|
|
1060
|
-
// OAuth credentials valid — continue (useApiKey stays false)
|
|
1061
1377
|
}
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1378
|
+
// Only check credentials if Docker is running and still using devcontainer
|
|
1379
|
+
if (environment === 'devcontainer') {
|
|
1380
|
+
// Check for saved auth method preference
|
|
1381
|
+
const savedAuthMethod = getAuthMethod(db);
|
|
1382
|
+
const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
|
|
1383
|
+
if (savedAuthMethod === 'apikey') {
|
|
1384
|
+
// Saved preference: API key — validate it's still set
|
|
1385
|
+
if (!hasApiKey) {
|
|
1386
|
+
this.log('');
|
|
1387
|
+
this.log(styles.warning('⚠️ Saved auth method is "apikey" but ANTHROPIC_API_KEY is not set in your environment.'));
|
|
1388
|
+
this.log(styles.muted(' Set the env var or run "' + this.config.bin + ' agent auth" to switch to OAuth.'));
|
|
1389
|
+
db.close();
|
|
1390
|
+
return;
|
|
1391
|
+
}
|
|
1392
|
+
useApiKey = true;
|
|
1393
|
+
}
|
|
1394
|
+
else if (savedAuthMethod === 'oauth') {
|
|
1395
|
+
// Saved preference: OAuth — validate credentials exist
|
|
1396
|
+
const hasCredentials = dockerCredentialsExist();
|
|
1397
|
+
if (!hasCredentials) {
|
|
1398
|
+
this.log('');
|
|
1399
|
+
this.log(styles.warning('⚠️ Saved auth method is "oauth" but no OAuth credentials found.'));
|
|
1400
|
+
this.log(styles.muted(' Run "' + this.config.bin + ' agent auth" to authenticate.'));
|
|
1401
|
+
db.close();
|
|
1402
|
+
return;
|
|
1403
|
+
}
|
|
1404
|
+
// OAuth credentials valid — continue (useApiKey stays false)
|
|
1068
1405
|
}
|
|
1069
1406
|
else {
|
|
1070
|
-
// No saved preference
|
|
1071
|
-
|
|
1072
|
-
if (
|
|
1073
|
-
//
|
|
1407
|
+
// No saved preference — show auth method menu
|
|
1408
|
+
const hasCredentials = dockerCredentialsExist();
|
|
1409
|
+
if (hasCredentials) {
|
|
1410
|
+
// OAuth credentials exist, use them silently (no menu needed)
|
|
1411
|
+
// useApiKey stays false
|
|
1074
1412
|
}
|
|
1075
1413
|
else {
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
// Build auth method choices
|
|
1081
|
-
const authChoices = [
|
|
1082
|
-
{ name: `🔐 OAuth (recommended — uses Max subscription)`, value: 'oauth' },
|
|
1083
|
-
];
|
|
1084
|
-
if (hasApiKey) {
|
|
1085
|
-
authChoices.push({ name: '🔑 API key (uses API credits, not Max subscription)', value: 'apikey' });
|
|
1086
|
-
}
|
|
1087
|
-
authChoices.push({ name: '💻 Switch to host environment instead', value: 'host' }, { name: '✗ Cancel', value: 'cancel' });
|
|
1088
|
-
// Use FlagResolver for auth method selection
|
|
1089
|
-
const authResolver = new FlagResolver({
|
|
1090
|
-
commandName: 'work start',
|
|
1091
|
-
baseCommand: `prlt work start ${ticketId}`,
|
|
1092
|
-
jsonMode,
|
|
1093
|
-
flags: {},
|
|
1094
|
-
});
|
|
1095
|
-
authResolver.addPrompt({
|
|
1096
|
-
flagName: 'authAction',
|
|
1097
|
-
type: 'list',
|
|
1098
|
-
message: 'How should the agent authenticate with Claude?',
|
|
1099
|
-
choices: () => authChoices,
|
|
1100
|
-
});
|
|
1101
|
-
const authResult = await authResolver.resolve();
|
|
1102
|
-
const authAction = authResult.authAction;
|
|
1103
|
-
if (authAction === 'cancel') {
|
|
1104
|
-
db.close();
|
|
1105
|
-
this.log(styles.muted('Cancelled.'));
|
|
1106
|
-
return;
|
|
1107
|
-
}
|
|
1108
|
-
if (authAction === 'host') {
|
|
1109
|
-
environment = 'host';
|
|
1110
|
-
this.log(styles.muted('Switched to host environment.'));
|
|
1111
|
-
}
|
|
1112
|
-
else if (authAction === 'apikey') {
|
|
1113
|
-
useApiKey = true;
|
|
1114
|
-
this.log(styles.warning('Using ANTHROPIC_API_KEY — this will consume API credits.'));
|
|
1115
|
-
this.log(styles.muted(`Run "${this.config.bin} agent auth" to set up OAuth and use your Max subscription instead.`));
|
|
1116
|
-
this.log('');
|
|
1414
|
+
// No saved preference and no OAuth credentials — prompt user
|
|
1415
|
+
// In JSON mode with --yes, continue anyway (agent can run /login)
|
|
1416
|
+
if (jsonMode && flags.yes) {
|
|
1417
|
+
// Continue without prompting - agent will need to handle auth
|
|
1117
1418
|
}
|
|
1118
|
-
else
|
|
1419
|
+
else {
|
|
1119
1420
|
this.log('');
|
|
1120
|
-
this.log(styles.
|
|
1421
|
+
this.log(styles.warning('⚠️ No Claude Code OAuth credentials found for Docker containers'));
|
|
1422
|
+
this.log(styles.muted(' Agents need credentials to authenticate with Claude.'));
|
|
1121
1423
|
this.log('');
|
|
1122
|
-
//
|
|
1123
|
-
const
|
|
1124
|
-
|
|
1125
|
-
|
|
1424
|
+
// Build auth method choices
|
|
1425
|
+
const authChoices = [
|
|
1426
|
+
{ name: `🔐 OAuth (recommended — uses Max subscription)`, value: 'oauth' },
|
|
1427
|
+
];
|
|
1428
|
+
if (hasApiKey) {
|
|
1429
|
+
authChoices.push({ name: '🔑 API key (uses API credits, not Max subscription)', value: 'apikey' });
|
|
1430
|
+
}
|
|
1431
|
+
authChoices.push({ name: '💻 Switch to host environment instead', value: 'host' }, { name: '✗ Cancel', value: 'cancel' });
|
|
1432
|
+
// Use FlagResolver for auth method selection
|
|
1433
|
+
const authResolver = new FlagResolver({
|
|
1434
|
+
commandName: 'work start',
|
|
1435
|
+
baseCommand: `prlt work start ${ticketId}`,
|
|
1436
|
+
jsonMode,
|
|
1437
|
+
flags: {},
|
|
1438
|
+
});
|
|
1439
|
+
authResolver.addPrompt({
|
|
1440
|
+
flagName: 'authAction',
|
|
1441
|
+
type: 'list',
|
|
1442
|
+
message: 'How should the agent authenticate with Claude?',
|
|
1443
|
+
choices: () => authChoices,
|
|
1444
|
+
});
|
|
1445
|
+
const authResult = await authResolver.resolve();
|
|
1446
|
+
const authAction = authResult.authAction;
|
|
1447
|
+
if (authAction === 'cancel') {
|
|
1448
|
+
db.close();
|
|
1449
|
+
this.log(styles.muted('Cancelled.'));
|
|
1450
|
+
return;
|
|
1451
|
+
}
|
|
1452
|
+
if (authAction === 'host') {
|
|
1453
|
+
environment = 'host';
|
|
1454
|
+
this.log(styles.muted('Switched to host environment.'));
|
|
1455
|
+
}
|
|
1456
|
+
else if (authAction === 'apikey') {
|
|
1457
|
+
useApiKey = true;
|
|
1458
|
+
this.log(styles.warning('Using ANTHROPIC_API_KEY — this will consume API credits.'));
|
|
1459
|
+
this.log(styles.muted(`Run "${this.config.bin} agent auth" to set up OAuth and use your Max subscription instead.`));
|
|
1460
|
+
this.log('');
|
|
1461
|
+
}
|
|
1462
|
+
else if (authAction === 'oauth') {
|
|
1463
|
+
this.log('');
|
|
1464
|
+
this.log(styles.primary(`Opening ${this.config.bin} agent auth in new tab...`));
|
|
1465
|
+
this.log('');
|
|
1466
|
+
// Open auth in a new terminal tab
|
|
1467
|
+
const authCmd = `${process.argv[1]} agent auth`;
|
|
1468
|
+
try {
|
|
1469
|
+
execSync(`osascript -e '
|
|
1126
1470
|
tell application "iTerm"
|
|
1127
1471
|
tell current window
|
|
1128
1472
|
create tab with default profile
|
|
@@ -1132,69 +1476,70 @@ export default class WorkStart extends PMOCommand {
|
|
|
1132
1476
|
end tell
|
|
1133
1477
|
end tell
|
|
1134
1478
|
'`);
|
|
1135
|
-
}
|
|
1136
|
-
catch {
|
|
1137
|
-
// Fallback: try Terminal.app
|
|
1138
|
-
try {
|
|
1139
|
-
execSync(`osascript -e 'tell application "Terminal" to do script "${authCmd}"'`);
|
|
1140
1479
|
}
|
|
1141
1480
|
catch {
|
|
1142
|
-
|
|
1143
|
-
|
|
1481
|
+
// Fallback: try Terminal.app
|
|
1482
|
+
try {
|
|
1483
|
+
execSync(`osascript -e 'tell application "Terminal" to do script "${authCmd}"'`);
|
|
1484
|
+
}
|
|
1485
|
+
catch {
|
|
1486
|
+
this.log(styles.warning('Could not open new terminal tab.'));
|
|
1487
|
+
this.log(styles.muted(`Please run manually: ${authCmd}`));
|
|
1488
|
+
}
|
|
1144
1489
|
}
|
|
1145
|
-
|
|
1146
|
-
this.log(styles.muted('Complete the /login flow in the new tab, then press Enter here...'));
|
|
1147
|
-
this.log('');
|
|
1148
|
-
// Wait for user to complete auth
|
|
1149
|
-
await this.prompt([{
|
|
1150
|
-
type: 'input',
|
|
1151
|
-
name: 'done',
|
|
1152
|
-
message: 'Press Enter when authentication is complete:',
|
|
1153
|
-
}]);
|
|
1154
|
-
// Check if credentials now exist
|
|
1155
|
-
if (!dockerCredentialsExist()) {
|
|
1490
|
+
this.log(styles.muted('Complete the /login flow in the new tab, then press Enter here...'));
|
|
1156
1491
|
this.log('');
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
const saveMessage = 'Save as default auth method?';
|
|
1178
|
-
const saveResolver = new FlagResolver({
|
|
1179
|
-
commandName: 'work start',
|
|
1180
|
-
baseCommand: `prlt work start ${ticketId}`,
|
|
1181
|
-
jsonMode,
|
|
1182
|
-
flags: {},
|
|
1183
|
-
});
|
|
1184
|
-
saveResolver.addPrompt({
|
|
1185
|
-
flagName: 'saveDefault',
|
|
1186
|
-
type: 'list',
|
|
1187
|
-
message: saveMessage,
|
|
1188
|
-
default: true,
|
|
1189
|
-
choices: () => saveChoices,
|
|
1190
|
-
});
|
|
1191
|
-
const saveResult = await saveResolver.resolve();
|
|
1192
|
-
if (saveResult.saveDefault) {
|
|
1193
|
-
const methodToSave = authAction === 'apikey' ? 'apikey' : 'oauth';
|
|
1194
|
-
saveAuthMethod(db, methodToSave);
|
|
1195
|
-
this.log(styles.muted(`Auth method saved: ${methodToSave}. Will skip this menu next time.`));
|
|
1492
|
+
// Wait for user to complete auth
|
|
1493
|
+
await this.prompt([{
|
|
1494
|
+
type: 'input',
|
|
1495
|
+
name: 'done',
|
|
1496
|
+
message: 'Press Enter when authentication is complete:',
|
|
1497
|
+
}]);
|
|
1498
|
+
// Check if credentials now exist
|
|
1499
|
+
if (!dockerCredentialsExist()) {
|
|
1500
|
+
this.log('');
|
|
1501
|
+
this.log(styles.warning('Authentication did not complete. No credentials found.'));
|
|
1502
|
+
db.close();
|
|
1503
|
+
return;
|
|
1504
|
+
}
|
|
1505
|
+
const info = getDockerCredentialInfo();
|
|
1506
|
+
this.log('');
|
|
1507
|
+
this.log(styles.success('✓ Credentials configured'));
|
|
1508
|
+
if (info) {
|
|
1509
|
+
this.log(styles.muted(` Subscription: ${info.subscriptionType || 'unknown'}`));
|
|
1510
|
+
this.log(styles.muted(` Expires: ${info.expiresAt.toLocaleDateString()}`));
|
|
1511
|
+
}
|
|
1196
1512
|
this.log('');
|
|
1197
1513
|
}
|
|
1514
|
+
// Prompt "Save as default?" after a successful auth method choice
|
|
1515
|
+
// (only if they chose oauth or apikey, not host/cancel)
|
|
1516
|
+
if (authAction === 'oauth' || authAction === 'apikey') {
|
|
1517
|
+
const saveChoices = [
|
|
1518
|
+
{ name: 'Yes — skip this menu next time', value: true },
|
|
1519
|
+
{ name: 'No — ask me each time', value: false },
|
|
1520
|
+
];
|
|
1521
|
+
const saveMessage = 'Save as default auth method?';
|
|
1522
|
+
const saveResolver = new FlagResolver({
|
|
1523
|
+
commandName: 'work start',
|
|
1524
|
+
baseCommand: `prlt work start ${ticketId}`,
|
|
1525
|
+
jsonMode,
|
|
1526
|
+
flags: {},
|
|
1527
|
+
});
|
|
1528
|
+
saveResolver.addPrompt({
|
|
1529
|
+
flagName: 'saveDefault',
|
|
1530
|
+
type: 'list',
|
|
1531
|
+
message: saveMessage,
|
|
1532
|
+
default: true,
|
|
1533
|
+
choices: () => saveChoices,
|
|
1534
|
+
});
|
|
1535
|
+
const saveResult = await saveResolver.resolve();
|
|
1536
|
+
if (saveResult.saveDefault) {
|
|
1537
|
+
const methodToSave = authAction === 'apikey' ? 'apikey' : 'oauth';
|
|
1538
|
+
saveAuthMethod(db, methodToSave);
|
|
1539
|
+
this.log(styles.muted(`Auth method saved: ${methodToSave}. Will skip this menu next time.`));
|
|
1540
|
+
this.log('');
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1198
1543
|
}
|
|
1199
1544
|
}
|
|
1200
1545
|
}
|
|
@@ -1523,6 +1868,7 @@ export default class WorkStart extends PMOCommand {
|
|
|
1523
1868
|
}
|
|
1524
1869
|
}
|
|
1525
1870
|
// Create execution record
|
|
1871
|
+
const ticketExternalMetadata = getTicketExternalMetadata(ticket);
|
|
1526
1872
|
const execution = executionStorage.createExecution({
|
|
1527
1873
|
ticketId: ticket.id,
|
|
1528
1874
|
agentName: assignedAgent,
|
|
@@ -1531,6 +1877,10 @@ export default class WorkStart extends PMOCommand {
|
|
|
1531
1877
|
displayMode,
|
|
1532
1878
|
permissionMode,
|
|
1533
1879
|
branch,
|
|
1880
|
+
externalSource: ticketExternalMetadata.source,
|
|
1881
|
+
externalKey: ticketExternalMetadata.key,
|
|
1882
|
+
externalId: ticketExternalMetadata.id,
|
|
1883
|
+
externalUrl: ticketExternalMetadata.url,
|
|
1534
1884
|
});
|
|
1535
1885
|
if (!jsonMode) {
|
|
1536
1886
|
this.log(styles.muted(` Work ID: ${execution.id}`));
|
|
@@ -1586,6 +1936,13 @@ export default class WorkStart extends PMOCommand {
|
|
|
1586
1936
|
sessionManager: environment === 'devcontainer' ? sessionManager : undefined,
|
|
1587
1937
|
});
|
|
1588
1938
|
if (result.success) {
|
|
1939
|
+
// Track agent spawn analytics
|
|
1940
|
+
trackAgentSpawned({
|
|
1941
|
+
executor,
|
|
1942
|
+
environment,
|
|
1943
|
+
action: context.actionId || 'implement',
|
|
1944
|
+
ephemeral: isEphemeralAgent,
|
|
1945
|
+
});
|
|
1589
1946
|
// Update execution record with process info
|
|
1590
1947
|
executionStorage.updateStatus(execution.id, 'running');
|
|
1591
1948
|
executionStorage.updateProcessInfo(execution.id, {
|
|
@@ -1782,52 +2139,79 @@ export default class WorkStart extends PMOCommand {
|
|
|
1782
2139
|
let batchUseApiKey = false;
|
|
1783
2140
|
// Credential check only applies to Claude Code executor
|
|
1784
2141
|
if (anyUseDevcontainer && isClaudeExecutor(batchExecutor)) {
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
2142
|
+
// First, verify Docker daemon is actually running before checking credentials.
|
|
2143
|
+
// dockerCredentialsExist() runs a Docker command that fails silently when the daemon
|
|
2144
|
+
// is down, which would trigger a misleading OAuth credentials warning.
|
|
2145
|
+
if (!isDockerRunning()) {
|
|
1788
2146
|
this.log('');
|
|
1789
|
-
this.log(styles.warning('
|
|
1790
|
-
this.log(styles.muted(' Agents need credentials to authenticate with Claude.'));
|
|
2147
|
+
this.log(styles.warning('Docker daemon is not running. Start Docker Desktop or use --run-on-host.'));
|
|
1791
2148
|
this.log('');
|
|
1792
|
-
|
|
1793
|
-
const batchAuthChoices = [
|
|
1794
|
-
{ name: `🔐 Run ${this.config.bin} agent auth now (recommended — uses Max subscription)`, value: 'auth', command: `${this.config.bin} agent auth` },
|
|
1795
|
-
];
|
|
1796
|
-
if (hasApiKey) {
|
|
1797
|
-
batchAuthChoices.push({ name: '🔑 Use ANTHROPIC_API_KEY (⚠️ uses API credits, not Max subscription)', value: 'apikey', command: '' });
|
|
1798
|
-
}
|
|
1799
|
-
batchAuthChoices.push({ name: '💻 Run all agents on host instead (--run-on-host)', value: 'host', command: 'prlt work start --all --run-on-host --json' }, { name: '✗ Cancel', value: 'cancel', command: '' });
|
|
1800
|
-
const { authAction } = await this.prompt([
|
|
2149
|
+
const { dockerAction } = await this.prompt([
|
|
1801
2150
|
{
|
|
1802
2151
|
type: 'list',
|
|
1803
|
-
name: '
|
|
1804
|
-
message: 'What would you like to do?',
|
|
1805
|
-
choices:
|
|
2152
|
+
name: 'dockerAction',
|
|
2153
|
+
message: 'Docker is not running. What would you like to do?',
|
|
2154
|
+
choices: [
|
|
2155
|
+
{ name: '💻 Run all agents on host instead (--run-on-host)', value: 'host', command: 'prlt work start --all --run-on-host --json' },
|
|
2156
|
+
{ name: '✗ Cancel', value: 'cancel', command: '' },
|
|
2157
|
+
],
|
|
1806
2158
|
},
|
|
1807
2159
|
], batchJsonModeConfig);
|
|
1808
|
-
if (
|
|
2160
|
+
if (dockerAction === 'cancel') {
|
|
1809
2161
|
db.close();
|
|
1810
2162
|
this.log(styles.muted('Cancelled.'));
|
|
1811
2163
|
return;
|
|
1812
2164
|
}
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
this.log(styles.muted(`Run "${this.config.bin} agent auth" to set up OAuth and use your Max subscription instead.`));
|
|
1821
|
-
this.log('');
|
|
1822
|
-
}
|
|
1823
|
-
else if (authAction === 'auth') {
|
|
2165
|
+
flags['run-on-host'] = true;
|
|
2166
|
+
this.log(styles.muted('All agents will run on host.'));
|
|
2167
|
+
}
|
|
2168
|
+
if (!flags['run-on-host']) {
|
|
2169
|
+
const hasCredentials = dockerCredentialsExist();
|
|
2170
|
+
if (!hasCredentials) {
|
|
2171
|
+
const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
|
|
1824
2172
|
this.log('');
|
|
1825
|
-
this.log(styles.
|
|
2173
|
+
this.log(styles.warning('⚠️ No Claude Code OAuth credentials found for Docker containers'));
|
|
2174
|
+
this.log(styles.muted(' Agents need credentials to authenticate with Claude.'));
|
|
1826
2175
|
this.log('');
|
|
1827
|
-
//
|
|
1828
|
-
const
|
|
1829
|
-
|
|
1830
|
-
|
|
2176
|
+
// Build choices based on available options
|
|
2177
|
+
const batchAuthChoices = [
|
|
2178
|
+
{ name: `🔐 Run ${this.config.bin} agent auth now (recommended — uses Max subscription)`, value: 'auth', command: `${this.config.bin} agent auth` },
|
|
2179
|
+
];
|
|
2180
|
+
if (hasApiKey) {
|
|
2181
|
+
batchAuthChoices.push({ name: '🔑 Use ANTHROPIC_API_KEY (⚠️ uses API credits, not Max subscription)', value: 'apikey', command: '' });
|
|
2182
|
+
}
|
|
2183
|
+
batchAuthChoices.push({ name: '💻 Run all agents on host instead (--run-on-host)', value: 'host', command: 'prlt work start --all --run-on-host --json' }, { name: '✗ Cancel', value: 'cancel', command: '' });
|
|
2184
|
+
const { authAction } = await this.prompt([
|
|
2185
|
+
{
|
|
2186
|
+
type: 'list',
|
|
2187
|
+
name: 'authAction',
|
|
2188
|
+
message: 'What would you like to do?',
|
|
2189
|
+
choices: batchAuthChoices,
|
|
2190
|
+
},
|
|
2191
|
+
], batchJsonModeConfig);
|
|
2192
|
+
if (authAction === 'cancel') {
|
|
2193
|
+
db.close();
|
|
2194
|
+
this.log(styles.muted('Cancelled.'));
|
|
2195
|
+
return;
|
|
2196
|
+
}
|
|
2197
|
+
if (authAction === 'host') {
|
|
2198
|
+
flags['run-on-host'] = true;
|
|
2199
|
+
this.log(styles.muted('All agents will run on host.'));
|
|
2200
|
+
}
|
|
2201
|
+
else if (authAction === 'apikey') {
|
|
2202
|
+
batchUseApiKey = true;
|
|
2203
|
+
this.log(styles.warning('Using ANTHROPIC_API_KEY — this will consume API credits.'));
|
|
2204
|
+
this.log(styles.muted(`Run "${this.config.bin} agent auth" to set up OAuth and use your Max subscription instead.`));
|
|
2205
|
+
this.log('');
|
|
2206
|
+
}
|
|
2207
|
+
else if (authAction === 'auth') {
|
|
2208
|
+
this.log('');
|
|
2209
|
+
this.log(styles.primary(`Opening ${this.config.bin} agent auth in new tab...`));
|
|
2210
|
+
this.log('');
|
|
2211
|
+
// Open auth in a new terminal tab
|
|
2212
|
+
const authCmd = `${process.argv[1]} agent auth`;
|
|
2213
|
+
try {
|
|
2214
|
+
execSync(`osascript -e '
|
|
1831
2215
|
tell application "iTerm"
|
|
1832
2216
|
tell current window
|
|
1833
2217
|
create tab with default profile
|
|
@@ -1837,40 +2221,41 @@ export default class WorkStart extends PMOCommand {
|
|
|
1837
2221
|
end tell
|
|
1838
2222
|
end tell
|
|
1839
2223
|
'`);
|
|
1840
|
-
}
|
|
1841
|
-
catch {
|
|
1842
|
-
// Fallback: try Terminal.app
|
|
1843
|
-
try {
|
|
1844
|
-
execSync(`osascript -e 'tell application "Terminal" to do script "${authCmd}"'`);
|
|
1845
2224
|
}
|
|
1846
2225
|
catch {
|
|
1847
|
-
|
|
1848
|
-
|
|
2226
|
+
// Fallback: try Terminal.app
|
|
2227
|
+
try {
|
|
2228
|
+
execSync(`osascript -e 'tell application "Terminal" to do script "${authCmd}"'`);
|
|
2229
|
+
}
|
|
2230
|
+
catch {
|
|
2231
|
+
this.log(styles.warning('Could not open new terminal tab.'));
|
|
2232
|
+
this.log(styles.muted(`Please run manually: ${authCmd}`));
|
|
2233
|
+
}
|
|
2234
|
+
}
|
|
2235
|
+
this.log(styles.muted('Complete the /login flow in the new tab, then press Enter here...'));
|
|
2236
|
+
this.log('');
|
|
2237
|
+
// Wait for user to complete auth
|
|
2238
|
+
await this.prompt([{
|
|
2239
|
+
type: 'input',
|
|
2240
|
+
name: 'done',
|
|
2241
|
+
message: 'Press Enter when authentication is complete:',
|
|
2242
|
+
}], batchJsonModeConfig);
|
|
2243
|
+
// Check if credentials now exist
|
|
2244
|
+
if (!dockerCredentialsExist()) {
|
|
2245
|
+
this.log('');
|
|
2246
|
+
this.log(styles.warning('Authentication did not complete. No credentials found.'));
|
|
2247
|
+
db.close();
|
|
2248
|
+
return;
|
|
2249
|
+
}
|
|
2250
|
+
const info = getDockerCredentialInfo();
|
|
2251
|
+
this.log('');
|
|
2252
|
+
this.log(styles.success('✓ Credentials configured'));
|
|
2253
|
+
if (info) {
|
|
2254
|
+
this.log(styles.muted(` Subscription: ${info.subscriptionType || 'unknown'}`));
|
|
2255
|
+
this.log(styles.muted(` Expires: ${info.expiresAt.toLocaleDateString()}`));
|
|
1849
2256
|
}
|
|
1850
|
-
}
|
|
1851
|
-
this.log(styles.muted('Complete the /login flow in the new tab, then press Enter here...'));
|
|
1852
|
-
this.log('');
|
|
1853
|
-
// Wait for user to complete auth
|
|
1854
|
-
await this.prompt([{
|
|
1855
|
-
type: 'input',
|
|
1856
|
-
name: 'done',
|
|
1857
|
-
message: 'Press Enter when authentication is complete:',
|
|
1858
|
-
}], batchJsonModeConfig);
|
|
1859
|
-
// Check if credentials now exist
|
|
1860
|
-
if (!dockerCredentialsExist()) {
|
|
1861
2257
|
this.log('');
|
|
1862
|
-
this.log(styles.warning('Authentication did not complete. No credentials found.'));
|
|
1863
|
-
db.close();
|
|
1864
|
-
return;
|
|
1865
|
-
}
|
|
1866
|
-
const info = getDockerCredentialInfo();
|
|
1867
|
-
this.log('');
|
|
1868
|
-
this.log(styles.success('✓ Credentials configured'));
|
|
1869
|
-
if (info) {
|
|
1870
|
-
this.log(styles.muted(` Subscription: ${info.subscriptionType || 'unknown'}`));
|
|
1871
|
-
this.log(styles.muted(` Expires: ${info.expiresAt.toLocaleDateString()}`));
|
|
1872
2258
|
}
|
|
1873
|
-
this.log('');
|
|
1874
2259
|
}
|
|
1875
2260
|
}
|
|
1876
2261
|
}
|
|
@@ -2027,6 +2412,7 @@ export default class WorkStart extends PMOCommand {
|
|
|
2027
2412
|
}
|
|
2028
2413
|
}
|
|
2029
2414
|
// Create execution record
|
|
2415
|
+
const ticketExternalMetadata = getTicketExternalMetadata(ticket);
|
|
2030
2416
|
const execution = executionStorage.createExecution({
|
|
2031
2417
|
ticketId: ticket.id,
|
|
2032
2418
|
agentName,
|
|
@@ -2035,6 +2421,10 @@ export default class WorkStart extends PMOCommand {
|
|
|
2035
2421
|
displayMode,
|
|
2036
2422
|
permissionMode,
|
|
2037
2423
|
branch,
|
|
2424
|
+
externalSource: ticketExternalMetadata.source,
|
|
2425
|
+
externalKey: ticketExternalMetadata.key,
|
|
2426
|
+
externalId: ticketExternalMetadata.id,
|
|
2427
|
+
externalUrl: ticketExternalMetadata.url,
|
|
2038
2428
|
});
|
|
2039
2429
|
// Note: Ticket status update moved to after successful spawn
|
|
2040
2430
|
// Load execution config
|
|
@@ -2077,3 +2467,4 @@ export default class WorkStart extends PMOCommand {
|
|
|
2077
2467
|
}
|
|
2078
2468
|
}
|
|
2079
2469
|
}
|
|
2470
|
+
//# sourceMappingURL=start.js.map
|