hzl-cli 2.0.0 → 2.2.0

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 (136) hide show
  1. package/README.md +10 -34
  2. package/dist/commands/agent/stats.d.ts.map +1 -1
  3. package/dist/commands/agent/stats.js +3 -9
  4. package/dist/commands/agent/stats.js.map +1 -1
  5. package/dist/commands/dep/index.d.ts +3 -0
  6. package/dist/commands/dep/index.d.ts.map +1 -0
  7. package/dist/commands/dep/index.js +8 -0
  8. package/dist/commands/dep/index.js.map +1 -0
  9. package/dist/commands/dep/list.d.ts +38 -0
  10. package/dist/commands/dep/list.d.ts.map +1 -0
  11. package/dist/commands/dep/list.js +156 -0
  12. package/dist/commands/dep/list.js.map +1 -0
  13. package/dist/commands/dep/list.test.d.ts +2 -0
  14. package/dist/commands/dep/list.test.d.ts.map +1 -0
  15. package/dist/commands/dep/list.test.js +171 -0
  16. package/dist/commands/dep/list.test.js.map +1 -0
  17. package/dist/commands/export-events.d.ts.map +1 -1
  18. package/dist/commands/export-events.js +2 -1
  19. package/dist/commands/export-events.js.map +1 -1
  20. package/dist/commands/guide-content.d.ts +1 -1
  21. package/dist/commands/guide-content.d.ts.map +1 -1
  22. package/dist/commands/guide-content.js +41 -71
  23. package/dist/commands/guide-content.js.map +1 -1
  24. package/dist/commands/hook.d.ts +11 -0
  25. package/dist/commands/hook.d.ts.map +1 -0
  26. package/dist/commands/hook.js +61 -0
  27. package/dist/commands/hook.js.map +1 -0
  28. package/dist/commands/hook.test.d.ts +2 -0
  29. package/dist/commands/hook.test.d.ts.map +1 -0
  30. package/dist/commands/hook.test.js +80 -0
  31. package/dist/commands/hook.test.js.map +1 -0
  32. package/dist/commands/serve.d.ts.map +1 -1
  33. package/dist/commands/serve.js +2 -1
  34. package/dist/commands/serve.js.map +1 -1
  35. package/dist/commands/task/add-dep.d.ts.map +1 -1
  36. package/dist/commands/task/add-dep.js +10 -2
  37. package/dist/commands/task/add-dep.js.map +1 -1
  38. package/dist/commands/task/add-dep.test.js +24 -1
  39. package/dist/commands/task/add-dep.test.js.map +1 -1
  40. package/dist/commands/task/add.d.ts.map +1 -1
  41. package/dist/commands/task/add.js +3 -13
  42. package/dist/commands/task/add.js.map +1 -1
  43. package/dist/commands/task/checkpoint.d.ts.map +1 -1
  44. package/dist/commands/task/checkpoint.js +2 -4
  45. package/dist/commands/task/checkpoint.js.map +1 -1
  46. package/dist/commands/task/claim.d.ts.map +1 -1
  47. package/dist/commands/task/claim.js +4 -2
  48. package/dist/commands/task/claim.js.map +1 -1
  49. package/dist/commands/task/history.d.ts.map +1 -1
  50. package/dist/commands/task/history.js +2 -1
  51. package/dist/commands/task/history.js.map +1 -1
  52. package/dist/commands/task/list.d.ts.map +1 -1
  53. package/dist/commands/task/list.js +4 -7
  54. package/dist/commands/task/list.js.map +1 -1
  55. package/dist/commands/task/move.test.js +2 -1
  56. package/dist/commands/task/move.test.js.map +1 -1
  57. package/dist/commands/task/progress.d.ts.map +1 -1
  58. package/dist/commands/task/progress.js +5 -3
  59. package/dist/commands/task/progress.js.map +1 -1
  60. package/dist/commands/task/prune.d.ts.map +1 -1
  61. package/dist/commands/task/prune.js +2 -5
  62. package/dist/commands/task/prune.js.map +1 -1
  63. package/dist/commands/task/remove-dep.test.js +2 -1
  64. package/dist/commands/task/remove-dep.test.js.map +1 -1
  65. package/dist/commands/task/search.d.ts.map +1 -1
  66. package/dist/commands/task/search.js +27 -6
  67. package/dist/commands/task/search.js.map +1 -1
  68. package/dist/commands/task/search.test.js +26 -0
  69. package/dist/commands/task/search.test.js.map +1 -1
  70. package/dist/commands/task/set-status.d.ts.map +1 -1
  71. package/dist/commands/task/set-status.js +4 -2
  72. package/dist/commands/task/set-status.js.map +1 -1
  73. package/dist/commands/task/show.d.ts +2 -1
  74. package/dist/commands/task/show.d.ts.map +1 -1
  75. package/dist/commands/task/show.js +12 -13
  76. package/dist/commands/task/show.js.map +1 -1
  77. package/dist/commands/task/start.d.ts.map +1 -1
  78. package/dist/commands/task/start.js +3 -1
  79. package/dist/commands/task/start.js.map +1 -1
  80. package/dist/commands/task/stuck.d.ts.map +1 -1
  81. package/dist/commands/task/stuck.js +2 -1
  82. package/dist/commands/task/stuck.js.map +1 -1
  83. package/dist/commands/task/update.d.ts.map +1 -1
  84. package/dist/commands/task/update.js +54 -49
  85. package/dist/commands/task/update.js.map +1 -1
  86. package/dist/commands/task/update.test.js +2 -1
  87. package/dist/commands/task/update.test.js.map +1 -1
  88. package/dist/commands/workflow/index.d.ts +3 -0
  89. package/dist/commands/workflow/index.d.ts.map +1 -0
  90. package/dist/commands/workflow/index.js +12 -0
  91. package/dist/commands/workflow/index.js.map +1 -0
  92. package/dist/commands/workflow/index.test.d.ts +2 -0
  93. package/dist/commands/workflow/index.test.d.ts.map +1 -0
  94. package/dist/commands/workflow/index.test.js +35 -0
  95. package/dist/commands/workflow/index.test.js.map +1 -0
  96. package/dist/commands/workflow/list.d.ts +14 -0
  97. package/dist/commands/workflow/list.d.ts.map +1 -0
  98. package/dist/commands/workflow/list.js +41 -0
  99. package/dist/commands/workflow/list.js.map +1 -0
  100. package/dist/commands/workflow/run.d.ts +45 -0
  101. package/dist/commands/workflow/run.d.ts.map +1 -0
  102. package/dist/commands/workflow/run.js +243 -0
  103. package/dist/commands/workflow/run.js.map +1 -0
  104. package/dist/commands/workflow/run.test.d.ts +2 -0
  105. package/dist/commands/workflow/run.test.d.ts.map +1 -0
  106. package/dist/commands/workflow/run.test.js +100 -0
  107. package/dist/commands/workflow/run.test.js.map +1 -0
  108. package/dist/commands/workflow/show.d.ts +24 -0
  109. package/dist/commands/workflow/show.d.ts.map +1 -0
  110. package/dist/commands/workflow/show.js +62 -0
  111. package/dist/commands/workflow/show.js.map +1 -0
  112. package/dist/config.d.ts.map +1 -1
  113. package/dist/config.js +10 -1
  114. package/dist/config.js.map +1 -1
  115. package/dist/db.d.ts.map +1 -1
  116. package/dist/db.js +3 -1
  117. package/dist/db.js.map +1 -1
  118. package/dist/errors.d.ts.map +1 -1
  119. package/dist/errors.js +12 -0
  120. package/dist/errors.js.map +1 -1
  121. package/dist/errors.test.js +19 -0
  122. package/dist/errors.test.js.map +1 -1
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +6 -0
  125. package/dist/index.js.map +1 -1
  126. package/dist/parse.d.ts +13 -0
  127. package/dist/parse.d.ts.map +1 -0
  128. package/dist/parse.js +60 -0
  129. package/dist/parse.js.map +1 -0
  130. package/dist/parse.test.d.ts +2 -0
  131. package/dist/parse.test.d.ts.map +1 -0
  132. package/dist/parse.test.js +53 -0
  133. package/dist/parse.test.js.map +1 -0
  134. package/dist/types.d.ts +6 -0
  135. package/dist/types.d.ts.map +1 -1
  136. package/package.json +5 -3
