devharness 0.9.4 → 0.9.5

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.
Files changed (68) hide show
  1. package/build/command-recorder.d.ts +2 -0
  2. package/build/command-recorder.d.ts.map +1 -1
  3. package/build/command-recorder.js +4 -0
  4. package/build/command-recorder.js.map +1 -1
  5. package/build/config.d.ts +9 -0
  6. package/build/config.d.ts.map +1 -1
  7. package/build/config.js +10 -0
  8. package/build/config.js.map +1 -1
  9. package/build/dashboard/dashboard-hub.js +2 -2
  10. package/build/dashboard/dashboard-hub.js.map +1 -1
  11. package/build/github/gh-cli.d.ts +41 -0
  12. package/build/github/gh-cli.d.ts.map +1 -0
  13. package/build/github/gh-cli.js +147 -0
  14. package/build/github/gh-cli.js.map +1 -0
  15. package/build/github/gh-cli.test.d.ts +2 -0
  16. package/build/github/gh-cli.test.d.ts.map +1 -0
  17. package/build/github/gh-cli.test.js +145 -0
  18. package/build/github/gh-cli.test.js.map +1 -0
  19. package/build/github/gh-issues.d.ts +105 -0
  20. package/build/github/gh-issues.d.ts.map +1 -0
  21. package/build/github/gh-issues.js +199 -0
  22. package/build/github/gh-issues.js.map +1 -0
  23. package/build/github/gh-issues.test.d.ts +2 -0
  24. package/build/github/gh-issues.test.d.ts.map +1 -0
  25. package/build/github/gh-issues.test.js +118 -0
  26. package/build/github/gh-issues.test.js.map +1 -0
  27. package/build/github/issue-actions.d.ts +34 -0
  28. package/build/github/issue-actions.d.ts.map +1 -0
  29. package/build/github/issue-actions.js +530 -0
  30. package/build/github/issue-actions.js.map +1 -0
  31. package/build/github/issue-actions.test.d.ts +2 -0
  32. package/build/github/issue-actions.test.d.ts.map +1 -0
  33. package/build/github/issue-actions.test.js +555 -0
  34. package/build/github/issue-actions.test.js.map +1 -0
  35. package/build/github/issue-body.d.ts +179 -0
  36. package/build/github/issue-body.d.ts.map +1 -0
  37. package/build/github/issue-body.js +181 -0
  38. package/build/github/issue-body.js.map +1 -0
  39. package/build/github/issue-body.test.d.ts +2 -0
  40. package/build/github/issue-body.test.d.ts.map +1 -0
  41. package/build/github/issue-body.test.js +157 -0
  42. package/build/github/issue-body.test.js.map +1 -0
  43. package/build/helpers/paths.d.ts +7 -0
  44. package/build/helpers/paths.d.ts.map +1 -1
  45. package/build/helpers/paths.js +10 -1
  46. package/build/helpers/paths.js.map +1 -1
  47. package/build/index.js +4 -1
  48. package/build/index.js.map +1 -1
  49. package/build/issue-tracker.d.ts +30 -0
  50. package/build/issue-tracker.d.ts.map +1 -1
  51. package/build/issue-tracker.js +91 -1
  52. package/build/issue-tracker.js.map +1 -1
  53. package/build/issue-tracker.test.js +76 -1
  54. package/build/issue-tracker.test.js.map +1 -1
  55. package/build/tool-response.d.ts +26 -0
  56. package/build/tool-response.d.ts.map +1 -1
  57. package/build/tool-response.js.map +1 -1
  58. package/build/tools/issues-tools.d.ts +29 -5
  59. package/build/tools/issues-tools.d.ts.map +1 -1
  60. package/build/tools/issues-tools.js +55 -5
  61. package/build/tools/issues-tools.js.map +1 -1
  62. package/build/tools/replay-sequence-reload.test.js +23 -7
  63. package/build/tools/replay-sequence-reload.test.js.map +1 -1
  64. package/docs/instructions.md +3 -1
  65. package/docs/messages.md +264 -0
  66. package/package.json +1 -1
  67. package/plugin/skills/devharness/SKILL.md +1 -1
  68. package/plugin/skills/devharness/references/tool-categories.md +8 -1
