@proletariat/cli 0.3.64 → 0.3.66

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.
Files changed (58) hide show
  1. package/dist/commands/agents/index.d.ts +11 -0
  2. package/dist/commands/agents/index.js +105 -0
  3. package/dist/commands/agents/index.js.map +1 -0
  4. package/dist/commands/pr/checks.d.ts +20 -0
  5. package/dist/commands/pr/checks.js +154 -0
  6. package/dist/commands/pr/checks.js.map +1 -0
  7. package/dist/commands/pr/index.js +10 -2
  8. package/dist/commands/pr/index.js.map +1 -1
  9. package/dist/commands/pr/merge.d.ts +22 -0
  10. package/dist/commands/pr/merge.js +145 -0
  11. package/dist/commands/pr/merge.js.map +1 -0
  12. package/dist/commands/version/bump.d.ts +13 -0
  13. package/dist/commands/version/bump.js +125 -0
  14. package/dist/commands/version/bump.js.map +1 -0
  15. package/dist/commands/work/start.js +147 -99
  16. package/dist/commands/work/start.js.map +1 -1
  17. package/dist/lib/database/index.d.ts +1 -1
  18. package/dist/lib/database/index.js +9 -107
  19. package/dist/lib/database/index.js.map +1 -1
  20. package/dist/lib/database/migrations/0001_baseline.d.ts +9 -0
  21. package/dist/lib/database/migrations/0001_baseline.js +18 -0
  22. package/dist/lib/database/migrations/0001_baseline.js.map +1 -0
  23. package/dist/lib/database/migrations/index.d.ts +12 -0
  24. package/dist/lib/database/migrations/index.js +15 -0
  25. package/dist/lib/database/migrations/index.js.map +1 -0
  26. package/dist/lib/database/migrator.d.ts +27 -0
  27. package/dist/lib/database/migrator.js +42 -0
  28. package/dist/lib/database/migrator.js.map +1 -0
  29. package/dist/lib/database/workspace-schema.d.ts +7 -0
  30. package/dist/lib/database/workspace-schema.js +109 -0
  31. package/dist/lib/database/workspace-schema.js.map +1 -0
  32. package/dist/lib/events/events.d.ts +5 -0
  33. package/dist/lib/events/index.d.ts +1 -1
  34. package/dist/lib/events/index.js.map +1 -1
  35. package/dist/lib/execution/runners.js +14 -6
  36. package/dist/lib/execution/runners.js.map +1 -1
  37. package/dist/lib/external-issues/outbound-sync.d.ts +21 -16
  38. package/dist/lib/external-issues/outbound-sync.js +64 -49
  39. package/dist/lib/external-issues/outbound-sync.js.map +1 -1
  40. package/dist/lib/pmo/sync-manager.js +5 -1
  41. package/dist/lib/pmo/sync-manager.js.map +1 -1
  42. package/dist/lib/pr/index.d.ts +28 -0
  43. package/dist/lib/pr/index.js +53 -1
  44. package/dist/lib/pr/index.js.map +1 -1
  45. package/dist/lib/registry/index.d.ts +52 -0
  46. package/dist/lib/registry/index.js +169 -0
  47. package/dist/lib/registry/index.js.map +1 -0
  48. package/dist/lib/work-lifecycle/adapter.d.ts +34 -0
  49. package/dist/lib/work-lifecycle/adapter.js +103 -0
  50. package/dist/lib/work-lifecycle/adapter.js.map +1 -0
  51. package/dist/lib/work-lifecycle/events.d.ts +52 -0
  52. package/dist/lib/work-lifecycle/events.js +12 -0
  53. package/dist/lib/work-lifecycle/events.js.map +1 -0
  54. package/dist/lib/work-lifecycle/index.d.ts +9 -0
  55. package/dist/lib/work-lifecycle/index.js +9 -0
  56. package/dist/lib/work-lifecycle/index.js.map +1 -0
  57. package/oclif.manifest.json +2444 -2203
  58. package/package.json +1 -1
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Machine-level Agent Registry
3
+ *
4
+ * Tracks all agents across all projects in a single SQLite database
5
+ * at ~/.prlt/agents.db. This provides a global view of agent activity
6
+ * regardless of which workspace they belong to.
7
+ */
8
+ import Database from 'better-sqlite3';
9
+ import * as fs from 'node:fs';
10
+ import * as path from 'node:path';
11
+ import * as os from 'node:os';
12
+ import { throwIfNativeBindingError } from '../database/native-validation.js';
13
+ // =============================================================================
14
+ // Schema
15
+ // =============================================================================
16
+ const REGISTRY_SCHEMA = `
17
+ CREATE TABLE IF NOT EXISTS agents (
18
+ agent_name TEXT NOT NULL,
19
+ project_path TEXT NOT NULL,
20
+ session_id TEXT,
21
+ ticket_id TEXT,
22
+ status TEXT NOT NULL DEFAULT 'running' CHECK (status IN ('running', 'idle', 'completed')),
23
+ spawned_at TEXT NOT NULL,
24
+ last_seen_at TEXT NOT NULL,
25
+ PRIMARY KEY (agent_name, project_path)
26
+ );
27
+
28
+ CREATE INDEX IF NOT EXISTS idx_registry_status ON agents(status);
29
+ CREATE INDEX IF NOT EXISTS idx_registry_project ON agents(project_path);
30
+ `;
31
+ // =============================================================================
32
+ // Helpers
33
+ // =============================================================================
34
+ function rowToMachineAgent(row) {
35
+ return {
36
+ agentName: row.agent_name,
37
+ projectPath: row.project_path,
38
+ sessionId: row.session_id,
39
+ ticketId: row.ticket_id,
40
+ status: row.status,
41
+ spawnedAt: row.spawned_at,
42
+ lastSeenAt: row.last_seen_at,
43
+ };
44
+ }
45
+ function getMachineRegistryPath() {
46
+ return path.join(os.homedir(), '.prlt', 'agents.db');
47
+ }
48
+ // =============================================================================
49
+ // Database Access
50
+ // =============================================================================
51
+ /**
52
+ * Open (or create) the machine-level agent registry at ~/.prlt/agents.db.
53
+ * Ensures the ~/.prlt directory and schema exist.
54
+ */
55
+ export function openMachineRegistry() {
56
+ const dbPath = getMachineRegistryPath();
57
+ const dir = path.dirname(dbPath);
58
+ if (!fs.existsSync(dir)) {
59
+ fs.mkdirSync(dir, { recursive: true });
60
+ }
61
+ try {
62
+ const db = new Database(dbPath);
63
+ db.pragma('journal_mode = WAL');
64
+ db.pragma('busy_timeout = 3000');
65
+ db.exec(REGISTRY_SCHEMA);
66
+ return db;
67
+ }
68
+ catch (error) {
69
+ throwIfNativeBindingError(error, 'machine agent registry');
70
+ throw error;
71
+ }
72
+ }
73
+ // =============================================================================
74
+ // Write Operations
75
+ // =============================================================================
76
+ /**
77
+ * Register an agent spawn in the machine registry.
78
+ * Uses INSERT OR REPLACE so re-spawning the same agent updates the record.
79
+ */
80
+ export function registerAgent(params) {
81
+ const db = openMachineRegistry();
82
+ try {
83
+ const now = new Date().toISOString();
84
+ db.prepare(`
85
+ INSERT OR REPLACE INTO agents (agent_name, project_path, session_id, ticket_id, status, spawned_at, last_seen_at)
86
+ VALUES (?, ?, ?, ?, 'running', ?, ?)
87
+ `).run(params.agentName, params.projectPath, params.sessionId ?? null, params.ticketId ?? null, now, now);
88
+ }
89
+ finally {
90
+ db.close();
91
+ }
92
+ }
93
+ /**
94
+ * Update the status of an agent in the machine registry.
95
+ */
96
+ export function updateAgentStatus(agentName, projectPath, status) {
97
+ const db = openMachineRegistry();
98
+ try {
99
+ const now = new Date().toISOString();
100
+ db.prepare(`
101
+ UPDATE agents SET status = ?, last_seen_at = ?
102
+ WHERE agent_name = ? AND project_path = ?
103
+ `).run(status, now, agentName, projectPath);
104
+ }
105
+ finally {
106
+ db.close();
107
+ }
108
+ }
109
+ /**
110
+ * Touch the last_seen_at timestamp for a running agent.
111
+ */
112
+ export function touchAgentLastSeen(agentName, projectPath) {
113
+ const db = openMachineRegistry();
114
+ try {
115
+ const now = new Date().toISOString();
116
+ db.prepare(`
117
+ UPDATE agents SET last_seen_at = ?
118
+ WHERE agent_name = ? AND project_path = ?
119
+ `).run(now, agentName, projectPath);
120
+ }
121
+ finally {
122
+ db.close();
123
+ }
124
+ }
125
+ // =============================================================================
126
+ // Read Operations
127
+ // =============================================================================
128
+ /**
129
+ * Get all agents in the machine registry, optionally filtered.
130
+ */
131
+ export function getMachineAgents(filters) {
132
+ const db = openMachineRegistry();
133
+ try {
134
+ let sql = 'SELECT * FROM agents';
135
+ const conditions = [];
136
+ const params = [];
137
+ if (filters?.status) {
138
+ conditions.push('status = ?');
139
+ params.push(filters.status);
140
+ }
141
+ if (filters?.projectPath) {
142
+ conditions.push('project_path = ?');
143
+ params.push(filters.projectPath);
144
+ }
145
+ if (conditions.length > 0) {
146
+ sql += ' WHERE ' + conditions.join(' AND ');
147
+ }
148
+ sql += ' ORDER BY last_seen_at DESC';
149
+ const rows = db.prepare(sql).all(...params);
150
+ return rows.map(rowToMachineAgent);
151
+ }
152
+ finally {
153
+ db.close();
154
+ }
155
+ }
156
+ /**
157
+ * Get a single agent by name and project path.
158
+ */
159
+ export function getMachineAgent(agentName, projectPath) {
160
+ const db = openMachineRegistry();
161
+ try {
162
+ const row = db.prepare('SELECT * FROM agents WHERE agent_name = ? AND project_path = ?').get(agentName, projectPath);
163
+ return row ? rowToMachineAgent(row) : undefined;
164
+ }
165
+ finally {
166
+ db.close();
167
+ }
168
+ }
169
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/registry/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Work Lifecycle Adapter
3
+ *
4
+ * Bridges provider-specific events to work-lifecycle domain events.
5
+ * PMO ticket events are translated into provider-agnostic work events,
6
+ * making PMO just another event source rather than the central hub.
7
+ *
8
+ * Additional adapters can be registered to translate events from
9
+ * other providers (GitHub, Linear inbound webhooks, etc.).
10
+ */
11
+ /**
12
+ * WorkLifecycleAdapter subscribes to provider-specific events and
13
+ * re-emits them as work-lifecycle domain events on the same EventBus.
14
+ */
15
+ export declare class WorkLifecycleAdapter {
16
+ private unsubscribers;
17
+ /**
18
+ * Start the PMO adapter — translates ticket:* events to work:* events.
19
+ */
20
+ startPMOAdapter(): void;
21
+ /**
22
+ * Stop all adapters and unsubscribe from events.
23
+ */
24
+ stop(): void;
25
+ }
26
+ /**
27
+ * Initialize the work-lifecycle adapter layer.
28
+ * Safe to call multiple times — subsequent calls are no-ops.
29
+ */
30
+ export declare function initWorkLifecycleAdapter(): WorkLifecycleAdapter;
31
+ /**
32
+ * Stop the work-lifecycle adapter (primarily for testing).
33
+ */
34
+ export declare function stopWorkLifecycleAdapter(): void;
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Work Lifecycle Adapter
3
+ *
4
+ * Bridges provider-specific events to work-lifecycle domain events.
5
+ * PMO ticket events are translated into provider-agnostic work events,
6
+ * making PMO just another event source rather than the central hub.
7
+ *
8
+ * Additional adapters can be registered to translate events from
9
+ * other providers (GitHub, Linear inbound webhooks, etc.).
10
+ */
11
+ import { getEventBus } from '../events/event-bus.js';
12
+ /**
13
+ * WorkLifecycleAdapter subscribes to provider-specific events and
14
+ * re-emits them as work-lifecycle domain events on the same EventBus.
15
+ */
16
+ export class WorkLifecycleAdapter {
17
+ unsubscribers = [];
18
+ /**
19
+ * Start the PMO adapter — translates ticket:* events to work:* events.
20
+ */
21
+ startPMOAdapter() {
22
+ const bus = getEventBus();
23
+ this.unsubscribers.push(bus.on('ticket:status_changed', (event) => {
24
+ // Always emit the generic status change
25
+ bus.emit('work:status_changed', {
26
+ workItemId: event.ticketId,
27
+ source: 'pmo',
28
+ projectId: event.projectId,
29
+ previousStatus: event.previousStatusName ?? null,
30
+ previousCategory: event.previousStatusCategory ?? null,
31
+ newStatus: event.newStatusName ?? null,
32
+ newCategory: event.newStatusCategory ?? null,
33
+ timestamp: event.timestamp,
34
+ });
35
+ // Emit work:started when entering the 'started' category
36
+ if (event.newStatusCategory === 'started' &&
37
+ event.previousStatusCategory !== 'started') {
38
+ bus.emit('work:started', {
39
+ workItemId: event.ticketId,
40
+ source: 'pmo',
41
+ projectId: event.projectId,
42
+ status: event.newStatusName ?? null,
43
+ timestamp: event.timestamp,
44
+ });
45
+ }
46
+ // Emit work:completed when entering the 'completed' category
47
+ if (event.newStatusCategory === 'completed' &&
48
+ event.previousStatusCategory !== 'completed') {
49
+ bus.emit('work:completed', {
50
+ workItemId: event.ticketId,
51
+ source: 'pmo',
52
+ projectId: event.projectId,
53
+ status: event.newStatusName ?? null,
54
+ timestamp: event.timestamp,
55
+ });
56
+ }
57
+ }));
58
+ this.unsubscribers.push(bus.on('ticket:pr_linked', (event) => {
59
+ bus.emit('work:pr_created', {
60
+ workItemId: event.ticketId,
61
+ source: 'pmo',
62
+ projectId: event.projectId,
63
+ prUrl: event.prUrl,
64
+ prTitle: event.prTitle ?? null,
65
+ timestamp: event.timestamp,
66
+ });
67
+ }));
68
+ }
69
+ /**
70
+ * Stop all adapters and unsubscribe from events.
71
+ */
72
+ stop() {
73
+ for (const unsub of this.unsubscribers) {
74
+ unsub();
75
+ }
76
+ this.unsubscribers = [];
77
+ }
78
+ }
79
+ // =============================================================================
80
+ // Singleton
81
+ // =============================================================================
82
+ let _adapter;
83
+ /**
84
+ * Initialize the work-lifecycle adapter layer.
85
+ * Safe to call multiple times — subsequent calls are no-ops.
86
+ */
87
+ export function initWorkLifecycleAdapter() {
88
+ if (!_adapter) {
89
+ _adapter = new WorkLifecycleAdapter();
90
+ _adapter.startPMOAdapter();
91
+ }
92
+ return _adapter;
93
+ }
94
+ /**
95
+ * Stop the work-lifecycle adapter (primarily for testing).
96
+ */
97
+ export function stopWorkLifecycleAdapter() {
98
+ if (_adapter) {
99
+ _adapter.stop();
100
+ _adapter = undefined;
101
+ }
102
+ }
103
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/lib/work-lifecycle/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Work Lifecycle Event Definitions
3
+ *
4
+ * Provider-agnostic domain events for work item state changes.
5
+ * These events represent what happened in the work lifecycle,
6
+ * regardless of which system (PMO, Linear, GitHub, etc.) reported the change.
7
+ *
8
+ * The adapter layer translates provider-specific events into these
9
+ * domain events, decoupling consumers from any single provider.
10
+ */
11
+ import type { StateCategory } from '../pmo/types.js';
12
+ /**
13
+ * Sources that can emit work-lifecycle events.
14
+ * PMO is just another provider, not the central hub.
15
+ */
16
+ export type WorkEventSource = 'pmo' | 'linear' | 'github' | 'jira' | 'asana' | 'shortcut' | 'trello' | 'monday';
17
+ /** Emitted when work begins on a work item (status moved to 'started' category). */
18
+ export interface WorkStartedEvent {
19
+ workItemId: string;
20
+ source: WorkEventSource;
21
+ projectId?: string;
22
+ status: string | null;
23
+ timestamp: Date;
24
+ }
25
+ /** Emitted when a work item's status changes. */
26
+ export interface WorkStatusChangedEvent {
27
+ workItemId: string;
28
+ source: WorkEventSource;
29
+ projectId?: string;
30
+ previousStatus: string | null;
31
+ previousCategory: StateCategory | null;
32
+ newStatus: string | null;
33
+ newCategory: StateCategory | null;
34
+ timestamp: Date;
35
+ }
36
+ /** Emitted when a PR is created or linked for a work item. */
37
+ export interface WorkPRCreatedEvent {
38
+ workItemId: string;
39
+ source: WorkEventSource;
40
+ projectId?: string;
41
+ prUrl: string;
42
+ prTitle: string | null;
43
+ timestamp: Date;
44
+ }
45
+ /** Emitted when work on an item is completed (status moved to 'completed' category). */
46
+ export interface WorkCompletedEvent {
47
+ workItemId: string;
48
+ source: WorkEventSource;
49
+ projectId?: string;
50
+ status: string | null;
51
+ timestamp: Date;
52
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Work Lifecycle Event Definitions
3
+ *
4
+ * Provider-agnostic domain events for work item state changes.
5
+ * These events represent what happened in the work lifecycle,
6
+ * regardless of which system (PMO, Linear, GitHub, etc.) reported the change.
7
+ *
8
+ * The adapter layer translates provider-specific events into these
9
+ * domain events, decoupling consumers from any single provider.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/lib/work-lifecycle/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Work Lifecycle module — public API.
3
+ *
4
+ * Provides provider-agnostic domain events for work item state changes.
5
+ * The adapter layer translates provider-specific events (PMO tickets,
6
+ * GitHub PRs, Linear issues, etc.) into these domain events.
7
+ */
8
+ export type { WorkEventSource, WorkStartedEvent, WorkStatusChangedEvent, WorkPRCreatedEvent, WorkCompletedEvent, } from './events.js';
9
+ export { WorkLifecycleAdapter, initWorkLifecycleAdapter, stopWorkLifecycleAdapter, } from './adapter.js';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Work Lifecycle module — public API.
3
+ *
4
+ * Provides provider-agnostic domain events for work item state changes.
5
+ * The adapter layer translates provider-specific events (PMO tickets,
6
+ * GitHub PRs, Linear issues, etc.) into these domain events.
7
+ */
8
+ export { WorkLifecycleAdapter, initWorkLifecycleAdapter, stopWorkLifecycleAdapter, } from './adapter.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/work-lifecycle/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,cAAc,CAAA"}