@@ -0,0 +1,41 @@
1
+ import { Command } from 'commander';
2
+ import { WorkflowService } from 'hzl-core/services/workflow-service.js';
3
+ import { resolveDbPaths } from '../../config.js';
4
+ import { closeDb, initializeDb } from '../../db.js';
5
+ import { handleError } from '../../errors.js';
6
+ import { GlobalOptionsSchema } from '../../types.js';
7
+ function createWorkflowService(services) {
8
+ return new WorkflowService(services.cacheDb, services.eventStore, services.projectionEngine, services.taskService, services.db);
9
+ }
10
+ export function runWorkflowList(options) {
11
+ const workflowService = createWorkflowService(options.services);
12
+ const result = { workflows: workflowService.listWorkflows() };
13
+ if (options.json) {
14
+ console.log(JSON.stringify(result));
15
+ }
16
+ else {
17
+ for (const workflow of result.workflows) {
18
+ console.log(`${workflow.name}: ${workflow.description}`);
19
+ }
20
+ }
21
+ return result;
22
+ }
23
+ export function createWorkflowListCommand() {
24
+ return new Command('list')
25
+ .description('List available built-in workflows')
26
+ .action(function () {
27
+ const globalOpts = GlobalOptionsSchema.parse(this.optsWithGlobals());
28
+ const { eventsDbPath, cacheDbPath } = resolveDbPaths(globalOpts.db);
29
+ const services = initializeDb({ eventsDbPath, cacheDbPath });
30
+ try {
31
+ runWorkflowList({ services, json: globalOpts.json ?? false });
32
+ }
33
+ catch (error) {
34
+ handleError(error, globalOpts.json);
35
+ }
36
+ finally {
37
+ closeDb(services);
38
+ }
39
+ });
40
+ }
41
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/workflow/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAiB,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AASrD,SAAS,qBAAqB,CAAC,QAAkB;IAC/C,OAAO,IAAI,eAAe,CACxB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,gBAAgB,EACzB,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,EAAE,CACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAG/B;IACC,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,MAAM,GAAuB,EAAE,SAAS,EAAE,eAAe,CAAC,aAAa,EAAE,EAAE,CAAC;IAElF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC;QACN,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QACrE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC;YACH,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { Command } from 'commander';
2
+ import { type OthersLimit, type WorkflowDelegateResult, type WorkflowHandoffResult, type WorkflowStartResult } from 'hzl-core/services/workflow-service.js';
3
+ import { type Services } from '../../db.js';
4
+ export declare function runWorkflowStart(options: {
5
+ services: Services;
6
+ agent: string;
7
+ project?: string;
8
+ tags?: string[];
9
+ leaseMinutes?: number;
10
+ resumePolicy?: 'first' | 'latest' | 'priority';
11
+ includeOthers?: boolean;
12
+ othersLimit?: OthersLimit;
13
+ opId?: string;
14
+ autoOpId?: boolean;
15
+ json: boolean;
16
+ }): WorkflowStartResult;
17
+ export declare function runWorkflowHandoff(options: {
18
+ services: Services;
19
+ fromTaskId: string;
20
+ title: string;
21
+ project?: string;
22
+ agent?: string;
23
+ carryCheckpoints?: number;
24
+ carryMaxChars?: number;
25
+ author?: string;
26
+ opId?: string;
27
+ autoOpId?: boolean;
28
+ json: boolean;
29
+ }): WorkflowHandoffResult;
30
+ export declare function runWorkflowDelegate(options: {
31
+ services: Services;
32
+ fromTaskId: string;
33
+ title: string;
34
+ project?: string;
35
+ agent?: string;
36
+ dependsOnParent?: boolean;
37
+ checkpoint?: string;
38
+ pauseParent?: boolean;
39
+ author?: string;
40
+ opId?: string;
41
+ autoOpId?: boolean;
42
+ json: boolean;
43
+ }): WorkflowDelegateResult;
44
+ export declare function createWorkflowRunCommand(): Command;
45
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACzB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AA8EnE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC/C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;CACf,GAAG,mBAAmB,CA+BtB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;CACf,GAAG,qBAAqB,CAqBxB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;CACf,GAAG,sBAAsB,CAsBzB;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAoIlD"}
@@ -0,0 +1,243 @@
1
+ import { Command } from 'commander';
2
+ import { WorkflowService, } from 'hzl-core/services/workflow-service.js';
3
+ import { resolveDbPaths } from '../../config.js';
4
+ import { closeDb, initializeDb } from '../../db.js';
5
+ import { CLIError, ExitCode, handleError } from '../../errors.js';
6
+ import { resolveId } from '../../resolve-id.js';
7
+ import { GlobalOptionsSchema } from '../../types.js';
8
+ import { parseInteger, parseOptionalInteger } from '../../parse.js';
9
+ function createWorkflowService(services) {
10
+ return new WorkflowService(services.cacheDb, services.eventStore, services.projectionEngine, services.taskService, services.db);
11
+ }
12
+ function parseTags(raw) {
13
+ const tags = raw?.split(',').map((tag) => tag.trim()).filter(Boolean);
14
+ return tags && tags.length > 0 ? tags : undefined;
15
+ }
16
+ function parsePositiveInt(raw, optionName) {
17
+ return parseOptionalInteger(raw, optionName, { min: 0 });
18
+ }
19
+ function parseOthersLimit(raw) {
20
+ if (raw === undefined)
21
+ return undefined;
22
+ if (raw === 'all')
23
+ return 'all';
24
+ try {
25
+ return parseInteger(raw, '--others-limit', { min: 0 });
26
+ }
27
+ catch {
28
+ throw new CLIError('--others-limit must be a non-negative integer or "all"', ExitCode.InvalidInput);
29
+ }
30
+ }
31
+ function assertNoConflictingOpFlags(opts) {
32
+ if (opts.opId && opts.autoOpId) {
33
+ throw new CLIError('Cannot use --op-id and --auto-op-id together.', ExitCode.InvalidInput);
34
+ }
35
+ }
36
+ export function runWorkflowStart(options) {
37
+ if (options.autoOpId) {
38
+ throw new CLIError('--auto-op-id is not supported for workflow run start; use --op-id for intentional retries.', ExitCode.InvalidInput);
39
+ }
40
+ const workflowService = createWorkflowService(options.services);
41
+ const result = workflowService.runStart({
42
+ agent: options.agent,
43
+ project: options.project,
44
+ tags: options.tags,
45
+ lease_minutes: options.leaseMinutes,
46
+ resume_policy: options.resumePolicy,
47
+ include_others: options.includeOthers,
48
+ others_limit: options.othersLimit,
49
+ op_id: options.opId,
50
+ });
51
+ if (options.json) {
52
+ console.log(JSON.stringify(result));
53
+ }
54
+ else if (!result.selected) {
55
+ console.log('No eligible task to start.');
56
+ }
57
+ else if (result.mode === 'resume') {
58
+ console.log(`✓ Resumed task ${result.selected.task_id}: ${result.selected.title}`);
59
+ }
60
+ else {
61
+ console.log(`✓ Claimed task ${result.selected.task_id}: ${result.selected.title}`);
62
+ }
63
+ return result;
64
+ }
65
+ export function runWorkflowHandoff(options) {
66
+ const workflowService = createWorkflowService(options.services);
67
+ const result = workflowService.runHandoff({
68
+ from_task_id: options.fromTaskId,
69
+ title: options.title,
70
+ project: options.project,
71
+ agent: options.agent,
72
+ carry_checkpoints: options.carryCheckpoints,
73
+ carry_max_chars: options.carryMaxChars,
74
+ author: options.author,
75
+ op_id: options.opId,
76
+ auto_op_id: options.autoOpId,
77
+ });
78
+ if (options.json) {
79
+ console.log(JSON.stringify(result));
80
+ }
81
+ else {
82
+ console.log(`✓ Handed off ${result.source_task_id} -> ${result.follow_on.task_id}`);
83
+ }
84
+ return result;
85
+ }
86
+ export function runWorkflowDelegate(options) {
87
+ const workflowService = createWorkflowService(options.services);
88
+ const result = workflowService.runDelegate({
89
+ from_task_id: options.fromTaskId,
90
+ title: options.title,
91
+ project: options.project,
92
+ agent: options.agent,
93
+ depends_on_parent: options.dependsOnParent,
94
+ checkpoint: options.checkpoint,
95
+ pause_parent: options.pauseParent,
96
+ author: options.author,
97
+ op_id: options.opId,
98
+ auto_op_id: options.autoOpId,
99
+ });
100
+ if (options.json) {
101
+ console.log(JSON.stringify(result));
102
+ }
103
+ else {
104
+ console.log(`✓ Delegated ${result.source_task_id} -> ${result.delegated.task_id}`);
105
+ }
106
+ return result;
107
+ }
108
+ export function createWorkflowRunCommand() {
109
+ const command = new Command('run').description('Run a built-in workflow');
110
+ command
111
+ .command('start')
112
+ .description('Resume in-progress work for an agent, otherwise claim next')
113
+ .requiredOption('--agent <name>', 'Agent identity for resume/claim')
114
+ .option('-P, --project <project>', 'Project filter for resume/claim')
115
+ .option('--tags <tags>', 'Required tags, comma-separated')
116
+ .option('-l, --lease <minutes>', 'Lease duration in minutes')
117
+ .option('--resume-policy <policy>', 'Resume policy: first | latest | priority', 'priority')
118
+ .option('--include-others', 'Include alternate candidates in response')
119
+ .option('--no-include-others', 'Exclude alternate candidates from response')
120
+ .option('--others-limit <n|all>', 'Bound alternate candidates in response', '5')
121
+ .option('--op-id <key>', 'Explicit idempotency key')
122
+ .option('--auto-op-id', 'Unsupported for start; use explicit --op-id retries instead')
123
+ .action(function (opts) {
124
+ const globalOpts = GlobalOptionsSchema.parse(this.optsWithGlobals());
125
+ const { eventsDbPath, cacheDbPath } = resolveDbPaths(globalOpts.db);
126
+ const services = initializeDb({ eventsDbPath, cacheDbPath });
127
+ try {
128
+ assertNoConflictingOpFlags(opts);
129
+ if (!opts.agent) {
130
+ throw new CLIError('--agent is required', ExitCode.InvalidUsage);
131
+ }
132
+ runWorkflowStart({
133
+ services,
134
+ agent: opts.agent,
135
+ project: opts.project,
136
+ tags: parseTags(opts.tags),
137
+ leaseMinutes: parsePositiveInt(opts.lease, '--lease'),
138
+ resumePolicy: opts.resumePolicy ?? 'priority',
139
+ includeOthers: opts.includeOthers,
140
+ othersLimit: parseOthersLimit(opts.othersLimit),
141
+ opId: opts.opId,
142
+ autoOpId: opts.autoOpId,
143
+ json: globalOpts.json ?? false,
144
+ });
145
+ }
146
+ catch (error) {
147
+ handleError(error, globalOpts.json);
148
+ }
149
+ finally {
150
+ closeDb(services);
151
+ }
152
+ });
153
+ command
154
+ .command('handoff')
155
+ .description('Complete source task and create a follow-on task')
156
+ .requiredOption('--from <taskId>', 'Source task id')
157
+ .requiredOption('--title <title>', 'Follow-on task title')
158
+ .option('-P, --project <project>', 'Follow-on task project')
159
+ .option('--agent <agent>', 'Follow-on task assignee')
160
+ .option('--carry-checkpoints <n>', 'Number of checkpoints to carry', '3')
161
+ .option('--carry-max-chars <n>', 'Max carried checkpoint chars', '4000')
162
+ .option('--author <name>', 'Author for emitted workflow events')
163
+ .option('--op-id <key>', 'Explicit idempotency key')
164
+ .option('--auto-op-id', 'Generate deterministic idempotency key from normalized input')
165
+ .action(function (opts) {
166
+ const globalOpts = GlobalOptionsSchema.parse(this.optsWithGlobals());
167
+ const { eventsDbPath, cacheDbPath } = resolveDbPaths(globalOpts.db);
168
+ const services = initializeDb({ eventsDbPath, cacheDbPath });
169
+ try {
170
+ assertNoConflictingOpFlags(opts);
171
+ if (!opts.from || !opts.title) {
172
+ throw new CLIError('--from and --title are required', ExitCode.InvalidUsage);
173
+ }
174
+ const fromTaskId = resolveId(services, opts.from);
175
+ runWorkflowHandoff({
176
+ services,
177
+ fromTaskId,
178
+ title: opts.title,
179
+ project: opts.project,
180
+ agent: opts.agent,
181
+ carryCheckpoints: parsePositiveInt(opts.carryCheckpoints, '--carry-checkpoints'),
182
+ carryMaxChars: parsePositiveInt(opts.carryMaxChars, '--carry-max-chars'),
183
+ author: opts.author,
184
+ opId: opts.opId,
185
+ autoOpId: opts.autoOpId,
186
+ json: globalOpts.json ?? false,
187
+ });
188
+ }
189
+ catch (error) {
190
+ handleError(error, globalOpts.json);
191
+ }
192
+ finally {
193
+ closeDb(services);
194
+ }
195
+ });
196
+ command
197
+ .command('delegate')
198
+ .description('Create delegated task, add dependency by default, optionally pause parent')
199
+ .requiredOption('--from <taskId>', 'Source task id')
200
+ .requiredOption('--title <title>', 'Delegated task title')
201
+ .option('-P, --project <project>', 'Delegated task project')
202
+ .option('--agent <agent>', 'Delegated task assignee')
203
+ .option('--no-depends', 'Do not add parent->delegated dependency edge')
204
+ .option('--checkpoint <text>', 'Checkpoint to add to source task')
205
+ .option('--pause-parent', 'Pause parent task (blocked) when currently in_progress')
206
+ .option('--author <name>', 'Author for emitted workflow events')
207
+ .option('--op-id <key>', 'Explicit idempotency key')
208
+ .option('--auto-op-id', 'Generate deterministic idempotency key from normalized input')
209
+ .action(function (opts) {
210
+ const globalOpts = GlobalOptionsSchema.parse(this.optsWithGlobals());
211
+ const { eventsDbPath, cacheDbPath } = resolveDbPaths(globalOpts.db);
212
+ const services = initializeDb({ eventsDbPath, cacheDbPath });
213
+ try {
214
+ assertNoConflictingOpFlags(opts);
215
+ if (!opts.from || !opts.title) {
216
+ throw new CLIError('--from and --title are required', ExitCode.InvalidUsage);
217
+ }
218
+ const fromTaskId = resolveId(services, opts.from);
219
+ runWorkflowDelegate({
220
+ services,
221
+ fromTaskId,
222
+ title: opts.title,
223
+ project: opts.project,
224
+ agent: opts.agent,
225
+ dependsOnParent: opts.depends,
226
+ checkpoint: opts.checkpoint,
227
+ pauseParent: opts.pauseParent,
228
+ author: opts.author,
229
+ opId: opts.opId,
230
+ autoOpId: opts.autoOpId,
231
+ json: globalOpts.json ?? false,
232
+ });
233
+ }
234
+ catch (error) {
235
+ handleError(error, globalOpts.json);
236
+ }
237
+ finally {
238
+ closeDb(services);
239
+ }
240
+ });
241
+ return command;
242
+ }
243
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/workflow/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.test.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/run.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,100 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import { runWorkflowDelegate, runWorkflowHandoff, runWorkflowStart, } from './run.js';
6
+ import { closeDb, initializeDbFromPath } from '../../db.js';
7
+ import { TaskStatus } from 'hzl-core/events/types.js';
8
+ describe('workflow run commands', () => {
9
+ let tempDir;
10
+ let dbPath;
11
+ let services;
12
+ beforeEach(() => {
13
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'hzl-workflow-run-test-'));
14
+ dbPath = path.join(tempDir, 'test.db');
15
+ services = initializeDbFromPath(dbPath);
16
+ });
17
+ afterEach(() => {
18
+ closeDb(services);
19
+ fs.rmSync(tempDir, { recursive: true, force: true });
20
+ });
21
+ it('start resumes in_progress task before claiming next', () => {
22
+ const resumed = services.taskService.createTask({
23
+ title: 'Resume',
24
+ project: 'inbox',
25
+ initial_status: TaskStatus.InProgress,
26
+ agent: 'agent-1',
27
+ });
28
+ const ready = services.taskService.createTask({ title: 'Ready', project: 'inbox' });
29
+ services.taskService.setStatus(ready.task_id, TaskStatus.Ready);
30
+ const result = runWorkflowStart({
31
+ services,
32
+ agent: 'agent-1',
33
+ json: false,
34
+ });
35
+ expect(result.mode).toBe('resume');
36
+ expect(result.selected?.task_id).toBe(resumed.task_id);
37
+ expect(services.taskService.getTaskById(ready.task_id)?.status).toBe(TaskStatus.Ready);
38
+ });
39
+ it('handoff applies guardrail requiring agent or project', () => {
40
+ const source = services.taskService.createTask({ title: 'Source', project: 'inbox' });
41
+ services.taskService.setStatus(source.task_id, TaskStatus.Ready);
42
+ services.taskService.claimTask(source.task_id, { author: 'agent-1' });
43
+ expect(() => runWorkflowHandoff({
44
+ services,
45
+ fromTaskId: source.task_id,
46
+ title: 'Follow on',
47
+ json: false,
48
+ })).toThrow(/requires --agent, --project, or both/i);
49
+ });
50
+ it('delegate adds parent dependency by default', () => {
51
+ const source = services.taskService.createTask({ title: 'Source', project: 'inbox' });
52
+ services.taskService.setStatus(source.task_id, TaskStatus.Ready);
53
+ services.taskService.claimTask(source.task_id, { author: 'agent-1' });
54
+ const result = runWorkflowDelegate({
55
+ services,
56
+ fromTaskId: source.task_id,
57
+ title: 'Delegated',
58
+ json: false,
59
+ });
60
+ const row = services.cacheDb
61
+ .prepare('SELECT depends_on_id FROM task_dependencies WHERE task_id = ?')
62
+ .get(source.task_id);
63
+ expect(row?.depends_on_id).toBe(result.delegated.task_id);
64
+ });
65
+ it('replays cached result when op_id table exists and op_id is reused', () => {
66
+ services.db.exec(`
67
+ CREATE TABLE op_id (
68
+ op_id TEXT PRIMARY KEY,
69
+ scope TEXT,
70
+ input_hash TEXT,
71
+ result TEXT,
72
+ state TEXT,
73
+ created_at TEXT,
74
+ updated_at TEXT
75
+ );
76
+ `);
77
+ const source = services.taskService.createTask({ title: 'Source', project: 'inbox' });
78
+ services.taskService.setStatus(source.task_id, TaskStatus.Ready);
79
+ services.taskService.claimTask(source.task_id, { author: 'agent-1' });
80
+ const first = runWorkflowHandoff({
81
+ services,
82
+ fromTaskId: source.task_id,
83
+ title: 'Follow on',
84
+ project: 'inbox',
85
+ opId: 'handoff-1',
86
+ json: false,
87
+ });
88
+ const second = runWorkflowHandoff({
89
+ services,
90
+ fromTaskId: source.task_id,
91
+ title: 'Follow on',
92
+ project: 'inbox',
93
+ opId: 'handoff-1',
94
+ json: false,
95
+ });
96
+ expect(first.follow_on.task_id).toBe(second.follow_on.task_id);
97
+ expect(second.idempotency.replayed).toBe(true);
98
+ });
99
+ });
100
+ //# sourceMappingURL=run.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.test.js","sourceRoot":"","sources":["../../../src/commands/workflow/run.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Command } from 'commander';
2
+ import { type WorkflowName } from 'hzl-core/services/workflow-service.js';
3
+ import { type Services } from '../../db.js';
4
+ export interface WorkflowShowResult {
5
+ workflow: {
6
+ name: WorkflowName;
7
+ description: string;
8
+ supports_auto_op_id: boolean;
9
+ args: Array<{
10
+ name: string;
11
+ required: boolean;
12
+ description: string;
13
+ default?: string;
14
+ }>;
15
+ notes: string[];
16
+ };
17
+ }
18
+ export declare function runWorkflowShow(options: {
19
+ services: Services;
20
+ name: string;
21
+ json: boolean;
22
+ }): WorkflowShowResult;
23
+ export declare function createWorkflowShowCommand(): Command;
24
+ //# sourceMappingURL=show.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAInE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE;QACR,IAAI,EAAE,YAAY,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,mBAAmB,EAAE,OAAO,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC;YACV,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,OAAO,CAAC;YAClB,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC,CAAC;QACH,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;CACH;AAmBD,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf,GAAG,kBAAkB,CA2BrB;AAED,wBAAgB,yBAAyB,IAAI,OAAO,CAgBnD"}
@@ -0,0 +1,62 @@
1
+ import { Command } from 'commander';
2
+ import { WorkflowService, } from 'hzl-core/services/workflow-service.js';
3
+ import { resolveDbPaths } from '../../config.js';
4
+ import { closeDb, initializeDb } from '../../db.js';
5
+ import { CLIError, ExitCode, handleError } from '../../errors.js';
6
+ import { GlobalOptionsSchema } from '../../types.js';
7
+ function createWorkflowService(services) {
8
+ return new WorkflowService(services.cacheDb, services.eventStore, services.projectionEngine, services.taskService, services.db);
9
+ }
10
+ function parseWorkflowName(name) {
11
+ if (name === 'start' || name === 'handoff' || name === 'delegate') {
12
+ return name;
13
+ }
14
+ throw new CLIError(`Unknown workflow: ${name}`, ExitCode.NotFound);
15
+ }
16
+ export function runWorkflowShow(options) {
17
+ const workflowName = parseWorkflowName(options.name);
18
+ const workflowService = createWorkflowService(options.services);
19
+ const definition = workflowService.showWorkflow(workflowName);
20
+ const result = { workflow: definition };
21
+ if (options.json) {
22
+ console.log(JSON.stringify(result));
23
+ }
24
+ else {
25
+ console.log(`${definition.name}`);
26
+ console.log(`Description: ${definition.description}`);
27
+ console.log(`Supports --auto-op-id: ${definition.supports_auto_op_id ? 'yes' : 'no'}`);
28
+ console.log('Arguments:');
29
+ for (const arg of definition.args) {
30
+ const required = arg.required ? 'required' : 'optional';
31
+ const defaultText = arg.default ? ` [default: ${arg.default}]` : '';
32
+ console.log(` ${arg.name} (${required}) - ${arg.description}${defaultText}`);
33
+ }
34
+ if (definition.notes.length > 0) {
35
+ console.log('Notes:');
36
+ for (const note of definition.notes) {
37
+ console.log(` - ${note}`);
38
+ }
39
+ }
40
+ }
41
+ return result;
42
+ }
43
+ export function createWorkflowShowCommand() {
44
+ return new Command('show')
45
+ .description('Show workflow details and contract notes')
46
+ .argument('<name>', 'Workflow name')
47
+ .action(function (name) {
48
+ const globalOpts = GlobalOptionsSchema.parse(this.optsWithGlobals());
49
+ const { eventsDbPath, cacheDbPath } = resolveDbPaths(globalOpts.db);
50
+ const services = initializeDb({ eventsDbPath, cacheDbPath });
51
+ try {
52
+ runWorkflowShow({ services, name, json: globalOpts.json ?? false });
53
+ }
54
+ catch (error) {
55
+ handleError(error, globalOpts.json);
56
+ }
57
+ finally {
58
+ closeDb(services);
59
+ }
60
+ });
61
+ }
62
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/commands/workflow/show.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AA0EzC,wBAAgB,SAAS,IAAI,OAAO,CAInC;AAiCD,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAOtC;AASD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAW1D;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAChE,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,wBAAgB,wBAAwB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,GAAE,MAAwB,GAAG,yBAAyB,CA6D5H;AAED,wBAAgB,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,GAAE,MAAwB,GAAG,eAAe,CAGxG;AAED,wBAAgB,UAAU,CAAC,UAAU,GAAE,MAAwB,GAAG,MAAM,CAavE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKtD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,GAAE,MAAwB,GAAG,IAAI,CAuChG;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBxE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAgFzC,wBAAgB,SAAS,IAAI,OAAO,CAInC;AAiCD,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAOtC;AASD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAW1D;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAChE,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,wBAAgB,wBAAwB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,GAAE,MAAwB,GAAG,yBAAyB,CA6D5H;AAED,wBAAgB,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,GAAE,MAAwB,GAAG,eAAe,CAGxG;AAED,wBAAgB,UAAU,CAAC,UAAU,GAAE,MAAwB,GAAG,MAAM,CAiBvE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKtD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,GAAE,MAAwB,GAAG,IAAI,CAuChG;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBxE"}
package/dist/config.js CHANGED
@@ -25,6 +25,12 @@ const ConfigFileSchema = z.object({
25
25
  }).optional(),
26
26
  }).optional(),
27
27
  dbPath: z.string().optional(),
28
+ hooks: z.object({
29
+ on_done: z.object({
30
+ url: z.string().optional(),
31
+ headers: z.record(z.string(), z.string()).optional(),
32
+ }).optional(),
33
+ }).optional(),
28
34
  defaultProject: z.string().optional(),
29
35
  defaultAuthor: z.string().optional(),
30
36
  leaseMinutes: z.number().positive().optional(),
@@ -212,7 +218,10 @@ export function readConfig(configPath = getConfigPath()) {
212
218
  try {
213
219
  const parsed = JSON.parse(content);
214
220
  const result = ConfigFileSchema.safeParse(parsed);
215
- return result.success ? result.data : {};
221
+ if (!result.success) {
222
+ return {};
223
+ }
224
+ return result.data;
216
225
  }
217
226
  catch {
218
227
  throw new Error(`Config file at ${configPath} is invalid JSON`);