oh-my-codex 0.21.30 → 0.21.32
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/Cargo.lock +6 -6
- package/Cargo.toml +1 -1
- package/dist/cli/__tests__/setup-skill-validation.test.js +7 -0
- package/dist/cli/__tests__/setup-skill-validation.test.js.map +1 -1
- package/dist/cli/__tests__/setup-skills-overwrite.test.js +55 -0
- package/dist/cli/__tests__/setup-skills-overwrite.test.js.map +1 -1
- package/dist/cli/__tests__/setup-symlink-destinations.test.d.ts +2 -0
- package/dist/cli/__tests__/setup-symlink-destinations.test.d.ts.map +1 -0
- package/dist/cli/__tests__/setup-symlink-destinations.test.js +382 -0
- package/dist/cli/__tests__/setup-symlink-destinations.test.js.map +1 -0
- package/dist/cli/setup.d.ts +6 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +402 -62
- package/dist/cli/setup.js.map +1 -1
- package/dist/team/__tests__/delivery-recovery.test.js +61 -1
- package/dist/team/__tests__/delivery-recovery.test.js.map +1 -1
- package/dist/team/runtime.d.ts +1 -0
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +47 -12
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +43 -16
- package/dist/team/state.js.map +1 -1
- package/package.json +1 -1
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { mkdtemp, mkdir, readFile, realpath, rm, symlink, writeFile, lstat } from 'node:fs/promises';
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
|
+
import { join, posix, win32 } from 'node:path';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { backupRelativePath, setup } from '../setup.js';
|
|
8
|
+
function setMockHome(home) {
|
|
9
|
+
const previousHome = process.env.HOME;
|
|
10
|
+
const previousCodexHome = process.env.CODEX_HOME;
|
|
11
|
+
process.env.HOME = home;
|
|
12
|
+
process.env.CODEX_HOME = join(home, '.codex');
|
|
13
|
+
return () => {
|
|
14
|
+
if (typeof previousHome === 'string')
|
|
15
|
+
process.env.HOME = previousHome;
|
|
16
|
+
else
|
|
17
|
+
delete process.env.HOME;
|
|
18
|
+
if (typeof previousCodexHome === 'string')
|
|
19
|
+
process.env.CODEX_HOME = previousCodexHome;
|
|
20
|
+
else
|
|
21
|
+
delete process.env.CODEX_HOME;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async function withRepo(run) {
|
|
25
|
+
const parent = await mkdtemp(join(tmpdir(), 'omx-setup-symlink-'));
|
|
26
|
+
const repo = join(parent, 'repo');
|
|
27
|
+
await mkdir(repo);
|
|
28
|
+
const restoreHome = setMockHome(join(parent, 'home'));
|
|
29
|
+
const previousCwd = process.cwd();
|
|
30
|
+
try {
|
|
31
|
+
process.chdir(repo);
|
|
32
|
+
await run(repo, parent);
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
process.chdir(previousCwd);
|
|
36
|
+
restoreHome();
|
|
37
|
+
await rm(parent, { recursive: true, force: true });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
describe('omx setup symlink destinations', () => {
|
|
41
|
+
it('refuses a symlinked project .gitignore and leaves the target untouched', async () => {
|
|
42
|
+
await withRepo(async (repo, parent) => {
|
|
43
|
+
const victim = join(parent, 'victim.txt');
|
|
44
|
+
await writeFile(victim, 'ORIGINAL-SECRET-CONTENT\n');
|
|
45
|
+
await symlink('../victim.txt', join(repo, '.gitignore'));
|
|
46
|
+
// setup resolves the project root from process.cwd(), which is canonical (macOS /var -> /private/var).
|
|
47
|
+
const gitignorePath = join(await realpath(repo), '.gitignore');
|
|
48
|
+
await assert.rejects(setup({ scope: 'project' }), (err) => {
|
|
49
|
+
const msg = err?.message || '';
|
|
50
|
+
return (msg.includes('Refusing to install through symlink') &&
|
|
51
|
+
msg.includes(gitignorePath) &&
|
|
52
|
+
msg.includes('Either remove the symlink'));
|
|
53
|
+
});
|
|
54
|
+
assert.equal(await readFile(victim, 'utf8'), 'ORIGINAL-SECRET-CONTENT\n');
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
it('refuses a symlinked prompt destination and leaves the target untouched', async () => {
|
|
58
|
+
await withRepo(async (repo, parent) => {
|
|
59
|
+
await mkdir(join(repo, '.codex', 'prompts'), { recursive: true });
|
|
60
|
+
const victim = join(parent, 'victim-prompt.txt');
|
|
61
|
+
await writeFile(victim, 'ORIGINAL-PROMPT-CONTENT\n');
|
|
62
|
+
const analystPath = join(repo, '.codex', 'prompts', 'analyst.md');
|
|
63
|
+
await symlink('../../../victim-prompt.txt', analystPath);
|
|
64
|
+
const reportedAnalystPath = join(await realpath(repo), '.codex', 'prompts', 'analyst.md');
|
|
65
|
+
await assert.rejects(setup({ scope: 'project' }), (err) => {
|
|
66
|
+
const msg = err?.message || '';
|
|
67
|
+
return (msg.includes('Refusing to install through symlink') &&
|
|
68
|
+
msg.includes(reportedAnalystPath) &&
|
|
69
|
+
msg.includes('Either remove the symlink'));
|
|
70
|
+
});
|
|
71
|
+
assert.equal(await readFile(victim, 'utf8'), 'ORIGINAL-PROMPT-CONTENT\n');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
it('rejects a symlinked ancestor directory (.codex)', async () => {
|
|
75
|
+
await withRepo(async (repo, parent) => {
|
|
76
|
+
const targetDir = join(parent, 'external-codex');
|
|
77
|
+
await mkdir(targetDir);
|
|
78
|
+
const victim = join(targetDir, 'secret.txt');
|
|
79
|
+
await writeFile(victim, 'EXTERNAL-SECRET\n');
|
|
80
|
+
// Create .codex as a symlink to external directory
|
|
81
|
+
await symlink(targetDir, join(repo, '.codex'));
|
|
82
|
+
await assert.rejects(setup({ scope: 'project' }), (err) => {
|
|
83
|
+
const msg = err?.message || '';
|
|
84
|
+
return ((msg.includes('Refusing to install through symlink') || msg.includes('Refusing native hook transaction')) &&
|
|
85
|
+
msg.includes('symlink') &&
|
|
86
|
+
(msg.includes('Either remove the symlink') || msg.includes('is a symbolic link')));
|
|
87
|
+
});
|
|
88
|
+
assert.equal(await readFile(victim, 'utf8'), 'EXTERNAL-SECRET\n');
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
it('rejects a symlinked auth directory', async () => {
|
|
92
|
+
await withRepo(async (repo, parent) => {
|
|
93
|
+
const targetDir = join(parent, 'external-auth');
|
|
94
|
+
await mkdir(targetDir);
|
|
95
|
+
const victim = join(targetDir, 'token.txt');
|
|
96
|
+
await writeFile(victim, 'SECRET-TOKEN\n');
|
|
97
|
+
// Create .omx as a symlink to external directory
|
|
98
|
+
await symlink(targetDir, join(repo, '.omx'));
|
|
99
|
+
await assert.rejects(setup({ scope: 'project' }), (err) => {
|
|
100
|
+
const msg = err?.message || '';
|
|
101
|
+
return (msg.includes('Refusing to install through symlink') &&
|
|
102
|
+
msg.includes('.omx') &&
|
|
103
|
+
msg.includes('Either remove the symlink'));
|
|
104
|
+
});
|
|
105
|
+
assert.equal(await readFile(victim, 'utf8'), 'SECRET-TOKEN\n');
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
it('rejects a symlinked state directory that setup manages', async () => {
|
|
109
|
+
await withRepo(async (repo, parent) => {
|
|
110
|
+
const targetDir = join(parent, 'external-state');
|
|
111
|
+
await mkdir(targetDir);
|
|
112
|
+
const victim = join(targetDir, 'installed-skills.json');
|
|
113
|
+
await writeFile(victim, '{"version": 1}\n');
|
|
114
|
+
// Create .omx/state as a symlink to external directory, which setup writes to for installed-skills.json
|
|
115
|
+
await mkdir(join(repo, '.omx'), { recursive: true });
|
|
116
|
+
await symlink(targetDir, join(repo, '.omx', 'state'));
|
|
117
|
+
await assert.rejects(setup({ scope: 'project' }), (err) => {
|
|
118
|
+
const msg = err?.message || '';
|
|
119
|
+
return (msg.includes('Refusing to install through symlink') &&
|
|
120
|
+
msg.includes('.omx') &&
|
|
121
|
+
msg.includes('Either remove the symlink'));
|
|
122
|
+
});
|
|
123
|
+
assert.equal(await readFile(victim, 'utf8'), '{"version": 1}\n');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
it('rejects a symlinked .omx directory even when hud-config.json would already exist', async () => {
|
|
127
|
+
await withRepo(async (repo, parent) => {
|
|
128
|
+
const targetDir = join(parent, 'external-omx');
|
|
129
|
+
await mkdir(targetDir);
|
|
130
|
+
// Create hud-config.json in the target so that the old code would skip validation
|
|
131
|
+
await mkdir(join(targetDir), { recursive: true });
|
|
132
|
+
await writeFile(join(targetDir, 'hud-config.json'), '{"preset": "focused"}\n');
|
|
133
|
+
// Create .omx as a symlink to external directory
|
|
134
|
+
await symlink(targetDir, join(repo, '.omx'));
|
|
135
|
+
await assert.rejects(setup({ scope: 'project' }), (err) => {
|
|
136
|
+
const msg = err?.message || '';
|
|
137
|
+
return (msg.includes('Refusing to install through symlink') &&
|
|
138
|
+
msg.includes('.omx') &&
|
|
139
|
+
msg.includes('Either remove the symlink'));
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
it('rejects a symlinked .omx/backups when backing up a managed file', async () => {
|
|
144
|
+
await withRepo(async (repo, parent) => {
|
|
145
|
+
const targetDir = join(parent, 'external-backups');
|
|
146
|
+
await mkdir(targetDir);
|
|
147
|
+
const victim = join(targetDir, 'secret-backup.txt');
|
|
148
|
+
// Create .omx/backups as a symlink to external directory
|
|
149
|
+
await mkdir(join(repo, '.omx'), { recursive: true });
|
|
150
|
+
await symlink(targetDir, join(repo, '.omx', 'backups'));
|
|
151
|
+
// Create an existing .gitignore to trigger the backup code path
|
|
152
|
+
await writeFile(join(repo, '.gitignore'), 'original-gitignore\n');
|
|
153
|
+
await assert.rejects(setup({ scope: 'project' }), (err) => {
|
|
154
|
+
const msg = err?.message || '';
|
|
155
|
+
return (msg.includes('Refusing to install through symlink') &&
|
|
156
|
+
msg.includes('backups') &&
|
|
157
|
+
msg.includes('Either remove the symlink'));
|
|
158
|
+
});
|
|
159
|
+
// Verify nothing was written to the victim directory
|
|
160
|
+
assert.equal(existsSync(victim), false, 'Backup should not be written outside the scope');
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
it('succeeds when scope root is under a symlinked parent (like /tmp on macOS) while still rejecting symlinks inside the managed tree', async () => {
|
|
164
|
+
// Regression test for issue #3887: On macOS, /tmp is a symlink to /private/tmp,
|
|
165
|
+
// so the setup should not reject paths just because they're under /tmp,
|
|
166
|
+
// but should still reject symlinks inside the managed scope (.codex, .omx, etc).
|
|
167
|
+
await withRepo(async (repo, parent) => {
|
|
168
|
+
// The repo is already under /tmp (symlinked parent), so this tests that
|
|
169
|
+
// OS-level symlinks are not rejected.
|
|
170
|
+
// Create a file to install
|
|
171
|
+
const skillDir = join(repo, '.codex', 'skills', 'test-skill');
|
|
172
|
+
await mkdir(skillDir, { recursive: true });
|
|
173
|
+
await writeFile(join(skillDir, 'SKILL.md'), '# Test Skill\n\nA test skill');
|
|
174
|
+
// Setup should succeed even though the scope root is under the /tmp symlink
|
|
175
|
+
await assert.doesNotReject(setup({ scope: 'project' }), 'Setup should succeed when scope root is under /tmp (symlinked OS directory)');
|
|
176
|
+
// Verify the setup actually completed
|
|
177
|
+
assert(existsSync(join(repo, '.gitignore')), '.gitignore should be created');
|
|
178
|
+
assert(existsSync(join(repo, '.codex', 'config.toml')), 'config.toml should be created');
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
it('succeeds with custom CODEX_HOME and validates files within CODEX_HOME scope', async () => {
|
|
182
|
+
// Regression test for #3889: When CODEX_HOME is set to a custom directory,
|
|
183
|
+
// setup should validate all user-scope files within the CODEX_HOME boundary.
|
|
184
|
+
// This tests that CODEX_HOME is used as the managed authority root.
|
|
185
|
+
await withRepo(async (repo, parent) => {
|
|
186
|
+
// Create a custom CODEX_HOME directory
|
|
187
|
+
const customCodexHome = join(parent, 'custom-codex');
|
|
188
|
+
await mkdir(customCodexHome, { recursive: true });
|
|
189
|
+
// Override CODEX_HOME to the custom location
|
|
190
|
+
const previousCodexHome = process.env.CODEX_HOME;
|
|
191
|
+
process.env.CODEX_HOME = customCodexHome;
|
|
192
|
+
try {
|
|
193
|
+
// Setup with user scope should succeed and use customCodexHome as authority root
|
|
194
|
+
await assert.doesNotReject(setup({ scope: 'user' }), 'Setup should succeed with custom CODEX_HOME');
|
|
195
|
+
// Verify config was created in custom CODEX_HOME
|
|
196
|
+
assert(existsSync(join(customCodexHome, 'config.toml')), 'config.toml should be created in custom CODEX_HOME');
|
|
197
|
+
}
|
|
198
|
+
finally {
|
|
199
|
+
if (typeof previousCodexHome === 'string') {
|
|
200
|
+
process.env.CODEX_HOME = previousCodexHome;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
delete process.env.CODEX_HOME;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
it('canonicalizes paths to handle OS-level symlinks in parent directories of non-existent CODEX_HOME (#4352912480)', async () => {
|
|
209
|
+
// Codex finding #4352912480: When CODEX_HOME doesn't exist yet (fresh install),
|
|
210
|
+
// we need to canonicalize through the deepest existing ancestor to handle OS-level
|
|
211
|
+
// symlinks like /tmp -> /private/tmp on macOS.
|
|
212
|
+
await withRepo(async (repo, parent) => {
|
|
213
|
+
// Create a CODEX_HOME that doesn't exist yet
|
|
214
|
+
const nonExistentCodexHome = join(parent, 'fresh', 'codex', 'home');
|
|
215
|
+
process.env.CODEX_HOME = nonExistentCodexHome;
|
|
216
|
+
try {
|
|
217
|
+
// Setup should succeed even though CODEX_HOME path doesn't exist
|
|
218
|
+
// (it will be created with intermediate directories)
|
|
219
|
+
await assert.doesNotReject(setup({ scope: 'user' }), 'Setup should succeed with non-existent CODEX_HOME path');
|
|
220
|
+
// Verify config was created at the correct location
|
|
221
|
+
assert(existsSync(join(nonExistentCodexHome, 'config.toml')), 'config.toml should be created in non-existent CODEX_HOME path');
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
// Restore original CODEX_HOME
|
|
225
|
+
const previousCodexHome = process.env.HOME ? join(process.env.HOME, '.codex') : undefined;
|
|
226
|
+
if (typeof previousCodexHome === 'string') {
|
|
227
|
+
process.env.CODEX_HOME = previousCodexHome;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
delete process.env.CODEX_HOME;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
it('validates project .codex directories against PROJECT root, not CODEX_HOME (#4352912487)', async () => {
|
|
236
|
+
// Codex finding #4352912487: Project scope directories like .codex/.omx should be
|
|
237
|
+
// validated against the PROJECT root, not CODEX_HOME. This ensures project-specific
|
|
238
|
+
// files stay within project boundaries.
|
|
239
|
+
await withRepo(async (repo, parent) => {
|
|
240
|
+
// Create a separate CODEX_HOME outside the repo
|
|
241
|
+
const externalCodexHome = join(parent, 'external-codex');
|
|
242
|
+
await mkdir(externalCodexHome, { recursive: true });
|
|
243
|
+
process.env.CODEX_HOME = externalCodexHome;
|
|
244
|
+
try {
|
|
245
|
+
// Setup with project scope should validate project .codex against repo root
|
|
246
|
+
await assert.doesNotReject(setup({ scope: 'project' }), 'Setup should succeed and validate project .codex against project root');
|
|
247
|
+
// Verify .codex was created inside the repo (project scope), not in external CODEX_HOME
|
|
248
|
+
assert(existsSync(join(repo, '.codex', 'config.toml')), '.codex/config.toml should be created in project repo, not in external CODEX_HOME');
|
|
249
|
+
// Verify config was NOT created in external CODEX_HOME for project scope
|
|
250
|
+
assert(!existsSync(join(externalCodexHome, 'config.toml')), 'config.toml should NOT be created in external CODEX_HOME for project scope');
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
const previousCodexHome = process.env.HOME ? join(process.env.HOME, '.codex') : undefined;
|
|
254
|
+
if (typeof previousCodexHome === 'string') {
|
|
255
|
+
process.env.CODEX_HOME = previousCodexHome;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
delete process.env.CODEX_HOME;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
it('validates OMX_ROOT directories against the override root (#4352912502)', async () => {
|
|
264
|
+
// Codex finding #4352912502: When OMX_ROOT environment variable is set,
|
|
265
|
+
// directories under it should be validated against that override root, not homedir().
|
|
266
|
+
await withRepo(async (repo, parent) => {
|
|
267
|
+
// Create a separate OMX_ROOT override
|
|
268
|
+
const omxRootOverride = join(parent, 'custom-omx-root');
|
|
269
|
+
await mkdir(omxRootOverride, { recursive: true });
|
|
270
|
+
const previousOmxRoot = process.env.OMX_ROOT;
|
|
271
|
+
process.env.OMX_ROOT = omxRootOverride;
|
|
272
|
+
try {
|
|
273
|
+
// Setup with user scope should use OMX_ROOT as the validation root for ~/.omx-like paths
|
|
274
|
+
await assert.doesNotReject(setup({ scope: 'user' }), 'Setup should succeed and use OMX_ROOT as validation root');
|
|
275
|
+
// When OMX_ROOT is set, .omx directory should be created under OMX_ROOT
|
|
276
|
+
// (or at least paths should validate against it)
|
|
277
|
+
const setupSucceeded = existsSync(join(process.env.HOME || '', '.codex', 'config.toml')) ||
|
|
278
|
+
existsSync(join(omxRootOverride, '.omx', 'backups')) ||
|
|
279
|
+
existsSync(join(omxRootOverride, 'backups'));
|
|
280
|
+
assert(setupSucceeded, 'Setup should have created files when OMX_ROOT is set');
|
|
281
|
+
}
|
|
282
|
+
finally {
|
|
283
|
+
if (typeof previousOmxRoot === 'string') {
|
|
284
|
+
process.env.OMX_ROOT = previousOmxRoot;
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
delete process.env.OMX_ROOT;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
it('sanitizes out-of-base and Windows cross-drive backup paths', () => {
|
|
293
|
+
// Same-drive targets keep their relative location under the backup root.
|
|
294
|
+
assert.equal(backupRelativePath('C:\\Users\\alice', 'C:\\Users\\alice\\.codex\\skills\\old', win32), '.codex\\skills\\old');
|
|
295
|
+
// Cross-drive: win32.relative returns an absolute path, which must not escape the backup root.
|
|
296
|
+
assert.equal(backupRelativePath('C:\\Users\\alice', 'D:\\codex\\skills\\old', win32), 'codex_skills_old');
|
|
297
|
+
assert.equal(backupRelativePath('/home/alice', '/opt/codex/skills/old', posix), 'opt_codex_skills_old');
|
|
298
|
+
assert.equal(backupRelativePath('/home/alice', '/home/alice', posix), 'home_alice');
|
|
299
|
+
assert.equal(backupRelativePath('/home/alice', '/home/alice/..data/x', posix), '..data/x');
|
|
300
|
+
});
|
|
301
|
+
it('rejects dangling symlinks in validation scope to prevent out-of-scope writes', async () => {
|
|
302
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-setup-dangling-symlink-'));
|
|
303
|
+
const previousCwd = process.cwd();
|
|
304
|
+
try {
|
|
305
|
+
process.chdir(wd);
|
|
306
|
+
// Create a project directory with a dangling symlink
|
|
307
|
+
await mkdir(join(wd, '.codex'), { recursive: true });
|
|
308
|
+
// Create a dangling symlink in the project
|
|
309
|
+
const symlinkPath = join(wd, '.gitignore-link');
|
|
310
|
+
// Create a symlink pointing to a non-existent target
|
|
311
|
+
await symlink(join(wd, '..', 'victim', '.gitignore'), symlinkPath);
|
|
312
|
+
// Verify it's a dangling symlink
|
|
313
|
+
assert.equal(existsSync(symlinkPath), false, 'dangling symlink should not be followable with existsSync');
|
|
314
|
+
const stats = await lstat(symlinkPath);
|
|
315
|
+
assert.equal(stats.isSymbolicLink(), true, 'path should be a symlink');
|
|
316
|
+
// Setup should succeed without following the dangling symlink
|
|
317
|
+
// The key is that the validation should detect the symlink and not try to follow it
|
|
318
|
+
const previousHome = process.env.HOME;
|
|
319
|
+
process.env.HOME = wd;
|
|
320
|
+
try {
|
|
321
|
+
// This should not throw and should not create files outside the scope
|
|
322
|
+
await setup({ scope: 'project', dryRun: true });
|
|
323
|
+
// The key test: the dangling symlink should not be followed or created as a real file
|
|
324
|
+
assert.equal(existsSync(join(wd, '..', 'victim')), false, 'target of dangling symlink should not be created');
|
|
325
|
+
}
|
|
326
|
+
finally {
|
|
327
|
+
if (typeof previousHome === 'string') {
|
|
328
|
+
process.env.HOME = previousHome;
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
delete process.env.HOME;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
finally {
|
|
336
|
+
process.chdir(previousCwd);
|
|
337
|
+
await rm(wd, { recursive: true, force: true });
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
it('handles symlinked HOME directory for scope validation (regression test for macOS /var symlink)', async () => {
|
|
341
|
+
// Regression test for the /var -> /private/var issue on macOS, which can also occur when
|
|
342
|
+
// HOME itself is accessed through a symlink. Create a symlinked home to test canonicalization.
|
|
343
|
+
const root = await mkdtemp(join(tmpdir(), 'omx-setup-symlinked-home-'));
|
|
344
|
+
const realHome = join(root, 'real-home');
|
|
345
|
+
const symlinkHome = join(root, 'symlinked-home');
|
|
346
|
+
const repo = join(symlinkHome, 'repo');
|
|
347
|
+
await mkdir(realHome);
|
|
348
|
+
await mkdir(join(realHome, 'repo'));
|
|
349
|
+
// Create a symlink to the real home directory
|
|
350
|
+
await symlink(realHome, symlinkHome);
|
|
351
|
+
const previousHome = process.env.HOME;
|
|
352
|
+
const previousCodexHome = process.env.CODEX_HOME;
|
|
353
|
+
const previousCwd = process.cwd();
|
|
354
|
+
try {
|
|
355
|
+
// Set HOME to the symlinked path (non-canonical)
|
|
356
|
+
process.env.HOME = symlinkHome;
|
|
357
|
+
process.env.CODEX_HOME = join(symlinkHome, '.codex');
|
|
358
|
+
process.chdir(repo);
|
|
359
|
+
// This should succeed without throwing "outside managed scope" error
|
|
360
|
+
// The key is that scope validation must handle symlinks in the HOME path
|
|
361
|
+
await setup({ scope: 'user' });
|
|
362
|
+
assert(existsSync(join(symlinkHome, '.codex')), 'CODEX_HOME should be created');
|
|
363
|
+
}
|
|
364
|
+
finally {
|
|
365
|
+
process.chdir(previousCwd);
|
|
366
|
+
if (typeof previousHome === 'string') {
|
|
367
|
+
process.env.HOME = previousHome;
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
delete process.env.HOME;
|
|
371
|
+
}
|
|
372
|
+
if (typeof previousCodexHome === 'string') {
|
|
373
|
+
process.env.CODEX_HOME = previousCodexHome;
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
delete process.env.CODEX_HOME;
|
|
377
|
+
}
|
|
378
|
+
await rm(root, { recursive: true, force: true });
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
//# sourceMappingURL=setup-symlink-destinations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-symlink-destinations.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/setup-symlink-destinations.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/setup.d.ts
CHANGED
|
@@ -120,6 +120,12 @@ type WindowsNativeHookShimReferenceDecision = "not_referenced" | "referenced" |
|
|
|
120
120
|
* and agent payloads remain inert metadata.
|
|
121
121
|
*/
|
|
122
122
|
export declare function decideWindowsNativeHookShimReference(finalHooksContent: string | null, shimPath: string): WindowsNativeHookShimReferenceDecision;
|
|
123
|
+
/**
|
|
124
|
+
* Relative location of `targetPath` inside a backup root. Falls back to a sanitized
|
|
125
|
+
* absolute path when the target is outside `baseRoot`, including Windows cross-drive
|
|
126
|
+
* targets where `relative()` returns an absolute path instead of a `..` path.
|
|
127
|
+
*/
|
|
128
|
+
export declare function backupRelativePath(baseRoot: string, targetPath: string, pathApi?: Pick<typeof import("path"), "relative" | "isAbsolute">): string;
|
|
123
129
|
export declare function parseSkillFrontmatter(content: string, filePath?: string): SkillFrontmatterMetadata;
|
|
124
130
|
export declare function validateSkillFile(skillMdPath: string): Promise<void>;
|
|
125
131
|
export declare function resolveScopeDirectories(scope: SetupScope, projectRoot: string): ScopeDirectories;
|
package/dist/cli/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
|