@proletariat/cli 0.3.70 → 0.3.72

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 (91) hide show
  1. package/dist/commands/action/create.d.ts +6 -2
  2. package/dist/commands/action/create.js +107 -40
  3. package/dist/commands/action/create.js.map +1 -1
  4. package/dist/commands/action/list.d.ts +1 -1
  5. package/dist/commands/action/list.js +12 -10
  6. package/dist/commands/action/list.js.map +1 -1
  7. package/dist/commands/action/run.js +2 -2
  8. package/dist/commands/action/run.js.map +1 -1
  9. package/dist/commands/action/show.js +24 -4
  10. package/dist/commands/action/show.js.map +1 -1
  11. package/dist/commands/action/update.d.ts +6 -2
  12. package/dist/commands/action/update.js +130 -52
  13. package/dist/commands/action/update.js.map +1 -1
  14. package/dist/commands/work/ready.js +4 -2
  15. package/dist/commands/work/ready.js.map +1 -1
  16. package/dist/commands/work/spawn.js +2 -2
  17. package/dist/commands/work/spawn.js.map +1 -1
  18. package/dist/commands/work/start.js +67 -23
  19. package/dist/commands/work/start.js.map +1 -1
  20. package/dist/commands/workflow/setup.d.ts +24 -0
  21. package/dist/commands/workflow/setup.js +346 -0
  22. package/dist/commands/workflow/setup.js.map +1 -0
  23. package/dist/commands/workflow-rule/create.d.ts +19 -0
  24. package/dist/commands/workflow-rule/create.js +140 -0
  25. package/dist/commands/workflow-rule/create.js.map +1 -0
  26. package/dist/commands/workflow-rule/delete.d.ts +18 -0
  27. package/dist/commands/workflow-rule/delete.js +72 -0
  28. package/dist/commands/workflow-rule/delete.js.map +1 -0
  29. package/dist/commands/workflow-rule/index.d.ts +16 -0
  30. package/dist/commands/workflow-rule/index.js +83 -0
  31. package/dist/commands/workflow-rule/index.js.map +1 -0
  32. package/dist/commands/workflow-rule/list.d.ts +17 -0
  33. package/dist/commands/workflow-rule/list.js +72 -0
  34. package/dist/commands/workflow-rule/list.js.map +1 -0
  35. package/dist/commands/workflow-rule/update.d.ts +22 -0
  36. package/dist/commands/workflow-rule/update.js +84 -0
  37. package/dist/commands/workflow-rule/update.js.map +1 -0
  38. package/dist/hooks/init.js +2 -4
  39. package/dist/hooks/init.js.map +1 -1
  40. package/dist/lib/database/drizzle-schema.d.ts +269 -4
  41. package/dist/lib/database/drizzle-schema.js +22 -2
  42. package/dist/lib/database/drizzle-schema.js.map +1 -1
  43. package/dist/lib/database/migrations/0003_actions_redesign.d.ts +15 -0
  44. package/dist/lib/database/migrations/0003_actions_redesign.js +105 -0
  45. package/dist/lib/database/migrations/0003_actions_redesign.js.map +1 -0
  46. package/dist/lib/database/migrations/0004_workflow_rules.d.ts +2 -0
  47. package/dist/lib/database/migrations/0004_workflow_rules.js +25 -0
  48. package/dist/lib/database/migrations/0004_workflow_rules.js.map +1 -0
  49. package/dist/lib/database/migrations/index.js +4 -0
  50. package/dist/lib/database/migrations/index.js.map +1 -1
  51. package/dist/lib/events/events.d.ts +13 -1
  52. package/dist/lib/execution/storage.d.ts +7 -1
  53. package/dist/lib/execution/storage.js +14 -6
  54. package/dist/lib/execution/storage.js.map +1 -1
  55. package/dist/lib/pmo/schema.d.ts +3 -1
  56. package/dist/lib/pmo/schema.js +25 -3
  57. package/dist/lib/pmo/schema.js.map +1 -1
  58. package/dist/lib/pmo/storage/actions.d.ts +5 -3
  59. package/dist/lib/pmo/storage/actions.js +89 -23
  60. package/dist/lib/pmo/storage/actions.js.map +1 -1
  61. package/dist/lib/pmo/storage/base.d.ts +5 -0
  62. package/dist/lib/pmo/storage/base.js +203 -20
  63. package/dist/lib/pmo/storage/base.js.map +1 -1
  64. package/dist/lib/pmo/storage/index.d.ts +9 -2
  65. package/dist/lib/pmo/storage/index.js +28 -3
  66. package/dist/lib/pmo/storage/index.js.map +1 -1
  67. package/dist/lib/pmo/storage/types.d.ts +19 -2
  68. package/dist/lib/pmo/storage/workflow-rules.d.ts +35 -0
  69. package/dist/lib/pmo/storage/workflow-rules.js +183 -0
  70. package/dist/lib/pmo/storage/workflow-rules.js.map +1 -0
  71. package/dist/lib/pmo/sync-manager.js +6 -0
  72. package/dist/lib/pmo/sync-manager.js.map +1 -1
  73. package/dist/lib/pmo/types.d.ts +59 -4
  74. package/dist/lib/pmo/types.js.map +1 -1
  75. package/dist/lib/telemetry/analytics.d.ts +25 -6
  76. package/dist/lib/telemetry/analytics.js +124 -29
  77. package/dist/lib/telemetry/analytics.js.map +1 -1
  78. package/dist/lib/work-lifecycle/action-chaining.d.ts +61 -0
  79. package/dist/lib/work-lifecycle/action-chaining.js +211 -0
  80. package/dist/lib/work-lifecycle/action-chaining.js.map +1 -0
  81. package/dist/lib/work-lifecycle/index.d.ts +3 -0
  82. package/dist/lib/work-lifecycle/index.js +3 -0
  83. package/dist/lib/work-lifecycle/index.js.map +1 -1
  84. package/dist/lib/work-lifecycle/post-execution.d.ts +54 -0
  85. package/dist/lib/work-lifecycle/post-execution.js +68 -0
  86. package/dist/lib/work-lifecycle/post-execution.js.map +1 -0
  87. package/dist/lib/work-lifecycle/rule-evaluator.d.ts +38 -0
  88. package/dist/lib/work-lifecycle/rule-evaluator.js +102 -0
  89. package/dist/lib/work-lifecycle/rule-evaluator.js.map +1 -0
  90. package/oclif.manifest.json +1885 -1394
  91. package/package.json +1 -1
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Post-Execution Transition Hook
3
+ *
4
+ * Handles automatic ticket state transitions after an action execution completes.
5
+ * Primary use case: when the implement action completes and a PR was created,
6
+ * automatically move the ticket from In Progress to Review.
7
+ *
8
+ * This hook replaces the need for a separate "create-pr" action. The implement
9
+ * action's endPrompt handles PR creation via `prlt work ready --pr`, and this
10
+ * hook ensures the state transition happens systematically.
11
+ */
12
+ import { getWorkColumnSetting, findColumnByName } from '../pmo/utils.js';
13
+ /**
14
+ * Check if a completed execution should trigger an automatic state transition.
15
+ *
16
+ * When an execution completes and the ticket:
17
+ * 1. Is in a "started" category (e.g., In Progress)
18
+ * 2. Has a PR URL in its metadata
19
+ *
20
+ * Then automatically move the ticket to the Review column.
21
+ * If no PR was created, the ticket stays in its current state.
22
+ *
23
+ * @param context - Execution context with ticket and optional action info
24
+ * @param storage - PMO storage instance for ticket operations
25
+ * @param db - Database for work column settings
26
+ * @returns Result indicating whether a transition occurred
27
+ */
28
+ export async function handlePostExecutionTransition(context, storage, db) {
29
+ // Get the ticket to check current state and PR status
30
+ const ticket = await storage.getTicket(context.ticketId);
31
+ if (!ticket || !ticket.projectId) {
32
+ return { transitioned: false };
33
+ }
34
+ // Only auto-transition tickets that are in the "started" category (In Progress)
35
+ if (ticket.statusCategory !== 'started') {
36
+ return { transitioned: false };
37
+ }
38
+ // Check if a PR was created (PR URL exists in ticket metadata)
39
+ const prUrl = ticket.metadata?.pr_url;
40
+ if (!prUrl) {
41
+ return { transitioned: false };
42
+ }
43
+ // Get the Review column name
44
+ const targetColumnName = getWorkColumnSetting(db, 'review');
45
+ // Get board columns to find the review column
46
+ const board = await storage.getProjectBoard(ticket.projectId);
47
+ if (!board) {
48
+ return { transitioned: false };
49
+ }
50
+ const columnNames = board.columns.map(col => col.name);
51
+ const reviewColumn = findColumnByName(columnNames, targetColumnName);
52
+ if (!reviewColumn) {
53
+ return { transitioned: false };
54
+ }
55
+ // Already in Review — skip
56
+ if (ticket.statusName === reviewColumn) {
57
+ return { transitioned: false };
58
+ }
59
+ // Move ticket to Review
60
+ const previousState = ticket.statusName;
61
+ await storage.moveTicket(ticket.projectId, context.ticketId, reviewColumn);
62
+ return {
63
+ transitioned: true,
64
+ fromState: previousState,
65
+ toState: reviewColumn,
66
+ };
67
+ }
68
+ //# sourceMappingURL=post-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-execution.js","sourceRoot":"","sources":["../../../src/lib/work-lifecycle/post-execution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AA6BxE;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,OAA6B,EAC7B,OAA6B,EAC7B,EAAqB;IAErB,sDAAsD;IACtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACxD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED,gFAAgF;IAChF,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED,+DAA+D;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAA;IACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED,6BAA6B;IAC7B,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;IAE3D,8CAA8C;IAC9C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACtD,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;IACpE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,UAAU,KAAK,YAAY,EAAE,CAAC;QACvC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED,wBAAwB;IACxB,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAA;IACvC,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IAE1E,OAAO;QACL,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,aAAa;QACxB,OAAO,EAAE,YAAY;KACtB,CAAA;AACH,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Workflow Rule Evaluator
3
+ *
4
+ * Subscribes to ticket:status_changed events on the global EventBus and
5
+ * evaluates workflow rules when a ticket enters a new state.
6
+ *
7
+ * For on_enter rules, emits a work:rule_matched event so that
8
+ * downstream systems (orchestrators, hooks) can fire the associated action.
9
+ * For manual rules, the match is logged but no action is auto-fired.
10
+ */
11
+ import type Database from 'better-sqlite3';
12
+ export declare class WorkflowRuleEvaluator {
13
+ private unsubscribers;
14
+ private db;
15
+ constructor(db: Database.Database);
16
+ /**
17
+ * Start listening for ticket state changes.
18
+ */
19
+ start(): void;
20
+ /**
21
+ * Stop listening for events.
22
+ */
23
+ stop(): void;
24
+ /**
25
+ * Evaluate workflow rules for a status change event.
26
+ * Finds all enabled rules matching the new state and emits events for on_enter rules.
27
+ */
28
+ private evaluate;
29
+ }
30
+ /**
31
+ * Initialize and start the workflow rule evaluator.
32
+ * Safe to call multiple times — subsequent calls are no-ops.
33
+ */
34
+ export declare function initWorkflowRuleEvaluator(db: Database.Database): WorkflowRuleEvaluator;
35
+ /**
36
+ * Stop the workflow rule evaluator (primarily for testing).
37
+ */
38
+ export declare function stopWorkflowRuleEvaluator(): void;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Workflow Rule Evaluator
3
+ *
4
+ * Subscribes to ticket:status_changed events on the global EventBus and
5
+ * evaluates workflow rules when a ticket enters a new state.
6
+ *
7
+ * For on_enter rules, emits a work:rule_matched event so that
8
+ * downstream systems (orchestrators, hooks) can fire the associated action.
9
+ * For manual rules, the match is logged but no action is auto-fired.
10
+ */
11
+ import { getEventBus } from '../events/event-bus.js';
12
+ import { PMO_TABLES } from '../pmo/schema.js';
13
+ export class WorkflowRuleEvaluator {
14
+ unsubscribers = [];
15
+ db;
16
+ constructor(db) {
17
+ this.db = db;
18
+ }
19
+ /**
20
+ * Start listening for ticket state changes.
21
+ */
22
+ start() {
23
+ const bus = getEventBus();
24
+ this.unsubscribers.push(bus.on('ticket:status_changed', (event) => {
25
+ this.evaluate(event);
26
+ }));
27
+ }
28
+ /**
29
+ * Stop listening for events.
30
+ */
31
+ stop() {
32
+ for (const unsub of this.unsubscribers) {
33
+ unsub();
34
+ }
35
+ this.unsubscribers = [];
36
+ }
37
+ /**
38
+ * Evaluate workflow rules for a status change event.
39
+ * Finds all enabled rules matching the new state and emits events for on_enter rules.
40
+ */
41
+ evaluate(event) {
42
+ if (!event.newStatusName)
43
+ return;
44
+ try {
45
+ // Find all enabled rules where to_state matches the new status
46
+ const rows = this.db.prepare(`
47
+ SELECT * FROM ${PMO_TABLES.workflow_rules}
48
+ WHERE to_state = ? AND enabled = 1
49
+ `).all(event.newStatusName);
50
+ if (rows.length === 0)
51
+ return;
52
+ const bus = getEventBus();
53
+ for (const row of rows) {
54
+ // If from_state is set, it must match the previous status
55
+ if (row.from_state && row.from_state !== event.previousStatusName) {
56
+ continue;
57
+ }
58
+ // Emit rule_matched event for on_enter triggers
59
+ if (row.trigger === 'on_enter') {
60
+ bus.emit('workflow_rule:matched', {
61
+ ruleId: row.id,
62
+ ticketId: event.ticketId,
63
+ projectId: event.projectId,
64
+ actionId: row.action_id,
65
+ trigger: row.trigger,
66
+ fromState: row.from_state,
67
+ toState: row.to_state,
68
+ timestamp: new Date(),
69
+ });
70
+ }
71
+ }
72
+ }
73
+ catch {
74
+ // Rule evaluation errors are non-fatal
75
+ }
76
+ }
77
+ }
78
+ // =============================================================================
79
+ // Singleton
80
+ // =============================================================================
81
+ let _evaluator;
82
+ /**
83
+ * Initialize and start the workflow rule evaluator.
84
+ * Safe to call multiple times — subsequent calls are no-ops.
85
+ */
86
+ export function initWorkflowRuleEvaluator(db) {
87
+ if (!_evaluator) {
88
+ _evaluator = new WorkflowRuleEvaluator(db);
89
+ _evaluator.start();
90
+ }
91
+ return _evaluator;
92
+ }
93
+ /**
94
+ * Stop the workflow rule evaluator (primarily for testing).
95
+ */
96
+ export function stopWorkflowRuleEvaluator() {
97
+ if (_evaluator) {
98
+ _evaluator.stop();
99
+ _evaluator = undefined;
100
+ }
101
+ }
102
+ //# sourceMappingURL=rule-evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-evaluator.js","sourceRoot":"","sources":["../../../src/lib/work-lifecycle/rule-evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAY7C,MAAM,OAAO,qBAAqB;IACxB,aAAa,GAAsB,EAAE,CAAA;IACrC,EAAE,CAAmB;IAE7B,YAAY,EAAqB;QAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,GAAG,GAAG,WAAW,EAAE,CAAA;QAEzB,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,GAAG,CAAC,EAAE,CAAC,uBAAuB,EAAE,CAAC,KAA+B,EAAE,EAAE;YAClE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC,CAAC,CACH,CAAA;IACH,CAAC;IAED;;OAEG;IACH,IAAI;QACF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,KAAK,EAAE,CAAA;QACT,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;IACzB,CAAC;IAED;;;OAGG;IACK,QAAQ,CAAC,KAA+B;QAC9C,IAAI,CAAC,KAAK,CAAC,aAAa;YAAE,OAAM;QAEhC,IAAI,CAAC;YACH,+DAA+D;YAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;wBACX,UAAU,CAAC,cAAc;;OAE1C,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAsB,CAAA;YAEhD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAM;YAE7B,MAAM,GAAG,GAAG,WAAW,EAAE,CAAA;YAEzB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,0DAA0D;gBAC1D,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC,kBAAkB,EAAE,CAAC;oBAClE,SAAQ;gBACV,CAAC;gBAED,gDAAgD;gBAChD,IAAI,GAAG,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;oBAC/B,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE;wBAChC,MAAM,EAAE,GAAG,CAAC,EAAE;wBACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,QAAQ,EAAE,GAAG,CAAC,SAAS;wBACvB,OAAO,EAAE,GAAG,CAAC,OAA8B;wBAC3C,SAAS,EAAE,GAAG,CAAC,UAAU;wBACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;wBACrB,SAAS,EAAE,IAAI,IAAI,EAAE;qBACtB,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;CACF;AAED,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,IAAI,UAA6C,CAAA;AAEjD;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,EAAqB;IAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,IAAI,qBAAqB,CAAC,EAAE,CAAC,CAAA;QAC1C,UAAU,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,IAAI,EAAE,CAAA;QACjB,UAAU,GAAG,SAAS,CAAA;IACxB,CAAC;AACH,CAAC"}