hzl-cli 1.34.0 → 1.34.1

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 (131) hide show
  1. package/README.md +29 -116
  2. package/dist/__tests__/integration/cli-integration.test.js +30 -31
  3. package/dist/__tests__/integration/cli-integration.test.js.map +1 -1
  4. package/dist/__tests__/integration/config.test.js +3 -3
  5. package/dist/__tests__/integration/config.test.js.map +1 -1
  6. package/dist/__tests__/integration/helpers.js +1 -1
  7. package/dist/__tests__/integration/helpers.js.map +1 -1
  8. package/dist/__tests__/integration/v2-migration.test.d.ts +2 -0
  9. package/dist/__tests__/integration/v2-migration.test.d.ts.map +1 -0
  10. package/dist/__tests__/integration/v2-migration.test.js +45 -0
  11. package/dist/__tests__/integration/v2-migration.test.js.map +1 -0
  12. package/dist/commands/agent/index.d.ts +3 -0
  13. package/dist/commands/agent/index.d.ts.map +1 -0
  14. package/dist/commands/agent/index.js +8 -0
  15. package/dist/commands/agent/index.js.map +1 -0
  16. package/dist/commands/agent/stats.d.ts +21 -0
  17. package/dist/commands/agent/stats.d.ts.map +1 -0
  18. package/dist/commands/agent/stats.js +96 -0
  19. package/dist/commands/agent/stats.js.map +1 -0
  20. package/dist/commands/agent/stats.test.d.ts +2 -0
  21. package/dist/commands/agent/stats.test.d.ts.map +1 -0
  22. package/dist/commands/agent/stats.test.js +56 -0
  23. package/dist/commands/agent/stats.test.js.map +1 -0
  24. package/dist/commands/guide-content.d.ts +1 -1
  25. package/dist/commands/guide-content.d.ts.map +1 -1
  26. package/dist/commands/guide-content.js +60 -58
  27. package/dist/commands/guide-content.js.map +1 -1
  28. package/dist/commands/task/add.d.ts +1 -1
  29. package/dist/commands/task/add.d.ts.map +1 -1
  30. package/dist/commands/task/add.js +4 -4
  31. package/dist/commands/task/add.js.map +1 -1
  32. package/dist/commands/task/add.test.js +16 -16
  33. package/dist/commands/task/add.test.js.map +1 -1
  34. package/dist/commands/task/block.d.ts +1 -1
  35. package/dist/commands/task/block.d.ts.map +1 -1
  36. package/dist/commands/task/block.js +2 -2
  37. package/dist/commands/task/block.js.map +1 -1
  38. package/dist/commands/task/block.test.js +3 -3
  39. package/dist/commands/task/block.test.js.map +1 -1
  40. package/dist/commands/task/claim.d.ts +67 -3
  41. package/dist/commands/task/claim.d.ts.map +1 -1
  42. package/dist/commands/task/claim.js +396 -29
  43. package/dist/commands/task/claim.js.map +1 -1
  44. package/dist/commands/task/claim.test.js +64 -5
  45. package/dist/commands/task/claim.test.js.map +1 -1
  46. package/dist/commands/task/complete.d.ts +1 -0
  47. package/dist/commands/task/complete.d.ts.map +1 -1
  48. package/dist/commands/task/complete.js +7 -2
  49. package/dist/commands/task/complete.js.map +1 -1
  50. package/dist/commands/task/complete.test.js +14 -0
  51. package/dist/commands/task/complete.test.js.map +1 -1
  52. package/dist/commands/task/index.d.ts.map +1 -1
  53. package/dist/commands/task/index.js +0 -2
  54. package/dist/commands/task/index.js.map +1 -1
  55. package/dist/commands/task/list.d.ts +20 -1
  56. package/dist/commands/task/list.d.ts.map +1 -1
  57. package/dist/commands/task/list.js +165 -24
  58. package/dist/commands/task/list.js.map +1 -1
  59. package/dist/commands/task/list.test.js +65 -4
  60. package/dist/commands/task/list.test.js.map +1 -1
  61. package/dist/commands/task/release.d.ts +1 -1
  62. package/dist/commands/task/release.d.ts.map +1 -1
  63. package/dist/commands/task/release.js +1 -1
  64. package/dist/commands/task/release.js.map +1 -1
  65. package/dist/commands/task/release.test.js +1 -1
  66. package/dist/commands/task/release.test.js.map +1 -1
  67. package/dist/commands/task/show.js +4 -4
  68. package/dist/commands/task/show.js.map +1 -1
  69. package/dist/commands/task/start.js +2 -2
  70. package/dist/commands/task/start.js.map +1 -1
  71. package/dist/commands/task/steal.d.ts +1 -1
  72. package/dist/commands/task/steal.d.ts.map +1 -1
  73. package/dist/commands/task/steal.js +13 -13
  74. package/dist/commands/task/steal.js.map +1 -1
  75. package/dist/commands/task/steal.test.js +8 -8
  76. package/dist/commands/task/steal.test.js.map +1 -1
  77. package/dist/commands/task/stuck.d.ts +1 -1
  78. package/dist/commands/task/stuck.d.ts.map +1 -1
  79. package/dist/commands/task/stuck.js +3 -3
  80. package/dist/commands/task/stuck.js.map +1 -1
  81. package/dist/commands/task/unblock.d.ts +1 -1
  82. package/dist/commands/task/unblock.d.ts.map +1 -1
  83. package/dist/commands/task/unblock.js +1 -1
  84. package/dist/commands/task/unblock.js.map +1 -1
  85. package/dist/commands/task/unblock.test.js +2 -2
  86. package/dist/commands/task/unblock.test.js.map +1 -1
  87. package/dist/config.d.ts.map +1 -1
  88. package/dist/config.js +1 -0
  89. package/dist/config.js.map +1 -1
  90. package/dist/config.test.js +9 -1
  91. package/dist/config.test.js.map +1 -1
  92. package/dist/db.d.ts.map +1 -1
  93. package/dist/db.js +3 -1
  94. package/dist/db.js.map +1 -1
  95. package/dist/db.test.js +9 -9
  96. package/dist/db.test.js.map +1 -1
  97. package/dist/errors.d.ts +4 -1
  98. package/dist/errors.d.ts.map +1 -1
  99. package/dist/errors.js +28 -3
  100. package/dist/errors.js.map +1 -1
  101. package/dist/errors.test.js +30 -2
  102. package/dist/errors.test.js.map +1 -1
  103. package/dist/index.d.ts +2 -0
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +96 -2
  106. package/dist/index.js.map +1 -1
  107. package/dist/index.test.js +9 -0
  108. package/dist/index.test.js.map +1 -1
  109. package/dist/output.d.ts +17 -0
  110. package/dist/output.d.ts.map +1 -1
  111. package/dist/output.js +29 -4
  112. package/dist/output.js.map +1 -1
  113. package/dist/output.test.d.ts +2 -0
  114. package/dist/output.test.d.ts.map +1 -0
  115. package/dist/output.test.js +39 -0
  116. package/dist/output.test.js.map +1 -0
  117. package/dist/types.d.ts +21 -3
  118. package/dist/types.d.ts.map +1 -1
  119. package/dist/types.js +12 -3
  120. package/dist/types.js.map +1 -1
  121. package/dist/types.test.js +9 -2
  122. package/dist/types.test.js.map +1 -1
  123. package/package.json +3 -3
  124. package/dist/commands/task/next.d.ts +0 -27
  125. package/dist/commands/task/next.d.ts.map +0 -1
  126. package/dist/commands/task/next.js +0 -115
  127. package/dist/commands/task/next.js.map +0 -1
  128. package/dist/commands/task/next.test.d.ts +0 -2
  129. package/dist/commands/task/next.test.d.ts.map +0 -1
  130. package/dist/commands/task/next.test.js +0 -148
  131. package/dist/commands/task/next.test.js.map +0 -1
