@nickmeriano/task 0.8.0 → 0.9.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 +65 -22
- package/dist/asks.test.d.ts +17 -0
- package/dist/asks.test.d.ts.map +1 -0
- package/dist/asks.test.js +278 -0
- package/dist/asks.test.js.map +1 -0
- package/dist/check.d.ts +3 -2
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +99 -60
- package/dist/check.js.map +1 -1
- package/dist/check.test.js +99 -60
- package/dist/check.test.js.map +1 -1
- package/dist/claim-io.d.ts +73 -0
- package/dist/claim-io.d.ts.map +1 -0
- package/dist/claim-io.js +344 -0
- package/dist/claim-io.js.map +1 -0
- package/dist/claim.d.ts +21 -22
- package/dist/claim.d.ts.map +1 -1
- package/dist/claim.js +58 -83
- package/dist/claim.js.map +1 -1
- package/dist/claim.test.d.ts +2 -2
- package/dist/claim.test.js +111 -94
- package/dist/claim.test.js.map +1 -1
- package/dist/cli.js +241 -64
- package/dist/cli.js.map +1 -1
- package/dist/file-store.d.ts +70 -24
- package/dist/file-store.d.ts.map +1 -1
- package/dist/file-store.js +319 -141
- package/dist/file-store.js.map +1 -1
- package/dist/git-serve.d.ts +183 -0
- package/dist/git-serve.d.ts.map +1 -0
- package/dist/git-serve.js +503 -0
- package/dist/git-serve.js.map +1 -0
- package/dist/git-serve.test.d.ts +16 -0
- package/dist/git-serve.test.d.ts.map +1 -0
- package/dist/git-serve.test.js +183 -0
- package/dist/git-serve.test.js.map +1 -0
- package/dist/git.d.ts +65 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +114 -0
- package/dist/git.js.map +1 -0
- package/dist/id.d.ts +39 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +67 -0
- package/dist/id.js.map +1 -0
- package/dist/inbox.d.ts +41 -0
- package/dist/inbox.d.ts.map +1 -0
- package/dist/inbox.js +56 -0
- package/dist/inbox.js.map +1 -0
- package/dist/overview.d.ts +9 -0
- package/dist/overview.d.ts.map +1 -1
- package/dist/overview.js +19 -11
- package/dist/overview.js.map +1 -1
- package/dist/overview.test.js +6 -5
- package/dist/overview.test.js.map +1 -1
- package/dist/promote.test.d.ts +3 -2
- package/dist/promote.test.d.ts.map +1 -1
- package/dist/promote.test.js +29 -31
- package/dist/promote.test.js.map +1 -1
- package/dist/publish.d.ts +2 -17
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +4 -49
- package/dist/publish.js.map +1 -1
- package/dist/search.d.ts +3 -1
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +15 -2
- package/dist/search.js.map +1 -1
- package/dist/search.test.js +9 -9
- package/dist/search.test.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +218 -21
- package/dist/server.js.map +1 -1
- package/dist/store.d.ts +28 -14
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js.map +1 -1
- package/dist/store.test.js +88 -75
- package/dist/store.test.js.map +1 -1
- package/dist/ticket-doc.d.ts +26 -10
- package/dist/ticket-doc.d.ts.map +1 -1
- package/dist/ticket-doc.js +71 -27
- package/dist/ticket-doc.js.map +1 -1
- package/dist/types.d.ts +51 -17
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/skill/SKILL.md +70 -23
- package/src/asks.test.ts +355 -0
- package/src/check.test.ts +129 -72
- package/src/check.ts +101 -58
- package/src/claim-io.ts +401 -0
- package/src/claim.test.ts +141 -99
- package/src/claim.ts +69 -96
- package/src/cli.ts +251 -63
- package/src/file-store.ts +357 -145
- package/src/git-serve.test.ts +240 -0
- package/src/git-serve.ts +595 -0
- package/src/git.ts +141 -0
- package/src/id.ts +68 -0
- package/src/inbox.ts +77 -0
- package/src/overview.test.ts +6 -5
- package/src/overview.ts +25 -10
- package/src/promote.test.ts +40 -28
- package/src/publish.ts +6 -53
- package/src/search.test.ts +11 -11
- package/src/search.ts +17 -3
- package/src/server.ts +221 -19
- package/src/store.test.ts +95 -77
- package/src/store.ts +28 -13
- package/src/ticket-doc.ts +93 -30
- package/src/types.ts +52 -17
- package/ui/dist/assets/index-BjsorZOU.js +229 -0
- package/ui/dist/assets/index-CoKCUYic.css +1 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index-BJmOsOdR.js +0 -229
- package/ui/dist/assets/index-BoqQlqSU.css +0 -1
package/dist/store.test.js
CHANGED
|
@@ -13,7 +13,8 @@ import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "nod
|
|
|
13
13
|
import { tmpdir } from "node:os";
|
|
14
14
|
import { join } from "node:path";
|
|
15
15
|
import { FileStore, initProject, openBoard } from "./file-store.js";
|
|
16
|
-
import {
|
|
16
|
+
import { KEY_PATTERN } from "./id.js";
|
|
17
|
+
import { parseTicket, parseTicketLenient, serializeTicket } from "./ticket-doc.js";
|
|
17
18
|
import { findBoardsByPrefix, findScopeRoot } from "./store.js";
|
|
18
19
|
function tempRoot() {
|
|
19
20
|
const dir = mkdtempSync(join(tmpdir(), "task-test-"));
|
|
@@ -28,7 +29,6 @@ test("ticket documents round-trip, including the awkward bodies", () => {
|
|
|
28
29
|
status: "todo",
|
|
29
30
|
tags: [],
|
|
30
31
|
goal: null,
|
|
31
|
-
needsHuman: false,
|
|
32
32
|
blockedBy: [],
|
|
33
33
|
prs: [],
|
|
34
34
|
position: 1024,
|
|
@@ -43,8 +43,7 @@ test("ticket documents round-trip, including the awkward bodies", () => {
|
|
|
43
43
|
status: "in_progress",
|
|
44
44
|
tags: ["storage", "architecture"],
|
|
45
45
|
goal: "v2-storage",
|
|
46
|
-
|
|
47
|
-
blockedBy: [3, 7],
|
|
46
|
+
blockedBy: ["k3mfp", "x7c2d"],
|
|
48
47
|
prs: ["https://github.com/x/y/pull/1"],
|
|
49
48
|
position: -512.5,
|
|
50
49
|
createdAt: "2026-08-15T16:00:33.758Z",
|
|
@@ -56,7 +55,6 @@ test("ticket documents round-trip, including the awkward bodies", () => {
|
|
|
56
55
|
status: "backlog",
|
|
57
56
|
tags: [],
|
|
58
57
|
goal: null,
|
|
59
|
-
needsHuman: false,
|
|
60
58
|
blockedBy: [],
|
|
61
59
|
prs: [],
|
|
62
60
|
position: 0,
|
|
@@ -85,12 +83,12 @@ test("hand-edits are forgiven where they're unambiguous", () => {
|
|
|
85
83
|
const doc = parseTicket(text, "test");
|
|
86
84
|
assert.equal(doc.goal, "launch");
|
|
87
85
|
assert.equal(doc.position, 8);
|
|
88
|
-
// The pre-0.8 spelling
|
|
89
|
-
//
|
|
90
|
-
|
|
91
|
-
assert.
|
|
92
|
-
|
|
93
|
-
assert.
|
|
86
|
+
// The pre-0.8 `milestone:` spelling is refused by name (TAS-41: no compat)
|
|
87
|
+
// — reading past it would silently drop the goal, so the error carries the
|
|
88
|
+
// one edit that fixes the file. The lenient parser just ignores it.
|
|
89
|
+
assert.throws(() => parseTicket(text.replace("goal: launch", "milestone: launch"), "test"), /`milestone:` is the pre-0\.8 spelling.*rename the key to `goal:`/);
|
|
90
|
+
const degraded = parseTicketLenient(text.replace("goal: launch", "milestone: launch"));
|
|
91
|
+
assert.equal(degraded?.goal, null);
|
|
94
92
|
assert.throws(() => parseTicket(text.replace("status: todo", "status: todoo"), "here"), /here.*invalid status/);
|
|
95
93
|
assert.throws(() => parseTicket("no frontmatter", "here"), /here.*frontmatter/);
|
|
96
94
|
});
|
|
@@ -102,41 +100,53 @@ test("FileStore keeps the store's contract", () => {
|
|
|
102
100
|
const a = store.create({ title: "First", description: "alpha", tags: ["api"], status: "todo" });
|
|
103
101
|
const b = store.create({ title: "Second", status: "todo" });
|
|
104
102
|
const c = store.create({ title: "Third", status: "backlog" });
|
|
105
|
-
|
|
103
|
+
// Keys are random, well-formed, and distinct — never sequential (TAS-42).
|
|
104
|
+
for (const t of [a, b, c])
|
|
105
|
+
assert.match(t.key, KEY_PATTERN);
|
|
106
|
+
assert.equal(new Set([a.key, b.key, c.key]).size, 3);
|
|
107
|
+
assert.equal(a.id, `SAM-${a.key}`);
|
|
106
108
|
// New tasks land at the bottom of their column.
|
|
107
109
|
assert.ok(b.position > a.position);
|
|
108
110
|
// Status move without an explicit slot lands on top of the new column.
|
|
109
|
-
const moved = store.update(c.
|
|
111
|
+
const moved = store.update(c.key, { status: "todo" });
|
|
110
112
|
assert.ok(moved.position < a.position);
|
|
111
|
-
assert.equal(store.list({ statuses: ["todo"] })[0].
|
|
113
|
+
assert.equal(store.list({ statuses: ["todo"] })[0].key, c.key);
|
|
112
114
|
// One relation, two views, stored on one side only.
|
|
113
|
-
store.link(a.
|
|
114
|
-
assert.deepEqual(store.get(b.
|
|
115
|
-
const onDisk = readFileSync(join(root, ".task", "tickets",
|
|
116
|
-
assert.
|
|
117
|
-
assert.doesNotMatch(readFileSync(join(root, ".task", "tickets",
|
|
118
|
-
store.unlink(b.
|
|
119
|
-
assert.deepEqual(store.get(a.
|
|
120
|
-
assert.throws(() => store.link(a.
|
|
121
|
-
assert.throws(() => store.update(a.
|
|
115
|
+
store.link(a.key, "blocked_by", b.key);
|
|
116
|
+
assert.deepEqual(store.get(b.key).blocks, [a.key]);
|
|
117
|
+
const onDisk = readFileSync(join(root, ".task", "tickets", a.key, "ticket.md"), "utf8");
|
|
118
|
+
assert.ok(onDisk.includes(`blocked_by: ["${b.key}"]`));
|
|
119
|
+
assert.doesNotMatch(readFileSync(join(root, ".task", "tickets", b.key, "ticket.md"), "utf8"), /blocked_by/);
|
|
120
|
+
store.unlink(b.key, "blocks", a.key);
|
|
121
|
+
assert.deepEqual(store.get(a.key).blockedBy, []);
|
|
122
|
+
assert.throws(() => store.link(a.key, "blocks", a.key), /can't block itself/);
|
|
123
|
+
assert.throws(() => store.update(a.key, { blockedBy: ["zz9zz"] }), /no such task: SAM-zz9zz/);
|
|
124
|
+
// parseId: exact keys, PREFIX-key, and unique git-style prefixes all land.
|
|
125
|
+
assert.equal(store.parseId(a.key), a.key);
|
|
126
|
+
assert.equal(store.parseId(`SAM-${a.key}`), a.key);
|
|
127
|
+
assert.equal(store.parseId(a.key.toUpperCase()), a.key);
|
|
128
|
+
const uniquePrefix = [a, b, c].every((t) => t.key[0] !== a.key[0] || t.key === a.key)
|
|
129
|
+
? a.key[0]
|
|
130
|
+
: a.key.slice(0, 4);
|
|
131
|
+
if ([a, b, c].filter((t) => t.key.startsWith(uniquePrefix)).length === 1) {
|
|
132
|
+
assert.equal(store.parseId(uniquePrefix), a.key);
|
|
133
|
+
}
|
|
134
|
+
assert.throws(() => store.parseId("not an id!"), /invalid task id/);
|
|
122
135
|
// Comments: one file each, stable ids, author preserved.
|
|
123
|
-
const comment = store.addComment(a.
|
|
136
|
+
const comment = store.addComment(a.key, "first!\n\nwith **markdown**", "claude");
|
|
124
137
|
assert.match(comment.id, /^\d{4}-\d{2}-\d{2}T\d{6}-claude$/);
|
|
125
|
-
assert.equal(store.comments(a.
|
|
126
|
-
assert.equal(store.commentCounts().get(a.
|
|
127
|
-
const second = store.addComment(a.
|
|
138
|
+
assert.equal(store.comments(a.key)[0].body, "first!\n\nwith **markdown**");
|
|
139
|
+
assert.equal(store.commentCounts().get(a.key), 1);
|
|
140
|
+
const second = store.addComment(a.key, "again", "claude");
|
|
128
141
|
assert.notEqual(second.id, comment.id);
|
|
129
|
-
store.deleteComment(a.
|
|
130
|
-
assert.equal(store.comments(a.
|
|
131
|
-
assert.throws(() => store.deleteComment(a.
|
|
142
|
+
store.deleteComment(a.key, second.id);
|
|
143
|
+
assert.equal(store.comments(a.key).length, 1);
|
|
144
|
+
assert.throws(() => store.deleteComment(a.key, "../../escape"), /no such comment/);
|
|
132
145
|
// Delete cascades the relation away, like the FK did.
|
|
133
|
-
store.link(b.
|
|
134
|
-
store.delete(a.
|
|
135
|
-
assert.equal(store.get(a.
|
|
136
|
-
assert.deepEqual(store.get(b.
|
|
137
|
-
// Numbers never move backwards past an existing ticket.
|
|
138
|
-
const d = store.create({ title: "Fourth" });
|
|
139
|
-
assert.equal(d.number, 4);
|
|
146
|
+
store.link(b.key, "blocked_by", a.key);
|
|
147
|
+
store.delete(a.key);
|
|
148
|
+
assert.equal(store.get(a.key), null);
|
|
149
|
+
assert.deepEqual(store.get(b.key).blockedBy, []);
|
|
140
150
|
});
|
|
141
151
|
test("openBoard reads text boards, and refuses a pre-0.6 SQLite board loudly", () => {
|
|
142
152
|
const fileRoot = tempRoot();
|
|
@@ -162,40 +172,43 @@ test("archive moves finished tickets off the hot path, losing nothing", () => {
|
|
|
162
172
|
const store = initProject(root, { name: "archive test", prefix: "ARC" });
|
|
163
173
|
const keep = store.create({ title: "Still open", status: "todo" });
|
|
164
174
|
const old = store.create({ title: "Finished work", status: "todo" });
|
|
165
|
-
store.link(keep.
|
|
166
|
-
store.addComment(old.
|
|
175
|
+
store.link(keep.key, "blocked_by", old.key);
|
|
176
|
+
store.addComment(old.key, "how it went", "nick");
|
|
167
177
|
// Only finished work qualifies — archive is history, not a hiding place.
|
|
168
|
-
assert.throws(() => store.archive(old.
|
|
169
|
-
store.update(old.
|
|
170
|
-
const archived = store.archive(old.
|
|
178
|
+
assert.throws(() => store.archive(old.key), /is todo/);
|
|
179
|
+
store.update(old.key, { status: "done" });
|
|
180
|
+
const archived = store.archive(old.key);
|
|
171
181
|
assert.equal(archived.archived, true);
|
|
172
182
|
// Off the board and out of every default read…
|
|
173
|
-
assert.deepEqual(store.list({}).map((t) => t.
|
|
174
|
-
assert.equal(store.commentCounts().get(old.
|
|
183
|
+
assert.deepEqual(store.list({}).map((t) => t.key), [keep.key]);
|
|
184
|
+
assert.equal(store.commentCounts().get(old.key), undefined);
|
|
175
185
|
// …but reads still reach it, comments included, and its links still show.
|
|
176
|
-
const shown = store.get(old.
|
|
186
|
+
const shown = store.get(old.key);
|
|
177
187
|
assert.equal(shown.archived, true);
|
|
178
|
-
assert.deepEqual(shown.blocks, [keep.
|
|
179
|
-
assert.equal(store.comments(old.
|
|
188
|
+
assert.deepEqual(shown.blocks, [keep.key]);
|
|
189
|
+
assert.equal(store.comments(old.key)[0].body, "how it went");
|
|
180
190
|
const listed = store.list({ archived: true });
|
|
181
|
-
assert.deepEqual(listed.map((t) => [t.
|
|
191
|
+
assert.deepEqual(listed.map((t) => [t.key, t.archived]), [[old.key, true]]);
|
|
182
192
|
// Writes refuse until unarchived, with a message that says what to do.
|
|
183
|
-
assert.throws(() => store.update(old.
|
|
184
|
-
assert.throws(() => store.addComment(old.
|
|
185
|
-
assert.throws(() => store.delete(old.
|
|
186
|
-
assert.throws(() => store.archive(old.
|
|
193
|
+
assert.throws(() => store.update(old.key, { title: "x" }), /archived — run/);
|
|
194
|
+
assert.throws(() => store.addComment(old.key, "x", "y"), /archived — run/);
|
|
195
|
+
assert.throws(() => store.delete(old.key), /archived — run/);
|
|
196
|
+
assert.throws(() => store.archive(old.key), /already archived/);
|
|
187
197
|
// Linking *to* an archived target refuses; pruning a stale link succeeds.
|
|
188
|
-
assert.throws(() => store.link(keep.
|
|
189
|
-
assert.deepEqual(store.update(keep.
|
|
190
|
-
//
|
|
191
|
-
|
|
198
|
+
assert.throws(() => store.link(keep.key, "blocked_by", old.key), /archived — run/);
|
|
199
|
+
assert.deepEqual(store.update(keep.key, { blockedBy: [] }).blockedBy, []);
|
|
200
|
+
// Keys stay reserved — a new mint can never take an archived ticket's name.
|
|
201
|
+
const next = store.create({ title: "Next" });
|
|
202
|
+
assert.notEqual(next.key, old.key);
|
|
203
|
+
// An archived key still resolves through parseId (exact match).
|
|
204
|
+
assert.equal(store.parseId(`ARC-${old.key}`), old.key);
|
|
192
205
|
// Round trip: unarchive puts it back exactly as it was.
|
|
193
|
-
const back = store.unarchive(old.
|
|
206
|
+
const back = store.unarchive(old.key);
|
|
194
207
|
assert.equal(back.archived, undefined);
|
|
195
208
|
assert.equal(back.status, "done");
|
|
196
209
|
assert.deepEqual(store.list({ archived: true }), []);
|
|
197
|
-
assert.equal(store.comments(old.
|
|
198
|
-
assert.throws(() => store.unarchive(old.
|
|
210
|
+
assert.equal(store.comments(old.key).length, 1);
|
|
211
|
+
assert.throws(() => store.unarchive(old.key), /isn't archived/);
|
|
199
212
|
});
|
|
200
213
|
test("goals: titled and described, one per task, progress always derived", () => {
|
|
201
214
|
const root = tempRoot();
|
|
@@ -213,34 +226,34 @@ test("goals: titled and described, one per task, progress always derived", () =>
|
|
|
213
226
|
assert.throws(() => store.create({ title: "T", goal: "nope" }), /no such goal/);
|
|
214
227
|
const a = store.create({ title: "First", goal: goal.slug });
|
|
215
228
|
const b = store.create({ title: "Second" });
|
|
216
|
-
store.update(b.
|
|
217
|
-
assert.equal(store.get(b.
|
|
218
|
-
assert.deepEqual(store.list({ goal: goal.slug }).map((t) => t.
|
|
229
|
+
store.update(b.key, { goal: goal.slug });
|
|
230
|
+
assert.equal(store.get(b.key).goal, goal.slug);
|
|
231
|
+
assert.deepEqual(store.list({ goal: goal.slug }).map((t) => t.key), [a.key, b.key]);
|
|
219
232
|
// The file is the state: goal ref serialized on the ticket, goal file on disk.
|
|
220
|
-
assert.match(readFileSync(join(root, ".task", "tickets",
|
|
233
|
+
assert.match(readFileSync(join(root, ".task", "tickets", a.key, "ticket.md"), "utf8"), /goal: "trust-guardrail-layer"/);
|
|
221
234
|
const goalFile = readFileSync(join(root, ".task", "goals", "trust-guardrail-layer.md"), "utf8");
|
|
222
235
|
assert.match(goalFile, /# Trust & guardrail layer/);
|
|
223
236
|
// Update touches the file; clearing a task's goal is `goal: null`.
|
|
224
237
|
store.updateGoal(goal.slug, { description: "Sharper why." });
|
|
225
238
|
assert.equal(store.getGoal(goal.slug).description, "Sharper why.");
|
|
226
|
-
store.update(b.
|
|
227
|
-
assert.equal(store.get(b.
|
|
239
|
+
store.update(b.key, { goal: null });
|
|
240
|
+
assert.equal(store.get(b.key).goal, null);
|
|
228
241
|
// Archive refuses while open work references the goal, allows after.
|
|
229
|
-
assert.throws(() => store.archiveGoal(goal.slug),
|
|
230
|
-
store.update(a.
|
|
242
|
+
assert.throws(() => store.archiveGoal(goal.slug), new RegExp(`still has open tasks \\(GOA-${a.key}\\)`));
|
|
243
|
+
store.update(a.key, { status: "done" });
|
|
231
244
|
const shelved = store.archiveGoal(goal.slug);
|
|
232
245
|
assert.equal(shelved.archived, true);
|
|
233
246
|
assert.deepEqual(store.goals().map((g) => g.slug), []);
|
|
234
247
|
assert.deepEqual(store.goals(true).map((g) => g.slug), [goal.slug]);
|
|
235
248
|
// Still resolvable (done tickets keep their ref readable), not assignable.
|
|
236
249
|
assert.equal(store.getGoal(goal.slug).title, "Trust & guardrail layer");
|
|
237
|
-
assert.throws(() => store.update(b.
|
|
250
|
+
assert.throws(() => store.update(b.key, { goal: goal.slug }), /is archived — run/);
|
|
238
251
|
assert.throws(() => store.updateGoal(goal.slug, { title: "x" }), /is archived — run/);
|
|
239
252
|
// Delete needs every live ref cleared first — pruning organization is a
|
|
240
253
|
// human call, so the human makes it.
|
|
241
254
|
store.unarchiveGoal(goal.slug);
|
|
242
|
-
assert.throws(() => store.deleteGoal(goal.slug),
|
|
243
|
-
store.update(a.
|
|
255
|
+
assert.throws(() => store.deleteGoal(goal.slug), new RegExp(`referenced by GOA-${a.key}`));
|
|
256
|
+
store.update(a.key, { goal: null });
|
|
244
257
|
store.deleteGoal(goal.slug);
|
|
245
258
|
assert.equal(store.getGoal(goal.slug), null);
|
|
246
259
|
});
|
|
@@ -262,18 +275,18 @@ test("concurrent-writer shapes merge by construction", () => {
|
|
|
262
275
|
const task = store.create({ title: "Contended", status: "todo" });
|
|
263
276
|
// Two agents commenting at once = two files; simulate the second writer by
|
|
264
277
|
// dropping its file in directly, the way a git merge would.
|
|
265
|
-
store.addComment(task.
|
|
266
|
-
const commentsDir = join(root, ".task", "tickets",
|
|
278
|
+
store.addComment(task.key, "from session one", "claude");
|
|
279
|
+
const commentsDir = join(root, ".task", "tickets", task.key, "comments");
|
|
267
280
|
writeFileSync(join(commentsDir, "2026-08-15T170000-other.md"), "---\nauthor: \"other\"\ncreated: 2026-08-15T17:00:00.000Z\n---\n\nfrom session two\n");
|
|
268
|
-
assert.equal(store.comments(task.
|
|
281
|
+
assert.equal(store.comments(task.key).length, 2);
|
|
269
282
|
// A claim is a one-line diff: exactly one meaningful frontmatter line
|
|
270
283
|
// changes. `updated:` is excluded because it only changes when the update
|
|
271
284
|
// lands in a different millisecond than the create — true except when this
|
|
272
285
|
// test runs fast enough, which is exactly the kind of coin-flip a test must
|
|
273
286
|
// not depend on.
|
|
274
|
-
const path = join(root, ".task", "tickets",
|
|
287
|
+
const path = join(root, ".task", "tickets", task.key, "ticket.md");
|
|
275
288
|
const before = readFileSync(path, "utf8").split("\n");
|
|
276
|
-
store.update(task.
|
|
289
|
+
store.update(task.key, { status: "in_progress", position: task.position });
|
|
277
290
|
const after = readFileSync(path, "utf8").split("\n");
|
|
278
291
|
const changed = before.filter((line, i) => after[i] !== line);
|
|
279
292
|
assert.deepEqual(changed.filter((line) => !line.startsWith("updated: ")), ["status: todo"]);
|
package/dist/store.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.test.js","sourceRoot":"","sources":["../src/store.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.test.js","sourceRoot":"","sources":["../src/store.test.ts"],"names":[],"mappings":"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"}
|
package/dist/ticket-doc.d.ts
CHANGED
|
@@ -23,9 +23,8 @@ export interface TicketDoc {
|
|
|
23
23
|
tags: string[];
|
|
24
24
|
/** Slug of the goal this ticket belongs to — at most one, by design. */
|
|
25
25
|
goal: string | null;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
blockedBy: number[];
|
|
26
|
+
/** Keys of tasks blocking this one — the single stored side of the relation. */
|
|
27
|
+
blockedBy: string[];
|
|
29
28
|
prs: string[];
|
|
30
29
|
position: number;
|
|
31
30
|
createdAt: string;
|
|
@@ -38,13 +37,8 @@ export interface TicketDoc {
|
|
|
38
37
|
*/
|
|
39
38
|
extras?: [string, string][];
|
|
40
39
|
}
|
|
41
|
-
/**
|
|
42
|
-
|
|
43
|
-
* `milestone` is the pre-0.8 spelling of `goal`: still *read* (as the goal, so
|
|
44
|
-
* old boards keep rendering) but never written — `task check` flags it and
|
|
45
|
-
* `--fix` rewrites the file, which is the whole migration.
|
|
46
|
-
*/
|
|
47
|
-
export declare const TICKET_FIELDS: readonly ["status", "tags", "goal", "milestone", "needs_human", "blocked_by", "prs", "position", "created", "updated"];
|
|
40
|
+
/** The frontmatter keys a ticket file may carry; anything else is an extra. */
|
|
41
|
+
export declare const TICKET_FIELDS: readonly ["status", "tags", "goal", "blocked_by", "prs", "position", "created", "updated"];
|
|
48
42
|
/** The frontmatter keys a comment file may carry. */
|
|
49
43
|
export declare const COMMENT_FIELDS: readonly ["author", "created"];
|
|
50
44
|
export interface CommentDoc {
|
|
@@ -52,6 +46,20 @@ export interface CommentDoc {
|
|
|
52
46
|
createdAt: string;
|
|
53
47
|
body: string;
|
|
54
48
|
}
|
|
49
|
+
/** The frontmatter keys an ask file may carry. */
|
|
50
|
+
export declare const ASK_FIELDS: readonly ["author", "created", "resolved", "resolved_by"];
|
|
51
|
+
/**
|
|
52
|
+
* One ask on disk — `tickets/<n>/asks/<stem>.md`, the comment layout plus a
|
|
53
|
+
* resolution: `resolved`/`resolved_by` appear when the ask is closed and are
|
|
54
|
+
* simply absent while it's open, so an open ask's bytes never churn.
|
|
55
|
+
*/
|
|
56
|
+
export interface AskDoc {
|
|
57
|
+
author: string;
|
|
58
|
+
createdAt: string;
|
|
59
|
+
resolvedAt: string | null;
|
|
60
|
+
resolvedBy: string | null;
|
|
61
|
+
body: string;
|
|
62
|
+
}
|
|
55
63
|
/** A parse that names the file it failed in — these files invite hand-editing. */
|
|
56
64
|
export declare class TicketParseError extends Error {
|
|
57
65
|
}
|
|
@@ -90,6 +98,14 @@ export declare function serializeGoal(doc: GoalDoc): string;
|
|
|
90
98
|
export declare function parseGoalLenient(text: string): GoalDoc | null;
|
|
91
99
|
export declare function parseComment(text: string, where: string): CommentDoc;
|
|
92
100
|
export declare function serializeComment(doc: CommentDoc): string;
|
|
101
|
+
export declare function parseAsk(text: string, where: string): AskDoc;
|
|
102
|
+
export declare function serializeAsk(doc: AskDoc): string;
|
|
103
|
+
/**
|
|
104
|
+
* An ask, forgivingly — null when there's no frontmatter at all. The lenient
|
|
105
|
+
* read matters more here than for comments: the inbox reads ask files straight
|
|
106
|
+
* off claim branches, which are exactly the bytes a strict parser can't refuse.
|
|
107
|
+
*/
|
|
108
|
+
export declare function parseAskLenient(text: string): AskDoc | null;
|
|
93
109
|
/** A ticket, forgivingly — or null when there's no frontmatter to read at all. */
|
|
94
110
|
export declare function parseTicketLenient(text: string): TicketDoc | null;
|
|
95
111
|
/**
|
package/dist/ticket-doc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ticket-doc.d.ts","sourceRoot":"","sources":["../src/ticket-doc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAA;AAE5D,8EAA8E;AAC9E,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,wEAAwE;IACxE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,
|
|
1
|
+
{"version":3,"file":"ticket-doc.d.ts","sourceRoot":"","sources":["../src/ticket-doc.ts"],"names":[],"mappings":"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"}
|
package/dist/ticket-doc.js
CHANGED
|
@@ -15,18 +15,11 @@
|
|
|
15
15
|
* diff of a new ticket *is* the ticket.
|
|
16
16
|
*/
|
|
17
17
|
import { STATUSES, isStatus } from "./types.js";
|
|
18
|
-
/**
|
|
19
|
-
* The frontmatter keys a ticket file may carry; anything else is an extra.
|
|
20
|
-
* `milestone` is the pre-0.8 spelling of `goal`: still *read* (as the goal, so
|
|
21
|
-
* old boards keep rendering) but never written — `task check` flags it and
|
|
22
|
-
* `--fix` rewrites the file, which is the whole migration.
|
|
23
|
-
*/
|
|
18
|
+
/** The frontmatter keys a ticket file may carry; anything else is an extra. */
|
|
24
19
|
export const TICKET_FIELDS = [
|
|
25
20
|
"status",
|
|
26
21
|
"tags",
|
|
27
22
|
"goal",
|
|
28
|
-
"milestone",
|
|
29
|
-
"needs_human",
|
|
30
23
|
"blocked_by",
|
|
31
24
|
"prs",
|
|
32
25
|
"position",
|
|
@@ -35,6 +28,8 @@ export const TICKET_FIELDS = [
|
|
|
35
28
|
];
|
|
36
29
|
/** The frontmatter keys a comment file may carry. */
|
|
37
30
|
export const COMMENT_FIELDS = ["author", "created"];
|
|
31
|
+
/** The frontmatter keys an ask file may carry. */
|
|
32
|
+
export const ASK_FIELDS = ["author", "created", "resolved", "resolved_by"];
|
|
38
33
|
/** A parse that names the file it failed in — these files invite hand-editing. */
|
|
39
34
|
export class TicketParseError extends Error {
|
|
40
35
|
}
|
|
@@ -108,14 +103,16 @@ function stringList(raw, key, where) {
|
|
|
108
103
|
return value;
|
|
109
104
|
throw new TicketParseError(`${where}: ${key} should be a list of strings, e.g. ["a", "b"]`);
|
|
110
105
|
}
|
|
111
|
-
function
|
|
106
|
+
function keyList(raw, key, where) {
|
|
112
107
|
const value = field(raw, key);
|
|
113
108
|
if (value === undefined)
|
|
114
109
|
return [];
|
|
115
|
-
if (Array.isArray(value) && value.every((v) => typeof v === "
|
|
110
|
+
if (Array.isArray(value) && value.every((v) => typeof v === "string")) {
|
|
116
111
|
return value;
|
|
117
112
|
}
|
|
118
|
-
|
|
113
|
+
// A list of bare numbers is a pre-migration file (ids were sequential
|
|
114
|
+
// integers before TAS-42) — name the one edit that fixes it.
|
|
115
|
+
throw new TicketParseError(`${where}: ${key} should be a list of ticket keys, e.g. ["x7k4m", "q3v8d"] — numeric entries are the pre-TAS-42 id format, which is no longer read`);
|
|
119
116
|
}
|
|
120
117
|
// ── Tickets ──────────────────────────────────────────────────────────────────
|
|
121
118
|
/**
|
|
@@ -139,11 +136,16 @@ export function parseTicket(text, where) {
|
|
|
139
136
|
if (!isStatus(status)) {
|
|
140
137
|
throw new TicketParseError(`${where}: invalid status "${status}" — one of: ${STATUSES.join(", ")}`);
|
|
141
138
|
}
|
|
142
|
-
|
|
139
|
+
// The pre-0.8 `milestone:` spelling is not honored (TAS-41: no compat), and
|
|
140
|
+
// reading past it would silently drop the ticket's goal — refuse by name
|
|
141
|
+
// instead, so the one edit that fixes the file is in the error.
|
|
142
|
+
if (raw.fields.has("milestone")) {
|
|
143
|
+
throw new TicketParseError(`${where}: \`milestone:\` is the pre-0.8 spelling and is no longer read — rename the key to \`goal:\``);
|
|
144
|
+
}
|
|
145
|
+
const goal = field(raw, "goal");
|
|
143
146
|
if (goal !== undefined && goal !== null && typeof goal !== "string") {
|
|
144
147
|
throw new TicketParseError(`${where}: goal should be a string`);
|
|
145
148
|
}
|
|
146
|
-
const needsHuman = field(raw, "needs_human");
|
|
147
149
|
const position = field(raw, "position");
|
|
148
150
|
if (position !== undefined && typeof position !== "number") {
|
|
149
151
|
throw new TicketParseError(`${where}: position should be a number`);
|
|
@@ -164,8 +166,7 @@ export function parseTicket(text, where) {
|
|
|
164
166
|
status,
|
|
165
167
|
tags: stringList(raw, "tags", where),
|
|
166
168
|
goal: typeof goal === "string" && goal !== "" ? goal : null,
|
|
167
|
-
|
|
168
|
-
blockedBy: numberList(raw, "blocked_by", where),
|
|
169
|
+
blockedBy: keyList(raw, "blocked_by", where),
|
|
169
170
|
prs: stringList(raw, "prs", where),
|
|
170
171
|
position: typeof position === "number" ? position : 0,
|
|
171
172
|
createdAt: stringField(raw, "created", where, ""),
|
|
@@ -189,8 +190,6 @@ export function serializeTicket(doc) {
|
|
|
189
190
|
lines.push(`tags: ${list(doc.tags)}`);
|
|
190
191
|
if (doc.goal)
|
|
191
192
|
lines.push(`goal: ${JSON.stringify(doc.goal)}`);
|
|
192
|
-
if (doc.needsHuman)
|
|
193
|
-
lines.push(`needs_human: true`);
|
|
194
193
|
if (doc.blockedBy.length)
|
|
195
194
|
lines.push(`blocked_by: ${list(doc.blockedBy)}`);
|
|
196
195
|
if (doc.prs.length)
|
|
@@ -284,6 +283,52 @@ export function serializeComment(doc) {
|
|
|
284
283
|
lines.push(`created: ${doc.createdAt}`, "---", "", doc.body);
|
|
285
284
|
return `${lines.join("\n")}\n`;
|
|
286
285
|
}
|
|
286
|
+
// ── Asks ─────────────────────────────────────────────────────────────────────
|
|
287
|
+
export function parseAsk(text, where) {
|
|
288
|
+
const raw = splitRaw(text, where);
|
|
289
|
+
const resolvedAt = field(raw, "resolved");
|
|
290
|
+
if (resolvedAt !== undefined && typeof resolvedAt !== "string") {
|
|
291
|
+
throw new TicketParseError(`${where}: resolved should be a timestamp string`);
|
|
292
|
+
}
|
|
293
|
+
return {
|
|
294
|
+
author: stringField(raw, "author", where, ""),
|
|
295
|
+
createdAt: stringField(raw, "created", where, ""),
|
|
296
|
+
resolvedAt: resolvedAt ?? null,
|
|
297
|
+
resolvedBy: resolvedAt === undefined ? null : stringField(raw, "resolved_by", where, ""),
|
|
298
|
+
body: raw.body,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
export function serializeAsk(doc) {
|
|
302
|
+
const lines = ["---"];
|
|
303
|
+
if (doc.author)
|
|
304
|
+
lines.push(`author: ${JSON.stringify(doc.author)}`);
|
|
305
|
+
lines.push(`created: ${doc.createdAt}`);
|
|
306
|
+
if (doc.resolvedAt) {
|
|
307
|
+
lines.push(`resolved: ${doc.resolvedAt}`);
|
|
308
|
+
if (doc.resolvedBy)
|
|
309
|
+
lines.push(`resolved_by: ${JSON.stringify(doc.resolvedBy)}`);
|
|
310
|
+
}
|
|
311
|
+
lines.push("---", "", doc.body);
|
|
312
|
+
return `${lines.join("\n")}\n`;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* An ask, forgivingly — null when there's no frontmatter at all. The lenient
|
|
316
|
+
* read matters more here than for comments: the inbox reads ask files straight
|
|
317
|
+
* off claim branches, which are exactly the bytes a strict parser can't refuse.
|
|
318
|
+
*/
|
|
319
|
+
export function parseAskLenient(text) {
|
|
320
|
+
const raw = splitRaw(text, null);
|
|
321
|
+
if (!raw)
|
|
322
|
+
return null;
|
|
323
|
+
const resolvedAt = field(raw, "resolved");
|
|
324
|
+
return {
|
|
325
|
+
author: lenientString(field(raw, "author")),
|
|
326
|
+
createdAt: lenientString(field(raw, "created")),
|
|
327
|
+
resolvedAt: typeof resolvedAt === "string" && resolvedAt !== "" ? resolvedAt : null,
|
|
328
|
+
resolvedBy: lenientString(field(raw, "resolved_by")) || null,
|
|
329
|
+
body: raw.body,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
287
332
|
// ── Lenient parsing ──────────────────────────────────────────────────────────
|
|
288
333
|
//
|
|
289
334
|
// The hosted board's read of the same format. The CLI is strict — it wrote the
|
|
@@ -295,10 +340,10 @@ export function serializeComment(doc) {
|
|
|
295
340
|
function lenientStrings(value) {
|
|
296
341
|
return Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
|
|
297
342
|
}
|
|
298
|
-
function
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
343
|
+
function lenientKeys(value) {
|
|
344
|
+
// Numeric entries (the pre-TAS-42 id format) are dropped, not coerced: a
|
|
345
|
+
// rendered old branch degrades to unlinked tickets, never to wrong links.
|
|
346
|
+
return Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
|
|
302
347
|
}
|
|
303
348
|
function lenientString(value) {
|
|
304
349
|
return typeof value === "string" ? value : "";
|
|
@@ -309,10 +354,10 @@ export function parseTicketLenient(text) {
|
|
|
309
354
|
if (!raw)
|
|
310
355
|
return null;
|
|
311
356
|
const status = field(raw, "status");
|
|
312
|
-
//
|
|
313
|
-
//
|
|
314
|
-
//
|
|
315
|
-
const goal = field(raw, "goal")
|
|
357
|
+
// No `milestone:` read here either — on the old branches the hosted board
|
|
358
|
+
// previews, a pre-0.8 ticket degrades to goalless, the same as any other
|
|
359
|
+
// retired field. History renders; it doesn't get reinterpreted.
|
|
360
|
+
const goal = field(raw, "goal");
|
|
316
361
|
const position = field(raw, "position");
|
|
317
362
|
const { title, description } = splitTitle(raw.body);
|
|
318
363
|
return {
|
|
@@ -321,8 +366,7 @@ export function parseTicketLenient(text) {
|
|
|
321
366
|
status: typeof status === "string" && isStatus(status) ? status : "backlog",
|
|
322
367
|
tags: lenientStrings(field(raw, "tags")),
|
|
323
368
|
goal: typeof goal === "string" && goal !== "" ? goal : null,
|
|
324
|
-
|
|
325
|
-
blockedBy: [...new Set(lenientNumbers(field(raw, "blocked_by")))].sort((a, b) => a - b),
|
|
369
|
+
blockedBy: [...new Set(lenientKeys(field(raw, "blocked_by")))].sort(),
|
|
326
370
|
prs: lenientStrings(field(raw, "prs")),
|
|
327
371
|
position: typeof position === "number" && Number.isFinite(position) ? position : 0,
|
|
328
372
|
createdAt: lenientString(field(raw, "created")),
|