@relayfile/adapter-linear 0.2.2 → 0.2.4

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=emit-auxiliary-files.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-auxiliary-files.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/emit-auxiliary-files.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,596 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { emitLinearAuxiliaryFiles } from '../emit-auxiliary-files.js';
4
+ import { LINEAR_PATH_ROOT, linearByIdAliasPath, linearByTitleAliasPath, linearByUuidAliasPath, linearIssueByStatePath, linearIssuePath, linearIssuesIndexPath, linearProjectPath, linearTeamPath, linearTeamsIndexPath, linearUserPath, linearUsersIndexPath, } from '../path-mapper.js';
5
+ const ISSUES_SCOPE = `${LINEAR_PATH_ROOT}/issues`;
6
+ function createClient(options = {}) {
7
+ const files = new Map(Object.entries(options.initialFiles ?? {}));
8
+ const writes = [];
9
+ const deletes = [];
10
+ const reads = [];
11
+ const failWriteOn = options.failWriteOn ?? new Set();
12
+ const failReadOn = options.failReadOn ?? new Set();
13
+ const client = {
14
+ writes,
15
+ deletes,
16
+ reads,
17
+ files,
18
+ async writeFile(input) {
19
+ writes.push(input);
20
+ if (failWriteOn.has(input.path)) {
21
+ throw new Error(`forced write failure at ${input.path}`);
22
+ }
23
+ files.set(input.path, input.content);
24
+ return { created: true };
25
+ },
26
+ async deleteFile(input) {
27
+ deletes.push(input);
28
+ files.delete(input.path);
29
+ },
30
+ };
31
+ if (!options.noRead) {
32
+ client.readFile = async (input) => {
33
+ reads.push(input);
34
+ if (failReadOn.has(input.path)) {
35
+ throw new Error(`forced read failure at ${input.path}`);
36
+ }
37
+ const content = files.get(input.path);
38
+ return content === undefined ? null : { content };
39
+ };
40
+ }
41
+ return client;
42
+ }
43
+ describe('emitLinearAuxiliaryFiles', () => {
44
+ it('returns a zero result on empty input', async () => {
45
+ const client = createClient();
46
+ const result = await emitLinearAuxiliaryFiles(client, { workspaceId: 'ws-1' });
47
+ assert.deepEqual(result, { written: 0, deleted: 0, errors: [] });
48
+ assert.equal(client.writes.length, 0);
49
+ assert.equal(client.deletes.length, 0);
50
+ });
51
+ it('writes the canonical path plus by-uuid, by-id, by-title, by-state aliases plus index row for an issue', async () => {
52
+ const client = createClient();
53
+ const issue = {
54
+ id: 'issue-123',
55
+ identifier: 'AGE-8',
56
+ title: 'Release Plan',
57
+ state: { id: 'state-1', name: 'In Progress' },
58
+ updatedAt: '2026-05-12T00:00:00Z',
59
+ };
60
+ const result = await emitLinearAuxiliaryFiles(client, {
61
+ workspaceId: 'ws-1',
62
+ issues: [issue],
63
+ });
64
+ // Issue emits 5 files (canonical + by-uuid + by-id + by-title + by-state) + 1 index.
65
+ assert.equal(result.written, 6);
66
+ assert.deepEqual(result.errors, []);
67
+ const expectedPaths = [
68
+ linearIssuePath('issue-123', 'AGE-8'),
69
+ linearByUuidAliasPath(ISSUES_SCOPE, 'issue-123'),
70
+ linearByIdAliasPath(ISSUES_SCOPE, 'AGE-8'),
71
+ linearByTitleAliasPath(ISSUES_SCOPE, 'Release Plan', 'issue-123'),
72
+ linearIssueByStatePath('In Progress', 'AGE-8'),
73
+ linearIssuesIndexPath(),
74
+ ];
75
+ const writtenPaths = client.writes.map((w) => w.path);
76
+ for (const expected of expectedPaths) {
77
+ assert.ok(writtenPaths.includes(expected), `missing expected path ${expected}`);
78
+ }
79
+ // Index row carries identifier + state.
80
+ const indexBytes = client.files.get(linearIssuesIndexPath());
81
+ const rows = JSON.parse(indexBytes);
82
+ assert.equal(rows.length, 1);
83
+ assert.equal(rows[0].id, 'issue-123');
84
+ assert.equal(rows[0].identifier, 'AGE-8');
85
+ assert.equal(rows[0].state, 'In Progress');
86
+ assert.equal(rows[0].title, 'Release Plan');
87
+ // Canonical bytes are identical at every emitted alias path.
88
+ const canonicalBytes = client.files.get(linearIssuePath('issue-123', 'AGE-8'));
89
+ for (const path of expectedPaths) {
90
+ if (path === linearIssuesIndexPath())
91
+ continue;
92
+ assert.equal(client.files.get(path), canonicalBytes, `bytes mismatch at ${path}`);
93
+ }
94
+ });
95
+ it('reconciles prior by-title alias and canonical path on issue rename via the by-id anchor', async () => {
96
+ const priorPayload = {
97
+ provider: 'linear',
98
+ objectType: 'issue',
99
+ objectId: 'issue-123',
100
+ deleted: false,
101
+ payload: {
102
+ id: 'issue-123',
103
+ identifier: 'AGE-8',
104
+ title: 'Old Title',
105
+ state: { name: 'In Progress' },
106
+ },
107
+ };
108
+ const client = createClient({
109
+ initialFiles: {
110
+ [linearByUuidAliasPath(ISSUES_SCOPE, 'issue-123')]: JSON.stringify(priorPayload),
111
+ },
112
+ });
113
+ const result = await emitLinearAuxiliaryFiles(client, {
114
+ workspaceId: 'ws-1',
115
+ issues: [
116
+ {
117
+ id: 'issue-123',
118
+ identifier: 'AGE-8',
119
+ title: 'New Title',
120
+ state: { id: 's', name: 'In Progress' },
121
+ },
122
+ ],
123
+ });
124
+ const deletedPaths = client.deletes.map((d) => d.path);
125
+ // Prior by-title alias should be deleted (title changed).
126
+ assert.ok(deletedPaths.includes(linearByTitleAliasPath(ISSUES_SCOPE, 'Old Title', 'issue-123')), `expected prior by-title alias in deletes, got: ${deletedPaths.join(', ')}`);
127
+ // by-id alias stays — it's keyed on the identifier, which didn't change.
128
+ assert.ok(!deletedPaths.includes(linearByIdAliasPath(ISSUES_SCOPE, 'AGE-8')));
129
+ // by-uuid alias stays — it's keyed on the UUID, which never changes.
130
+ assert.ok(!deletedPaths.includes(linearByUuidAliasPath(ISSUES_SCOPE, 'issue-123')));
131
+ // New by-title alias and canonical path landed.
132
+ const writtenPaths = client.writes.map((w) => w.path);
133
+ assert.ok(writtenPaths.includes(linearByTitleAliasPath(ISSUES_SCOPE, 'New Title', 'issue-123')));
134
+ assert.ok(writtenPaths.includes(linearIssuePath('issue-123', 'AGE-8')));
135
+ assert.deepEqual(result.errors, []);
136
+ });
137
+ it('reconciles by-state alias on issue state transition', async () => {
138
+ const priorPayload = {
139
+ provider: 'linear',
140
+ objectType: 'issue',
141
+ objectId: 'issue-123',
142
+ payload: {
143
+ id: 'issue-123',
144
+ identifier: 'AGE-8',
145
+ title: 'Release Plan',
146
+ state: { name: 'Todo' },
147
+ },
148
+ };
149
+ const client = createClient({
150
+ initialFiles: {
151
+ [linearByUuidAliasPath(ISSUES_SCOPE, 'issue-123')]: JSON.stringify(priorPayload),
152
+ },
153
+ });
154
+ await emitLinearAuxiliaryFiles(client, {
155
+ workspaceId: 'ws-1',
156
+ issues: [
157
+ {
158
+ id: 'issue-123',
159
+ identifier: 'AGE-8',
160
+ title: 'Release Plan',
161
+ state: { id: 's', name: 'Done' },
162
+ },
163
+ ],
164
+ });
165
+ const deletedPaths = client.deletes.map((d) => d.path);
166
+ assert.ok(deletedPaths.includes(linearIssueByStatePath('Todo', 'AGE-8')), `expected prior by-state alias in deletes, got: ${deletedPaths.join(', ')}`);
167
+ const writtenPaths = client.writes.map((w) => w.path);
168
+ assert.ok(writtenPaths.includes(linearIssueByStatePath('Done', 'AGE-8')));
169
+ });
170
+ it('writes canonical user + index row', async () => {
171
+ const client = createClient();
172
+ await emitLinearAuxiliaryFiles(client, {
173
+ workspaceId: 'ws-1',
174
+ users: [
175
+ {
176
+ id: 'user-1',
177
+ displayName: 'Alice',
178
+ email: 'alice@example.com',
179
+ updatedAt: '2026-05-12T00:00:00Z',
180
+ },
181
+ ],
182
+ });
183
+ const writtenPaths = client.writes.map((w) => w.path);
184
+ assert.ok(writtenPaths.includes(linearUserPath('user-1')));
185
+ assert.ok(writtenPaths.includes(linearUsersIndexPath()));
186
+ const indexBytes = client.files.get(linearUsersIndexPath());
187
+ const rows = JSON.parse(indexBytes);
188
+ assert.equal(rows.length, 1);
189
+ assert.equal(rows[0].id, 'user-1');
190
+ assert.equal(rows[0].title, 'Alice');
191
+ });
192
+ it('writes canonical team + index row', async () => {
193
+ const client = createClient();
194
+ await emitLinearAuxiliaryFiles(client, {
195
+ workspaceId: 'ws-1',
196
+ teams: [
197
+ {
198
+ id: 'team-1',
199
+ name: 'Engineering',
200
+ key: 'ENG',
201
+ updatedAt: '2026-05-12T00:00:00Z',
202
+ },
203
+ ],
204
+ });
205
+ const writtenPaths = client.writes.map((w) => w.path);
206
+ assert.ok(writtenPaths.includes(linearTeamPath('team-1')));
207
+ assert.ok(writtenPaths.includes(linearTeamsIndexPath()));
208
+ const indexBytes = client.files.get(linearTeamsIndexPath());
209
+ const rows = JSON.parse(indexBytes);
210
+ assert.equal(rows.length, 1);
211
+ assert.equal(rows[0].id, 'team-1');
212
+ assert.equal(rows[0].title, 'Engineering');
213
+ });
214
+ it('writes canonical project file only (no index file today)', async () => {
215
+ const client = createClient();
216
+ await emitLinearAuxiliaryFiles(client, {
217
+ workspaceId: 'ws-1',
218
+ projects: [
219
+ {
220
+ id: 'project-1',
221
+ name: 'Roadmap',
222
+ updatedAt: '2026-05-12T00:00:00Z',
223
+ },
224
+ ],
225
+ });
226
+ const writtenPaths = client.writes.map((w) => w.path);
227
+ assert.ok(writtenPaths.includes(linearProjectPath('project-1')));
228
+ // No project index file is emitted (no path-mapper helper today).
229
+ assert.ok(!writtenPaths.some((p) => p.endsWith('/projects/_index.json')));
230
+ });
231
+ it('delete tombstone for an issue removes canonical + every prior alias and drops the index row', async () => {
232
+ const priorPayload = {
233
+ provider: 'linear',
234
+ objectType: 'issue',
235
+ objectId: 'issue-123',
236
+ payload: {
237
+ id: 'issue-123',
238
+ identifier: 'AGE-8',
239
+ title: 'Release Plan',
240
+ state: { name: 'In Progress' },
241
+ },
242
+ };
243
+ const priorIndex = [
244
+ {
245
+ id: 'issue-123',
246
+ title: 'Release Plan',
247
+ updated: '2026-05-12T00:00:00Z',
248
+ identifier: 'AGE-8',
249
+ state: 'In Progress',
250
+ },
251
+ {
252
+ id: 'issue-456',
253
+ title: 'Other Issue',
254
+ updated: '2026-05-11T00:00:00Z',
255
+ identifier: 'AGE-9',
256
+ state: 'Todo',
257
+ },
258
+ ];
259
+ const client = createClient({
260
+ initialFiles: {
261
+ [linearByUuidAliasPath(ISSUES_SCOPE, 'issue-123')]: JSON.stringify(priorPayload),
262
+ [linearByIdAliasPath(ISSUES_SCOPE, 'AGE-8')]: JSON.stringify(priorPayload),
263
+ [linearIssuesIndexPath()]: JSON.stringify(priorIndex),
264
+ },
265
+ });
266
+ const result = await emitLinearAuxiliaryFiles(client, {
267
+ workspaceId: 'ws-1',
268
+ issues: [{ id: 'issue-123', _deleted: true }],
269
+ });
270
+ const deletedPaths = new Set(client.deletes.map((d) => d.path));
271
+ const expectedDeletes = [
272
+ linearIssuePath('issue-123', 'AGE-8'),
273
+ linearByUuidAliasPath(ISSUES_SCOPE, 'issue-123'),
274
+ linearByIdAliasPath(ISSUES_SCOPE, 'AGE-8'),
275
+ linearByTitleAliasPath(ISSUES_SCOPE, 'Release Plan', 'issue-123'),
276
+ linearIssueByStatePath('In Progress', 'AGE-8'),
277
+ ];
278
+ for (const path of expectedDeletes) {
279
+ assert.ok(deletedPaths.has(path), `expected delete at ${path}`);
280
+ }
281
+ // Index row dropped (Devin regression #78).
282
+ const indexWrite = client.writes.find((w) => w.path === linearIssuesIndexPath());
283
+ assert.ok(indexWrite, 'expected an index write after delete to prune the row');
284
+ const writtenRows = JSON.parse(indexWrite.content);
285
+ assert.deepEqual(writtenRows.map((r) => r.id), ['issue-456'], 'deleted issue id should no longer appear in the index');
286
+ assert.equal(result.deleted, expectedDeletes.length);
287
+ });
288
+ it('delete tombstone for a user drops the index row', async () => {
289
+ const priorIndex = [
290
+ { id: 'user-1', title: 'Alice', updated: '2026-05-12T00:00:00Z' },
291
+ { id: 'user-2', title: 'Bob', updated: '2026-05-11T00:00:00Z' },
292
+ ];
293
+ const client = createClient({
294
+ initialFiles: {
295
+ [linearUsersIndexPath()]: JSON.stringify(priorIndex),
296
+ },
297
+ });
298
+ await emitLinearAuxiliaryFiles(client, {
299
+ workspaceId: 'ws-1',
300
+ users: [{ id: 'user-1', _deleted: true }],
301
+ });
302
+ const indexWrite = client.writes.find((w) => w.path === linearUsersIndexPath());
303
+ assert.ok(indexWrite, 'expected index write after delete to prune the row');
304
+ const writtenRows = JSON.parse(indexWrite.content);
305
+ assert.deepEqual(writtenRows.map((r) => r.id), ['user-2']);
306
+ });
307
+ it('skips reconciliation when the client has no readFile but still emits new aliases', async () => {
308
+ const client = createClient({ noRead: true });
309
+ const result = await emitLinearAuxiliaryFiles(client, {
310
+ workspaceId: 'ws-1',
311
+ issues: [
312
+ {
313
+ id: 'issue-123',
314
+ identifier: 'AGE-8',
315
+ title: 'Release Plan',
316
+ state: { id: 's', name: 'In Progress' },
317
+ },
318
+ ],
319
+ });
320
+ // No reconciliation deletes: there's no prior state to read.
321
+ assert.equal(client.deletes.length, 0);
322
+ assert.deepEqual(result.errors, []);
323
+ const writtenPaths = client.writes.map((w) => w.path);
324
+ assert.ok(writtenPaths.includes(linearByUuidAliasPath(ISSUES_SCOPE, 'issue-123')));
325
+ assert.ok(writtenPaths.includes(linearByIdAliasPath(ISSUES_SCOPE, 'AGE-8')));
326
+ assert.ok(writtenPaths.includes(linearByTitleAliasPath(ISSUES_SCOPE, 'Release Plan', 'issue-123')));
327
+ });
328
+ it('captures per-path write failures in errors without aborting the fan-out', async () => {
329
+ const failingPath = linearByTitleAliasPath(ISSUES_SCOPE, 'Release Plan', 'issue-123');
330
+ const client = createClient({ failWriteOn: new Set([failingPath]) });
331
+ const result = await emitLinearAuxiliaryFiles(client, {
332
+ workspaceId: 'ws-1',
333
+ issues: [
334
+ {
335
+ id: 'issue-123',
336
+ identifier: 'AGE-8',
337
+ title: 'Release Plan',
338
+ state: { id: 's', name: 'In Progress' },
339
+ },
340
+ ],
341
+ });
342
+ assert.equal(result.errors.length, 1);
343
+ assert.equal(result.errors[0].path, failingPath);
344
+ assert.match(result.errors[0].error, /forced write failure/);
345
+ // Remaining alias paths landed.
346
+ assert.ok(client.files.has(linearByIdAliasPath(ISSUES_SCOPE, 'AGE-8')));
347
+ assert.ok(client.files.has(linearIssueByStatePath('In Progress', 'AGE-8')));
348
+ assert.ok(client.files.has(linearIssuesIndexPath()));
349
+ });
350
+ it('skips by-title alias for emoji-only / punctuation-only titles', async () => {
351
+ const client = createClient();
352
+ await emitLinearAuxiliaryFiles(client, {
353
+ workspaceId: 'ws-1',
354
+ issues: [{ id: 'issue-1', identifier: 'AGE-1', title: '🚀!!!' }],
355
+ });
356
+ const writtenPaths = client.writes.map((w) => w.path);
357
+ assert.ok(writtenPaths.includes(linearByUuidAliasPath(ISSUES_SCOPE, 'issue-1')));
358
+ assert.ok(writtenPaths.includes(linearByIdAliasPath(ISSUES_SCOPE, 'AGE-1')));
359
+ // No by-title alias because the slug would collapse to empty.
360
+ const byTitleEmitted = writtenPaths.some((p) => p.includes('/by-title/'));
361
+ assert.equal(byTitleEmitted, false);
362
+ });
363
+ it('handles a mixed batch: issue create + rename + delete in one call', async () => {
364
+ const priorRenamePayload = {
365
+ payload: {
366
+ id: 'issue-200',
367
+ identifier: 'AGE-200',
368
+ title: 'Old Title',
369
+ state: { name: 'In Progress' },
370
+ },
371
+ };
372
+ const priorDeletePayload = {
373
+ payload: {
374
+ id: 'issue-300',
375
+ identifier: 'AGE-300',
376
+ title: 'Doomed',
377
+ state: { name: 'Todo' },
378
+ },
379
+ };
380
+ const client = createClient({
381
+ initialFiles: {
382
+ [linearByUuidAliasPath(ISSUES_SCOPE, 'issue-200')]: JSON.stringify(priorRenamePayload),
383
+ [linearByIdAliasPath(ISSUES_SCOPE, 'AGE-200')]: JSON.stringify(priorRenamePayload),
384
+ [linearByUuidAliasPath(ISSUES_SCOPE, 'issue-300')]: JSON.stringify(priorDeletePayload),
385
+ [linearByIdAliasPath(ISSUES_SCOPE, 'AGE-300')]: JSON.stringify(priorDeletePayload),
386
+ },
387
+ });
388
+ const result = await emitLinearAuxiliaryFiles(client, {
389
+ workspaceId: 'ws-1',
390
+ issues: [
391
+ {
392
+ id: 'issue-100',
393
+ identifier: 'AGE-100',
394
+ title: 'Brand New',
395
+ state: { id: 's', name: 'Todo' },
396
+ },
397
+ {
398
+ id: 'issue-200',
399
+ identifier: 'AGE-200',
400
+ title: 'Renamed',
401
+ state: { id: 's', name: 'In Progress' },
402
+ },
403
+ { id: 'issue-300', _deleted: true },
404
+ ],
405
+ });
406
+ const writtenPaths = client.writes.map((w) => w.path);
407
+ assert.ok(writtenPaths.includes(linearByIdAliasPath(ISSUES_SCOPE, 'AGE-100')));
408
+ assert.ok(writtenPaths.includes(linearByIdAliasPath(ISSUES_SCOPE, 'AGE-200')));
409
+ const deletedPaths = client.deletes.map((d) => d.path);
410
+ assert.ok(deletedPaths.includes(linearByTitleAliasPath(ISSUES_SCOPE, 'Old Title', 'issue-200')), 'expected renamed issue prior by-title alias in deletes');
411
+ assert.ok(deletedPaths.includes(linearByIdAliasPath(ISSUES_SCOPE, 'AGE-300')), 'expected deleted issue by-id alias in deletes');
412
+ assert.deepEqual(result.errors, []);
413
+ });
414
+ it('cleans up stale UUID-only canonical when an issue gains an identifier (CodeRabbit src:273)', async () => {
415
+ // Prior write: identifier-less. The adapter wrote the canonical path
416
+ // using the UUID as the human-readable suffix (no identifier, no
417
+ // title) and the by-uuid alias as the stable anchor. No by-id alias
418
+ // was emitted because the identifier was absent.
419
+ const priorPayload = {
420
+ provider: 'linear',
421
+ objectType: 'issue',
422
+ objectId: 'issue-abc',
423
+ payload: {
424
+ id: 'issue-abc',
425
+ identifier: null,
426
+ title: null,
427
+ },
428
+ };
429
+ const client = createClient({
430
+ initialFiles: {
431
+ [linearByUuidAliasPath(ISSUES_SCOPE, 'issue-abc')]: JSON.stringify(priorPayload),
432
+ // The prior canonical path was UUID-keyed (no human-readable
433
+ // segment), because identifier and title were both absent.
434
+ [linearIssuePath('issue-abc')]: JSON.stringify(priorPayload),
435
+ },
436
+ });
437
+ // New write: same UUID, now bearing an identifier `AGE-1`.
438
+ const result = await emitLinearAuxiliaryFiles(client, {
439
+ workspaceId: 'ws-1',
440
+ issues: [
441
+ {
442
+ id: 'issue-abc',
443
+ identifier: 'AGE-1',
444
+ title: 'Now Has An Identifier',
445
+ state: { id: 's', name: 'Todo' },
446
+ },
447
+ ],
448
+ });
449
+ const deletedPaths = client.deletes.map((d) => d.path);
450
+ // The stale UUID-keyed canonical path must be reconciled away in
451
+ // favor of the new identifier-keyed canonical path.
452
+ assert.ok(deletedPaths.includes(linearIssuePath('issue-abc')), `expected stale UUID-keyed canonical path in deletes, got: ${deletedPaths.join(', ')}`);
453
+ // The by-uuid alias is the stable anchor and must NOT be deleted on
454
+ // an identifier transition — the UUID never changes.
455
+ assert.ok(!deletedPaths.includes(linearByUuidAliasPath(ISSUES_SCOPE, 'issue-abc')), 'by-uuid alias must not be deleted across identifier transitions');
456
+ const writtenPaths = client.writes.map((w) => w.path);
457
+ // New by-id alias keyed on the identifier was written.
458
+ assert.ok(writtenPaths.includes(linearByIdAliasPath(ISSUES_SCOPE, 'AGE-1')));
459
+ // by-uuid alias was rewritten with the new payload.
460
+ assert.ok(writtenPaths.includes(linearByUuidAliasPath(ISSUES_SCOPE, 'issue-abc')));
461
+ // New canonical path lives under the identifier slug.
462
+ assert.ok(writtenPaths.includes(linearIssuePath('issue-abc', 'AGE-1')));
463
+ assert.deepEqual(result.errors, []);
464
+ });
465
+ it('tombstone with UUID-only payload deletes canonical + every alias + index row (Devin src:300)', async () => {
466
+ // Seed a prior write where the issue had a full identifier-bearing
467
+ // state. The by-uuid alias is the only stable anchor — the by-id
468
+ // alias is keyed on the identifier (AGE-8), not the UUID.
469
+ const priorPayload = {
470
+ provider: 'linear',
471
+ objectType: 'issue',
472
+ objectId: 'issue-xyz',
473
+ payload: {
474
+ id: 'issue-xyz',
475
+ identifier: 'AGE-8',
476
+ title: 'Release Plan',
477
+ state: { name: 'In Progress' },
478
+ },
479
+ };
480
+ const priorIndex = [
481
+ {
482
+ id: 'issue-xyz',
483
+ title: 'Release Plan',
484
+ updated: '2026-05-12T00:00:00Z',
485
+ identifier: 'AGE-8',
486
+ state: 'In Progress',
487
+ },
488
+ ];
489
+ const client = createClient({
490
+ initialFiles: {
491
+ [linearByUuidAliasPath(ISSUES_SCOPE, 'issue-xyz')]: JSON.stringify(priorPayload),
492
+ [linearByIdAliasPath(ISSUES_SCOPE, 'AGE-8')]: JSON.stringify(priorPayload),
493
+ [linearByTitleAliasPath(ISSUES_SCOPE, 'Release Plan', 'issue-xyz')]: JSON.stringify(priorPayload),
494
+ [linearIssueByStatePath('In Progress', 'AGE-8')]: JSON.stringify(priorPayload),
495
+ [linearIssuePath('issue-xyz', 'AGE-8')]: JSON.stringify(priorPayload),
496
+ [linearIssuesIndexPath()]: JSON.stringify(priorIndex),
497
+ },
498
+ });
499
+ // Bare tombstone — only the UUID is present, no identifier/title/state.
500
+ const result = await emitLinearAuxiliaryFiles(client, {
501
+ workspaceId: 'ws-1',
502
+ issues: [{ id: 'issue-xyz', _deleted: true }],
503
+ });
504
+ const deletedPaths = new Set(client.deletes.map((d) => d.path));
505
+ // All four prior paths must be cleaned up — this is the assertion
506
+ // that fails on main today because planIssueDelete reads by-id keyed
507
+ // on the UUID, never finds prior state, and skips computing the
508
+ // identifier-keyed alias paths.
509
+ const expected = [
510
+ linearIssuePath('issue-xyz', 'AGE-8'),
511
+ linearByUuidAliasPath(ISSUES_SCOPE, 'issue-xyz'),
512
+ linearByIdAliasPath(ISSUES_SCOPE, 'AGE-8'),
513
+ linearByTitleAliasPath(ISSUES_SCOPE, 'Release Plan', 'issue-xyz'),
514
+ linearIssueByStatePath('In Progress', 'AGE-8'),
515
+ ];
516
+ for (const path of expected) {
517
+ assert.ok(deletedPaths.has(path), `tombstone failed to clean up ${path} (Devin regression)`);
518
+ }
519
+ // Index row was pruned.
520
+ const indexWrite = client.writes.find((w) => w.path === linearIssuesIndexPath());
521
+ assert.ok(indexWrite, 'expected an index write after delete to prune the row');
522
+ const writtenRows = JSON.parse(indexWrite.content);
523
+ assert.deepEqual(writtenRows.map((r) => r.id), []);
524
+ assert.equal(result.deleted, expected.length);
525
+ });
526
+ it('round-trip: write issue, then re-emit same UUID — prior state resolved via by-uuid anchor', async () => {
527
+ const client = createClient();
528
+ // First emit: seeds the by-uuid alias.
529
+ await emitLinearAuxiliaryFiles(client, {
530
+ workspaceId: 'ws-1',
531
+ issues: [
532
+ {
533
+ id: 'issue-rt',
534
+ identifier: 'AGE-42',
535
+ title: 'Original Title',
536
+ state: { id: 's', name: 'Todo' },
537
+ },
538
+ ],
539
+ });
540
+ // Capture the by-uuid alias contents.
541
+ const anchorBytes = client.files.get(linearByUuidAliasPath(ISSUES_SCOPE, 'issue-rt'));
542
+ assert.ok(anchorBytes, 'by-uuid alias must be present after first emit');
543
+ const anchorParsed = JSON.parse(anchorBytes);
544
+ assert.equal(anchorParsed.payload.id, 'issue-rt');
545
+ assert.equal(anchorParsed.payload.identifier, 'AGE-42');
546
+ assert.equal(anchorParsed.payload.title, 'Original Title');
547
+ // Clear capture between emits to isolate the diff.
548
+ client.writes.length = 0;
549
+ client.deletes.length = 0;
550
+ client.reads.length = 0;
551
+ // Second emit: rename the title. Prior state must come from by-uuid.
552
+ await emitLinearAuxiliaryFiles(client, {
553
+ workspaceId: 'ws-1',
554
+ issues: [
555
+ {
556
+ id: 'issue-rt',
557
+ identifier: 'AGE-42',
558
+ title: 'Renamed Title',
559
+ state: { id: 's', name: 'Todo' },
560
+ },
561
+ ],
562
+ });
563
+ // The prior-state lookup hit the by-uuid path (not by-id, not the
564
+ // canonical path).
565
+ const readPaths = client.reads.map((r) => r.path);
566
+ assert.ok(readPaths.includes(linearByUuidAliasPath(ISSUES_SCOPE, 'issue-rt')), `expected by-uuid anchor read, got: ${readPaths.join(', ')}`);
567
+ // Stale by-title alias was diffed away.
568
+ const deletedPaths = client.deletes.map((d) => d.path);
569
+ assert.ok(deletedPaths.includes(linearByTitleAliasPath(ISSUES_SCOPE, 'Original Title', 'issue-rt')), `expected stale by-title in deletes, got: ${deletedPaths.join(', ')}`);
570
+ assert.ok(!deletedPaths.includes(linearByUuidAliasPath(ISSUES_SCOPE, 'issue-rt')));
571
+ assert.ok(!deletedPaths.includes(linearByIdAliasPath(ISSUES_SCOPE, 'AGE-42')));
572
+ });
573
+ it('does not emit by-id alias when issue has no identifier (anchor is by-uuid only)', async () => {
574
+ const client = createClient();
575
+ await emitLinearAuxiliaryFiles(client, {
576
+ workspaceId: 'ws-1',
577
+ issues: [
578
+ {
579
+ id: 'issue-no-ident',
580
+ title: 'Pending Issue',
581
+ state: { id: 's', name: 'Todo' },
582
+ },
583
+ ],
584
+ });
585
+ const writtenPaths = client.writes.map((w) => w.path);
586
+ // by-uuid alias is always emitted.
587
+ assert.ok(writtenPaths.includes(linearByUuidAliasPath(ISSUES_SCOPE, 'issue-no-ident')));
588
+ // by-id alias must NOT be emitted under the UUID — that subtree is
589
+ // reserved for human-readable identifiers (e.g. `AGE-8`).
590
+ assert.ok(!writtenPaths.includes(linearByIdAliasPath(ISSUES_SCOPE, 'issue-no-ident')));
591
+ assert.ok(!writtenPaths.some((p) => p.startsWith(`${ISSUES_SCOPE}/by-id/`)));
592
+ // by-state alias also needs identifier — must not be emitted.
593
+ assert.ok(!writtenPaths.some((p) => p.startsWith(`${ISSUES_SCOPE}/by-state/`)));
594
+ });
595
+ });
596
+ //# sourceMappingURL=emit-auxiliary-files.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-auxiliary-files.test.js","sourceRoot":"","sources":["../../src/__tests__/emit-auxiliary-files.test.ts"],"names":[],"mappings":"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"}