@@ -11,14 +11,14 @@ export function runBlock(options) {
11
11
  // Check task status before blocking to provide actionable error
12
12
  const existingTask = services.taskService.getTaskById(taskId);
13
13
  if (existingTask && existingTask.status !== TaskStatus.InProgress && existingTask.status !== TaskStatus.Blocked) {
14
- throw new CLIError(`Cannot block task ${taskId} (status: ${existingTask.status})\nHint: hzl task claim ${taskId} --assignee <name>`, ExitCode.InvalidInput);
14
+ throw new CLIError(`Cannot block task ${taskId} (status: ${existingTask.status})\nHint: hzl task claim ${taskId} --agent <name>`, ExitCode.InvalidInput);
15
15
  }
16
16
  const task = services.taskService.blockTask(taskId, { comment, author });
17
17
  const result = {
18
18
  task_id: task.task_id,
19
19
  title: task.title,
20
20
  status: task.status,
21
- assignee: task.assignee,
21
+ agent: task.agent,
22
22
  };
23
23
  if (json) {
24
24
  console.log(JSON.stringify(result));
@@ -1 +1 @@
1
- {"version":3,"file":"block.js","sourceRoot":"","sources":["../../../src/commands/task/block.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../../../src/commands/task/block.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAiB,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AActD,MAAM,UAAU,QAAQ,CAAC,OAMxB;IACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAE5D,gEAAgE;IAChE,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9D,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,UAAU,CAAC,UAAU,IAAI,YAAY,CAAC,MAAM,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;QAChH,MAAM,IAAI,QAAQ,CAChB,qBAAqB,MAAM,aAAa,YAAY,CAAC,MAAM,2BAA2B,MAAM,iBAAiB,EAC7G,QAAQ,CAAC,YAAY,CACtB,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzE,MAAM,MAAM,GAAgB;QAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7D,IAAI,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;SACxB,WAAW,CAAC,8DAA8D,CAAC;SAC3E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;SAC/B,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;SACvE,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC;SACxC,MAAM,CAAC,UAAyB,SAAiB,EAAE,IAAyB;QAC3E,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,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC9C,QAAQ,CAAC;gBACP,QAAQ;gBACR,MAAM;gBACN,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,KAAK;aAC/B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -30,9 +30,9 @@ describe('runBlock', () => {
30
30
  json: false,
31
31
  });
32
32
  expect(result.status).toBe('blocked');
33
- expect(result.assignee).toBe('agent-1');
33
+ expect(result.agent).toBe('agent-1');
34
34
  });
