@nickmeriano/task 0.7.1 → 0.8.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 +12 -7
- package/dist/check.d.ts +42 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +364 -0
- package/dist/check.js.map +1 -0
- package/dist/check.test.d.ts +9 -0
- package/dist/check.test.d.ts.map +1 -0
- package/dist/check.test.js +209 -0
- package/dist/check.test.js.map +1 -0
- package/dist/claim.d.ts +56 -3
- package/dist/claim.d.ts.map +1 -1
- package/dist/claim.js +164 -9
- package/dist/claim.js.map +1 -1
- package/dist/claim.test.js +168 -14
- package/dist/claim.test.js.map +1 -1
- package/dist/cli.js +504 -93
- package/dist/cli.js.map +1 -1
- package/dist/file-store.d.ts +41 -15
- package/dist/file-store.d.ts.map +1 -1
- package/dist/file-store.js +197 -99
- package/dist/file-store.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/overview.d.ts +43 -0
- package/dist/overview.d.ts.map +1 -0
- package/dist/overview.js +53 -0
- package/dist/overview.js.map +1 -0
- package/dist/overview.test.d.ts +8 -0
- package/dist/overview.test.d.ts.map +1 -0
- package/dist/overview.test.js +47 -0
- package/dist/overview.test.js.map +1 -0
- package/dist/promote.test.d.ts +14 -0
- package/dist/promote.test.d.ts.map +1 -0
- package/dist/promote.test.js +106 -0
- package/dist/promote.test.js.map +1 -0
- package/dist/search.d.ts +32 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +66 -0
- package/dist/search.js.map +1 -0
- package/dist/search.test.d.ts +2 -0
- package/dist/search.test.d.ts.map +1 -0
- package/dist/search.test.js +53 -0
- package/dist/search.test.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +10 -2
- package/dist/server.js.map +1 -1
- package/dist/store.d.ts +16 -50
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +0 -368
- package/dist/store.js.map +1 -1
- package/dist/store.test.d.ts +1 -2
- package/dist/store.test.d.ts.map +1 -1
- package/dist/store.test.js +77 -48
- package/dist/store.test.js.map +1 -1
- package/dist/ticket-doc.d.ts +55 -2
- package/dist/ticket-doc.d.ts.map +1 -1
- package/dist/ticket-doc.js +177 -7
- package/dist/ticket-doc.js.map +1 -1
- package/dist/types.d.ts +67 -14
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/skill/SKILL.md +97 -31
- package/src/check.test.ts +271 -0
- package/src/check.ts +454 -0
- package/src/claim.test.ts +202 -14
- package/src/claim.ts +194 -10
- package/src/cli.ts +510 -89
- package/src/file-store.ts +217 -111
- package/src/index.ts +4 -2
- package/src/overview.test.ts +51 -0
- package/src/overview.ts +90 -0
- package/src/promote.test.ts +131 -0
- package/src/search.test.ts +64 -0
- package/src/search.ts +91 -0
- package/src/server.ts +11 -2
- package/src/store.test.ts +89 -57
- package/src/store.ts +18 -431
- package/src/ticket-doc.ts +210 -10
- package/src/types.ts +71 -14
- package/ui/dist/assets/{index-D4homvrQ.js → index-BJmOsOdR.js} +73 -73
- package/ui/dist/assets/index-BoqQlqSU.css +1 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index-COunM-QN.css +0 -1
package/dist/store.d.ts
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import type { Comment, ProjectConfig, Task, TaskFilter, TaskInput, TaskPatch } from "./types.ts";
|
|
1
|
+
import type { Comment, Goal, GoalInput, GoalPatch, ProjectConfig, Task, TaskFilter, TaskInput, TaskPatch } from "./types.ts";
|
|
2
2
|
export declare const TASK_DIR = ".task";
|
|
3
|
-
export declare const DB_FILE = "tasks.db";
|
|
4
3
|
export declare const CONFIG_FILE = "config.json";
|
|
5
4
|
/** Spacing between adjacent board positions — leaves room to drop between. */
|
|
6
5
|
export declare const POSITION_GAP = 1024;
|
|
7
6
|
/**
|
|
8
|
-
* What a board's persistence layer looks like
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
7
|
+
* What a board's persistence layer looks like. One implementation: `FileStore`
|
|
8
|
+
* (text files in `.task/tickets/`, the canonical format). The interface stays
|
|
9
|
+
* because it is the seam everything else — the CLI, `task serve`, scripts —
|
|
10
|
+
* programs against.
|
|
12
11
|
*/
|
|
13
12
|
export interface Store {
|
|
14
13
|
readonly root: string;
|
|
@@ -27,6 +26,17 @@ export interface Store {
|
|
|
27
26
|
/** Move a done/canceled ticket to `.task/archive/`, out of the board's hot path. */
|
|
28
27
|
archive(number: number): Task;
|
|
29
28
|
unarchive(number: number): Task;
|
|
29
|
+
/** Live goals, in slug order — pass `true` to list `.task/goals/archive/` instead. */
|
|
30
|
+
goals(archived?: boolean): Goal[];
|
|
31
|
+
/** Live or archived — a ticket's `goal:` ref should resolve either way. */
|
|
32
|
+
getGoal(slug: string): Goal | null;
|
|
33
|
+
createGoal(input: GoalInput): Goal;
|
|
34
|
+
updateGoal(slug: string, patch: GoalPatch): Goal;
|
|
35
|
+
/** Refused while any open (backlog/todo/in_progress) task references the goal. */
|
|
36
|
+
archiveGoal(slug: string): Goal;
|
|
37
|
+
unarchiveGoal(slug: string): Goal;
|
|
38
|
+
/** Refused while any live task references the goal, whatever its status. */
|
|
39
|
+
deleteGoal(slug: string): void;
|
|
30
40
|
comments(number: number): Comment[];
|
|
31
41
|
addComment(number: number, body: string, author?: string): Comment;
|
|
32
42
|
deleteComment(number: number, commentId: string): Comment;
|
|
@@ -69,48 +79,4 @@ export declare function findBoardsByPrefix(scopeRoot: string, prefix: string): B
|
|
|
69
79
|
export declare function findBoards(serveRoot: string, maxDepth?: number): BoardRef[];
|
|
70
80
|
/** Derive an id prefix from a project name: "phone agent" → "PHO". */
|
|
71
81
|
export declare function derivePrefix(name: string): string;
|
|
72
|
-
/**
|
|
73
|
-
* The legacy persistence layer: one SQLite database inside `.task/`, opened
|
|
74
|
-
* synchronously via node:sqlite (built into Node ≥22.13 — zero dependencies,
|
|
75
|
-
* nothing to compile, safe for `npx`). Boards created before the text format
|
|
76
|
-
* still run on this until `task migrate` moves them over.
|
|
77
|
-
*/
|
|
78
|
-
export declare class TaskStore implements Store {
|
|
79
|
-
readonly root: string;
|
|
80
|
-
readonly taskDir: string;
|
|
81
|
-
readonly config: ProjectConfig;
|
|
82
|
-
private db;
|
|
83
|
-
constructor(root: string);
|
|
84
|
-
close(): void;
|
|
85
|
-
displayId(number: number): string;
|
|
86
|
-
/** Accepts "PHONE-12", "phone-12" or "12". */
|
|
87
|
-
parseId(ref: string): number;
|
|
88
|
-
private toTask;
|
|
89
|
-
/** The other end of every link where `column` is this task. */
|
|
90
|
-
private linkedNumbers;
|
|
91
|
-
private toComment;
|
|
92
|
-
list(filter?: TaskFilter): Task[];
|
|
93
|
-
get(number: number): Task | null;
|
|
94
|
-
create(input: TaskInput): Task;
|
|
95
|
-
update(number: number, patch: TaskPatch): Task;
|
|
96
|
-
/**
|
|
97
|
-
* Make the link table agree with `targets` for one side of one task —
|
|
98
|
-
* `blocker_id` when setting what `number` blocks, `blocked_id` when setting
|
|
99
|
-
* what blocks it. The other task's view is the same row read from the other
|
|
100
|
-
* end, so there is no second write to keep consistent. Every task touched
|
|
101
|
-
* (both ends of every added or removed link) gets its `updated_at` bumped.
|
|
102
|
-
*/
|
|
103
|
-
private reconcileLinks;
|
|
104
|
-
/** `task link A --blocks B` and friends — additive, unlike the patch form. */
|
|
105
|
-
link(number: number, relation: "blocks" | "blocked_by", target: number): Task;
|
|
106
|
-
unlink(number: number, relation: "blocks" | "blocked_by", target: number): Task;
|
|
107
|
-
delete(number: number): void;
|
|
108
|
-
/** The archive is a text-format feature — a directory move, not a table. */
|
|
109
|
-
archive(_number: number): Task;
|
|
110
|
-
unarchive(_number: number): Task;
|
|
111
|
-
comments(number: number): Comment[];
|
|
112
|
-
addComment(number: number, body: string, author?: string): Comment;
|
|
113
|
-
deleteComment(number: number, commentId: string): Comment;
|
|
114
|
-
commentCounts(): Map<number, number>;
|
|
115
|
-
}
|
|
116
82
|
//# sourceMappingURL=store.d.ts.map
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/store.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { DatabaseSync } from "node:sqlite";
|
|
2
1
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
3
2
|
import { dirname, join, relative, sep } from "node:path";
|
|
4
3
|
export const TASK_DIR = ".task";
|
|
5
|
-
export const DB_FILE = "tasks.db";
|
|
6
4
|
export const CONFIG_FILE = "config.json";
|
|
7
5
|
/** Spacing between adjacent board positions — leaves room to drop between. */
|
|
8
6
|
export const POSITION_GAP = 1024;
|
|
@@ -107,370 +105,4 @@ export function derivePrefix(name) {
|
|
|
107
105
|
const word = name.toUpperCase().replace(/[^A-Z0-9]+/g, " ").trim().split(" ")[0];
|
|
108
106
|
return (word || "TAS").slice(0, 3);
|
|
109
107
|
}
|
|
110
|
-
function now() {
|
|
111
|
-
return new Date().toISOString();
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* The legacy persistence layer: one SQLite database inside `.task/`, opened
|
|
115
|
-
* synchronously via node:sqlite (built into Node ≥22.13 — zero dependencies,
|
|
116
|
-
* nothing to compile, safe for `npx`). Boards created before the text format
|
|
117
|
-
* still run on this until `task migrate` moves them over.
|
|
118
|
-
*/
|
|
119
|
-
export class TaskStore {
|
|
120
|
-
root;
|
|
121
|
-
taskDir;
|
|
122
|
-
config;
|
|
123
|
-
db;
|
|
124
|
-
constructor(root) {
|
|
125
|
-
this.root = root;
|
|
126
|
-
this.taskDir = join(root, TASK_DIR);
|
|
127
|
-
this.config = JSON.parse(readFileSync(join(this.taskDir, CONFIG_FILE), "utf8"));
|
|
128
|
-
this.db = new DatabaseSync(join(this.taskDir, DB_FILE));
|
|
129
|
-
// Multiple writers (CLI + serve + agents) are expected; wait for locks
|
|
130
|
-
// instead of failing fast with SQLITE_BUSY.
|
|
131
|
-
this.db.exec("PRAGMA busy_timeout = 3000");
|
|
132
|
-
this.db.exec("PRAGMA foreign_keys = ON");
|
|
133
|
-
migrate(this.db);
|
|
134
|
-
}
|
|
135
|
-
close() {
|
|
136
|
-
this.db.close();
|
|
137
|
-
}
|
|
138
|
-
displayId(number) {
|
|
139
|
-
return `${this.config.prefix}-${number}`;
|
|
140
|
-
}
|
|
141
|
-
/** Accepts "PHONE-12", "phone-12" or "12". */
|
|
142
|
-
parseId(ref) {
|
|
143
|
-
const match = /^(?:[A-Za-z0-9]+-)?(\d+)$/.exec(ref.trim());
|
|
144
|
-
if (!match)
|
|
145
|
-
throw new Error(`invalid task id: ${ref}`);
|
|
146
|
-
return Number(match[1]);
|
|
147
|
-
}
|
|
148
|
-
toTask(row) {
|
|
149
|
-
return {
|
|
150
|
-
id: this.displayId(row.id),
|
|
151
|
-
number: row.id,
|
|
152
|
-
title: row.title,
|
|
153
|
-
description: row.description,
|
|
154
|
-
status: row.status,
|
|
155
|
-
tags: JSON.parse(row.tags),
|
|
156
|
-
milestone: row.milestone,
|
|
157
|
-
needsHuman: row.needs_human !== 0,
|
|
158
|
-
blocks: this.linkedNumbers("blocker_id", row.id),
|
|
159
|
-
blockedBy: this.linkedNumbers("blocked_id", row.id),
|
|
160
|
-
prs: JSON.parse(row.prs),
|
|
161
|
-
position: row.position,
|
|
162
|
-
createdAt: row.created_at,
|
|
163
|
-
updatedAt: row.updated_at,
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
/** The other end of every link where `column` is this task. */
|
|
167
|
-
linkedNumbers(column, number) {
|
|
168
|
-
const other = column === "blocker_id" ? "blocked_id" : "blocker_id";
|
|
169
|
-
const rows = this.db
|
|
170
|
-
.prepare(`SELECT ${other} AS n FROM task_links WHERE ${column} = ? ORDER BY ${other}`)
|
|
171
|
-
.all(number);
|
|
172
|
-
return rows.map((r) => r.n);
|
|
173
|
-
}
|
|
174
|
-
toComment(row) {
|
|
175
|
-
return {
|
|
176
|
-
id: String(row.id),
|
|
177
|
-
taskId: this.displayId(row.task_id),
|
|
178
|
-
author: row.author,
|
|
179
|
-
body: row.body,
|
|
180
|
-
createdAt: row.created_at,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
list(filter = {}) {
|
|
184
|
-
if (filter.archived) {
|
|
185
|
-
throw new Error("archiving needs a text-format board — run `task migrate` first");
|
|
186
|
-
}
|
|
187
|
-
const where = [];
|
|
188
|
-
const params = [];
|
|
189
|
-
if (filter.statuses?.length) {
|
|
190
|
-
where.push(`status IN (${filter.statuses.map(() => "?").join(", ")})`);
|
|
191
|
-
params.push(...filter.statuses);
|
|
192
|
-
}
|
|
193
|
-
if (filter.milestone) {
|
|
194
|
-
where.push("milestone = ?");
|
|
195
|
-
params.push(filter.milestone);
|
|
196
|
-
}
|
|
197
|
-
if (filter.needsHuman !== undefined) {
|
|
198
|
-
where.push("needs_human = ?");
|
|
199
|
-
params.push(filter.needsHuman ? 1 : 0);
|
|
200
|
-
}
|
|
201
|
-
const sql = `SELECT * FROM tasks${where.length ? ` WHERE ${where.join(" AND ")}` : ""} ORDER BY position, id`;
|
|
202
|
-
let rows = this.db.prepare(sql).all(...params);
|
|
203
|
-
if (filter.tags?.length) {
|
|
204
|
-
// Tags are a JSON blob, not a table — match them in JS, any-of.
|
|
205
|
-
const wanted = new Set(filter.tags);
|
|
206
|
-
rows = rows.filter((r) => JSON.parse(r.tags).some((t) => wanted.has(t)));
|
|
207
|
-
}
|
|
208
|
-
return rows.map((r) => this.toTask(r));
|
|
209
|
-
}
|
|
210
|
-
get(number) {
|
|
211
|
-
const row = this.db.prepare("SELECT * FROM tasks WHERE id = ?").get(number);
|
|
212
|
-
return row ? this.toTask(row) : null;
|
|
213
|
-
}
|
|
214
|
-
create(input) {
|
|
215
|
-
const status = input.status ?? "todo";
|
|
216
|
-
// New tasks land at the bottom of their column.
|
|
217
|
-
const max = this.db
|
|
218
|
-
.prepare("SELECT MAX(position) AS max FROM tasks WHERE status = ?")
|
|
219
|
-
.get(status);
|
|
220
|
-
const timestamp = now();
|
|
221
|
-
const result = this.db
|
|
222
|
-
.prepare(`INSERT INTO tasks (title, description, status, tags, milestone, needs_human, prs, position, created_at, updated_at)
|
|
223
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
224
|
-
.run(input.title, input.description ?? "", status, JSON.stringify(input.tags ?? []), input.milestone ?? null, input.needsHuman ? 1 : 0, JSON.stringify(input.prs ?? []), (max.max ?? 0) + POSITION_GAP, timestamp, timestamp);
|
|
225
|
-
const number = Number(result.lastInsertRowid);
|
|
226
|
-
if (input.blocks !== undefined)
|
|
227
|
-
this.reconcileLinks("blocker_id", number, input.blocks);
|
|
228
|
-
if (input.blockedBy !== undefined)
|
|
229
|
-
this.reconcileLinks("blocked_id", number, input.blockedBy);
|
|
230
|
-
return this.get(number);
|
|
231
|
-
}
|
|
232
|
-
update(number, patch) {
|
|
233
|
-
const existing = this.get(number);
|
|
234
|
-
if (!existing)
|
|
235
|
-
throw new Error(`no such task: ${this.displayId(number)}`);
|
|
236
|
-
// Reconciled outside the UPDATE — links live in their own table. Done
|
|
237
|
-
// first so a bad target rejects the whole patch before anything writes.
|
|
238
|
-
let linksChanged = false;
|
|
239
|
-
if (patch.blocks !== undefined) {
|
|
240
|
-
linksChanged = this.reconcileLinks("blocker_id", number, patch.blocks);
|
|
241
|
-
}
|
|
242
|
-
if (patch.blockedBy !== undefined) {
|
|
243
|
-
linksChanged = this.reconcileLinks("blocked_id", number, patch.blockedBy) || linksChanged;
|
|
244
|
-
}
|
|
245
|
-
const sets = [];
|
|
246
|
-
const params = [];
|
|
247
|
-
const set = (column, value) => {
|
|
248
|
-
sets.push(`${column} = ?`);
|
|
249
|
-
params.push(value);
|
|
250
|
-
};
|
|
251
|
-
if (patch.title !== undefined)
|
|
252
|
-
set("title", patch.title);
|
|
253
|
-
if (patch.description !== undefined)
|
|
254
|
-
set("description", patch.description);
|
|
255
|
-
if (patch.tags !== undefined)
|
|
256
|
-
set("tags", JSON.stringify(patch.tags));
|
|
257
|
-
if (patch.milestone !== undefined)
|
|
258
|
-
set("milestone", patch.milestone);
|
|
259
|
-
if (patch.needsHuman !== undefined)
|
|
260
|
-
set("needs_human", patch.needsHuman ? 1 : 0);
|
|
261
|
-
if (patch.prs !== undefined)
|
|
262
|
-
set("prs", JSON.stringify(patch.prs));
|
|
263
|
-
if (patch.status !== undefined) {
|
|
264
|
-
set("status", patch.status);
|
|
265
|
-
if (patch.position === undefined && patch.status !== existing.status) {
|
|
266
|
-
// Moved columns without an explicit slot → land on top, where the
|
|
267
|
-
// freshest movement is visible (Linear's behavior).
|
|
268
|
-
const min = this.db
|
|
269
|
-
.prepare("SELECT MIN(position) AS min FROM tasks WHERE status = ?")
|
|
270
|
-
.get(patch.status);
|
|
271
|
-
set("position", (min.min ?? 0) - POSITION_GAP);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
if (patch.position !== undefined)
|
|
275
|
-
set("position", patch.position);
|
|
276
|
-
if (sets.length === 0 && !linksChanged)
|
|
277
|
-
return existing;
|
|
278
|
-
if (sets.length > 0) {
|
|
279
|
-
set("updated_at", now());
|
|
280
|
-
params.push(number);
|
|
281
|
-
this.db.prepare(`UPDATE tasks SET ${sets.join(", ")} WHERE id = ?`).run(...params);
|
|
282
|
-
}
|
|
283
|
-
return this.get(number);
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Make the link table agree with `targets` for one side of one task —
|
|
287
|
-
* `blocker_id` when setting what `number` blocks, `blocked_id` when setting
|
|
288
|
-
* what blocks it. The other task's view is the same row read from the other
|
|
289
|
-
* end, so there is no second write to keep consistent. Every task touched
|
|
290
|
-
* (both ends of every added or removed link) gets its `updated_at` bumped.
|
|
291
|
-
*/
|
|
292
|
-
reconcileLinks(column, number, targets) {
|
|
293
|
-
const other = column === "blocker_id" ? "blocked_id" : "blocker_id";
|
|
294
|
-
const wanted = [...new Set(targets)];
|
|
295
|
-
for (const target of wanted) {
|
|
296
|
-
if (target === number) {
|
|
297
|
-
throw new Error(`a task can't block itself: ${this.displayId(number)}`);
|
|
298
|
-
}
|
|
299
|
-
if (!this.db.prepare("SELECT id FROM tasks WHERE id = ?").get(target)) {
|
|
300
|
-
throw new Error(`no such task: ${this.displayId(target)}`);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
const current = new Set(this.linkedNumbers(column, number));
|
|
304
|
-
const removed = [...current].filter((n) => !wanted.includes(n));
|
|
305
|
-
const added = wanted.filter((n) => !current.has(n));
|
|
306
|
-
for (const n of removed) {
|
|
307
|
-
this.db
|
|
308
|
-
.prepare(`DELETE FROM task_links WHERE ${column} = ? AND ${other} = ?`)
|
|
309
|
-
.run(number, n);
|
|
310
|
-
}
|
|
311
|
-
for (const n of added) {
|
|
312
|
-
this.db
|
|
313
|
-
.prepare(`INSERT OR IGNORE INTO task_links (${column}, ${other}) VALUES (?, ?)`)
|
|
314
|
-
.run(number, n);
|
|
315
|
-
}
|
|
316
|
-
const touched = [...removed, ...added];
|
|
317
|
-
if (touched.length > 0) {
|
|
318
|
-
const timestamp = now();
|
|
319
|
-
const bump = this.db.prepare("UPDATE tasks SET updated_at = ? WHERE id = ?");
|
|
320
|
-
for (const n of [...touched, number])
|
|
321
|
-
bump.run(timestamp, n);
|
|
322
|
-
}
|
|
323
|
-
return touched.length > 0;
|
|
324
|
-
}
|
|
325
|
-
/** `task link A --blocks B` and friends — additive, unlike the patch form. */
|
|
326
|
-
link(number, relation, target) {
|
|
327
|
-
if (!this.get(number))
|
|
328
|
-
throw new Error(`no such task: ${this.displayId(number)}`);
|
|
329
|
-
const column = relation === "blocks" ? "blocker_id" : "blocked_id";
|
|
330
|
-
const current = this.linkedNumbers(column, number);
|
|
331
|
-
this.reconcileLinks(column, number, [...current, target]);
|
|
332
|
-
return this.get(number);
|
|
333
|
-
}
|
|
334
|
-
unlink(number, relation, target) {
|
|
335
|
-
if (!this.get(number))
|
|
336
|
-
throw new Error(`no such task: ${this.displayId(number)}`);
|
|
337
|
-
const column = relation === "blocks" ? "blocker_id" : "blocked_id";
|
|
338
|
-
const current = this.linkedNumbers(column, number);
|
|
339
|
-
this.reconcileLinks(column, number, current.filter((n) => n !== target));
|
|
340
|
-
return this.get(number);
|
|
341
|
-
}
|
|
342
|
-
delete(number) {
|
|
343
|
-
const result = this.db.prepare("DELETE FROM tasks WHERE id = ?").run(number);
|
|
344
|
-
if (result.changes === 0)
|
|
345
|
-
throw new Error(`no such task: ${this.displayId(number)}`);
|
|
346
|
-
}
|
|
347
|
-
/** The archive is a text-format feature — a directory move, not a table. */
|
|
348
|
-
archive(_number) {
|
|
349
|
-
throw new Error("archiving needs a text-format board — run `task migrate` first");
|
|
350
|
-
}
|
|
351
|
-
unarchive(_number) {
|
|
352
|
-
throw new Error("archiving needs a text-format board — run `task migrate` first");
|
|
353
|
-
}
|
|
354
|
-
comments(number) {
|
|
355
|
-
const rows = this.db
|
|
356
|
-
.prepare("SELECT * FROM comments WHERE task_id = ? ORDER BY id")
|
|
357
|
-
.all(number);
|
|
358
|
-
return rows.map((r) => this.toComment(r));
|
|
359
|
-
}
|
|
360
|
-
addComment(number, body, author = "") {
|
|
361
|
-
if (!this.get(number))
|
|
362
|
-
throw new Error(`no such task: ${this.displayId(number)}`);
|
|
363
|
-
const result = this.db
|
|
364
|
-
.prepare("INSERT INTO comments (task_id, author, body, created_at) VALUES (?, ?, ?, ?)")
|
|
365
|
-
.run(number, author, body, now());
|
|
366
|
-
const row = this.db
|
|
367
|
-
.prepare("SELECT * FROM comments WHERE id = ?")
|
|
368
|
-
.get(Number(result.lastInsertRowid));
|
|
369
|
-
return this.toComment(row);
|
|
370
|
-
}
|
|
371
|
-
deleteComment(number, commentId) {
|
|
372
|
-
const rowid = Number(commentId);
|
|
373
|
-
const row = (Number.isInteger(rowid)
|
|
374
|
-
? this.db
|
|
375
|
-
.prepare("SELECT * FROM comments WHERE id = ? AND task_id = ?")
|
|
376
|
-
.get(rowid, number)
|
|
377
|
-
: undefined);
|
|
378
|
-
if (!row)
|
|
379
|
-
throw new Error(`no such comment on ${this.displayId(number)}: ${commentId}`);
|
|
380
|
-
this.db.prepare("DELETE FROM comments WHERE id = ?").run(rowid);
|
|
381
|
-
return this.toComment(row);
|
|
382
|
-
}
|
|
383
|
-
commentCounts() {
|
|
384
|
-
const rows = this.db
|
|
385
|
-
.prepare("SELECT task_id, COUNT(*) AS count FROM comments GROUP BY task_id")
|
|
386
|
-
.all();
|
|
387
|
-
return new Map(rows.map((r) => [r.task_id, r.count]));
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
/**
|
|
391
|
-
* Schema history, one entry per version, applied in order from whatever
|
|
392
|
-
* `PRAGMA user_version` the file is at. `.task/tasks.db` is committed to git,
|
|
393
|
-
* so an existing database is the normal case, not the exception: every step
|
|
394
|
-
* has to be safe to run against a file someone else's checkout wrote.
|
|
395
|
-
*
|
|
396
|
-
* There is one linear path — a fresh database runs *every* step, so it lands
|
|
397
|
-
* on a schema byte-identical to a migrated one, and there's no second
|
|
398
|
-
* definition of "current" to keep in sync.
|
|
399
|
-
*/
|
|
400
|
-
const MIGRATIONS = [
|
|
401
|
-
// v1 — the original schema. `IF NOT EXISTS` is load-bearing: user_version 0
|
|
402
|
-
// means "fresh *or* written before versioning existed", and this is the step
|
|
403
|
-
// that makes both of those safe to start from.
|
|
404
|
-
//
|
|
405
|
-
// The odd indentation is deliberate and load-bearing: SQLite stores the
|
|
406
|
-
// CREATE statement *verbatim* in sqlite_master, so keeping this byte-for-byte
|
|
407
|
-
// as it originally shipped is what lets a freshly-created database and a
|
|
408
|
-
// migrated one end up with an identical schema rather than one that only
|
|
409
|
-
// matches in structure.
|
|
410
|
-
`
|
|
411
|
-
CREATE TABLE IF NOT EXISTS tasks (
|
|
412
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
413
|
-
title TEXT NOT NULL,
|
|
414
|
-
description TEXT NOT NULL DEFAULT '',
|
|
415
|
-
status TEXT NOT NULL DEFAULT 'todo',
|
|
416
|
-
priority TEXT NOT NULL DEFAULT 'none',
|
|
417
|
-
assignee TEXT,
|
|
418
|
-
labels TEXT NOT NULL DEFAULT '[]',
|
|
419
|
-
position REAL NOT NULL DEFAULT 0,
|
|
420
|
-
created_at TEXT NOT NULL,
|
|
421
|
-
updated_at TEXT NOT NULL
|
|
422
|
-
);
|
|
423
|
-
CREATE TABLE IF NOT EXISTS comments (
|
|
424
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
425
|
-
task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
426
|
-
author TEXT NOT NULL DEFAULT '',
|
|
427
|
-
body TEXT NOT NULL,
|
|
428
|
-
created_at TEXT NOT NULL
|
|
429
|
-
);
|
|
430
|
-
`,
|
|
431
|
-
// v2 — labels become tags, priority/assignee give way to milestone and a
|
|
432
|
-
// needs-human flag. RENAME COLUMN (SQLite 3.25+) and DROP COLUMN (3.35+) are
|
|
433
|
-
// both available on Node ≥ 22.13, which bundles 3.49.
|
|
434
|
-
//
|
|
435
|
-
// If DROP COLUMN ever weren't available the escape hatch is the usual table
|
|
436
|
-
// rebuild — but note it would need `PRAGMA foreign_keys = OFF` issued
|
|
437
|
-
// *outside* the transaction (the pragma is a no-op inside one), because
|
|
438
|
-
// comments.task_id references tasks(id).
|
|
439
|
-
`ALTER TABLE tasks RENAME COLUMN labels TO tags;
|
|
440
|
-
ALTER TABLE tasks ADD COLUMN milestone TEXT;
|
|
441
|
-
ALTER TABLE tasks ADD COLUMN needs_human INTEGER NOT NULL DEFAULT 0;
|
|
442
|
-
ALTER TABLE tasks DROP COLUMN priority;
|
|
443
|
-
ALTER TABLE tasks DROP COLUMN assignee;`,
|
|
444
|
-
// v3 — dependencies and pull requests. One direction of "blocks" is the
|
|
445
|
-
// whole relation: (blocker, blocked) read from the blocked side is
|
|
446
|
-
// "blocked by", so the mirror is a query, not a second row. PRs are a JSON
|
|
447
|
-
// list of URLs, same shape as tags.
|
|
448
|
-
`CREATE TABLE task_links (
|
|
449
|
-
blocker_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
450
|
-
blocked_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
451
|
-
PRIMARY KEY (blocker_id, blocked_id)
|
|
452
|
-
);
|
|
453
|
-
ALTER TABLE tasks ADD COLUMN prs TEXT NOT NULL DEFAULT '[]';`,
|
|
454
|
-
];
|
|
455
|
-
/**
|
|
456
|
-
* Bring `db` up to the newest schema. DDL and `PRAGMA user_version` are both
|
|
457
|
-
* transactional in SQLite, so a failure halfway leaves the file exactly as it
|
|
458
|
-
* was — schema *and* version.
|
|
459
|
-
*/
|
|
460
|
-
function migrate(db) {
|
|
461
|
-
const { user_version: version } = db.prepare("PRAGMA user_version").get();
|
|
462
|
-
if (version >= MIGRATIONS.length)
|
|
463
|
-
return;
|
|
464
|
-
db.exec("BEGIN");
|
|
465
|
-
try {
|
|
466
|
-
for (const step of MIGRATIONS.slice(version))
|
|
467
|
-
db.exec(step);
|
|
468
|
-
db.exec(`PRAGMA user_version = ${MIGRATIONS.length}`);
|
|
469
|
-
db.exec("COMMIT");
|
|
470
|
-
}
|
|
471
|
-
catch (error) {
|
|
472
|
-
db.exec("ROLLBACK");
|
|
473
|
-
throw error;
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
108
|
//# sourceMappingURL=store.js.map
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/store.test.d.ts
CHANGED
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
* 1. The text format round-trips — parse(serialize(x)) loses nothing.
|
|
5
5
|
* 2. `FileStore` behaves like the store always has (positions, links,
|
|
6
6
|
* comments, cascade on delete).
|
|
7
|
-
* 3.
|
|
8
|
-
* 4. Concurrent-writer shapes merge by construction: a comment is a new file,
|
|
7
|
+
* 3. Concurrent-writer shapes merge by construction: a comment is a new file,
|
|
9
8
|
* a claim is a one-line status diff.
|
|
10
9
|
*/
|
|
11
10
|
export {};
|
package/dist/store.test.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.test.d.ts","sourceRoot":"","sources":["../src/store.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"store.test.d.ts","sourceRoot":"","sources":["../src/store.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|