@proletariat/cli 0.3.92 → 0.3.94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/action/create.d.ts +1 -1
- package/dist/commands/action/delete.d.ts +1 -1
- package/dist/commands/action/index.d.ts +1 -1
- package/dist/commands/action/list.d.ts +1 -1
- package/dist/commands/action/run.d.ts +1 -1
- package/dist/commands/action/show.d.ts +1 -1
- package/dist/commands/action/update.d.ts +1 -1
- package/dist/commands/agent/auth.js +2 -6
- package/dist/commands/agent/auth.js.map +1 -1
- package/dist/commands/agent/cleanup.d.ts +1 -1
- package/dist/commands/agent/cleanup.js +5 -5
- package/dist/commands/agent/cleanup.js.map +1 -1
- package/dist/commands/{project/list.d.ts → agent/gc.d.ts} +4 -3
- package/dist/commands/agent/gc.js +75 -0
- package/dist/commands/agent/gc.js.map +1 -0
- package/dist/commands/agent/index.d.ts +1 -1
- package/dist/commands/agent/list.d.ts +1 -1
- package/dist/commands/agent/list.js +2 -2
- package/dist/commands/agent/list.js.map +1 -1
- package/dist/commands/agent/login.d.ts +1 -1
- package/dist/commands/agent/rebuild.d.ts +1 -1
- package/dist/commands/agent/remove.d.ts +1 -1
- package/dist/commands/agent/restart.d.ts +1 -1
- package/dist/commands/agent/shell.d.ts +1 -1
- package/dist/commands/agent/shell.js +3 -5
- package/dist/commands/agent/shell.js.map +1 -1
- package/dist/commands/agent/staff/index.d.ts +1 -1
- package/dist/commands/agent/staff/remove.d.ts +1 -1
- package/dist/commands/agent/status.d.ts +1 -1
- package/dist/commands/agent/visit.d.ts +1 -1
- package/dist/commands/asana/import.d.ts +1 -1
- package/dist/commands/branch/create.d.ts +1 -1
- package/dist/commands/branch/create.js +2 -2
- package/dist/commands/branch/create.js.map +1 -1
- package/dist/commands/branch/index.d.ts +1 -1
- package/dist/commands/branch/list.d.ts +1 -1
- package/dist/commands/branch/validate.d.ts +1 -1
- package/dist/commands/branch/where.d.ts +1 -1
- package/dist/commands/claude/index.js +2 -2
- package/dist/commands/claude/index.js.map +1 -1
- package/dist/commands/claude/open.js +11 -5
- package/dist/commands/claude/open.js.map +1 -1
- package/dist/commands/config/index.js +88 -7
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/db/repair.js +2 -2
- package/dist/commands/db/repair.js.map +1 -1
- package/dist/commands/diet.d.ts +1 -1
- package/dist/commands/docker/clean.js +2 -4
- package/dist/commands/docker/clean.js.map +1 -1
- package/dist/commands/docker/index.js +4 -4
- package/dist/commands/docker/index.js.map +1 -1
- package/dist/commands/docker/list.js +2 -4
- package/dist/commands/docker/list.js.map +1 -1
- package/dist/commands/docker/logs.js +2 -4
- package/dist/commands/docker/logs.js.map +1 -1
- package/dist/commands/docker/rebuild-cache.d.ts +12 -0
- package/dist/commands/docker/rebuild-cache.js +144 -0
- package/dist/commands/docker/rebuild-cache.js.map +1 -0
- package/dist/commands/docker/restart.js +2 -4
- package/dist/commands/docker/restart.js.map +1 -1
- package/dist/commands/docker/shell.js +2 -4
- package/dist/commands/docker/shell.js.map +1 -1
- package/dist/commands/docker/start.js +2 -4
- package/dist/commands/docker/start.js.map +1 -1
- package/dist/commands/docker/stop.js +2 -4
- package/dist/commands/docker/stop.js.map +1 -1
- package/dist/commands/docker/sync.js +2 -4
- package/dist/commands/docker/sync.js.map +1 -1
- package/dist/commands/execution/config.d.ts +1 -1
- package/dist/commands/execution/config.js +39 -0
- package/dist/commands/execution/config.js.map +1 -1
- package/dist/commands/execution/index.d.ts +1 -1
- package/dist/commands/execution/list.d.ts +1 -1
- package/dist/commands/execution/list.js +2 -4
- package/dist/commands/execution/list.js.map +1 -1
- package/dist/commands/execution/logs.d.ts +1 -1
- package/dist/commands/execution/logs.js +2 -4
- package/dist/commands/execution/logs.js.map +1 -1
- package/dist/commands/execution/stop.d.ts +1 -1
- package/dist/commands/execution/stop.js +2 -4
- package/dist/commands/execution/stop.js.map +1 -1
- package/dist/commands/execution/view.d.ts +1 -1
- package/dist/commands/execution/view.js +2 -4
- package/dist/commands/execution/view.js.map +1 -1
- package/dist/commands/gh/login.js +2 -1
- package/dist/commands/gh/login.js.map +1 -1
- package/dist/commands/gh/status.js +18 -2
- package/dist/commands/gh/status.js.map +1 -1
- package/dist/commands/{ticket/bulk.d.ts → hook/export.d.ts} +8 -5
- package/dist/commands/hook/export.js +52 -0
- package/dist/commands/hook/export.js.map +1 -0
- package/dist/commands/hook/fire.d.ts +29 -0
- package/dist/commands/hook/fire.js +139 -0
- package/dist/commands/hook/fire.js.map +1 -0
- package/dist/commands/{project → hook}/index.d.ts +5 -5
- package/dist/commands/hook/index.js +53 -0
- package/dist/commands/hook/index.js.map +1 -0
- package/dist/commands/{board/index.d.ts → hook/list.d.ts} +10 -12
- package/dist/commands/hook/list.js +136 -0
- package/dist/commands/hook/list.js.map +1 -0
- package/dist/commands/{project/archive.d.ts → hook/preset.d.ts} +11 -7
- package/dist/commands/hook/preset.js +76 -0
- package/dist/commands/hook/preset.js.map +1 -0
- package/dist/commands/linear/auth.d.ts +1 -1
- package/dist/commands/linear/connect.d.ts +1 -1
- package/dist/commands/linear/import.d.ts +1 -1
- package/dist/commands/linear/status.d.ts +1 -1
- package/dist/commands/linear/sync.d.ts +1 -1
- package/dist/commands/mcp-server.d.ts +8 -2
- package/dist/commands/mcp-server.js +17 -31
- package/dist/commands/mcp-server.js.map +1 -1
- package/dist/commands/monday/connect.d.ts +1 -1
- package/dist/commands/monday/sync.d.ts +1 -1
- package/dist/commands/orchestrate/index.d.ts +35 -0
- package/dist/commands/orchestrate/index.js +267 -0
- package/dist/commands/orchestrate/index.js.map +1 -0
- package/dist/commands/orchestrator/attach.js +2 -3
- package/dist/commands/orchestrator/attach.js.map +1 -1
- package/dist/commands/orchestrator/index.d.ts +1 -1
- package/dist/commands/orchestrator/start.d.ts +3 -3
- package/dist/commands/orchestrator/start.js +32 -43
- package/dist/commands/orchestrator/start.js.map +1 -1
- package/dist/commands/orchestrator/stop.js +21 -26
- package/dist/commands/orchestrator/stop.js.map +1 -1
- package/dist/commands/pr/checks.d.ts +1 -1
- package/dist/commands/pr/close.d.ts +1 -1
- package/dist/commands/pr/create.d.ts +1 -1
- package/dist/commands/pr/index.d.ts +1 -1
- package/dist/commands/pr/link.d.ts +1 -1
- package/dist/commands/pr/list.d.ts +1 -1
- package/dist/commands/pr/merge.d.ts +1 -1
- package/dist/commands/pr/status.d.ts +1 -1
- package/dist/commands/pull.d.ts +1 -1
- package/dist/commands/qa/index.js +3 -3
- package/dist/commands/qa/index.js.map +1 -1
- package/dist/commands/repo/add.d.ts +1 -1
- package/dist/commands/repo/create.d.ts +1 -1
- package/dist/commands/repo/fix-remotes.d.ts +1 -1
- package/dist/commands/repo/index.d.ts +1 -1
- package/dist/commands/repo/list.d.ts +1 -1
- package/dist/commands/repo/remove.d.ts +1 -1
- package/dist/commands/repo/view.d.ts +1 -1
- package/dist/commands/session/attach.d.ts +1 -1
- package/dist/commands/session/attach.js +5 -7
- package/dist/commands/session/attach.js.map +1 -1
- package/dist/commands/session/cleanup.d.ts +1 -1
- package/dist/commands/session/cleanup.js +2 -4
- package/dist/commands/session/cleanup.js.map +1 -1
- package/dist/commands/session/create.d.ts +1 -1
- package/dist/commands/session/exec.d.ts +1 -1
- package/dist/commands/session/exec.js +2 -3
- package/dist/commands/session/exec.js.map +1 -1
- package/dist/commands/session/health.d.ts +1 -1
- package/dist/commands/session/health.js +2 -4
- package/dist/commands/session/health.js.map +1 -1
- package/dist/commands/session/index.d.ts +1 -1
- package/dist/commands/session/inspect.d.ts +1 -1
- package/dist/commands/session/inspect.js +2 -3
- package/dist/commands/session/inspect.js.map +1 -1
- package/dist/commands/session/list.d.ts +1 -1
- package/dist/commands/session/list.js +2 -4
- package/dist/commands/session/list.js.map +1 -1
- package/dist/commands/session/peek.d.ts +1 -1
- package/dist/commands/session/peek.js +3 -6
- package/dist/commands/session/peek.js.map +1 -1
- package/dist/commands/session/poke.js +2 -4
- package/dist/commands/session/poke.js.map +1 -1
- package/dist/commands/session/prune.d.ts +1 -1
- package/dist/commands/session/prune.js +2 -4
- package/dist/commands/session/prune.js.map +1 -1
- package/dist/commands/session/report.d.ts +1 -1
- package/dist/commands/session/report.js +2 -4
- package/dist/commands/session/report.js.map +1 -1
- package/dist/commands/session/restart.d.ts +1 -1
- package/dist/commands/session/restart.js +2 -3
- package/dist/commands/session/restart.js.map +1 -1
- package/dist/commands/shortcut/connect.d.ts +1 -1
- package/dist/commands/support/logs.d.ts +1 -1
- package/dist/commands/ticket/create.d.ts +4 -5
- package/dist/commands/ticket/create.js +69 -88
- package/dist/commands/ticket/create.js.map +1 -1
- package/dist/commands/ticket/delete.d.ts +1 -1
- package/dist/commands/ticket/edit.d.ts +1 -1
- package/dist/commands/ticket/edit.js +22 -14
- package/dist/commands/ticket/edit.js.map +1 -1
- package/dist/commands/ticket/index.d.ts +1 -1
- package/dist/commands/ticket/index.js +6 -36
- package/dist/commands/ticket/index.js.map +1 -1
- package/dist/commands/ticket/list.d.ts +1 -1
- package/dist/commands/ticket/move.d.ts +1 -1
- package/dist/commands/ticket/show.d.ts +8 -7
- package/dist/commands/ticket/show.js +101 -8
- package/dist/commands/ticket/show.js.map +1 -1
- package/dist/commands/ticket/update.d.ts +1 -1
- package/dist/commands/ticket/update.js +31 -14
- package/dist/commands/ticket/update.js.map +1 -1
- package/dist/commands/trello/configure.d.ts +1 -1
- package/dist/commands/trello/import.d.ts +1 -1
- package/dist/commands/trello/sync.d.ts +1 -1
- package/dist/commands/work/asana.d.ts +1 -1
- package/dist/commands/work/complete.d.ts +1 -1
- package/dist/commands/work/complete.js +2 -3
- package/dist/commands/work/complete.js.map +1 -1
- package/dist/commands/work/groom.d.ts +1 -1
- package/dist/commands/work/hooks/add.d.ts +1 -1
- package/dist/commands/work/hooks/add.js +2 -4
- package/dist/commands/work/hooks/add.js.map +1 -1
- package/dist/commands/work/hooks/index.d.ts +1 -1
- package/dist/commands/work/hooks/list.d.ts +1 -1
- package/dist/commands/work/hooks/list.js +2 -4
- package/dist/commands/work/hooks/list.js.map +1 -1
- package/dist/commands/work/hooks/remove.d.ts +1 -1
- package/dist/commands/work/hooks/remove.js +2 -4
- package/dist/commands/work/hooks/remove.js.map +1 -1
- package/dist/commands/work/hooks/toggle.d.ts +1 -1
- package/dist/commands/work/hooks/toggle.js +2 -4
- package/dist/commands/work/hooks/toggle.js.map +1 -1
- package/dist/commands/work/implement.d.ts +1 -1
- package/dist/commands/work/index.d.ts +1 -1
- package/dist/commands/work/index.js +4 -0
- package/dist/commands/work/index.js.map +1 -1
- package/dist/commands/work/jira.d.ts +1 -1
- package/dist/commands/work/linear.d.ts +1 -1
- package/dist/commands/work/peek.d.ts +1 -1
- package/dist/commands/work/ready.d.ts +1 -1
- package/dist/commands/work/ready.js +2 -3
- package/dist/commands/work/ready.js.map +1 -1
- package/dist/commands/work/rebase.d.ts +33 -0
- package/dist/commands/work/rebase.js +394 -0
- package/dist/commands/work/rebase.js.map +1 -0
- package/dist/commands/work/resolve.d.ts +1 -1
- package/dist/commands/work/review.d.ts +1 -1
- package/dist/commands/work/ship.d.ts +2 -1
- package/dist/commands/work/ship.js +49 -4
- package/dist/commands/work/ship.js.map +1 -1
- package/dist/commands/work/shortcut.d.ts +1 -1
- package/dist/commands/work/source/set.d.ts +1 -1
- package/dist/commands/work/source.d.ts +1 -1
- package/dist/commands/work/spawn.d.ts +1 -1
- package/dist/commands/work/spawn.js +2 -4
- package/dist/commands/work/spawn.js.map +1 -1
- package/dist/commands/work/start.d.ts +8 -1
- package/dist/commands/work/start.js +190 -22
- package/dist/commands/work/start.js.map +1 -1
- package/dist/commands/work/status.d.ts +1 -1
- package/dist/commands/work/stop.d.ts +1 -1
- package/dist/commands/work/stop.js +2 -4
- package/dist/commands/work/stop.js.map +1 -1
- package/dist/commands/work/watch.d.ts +1 -1
- package/dist/commands/work/watch.js +2 -4
- package/dist/commands/work/watch.js.map +1 -1
- package/dist/hooks/init.js +2 -2
- package/dist/hooks/init.js.map +1 -1
- package/dist/lib/agents/commands.d.ts +9 -3
- package/dist/lib/agents/commands.js +103 -88
- package/dist/lib/agents/commands.js.map +1 -1
- package/dist/lib/asana/config.js +13 -7
- package/dist/lib/asana/config.js.map +1 -1
- package/dist/lib/clickup/client.d.ts +92 -0
- package/dist/lib/clickup/client.js +150 -0
- package/dist/lib/clickup/client.js.map +1 -0
- package/dist/lib/clickup/config.d.ts +41 -0
- package/dist/lib/clickup/config.js +104 -0
- package/dist/lib/clickup/config.js.map +1 -0
- package/dist/lib/clickup/index.d.ts +4 -0
- package/dist/lib/clickup/index.js +4 -0
- package/dist/lib/clickup/index.js.map +1 -0
- package/dist/lib/clickup/types.d.ts +104 -0
- package/dist/lib/clickup/types.js +34 -0
- package/dist/lib/clickup/types.js.map +1 -0
- package/dist/lib/dashboard/server.js +1 -1
- package/dist/lib/dashboard/server.js.map +1 -1
- package/dist/lib/database/agents.d.ts +62 -4
- package/dist/lib/database/agents.js +161 -8
- package/dist/lib/database/agents.js.map +1 -1
- package/dist/lib/database/credential-store.d.ts +64 -0
- package/dist/lib/database/credential-store.js +306 -0
- package/dist/lib/database/credential-store.js.map +1 -0
- package/dist/lib/database/db-safety.js +4 -4
- package/dist/lib/database/db-safety.js.map +1 -1
- package/dist/lib/database/drizzle-schema.d.ts +2 -2
- package/dist/lib/database/drizzle-schema.js +2 -1
- package/dist/lib/database/drizzle-schema.js.map +1 -1
- package/dist/lib/database/index.d.ts +2 -1
- package/dist/lib/database/index.js +3 -1
- package/dist/lib/database/index.js.map +1 -1
- package/dist/lib/database/migrations/0013_agent_lifecycle_states.d.ts +11 -0
- package/dist/lib/database/migrations/0013_agent_lifecycle_states.js +47 -0
- package/dist/lib/database/migrations/0013_agent_lifecycle_states.js.map +1 -0
- package/dist/lib/database/migrations/0014_agent_work_lifecycle.d.ts +10 -0
- package/dist/lib/database/migrations/0014_agent_work_lifecycle.js +31 -0
- package/dist/lib/database/migrations/0014_agent_work_lifecycle.js.map +1 -0
- package/dist/lib/database/migrations/0015_orchestrate_hooks.d.ts +8 -0
- package/dist/lib/database/migrations/0015_orchestrate_hooks.js +35 -0
- package/dist/lib/database/migrations/0015_orchestrate_hooks.js.map +1 -0
- package/dist/lib/database/migrations/0016_schema_catchup.d.ts +15 -0
- package/dist/lib/database/migrations/0016_schema_catchup.js +154 -0
- package/dist/lib/database/migrations/0016_schema_catchup.js.map +1 -0
- package/dist/lib/database/migrations/index.js +8 -0
- package/dist/lib/database/migrations/index.js.map +1 -1
- package/dist/lib/database/pmo-bootstrap.d.ts +7 -0
- package/dist/lib/database/pmo-bootstrap.js +47 -22
- package/dist/lib/database/pmo-bootstrap.js.map +1 -1
- package/dist/lib/database/workspace-schema.d.ts +1 -1
- package/dist/lib/database/workspace-schema.js +3 -1
- package/dist/lib/database/workspace-schema.js.map +1 -1
- package/dist/lib/database/workspace.js +4 -0
- package/dist/lib/database/workspace.js.map +1 -1
- package/dist/lib/events/events.d.ts +28 -0
- package/dist/lib/events/index.d.ts +1 -1
- package/dist/lib/events/index.js.map +1 -1
- package/dist/lib/execution/config.d.ts +2 -0
- package/dist/lib/execution/config.js +14 -0
- package/dist/lib/execution/config.js.map +1 -1
- package/dist/lib/execution/devcontainer.js +51 -0
- package/dist/lib/execution/devcontainer.js.map +1 -1
- package/dist/lib/execution/runners/devcontainer-tmux.js +1 -1
- package/dist/lib/execution/runners/devcontainer-tmux.js.map +1 -1
- package/dist/lib/execution/runners/devcontainer.js +9 -1
- package/dist/lib/execution/runners/devcontainer.js.map +1 -1
- package/dist/lib/execution/runners/docker-credentials.d.ts +8 -0
- package/dist/lib/execution/runners/docker-credentials.js +20 -3
- package/dist/lib/execution/runners/docker-credentials.js.map +1 -1
- package/dist/lib/execution/runners/docker-management.d.ts +54 -0
- package/dist/lib/execution/runners/docker-management.js +194 -7
- package/dist/lib/execution/runners/docker-management.js.map +1 -1
- package/dist/lib/execution/runners/index.d.ts +1 -1
- package/dist/lib/execution/runners/index.js +1 -1
- package/dist/lib/execution/runners/index.js.map +1 -1
- package/dist/lib/execution/runners/shared.d.ts +23 -1
- package/dist/lib/execution/runners/shared.js +112 -1
- package/dist/lib/execution/runners/shared.js.map +1 -1
- package/dist/lib/execution/session-utils.d.ts +4 -0
- package/dist/lib/execution/session-utils.js +34 -24
- package/dist/lib/execution/session-utils.js.map +1 -1
- package/dist/lib/execution/spawner.js +8 -1
- package/dist/lib/execution/spawner.js.map +1 -1
- package/dist/lib/execution/types.js +1 -1
- package/dist/lib/external-issues/types.d.ts +3 -3
- package/dist/lib/external-issues/types.js +1 -1
- package/dist/lib/external-issues/types.js.map +1 -1
- package/dist/lib/jira/config.js +10 -4
- package/dist/lib/jira/config.js.map +1 -1
- package/dist/lib/linear/client.d.ts +13 -0
- package/dist/lib/linear/client.js +37 -0
- package/dist/lib/linear/client.js.map +1 -1
- package/dist/lib/linear/config.js +13 -8
- package/dist/lib/linear/config.js.map +1 -1
- package/dist/lib/mcp/generator.d.ts +26 -0
- package/dist/lib/mcp/generator.js +219 -0
- package/dist/lib/mcp/generator.js.map +1 -0
- package/dist/lib/mcp/index.d.ts +1 -0
- package/dist/lib/mcp/index.js +1 -0
- package/dist/lib/mcp/index.js.map +1 -1
- package/dist/lib/mcp/tools/index.d.ts +0 -11
- package/dist/lib/mcp/tools/index.js +0 -11
- package/dist/lib/mcp/tools/index.js.map +1 -1
- package/dist/lib/mcp/tools/overrides/index.d.ts +23 -0
- package/dist/lib/mcp/tools/overrides/index.js +30 -0
- package/dist/lib/mcp/tools/overrides/index.js.map +1 -0
- package/dist/lib/mcp/tools/overrides/tmux.d.ts +11 -0
- package/dist/lib/mcp/tools/overrides/tmux.js +184 -0
- package/dist/lib/mcp/tools/overrides/tmux.js.map +1 -0
- package/dist/lib/mcp/tools/overrides/work-start.d.ts +12 -0
- package/dist/lib/mcp/tools/overrides/work-start.js +108 -0
- package/dist/lib/mcp/tools/overrides/work-start.js.map +1 -0
- package/dist/lib/mcp/tools/ticket.js +10 -48
- package/dist/lib/mcp/tools/ticket.js.map +1 -1
- package/dist/lib/monday/config.js +11 -5
- package/dist/lib/monday/config.js.map +1 -1
- package/dist/lib/orchestrate/actions.d.ts +20 -0
- package/dist/lib/orchestrate/actions.js +194 -0
- package/dist/lib/orchestrate/actions.js.map +1 -0
- package/dist/lib/orchestrate/config-loader.d.ts +31 -0
- package/dist/lib/orchestrate/config-loader.js +201 -0
- package/dist/lib/orchestrate/config-loader.js.map +1 -0
- package/dist/lib/orchestrate/engine.d.ts +94 -0
- package/dist/lib/orchestrate/engine.js +290 -0
- package/dist/lib/orchestrate/engine.js.map +1 -0
- package/dist/lib/orchestrate/index.d.ts +16 -0
- package/dist/lib/orchestrate/index.js +14 -0
- package/dist/lib/orchestrate/index.js.map +1 -0
- package/dist/lib/orchestrate/poller.d.ts +58 -0
- package/dist/lib/orchestrate/poller.js +282 -0
- package/dist/lib/orchestrate/poller.js.map +1 -0
- package/dist/lib/orchestrate/presets.d.ts +27 -0
- package/dist/lib/orchestrate/presets.js +65 -0
- package/dist/lib/orchestrate/presets.js.map +1 -0
- package/dist/lib/orchestrate/types.d.ts +93 -0
- package/dist/lib/orchestrate/types.js +46 -0
- package/dist/lib/orchestrate/types.js.map +1 -0
- package/dist/lib/pmo/base-command.d.ts +20 -152
- package/dist/lib/pmo/base-command.js +32 -198
- package/dist/lib/pmo/base-command.js.map +1 -1
- package/dist/lib/pmo/index.d.ts +1 -0
- package/dist/lib/pmo/index.js +3 -0
- package/dist/lib/pmo/index.js.map +1 -1
- package/dist/lib/pmo/storage/base.d.ts +0 -18
- package/dist/lib/pmo/storage/base.js +0 -231
- package/dist/lib/pmo/storage/base.js.map +1 -1
- package/dist/lib/pmo/storage/index.d.ts +1 -76
- package/dist/lib/pmo/storage/index.js +1 -215
- package/dist/lib/pmo/storage/index.js.map +1 -1
- package/dist/lib/pmo/storage/specs.js.map +1 -1
- package/dist/lib/pmo/storage/tickets.d.ts +2 -2
- package/dist/lib/pmo/storage/tickets.js +4 -34
- package/dist/lib/pmo/storage/tickets.js.map +1 -1
- package/dist/lib/pmo/types.d.ts +0 -37
- package/dist/lib/pr/index.d.ts +28 -0
- package/dist/lib/pr/index.js +100 -0
- package/dist/lib/pr/index.js.map +1 -1
- package/dist/lib/providers/clickup-provider.d.ts +28 -0
- package/dist/lib/providers/clickup-provider.js +353 -0
- package/dist/lib/providers/clickup-provider.js.map +1 -0
- package/dist/lib/providers/event-emitting-provider.d.ts +4 -2
- package/dist/lib/providers/event-emitting-provider.js +12 -0
- package/dist/lib/providers/event-emitting-provider.js.map +1 -1
- package/dist/lib/providers/index.d.ts +1 -1
- package/dist/lib/providers/index.js.map +1 -1
- package/dist/lib/providers/linear-provider.d.ts +4 -2
- package/dist/lib/providers/linear-provider.js +106 -0
- package/dist/lib/providers/linear-provider.js.map +1 -1
- package/dist/lib/providers/pmo-provider.d.ts +4 -2
- package/dist/lib/providers/pmo-provider.js +26 -0
- package/dist/lib/providers/pmo-provider.js.map +1 -1
- package/dist/lib/providers/resolver.d.ts +1 -1
- package/dist/lib/providers/resolver.js +16 -5
- package/dist/lib/providers/resolver.js.map +1 -1
- package/dist/lib/providers/types.d.ts +31 -2
- package/dist/lib/runners/claude-code-runner.js +13 -4
- package/dist/lib/runners/claude-code-runner.js.map +1 -1
- package/dist/lib/runtime-command.d.ts +219 -0
- package/dist/lib/runtime-command.js +320 -0
- package/dist/lib/runtime-command.js.map +1 -0
- package/dist/lib/shortcut/config.js +13 -7
- package/dist/lib/shortcut/config.js.map +1 -1
- package/dist/lib/telemetry/analytics.d.ts +1 -1
- package/dist/lib/telemetry/analytics.js +16 -8
- package/dist/lib/telemetry/analytics.js.map +1 -1
- package/dist/lib/trello/config.js +17 -12
- package/dist/lib/trello/config.js.map +1 -1
- package/dist/lib/update-check.d.ts +8 -3
- package/dist/lib/update-check.js +16 -5
- package/dist/lib/update-check.js.map +1 -1
- package/dist/lib/work-lifecycle/events.d.ts +1 -1
- package/dist/lib/work-lifecycle/hooks/types.d.ts +3 -2
- package/dist/lib/work-lifecycle/hooks/types.js +12 -0
- package/dist/lib/work-lifecycle/hooks/types.js.map +1 -1
- package/dist/lib/work-source/config.d.ts +1 -1
- package/dist/lib/work-source/config.js +11 -1
- package/dist/lib/work-source/config.js.map +1 -1
- package/dist/lib/work-source/provider-sources.js +6 -1
- package/dist/lib/work-source/provider-sources.js.map +1 -1
- package/oclif.manifest.json +2682 -3839
- package/package.json +1 -1
- package/dist/commands/board/index.js +0 -263
- package/dist/commands/board/index.js.map +0 -1
- package/dist/commands/board/view.d.ts +0 -15
- package/dist/commands/board/view.js +0 -137
- package/dist/commands/board/view.js.map +0 -1
- package/dist/commands/board/watch.d.ts +0 -15
- package/dist/commands/board/watch.js +0 -59
- package/dist/commands/board/watch.js.map +0 -1
- package/dist/commands/dashboard/index.d.ts +0 -14
- package/dist/commands/dashboard/index.js +0 -117
- package/dist/commands/dashboard/index.js.map +0 -1
- package/dist/commands/dashboard.d.ts +0 -38
- package/dist/commands/dashboard.js +0 -353
- package/dist/commands/dashboard.js.map +0 -1
- package/dist/commands/pmo/init.d.ts +0 -28
- package/dist/commands/pmo/init.js +0 -410
- package/dist/commands/pmo/init.js.map +0 -1
- package/dist/commands/project/archive.js +0 -79
- package/dist/commands/project/archive.js.map +0 -1
- package/dist/commands/project/create.d.ts +0 -24
- package/dist/commands/project/create.js +0 -191
- package/dist/commands/project/create.js.map +0 -1
- package/dist/commands/project/delete.d.ts +0 -18
- package/dist/commands/project/delete.js +0 -115
- package/dist/commands/project/delete.js.map +0 -1
- package/dist/commands/project/index.js +0 -60
- package/dist/commands/project/index.js.map +0 -1
- package/dist/commands/project/list.js +0 -115
- package/dist/commands/project/list.js.map +0 -1
- package/dist/commands/project/spec.d.ts +0 -19
- package/dist/commands/project/spec.js +0 -218
- package/dist/commands/project/spec.js.map +0 -1
- package/dist/commands/project/unarchive.d.ts +0 -17
- package/dist/commands/project/unarchive.js +0 -55
- package/dist/commands/project/unarchive.js.map +0 -1
- package/dist/commands/project/update.d.ts +0 -19
- package/dist/commands/project/update.js +0 -161
- package/dist/commands/project/update.js.map +0 -1
- package/dist/commands/project/view.d.ts +0 -17
- package/dist/commands/project/view.js +0 -107
- package/dist/commands/project/view.js.map +0 -1
- package/dist/commands/ticket/bulk.js +0 -141
- package/dist/commands/ticket/bulk.js.map +0 -1
- package/dist/commands/ticket/cancel.d.ts +0 -17
- package/dist/commands/ticket/cancel.js +0 -206
- package/dist/commands/ticket/cancel.js.map +0 -1
- package/dist/commands/ticket/category.d.ts +0 -15
- package/dist/commands/ticket/category.js +0 -64
- package/dist/commands/ticket/category.js.map +0 -1
- package/dist/commands/ticket/complete.d.ts +0 -17
- package/dist/commands/ticket/complete.js +0 -178
- package/dist/commands/ticket/complete.js.map +0 -1
- package/dist/commands/ticket/epic.d.ts +0 -21
- package/dist/commands/ticket/epic.js +0 -306
- package/dist/commands/ticket/epic.js.map +0 -1
- package/dist/commands/ticket/link/block.d.ts +0 -15
- package/dist/commands/ticket/link/block.js +0 -96
- package/dist/commands/ticket/link/block.js.map +0 -1
- package/dist/commands/ticket/link/duplicates.d.ts +0 -15
- package/dist/commands/ticket/link/duplicates.js +0 -96
- package/dist/commands/ticket/link/duplicates.js.map +0 -1
- package/dist/commands/ticket/link/index.d.ts +0 -14
- package/dist/commands/ticket/link/index.js +0 -99
- package/dist/commands/ticket/link/index.js.map +0 -1
- package/dist/commands/ticket/link/relates.d.ts +0 -15
- package/dist/commands/ticket/link/relates.js +0 -96
- package/dist/commands/ticket/link/relates.js.map +0 -1
- package/dist/commands/ticket/project.d.ts +0 -19
- package/dist/commands/ticket/project.js +0 -257
- package/dist/commands/ticket/project.js.map +0 -1
- package/dist/commands/ticket/reassign.d.ts +0 -20
- package/dist/commands/ticket/reassign.js +0 -311
- package/dist/commands/ticket/reassign.js.map +0 -1
- package/dist/commands/ticket/resolve.d.ts +0 -68
- package/dist/commands/ticket/resolve.js +0 -296
- package/dist/commands/ticket/resolve.js.map +0 -1
- package/dist/commands/ticket/spec.d.ts +0 -19
- package/dist/commands/ticket/spec.js +0 -260
- package/dist/commands/ticket/spec.js.map +0 -1
- package/dist/commands/ticket/status.d.ts +0 -14
- package/dist/commands/ticket/status.js +0 -84
- package/dist/commands/ticket/status.js.map +0 -1
- package/dist/commands/ticket/view.d.ts +0 -14
- package/dist/commands/ticket/view.js +0 -109
- package/dist/commands/ticket/view.js.map +0 -1
- package/dist/lib/mcp/tools/board.d.ts +0 -6
- package/dist/lib/mcp/tools/board.js +0 -190
- package/dist/lib/mcp/tools/board.js.map +0 -1
- package/dist/lib/mcp/tools/category.d.ts +0 -6
- package/dist/lib/mcp/tools/category.js +0 -85
- package/dist/lib/mcp/tools/category.js.map +0 -1
- package/dist/lib/mcp/tools/epic.d.ts +0 -6
- package/dist/lib/mcp/tools/epic.js +0 -184
- package/dist/lib/mcp/tools/epic.js.map +0 -1
- package/dist/lib/mcp/tools/label.d.ts +0 -6
- package/dist/lib/mcp/tools/label.js +0 -339
- package/dist/lib/mcp/tools/label.js.map +0 -1
- package/dist/lib/mcp/tools/phase.d.ts +0 -6
- package/dist/lib/mcp/tools/phase.js +0 -132
- package/dist/lib/mcp/tools/phase.js.map +0 -1
- package/dist/lib/mcp/tools/project.d.ts +0 -6
- package/dist/lib/mcp/tools/project.js +0 -197
- package/dist/lib/mcp/tools/project.js.map +0 -1
- package/dist/lib/mcp/tools/roadmap.d.ts +0 -6
- package/dist/lib/mcp/tools/roadmap.js +0 -124
- package/dist/lib/mcp/tools/roadmap.js.map +0 -1
- package/dist/lib/mcp/tools/status.d.ts +0 -6
- package/dist/lib/mcp/tools/status.js +0 -110
- package/dist/lib/mcp/tools/status.js.map +0 -1
- package/dist/lib/mcp/tools/template.d.ts +0 -6
- package/dist/lib/mcp/tools/template.js +0 -108
- package/dist/lib/mcp/tools/template.js.map +0 -1
- package/dist/lib/mcp/tools/view.d.ts +0 -6
- package/dist/lib/mcp/tools/view.js +0 -77
- package/dist/lib/mcp/tools/view.js.map +0 -1
- package/dist/lib/mcp/tools/workflow.d.ts +0 -6
- package/dist/lib/mcp/tools/workflow.js +0 -96
- package/dist/lib/mcp/tools/workflow.js.map +0 -1
- package/dist/lib/pmo/storage/categories.d.ts +0 -50
- package/dist/lib/pmo/storage/categories.js +0 -206
- package/dist/lib/pmo/storage/categories.js.map +0 -1
- package/dist/lib/pmo/storage/labels.d.ts +0 -55
- package/dist/lib/pmo/storage/labels.js +0 -347
- package/dist/lib/pmo/storage/labels.js.map +0 -1
- package/dist/lib/pmo/storage/phases.d.ts +0 -65
- package/dist/lib/pmo/storage/phases.js +0 -393
- package/dist/lib/pmo/storage/phases.js.map +0 -1
- package/dist/lib/pmo/storage/roadmaps.d.ts +0 -64
- package/dist/lib/pmo/storage/roadmaps.js +0 -373
- package/dist/lib/pmo/storage/roadmaps.js.map +0 -1
- package/dist/lib/pmo/storage/views.d.ts +0 -57
- package/dist/lib/pmo/storage/views.js +0 -456
- package/dist/lib/pmo/storage/views.js.map +0 -1
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
-
/**
|
|
3
|
-
* Canonical question format regex for parsing Q1/Q2/etc from descriptions.
|
|
4
|
-
*
|
|
5
|
-
* Matches patterns like:
|
|
6
|
-
* **Q1:** What should the timeout be?
|
|
7
|
-
* **Q2:** Should we use REST or GraphQL?
|
|
8
|
-
* Q1: What should the timeout be?
|
|
9
|
-
* Q3: How should errors be handled?
|
|
10
|
-
*
|
|
11
|
-
* Captures:
|
|
12
|
-
* - Group 1: Question number (e.g., "1", "2")
|
|
13
|
-
* - Group 2: Question text
|
|
14
|
-
*/
|
|
15
|
-
export declare const QUESTION_REGEX: RegExp;
|
|
16
|
-
/**
|
|
17
|
-
* Canonical answer format for resolved questions.
|
|
18
|
-
*
|
|
19
|
-
* Matches patterns like:
|
|
20
|
-
* **A1:** Use 30 minute timeout
|
|
21
|
-
* A1: Use 30 minute timeout
|
|
22
|
-
*/
|
|
23
|
-
export declare const ANSWER_REGEX: RegExp;
|
|
24
|
-
export interface ParsedQuestion {
|
|
25
|
-
/** Question number (e.g., 1, 2, 3) */
|
|
26
|
-
number: number;
|
|
27
|
-
/** The question text */
|
|
28
|
-
text: string;
|
|
29
|
-
/** Line index in the description where the question appears */
|
|
30
|
-
lineIndex: number;
|
|
31
|
-
/** Whether this question already has an answer */
|
|
32
|
-
answered: boolean;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Parse questions (Q1/Q2/etc) from a ticket description.
|
|
36
|
-
*
|
|
37
|
-
* @param description - The ticket description markdown
|
|
38
|
-
* @returns Array of parsed questions
|
|
39
|
-
*/
|
|
40
|
-
export declare function parseQuestions(description: string): ParsedQuestion[];
|
|
41
|
-
/**
|
|
42
|
-
* Rewrite a ticket description by injecting answers below each question.
|
|
43
|
-
*
|
|
44
|
-
* For each answered question, inserts a line like:
|
|
45
|
-
* **A1:** The answer text
|
|
46
|
-
*
|
|
47
|
-
* If an answer already exists for that question, it is replaced.
|
|
48
|
-
*
|
|
49
|
-
* @param description - The original ticket description
|
|
50
|
-
* @param answers - Map of question number to answer text
|
|
51
|
-
* @returns The rewritten description
|
|
52
|
-
*/
|
|
53
|
-
export declare function rewriteDescription(description: string, answers: Map<number, string>): string;
|
|
54
|
-
export default class TicketResolve extends PMOCommand {
|
|
55
|
-
static description: string;
|
|
56
|
-
static examples: string[];
|
|
57
|
-
static strict: boolean;
|
|
58
|
-
static args: {
|
|
59
|
-
ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
60
|
-
};
|
|
61
|
-
static flags: {
|
|
62
|
-
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
63
|
-
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
64
|
-
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
65
|
-
};
|
|
66
|
-
execute(): Promise<void>;
|
|
67
|
-
private resolveTicket;
|
|
68
|
-
}
|
|
@@ -1,296 +0,0 @@
|
|
|
1
|
-
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import { autoExportToBoard, PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
|
-
import { styles } from '../../lib/styles.js';
|
|
4
|
-
import { shouldOutputJson, outputErrorAsJson, outputSuccessAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
5
|
-
/**
|
|
6
|
-
* Canonical question format regex for parsing Q1/Q2/etc from descriptions.
|
|
7
|
-
*
|
|
8
|
-
* Matches patterns like:
|
|
9
|
-
* **Q1:** What should the timeout be?
|
|
10
|
-
* **Q2:** Should we use REST or GraphQL?
|
|
11
|
-
* Q1: What should the timeout be?
|
|
12
|
-
* Q3: How should errors be handled?
|
|
13
|
-
*
|
|
14
|
-
* Captures:
|
|
15
|
-
* - Group 1: Question number (e.g., "1", "2")
|
|
16
|
-
* - Group 2: Question text
|
|
17
|
-
*/
|
|
18
|
-
export const QUESTION_REGEX = /^\*{0,2}Q(\d+)[.:]\*{0,2}\s*(.+)$/;
|
|
19
|
-
/**
|
|
20
|
-
* Canonical answer format for resolved questions.
|
|
21
|
-
*
|
|
22
|
-
* Matches patterns like:
|
|
23
|
-
* **A1:** Use 30 minute timeout
|
|
24
|
-
* A1: Use 30 minute timeout
|
|
25
|
-
*/
|
|
26
|
-
export const ANSWER_REGEX = /^\*{0,2}A(\d+)[.:]\*{0,2}\s*(.+)$/;
|
|
27
|
-
/**
|
|
28
|
-
* Parse questions (Q1/Q2/etc) from a ticket description.
|
|
29
|
-
*
|
|
30
|
-
* @param description - The ticket description markdown
|
|
31
|
-
* @returns Array of parsed questions
|
|
32
|
-
*/
|
|
33
|
-
export function parseQuestions(description) {
|
|
34
|
-
if (!description)
|
|
35
|
-
return [];
|
|
36
|
-
const lines = description.split('\n');
|
|
37
|
-
const questions = [];
|
|
38
|
-
// First pass: find all questions
|
|
39
|
-
for (let i = 0; i < lines.length; i++) {
|
|
40
|
-
const match = lines[i].trim().match(QUESTION_REGEX);
|
|
41
|
-
if (match) {
|
|
42
|
-
questions.push({
|
|
43
|
-
number: parseInt(match[1], 10),
|
|
44
|
-
text: match[2].trim(),
|
|
45
|
-
lineIndex: i,
|
|
46
|
-
answered: false,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
// Second pass: check which questions already have answers
|
|
51
|
-
for (const question of questions) {
|
|
52
|
-
for (let i = 0; i < lines.length; i++) {
|
|
53
|
-
const match = lines[i].trim().match(ANSWER_REGEX);
|
|
54
|
-
if (match && parseInt(match[1], 10) === question.number) {
|
|
55
|
-
question.answered = true;
|
|
56
|
-
break;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return questions;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Rewrite a ticket description by injecting answers below each question.
|
|
64
|
-
*
|
|
65
|
-
* For each answered question, inserts a line like:
|
|
66
|
-
* **A1:** The answer text
|
|
67
|
-
*
|
|
68
|
-
* If an answer already exists for that question, it is replaced.
|
|
69
|
-
*
|
|
70
|
-
* @param description - The original ticket description
|
|
71
|
-
* @param answers - Map of question number to answer text
|
|
72
|
-
* @returns The rewritten description
|
|
73
|
-
*/
|
|
74
|
-
export function rewriteDescription(description, answers) {
|
|
75
|
-
if (!description || answers.size === 0)
|
|
76
|
-
return description;
|
|
77
|
-
const lines = description.split('\n');
|
|
78
|
-
const result = [];
|
|
79
|
-
for (let i = 0; i < lines.length; i++) {
|
|
80
|
-
const trimmed = lines[i].trim();
|
|
81
|
-
// Check if this line is an existing answer that we're replacing
|
|
82
|
-
const answerMatch = trimmed.match(ANSWER_REGEX);
|
|
83
|
-
if (answerMatch) {
|
|
84
|
-
const answerNum = parseInt(answerMatch[1], 10);
|
|
85
|
-
if (answers.has(answerNum)) {
|
|
86
|
-
// Replace this existing answer with the new one
|
|
87
|
-
result.push(`**A${answerNum}:** ${answers.get(answerNum)}`);
|
|
88
|
-
answers.delete(answerNum); // Mark as handled
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// Check if this line is a question
|
|
93
|
-
const questionMatch = trimmed.match(QUESTION_REGEX);
|
|
94
|
-
if (questionMatch) {
|
|
95
|
-
const questionNum = parseInt(questionMatch[1], 10);
|
|
96
|
-
result.push(lines[i]); // Keep the question line as-is
|
|
97
|
-
// Check if the next line is already an answer for this question
|
|
98
|
-
const nextLine = i + 1 < lines.length ? lines[i + 1].trim() : '';
|
|
99
|
-
const nextAnswerMatch = nextLine.match(ANSWER_REGEX);
|
|
100
|
-
if (nextAnswerMatch && parseInt(nextAnswerMatch[1], 10) === questionNum) {
|
|
101
|
-
// Next line is the answer - it will be handled in the next iteration
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
// Insert answer if we have one and it hasn't been handled yet
|
|
105
|
-
if (answers.has(questionNum)) {
|
|
106
|
-
result.push(`**A${questionNum}:** ${answers.get(questionNum)}`);
|
|
107
|
-
answers.delete(questionNum);
|
|
108
|
-
}
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
result.push(lines[i]);
|
|
112
|
-
}
|
|
113
|
-
return result.join('\n');
|
|
114
|
-
}
|
|
115
|
-
export default class TicketResolve extends PMOCommand {
|
|
116
|
-
static description = 'Resolve ambiguity questions on tickets flagged by groom';
|
|
117
|
-
static examples = [
|
|
118
|
-
'<%= config.bin %> <%= command.id %> TKT-001',
|
|
119
|
-
'<%= config.bin %> <%= command.id %> TKT-001 TKT-002',
|
|
120
|
-
'<%= config.bin %> <%= command.id %> # Interactive picker for needs-clarification tickets',
|
|
121
|
-
];
|
|
122
|
-
static strict = false;
|
|
123
|
-
static args = {
|
|
124
|
-
ticketId: Args.string({
|
|
125
|
-
description: 'Ticket ID(s) to resolve - prompts with picker if not provided',
|
|
126
|
-
required: false,
|
|
127
|
-
}),
|
|
128
|
-
};
|
|
129
|
-
static flags = {
|
|
130
|
-
...pmoBaseFlags,
|
|
131
|
-
json: Flags.boolean({
|
|
132
|
-
char: 'm',
|
|
133
|
-
aliases: ['machine'],
|
|
134
|
-
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
135
|
-
default: false,
|
|
136
|
-
}),
|
|
137
|
-
};
|
|
138
|
-
async execute() {
|
|
139
|
-
const { flags, argv } = await this.parse(TicketResolve);
|
|
140
|
-
const projectId = flags.project;
|
|
141
|
-
const jsonMode = shouldOutputJson(flags);
|
|
142
|
-
const handleError = (code, message) => {
|
|
143
|
-
if (jsonMode) {
|
|
144
|
-
outputErrorAsJson(code, message, createMetadata('ticket resolve', flags));
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
this.error(message);
|
|
148
|
-
};
|
|
149
|
-
// Collect ticket IDs from argv (supports multiple args)
|
|
150
|
-
let ticketIds = argv.filter(a => !a.startsWith('-'));
|
|
151
|
-
if (ticketIds.length === 0) {
|
|
152
|
-
// No tickets specified - show picker of needs-clarification tickets
|
|
153
|
-
const allTickets = await this.storage.listTickets(projectId);
|
|
154
|
-
const clarificationTickets = allTickets.filter((t) => t.labels.includes('needs-clarification') ||
|
|
155
|
-
t.statusName?.toLowerCase() === 'needs clarification');
|
|
156
|
-
if (clarificationTickets.length === 0) {
|
|
157
|
-
return handleError('NO_TICKETS', 'No tickets need clarification. Run "prlt work start --action groom" to groom tickets first.');
|
|
158
|
-
}
|
|
159
|
-
const selected = await this.selectFromList({
|
|
160
|
-
message: 'Select ticket to resolve:',
|
|
161
|
-
items: clarificationTickets,
|
|
162
|
-
getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
|
|
163
|
-
getValue: (t) => t.id,
|
|
164
|
-
getCommand: (t) => `prlt ticket resolve ${t.id}${projectId ? ` -P ${projectId}` : ''} --json`,
|
|
165
|
-
jsonMode: jsonMode ? { flags, commandName: 'ticket resolve' } : null,
|
|
166
|
-
});
|
|
167
|
-
if (!selected) {
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
ticketIds = [selected];
|
|
171
|
-
}
|
|
172
|
-
// Process each ticket
|
|
173
|
-
for (const ticketId of ticketIds) {
|
|
174
|
-
// eslint-disable-next-line no-await-in-loop
|
|
175
|
-
await this.resolveTicket(ticketId, jsonMode, flags);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
async resolveTicket(ticketId, jsonMode, flags) {
|
|
179
|
-
const handleError = (code, message) => {
|
|
180
|
-
if (jsonMode) {
|
|
181
|
-
outputErrorAsJson(code, message, createMetadata('ticket resolve', flags));
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
this.error(message);
|
|
185
|
-
};
|
|
186
|
-
// Fetch the ticket
|
|
187
|
-
const ticket = await this.storage.getTicket(ticketId);
|
|
188
|
-
if (!ticket) {
|
|
189
|
-
return handleError('TICKET_NOT_FOUND', `Ticket "${ticketId}" not found.`);
|
|
190
|
-
}
|
|
191
|
-
// Use resolved internal ID for all subsequent operations (external keys like PRLT-xxx resolve to TKT-xxx)
|
|
192
|
-
ticketId = ticket.id;
|
|
193
|
-
// Parse questions from description
|
|
194
|
-
const questions = parseQuestions(ticket.description || '');
|
|
195
|
-
const unanswered = questions.filter((q) => !q.answered);
|
|
196
|
-
if (unanswered.length === 0) {
|
|
197
|
-
if (questions.length === 0) {
|
|
198
|
-
this.log(styles.warning(`\nNo questions found in ${styles.emphasis(ticketId)}. Nothing to resolve.`));
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
this.log(styles.success(`\nAll questions in ${styles.emphasis(ticketId)} are already answered.`));
|
|
202
|
-
}
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
// JSON mode: output all questions for agent interaction
|
|
206
|
-
if (jsonMode) {
|
|
207
|
-
const questionData = unanswered.map((q) => ({
|
|
208
|
-
number: q.number,
|
|
209
|
-
text: q.text,
|
|
210
|
-
flag: `--a${q.number}`,
|
|
211
|
-
}));
|
|
212
|
-
outputSuccessAsJson({
|
|
213
|
-
ticketId,
|
|
214
|
-
title: ticket.title,
|
|
215
|
-
questions: questionData,
|
|
216
|
-
hint: `Answer questions by running: prlt ticket resolve ${ticketId} --json and providing answers interactively, or use prlt ticket edit to update the description directly.`,
|
|
217
|
-
}, createMetadata('ticket resolve', flags));
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
this.log(styles.title(`\nResolving ${unanswered.length} question(s) for ${styles.emphasis(ticketId)} - ${ticket.title}\n`));
|
|
221
|
-
// Interactive mode: prompt for each answer
|
|
222
|
-
const answers = new Map();
|
|
223
|
-
let cancelled = false;
|
|
224
|
-
for (const question of unanswered) {
|
|
225
|
-
this.log(styles.emphasis(` Q${question.number}: ${question.text}`));
|
|
226
|
-
// eslint-disable-next-line no-await-in-loop
|
|
227
|
-
const { answer } = await this.prompt([
|
|
228
|
-
{
|
|
229
|
-
type: 'input',
|
|
230
|
-
name: 'answer',
|
|
231
|
-
message: ` A${question.number}:`,
|
|
232
|
-
validate: (input) => {
|
|
233
|
-
if (!String(input).trim())
|
|
234
|
-
return 'Please provide an answer (or type "skip" to skip)';
|
|
235
|
-
return true;
|
|
236
|
-
},
|
|
237
|
-
},
|
|
238
|
-
], null);
|
|
239
|
-
if (answer.toLowerCase() === 'cancel') {
|
|
240
|
-
cancelled = true;
|
|
241
|
-
this.log(styles.warning('\nResolution cancelled.'));
|
|
242
|
-
break;
|
|
243
|
-
}
|
|
244
|
-
if (answer.toLowerCase() !== 'skip') {
|
|
245
|
-
answers.set(question.number, answer.trim());
|
|
246
|
-
}
|
|
247
|
-
this.log(''); // Blank line between questions
|
|
248
|
-
}
|
|
249
|
-
if (cancelled || answers.size === 0) {
|
|
250
|
-
if (!cancelled) {
|
|
251
|
-
this.log(styles.muted('\nNo answers provided. Nothing changed.'));
|
|
252
|
-
}
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
// Rewrite description with answers
|
|
256
|
-
const newDescription = rewriteDescription(ticket.description || '', answers);
|
|
257
|
-
// Update the ticket description
|
|
258
|
-
await this.storage.updateTicket(ticketId, { description: newDescription });
|
|
259
|
-
// Label management: remove needs-clarification, add ready
|
|
260
|
-
const currentLabels = [...ticket.labels];
|
|
261
|
-
const updatedLabels = currentLabels.filter((l) => l !== 'needs-clarification');
|
|
262
|
-
const allAnswered = answers.size === unanswered.length;
|
|
263
|
-
if (allAnswered && !updatedLabels.includes('ready')) {
|
|
264
|
-
updatedLabels.push('ready');
|
|
265
|
-
}
|
|
266
|
-
if (JSON.stringify(updatedLabels) !== JSON.stringify(currentLabels)) {
|
|
267
|
-
await this.storage.updateTicket(ticketId, { labels: updatedLabels });
|
|
268
|
-
}
|
|
269
|
-
// Move to Ready column if all questions answered and ticket has a project
|
|
270
|
-
if (allAnswered && ticket.projectId) {
|
|
271
|
-
try {
|
|
272
|
-
const project = await this.storage.getProject(ticket.projectId);
|
|
273
|
-
if (project?.workflowId) {
|
|
274
|
-
const statuses = await this.storage.listStatuses(project.workflowId);
|
|
275
|
-
// Find the "Ready" status (or first unstarted status that isn't "Needs Clarification")
|
|
276
|
-
const readyStatus = statuses.find((s) => s.name.toLowerCase() === 'ready' ||
|
|
277
|
-
(s.category === 'unstarted' && s.name.toLowerCase() !== 'needs clarification'));
|
|
278
|
-
if (readyStatus && readyStatus.name !== ticket.statusName) {
|
|
279
|
-
await this.storage.moveTicket(ticket.projectId, ticketId, readyStatus.name);
|
|
280
|
-
this.log(styles.muted(` Moved to column: ${readyStatus.name}`));
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
catch {
|
|
285
|
-
// Non-fatal: column move is best-effort
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
// Auto-export to board.md
|
|
289
|
-
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
290
|
-
this.log(styles.success(`\n✅ Resolved ${answers.size}/${unanswered.length} question(s) on ${styles.emphasis(ticketId)}`));
|
|
291
|
-
if (allAnswered) {
|
|
292
|
-
this.log(styles.muted(' Label: needs-clarification → ready'));
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
//# sourceMappingURL=resolve.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/commands/ticket/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAErF,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,mCAAmC,CAAC;AAElE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,mCAAmC,CAAC;AAahE;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAE5B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,SAAS,GAAqB,EAAE,CAAC;IAEvC,iCAAiC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,SAAS,CAAC,IAAI,CAAC;gBACb,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC9B,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBACrB,SAAS,EAAE,CAAC;gBACZ,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAClD,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACxD,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACzB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,OAA4B;IAE5B,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IAE3D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEhC,gEAAgE;QAChE,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,gDAAgD;gBAChD,MAAM,CAAC,IAAI,CAAC,MAAM,SAAS,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBAC5D,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB;gBAC7C,SAAS;YACX,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACpD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B;YAEtD,gEAAgE;YAChE,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACrD,IAAI,eAAe,IAAI,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,WAAW,EAAE,CAAC;gBACxE,qEAAqE;gBACrE,SAAS;YACX,CAAC;YAED,8DAA8D;YAC9D,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,MAAM,WAAW,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAChE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC9B,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,UAAU;IACnD,MAAM,CAAC,WAAW,GAAG,yDAAyD,CAAC;IAE/E,MAAM,CAAC,QAAQ,GAAG;QAChB,6CAA6C;QAC7C,qDAAqD;QACrD,2FAA2F;KAC5F,CAAC;IAEF,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;IAEtB,MAAM,CAAC,IAAI,GAAG;QACZ,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,+DAA+D;YAC5E,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,YAAY;QACf,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;YAClB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,CAAC,SAAS,CAAC;YACpB,WAAW,EAAE,6DAA6D;YAC1E,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACxD,MAAM,SAAS,GAAI,KAA8B,CAAC,OAAO,CAAC;QAE1D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,OAAe,EAAQ,EAAE;YAC1D,IAAI,QAAQ,EAAE,CAAC;gBACb,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC1E,OAAM;YACR,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,wDAAwD;QACxD,IAAI,SAAS,GAAc,IAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAE7E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,oEAAoE;YACpE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAC7D,MAAM,oBAAoB,GAAG,UAAU,CAAC,MAAM,CAC5C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC;gBACxC,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,qBAAqB,CACxD,CAAC;YAEF,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,OAAO,WAAW,CAChB,YAAY,EACZ,6FAA6F,CAC9F,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;gBACzC,OAAO,EAAE,2BAA2B;gBACpC,KAAK,EAAE,oBAAoB;gBAC3B,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,UAAU,GAAG;gBACxD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;gBACrB,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAChB,uBAAuB,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS;gBAC5E,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI;aACrE,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,SAAS,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAED,sBAAsB;QACtB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,4CAA4C;YAC5C,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,QAAgB,EAChB,QAAiB,EACjB,KAA8B;QAE9B,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,OAAe,EAAQ,EAAE;YAC1D,IAAI,QAAQ,EAAE,CAAC;gBACb,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC1E,OAAM;YACR,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,mBAAmB;QACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,WAAW,CAAC,kBAAkB,EAAE,WAAW,QAAQ,cAAc,CAAC,CAAC;QAC5E,CAAC;QACD,0GAA0G;QAC1G,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;QAErB,mCAAmC;QACnC,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAExD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,GAAG,CACN,MAAM,CAAC,OAAO,CACZ,2BAA2B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,uBAAuB,CAC5E,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CACN,MAAM,CAAC,OAAO,CACZ,sBAAsB,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,wBAAwB,CACxE,CACF,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QAED,wDAAwD;QACxD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1C,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE;aACvB,CAAC,CAAC,CAAC;YAEJ,mBAAmB,CACjB;gBACE,QAAQ;gBACR,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,YAAY;gBACvB,IAAI,EAAE,oDAAoD,QAAQ,0GAA0G;aAC7K,EACD,cAAc,CAAC,gBAAgB,EAAE,KAAK,CAAC,CACxC,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,CACN,MAAM,CAAC,KAAK,CACV,eAAe,UAAU,CAAC,MAAM,oBAAoB,MAAM,CAAC,QAAQ,CACjE,QAAQ,CACT,MAAM,MAAM,CAAC,KAAK,IAAI,CACxB,CACF,CAAC;QAEF,2CAA2C;QAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC1C,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAErE,4CAA4C;YAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAqB;gBACvD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,MAAM,QAAQ,CAAC,MAAM,GAAG;oBACjC,QAAQ,EAAE,CAAC,KAAc,EAAE,EAAE;wBAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;4BAAE,OAAO,mDAAmD,CAAC;wBACtF,OAAO,IAAI,CAAC;oBACd,CAAC;iBACF;aACF,EAAE,IAAI,CAAC,CAAC;YAET,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;gBACtC,SAAS,GAAG,IAAI,CAAC;gBACjB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC;gBACpD,MAAM;YACR,CAAC;YAED,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,+BAA+B;QAC/C,CAAC;QAED,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC,CAAC;YACpE,CAAC;YACD,OAAO;QACT,CAAC;QAED,mCAAmC;QACnC,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QAE7E,gCAAgC;QAChC,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;QAE3E,0DAA0D;QAC1D,MAAM,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,qBAAqB,CAAC,CAAC;QAC/E,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,CAAC;QACvD,IAAI,WAAW,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,aAAa,EAAqB,CAAC,CAAC;QAC1F,CAAC;QAED,0EAA0E;QAC1E,IAAI,WAAW,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAChE,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;oBACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBACrE,uFAAuF;oBACvF,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO;wBAChC,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,qBAAqB,CAAC,CACjF,CAAC;oBACF,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC;wBAC1D,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAC3B,MAAM,CAAC,SAAS,EAChB,QAAQ,EACR,WAAW,CAAC,IAAI,CACjB,CAAC;wBACF,IAAI,CAAC,GAAG,CACN,MAAM,CAAC,KAAK,CACV,uBAAuB,WAAW,CAAC,IAAI,EAAE,CAC1C,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wCAAwC;YAC1C,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,MAAM,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAC1D,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAC5B,CAAC;QAEF,IAAI,CAAC,GAAG,CACN,MAAM,CAAC,OAAO,CACZ,gBAAgB,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC,MAAM,mBAAmB,MAAM,CAAC,QAAQ,CACjF,QAAQ,CACT,EAAE,CACJ,CACF,CAAC;QACF,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
-
export default class TicketSpec extends PMOCommand {
|
|
3
|
-
static description: string;
|
|
4
|
-
static examples: string[];
|
|
5
|
-
static args: {
|
|
6
|
-
ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
-
specId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
-
};
|
|
9
|
-
static flags: {
|
|
10
|
-
unlink: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
-
bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
-
spec: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
-
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
-
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
-
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
-
};
|
|
17
|
-
execute(): Promise<void>;
|
|
18
|
-
private executeBulk;
|
|
19
|
-
}
|
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import { PMOCommand, pmoBaseFlags, autoExportToBoard } from '../../lib/pmo/index.js';
|
|
3
|
-
import { styles } from '../../lib/styles.js';
|
|
4
|
-
import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
5
|
-
export default class TicketSpec extends PMOCommand {
|
|
6
|
-
static description = 'Assign a spec to ticket(s)';
|
|
7
|
-
static examples = [
|
|
8
|
-
'<%= config.bin %> <%= command.id %> TKT-001 SPEC-001',
|
|
9
|
-
'<%= config.bin %> <%= command.id %> TKT-001',
|
|
10
|
-
'<%= config.bin %> <%= command.id %>',
|
|
11
|
-
'<%= config.bin %> <%= command.id %> TKT-001 --unlink',
|
|
12
|
-
'<%= config.bin %> <%= command.id %> --bulk --spec SPEC-001',
|
|
13
|
-
];
|
|
14
|
-
static args = {
|
|
15
|
-
ticketId: Args.string({
|
|
16
|
-
description: 'Ticket ID',
|
|
17
|
-
required: false,
|
|
18
|
-
}),
|
|
19
|
-
specId: Args.string({
|
|
20
|
-
description: 'Spec ID to link',
|
|
21
|
-
required: false,
|
|
22
|
-
}),
|
|
23
|
-
};
|
|
24
|
-
static flags = {
|
|
25
|
-
...pmoBaseFlags,
|
|
26
|
-
unlink: Flags.boolean({
|
|
27
|
-
char: 'u',
|
|
28
|
-
description: 'Remove spec from ticket instead of adding',
|
|
29
|
-
default: false,
|
|
30
|
-
}),
|
|
31
|
-
bulk: Flags.boolean({
|
|
32
|
-
char: 'b',
|
|
33
|
-
description: 'Enable bulk mode to assign spec to multiple tickets',
|
|
34
|
-
default: false,
|
|
35
|
-
}),
|
|
36
|
-
spec: Flags.string({
|
|
37
|
-
char: 's',
|
|
38
|
-
description: 'Spec ID to assign (for bulk mode)',
|
|
39
|
-
}),
|
|
40
|
-
};
|
|
41
|
-
async execute() {
|
|
42
|
-
const { args, flags } = await this.parse(TicketSpec);
|
|
43
|
-
const projectId = flags.project;
|
|
44
|
-
// Check if JSON output mode is active
|
|
45
|
-
const jsonMode = shouldOutputJson(flags);
|
|
46
|
-
// Bulk mode
|
|
47
|
-
if (flags.bulk) {
|
|
48
|
-
await this.executeBulk(flags, projectId);
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
// Get all tickets
|
|
52
|
-
const tickets = await this.storage.listTickets(projectId);
|
|
53
|
-
if (tickets.length === 0) {
|
|
54
|
-
if (jsonMode) {
|
|
55
|
-
outputErrorAsJson('NO_TICKETS', 'No tickets found.', createMetadata('ticket spec', flags));
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
this.log(styles.muted('\nNo tickets found. Create one with: prlt ticket create'));
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
let ticketId = args.ticketId;
|
|
62
|
-
// If no ticket ID provided, prompt for selection
|
|
63
|
-
if (!ticketId) {
|
|
64
|
-
const ticketChoices = tickets.map(t => {
|
|
65
|
-
const specLabel = t.specId ? ` [spec: ${t.specId}]` : '';
|
|
66
|
-
return {
|
|
67
|
-
id: t.id,
|
|
68
|
-
name: `${t.id} - ${t.title}${specLabel}`,
|
|
69
|
-
};
|
|
70
|
-
});
|
|
71
|
-
const selected = await this.selectFromList({
|
|
72
|
-
message: 'Select ticket:',
|
|
73
|
-
items: ticketChoices,
|
|
74
|
-
getName: (t) => t.name,
|
|
75
|
-
getValue: (t) => t.id,
|
|
76
|
-
getCommand: (t) => `prlt ticket spec ${t.id}${projectId ? ` -P ${projectId}` : ''} --json`,
|
|
77
|
-
jsonMode: jsonMode ? { flags, commandName: 'ticket spec' } : null,
|
|
78
|
-
});
|
|
79
|
-
if (!selected) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
ticketId = selected;
|
|
83
|
-
}
|
|
84
|
-
// Validate ticket exists
|
|
85
|
-
const ticket = tickets.find(t => t.id === ticketId);
|
|
86
|
-
if (!ticket) {
|
|
87
|
-
this.error(`Ticket not found: ${ticketId}`);
|
|
88
|
-
}
|
|
89
|
-
// Handle unlink
|
|
90
|
-
if (flags.unlink) {
|
|
91
|
-
if (!ticket.specId) {
|
|
92
|
-
this.log(styles.muted(`\nTicket ${ticketId} is not linked to any spec.`));
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
const oldSpecId = ticket.specId;
|
|
96
|
-
await this.storage.updateTicket(ticketId, { specId: undefined });
|
|
97
|
-
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
98
|
-
this.log(styles.success(`\n✅ Unlinked spec "${styles.emphasis(oldSpecId)}" from ticket ${styles.emphasis(ticketId)}`));
|
|
99
|
-
}
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
// Get all specs
|
|
103
|
-
const specs = await this.storage.listSpecs();
|
|
104
|
-
if (specs.length === 0) {
|
|
105
|
-
this.log(styles.muted('\nNo specs found.'));
|
|
106
|
-
const actionChoices = [
|
|
107
|
-
{ id: 'create', name: 'Create a new spec' },
|
|
108
|
-
{ id: 'cancel', name: 'Cancel' },
|
|
109
|
-
];
|
|
110
|
-
const action = await this.selectFromList({
|
|
111
|
-
message: 'What would you like to do?',
|
|
112
|
-
items: actionChoices,
|
|
113
|
-
getName: (a) => a.name,
|
|
114
|
-
getValue: (a) => a.id,
|
|
115
|
-
getCommand: (a) => a.id === 'create' ? 'prlt spec create --json' : '',
|
|
116
|
-
jsonMode: jsonMode ? { flags, commandName: 'ticket spec' } : null,
|
|
117
|
-
});
|
|
118
|
-
if (action === 'create') {
|
|
119
|
-
await this.config.runCommand('spec:create', []);
|
|
120
|
-
}
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
let specId = args.specId;
|
|
124
|
-
// If no spec ID provided, prompt for selection
|
|
125
|
-
if (!specId) {
|
|
126
|
-
const selected = await this.selectFromList({
|
|
127
|
-
message: `Select spec to link to ${ticketId}:`,
|
|
128
|
-
items: specs,
|
|
129
|
-
getName: (s) => `${s.id} - ${s.title} (${s.status})`,
|
|
130
|
-
getValue: (s) => s.id,
|
|
131
|
-
getCommand: (s) => `prlt ticket spec ${ticketId} ${s.id}${projectId ? ` -P ${projectId}` : ''} --json`,
|
|
132
|
-
jsonMode: jsonMode ? { flags, commandName: 'ticket spec' } : null,
|
|
133
|
-
});
|
|
134
|
-
if (!selected) {
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
specId = selected;
|
|
138
|
-
}
|
|
139
|
-
// Validate spec exists
|
|
140
|
-
const spec = specs.find(s => s.id === specId);
|
|
141
|
-
if (!spec) {
|
|
142
|
-
this.error(`Spec not found: ${specId}`);
|
|
143
|
-
}
|
|
144
|
-
// Check if already linked
|
|
145
|
-
if (ticket.specId === specId) {
|
|
146
|
-
this.log(styles.muted(`\nTicket "${ticketId}" is already linked to spec "${specId}".`));
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
// Warn if ticket has different spec
|
|
150
|
-
if (ticket.specId) {
|
|
151
|
-
this.log(styles.warning(`Ticket "${ticketId}" is currently linked to spec "${ticket.specId}"`));
|
|
152
|
-
this.log(styles.muted(`This will replace the existing spec link.`));
|
|
153
|
-
}
|
|
154
|
-
// Reconciliation: Check if ticket's epic has a different spec
|
|
155
|
-
if (ticket.epicId) {
|
|
156
|
-
const epic = await this.storage.getEpic(ticket.epicId);
|
|
157
|
-
if (epic?.specId && epic.specId !== specId) {
|
|
158
|
-
this.log(styles.warning(`\n⚠️ Epic "${ticket.epicId}" uses spec "${epic.specId}", but you're assigning "${specId}" to this ticket.`));
|
|
159
|
-
const actionChoices = [
|
|
160
|
-
{ id: 'proceed', name: `Proceed anyway (ticket will have different spec than epic)` },
|
|
161
|
-
{ id: 'use_epic', name: `Use epic's spec instead (${epic.specId})` },
|
|
162
|
-
{ id: 'cancel', name: 'Cancel' },
|
|
163
|
-
];
|
|
164
|
-
const action = await this.selectFromList({
|
|
165
|
-
message: 'How to handle spec mismatch?',
|
|
166
|
-
items: actionChoices,
|
|
167
|
-
getName: (a) => a.name,
|
|
168
|
-
getValue: (a) => a.id,
|
|
169
|
-
getCommand: (a) => a.id === 'use_epic' ? `prlt ticket spec ${ticketId} ${epic.specId}${projectId ? ` -P ${projectId}` : ''} --json` : `prlt ticket spec ${ticketId} ${specId}${projectId ? ` -P ${projectId}` : ''} --json`,
|
|
170
|
-
jsonMode: jsonMode ? { flags, commandName: 'ticket spec' } : null,
|
|
171
|
-
});
|
|
172
|
-
if (action === 'cancel' || !action) {
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
if (action === 'use_epic') {
|
|
176
|
-
specId = epic.specId;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
// Link spec to ticket
|
|
181
|
-
await this.storage.updateTicket(ticketId, { specId });
|
|
182
|
-
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
183
|
-
this.log(styles.success(`\n✅ Linked ticket ${styles.emphasis(ticketId)} to spec ${styles.emphasis(specId)}`));
|
|
184
|
-
this.log(styles.muted(` Spec: ${spec.title}`));
|
|
185
|
-
this.log(styles.muted(`\nView ticket: prlt ticket view ${ticketId}`));
|
|
186
|
-
}
|
|
187
|
-
async executeBulk(flags, projectId) {
|
|
188
|
-
const jsonMode = shouldOutputJson(flags);
|
|
189
|
-
const jsonModeConfig = jsonMode ? { flags: flags, commandName: 'ticket spec' } : null;
|
|
190
|
-
this.log(styles.emphasis('📄 Bulk Assign Spec to Tickets\n'));
|
|
191
|
-
// Get all tickets
|
|
192
|
-
const tickets = await this.storage.listTickets(projectId);
|
|
193
|
-
if (tickets.length === 0) {
|
|
194
|
-
this.log(styles.muted('\nNo tickets found.'));
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
// Select tickets
|
|
198
|
-
const { selectedTickets } = await this.prompt([{
|
|
199
|
-
type: 'checkbox',
|
|
200
|
-
name: 'selectedTickets',
|
|
201
|
-
message: 'Select tickets to update:',
|
|
202
|
-
choices: tickets.map(t => {
|
|
203
|
-
const specLabel = t.specId ? ` [spec: ${t.specId}]` : '';
|
|
204
|
-
return {
|
|
205
|
-
name: `${t.id} - ${t.title}${specLabel}`,
|
|
206
|
-
value: t.id,
|
|
207
|
-
};
|
|
208
|
-
}),
|
|
209
|
-
}], jsonModeConfig);
|
|
210
|
-
if (selectedTickets.length === 0) {
|
|
211
|
-
this.log(styles.muted('No tickets selected.'));
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
// Handle unlink - sequential for clear logging
|
|
215
|
-
if (flags.unlink) {
|
|
216
|
-
for (const ticketId of selectedTickets) {
|
|
217
|
-
// eslint-disable-next-line no-await-in-loop
|
|
218
|
-
await this.storage.updateTicket(ticketId, { specId: undefined });
|
|
219
|
-
this.log(styles.success(` Unlinked spec from ${ticketId}`));
|
|
220
|
-
}
|
|
221
|
-
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
222
|
-
this.log(styles.success(`\n✅ Unlinked spec from ${selectedTickets.length} ticket(s)`));
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
// Get spec to assign
|
|
226
|
-
let specId = flags.spec;
|
|
227
|
-
if (!specId) {
|
|
228
|
-
const specs = await this.storage.listSpecs();
|
|
229
|
-
if (specs.length === 0) {
|
|
230
|
-
this.log(styles.muted('\nNo specs found. Create one with: prlt spec create'));
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
const { selected } = await this.prompt([{
|
|
234
|
-
type: 'list',
|
|
235
|
-
name: 'selected',
|
|
236
|
-
message: 'Select spec to assign:',
|
|
237
|
-
choices: specs.map(s => ({
|
|
238
|
-
name: `${s.id} - ${s.title} (${s.status})`,
|
|
239
|
-
value: s.id,
|
|
240
|
-
command: `prlt ticket spec --bulk --spec ${s.id} --json`,
|
|
241
|
-
})),
|
|
242
|
-
}], jsonModeConfig);
|
|
243
|
-
specId = selected;
|
|
244
|
-
}
|
|
245
|
-
// Validate spec
|
|
246
|
-
const spec = await this.storage.getSpec(specId);
|
|
247
|
-
if (!spec) {
|
|
248
|
-
this.error(`Spec not found: ${specId}`);
|
|
249
|
-
}
|
|
250
|
-
// Assign spec to all selected tickets - sequential for clear logging
|
|
251
|
-
for (const ticketId of selectedTickets) {
|
|
252
|
-
// eslint-disable-next-line no-await-in-loop
|
|
253
|
-
await this.storage.updateTicket(ticketId, { specId });
|
|
254
|
-
this.log(styles.success(` Linked ${ticketId} to ${specId}`));
|
|
255
|
-
}
|
|
256
|
-
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
257
|
-
this.log(styles.success(`\n✅ Linked ${selectedTickets.length} ticket(s) to spec "${spec.title}"`));
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
//# sourceMappingURL=spec.js.map
|