35
- it('preserves assignee when blocked', () => {
35
+ it('preserves agent when blocked', () => {
36
36
  const task = services.taskService.createTask({ title: 'Test', project: 'inbox' });
37
37
  services.taskService.setStatus(task.task_id, TaskStatus.Ready);
38
38
  services.taskService.claimTask(task.task_id, { author: 'agent-1' });
@@ -41,7 +41,7 @@ describe('runBlock', () => {
41
41
  taskId: task.task_id,
42
42
  json: false,
43
43
  });
44
- expect(result.assignee).toBe('agent-1');
44
+ expect(result.agent).toBe('agent-1');
45
45
  });
46
46
  });
47
47
  //# sourceMappingURL=block.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"block.test.js","sourceRoot":"","sources":["../../../src/commands/task/block.test.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAiB,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,OAAe,CAAC;IACpB,IAAI,MAAc,CAAC;IACnB,IAAI,QAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACpE,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACvC,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClB,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAClF,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/D,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,QAAQ,CAAC;YACtB,QAAQ;YACR,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,OAAO,EAAE,sBAAsB;YAC/B,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAClF,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/D,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,QAAQ,CAAC;YACtB,QAAQ;YACR,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"block.test.js","sourceRoot":"","sources":["../../../src/commands/task/block.test.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAiB,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,OAAe,CAAC;IACpB,IAAI,MAAc,CAAC;IACnB,IAAI,QAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACpE,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACvC,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClB,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAClF,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/D,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,QAAQ,CAAC;YACtB,QAAQ;YACR,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,OAAO,EAAE,sBAAsB;YAC/B,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAClF,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/D,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,QAAQ,CAAC;YACtB,QAAQ;YACR,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,19 +1,83 @@
1
1
  import { Command } from 'commander';
2
2
  import { type Services } from '../../db.js';
