hzl-cli 1.7.6 → 1.8.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.
- package/README.md +53 -1
- package/dist/commands/serve.d.ts +3 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +251 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/serve.test.d.ts +2 -0
- package/dist/commands/serve.test.d.ts.map +1 -0
- package/dist/commands/serve.test.js +85 -0
- package/dist/commands/serve.test.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -97,7 +97,7 @@ flowchart LR
|
|
|
97
97
|
Agents[Agents + scripts] --> HZL
|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
-
|
|
100
|
+
HZL includes a basic [Kanban dashboard](#web-dashboard) for human visibility. For richer interfaces, build your own frontend using `hzl-core` directly—HZL stays the durable backend that both humans and agents can use.
|
|
101
101
|
|
|
102
102
|
---
|
|
103
103
|
|
|
@@ -405,8 +405,60 @@ hzl task show <id> --json # Task details (--json for scripti
|
|
|
405
405
|
hzl sync # Sync with cloud (if configured)
|
|
406
406
|
hzl status # Show database and sync state
|
|
407
407
|
hzl doctor # Health checks
|
|
408
|
+
|
|
409
|
+
# Web Dashboard
|
|
410
|
+
hzl serve # Start dashboard (network accessible)
|
|
411
|
+
hzl serve --port 8080 # Custom port
|
|
412
|
+
hzl serve --host 127.0.0.1 # Restrict to localhost only
|
|
413
|
+
hzl serve --background # Fork to background
|
|
414
|
+
hzl serve --stop # Stop background server
|
|
415
|
+
hzl serve --status # Check if running
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
---
|
|
419
|
+
|
|
420
|
+
## Web Dashboard
|
|
421
|
+
|
|
422
|
+
HZL includes a lightweight Kanban dashboard for monitoring tasks in near real-time.
|
|
423
|
+
|
|
424
|
+
```bash
|
|
425
|
+
hzl serve # Start on port 3456 (network accessible by default)
|
|
426
|
+
hzl serve --host 127.0.0.1 # Restrict to localhost only
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
Open `http://localhost:3456` to see:
|
|
430
|
+
|
|
431
|
+
- **Kanban board** with columns: Backlog → Blocked → Ready → In Progress → Done
|
|
432
|
+
- **Date filtering**: Today, Last 3d, 7d, 14d, 30d
|
|
433
|
+
- **Project filtering**: Focus on a single project
|
|
434
|
+
- **Task details**: Click any card to see description, comments, and checkpoints
|
|
435
|
+
- **Activity panel**: Recent status changes and events
|
|
436
|
+
- **Mobile support**: Tabs layout on smaller screens
|
|
437
|
+
|
|
438
|
+
The dashboard polls automatically (configurable 1-30s interval) and pauses when the tab is hidden.
|
|
439
|
+
|
|
440
|
+
### Background mode
|
|
441
|
+
|
|
442
|
+
Run the dashboard as a background process:
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
hzl serve --background # Fork to background, write PID
|
|
446
|
+
hzl serve --status # Check if running
|
|
447
|
+
hzl serve --stop # Stop the background server
|
|
408
448
|
```
|
|
409
449
|
|
|
450
|
+
### Running as a service (systemd)
|
|
451
|
+
|
|
452
|
+
For always-on access (e.g., on an OpenClaw box via Tailscale):
|
|
453
|
+
|
|
454
|
+
```bash
|
|
455
|
+
hzl serve --print-systemd > ~/.config/systemd/user/hzl-web.service
|
|
456
|
+
systemctl --user daemon-reload
|
|
457
|
+
systemctl --user enable --now hzl-web
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
The server binds to `0.0.0.0` by default, making it accessible over the network (including Tailscale). Use `--host 127.0.0.1` to restrict to localhost only.
|
|
461
|
+
|
|
410
462
|
---
|
|
411
463
|
|
|
412
464
|
## License
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkPpC,wBAAgB,kBAAkB,IAAI,OAAO,CA8C5C"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
// packages/hzl-cli/src/commands/serve.ts
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { spawn } from 'child_process';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import os from 'os';
|
|
7
|
+
import { resolveDbPaths, isDevMode } from '../config.js';
|
|
8
|
+
import { initializeDb, closeDb } from '../db.js';
|
|
9
|
+
import { handleError } from '../errors.js';
|
|
10
|
+
import { GlobalOptionsSchema } from '../types.js';
|
|
11
|
+
import { createWebServer } from 'hzl-web';
|
|
12
|
+
const DEFAULT_PORT = 3456;
|
|
13
|
+
// Get the directory for PID and log files
|
|
14
|
+
function getServePidDir() {
|
|
15
|
+
if (isDevMode()) {
|
|
16
|
+
// Dev mode: use project-local .local/hzl/
|
|
17
|
+
const cwd = process.cwd();
|
|
18
|
+
// Walk up to find monorepo root
|
|
19
|
+
let dir = cwd;
|
|
20
|
+
while (dir !== path.dirname(dir)) {
|
|
21
|
+
if (fs.existsSync(path.join(dir, 'packages', 'hzl-cli'))) {
|
|
22
|
+
return path.join(dir, '.local', 'hzl');
|
|
23
|
+
}
|
|
24
|
+
dir = path.dirname(dir);
|
|
25
|
+
}
|
|
26
|
+
return path.join(cwd, '.local', 'hzl');
|
|
27
|
+
}
|
|
28
|
+
// Production: use XDG data home
|
|
29
|
+
if (process.platform === 'win32') {
|
|
30
|
+
return path.join(process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local'), 'hzl');
|
|
31
|
+
}
|
|
32
|
+
return path.join(process.env.XDG_DATA_HOME || path.join(os.homedir(), '.local', 'share'), 'hzl');
|
|
33
|
+
}
|
|
34
|
+
function getPidPath() {
|
|
35
|
+
return path.join(getServePidDir(), 'serve.pid');
|
|
36
|
+
}
|
|
37
|
+
function getLogPath() {
|
|
38
|
+
return path.join(getServePidDir(), 'serve.log');
|
|
39
|
+
}
|
|
40
|
+
function ensureDir(dirPath) {
|
|
41
|
+
if (!fs.existsSync(dirPath)) {
|
|
42
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function isProcessRunning(pid) {
|
|
46
|
+
try {
|
|
47
|
+
process.kill(pid, 0);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function readPidFile() {
|
|
55
|
+
const pidPath = getPidPath();
|
|
56
|
+
if (!fs.existsSync(pidPath)) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const content = fs.readFileSync(pidPath, 'utf-8').trim();
|
|
61
|
+
const [pidStr, portStr] = content.split(':');
|
|
62
|
+
const pid = parseInt(pidStr, 10);
|
|
63
|
+
const port = parseInt(portStr, 10) || DEFAULT_PORT;
|
|
64
|
+
if (isNaN(pid))
|
|
65
|
+
return null;
|
|
66
|
+
if (!isProcessRunning(pid)) {
|
|
67
|
+
// Stale PID file, remove it
|
|
68
|
+
fs.unlinkSync(pidPath);
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return { pid, port };
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function writePidFile(pid, port) {
|
|
78
|
+
const pidPath = getPidPath();
|
|
79
|
+
ensureDir(path.dirname(pidPath));
|
|
80
|
+
fs.writeFileSync(pidPath, `${pid}:${port}`);
|
|
81
|
+
}
|
|
82
|
+
function removePidFile() {
|
|
83
|
+
const pidPath = getPidPath();
|
|
84
|
+
if (fs.existsSync(pidPath)) {
|
|
85
|
+
fs.unlinkSync(pidPath);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function printSystemdUnit(port, host) {
|
|
89
|
+
// Find the hzl binary path
|
|
90
|
+
const hzlPath = process.argv[1].replace(/\.js$/, '');
|
|
91
|
+
const unit = `[Unit]
|
|
92
|
+
Description=hzl task dashboard
|
|
93
|
+
After=network.target
|
|
94
|
+
|
|
95
|
+
[Service]
|
|
96
|
+
Type=simple
|
|
97
|
+
ExecStart=${hzlPath} serve --port ${port} --host ${host}
|
|
98
|
+
Restart=on-failure
|
|
99
|
+
RestartSec=5
|
|
100
|
+
|
|
101
|
+
[Install]
|
|
102
|
+
WantedBy=default.target
|
|
103
|
+
`;
|
|
104
|
+
console.log(unit);
|
|
105
|
+
console.log('# Install with:');
|
|
106
|
+
console.log('# hzl serve --print-systemd > ~/.config/systemd/user/hzl-web.service');
|
|
107
|
+
console.log('# systemctl --user daemon-reload');
|
|
108
|
+
console.log('# systemctl --user enable --now hzl-web');
|
|
109
|
+
if (host === '127.0.0.1') {
|
|
110
|
+
console.log('#');
|
|
111
|
+
console.log('# Note: Remove --host 127.0.0.1 to allow network/Tailscale access');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function runStatus() {
|
|
115
|
+
const info = readPidFile();
|
|
116
|
+
if (info) {
|
|
117
|
+
console.log(`hzl dashboard is running`);
|
|
118
|
+
console.log(` PID: ${info.pid}`);
|
|
119
|
+
console.log(` URL: http://localhost:${info.port}`);
|
|
120
|
+
console.log(` Log: ${getLogPath()}`);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
console.log('hzl dashboard is not running');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function runStop() {
|
|
127
|
+
const info = readPidFile();
|
|
128
|
+
if (!info) {
|
|
129
|
+
console.log('hzl dashboard is not running');
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
process.kill(info.pid, 'SIGTERM');
|
|
134
|
+
removePidFile();
|
|
135
|
+
console.log(`hzl dashboard stopped (PID: ${info.pid})`);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
console.error(`Failed to stop process: ${String(error)}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function runBackground(port, host, dbOption) {
|
|
142
|
+
const existing = readPidFile();
|
|
143
|
+
if (existing) {
|
|
144
|
+
console.log(`hzl dashboard is already running on port ${existing.port} (PID: ${existing.pid})`);
|
|
145
|
+
console.log(`Run 'hzl serve --stop' to stop it first`);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const logPath = getLogPath();
|
|
149
|
+
ensureDir(path.dirname(logPath));
|
|
150
|
+
// Build args for child process
|
|
151
|
+
const args = ['serve', '--port', String(port), '--host', host];
|
|
152
|
+
if (dbOption) {
|
|
153
|
+
args.unshift('--db', dbOption);
|
|
154
|
+
}
|
|
155
|
+
// Spawn detached process
|
|
156
|
+
const out = fs.openSync(logPath, 'a');
|
|
157
|
+
const err = fs.openSync(logPath, 'a');
|
|
158
|
+
const child = spawn(process.execPath, [process.argv[1], ...args], {
|
|
159
|
+
detached: true,
|
|
160
|
+
stdio: ['ignore', out, err],
|
|
161
|
+
env: { ...process.env, HZL_SERVE_BACKGROUND: '1' },
|
|
162
|
+
});
|
|
163
|
+
child.unref();
|
|
164
|
+
// Write PID file
|
|
165
|
+
writePidFile(child.pid, port);
|
|
166
|
+
console.log('hzl dashboard started in background');
|
|
167
|
+
console.log(` URL: http://localhost:${port}`);
|
|
168
|
+
console.log(` PID: ${child.pid}`);
|
|
169
|
+
console.log(` Log: ${logPath}`);
|
|
170
|
+
console.log('');
|
|
171
|
+
console.log(`Run 'hzl serve --stop' to stop`);
|
|
172
|
+
}
|
|
173
|
+
async function runForeground(port, host, dbOption) {
|
|
174
|
+
const { eventsDbPath, cacheDbPath } = resolveDbPaths(dbOption);
|
|
175
|
+
const services = initializeDb({ eventsDbPath, cacheDbPath });
|
|
176
|
+
const server = createWebServer({
|
|
177
|
+
port,
|
|
178
|
+
host,
|
|
179
|
+
taskService: services.taskService,
|
|
180
|
+
eventStore: services.eventStore,
|
|
181
|
+
});
|
|
182
|
+
// Write PID file for --status to detect
|
|
183
|
+
writePidFile(process.pid, port);
|
|
184
|
+
const devIndicator = isDevMode() ? ' (dev mode)' : '';
|
|
185
|
+
console.log(`hzl dashboard running at ${server.url}${devIndicator}`);
|
|
186
|
+
if (host === '0.0.0.0') {
|
|
187
|
+
console.log(`Listening on 0.0.0.0:${port} (accessible from network/Tailscale)`);
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
console.log(`Listening on ${host}:${port} (localhost only - omit --host for network access)`);
|
|
191
|
+
}
|
|
192
|
+
console.log('Press Ctrl+C to stop');
|
|
193
|
+
// Handle shutdown
|
|
194
|
+
const shutdown = async () => {
|
|
195
|
+
console.log('\nShutting down...');
|
|
196
|
+
removePidFile();
|
|
197
|
+
await server.close();
|
|
198
|
+
closeDb(services);
|
|
199
|
+
process.exit(0);
|
|
200
|
+
};
|
|
201
|
+
process.on('SIGINT', () => void shutdown());
|
|
202
|
+
process.on('SIGTERM', () => void shutdown());
|
|
203
|
+
// Keep process alive
|
|
204
|
+
await new Promise(() => { });
|
|
205
|
+
}
|
|
206
|
+
const DEFAULT_HOST = '0.0.0.0';
|
|
207
|
+
export function createServeCommand() {
|
|
208
|
+
return new Command('serve')
|
|
209
|
+
.description('Start the web dashboard server')
|
|
210
|
+
.option('-p, --port <port>', `Port to listen on (default: ${DEFAULT_PORT})`)
|
|
211
|
+
.option('-H, --host <host>', `Host to bind to (default: ${DEFAULT_HOST} for network/Tailscale, use 127.0.0.1 for localhost only)`)
|
|
212
|
+
.option('-b, --background', 'Run in background')
|
|
213
|
+
.option('--stop', 'Stop the background server')
|
|
214
|
+
.option('--status', 'Check if server is running')
|
|
215
|
+
.option('--print-systemd', 'Print systemd unit file')
|
|
216
|
+
.action(async function (opts) {
|
|
217
|
+
const globalOpts = GlobalOptionsSchema.parse(this.optsWithGlobals());
|
|
218
|
+
const port = parseInt(opts.port ?? String(DEFAULT_PORT), 10);
|
|
219
|
+
const host = opts.host ?? DEFAULT_HOST;
|
|
220
|
+
try {
|
|
221
|
+
if (opts.printSystemd) {
|
|
222
|
+
printSystemdUnit(port, host);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
if (opts.status) {
|
|
226
|
+
runStatus();
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (opts.stop) {
|
|
230
|
+
runStop();
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (opts.background) {
|
|
234
|
+
// Don't re-fork if we're already the background process
|
|
235
|
+
if (process.env.HZL_SERVE_BACKGROUND === '1') {
|
|
236
|
+
await runForeground(port, host, globalOpts.db);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
runBackground(port, host, globalOpts.db);
|
|
240
|
+
}
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
// Default: foreground mode
|
|
244
|
+
await runForeground(port, host, globalOpts.db);
|
|
245
|
+
}
|
|
246
|
+
catch (e) {
|
|
247
|
+
handleError(e, globalOpts.json);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.test.d.ts","sourceRoot":"","sources":["../../src/commands/serve.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// packages/hzl-cli/src/commands/serve.test.ts
|
|
2
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
3
|
+
import { createServeCommand } from './serve.js';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import os from 'os';
|
|
7
|
+
describe('hzl serve command', () => {
|
|
8
|
+
const testDir = path.join(os.tmpdir(), `serve-test-${Date.now()}`);
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
fs.mkdirSync(testDir, { recursive: true });
|
|
11
|
+
});
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
fs.rmSync(testDir, { recursive: true, force: true });
|
|
14
|
+
});
|
|
15
|
+
describe('createServeCommand', () => {
|
|
16
|
+
it('creates a command with correct name', () => {
|
|
17
|
+
const cmd = createServeCommand();
|
|
18
|
+
expect(cmd.name()).toBe('serve');
|
|
19
|
+
});
|
|
20
|
+
it('has port option', () => {
|
|
21
|
+
const cmd = createServeCommand();
|
|
22
|
+
const portOpt = cmd.options.find((o) => o.long === '--port');
|
|
23
|
+
expect(portOpt).toBeDefined();
|
|
24
|
+
});
|
|
25
|
+
it('has host option', () => {
|
|
26
|
+
const cmd = createServeCommand();
|
|
27
|
+
const hostOpt = cmd.options.find((o) => o.long === '--host');
|
|
28
|
+
expect(hostOpt).toBeDefined();
|
|
29
|
+
});
|
|
30
|
+
it('has background option', () => {
|
|
31
|
+
const cmd = createServeCommand();
|
|
32
|
+
const bgOpt = cmd.options.find((o) => o.long === '--background');
|
|
33
|
+
expect(bgOpt).toBeDefined();
|
|
34
|
+
});
|
|
35
|
+
it('has stop option', () => {
|
|
36
|
+
const cmd = createServeCommand();
|
|
37
|
+
const stopOpt = cmd.options.find((o) => o.long === '--stop');
|
|
38
|
+
expect(stopOpt).toBeDefined();
|
|
39
|
+
});
|
|
40
|
+
it('has status option', () => {
|
|
41
|
+
const cmd = createServeCommand();
|
|
42
|
+
const statusOpt = cmd.options.find((o) => o.long === '--status');
|
|
43
|
+
expect(statusOpt).toBeDefined();
|
|
44
|
+
});
|
|
45
|
+
it('has print-systemd option', () => {
|
|
46
|
+
const cmd = createServeCommand();
|
|
47
|
+
const systemdOpt = cmd.options.find((o) => o.long === '--print-systemd');
|
|
48
|
+
expect(systemdOpt).toBeDefined();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('systemd unit generation', () => {
|
|
52
|
+
it('generates valid systemd unit', async () => {
|
|
53
|
+
const cmd = createServeCommand();
|
|
54
|
+
const output = [];
|
|
55
|
+
const originalLog = console.log;
|
|
56
|
+
console.log = (msg) => output.push(msg);
|
|
57
|
+
try {
|
|
58
|
+
// Parse just to trigger the action - we need to mock the action
|
|
59
|
+
// For now, just verify the command structure
|
|
60
|
+
expect(cmd.options.find((o) => o.long === '--print-systemd')).toBeDefined();
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
console.log = originalLog;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('default values', () => {
|
|
68
|
+
it('uses port 3456 by default', () => {
|
|
69
|
+
const cmd = createServeCommand();
|
|
70
|
+
const portOpt = cmd.options.find((o) => o.long === '--port');
|
|
71
|
+
expect(portOpt?.description).toContain('3456');
|
|
72
|
+
});
|
|
73
|
+
it('uses 0.0.0.0 by default for network/Tailscale access', () => {
|
|
74
|
+
const cmd = createServeCommand();
|
|
75
|
+
const hostOpt = cmd.options.find((o) => o.long === '--host');
|
|
76
|
+
expect(hostOpt?.description).toContain('0.0.0.0');
|
|
77
|
+
});
|
|
78
|
+
it('documents 127.0.0.1 for localhost-only access', () => {
|
|
79
|
+
const cmd = createServeCommand();
|
|
80
|
+
const hostOpt = cmd.options.find((o) => o.long === '--host');
|
|
81
|
+
expect(hostOpt?.description).toContain('127.0.0.1');
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=serve.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.test.js","sourceRoot":"","sources":["../../src/commands/serve.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjF,wBAAgB,aAAa,IAAI,OAAO,CA0BvC;AAED,wBAAsB,GAAG,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtE;AAED,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,GACX,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,7 @@ import { createStatusCommand } from './commands/status.js';
|
|
|
16
16
|
import { createDoctorCommand } from './commands/doctor.js';
|
|
17
17
|
import { createLockCommand } from './commands/lock.js';
|
|
18
18
|
import { createSampleProjectCommand } from './commands/sample-project.js';
|
|
19
|
+
import { createServeCommand } from './commands/serve.js';
|
|
19
20
|
import { CLIError, ExitCode } from './errors.js';
|
|
20
21
|
import { resolveDbPaths, readConfig } from './config.js';
|
|
21
22
|
import { formatOutput, printSuccess, printError, printTable } from './output.js';
|
|
@@ -40,6 +41,7 @@ export function createProgram() {
|
|
|
40
41
|
program.addCommand(createStatusCommand());
|
|
41
42
|
program.addCommand(createDoctorCommand());
|
|
42
43
|
program.addCommand(createLockCommand());
|
|
44
|
+
program.addCommand(createServeCommand());
|
|
43
45
|
return program;
|
|
44
46
|
}
|
|
45
47
|
export async function run(argv = process.argv) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,iDAAiD;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjF,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,KAAK,CAAC;SACX,WAAW,CAAC,6DAA6D,CAAC;SAC1E,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;SACpB,MAAM,CAAC,aAAa,EAAE,uBAAuB,CAAC;SAC9C,MAAM,CAAC,QAAQ,EAAE,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAEpD,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,yBAAyB,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,UAAU,CAAC,0BAA0B,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hzl-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"description": "CLI for HZL - A shared task ledger for OpenClaw and poly-agent workflows.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -38,7 +38,8 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"libsql": "^0.5.0",
|
|
40
40
|
"commander": "^14.0.0",
|
|
41
|
-
"hzl-core": "^1.
|
|
41
|
+
"hzl-core": "^1.8.1",
|
|
42
|
+
"hzl-web": "^1.7.6",
|
|
42
43
|
"zod": "^3.23.8"
|
|
43
44
|
},
|
|
44
45
|
"devDependencies": {
|