hzl-cli 2.0.0 → 2.1.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 (76) hide show
  1. package/README.md +29 -4
  2. package/dist/commands/dep/index.d.ts +3 -0
  3. package/dist/commands/dep/index.d.ts.map +1 -0
  4. package/dist/commands/dep/index.js +8 -0
  5. package/dist/commands/dep/index.js.map +1 -0
  6. package/dist/commands/dep/list.d.ts +38 -0
  7. package/dist/commands/dep/list.d.ts.map +1 -0
  8. package/dist/commands/dep/list.js +156 -0
  9. package/dist/commands/dep/list.js.map +1 -0
  10. package/dist/commands/dep/list.test.d.ts +2 -0
  11. package/dist/commands/dep/list.test.d.ts.map +1 -0
  12. package/dist/commands/dep/list.test.js +171 -0
  13. package/dist/commands/dep/list.test.js.map +1 -0
  14. package/dist/commands/guide-content.d.ts +1 -1
  15. package/dist/commands/guide-content.d.ts.map +1 -1
  16. package/dist/commands/guide-content.js +41 -71
  17. package/dist/commands/guide-content.js.map +1 -1
  18. package/dist/commands/hook.d.ts +11 -0
  19. package/dist/commands/hook.d.ts.map +1 -0
  20. package/dist/commands/hook.js +61 -0
  21. package/dist/commands/hook.js.map +1 -0
  22. package/dist/commands/hook.test.d.ts +2 -0
  23. package/dist/commands/hook.test.d.ts.map +1 -0
  24. package/dist/commands/hook.test.js +80 -0
  25. package/dist/commands/hook.test.js.map +1 -0
  26. package/dist/commands/task/add-dep.d.ts.map +1 -1
  27. package/dist/commands/task/add-dep.js +10 -2
  28. package/dist/commands/task/add-dep.js.map +1 -1
  29. package/dist/commands/task/add-dep.test.js +24 -1
  30. package/dist/commands/task/add-dep.test.js.map +1 -1
  31. package/dist/commands/task/move.test.js +2 -1
  32. package/dist/commands/task/move.test.js.map +1 -1
  33. package/dist/commands/task/remove-dep.test.js +2 -1
  34. package/dist/commands/task/remove-dep.test.js.map +1 -1
  35. package/dist/commands/task/show.d.ts +2 -1
  36. package/dist/commands/task/show.d.ts.map +1 -1
  37. package/dist/commands/task/show.js +12 -13
  38. package/dist/commands/task/show.js.map +1 -1
  39. package/dist/commands/task/update.test.js +2 -1
  40. package/dist/commands/task/update.test.js.map +1 -1
  41. package/dist/commands/workflow/index.d.ts +3 -0
  42. package/dist/commands/workflow/index.d.ts.map +1 -0
  43. package/dist/commands/workflow/index.js +12 -0
  44. package/dist/commands/workflow/index.js.map +1 -0
  45. package/dist/commands/workflow/index.test.d.ts +2 -0
  46. package/dist/commands/workflow/index.test.d.ts.map +1 -0
  47. package/dist/commands/workflow/index.test.js +35 -0
  48. package/dist/commands/workflow/index.test.js.map +1 -0
  49. package/dist/commands/workflow/list.d.ts +14 -0
  50. package/dist/commands/workflow/list.d.ts.map +1 -0
  51. package/dist/commands/workflow/list.js +41 -0
  52. package/dist/commands/workflow/list.js.map +1 -0
  53. package/dist/commands/workflow/run.d.ts +45 -0
  54. package/dist/commands/workflow/run.d.ts.map +1 -0
  55. package/dist/commands/workflow/run.js +247 -0
  56. package/dist/commands/workflow/run.js.map +1 -0
  57. package/dist/commands/workflow/run.test.d.ts +2 -0
  58. package/dist/commands/workflow/run.test.d.ts.map +1 -0
  59. package/dist/commands/workflow/run.test.js +100 -0
  60. package/dist/commands/workflow/run.test.js.map +1 -0
  61. package/dist/commands/workflow/show.d.ts +24 -0
  62. package/dist/commands/workflow/show.d.ts.map +1 -0
  63. package/dist/commands/workflow/show.js +62 -0
  64. package/dist/commands/workflow/show.js.map +1 -0
  65. package/dist/config.d.ts.map +1 -1
  66. package/dist/config.js +10 -1
  67. package/dist/config.js.map +1 -1
  68. package/dist/db.d.ts.map +1 -1
  69. package/dist/db.js +3 -1
  70. package/dist/db.js.map +1 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +6 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/types.d.ts +6 -0
  75. package/dist/types.d.ts.map +1 -1
  76. package/package.json +3 -3