3
- export interface ClaimResult {
3
+ export type ClaimView = 'summary' | 'standard' | 'full';
4
+ export interface ClaimTaskView {
4
5
  task_id: string;
5
6
  title: string;
7
+ project: string;
6
8
  status: string;
7
- assignee: string | null;
9
+ priority: number;
10
+ parent_id: string | null;
11
+ agent: string | null;
12
+ due_at?: string | null;
13
+ tags?: string[];
14
+ lease_until?: string | null;
15
+ progress?: number | null;
16
+ claimed_at?: string | null;
17
+ description?: string | null;
18
+ links?: string[];
19
+ metadata?: Record<string, unknown>;
20
+ created_at?: string;
21
+ updated_at?: string;
22
+ }
23
+ interface DecisionAlternative {
24
+ task_id: string;
25
+ reason_code: string;
26
+ reason: string;
27
+ }
28
+ interface DecisionTrace {
29
+ version: 'v1';
30
+ mode: 'explicit' | 'next';
31
+ filters: {
32
+ project?: string;
33
+ tags?: string[];
34
+ parent?: string;
35
+ task_id?: string;
36
+ };
37
+ eligibility: {
38
+ status_ready_required: boolean;
39
+ dependencies_done_required: boolean;
40
+ leaf_only_required: boolean;
41
+ };
42
+ outcome: {
43
+ selected: boolean;
44
+ reason_code: string;
45
+ reason: string;
46
+ task_id?: string;
47
+ };
48
+ alternatives: DecisionAlternative[];
49
+ }
50
+ export interface ClaimResult {
51
+ task_id: string | null;
52
+ title: string | null;
53
+ status: string | null;
54
+ agent: string | null;
8
55
  lease_until: string | null;
56
+ task: ClaimTaskView | null;
57
+ decision_trace: DecisionTrace;
9
58
  }
59
+ export declare const DEFAULT_CLAIM_STAGGER_MS = 1000;
10
60
  export declare function runClaim(options: {
11
61
  services: Services;
12
62
  taskId: string;
13
- assignee?: string;
63
+ agent?: string;
64
+ agentId?: string;
65
+ leaseMinutes?: number;
66
+ view?: ClaimView;
67
+ json: boolean;
68
+ }): ClaimResult;
69
+ export declare function runClaimNext(options: {
70
+ services: Services;
71
+ project?: string;
72
+ tags?: string[];
73
+ parent?: string;
74
+ agent?: string;
14
75
  agentId?: string;
15
76
  leaseMinutes?: number;
77
+ view?: ClaimView;
16
78
  json: boolean;
17
79
  }): ClaimResult;
80
+ export declare function calculateClaimStaggerOffsetMs(agent: string, windowMs: number, nowMs: number): number;
18
81
  export declare function createClaimCommand(): Command;
82
+ export {};
19
83
  //# sourceMappingURL=claim.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../../src/commands/task/claim.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMnE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAQD,wBAAgB,QAAQ,CAAC,OAAO,EAAE;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,OAAO,CAAC;CACf,GAAG,WAAW,CAsCd;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CA2B5C"}
1
+ {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../../src/commands/task/claim.ts"],"names":[],"mappings":"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"}
@@ -1,63 +1,430 @@
1
1
  // packages/hzl-cli/src/commands/claim.ts
2
2
  import { Command } from 'commander';
3
- import { resolveDbPaths } from '../../config.js';
3
+ import { createHash } from 'crypto';
4
+ import { readConfig, resolveDbPaths } from '../../config.js';
4
5
  import { initializeDb, closeDb } from '../../db.js';
5
6
  import { CLIError, ExitCode, handleError } from '../../errors.js';
6
7
  import { GlobalOptionsSchema } from '../../types.js';
7
8
  import { resolveId } from '../../resolve-id.js';
8
9
  import { TaskStatus } from 'hzl-core/events/types.js';
10
+ import { DependenciesNotDoneError, TaskNotClaimableError, } from 'hzl-core/services/task-service.js';
11
+ export const DEFAULT_CLAIM_STAGGER_MS = 1000;
12
+ function shapeTaskForView(task, view) {
13
+ const base = {
14
+ task_id: task.task_id,
15
+ title: task.title,
16
+ project: task.project,
17
+ status: task.status,
18
+ priority: task.priority,
19
+ parent_id: task.parent_id,
20
+ agent: task.agent,
21
+ };
22
+ if (view === 'summary')
23
+ return base;
24
+ const standard = {
25
+ ...base,
26
+ due_at: task.due_at,
27
+ tags: task.tags,
28
+ lease_until: task.lease_until,
29
+ };
30
+ if (view === 'standard')
31
+ return standard;
32
+ return {
33
+ ...standard,
34
+ progress: task.progress,
35
+ claimed_at: task.claimed_at,
36
+ description: task.description,
37
+ links: task.links,
38
+ metadata: task.metadata,
39
+ created_at: task.created_at,
40
+ updated_at: task.updated_at,
41
+ };
42
+ }
43
+ function printClaimResult(result, json) {
44
+ if (json) {
45
+ console.log(JSON.stringify(result));
46
+ return;
47
+ }
48
+ if (!result.task_id) {
49
+ console.log('No tasks available');
50
+ return;
51
+ }
52
+ console.log(`✓ Claimed task ${result.task_id}: ${result.title}`);
53
+ if (result.lease_until) {
54
+ console.log(` Lease until: ${result.lease_until}`);
55
+ }
56
+ }
57
+ function buildTrace(options) {
58
+ return {
59
+ version: 'v1',
60
+ mode: options.mode,
61
+ filters: options.filters,
62
+ eligibility: {
63
+ status_ready_required: true,
64
+ dependencies_done_required: true,
65
+ leaf_only_required: options.leafOnly,
66
+ },
67
+ outcome: options.outcome,
68
+ alternatives: options.alternatives ?? [],
69
+ };
70
+ }
71
+ function getRankedNextCandidates(options) {
72
+ const { services, project, tags, parent } = options;
73
+ const db = services.cacheDb;
74
+ const where = ["tc.status != 'archived'"];
75
+ const params = [];
76
+ if (project) {
77
+ where.push('tc.project = ?');
78
+ params.push(project);
79
+ }
80
+ if (parent) {
81
+ where.push('tc.parent_id = ?');
82
+ params.push(parent);
83
+ }
84
+ if (tags && tags.length > 0) {
85
+ const placeholders = tags.map(() => '?').join(', ');
86
+ where.push(`(SELECT COUNT(DISTINCT tag) FROM task_tags WHERE task_id = tc.task_id AND tag IN (${placeholders})) = ?`);
87
+ params.push(...tags, tags.length);
88
+ }
89
+ const sql = `
90
+ SELECT
91
+ tc.task_id,
92
+ tc.status,
93
+ EXISTS (
94
+ SELECT 1
95
+ FROM task_dependencies td
96
+ JOIN tasks_current dep ON td.depends_on_id = dep.task_id
97
+ WHERE td.task_id = tc.task_id AND dep.status != 'done'
98
+ ) AS dependency_blocked,
99
+ EXISTS (
100
+ SELECT 1
101
+ FROM tasks_current child
102
+ WHERE child.parent_id = tc.task_id
103
+ ) AS has_children
104
+ FROM tasks_current tc
105
+ WHERE ${where.join(' AND ')}
106
+ ORDER BY tc.priority DESC, (tc.due_at IS NULL) ASC, tc.due_at ASC, tc.created_at ASC, tc.task_id ASC
107
+ `;
108
+ const rows = db.prepare(sql).all(...params);
109
+ const ranked = [];
110
+ for (const row of rows) {
111
+ const task = services.taskService.getTaskById(row.task_id);
112
+ if (!task)
113
+ continue;
114
+ if (row.status !== TaskStatus.Ready) {
115
+ ranked.push({
116
+ task,
117
+ reason_code: 'not_ready',
118
+ reason: `Task status is ${row.status}; requires ready`,
119
+ });
120
+ continue;
121
+ }
122
+ if (row.dependency_blocked) {
123
+ ranked.push({
124
+ task,
125
+ reason_code: 'dependency_blocked',
126
+ reason: 'Dependencies are not done',
127
+ });
128
+ continue;
129
+ }
130
+ if (row.has_children) {
131
+ ranked.push({
132
+ task,
133
+ reason_code: 'has_children',
134
+ reason: 'Task has children and is not auto-claim eligible',
135
+ });
136
+ continue;
137
+ }
138
+ ranked.push({
139
+ task,
140
+ reason_code: 'eligible',
141
+ reason: 'Eligible by status/dependencies/leaf filters',
142
+ });
143
+ }
144
+ return ranked;
145
+ }
9
146
  export function runClaim(options) {
10
- const { services, taskId, assignee, agentId, leaseMinutes, json } = options;
11
- // Check task status before claiming to provide actionable error
147
+ const { services, taskId, agent, agentId, leaseMinutes, view = 'standard', json } = options;
12
148
  const existingTask = services.taskService.getTaskById(taskId);
13
- if (existingTask && existingTask.status !== TaskStatus.Ready) {
14
- throw new CLIError(`Task ${taskId} is not claimable (status: ${existingTask.status})\nHint: hzl task set-status ${taskId} ready`, ExitCode.InvalidInput);
149
+ if (!existingTask) {
150
+ const trace = buildTrace({
151
+ mode: 'explicit',
152
+ filters: { task_id: taskId },
153
+ leafOnly: false,
154
+ outcome: {
155
+ selected: false,
156
+ reason_code: 'not_found',
157
+ reason: `Task not found: ${taskId}`,
158
+ },
159
+ });
160
+ throw new CLIError(`Task not found: ${taskId}`, ExitCode.NotFound, undefined, { decision_trace: trace });
161
+ }
162
+ if (existingTask.status !== TaskStatus.Ready) {
163
+ const trace = buildTrace({
164
+ mode: 'explicit',
165
+ filters: { task_id: taskId },
166
+ leafOnly: false,
167
+ outcome: {
168
+ selected: false,
169
+ reason_code: 'not_ready',
170
+ reason: `Task status is ${existingTask.status}; requires ready`,
171
+ task_id: taskId,
172
+ },
173
+ });
174
+ throw new CLIError(`Task ${taskId} is not claimable (status: ${existingTask.status})\nHint: hzl task set-status ${taskId} ready`, ExitCode.InvalidInput, undefined, { decision_trace: trace });
175
+ }
176
+ const blockers = services.taskService.getBlockingDependencies(taskId);
177
+ if (blockers.length > 0) {
178
+ const trace = buildTrace({
179
+ mode: 'explicit',
180
+ filters: { task_id: taskId },
181
+ leafOnly: false,
182
+ outcome: {
183
+ selected: false,
184
+ reason_code: 'dependency_blocked',
185
+ reason: `Dependencies are not done: ${blockers.join(', ')}`,
186
+ task_id: taskId,
187
+ },
188
+ alternatives: blockers.slice(0, 3).map((blockingTaskId) => ({
189
+ task_id: blockingTaskId,
190
+ reason_code: 'dependency_blocked',
191
+ reason: 'Blocking dependency is not done',
192
+ })),
193
+ });
194
+ throw new CLIError(`Task ${taskId} has dependencies not done: ${blockers.join(', ')}`, ExitCode.InvalidInput, undefined, { decision_trace: trace });
15
195
  }
16
196
  const leaseUntil = leaseMinutes ? new Date(Date.now() + leaseMinutes * 60000).toISOString() : undefined;
17
- const task = services.taskService.claimTask(taskId, {
18
- author: assignee, // assignee becomes author in the event for projection
19
- agent_id: agentId,
20
- lease_until: leaseUntil,
197
+ let task;
198
+ try {
199
+ task = services.taskService.claimTask(taskId, {
200
+ author: agent,
201
+ agent_id: agentId,
202
+ lease_until: leaseUntil,
203
+ });
204
+ }
205
+ catch (error) {
206
+ if (error instanceof TaskNotClaimableError || error instanceof DependenciesNotDoneError) {
207
+ const trace = buildTrace({
208
+ mode: 'explicit',
209
+ filters: { task_id: taskId },
210
+ leafOnly: false,
211
+ outcome: {
212
+ selected: false,
213
+ reason_code: 'claim_failed',
214
+ reason: error.message,
215
+ task_id: taskId,
216
+ },
217
+ });
218
+ throw new CLIError(error.message, ExitCode.InvalidInput, undefined, { decision_trace: trace });
219
+ }
220
+ throw error;
221
+ }
222
+ const decisionTrace = buildTrace({
223
+ mode: 'explicit',
224
+ filters: { task_id: task.task_id },
225
+ leafOnly: false,
226
+ outcome: {
227
+ selected: true,
228
+ reason_code: 'claimed',
229
+ reason: 'Task was claimed successfully',
230
+ task_id: task.task_id,
231
+ },
21
232
  });
22
233
  const result = {
23
234
  task_id: task.task_id,
24
235
  title: task.title,
25
236
  status: task.status,
26
- assignee: task.assignee,
237
+ agent: task.agent,
27
238
  lease_until: task.lease_until,
239
+ task: shapeTaskForView(task, view),
240
+ decision_trace: decisionTrace,
28
241
  };
29
- if (json) {
30
- console.log(JSON.stringify(result));
31
- }
32
- else {
33
- console.log(`✓ Claimed task ${task.task_id}: ${task.title}`);
34
- if (task.lease_until) {
35
- console.log(` Lease until: ${task.lease_until}`);
242
+ printClaimResult(result, json);
243
+ return result;
244
+ }
245
+ export function runClaimNext(options) {
246
+ const { services, project, tags, parent, agent, agentId, leaseMinutes, view = 'standard', json } = options;
247
+ if (parent) {
248
+ const parentTask = services.taskService.getTaskById(parent);
249
+ if (!parentTask) {
250
+ throw new CLIError(`Parent task not found: ${parent}`, ExitCode.NotFound);
36
251
  }
37
252
  }
253
+ const ranked = getRankedNextCandidates({ services, project, tags, parent });
254
+ const eligible = ranked.filter((candidate) => candidate.reason_code === 'eligible');
255
+ if (eligible.length === 0) {
256
+ const alternatives = ranked
257
+ .slice(0, 3)
258
+ .map((candidate) => ({
259
+ task_id: candidate.task.task_id,
260
+ reason_code: candidate.reason_code,
261
+ reason: candidate.reason,
262
+ }));
263
+ const result = {
264
+ task_id: null,
265
+ title: null,
266
+ status: null,
267
+ agent: null,
268
+ lease_until: null,
269
+ task: null,
270
+ decision_trace: buildTrace({
271
+ mode: 'next',
272
+ filters: {
273
+ ...(project ? { project } : {}),
274
+ ...(tags && tags.length > 0 ? { tags } : {}),
275
+ ...(parent ? { parent } : {}),
276
+ },
277
+ leafOnly: true,
278
+ outcome: {
279
+ selected: false,
280
+ reason_code: 'no_candidates',
281
+ reason: 'No eligible tasks matched filters',
282
+ },
283
+ alternatives,
284
+ }),
285
+ };
286
+ printClaimResult(result, json);
287
+ return result;
288
+ }
289
+ const selected = eligible[0].task;
290
+ const leaseUntil = leaseMinutes ? new Date(Date.now() + leaseMinutes * 60000).toISOString() : undefined;
291
+ let task;
292
+ try {
293
+ task = services.taskService.claimTask(selected.task_id, {
294
+ author: agent,
295
+ agent_id: agentId,
296
+ lease_until: leaseUntil,
297
+ });
298
+ }
299
+ catch (error) {
300
+ const trace = buildTrace({
301
+ mode: 'next',
302
+ filters: {
303
+ ...(project ? { project } : {}),
304
+ ...(tags && tags.length > 0 ? { tags } : {}),
305
+ ...(parent ? { parent } : {}),
306
+ },
307
+ leafOnly: true,
308
+ outcome: {
309
+ selected: false,
310
+ reason_code: 'claim_failed',
311
+ reason: error instanceof Error ? error.message : String(error),
312
+ task_id: selected.task_id,
313
+ },
314
+ alternatives: eligible.slice(1, 4).map((candidate) => ({
315
+ task_id: candidate.task.task_id,
316
+ reason_code: 'eligible',
317
+ reason: 'Eligible alternative candidate',
318
+ })),
319
+ });
320
+ throw new CLIError(`Failed to claim selected task ${selected.task_id}`, ExitCode.InvalidInput, undefined, { decision_trace: trace });
321
+ }
322
+ const result = {
323
+ task_id: task.task_id,
324
+ title: task.title,
325
+ status: task.status,
326
+ agent: task.agent,
327
+ lease_until: task.lease_until,
328
+ task: shapeTaskForView(task, view),
329
+ decision_trace: buildTrace({
330
+ mode: 'next',
331
+ filters: {
332
+ ...(project ? { project } : {}),
333
+ ...(tags && tags.length > 0 ? { tags } : {}),
334
+ ...(parent ? { parent } : {}),
335
+ },
336
+ leafOnly: true,
337
+ outcome: {
338
+ selected: true,
339
+ reason_code: 'claimed',
340
+ reason: 'Highest-ranked eligible task was claimed',
341
+ task_id: task.task_id,
342
+ },
343
+ alternatives: eligible.slice(1, 4).map((candidate) => ({
344
+ task_id: candidate.task.task_id,
345
+ reason_code: 'eligible',
346
+ reason: 'Eligible alternative candidate',
347
+ })),
348
+ }),
349
+ };
350
+ printClaimResult(result, json);
38
351
  return result;
39
352
  }
353
+ export function calculateClaimStaggerOffsetMs(agent, windowMs, nowMs) {
354
+ if (windowMs <= 0)
355
+ return 0;
356
+ const bucket = Math.floor(nowMs / windowMs);
357
+ const seed = `${agent}:${bucket}`;
358
+ const hash = createHash('sha256').update(seed).digest();
359
+ const value = hash.readUInt32BE(0);
360
+ return value % windowMs;
361
+ }
362
+ async function applyClaimStagger(options) {
363
+ const { enabled, agent, windowMs, nowMs = Date.now() } = options;
364
+ if (!enabled || !agent || windowMs <= 0)
365
+ return;
366
+ const delayMs = calculateClaimStaggerOffsetMs(agent, windowMs, nowMs);
367
+ if (delayMs <= 0)
368
+ return;
369
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
370
+ }
40
371
  export function createClaimCommand() {
41
372
  return new Command('claim')
42
373
  .description('Claim a task')
43
- .argument('<taskId>', 'Task ID')
44
- .option('--assignee <name>', 'Who to assign the task to')
374
+ .argument('[taskId]', 'Task ID')
375
+ .option('--next', 'Automatically claim the next eligible task')
376
+ .option('-P, --project <project>', 'Filter candidate tasks by project (with --next)')
377
+ .option('-t, --tags <tags>', 'Required tags for candidates, comma-separated (with --next)')
378
+ .option('--parent <taskId>', 'Claim next subtask under parent (with --next)')
379
+ .option('--agent <name>', 'Agent identity for task ownership')
45
380
  .option('--agent-id <id>', 'Agent ID (machine/AI identifier)')
46
381
  .option('-l, --lease <minutes>', 'Lease duration in minutes')
47
- .action(function (rawTaskId, opts) {
382
+ .option('--view <view>', 'Response view: summary | standard | full', 'standard')
383
+ .option('--no-stagger', 'Disable deterministic anti-herd delay for --next claims')
384
+ .action(async function (rawTaskId, opts) {
48
385
  const globalOpts = GlobalOptionsSchema.parse(this.optsWithGlobals());
49
386
  const { eventsDbPath, cacheDbPath } = resolveDbPaths(globalOpts.db);
50
387
  const services = initializeDb({ eventsDbPath, cacheDbPath });
51
388
  try {
52
- const taskId = resolveId(services, rawTaskId);
53
- runClaim({
54
- services,
55
- taskId,
56
- assignee: opts.assignee,
57
- agentId: opts.agentId,
58
- leaseMinutes: opts.lease ? parseInt(opts.lease, 10) : undefined,
59
- json: globalOpts.json ?? false,
60
- });
389
+ if (opts.next) {
390
+ if (rawTaskId) {
391
+ throw new CLIError('Cannot use <taskId> with --next', ExitCode.InvalidUsage);
392
+ }
393
+ const parent = opts.parent ? resolveId(services, opts.parent) : undefined;
394
+ const config = readConfig();
395
+ const staggerWindowMs = config.claimStaggerMs ?? DEFAULT_CLAIM_STAGGER_MS;
396
+ await applyClaimStagger({
397
+ enabled: opts.stagger !== false,
398
+ agent: opts.agent,
399
+ windowMs: staggerWindowMs,
400
+ });
401
+ runClaimNext({
402
+ services,
403
+ project: opts.project,
404
+ tags: opts.tags?.split(',').map((tag) => tag.trim()).filter(Boolean),
405
+ parent,
406
+ agent: opts.agent,
407
+ agentId: opts.agentId,
408
+ leaseMinutes: opts.lease ? parseInt(opts.lease, 10) : undefined,
409
+ view: opts.view ?? 'standard',
410
+ json: globalOpts.json ?? false,
411
+ });
412
+ }
413
+ else {
414
+ if (!rawTaskId) {
415
+ throw new CLIError('Task ID is required unless --next is specified', ExitCode.InvalidUsage);
416
+ }
417
+ const taskId = resolveId(services, rawTaskId);
418
+ runClaim({
419
+ services,
420
+ taskId,
421
+ agent: opts.agent,
422
+ agentId: opts.agentId,
423
+ leaseMinutes: opts.lease ? parseInt(opts.lease, 10) : undefined,
424
+ view: opts.view ?? 'standard',
425
+ json: globalOpts.json ?? false,
426
+ });
427
+ }
61
428
  }
62
429
  catch (e) {
63
430
  handleError(e, globalOpts.json);
@@ -1 +1 @@
1
- {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../../src/commands/task/claim.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../../src/commands/task/claim.ts"],"names":[],"mappings":"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"}