@proletariat/cli 0.3.72 → 0.3.73
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.js +1 -0
- package/dist/commands/action/create.js.map +1 -1
- package/dist/commands/action/delete.js +1 -1
- package/dist/commands/action/delete.js.map +1 -1
- package/dist/commands/action/run.js +1 -1
- package/dist/commands/action/run.js.map +1 -1
- package/dist/commands/action/show.js +1 -0
- package/dist/commands/action/show.js.map +1 -1
- package/dist/commands/action/update.js +1 -1
- package/dist/commands/action/update.js.map +1 -1
- package/dist/commands/agent/auth.js +4 -0
- package/dist/commands/agent/auth.js.map +1 -1
- package/dist/commands/agent/cleanup.js +1 -1
- package/dist/commands/agent/cleanup.js.map +1 -1
- package/dist/commands/agent/discover.js +1 -0
- package/dist/commands/agent/discover.js.map +1 -1
- package/dist/commands/agent/index.js +2 -0
- package/dist/commands/agent/index.js.map +1 -1
- package/dist/commands/agent/rebuild.js +1 -1
- package/dist/commands/agent/rebuild.js.map +1 -1
- package/dist/commands/agent/remove.js +1 -1
- package/dist/commands/agent/remove.js.map +1 -1
- package/dist/commands/agent/restart.js +1 -1
- package/dist/commands/agent/restart.js.map +1 -1
- package/dist/commands/agent/visit.js +1 -1
- package/dist/commands/agent/visit.js.map +1 -1
- package/dist/commands/asana/connect.js +6 -5
- package/dist/commands/asana/connect.js.map +1 -1
- package/dist/commands/asana/import.js +4 -4
- package/dist/commands/asana/import.js.map +1 -1
- package/dist/commands/asana/sync.js +3 -3
- package/dist/commands/asana/sync.js.map +1 -1
- package/dist/commands/autocomplete/setup.js +2 -1
- package/dist/commands/autocomplete/setup.js.map +1 -1
- package/dist/commands/board/index.js +1 -0
- package/dist/commands/board/index.js.map +1 -1
- package/dist/commands/board/view.js +1 -1
- package/dist/commands/board/view.js.map +1 -1
- package/dist/commands/branch/create.js +1 -1
- package/dist/commands/branch/create.js.map +1 -1
- package/dist/commands/branch/validate.js +2 -0
- package/dist/commands/branch/validate.js.map +1 -1
- package/dist/commands/branch/where.js +1 -0
- package/dist/commands/branch/where.js.map +1 -1
- package/dist/commands/category/create.js +3 -0
- package/dist/commands/category/create.js.map +1 -1
- package/dist/commands/category/delete.js +3 -0
- package/dist/commands/category/delete.js.map +1 -1
- package/dist/commands/category/rename.js +6 -0
- package/dist/commands/category/rename.js.map +1 -1
- package/dist/commands/claude/index.js +5 -5
- package/dist/commands/claude/index.js.map +1 -1
- package/dist/commands/claude/open.js +5 -0
- package/dist/commands/claude/open.js.map +1 -1
- package/dist/commands/commit.js +1 -1
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/config/index.js +6 -1
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/dashboard.js +1 -0
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/diet.js +1 -0
- package/dist/commands/diet.js.map +1 -1
- package/dist/commands/docker/clean.js +2 -0
- package/dist/commands/docker/clean.js.map +1 -1
- package/dist/commands/docker/index.js +1 -0
- package/dist/commands/docker/index.js.map +1 -1
- package/dist/commands/docker/logs.js +6 -0
- package/dist/commands/docker/logs.js.map +1 -1
- package/dist/commands/docker/prune.js +1 -0
- package/dist/commands/docker/prune.js.map +1 -1
- package/dist/commands/docker/restart.js +5 -0
- package/dist/commands/docker/restart.js.map +1 -1
- package/dist/commands/docker/start.js +4 -0
- package/dist/commands/docker/start.js.map +1 -1
- package/dist/commands/docker/stop.js +4 -0
- package/dist/commands/docker/stop.js.map +1 -1
- package/dist/commands/epic/activate.js +1 -1
- package/dist/commands/epic/activate.js.map +1 -1
- package/dist/commands/epic/archive.js +1 -1
- package/dist/commands/epic/archive.js.map +1 -1
- package/dist/commands/epic/create.js +4 -0
- package/dist/commands/epic/create.js.map +1 -1
- package/dist/commands/epic/delete.js +1 -1
- package/dist/commands/epic/delete.js.map +1 -1
- package/dist/commands/epic/move.js +1 -1
- package/dist/commands/epic/move.js.map +1 -1
- package/dist/commands/epic/progress.js +1 -0
- package/dist/commands/epic/progress.js.map +1 -1
- package/dist/commands/epic/project.js +1 -1
- package/dist/commands/epic/project.js.map +1 -1
- package/dist/commands/epic/reorder.js +1 -1
- package/dist/commands/epic/reorder.js.map +1 -1
- package/dist/commands/epic/spec.js +1 -1
- package/dist/commands/epic/spec.js.map +1 -1
- package/dist/commands/epic/ticket.js +1 -1
- package/dist/commands/epic/ticket.js.map +1 -1
- package/dist/commands/epic/view.js +1 -1
- package/dist/commands/epic/view.js.map +1 -1
- package/dist/commands/execution/config.js +7 -1
- package/dist/commands/execution/config.js.map +1 -1
- package/dist/commands/execution/list.js +1 -0
- package/dist/commands/execution/list.js.map +1 -1
- package/dist/commands/execution/logs.js +1 -0
- package/dist/commands/execution/logs.js.map +1 -1
- package/dist/commands/execution/stop.js +2 -0
- package/dist/commands/execution/stop.js.map +1 -1
- package/dist/commands/execution/view.js +3 -1
- package/dist/commands/execution/view.js.map +1 -1
- package/dist/commands/feedback/list.js +2 -0
- package/dist/commands/feedback/list.js.map +1 -1
- package/dist/commands/feedback/submit.js +2 -0
- package/dist/commands/feedback/submit.js.map +1 -1
- package/dist/commands/feedback/view.js +2 -0
- package/dist/commands/feedback/view.js.map +1 -1
- package/dist/commands/gh/login.js +1 -1
- package/dist/commands/gh/login.js.map +1 -1
- package/dist/commands/gh/token.js +1 -1
- package/dist/commands/gh/token.js.map +1 -1
- package/dist/commands/linear/auth.js +4 -4
- package/dist/commands/linear/auth.js.map +1 -1
- package/dist/commands/linear/connect.js +10 -5
- package/dist/commands/linear/connect.js.map +1 -1
- package/dist/commands/linear/import.js +4 -3
- package/dist/commands/linear/import.js.map +1 -1
- package/dist/commands/linear/sync.js +3 -3
- package/dist/commands/linear/sync.js.map +1 -1
- package/dist/commands/link/create.js +1 -1
- package/dist/commands/link/create.js.map +1 -1
- package/dist/commands/link/list.js +1 -1
- package/dist/commands/link/list.js.map +1 -1
- package/dist/commands/link/remove.js +1 -1
- package/dist/commands/link/remove.js.map +1 -1
- package/dist/commands/media/add.js +2 -1
- package/dist/commands/media/add.js.map +1 -1
- package/dist/commands/media/index.js +2 -0
- package/dist/commands/media/index.js.map +1 -1
- package/dist/commands/media/list.js +1 -0
- package/dist/commands/media/list.js.map +1 -1
- package/dist/commands/media/preprocess.js +1 -1
- package/dist/commands/media/preprocess.js.map +1 -1
- package/dist/commands/media/remove.js +2 -1
- package/dist/commands/media/remove.js.map +1 -1
- package/dist/commands/media/show.js +1 -1
- package/dist/commands/media/show.js.map +1 -1
- package/dist/commands/monday/connect.js +4 -4
- package/dist/commands/monday/connect.js.map +1 -1
- package/dist/commands/monday/sync.js +4 -4
- package/dist/commands/monday/sync.js.map +1 -1
- package/dist/commands/new.js +1 -0
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/orchestrator/start.js +2 -0
- package/dist/commands/orchestrator/start.js.map +1 -1
- package/dist/commands/phase/delete.js +1 -1
- package/dist/commands/phase/delete.js.map +1 -1
- package/dist/commands/phase/move.js +1 -1
- package/dist/commands/phase/move.js.map +1 -1
- package/dist/commands/phase/template/delete.js +1 -0
- package/dist/commands/phase/template/delete.js.map +1 -1
- package/dist/commands/phase/update.js +1 -1
- package/dist/commands/phase/update.js.map +1 -1
- package/dist/commands/pmo/init.js +2 -2
- package/dist/commands/pmo/init.js.map +1 -1
- package/dist/commands/pr/checks.js +1 -1
- package/dist/commands/pr/checks.js.map +1 -1
- package/dist/commands/pr/create.js +1 -1
- package/dist/commands/pr/create.js.map +1 -1
- package/dist/commands/pr/index.js +1 -1
- package/dist/commands/pr/index.js.map +1 -1
- package/dist/commands/pr/link.js +3 -3
- package/dist/commands/pr/link.js.map +1 -1
- package/dist/commands/pr/list.js +1 -1
- package/dist/commands/pr/list.js.map +1 -1
- package/dist/commands/pr/merge.js +1 -1
- package/dist/commands/pr/merge.js.map +1 -1
- package/dist/commands/pr/status.js +1 -1
- package/dist/commands/pr/status.js.map +1 -1
- package/dist/commands/priority/add.js +2 -2
- package/dist/commands/priority/add.js.map +1 -1
- package/dist/commands/priority/remove.js +2 -2
- package/dist/commands/priority/remove.js.map +1 -1
- package/dist/commands/priority/set.js +2 -2
- package/dist/commands/priority/set.js.map +1 -1
- package/dist/commands/project/archive.js +1 -1
- package/dist/commands/project/archive.js.map +1 -1
- package/dist/commands/project/create.js +4 -0
- package/dist/commands/project/create.js.map +1 -1
- package/dist/commands/project/delete.js +1 -1
- package/dist/commands/project/delete.js.map +1 -1
- package/dist/commands/project/spec.js +1 -1
- package/dist/commands/project/spec.js.map +1 -1
- package/dist/commands/project/unarchive.js +1 -1
- package/dist/commands/project/unarchive.js.map +1 -1
- package/dist/commands/project/update.js +1 -1
- package/dist/commands/project/update.js.map +1 -1
- package/dist/commands/project/view.js +1 -1
- package/dist/commands/project/view.js.map +1 -1
- package/dist/commands/pull.js +3 -0
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/qa/index.js +4 -4
- package/dist/commands/qa/index.js.map +1 -1
- package/dist/commands/repo/add.js +1 -1
- package/dist/commands/repo/add.js.map +1 -1
- package/dist/commands/repo/create.js +1 -1
- package/dist/commands/repo/create.js.map +1 -1
- package/dist/commands/repo/remove.js +2 -2
- package/dist/commands/repo/remove.js.map +1 -1
- package/dist/commands/repo/view.js +1 -1
- package/dist/commands/repo/view.js.map +1 -1
- package/dist/commands/roadmap/create.js +1 -0
- package/dist/commands/roadmap/create.js.map +1 -1
- package/dist/commands/session/create.js +4 -0
- package/dist/commands/session/create.js.map +1 -1
- package/dist/commands/session/exec.js +4 -0
- package/dist/commands/session/exec.js.map +1 -1
- package/dist/commands/session/health.js +2 -0
- package/dist/commands/session/health.js.map +1 -1
- package/dist/commands/session/inspect.js +3 -0
- package/dist/commands/session/inspect.js.map +1 -1
- package/dist/commands/session/peek.js +1 -0
- package/dist/commands/session/peek.js.map +1 -1
- package/dist/commands/session/restart.js +4 -0
- package/dist/commands/session/restart.js.map +1 -1
- package/dist/commands/shortcut/connect.js +4 -4
- package/dist/commands/shortcut/connect.js.map +1 -1
- package/dist/commands/staff/remove.js +1 -1
- package/dist/commands/staff/remove.js.map +1 -1
- package/dist/commands/status/delete.js +2 -1
- package/dist/commands/status/delete.js.map +1 -1
- package/dist/commands/status/list.js +1 -0
- package/dist/commands/status/list.js.map +1 -1
- package/dist/commands/status/move.js +2 -1
- package/dist/commands/status/move.js.map +1 -1
- package/dist/commands/status/update.js +1 -1
- package/dist/commands/status/update.js.map +1 -1
- package/dist/commands/telemetry/disable.js +1 -0
- package/dist/commands/telemetry/disable.js.map +1 -1
- package/dist/commands/telemetry/enable.js +1 -0
- package/dist/commands/telemetry/enable.js.map +1 -1
- package/dist/commands/telemetry/index.js +1 -0
- package/dist/commands/telemetry/index.js.map +1 -1
- package/dist/commands/template/apply.js +2 -2
- package/dist/commands/template/apply.js.map +1 -1
- package/dist/commands/template/delete.js +1 -0
- package/dist/commands/template/delete.js.map +1 -1
- package/dist/commands/template/save.js +1 -0
- package/dist/commands/template/save.js.map +1 -1
- package/dist/commands/template/update.js +1 -0
- package/dist/commands/template/update.js.map +1 -1
- package/dist/commands/ticket/complete.js +1 -1
- package/dist/commands/ticket/complete.js.map +1 -1
- package/dist/commands/ticket/create.js +14 -4
- package/dist/commands/ticket/create.js.map +1 -1
- package/dist/commands/ticket/delete.js +23 -8
- package/dist/commands/ticket/delete.js.map +1 -1
- package/dist/commands/ticket/edit.js +2 -2
- package/dist/commands/ticket/edit.js.map +1 -1
- package/dist/commands/ticket/link/block.js +1 -1
- package/dist/commands/ticket/link/block.js.map +1 -1
- package/dist/commands/ticket/link/duplicates.js +1 -1
- package/dist/commands/ticket/link/duplicates.js.map +1 -1
- package/dist/commands/ticket/link/relates.js +1 -1
- package/dist/commands/ticket/link/relates.js.map +1 -1
- package/dist/commands/ticket/list.d.ts +0 -8
- package/dist/commands/ticket/list.js +15 -121
- package/dist/commands/ticket/list.js.map +1 -1
- package/dist/commands/ticket/move.js +34 -7
- package/dist/commands/ticket/move.js.map +1 -1
- package/dist/commands/ticket/resolve.js +2 -2
- package/dist/commands/ticket/resolve.js.map +1 -1
- package/dist/commands/ticket/status.js +1 -1
- package/dist/commands/ticket/status.js.map +1 -1
- package/dist/commands/ticket/template/delete.js +1 -0
- package/dist/commands/ticket/template/delete.js.map +1 -1
- package/dist/commands/ticket/template/save.js +1 -0
- package/dist/commands/ticket/template/save.js.map +1 -1
- package/dist/commands/ticket/update.js +1 -0
- package/dist/commands/ticket/update.js.map +1 -1
- package/dist/commands/ticket/view.js +1 -1
- package/dist/commands/ticket/view.js.map +1 -1
- package/dist/commands/tools/add.js +6 -0
- package/dist/commands/tools/add.js.map +1 -1
- package/dist/commands/tools/remove.js +3 -0
- package/dist/commands/tools/remove.js.map +1 -1
- package/dist/commands/trello/configure.js +5 -5
- package/dist/commands/trello/configure.js.map +1 -1
- package/dist/commands/trello/import.js +4 -4
- package/dist/commands/trello/import.js.map +1 -1
- package/dist/commands/trello/sync.js +3 -3
- package/dist/commands/trello/sync.js.map +1 -1
- package/dist/commands/version/bump.js +3 -0
- package/dist/commands/version/bump.js.map +1 -1
- package/dist/commands/work/complete.js +34 -1
- package/dist/commands/work/complete.js.map +1 -1
- package/dist/commands/work/hooks/add.js +7 -0
- package/dist/commands/work/hooks/add.js.map +1 -1
- package/dist/commands/work/hooks/list.js +2 -0
- package/dist/commands/work/hooks/list.js.map +1 -1
- package/dist/commands/work/hooks/remove.js +4 -0
- package/dist/commands/work/hooks/remove.js.map +1 -1
- package/dist/commands/work/hooks/toggle.js +4 -0
- package/dist/commands/work/hooks/toggle.js.map +1 -1
- package/dist/commands/work/ready.js +44 -5
- package/dist/commands/work/ready.js.map +1 -1
- package/dist/commands/work/resolve.js +1 -1
- package/dist/commands/work/resolve.js.map +1 -1
- package/dist/commands/work/review.js +3 -1
- package/dist/commands/work/review.js.map +1 -1
- package/dist/commands/work/revise.js +1 -1
- package/dist/commands/work/revise.js.map +1 -1
- package/dist/commands/work/source/set.js +3 -0
- package/dist/commands/work/source/set.js.map +1 -1
- package/dist/commands/work/source.js +1 -0
- package/dist/commands/work/source.js.map +1 -1
- package/dist/commands/work/spawn.js +2 -1
- package/dist/commands/work/spawn.js.map +1 -1
- package/dist/commands/work/start.js +71 -18
- package/dist/commands/work/start.js.map +1 -1
- package/dist/commands/work/watch.js +1 -1
- package/dist/commands/work/watch.js.map +1 -1
- package/dist/commands/workflow/delete.js +1 -1
- package/dist/commands/workflow/delete.js.map +1 -1
- package/dist/commands/workflow/setup.js +5 -0
- package/dist/commands/workflow/setup.js.map +1 -1
- package/dist/commands/workflow/switch.js +1 -1
- package/dist/commands/workflow/switch.js.map +1 -1
- package/dist/commands/workflow/view.js +1 -1
- package/dist/commands/workflow/view.js.map +1 -1
- package/dist/commands/workflow-rule/create.js +1 -0
- package/dist/commands/workflow-rule/create.js.map +1 -1
- package/dist/commands/workflow-rule/delete.js +1 -1
- package/dist/commands/workflow-rule/delete.js.map +1 -1
- package/dist/commands/workflow-rule/update.js +1 -1
- package/dist/commands/workflow-rule/update.js.map +1 -1
- package/dist/commands/workspace/add.js +5 -0
- package/dist/commands/workspace/add.js.map +1 -1
- package/dist/commands/workspace/remove.js +1 -1
- package/dist/commands/workspace/remove.js.map +1 -1
- package/dist/hooks/init.js +35 -7
- package/dist/hooks/init.js.map +1 -1
- package/dist/hooks/postrun.d.ts +6 -4
- package/dist/hooks/postrun.js +25 -18
- package/dist/hooks/postrun.js.map +1 -1
- package/dist/lib/execution/commit-validation.d.ts +58 -0
- package/dist/lib/execution/commit-validation.js +252 -0
- package/dist/lib/execution/commit-validation.js.map +1 -0
- package/dist/lib/execution/config.js +3 -0
- package/dist/lib/execution/config.js.map +1 -1
- package/dist/lib/execution/storage.d.ts +20 -3
- package/dist/lib/execution/storage.js +27 -6
- package/dist/lib/execution/storage.js.map +1 -1
- package/dist/lib/flags/resolver.js +3 -6
- package/dist/lib/flags/resolver.js.map +1 -1
- package/dist/lib/linear/client.d.ts +4 -0
- package/dist/lib/linear/client.js +12 -0
- package/dist/lib/linear/client.js.map +1 -1
- package/dist/lib/onboarding/wizard.js +3 -3
- package/dist/lib/onboarding/wizard.js.map +1 -1
- package/dist/lib/pmo/base-command.d.ts +21 -1
- package/dist/lib/pmo/base-command.js +28 -4
- package/dist/lib/pmo/base-command.js.map +1 -1
- package/dist/lib/prompt-command.js +1 -1
- package/dist/lib/prompt-command.js.map +1 -1
- package/dist/lib/prompt-json.d.ts +19 -11
- package/dist/lib/prompt-json.js +32 -17
- package/dist/lib/prompt-json.js.map +1 -1
- package/dist/lib/providers/index.d.ts +11 -0
- package/dist/lib/providers/index.js +11 -0
- package/dist/lib/providers/index.js.map +1 -0
- package/dist/lib/providers/linear-provider.d.ts +26 -0
- package/dist/lib/providers/linear-provider.js +339 -0
- package/dist/lib/providers/linear-provider.js.map +1 -0
- package/dist/lib/providers/pmo-provider.d.ts +20 -0
- package/dist/lib/providers/pmo-provider.js +83 -0
- package/dist/lib/providers/pmo-provider.js.map +1 -0
- package/dist/lib/providers/resolver.d.ts +44 -0
- package/dist/lib/providers/resolver.js +82 -0
- package/dist/lib/providers/resolver.js.map +1 -0
- package/dist/lib/providers/types.d.ts +136 -0
- package/dist/lib/providers/types.js +12 -0
- package/dist/lib/providers/types.js.map +1 -0
- package/dist/lib/update-prompt.d.ts +3 -3
- package/dist/lib/update-prompt.js +15 -10
- package/dist/lib/update-prompt.js.map +1 -1
- package/dist/lib/work-lifecycle/index.d.ts +1 -0
- package/dist/lib/work-lifecycle/index.js +1 -0
- package/dist/lib/work-lifecycle/index.js.map +1 -1
- package/dist/lib/work-lifecycle/post-execution.d.ts +40 -9
- package/dist/lib/work-lifecycle/post-execution.js +61 -9
- package/dist/lib/work-lifecycle/post-execution.js.map +1 -1
- package/oclif.manifest.json +1886 -1886
- package/package.json +1 -1
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linear Ticket Provider
|
|
3
|
+
*
|
|
4
|
+
* Writes ticket operations directly to Linear via API,
|
|
5
|
+
* then updates local PMO to keep it in sync.
|
|
6
|
+
*
|
|
7
|
+
* Emits work:status_changed with source='linear' so the outbound sync
|
|
8
|
+
* handler skips Linear (avoiding double-write).
|
|
9
|
+
*/
|
|
10
|
+
import { LinearClient } from '../linear/client.js';
|
|
11
|
+
import { LinearMapper } from '../linear/mapper.js';
|
|
12
|
+
import { getLinearApiKey, loadLinearConfig } from '../linear/config.js';
|
|
13
|
+
import { findMatchingLinearState } from '../external-issues/outbound-sync.js';
|
|
14
|
+
import { listLinearIssues } from '../external-issues/linear.js';
|
|
15
|
+
import { PMO_PRIORITY_TO_LINEAR, LINEAR_PRIORITY_TO_PMO } from '../linear/types.js';
|
|
16
|
+
export class LinearTicketProvider {
|
|
17
|
+
db;
|
|
18
|
+
storage;
|
|
19
|
+
projectId;
|
|
20
|
+
ticketStatusCategory;
|
|
21
|
+
name = 'linear';
|
|
22
|
+
constructor(db, storage, projectId, ticketStatusCategory) {
|
|
23
|
+
this.db = db;
|
|
24
|
+
this.storage = storage;
|
|
25
|
+
this.projectId = projectId;
|
|
26
|
+
this.ticketStatusCategory = ticketStatusCategory;
|
|
27
|
+
}
|
|
28
|
+
getApiKeyOrFail() {
|
|
29
|
+
const apiKey = getLinearApiKey(this.db);
|
|
30
|
+
if (!apiKey)
|
|
31
|
+
throw new Error('Linear API key not configured');
|
|
32
|
+
return apiKey;
|
|
33
|
+
}
|
|
34
|
+
async moveTicket(ticketId, newState) {
|
|
35
|
+
// 1. Get Linear API key
|
|
36
|
+
const apiKey = getLinearApiKey(this.db);
|
|
37
|
+
if (!apiKey) {
|
|
38
|
+
return { success: false, provider: 'linear', error: 'Linear API key not configured' };
|
|
39
|
+
}
|
|
40
|
+
// 2. Look up Linear mapping for this PMO ticket
|
|
41
|
+
const mapper = new LinearMapper(this.db);
|
|
42
|
+
const mapping = mapper.getByTicketId(ticketId);
|
|
43
|
+
if (!mapping) {
|
|
44
|
+
return { success: false, provider: 'linear', error: `No Linear mapping for ticket ${ticketId}` };
|
|
45
|
+
}
|
|
46
|
+
// 3. Get Linear team's workflow states
|
|
47
|
+
const client = new LinearClient(apiKey);
|
|
48
|
+
let team;
|
|
49
|
+
try {
|
|
50
|
+
team = await client.getTeamByKey(mapping.linearTeamKey);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
provider: 'linear',
|
|
56
|
+
error: `Failed to get Linear team: ${error instanceof Error ? error.message : String(error)}`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (!team) {
|
|
60
|
+
return { success: false, provider: 'linear', error: `Linear team not found: ${mapping.linearTeamKey}` };
|
|
61
|
+
}
|
|
62
|
+
let states;
|
|
63
|
+
try {
|
|
64
|
+
states = await client.listStates(team.id);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return {
|
|
68
|
+
success: false,
|
|
69
|
+
provider: 'linear',
|
|
70
|
+
error: `Failed to list Linear states: ${error instanceof Error ? error.message : String(error)}`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// 4. Find the matching Linear state for the target PMO state
|
|
74
|
+
// Map PMO status category to Linear state type for category matching
|
|
75
|
+
const categoryType = mapPMOStateToLinearType(newState);
|
|
76
|
+
const matchingState = findMatchingLinearState(states, newState, categoryType);
|
|
77
|
+
if (!matchingState) {
|
|
78
|
+
return {
|
|
79
|
+
success: false,
|
|
80
|
+
provider: 'linear',
|
|
81
|
+
error: `No matching Linear state for "${newState}" (category: ${categoryType})`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// 5. Update the issue state on Linear
|
|
85
|
+
try {
|
|
86
|
+
await client.updateIssueState(mapping.linearIssueId, matchingState.id);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
return {
|
|
90
|
+
success: false,
|
|
91
|
+
provider: 'linear',
|
|
92
|
+
error: `Failed to update Linear issue: ${error instanceof Error ? error.message : String(error)}`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// 6. Also update local PMO to keep it in sync
|
|
96
|
+
try {
|
|
97
|
+
await this.storage.moveTicket(this.projectId, ticketId, newState);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Non-fatal: Linear is the source of truth, local PMO is best-effort
|
|
101
|
+
}
|
|
102
|
+
// 7. Post a comment about the status change
|
|
103
|
+
try {
|
|
104
|
+
await client.addComment(mapping.linearIssueId, `Status updated to **${newState}** (via prlt post-execution transition)`);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Non-fatal: comment is informational
|
|
108
|
+
}
|
|
109
|
+
// 8. Update sync timestamp
|
|
110
|
+
try {
|
|
111
|
+
mapper.updateSyncTimestamp(ticketId);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Non-fatal
|
|
115
|
+
}
|
|
116
|
+
return { success: true, provider: 'linear' };
|
|
117
|
+
}
|
|
118
|
+
async deleteTicket(ticketId) {
|
|
119
|
+
let apiKey;
|
|
120
|
+
try {
|
|
121
|
+
apiKey = this.getApiKeyOrFail();
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return { success: false, provider: 'linear', error: 'Linear API key not configured' };
|
|
125
|
+
}
|
|
126
|
+
// Look up Linear mapping
|
|
127
|
+
const mapper = new LinearMapper(this.db);
|
|
128
|
+
const mapping = mapper.getByTicketId(ticketId);
|
|
129
|
+
if (mapping) {
|
|
130
|
+
// Archive the issue in Linear
|
|
131
|
+
const client = new LinearClient(apiKey);
|
|
132
|
+
try {
|
|
133
|
+
await client.archiveIssue(mapping.linearIssueId);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
return {
|
|
137
|
+
success: false,
|
|
138
|
+
provider: 'linear',
|
|
139
|
+
error: `Failed to archive Linear issue: ${error instanceof Error ? error.message : String(error)}`,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// Remove the mapping
|
|
143
|
+
try {
|
|
144
|
+
mapper.deleteMapping(ticketId);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Non-fatal
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Also delete the local PMO mirror
|
|
151
|
+
try {
|
|
152
|
+
await this.storage.deleteTicket(ticketId);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Non-fatal if Linear archive succeeded
|
|
156
|
+
}
|
|
157
|
+
return { success: true, provider: 'linear' };
|
|
158
|
+
}
|
|
159
|
+
async listTickets(projectId, filter) {
|
|
160
|
+
let apiKey;
|
|
161
|
+
try {
|
|
162
|
+
apiKey = this.getApiKeyOrFail();
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return { success: false, provider: 'linear', tickets: [], error: 'Linear API key not configured' };
|
|
166
|
+
}
|
|
167
|
+
const linearConfig = loadLinearConfig(this.db);
|
|
168
|
+
const team = linearConfig?.defaultTeamKey || process.env.PRLT_LINEAR_TEAM;
|
|
169
|
+
try {
|
|
170
|
+
const envelopes = await listLinearIssues({ apiKey, team }, { limit: 50 });
|
|
171
|
+
let tickets = envelopes.map(envelope => ({
|
|
172
|
+
id: envelope.source.externalKey,
|
|
173
|
+
title: envelope.title,
|
|
174
|
+
description: envelope.description || undefined,
|
|
175
|
+
priority: envelope.priority || undefined,
|
|
176
|
+
category: envelope.category || undefined,
|
|
177
|
+
projectId: envelope.projectKey,
|
|
178
|
+
projectName: envelope.projectKey,
|
|
179
|
+
statusId: envelope.status,
|
|
180
|
+
statusName: envelope.status,
|
|
181
|
+
owner: envelope.assignee || undefined,
|
|
182
|
+
assignee: envelope.assignee || undefined,
|
|
183
|
+
subtasks: [],
|
|
184
|
+
labels: envelope.labels,
|
|
185
|
+
metadata: {
|
|
186
|
+
external_source: envelope.source.name,
|
|
187
|
+
external_key: envelope.source.externalKey,
|
|
188
|
+
external_id: envelope.source.externalId,
|
|
189
|
+
external_url: envelope.source.url,
|
|
190
|
+
},
|
|
191
|
+
createdAt: new Date(),
|
|
192
|
+
updatedAt: new Date(),
|
|
193
|
+
}));
|
|
194
|
+
// Apply client-side filters
|
|
195
|
+
if (filter?.priority) {
|
|
196
|
+
tickets = tickets.filter(t => t.priority === filter.priority);
|
|
197
|
+
}
|
|
198
|
+
if (filter?.column) {
|
|
199
|
+
tickets = tickets.filter(t => t.statusName === filter.column);
|
|
200
|
+
}
|
|
201
|
+
if (filter?.category) {
|
|
202
|
+
tickets = tickets.filter(t => t.category === filter.category);
|
|
203
|
+
}
|
|
204
|
+
if (filter?.search) {
|
|
205
|
+
const term = filter.search.toLowerCase();
|
|
206
|
+
tickets = tickets.filter(t => t.title.toLowerCase().includes(term) ||
|
|
207
|
+
(t.description || '').toLowerCase().includes(term));
|
|
208
|
+
}
|
|
209
|
+
if (filter?.label) {
|
|
210
|
+
const label = filter.label.toLowerCase();
|
|
211
|
+
tickets = tickets.filter(t => t.labels.some(l => l.toLowerCase() === label));
|
|
212
|
+
}
|
|
213
|
+
return { success: true, provider: 'linear', tickets };
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
return {
|
|
217
|
+
success: false,
|
|
218
|
+
provider: 'linear',
|
|
219
|
+
tickets: [],
|
|
220
|
+
error: error instanceof Error ? error.message : String(error),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async createTicket(projectId, input) {
|
|
225
|
+
let apiKey;
|
|
226
|
+
try {
|
|
227
|
+
apiKey = this.getApiKeyOrFail();
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return { success: false, provider: 'linear', error: 'Linear API key not configured' };
|
|
231
|
+
}
|
|
232
|
+
const client = new LinearClient(apiKey);
|
|
233
|
+
const linearConfig = loadLinearConfig(this.db);
|
|
234
|
+
const teamKey = linearConfig?.defaultTeamKey || process.env.PRLT_LINEAR_TEAM;
|
|
235
|
+
if (!teamKey) {
|
|
236
|
+
return { success: false, provider: 'linear', error: 'Linear team key is required. Set PRLT_LINEAR_TEAM.' };
|
|
237
|
+
}
|
|
238
|
+
const team = await client.getTeamByKey(teamKey);
|
|
239
|
+
if (!team) {
|
|
240
|
+
return { success: false, provider: 'linear', error: `Linear team "${teamKey}" not found.` };
|
|
241
|
+
}
|
|
242
|
+
try {
|
|
243
|
+
// Map PMO priority to Linear priority number
|
|
244
|
+
const linearPriority = input.priority ? PMO_PRIORITY_TO_LINEAR[input.priority] : undefined;
|
|
245
|
+
// Create the issue in Linear
|
|
246
|
+
const issue = await client.createIssue({
|
|
247
|
+
teamId: team.id,
|
|
248
|
+
title: input.title,
|
|
249
|
+
description: input.description,
|
|
250
|
+
priority: linearPriority,
|
|
251
|
+
});
|
|
252
|
+
// Create local PMO mirror ticket
|
|
253
|
+
const mirrorDescription = [
|
|
254
|
+
input.description || '',
|
|
255
|
+
'',
|
|
256
|
+
'---',
|
|
257
|
+
`_Created in Linear: [${issue.identifier}](${issue.url})_`,
|
|
258
|
+
].join('\n').trim();
|
|
259
|
+
const mirrorPriority = input.priority || LINEAR_PRIORITY_TO_PMO[issue.priority] || undefined;
|
|
260
|
+
const pmoTicket = await this.storage.createTicket(projectId, {
|
|
261
|
+
...input,
|
|
262
|
+
title: issue.title,
|
|
263
|
+
description: mirrorDescription,
|
|
264
|
+
priority: mirrorPriority,
|
|
265
|
+
metadata: {
|
|
266
|
+
...input.metadata,
|
|
267
|
+
'external_source': 'linear',
|
|
268
|
+
'external_id': issue.id,
|
|
269
|
+
'external_key': issue.identifier,
|
|
270
|
+
'external_url': issue.url,
|
|
271
|
+
'linear.issue_id': issue.id,
|
|
272
|
+
'linear.identifier': issue.identifier,
|
|
273
|
+
'linear.url': issue.url,
|
|
274
|
+
'linear.team': issue.team.key,
|
|
275
|
+
'linear.state': issue.state.name,
|
|
276
|
+
},
|
|
277
|
+
});
|
|
278
|
+
// Create mapping record for sync operations
|
|
279
|
+
const mapper = new LinearMapper(this.db);
|
|
280
|
+
mapper.createMapping({
|
|
281
|
+
pmoTicketId: pmoTicket.id,
|
|
282
|
+
linearIssueId: issue.id,
|
|
283
|
+
linearIdentifier: issue.identifier,
|
|
284
|
+
linearTeamKey: issue.team.key,
|
|
285
|
+
linearUrl: issue.url,
|
|
286
|
+
syncDirection: 'outbound',
|
|
287
|
+
createdAt: new Date(),
|
|
288
|
+
});
|
|
289
|
+
return { success: true, provider: 'linear', ticket: pmoTicket };
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
return {
|
|
293
|
+
success: false,
|
|
294
|
+
provider: 'linear',
|
|
295
|
+
error: error instanceof Error ? error.message : String(error),
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
async getTicket(ticketId) {
|
|
300
|
+
// For getTicket, use local PMO since we maintain mirrors
|
|
301
|
+
// This avoids unnecessary API calls for reads
|
|
302
|
+
try {
|
|
303
|
+
const ticket = await this.storage.getTicket(ticketId);
|
|
304
|
+
return { success: true, provider: 'linear', ticket };
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
return {
|
|
308
|
+
success: false,
|
|
309
|
+
provider: 'linear',
|
|
310
|
+
error: error instanceof Error ? error.message : String(error),
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Map a PMO status name to the most likely Linear state type.
|
|
317
|
+
* Used as a fallback when exact name matching fails.
|
|
318
|
+
*/
|
|
319
|
+
function mapPMOStateToLinearType(stateName) {
|
|
320
|
+
const lower = stateName.toLowerCase();
|
|
321
|
+
if (lower.includes('review') || lower.includes('in progress') || lower.includes('started')) {
|
|
322
|
+
return 'started';
|
|
323
|
+
}
|
|
324
|
+
if (lower.includes('done') || lower.includes('complete') || lower.includes('merged')) {
|
|
325
|
+
return 'completed';
|
|
326
|
+
}
|
|
327
|
+
if (lower.includes('backlog')) {
|
|
328
|
+
return 'backlog';
|
|
329
|
+
}
|
|
330
|
+
if (lower.includes('cancel')) {
|
|
331
|
+
return 'canceled';
|
|
332
|
+
}
|
|
333
|
+
if (lower.includes('triage')) {
|
|
334
|
+
return 'triage';
|
|
335
|
+
}
|
|
336
|
+
// Default to started for unknown states (most post-execution transitions go forward)
|
|
337
|
+
return 'started';
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=linear-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-provider.js","sourceRoot":"","sources":["../../../src/lib/providers/linear-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PMO Ticket Provider
|
|
3
|
+
*
|
|
4
|
+
* Default provider for users without external integrations.
|
|
5
|
+
* Wraps the existing PMO storage calls.
|
|
6
|
+
* Emits ticket:status_changed events via the storage layer.
|
|
7
|
+
*/
|
|
8
|
+
import type { TicketFilter, CreateTicketInput } from '../pmo/types.js';
|
|
9
|
+
import type { TicketProvider, ProviderMoveResult, ProviderDeleteResult, ProviderListResult, ProviderCreateResult, ProviderGetResult, ProviderStorage } from './types.js';
|
|
10
|
+
export declare class PMOTicketProvider implements TicketProvider {
|
|
11
|
+
private storage;
|
|
12
|
+
private projectId;
|
|
13
|
+
readonly name: "pmo";
|
|
14
|
+
constructor(storage: ProviderStorage, projectId: string);
|
|
15
|
+
moveTicket(ticketId: string, newState: string): Promise<ProviderMoveResult>;
|
|
16
|
+
deleteTicket(ticketId: string): Promise<ProviderDeleteResult>;
|
|
17
|
+
listTickets(projectId?: string, filter?: TicketFilter): Promise<ProviderListResult>;
|
|
18
|
+
createTicket(projectId: string, input: CreateTicketInput): Promise<ProviderCreateResult>;
|
|
19
|
+
getTicket(ticketId: string): Promise<ProviderGetResult>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PMO Ticket Provider
|
|
3
|
+
*
|
|
4
|
+
* Default provider for users without external integrations.
|
|
5
|
+
* Wraps the existing PMO storage calls.
|
|
6
|
+
* Emits ticket:status_changed events via the storage layer.
|
|
7
|
+
*/
|
|
8
|
+
export class PMOTicketProvider {
|
|
9
|
+
storage;
|
|
10
|
+
projectId;
|
|
11
|
+
name = 'pmo';
|
|
12
|
+
constructor(storage, projectId) {
|
|
13
|
+
this.storage = storage;
|
|
14
|
+
this.projectId = projectId;
|
|
15
|
+
}
|
|
16
|
+
async moveTicket(ticketId, newState) {
|
|
17
|
+
try {
|
|
18
|
+
await this.storage.moveTicket(this.projectId, ticketId, newState);
|
|
19
|
+
return { success: true, provider: 'pmo' };
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
return {
|
|
23
|
+
success: false,
|
|
24
|
+
provider: 'pmo',
|
|
25
|
+
error: error instanceof Error ? error.message : String(error),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async deleteTicket(ticketId) {
|
|
30
|
+
try {
|
|
31
|
+
await this.storage.deleteTicket(ticketId);
|
|
32
|
+
return { success: true, provider: 'pmo' };
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return {
|
|
36
|
+
success: false,
|
|
37
|
+
provider: 'pmo',
|
|
38
|
+
error: error instanceof Error ? error.message : String(error),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async listTickets(projectId, filter) {
|
|
43
|
+
try {
|
|
44
|
+
const tickets = await this.storage.listTickets(projectId, filter);
|
|
45
|
+
return { success: true, provider: 'pmo', tickets };
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return {
|
|
49
|
+
success: false,
|
|
50
|
+
provider: 'pmo',
|
|
51
|
+
tickets: [],
|
|
52
|
+
error: error instanceof Error ? error.message : String(error),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async createTicket(projectId, input) {
|
|
57
|
+
try {
|
|
58
|
+
const ticket = await this.storage.createTicket(projectId, input);
|
|
59
|
+
return { success: true, provider: 'pmo', ticket };
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return {
|
|
63
|
+
success: false,
|
|
64
|
+
provider: 'pmo',
|
|
65
|
+
error: error instanceof Error ? error.message : String(error),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async getTicket(ticketId) {
|
|
70
|
+
try {
|
|
71
|
+
const ticket = await this.storage.getTicket(ticketId);
|
|
72
|
+
return { success: true, provider: 'pmo', ticket };
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
return {
|
|
76
|
+
success: false,
|
|
77
|
+
provider: 'pmo',
|
|
78
|
+
error: error instanceof Error ? error.message : String(error),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=pmo-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pmo-provider.js","sourceRoot":"","sources":["../../../src/lib/providers/pmo-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ticket Provider Resolver
|
|
3
|
+
*
|
|
4
|
+
* Determines which provider should handle ticket operations based on the
|
|
5
|
+
* ticket's external source metadata or workspace configuration.
|
|
6
|
+
*
|
|
7
|
+
* Two resolution modes:
|
|
8
|
+
* 1. Ticket-level: resolveTicketProvider() — for operations on a specific ticket
|
|
9
|
+
* (move, delete). Uses the ticket's metadata to find the source of truth.
|
|
10
|
+
*
|
|
11
|
+
* 2. Project-level: resolveProjectProvider() — for operations that aren't
|
|
12
|
+
* ticket-specific (list, create). Uses workspace config to determine
|
|
13
|
+
* the active provider.
|
|
14
|
+
*/
|
|
15
|
+
import type Database from 'better-sqlite3';
|
|
16
|
+
import type { TicketProvider, ProviderStorage } from './types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the correct provider for a given ticket.
|
|
19
|
+
*
|
|
20
|
+
* Uses the ticket's metadata to determine the source of truth:
|
|
21
|
+
* - external_source = 'linear' + configured + inbound/bidirectional → Linear
|
|
22
|
+
* - Otherwise → PMO
|
|
23
|
+
*
|
|
24
|
+
* @param ticketId - The PMO ticket ID
|
|
25
|
+
* @param projectId - The PMO project ID
|
|
26
|
+
* @param db - Database handle for config/mapping lookups
|
|
27
|
+
* @param storage - Storage for fallback and local sync
|
|
28
|
+
* @param metadata - Ticket metadata (contains external_source, etc.)
|
|
29
|
+
* @returns The appropriate TicketProvider for this ticket
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveTicketProvider(ticketId: string, projectId: string, db: Database.Database, storage: ProviderStorage, metadata?: Record<string, string> | null): TicketProvider;
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the correct provider for project-level operations (list, create).
|
|
34
|
+
*
|
|
35
|
+
* Unlike resolveTicketProvider, this doesn't require a specific ticket.
|
|
36
|
+
* It checks workspace configuration to determine the active provider.
|
|
37
|
+
*
|
|
38
|
+
* @param db - Database handle for config lookups
|
|
39
|
+
* @param storage - Storage instance
|
|
40
|
+
* @param projectId - The PMO project ID
|
|
41
|
+
* @param source - Optional source hint ('pmo', 'linear', or 'auto')
|
|
42
|
+
* @returns The appropriate TicketProvider
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveProjectProvider(db: Database.Database, storage: ProviderStorage, projectId: string, source?: string): TicketProvider;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ticket Provider Resolver
|
|
3
|
+
*
|
|
4
|
+
* Determines which provider should handle ticket operations based on the
|
|
5
|
+
* ticket's external source metadata or workspace configuration.
|
|
6
|
+
*
|
|
7
|
+
* Two resolution modes:
|
|
8
|
+
* 1. Ticket-level: resolveTicketProvider() — for operations on a specific ticket
|
|
9
|
+
* (move, delete). Uses the ticket's metadata to find the source of truth.
|
|
10
|
+
*
|
|
11
|
+
* 2. Project-level: resolveProjectProvider() — for operations that aren't
|
|
12
|
+
* ticket-specific (list, create). Uses workspace config to determine
|
|
13
|
+
* the active provider.
|
|
14
|
+
*/
|
|
15
|
+
import { isLinearConfigured } from '../linear/config.js';
|
|
16
|
+
import { LinearMapper } from '../linear/mapper.js';
|
|
17
|
+
import { PMOTicketProvider } from './pmo-provider.js';
|
|
18
|
+
import { LinearTicketProvider } from './linear-provider.js';
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the correct provider for a given ticket.
|
|
21
|
+
*
|
|
22
|
+
* Uses the ticket's metadata to determine the source of truth:
|
|
23
|
+
* - external_source = 'linear' + configured + inbound/bidirectional → Linear
|
|
24
|
+
* - Otherwise → PMO
|
|
25
|
+
*
|
|
26
|
+
* @param ticketId - The PMO ticket ID
|
|
27
|
+
* @param projectId - The PMO project ID
|
|
28
|
+
* @param db - Database handle for config/mapping lookups
|
|
29
|
+
* @param storage - Storage for fallback and local sync
|
|
30
|
+
* @param metadata - Ticket metadata (contains external_source, etc.)
|
|
31
|
+
* @returns The appropriate TicketProvider for this ticket
|
|
32
|
+
*/
|
|
33
|
+
export function resolveTicketProvider(ticketId, projectId, db, storage, metadata) {
|
|
34
|
+
const externalSource = metadata?.external_source;
|
|
35
|
+
// Check Linear
|
|
36
|
+
if (externalSource === 'linear' && isLinearConfigured(db)) {
|
|
37
|
+
const mapper = new LinearMapper(db);
|
|
38
|
+
const mapping = mapper.getByTicketId(ticketId);
|
|
39
|
+
if (mapping) {
|
|
40
|
+
// Only use Linear provider when Linear is the source of truth:
|
|
41
|
+
// - 'inbound' = ticket was imported from Linear → Linear is source of truth
|
|
42
|
+
// - 'bidirectional' = both directions synced → write to Linear directly
|
|
43
|
+
// - 'outbound' = ticket was created in PMO and pushed to Linear → PMO is source of truth
|
|
44
|
+
if (mapping.syncDirection !== 'outbound') {
|
|
45
|
+
return new LinearTicketProvider(db, storage, projectId, null);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Default: local PMO
|
|
50
|
+
return new PMOTicketProvider(storage, projectId);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Resolve the correct provider for project-level operations (list, create).
|
|
54
|
+
*
|
|
55
|
+
* Unlike resolveTicketProvider, this doesn't require a specific ticket.
|
|
56
|
+
* It checks workspace configuration to determine the active provider.
|
|
57
|
+
*
|
|
58
|
+
* @param db - Database handle for config lookups
|
|
59
|
+
* @param storage - Storage instance
|
|
60
|
+
* @param projectId - The PMO project ID
|
|
61
|
+
* @param source - Optional source hint ('pmo', 'linear', or 'auto')
|
|
62
|
+
* @returns The appropriate TicketProvider
|
|
63
|
+
*/
|
|
64
|
+
export function resolveProjectProvider(db, storage, projectId, source) {
|
|
65
|
+
if (source === 'pmo') {
|
|
66
|
+
return new PMOTicketProvider(storage, projectId);
|
|
67
|
+
}
|
|
68
|
+
if (source === 'linear') {
|
|
69
|
+
return new LinearTicketProvider(db, storage, projectId, null);
|
|
70
|
+
}
|
|
71
|
+
// auto: use Linear when it's configured in the workspace
|
|
72
|
+
try {
|
|
73
|
+
if (isLinearConfigured(db)) {
|
|
74
|
+
return new LinearTicketProvider(db, storage, projectId, null);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// workspace_settings table may not exist in older/test databases
|
|
79
|
+
}
|
|
80
|
+
return new PMOTicketProvider(storage, projectId);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/lib/providers/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAE3D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAgB,EAChB,SAAiB,EACjB,EAAqB,EACrB,OAAwB,EACxB,QAAwC;IAExC,MAAM,cAAc,GAAG,QAAQ,EAAE,eAAe,CAAA;IAEhD,eAAe;IACf,IAAI,cAAc,KAAK,QAAQ,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAA;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAE9C,IAAI,OAAO,EAAE,CAAC;YACZ,+DAA+D;YAC/D,4EAA4E;YAC5E,wEAAwE;YACxE,yFAAyF;YACzF,IAAI,OAAO,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;gBACzC,OAAO,IAAI,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,OAAO,IAAI,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;AAClD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CACpC,EAAqB,EACrB,OAAwB,EACxB,SAAiB,EACjB,MAAe;IAEf,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,IAAI,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAClD,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,IAAI,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;IAC/D,CAAC;IAED,yDAAyD;IACzD,IAAI,CAAC;QACH,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;QAC/D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;IAED,OAAO,IAAI,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;AAClD,CAAC"}
|