@proletariat/cli 0.3.33 → 0.3.35
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 -0
- package/dist/commands/action/delete.d.ts +1 -0
- package/dist/commands/action/index.d.ts +1 -0
- package/dist/commands/action/list.d.ts +1 -0
- package/dist/commands/action/list.js +0 -6
- package/dist/commands/action/run.d.ts +1 -0
- package/dist/commands/action/show.d.ts +1 -0
- package/dist/commands/action/update.d.ts +1 -0
- package/dist/commands/agent/auth.d.ts +5 -2
- package/dist/commands/agent/auth.js +10 -17
- package/dist/commands/agent/cleanup.d.ts +2 -1
- package/dist/commands/agent/cleanup.js +0 -6
- package/dist/commands/agent/discover.d.ts +2 -1
- package/dist/commands/agent/discover.js +2 -6
- package/dist/commands/agent/index.d.ts +1 -0
- package/dist/commands/agent/index.js +11 -9
- package/dist/commands/agent/list.d.ts +1 -0
- package/dist/commands/agent/login.d.ts +1 -0
- package/dist/commands/agent/login.js +1 -7
- package/dist/commands/agent/rebuild.d.ts +2 -1
- package/dist/commands/agent/rebuild.js +0 -6
- package/dist/commands/agent/remove.d.ts +2 -1
- package/dist/commands/agent/remove.js +0 -6
- package/dist/commands/agent/restart.d.ts +1 -0
- package/dist/commands/agent/restart.js +1 -7
- package/dist/commands/agent/shell.d.ts +1 -0
- package/dist/commands/agent/shell.js +1 -7
- package/dist/commands/agent/staff/add.d.ts +1 -0
- package/dist/commands/agent/staff/add.js +1 -0
- package/dist/commands/agent/staff/index.d.ts +15 -0
- package/dist/commands/agent/staff/index.js +83 -0
- package/dist/commands/agent/staff/list.d.ts +1 -0
- package/dist/commands/agent/staff/list.js +1 -0
- package/dist/commands/agent/staff/remove.d.ts +1 -0
- package/dist/commands/agent/staff/remove.js +1 -0
- package/dist/commands/agent/status.d.ts +1 -0
- package/dist/commands/agent/status.js +1 -7
- package/dist/commands/agent/themes/add-names.d.ts +1 -0
- package/dist/commands/agent/themes/add-names.js +1 -0
- package/dist/commands/agent/themes/create.d.ts +1 -0
- package/dist/commands/agent/themes/create.js +1 -0
- package/dist/commands/agent/themes/index.d.ts +10 -0
- package/dist/commands/agent/themes/index.js +144 -0
- package/dist/commands/agent/themes/list.d.ts +1 -0
- package/dist/commands/agent/themes/list.js +1 -0
- package/dist/commands/agent/themes/set.d.ts +1 -0
- package/dist/commands/agent/themes/set.js +1 -0
- package/dist/commands/agent/visit.d.ts +1 -0
- package/dist/commands/agent/visit.js +1 -7
- package/dist/commands/agents/themes/add-names.d.ts +1 -0
- package/dist/commands/agents/themes/add-names.js +1 -0
- package/dist/commands/agents/themes/create.d.ts +1 -0
- package/dist/commands/agents/themes/create.js +1 -0
- package/dist/commands/agents/themes/list.d.ts +1 -0
- package/dist/commands/agents/themes/list.js +1 -0
- package/dist/commands/autocomplete/setup.d.ts +1 -0
- package/dist/commands/board/index.d.ts +1 -0
- package/dist/commands/board/view.d.ts +1 -0
- package/dist/commands/board/watch.d.ts +1 -0
- package/dist/commands/branch/create.d.ts +1 -0
- package/dist/commands/branch/create.js +0 -6
- package/dist/commands/branch/index.d.ts +1 -0
- package/dist/commands/branch/index.js +0 -7
- package/dist/commands/branch/list.d.ts +1 -0
- package/dist/commands/branch/validate.d.ts +1 -0
- package/dist/commands/branch/where.d.ts +1 -0
- package/dist/commands/branch/where.js +3 -9
- package/dist/commands/category/create.d.ts +1 -0
- package/dist/commands/category/delete.d.ts +1 -0
- package/dist/commands/category/index.d.ts +1 -0
- package/dist/commands/category/list.d.ts +1 -0
- package/dist/commands/category/list.js +2 -2
- package/dist/commands/category/rename.d.ts +1 -0
- package/dist/commands/claude.d.ts +2 -1
- package/dist/commands/claude.js +2 -6
- package/dist/commands/commit.d.ts +2 -1
- package/dist/commands/commit.js +2 -6
- package/dist/commands/config/index.d.ts +2 -1
- package/dist/commands/config/index.js +3 -7
- package/dist/commands/diet.d.ts +1 -0
- package/dist/commands/docker/clean.d.ts +1 -0
- package/dist/commands/docker/index.d.ts +1 -0
- package/dist/commands/docker/list.d.ts +1 -0
- package/dist/commands/docker/logs.d.ts +2 -0
- package/dist/commands/docker/logs.js +2 -0
- package/dist/commands/docker/prune.d.ts +1 -0
- package/dist/commands/docker/restart.d.ts +1 -0
- package/dist/commands/docker/shell.d.ts +2 -0
- package/dist/commands/docker/shell.js +2 -0
- package/dist/commands/docker/start.d.ts +2 -0
- package/dist/commands/docker/start.js +2 -0
- package/dist/commands/docker/status.d.ts +1 -0
- package/dist/commands/docker/stop.d.ts +1 -0
- package/dist/commands/epic/activate.d.ts +1 -0
- package/dist/commands/epic/activate.js +1 -7
- package/dist/commands/epic/archive.d.ts +2 -1
- package/dist/commands/epic/archive.js +0 -6
- package/dist/commands/epic/create.d.ts +2 -1
- package/dist/commands/epic/create.js +0 -6
- package/dist/commands/epic/delete.d.ts +1 -0
- package/dist/commands/epic/index.d.ts +1 -0
- package/dist/commands/epic/index.js +0 -7
- package/dist/commands/epic/list.d.ts +1 -0
- package/dist/commands/epic/move.d.ts +2 -1
- package/dist/commands/epic/move.js +0 -6
- package/dist/commands/epic/progress.d.ts +2 -1
- package/dist/commands/epic/progress.js +0 -6
- package/dist/commands/epic/project.d.ts +2 -1
- package/dist/commands/epic/project.js +0 -6
- package/dist/commands/epic/reorder.d.ts +1 -0
- package/dist/commands/epic/reorder.js +0 -6
- package/dist/commands/epic/spec.d.ts +2 -1
- package/dist/commands/epic/spec.js +0 -6
- package/dist/commands/epic/ticket.d.ts +2 -1
- package/dist/commands/epic/ticket.js +0 -6
- package/dist/commands/epic/view.d.ts +1 -0
- package/dist/commands/epic/view.js +1 -7
- package/dist/commands/execution/config.d.ts +2 -1
- package/dist/commands/execution/config.js +1 -7
- package/dist/commands/execution/index.d.ts +1 -0
- package/dist/commands/execution/index.js +1 -8
- package/dist/commands/execution/list.d.ts +1 -0
- package/dist/commands/execution/logs.d.ts +1 -0
- package/dist/commands/execution/logs.js +1 -7
- package/dist/commands/execution/stop.d.ts +1 -0
- package/dist/commands/execution/stop.js +1 -7
- package/dist/commands/execution/view.d.ts +1 -0
- package/dist/commands/execution/view.js +2 -8
- package/dist/commands/feedback/index.d.ts +1 -0
- package/dist/commands/feedback/list.d.ts +1 -0
- package/dist/commands/feedback/submit.d.ts +1 -0
- package/dist/commands/feedback/view.d.ts +1 -0
- package/dist/commands/gh/index.d.ts +1 -0
- package/dist/commands/gh/login.d.ts +1 -0
- package/dist/commands/gh/status.d.ts +1 -0
- package/dist/commands/gh/token.d.ts +1 -0
- package/dist/commands/init.d.ts +2 -1
- package/dist/commands/init.js +3 -8
- package/dist/commands/label/create.d.ts +20 -0
- package/dist/commands/label/create.js +56 -0
- package/dist/commands/label/delete.d.ts +17 -0
- package/dist/commands/label/delete.js +31 -0
- package/dist/commands/label/group/create.d.ts +20 -0
- package/dist/commands/label/group/create.js +54 -0
- package/dist/commands/label/group/list.d.ts +14 -0
- package/dist/commands/label/group/list.js +51 -0
- package/dist/commands/label/index.d.ts +15 -0
- package/dist/commands/label/index.js +58 -0
- package/dist/commands/label/list.d.ts +16 -0
- package/dist/commands/label/list.js +82 -0
- package/dist/commands/link/create.d.ts +1 -0
- package/dist/commands/link/create.js +0 -6
- package/dist/commands/link/index.d.ts +1 -0
- package/dist/commands/link/index.js +1 -7
- package/dist/commands/link/list.d.ts +1 -0
- package/dist/commands/link/list.js +3 -8
- package/dist/commands/link/remove.d.ts +1 -0
- package/dist/commands/link/remove.js +0 -6
- package/dist/commands/mcp-server.js +2 -1
- package/dist/commands/phase/create.d.ts +1 -0
- package/dist/commands/phase/create.js +1 -1
- package/dist/commands/phase/delete.d.ts +1 -0
- package/dist/commands/phase/delete.js +1 -1
- package/dist/commands/phase/list.d.ts +1 -0
- package/dist/commands/phase/move.d.ts +1 -0
- package/dist/commands/phase/move.js +2 -2
- package/dist/commands/phase/template/apply.d.ts +26 -0
- package/dist/commands/phase/template/apply.js +14 -0
- package/dist/commands/phase/template/create.d.ts +23 -0
- package/dist/commands/phase/template/create.js +14 -0
- package/dist/commands/phase/template/delete.d.ts +18 -0
- package/dist/commands/phase/template/delete.js +61 -0
- package/dist/commands/phase/template/list.d.ts +17 -0
- package/dist/commands/phase/template/list.js +88 -0
- package/dist/commands/phase/template/update.d.ts +1 -0
- package/dist/commands/phase/template/update.js +1 -0
- package/dist/commands/phase/update.d.ts +1 -0
- package/dist/commands/phase/update.js +2 -2
- package/dist/commands/pmo/init.d.ts +4 -3
- package/dist/commands/pmo/init.js +2 -7
- package/dist/commands/pr/create.d.ts +1 -0
- package/dist/commands/pr/index.d.ts +1 -0
- package/dist/commands/pr/link.d.ts +1 -0
- package/dist/commands/pr/list.d.ts +1 -0
- package/dist/commands/pr/status.d.ts +1 -0
- package/dist/commands/priority/add.d.ts +1 -0
- package/dist/commands/priority/add.js +1 -1
- package/dist/commands/priority/list.d.ts +1 -0
- package/dist/commands/priority/remove.d.ts +1 -0
- package/dist/commands/priority/set.d.ts +1 -0
- package/dist/commands/project/archive.d.ts +1 -0
- package/dist/commands/project/create.d.ts +1 -0
- package/dist/commands/project/delete.d.ts +1 -0
- package/dist/commands/project/index.d.ts +1 -0
- package/dist/commands/project/list.d.ts +1 -0
- package/dist/commands/project/spec.d.ts +1 -0
- package/dist/commands/project/unarchive.d.ts +1 -0
- package/dist/commands/project/update.d.ts +1 -0
- package/dist/commands/project/update.js +0 -2
- package/dist/commands/project/view.d.ts +1 -0
- package/dist/commands/pull.d.ts +1 -0
- package/dist/commands/repo/add.d.ts +1 -0
- package/dist/commands/repo/add.js +0 -6
- package/dist/commands/repo/create.d.ts +1 -0
- package/dist/commands/repo/index.d.ts +1 -0
- package/dist/commands/repo/list.d.ts +1 -0
- package/dist/commands/repo/remove.d.ts +1 -0
- package/dist/commands/repo/view.d.ts +1 -0
- package/dist/commands/roadmap/add-project.d.ts +1 -0
- package/dist/commands/roadmap/add-project.js +0 -6
- package/dist/commands/roadmap/create.d.ts +1 -0
- package/dist/commands/roadmap/create.js +0 -6
- package/dist/commands/roadmap/delete.d.ts +1 -0
- package/dist/commands/roadmap/delete.js +0 -6
- package/dist/commands/roadmap/generate.d.ts +1 -0
- package/dist/commands/roadmap/generate.js +1 -8
- package/dist/commands/roadmap/index.d.ts +1 -0
- package/dist/commands/roadmap/index.js +0 -7
- package/dist/commands/roadmap/list.d.ts +1 -0
- package/dist/commands/roadmap/remove-project.d.ts +1 -0
- package/dist/commands/roadmap/remove-project.js +0 -6
- package/dist/commands/roadmap/reorder.d.ts +1 -0
- package/dist/commands/roadmap/reorder.js +0 -6
- package/dist/commands/roadmap/update.d.ts +1 -0
- package/dist/commands/roadmap/update.js +0 -6
- package/dist/commands/roadmap/view.d.ts +1 -0
- package/dist/commands/roadmap/view.js +1 -7
- package/dist/commands/session/attach.d.ts +2 -1
- package/dist/commands/session/attach.js +0 -6
- package/dist/commands/session/health.d.ts +1 -0
- package/dist/commands/session/health.js +1 -1
- package/dist/commands/session/index.d.ts +1 -0
- package/dist/commands/session/index.js +0 -7
- package/dist/commands/session/list.d.ts +1 -0
- package/dist/commands/spec/create.d.ts +1 -0
- package/dist/commands/spec/delete.d.ts +1 -0
- package/dist/commands/spec/edit.d.ts +1 -0
- package/dist/commands/spec/index.d.ts +1 -0
- package/dist/commands/spec/link/depends.d.ts +18 -0
- package/dist/commands/spec/link/depends.js +86 -0
- package/dist/commands/spec/link/index.d.ts +17 -0
- package/dist/commands/spec/link/index.js +92 -0
- package/dist/commands/spec/link/remove.d.ts +18 -0
- package/dist/commands/spec/link/remove.js +90 -0
- package/dist/commands/spec/list.d.ts +1 -0
- package/dist/commands/spec/plan.d.ts +1 -0
- package/dist/commands/spec/ticket.d.ts +1 -0
- package/dist/commands/spec/view.d.ts +1 -0
- package/dist/commands/staff/add.d.ts +3 -2
- package/dist/commands/staff/add.js +2 -6
- package/dist/commands/staff/index.d.ts +2 -1
- package/dist/commands/staff/index.js +0 -6
- package/dist/commands/staff/list.d.ts +1 -0
- package/dist/commands/staff/remove.d.ts +2 -1
- package/dist/commands/staff/remove.js +0 -6
- package/dist/commands/status/category.d.ts +1 -0
- package/dist/commands/status/create.d.ts +1 -0
- package/dist/commands/status/delete.d.ts +1 -0
- package/dist/commands/status/index.d.ts +1 -0
- package/dist/commands/status/list.d.ts +1 -0
- package/dist/commands/status/move.d.ts +1 -0
- package/dist/commands/status/update.d.ts +1 -0
- package/dist/commands/support/book.d.ts +1 -0
- package/dist/commands/support/discord.d.ts +1 -0
- package/dist/commands/support/docs.d.ts +1 -0
- package/dist/commands/support/index.d.ts +1 -0
- package/dist/commands/support/issues.d.ts +1 -0
- package/dist/commands/support/logs.d.ts +1 -0
- package/dist/commands/support/logs.js +2 -2
- package/dist/commands/template/apply.d.ts +1 -0
- package/dist/commands/template/apply.js +5 -10
- package/dist/commands/template/create.d.ts +1 -0
- package/dist/commands/template/create.js +1 -7
- package/dist/commands/template/delete.d.ts +1 -0
- package/dist/commands/template/delete.js +0 -6
- package/dist/commands/template/index.d.ts +1 -0
- package/dist/commands/template/index.js +2 -7
- package/dist/commands/template/list.d.ts +1 -0
- package/dist/commands/template/list.js +1 -7
- package/dist/commands/template/save.d.ts +1 -0
- package/dist/commands/template/save.js +0 -6
- package/dist/commands/template/update.d.ts +1 -0
- package/dist/commands/template/update.js +0 -6
- package/dist/commands/terminal/title.d.ts +1 -0
- package/dist/commands/theme/index.d.ts +1 -0
- package/dist/commands/theme/index.js +2 -7
- package/dist/commands/theme/list.d.ts +1 -0
- package/dist/commands/theme/set.d.ts +1 -0
- package/dist/commands/theme/set.js +3 -7
- package/dist/commands/ticket/bulk.d.ts +1 -0
- package/dist/commands/ticket/bulk.js +0 -7
- package/dist/commands/ticket/category.d.ts +1 -0
- package/dist/commands/ticket/complete.d.ts +2 -1
- package/dist/commands/ticket/complete.js +2 -8
- package/dist/commands/ticket/create.d.ts +2 -1
- package/dist/commands/ticket/create.js +0 -6
- package/dist/commands/ticket/delete.d.ts +2 -1
- package/dist/commands/ticket/delete.js +0 -6
- package/dist/commands/ticket/edit.d.ts +1 -0
- package/dist/commands/ticket/edit.js +0 -6
- package/dist/commands/ticket/epic.d.ts +2 -1
- package/dist/commands/ticket/epic.js +0 -6
- package/dist/commands/ticket/index.d.ts +1 -0
- package/dist/commands/ticket/index.js +6 -9
- package/dist/commands/ticket/link/block.d.ts +15 -0
- package/dist/commands/ticket/link/block.js +95 -0
- package/dist/commands/ticket/link/index.d.ts +14 -0
- package/dist/commands/ticket/link/index.js +96 -0
- package/dist/commands/ticket/list.d.ts +2 -0
- package/dist/commands/ticket/list.js +6 -0
- package/dist/commands/ticket/move.d.ts +2 -1
- package/dist/commands/ticket/move.js +2 -8
- package/dist/commands/ticket/project.d.ts +2 -1
- package/dist/commands/ticket/project.js +0 -6
- package/dist/commands/ticket/reassign.d.ts +2 -1
- package/dist/commands/ticket/reassign.js +0 -6
- package/dist/commands/ticket/resolve.d.ts +68 -0
- package/dist/commands/ticket/resolve.js +294 -0
- package/dist/commands/ticket/spec.d.ts +2 -1
- package/dist/commands/ticket/spec.js +0 -6
- package/dist/commands/ticket/status.d.ts +1 -0
- package/dist/commands/ticket/status.js +1 -7
- package/dist/commands/ticket/template/apply.d.ts +26 -0
- package/dist/commands/ticket/template/apply.js +14 -0
- package/dist/commands/ticket/template/delete.d.ts +18 -0
- package/dist/commands/ticket/template/delete.js +61 -0
- package/dist/commands/ticket/template/list.d.ts +17 -0
- package/dist/commands/ticket/template/list.js +77 -0
- package/dist/commands/ticket/template/save.d.ts +17 -0
- package/dist/commands/ticket/template/save.js +97 -0
- package/dist/commands/ticket/update.d.ts +2 -1
- package/dist/commands/ticket/update.js +0 -6
- package/dist/commands/ticket/view.d.ts +2 -0
- package/dist/commands/ticket/view.js +2 -7
- package/dist/commands/whoami.d.ts +1 -0
- package/dist/commands/work/complete.d.ts +1 -0
- package/dist/commands/work/complete.js +1 -7
- package/dist/commands/work/index.d.ts +1 -0
- package/dist/commands/work/index.js +4 -7
- package/dist/commands/work/ready.d.ts +2 -1
- package/dist/commands/work/ready.js +38 -14
- package/dist/commands/work/resolve.d.ts +15 -0
- package/dist/commands/work/resolve.js +76 -0
- package/dist/commands/work/revise.d.ts +2 -1
- package/dist/commands/work/revise.js +0 -6
- package/dist/commands/work/spawn-all.d.ts +2 -1
- package/dist/commands/work/spawn-all.js +2 -6
- package/dist/commands/work/spawn.d.ts +2 -1
- package/dist/commands/work/spawn.js +4 -10
- package/dist/commands/work/start.d.ts +3 -1
- package/dist/commands/work/start.js +52 -23
- package/dist/commands/work/watch.d.ts +2 -1
- package/dist/commands/work/watch.js +0 -6
- package/dist/commands/workflow/create.d.ts +1 -0
- package/dist/commands/workflow/delete.d.ts +1 -0
- package/dist/commands/workflow/index.d.ts +1 -0
- package/dist/commands/workflow/index.js +1 -7
- package/dist/commands/workflow/list.d.ts +1 -0
- package/dist/commands/workflow/switch.d.ts +1 -0
- package/dist/commands/workflow/view.d.ts +1 -0
- package/dist/commands/workspace/add.d.ts +2 -0
- package/dist/commands/workspace/add.js +2 -0
- package/dist/commands/workspace/list.d.ts +1 -0
- package/dist/commands/workspace/list.js +4 -8
- package/dist/commands/workspace/prune.d.ts +1 -0
- package/dist/commands/workspace/prune.js +4 -6
- package/dist/commands/workspace/remove.d.ts +1 -0
- package/dist/commands/workspace/remove.js +3 -7
- package/dist/commands/workspace/use.d.ts +1 -0
- package/dist/commands/workspace/use.js +3 -7
- package/dist/lib/database/drizzle-schema.d.ts +1 -1
- package/dist/lib/database/index.d.ts +1 -1
- package/dist/lib/database/index.js +20 -0
- package/dist/lib/execution/devcontainer.js +3 -1
- package/dist/lib/execution/runners.d.ts +7 -2
- package/dist/lib/execution/runners.js +18 -10
- package/dist/lib/execution/types.d.ts +1 -0
- package/dist/lib/flags/resolver.js +1 -0
- package/dist/lib/mcp/helpers.d.ts +1 -2
- package/dist/lib/mcp/tools/diet.js +1 -0
- package/dist/lib/mcp/tools/index.d.ts +1 -0
- package/dist/lib/mcp/tools/index.js +1 -0
- package/dist/lib/mcp/tools/label.d.ts +6 -0
- package/dist/lib/mcp/tools/label.js +338 -0
- package/dist/lib/mcp/tools/ticket.js +53 -17
- package/dist/lib/multiline-input.js +6 -18
- package/dist/lib/pmo/base-command.d.ts +4 -2
- package/dist/lib/pmo/base-command.js +9 -4
- package/dist/lib/pmo/schema.d.ts +6 -0
- package/dist/lib/pmo/schema.js +44 -0
- package/dist/lib/pmo/storage/base.d.ts +6 -0
- package/dist/lib/pmo/storage/base.js +185 -7
- package/dist/lib/pmo/storage/index.d.ts +23 -1
- package/dist/lib/pmo/storage/index.js +59 -1
- package/dist/lib/pmo/storage/labels.d.ts +55 -0
- package/dist/lib/pmo/storage/labels.js +346 -0
- package/dist/lib/pmo/storage/tickets.js +17 -0
- package/dist/lib/pmo/storage/types.d.ts +24 -0
- package/dist/lib/pmo/types.d.ts +44 -0
- package/dist/lib/pmo/utils.js +1 -1
- package/dist/lib/prompt-json.d.ts +5 -2
- package/dist/lib/prompt-json.js +4 -4
- package/oclif.manifest.json +6571 -3748
- package/package.json +1 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
|
|
3
|
+
import { styles } from '../../../lib/styles.js';
|
|
4
|
+
export default class TicketTemplateList extends PMOCommand {
|
|
5
|
+
static description = 'List ticket templates';
|
|
6
|
+
static examples = [
|
|
7
|
+
'<%= config.bin %> <%= command.id %>',
|
|
8
|
+
'<%= config.bin %> <%= command.id %> --builtin',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> --json',
|
|
10
|
+
];
|
|
11
|
+
static flags = {
|
|
12
|
+
...pmoBaseFlags,
|
|
13
|
+
builtin: Flags.boolean({
|
|
14
|
+
description: 'Show only built-in templates',
|
|
15
|
+
exclusive: ['custom'],
|
|
16
|
+
}),
|
|
17
|
+
custom: Flags.boolean({
|
|
18
|
+
description: 'Show only custom templates',
|
|
19
|
+
exclusive: ['builtin'],
|
|
20
|
+
}),
|
|
21
|
+
};
|
|
22
|
+
getPMOOptions() {
|
|
23
|
+
return { promptIfMultiple: false };
|
|
24
|
+
}
|
|
25
|
+
async execute() {
|
|
26
|
+
const { flags } = await this.parse(TicketTemplateList);
|
|
27
|
+
let builtinFilter;
|
|
28
|
+
if (flags.builtin)
|
|
29
|
+
builtinFilter = { isBuiltin: true };
|
|
30
|
+
if (flags.custom)
|
|
31
|
+
builtinFilter = { isBuiltin: false };
|
|
32
|
+
const templates = await this.storage.listTicketTemplates(builtinFilter);
|
|
33
|
+
if (flags.json) {
|
|
34
|
+
this.log(JSON.stringify(templates, null, 2));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (templates.length === 0) {
|
|
38
|
+
this.log(styles.muted('\nNo ticket templates found.'));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
this.log(`\n${styles.emphasis('Ticket Templates')}`);
|
|
42
|
+
this.log('═'.repeat(60));
|
|
43
|
+
const builtinTemplates = templates.filter(t => t.isBuiltin);
|
|
44
|
+
const customTemplates = templates.filter(t => !t.isBuiltin);
|
|
45
|
+
if (builtinTemplates.length > 0 && !flags.custom) {
|
|
46
|
+
this.log(`\n${styles.emphasis('Built-in Templates')}`);
|
|
47
|
+
this.log('─'.repeat(40));
|
|
48
|
+
for (const template of builtinTemplates) {
|
|
49
|
+
this.printTemplate(template);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (customTemplates.length > 0 && !flags.builtin) {
|
|
53
|
+
this.log(`\n${styles.emphasis('Custom Templates')}`);
|
|
54
|
+
this.log('─'.repeat(40));
|
|
55
|
+
for (const template of customTemplates) {
|
|
56
|
+
this.printTemplate(template);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
this.log('');
|
|
60
|
+
}
|
|
61
|
+
printTemplate(template) {
|
|
62
|
+
this.log(` ${styles.emphasis(template.name)} ${styles.muted(`(${template.id})`)}`);
|
|
63
|
+
if (template.description) {
|
|
64
|
+
this.log(` ${styles.muted(template.description)}`);
|
|
65
|
+
}
|
|
66
|
+
const details = [];
|
|
67
|
+
if (template.defaultPriority)
|
|
68
|
+
details.push(`Priority: ${template.defaultPriority}`);
|
|
69
|
+
if (template.defaultCategory)
|
|
70
|
+
details.push(`Category: ${template.defaultCategory}`);
|
|
71
|
+
if (template.suggestedSubtasks.length > 0)
|
|
72
|
+
details.push(`Subtasks: ${template.suggestedSubtasks.length}`);
|
|
73
|
+
if (details.length > 0) {
|
|
74
|
+
this.log(` ${styles.muted(details.join(' | '))}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PMOCommand } from '../../../lib/pmo/index.js';
|
|
2
|
+
export default class TicketTemplateSave extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
ticket: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
'template-name': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
};
|
|
16
|
+
execute(): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Flags, Args } from '@oclif/core';
|
|
2
|
+
import { PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
|
|
3
|
+
import { styles } from '../../../lib/styles.js';
|
|
4
|
+
import { shouldOutputJson, outputPromptAsJson, outputSuccessAsJson, outputErrorAsJson, createMetadata, buildPromptConfig, } from '../../../lib/prompt-json.js';
|
|
5
|
+
export default class TicketTemplateSave extends PMOCommand {
|
|
6
|
+
static description = 'Create a ticket template from an existing ticket';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %> TKT-001 "Bug Report Template"',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> TKT-042 "Feature Request" -d "Standard feature request"',
|
|
10
|
+
];
|
|
11
|
+
static args = {
|
|
12
|
+
ticket: Args.string({
|
|
13
|
+
description: 'Ticket ID to create template from',
|
|
14
|
+
required: false,
|
|
15
|
+
}),
|
|
16
|
+
name: Args.string({
|
|
17
|
+
description: 'Template name',
|
|
18
|
+
required: false,
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
static flags = {
|
|
22
|
+
...pmoBaseFlags,
|
|
23
|
+
'template-name': Flags.string({
|
|
24
|
+
char: 'n',
|
|
25
|
+
description: 'Template name (alternative to positional arg)',
|
|
26
|
+
}),
|
|
27
|
+
description: Flags.string({
|
|
28
|
+
char: 'd',
|
|
29
|
+
description: 'Template description',
|
|
30
|
+
}),
|
|
31
|
+
};
|
|
32
|
+
async execute() {
|
|
33
|
+
const { args, flags } = await this.parse(TicketTemplateSave);
|
|
34
|
+
const jsonMode = shouldOutputJson(flags);
|
|
35
|
+
const handleError = (code, message) => {
|
|
36
|
+
if (jsonMode) {
|
|
37
|
+
outputErrorAsJson(code, message, createMetadata('ticket template save', flags));
|
|
38
|
+
}
|
|
39
|
+
this.error(message);
|
|
40
|
+
};
|
|
41
|
+
// Get ticket ID
|
|
42
|
+
let ticketId = args.ticket;
|
|
43
|
+
if (!ticketId) {
|
|
44
|
+
const projectId = await this.requireProject();
|
|
45
|
+
const tickets = await this.storage.listTickets(projectId);
|
|
46
|
+
if (tickets.length === 0) {
|
|
47
|
+
return handleError('NO_TICKETS', 'No tickets found. Create a ticket first.');
|
|
48
|
+
}
|
|
49
|
+
if (jsonMode) {
|
|
50
|
+
const choices = tickets.slice(0, 20).map(t => ({ name: `${t.id} - ${t.title}`, value: t.id }));
|
|
51
|
+
outputPromptAsJson(buildPromptConfig('list', 'ticket', 'Select ticket:', choices), createMetadata('ticket template save', flags));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const { selected } = await this.prompt([{
|
|
55
|
+
type: 'list',
|
|
56
|
+
name: 'selected',
|
|
57
|
+
message: 'Select ticket:',
|
|
58
|
+
choices: tickets.slice(0, 20).map(t => ({ name: `${t.id} - ${t.title}`, value: t.id })),
|
|
59
|
+
}], null);
|
|
60
|
+
ticketId = selected;
|
|
61
|
+
}
|
|
62
|
+
const ticket = await this.storage.getTicket(ticketId);
|
|
63
|
+
if (!ticket) {
|
|
64
|
+
return handleError('TICKET_NOT_FOUND', `Ticket not found: ${ticketId}`);
|
|
65
|
+
}
|
|
66
|
+
// Get template name
|
|
67
|
+
let templateName = flags['template-name'] || args.name;
|
|
68
|
+
if (!templateName) {
|
|
69
|
+
if (jsonMode) {
|
|
70
|
+
outputPromptAsJson(buildPromptConfig('input', 'name', 'Template name:', undefined, ticket.category || ticket.title.split(' ')[0]), createMetadata('ticket template save', flags));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const { name } = await this.prompt([{
|
|
74
|
+
type: 'input',
|
|
75
|
+
name: 'name',
|
|
76
|
+
message: 'Template name:',
|
|
77
|
+
default: ticket.category || ticket.title.split(' ')[0],
|
|
78
|
+
validate: (i) => i.length > 0 || 'Required',
|
|
79
|
+
}], null);
|
|
80
|
+
templateName = name;
|
|
81
|
+
}
|
|
82
|
+
// Get description
|
|
83
|
+
let description = flags.description;
|
|
84
|
+
if (description === undefined && !jsonMode) {
|
|
85
|
+
const { desc } = await this.prompt([{ type: 'input', name: 'desc', message: 'Description (optional):' }], null);
|
|
86
|
+
description = desc || undefined;
|
|
87
|
+
}
|
|
88
|
+
const template = await this.storage.createTicketTemplateFromTicket(ticketId, templateName, description);
|
|
89
|
+
if (flags.json === true) {
|
|
90
|
+
outputSuccessAsJson({ template, sourceTicketId: ticketId }, createMetadata('ticket template save', flags));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.log(styles.success(`\nCreated template "${styles.emphasis(template.name)}" from ${ticketId}`));
|
|
94
|
+
this.log(styles.muted(` ID: ${template.id}`));
|
|
95
|
+
this.log(styles.muted(`\nApply with: prlt ticket template apply ${template.id}`));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -6,11 +6,12 @@ export default class TicketUpdate extends PMOCommand {
|
|
|
6
6
|
ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
7
|
};
|
|
8
8
|
static flags: {
|
|
9
|
-
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
9
|
priority: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
10
|
category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
11
|
bulk: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
12
|
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
15
|
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
16
|
};
|
|
16
17
|
execute(): Promise<void>;
|
|
@@ -20,12 +20,6 @@ export default class TicketUpdate extends PMOCommand {
|
|
|
20
20
|
};
|
|
21
21
|
static flags = {
|
|
22
22
|
...pmoBaseFlags,
|
|
23
|
-
json: Flags.boolean({
|
|
24
|
-
char: 'm',
|
|
25
|
-
aliases: ['machine'],
|
|
26
|
-
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
27
|
-
default: false,
|
|
28
|
-
}),
|
|
29
23
|
priority: Flags.string({
|
|
30
24
|
char: 'p',
|
|
31
25
|
description: 'Set priority (uses workspace priority scale)',
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
2
|
export default class TicketView extends PMOCommand {
|
|
3
|
+
static aliases: string[];
|
|
3
4
|
static description: string;
|
|
4
5
|
static examples: string[];
|
|
5
6
|
static flags: {
|
|
6
7
|
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
9
|
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
10
|
};
|
|
9
11
|
static args: {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { Args
|
|
1
|
+
import { Args } from '@oclif/core';
|
|
2
2
|
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
3
|
import { styles } from '../../lib/styles.js';
|
|
4
4
|
import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
5
5
|
export default class TicketView extends PMOCommand {
|
|
6
|
+
static aliases = ['ticket:show'];
|
|
6
7
|
static description = 'View detailed ticket information';
|
|
7
8
|
static examples = [
|
|
8
9
|
'<%= config.bin %> <%= command.id %> TICK-001',
|
|
@@ -10,12 +11,6 @@ export default class TicketView extends PMOCommand {
|
|
|
10
11
|
];
|
|
11
12
|
static flags = {
|
|
12
13
|
...pmoBaseFlags,
|
|
13
|
-
json: Flags.boolean({
|
|
14
|
-
char: 'm',
|
|
15
|
-
aliases: ['machine'],
|
|
16
|
-
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
17
|
-
default: false,
|
|
18
|
-
}),
|
|
19
14
|
};
|
|
20
15
|
static args = {
|
|
21
16
|
ticketId: Args.string({
|
|
@@ -4,6 +4,7 @@ export default class Whoami extends Command {
|
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
6
|
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
8
|
};
|
|
8
9
|
run(): Promise<void>;
|
|
9
10
|
private detectAgentName;
|
|
@@ -7,6 +7,7 @@ export default class WorkComplete extends PMOCommand {
|
|
|
7
7
|
};
|
|
8
8
|
static flags: {
|
|
9
9
|
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
11
|
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
12
|
};
|
|
12
13
|
execute(): Promise<void>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Args
|
|
1
|
+
import { Args } from '@oclif/core';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
3
|
import Database from 'better-sqlite3';
|
|
4
4
|
import { PMOCommand, pmoBaseFlags, autoExportToBoard } from '../../lib/pmo/index.js';
|
|
@@ -21,12 +21,6 @@ export default class WorkComplete extends PMOCommand {
|
|
|
21
21
|
};
|
|
22
22
|
static flags = {
|
|
23
23
|
...pmoBaseFlags,
|
|
24
|
-
json: Flags.boolean({
|
|
25
|
-
char: 'm',
|
|
26
|
-
aliases: ['machine'],
|
|
27
|
-
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
28
|
-
default: false,
|
|
29
|
-
}),
|
|
30
24
|
};
|
|
31
25
|
async execute() {
|
|
32
26
|
const { args, flags } = await this.parse(WorkComplete);
|
|
@@ -4,6 +4,7 @@ export default class Work extends PMOCommand {
|
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
6
|
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
8
|
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
9
|
};
|
|
9
10
|
protected getPMOOptions(): {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Flags } from '@oclif/core';
|
|
2
1
|
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
2
|
import { shouldOutputJson } from '../../lib/prompt-json.js';
|
|
4
3
|
export default class Work extends PMOCommand {
|
|
@@ -8,12 +7,6 @@ export default class Work extends PMOCommand {
|
|
|
8
7
|
];
|
|
9
8
|
static flags = {
|
|
10
9
|
...pmoBaseFlags,
|
|
11
|
-
json: Flags.boolean({
|
|
12
|
-
char: 'm',
|
|
13
|
-
aliases: ['machine'],
|
|
14
|
-
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
15
|
-
default: false,
|
|
16
|
-
}),
|
|
17
10
|
};
|
|
18
11
|
getPMOOptions() {
|
|
19
12
|
// Prompt for project selection so we can pass it to subcommands
|
|
@@ -30,6 +23,7 @@ export default class Work extends PMOCommand {
|
|
|
30
23
|
// Each choice includes the full command for AI agents to execute
|
|
31
24
|
const menuChoices = [
|
|
32
25
|
{ id: 'start', name: 'Start work (launch single agent)', command: `prlt work start -P ${projectId} --json` },
|
|
26
|
+
{ id: 'resolve', name: 'Resolve questions (agent-assisted)', command: `prlt work resolve -P ${projectId} --json` },
|
|
33
27
|
{ id: 'spawn', name: 'Spawn work (batch by column)', command: `prlt work spawn -P ${projectId} --json` },
|
|
34
28
|
{ id: 'watch', name: 'Watch column (auto-spawn)', command: `prlt work watch -P ${projectId} --json` },
|
|
35
29
|
{ id: 'ready', name: 'Mark work ready for review', command: `prlt work ready -P ${projectId} --json` },
|
|
@@ -55,6 +49,9 @@ export default class Work extends PMOCommand {
|
|
|
55
49
|
case 'start':
|
|
56
50
|
await this.config.runCommand('work:start', projectArgs);
|
|
57
51
|
break;
|
|
52
|
+
case 'resolve':
|
|
53
|
+
await this.config.runCommand('work:resolve', projectArgs);
|
|
54
|
+
break;
|
|
58
55
|
case 'spawn':
|
|
59
56
|
await this.config.runCommand('work:spawn', projectArgs);
|
|
60
57
|
break;
|
|
@@ -6,10 +6,11 @@ export default class WorkReady extends PMOCommand {
|
|
|
6
6
|
ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
7
|
};
|
|
8
8
|
static flags: {
|
|
9
|
-
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
9
|
pr: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
10
|
'draft-pr': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
11
|
'no-pr': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
14
|
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
15
|
};
|
|
15
16
|
execute(): Promise<void>;
|
|
@@ -26,12 +26,6 @@ export default class WorkReady extends PMOCommand {
|
|
|
26
26
|
};
|
|
27
27
|
static flags = {
|
|
28
28
|
...pmoBaseFlags,
|
|
29
|
-
json: Flags.boolean({
|
|
30
|
-
char: 'm',
|
|
31
|
-
aliases: ['machine'],
|
|
32
|
-
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
33
|
-
default: false,
|
|
34
|
-
}),
|
|
35
29
|
pr: Flags.boolean({
|
|
36
30
|
description: 'Create a pull request for this work',
|
|
37
31
|
default: false,
|
|
@@ -152,14 +146,27 @@ export default class WorkReady extends PMOCommand {
|
|
|
152
146
|
}
|
|
153
147
|
}
|
|
154
148
|
else {
|
|
155
|
-
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
149
|
+
// Resolve agent directory based on agent type (staff vs temp)
|
|
150
|
+
const agentRecord = workspaceInfo.agents.find(a => a.name === agentName);
|
|
151
|
+
let agentDir;
|
|
152
|
+
if (agentRecord?.worktree_path) {
|
|
153
|
+
// Use the worktree_path from the database if available
|
|
154
|
+
agentDir = path.join(workspaceInfo.path, agentRecord.worktree_path);
|
|
155
|
+
}
|
|
156
|
+
else if (agentRecord?.type === 'ephemeral') {
|
|
157
|
+
agentDir = path.join(workspaceInfo.path, 'agents', workspaceInfo.ephemeralAgentsDir, agentName);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
agentDir = path.join(workspaceInfo.path, 'agents', workspaceInfo.persistentAgentsDir, agentName);
|
|
161
|
+
}
|
|
162
|
+
if (fs.existsSync(agentDir)) {
|
|
163
|
+
// Look for repo directories inside agent dir
|
|
164
|
+
const entries = fs.readdirSync(agentDir, { withFileTypes: true });
|
|
165
|
+
const repoDirs = entries.filter((e) => e.isDirectory() && !e.name.startsWith('.') && e.name !== 'node_modules');
|
|
166
|
+
if (repoDirs.length > 0) {
|
|
167
|
+
// Use the first repo directory (typically the main worktree)
|
|
168
|
+
worktreePath = path.join(agentDir, repoDirs[0].name);
|
|
169
|
+
}
|
|
163
170
|
}
|
|
164
171
|
}
|
|
165
172
|
}
|
|
@@ -247,6 +254,23 @@ export default class WorkReady extends PMOCommand {
|
|
|
247
254
|
}
|
|
248
255
|
try {
|
|
249
256
|
const baseBranch = getDefaultBaseBranch();
|
|
257
|
+
// Check if PR already exists for this branch
|
|
258
|
+
const existingPR = getPRForBranch(currentBranch);
|
|
259
|
+
if (existingPR) {
|
|
260
|
+
if (existingPR.state === 'MERGED') {
|
|
261
|
+
this.log(styles.muted(` PR #${existingPR.number} already merged: ${existingPR.url}`));
|
|
262
|
+
return existingPR.url;
|
|
263
|
+
}
|
|
264
|
+
if (existingPR.state === 'OPEN') {
|
|
265
|
+
// Push any unpushed commits so the existing PR is up to date
|
|
266
|
+
if (hasUnpushedCommits(currentBranch)) {
|
|
267
|
+
this.log(styles.muted(` Pushing unpushed commits to existing PR...`));
|
|
268
|
+
pushBranch(currentBranch);
|
|
269
|
+
}
|
|
270
|
+
this.log(styles.muted(` PR #${existingPR.number} already exists: ${existingPR.url}`));
|
|
271
|
+
return existingPR.url;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
250
274
|
// Push branch if needed
|
|
251
275
|
if (!hasBranchBeenPushed(currentBranch)) {
|
|
252
276
|
this.log(styles.muted(` Pushing branch to origin...`));
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class WorkResolve extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static strict: boolean;
|
|
6
|
+
static args: {
|
|
7
|
+
ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
14
|
+
execute(): Promise<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Args, Flags } from '@oclif/core';
|
|
2
|
+
import { PMOCommand, pmoBaseFlags } 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 WorkResolve extends PMOCommand {
|
|
6
|
+
static description = 'Agent-assisted resolution of ambiguity questions on tickets (spawns interactive agent)';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %> TKT-001',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> TKT-001 TKT-002',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> # Interactive picker for needs-clarification tickets',
|
|
11
|
+
];
|
|
12
|
+
static strict = false;
|
|
13
|
+
static args = {
|
|
14
|
+
ticketId: Args.string({
|
|
15
|
+
description: 'Ticket ID(s) to resolve - prompts with picker if not provided',
|
|
16
|
+
required: false,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
static flags = {
|
|
20
|
+
...pmoBaseFlags,
|
|
21
|
+
json: Flags.boolean({
|
|
22
|
+
char: 'm',
|
|
23
|
+
aliases: ['machine'],
|
|
24
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
25
|
+
default: false,
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
async execute() {
|
|
29
|
+
const { flags, argv } = await this.parse(WorkResolve);
|
|
30
|
+
const projectId = flags.project;
|
|
31
|
+
const jsonMode = shouldOutputJson(flags);
|
|
32
|
+
const handleError = (code, message) => {
|
|
33
|
+
if (jsonMode) {
|
|
34
|
+
outputErrorAsJson(code, message, createMetadata('work resolve', flags));
|
|
35
|
+
this.exit(1);
|
|
36
|
+
}
|
|
37
|
+
this.error(message);
|
|
38
|
+
};
|
|
39
|
+
// Collect ticket IDs from argv (supports multiple args)
|
|
40
|
+
let ticketIds = argv.filter(a => !a.startsWith('-'));
|
|
41
|
+
if (ticketIds.length === 0) {
|
|
42
|
+
// No tickets specified - show picker of needs-clarification tickets
|
|
43
|
+
const allTickets = await this.storage.listTickets(projectId);
|
|
44
|
+
const clarificationTickets = allTickets.filter((t) => t.labels.includes('needs-clarification') ||
|
|
45
|
+
t.statusName?.toLowerCase() === 'needs clarification');
|
|
46
|
+
if (clarificationTickets.length === 0) {
|
|
47
|
+
return handleError('NO_TICKETS', 'No tickets need clarification. Run "prlt work start --action groom" to groom tickets first.');
|
|
48
|
+
}
|
|
49
|
+
const selected = await this.selectFromList({
|
|
50
|
+
message: 'Select ticket to resolve (agent-assisted):',
|
|
51
|
+
items: clarificationTickets,
|
|
52
|
+
getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
|
|
53
|
+
getValue: (t) => t.id,
|
|
54
|
+
getCommand: (t) => `prlt work resolve ${t.id}${projectId ? ` -P ${projectId}` : ''} --json`,
|
|
55
|
+
jsonMode: jsonMode ? { flags, commandName: 'work resolve' } : null,
|
|
56
|
+
});
|
|
57
|
+
if (!selected) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
ticketIds = [selected];
|
|
61
|
+
}
|
|
62
|
+
// Launch work start with resolve action for each ticket
|
|
63
|
+
for (const ticketId of ticketIds) {
|
|
64
|
+
this.log(styles.info(`\nLaunching agent-assisted resolve for ${styles.emphasis(ticketId)}...`));
|
|
65
|
+
const workStartArgs = [ticketId, '--action', 'resolve'];
|
|
66
|
+
if (projectId) {
|
|
67
|
+
workStartArgs.push('--project', projectId);
|
|
68
|
+
}
|
|
69
|
+
if (jsonMode) {
|
|
70
|
+
workStartArgs.push('--json');
|
|
71
|
+
}
|
|
72
|
+
// eslint-disable-next-line no-await-in-loop
|
|
73
|
+
await this.config.runCommand('work:start', workStartArgs);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -6,12 +6,13 @@ export default class WorkRevise extends PMOCommand {
|
|
|
6
6
|
ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
7
|
};
|
|
8
8
|
static flags: {
|
|
9
|
-
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
9
|
mode: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
10
|
executor: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
11
|
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
12
|
'run-on-host': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
13
|
session: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
16
|
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
17
|
};
|
|
17
18
|
execute(): Promise<void>;
|
|
@@ -30,12 +30,6 @@ export default class WorkRevise extends PMOCommand {
|
|
|
30
30
|
};
|
|
31
31
|
static flags = {
|
|
32
32
|
...pmoBaseFlags,
|
|
33
|
-
json: Flags.boolean({
|
|
34
|
-
char: 'm',
|
|
35
|
-
aliases: ['machine'],
|
|
36
|
-
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
37
|
-
default: false,
|
|
38
|
-
}),
|
|
39
33
|
mode: Flags.string({
|
|
40
34
|
char: 'd',
|
|
41
35
|
description: 'Runtime mode',
|
|
@@ -3,12 +3,13 @@ export default class WorkSpawnAll extends PMOCommand {
|
|
|
3
3
|
static description: string;
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
|
-
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
6
|
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
7
|
'run-on-host': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
8
|
'skip-permissions': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
9
|
'create-pr': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
10
|
executor: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
13
|
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
14
|
};
|
|
14
15
|
protected getPMOOptions(): {
|
|
@@ -10,12 +10,6 @@ export default class WorkSpawnAll extends PMOCommand {
|
|
|
10
10
|
];
|
|
11
11
|
static flags = {
|
|
12
12
|
...pmoBaseFlags,
|
|
13
|
-
json: Flags.boolean({
|
|
14
|
-
char: 'm',
|
|
15
|
-
aliases: ['machine'],
|
|
16
|
-
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
17
|
-
default: false,
|
|
18
|
-
}),
|
|
19
13
|
force: Flags.boolean({
|
|
20
14
|
char: 'f',
|
|
21
15
|
description: 'Start even if work already in progress',
|
|
@@ -51,6 +45,8 @@ export default class WorkSpawnAll extends PMOCommand {
|
|
|
51
45
|
const args = ['--all', '--project', projectId];
|
|
52
46
|
if (flags.json)
|
|
53
47
|
args.push('--json');
|
|
48
|
+
if (flags.machine)
|
|
49
|
+
args.push('--machine');
|
|
54
50
|
if (flags.force)
|
|
55
51
|
args.push('--force');
|
|
56
52
|
if (flags['run-on-host'])
|
|
@@ -4,7 +4,6 @@ export default class WorkSpawn extends PMOCommand {
|
|
|
4
4
|
static strict: boolean;
|
|
5
5
|
static examples: string[];
|
|
6
6
|
static flags: {
|
|
7
|
-
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
7
|
all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
8
|
many: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
9
|
column: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
@@ -32,6 +31,8 @@ export default class WorkSpawn extends PMOCommand {
|
|
|
32
31
|
priority: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
33
32
|
epic: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
34
33
|
status: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
34
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
35
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
35
36
|
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
36
37
|
};
|
|
37
38
|
execute(): Promise<void>;
|
|
@@ -28,12 +28,6 @@ export default class WorkSpawn extends PMOCommand {
|
|
|
28
28
|
];
|
|
29
29
|
static flags = {
|
|
30
30
|
...pmoBaseFlags,
|
|
31
|
-
json: Flags.boolean({
|
|
32
|
-
char: 'm',
|
|
33
|
-
aliases: ['machine'],
|
|
34
|
-
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
35
|
-
default: false,
|
|
36
|
-
}),
|
|
37
31
|
all: Flags.boolean({
|
|
38
32
|
char: 'a',
|
|
39
33
|
description: 'Spawn all tickets tickets in a column',
|
|
@@ -497,18 +491,18 @@ export default class WorkSpawn extends PMOCommand {
|
|
|
497
491
|
let candidates = [...allTickets];
|
|
498
492
|
// Apply category filter
|
|
499
493
|
if (flags.category) {
|
|
500
|
-
const categoryList = flags.category.split(',').map(c => c.trim().toLowerCase());
|
|
494
|
+
const categoryList = new Set(flags.category.split(',').map(c => c.trim().toLowerCase()));
|
|
501
495
|
candidates = candidates.filter(t => {
|
|
502
496
|
const ticketCat = (t.category || '').toLowerCase();
|
|
503
|
-
return categoryList.
|
|
497
|
+
return categoryList.has(ticketCat);
|
|
504
498
|
});
|
|
505
499
|
}
|
|
506
500
|
// Apply priority filter
|
|
507
501
|
if (flags.priority) {
|
|
508
|
-
const priorityList = flags.priority.split(',').map(p => p.trim().toUpperCase());
|
|
502
|
+
const priorityList = new Set(flags.priority.split(',').map(p => p.trim().toUpperCase()));
|
|
509
503
|
candidates = candidates.filter(t => {
|
|
510
504
|
const ticketPriority = (t.priority || '').toUpperCase();
|
|
511
|
-
return priorityList.
|
|
505
|
+
return priorityList.has(ticketPriority);
|
|
512
506
|
});
|
|
513
507
|
}
|
|
514
508
|
// Apply epic filter
|