@cleocode/git-shim 2026.5.16 → 2026.5.17
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/dist/__tests__/isolation-boundary.test.d.ts +23 -0
- package/dist/__tests__/isolation-boundary.test.d.ts.map +1 -0
- package/dist/__tests__/isolation-boundary.test.js +291 -0
- package/dist/__tests__/isolation-boundary.test.js.map +1 -0
- package/dist/audit-log.d.ts +5 -2
- package/dist/audit-log.d.ts.map +1 -1
- package/dist/audit-log.js.map +1 -1
- package/dist/boundary.d.ts +7 -3
- package/dist/boundary.d.ts.map +1 -1
- package/dist/boundary.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/isolation-boundary.d.ts +70 -0
- package/dist/isolation-boundary.d.ts.map +1 -0
- package/dist/isolation-boundary.js +109 -0
- package/dist/isolation-boundary.js.map +1 -0
- package/dist/shim.d.ts +7 -1
- package/dist/shim.d.ts.map +1 -1
- package/dist/shim.js +31 -4
- package/dist/shim.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the T1761 isolation boundary check in the git-shim.
|
|
3
|
+
*
|
|
4
|
+
* Verifies:
|
|
5
|
+
* - `isCwdInsideWorktree` correctly identifies in/out-of-boundary paths.
|
|
6
|
+
* - `evaluateIsolationBoundary` fires ONLY for:
|
|
7
|
+
* - CLEO_AGENT_ROLE=worker
|
|
8
|
+
* - CLEO_WORKTREE_ROOT set to an absolute path
|
|
9
|
+
* - A mutation subcommand (add, commit, rm, mv, restore, apply, am)
|
|
10
|
+
* - cwd outside CLEO_WORKTREE_ROOT
|
|
11
|
+
* - The check is skipped for non-worker roles (lead, subagent, orchestrator).
|
|
12
|
+
* - The check is skipped when CLEO_WORKTREE_ROOT is absent.
|
|
13
|
+
* - The check is skipped for read-only subcommands (log, status, diff).
|
|
14
|
+
* - The check passes when cwd equals the worktree root or is a descendant.
|
|
15
|
+
* - Drift detection: `ISOLATION_ENV_KEYS` from `@cleocode/contracts` contains
|
|
16
|
+
* exactly the two keys consumed by `evaluateIsolationBoundary`
|
|
17
|
+
* (`CLEO_WORKTREE_ROOT` and `CLEO_AGENT_ROLE`), so a schema change in
|
|
18
|
+
* contracts will cause this test to fail loudly.
|
|
19
|
+
*
|
|
20
|
+
* @task T1761
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=isolation-boundary.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolation-boundary.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/isolation-boundary.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the T1761 isolation boundary check in the git-shim.
|
|
3
|
+
*
|
|
4
|
+
* Verifies:
|
|
5
|
+
* - `isCwdInsideWorktree` correctly identifies in/out-of-boundary paths.
|
|
6
|
+
* - `evaluateIsolationBoundary` fires ONLY for:
|
|
7
|
+
* - CLEO_AGENT_ROLE=worker
|
|
8
|
+
* - CLEO_WORKTREE_ROOT set to an absolute path
|
|
9
|
+
* - A mutation subcommand (add, commit, rm, mv, restore, apply, am)
|
|
10
|
+
* - cwd outside CLEO_WORKTREE_ROOT
|
|
11
|
+
* - The check is skipped for non-worker roles (lead, subagent, orchestrator).
|
|
12
|
+
* - The check is skipped when CLEO_WORKTREE_ROOT is absent.
|
|
13
|
+
* - The check is skipped for read-only subcommands (log, status, diff).
|
|
14
|
+
* - The check passes when cwd equals the worktree root or is a descendant.
|
|
15
|
+
* - Drift detection: `ISOLATION_ENV_KEYS` from `@cleocode/contracts` contains
|
|
16
|
+
* exactly the two keys consumed by `evaluateIsolationBoundary`
|
|
17
|
+
* (`CLEO_WORKTREE_ROOT` and `CLEO_AGENT_ROLE`), so a schema change in
|
|
18
|
+
* contracts will cause this test to fail loudly.
|
|
19
|
+
*
|
|
20
|
+
* @task T1761
|
|
21
|
+
*/
|
|
22
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
23
|
+
import { tmpdir } from 'node:os';
|
|
24
|
+
import { join } from 'node:path';
|
|
25
|
+
import { ISOLATION_ENV_KEYS } from '@cleocode/contracts';
|
|
26
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
27
|
+
import { evaluateIsolationBoundary, isCwdInsideWorktree } from '../isolation-boundary.js';
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Environment management
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
const ENV_KEYS_UNDER_TEST = [
|
|
32
|
+
'CLEO_AGENT_ROLE',
|
|
33
|
+
'CLEO_WORKTREE_ROOT',
|
|
34
|
+
'XDG_DATA_HOME',
|
|
35
|
+
'CLEO_AUDIT_LOG_PATH',
|
|
36
|
+
];
|
|
37
|
+
const savedEnv = {};
|
|
38
|
+
let workspace;
|
|
39
|
+
beforeEach(() => {
|
|
40
|
+
for (const key of ENV_KEYS_UNDER_TEST)
|
|
41
|
+
savedEnv[key] = process.env[key];
|
|
42
|
+
workspace = mkdtempSync(join(tmpdir(), 'cleo-git-shim-T1761-'));
|
|
43
|
+
process.env['XDG_DATA_HOME'] = workspace;
|
|
44
|
+
process.env['CLEO_AUDIT_LOG_PATH'] = join(workspace, 'audit', 'git-shim.jsonl');
|
|
45
|
+
});
|
|
46
|
+
afterEach(() => {
|
|
47
|
+
for (const key of ENV_KEYS_UNDER_TEST) {
|
|
48
|
+
const v = savedEnv[key];
|
|
49
|
+
if (v === undefined)
|
|
50
|
+
delete process.env[key];
|
|
51
|
+
else
|
|
52
|
+
process.env[key] = v;
|
|
53
|
+
}
|
|
54
|
+
rmSync(workspace, { recursive: true, force: true });
|
|
55
|
+
});
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// isCwdInsideWorktree — pure path helper
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
describe('isCwdInsideWorktree', () => {
|
|
60
|
+
it('returns true when cwd equals the worktree root', () => {
|
|
61
|
+
expect(isCwdInsideWorktree('/home/user/wt/T1761', '/home/user/wt/T1761')).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it('returns true when cwd is a direct child of the worktree root', () => {
|
|
64
|
+
expect(isCwdInsideWorktree('/home/user/wt/T1761/packages', '/home/user/wt/T1761')).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
it('returns true when cwd is a deeply nested descendant', () => {
|
|
67
|
+
expect(isCwdInsideWorktree('/home/user/wt/T1761/packages/core/src', '/home/user/wt/T1761')).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
it('returns false when cwd is the parent of the worktree root', () => {
|
|
70
|
+
expect(isCwdInsideWorktree('/home/user/wt', '/home/user/wt/T1761')).toBe(false);
|
|
71
|
+
});
|
|
72
|
+
it('returns false when cwd is a sibling worktree', () => {
|
|
73
|
+
expect(isCwdInsideWorktree('/home/user/wt/T1760', '/home/user/wt/T1761')).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
it('returns false when cwd is the project root (main repo)', () => {
|
|
76
|
+
expect(isCwdInsideWorktree('/mnt/projects/cleocode', '/home/user/wt/T1761')).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
it('returns false when cwd shares a prefix but is not a descendant', () => {
|
|
79
|
+
// "/home/user/wt/T1761extra" should NOT match "/home/user/wt/T1761"
|
|
80
|
+
expect(isCwdInsideWorktree('/home/user/wt/T1761extra', '/home/user/wt/T1761')).toBe(false);
|
|
81
|
+
});
|
|
82
|
+
it('handles trailing slash on worktreeRoot gracefully', () => {
|
|
83
|
+
// resolve() strips trailing slashes — both should behave identically
|
|
84
|
+
expect(isCwdInsideWorktree('/home/user/wt/T1761/sub', '/home/user/wt/T1761/')).toBe(true);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// evaluateIsolationBoundary — env-driven logic
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
describe('evaluateIsolationBoundary', () => {
|
|
91
|
+
const worktreeRoot = '/home/user/.local/share/cleo/worktrees/abc123/T1761';
|
|
92
|
+
const outsideCwd = '/mnt/projects/cleocode';
|
|
93
|
+
/**
|
|
94
|
+
* Helper: spy on process.cwd() to return a synthetic value.
|
|
95
|
+
*/
|
|
96
|
+
function mockCwd(path) {
|
|
97
|
+
return vi.spyOn(process, 'cwd').mockReturnValue(path);
|
|
98
|
+
}
|
|
99
|
+
afterEach(() => {
|
|
100
|
+
vi.restoreAllMocks();
|
|
101
|
+
});
|
|
102
|
+
// -- worker + mutation subcommands + outside worktree = BLOCKED ----------------
|
|
103
|
+
it('blocks git add when worker cwd is outside CLEO_WORKTREE_ROOT', () => {
|
|
104
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
105
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
106
|
+
mockCwd(outsideCwd);
|
|
107
|
+
const result = evaluateIsolationBoundary('add');
|
|
108
|
+
expect(result).not.toBeNull();
|
|
109
|
+
expect(result?.code).toBe('E_GIT_BOUNDARY_CWD_OUTSIDE_WORKTREE');
|
|
110
|
+
expect(result?.boundary).toBe('isolation');
|
|
111
|
+
expect(result?.context['cwd']).toBe(outsideCwd);
|
|
112
|
+
expect(result?.context['worktree_root']).toBe(worktreeRoot);
|
|
113
|
+
});
|
|
114
|
+
it('blocks git commit when worker cwd is outside CLEO_WORKTREE_ROOT', () => {
|
|
115
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
116
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
117
|
+
mockCwd(outsideCwd);
|
|
118
|
+
const result = evaluateIsolationBoundary('commit');
|
|
119
|
+
expect(result).not.toBeNull();
|
|
120
|
+
expect(result?.code).toBe('E_GIT_BOUNDARY_CWD_OUTSIDE_WORKTREE');
|
|
121
|
+
});
|
|
122
|
+
it('blocks git rm when worker cwd is outside CLEO_WORKTREE_ROOT', () => {
|
|
123
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
124
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
125
|
+
mockCwd(outsideCwd);
|
|
126
|
+
expect(evaluateIsolationBoundary('rm')).not.toBeNull();
|
|
127
|
+
});
|
|
128
|
+
it('blocks git mv when worker cwd is outside CLEO_WORKTREE_ROOT', () => {
|
|
129
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
130
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
131
|
+
mockCwd(outsideCwd);
|
|
132
|
+
expect(evaluateIsolationBoundary('mv')).not.toBeNull();
|
|
133
|
+
});
|
|
134
|
+
it('blocks git restore when worker cwd is outside CLEO_WORKTREE_ROOT', () => {
|
|
135
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
136
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
137
|
+
mockCwd(outsideCwd);
|
|
138
|
+
expect(evaluateIsolationBoundary('restore')).not.toBeNull();
|
|
139
|
+
});
|
|
140
|
+
it('blocks git apply when worker cwd is outside CLEO_WORKTREE_ROOT', () => {
|
|
141
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
142
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
143
|
+
mockCwd(outsideCwd);
|
|
144
|
+
expect(evaluateIsolationBoundary('apply')).not.toBeNull();
|
|
145
|
+
});
|
|
146
|
+
it('blocks git am when worker cwd is outside CLEO_WORKTREE_ROOT', () => {
|
|
147
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
148
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
149
|
+
mockCwd(outsideCwd);
|
|
150
|
+
expect(evaluateIsolationBoundary('am')).not.toBeNull();
|
|
151
|
+
});
|
|
152
|
+
// -- cwd inside worktree = allowed -------------------------------------------
|
|
153
|
+
it('allows git add when worker cwd equals the worktree root', () => {
|
|
154
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
155
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
156
|
+
mockCwd(worktreeRoot);
|
|
157
|
+
expect(evaluateIsolationBoundary('add')).toBeNull();
|
|
158
|
+
});
|
|
159
|
+
it('allows git add when worker cwd is a subdirectory of worktree root', () => {
|
|
160
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
161
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
162
|
+
mockCwd(`${worktreeRoot}/packages/core/src`);
|
|
163
|
+
expect(evaluateIsolationBoundary('add')).toBeNull();
|
|
164
|
+
});
|
|
165
|
+
// -- non-worker roles = skip check -------------------------------------------
|
|
166
|
+
it('skips check when CLEO_AGENT_ROLE=lead', () => {
|
|
167
|
+
process.env['CLEO_AGENT_ROLE'] = 'lead';
|
|
168
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
169
|
+
mockCwd(outsideCwd);
|
|
170
|
+
expect(evaluateIsolationBoundary('add')).toBeNull();
|
|
171
|
+
});
|
|
172
|
+
it('skips check when CLEO_AGENT_ROLE=subagent', () => {
|
|
173
|
+
process.env['CLEO_AGENT_ROLE'] = 'subagent';
|
|
174
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
175
|
+
mockCwd(outsideCwd);
|
|
176
|
+
expect(evaluateIsolationBoundary('add')).toBeNull();
|
|
177
|
+
});
|
|
178
|
+
it('skips check when CLEO_AGENT_ROLE=orchestrator', () => {
|
|
179
|
+
process.env['CLEO_AGENT_ROLE'] = 'orchestrator';
|
|
180
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
181
|
+
mockCwd(outsideCwd);
|
|
182
|
+
expect(evaluateIsolationBoundary('add')).toBeNull();
|
|
183
|
+
});
|
|
184
|
+
it('skips check when CLEO_AGENT_ROLE is absent', () => {
|
|
185
|
+
delete process.env['CLEO_AGENT_ROLE'];
|
|
186
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
187
|
+
mockCwd(outsideCwd);
|
|
188
|
+
expect(evaluateIsolationBoundary('add')).toBeNull();
|
|
189
|
+
});
|
|
190
|
+
// -- CLEO_WORKTREE_ROOT absent = skip check ----------------------------------
|
|
191
|
+
it('skips check when CLEO_WORKTREE_ROOT is not set', () => {
|
|
192
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
193
|
+
delete process.env['CLEO_WORKTREE_ROOT'];
|
|
194
|
+
mockCwd(outsideCwd);
|
|
195
|
+
expect(evaluateIsolationBoundary('add')).toBeNull();
|
|
196
|
+
});
|
|
197
|
+
it('skips check when CLEO_WORKTREE_ROOT is empty string', () => {
|
|
198
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
199
|
+
process.env['CLEO_WORKTREE_ROOT'] = '';
|
|
200
|
+
mockCwd(outsideCwd);
|
|
201
|
+
expect(evaluateIsolationBoundary('add')).toBeNull();
|
|
202
|
+
});
|
|
203
|
+
// -- read-only subcommands = skip check --------------------------------------
|
|
204
|
+
it('skips check for git log (read-only)', () => {
|
|
205
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
206
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
207
|
+
mockCwd(outsideCwd);
|
|
208
|
+
expect(evaluateIsolationBoundary('log')).toBeNull();
|
|
209
|
+
});
|
|
210
|
+
it('skips check for git status (read-only)', () => {
|
|
211
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
212
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
213
|
+
mockCwd(outsideCwd);
|
|
214
|
+
expect(evaluateIsolationBoundary('status')).toBeNull();
|
|
215
|
+
});
|
|
216
|
+
it('skips check for git diff (read-only)', () => {
|
|
217
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
218
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
219
|
+
mockCwd(outsideCwd);
|
|
220
|
+
expect(evaluateIsolationBoundary('diff')).toBeNull();
|
|
221
|
+
});
|
|
222
|
+
it('skips check for git show (read-only)', () => {
|
|
223
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
224
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
225
|
+
mockCwd(outsideCwd);
|
|
226
|
+
expect(evaluateIsolationBoundary('show')).toBeNull();
|
|
227
|
+
});
|
|
228
|
+
// -- error message content ---------------------------------------------------
|
|
229
|
+
it('includes cwd, worktree_root, and role in the violation context', () => {
|
|
230
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
231
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
232
|
+
mockCwd(outsideCwd);
|
|
233
|
+
const result = evaluateIsolationBoundary('commit');
|
|
234
|
+
expect(result?.context).toMatchObject({
|
|
235
|
+
cwd: outsideCwd,
|
|
236
|
+
worktree_root: worktreeRoot,
|
|
237
|
+
role: 'worker',
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
it('message mentions the subcommand and outside-worktree context', () => {
|
|
241
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
242
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
243
|
+
mockCwd(outsideCwd);
|
|
244
|
+
const result = evaluateIsolationBoundary('add');
|
|
245
|
+
expect(result?.message).toContain('git add');
|
|
246
|
+
expect(result?.message).toContain('outside');
|
|
247
|
+
expect(result?.message).toContain('worktree');
|
|
248
|
+
});
|
|
249
|
+
it('remediation mentions CLEO_ALLOW_GIT=1', () => {
|
|
250
|
+
process.env['CLEO_AGENT_ROLE'] = 'worker';
|
|
251
|
+
process.env['CLEO_WORKTREE_ROOT'] = worktreeRoot;
|
|
252
|
+
mockCwd(outsideCwd);
|
|
253
|
+
const result = evaluateIsolationBoundary('add');
|
|
254
|
+
expect(result?.remediation).toContain('CLEO_ALLOW_GIT=1');
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
// ---------------------------------------------------------------------------
|
|
258
|
+
// Drift detection — ISOLATION_ENV_KEYS must cover the vars this file uses
|
|
259
|
+
// ---------------------------------------------------------------------------
|
|
260
|
+
describe('drift detection: ISOLATION_ENV_KEYS alignment', () => {
|
|
261
|
+
it('ISOLATION_ENV_KEYS includes CLEO_WORKTREE_ROOT', () => {
|
|
262
|
+
expect(ISOLATION_ENV_KEYS).toContain('CLEO_WORKTREE_ROOT');
|
|
263
|
+
});
|
|
264
|
+
it('ISOLATION_ENV_KEYS includes CLEO_AGENT_ROLE', () => {
|
|
265
|
+
expect(ISOLATION_ENV_KEYS).toContain('CLEO_AGENT_ROLE');
|
|
266
|
+
});
|
|
267
|
+
it('evaluateIsolationBoundary uses ISOLATION_ENV_KEYS[0] for CLEO_WORKTREE_ROOT and ISOLATION_ENV_KEYS[1] for CLEO_AGENT_ROLE', () => {
|
|
268
|
+
// This test encodes the positional expectations so that if the const tuple
|
|
269
|
+
// order changes in @cleocode/contracts, this test fails loudly — forcing a
|
|
270
|
+
// corresponding update in shim.ts.
|
|
271
|
+
expect(ISOLATION_ENV_KEYS[0]).toBe('CLEO_WORKTREE_ROOT');
|
|
272
|
+
expect(ISOLATION_ENV_KEYS[1]).toBe('CLEO_AGENT_ROLE');
|
|
273
|
+
});
|
|
274
|
+
it('ISOLATION_ENV_KEYS has no unknown keys relative to GitShimEnv interface', () => {
|
|
275
|
+
// GitShimEnv documents the env vars consumed by the shim as a whole.
|
|
276
|
+
// ISOLATION_ENV_KEYS is the subset injected by provisionIsolatedShell.
|
|
277
|
+
// All ISOLATION_ENV_KEYS must be a subset of the documented GitShimEnv keys.
|
|
278
|
+
const knownShimEnvKeys = new Set([
|
|
279
|
+
'CLEO_AGENT_ROLE',
|
|
280
|
+
'CLEO_ALLOW_BRANCH_OPS',
|
|
281
|
+
'CLEO_WORKTREE_ROOT',
|
|
282
|
+
'CLEO_BRANCH_PROTECTION',
|
|
283
|
+
'CLEO_WORKTREE_BRANCH',
|
|
284
|
+
'CLEO_PROJECT_HASH',
|
|
285
|
+
]);
|
|
286
|
+
for (const key of ISOLATION_ENV_KEYS) {
|
|
287
|
+
expect(knownShimEnvKeys.has(key)).toBe(true);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
//# sourceMappingURL=isolation-boundary.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolation-boundary.test.js","sourceRoot":"","sources":["../../src/__tests__/isolation-boundary.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE1F,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,MAAM,mBAAmB,GAAG;IAC1B,iBAAiB;IACjB,oBAAoB;IACpB,eAAe;IACf,qBAAqB;CACtB,CAAC;AACF,MAAM,QAAQ,GAAuC,EAAE,CAAC;AAExD,IAAI,SAAiB,CAAC;AAEtB,UAAU,CAAC,GAAG,EAAE;IACd,KAAK,MAAM,GAAG,IAAI,mBAAmB;QAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxE,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;AAClF,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;YACxC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAE9E,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,mBAAmB,CAAC,8BAA8B,EAAE,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CACJ,mBAAmB,CAAC,uCAAuC,EAAE,qBAAqB,CAAC,CACpF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,oEAAoE;QACpE,MAAM,CAAC,mBAAmB,CAAC,0BAA0B,EAAE,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,qEAAqE;QACrE,MAAM,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;AAE9E,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,MAAM,YAAY,GAAG,qDAAqD,CAAC;IAC3E,MAAM,UAAU,GAAG,wBAAwB,CAAC;IAE5C;;OAEG;IACH,SAAS,OAAO,CAAC,IAAY;QAC3B,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,iFAAiF;IAEjF,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QAEpB,MAAM,MAAM,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QAEpB,MAAM,MAAM,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAE/E,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,YAAY,CAAC,CAAC;QACtB,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,GAAG,YAAY,oBAAoB,CAAC,CAAC;QAC7C,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAE/E,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,UAAU,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,cAAc,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAE/E,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACzC,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC;QACvC,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAE/E,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAE/E,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QAEpB,MAAM,MAAM,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,aAAa,CAAC;YACpC,GAAG,EAAE,UAAU;YACf,aAAa,EAAE,YAAY;YAC3B,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QAEpB,MAAM,MAAM,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC;QACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QAEpB,MAAM,MAAM,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,0EAA0E;AAC1E,8EAA8E;AAE9E,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,kBAAkB,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,kBAAkB,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2HAA2H,EAAE,GAAG,EAAE;QACnI,2EAA2E;QAC3E,2EAA2E;QAC3E,mCAAmC;QACnC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACzD,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,qEAAqE;QACrE,uEAAuE;QACvE,6EAA6E;QAC7E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;YAC/B,iBAAiB;YACjB,uBAAuB;YACvB,oBAAoB;YACpB,wBAAwB;YACxB,sBAAsB;YACtB,mBAAmB;SACpB,CAAC,CAAC;QACH,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACrC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/audit-log.d.ts
CHANGED
|
@@ -14,8 +14,11 @@ export interface AuditRecord {
|
|
|
14
14
|
ts: string;
|
|
15
15
|
/** What happened. */
|
|
16
16
|
outcome: AuditOutcome;
|
|
17
|
-
/**
|
|
18
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Boundary letter (a-d), "denylist" for legacy denylist hits, or
|
|
19
|
+
* "isolation" for the T1761 cwd-outside-worktree check.
|
|
20
|
+
*/
|
|
21
|
+
boundary: 'a' | 'b' | 'c' | 'd' | 'denylist' | 'isolation';
|
|
19
22
|
/** CLEO error code, when blocked. */
|
|
20
23
|
code: string;
|
|
21
24
|
/** Git subcommand. */
|
package/dist/audit-log.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-log.d.ts","sourceRoot":"","sources":["../src/audit-log.ts"],"names":[],"mappings":"AAoBA;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,oBAAoB,GAAG,4BAA4B,CAAC;AAE3F;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,OAAO,EAAE,YAAY,CAAC;IACtB
|
|
1
|
+
{"version":3,"file":"audit-log.d.ts","sourceRoot":"","sources":["../src/audit-log.ts"],"names":[],"mappings":"AAoBA;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,oBAAoB,GAAG,4BAA4B,CAAC;AAE3F;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,OAAO,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,UAAU,GAAG,WAAW,CAAC;IAC3D,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,4DAA4D;IAC5D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,uCAAuC;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAK5C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAmB1D"}
|
package/dist/audit-log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-log.js","sourceRoot":"","sources":["../src/audit-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"audit-log.js","sourceRoot":"","sources":["../src/audit-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA0C1C;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACpD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnF,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB;IAClD,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;IAC3C,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;IACD,8CAA8C;IAC9C,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mCAAmC,MAAM,CAAC,QAAQ,SAAS,MAAM,CAAC,IAAI,IAAI,CAC3E,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oCAAoC,MAAM,CAAC,QAAQ,QAAQ,MAAM,CAAC,OAAO,IAAI,CAC9E,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/boundary.d.ts
CHANGED
|
@@ -7,9 +7,13 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export interface BoundaryViolation {
|
|
9
9
|
/** CLEO error code (`E_GIT_BOUNDARY_*`). */
|
|
10
|
-
code: 'E_GIT_BOUNDARY_WORKTREE_PATH' | 'E_GIT_BOUNDARY_COMMIT_TASK_ID' | 'E_GIT_BOUNDARY_MERGE_FORBIDDEN' | 'E_GIT_BOUNDARY_CHERRY_PICK_TASK_BRANCH';
|
|
11
|
-
/**
|
|
12
|
-
|
|
10
|
+
code: 'E_GIT_BOUNDARY_WORKTREE_PATH' | 'E_GIT_BOUNDARY_COMMIT_TASK_ID' | 'E_GIT_BOUNDARY_MERGE_FORBIDDEN' | 'E_GIT_BOUNDARY_CHERRY_PICK_TASK_BRANCH' | 'E_GIT_BOUNDARY_CWD_OUTSIDE_WORKTREE';
|
|
11
|
+
/**
|
|
12
|
+
* Which boundary fired — kept in audit log for grouping.
|
|
13
|
+
* Letters a-d are T1591 fence predicates; "isolation" is the T1761
|
|
14
|
+
* cwd-outside-worktree check that fires before all others.
|
|
15
|
+
*/
|
|
16
|
+
boundary: 'a' | 'b' | 'c' | 'd' | 'isolation';
|
|
13
17
|
/** Short human-readable summary of the violation. */
|
|
14
18
|
message: string;
|
|
15
19
|
/** Suggested operator action (always includes the override path). */
|
package/dist/boundary.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundary.d.ts","sourceRoot":"","sources":["../src/boundary.ts"],"names":[],"mappings":"AAuBA;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,IAAI,EACA,8BAA8B,GAC9B,+BAA+B,GAC/B,gCAAgC,GAChC,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"boundary.d.ts","sourceRoot":"","sources":["../src/boundary.ts"],"names":[],"mappings":"AAuBA;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,IAAI,EACA,8BAA8B,GAC9B,+BAA+B,GAC/B,gCAAgC,GAChC,wCAAwC,GACxC,qCAAqC,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,WAAW,CAAC;IAC9C,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAQD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,GACnB,iBAAiB,GAAG,IAAI,CAyB1B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAoB3E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAE3E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,GAC5B,iBAAiB,GAAG,IAAI,CAgC1B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,GAAG,EAAE;IAAE,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAAE,GACvC,iBAAiB,GAAG,IAAI,CAoB1B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,iBAAiB,GAAG,IAAI,CAoB9F"}
|
package/dist/boundary.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundary.js","sourceRoot":"","sources":["../src/boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"boundary.js","sourceRoot":"","sources":["../src/boundary.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @cleocode/git-shim — Harness-agnostic git fence (T1118 + T1591).
|
|
2
|
+
* @cleocode/git-shim — Harness-agnostic git fence (T1118 + T1591 + T1761).
|
|
3
3
|
*
|
|
4
4
|
* Re-exports the denylist + boundary predicates so other packages can inspect
|
|
5
5
|
* the shim's enforcement without executing the binary. The shim binary itself
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* @task T1118
|
|
10
10
|
* @task T1121
|
|
11
11
|
* @task T1591
|
|
12
|
+
* @task T1761
|
|
12
13
|
* @packageDocumentation
|
|
13
14
|
*/
|
|
14
15
|
export type { AuditOutcome, AuditRecord } from './audit-log.js';
|
|
@@ -16,6 +17,7 @@ export { resolveAuditLogPath, writeAuditRecord } from './audit-log.js';
|
|
|
16
17
|
export type { BoundaryViolation } from './boundary.js';
|
|
17
18
|
export { commitHasInlineMessage, extractCommitMessages, validateAddPaths, validateCherryPickSource, validateCommitSubject, validateMergeAllowed, } from './boundary.js';
|
|
18
19
|
export { findDeniedOp, GIT_OP_DENYLIST, RESTRICTED_ROLES } from './denylist.js';
|
|
20
|
+
export { evaluateIsolationBoundary, isCwdInsideWorktree, MUTATION_SUBCOMMANDS, } from './isolation-boundary.js';
|
|
19
21
|
export { extractTaskIdFromWorktreePath, isInsideWorktreesRoot, isPathInsideWorktree, resolveActiveWorktree, resolveCleoWorktreesRoot, resolveProjectWorktreeRoot, } from './worktree-path.js';
|
|
20
22
|
/**
|
|
21
23
|
* Install the shim symlink so that `git` resolves to this shim when
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiC/F"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @cleocode/git-shim — Harness-agnostic git fence (T1118 + T1591).
|
|
2
|
+
* @cleocode/git-shim — Harness-agnostic git fence (T1118 + T1591 + T1761).
|
|
3
3
|
*
|
|
4
4
|
* Re-exports the denylist + boundary predicates so other packages can inspect
|
|
5
5
|
* the shim's enforcement without executing the binary. The shim binary itself
|
|
@@ -9,11 +9,13 @@
|
|
|
9
9
|
* @task T1118
|
|
10
10
|
* @task T1121
|
|
11
11
|
* @task T1591
|
|
12
|
+
* @task T1761
|
|
12
13
|
* @packageDocumentation
|
|
13
14
|
*/
|
|
14
15
|
export { resolveAuditLogPath, writeAuditRecord } from './audit-log.js';
|
|
15
16
|
export { commitHasInlineMessage, extractCommitMessages, validateAddPaths, validateCherryPickSource, validateCommitSubject, validateMergeAllowed, } from './boundary.js';
|
|
16
17
|
export { findDeniedOp, GIT_OP_DENYLIST, RESTRICTED_ROLES } from './denylist.js';
|
|
18
|
+
export { evaluateIsolationBoundary, isCwdInsideWorktree, MUTATION_SUBCOMMANDS, } from './isolation-boundary.js';
|
|
17
19
|
export { extractTaskIdFromWorktreePath, isInsideWorktreesRoot, isPathInsideWorktree, resolveActiveWorktree, resolveCleoWorktreesRoot, resolveProjectWorktreeRoot, } from './worktree-path.js';
|
|
18
20
|
/**
|
|
19
21
|
* Install the shim symlink so that `git` resolves to this shim when
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe,EAAE,WAAmB;IAC3E,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACnF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAE3C,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAEtC,qDAAqD;IACrD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,MAAM,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC,CAAC,kBAAkB;YAC3D,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACnC,wCAAwC;QACxC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9C,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,yCAAyC,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* T1761 isolation boundary check for the git-shim.
|
|
3
|
+
*
|
|
4
|
+
* Provides the "last line of defense" cwd-outside-worktree check that fires
|
|
5
|
+
* BEFORE the T1118 denylist. When a worker agent is injected with
|
|
6
|
+
* `CLEO_WORKTREE_ROOT` (via T1759's `provisionIsolatedShell` preamble) but
|
|
7
|
+
* somehow drifts to the main project root, any mutation subcommand is blocked
|
|
8
|
+
* with exit code 77 and a structured `cwd-outside-worktree` error.
|
|
9
|
+
*
|
|
10
|
+
* Design:
|
|
11
|
+
* - Reads env keys via `ISOLATION_ENV_KEYS` from `@cleocode/contracts` —
|
|
12
|
+
* the single source of truth — so the key names are never duplicated here.
|
|
13
|
+
* - Pure functions: no I/O, no spawning, easy to unit-test.
|
|
14
|
+
* - Only `CLEO_AGENT_ROLE=worker` (exact match) triggers the check — lead /
|
|
15
|
+
* subagent / orchestrator are not subject to this isolation constraint.
|
|
16
|
+
*
|
|
17
|
+
* @task T1761
|
|
18
|
+
* @adr ADR-055
|
|
19
|
+
*/
|
|
20
|
+
import type { BoundaryViolation } from './boundary.js';
|
|
21
|
+
/**
|
|
22
|
+
* Mutation subcommands that write to the git index or create commits.
|
|
23
|
+
*
|
|
24
|
+
* Only these subcommands trigger the isolation boundary check, since
|
|
25
|
+
* read-only commands (log, status, diff, show, …) cannot pollute the main
|
|
26
|
+
* project even when run from the wrong cwd.
|
|
27
|
+
*
|
|
28
|
+
* @task T1761
|
|
29
|
+
*/
|
|
30
|
+
export declare const MUTATION_SUBCOMMANDS: ReadonlySet<string>;
|
|
31
|
+
/**
|
|
32
|
+
* Check whether `cwd` is inside `worktreeRoot`.
|
|
33
|
+
*
|
|
34
|
+
* A path is considered "inside" when it is exactly equal to the root OR
|
|
35
|
+
* starts with the root followed by the POSIX path separator `/`. Both paths
|
|
36
|
+
* are resolved to absolute form first to guard against trailing-slash
|
|
37
|
+
* inconsistencies and symlink quirks.
|
|
38
|
+
*
|
|
39
|
+
* @param cwd - Working directory to test (may be relative — resolved internally).
|
|
40
|
+
* @param worktreeRoot - Expected worktree root (may be relative — resolved internally).
|
|
41
|
+
* @returns true when cwd is the root or a descendant, false otherwise.
|
|
42
|
+
*
|
|
43
|
+
* @task T1761
|
|
44
|
+
*/
|
|
45
|
+
export declare function isCwdInsideWorktree(cwd: string, worktreeRoot: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Evaluate the T1761 isolation boundary for the current git invocation.
|
|
48
|
+
*
|
|
49
|
+
* Fires BEFORE the T1118 denylist — if the agent's cwd is outside its
|
|
50
|
+
* assigned worktree, any mutation is an isolation violation regardless of
|
|
51
|
+
* what specific op is being attempted.
|
|
52
|
+
*
|
|
53
|
+
* Conditions required to trigger (all must be true):
|
|
54
|
+
* 1. `CLEO_AGENT_ROLE=worker` (exact string match — not lead/subagent)
|
|
55
|
+
* 2. `CLEO_WORKTREE_ROOT` is set to a non-empty value
|
|
56
|
+
* 3. The git subcommand is a mutation op (add, commit, rm, mv, …)
|
|
57
|
+
* 4. `process.cwd()` is NOT inside `CLEO_WORKTREE_ROOT`
|
|
58
|
+
*
|
|
59
|
+
* `ISOLATION_ENV_KEYS` from `@cleocode/contracts` is the single source of
|
|
60
|
+
* truth for the env var names — this function never duplicates the key list.
|
|
61
|
+
* Index 0 = `CLEO_WORKTREE_ROOT`, Index 1 = `CLEO_AGENT_ROLE` (enforced by
|
|
62
|
+
* the drift-detection test in isolation-boundary.test.ts).
|
|
63
|
+
*
|
|
64
|
+
* @param subcommand - Git subcommand (argv[0], e.g. "add" or "commit").
|
|
65
|
+
* @returns A {@link BoundaryViolation} when blocked, or `null` when allowed.
|
|
66
|
+
*
|
|
67
|
+
* @task T1761
|
|
68
|
+
*/
|
|
69
|
+
export declare function evaluateIsolationBoundary(subcommand: string): BoundaryViolation | null;
|
|
70
|
+
//# sourceMappingURL=isolation-boundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolation-boundary.d.ts","sourceRoot":"","sources":["../src/isolation-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAQnD,CAAC;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAI9E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CA4BtF"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* T1761 isolation boundary check for the git-shim.
|
|
3
|
+
*
|
|
4
|
+
* Provides the "last line of defense" cwd-outside-worktree check that fires
|
|
5
|
+
* BEFORE the T1118 denylist. When a worker agent is injected with
|
|
6
|
+
* `CLEO_WORKTREE_ROOT` (via T1759's `provisionIsolatedShell` preamble) but
|
|
7
|
+
* somehow drifts to the main project root, any mutation subcommand is blocked
|
|
8
|
+
* with exit code 77 and a structured `cwd-outside-worktree` error.
|
|
9
|
+
*
|
|
10
|
+
* Design:
|
|
11
|
+
* - Reads env keys via `ISOLATION_ENV_KEYS` from `@cleocode/contracts` —
|
|
12
|
+
* the single source of truth — so the key names are never duplicated here.
|
|
13
|
+
* - Pure functions: no I/O, no spawning, easy to unit-test.
|
|
14
|
+
* - Only `CLEO_AGENT_ROLE=worker` (exact match) triggers the check — lead /
|
|
15
|
+
* subagent / orchestrator are not subject to this isolation constraint.
|
|
16
|
+
*
|
|
17
|
+
* @task T1761
|
|
18
|
+
* @adr ADR-055
|
|
19
|
+
*/
|
|
20
|
+
import { resolve } from 'node:path';
|
|
21
|
+
import { ISOLATION_ENV_KEYS } from '@cleocode/contracts';
|
|
22
|
+
/**
|
|
23
|
+
* Mutation subcommands that write to the git index or create commits.
|
|
24
|
+
*
|
|
25
|
+
* Only these subcommands trigger the isolation boundary check, since
|
|
26
|
+
* read-only commands (log, status, diff, show, …) cannot pollute the main
|
|
27
|
+
* project even when run from the wrong cwd.
|
|
28
|
+
*
|
|
29
|
+
* @task T1761
|
|
30
|
+
*/
|
|
31
|
+
export const MUTATION_SUBCOMMANDS = new Set([
|
|
32
|
+
'add',
|
|
33
|
+
'commit',
|
|
34
|
+
'rm',
|
|
35
|
+
'mv',
|
|
36
|
+
'restore',
|
|
37
|
+
'apply',
|
|
38
|
+
'am',
|
|
39
|
+
]);
|
|
40
|
+
/**
|
|
41
|
+
* Check whether `cwd` is inside `worktreeRoot`.
|
|
42
|
+
*
|
|
43
|
+
* A path is considered "inside" when it is exactly equal to the root OR
|
|
44
|
+
* starts with the root followed by the POSIX path separator `/`. Both paths
|
|
45
|
+
* are resolved to absolute form first to guard against trailing-slash
|
|
46
|
+
* inconsistencies and symlink quirks.
|
|
47
|
+
*
|
|
48
|
+
* @param cwd - Working directory to test (may be relative — resolved internally).
|
|
49
|
+
* @param worktreeRoot - Expected worktree root (may be relative — resolved internally).
|
|
50
|
+
* @returns true when cwd is the root or a descendant, false otherwise.
|
|
51
|
+
*
|
|
52
|
+
* @task T1761
|
|
53
|
+
*/
|
|
54
|
+
export function isCwdInsideWorktree(cwd, worktreeRoot) {
|
|
55
|
+
const resolvedCwd = resolve(cwd);
|
|
56
|
+
const resolvedRoot = resolve(worktreeRoot);
|
|
57
|
+
return resolvedCwd === resolvedRoot || resolvedCwd.startsWith(`${resolvedRoot}/`);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Evaluate the T1761 isolation boundary for the current git invocation.
|
|
61
|
+
*
|
|
62
|
+
* Fires BEFORE the T1118 denylist — if the agent's cwd is outside its
|
|
63
|
+
* assigned worktree, any mutation is an isolation violation regardless of
|
|
64
|
+
* what specific op is being attempted.
|
|
65
|
+
*
|
|
66
|
+
* Conditions required to trigger (all must be true):
|
|
67
|
+
* 1. `CLEO_AGENT_ROLE=worker` (exact string match — not lead/subagent)
|
|
68
|
+
* 2. `CLEO_WORKTREE_ROOT` is set to a non-empty value
|
|
69
|
+
* 3. The git subcommand is a mutation op (add, commit, rm, mv, …)
|
|
70
|
+
* 4. `process.cwd()` is NOT inside `CLEO_WORKTREE_ROOT`
|
|
71
|
+
*
|
|
72
|
+
* `ISOLATION_ENV_KEYS` from `@cleocode/contracts` is the single source of
|
|
73
|
+
* truth for the env var names — this function never duplicates the key list.
|
|
74
|
+
* Index 0 = `CLEO_WORKTREE_ROOT`, Index 1 = `CLEO_AGENT_ROLE` (enforced by
|
|
75
|
+
* the drift-detection test in isolation-boundary.test.ts).
|
|
76
|
+
*
|
|
77
|
+
* @param subcommand - Git subcommand (argv[0], e.g. "add" or "commit").
|
|
78
|
+
* @returns A {@link BoundaryViolation} when blocked, or `null` when allowed.
|
|
79
|
+
*
|
|
80
|
+
* @task T1761
|
|
81
|
+
*/
|
|
82
|
+
export function evaluateIsolationBoundary(subcommand) {
|
|
83
|
+
// Only the `worker` role is subject to this isolation check.
|
|
84
|
+
if (process.env[ISOLATION_ENV_KEYS[1]] !== 'worker')
|
|
85
|
+
return null;
|
|
86
|
+
const worktreeRoot = process.env[ISOLATION_ENV_KEYS[0]];
|
|
87
|
+
if (!worktreeRoot)
|
|
88
|
+
return null;
|
|
89
|
+
// Only mutation subcommands can cause cross-worktree writes.
|
|
90
|
+
if (!MUTATION_SUBCOMMANDS.has(subcommand))
|
|
91
|
+
return null;
|
|
92
|
+
const cwd = process.cwd();
|
|
93
|
+
if (isCwdInsideWorktree(cwd, worktreeRoot))
|
|
94
|
+
return null;
|
|
95
|
+
return {
|
|
96
|
+
code: 'E_GIT_BOUNDARY_CWD_OUTSIDE_WORKTREE',
|
|
97
|
+
boundary: 'isolation',
|
|
98
|
+
message: `git ${subcommand} refused — cwd "${cwd}" is outside the assigned worktree ` +
|
|
99
|
+
`"${worktreeRoot}" (CLEO_AGENT_ROLE=worker)`,
|
|
100
|
+
remediation: 'Run all git mutations from inside your assigned worktree. ' +
|
|
101
|
+
'To bypass for an emergency hotfix set CLEO_ALLOW_GIT=1 (audited).',
|
|
102
|
+
context: {
|
|
103
|
+
cwd,
|
|
104
|
+
worktree_root: worktreeRoot,
|
|
105
|
+
role: 'worker',
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=isolation-boundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolation-boundary.js","sourceRoot":"","sources":["../src/isolation-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IAC/D,KAAK;IACL,QAAQ;IACR,IAAI;IACJ,IAAI;IACJ,SAAS;IACT,OAAO;IACP,IAAI;CACL,CAAC,CAAC;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,YAAoB;IACnE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,OAAO,WAAW,KAAK,YAAY,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC;AACpF,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAkB;IAC1D,6DAA6D;IAC7D,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEjE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAE/B,6DAA6D;IAC7D,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,IAAI,mBAAmB,CAAC,GAAG,EAAE,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAExD,OAAO;QACL,IAAI,EAAE,qCAAqC;QAC3C,QAAQ,EAAE,WAAW;QACrB,OAAO,EACL,OAAO,UAAU,mBAAmB,GAAG,qCAAqC;YAC5E,IAAI,YAAY,4BAA4B;QAC9C,WAAW,EACT,4DAA4D;YAC5D,mEAAmE;QACrE,OAAO,EAAE;YACP,GAAG;YACH,aAAa,EAAE,YAAY;YAC3B,IAAI,EAAE,QAAQ;SACf;KACF,CAAC;AACJ,CAAC"}
|
package/dist/shim.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* git-shim — harness-agnostic git fence (T1118 L2 + T1591 boundary fence).
|
|
3
|
+
* git-shim — harness-agnostic git fence (T1118 L2 + T1591 boundary fence + T1761 isolation).
|
|
4
4
|
*
|
|
5
5
|
* Usage: place this binary on PATH BEFORE real git, and export:
|
|
6
6
|
* CLEO_AGENT_ROLE=worker (or lead|subagent)
|
|
@@ -8,6 +8,11 @@
|
|
|
8
8
|
* CLEO_TASK_ID=T<NUM> (optional — auto-detected from worktree path)
|
|
9
9
|
*
|
|
10
10
|
* Layered enforcement (in order, all under restricted-role gate):
|
|
11
|
+
* 0. T1761 isolation fence (FIRST — fires before denylist):
|
|
12
|
+
* When CLEO_AGENT_ROLE=worker AND CLEO_WORKTREE_ROOT is set AND the
|
|
13
|
+
* mutation subcommand (add/commit/rm/…) is invoked, verify that cwd is
|
|
14
|
+
* inside CLEO_WORKTREE_ROOT. Exits 77 with `cwd-outside-worktree` error.
|
|
15
|
+
* Bypass: `CLEO_ALLOW_GIT=1` (audited).
|
|
11
16
|
* 1. T1118 denylist (branch-mutation ops). Bypass: `CLEO_ALLOW_BRANCH_OPS=1`.
|
|
12
17
|
* 2. T1591 boundary fence:
|
|
13
18
|
* (a) git add path inside worktree
|
|
@@ -27,6 +32,7 @@
|
|
|
27
32
|
* @task T1118
|
|
28
33
|
* @task T1121
|
|
29
34
|
* @task T1591
|
|
35
|
+
* @task T1761
|
|
30
36
|
*/
|
|
31
37
|
export {};
|
|
32
38
|
//# sourceMappingURL=shim.d.ts.map
|
package/dist/shim.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shim.d.ts","sourceRoot":"","sources":["../src/shim.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"shim.d.ts","sourceRoot":"","sources":["../src/shim.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG"}
|
package/dist/shim.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* git-shim — harness-agnostic git fence (T1118 L2 + T1591 boundary fence).
|
|
3
|
+
* git-shim — harness-agnostic git fence (T1118 L2 + T1591 boundary fence + T1761 isolation).
|
|
4
4
|
*
|
|
5
5
|
* Usage: place this binary on PATH BEFORE real git, and export:
|
|
6
6
|
* CLEO_AGENT_ROLE=worker (or lead|subagent)
|
|
@@ -8,6 +8,11 @@
|
|
|
8
8
|
* CLEO_TASK_ID=T<NUM> (optional — auto-detected from worktree path)
|
|
9
9
|
*
|
|
10
10
|
* Layered enforcement (in order, all under restricted-role gate):
|
|
11
|
+
* 0. T1761 isolation fence (FIRST — fires before denylist):
|
|
12
|
+
* When CLEO_AGENT_ROLE=worker AND CLEO_WORKTREE_ROOT is set AND the
|
|
13
|
+
* mutation subcommand (add/commit/rm/…) is invoked, verify that cwd is
|
|
14
|
+
* inside CLEO_WORKTREE_ROOT. Exits 77 with `cwd-outside-worktree` error.
|
|
15
|
+
* Bypass: `CLEO_ALLOW_GIT=1` (audited).
|
|
11
16
|
* 1. T1118 denylist (branch-mutation ops). Bypass: `CLEO_ALLOW_BRANCH_OPS=1`.
|
|
12
17
|
* 2. T1591 boundary fence:
|
|
13
18
|
* (a) git add path inside worktree
|
|
@@ -27,6 +32,7 @@
|
|
|
27
32
|
* @task T1118
|
|
28
33
|
* @task T1121
|
|
29
34
|
* @task T1591
|
|
35
|
+
* @task T1761
|
|
30
36
|
*/
|
|
31
37
|
import { spawnSync } from 'node:child_process';
|
|
32
38
|
import { existsSync } from 'node:fs';
|
|
@@ -34,6 +40,7 @@ import { join } from 'node:path';
|
|
|
34
40
|
import { writeAuditRecord } from './audit-log.js';
|
|
35
41
|
import { validateAddPaths, validateCherryPickSource, validateCommitSubject, validateMergeAllowed, } from './boundary.js';
|
|
36
42
|
import { findDeniedOp, RESTRICTED_ROLES } from './denylist.js';
|
|
43
|
+
import { evaluateIsolationBoundary } from './isolation-boundary.js';
|
|
37
44
|
import { resolveActiveWorktree } from './worktree-path.js';
|
|
38
45
|
/** Sentinel exit code for a shim-blocked git operation. */
|
|
39
46
|
const BLOCKED_EXIT_CODE = 77;
|
|
@@ -153,7 +160,7 @@ function evaluateBoundaries(subcommand, args) {
|
|
|
153
160
|
* Build a structured audit record for the current invocation.
|
|
154
161
|
*
|
|
155
162
|
* @param outcome - "blocked" | "bypassed-allow-git" | "bypassed-orchestrate-merge".
|
|
156
|
-
* @param boundary - Which boundary fired (a-d, or
|
|
163
|
+
* @param boundary - Which boundary fired (a-d, denylist, or isolation).
|
|
157
164
|
* @param code - CLEO error code.
|
|
158
165
|
* @param subcommand - Git subcommand.
|
|
159
166
|
* @param args - Argv tail.
|
|
@@ -180,8 +187,8 @@ function buildAuditRecord(outcome, boundary, code, subcommand, args, context) {
|
|
|
180
187
|
/**
|
|
181
188
|
* Main shim entry point.
|
|
182
189
|
*
|
|
183
|
-
* Reads argv, env, applies the denylist +
|
|
184
|
-
* blocks or passes through to the real git binary.
|
|
190
|
+
* Reads argv, env, applies the isolation fence + denylist + boundary fence,
|
|
191
|
+
* and either blocks or passes through to the real git binary.
|
|
185
192
|
*/
|
|
186
193
|
function main() {
|
|
187
194
|
const argv = process.argv.slice(2);
|
|
@@ -213,6 +220,26 @@ function main() {
|
|
|
213
220
|
const allowBranchOps = process.env['CLEO_ALLOW_BRANCH_OPS'] === '1';
|
|
214
221
|
const allowGit = process.env['CLEO_ALLOW_GIT'] === '1';
|
|
215
222
|
// ---------------------------------------------------------------------------
|
|
223
|
+
// Layer 0 — T1761 isolation fence (cwd-outside-worktree, BEFORE denylist).
|
|
224
|
+
//
|
|
225
|
+
// This is the "last line of defense" — even if T1759's structural preamble
|
|
226
|
+
// and T1758's prompt hardening both fail, a worker agent that has been
|
|
227
|
+
// injected with CLEO_WORKTREE_ROOT but somehow drifted to the main project
|
|
228
|
+
// root is caught here before it can mutate the primary repository.
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
const isolationViolation = evaluateIsolationBoundary(subcommand);
|
|
231
|
+
if (isolationViolation && !allowGit) {
|
|
232
|
+
emitBoundaryViolation(isolationViolation, subcommand);
|
|
233
|
+
writeAuditRecord(buildAuditRecord('blocked', 'isolation', isolationViolation.code, subcommand, remainingArgs, isolationViolation.context));
|
|
234
|
+
process.exit(BLOCKED_EXIT_CODE);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (isolationViolation && allowGit) {
|
|
238
|
+
process.stderr.write(`[git-shim] WARNING: CLEO_ALLOW_GIT=1 bypassed isolation boundary ` +
|
|
239
|
+
`(${isolationViolation.code}) for 'git ${subcommand}' (role=${role}). This bypass is audited.\n`);
|
|
240
|
+
writeAuditRecord(buildAuditRecord('bypassed-allow-git', 'isolation', isolationViolation.code, subcommand, remainingArgs, isolationViolation.context));
|
|
241
|
+
}
|
|
242
|
+
// ---------------------------------------------------------------------------
|
|
216
243
|
// Layer 1 — T1118 denylist (branch-mutation ops).
|
|
217
244
|
// ---------------------------------------------------------------------------
|
|
218
245
|
const denied = findDeniedOp(subcommand, remainingArgs);
|
package/dist/shim.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shim.js","sourceRoot":"","sources":["../src/shim.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"shim.js","sourceRoot":"","sources":["../src/shim.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cleocode/git-shim",
|
|
3
|
-
"version": "2026.5.
|
|
3
|
+
"version": "2026.5.17",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Harness-agnostic git shim for CLEO agent branch-protection (T1118)",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"author": "CLEO Code <hello@cleocode.dev>",
|
|
33
33
|
"license": "MIT",
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@cleocode/contracts": "2026.5.
|
|
35
|
+
"@cleocode/contracts": "2026.5.17"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/node": "^24.3.0",
|