@proletariat/cli 0.3.66 → 0.3.67

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 (57) hide show
  1. package/dist/commands/pr/merge.js +29 -2
  2. package/dist/commands/pr/merge.js.map +1 -1
  3. package/dist/commands/work/hooks/add.d.ts +16 -0
  4. package/dist/commands/work/hooks/add.js +169 -0
  5. package/dist/commands/work/hooks/add.js.map +1 -0
  6. package/dist/commands/work/hooks/index.d.ts +11 -0
  7. package/dist/commands/work/hooks/index.js +44 -0
  8. package/dist/commands/work/hooks/index.js.map +1 -0
  9. package/dist/commands/work/hooks/list.d.ts +12 -0
  10. package/dist/commands/work/hooks/list.js +81 -0
  11. package/dist/commands/work/hooks/list.js.map +1 -0
  12. package/dist/commands/work/hooks/remove.d.ts +14 -0
  13. package/dist/commands/work/hooks/remove.js +94 -0
  14. package/dist/commands/work/hooks/remove.js.map +1 -0
  15. package/dist/commands/work/hooks/toggle.d.ts +16 -0
  16. package/dist/commands/work/hooks/toggle.js +79 -0
  17. package/dist/commands/work/hooks/toggle.js.map +1 -0
  18. package/dist/commands/work/index.js +4 -0
  19. package/dist/commands/work/index.js.map +1 -1
  20. package/dist/lib/database/migrations/0002_work_hooks.d.ts +8 -0
  21. package/dist/lib/database/migrations/0002_work_hooks.js +16 -0
  22. package/dist/lib/database/migrations/0002_work_hooks.js.map +1 -0
  23. package/dist/lib/database/migrations/index.js +2 -0
  24. package/dist/lib/database/migrations/index.js.map +1 -1
  25. package/dist/lib/events/events.d.ts +2 -1
  26. package/dist/lib/external-issues/outbound-sync.d.ts +14 -0
  27. package/dist/lib/external-issues/outbound-sync.js +94 -0
  28. package/dist/lib/external-issues/outbound-sync.js.map +1 -1
  29. package/dist/lib/linear/sync.d.ts +5 -0
  30. package/dist/lib/linear/sync.js +25 -0
  31. package/dist/lib/linear/sync.js.map +1 -1
  32. package/dist/lib/pmo/schema.d.ts +2 -0
  33. package/dist/lib/pmo/schema.js +17 -0
  34. package/dist/lib/pmo/schema.js.map +1 -1
  35. package/dist/lib/pmo/sync-manager.js +3 -0
  36. package/dist/lib/pmo/sync-manager.js.map +1 -1
  37. package/dist/lib/work-lifecycle/events.d.ts +11 -0
  38. package/dist/lib/work-lifecycle/hooks/executor.d.ts +15 -0
  39. package/dist/lib/work-lifecycle/hooks/executor.js +102 -0
  40. package/dist/lib/work-lifecycle/hooks/executor.js.map +1 -0
  41. package/dist/lib/work-lifecycle/hooks/index.d.ts +12 -0
  42. package/dist/lib/work-lifecycle/hooks/index.js +12 -0
  43. package/dist/lib/work-lifecycle/hooks/index.js.map +1 -0
  44. package/dist/lib/work-lifecycle/hooks/manager.d.ts +43 -0
  45. package/dist/lib/work-lifecycle/hooks/manager.js +93 -0
  46. package/dist/lib/work-lifecycle/hooks/manager.js.map +1 -0
  47. package/dist/lib/work-lifecycle/hooks/storage.d.ts +58 -0
  48. package/dist/lib/work-lifecycle/hooks/storage.js +117 -0
  49. package/dist/lib/work-lifecycle/hooks/storage.js.map +1 -0
  50. package/dist/lib/work-lifecycle/hooks/types.d.ts +68 -0
  51. package/dist/lib/work-lifecycle/hooks/types.js +17 -0
  52. package/dist/lib/work-lifecycle/hooks/types.js.map +1 -0
  53. package/dist/lib/work-lifecycle/index.d.ts +1 -0
  54. package/dist/lib/work-lifecycle/index.js +1 -0
  55. package/dist/lib/work-lifecycle/index.js.map +1 -1
  56. package/oclif.manifest.json +4400 -4072
  57. package/package.json +1 -1
