@proletariat/cli 0.3.93 → 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/cleanup.d.ts +1 -1
- package/dist/commands/agent/gc.d.ts +1 -1
- package/dist/commands/agent/index.d.ts +1 -1
- package/dist/commands/agent/list.d.ts +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/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/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/config/index.js +2 -2
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/diet.d.ts +1 -1
- package/dist/commands/docker/index.js +2 -0
- package/dist/commands/docker/index.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/execution/config.d.ts +1 -1
- package/dist/commands/execution/index.d.ts +1 -1
- package/dist/commands/execution/list.d.ts +1 -1
- package/dist/commands/execution/logs.d.ts +1 -1
- package/dist/commands/execution/stop.d.ts +1 -1
- package/dist/commands/execution/view.d.ts +1 -1
- package/dist/commands/hook/export.d.ts +1 -1
- package/dist/commands/hook/fire.d.ts +1 -1
- package/dist/commands/hook/index.d.ts +1 -1
- package/dist/commands/hook/list.d.ts +1 -1
- package/dist/commands/hook/preset.d.ts +1 -1
- 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 +15 -28
- 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 +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 +38 -40
- package/dist/commands/orchestrator/start.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/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/cleanup.d.ts +1 -1
- package/dist/commands/session/create.d.ts +1 -1
- package/dist/commands/session/exec.d.ts +1 -1
- package/dist/commands/session/health.d.ts +1 -1
- package/dist/commands/session/index.d.ts +1 -1
- package/dist/commands/session/inspect.d.ts +1 -1
- package/dist/commands/session/list.d.ts +1 -1
- package/dist/commands/session/peek.d.ts +1 -1
- package/dist/commands/session/prune.d.ts +1 -1
- package/dist/commands/session/report.d.ts +1 -1
- package/dist/commands/session/restart.d.ts +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 +1 -1
- package/dist/commands/ticket/delete.d.ts +1 -1
- package/dist/commands/ticket/edit.d.ts +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/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/groom.d.ts +1 -1
- package/dist/commands/work/hooks/add.d.ts +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/remove.d.ts +1 -1
- package/dist/commands/work/hooks/toggle.d.ts +1 -1
- package/dist/commands/work/implement.d.ts +1 -1
- package/dist/commands/work/index.d.ts +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/rebase.d.ts +1 -1
- 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 +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/start.d.ts +1 -1
- package/dist/commands/work/status.d.ts +1 -1
- package/dist/commands/work/stop.d.ts +1 -1
- package/dist/commands/work/watch.d.ts +1 -1
- package/dist/hooks/init.js +1 -1
- package/dist/hooks/init.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/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/index.d.ts +1 -0
- package/dist/lib/database/index.js +2 -0
- package/dist/lib/database/index.js.map +1 -1
- package/dist/lib/database/pmo-bootstrap.d.ts +7 -0
- package/dist/lib/database/pmo-bootstrap.js +45 -20
- package/dist/lib/database/pmo-bootstrap.js.map +1 -1
- package/dist/lib/database/workspace.js +4 -0
- package/dist/lib/database/workspace.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/docker-management.d.ts +23 -0
- package/dist/lib/execution/runners/docker-management.js +99 -7
- package/dist/lib/execution/runners/docker-management.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/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/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/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/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/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/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 +1 -1
- 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/trello/config.js +17 -12
- package/dist/lib/trello/config.js.map +1 -1
- package/dist/lib/work-lifecycle/events.d.ts +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 +3015 -4827
- package/package.json +1 -1
- package/dist/commands/board/index.d.ts +0 -21
- 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.d.ts +0 -18
- 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.d.ts +0 -14
- package/dist/commands/project/index.js +0 -60
- package/dist/commands/project/index.js.map +0 -1
- package/dist/commands/project/list.d.ts +0 -16
- 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.d.ts +0 -14
- 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 -193
- 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 -340
- 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 -306
- 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 -113
- 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,257 +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 TicketProject extends PMOCommand {
|
|
6
|
-
static description = 'Move ticket(s) to a different project';
|
|
7
|
-
static examples = [
|
|
8
|
-
'<%= config.bin %> <%= command.id %> TKT-001 new-project',
|
|
9
|
-
'<%= config.bin %> <%= command.id %> TKT-001',
|
|
10
|
-
'<%= config.bin %> <%= command.id %>',
|
|
11
|
-
'<%= config.bin %> <%= command.id %> --bulk --target other-project',
|
|
12
|
-
];
|
|
13
|
-
static args = {
|
|
14
|
-
ticketId: Args.string({
|
|
15
|
-
description: 'Ticket ID',
|
|
16
|
-
required: false,
|
|
17
|
-
}),
|
|
18
|
-
targetProject: Args.string({
|
|
19
|
-
description: 'Target project ID',
|
|
20
|
-
required: false,
|
|
21
|
-
}),
|
|
22
|
-
};
|
|
23
|
-
static flags = {
|
|
24
|
-
...pmoBaseFlags,
|
|
25
|
-
'keep-epic': Flags.boolean({
|
|
26
|
-
description: 'Keep ticket assigned to its epic (if epic is in source project, will unlink)',
|
|
27
|
-
default: false,
|
|
28
|
-
}),
|
|
29
|
-
bulk: Flags.boolean({
|
|
30
|
-
char: 'b',
|
|
31
|
-
description: 'Enable bulk mode to move multiple tickets',
|
|
32
|
-
default: false,
|
|
33
|
-
}),
|
|
34
|
-
target: Flags.string({
|
|
35
|
-
char: 't',
|
|
36
|
-
description: 'Target project ID (for bulk mode)',
|
|
37
|
-
}),
|
|
38
|
-
};
|
|
39
|
-
async execute() {
|
|
40
|
-
const { args, flags } = await this.parse(TicketProject);
|
|
41
|
-
// Check if JSON output mode is active
|
|
42
|
-
const jsonMode = shouldOutputJson(flags);
|
|
43
|
-
// Bulk mode
|
|
44
|
-
if (flags.bulk) {
|
|
45
|
-
await this.executeBulk(flags);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
// Get source project ID
|
|
49
|
-
const sourceProjectId = await this.requireProject();
|
|
50
|
-
// Get ticket ID
|
|
51
|
-
let ticketId = args.ticketId;
|
|
52
|
-
if (!ticketId) {
|
|
53
|
-
const tickets = await this.storage.listTickets(sourceProjectId);
|
|
54
|
-
if (tickets.length === 0) {
|
|
55
|
-
if (jsonMode) {
|
|
56
|
-
outputErrorAsJson('NO_TICKETS', 'No tickets found in this project.', createMetadata('ticket project', flags));
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
this.log(styles.muted('\nNo tickets found in this project.'));
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
const selected = await this.selectFromList({
|
|
63
|
-
message: 'Select ticket to move:',
|
|
64
|
-
items: tickets,
|
|
65
|
-
getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
|
|
66
|
-
getValue: (t) => t.id,
|
|
67
|
-
getCommand: (t) => `prlt ticket project ${t.id} -P ${sourceProjectId} --json`,
|
|
68
|
-
jsonMode: jsonMode ? { flags, commandName: 'ticket project' } : null,
|
|
69
|
-
});
|
|
70
|
-
if (!selected) {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
ticketId = selected;
|
|
74
|
-
}
|
|
75
|
-
// Get ticket details
|
|
76
|
-
const ticket = await this.storage.getTicket(ticketId);
|
|
77
|
-
if (!ticket) {
|
|
78
|
-
this.error(`Ticket not found: ${ticketId}`);
|
|
79
|
-
}
|
|
80
|
-
// Use resolved internal ID for all subsequent operations (external keys like PRLT-xxx resolve to TKT-xxx)
|
|
81
|
-
ticketId = ticket.id;
|
|
82
|
-
// Get all projects
|
|
83
|
-
const projects = await this.storage.listProjects();
|
|
84
|
-
const otherProjects = projects.filter(p => p.id !== sourceProjectId);
|
|
85
|
-
if (otherProjects.length === 0) {
|
|
86
|
-
this.log(styles.muted('\nNo other projects to move to.'));
|
|
87
|
-
const actionChoices = [
|
|
88
|
-
{ id: 'create', name: 'Create a new project' },
|
|
89
|
-
{ id: 'cancel', name: 'Cancel' },
|
|
90
|
-
];
|
|
91
|
-
const action = await this.selectFromList({
|
|
92
|
-
message: 'What would you like to do?',
|
|
93
|
-
items: actionChoices,
|
|
94
|
-
getName: (a) => a.name,
|
|
95
|
-
getValue: (a) => a.id,
|
|
96
|
-
getCommand: (a) => a.id === 'create' ? 'prlt project create --json' : '',
|
|
97
|
-
jsonMode: jsonMode ? { flags, commandName: 'ticket project' } : null,
|
|
98
|
-
});
|
|
99
|
-
if (action === 'create') {
|
|
100
|
-
await this.config.runCommand('project:create', []);
|
|
101
|
-
}
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
// Get target project
|
|
105
|
-
let targetProjectId = args.targetProject;
|
|
106
|
-
if (!targetProjectId) {
|
|
107
|
-
const selected = await this.selectFromList({
|
|
108
|
-
message: 'Select target project:',
|
|
109
|
-
items: otherProjects,
|
|
110
|
-
getName: (p) => `${p.id} - ${p.name} (${p.status})`,
|
|
111
|
-
getValue: (p) => p.id,
|
|
112
|
-
getCommand: (p) => `prlt ticket project ${ticketId} ${p.id} -P ${sourceProjectId} --json`,
|
|
113
|
-
jsonMode: jsonMode ? { flags, commandName: 'ticket project' } : null,
|
|
114
|
-
});
|
|
115
|
-
if (!selected) {
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
targetProjectId = selected;
|
|
119
|
-
}
|
|
120
|
-
// Validate target project
|
|
121
|
-
const targetProject = projects.find(p => p.id === targetProjectId);
|
|
122
|
-
if (!targetProject) {
|
|
123
|
-
this.error(`Project not found: ${targetProjectId}`);
|
|
124
|
-
}
|
|
125
|
-
if (targetProjectId === sourceProjectId) {
|
|
126
|
-
this.log(styles.muted('\nTicket is already in this project.'));
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
// Check if ticket has an epic
|
|
130
|
-
const epicWarning = ticket.epicId && !flags['keep-epic'];
|
|
131
|
-
if (epicWarning) {
|
|
132
|
-
const epic = await this.storage.getEpic(ticket.epicId);
|
|
133
|
-
if (epic && epic.projectId !== targetProjectId) {
|
|
134
|
-
this.log(styles.warning(`\nTicket is assigned to epic "${ticket.epicId}" in source project.`));
|
|
135
|
-
const actionChoices = [
|
|
136
|
-
{ id: 'unlink', name: 'Unlink from epic (move ticket only)' },
|
|
137
|
-
{ id: 'cancel', name: 'Cancel' },
|
|
138
|
-
];
|
|
139
|
-
const action = await this.selectFromList({
|
|
140
|
-
message: 'How to handle epic assignment?',
|
|
141
|
-
items: actionChoices,
|
|
142
|
-
getName: (a) => a.name,
|
|
143
|
-
getValue: (a) => a.id,
|
|
144
|
-
getCommand: (a) => a.id === 'unlink' ? `prlt ticket project ${ticketId} ${targetProjectId} -P ${sourceProjectId} --json` : '',
|
|
145
|
-
jsonMode: jsonMode ? { flags, commandName: 'ticket project' } : null,
|
|
146
|
-
});
|
|
147
|
-
if (action === 'cancel' || !action) {
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
// Unlink from epic before moving
|
|
151
|
-
await this.storage.updateTicket(ticketId, { epicId: undefined });
|
|
152
|
-
this.log(styles.muted(` Unlinked from epic "${ticket.epicId}"`));
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
// Move ticket to new project using the storage method
|
|
156
|
-
const movedTicket = await this.storage.moveTicketToProject(ticketId, targetProjectId);
|
|
157
|
-
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
158
|
-
this.log(styles.success(`\n✅ Moved ticket ${styles.emphasis(ticketId)} to project ${styles.emphasis(targetProjectId)}`));
|
|
159
|
-
this.log(styles.muted(` From: ${sourceProjectId}`));
|
|
160
|
-
this.log(styles.muted(` To: ${targetProjectId} (column: ${movedTicket.statusName || 'first column'})`));
|
|
161
|
-
this.log(styles.muted(`\nView ticket: prlt ticket view ${ticketId}`));
|
|
162
|
-
}
|
|
163
|
-
async executeBulk(flags) {
|
|
164
|
-
const jsonMode = shouldOutputJson(flags);
|
|
165
|
-
const jsonModeConfig = jsonMode ? { flags: flags, commandName: 'ticket project' } : null;
|
|
166
|
-
this.log(styles.emphasis('📁 Bulk Move Tickets to Project\n'));
|
|
167
|
-
// Get source project ID
|
|
168
|
-
const sourceProjectId = await this.requireProject();
|
|
169
|
-
// Get all tickets in current project
|
|
170
|
-
const tickets = await this.storage.listTickets(sourceProjectId);
|
|
171
|
-
if (tickets.length === 0) {
|
|
172
|
-
this.log(styles.muted('\nNo tickets found in this project.'));
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
// Select tickets
|
|
176
|
-
const { selectedTickets } = await this.prompt([{
|
|
177
|
-
type: 'checkbox',
|
|
178
|
-
name: 'selectedTickets',
|
|
179
|
-
message: 'Select tickets to move:',
|
|
180
|
-
choices: tickets.map(t => {
|
|
181
|
-
const epicLabel = t.epicId ? ` [epic: ${t.epicId}]` : '';
|
|
182
|
-
return {
|
|
183
|
-
name: `${t.id} - ${t.title} (${t.statusName})${epicLabel}`,
|
|
184
|
-
value: t.id,
|
|
185
|
-
};
|
|
186
|
-
}),
|
|
187
|
-
}], jsonModeConfig);
|
|
188
|
-
if (selectedTickets.length === 0) {
|
|
189
|
-
this.log(styles.muted('No tickets selected.'));
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
// Get target project
|
|
193
|
-
const projects = await this.storage.listProjects();
|
|
194
|
-
const otherProjects = projects.filter(p => p.id !== sourceProjectId);
|
|
195
|
-
if (otherProjects.length === 0) {
|
|
196
|
-
this.log(styles.muted('\nNo other projects to move to. Create one with: prlt project create'));
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
let targetProjectId = flags.target;
|
|
200
|
-
if (!targetProjectId) {
|
|
201
|
-
const { selected } = await this.prompt([{
|
|
202
|
-
type: 'list',
|
|
203
|
-
name: 'selected',
|
|
204
|
-
message: 'Select target project:',
|
|
205
|
-
choices: otherProjects.map(p => ({
|
|
206
|
-
name: `${p.id} - ${p.name}`,
|
|
207
|
-
value: p.id,
|
|
208
|
-
command: `prlt ticket project --bulk --target ${p.id} --json`,
|
|
209
|
-
})),
|
|
210
|
-
}], jsonModeConfig);
|
|
211
|
-
targetProjectId = selected;
|
|
212
|
-
}
|
|
213
|
-
// Validate target project
|
|
214
|
-
const targetProject = projects.find(p => p.id === targetProjectId);
|
|
215
|
-
if (!targetProject) {
|
|
216
|
-
this.error(`Project not found: ${targetProjectId}`);
|
|
217
|
-
}
|
|
218
|
-
// Check for epic conflicts
|
|
219
|
-
const ticketsWithEpics = selectedTickets.filter((id) => {
|
|
220
|
-
const t = tickets.find(t => t.id === id);
|
|
221
|
-
return t?.epicId;
|
|
222
|
-
});
|
|
223
|
-
if (ticketsWithEpics.length > 0) {
|
|
224
|
-
this.log(styles.warning(`\n${ticketsWithEpics.length} ticket(s) are assigned to epics.`));
|
|
225
|
-
const { action } = await this.prompt([{
|
|
226
|
-
type: 'list',
|
|
227
|
-
name: 'action',
|
|
228
|
-
message: 'How to handle epic assignments?',
|
|
229
|
-
choices: [
|
|
230
|
-
{ name: 'Unlink from epics and move', value: 'unlink', command: `prlt ticket project --bulk --target ${targetProjectId} --json` },
|
|
231
|
-
{ name: 'Cancel', value: 'cancel', command: '' },
|
|
232
|
-
],
|
|
233
|
-
}], jsonModeConfig);
|
|
234
|
-
if (action === 'cancel') {
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
// Move each ticket using the storage method - sequential for clear logging
|
|
239
|
-
let lastMovedTicket;
|
|
240
|
-
for (const ticketId of selectedTickets) {
|
|
241
|
-
const ticket = tickets.find(t => t.id === ticketId);
|
|
242
|
-
// Unlink from epic if needed
|
|
243
|
-
if (ticket?.epicId) {
|
|
244
|
-
// eslint-disable-next-line no-await-in-loop
|
|
245
|
-
await this.storage.updateTicket(ticketId, { epicId: undefined });
|
|
246
|
-
}
|
|
247
|
-
// Move ticket to new project
|
|
248
|
-
// eslint-disable-next-line no-await-in-loop
|
|
249
|
-
lastMovedTicket = await this.storage.moveTicketToProject(ticketId, targetProjectId);
|
|
250
|
-
this.log(styles.success(` Moved ${ticketId} to ${targetProjectId}`));
|
|
251
|
-
}
|
|
252
|
-
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
253
|
-
this.log(styles.success(`\n✅ Moved ${selectedTickets.length} ticket(s) to project "${targetProject.name}"`));
|
|
254
|
-
this.log(styles.muted(` Target column: ${lastMovedTicket?.statusName || 'first column'}`));
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
//# sourceMappingURL=project.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/commands/ticket/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
-
export default class TicketReassign 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
|
-
assignee: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
-
};
|
|
9
|
-
static flags: {
|
|
10
|
-
to: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
-
from: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
-
bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
-
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
-
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
-
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
-
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
-
};
|
|
18
|
-
execute(): Promise<void>;
|
|
19
|
-
private executeBulk;
|
|
20
|
-
}
|
|
@@ -1,340 +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
|
-
import { getWorkspaceInfo } from '../../lib/agents/commands.js';
|
|
6
|
-
export default class TicketReassign extends PMOCommand {
|
|
7
|
-
static description = 'Reassign ticket(s) to a different agent';
|
|
8
|
-
static examples = [
|
|
9
|
-
'<%= config.bin %> <%= command.id %>',
|
|
10
|
-
'<%= config.bin %> <%= command.id %> TKT-001 alice',
|
|
11
|
-
'<%= config.bin %> <%= command.id %> --bulk --to alice',
|
|
12
|
-
'<%= config.bin %> <%= command.id %> --bulk --from bob --to alice',
|
|
13
|
-
'<%= config.bin %> <%= command.id %> --json # Output choices as JSON',
|
|
14
|
-
];
|
|
15
|
-
static args = {
|
|
16
|
-
ticketId: Args.string({
|
|
17
|
-
description: 'Ticket ID - prompts with dropdown if not provided',
|
|
18
|
-
required: false,
|
|
19
|
-
}),
|
|
20
|
-
assignee: Args.string({
|
|
21
|
-
description: 'Target agent name',
|
|
22
|
-
required: false,
|
|
23
|
-
}),
|
|
24
|
-
};
|
|
25
|
-
static flags = {
|
|
26
|
-
...pmoBaseFlags,
|
|
27
|
-
to: Flags.string({
|
|
28
|
-
description: 'Target agent name (for bulk mode)',
|
|
29
|
-
}),
|
|
30
|
-
from: Flags.string({
|
|
31
|
-
description: 'Filter tickets by current assignee (bulk mode)',
|
|
32
|
-
}),
|
|
33
|
-
bulk: Flags.boolean({
|
|
34
|
-
char: 'b',
|
|
35
|
-
description: 'Enable bulk mode to reassign multiple tickets',
|
|
36
|
-
default: false,
|
|
37
|
-
}),
|
|
38
|
-
force: Flags.boolean({
|
|
39
|
-
char: 'f',
|
|
40
|
-
description: 'Skip confirmation prompt',
|
|
41
|
-
default: false,
|
|
42
|
-
}),
|
|
43
|
-
};
|
|
44
|
-
async execute() {
|
|
45
|
-
const { args, flags } = await this.parse(TicketReassign);
|
|
46
|
-
const projectId = flags.project;
|
|
47
|
-
// Check if JSON output mode is active
|
|
48
|
-
const jsonMode = shouldOutputJson(flags);
|
|
49
|
-
// Get all tickets
|
|
50
|
-
const allTickets = await this.storage.listTickets(projectId);
|
|
51
|
-
if (allTickets.length === 0) {
|
|
52
|
-
if (jsonMode) {
|
|
53
|
-
outputErrorAsJson('NO_TICKETS', 'No tickets found.', createMetadata('ticket reassign', flags));
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
this.log(styles.warning('No tickets found.'));
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
// Get unique assignees from tickets
|
|
60
|
-
const assignees = new Set();
|
|
61
|
-
for (const ticket of allTickets) {
|
|
62
|
-
if (ticket.assignee) {
|
|
63
|
-
assignees.add(ticket.assignee);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// Also get agents from workspace if available
|
|
67
|
-
const db = this.storage.db;
|
|
68
|
-
try {
|
|
69
|
-
const agents = db.prepare(`SELECT name FROM agents`).all();
|
|
70
|
-
for (const agent of agents) {
|
|
71
|
-
assignees.add(agent.name);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
// agents table might not exist, ignore
|
|
76
|
-
}
|
|
77
|
-
// Bulk mode
|
|
78
|
-
if (flags.bulk) {
|
|
79
|
-
await this.executeBulk(allTickets, Array.from(assignees), flags);
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
// Single ticket mode
|
|
83
|
-
let ticketId = args.ticketId;
|
|
84
|
-
if (!ticketId) {
|
|
85
|
-
const selected = await this.selectFromList({
|
|
86
|
-
message: 'Select ticket to reassign:',
|
|
87
|
-
items: allTickets,
|
|
88
|
-
getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
|
|
89
|
-
getValue: (t) => t.id,
|
|
90
|
-
getCommand: (t) => `prlt ticket reassign ${t.id}${projectId ? ` -P ${projectId}` : ''} --json`,
|
|
91
|
-
jsonMode: jsonMode ? { flags, commandName: 'ticket reassign' } : null,
|
|
92
|
-
});
|
|
93
|
-
if (!selected) {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
ticketId = selected;
|
|
97
|
-
}
|
|
98
|
-
// Get ticket
|
|
99
|
-
const ticket = await this.storage.getTicket(ticketId);
|
|
100
|
-
if (!ticket) {
|
|
101
|
-
this.error(`Ticket "${ticketId}" not found.`);
|
|
102
|
-
}
|
|
103
|
-
// Use resolved internal ID for all subsequent operations (external keys like PRLT-xxx resolve to TKT-xxx)
|
|
104
|
-
ticketId = ticket.id;
|
|
105
|
-
// Get target assignee
|
|
106
|
-
let targetAssignee = args.assignee || flags.to;
|
|
107
|
-
if (!targetAssignee) {
|
|
108
|
-
const jsonModeConfig = jsonMode ? { flags, commandName: 'ticket reassign' } : null;
|
|
109
|
-
const { assignee } = await this.prompt([{
|
|
110
|
-
type: 'list',
|
|
111
|
-
name: 'assignee',
|
|
112
|
-
message: `Reassign ${ticketId} to:`,
|
|
113
|
-
choices: [
|
|
114
|
-
{ name: 'None (unassign)', value: '__none__', command: `prlt ticket reassign ${ticketId} none${projectId ? ` -P ${projectId}` : ''} --json` },
|
|
115
|
-
...Array.from(assignees).sort().map(a => ({
|
|
116
|
-
name: a === ticket.assignee ? `${a} (current)` : a,
|
|
117
|
-
value: a,
|
|
118
|
-
command: `prlt ticket reassign ${ticketId} ${a}${projectId ? ` -P ${projectId}` : ''} --json`,
|
|
119
|
-
})),
|
|
120
|
-
{ name: '── Enter custom name ──', value: '__custom__', command: `prlt ticket reassign ${ticketId} <name>${projectId ? ` -P ${projectId}` : ''} --json` },
|
|
121
|
-
],
|
|
122
|
-
}], jsonModeConfig);
|
|
123
|
-
if (assignee === '__custom__') {
|
|
124
|
-
const { customAssignee } = await this.prompt([{
|
|
125
|
-
type: 'input',
|
|
126
|
-
name: 'customAssignee',
|
|
127
|
-
message: 'Enter agent/assignee name:',
|
|
128
|
-
validate: (input) => input.length > 0 || 'Name is required',
|
|
129
|
-
}], jsonModeConfig);
|
|
130
|
-
targetAssignee = customAssignee;
|
|
131
|
-
}
|
|
132
|
-
else if (assignee === '__none__') {
|
|
133
|
-
targetAssignee = undefined;
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
targetAssignee = assignee;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
// Handle special values
|
|
140
|
-
if (targetAssignee === 'none' || targetAssignee === 'unassigned') {
|
|
141
|
-
targetAssignee = undefined;
|
|
142
|
-
}
|
|
143
|
-
// Validate agent name if provided directly (not through interactive prompt)
|
|
144
|
-
if (targetAssignee && (args.assignee || flags.to)) {
|
|
145
|
-
try {
|
|
146
|
-
const workspaceInfo = getWorkspaceInfo();
|
|
147
|
-
const agent = workspaceInfo.agents.find(a => a.name === targetAssignee);
|
|
148
|
-
if (!agent) {
|
|
149
|
-
this.error(`Agent "${targetAssignee}" not found. Run 'prlt agent list' to see available agents.`);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
// Not in a workspace or agents table doesn't exist - skip validation
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
// Check if same
|
|
157
|
-
if (targetAssignee === ticket.assignee) {
|
|
158
|
-
this.log(styles.muted(`Ticket "${ticketId}" is already assigned to "${targetAssignee || 'none'}".`));
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
// Assign through provider (routes to Linear/Jira/PMO as appropriate)
|
|
162
|
-
const provider = await this.resolveTicketProvider(ticketId, ticket.projectId || '');
|
|
163
|
-
if (targetAssignee) {
|
|
164
|
-
const result = await provider.assignTicket(ticketId, targetAssignee);
|
|
165
|
-
if (!result.success) {
|
|
166
|
-
this.error(`Failed to reassign ticket: ${result.error}`);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
// Unassign: use updateTicket to clear assignee
|
|
171
|
-
const result = await provider.updateTicket(ticketId, { assignee: undefined });
|
|
172
|
-
if (!result.success) {
|
|
173
|
-
this.error(`Failed to unassign ticket: ${result.error}`);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// Auto-export
|
|
177
|
-
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
178
|
-
const action = targetAssignee ? `reassigned to ${targetAssignee}` : 'unassigned';
|
|
179
|
-
this.log(styles.success(`\n✅ Ticket ${styles.emphasis(ticketId)} ${action}`));
|
|
180
|
-
this.log(styles.muted(` Title: ${ticket.title}`));
|
|
181
|
-
if (ticket.assignee) {
|
|
182
|
-
this.log(styles.muted(` Previous: ${ticket.assignee}`));
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
async executeBulk(allTickets, assigneesList, flags) {
|
|
186
|
-
const jsonMode = shouldOutputJson(flags);
|
|
187
|
-
this.log(styles.emphasis('👤 Reassign Tickets\n'));
|
|
188
|
-
// Filter tickets if --from specified
|
|
189
|
-
let filteredTickets = allTickets;
|
|
190
|
-
if (flags.from) {
|
|
191
|
-
if (flags.from === 'none' || flags.from === 'unassigned') {
|
|
192
|
-
filteredTickets = allTickets.filter(t => !t.assignee);
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
filteredTickets = allTickets.filter(t => t.assignee === flags.from);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
if (filteredTickets.length === 0) {
|
|
199
|
-
this.log(styles.warning('No tickets found matching filter.'));
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
// Select tickets to reassign
|
|
203
|
-
const jsonModeConfig = jsonMode ? { flags: flags, commandName: 'ticket reassign' } : null;
|
|
204
|
-
const { selectedTickets } = await this.prompt([{
|
|
205
|
-
type: 'checkbox',
|
|
206
|
-
name: 'selectedTickets',
|
|
207
|
-
message: 'Select tickets to reassign:',
|
|
208
|
-
choices: filteredTickets.map(t => ({
|
|
209
|
-
name: `${t.id} - ${t.title} [Assignee: ${t.assignee || '(none)'}]`,
|
|
210
|
-
value: t.id,
|
|
211
|
-
})),
|
|
212
|
-
}], jsonModeConfig);
|
|
213
|
-
if (selectedTickets.length === 0) {
|
|
214
|
-
this.log(styles.muted('No tickets selected.'));
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
// Select target assignee
|
|
218
|
-
let targetAssignee = flags.to;
|
|
219
|
-
if (targetAssignee === undefined) {
|
|
220
|
-
const { assignee } = await this.prompt([{
|
|
221
|
-
type: 'list',
|
|
222
|
-
name: 'assignee',
|
|
223
|
-
message: 'Reassign to which agent?',
|
|
224
|
-
choices: [
|
|
225
|
-
{ name: 'None (unassign)', value: '__none__', command: '' },
|
|
226
|
-
...assigneesList.sort().map(a => ({
|
|
227
|
-
name: a,
|
|
228
|
-
value: a,
|
|
229
|
-
command: `prlt ticket reassign --bulk --to ${a} --json`,
|
|
230
|
-
})),
|
|
231
|
-
{ name: '── Enter custom name ──', value: '__custom__', command: '' },
|
|
232
|
-
],
|
|
233
|
-
}], jsonModeConfig);
|
|
234
|
-
if (assignee === '__custom__') {
|
|
235
|
-
const { customAssignee } = await this.prompt([{
|
|
236
|
-
type: 'input',
|
|
237
|
-
name: 'customAssignee',
|
|
238
|
-
message: 'Enter agent/assignee name:',
|
|
239
|
-
validate: (input) => input.length > 0 || 'Name is required',
|
|
240
|
-
}], jsonModeConfig);
|
|
241
|
-
targetAssignee = customAssignee;
|
|
242
|
-
}
|
|
243
|
-
else if (assignee === '__none__') {
|
|
244
|
-
targetAssignee = undefined;
|
|
245
|
-
}
|
|
246
|
-
else {
|
|
247
|
-
targetAssignee = assignee;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
// Handle special values
|
|
251
|
-
if (targetAssignee === 'none' || targetAssignee === 'unassigned') {
|
|
252
|
-
targetAssignee = undefined;
|
|
253
|
-
}
|
|
254
|
-
// Validate agent name if provided directly via --to flag (not through interactive prompt)
|
|
255
|
-
if (targetAssignee && flags.to) {
|
|
256
|
-
try {
|
|
257
|
-
const workspaceInfo = getWorkspaceInfo();
|
|
258
|
-
const agent = workspaceInfo.agents.find(a => a.name === targetAssignee);
|
|
259
|
-
if (!agent) {
|
|
260
|
-
this.error(`Agent "${targetAssignee}" not found. Run 'prlt agent list' to see available agents.`);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
catch {
|
|
264
|
-
// Not in a workspace or agents table doesn't exist - skip validation
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
// Confirmation
|
|
268
|
-
if (!flags.force) {
|
|
269
|
-
const assigneeLabel = targetAssignee || 'None (unassigning)';
|
|
270
|
-
this.log(styles.primary('\nWill reassign to:'));
|
|
271
|
-
this.log(styles.primary(` → ${assigneeLabel}\n`));
|
|
272
|
-
this.log(styles.primary('Tickets:'));
|
|
273
|
-
for (const ticketId of selectedTickets) {
|
|
274
|
-
const ticket = filteredTickets.find(t => t.id === ticketId);
|
|
275
|
-
this.log(styles.primary(` • ${ticketId}: ${ticket?.title}`));
|
|
276
|
-
}
|
|
277
|
-
this.log('');
|
|
278
|
-
const { confirm } = await this.prompt([{
|
|
279
|
-
type: 'list',
|
|
280
|
-
name: 'confirm',
|
|
281
|
-
message: 'Continue?',
|
|
282
|
-
choices: [
|
|
283
|
-
{ name: 'No, cancel', value: false, command: '' },
|
|
284
|
-
{ name: 'Yes, reassign tickets', value: true, command: `prlt ticket reassign --bulk --to ${targetAssignee || 'none'} --force --json` }
|
|
285
|
-
],
|
|
286
|
-
default: 0
|
|
287
|
-
}], jsonModeConfig);
|
|
288
|
-
if (!confirm) {
|
|
289
|
-
this.log(styles.muted('Operation cancelled.'));
|
|
290
|
-
return;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
this.log('');
|
|
294
|
-
// Reassign each ticket
|
|
295
|
-
let successCount = 0;
|
|
296
|
-
let failCount = 0;
|
|
297
|
-
// Process sequentially for clear success/failure logging
|
|
298
|
-
for (const ticketId of selectedTickets) {
|
|
299
|
-
try {
|
|
300
|
-
const ticket = filteredTickets.find(t => t.id === ticketId);
|
|
301
|
-
// eslint-disable-next-line no-await-in-loop
|
|
302
|
-
const provider = await this.resolveTicketProvider(ticketId, ticket?.projectId || '');
|
|
303
|
-
let result;
|
|
304
|
-
if (targetAssignee) {
|
|
305
|
-
// eslint-disable-next-line no-await-in-loop
|
|
306
|
-
result = await provider.assignTicket(ticketId, targetAssignee);
|
|
307
|
-
}
|
|
308
|
-
else {
|
|
309
|
-
// eslint-disable-next-line no-await-in-loop
|
|
310
|
-
result = await provider.updateTicket(ticketId, { assignee: undefined });
|
|
311
|
-
}
|
|
312
|
-
if (result.success) {
|
|
313
|
-
const action = targetAssignee ? `Reassigned to ${targetAssignee}` : 'Unassigned';
|
|
314
|
-
this.log(styles.success(`${ticketId}: ${action}`));
|
|
315
|
-
successCount++;
|
|
316
|
-
}
|
|
317
|
-
else {
|
|
318
|
-
this.log(styles.error(`Failed to reassign ${ticketId}: ${result.error}`));
|
|
319
|
-
failCount++;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
catch (error) {
|
|
323
|
-
this.log(styles.error(`Failed to reassign ${ticketId}: ${error instanceof Error ? error.message : String(error)}`));
|
|
324
|
-
failCount++;
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
// Auto-export to kanban.md
|
|
328
|
-
await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
|
|
329
|
-
// Summary
|
|
330
|
-
this.log('');
|
|
331
|
-
if (successCount > 0) {
|
|
332
|
-
const action = targetAssignee ? 'Reassigned' : 'Unassigned';
|
|
333
|
-
this.log(styles.success(`${action} ${successCount} ticket(s)`));
|
|
334
|
-
}
|
|
335
|
-
if (failCount > 0) {
|
|
336
|
-
this.log(styles.error(`Failed to reassign ${failCount} ticket(s)`));
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
//# sourceMappingURL=reassign.js.map
|