hzl-cli 1.34.1 → 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.
- package/README.md +29 -4
- package/dist/commands/dep/index.d.ts +3 -0
- package/dist/commands/dep/index.d.ts.map +1 -0
- package/dist/commands/dep/index.js +8 -0
- package/dist/commands/dep/index.js.map +1 -0
- package/dist/commands/dep/list.d.ts +38 -0
- package/dist/commands/dep/list.d.ts.map +1 -0
- package/dist/commands/dep/list.js +156 -0
- package/dist/commands/dep/list.js.map +1 -0
- package/dist/commands/dep/list.test.d.ts +2 -0
- package/dist/commands/dep/list.test.d.ts.map +1 -0
- package/dist/commands/dep/list.test.js +171 -0
- package/dist/commands/dep/list.test.js.map +1 -0
- package/dist/commands/guide-content.d.ts +1 -1
- package/dist/commands/guide-content.d.ts.map +1 -1
- package/dist/commands/guide-content.js +41 -71
- package/dist/commands/guide-content.js.map +1 -1
- package/dist/commands/hook.d.ts +11 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +61 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/hook.test.d.ts +2 -0
- package/dist/commands/hook.test.d.ts.map +1 -0
- package/dist/commands/hook.test.js +80 -0
- package/dist/commands/hook.test.js.map +1 -0
- package/dist/commands/task/add-dep.d.ts.map +1 -1
- package/dist/commands/task/add-dep.js +10 -2
- package/dist/commands/task/add-dep.js.map +1 -1
- package/dist/commands/task/add-dep.test.js +24 -1
- package/dist/commands/task/add-dep.test.js.map +1 -1
- package/dist/commands/task/move.test.js +2 -1
- package/dist/commands/task/move.test.js.map +1 -1
- package/dist/commands/task/remove-dep.test.js +2 -1
- package/dist/commands/task/remove-dep.test.js.map +1 -1
- package/dist/commands/task/show.d.ts +2 -1
- package/dist/commands/task/show.d.ts.map +1 -1
- package/dist/commands/task/show.js +12 -13
- package/dist/commands/task/show.js.map +1 -1
- package/dist/commands/task/update.test.js +2 -1
- package/dist/commands/task/update.test.js.map +1 -1
- package/dist/commands/workflow/index.d.ts +3 -0
- package/dist/commands/workflow/index.d.ts.map +1 -0
- package/dist/commands/workflow/index.js +12 -0
- package/dist/commands/workflow/index.js.map +1 -0
- package/dist/commands/workflow/index.test.d.ts +2 -0
- package/dist/commands/workflow/index.test.d.ts.map +1 -0
- package/dist/commands/workflow/index.test.js +35 -0
- package/dist/commands/workflow/index.test.js.map +1 -0
- package/dist/commands/workflow/list.d.ts +14 -0
- package/dist/commands/workflow/list.d.ts.map +1 -0
- package/dist/commands/workflow/list.js +41 -0
- package/dist/commands/workflow/list.js.map +1 -0
- package/dist/commands/workflow/run.d.ts +45 -0
- package/dist/commands/workflow/run.d.ts.map +1 -0
- package/dist/commands/workflow/run.js +247 -0
- package/dist/commands/workflow/run.js.map +1 -0
- package/dist/commands/workflow/run.test.d.ts +2 -0
- package/dist/commands/workflow/run.test.d.ts.map +1 -0
- package/dist/commands/workflow/run.test.js +100 -0
- package/dist/commands/workflow/run.test.js.map +1 -0
- package/dist/commands/workflow/show.d.ts +24 -0
- package/dist/commands/workflow/show.d.ts.map +1 -0
- package/dist/commands/workflow/show.js +62 -0
- package/dist/commands/workflow/show.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -1
- package/dist/config.js.map +1 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +3 -1
- package/dist/db.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- 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
|
-
##
|
|
5
|
+
## Shared Task Ledger for OpenClaw
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
- [
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
|
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,
|
|
1
|
+
{"version":3,"file":"guide-content.d.ts","sourceRoot":"","sources":["../../src/commands/guide-content.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,6rDAsEH,CAAC"}
|