@@ -1,9 +1,10 @@
1
1
  import { Args, Flags } from '@oclif/core';
2
2
  import { PMOCommand, pmoBaseFlags, } from '../../lib/pmo/index.js';
3
3
  import { styles } from '../../lib/styles.js';
4
- import { isGHInstalled, isGHAuthenticated, getPRByNumber, listOpenPRs, mergePR, } from '../../lib/pr/index.js';
4
+ import { isGHInstalled, isGHAuthenticated, getPRByNumber, listOpenPRs, mergePR, getGitHubRepo, } from '../../lib/pr/index.js';
5
5
  import { shouldOutputJson, outputErrorAsJson, outputSuccessAsJson, createMetadata, } from '../../lib/prompt-json.js';
6
6
  import { FlagResolver } from '../../lib/flags/index.js';
7
+ import { getEventBus } from '../../lib/events/event-bus.js';
7
8
  export default class PRMerge extends PMOCommand {
8
9
  static description = 'Merge a GitHub pull request by number';
9
10
  static examples = [
@@ -105,12 +106,14 @@ export default class PRMerge extends PMOCommand {
105
106
  if (!result.success) {
106
107
  return handleError('MERGE_FAILED', `Failed to merge PR #${prNumber}: ${result.error}`);
107
108
  }
108
- // Update ticket metadata if PR was linked
109
+ // Update ticket metadata if PR was linked and emit merge event for outbound sync
110
+ let linkedTicketId;
109
111
  if (this.hasPMO) {
110
112
  try {
111
113
  const allTickets = await this.storage.listTickets(flags.project);
112
114
  const linkedTicket = allTickets.find(t => t.metadata?.pr_number === String(prNumber));
113
115
  if (linkedTicket) {
116
+ linkedTicketId = linkedTicket.id;
114
117
  await this.storage.updateTicket(linkedTicket.id, {
115
118
  metadata: {
116
119
  ...linkedTicket.metadata,
@@ -123,6 +126,25 @@ export default class PRMerge extends PMOCommand {
123
126
  // Non-critical - don't fail the merge if PMO update fails
124
127
  }
125
128
  }
129
+ // Emit work:pr_merged event for outbound sync (e.g., Linear auto-transition)
130
+ if (linkedTicketId) {
131
+ try {
132
+ const repo = getGitHubRepo();
133
+ const prUrl = repo ? `https://github.com/${repo}/pull/${prNumber}` : null;
134
+ getEventBus().emit('work:pr_merged', {
135
+ workItemId: linkedTicketId,
136
+ source: 'github',
137
+ prNumber,
138
+ prTitle: prInfo.title,
139
+ prUrl,
140
+ mergeMethod: method,
141
+ timestamp: new Date(),
142
+ });
143
+ }
144
+ catch {
145
+ // Non-critical - don't fail the merge if event emission fails
146
+ }
147
+ }
126
148
  if (jsonMode) {
127
149
  outputSuccessAsJson({
128
150
  merged: true,
@@ -130,6 +152,8 @@ export default class PRMerge extends PMOCommand {
130
152
  title: prInfo.title,
131
153
  method,
132
154
  branchDeleted: flags['delete-branch'],
155
+ linkedTicket: linkedTicketId ?? null,
156
+ linearSyncEmitted: !!linkedTicketId,
133
157
  }, createMetadata('pr merge', flags));
134
158
  return;
135
159
  }
@@ -140,6 +164,9 @@ export default class PRMerge extends PMOCommand {
140
164
  if (flags['delete-branch']) {
141
165
  this.log(styles.muted(` Branch ${prInfo.headBranch} deleted`));
142
166
  }
167
+ if (linkedTicketId) {
168
+ this.log(styles.muted(` Linear sync triggered for ${linkedTicketId}`));
169
+ }
143
170
  }
144
171
  }
145
172
  //# sourceMappingURL=merge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/commands/pr/merge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/commands/pr/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class WorkHooksAdd extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ event: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ 'action-type': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ 'action-value': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ };
15
+ execute(): Promise<void>;
16
+ }
@@ -0,0 +1,169 @@
1
+ import { Flags } from '@oclif/core';
2
+ import * as path from 'node:path';
3
+ import Database from 'better-sqlite3';
4
+ import inquirer from 'inquirer';
5
+ import { PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
6
+ import { styles } from '../../../lib/styles.js';
7
+ import { getWorkspaceInfo } from '../../../lib/agents/commands.js';
8
+ import { shouldOutputJson, outputSuccessAsJson, outputErrorAsJson, outputPromptAsJson, buildPromptConfig, createMetadata, } from '../../../lib/prompt-json.js';
9
+ import { withSignalSafePrompt } from '../../../lib/signal-handler.js';
10
+ import { WorkHookStorage, HOOKABLE_EVENTS } from '../../../lib/work-lifecycle/hooks/index.js';
11
+ export default class WorkHooksAdd extends PMOCommand {
12
+ static description = 'Add a work lifecycle hook';
13
+ static examples = [
14
+ '<%= config.bin %> <%= command.id %> --name notify-start --event work:started --action-type log --action-value "Work started on {{workItemId}}"',
15
+ '<%= config.bin %> <%= command.id %> --name deploy-hook --event work:completed --action-type shell --action-value "./scripts/deploy.sh"',
16
+ '<%= config.bin %> <%= command.id %> --name slack-notify --event work:pr_created --action-type webhook --action-value "https://hooks.slack.com/..."',
17
+ ];
18
+ static flags = {
19
+ ...pmoBaseFlags,
20
+ name: Flags.string({
21
+ description: 'Hook name (unique identifier)',
22
+ }),
23
+ event: Flags.string({
24
+ description: 'Event to trigger on',
25
+ options: HOOKABLE_EVENTS,
26
+ }),
27
+ 'action-type': Flags.string({
28
+ description: 'Action type (shell, webhook, or log)',
29
+ options: ['shell', 'webhook', 'log'],
30
+ }),
31
+ 'action-value': Flags.string({
32
+ description: 'Action payload (command, URL, or message template)',
33
+ }),
34
+ description: Flags.string({
35
+ description: 'Optional description',
36
+ }),
37
+ };
38
+ async execute() {
39
+ const { flags } = await this.parse(WorkHooksAdd);
40
+ const jsonMode = shouldOutputJson(flags);
41
+ let workspaceInfo;
42
+ try {
43
+ workspaceInfo = getWorkspaceInfo();
44
+ }
45
+ catch {
46
+ if (jsonMode) {
47
+ outputErrorAsJson('NOT_IN_WORKSPACE', 'Not in a workspace. Run "prlt new" first.', createMetadata('work hooks add', flags));
48
+ }
49
+ this.error('Not in a workspace. Run "prlt new" first.');
50
+ }
51
+ const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
52
+ const db = new Database(dbPath);
53
+ try {
54
+ const hookStorage = new WorkHookStorage(db);
55
+ // Collect name
56
+ let name = flags.name;
57
+ if (!name) {
58
+ const message = 'Hook name:';
59
+ const choices = undefined;
60
+ if (jsonMode) {
61
+ outputPromptAsJson(buildPromptConfig('input', 'name', message, choices), createMetadata('work hooks add', flags));
62
+ }
63
+ const result = await withSignalSafePrompt(() => inquirer.prompt([{
64
+ type: 'input',
65
+ name: 'name',
66
+ message,
67
+ validate: (input) => input.trim().length > 0 || 'Name is required',
68
+ }]));
69
+ name = result.name;
70
+ }
71
+ // Check for duplicate name
72
+ const existing = hookStorage.getByName(name);
73
+ if (existing) {
74
+ if (jsonMode) {
75
+ outputErrorAsJson('DUPLICATE_NAME', `Hook "${name}" already exists.`, createMetadata('work hooks add', flags));
76
+ }
77
+ this.error(`Hook "${name}" already exists.`);
78
+ }
79
+ // Collect event
80
+ let event = flags.event;
81
+ if (!event) {
82
+ const eventChoices = HOOKABLE_EVENTS.map(e => ({ name: e, value: e }));
83
+ const message = 'Event to trigger on:';
84
+ if (jsonMode) {
85
+ outputPromptAsJson(buildPromptConfig('list', 'event', message, eventChoices), createMetadata('work hooks add', flags));
86
+ }
87
+ const result = await withSignalSafePrompt(() => inquirer.prompt([{
88
+ type: 'list',
89
+ name: 'event',
90
+ message,
91
+ choices: eventChoices,
92
+ }]));
93
+ event = result.event;
94
+ }
95
+ // Collect action type
96
+ let actionType = flags['action-type'];
97
+ if (!actionType) {
98
+ const actionChoices = [
99
+ { name: 'shell — Run a shell command', value: 'shell' },
100
+ { name: 'webhook — POST event data to a URL', value: 'webhook' },
101
+ { name: 'log — Print a message to stdout', value: 'log' },
102
+ ];
103
+ const message = 'Action type:';
104
+ if (jsonMode) {
105
+ outputPromptAsJson(buildPromptConfig('list', 'actionType', message, actionChoices), createMetadata('work hooks add', flags));
106
+ }
107
+ const result = await withSignalSafePrompt(() => inquirer.prompt([{
108
+ type: 'list',
109
+ name: 'actionType',
110
+ message,
111
+ choices: actionChoices,
112
+ }]));
113
+ actionType = result.actionType;
114
+ }
115
+ // Collect action value
116
+ let actionValue = flags['action-value'];
117
+ if (!actionValue) {
118
+ const prompts = {
119
+ shell: 'Shell command to run:',
120
+ webhook: 'Webhook URL:',
121
+ log: 'Log message template (use {{workItemId}}, {{event}}, etc.):',
122
+ };
123
+ const message = prompts[actionType];
124
+ if (jsonMode) {
125
+ outputPromptAsJson(buildPromptConfig('input', 'actionValue', message), createMetadata('work hooks add', flags));
126
+ }
127
+ const result = await withSignalSafePrompt(() => inquirer.prompt([{
128
+ type: 'input',
129
+ name: 'actionValue',
130
+ message,
131
+ validate: (input) => input.trim().length > 0 || 'Action value is required',
132
+ }]));
133
+ actionValue = result.actionValue;
134
+ }
135
+ // Collect optional description
136
+ const description = flags.description;
137
+ // Create the hook
138
+ const hook = hookStorage.create({
139
+ name: name,
140
+ event: event,
141
+ actionType: actionType,
142
+ actionValue: actionValue,
143
+ description,
144
+ });
145
+ if (jsonMode) {
146
+ outputSuccessAsJson({
147
+ hook: {
148
+ id: hook.id,
149
+ name: hook.name,
150
+ event: hook.event,
151
+ actionType: hook.actionType,
152
+ actionValue: hook.actionValue,
153
+ enabled: hook.enabled,
154
+ description: hook.description,
155
+ },
156
+ message: `Hook "${hook.name}" created successfully.`,
157
+ }, createMetadata('work hooks add', flags));
158
+ }
159
+ this.log(styles.success(`Hook "${hook.name}" created.`));
160
+ this.log(styles.muted(` Event: ${hook.event}`));
161
+ this.log(styles.muted(` Action: ${hook.actionType} → ${hook.actionValue}`));
162
+ this.log(styles.muted(` ID: ${hook.id}`));
163
+ }
164
+ finally {
165
+ db.close();
166
+ }
167
+ }
168
+ }
169
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../../src/commands/work/hooks/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class WorkHooks extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ };
10
+ execute(): Promise<void>;
11
+ }
@@ -0,0 +1,44 @@
1
+ import { PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
2
+ import { shouldOutputJson } from '../../../lib/prompt-json.js';
3
+ export default class WorkHooks extends PMOCommand {
4
+ static description = 'Interactive menu for work lifecycle hooks';
5
+ static examples = [
6
+ '<%= config.bin %> <%= command.id %>',
7
+ ];
8
+ static flags = {
9
+ ...pmoBaseFlags,
10
+ };
11
+ async execute() {
12
+ const { flags } = await this.parse(WorkHooks);
13
+ const jsonMode = shouldOutputJson(flags);
14
+ const menuChoices = [
15
+ { id: 'list', name: 'List configured hooks', command: 'prlt work hooks list --json' },
16
+ { id: 'add', name: 'Add a new hook', command: 'prlt work hooks add --json' },
17
+ { id: 'remove', name: 'Remove a hook', command: 'prlt work hooks remove --json' },
18
+ { id: 'cancel', name: 'Cancel', command: '' },
19
+ ];
20
+ const action = await this.selectFromList({
21
+ message: 'Work Lifecycle Hooks - What would you like to do?',
22
+ items: menuChoices,
23
+ getName: (c) => c.name,
24
+ getValue: (c) => c.id,
25
+ getCommand: (c) => c.command,
26
+ jsonMode: jsonMode ? { flags, commandName: 'work hooks' } : null,
27
+ });
28
+ if (action === 'cancel' || !action) {
29
+ return;
30
+ }
31
+ switch (action) {
32
+ case 'list':
33
+ await this.config.runCommand('work:hooks:list');
34
+ break;
35
+ case 'add':
36
+ await this.config.runCommand('work:hooks:add');
37
+ break;
38
+ case 'remove':
39
+ await this.config.runCommand('work:hooks:remove');
40
+ break;
41
+ }
42
+ }
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/work/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAE9D,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,UAAU;IAC/C,MAAM,CAAC,WAAW,GAAG,2CAA2C,CAAA;IAEhE,MAAM,CAAC,QAAQ,GAAG;QAChB,qCAAqC;KACtC,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,YAAY;KAChB,CAAA;IAED,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAC7C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAExC,MAAM,WAAW,GAAG;YAClB,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,6BAA6B,EAAE;YACrF,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,4BAA4B,EAAE;YAC5E,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,+BAA+B,EAAE;YACjF,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;SAC9C,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;YACvC,OAAO,EAAE,mDAAmD;YAC5D,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;YACtB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;YACrB,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO;YAC5B,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI;SACjE,CAAC,CAAA;QAEF,IAAI,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,OAAM;QACR,CAAC;QAED,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAA;gBAC/C,MAAK;YACP,KAAK,KAAK;gBACR,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAA;gBAC9C,MAAK;YACP,KAAK,QAAQ;gBACX,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAA;gBACjD,MAAK;QACT,CAAC;IACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class WorkHooksList extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ event: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ };
11
+ execute(): Promise<void>;
12
+ }
@@ -0,0 +1,81 @@
1
+ import { Flags } from '@oclif/core';
2
+ import * as path from 'node:path';
3
+ import Database from 'better-sqlite3';
4
+ import { PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
5
+ import { styles } from '../../../lib/styles.js';
6
+ import { getWorkspaceInfo } from '../../../lib/agents/commands.js';
7
+ import { shouldOutputJson, outputSuccessAsJson, outputErrorAsJson, createMetadata, } from '../../../lib/prompt-json.js';
8
+ import { WorkHookStorage } from '../../../lib/work-lifecycle/hooks/index.js';
9
+ import { HOOKABLE_EVENTS } from '../../../lib/work-lifecycle/hooks/index.js';
10
+ export default class WorkHooksList extends PMOCommand {
11
+ static description = 'List configured work lifecycle hooks';
12
+ static examples = [
13
+ '<%= config.bin %> <%= command.id %>',
14
+ '<%= config.bin %> <%= command.id %> --event work:started',
15
+ ];
16
+ static flags = {
17
+ ...pmoBaseFlags,
18
+ event: Flags.string({
19
+ description: 'Filter by event name',
20
+ options: HOOKABLE_EVENTS,
21
+ }),
22
+ };
23
+ async execute() {
24
+ const { flags } = await this.parse(WorkHooksList);
25
+ const jsonMode = shouldOutputJson(flags);
26
+ let workspaceInfo;
27
+ try {
28
+ workspaceInfo = getWorkspaceInfo();
29
+ }
30
+ catch {
31
+ if (jsonMode) {
32
+ outputErrorAsJson('NOT_IN_WORKSPACE', 'Not in a workspace. Run "prlt new" first.', createMetadata('work hooks list', flags));
33
+ }
34
+ this.error('Not in a workspace. Run "prlt new" first.');
35
+ }
36
+ const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
37
+ const db = new Database(dbPath);
38
+ try {
39
+ const hookStorage = new WorkHookStorage(db);
40
+ const eventFilter = flags.event;
41
+ const hooks = hookStorage.list({ event: eventFilter });
42
+ if (jsonMode) {
43
+ outputSuccessAsJson({
44
+ hooks: hooks.map(h => ({
45
+ id: h.id,
46
+ name: h.name,
47
+ event: h.event,
48
+ actionType: h.actionType,
49
+ actionValue: h.actionValue,
50
+ enabled: h.enabled,
51
+ description: h.description,
52
+ createdAt: h.createdAt,
53
+ })),
54
+ count: hooks.length,
55
+ }, createMetadata('work hooks list', flags));
56
+ }
57
+ if (hooks.length === 0) {
58
+ this.log(styles.info('No hooks configured.'));
59
+ this.log(styles.muted(' Add one with: prlt work hooks add'));
60
+ return;
61
+ }
62
+ this.log(styles.title('Work Lifecycle Hooks'));
63
+ this.log('');
64
+ for (const hook of hooks) {
65
+ const status = hook.enabled ? styles.success('enabled') : styles.muted('disabled');
66
+ this.log(` ${styles.code(hook.name)} ${styles.muted('—')} ${status}`);
67
+ this.log(` Event: ${styles.emphasis(hook.event)}`);
68
+ this.log(` Action: ${hook.actionType} ${styles.muted('→')} ${hook.actionValue}`);
69
+ if (hook.description) {
70
+ this.log(` Desc: ${styles.muted(hook.description)}`);
71
+ }
72
+ this.log('');
73
+ }
74
+ this.log(styles.muted(` ${hooks.length} hook${hooks.length === 1 ? '' : 's'} configured`));
75
+ }
76
+ finally {
77
+ db.close();
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/work/hooks/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class WorkHooksRemove extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ };
13
+ execute(): Promise<void>;
14
+ }
@@ -0,0 +1,94 @@
1
+ import { Args } from '@oclif/core';
2
+ import * as path from 'node:path';
3
+ import Database from 'better-sqlite3';
4
+ import { PMOCommand, pmoBaseFlags } from '../../../lib/pmo/index.js';
5
+ import { styles } from '../../../lib/styles.js';
6
+ import { getWorkspaceInfo } from '../../../lib/agents/commands.js';
7
+ import { shouldOutputJson, outputSuccessAsJson, outputErrorAsJson, createMetadata, } from '../../../lib/prompt-json.js';
8
+ import { WorkHookStorage } from '../../../lib/work-lifecycle/hooks/index.js';
9
+ export default class WorkHooksRemove extends PMOCommand {
10
+ static description = 'Remove a work lifecycle hook';
11
+ static examples = [
12
+ '<%= config.bin %> <%= command.id %> notify-start',
13
+ '<%= config.bin %> <%= command.id %> deploy-hook',
14
+ ];
15
+ static args = {
16
+ name: Args.string({
17
+ description: 'Hook name to remove - prompts with dropdown if not provided',
18
+ required: false,
19
+ }),
20
+ };
21
+ static flags = {
22
+ ...pmoBaseFlags,
23
+ };
24
+ async execute() {
25
+ const { args, flags } = await this.parse(WorkHooksRemove);
26
+ const jsonMode = shouldOutputJson(flags);
27
+ let workspaceInfo;
28
+ try {
29
+ workspaceInfo = getWorkspaceInfo();
30
+ }
31
+ catch {
32
+ if (jsonMode) {
33
+ outputErrorAsJson('NOT_IN_WORKSPACE', 'Not in a workspace. Run "prlt new" first.', createMetadata('work hooks remove', flags));
34
+ }
35
+ this.error('Not in a workspace. Run "prlt new" first.');
36
+ }
37
+ const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
38
+ const db = new Database(dbPath);
39
+ try {
40
+ const hookStorage = new WorkHookStorage(db);
41
+ let hookName = args.name;
42
+ if (!hookName) {
43
+ const hooks = hookStorage.list();
44
+ if (hooks.length === 0) {
45
+ if (jsonMode) {
46
+ outputErrorAsJson('NO_HOOKS', 'No hooks configured.', createMetadata('work hooks remove', flags));
47
+ }
48
+ this.log(styles.info('No hooks configured.'));
49
+ return;
50
+ }
51
+ const selected = await this.selectFromList({
52
+ message: 'Select hook to remove:',
53
+ items: hooks,
54
+ getName: (h) => `${h.name} (${h.event} → ${h.actionType})`,
55
+ getValue: (h) => h.name,
56
+ getCommand: (h) => `prlt work hooks remove ${h.name} --json`,
57
+ jsonMode: jsonMode ? { flags, commandName: 'work hooks remove' } : null,
58
+ allowCancel: true,
59
+ });
60
+ if (!selected) {
61
+ return;
62
+ }
63
+ hookName = selected;
64
+ }
65
+ // Find the hook
66
+ const hook = hookStorage.getByName(hookName);
67
+ if (!hook) {
68
+ if (jsonMode) {
69
+ outputErrorAsJson('NOT_FOUND', `Hook "${hookName}" not found.`, createMetadata('work hooks remove', flags));
70
+ }
71
+ this.error(`Hook "${hookName}" not found.`);
72
+ }
73
+ // Delete it
74
+ hookStorage.delete(hook.id);
75
+ if (jsonMode) {
76
+ outputSuccessAsJson({
77
+ removed: {
78
+ id: hook.id,
79
+ name: hook.name,
80
+ event: hook.event,
81
+ },
82
+ message: `Hook "${hook.name}" removed.`,
83
+ }, createMetadata('work hooks remove', flags));
84
+ }
85
+ this.log(styles.success(`Hook "${hook.name}" removed.`));
86
+ this.log(styles.muted(` Event: ${hook.event}`));
87
+ this.log(styles.muted(` Action: ${hook.actionType} → ${hook.actionValue}`));
88
+ }
89
+ finally {
90
+ db.close();
91
+ }
92
+ }
93
+ }
94
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../../src/commands/work/hooks/remove.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { PMOCommand } from '../../../lib/pmo/index.js';
2
+ export default class WorkHooksToggle extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ enable: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ disable: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ };
15
+ execute(): Promise<void>;
16
+ }