package/README.md CHANGED
@@ -2,9 +2,15 @@
2
2
 
3
3
  <img src="./assets/hzl.png" alt="HZL mascot" width="320" />
4
4
 
5
- ## The Missing Task Layer for OpenClaw
5
+ ## Shared Task Ledger for OpenClaw
6
6
 
7
- Coordinate many agents through shared, durable task state with built-in human visibility.
7
+ HZL is a durable shared task ledger for OpenClaw and other multi-agent systems.
8
+
9
+ Each agent wake is a fresh session. HZL preserves continuity across those wakes so agents can:
10
+ - resume in-progress work safely,
11
+ - hand off with durable context,
12
+ - coordinate through shared project pools,
13
+ - and recover from stalled sessions.
8
14
 
9
15
  ## Install
10
16
 
@@ -23,13 +29,32 @@ brew install hzl
23
29
  hzl init
24
30
  ```
25
31
 
32
+ ## Stateless Agent Loop (Quick Example)
33
+
34
+ ```bash
35
+ # 1) Session start: resume existing work or claim next
36
+ hzl workflow run start --agent clara --project writing
37
+
38
+ # 2) Record durable progress while working
39
+ hzl task checkpoint <task-id> "Draft complete, revising CTA section"
40
+
41
+ # 3) Handoff to a project pool (unassigned follow-on)
42
+ hzl workflow run handoff \
43
+ --from <task-id> \
44
+ --title "Schedule approved copy" \
45
+ --project marketing
46
+
47
+ # 4) Host runtime drains completion hooks on a schedule
48
+ hzl hook drain
49
+ ```
50
+
26
51
  ## Documentation
27
52
 
28
53
  - [Get Started](https://www.hzl-tasks.com/getting-started/)
29
- - [OpenClaw Setup](https://www.hzl-tasks.com/getting-started/openclaw/)
54
+ - [Workflows](https://www.hzl-tasks.com/workflows/)
55
+ - [Installation & OpenClaw Setup](https://www.hzl-tasks.com/getting-started/installation/)
30
56
  - [CLI Reference](https://www.hzl-tasks.com/reference/cli/)
31
57
  - [Concepts](https://www.hzl-tasks.com/concepts/)
32
- - [Workflows](https://www.hzl-tasks.com/workflows/)
33
58
 
34
59
  Local preview:
35
60
 
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createDepCommand(): Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/dep/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,gBAAgB,IAAI,OAAO,CAI1C"}
@@ -0,0 +1,8 @@
1
+ import { Command } from 'commander';
2
+ import { createDepListCommand } from './list.js';
3
+ export function createDepCommand() {
4
+ const command = new Command('dep').description('Dependency commands');
5
+ command.addCommand(createDepListCommand());
6
+ return command;
7
+ }
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/dep/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,UAAU,gBAAgB;IAC9B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IACtE,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { Command } from 'commander';
2
+ import { TaskStatus } from 'hzl-core/events/types.js';
3
+ import { type Services } from '../../db.js';
4
+ export interface DependencyListItem {
5
+ from_task_id: string;
6
+ to_task_id: string;
7
+ from_title: string | null;
8
+ to_title: string | null;
9
+ from_project: string | null;
10
+ to_project: string | null;
11
+ from_agent: string | null;
12
+ to_agent: string | null;
13
+ from_status: TaskStatus | null;
14
+ to_status: TaskStatus | null;
15
+ cross_project: boolean;
16
+ blocking: boolean;
17
+ missing_from: boolean;
18
+ missing_to: boolean;
19
+ }
20
+ export interface DepListResult {
21
+ dependencies: DependencyListItem[];
22
+ total: number;
23
+ }
24
+ export interface DepListOptions {
25
+ services: Services;
26
+ project?: string;
27
+ fromProject?: string;
28
+ toProject?: string;
29
+ agent?: string;
30
+ fromAgent?: string;
31
+ toAgent?: string;
32
+ blockingOnly?: boolean;
33
+ crossProjectOnly?: boolean;
34
+ json: boolean;
35
+ }
36
+ export declare function runDepList(options: DepListOptions): DepListResult;
37
+ export declare function createDepListCommand(): Command;
38
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/dep/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAKnE,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC;CACf;AAsFD,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CAuFjE;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAkC9C"}
@@ -0,0 +1,156 @@
1
+ import { Command } from 'commander';
2
+ import { TaskStatus } from 'hzl-core/events/types.js';
3
+ import { resolveDbPaths } from '../../config.js';
4
+ import { initializeDb, closeDb } from '../../db.js';
5
+ import { handleError } from '../../errors.js';
6
+ import { createShortId } from '../../short-id.js';
7
+ import { GlobalOptionsSchema } from '../../types.js';
8
+ function escapeMd(value) {
9
+ return value.replace(/\|/g, '\\|').replace(/\n/g, ' ');
10
+ }
11
+ function formatTaskCell(shortId, taskId, title, project) {
12
+ const resolvedTitle = title ?? '[missing task]';
13
+ const resolvedProject = project ?? 'missing';
14
+ return `[${shortId(taskId)}] ${resolvedTitle} (${resolvedProject})`;
15
+ }
16
+ function toDependencyItem(row) {
17
+ const missingFrom = row.from_project === null;
18
+ const missingTo = row.to_project === null;
19
+ const crossProject = row.from_project !== null &&
20
+ row.to_project !== null &&
21
+ row.from_project !== row.to_project;
22
+ const fromCanBeBlocked = row.from_status === TaskStatus.Ready ||
23
+ row.from_status === TaskStatus.InProgress ||
24
+ row.from_status === TaskStatus.Blocked;
25
+ const toIsDone = row.to_status === TaskStatus.Done;
26
+ const blocking = fromCanBeBlocked && !toIsDone;
27
+ return {
28
+ ...row,
29
+ cross_project: crossProject,
30
+ blocking,
31
+ missing_from: missingFrom,
32
+ missing_to: missingTo,
33
+ };
34
+ }
35
+ function printMarkdown(items) {
36
+ if (items.length === 0) {
37
+ console.log('No dependencies found');
38
+ return;
39
+ }
40
+ const shortId = createShortId(items.flatMap((item) => [item.from_task_id, item.to_task_id]));
41
+ console.log('| From | To | Blocking | Cross-Project | Agents |');
42
+ console.log('| --- | --- | --- | --- | --- |');
43
+ for (const item of items) {
44
+ const fromCell = escapeMd(formatTaskCell(shortId, item.from_task_id, item.from_title, item.from_project));
45
+ const toCell = escapeMd(formatTaskCell(shortId, item.to_task_id, item.to_title, item.to_project));
46
+ const agents = escapeMd(`${item.from_agent ?? 'unassigned'} -> ${item.to_agent ?? 'unassigned'}`);
47
+ console.log(`| ${fromCell} | ${toCell} | ${item.blocking ? 'yes' : 'no'} | ${item.cross_project ? 'yes' : 'no'} | ${agents} |`);
48
+ }
49
+ }
50
+ export function runDepList(options) {
51
+ const { services, project, fromProject, toProject, agent, fromAgent, toAgent, blockingOnly, crossProjectOnly, json, } = options;
52
+ const where = [];
53
+ const params = [];
54
+ if (project) {
55
+ where.push('(ft.project = ? OR tt.project = ?)');
56
+ params.push(project, project);
57
+ }
58
+ if (fromProject) {
59
+ where.push('ft.project = ?');
60
+ params.push(fromProject);
61
+ }
62
+ if (toProject) {
63
+ where.push('tt.project = ?');
64
+ params.push(toProject);
65
+ }
66
+ if (agent) {
67
+ where.push('(ft.agent = ? OR tt.agent = ?)');
68
+ params.push(agent, agent);
69
+ }
70
+ if (fromAgent) {
71
+ where.push('ft.agent = ?');
72
+ params.push(fromAgent);
73
+ }
74
+ if (toAgent) {
75
+ where.push('tt.agent = ?');
76
+ params.push(toAgent);
77
+ }
78
+ if (blockingOnly) {
79
+ where.push("ft.status IN ('ready', 'in_progress', 'blocked')");
80
+ where.push("(tt.task_id IS NULL OR tt.status != 'done')");
81
+ }
82
+ if (crossProjectOnly) {
83
+ where.push('ft.project IS NOT NULL');
84
+ where.push('tt.project IS NOT NULL');
85
+ where.push('ft.project != tt.project');
86
+ }
87
+ const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : '';
88
+ const rows = services.cacheDb.prepare(`
89
+ SELECT
90
+ d.task_id AS from_task_id,
91
+ d.depends_on_id AS to_task_id,
92
+ ft.title AS from_title,
93
+ tt.title AS to_title,
94
+ ft.project AS from_project,
95
+ tt.project AS to_project,
96
+ ft.agent AS from_agent,
97
+ tt.agent AS to_agent,
98
+ ft.status AS from_status,
99
+ tt.status AS to_status
100
+ FROM task_dependencies d
101
+ LEFT JOIN tasks_current ft ON ft.task_id = d.task_id
102
+ LEFT JOIN tasks_current tt ON tt.task_id = d.depends_on_id
103
+ ${whereClause}
104
+ ORDER BY COALESCE(ft.project, ''), COALESCE(tt.project, ''), d.task_id, d.depends_on_id
105
+ `).all(...params);
106
+ const dependencies = rows.map(toDependencyItem);
107
+ const result = {
108
+ dependencies,
109
+ total: dependencies.length,
110
+ };
111
+ if (json) {
112
+ console.log(JSON.stringify(result));
113
+ }
114
+ else {
115
+ printMarkdown(dependencies);
116
+ }
117
+ return result;
118
+ }
119
+ export function createDepListCommand() {
120
+ return new Command('list')
121
+ .description('List dependency edges')
122
+ .option('-P, --project <project>', 'Filter edges where either side is in this project')
123
+ .option('--from-project <project>', 'Filter by dependent task project')
124
+ .option('--to-project <project>', 'Filter by dependency task project')
125
+ .option('--agent <agent>', 'Filter edges where either side is assigned to this agent')
126
+ .option('--from-agent <agent>', 'Filter by dependent task agent')
127
+ .option('--to-agent <agent>', 'Filter by dependency task agent')
128
+ .option('--blocking-only', 'Show only currently blocking dependencies', false)
129
+ .option('--cross-project-only', 'Show only cross-project dependencies', false)
130
+ .action(function (opts) {
131
+ const globalOpts = GlobalOptionsSchema.parse(this.optsWithGlobals());
132
+ const { eventsDbPath, cacheDbPath } = resolveDbPaths(globalOpts.db);
133
+ const services = initializeDb({ eventsDbPath, cacheDbPath });
134
+ try {
135
+ runDepList({
136
+ services,
137
+ project: opts.project,
138
+ fromProject: opts.fromProject,
139
+ toProject: opts.toProject,
140
+ agent: opts.agent,
141
+ fromAgent: opts.fromAgent,
142
+ toAgent: opts.toAgent,
143
+ blockingOnly: opts.blockingOnly,
144
+ crossProjectOnly: opts.crossProjectOnly,
145
+ json: globalOpts.json ?? false,
146
+ });
147
+ }
148
+ catch (error) {
149
+ handleError(error, globalOpts.json);
150
+ }
151
+ finally {
152
+ closeDb(services);
153
+ }
154
+ });
155
+ }
156
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/dep/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=list.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../../src/commands/dep/list.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,171 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import { TaskStatus } from 'hzl-core/events/types.js';
6
+ import { initializeDbFromPath, closeDb } from '../../db.js';
7
+ import { runDepList } from './list.js';
8
+ describe('runDepList', () => {
9
+ let tempDir;
10
+ let dbPath;
11
+ let services;
12
+ beforeEach(() => {
13
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'hzl-dep-list-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('lists dependency edges and marks missing targets safely', () => {
22
+ const dep = services.taskService.createTask({ title: 'Dep', project: 'inbox' });
23
+ const dependent = services.taskService.createTask({
24
+ title: 'Dependent',
25
+ project: 'inbox',
26
+ depends_on: [dep.task_id],
27
+ });
28
+ services.taskService.setStatus(dependent.task_id, TaskStatus.Ready);
29
+ services.taskService.createTask({
30
+ title: 'Orphan edge',
31
+ project: 'inbox',
32
+ depends_on: ['missing-task-id'],
33
+ });
34
+ const result = runDepList({ services, json: false });
35
+ expect(result.total).toBe(2);
36
+ const existing = result.dependencies.find((d) => d.to_task_id === dep.task_id);
37
+ expect(existing?.missing_to).toBe(false);
38
+ const missing = result.dependencies.find((d) => d.to_task_id === 'missing-task-id');
39
+ expect(missing?.missing_to).toBe(true);
40
+ expect(missing?.blocking).toBe(false); // source task still backlog
41
+ });
42
+ it('filters by project for either side of edge', () => {
43
+ services.projectService.createProject('alpha');
44
+ services.projectService.createProject('beta');
45
+ const depAlpha = services.taskService.createTask({ title: 'Dep Alpha', project: 'alpha' });
46
+ services.taskService.createTask({
47
+ title: 'From Beta',
48
+ project: 'beta',
49
+ depends_on: [depAlpha.task_id],
50
+ });
51
+ const resultAlpha = runDepList({ services, project: 'alpha', json: false });
52
+ const resultBeta = runDepList({ services, project: 'beta', json: false });
53
+ expect(resultAlpha.total).toBe(1);
54
+ expect(resultBeta.total).toBe(1);
55
+ });
56
+ it('filters by from-project and to-project', () => {
57
+ services.projectService.createProject('alpha');
58
+ services.projectService.createProject('beta');
59
+ const depAlpha = services.taskService.createTask({ title: 'Dep Alpha', project: 'alpha' });
60
+ services.taskService.createTask({
61
+ title: 'From Beta',
62
+ project: 'beta',
63
+ depends_on: [depAlpha.task_id],
64
+ });
65
+ const depBeta = services.taskService.createTask({ title: 'Dep Beta', project: 'beta' });
66
+ services.taskService.createTask({
67
+ title: 'From Beta 2',
68
+ project: 'beta',
69
+ depends_on: [depBeta.task_id],
70
+ });
71
+ const result = runDepList({
72
+ services,
73
+ fromProject: 'beta',
74
+ toProject: 'alpha',
75
+ json: false,
76
+ });
77
+ expect(result.total).toBe(1);
78
+ expect(result.dependencies[0].from_project).toBe('beta');
79
+ expect(result.dependencies[0].to_project).toBe('alpha');
80
+ });
81
+ it('filters by agent, from-agent, and to-agent', () => {
82
+ const toMatch = services.taskService.createTask({
83
+ title: 'Dep Match',
84
+ project: 'inbox',
85
+ agent: 'to-agent',
86
+ });
87
+ const toOther = services.taskService.createTask({
88
+ title: 'Dep Other',
89
+ project: 'inbox',
90
+ agent: 'to-other',
91
+ });
92
+ const fromMatch = services.taskService.createTask({
93
+ title: 'From Match',
94
+ project: 'inbox',
95
+ depends_on: [toMatch.task_id],
96
+ agent: 'from-agent',
97
+ });
98
+ const fromOther = services.taskService.createTask({
99
+ title: 'From Other',
100
+ project: 'inbox',
101
+ depends_on: [toOther.task_id],
102
+ agent: 'from-other',
103
+ });
104
+ const fromAgent = runDepList({ services, fromAgent: 'from-agent', json: false });
105
+ const toAgent = runDepList({ services, toAgent: 'to-agent', json: false });
106
+ const eitherFrom = runDepList({ services, agent: 'from-agent', json: false });
107
+ const eitherTo = runDepList({ services, agent: 'to-agent', json: false });
108
+ expect(fromAgent.total).toBe(1);
109
+ expect(toAgent.total).toBe(1);
110
+ expect(eitherFrom.total).toBe(1);
111
+ expect(eitherTo.total).toBe(1);
112
+ });
113
+ it('supports blocking-only filter', () => {
114
+ const blocker = services.taskService.createTask({ title: 'Blocker', project: 'inbox' });
115
+ const blocked = services.taskService.createTask({
116
+ title: 'Blocked',
117
+ project: 'inbox',
118
+ depends_on: [blocker.task_id],
119
+ });
120
+ services.taskService.setStatus(blocked.task_id, TaskStatus.Ready);
121
+ const doneDep = services.taskService.createTask({ title: 'Done dep', project: 'inbox' });
122
+ services.taskService.setStatus(doneDep.task_id, TaskStatus.Ready);
123
+ services.taskService.claimTask(doneDep.task_id);
124
+ services.taskService.completeTask(doneDep.task_id);
125
+ const unblocked = services.taskService.createTask({
126
+ title: 'Unblocked',
127
+ project: 'inbox',
128
+ depends_on: [doneDep.task_id],
129
+ });
130
+ services.taskService.setStatus(unblocked.task_id, TaskStatus.Ready);
131
+ const orphan = services.taskService.createTask({
132
+ title: 'Orphan',
133
+ project: 'inbox',
134
+ depends_on: ['missing-for-blocking'],
135
+ });
136
+ services.taskService.setStatus(orphan.task_id, TaskStatus.Ready);
137
+ const pausedParent = services.taskService.createTask({
138
+ title: 'Paused Parent',
139
+ project: 'inbox',
140
+ depends_on: [blocker.task_id],
141
+ });
142
+ services.taskService.setStatus(pausedParent.task_id, TaskStatus.Blocked);
143
+ const result = runDepList({ services, blockingOnly: true, json: false });
144
+ const edgePairs = result.dependencies.map((d) => `${d.from_task_id}->${d.to_task_id}`).sort();
145
+ expect(edgePairs).toEqual([
146
+ `${blocked.task_id}->${blocker.task_id}`,
147
+ `${orphan.task_id}->missing-for-blocking`,
148
+ `${pausedParent.task_id}->${blocker.task_id}`,
149
+ ].sort());
150
+ });
151
+ it('supports cross-project-only filter', () => {
152
+ services.projectService.createProject('alpha');
153
+ services.projectService.createProject('beta');
154
+ const depAlpha = services.taskService.createTask({ title: 'Dep Alpha', project: 'alpha' });
155
+ services.taskService.createTask({
156
+ title: 'From Beta',
157
+ project: 'beta',
158
+ depends_on: [depAlpha.task_id],
159
+ });
160
+ const depBeta = services.taskService.createTask({ title: 'Dep Beta', project: 'beta' });
161
+ services.taskService.createTask({
162
+ title: 'From Beta 2',
163
+ project: 'beta',
164
+ depends_on: [depBeta.task_id],
165
+ });
166
+ const result = runDepList({ services, crossProjectOnly: true, json: false });
167
+ expect(result.total).toBe(1);
168
+ expect(result.dependencies[0].cross_project).toBe(true);
169
+ });
170
+ });
171
+ //# sourceMappingURL=list.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.js","sourceRoot":"","sources":["../../../src/commands/dep/list.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const GUIDE_CONTENT = "### HZL task ledger (agent instructions)\n\nUse this guide to operate HZL as the shared task ledger for agents on one machine/OpenClaw instance.\n\n**Use HZL when:**\n- Work has multiple steps or may not finish this session\n- You need durable ownership, progress, or handoff state\n- One agent needs help from another agent\n- You need visibility/auditability for ongoing agent work\n\n**Skip HZL when:**\n- The work is tiny and can be completed immediately\n- A one-off answer does not need durable tracking\n\n**Rule of thumb:** If work could span sessions or involve multiple agents, use HZL.\n\n---\n\n**Primary orientation:**\n- HZL is agent-first: agents create, claim, hand off, and complete tasks.\n- Humans typically steer and observe; they can also create/update tasks when needed.\n- Projects are optional scopes. Use `inbox` when you do not need scoping.\n\n**Structure:**\n- **Project (optional)** = shared scope/domain (e.g., `research`, `writing`, `api-service`).\n- **Task** = unit of work.\n- **Subtask** = breakdown (`--parent <id>`), max depth 1.\n- **Agent** = ownership identity (`--agent`).\n\n---\n\n**Setup / scope selection:**\n```bash\nhzl project list # Check existing scopes\nhzl project create research # Optional: create scope only if useful\n```\n\n**Create work:**\n```bash\n# Unscoped/global queue (inbox)\nhzl task add \"Triage failing tests\" -s ready\n\n# Scoped queue\nhzl task add \"Summarize benchmark paper\" -P research -s ready\n\n# Delegate directly to another agent\nhzl task add \"Draft release notes\" -P writing -s ready --agent writer-1 --author main-agent\n```\n\n**Claim work:**\n```bash\n# Replace <agent-name> with this agent's identity (for example: lobster, clara, researcher-1)\n\n# Let HZL pick next eligible task\nhzl task claim --next --agent <agent-name>\nhzl task claim --next -P research --agent <agent-name>\n\n# Claim specific task by ID (after reasoning over candidates)\nhzl task claim <id> --agent <agent-name>\n```\n\n**Inspect candidate work:**\n```bash\nhzl task list --available --view summary\nhzl task list -P research --available --view summary\nhzl task list --agent-pattern 'writer*' --view summary\n```\n\n**Record progress / blockers:**\n```bash\nhzl task checkpoint <id> \"completed first pass, next: validate edge cases\"\nhzl task progress <id> 60\nhzl task block <id> --comment \"Waiting for dependency decision\"\nhzl task unblock <id>\n```\n\n**Complete / hand off:**\n```bash\nhzl task comment <id> \"handoff: implementation done, needs review\"\nhzl task complete <id>\n```\n\n---\n\n**Recovery for stuck tasks (leases):**\n```bash\nhzl task claim --next -P research --agent researcher-1 --lease 60\nhzl task stuck\nhzl task steal <id> --if-expired --agent researcher-2\n```\n\n**Troubleshooting quick hits:**\n| Error | Fix |\n|-------|-----|\n| \"not claimable (status: backlog)\" | `hzl task set-status <id> ready` |\n| \"Cannot complete: status is X\" | Claim first: `hzl task claim <id> --agent <name>` |\n\n---\n\n**DESTRUCTIVE - Never run without explicit user request:**\n- `hzl task prune` \u2014 **PERMANENTLY DELETES** old done/archived tasks. No undo.";
1
+ export declare const GUIDE_CONTENT = "### HZL task ledger (agent instructions)\n\nUse HZL as durable task state when work can span sessions or agents.\n\n**Use HZL when:**\n- Work has multiple steps or risk\n- You need resumable progress and ownership\n- You are delegating or handing off work\n- You need human-auditable state\n\n**Skip HZL when:**\n- Work is tiny and can be finished immediately\n\n---\n\n## Workflow-first loop\n\n```bash\n# 1) Session start: resume existing in-progress work or claim next\nhzl workflow run start --agent <agent-name> --project <project>\n\n# 2) Progress updates\nhzl task checkpoint <id> \"what changed and what is next\"\nhzl task progress <id> 60\n\n# 3) Complete, handoff, or delegate\nhzl task complete <id>\n# or\nhzl workflow run handoff --from <id> --title \"<follow-on>\" --project <project>\n# or\nhzl workflow run delegate --from <id> --title \"<delegated>\" --project <project> --pause-parent\n```\n\n## Key commands\n\n```bash\nhzl project list\nhzl workflow list\nhzl workflow show start\nhzl dep list --blocking-only\nhzl hook drain\n```\n\n## Routing model\n\n- Use projects as role pools.\n- Omit `--agent` to create pool-routed tasks.\n- Use `--agent` only when assignment must be explicit.\n\n## Recovery model\n\n```bash\nhzl task stuck\nhzl task steal <id> --if-expired --agent <agent-name>\n```\n\n## Hook delivery model\n\n- Transition to `done` enqueues callbacks.\n- Host scheduler must run `hzl hook drain` (recommended every 1-5 minutes).\n\n## Safety notes\n\n- `task complete` is a command; `done` is a status.\n- `workflow run start` intentionally does not support `--auto-op-id`.\n\n---\n\n**DESTRUCTIVE - Never run without explicit user request:**\n- `hzl task prune`\n- `hzl init --force`";
2
2
  //# sourceMappingURL=guide-content.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"guide-content.d.ts","sourceRoot":"","sources":["../../src/commands/guide-content.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,ymGAoGuD,CAAC"}
1
+ {"version":3,"file":"guide-content.d.ts","sourceRoot":"","sources":["../../src/commands/guide-content.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,6rDAsEH,CAAC"}