@@ -0,0 +1,555 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { EventEmitter } from 'events';
3
+ import { promises as fsp } from 'fs';
4
+ import { tmpdir } from 'os';
5
+ import { join } from 'path';
6
+ import { setWorkingDirOverride } from '../helpers/paths.js';
7
+ import { setGhSpawnForTests } from './gh-cli.js';
8
+ import { handlePublish, handleSync, handleImport, handleLink, handlePullSequence, } from './issue-actions.js';
9
+ import { __resetForTests, addIssue, getIssue, addIssueComment, updateIssueFields, getIssueSequencesDir, } from '../issue-tracker.js';
10
+ import { emitSequenceBlock } from './issue-body.js';
11
+ import { bodyHash } from './gh-issues.js';
12
+ let tempDir;
13
+ /** Every gh invocation, in order, as argv arrays. */
14
+ let calls;
15
+ /** argv[0..2] prefix -> stdout. An array is served in order, its last entry
16
+ * repeating. Missing entries exit 0 with empty stdout. */
17
+ let responses;
18
+ let stdinSeen;
19
+ function key(args) {
20
+ return args.slice(0, 2).join(' ');
21
+ }
22
+ function installFakeGh() {
23
+ calls = [];
24
+ stdinSeen = [];
25
+ responses = new Map([
26
+ ['repo view', JSON.stringify({ nameWithOwner: 'InDate/devharness' })],
27
+ ['label list', JSON.stringify([{ name: 'bug' }, { name: 'enhancement' }])],
28
+ ['issue list', JSON.stringify([])],
29
+ ['api user', 'InDate\n'],
30
+ ]);
31
+ setGhSpawnForTests(((_cmd, args) => {
32
+ calls.push(args);
33
+ const child = new EventEmitter();
34
+ child.stdout = new EventEmitter();
35
+ child.stderr = new EventEmitter();
36
+ child.stdin = { write: (s) => stdinSeen.push(s), end: () => { } };
37
+ child.kill = () => true;
38
+ setImmediate(() => {
39
+ const entry = responses.get(key(args));
40
+ const body = Array.isArray(entry)
41
+ ? (entry.length > 1 ? entry.shift() : entry[0])
42
+ : entry;
43
+ if (body)
44
+ child.stdout.emit('data', body);
45
+ child.emit('close', 0);
46
+ });
47
+ return child;
48
+ }));
49
+ }
50
+ beforeEach(async () => {
51
+ tempDir = await fsp.mkdtemp(join(tmpdir(), 'gh-actions-'));
52
+ setWorkingDirOverride(tempDir);
53
+ __resetForTests();
54
+ installFakeGh();
55
+ });
56
+ afterEach(async () => {
57
+ setGhSpawnForTests(null);
58
+ __resetForTests();
59
+ await fsp.rm(tempDir, { recursive: true, force: true });
60
+ });
61
+ function ran(prefix) {
62
+ return calls.some(args => key(args) === prefix);
63
+ }
64
+ function text(response) {
65
+ return response.content.map((c) => c.text).join('\n');
66
+ }
67
+ describe('publish', () => {
68
+ it('drafts without posting anything', async () => {
69
+ const issue = await addIssue({ type: 'bug', title: 'Submit fails', body: '## Steps\n1. Click' });
70
+ const response = await handlePublish({ id: issue.id });
71
+ expect(ran('issue create')).toBe(false);
72
+ expect(ran('label create')).toBe(false);
73
+ expect(response._meta.github).toMatchObject({ posted: false });
74
+ // The draft is the local body verbatim, not a rewrite of it.
75
+ expect(text(response)).toContain('## Steps\n1. Click');
76
+ expect((await getIssue(issue.id)).github).toBeUndefined();
77
+ });
78
+ it('lists the labels it would have to create', async () => {
79
+ const issue = await addIssue({ type: 'bug', title: 'x', labels: ['inspect', 'bug'] });
80
+ const response = await handlePublish({ id: issue.id });
81
+ expect(text(response)).toContain('inspect');
82
+ expect(ran('label create')).toBe(false);
83
+ });
84
+ it('creates missing labels, posts, then stamps', async () => {
85
+ responses.set('issue create', 'https://github.com/InDate/devharness/issues/111\n');
86
+ const issue = await addIssue({ type: 'bug', title: 'x', body: 'Body', labels: ['inspect', 'bug'] });
87
+ const response = await handlePublish({ id: issue.id, confirm: true });
88
+ const created = calls.filter(a => key(a) === 'label create').map(a => a[2]);
89
+ expect(created).toEqual(['inspect']); // 'bug' already exists upstream
90
+ expect(response._meta.github).toMatchObject({ number: 111, posted: true });
91
+ const reloaded = await getIssue(issue.id);
92
+ expect(reloaded.github).toBe(111);
93
+ expect(reloaded.githubRepo).toBe('InDate/devharness');
94
+ expect(reloaded.githubBodyHash).toBeTruthy();
95
+ });
96
+ it('sends the sequence as a fenced block in the body', async () => {
97
+ responses.set('issue create', 'https://github.com/InDate/devharness/issues/112\n');
98
+ const issue = await addIssue({ type: 'bug', title: 'x', body: 'Body', sequenceFile: 'repro.json' });
99
+ const dir = getIssueSequencesDir();
100
+ await fsp.mkdir(dir, { recursive: true });
101
+ await fsp.writeFile(join(dir, 'repro.json'), JSON.stringify({ name: 'repro', commands: [{ tool: 'navigate' }] }), 'utf-8');
102
+ await handlePublish({ id: issue.id, confirm: true });
103
+ expect(stdinSeen.join('\n')).toContain('```json devharness-sequence');
104
+ expect(stdinSeen.join('\n')).toContain('<!-- devharness: local #');
105
+ });
106
+ it('refuses a second publish of an already linked issue', async () => {
107
+ const issue = await addIssue({ type: 'bug', title: 'x' });
108
+ await updateIssueFields(issue.id, { github: 93, githubRepo: 'InDate/devharness' });
109
+ const response = await handlePublish({ id: issue.id, confirm: true });
110
+ expect(response.isError).toBe(true);
111
+ expect(ran('issue create')).toBe(false);
112
+ });
113
+ it('hands back the number when the upstream issue exists but cannot be stamped', async () => {
114
+ // gh printed something we cannot parse a number out of: the issue is
115
+ // real, so this must not read as a create failure.
116
+ responses.set('issue create', 'Creating issue in InDate/devharness\n');
117
+ const issue = await addIssue({ type: 'bug', title: 'x' });
118
+ const response = await handlePublish({ id: issue.id, confirm: true });
119
+ expect(response.isError).toBe(true);
120
+ expect(text(response)).toContain('exists');
121
+ expect(text(response)).toContain('link');
122
+ });
123
+ it('keeps the stamp across a later comment', async () => {
124
+ responses.set('issue create', 'https://github.com/InDate/devharness/issues/113\n');
125
+ const issue = await addIssue({ type: 'bug', title: 'x', body: 'Body' });
126
+ await handlePublish({ id: issue.id, confirm: true });
127
+ await addIssueComment(issue.id, 'A local note.');
128
+ __resetForTests();
129
+ expect((await getIssue(issue.id)).github).toBe(113);
130
+ });
131
+ it('stamps comments it pushes at publish time', async () => {
132
+ responses.set('issue create', 'https://github.com/InDate/devharness/issues/114\n');
133
+ responses.set('issue view', JSON.stringify({
134
+ number: 114, title: 'x', body: 'Body', state: 'OPEN', stateReason: null,
135
+ labels: [], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u',
136
+ comments: [{ id: 'IC_7', body: 'A note', createdAt: '2026-08-10T00:00:00.000Z' }],
137
+ }));
138
+ const issue = await addIssue({ type: 'bug', title: 'x', body: 'Body' });
139
+ await addIssueComment(issue.id, 'A note');
140
+ await handlePublish({ id: issue.id, confirm: true });
141
+ expect((await getIssue(issue.id)).comments[0].text).toContain('<!-- gh: IC_7 -->');
142
+ });
143
+ it('surfaces a typed error when gh is missing, changing nothing', async () => {
144
+ setGhSpawnForTests(((_cmd, args) => {
145
+ const child = new EventEmitter();
146
+ child.stdout = new EventEmitter();
147
+ child.stderr = new EventEmitter();
148
+ child.stdin = { write: () => { }, end: () => { } };
149
+ child.kill = () => true;
150
+ setImmediate(() => child.emit('error', Object.assign(new Error('ENOENT'), { code: 'ENOENT' })));
151
+ return child;
152
+ }));
153
+ const issue = await addIssue({ type: 'bug', title: 'x' });
154
+ const response = await handlePublish({ id: issue.id, confirm: true });
155
+ expect(response.isError).toBe(true);
156
+ expect(text(response)).toContain('gh');
157
+ expect((await getIssue(issue.id)).github).toBeUndefined();
158
+ });
159
+ });
160
+ describe('link', () => {
161
+ it('stamps without any network call', async () => {
162
+ const issue = await addIssue({ type: 'bug', title: 'x' });
163
+ const response = await handleLink({ id: issue.id, github: 97, repo: 'InDate/devharness' });
164
+ expect(calls).toHaveLength(0);
165
+ expect(response._meta.github).toMatchObject({ action: 'link', number: 97 });
166
+ expect((await getIssue(issue.id)).github).toBe(97);
167
+ });
168
+ });
169
+ describe('import', () => {
170
+ const remote = {
171
+ number: 110, title: 'Filed upstream', body: 'Remote body',
172
+ state: 'OPEN', stateReason: null, labels: [{ name: 'bug' }],
173
+ updatedAt: '2026-08-10T00:00:00.000Z', url: 'https://github.com/InDate/devharness/issues/110',
174
+ comments: [{ id: 'IC_1', body: 'A remote comment', createdAt: '2026-08-10T01:00:00.000Z' }],
175
+ };
176
+ it('creates a local file as acknowledged, never pending', async () => {
177
+ responses.set('issue view', JSON.stringify(remote));
178
+ const response = await handleImport({ github: 110 });
179
+ const id = response._meta.github.number === 110 ? 1 : 1;
180
+ const issue = await getIssue(id);
181
+ // pending would block every other tool via checkBugBlocking.
182
+ expect(issue.status).toBe('acknowledged');
183
+ expect(issue.type).toBe('bug');
184
+ expect(issue.github).toBe(110);
185
+ expect(issue.body).toBe('Remote body');
186
+ expect(issue.comments).toHaveLength(1);
187
+ expect(issue.sequenceFile).toBe('');
188
+ expect(issue.startUrl).toBe('');
189
+ });
190
+ it('is idempotent - a second import finds the existing local issue', async () => {
191
+ responses.set('issue view', JSON.stringify(remote));
192
+ await handleImport({ github: 110 });
193
+ const response = await handleImport({ github: 110 });
194
+ expect(text(response)).toContain('already tracked');
195
+ expect((await getIssue(2))).toBeUndefined();
196
+ });
197
+ it('imports a closed issue with its reason', async () => {
198
+ responses.set('issue view', JSON.stringify({ ...remote, state: 'CLOSED', stateReason: 'NOT_PLANNED' }));
199
+ await handleImport({ github: 110 });
200
+ const issue = await getIssue(1);
201
+ expect(issue.status).toBe('fixed');
202
+ expect(issue.closedReason).toBe('not_planned');
203
+ });
204
+ it('leaves a sequence in the issue rather than writing it to disk', async () => {
205
+ const withSequence = {
206
+ ...remote,
207
+ body: `Remote body\n\n${emitSequenceBlock({ name: 'x', commands: [{ tool: 'navigate' }] })}`,
208
+ };
209
+ responses.set('issue view', JSON.stringify(withSequence));
210
+ await handleImport({ github: 110 });
211
+ const issue = await getIssue(1);
212
+ expect(issue.sequenceFile).toBe('');
213
+ expect(issue.body).not.toContain('devharness-sequence');
214
+ await expect(fsp.readdir(getIssueSequencesDir())).resolves.toEqual([]);
215
+ });
216
+ });
217
+ describe('sync', () => {
218
+ async function linkedIssue(overrides = {}) {
219
+ const issue = await addIssue({ type: 'bug', title: 'Linked', body: 'Original body' });
220
+ await updateIssueFields(issue.id, {
221
+ github: 92, githubRepo: 'InDate/devharness',
222
+ githubSyncedAt: new Date('2026-08-01T00:00:00.000Z'),
223
+ githubBodyHash: undefined,
224
+ ...overrides,
225
+ });
226
+ return (await getIssue(issue.id));
227
+ }
228
+ it('says so when nothing is linked', async () => {
229
+ await addIssue({ type: 'bug', title: 'Local only' });
230
+ const response = await handleSync({});
231
+ expect(text(response)).toContain('No local issue is linked');
232
+ expect(ran('issue list')).toBe(false);
233
+ });
234
+ it('pulls a closed upstream state down', async () => {
235
+ const issue = await linkedIssue();
236
+ responses.set('issue list', JSON.stringify([
237
+ { number: 92, state: 'CLOSED', stateReason: 'COMPLETED', labels: [{ name: 'bug' }], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u' },
238
+ ]));
239
+ responses.set('issue view', JSON.stringify({
240
+ number: 92, title: 'Linked', body: 'Upstream body', state: 'CLOSED', stateReason: 'COMPLETED',
241
+ labels: [{ name: 'bug' }], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u', comments: [],
242
+ }));
243
+ await handleSync({});
244
+ const reloaded = await getIssue(issue.id);
245
+ expect(reloaded.status).toBe('fixed');
246
+ expect(reloaded.closedReason).toBe('completed');
247
+ expect(reloaded.body).toBe('Upstream body');
248
+ // Local-only labels survive an upstream that never had them.
249
+ expect(reloaded.labels).toContain('bug');
250
+ });
251
+ it('never writes a sequence file', async () => {
252
+ await linkedIssue();
253
+ responses.set('issue list', JSON.stringify([
254
+ { number: 92, state: 'OPEN', stateReason: null, labels: [], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u' },
255
+ ]));
256
+ responses.set('issue view', JSON.stringify({
257
+ number: 92, title: 'Linked', state: 'OPEN', stateReason: null, labels: [], updatedAt: '2026-08-10T00:00:00.000Z',
258
+ url: 'u', comments: [],
259
+ body: `Upstream\n\n${emitSequenceBlock({ name: 'x', commands: [{ tool: 'navigate' }] })}`,
260
+ }));
261
+ await handleSync({});
262
+ const reloaded = await getIssue(1);
263
+ expect(reloaded.sequenceFile).toBe('');
264
+ expect(reloaded.body).not.toContain('devharness-sequence');
265
+ await expect(fsp.readdir(getIssueSequencesDir())).resolves.toEqual([]);
266
+ });
267
+ it('reports a conflict and writes nothing when both sides changed', async () => {
268
+ const issue = await linkedIssue({ githubBodyHash: 'stale-hash-from-last-sync' });
269
+ responses.set('issue list', JSON.stringify([
270
+ { number: 92, state: 'OPEN', stateReason: null, labels: [], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u' },
271
+ ]));
272
+ const response = await handleSync({});
273
+ expect(response._meta.github.conflicts).toEqual([{ id: issue.id, number: 92 }]);
274
+ expect(text(response)).toContain('CONFLICT');
275
+ // Not even a view was fetched, let alone a write.
276
+ expect(ran('issue view')).toBe(false);
277
+ expect(ran('issue edit')).toBe(false);
278
+ const reloaded = await getIssue(issue.id);
279
+ expect(reloaded.body).toBe('Original body');
280
+ });
281
+ it('resolves a conflict in favour of local when told to', async () => {
282
+ const issue = await linkedIssue({ githubBodyHash: 'stale-hash-from-last-sync' });
283
+ responses.set('issue list', JSON.stringify([
284
+ { number: 92, state: 'OPEN', stateReason: null, labels: [], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u' },
285
+ ]));
286
+ responses.set('issue view', JSON.stringify({
287
+ number: 92, title: 'Linked', body: 'Upstream body', state: 'OPEN', stateReason: null,
288
+ labels: [], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u', comments: [],
289
+ }));
290
+ await handleSync({ id: issue.id, take: 'local' });
291
+ expect(ran('issue edit')).toBe(true);
292
+ expect(stdinSeen.join('\n')).toContain('Original body');
293
+ expect((await getIssue(issue.id)).body).toBe('Original body');
294
+ });
295
+ it('holds an upstream close behind confirm', async () => {
296
+ const issue = await linkedIssue();
297
+ await updateIssueFields(issue.id, { status: 'fixed', githubBodyHash: 'stale' });
298
+ responses.set('issue list', JSON.stringify([
299
+ { number: 92, state: 'OPEN', stateReason: null, labels: [], updatedAt: '2026-07-01T00:00:00.000Z', url: 'u' },
300
+ ]));
301
+ responses.set('issue view', JSON.stringify({
302
+ number: 92, title: 'Linked', body: 'Upstream body', state: 'OPEN', stateReason: null,
303
+ labels: [], updatedAt: '2026-07-01T00:00:00.000Z', url: 'u', comments: [],
304
+ }));
305
+ const reported = await handleSync({});
306
+ expect(ran('issue close')).toBe(false);
307
+ expect(text(reported)).toContain('confirmation');
308
+ await handleSync({ confirm: true });
309
+ expect(ran('issue close')).toBe(true);
310
+ });
311
+ it('does not re-import a comment it already pulled', async () => {
312
+ await linkedIssue();
313
+ const remoteComment = { id: 'IC_1', body: 'From GitHub', createdAt: '2026-08-09T00:00:00.000Z' };
314
+ responses.set('issue list', JSON.stringify([
315
+ { number: 92, state: 'OPEN', stateReason: null, labels: [], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u' },
316
+ ]));
317
+ responses.set('issue view', JSON.stringify({
318
+ number: 92, title: 'Linked', body: 'Upstream body', state: 'OPEN', stateReason: null,
319
+ labels: [], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u', comments: [remoteComment],
320
+ }));
321
+ await handleSync({});
322
+ await handleSync({});
323
+ expect((await getIssue(1)).comments).toHaveLength(1);
324
+ });
325
+ it('a repo override only sweeps issues stamped for that repo', async () => {
326
+ await linkedIssue(); // stamped InDate/devharness
327
+ const bare = await addIssue({ type: 'bug', title: 'Bare stamp' });
328
+ await updateIssueFields(bare.id, { github: 92 }); // no githubRepo
329
+ const response = await handleSync({ repo: 'InDate/other-repo' });
330
+ expect(text(response)).toContain('No local issue is linked');
331
+ expect(ran('issue list')).toBe(false);
332
+ });
333
+ it('a bare github stamp syncs against the inferred repo', async () => {
334
+ const bare = await addIssue({ type: 'bug', title: 'Bare stamp', body: 'Local body' });
335
+ await updateIssueFields(bare.id, { github: 92 });
336
+ responses.set('issue list', JSON.stringify([
337
+ { number: 92, state: 'OPEN', stateReason: null, labels: [], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u' },
338
+ ]));
339
+ responses.set('issue view', JSON.stringify({
340
+ number: 92, title: 'Bare stamp', body: 'Upstream body', state: 'OPEN', stateReason: null,
341
+ labels: [], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u', comments: [],
342
+ }));
343
+ const response = await handleSync({});
344
+ expect(text(response)).toContain('#92');
345
+ expect(text(response)).not.toContain('No local issue is linked');
346
+ });
347
+ it('stamps a pushed comment so it is never pushed twice', async () => {
348
+ const issue = await linkedIssue({ githubBodyHash: 'stale' });
349
+ await addIssueComment(issue.id, 'Local note');
350
+ const view = (comments) => JSON.stringify({
351
+ number: 92, title: 'Linked', body: 'Original body', state: 'OPEN', stateReason: null,
352
+ labels: [], updatedAt: '2026-07-01T00:00:00.000Z', url: 'u', comments,
353
+ });
354
+ responses.set('issue list', JSON.stringify([
355
+ { number: 92, state: 'OPEN', stateReason: null, labels: [], updatedAt: '2026-07-01T00:00:00.000Z', url: 'u' },
356
+ ]));
357
+ // First view (pre-push reconcile): not upstream yet. Second (post-push): it is.
358
+ responses.set('issue view', [
359
+ view([]),
360
+ view([{ id: 'IC_9', body: 'Local note', createdAt: '2026-08-10T00:00:00.000Z' }]),
361
+ ]);
362
+ await handleSync({});
363
+ expect(calls.filter(a => key(a) === 'issue comment')).toHaveLength(1);
364
+ expect((await getIssue(issue.id)).comments[0].text).toContain('<!-- gh: IC_9 -->');
365
+ // A forced second push must skip the now-stamped comment.
366
+ await handleSync({ id: issue.id, take: 'local' });
367
+ expect(calls.filter(a => key(a) === 'issue comment')).toHaveLength(1);
368
+ expect((await getIssue(issue.id)).comments).toHaveLength(1);
369
+ });
370
+ it('pushes a new local comment even when the body is unchanged', async () => {
371
+ const issue = await linkedIssue({ githubBodyHash: bodyHash('Original body') });
372
+ await addIssueComment(issue.id, 'Late note');
373
+ const view = (comments) => JSON.stringify({
374
+ number: 92, title: 'Linked', body: 'Original body', state: 'OPEN', stateReason: null,
375
+ labels: [], updatedAt: '2026-07-01T00:00:00.000Z', url: 'u', comments,
376
+ });
377
+ responses.set('issue list', JSON.stringify([
378
+ { number: 92, state: 'OPEN', stateReason: null, labels: [], updatedAt: '2026-07-01T00:00:00.000Z', url: 'u' },
379
+ ]));
380
+ responses.set('issue view', [
381
+ view([]),
382
+ view([{ id: 'IC_11', body: 'Late note', createdAt: '2026-08-10T00:00:00.000Z' }]),
383
+ ]);
384
+ await handleSync({});
385
+ expect(ran('issue edit')).toBe(false); // body classified as unchanged
386
+ expect(calls.filter(a => key(a) === 'issue comment')).toHaveLength(1);
387
+ expect((await getIssue(issue.id)).comments[0].text).toContain('<!-- gh: IC_11 -->');
388
+ });
389
+ it('claims an unstamped comment that already exists upstream instead of re-posting it', async () => {
390
+ // A push that died after `gh issue comment` but before the id was stored.
391
+ const issue = await linkedIssue({ githubBodyHash: 'stale' });
392
+ await addIssueComment(issue.id, 'Orphaned by a dead push');
393
+ responses.set('issue list', JSON.stringify([
394
+ { number: 92, state: 'OPEN', stateReason: null, labels: [], updatedAt: '2026-07-01T00:00:00.000Z', url: 'u' },
395
+ ]));
396
+ responses.set('issue view', JSON.stringify({
397
+ number: 92, title: 'Linked', body: 'Original body', state: 'OPEN', stateReason: null,
398
+ labels: [], updatedAt: '2026-07-01T00:00:00.000Z', url: 'u',
399
+ comments: [{ id: 'IC_4', body: 'Orphaned by a dead push', createdAt: '2026-08-10T00:00:00.000Z' }],
400
+ }));
401
+ await handleSync({});
402
+ expect(calls.filter(a => key(a) === 'issue comment')).toHaveLength(0);
403
+ const comments = (await getIssue(issue.id)).comments;
404
+ expect(comments).toHaveLength(1);
405
+ expect(comments[0].text).toContain('<!-- gh: IC_4 -->');
406
+ });
407
+ it('stamps a matching unstamped local comment on pull instead of duplicating it', async () => {
408
+ const issue = await linkedIssue();
409
+ await addIssueComment(issue.id, 'Same words');
410
+ responses.set('issue list', JSON.stringify([
411
+ { number: 92, state: 'OPEN', stateReason: null, labels: [], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u' },
412
+ ]));
413
+ responses.set('issue view', JSON.stringify({
414
+ number: 92, title: 'Linked', body: 'Upstream body', state: 'OPEN', stateReason: null,
415
+ labels: [], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u',
416
+ comments: [{ id: 'IC_5', body: 'Same words', createdAt: '2026-08-09T00:00:00.000Z' }],
417
+ }));
418
+ await handleSync({});
419
+ const comments = (await getIssue(issue.id)).comments;
420
+ expect(comments).toHaveLength(1);
421
+ expect(comments[0].text).toContain('<!-- gh: IC_5 -->');
422
+ });
423
+ it('strips the upstream marker on pull and pushes exactly one back', async () => {
424
+ const issue = await linkedIssue();
425
+ responses.set('issue list', JSON.stringify([
426
+ { number: 92, state: 'OPEN', stateReason: null, labels: [], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u' },
427
+ ]));
428
+ responses.set('issue view', JSON.stringify({
429
+ number: 92, title: 'Linked', state: 'OPEN', stateReason: null,
430
+ labels: [], updatedAt: '2026-08-10T00:00:00.000Z', url: 'u', comments: [],
431
+ body: `Upstream body\n\n<!-- devharness: local #${issue.id} -->`,
432
+ }));
433
+ await handleSync({});
434
+ expect((await getIssue(issue.id)).body).toBe('Upstream body');
435
+ await handleSync({ id: issue.id, take: 'local' });
436
+ const pushedBody = stdinSeen[stdinSeen.length - 1];
437
+ expect(pushedBody.match(/devharness: local #/g)).toHaveLength(1);
438
+ });
439
+ });
440
+ describe('pullSequence', () => {
441
+ async function issueWithRemoteSequence(sequence, author = 'InDate') {
442
+ const issue = await addIssue({ type: 'bug', title: 'Repro me' });
443
+ await updateIssueFields(issue.id, { github: 97, githubRepo: 'InDate/devharness' });
444
+ responses.set('issue view', JSON.stringify({
445
+ number: 97, title: 'Repro me', state: 'OPEN', stateReason: null, labels: [],
446
+ author: { login: author },
447
+ updatedAt: '2026-08-10T00:00:00.000Z', url: 'u', comments: [],
448
+ body: `Prose\n\n${emitSequenceBlock(sequence)}`,
449
+ }));
450
+ return issue;
451
+ }
452
+ it('writes the sequence and links it', async () => {
453
+ const issue = await issueWithRemoteSequence({ name: 'whatever', commands: [{ tool: 'navigate', params: { url: 'http://x' } }] });
454
+ const response = await handlePullSequence({ id: issue.id }, { knownTools: () => ['navigate', 'input'] });
455
+ const reloaded = await getIssue(issue.id);
456
+ expect(reloaded.sequenceFile).toBe('bug-001-repro-me.json');
457
+ const written = JSON.parse(await fsp.readFile(join(getIssueSequencesDir(), reloaded.sequenceFile), 'utf-8'));
458
+ // The payload's own name is discarded: loading a sequence evicts any
459
+ // same-named one in memory, so a hostile name could delete the user's.
460
+ expect(written.name).toBe('bug-001-repro-me');
461
+ expect(response._meta.github.sequence).toMatchObject({ steps: 1, tools: ['navigate'] });
462
+ });
463
+ it('refuses a sequence written by another account, writing nothing', async () => {
464
+ const issue = await issueWithRemoteSequence({ commands: [{ tool: 'navigate', params: { url: 'http://x' } }] }, 'someone-else');
465
+ const response = await handlePullSequence({ id: issue.id }, { knownTools: () => ['navigate'] });
466
+ expect(response.isError).toBe(true);
467
+ expect(text(response)).toContain('someone-else');
468
+ expect(text(response)).toContain('stop here');
469
+ expect((await getIssue(issue.id)).sequenceFile).toBe('');
470
+ await expect(fsp.readdir(getIssueSequencesDir()).catch(() => [])).resolves.toEqual([]); // nothing on disk
471
+ });
472
+ it('accepts a foreign sequence once a person has confirmed', async () => {
473
+ const issue = await issueWithRemoteSequence({ commands: [{ tool: 'navigate', params: { url: 'http://x' } }] }, 'someone-else');
474
+ const response = await handlePullSequence({ id: issue.id, confirm: true }, { knownTools: () => ['navigate'] });
475
+ expect(response.isError).toBeUndefined();
476
+ expect((await getIssue(issue.id)).sequenceFile).toBe('bug-001-repro-me.json');
477
+ });
478
+ it('gates a comment sequence on the comment author, not the issue author', async () => {
479
+ const issue = await addIssue({ type: 'bug', title: 'Repro me' });
480
+ await updateIssueFields(issue.id, { github: 97, githubRepo: 'InDate/devharness' });
481
+ responses.set('issue view', JSON.stringify({
482
+ number: 97, title: 'Repro me', state: 'OPEN', stateReason: null, labels: [],
483
+ author: { login: 'InDate' }, body: 'Prose only',
484
+ updatedAt: '2026-08-10T00:00:00.000Z', url: 'u',
485
+ comments: [{
486
+ id: 'IC_1', author: { login: 'driveby' }, createdAt: '2026-08-10T00:00:00.000Z',
487
+ body: emitSequenceBlock({ commands: [{ tool: 'navigate', params: { url: 'http://x' } }] }),
488
+ }],
489
+ }));
490
+ const response = await handlePullSequence({ id: issue.id, fromComment: 1 }, { knownTools: () => ['navigate'] });
491
+ expect(response.isError).toBe(true);
492
+ expect(text(response)).toContain('driveby');
493
+ });
494
+ it('refuses a sequence with privileged steps unless allowed', async () => {
495
+ const issue = await issueWithRemoteSequence({
496
+ commands: [{ tool: 'navigate' }, { tool: 'execution', params: { expression: 'fetch("/steal")' } }],
497
+ });
498
+ const blocked = await handlePullSequence({ id: issue.id }, { knownTools: () => ['navigate', 'execution'] });
499
+ expect(blocked.isError).toBe(true);
500
+ expect(text(blocked)).toContain('execution');
501
+ await expect(fsp.readdir(getIssueSequencesDir())).resolves.toEqual([]);
502
+ const allowed = await handlePullSequence({ id: issue.id, allowPrivilegedSteps: true }, { knownTools: () => ['navigate', 'execution'] });
503
+ expect(allowed.isError).toBeUndefined();
504
+ });
505
+ it('rejects unknown tool names before anything is written', async () => {
506
+ const issue = await issueWithRemoteSequence({ commands: [{ tool: 'navigat' }] });
507
+ const response = await handlePullSequence({ id: issue.id }, { knownTools: () => ['navigate'] });
508
+ expect(response.isError).toBe(true);
509
+ expect(text(response)).toContain('navigat');
510
+ await expect(fsp.readdir(getIssueSequencesDir())).resolves.toEqual([]);
511
+ });
512
+ it('rejects a structurally invalid sequence', async () => {
513
+ const issue = await addIssue({ type: 'bug', title: 'Repro me' });
514
+ await updateIssueFields(issue.id, { github: 97 });
515
+ responses.set('issue view', JSON.stringify({
516
+ number: 97, title: 'x', state: 'OPEN', stateReason: null, labels: [],
517
+ updatedAt: '2026-08-10T00:00:00.000Z', url: 'u', comments: [],
518
+ body: '```json devharness-sequence\n{"commands":[{"tool":42}]}\n```',
519
+ }));
520
+ const response = await handlePullSequence({ id: issue.id });
521
+ expect(response.isError).toBe(true);
522
+ await expect(fsp.readdir(getIssueSequencesDir())).resolves.toEqual([]);
523
+ });
524
+ it('points at the comments that carry one when the body has none', async () => {
525
+ const issue = await addIssue({ type: 'bug', title: 'x' });
526
+ await updateIssueFields(issue.id, { github: 97 });
527
+ responses.set('issue view', JSON.stringify({
528
+ number: 97, title: 'x', body: 'No block here', state: 'OPEN', stateReason: null, labels: [],
529
+ updatedAt: '2026-08-10T00:00:00.000Z', url: 'u',
530
+ comments: [
531
+ { id: 'IC_1', body: 'no', createdAt: '' },
532
+ { id: 'IC_2', body: emitSequenceBlock({ commands: [{ tool: 'navigate' }] }), createdAt: '' },
533
+ ],
534
+ }));
535
+ const response = await handlePullSequence({ id: issue.id });
536
+ expect(response.isError).toBe(true);
537
+ expect(text(response)).toContain('2');
538
+ });
539
+ it('reads a comment sequence only when asked for it', async () => {
540
+ const issue = await addIssue({ type: 'bug', title: 'x' });
541
+ await updateIssueFields(issue.id, { github: 97 });
542
+ responses.set('issue view', JSON.stringify({
543
+ number: 97, title: 'x', state: 'OPEN', stateReason: null, labels: [],
544
+ updatedAt: '2026-08-10T00:00:00.000Z', url: 'u',
545
+ author: { login: 'InDate' },
546
+ body: emitSequenceBlock({ name: 'body-one', commands: [{ tool: 'navigate' }] }),
547
+ comments: [{ id: 'IC_1', author: { login: 'InDate' }, body: emitSequenceBlock({ name: 'comment-one', commands: [{ tool: 'input' }] }), createdAt: '' }],
548
+ }));
549
+ await handlePullSequence({ id: issue.id, fromComment: 1 }, { knownTools: () => ['navigate', 'input'] });
550
+ const reloaded = await getIssue(issue.id);
551
+ const written = JSON.parse(await fsp.readFile(join(getIssueSequencesDir(), reloaded.sequenceFile), 'utf-8'));
552
+ expect(written.commands[0].tool).toBe('input');
553
+ });
554
+ });
555
+ //# sourceMappingURL=issue-actions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-actions.test.js","sourceRoot":"","sources":["../../src/github/issue-actions.test.ts"],"names":[],"mappings":"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"}