hzl-cli 1.15.0 → 1.16.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 CHANGED
@@ -402,6 +402,10 @@ Built-in task tracking (if available) is fine for single-session work you'll com
402
402
  - `hzl task unblock <id>` (return to in_progress)
403
403
  - `hzl task complete <id>`
404
404
  - `hzl task next --project <project>` (returns next available; never returns parent tasks)
405
+
406
+ **⚠️ DESTRUCTIVE - Never run without explicit user request:**
407
+ - `hzl task prune` — **PERMANENTLY DELETES** old done/archived tasks. No undo.
408
+ - **AI agents: NEVER run prune unless the user explicitly asks to delete old tasks**
405
409
  ```
406
410
  <!-- END [code:md] docs/snippets/agent-policy.md -->
407
411
 
@@ -568,14 +572,21 @@ hzl task show <id> # Shows subtasks inline
568
572
  hzl task archive <id> --cascade # Archive parent and all subtasks
569
573
  hzl task archive <id> --orphan # Archive parent, promote subtasks
570
574
 
575
+ # Cleanup
576
+ hzl task prune --project <project> --older-than 30d # Preview tasks eligible for deletion
577
+ hzl task prune --project <project> --older-than 30d --dry-run # Preview without deleting
578
+ hzl task prune --project <project> --older-than 30d --yes # Permanently delete (no confirmation)
579
+ hzl task prune --all --older-than 30d --yes # Prune all projects
580
+
571
581
  # Diagnostics
572
582
  hzl sync # Sync with cloud (if configured)
573
583
  hzl status # Show database and sync state
574
584
  hzl doctor # Health checks
575
585
 
576
- # ⚠️ DESTRUCTIVE - deletes all data
577
- hzl init --force # Prompts for confirmation before deleting
578
- hzl init --force --yes # Deletes WITHOUT confirmation (dangerous)
586
+ # ⚠️ DESTRUCTIVE - permanent deletion
587
+ hzl task prune --project <project> --older-than 30d --yes # Permanently deletes old tasks
588
+ hzl init --force # Prompts for confirmation before deleting all data
589
+ hzl init --force --yes # Deletes all data WITHOUT confirmation (dangerous)
579
590
 
580
591
  # Web Dashboard
581
592
  hzl serve # Start dashboard (network accessible)
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/task/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,wBAAgB,iBAAiB,IAAI,OAAO,CA4B3C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/task/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BpC,wBAAgB,iBAAiB,IAAI,OAAO,CA6B3C"}
@@ -22,6 +22,7 @@ import { createNextCommand } from './next.js';
22
22
  import { createBlockCommand } from './block.js';
23
23
  import { createUnblockCommand } from './unblock.js';
24
24
  import { createProgressCommand } from './progress.js';
25
+ import { createPruneCommand } from './prune.js';
25
26
  export function createTaskCommand() {
26
27
  const command = new Command('task').description('Task management commands');
27
28
  command.addCommand(createAddCommand());
@@ -47,6 +48,7 @@ export function createTaskCommand() {
47
48
  command.addCommand(createBlockCommand());
48
49
  command.addCommand(createUnblockCommand());
49
50
  command.addCommand(createProgressCommand());
51
+ command.addCommand(createPruneCommand());
50
52
  return command;
51
53
  }
52
54
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/task/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/task/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Command } from 'commander';
2
+ import { type Services } from '../../db.js';
3
+ import type { PruneResult } from 'hzl-core/services/task-service.js';
4
+ export declare function runPrune(options: {
5
+ services: Services;
6
+ project?: string;
7
+ olderThanDays: number;
8
+ asOf?: string;
9
+ yes?: boolean;
10
+ dryRun?: boolean;
11
+ json: boolean;
12
+ }): PruneResult | null;
13
+ export declare function createPruneCommand(): Command;
14
+ //# sourceMappingURL=prune.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../../src/commands/task/prune.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AA0DrE,wBAAgB,QAAQ,CAAC,OAAO,EAAE;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf,GAAG,WAAW,GAAG,IAAI,CA6GrB;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAsC5C"}
@@ -0,0 +1,168 @@
1
+ // packages/hzl-cli/src/commands/task/prune.ts
2
+ import { Command } from 'commander';
3
+ import { resolveDbPaths } from '../../config.js';
4
+ import { initializeDb, closeDb } from '../../db.js';
5
+ import { handleError, CLIError, ExitCode } from '../../errors.js';
6
+ import { GlobalOptionsSchema } from '../../types.js';
7
+ function parseOlderThan(olderThanStr) {
8
+ const match = olderThanStr.match(/^(\d+)d$/);
9
+ if (!match) {
10
+ throw new CLIError('Invalid --older-than format. Use Nd (e.g., 30d for 30 days)', ExitCode.InvalidUsage);
11
+ }
12
+ const days = parseInt(match[1], 10);
13
+ if (days < 1) {
14
+ throw new CLIError('--older-than must be at least 1d', ExitCode.InvalidUsage);
15
+ }
16
+ return days;
17
+ }
18
+ function validateScope(opts) {
19
+ if (!opts.project && !opts.all) {
20
+ throw new CLIError('Must specify --project <name> or --all', ExitCode.InvalidUsage);
21
+ }
22
+ if (opts.project && opts.all) {
23
+ throw new CLIError('Cannot specify both --project and --all', ExitCode.InvalidUsage);
24
+ }
25
+ }
26
+ function parseAsOf(asOfStr) {
27
+ const ts = Date.parse(asOfStr);
28
+ if (Number.isNaN(ts)) {
29
+ throw new CLIError('Invalid --as-of timestamp. Use ISO 8601 (e.g., 2026-02-03T12:00:00Z)', ExitCode.InvalidUsage);
30
+ }
31
+ return new Date(ts).toISOString();
32
+ }
33
+ export function runPrune(options) {
34
+ const { services, project, olderThanDays, asOf, yes, dryRun, json } = options;
35
+ try {
36
+ // Get eligible tasks
37
+ const eligible = services.taskService.previewPrunableTasks({
38
+ project,
39
+ olderThanDays,
40
+ asOf,
41
+ });
42
+ // Validation: JSON requires --yes (unless dry-run)
43
+ if (json && !yes && !dryRun) {
44
+ throw new CLIError('Cannot use --json without --yes for destructive operations', ExitCode.InvalidUsage);
45
+ }
46
+ // Handle dry-run (no deletion)
47
+ if (dryRun) {
48
+ if (json) {
49
+ console.log(JSON.stringify({ wouldPrune: eligible, count: eligible.length }, null, 2));
50
+ }
51
+ else {
52
+ if (eligible.length === 0) {
53
+ console.log('No tasks eligible for pruning');
54
+ }
55
+ else {
56
+ console.log(`Would prune ${eligible.length} task(s):`);
57
+ for (const t of eligible.slice(0, 20)) {
58
+ console.log(` [${t.task_id.slice(0, 8)}] ${t.title} (${t.project})`);
59
+ }
60
+ if (eligible.length > 20) {
61
+ console.log(` ... and ${eligible.length - 20} more`);
62
+ }
63
+ }
64
+ }
65
+ return null; // Don't return a result for dry-run
66
+ }
67
+ // If no eligible tasks, return early
68
+ if (eligible.length === 0) {
69
+ if (!json) {
70
+ console.log('No tasks eligible for pruning');
71
+ }
72
+ return {
73
+ pruned: [],
74
+ count: 0,
75
+ eventsDeleted: 0,
76
+ };
77
+ }
78
+ // Require --yes for destructive operations
79
+ // Show preview and require explicit confirmation
80
+ if (!yes) {
81
+ console.log(`Found ${eligible.length} task(s) eligible for pruning:`);
82
+ for (const t of eligible.slice(0, 10)) {
83
+ console.log(` [${t.task_id.slice(0, 8)}] ${t.title} (${t.project})`);
84
+ }
85
+ if (eligible.length > 10) {
86
+ console.log(` ... and ${eligible.length - 10} more`);
87
+ }
88
+ console.log('');
89
+ console.log('To permanently delete these tasks, run again with --yes');
90
+ return null;
91
+ }
92
+ // Actually prune
93
+ const result = services.taskService.pruneEligible({
94
+ project,
95
+ olderThanDays,
96
+ asOf,
97
+ });
98
+ if (json) {
99
+ console.log(JSON.stringify({
100
+ pruned: result.pruned.map(t => ({
101
+ task_id: t.task_id,
102
+ title: t.title,
103
+ project: t.project,
104
+ status: t.status,
105
+ })),
106
+ count: result.count,
107
+ eventsDeleted: result.eventsDeleted,
108
+ }, null, 2));
109
+ }
110
+ else {
111
+ console.log(`Pruned ${result.count} task(s) (${result.eventsDeleted} events deleted)`);
112
+ }
113
+ return result;
114
+ }
115
+ catch (error) {
116
+ if (error instanceof CLIError) {
117
+ throw error;
118
+ }
119
+ if (error instanceof Error) {
120
+ if (error.message.includes('not found')) {
121
+ throw new CLIError(error.message, ExitCode.NotFound);
122
+ }
123
+ if (error.message.includes('Invalid') || error.message.includes('Must')) {
124
+ throw new CLIError(error.message, ExitCode.InvalidUsage);
125
+ }
126
+ }
127
+ throw error;
128
+ }
129
+ }
130
+ export function createPruneCommand() {
131
+ return new Command('prune')
132
+ .description('Permanently delete old tasks in terminal states')
133
+ .option('-P, --project <name>', 'Prune tasks in specific project')
134
+ .option('-A, --all', 'Prune tasks in all projects')
135
+ .option('--older-than <duration>', 'Age threshold (e.g., 30d)', '30d')
136
+ .option('--as-of <timestamp>', 'Evaluate age threshold as of a fixed time (ISO)')
137
+ .option('-y, --yes', 'Skip confirmation prompt (required for non-interactive use)')
138
+ .option('--dry-run', 'Preview what would be pruned without deleting')
139
+ .action(function (opts) {
140
+ const globalOpts = GlobalOptionsSchema.parse(this.optsWithGlobals());
141
+ try {
142
+ // Validate options
143
+ validateScope(opts);
144
+ const olderThanDays = parseOlderThan(opts.olderThan || '30d');
145
+ const asOf = opts.asOf ? parseAsOf(opts.asOf) : undefined;
146
+ const { eventsDbPath, cacheDbPath } = resolveDbPaths(globalOpts.db);
147
+ const services = initializeDb({ eventsDbPath, cacheDbPath });
148
+ try {
149
+ runPrune({
150
+ services,
151
+ project: opts.project,
152
+ olderThanDays,
153
+ asOf,
154
+ yes: opts.yes,
155
+ dryRun: opts.dryRun,
156
+ json: globalOpts.json ?? false,
157
+ });
158
+ }
159
+ finally {
160
+ closeDb(services);
161
+ }
162
+ }
163
+ catch (e) {
164
+ handleError(e, GlobalOptionsSchema.parse(this.optsWithGlobals()).json);
165
+ }
166
+ });
167
+ }
168
+ //# sourceMappingURL=prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../src/commands/task/prune.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prune.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.test.d.ts","sourceRoot":"","sources":["../../../src/commands/task/prune.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,348 @@
1
+ // packages/hzl-cli/src/commands/task/prune.test.ts
2
+ import { describe, it, expect, beforeEach } from 'vitest';
3
+ import { TaskStatus } from 'hzl-core/events/types.js';
4
+ import { initializeDbFromPath } from '../../db.js';
5
+ import { runPrune } from './prune.js';
6
+ import os from 'os';
7
+ import path from 'path';
8
+ // Helper to create a timestamp in the future for asOf parameter.
9
+ // This is needed because pruning uses `terminal_at < threshold` (strict less-than),
10
+ // so tasks completed "now" aren't eligible when threshold is also "now".
11
+ // By setting asOf to the future, we make recently completed tasks eligible.
12
+ function futureTimestamp(daysFromNow = 1) {
13
+ const future = new Date(Date.now() + daysFromNow * 24 * 60 * 60 * 1000);
14
+ return future.toISOString();
15
+ }
16
+ describe('task prune command', () => {
17
+ let dbPath;
18
+ let services;
19
+ beforeEach(() => {
20
+ const tmpDir = path.join(os.tmpdir(), `hzl-prune-test-${Date.now()}`);
21
+ dbPath = path.join(tmpDir, 'test.db');
22
+ services = initializeDbFromPath(dbPath);
23
+ });
24
+ describe('pruning with --yes', () => {
25
+ it('returns empty result when no tasks exist', () => {
26
+ const result = runPrune({
27
+ services,
28
+ project: 'inbox',
29
+ olderThanDays: 30,
30
+ yes: true,
31
+ json: false,
32
+ });
33
+ expect(result).toEqual({
34
+ pruned: [],
35
+ count: 0,
36
+ eventsDeleted: 0,
37
+ });
38
+ });
39
+ it('prunes only tasks from specified project', () => {
40
+ // Create projects first
41
+ services.projectService.createProject('project-a');
42
+ services.projectService.createProject('project-b');
43
+ const taskA = services.taskService.createTask({
44
+ title: 'Project A task',
45
+ project: 'project-a',
46
+ });
47
+ const taskB = services.taskService.createTask({
48
+ title: 'Project B task',
49
+ project: 'project-b',
50
+ });
51
+ services.taskService.setStatus(taskA.task_id, TaskStatus.Ready);
52
+ services.taskService.setStatus(taskB.task_id, TaskStatus.Ready);
53
+ services.taskService.claimTask(taskA.task_id);
54
+ services.taskService.claimTask(taskB.task_id);
55
+ services.taskService.completeTask(taskA.task_id);
56
+ services.taskService.completeTask(taskB.task_id);
57
+ // Prune only project-a with --yes
58
+ // Use asOf in the future to make recently completed tasks eligible
59
+ const result = runPrune({
60
+ services,
61
+ project: 'project-a',
62
+ olderThanDays: 0,
63
+ asOf: futureTimestamp(),
64
+ yes: true,
65
+ json: false,
66
+ });
67
+ // Should have pruned exactly 1 task from project-a
68
+ expect(result).not.toBeNull();
69
+ expect(result.count).toBe(1);
70
+ expect(result.pruned.every(t => t.project === 'project-a')).toBe(true);
71
+ // project-b task should still exist
72
+ const taskBAfter = services.taskService.getTaskById(taskB.task_id);
73
+ expect(taskBAfter).not.toBeNull();
74
+ expect(taskBAfter.project).toBe('project-b');
75
+ });
76
+ it('prunes tasks in done status', () => {
77
+ const task = services.taskService.createTask({
78
+ title: 'Done task',
79
+ project: 'inbox',
80
+ });
81
+ services.taskService.setStatus(task.task_id, TaskStatus.Ready);
82
+ services.taskService.claimTask(task.task_id);
83
+ services.taskService.completeTask(task.task_id);
84
+ const result = runPrune({
85
+ services,
86
+ project: 'inbox',
87
+ olderThanDays: 0,
88
+ asOf: futureTimestamp(),
89
+ yes: true,
90
+ json: false,
91
+ });
92
+ expect(result).not.toBeNull();
93
+ expect(result.count).toBe(1);
94
+ expect(result.pruned[0].status).toBe('done');
95
+ // Task should be gone
96
+ expect(services.taskService.getTaskById(task.task_id)).toBeNull();
97
+ });
98
+ it('prunes tasks in archived status', () => {
99
+ const task = services.taskService.createTask({
100
+ title: 'Archived task',
101
+ project: 'inbox',
102
+ });
103
+ services.taskService.setStatus(task.task_id, TaskStatus.Ready);
104
+ services.taskService.archiveTask(task.task_id);
105
+ const result = runPrune({
106
+ services,
107
+ project: 'inbox',
108
+ olderThanDays: 0,
109
+ asOf: futureTimestamp(),
110
+ yes: true,
111
+ json: false,
112
+ });
113
+ expect(result).not.toBeNull();
114
+ expect(result.count).toBe(1);
115
+ expect(result.pruned[0].status).toBe('archived');
116
+ // Task should be gone
117
+ expect(services.taskService.getTaskById(task.task_id)).toBeNull();
118
+ });
119
+ it('respects olderThanDays threshold', () => {
120
+ const task = services.taskService.createTask({
121
+ title: 'Recent task',
122
+ project: 'inbox',
123
+ });
124
+ services.taskService.setStatus(task.task_id, TaskStatus.Ready);
125
+ services.taskService.claimTask(task.task_id);
126
+ services.taskService.completeTask(task.task_id);
127
+ // Ask for tasks older than 365 days - should return empty
128
+ const result = runPrune({
129
+ services,
130
+ project: 'inbox',
131
+ olderThanDays: 365,
132
+ yes: true,
133
+ json: false,
134
+ });
135
+ expect(result).not.toBeNull();
136
+ expect(result.count).toBe(0);
137
+ // Task should still exist (not old enough)
138
+ expect(services.taskService.getTaskById(task.task_id)).not.toBeNull();
139
+ });
140
+ it('does NOT prune non-terminal tasks (safety check)', () => {
141
+ // Create tasks in various non-terminal states
142
+ const readyTask = services.taskService.createTask({
143
+ title: 'Ready task',
144
+ project: 'inbox',
145
+ });
146
+ services.taskService.setStatus(readyTask.task_id, TaskStatus.Ready);
147
+ const inProgressTask = services.taskService.createTask({
148
+ title: 'In progress task',
149
+ project: 'inbox',
150
+ });
151
+ services.taskService.setStatus(inProgressTask.task_id, TaskStatus.Ready);
152
+ services.taskService.claimTask(inProgressTask.task_id);
153
+ const blockedTask = services.taskService.createTask({
154
+ title: 'Blocked task',
155
+ project: 'inbox',
156
+ });
157
+ services.taskService.setStatus(blockedTask.task_id, TaskStatus.Ready);
158
+ services.taskService.claimTask(blockedTask.task_id);
159
+ services.taskService.blockTask(blockedTask.task_id);
160
+ // Also create a completed task to verify pruning works for terminal tasks
161
+ const doneTask = services.taskService.createTask({
162
+ title: 'Done task',
163
+ project: 'inbox',
164
+ });
165
+ services.taskService.setStatus(doneTask.task_id, TaskStatus.Ready);
166
+ services.taskService.claimTask(doneTask.task_id);
167
+ services.taskService.completeTask(doneTask.task_id);
168
+ const result = runPrune({
169
+ services,
170
+ project: 'inbox',
171
+ olderThanDays: 0,
172
+ asOf: futureTimestamp(),
173
+ yes: true,
174
+ json: false,
175
+ });
176
+ // Should only prune the done task, not the active ones
177
+ expect(result).not.toBeNull();
178
+ expect(result.count).toBe(1);
179
+ expect(result.pruned[0].task_id).toBe(doneTask.task_id);
180
+ // Non-terminal tasks should still exist
181
+ expect(services.taskService.getTaskById(readyTask.task_id)).not.toBeNull();
182
+ expect(services.taskService.getTaskById(inProgressTask.task_id)).not.toBeNull();
183
+ expect(services.taskService.getTaskById(blockedTask.task_id)).not.toBeNull();
184
+ // Terminal task should be gone
185
+ expect(services.taskService.getTaskById(doneTask.task_id)).toBeNull();
186
+ });
187
+ it('prunes tasks from all projects when project is undefined (--all flag)', () => {
188
+ // Create multiple projects with tasks
189
+ services.projectService.createProject('all-prune-proj-1');
190
+ services.projectService.createProject('all-prune-proj-2');
191
+ const task1 = services.taskService.createTask({
192
+ title: 'Task in project 1',
193
+ project: 'all-prune-proj-1',
194
+ });
195
+ const task2 = services.taskService.createTask({
196
+ title: 'Task in project 2',
197
+ project: 'all-prune-proj-2',
198
+ });
199
+ // Complete both tasks
200
+ services.taskService.setStatus(task1.task_id, TaskStatus.Ready);
201
+ services.taskService.setStatus(task2.task_id, TaskStatus.Ready);
202
+ services.taskService.claimTask(task1.task_id);
203
+ services.taskService.claimTask(task2.task_id);
204
+ services.taskService.completeTask(task1.task_id);
205
+ services.taskService.completeTask(task2.task_id);
206
+ // Prune with project: undefined (equivalent to --all)
207
+ const result = runPrune({
208
+ services,
209
+ project: undefined, // --all flag
210
+ olderThanDays: 0,
211
+ asOf: futureTimestamp(),
212
+ yes: true,
213
+ json: false,
214
+ });
215
+ expect(result).not.toBeNull();
216
+ expect(result.count).toBe(2);
217
+ // Both tasks should be gone
218
+ expect(services.taskService.getTaskById(task1.task_id)).toBeNull();
219
+ expect(services.taskService.getTaskById(task2.task_id)).toBeNull();
220
+ });
221
+ });
222
+ describe('confirmation behavior (without --yes)', () => {
223
+ it('returns null and does not prune when --yes not provided', () => {
224
+ const task = services.taskService.createTask({
225
+ title: 'Task to keep',
226
+ project: 'inbox',
227
+ });
228
+ services.taskService.setStatus(task.task_id, TaskStatus.Ready);
229
+ services.taskService.claimTask(task.task_id);
230
+ services.taskService.completeTask(task.task_id);
231
+ // Without --yes, should return null and NOT prune
232
+ const result = runPrune({
233
+ services,
234
+ project: 'inbox',
235
+ olderThanDays: 0,
236
+ asOf: futureTimestamp(),
237
+ yes: false,
238
+ json: false,
239
+ });
240
+ expect(result).toBeNull();
241
+ // Task should still exist (not pruned)
242
+ const taskAfter = services.taskService.getTaskById(task.task_id);
243
+ expect(taskAfter).not.toBeNull();
244
+ expect(taskAfter.status).toBe(TaskStatus.Done);
245
+ });
246
+ it('returns empty result when no eligible tasks even without --yes', () => {
247
+ // No tasks exist, so result should be empty (not null)
248
+ const result = runPrune({
249
+ services,
250
+ project: 'inbox',
251
+ olderThanDays: 30,
252
+ yes: false,
253
+ json: false,
254
+ });
255
+ // When no eligible tasks, returns empty result regardless of --yes
256
+ expect(result).toEqual({
257
+ pruned: [],
258
+ count: 0,
259
+ eventsDeleted: 0,
260
+ });
261
+ });
262
+ });
263
+ describe('dry-run mode', () => {
264
+ it('previews without deleting when dry-run is true', () => {
265
+ const task = services.taskService.createTask({
266
+ title: 'Task to prune',
267
+ project: 'inbox',
268
+ });
269
+ services.taskService.setStatus(task.task_id, TaskStatus.Ready);
270
+ services.taskService.claimTask(task.task_id);
271
+ services.taskService.completeTask(task.task_id);
272
+ const result = runPrune({
273
+ services,
274
+ project: 'inbox',
275
+ olderThanDays: 0,
276
+ asOf: futureTimestamp(),
277
+ dryRun: true,
278
+ json: false,
279
+ });
280
+ // Dry-run returns null
281
+ expect(result).toBeNull();
282
+ // Task should still exist after dry-run
283
+ const taskAfter = services.taskService.getTaskById(task.task_id);
284
+ expect(taskAfter).not.toBeNull();
285
+ expect(taskAfter.status).toBe(TaskStatus.Done);
286
+ });
287
+ it('dry-run does not require --yes', () => {
288
+ const task = services.taskService.createTask({
289
+ title: 'Task',
290
+ project: 'inbox',
291
+ });
292
+ services.taskService.setStatus(task.task_id, TaskStatus.Ready);
293
+ services.taskService.claimTask(task.task_id);
294
+ services.taskService.completeTask(task.task_id);
295
+ // Should not throw even without --yes when using dry-run
296
+ const result = runPrune({
297
+ services,
298
+ project: 'inbox',
299
+ olderThanDays: 0,
300
+ asOf: futureTimestamp(),
301
+ dryRun: true,
302
+ yes: false,
303
+ json: false,
304
+ });
305
+ expect(result).toBeNull();
306
+ // Task should still exist
307
+ expect(services.taskService.getTaskById(task.task_id)).not.toBeNull();
308
+ });
309
+ });
310
+ describe('JSON output', () => {
311
+ it('returns structured result with --json and --yes', () => {
312
+ const task = services.taskService.createTask({
313
+ title: 'Task',
314
+ project: 'inbox',
315
+ });
316
+ services.taskService.setStatus(task.task_id, TaskStatus.Ready);
317
+ services.taskService.claimTask(task.task_id);
318
+ services.taskService.completeTask(task.task_id);
319
+ const result = runPrune({
320
+ services,
321
+ project: 'inbox',
322
+ olderThanDays: 0,
323
+ asOf: futureTimestamp(),
324
+ yes: true,
325
+ json: true,
326
+ });
327
+ expect(result).not.toBeNull();
328
+ expect(result.count).toBe(1);
329
+ expect(result.pruned).toHaveLength(1);
330
+ expect(result.eventsDeleted).toBeGreaterThan(0);
331
+ });
332
+ it('returns empty result with --json and --yes when no eligible tasks', () => {
333
+ const result = runPrune({
334
+ services,
335
+ project: 'inbox',
336
+ olderThanDays: 1,
337
+ yes: true,
338
+ json: true,
339
+ });
340
+ expect(result).toEqual({
341
+ pruned: [],
342
+ count: 0,
343
+ eventsDeleted: 0,
344
+ });
345
+ });
346
+ });
347
+ });
348
+ //# sourceMappingURL=prune.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.test.js","sourceRoot":"","sources":["../../../src/commands/task/prune.test.ts"],"names":[],"mappings":"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"}
package/dist/db.js CHANGED
@@ -93,7 +93,7 @@ export function initializeDb(options) {
93
93
  // Check and perform schema migration if needed
94
94
  checkAndMigrateSchema(cacheDb, eventsDb, projectionEngine);
95
95
  const projectService = new ProjectService(cacheDb, eventStore, projectionEngine);
96
- const taskService = new TaskService(cacheDb, eventStore, projectionEngine, projectService);
96
+ const taskService = new TaskService(cacheDb, eventStore, projectionEngine, projectService, eventsDb);
97
97
  const searchService = new SearchService(cacheDb);
98
98
  const validationService = new ValidationService(cacheDb);
99
99
  projectService.ensureInboxExists();
package/dist/db.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.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.15.0",
3
+ "version": "1.16.1",
4
4
  "description": "CLI for HZL - External task ledger for coding agents and OpenClaw.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -64,7 +64,7 @@
64
64
  "dependencies": {
65
65
  "libsql": "^0.5.0",
66
66
  "commander": "^14.0.0",
67
- "hzl-core": "^1.15.0",
67
+ "hzl-core": "^1.16.1",
68
68
  "hzl-web": "^1.7.6",
69
69
  "zod": "^3.23.8"
70
70
  },