@aviaratech/ai-delivery 0.3.23 → 0.3.25
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/CONTRIBUTING.md +166 -16
- package/README.md +75 -446
- package/dist/agent.d.ts +5 -11
- package/dist/agent.js +4 -8
- package/dist/agent.js.map +1 -1
- package/dist/agentReadiness.test.d.ts +1 -0
- package/dist/agentReadiness.test.js +139 -0
- package/dist/agentReadiness.test.js.map +1 -0
- package/dist/cli.js +27 -111
- package/dist/cli.js.map +1 -1
- package/dist/config/deliveryConfig.d.ts +44 -55
- package/dist/config/deliveryConfig.js +85 -88
- package/dist/config/deliveryConfig.js.map +1 -1
- package/dist/config/deliveryConfig.test.js +13 -5
- package/dist/config/deliveryConfig.test.js.map +1 -1
- package/dist/contributorChecks.test.d.ts +1 -0
- package/dist/contributorChecks.test.js +1010 -0
- package/dist/contributorChecks.test.js.map +1 -0
- package/dist/currentConsumer.test.d.ts +1 -0
- package/dist/currentConsumer.test.js +832 -0
- package/dist/currentConsumer.test.js.map +1 -0
- package/dist/delivery/common.js +7 -2
- package/dist/delivery/common.js.map +1 -1
- package/dist/delivery/delivery.test.js +2 -3
- package/dist/delivery/delivery.test.js.map +1 -1
- package/dist/delivery/index.d.ts +0 -6
- package/dist/delivery/index.js +0 -3
- package/dist/delivery/index.js.map +1 -1
- package/dist/delivery/legacy.d.ts +8 -0
- package/dist/delivery/legacy.js +5 -0
- package/dist/delivery/legacy.js.map +1 -0
- package/dist/delivery/policy.js +2 -13
- package/dist/delivery/policy.js.map +1 -1
- package/dist/dependencyCompatibility.test.d.ts +1 -0
- package/dist/dependencyCompatibility.test.js +175 -0
- package/dist/dependencyCompatibility.test.js.map +1 -0
- package/dist/directoryIndependent.test.d.ts +1 -0
- package/dist/directoryIndependent.test.js +352 -0
- package/dist/directoryIndependent.test.js.map +1 -0
- package/dist/dispatch.d.ts +29 -3
- package/dist/dispatch.js +166 -457
- package/dist/dispatch.js.map +1 -1
- package/dist/genericCompatibility.test.js +0 -35
- package/dist/genericCompatibility.test.js.map +1 -1
- package/dist/git.js +10 -3
- package/dist/git.js.map +1 -1
- package/dist/gitProcess.d.ts +6 -0
- package/dist/gitProcess.js +56 -0
- package/dist/gitProcess.js.map +1 -0
- package/dist/github/discovery.d.ts +1 -0
- package/dist/github/discovery.js +1 -1
- package/dist/github/discovery.js.map +1 -1
- package/dist/github/discovery.test.js +25 -20
- package/dist/github/discovery.test.js.map +1 -1
- package/dist/github/nativeIssueMetadata.d.ts +2 -2
- package/dist/github/nativeIssueMetadata.js.map +1 -1
- package/dist/github/projectDelivery.d.ts +1 -1
- package/dist/github/projectDelivery.js.map +1 -1
- package/dist/github/repo.d.ts +7 -1
- package/dist/github/repo.js +58 -2
- package/dist/github/repo.js.map +1 -1
- package/dist/issue.d.ts +18 -6
- package/dist/issue.js +136 -319
- package/dist/issue.js.map +1 -1
- package/dist/issueJournal.d.ts +1 -1
- package/dist/issueJournal.test.js +88 -6
- package/dist/issueJournal.test.js.map +1 -1
- package/dist/lifecycle.test.js +40 -7371
- package/dist/lifecycle.test.js.map +1 -1
- package/dist/logger.js +4 -4
- package/dist/logger.js.map +1 -1
- package/dist/mcp/tools.d.ts +32 -42
- package/dist/mcp/tools.js +51 -42
- package/dist/mcp/tools.js.map +1 -1
- package/dist/pluginInstaller.d.ts +1 -1
- package/dist/pluginInstaller.js +8 -2
- package/dist/pluginInstaller.js.map +1 -1
- package/dist/pluginInstaller.test.js +213 -2
- package/dist/pluginInstaller.test.js.map +1 -1
- package/dist/pluginPackaging.test.js +225 -2
- package/dist/pluginPackaging.test.js.map +1 -1
- package/dist/pr.d.ts +73 -114
- package/dist/pr.js +837 -1085
- package/dist/pr.js.map +1 -1
- package/dist/pr.test.js +453 -236
- package/dist/pr.test.js.map +1 -1
- package/dist/prAssociation.test.d.ts +1 -0
- package/dist/prAssociation.test.js +1336 -0
- package/dist/prAssociation.test.js.map +1 -0
- package/dist/prDispatch.test.d.ts +1 -0
- package/dist/prDispatch.test.js +96 -0
- package/dist/prDispatch.test.js.map +1 -0
- package/dist/releaseReconciliation.test.d.ts +1 -0
- package/dist/releaseReconciliation.test.js +318 -0
- package/dist/releaseReconciliation.test.js.map +1 -0
- package/dist/releaseWorkflow.test.d.ts +1 -0
- package/dist/releaseWorkflow.test.js +447 -0
- package/dist/releaseWorkflow.test.js.map +1 -0
- package/dist/review.d.ts +37 -7
- package/dist/review.js +106 -45
- package/dist/review.js.map +1 -1
- package/dist/review.test.js +30 -71
- package/dist/review.test.js.map +1 -1
- package/dist/services/agentReadinessService.d.ts +1 -1
- package/dist/services/agentReadinessService.js +4 -1
- package/dist/services/agentReadinessService.js.map +1 -1
- package/dist/services/deliveryAdmission.d.ts +4 -4
- package/dist/services/deliveryAdmission.js.map +1 -1
- package/dist/setup.test.js +10 -5
- package/dist/setup.test.js.map +1 -1
- package/dist/stagedChecks.test.d.ts +1 -0
- package/dist/stagedChecks.test.js +228 -0
- package/dist/stagedChecks.test.js.map +1 -0
- package/dist/start.test.d.ts +1 -0
- package/dist/start.test.js +72 -0
- package/dist/start.test.js.map +1 -0
- package/dist/stdoutRegression.test.d.ts +1 -0
- package/dist/stdoutRegression.test.js +326 -0
- package/dist/stdoutRegression.test.js.map +1 -0
- package/dist/verification.d.ts +1 -27
- package/dist/verification.js +5 -1332
- package/dist/verification.js.map +1 -1
- package/dist/worktree.d.ts +1 -31
- package/dist/worktree.js +5 -200
- package/dist/worktree.js.map +1 -1
- package/dist/worktreeTransition.d.ts +1 -1
- package/dist/worktreeTransition.js +10 -5
- package/dist/worktreeTransition.js.map +1 -1
- package/dist/worktreeTransition.test.js +2 -3
- package/dist/worktreeTransition.test.js.map +1 -1
- package/package.json +9 -6
- package/plugins/ai-delivery/.claude-plugin/plugin.json +2 -2
- package/plugins/ai-delivery/README.md +3 -3
- package/plugins/ai-delivery/plugin.json +1 -1
- package/plugins/ai-delivery/runtime/dist/THIRD-PARTY-NOTICES.md +1 -1
- package/plugins/ai-delivery/runtime/dist/cli.js +50 -59
- package/plugins/ai-delivery/runtime/package.json +1 -1
- package/plugins/ai-delivery/skills/intake-create/SKILL.md +1 -1
- package/plugins/ai-delivery/skills/pr-handoff/SKILL.md +14 -21
- package/plugins/ai-delivery/skills/worktree-lifecycle/SKILL.md +12 -23
- package/dist/services/deliveryRecordService.d.ts +0 -47
- package/dist/services/deliveryRecordService.js +0 -199
- package/dist/services/deliveryRecordService.js.map +0 -1
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { execFileSync } from 'node:child_process';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { chmodSync, copyFileSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, symlinkSync, writeFileSync, } from 'node:fs';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { join, resolve } from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import { test } from 'vitest';
|
|
9
|
+
const staged = (await import(new URL('../scripts/pre-commit.mjs', import.meta.url).href));
|
|
10
|
+
const hash = (bytes) => createHash('sha256').update(bytes).digest('hex');
|
|
11
|
+
function fixture(runner) {
|
|
12
|
+
const base = mkdtempSync(join(tmpdir(), 'staged-check-fixture-'));
|
|
13
|
+
const cwd = join(base, 'repo');
|
|
14
|
+
mkdirSync(join(cwd, 'scripts'), { recursive: true });
|
|
15
|
+
const git = (...args) => execFileSync('git', args, { cwd, encoding: 'utf8' }).trim();
|
|
16
|
+
git('init', '-q');
|
|
17
|
+
git('config', 'user.name', 'Synthetic Contributor');
|
|
18
|
+
git('config', 'user.email', 'contributor@example.test');
|
|
19
|
+
writeFileSync(join(cwd, 'partial.txt'), 'original\n');
|
|
20
|
+
writeFileSync(join(cwd, 'delete.txt'), 'tracked deletion\n');
|
|
21
|
+
writeFileSync(join(cwd, 'package-lock.json'), '{"synthetic":"original"}\n');
|
|
22
|
+
if (runner !== undefined)
|
|
23
|
+
writeFileSync(join(cwd, 'scripts/checks.mjs'), runner);
|
|
24
|
+
git('add', '.');
|
|
25
|
+
git('commit', '-qm', 'Synthetic baseline');
|
|
26
|
+
return { cwd, base, git, cleanup: () => rmSync(base, { recursive: true, force: true }) };
|
|
27
|
+
}
|
|
28
|
+
test('exact staged tree isolates partial edits, additions, deletions and lockfile changes without index/unstaged writes', () => {
|
|
29
|
+
const f = fixture();
|
|
30
|
+
try {
|
|
31
|
+
writeFileSync(join(f.cwd, 'partial.txt'), 'staged content\n');
|
|
32
|
+
writeFileSync(join(f.cwd, 'added.txt'), 'staged addition\n');
|
|
33
|
+
writeFileSync(join(f.cwd, 'package-lock.json'), '{"synthetic":"staged lock"}\n');
|
|
34
|
+
f.git('rm', '-q', 'delete.txt');
|
|
35
|
+
f.git('add', 'partial.txt', 'added.txt', 'package-lock.json');
|
|
36
|
+
writeFileSync(join(f.cwd, 'partial.txt'), 'unstaged content must survive\n');
|
|
37
|
+
writeFileSync(join(f.cwd, 'package-lock.json'), '{"synthetic":"unstaged lock"}\n');
|
|
38
|
+
writeFileSync(join(f.cwd, 'delete.txt'), 'unstaged recreated file\n');
|
|
39
|
+
writeFileSync(join(f.cwd, 'untracked.txt'), 'unrelated local file\n');
|
|
40
|
+
const index = join(f.cwd, '.git/index');
|
|
41
|
+
const before = hash(readFileSync(index));
|
|
42
|
+
const snapshot = staged.prepareStagedSnapshot(f.cwd, join(f.base, 'snapshot-owner'));
|
|
43
|
+
assert.equal(readFileSync(join(snapshot.snapshot, 'partial.txt'), 'utf8'), 'staged content\n');
|
|
44
|
+
assert.equal(readFileSync(join(snapshot.snapshot, 'added.txt'), 'utf8'), 'staged addition\n');
|
|
45
|
+
assert.equal(readFileSync(join(snapshot.snapshot, 'package-lock.json'), 'utf8'), '{"synthetic":"staged lock"}\n');
|
|
46
|
+
assert.equal(existsSync(join(snapshot.snapshot, 'delete.txt')), false);
|
|
47
|
+
assert.equal(existsSync(join(snapshot.snapshot, 'untracked.txt')), false);
|
|
48
|
+
assert.equal(snapshot.originalIndexSha256, before);
|
|
49
|
+
assert.equal(hash(readFileSync(index)), before);
|
|
50
|
+
assert.equal(readFileSync(join(f.cwd, 'partial.txt'), 'utf8'), 'unstaged content must survive\n');
|
|
51
|
+
assert.equal(readFileSync(join(f.cwd, 'package-lock.json'), 'utf8'), '{"synthetic":"unstaged lock"}\n');
|
|
52
|
+
assert.equal(readFileSync(join(f.cwd, 'delete.txt'), 'utf8'), 'unstaged recreated file\n');
|
|
53
|
+
assert.equal(readFileSync(join(f.cwd, 'untracked.txt'), 'utf8'), 'unrelated local file\n');
|
|
54
|
+
assert.match(snapshot.tree, /^[0-9a-f]{40}$/u);
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
f.cleanup();
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
function syntheticRunner(fullSuccess = true) {
|
|
61
|
+
return `import fs from 'node:fs';import path from 'node:path';
|
|
62
|
+
const args=process.argv.slice(2);const tree=args[args.indexOf('--staged-tree')+1],dir=args[args.indexOf('--results-dir')+1];
|
|
63
|
+
if(!args.includes('--install'))process.exit(8);
|
|
64
|
+
if(fs.readFileSync('package-lock.json','utf8')!=='{"synthetic":"original"}\\n')process.exit(9);
|
|
65
|
+
if(process.env.GH_TOKEN||process.env.NODE_OPTIONS||process.env.NODE_PATH)process.exit(10);
|
|
66
|
+
fs.mkdirSync(dir,{recursive:true});fs.writeFileSync(path.join(dir,'result.json'),JSON.stringify({fullSuccess:${fullSuccess},tree:{stagedGitTree:tree}}));`;
|
|
67
|
+
}
|
|
68
|
+
test('tracked entry executes staged runner rather than unstaged code and cleans only owned snapshot', async () => {
|
|
69
|
+
const f = fixture(syntheticRunner());
|
|
70
|
+
try {
|
|
71
|
+
writeFileSync(join(f.cwd, 'scripts/checks.mjs'), "throw Error('Unstaged runner must not execute');\n");
|
|
72
|
+
writeFileSync(join(f.cwd, 'package-lock.json'), '{"synthetic":"unstaged must not install"}\n');
|
|
73
|
+
const index = hash(readFileSync(join(f.cwd, '.git/index')));
|
|
74
|
+
const resultsDir = join(f.base, 'results');
|
|
75
|
+
const result = await staged.runStagedChecks({ cwd: f.cwd, resultsDir });
|
|
76
|
+
assert.equal(result.status, 'passed');
|
|
77
|
+
assert.equal(result.fullSuccess, true);
|
|
78
|
+
assert.equal(result.sourceIndexUnchanged, true);
|
|
79
|
+
assert.equal(result.cleanupConfirmed, true);
|
|
80
|
+
assert.equal(existsSync(result.ownedDirectory), false);
|
|
81
|
+
assert.equal(existsSync(join(resultsDir, 'full/result.json')), true);
|
|
82
|
+
assert.equal(hash(readFileSync(join(f.cwd, '.git/index'))), index);
|
|
83
|
+
assert.match(readFileSync(join(f.cwd, 'scripts/checks.mjs'), 'utf8'), /Unstaged runner/u);
|
|
84
|
+
assert.match(readFileSync(join(f.cwd, 'package-lock.json'), 'utf8'), /unstaged must not install/u);
|
|
85
|
+
await assert.rejects(staged.runStagedChecks({ cwd: f.cwd, resultsDir }), /Existing staged result/u);
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
f.cleanup();
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
test('fast or missing staged runner cannot become hook full success; unrelated source survives failure', async () => {
|
|
92
|
+
for (const runner of [undefined, syntheticRunner(false)]) {
|
|
93
|
+
const f = fixture(runner);
|
|
94
|
+
try {
|
|
95
|
+
const before = hash(readFileSync(join(f.cwd, '.git/index')));
|
|
96
|
+
const result = await staged.runStagedChecks({ cwd: f.cwd, resultsDir: join(f.base, 'result') });
|
|
97
|
+
assert.equal(result.fullSuccess, false);
|
|
98
|
+
assert.equal(result.status, 'failed');
|
|
99
|
+
assert.equal(result.cleanupConfirmed, true);
|
|
100
|
+
assert.equal(hash(readFileSync(join(f.cwd, '.git/index'))), before);
|
|
101
|
+
assert.equal(readFileSync(join(f.cwd, 'partial.txt'), 'utf8'), 'original\n');
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
f.cleanup();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
test('unsafe staged symlink is refused before commands and cleanup preserves the source index', async () => {
|
|
109
|
+
const f = fixture(syntheticRunner());
|
|
110
|
+
try {
|
|
111
|
+
symlinkSync('../outside', join(f.cwd, 'link'));
|
|
112
|
+
f.git('add', 'link');
|
|
113
|
+
const before = hash(readFileSync(join(f.cwd, '.git/index')));
|
|
114
|
+
const result = await staged.runStagedChecks({ cwd: f.cwd, resultsDir: join(f.base, 'result') });
|
|
115
|
+
assert.equal(result.status, 'failed');
|
|
116
|
+
assert.match(result.error, /symlink index entry/u);
|
|
117
|
+
assert.equal(result.cleanupConfirmed, true);
|
|
118
|
+
assert.equal(hash(readFileSync(join(f.cwd, '.git/index'))), before);
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
f.cleanup();
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
test('staged graph cancellation preserves source and partial evidence after owned child cleanup', async () => {
|
|
125
|
+
const f = fixture("console.log('synthetic staged graph started');setInterval(()=>{},1000);\n");
|
|
126
|
+
const controller = new AbortController();
|
|
127
|
+
const timer = setTimeout(() => controller.abort(), 750);
|
|
128
|
+
try {
|
|
129
|
+
const before = hash(readFileSync(join(f.cwd, '.git/index')));
|
|
130
|
+
const resultsDir = join(f.base, 'result');
|
|
131
|
+
const result = await staged.runStagedChecks({ cwd: f.cwd, resultsDir, signal: controller.signal });
|
|
132
|
+
assert.equal(result.status, 'cancelled');
|
|
133
|
+
assert.equal(result.exitCode, 130);
|
|
134
|
+
assert.equal(result.sourceIndexUnchanged, true);
|
|
135
|
+
assert.equal(result.cleanupConfirmed, true);
|
|
136
|
+
assert.equal(hash(readFileSync(join(f.cwd, '.git/index'))), before);
|
|
137
|
+
assert.match(readFileSync(join(resultsDir, 'process/stdout.txt'), 'utf8'), /synthetic staged graph started/u);
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
clearTimeout(timer);
|
|
141
|
+
f.cleanup();
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
test('unconfirmed child completion preserves the owned snapshot and marks cleanup unproved', async () => {
|
|
145
|
+
const f = fixture(syntheticRunner());
|
|
146
|
+
let ownedDirectory;
|
|
147
|
+
try {
|
|
148
|
+
const before = hash(readFileSync(join(f.cwd, '.git/index')));
|
|
149
|
+
const result = await staged.runStagedChecks({
|
|
150
|
+
cwd: f.cwd,
|
|
151
|
+
resultsDir: join(f.base, 'uncertain'),
|
|
152
|
+
execute: async () => ({ status: 'failed', cleanupConfirmed: false }),
|
|
153
|
+
});
|
|
154
|
+
ownedDirectory = result.ownedDirectory;
|
|
155
|
+
assert.equal(result.fullSuccess, false);
|
|
156
|
+
assert.equal(result.cleanupConfirmed, false);
|
|
157
|
+
assert.equal(existsSync(ownedDirectory), true);
|
|
158
|
+
assert.match(result.error, /quiescence is unconfirmed/u);
|
|
159
|
+
assert.equal(hash(readFileSync(join(f.cwd, '.git/index'))), before);
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
// The injected executor launched no process; this fixture owns safe cleanup.
|
|
163
|
+
if (ownedDirectory)
|
|
164
|
+
rmSync(ownedDirectory, { recursive: true, force: true });
|
|
165
|
+
f.cleanup();
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
test('caller relative alternate index supplies the exact tree and preserves both indexes and unstaged bytes', () => {
|
|
169
|
+
const f = fixture();
|
|
170
|
+
const previous = process.env.GIT_INDEX_FILE;
|
|
171
|
+
try {
|
|
172
|
+
const primary = join(f.cwd, '.git/index');
|
|
173
|
+
const alternate = join(f.cwd, '.git/alternate-index');
|
|
174
|
+
writeFileSync(join(f.cwd, 'partial.txt'), 'primary staged\n');
|
|
175
|
+
f.git('add', 'partial.txt');
|
|
176
|
+
copyFileSync(primary, alternate);
|
|
177
|
+
writeFileSync(join(f.cwd, 'partial.txt'), 'alternate staged\n');
|
|
178
|
+
execFileSync('git', ['add', 'partial.txt'], { cwd: f.cwd, env: { ...process.env, GIT_INDEX_FILE: alternate } });
|
|
179
|
+
writeFileSync(join(f.cwd, 'partial.txt'), 'final unstaged bytes\n');
|
|
180
|
+
const primaryHash = hash(readFileSync(primary)), alternateHash = hash(readFileSync(alternate));
|
|
181
|
+
assert.notEqual(primaryHash, alternateHash);
|
|
182
|
+
process.env.GIT_INDEX_FILE = '.git/alternate-index';
|
|
183
|
+
const snapshot = staged.prepareStagedSnapshot(f.cwd, join(f.base, 'alternate-snapshot'));
|
|
184
|
+
assert.equal(snapshot.index, alternate);
|
|
185
|
+
assert.equal(snapshot.originalIndexSha256, alternateHash);
|
|
186
|
+
assert.equal(readFileSync(join(snapshot.snapshot, 'partial.txt'), 'utf8'), 'alternate staged\n');
|
|
187
|
+
assert.equal(hash(readFileSync(primary)), primaryHash);
|
|
188
|
+
assert.equal(hash(readFileSync(alternate)), alternateHash);
|
|
189
|
+
assert.equal(readFileSync(join(f.cwd, 'partial.txt'), 'utf8'), 'final unstaged bytes\n');
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
if (previous === undefined)
|
|
193
|
+
delete process.env.GIT_INDEX_FILE;
|
|
194
|
+
else
|
|
195
|
+
process.env.GIT_INDEX_FILE = previous;
|
|
196
|
+
f.cleanup();
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
test('synthetic commit -a and path-limited hooks validate the Git-supplied temporary commit index', () => {
|
|
200
|
+
const entry = fileURLToPath(new URL('../scripts/pre-commit.mjs', import.meta.url));
|
|
201
|
+
const quote = (value) => "'" + value.replaceAll("'", "'\\''") + "'";
|
|
202
|
+
for (const mode of ['all', 'path']) {
|
|
203
|
+
const f = fixture(syntheticRunner());
|
|
204
|
+
try {
|
|
205
|
+
const resultsDir = join(f.base, 'hook-results');
|
|
206
|
+
const hook = join(f.cwd, '.git/hooks/pre-commit');
|
|
207
|
+
writeFileSync(hook, `#!/bin/sh\nexec ${quote(process.execPath)} ${quote(entry)} --results-dir ${quote(resultsDir)}\n`);
|
|
208
|
+
chmodSync(hook, 0o755); // Only this disposable synthetic repository owns the hook.
|
|
209
|
+
writeFileSync(join(f.cwd, 'partial.txt'), `${mode} committed content\n`);
|
|
210
|
+
if (mode === 'path')
|
|
211
|
+
writeFileSync(join(f.cwd, 'delete.txt'), 'unrelated unstaged content\n');
|
|
212
|
+
f.git('commit', '-qm', `Synthetic ${mode} commit`, ...(mode === 'all' ? ['-a'] : ['--', 'partial.txt']));
|
|
213
|
+
const result = JSON.parse(readFileSync(join(resultsDir, 'staged.json'), 'utf8'));
|
|
214
|
+
assert.equal(result.fullSuccess, true);
|
|
215
|
+
assert.equal(result.sourceIndexUnchanged, true);
|
|
216
|
+
assert.equal(result.cleanupConfirmed, true);
|
|
217
|
+
assert.notEqual(resolve(result.sourceIndexPath), join(f.cwd, '.git/index'));
|
|
218
|
+
assert.equal(result.stagedTree, f.git('rev-parse', 'HEAD^{tree}'));
|
|
219
|
+
assert.equal(f.git('show', 'HEAD:partial.txt'), `${mode} committed content`);
|
|
220
|
+
if (mode === 'path')
|
|
221
|
+
assert.equal(readFileSync(join(f.cwd, 'delete.txt'), 'utf8'), 'unrelated unstaged content\n');
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
f.cleanup();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
//# sourceMappingURL=stagedChecks.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stagedChecks.test.js","sourceRoot":"","sources":["../src/stagedChecks.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { afterEach, it, vi } from 'vitest';
|
|
3
|
+
import * as issue from './issue.js';
|
|
4
|
+
import { startTrackedIssue } from './dispatch.js';
|
|
5
|
+
afterEach(() => vi.restoreAllMocks());
|
|
6
|
+
it('recovers an unknown issue-create outcome by its remote request marker without another issue', async () => {
|
|
7
|
+
const remote = [];
|
|
8
|
+
const context = {
|
|
9
|
+
config: { repository: 'example/widget' },
|
|
10
|
+
repo: { owner: 'example', repo: 'widget' },
|
|
11
|
+
clients: { rest: { issues: { listForRepo: async () => ({ data: remote }) } } },
|
|
12
|
+
};
|
|
13
|
+
const create = vi.spyOn(issue, 'createIssue').mockImplementation(async (_context, input) => {
|
|
14
|
+
remote.push({
|
|
15
|
+
number: 17,
|
|
16
|
+
title: input.title,
|
|
17
|
+
body: input.body,
|
|
18
|
+
html_url: 'https://github.com/example/widget/issues/17',
|
|
19
|
+
state: 'open',
|
|
20
|
+
});
|
|
21
|
+
throw new Error('Lost create response');
|
|
22
|
+
});
|
|
23
|
+
vi.spyOn(issue, 'resumeCreatedIssue').mockResolvedValue({});
|
|
24
|
+
vi.spyOn(issue, 'startIssueBranch').mockResolvedValue({
|
|
25
|
+
issueNumber: 17,
|
|
26
|
+
issueUrl: remote[0]?.html_url ?? '',
|
|
27
|
+
branch: 'issue/17',
|
|
28
|
+
headSha: 'a'.repeat(40),
|
|
29
|
+
reused: true,
|
|
30
|
+
});
|
|
31
|
+
vi.spyOn(issue, 'journalIssueStart').mockResolvedValue({});
|
|
32
|
+
await assert.rejects(startTrackedIssue(context, { title: 'Improve widget', requestId: 'request-17' }), /Lost create response/u);
|
|
33
|
+
const result = await startTrackedIssue(context, { title: 'Improve widget', requestId: 'request-17' });
|
|
34
|
+
assert.ok('issueNumber' in result);
|
|
35
|
+
assert.equal(result.issueNumber, 17);
|
|
36
|
+
assert.equal(create.mock.calls.length, 1);
|
|
37
|
+
await assert.rejects(startTrackedIssue(context, { title: 'Conflicting intent', requestId: 'request-17' }), /conflict/u);
|
|
38
|
+
assert.equal(create.mock.calls.length, 1);
|
|
39
|
+
});
|
|
40
|
+
it('reuses one linked branch and refuses an unselected conflict before branch creation', async () => {
|
|
41
|
+
let mutations = 0;
|
|
42
|
+
let branches = ['custom/17'];
|
|
43
|
+
const context = {
|
|
44
|
+
config: { repository: 'example/widget' },
|
|
45
|
+
repo: { owner: 'example', repo: 'widget' },
|
|
46
|
+
clients: {
|
|
47
|
+
rest: { issues: { get: async () => ({ data: { number: 17, state: 'open', node_id: 'I', html_url: 'url' } }) } },
|
|
48
|
+
graphql: async (query) => {
|
|
49
|
+
if (query.includes('mutation'))
|
|
50
|
+
mutations++;
|
|
51
|
+
return {
|
|
52
|
+
repository: {
|
|
53
|
+
issue: {
|
|
54
|
+
linkedBranches: {
|
|
55
|
+
nodes: branches.map((name) => ({
|
|
56
|
+
ref: { name, target: { oid: 'a'.repeat(40) }, repository: { nameWithOwner: 'example/widget' } },
|
|
57
|
+
})),
|
|
58
|
+
pageInfo: { hasNextPage: false, endCursor: null },
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
assert.equal((await issue.startIssueBranch(context, 17)).branch, 'custom/17');
|
|
67
|
+
branches = ['one/17', 'two/17'];
|
|
68
|
+
await assert.rejects(issue.startIssueBranch(context, 17), /Select exactly one/u);
|
|
69
|
+
assert.equal((await issue.startIssueBranch(context, 17, 'two/17')).branch, 'two/17');
|
|
70
|
+
assert.equal(mutations, 0);
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=start.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.test.js","sourceRoot":"","sources":["../src/start.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|