@proletariat/cli 0.3.90 → 0.3.91
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/agent/auth.js +2 -2
- package/dist/commands/agent/auth.js.map +1 -1
- package/dist/commands/agent/shell.js +3 -3
- package/dist/commands/agent/shell.js.map +1 -1
- package/dist/commands/branch/create.js +2 -2
- package/dist/commands/branch/create.js.map +1 -1
- package/dist/commands/claude/index.js +3 -3
- package/dist/commands/claude/index.js.map +1 -1
- package/dist/commands/claude/open.js +2 -2
- package/dist/commands/claude/open.js.map +1 -1
- package/dist/commands/config/index.js +2 -2
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/db/repair.js +4 -4
- package/dist/commands/db/repair.js.map +1 -1
- package/dist/commands/docker/clean.js +2 -2
- package/dist/commands/docker/clean.js.map +1 -1
- package/dist/commands/docker/index.js +2 -2
- package/dist/commands/docker/index.js.map +1 -1
- package/dist/commands/docker/list.js +2 -2
- package/dist/commands/docker/list.js.map +1 -1
- package/dist/commands/docker/logs.js +2 -2
- package/dist/commands/docker/logs.js.map +1 -1
- package/dist/commands/docker/restart.js +2 -2
- package/dist/commands/docker/restart.js.map +1 -1
- package/dist/commands/docker/shell.js +2 -2
- package/dist/commands/docker/shell.js.map +1 -1
- package/dist/commands/docker/start.js +2 -2
- package/dist/commands/docker/start.js.map +1 -1
- package/dist/commands/docker/stop.js +2 -2
- package/dist/commands/docker/stop.js.map +1 -1
- package/dist/commands/docker/sync.js +2 -2
- package/dist/commands/docker/sync.js.map +1 -1
- package/dist/commands/execution/config.js.map +1 -1
- package/dist/commands/execution/list.js +2 -2
- package/dist/commands/execution/list.js.map +1 -1
- package/dist/commands/execution/logs.js +2 -2
- package/dist/commands/execution/logs.js.map +1 -1
- package/dist/commands/execution/stop.js +2 -2
- package/dist/commands/execution/stop.js.map +1 -1
- package/dist/commands/execution/view.js +2 -2
- package/dist/commands/execution/view.js.map +1 -1
- package/dist/commands/linear/connect.js.map +1 -1
- package/dist/commands/mcp-server.js +2 -2
- package/dist/commands/mcp-server.js.map +1 -1
- package/dist/commands/orchestrator/attach.js +2 -2
- package/dist/commands/orchestrator/attach.js.map +1 -1
- package/dist/commands/orchestrator/start.js +3 -3
- package/dist/commands/orchestrator/start.js.map +1 -1
- package/dist/commands/orchestrator/stop.js +2 -2
- package/dist/commands/orchestrator/stop.js.map +1 -1
- package/dist/commands/qa/index.js +3 -3
- package/dist/commands/qa/index.js.map +1 -1
- package/dist/commands/session/attach.js +3 -3
- package/dist/commands/session/attach.js.map +1 -1
- package/dist/commands/session/cleanup.js +2 -2
- package/dist/commands/session/cleanup.js.map +1 -1
- package/dist/commands/session/exec.js +2 -2
- package/dist/commands/session/exec.js.map +1 -1
- package/dist/commands/session/health.js +2 -2
- package/dist/commands/session/health.js.map +1 -1
- package/dist/commands/session/inspect.js +2 -2
- package/dist/commands/session/inspect.js.map +1 -1
- package/dist/commands/session/list.js +2 -2
- package/dist/commands/session/list.js.map +1 -1
- package/dist/commands/session/peek.js +3 -3
- package/dist/commands/session/peek.js.map +1 -1
- package/dist/commands/session/poke.js +2 -2
- package/dist/commands/session/poke.js.map +1 -1
- package/dist/commands/session/prune.js +2 -2
- package/dist/commands/session/prune.js.map +1 -1
- package/dist/commands/session/report.js +2 -2
- package/dist/commands/session/report.js.map +1 -1
- package/dist/commands/session/restart.js +2 -2
- package/dist/commands/session/restart.js.map +1 -1
- package/dist/commands/shortcut/connect.js.map +1 -1
- package/dist/commands/trello/configure.js.map +1 -1
- package/dist/commands/work/complete.js +2 -2
- package/dist/commands/work/complete.js.map +1 -1
- package/dist/commands/work/hooks/add.js +2 -2
- package/dist/commands/work/hooks/add.js.map +1 -1
- package/dist/commands/work/hooks/list.js +2 -2
- package/dist/commands/work/hooks/list.js.map +1 -1
- package/dist/commands/work/hooks/remove.js +2 -2
- package/dist/commands/work/hooks/remove.js.map +1 -1
- package/dist/commands/work/hooks/toggle.js +2 -2
- package/dist/commands/work/hooks/toggle.js.map +1 -1
- package/dist/commands/work/index.js +4 -0
- package/dist/commands/work/index.js.map +1 -1
- package/dist/commands/work/ready.js +2 -2
- package/dist/commands/work/ready.js.map +1 -1
- package/dist/commands/work/ship.d.ts +43 -0
- package/dist/commands/work/ship.js +587 -0
- package/dist/commands/work/ship.js.map +1 -0
- package/dist/commands/work/spawn.js +2 -2
- package/dist/commands/work/spawn.js.map +1 -1
- package/dist/commands/work/start.d.ts +1 -0
- package/dist/commands/work/start.js +13 -3
- package/dist/commands/work/start.js.map +1 -1
- package/dist/commands/work/stop.js +2 -2
- package/dist/commands/work/stop.js.map +1 -1
- package/dist/commands/work/watch.js +2 -2
- package/dist/commands/work/watch.js.map +1 -1
- package/dist/hooks/init.js +6 -15
- package/dist/hooks/init.js.map +1 -1
- package/dist/lib/asana/config.d.ts +8 -8
- package/dist/lib/asana/config.js.map +1 -1
- package/dist/lib/asana/mapper.d.ts +2 -2
- package/dist/lib/asana/mapper.js.map +1 -1
- package/dist/lib/database/agents.js +4 -2
- package/dist/lib/database/agents.js.map +1 -1
- package/dist/lib/database/db-safety.d.ts +4 -4
- package/dist/lib/database/db-safety.js +6 -6
- package/dist/lib/database/db-safety.js.map +1 -1
- package/dist/lib/database/driver.d.ts +19 -21
- package/dist/lib/database/driver.js +20 -21
- package/dist/lib/database/driver.js.map +1 -1
- package/dist/lib/database/drizzle.d.ts +9 -9
- package/dist/lib/database/drizzle.js +9 -17
- package/dist/lib/database/drizzle.js.map +1 -1
- package/dist/lib/database/migrations/0001_baseline.js.map +1 -1
- package/dist/lib/database/migrations/0002_work_hooks.js.map +1 -1
- package/dist/lib/database/migrations/0003_actions_redesign.js.map +1 -1
- package/dist/lib/database/migrations/0004_workflow_rules.js.map +1 -1
- package/dist/lib/database/migrations/0005_provider_status_mapping.js.map +1 -1
- package/dist/lib/database/migrations/0006_drop_theme_names_used.js.map +1 -1
- package/dist/lib/database/migrations/0007_add_worktree_columns.js.map +1 -1
- package/dist/lib/database/migrations/0008_add_agent_mount_mode.js.map +1 -1
- package/dist/lib/database/migrations/0009_create_media_items.js.map +1 -1
- package/dist/lib/database/migrations/0010_add_ticket_position.js.map +1 -1
- package/dist/lib/database/migrations/0011_add_review_gate.js.map +1 -1
- package/dist/lib/database/migrations/0012_add_action_network_allowlist.js.map +1 -1
- package/dist/lib/database/migrator.d.ts +3 -3
- package/dist/lib/database/migrator.js.map +1 -1
- package/dist/lib/database/pmo-bootstrap.d.ts +2 -2
- package/dist/lib/database/pmo-bootstrap.js +4 -26
- package/dist/lib/database/pmo-bootstrap.js.map +1 -1
- package/dist/lib/database/repositories.js +1 -1
- package/dist/lib/database/repositories.js.map +1 -1
- package/dist/lib/database/settings-store.d.ts +3 -3
- package/dist/lib/database/settings-store.js +2 -2
- package/dist/lib/database/settings-store.js.map +1 -1
- package/dist/lib/database/sqlite.d.ts +155 -0
- package/dist/lib/database/sqlite.js +358 -0
- package/dist/lib/database/sqlite.js.map +1 -0
- package/dist/lib/database/themes.js +3 -3
- package/dist/lib/database/themes.js.map +1 -1
- package/dist/lib/database/workspace.d.ts +4 -4
- package/dist/lib/database/workspace.js +4 -25
- package/dist/lib/database/workspace.js.map +1 -1
- package/dist/lib/execution/config.d.ts +33 -33
- package/dist/lib/execution/config.js.map +1 -1
- package/dist/lib/execution/context.d.ts +20 -0
- package/dist/lib/execution/context.js +88 -0
- package/dist/lib/execution/context.js.map +1 -1
- package/dist/lib/execution/devcontainer.d.ts +7 -1
- package/dist/lib/execution/devcontainer.js +52 -38
- package/dist/lib/execution/devcontainer.js.map +1 -1
- package/dist/lib/execution/runners/devcontainer.js +11 -0
- package/dist/lib/execution/runners/devcontainer.js.map +1 -1
- package/dist/lib/execution/runners/docker-management.js +1 -1
- package/dist/lib/execution/runners/docker-management.js.map +1 -1
- package/dist/lib/execution/runners/orchestrator.js +6 -3
- package/dist/lib/execution/runners/orchestrator.js.map +1 -1
- package/dist/lib/execution/runners/prompt-builder.js +31 -0
- package/dist/lib/execution/runners/prompt-builder.js.map +1 -1
- package/dist/lib/execution/runners/shared.d.ts +2 -2
- package/dist/lib/execution/runners/shared.js +2 -2
- package/dist/lib/execution/runners/shared.js.map +1 -1
- package/dist/lib/execution/spawner.d.ts +3 -3
- package/dist/lib/execution/spawner.js.map +1 -1
- package/dist/lib/execution/storage.d.ts +3 -3
- package/dist/lib/execution/storage.js.map +1 -1
- package/dist/lib/execution/types.d.ts +23 -0
- package/dist/lib/execution/types.js.map +1 -1
- package/dist/lib/external-issues/mapping-store.d.ts +2 -2
- package/dist/lib/external-issues/mapping-store.js.map +1 -1
- package/dist/lib/external-issues/outbound-sync.d.ts +3 -3
- package/dist/lib/external-issues/outbound-sync.js.map +1 -1
- package/dist/lib/jira/config.d.ts +5 -5
- package/dist/lib/jira/config.js.map +1 -1
- package/dist/lib/linear/config.d.ts +8 -8
- package/dist/lib/linear/config.js.map +1 -1
- package/dist/lib/linear/mapper.d.ts +2 -2
- package/dist/lib/linear/mapper.js.map +1 -1
- package/dist/lib/mcp/types.d.ts +2 -2
- package/dist/lib/monday/config.d.ts +9 -9
- package/dist/lib/monday/config.js.map +1 -1
- package/dist/lib/monday/mapper.d.ts +2 -2
- package/dist/lib/monday/mapper.js.map +1 -1
- package/dist/lib/pmo/diet.d.ts +3 -3
- package/dist/lib/pmo/diet.js.map +1 -1
- package/dist/lib/pmo/find-pmo.js +1 -5
- package/dist/lib/pmo/find-pmo.js.map +1 -1
- package/dist/lib/pmo/index.js +6 -7
- package/dist/lib/pmo/index.js.map +1 -1
- package/dist/lib/pmo/storage/base.d.ts +15 -15
- package/dist/lib/pmo/storage/base.js.map +1 -1
- package/dist/lib/pmo/storage/dependencies.js.map +1 -1
- package/dist/lib/pmo/storage/helpers.js.map +1 -1
- package/dist/lib/pmo/storage/index.d.ts +8 -2
- package/dist/lib/pmo/storage/index.js +10 -2
- package/dist/lib/pmo/storage/index.js.map +1 -1
- package/dist/lib/pmo/storage/projects.js.map +1 -1
- package/dist/lib/pmo/storage/roadmaps.js +4 -4
- package/dist/lib/pmo/storage/roadmaps.js.map +1 -1
- package/dist/lib/pmo/storage/specs.js.map +1 -1
- package/dist/lib/pmo/storage/statuses.js +1 -1
- package/dist/lib/pmo/storage/statuses.js.map +1 -1
- package/dist/lib/pmo/storage/tickets.js +1 -1
- package/dist/lib/pmo/storage/tickets.js.map +1 -1
- package/dist/lib/pmo/storage/types.d.ts +2 -2
- package/dist/lib/pmo/storage/views.js.map +1 -1
- package/dist/lib/providers/index.d.ts +2 -0
- package/dist/lib/providers/index.js +2 -0
- package/dist/lib/providers/index.js.map +1 -1
- package/dist/lib/providers/linear-provider.d.ts +2 -2
- package/dist/lib/providers/linear-provider.js.map +1 -1
- package/dist/lib/providers/resolver.d.ts +3 -3
- package/dist/lib/providers/resolver.js.map +1 -1
- package/dist/lib/providers/state-intents.d.ts +44 -0
- package/dist/lib/providers/state-intents.js +101 -0
- package/dist/lib/providers/state-intents.js.map +1 -0
- package/dist/lib/providers/state-resolution.d.ts +137 -0
- package/dist/lib/providers/state-resolution.js +302 -0
- package/dist/lib/providers/state-resolution.js.map +1 -0
- package/dist/lib/providers/status-mapping.d.ts +2 -2
- package/dist/lib/providers/status-mapping.js.map +1 -1
- package/dist/lib/providers/trigger-config.d.ts +4 -4
- package/dist/lib/providers/trigger-config.js.map +1 -1
- package/dist/lib/providers/types.d.ts +2 -1
- package/dist/lib/registry/index.js +4 -11
- package/dist/lib/registry/index.js.map +1 -1
- package/dist/lib/shortcut/config.d.ts +8 -8
- package/dist/lib/shortcut/config.js.map +1 -1
- package/dist/lib/trello/config.d.ts +10 -10
- package/dist/lib/trello/config.js.map +1 -1
- package/dist/lib/trello/mapper.d.ts +2 -2
- package/dist/lib/trello/mapper.js.map +1 -1
- package/dist/lib/work-lifecycle/action-chaining.d.ts +3 -3
- package/dist/lib/work-lifecycle/action-chaining.js.map +1 -1
- package/dist/lib/work-lifecycle/hooks/manager.d.ts +3 -3
- package/dist/lib/work-lifecycle/hooks/manager.js.map +1 -1
- package/dist/lib/work-lifecycle/hooks/storage.d.ts +3 -3
- package/dist/lib/work-lifecycle/hooks/storage.js.map +1 -1
- package/dist/lib/work-lifecycle/post-execution.d.ts +2 -2
- package/dist/lib/work-lifecycle/post-execution.js +47 -28
- package/dist/lib/work-lifecycle/post-execution.js.map +1 -1
- package/dist/lib/work-lifecycle/rule-evaluator.d.ts +3 -3
- package/dist/lib/work-lifecycle/rule-evaluator.js.map +1 -1
- package/dist/lib/work-source/config.d.ts +6 -6
- package/dist/lib/work-source/config.js.map +1 -1
- package/dist/lib/work-source/provider-sources.d.ts +12 -12
- package/dist/lib/work-source/provider-sources.js.map +1 -1
- package/oclif.manifest.json +2202 -2088
- package/package.json +3 -4
- package/bin/validate-better-sqlite3.cjs +0 -129
- package/dist/lib/database/native-validation.d.ts +0 -40
- package/dist/lib/database/native-validation.js +0 -123
- package/dist/lib/database/native-validation.js.map +0 -1
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Resolution Engine
|
|
3
|
+
*
|
|
4
|
+
* Resolves semantic intents (e.g., 'review', 'active', 'done') to actual
|
|
5
|
+
* PM tool states at runtime. Never caches state IDs across calls.
|
|
6
|
+
*
|
|
7
|
+
* Resolution flow:
|
|
8
|
+
* 1. Always fetch fresh states from the PM provider
|
|
9
|
+
* 2. Check user config — `state-map.{intent}` overrides exact-match against fetched states
|
|
10
|
+
* 3. Match against built-in semantic intent aliases
|
|
11
|
+
* 4. No config + no alias match → LLM resolves (pass available states to LLM)
|
|
12
|
+
* 5. No match → skip (don't move, log warning)
|
|
13
|
+
*
|
|
14
|
+
* The same move() function works across Linear, Trello, ClickUp, Jira, etc. —
|
|
15
|
+
* each provider implements fetchStates() differently but returns the same shape.
|
|
16
|
+
* Resolution logic is provider-agnostic.
|
|
17
|
+
*/
|
|
18
|
+
import type { TicketProvider } from './types.js';
|
|
19
|
+
import type { ProviderStorage } from './types.js';
|
|
20
|
+
import type { SqliteDatabase } from '../database/sqlite.js';
|
|
21
|
+
/**
|
|
22
|
+
* A state from a PM provider, normalized to a common shape.
|
|
23
|
+
* Every provider (Linear, Trello, ClickUp, PMO) returns states in this format.
|
|
24
|
+
*/
|
|
25
|
+
export interface PMState {
|
|
26
|
+
id: string;
|
|
27
|
+
name: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Interface that providers must implement to support the state resolution engine.
|
|
31
|
+
* This is a superset of TicketProvider — providers that want to participate
|
|
32
|
+
* in intent-based resolution need fetchStates().
|
|
33
|
+
*/
|
|
34
|
+
export interface PMProvider {
|
|
35
|
+
/** Fetch all available states for a ticket's project/board. Always fresh — never cached. */
|
|
36
|
+
fetchStates(ticketId: string): Promise<PMState[]>;
|
|
37
|
+
/** Move a ticket to a specific state by ID. */
|
|
38
|
+
moveTicket(ticketId: string, stateId: string): Promise<{
|
|
39
|
+
success: boolean;
|
|
40
|
+
error?: string;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Result of a state resolution attempt.
|
|
45
|
+
*/
|
|
46
|
+
export interface StateResolutionResult {
|
|
47
|
+
/** Whether the move succeeded */
|
|
48
|
+
success: boolean;
|
|
49
|
+
/** How the state was resolved */
|
|
50
|
+
resolvedVia?: 'config' | 'alias' | 'llm' | 'skipped';
|
|
51
|
+
/** The resolved state name */
|
|
52
|
+
stateName?: string;
|
|
53
|
+
/** The resolved state ID */
|
|
54
|
+
stateId?: string;
|
|
55
|
+
/** Warning message if the move was skipped */
|
|
56
|
+
warning?: string;
|
|
57
|
+
/** Error message if the move failed */
|
|
58
|
+
error?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Use the LLM to resolve which available state best matches a semantic intent.
|
|
62
|
+
*
|
|
63
|
+
* Sends the list of available states and the intent to the Anthropic API.
|
|
64
|
+
* Returns the matching state ID, or null if no match.
|
|
65
|
+
*
|
|
66
|
+
* Requires ANTHROPIC_API_KEY to be set.
|
|
67
|
+
*/
|
|
68
|
+
export declare function llmResolveState(states: PMState[], intent: string): Promise<PMState | null>;
|
|
69
|
+
/**
|
|
70
|
+
* Check user config for a state-map override for the given intent.
|
|
71
|
+
* Config stores state NAMES, not IDs.
|
|
72
|
+
*
|
|
73
|
+
* @param db - Database instance for settings lookup
|
|
74
|
+
* @param intent - Semantic intent name (e.g., 'review')
|
|
75
|
+
* @returns The configured state name, or null if not set
|
|
76
|
+
*/
|
|
77
|
+
export declare function getStateMapConfig(db: SqliteDatabase, intent: string): string | null;
|
|
78
|
+
/**
|
|
79
|
+
* Set a state-map config override for an intent.
|
|
80
|
+
*
|
|
81
|
+
* @param db - Database instance
|
|
82
|
+
* @param intent - Semantic intent name
|
|
83
|
+
* @param stateName - The state name to map to
|
|
84
|
+
*/
|
|
85
|
+
export declare function setStateMapConfig(db: SqliteDatabase, intent: string, stateName: string): void;
|
|
86
|
+
/**
|
|
87
|
+
* Remove a state-map config override for an intent.
|
|
88
|
+
*/
|
|
89
|
+
export declare function deleteStateMapConfig(db: SqliteDatabase, intent: string): void;
|
|
90
|
+
/**
|
|
91
|
+
* List all state-map config overrides.
|
|
92
|
+
*/
|
|
93
|
+
export declare function listStateMapConfigs(db: SqliteDatabase): Array<{
|
|
94
|
+
intent: string;
|
|
95
|
+
stateName: string;
|
|
96
|
+
}>;
|
|
97
|
+
/**
|
|
98
|
+
* Create a PMProvider adapter from the existing TicketProvider + ProviderStorage.
|
|
99
|
+
*
|
|
100
|
+
* Fetches fresh states from the project's board via storage, and delegates
|
|
101
|
+
* moveTicket to the TicketProvider (which routes to Linear/Jira/PMO).
|
|
102
|
+
*/
|
|
103
|
+
export declare function createPMProviderAdapter(provider: TicketProvider, storage: ProviderStorage, projectId: string): PMProvider;
|
|
104
|
+
/**
|
|
105
|
+
* Options for the move() function.
|
|
106
|
+
*/
|
|
107
|
+
export interface MoveOptions {
|
|
108
|
+
/** Database for config lookups (optional — skip config check if not provided) */
|
|
109
|
+
db?: SqliteDatabase;
|
|
110
|
+
/** Current state name — if provided, skip move when already in the resolved state */
|
|
111
|
+
currentState?: string;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Move a ticket to a state matching a semantic intent.
|
|
115
|
+
*
|
|
116
|
+
* Resolution order:
|
|
117
|
+
* 1. Fetch fresh states from the provider (never cache)
|
|
118
|
+
* 2. Check user config for `state-map.{intent}` override → exact match
|
|
119
|
+
* 3. Match against built-in semantic intent aliases
|
|
120
|
+
* 4. LLM fallback — ask Claude which state matches the intent
|
|
121
|
+
* 5. No match → skip, return warning
|
|
122
|
+
*
|
|
123
|
+
* @param pmProvider - The PM provider to fetch states from and move tickets in
|
|
124
|
+
* @param ticketId - The ticket to move
|
|
125
|
+
* @param intent - The semantic intent (e.g., 'review', 'active', 'done', 'blocked')
|
|
126
|
+
* @param dbOrOptions - Database instance or options object
|
|
127
|
+
* @returns Resolution result with success/failure and metadata
|
|
128
|
+
*/
|
|
129
|
+
export declare function move(pmProvider: PMProvider, ticketId: string, intent: string, dbOrOptions?: SqliteDatabase | MoveOptions): Promise<StateResolutionResult>;
|
|
130
|
+
/**
|
|
131
|
+
* High-level convenience function that wraps move() with the existing
|
|
132
|
+
* TicketProvider + ProviderStorage infrastructure.
|
|
133
|
+
*
|
|
134
|
+
* Use this from commands and lifecycle hooks that already have a resolved
|
|
135
|
+
* TicketProvider and ProviderStorage.
|
|
136
|
+
*/
|
|
137
|
+
export declare function moveWithProvider(provider: TicketProvider, storage: ProviderStorage, projectId: string, ticketId: string, intent: string, db?: SqliteDatabase, currentState?: string): Promise<StateResolutionResult>;
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Resolution Engine
|
|
3
|
+
*
|
|
4
|
+
* Resolves semantic intents (e.g., 'review', 'active', 'done') to actual
|
|
5
|
+
* PM tool states at runtime. Never caches state IDs across calls.
|
|
6
|
+
*
|
|
7
|
+
* Resolution flow:
|
|
8
|
+
* 1. Always fetch fresh states from the PM provider
|
|
9
|
+
* 2. Check user config — `state-map.{intent}` overrides exact-match against fetched states
|
|
10
|
+
* 3. Match against built-in semantic intent aliases
|
|
11
|
+
* 4. No config + no alias match → LLM resolves (pass available states to LLM)
|
|
12
|
+
* 5. No match → skip (don't move, log warning)
|
|
13
|
+
*
|
|
14
|
+
* The same move() function works across Linear, Trello, ClickUp, Jira, etc. —
|
|
15
|
+
* each provider implements fetchStates() differently but returns the same shape.
|
|
16
|
+
* Resolution logic is provider-agnostic.
|
|
17
|
+
*/
|
|
18
|
+
import { SettingsStore } from '../database/settings-store.js';
|
|
19
|
+
import { matchIntentByAliases, getDefaultIntent } from './state-intents.js';
|
|
20
|
+
/**
|
|
21
|
+
* Config key prefix for state-map overrides.
|
|
22
|
+
* e.g., `state-map.review` → "Awaiting Client Feedback"
|
|
23
|
+
*/
|
|
24
|
+
const STATE_MAP_PREFIX = 'state-map.';
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// LLM Resolution
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/**
|
|
29
|
+
* Use the LLM to resolve which available state best matches a semantic intent.
|
|
30
|
+
*
|
|
31
|
+
* Sends the list of available states and the intent to the Anthropic API.
|
|
32
|
+
* Returns the matching state ID, or null if no match.
|
|
33
|
+
*
|
|
34
|
+
* Requires ANTHROPIC_API_KEY to be set.
|
|
35
|
+
*/
|
|
36
|
+
export async function llmResolveState(states, intent) {
|
|
37
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
38
|
+
if (!apiKey) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const stateList = states.map(s => `- "${s.name}" (id: ${s.id})`).join('\n');
|
|
42
|
+
const prompt = `You are a state resolution assistant. Given a list of available workflow states from a project management tool and a semantic intent, pick the state that best matches the intent.
|
|
43
|
+
|
|
44
|
+
Available states:
|
|
45
|
+
${stateList}
|
|
46
|
+
|
|
47
|
+
Semantic intent: "${intent}"
|
|
48
|
+
${getDefaultIntent(intent) ? `Intent description: ${getDefaultIntent(intent).description}` : ''}
|
|
49
|
+
|
|
50
|
+
Respond with ONLY the exact state ID that best matches this intent. If no state matches, respond with "NONE".`;
|
|
51
|
+
try {
|
|
52
|
+
const response = await fetch('https://api.anthropic.com/v1/messages', {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
headers: {
|
|
55
|
+
'Content-Type': 'application/json',
|
|
56
|
+
'x-api-key': apiKey,
|
|
57
|
+
'anthropic-version': '2023-06-01',
|
|
58
|
+
},
|
|
59
|
+
body: JSON.stringify({
|
|
60
|
+
model: 'claude-haiku-4-5-20251001',
|
|
61
|
+
max_tokens: 100,
|
|
62
|
+
messages: [
|
|
63
|
+
{
|
|
64
|
+
role: 'user',
|
|
65
|
+
content: prompt,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
}),
|
|
69
|
+
});
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const data = (await response.json());
|
|
74
|
+
const text = data.content?.[0]?.text?.trim();
|
|
75
|
+
if (!text || text === 'NONE') {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
// The LLM should return a state ID — find the matching state
|
|
79
|
+
const match = states.find(s => s.id === text);
|
|
80
|
+
if (match)
|
|
81
|
+
return match;
|
|
82
|
+
// Fallback: LLM might have returned a state name instead of ID
|
|
83
|
+
const nameMatch = states.find(s => s.name.toLowerCase() === text.toLowerCase());
|
|
84
|
+
if (nameMatch)
|
|
85
|
+
return nameMatch;
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// LLM call failed — non-fatal, fall through to skip
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Config Resolution
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
/**
|
|
97
|
+
* Check user config for a state-map override for the given intent.
|
|
98
|
+
* Config stores state NAMES, not IDs.
|
|
99
|
+
*
|
|
100
|
+
* @param db - Database instance for settings lookup
|
|
101
|
+
* @param intent - Semantic intent name (e.g., 'review')
|
|
102
|
+
* @returns The configured state name, or null if not set
|
|
103
|
+
*/
|
|
104
|
+
export function getStateMapConfig(db, intent) {
|
|
105
|
+
try {
|
|
106
|
+
const settings = new SettingsStore(db);
|
|
107
|
+
return settings.get(`${STATE_MAP_PREFIX}${intent}`);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Set a state-map config override for an intent.
|
|
115
|
+
*
|
|
116
|
+
* @param db - Database instance
|
|
117
|
+
* @param intent - Semantic intent name
|
|
118
|
+
* @param stateName - The state name to map to
|
|
119
|
+
*/
|
|
120
|
+
export function setStateMapConfig(db, intent, stateName) {
|
|
121
|
+
const settings = new SettingsStore(db);
|
|
122
|
+
settings.set(`${STATE_MAP_PREFIX}${intent}`, stateName);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Remove a state-map config override for an intent.
|
|
126
|
+
*/
|
|
127
|
+
export function deleteStateMapConfig(db, intent) {
|
|
128
|
+
const settings = new SettingsStore(db);
|
|
129
|
+
settings.delete(`${STATE_MAP_PREFIX}${intent}`);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* List all state-map config overrides.
|
|
133
|
+
*/
|
|
134
|
+
export function listStateMapConfigs(db) {
|
|
135
|
+
try {
|
|
136
|
+
const settings = new SettingsStore(db);
|
|
137
|
+
const entries = settings.getByPrefix(STATE_MAP_PREFIX);
|
|
138
|
+
return entries.map(e => ({
|
|
139
|
+
intent: e.key.slice(STATE_MAP_PREFIX.length),
|
|
140
|
+
stateName: e.value,
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
// State Fetching — Provider Adapters
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
/**
|
|
151
|
+
* Create a PMProvider adapter from the existing TicketProvider + ProviderStorage.
|
|
152
|
+
*
|
|
153
|
+
* Fetches fresh states from the project's board via storage, and delegates
|
|
154
|
+
* moveTicket to the TicketProvider (which routes to Linear/Jira/PMO).
|
|
155
|
+
*/
|
|
156
|
+
export function createPMProviderAdapter(provider, storage, projectId) {
|
|
157
|
+
return {
|
|
158
|
+
async fetchStates(_ticketId) {
|
|
159
|
+
const board = await storage.getProjectBoard(projectId);
|
|
160
|
+
if (!board)
|
|
161
|
+
return [];
|
|
162
|
+
return board.columns.map((col, idx) => ({
|
|
163
|
+
id: col.name, // For PMO, the state ID is the column name
|
|
164
|
+
name: col.name,
|
|
165
|
+
}));
|
|
166
|
+
},
|
|
167
|
+
async moveTicket(ticketId, stateId) {
|
|
168
|
+
const result = await provider.moveTicket(ticketId, stateId);
|
|
169
|
+
return { success: result.success, error: result.error };
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Move a ticket to a state matching a semantic intent.
|
|
175
|
+
*
|
|
176
|
+
* Resolution order:
|
|
177
|
+
* 1. Fetch fresh states from the provider (never cache)
|
|
178
|
+
* 2. Check user config for `state-map.{intent}` override → exact match
|
|
179
|
+
* 3. Match against built-in semantic intent aliases
|
|
180
|
+
* 4. LLM fallback — ask Claude which state matches the intent
|
|
181
|
+
* 5. No match → skip, return warning
|
|
182
|
+
*
|
|
183
|
+
* @param pmProvider - The PM provider to fetch states from and move tickets in
|
|
184
|
+
* @param ticketId - The ticket to move
|
|
185
|
+
* @param intent - The semantic intent (e.g., 'review', 'active', 'done', 'blocked')
|
|
186
|
+
* @param dbOrOptions - Database instance or options object
|
|
187
|
+
* @returns Resolution result with success/failure and metadata
|
|
188
|
+
*/
|
|
189
|
+
export async function move(pmProvider, ticketId, intent, dbOrOptions) {
|
|
190
|
+
// Normalize arguments: support both `move(p, id, intent, db)` and `move(p, id, intent, { db, currentState })`
|
|
191
|
+
let db;
|
|
192
|
+
let currentState;
|
|
193
|
+
if (dbOrOptions && typeof dbOrOptions === 'object' && 'prepare' in dbOrOptions) {
|
|
194
|
+
// It's a Database instance (has .prepare method)
|
|
195
|
+
db = dbOrOptions;
|
|
196
|
+
}
|
|
197
|
+
else if (dbOrOptions && typeof dbOrOptions === 'object') {
|
|
198
|
+
const opts = dbOrOptions;
|
|
199
|
+
db = opts.db;
|
|
200
|
+
currentState = opts.currentState;
|
|
201
|
+
}
|
|
202
|
+
// 1. Always fetch fresh states
|
|
203
|
+
let states;
|
|
204
|
+
try {
|
|
205
|
+
states = await pmProvider.fetchStates(ticketId);
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return {
|
|
209
|
+
success: false,
|
|
210
|
+
error: `Failed to fetch states: ${error instanceof Error ? error.message : String(error)}`,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
if (states.length === 0) {
|
|
214
|
+
return {
|
|
215
|
+
success: false,
|
|
216
|
+
error: 'No states available from provider',
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// Helper: check if ticket is already in the resolved state (case-insensitive)
|
|
220
|
+
const isAlreadyInState = (stateName) => {
|
|
221
|
+
if (!currentState)
|
|
222
|
+
return false;
|
|
223
|
+
return currentState.toLowerCase() === stateName.toLowerCase();
|
|
224
|
+
};
|
|
225
|
+
// 2. Check user config override
|
|
226
|
+
if (db) {
|
|
227
|
+
const configOverride = getStateMapConfig(db, intent);
|
|
228
|
+
if (configOverride) {
|
|
229
|
+
const match = states.find(s => s.name.toLowerCase() === configOverride.toLowerCase());
|
|
230
|
+
if (match) {
|
|
231
|
+
if (isAlreadyInState(match.name)) {
|
|
232
|
+
return { success: false, resolvedVia: 'config', stateName: match.name, stateId: match.id };
|
|
233
|
+
}
|
|
234
|
+
const result = await pmProvider.moveTicket(ticketId, match.id);
|
|
235
|
+
return {
|
|
236
|
+
success: result.success,
|
|
237
|
+
resolvedVia: 'config',
|
|
238
|
+
stateName: match.name,
|
|
239
|
+
stateId: match.id,
|
|
240
|
+
error: result.error,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
// Config is set but no matching state — fall through to alias/LLM
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// 3. Match against built-in semantic intent aliases
|
|
247
|
+
const intentDef = getDefaultIntent(intent);
|
|
248
|
+
if (intentDef) {
|
|
249
|
+
const aliasMatch = matchIntentByAliases(states, intentDef);
|
|
250
|
+
if (aliasMatch) {
|
|
251
|
+
if (isAlreadyInState(aliasMatch.name)) {
|
|
252
|
+
return { success: false, resolvedVia: 'alias', stateName: aliasMatch.name, stateId: aliasMatch.id };
|
|
253
|
+
}
|
|
254
|
+
const result = await pmProvider.moveTicket(ticketId, aliasMatch.id);
|
|
255
|
+
return {
|
|
256
|
+
success: result.success,
|
|
257
|
+
resolvedVia: 'alias',
|
|
258
|
+
stateName: aliasMatch.name,
|
|
259
|
+
stateId: aliasMatch.id,
|
|
260
|
+
error: result.error,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// 4. LLM fallback
|
|
265
|
+
const llmMatch = await llmResolveState(states, intent);
|
|
266
|
+
if (llmMatch) {
|
|
267
|
+
if (isAlreadyInState(llmMatch.name)) {
|
|
268
|
+
return { success: false, resolvedVia: 'llm', stateName: llmMatch.name, stateId: llmMatch.id };
|
|
269
|
+
}
|
|
270
|
+
const result = await pmProvider.moveTicket(ticketId, llmMatch.id);
|
|
271
|
+
return {
|
|
272
|
+
success: result.success,
|
|
273
|
+
resolvedVia: 'llm',
|
|
274
|
+
stateName: llmMatch.name,
|
|
275
|
+
stateId: llmMatch.id,
|
|
276
|
+
error: result.error,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
// 5. No match — skip
|
|
280
|
+
const warning = `No state match for intent '${intent}', skipping move`;
|
|
281
|
+
console.warn(warning);
|
|
282
|
+
return {
|
|
283
|
+
success: false,
|
|
284
|
+
resolvedVia: 'skipped',
|
|
285
|
+
warning,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
// ---------------------------------------------------------------------------
|
|
289
|
+
// Convenience: moveWithProvider()
|
|
290
|
+
// ---------------------------------------------------------------------------
|
|
291
|
+
/**
|
|
292
|
+
* High-level convenience function that wraps move() with the existing
|
|
293
|
+
* TicketProvider + ProviderStorage infrastructure.
|
|
294
|
+
*
|
|
295
|
+
* Use this from commands and lifecycle hooks that already have a resolved
|
|
296
|
+
* TicketProvider and ProviderStorage.
|
|
297
|
+
*/
|
|
298
|
+
export async function moveWithProvider(provider, storage, projectId, ticketId, intent, db, currentState) {
|
|
299
|
+
const pmProvider = createPMProviderAdapter(provider, storage, projectId);
|
|
300
|
+
return move(pmProvider, ticketId, intent, { db, currentState });
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=state-resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-resolution.js","sourceRoot":"","sources":["../../../src/lib/providers/state-resolution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAC7D,OAAO,EAAmB,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AA8C5F;;;GAGG;AACH,MAAM,gBAAgB,GAAG,YAAY,CAAA;AAErC,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAiB,EACjB,MAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAA;IAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE3E,MAAM,MAAM,GAAG;;;EAGf,SAAS;;oBAES,MAAM;EACxB,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,uBAAuB,gBAAgB,CAAC,MAAM,CAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;;8GAEc,CAAA;IAE5G,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uCAAuC,EAAE;YACpE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,MAAM;gBACnB,mBAAmB,EAAE,YAAY;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,2BAA2B;gBAClC,UAAU,EAAE,GAAG;gBACf,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,MAAM;qBAChB;iBACF;aACF,CAAC;SACH,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAA;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QAC5C,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,6DAA6D;QAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAA;QAC7C,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;QAEvB,+DAA+D;QAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QAC/E,IAAI,SAAS;YAAE,OAAO,SAAS,CAAA;QAE/B,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;QACpD,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAkB,EAAE,MAAc;IAClE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;QACtC,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,gBAAgB,GAAG,MAAM,EAAE,CAAC,CAAA;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAkB,EAAE,MAAc,EAAE,SAAiB;IACrF,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;IACtC,QAAQ,CAAC,GAAG,CAAC,GAAG,gBAAgB,GAAG,MAAM,EAAE,EAAE,SAAS,CAAC,CAAA;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAkB,EAAE,MAAc;IACrE,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;IACtC,QAAQ,CAAC,MAAM,CAAC,GAAG,gBAAgB,GAAG,MAAM,EAAE,CAAC,CAAA;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAkB;IACpD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;QACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAA;QACtD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvB,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC5C,SAAS,EAAE,CAAC,CAAC,KAAK;SACnB,CAAC,CAAC,CAAA;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,qCAAqC;AACrC,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAwB,EACxB,OAAwB,EACxB,SAAiB;IAEjB,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,SAAiB;YACjC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;YACtD,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,CAAA;YACrB,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;gBACtC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAG,2CAA2C;gBAC1D,IAAI,EAAE,GAAG,CAAC,IAAI;aACf,CAAC,CAAC,CAAA;QACL,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,OAAe;YAChD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAA;QACzD,CAAC;KACF,CAAA;AACH,CAAC;AAgBD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,UAAsB,EACtB,QAAgB,EAChB,MAAc,EACd,WAA0C;IAE1C,8GAA8G;IAC9G,IAAI,EAA8B,CAAA;IAClC,IAAI,YAAgC,CAAA;IACpC,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC;QAC/E,iDAAiD;QACjD,EAAE,GAAG,WAA6B,CAAA;IACpC,CAAC;SAAM,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,WAA0B,CAAA;QACvC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;QACZ,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;IAClC,CAAC;IACD,+BAA+B;IAC/B,IAAI,MAAiB,CAAA;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC3F,CAAA;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mCAAmC;SAC3C,CAAA;IACH,CAAC;IAED,8EAA8E;IAC9E,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAW,EAAE;QACtD,IAAI,CAAC,YAAY;YAAE,OAAO,KAAK,CAAA;QAC/B,OAAO,YAAY,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,EAAE,CAAA;IAC/D,CAAC,CAAA;IAED,gCAAgC;IAChC,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QACpD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,cAAc,CAAC,WAAW,EAAE,CAAC,CAAA;YACrF,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAA;gBAC5F,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;gBAC9D,OAAO;oBACL,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,WAAW,EAAE,QAAQ;oBACrB,SAAS,EAAE,KAAK,CAAC,IAAI;oBACrB,OAAO,EAAE,KAAK,CAAC,EAAE;oBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB,CAAA;YACH,CAAC;YACD,kEAAkE;QACpE,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC1C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAC1D,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,CAAA;YACrG,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC,CAAA;YACnE,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,OAAO;gBACpB,SAAS,EAAE,UAAU,CAAC,IAAI;gBAC1B,OAAO,EAAE,UAAU,CAAC,EAAE;gBACtB,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAA;QACH,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAA;QAC/F,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;QACjE,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,KAAK;YAClB,SAAS,EAAE,QAAQ,CAAC,IAAI;YACxB,OAAO,EAAE,QAAQ,CAAC,EAAE;YACpB,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAA;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,OAAO,GAAG,8BAA8B,MAAM,kBAAkB,CAAA;IACtE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACrB,OAAO;QACL,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,SAAS;QACtB,OAAO;KACR,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAwB,EACxB,OAAwB,EACxB,SAAiB,EACjB,QAAgB,EAChB,MAAc,EACd,EAAmB,EACnB,YAAqB;IAErB,MAAM,UAAU,GAAG,uBAAuB,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;IACxE,OAAO,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAA;AACjE,CAAC"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* 1. Exact name match
|
|
16
16
|
* 2. Category-based matching (e.g., 'started' category)
|
|
17
17
|
*/
|
|
18
|
-
import type
|
|
18
|
+
import type { SqliteDatabase } from '../database/sqlite.js';
|
|
19
19
|
import type { StateCategory } from '../pmo/types.js';
|
|
20
20
|
export interface StatusMapping {
|
|
21
21
|
provider: string;
|
|
@@ -29,7 +29,7 @@ export interface StatusMapping {
|
|
|
29
29
|
*/
|
|
30
30
|
export declare class ProviderStatusMappingStore {
|
|
31
31
|
private db;
|
|
32
|
-
constructor(db:
|
|
32
|
+
constructor(db: SqliteDatabase);
|
|
33
33
|
/**
|
|
34
34
|
* Get the canonical status for a provider-specific status.
|
|
35
35
|
* Returns null if no mapping is configured.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-mapping.js","sourceRoot":"","sources":["../../../src/lib/providers/status-mapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAaH;;;GAGG;AACH,MAAM,OAAO,0BAA0B;IACjB;IAApB,YAAoB,
|
|
1
|
+
{"version":3,"file":"status-mapping.js","sourceRoot":"","sources":["../../../src/lib/providers/status-mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* trigger_event: 'pr_merged', target_status: 'Done'
|
|
23
23
|
* → When a PR is merged, move the ticket to "Done"
|
|
24
24
|
*/
|
|
25
|
-
import type
|
|
25
|
+
import type { SqliteDatabase } from '../database/sqlite.js';
|
|
26
26
|
/**
|
|
27
27
|
* Valid trigger event names that can be configured.
|
|
28
28
|
*/
|
|
@@ -42,7 +42,7 @@ export interface TriggerConfig {
|
|
|
42
42
|
*/
|
|
43
43
|
export declare class ProviderTriggerStore {
|
|
44
44
|
private db;
|
|
45
|
-
constructor(db:
|
|
45
|
+
constructor(db: SqliteDatabase);
|
|
46
46
|
/**
|
|
47
47
|
* Get all triggers for a specific event, optionally filtered by provider and project.
|
|
48
48
|
*/
|
|
@@ -72,7 +72,7 @@ export declare class TriggerHandler {
|
|
|
72
72
|
private unsubscribers;
|
|
73
73
|
private store;
|
|
74
74
|
private moveTicket;
|
|
75
|
-
constructor(db:
|
|
75
|
+
constructor(db: SqliteDatabase, moveTicket: (ticketId: string, projectId: string, targetStatus: string) => Promise<void>);
|
|
76
76
|
/**
|
|
77
77
|
* Start listening for work-lifecycle events and applying triggers.
|
|
78
78
|
*/
|
|
@@ -91,7 +91,7 @@ export declare class TriggerHandler {
|
|
|
91
91
|
* Initialize the trigger handler.
|
|
92
92
|
* Safe to call multiple times — subsequent calls are no-ops.
|
|
93
93
|
*/
|
|
94
|
-
export declare function initTriggerHandler(db:
|
|
94
|
+
export declare function initTriggerHandler(db: SqliteDatabase, moveTicket: (ticketId: string, projectId: string, targetStatus: string) => Promise<void>): TriggerHandler;
|
|
95
95
|
/**
|
|
96
96
|
* Stop the trigger handler (primarily for testing).
|
|
97
97
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger-config.js","sourceRoot":"","sources":["../../../src/lib/providers/trigger-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAapD,MAAM,CAAC,MAAM,cAAc,GAA4B;IACrD,eAAe;IACf,YAAY;IACZ,WAAW;IACX,cAAc;IACd,gBAAgB;CACjB,CAAA;AAWD;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IACX;IAApB,YAAoB,
|
|
1
|
+
{"version":3,"file":"trigger-config.js","sourceRoot":"","sources":["../../../src/lib/providers/trigger-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* The local PMO is just the default provider for users without integrations,
|
|
9
9
|
* not a cache layer.
|
|
10
10
|
*/
|
|
11
|
+
import type { SqliteDatabase } from '../database/sqlite.js';
|
|
11
12
|
import type { StateCategory, Ticket, TicketFilter, CreateTicketInput } from '../pmo/types.js';
|
|
12
13
|
/**
|
|
13
14
|
* Supported provider names for ticket operations.
|
|
@@ -132,5 +133,5 @@ export interface ProviderStorage {
|
|
|
132
133
|
deleteTicket: (id: string) => Promise<void>;
|
|
133
134
|
listTickets: (projectId: string | undefined, filter?: TicketFilter) => Promise<Ticket[]>;
|
|
134
135
|
createTicket: (projectId: string, input: CreateTicketInput) => Promise<Ticket>;
|
|
135
|
-
getDatabase: () =>
|
|
136
|
+
getDatabase: () => SqliteDatabase;
|
|
136
137
|
}
|
|
@@ -9,7 +9,6 @@ import { openDriver } from '../database/driver.js';
|
|
|
9
9
|
import * as fs from 'node:fs';
|
|
10
10
|
import * as path from 'node:path';
|
|
11
11
|
import * as os from 'node:os';
|
|
12
|
-
import { throwIfNativeBindingError } from '../database/native-validation.js';
|
|
13
12
|
// =============================================================================
|
|
14
13
|
// Schema
|
|
15
14
|
// =============================================================================
|
|
@@ -58,16 +57,10 @@ export function openMachineRegistry() {
|
|
|
58
57
|
if (!fs.existsSync(dir)) {
|
|
59
58
|
fs.mkdirSync(dir, { recursive: true });
|
|
60
59
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return driver;
|
|
66
|
-
}
|
|
67
|
-
catch (error) {
|
|
68
|
-
throwIfNativeBindingError(error, 'machine agent registry');
|
|
69
|
-
throw error;
|
|
70
|
-
}
|
|
60
|
+
const driver = openDriver(dbPath, { foreignKeys: false, busyTimeout: 3000 });
|
|
61
|
+
driver.pragma('journal_mode = WAL');
|
|
62
|
+
driver.exec(REGISTRY_SCHEMA);
|
|
63
|
+
return driver;
|
|
71
64
|
}
|
|
72
65
|
// =============================================================================
|
|
73
66
|
// Write Operations
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/registry/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAuB,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/registry/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Stores Shortcut credentials and preferences in the workspace_settings table.
|
|
5
5
|
*/
|
|
6
|
-
import type
|
|
6
|
+
import type { SqliteDatabase } from '../database/sqlite.js';
|
|
7
7
|
export interface ShortcutConfig {
|
|
8
8
|
apiToken: string;
|
|
9
9
|
workspaceSlug?: string;
|
|
@@ -11,28 +11,28 @@ export interface ShortcutConfig {
|
|
|
11
11
|
/**
|
|
12
12
|
* Check if Shortcut is configured.
|
|
13
13
|
*/
|
|
14
|
-
export declare function isShortcutConfigured(db:
|
|
14
|
+
export declare function isShortcutConfigured(db: SqliteDatabase): boolean;
|
|
15
15
|
/**
|
|
16
16
|
* Load Shortcut configuration from the database + environment.
|
|
17
17
|
*/
|
|
18
|
-
export declare function loadShortcutConfig(db:
|
|
18
|
+
export declare function loadShortcutConfig(db: SqliteDatabase): ShortcutConfig | null;
|
|
19
19
|
/**
|
|
20
20
|
* Save Shortcut configuration to the database.
|
|
21
21
|
*/
|
|
22
|
-
export declare function saveShortcutConfig(db:
|
|
22
|
+
export declare function saveShortcutConfig(db: SqliteDatabase, config: ShortcutConfig): void;
|
|
23
23
|
/**
|
|
24
24
|
* Save the Shortcut API token.
|
|
25
25
|
*/
|
|
26
|
-
export declare function saveShortcutApiToken(db:
|
|
26
|
+
export declare function saveShortcutApiToken(db: SqliteDatabase, apiToken: string): void;
|
|
27
27
|
/**
|
|
28
28
|
* Save the Shortcut workspace slug.
|
|
29
29
|
*/
|
|
30
|
-
export declare function saveShortcutWorkspaceSlug(db:
|
|
30
|
+
export declare function saveShortcutWorkspaceSlug(db: SqliteDatabase, slug: string): void;
|
|
31
31
|
/**
|
|
32
32
|
* Clear all Shortcut configuration from the database.
|
|
33
33
|
*/
|
|
34
|
-
export declare function clearShortcutConfig(db:
|
|
34
|
+
export declare function clearShortcutConfig(db: SqliteDatabase): void;
|
|
35
35
|
/**
|
|
36
36
|
* Get the stored Shortcut API token.
|
|
37
37
|
*/
|
|
38
|
-
export declare function getShortcutApiToken(db:
|
|
38
|
+
export declare function getShortcutApiToken(db: SqliteDatabase): string | null;
|