claude-task-tracker 1.0.10 → 1.0.11
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 +7 -1
- package/dist/index.js +36 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,6 +7,7 @@ A CLI task tracker with dependency management designed to extend memory for agen
|
|
|
7
7
|
- **Task Dependencies**: Blocking dependencies that prevent task execution until completed
|
|
8
8
|
- **Soft References**: Non-blocking references between related tasks
|
|
9
9
|
- **Task Overviews**: Context summaries filled on completion for dependent tasks to reference
|
|
10
|
+
- **Plan File References**: Link tasks to external plan files with detailed implementation notes
|
|
10
11
|
- **Ready Task Detection**: `next` command finds tasks ready to work on (open + all blockers completed)
|
|
11
12
|
- **Multiple Output Formats**: Default, JSON, and compact (token-efficient for LLMs)
|
|
12
13
|
- **Claude Code Integration**: Auto-generates `CLAUDE.md` with usage instructions on init
|
|
@@ -47,6 +48,9 @@ ctt add "Design API schema" -d "Define REST endpoints"
|
|
|
47
48
|
ctt add "Implement auth" --blocked-by t1
|
|
48
49
|
ctt add "Write tests" --blocked-by t2 --ref t1
|
|
49
50
|
|
|
51
|
+
# Add a task with a plan file
|
|
52
|
+
ctt add "Refactor database" -p .tasks/plans/db-refactor.md
|
|
53
|
+
|
|
50
54
|
# Get next ready task
|
|
51
55
|
ctt next
|
|
52
56
|
# Output: t1 - Design API schema
|
|
@@ -66,7 +70,7 @@ ctt context t2
|
|
|
66
70
|
| Command | Description |
|
|
67
71
|
|---------|-------------|
|
|
68
72
|
| `ctt init` | Initialize `.tasks/tasks.json` in current directory |
|
|
69
|
-
| `ctt add <title>` | Add task (`-d` description, `-b` blockedBy, `-r` refs) |
|
|
73
|
+
| `ctt add <title>` | Add task (`-d` description, `-b` blockedBy, `-r` refs, `-p` planFile) |
|
|
70
74
|
| `ctt list` | List all tasks (`-s` filter by status) |
|
|
71
75
|
| `ctt show <id>` | Show task details |
|
|
72
76
|
| `ctt next` | Get next ready task (open + all blockers completed) |
|
|
@@ -78,6 +82,7 @@ ctt context t2
|
|
|
78
82
|
| `ctt unref <id> --to <id>` | Remove soft reference |
|
|
79
83
|
| `ctt context <id>` | Show task + all dependency overviews |
|
|
80
84
|
| `ctt overview <id> <text>` | Update task overview |
|
|
85
|
+
| `ctt plan <id> <path>` | Set or update plan file reference |
|
|
81
86
|
| `ctt delete <id>` | Delete a task |
|
|
82
87
|
| `ctt cleanup` | Remove old completed tasks (`-d` days, default 7, `--dry-run`) |
|
|
83
88
|
|
|
@@ -126,6 +131,7 @@ ctt --compact context t3
|
|
|
126
131
|
- `<t1,t2` = blocked by t1 and t2
|
|
127
132
|
- `~t1` = references t1
|
|
128
133
|
- `>text` = overview
|
|
134
|
+
- `@path` = plan file reference
|
|
129
135
|
|
|
130
136
|
## Task States
|
|
131
137
|
|
package/dist/index.js
CHANGED
|
@@ -20,6 +20,7 @@ function createTask(id, title, options = {}) {
|
|
|
20
20
|
blockedBy: options.blockedBy ?? [],
|
|
21
21
|
references: options.references ?? [],
|
|
22
22
|
overview: void 0,
|
|
23
|
+
planFile: options.planFile,
|
|
23
24
|
createdAt: now,
|
|
24
25
|
updatedAt: now
|
|
25
26
|
};
|
|
@@ -135,6 +136,9 @@ function formatTaskDetail(task, store) {
|
|
|
135
136
|
if (task.overview) {
|
|
136
137
|
lines.push(`Overview: ${task.overview}`);
|
|
137
138
|
}
|
|
139
|
+
if (task.planFile) {
|
|
140
|
+
lines.push(`Plan file: ${task.planFile}`);
|
|
141
|
+
}
|
|
138
142
|
lines.push(`Created: ${task.createdAt}`);
|
|
139
143
|
lines.push(`Updated: ${task.updatedAt}`);
|
|
140
144
|
return lines.join("\n");
|
|
@@ -197,6 +201,9 @@ function formatTaskCompact(task) {
|
|
|
197
201
|
if (task.overview) {
|
|
198
202
|
parts.push(`>${task.overview}`);
|
|
199
203
|
}
|
|
204
|
+
if (task.planFile) {
|
|
205
|
+
parts.push(`@${task.planFile}`);
|
|
206
|
+
}
|
|
200
207
|
return parts.join(" ");
|
|
201
208
|
}
|
|
202
209
|
function formatTasksCompact(tasks) {
|
|
@@ -253,6 +260,7 @@ This project uses \`ctt\` (Claude Task Tracker) for task management with depende
|
|
|
253
260
|
- \`ctt add "title" -d "description"\` - Add task with detailed description
|
|
254
261
|
- \`ctt add "title" -b <blocker-id>\` - Add task blocked by another
|
|
255
262
|
- \`ctt add "title" -r <ref-id>\` - Add task with a reference to another
|
|
263
|
+
- \`ctt add "title" -p <path>\` - Add task with a plan file reference
|
|
256
264
|
- \`ctt list\` - List all tasks
|
|
257
265
|
- \`ctt list -s <status>\` - List tasks by status (open, progress, completed)
|
|
258
266
|
- \`ctt show <id>\` - Show task details
|
|
@@ -266,6 +274,7 @@ This project uses \`ctt\` (Claude Task Tracker) for task management with depende
|
|
|
266
274
|
- \`ctt ref <id> --to <ref-id>\` - Add soft reference to another task
|
|
267
275
|
- \`ctt unref <id> --to <ref-id>\` - Remove soft reference
|
|
268
276
|
- \`ctt overview <id> "text"\` - Set or update task overview
|
|
277
|
+
- \`ctt plan <id> <path>\` - Set or update plan file reference
|
|
269
278
|
- \`ctt delete <id>\` - Delete a task
|
|
270
279
|
- \`ctt cleanup\` - Remove completed tasks older than 7 days
|
|
271
280
|
- \`ctt cleanup -d <days>\` - Remove completed tasks older than N days
|
|
@@ -279,6 +288,9 @@ ctt add "Implement user authentication" -d "Add JWT-based auth with login/logout
|
|
|
279
288
|
|
|
280
289
|
# Add a task blocked by another with description
|
|
281
290
|
ctt add "Add password reset" -d "Email-based password reset flow" -b t1
|
|
291
|
+
|
|
292
|
+
# Add a task with a plan file containing detailed implementation notes
|
|
293
|
+
ctt add "Refactor database layer" -p .tasks/plans/db-refactor.md
|
|
282
294
|
\`\`\`
|
|
283
295
|
|
|
284
296
|
### Compact Format
|
|
@@ -286,6 +298,7 @@ ctt add "Add password reset" -d "Email-based password reset flow" -b t1
|
|
|
286
298
|
- \`<t1,t2\` = blocked by tasks
|
|
287
299
|
- \`~t1\` = references task
|
|
288
300
|
- \`>text\` = overview
|
|
301
|
+
- \`@path\` = plan file reference
|
|
289
302
|
`;
|
|
290
303
|
function setupClaudeMd(cwd = process.cwd()) {
|
|
291
304
|
const claudeMdPath = join2(cwd, "CLAUDE.md");
|
|
@@ -318,7 +331,7 @@ program.command("init").description("Initialize task store and setup CLAUDE.md")
|
|
|
318
331
|
process.exit(1);
|
|
319
332
|
}
|
|
320
333
|
});
|
|
321
|
-
program.command("add <title>").description("Add a new task").option("-d, --description <desc>", "Task description").option("-b, --blocked-by <ids>", "Comma-separated IDs of blocking tasks").option("-r, --ref <ids>", "Comma-separated IDs of referenced tasks").action((title, options) => {
|
|
334
|
+
program.command("add <title>").description("Add a new task").option("-d, --description <desc>", "Task description").option("-b, --blocked-by <ids>", "Comma-separated IDs of blocking tasks").option("-r, --ref <ids>", "Comma-separated IDs of referenced tasks").option("-p, --plan-file <path>", "Path to plan file with detailed planning notes").action((title, options) => {
|
|
322
335
|
try {
|
|
323
336
|
const store = loadStore();
|
|
324
337
|
const blockedBy = options.blockedBy ? options.blockedBy.split(",").map((s) => s.trim()) : [];
|
|
@@ -332,7 +345,8 @@ program.command("add <title>").description("Add a new task").option("-d, --descr
|
|
|
332
345
|
const task = addTask(store, title, {
|
|
333
346
|
description: options.description,
|
|
334
347
|
blockedBy,
|
|
335
|
-
references
|
|
348
|
+
references,
|
|
349
|
+
planFile: options.planFile
|
|
336
350
|
});
|
|
337
351
|
saveStore(store);
|
|
338
352
|
const fmt = getOutputFormat();
|
|
@@ -625,6 +639,26 @@ program.command("overview <id> <text>").description("Set or update task overview
|
|
|
625
639
|
process.exit(1);
|
|
626
640
|
}
|
|
627
641
|
});
|
|
642
|
+
program.command("plan <id> <path>").description("Set or update plan file reference for a task").action((id, path) => {
|
|
643
|
+
try {
|
|
644
|
+
const store = loadStore();
|
|
645
|
+
const task = getTask(store, id);
|
|
646
|
+
if (!task) {
|
|
647
|
+
console.error(`Task ${id} not found.`);
|
|
648
|
+
process.exit(1);
|
|
649
|
+
}
|
|
650
|
+
updateTask(store, id, { planFile: path });
|
|
651
|
+
saveStore(store);
|
|
652
|
+
if (program.opts().json) {
|
|
653
|
+
console.log(formatTaskJson(getTask(store, id)));
|
|
654
|
+
} else {
|
|
655
|
+
console.log(`Updated plan file for ${id}: ${path}`);
|
|
656
|
+
}
|
|
657
|
+
} catch (err) {
|
|
658
|
+
console.error(err.message);
|
|
659
|
+
process.exit(1);
|
|
660
|
+
}
|
|
661
|
+
});
|
|
628
662
|
program.command("context <id>").description("Show task with all dependency overviews for quick context lookup").action((id) => {
|
|
629
663
|
try {
|
|
630
664
|
const store = loadStore();
|