@cleocode/git-shim 2026.9.20 → 2026.9.21
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__/launcher.test.d.ts +9 -0
- package/dist/__tests__/launcher.test.d.ts.map +1 -0
- package/dist/__tests__/launcher.test.js +72 -0
- package/dist/__tests__/launcher.test.js.map +1 -0
- package/dist/audit-log.js +1 -1
- package/dist/index.d.ts +9 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -32
- package/dist/index.js.map +1 -1
- package/dist/launcher.d.ts +39 -0
- package/dist/launcher.d.ts.map +1 -0
- package/dist/launcher.js +85 -0
- package/dist/launcher.js.map +1 -0
- package/dist/shim.js +11 -4
- package/dist/shim.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* T12605 — `git` must resolve to the shim on Windows.
|
|
3
|
+
*
|
|
4
|
+
* The shim was installed only as an extensionless `git` symlink. PATHEXT
|
|
5
|
+
* never matches an extensionless file and unprivileged Windows cannot create
|
|
6
|
+
* file symlinks, so branch protection was silently absent there.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=launcher.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/launcher.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* T12605 — `git` must resolve to the shim on Windows.
|
|
3
|
+
*
|
|
4
|
+
* The shim was installed only as an extensionless `git` symlink. PATHEXT
|
|
5
|
+
* never matches an extensionless file and unprivileged Windows cannot create
|
|
6
|
+
* file symlinks, so branch protection was silently absent there.
|
|
7
|
+
*/
|
|
8
|
+
import { chmodSync, lstatSync, mkdtempSync, readFileSync, readlinkSync, rmSync, statSync, writeFileSync, } from 'node:fs';
|
|
9
|
+
import { tmpdir } from 'node:os';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { findOnPath } from '@cleocode/paths';
|
|
12
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
13
|
+
import { installGitShimLaunchers } from '../launcher.js';
|
|
14
|
+
let dir;
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
if (dir)
|
|
17
|
+
rmSync(dir, { recursive: true, force: true });
|
|
18
|
+
dir = undefined;
|
|
19
|
+
});
|
|
20
|
+
function setup() {
|
|
21
|
+
dir = mkdtempSync(join(tmpdir(), 'git-shim-launcher-'));
|
|
22
|
+
const shimBin = join(dir, 'shim.js');
|
|
23
|
+
writeFileSync(shimBin, '#!/usr/bin/env node\n');
|
|
24
|
+
return { shimDir: join(dir, 'bin'), shimBin };
|
|
25
|
+
}
|
|
26
|
+
describe('installGitShimLaunchers', () => {
|
|
27
|
+
it('win32: writes git.cmd (cmd/pwsh) and an sh launcher (Git Bash), no symlink', () => {
|
|
28
|
+
const { shimDir, shimBin } = setup();
|
|
29
|
+
const node = 'C:\\Program Files\\nodejs\\node.exe';
|
|
30
|
+
const written = installGitShimLaunchers(shimDir, shimBin, {
|
|
31
|
+
platform: 'win32',
|
|
32
|
+
nodePath: node,
|
|
33
|
+
});
|
|
34
|
+
expect(written).toHaveLength(2);
|
|
35
|
+
const cmd = readFileSync(join(shimDir, 'git.cmd'), 'utf-8');
|
|
36
|
+
expect(cmd).toBe(`@"${node}" "${shimBin}" %*\r\n`);
|
|
37
|
+
const sh = readFileSync(join(shimDir, 'git'), 'utf-8');
|
|
38
|
+
expect(sh).toContain('exec "C:/Program Files/nodejs/node.exe"');
|
|
39
|
+
expect(lstatSync(join(shimDir, 'git')).isSymbolicLink()).toBe(false);
|
|
40
|
+
// A Windows PATH lookup for `git` with the shim dir first lands on git.cmd.
|
|
41
|
+
const resolved = findOnPath('git', {
|
|
42
|
+
platform: 'win32',
|
|
43
|
+
env: { Path: `${shimDir};C:\\Program Files\\Git\\cmd`, PATHEXT: '.COM;.EXE;.BAT;.CMD' },
|
|
44
|
+
isExecutable: (p) => p === join(shimDir, 'git.cmd').replace(/\//g, '\\'),
|
|
45
|
+
});
|
|
46
|
+
expect(resolved?.toLowerCase().endsWith('git.cmd')).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
it('win32: replaces a stale symlink and is idempotent', () => {
|
|
49
|
+
const { shimDir, shimBin } = setup();
|
|
50
|
+
installGitShimLaunchers(shimDir, shimBin, { platform: 'linux' });
|
|
51
|
+
expect(lstatSync(join(shimDir, 'git')).isSymbolicLink()).toBe(true);
|
|
52
|
+
installGitShimLaunchers(shimDir, shimBin, { platform: 'win32', nodePath: 'node' });
|
|
53
|
+
installGitShimLaunchers(shimDir, shimBin, { platform: 'win32', nodePath: 'node' });
|
|
54
|
+
expect(lstatSync(join(shimDir, 'git')).isSymbolicLink()).toBe(false);
|
|
55
|
+
});
|
|
56
|
+
it('POSIX: keeps the symlink to the shim binary', () => {
|
|
57
|
+
const { shimDir, shimBin } = setup();
|
|
58
|
+
installGitShimLaunchers(shimDir, shimBin, { platform: 'darwin' });
|
|
59
|
+
expect(readlinkSync(join(shimDir, 'git'))).toBe(shimBin);
|
|
60
|
+
expect(lstatSync(shimBin).mode & 0o111).not.toBe(0);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('installGitShimLaunchers chmod (T12605)', () => {
|
|
64
|
+
it('POSIX: leaves the shim binary mode alone when the link is already correct', () => {
|
|
65
|
+
const { shimDir, shimBin } = setup();
|
|
66
|
+
installGitShimLaunchers(shimDir, shimBin, { platform: 'linux' });
|
|
67
|
+
chmodSync(shimBin, 0o555);
|
|
68
|
+
installGitShimLaunchers(shimDir, shimBin, { platform: 'linux' });
|
|
69
|
+
expect(statSync(shimBin).mode & 0o777).toBe(0o555);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=launcher.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.test.js","sourceRoot":"","sources":["../../src/__tests__/launcher.test.ts"],"names":[],"mappings":"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"}
|
package/dist/audit-log.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Every block (refusal) and every bypass (`CLEO_ALLOW_GIT=1`) is recorded as
|
|
5
5
|
* one JSON line at:
|
|
6
6
|
*
|
|
7
|
-
* `<
|
|
7
|
+
* `<getCleoHome()>/audit/git-shim.jsonl`
|
|
8
8
|
*
|
|
9
9
|
* Tests override the path via `CLEO_AUDIT_LOG_PATH`.
|
|
10
10
|
*
|
package/dist/index.d.ts
CHANGED
|
@@ -19,17 +19,21 @@ export type { BoundaryViolation } from './boundary.js';
|
|
|
19
19
|
export { commitHasInlineMessage, extractCommitMessages, validateAddPaths, validateCherryPickSource, validateCommitSubject, validateMergeAllowed, } from './boundary.js';
|
|
20
20
|
export { findDeniedOp, GIT_OP_DENYLIST, RESTRICTED_ROLES } from './denylist.js';
|
|
21
21
|
export { enforceAbsolutePathBoundary, evaluateIsolationBoundary, isCwdInsideWorktree, MUTATION_SUBCOMMANDS, } from './isolation-boundary.js';
|
|
22
|
+
export { type GitShimLauncherOptions, installGitShimLaunchers } from './launcher.js';
|
|
22
23
|
export { extractTaskIdFromWorktreePath, isInsideWorktreesRoot, isPathInsideWorktree, resolveActiveWorktree, resolveCleoWorktreesRoot, resolveProjectWorktreeRoot, } from './worktree-path.js';
|
|
23
24
|
/**
|
|
24
|
-
* Install the shim
|
|
25
|
+
* Install the shim launcher so that `git` resolves to this shim when
|
|
25
26
|
* the shim directory is on PATH.
|
|
26
27
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
28
|
+
* POSIX: `<shimDir>/git` is a symlink to the shim binary. Windows: `git.cmd`
|
|
29
|
+
* plus an extensionless sh launcher, since PATHEXT ignores extensionless
|
|
30
|
+
* files and file symlinks need privileges (T12605). See
|
|
31
|
+
* {@link installGitShimLaunchers}.
|
|
29
32
|
*
|
|
30
|
-
* @param shimDir - Directory to place the `git`
|
|
33
|
+
* @param shimDir - Directory to place the `git` launcher in.
|
|
31
34
|
* @param shimBinPath - Absolute path to the compiled shim binary (dist/shim.js).
|
|
32
|
-
* @returns
|
|
35
|
+
* @returns `true` once the launcher is in place.
|
|
36
|
+
* @throws When the launcher cannot be installed.
|
|
33
37
|
* @task T1118
|
|
34
38
|
* @task T1121
|
|
35
39
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;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,2BAA2B,EAC3B,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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;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,2BAA2B,EAC3B,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAS/F"}
|
package/dist/index.js
CHANGED
|
@@ -17,53 +17,33 @@ export { resolveAuditLogPath, writeAuditRecord } from './audit-log.js';
|
|
|
17
17
|
export { commitHasInlineMessage, extractCommitMessages, validateAddPaths, validateCherryPickSource, validateCommitSubject, validateMergeAllowed, } from './boundary.js';
|
|
18
18
|
export { findDeniedOp, GIT_OP_DENYLIST, RESTRICTED_ROLES } from './denylist.js';
|
|
19
19
|
export { enforceAbsolutePathBoundary, evaluateIsolationBoundary, isCwdInsideWorktree, MUTATION_SUBCOMMANDS, } from './isolation-boundary.js';
|
|
20
|
+
export { installGitShimLaunchers } from './launcher.js';
|
|
20
21
|
export { extractTaskIdFromWorktreePath, isInsideWorktreesRoot, isPathInsideWorktree, resolveActiveWorktree, resolveCleoWorktreesRoot, resolveProjectWorktreeRoot, } from './worktree-path.js';
|
|
21
22
|
/**
|
|
22
|
-
* Install the shim
|
|
23
|
+
* Install the shim launcher so that `git` resolves to this shim when
|
|
23
24
|
* the shim directory is on PATH.
|
|
24
25
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
26
|
+
* POSIX: `<shimDir>/git` is a symlink to the shim binary. Windows: `git.cmd`
|
|
27
|
+
* plus an extensionless sh launcher, since PATHEXT ignores extensionless
|
|
28
|
+
* files and file symlinks need privileges (T12605). See
|
|
29
|
+
* {@link installGitShimLaunchers}.
|
|
27
30
|
*
|
|
28
|
-
* @param shimDir - Directory to place the `git`
|
|
31
|
+
* @param shimDir - Directory to place the `git` launcher in.
|
|
29
32
|
* @param shimBinPath - Absolute path to the compiled shim binary (dist/shim.js).
|
|
30
|
-
* @returns
|
|
33
|
+
* @returns `true` once the launcher is in place.
|
|
34
|
+
* @throws When the launcher cannot be installed.
|
|
31
35
|
* @task T1118
|
|
32
36
|
* @task T1121
|
|
33
37
|
*/
|
|
34
38
|
export async function installShimSymlink(shimDir, shimBinPath) {
|
|
35
|
-
const {
|
|
36
|
-
const { join } = await import('node:path');
|
|
37
|
-
mkdirSync(shimDir, { recursive: true });
|
|
38
|
-
const linkPath = join(shimDir, 'git');
|
|
39
|
-
// Remove stale symlink if it points somewhere wrong.
|
|
40
|
-
if (existsSync(linkPath)) {
|
|
41
|
-
try {
|
|
42
|
-
const { readlinkSync } = await import('node:fs');
|
|
43
|
-
const target = readlinkSync(linkPath);
|
|
44
|
-
if (target === shimBinPath)
|
|
45
|
-
return true; // already correct
|
|
46
|
-
unlinkSync(linkPath);
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
try {
|
|
50
|
-
unlinkSync(linkPath);
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
// ignore
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
39
|
+
const { installGitShimLaunchers } = await import('./launcher.js');
|
|
57
40
|
try {
|
|
58
|
-
|
|
59
|
-
// Ensure the shim binary is executable.
|
|
60
|
-
const { chmodSync } = await import('node:fs');
|
|
61
|
-
chmodSync(shimBinPath, 0o755);
|
|
41
|
+
installGitShimLaunchers(shimDir, shimBinPath);
|
|
62
42
|
return true;
|
|
63
43
|
}
|
|
64
44
|
catch (err) {
|
|
65
45
|
const message = err instanceof Error ? err.message : String(err);
|
|
66
|
-
throw new Error(`Failed to install git shim
|
|
46
|
+
throw new Error(`Failed to install git shim launcher in ${shimDir}: ${message}`);
|
|
67
47
|
}
|
|
68
48
|
}
|
|
69
49
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;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,2BAA2B,EAC3B,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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;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,2BAA2B,EAC3B,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAA+B,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe,EAAE,WAAmB;IAC3E,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAClE,IAAI,CAAC;QACH,uBAAuB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC9C,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,0CAA0C,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install the `git` launcher(s) that route a shim-dir PATH lookup to the shim.
|
|
3
|
+
*
|
|
4
|
+
* POSIX resolves `<shimDir>/git` through a symlink to `dist/shim.js`, whose
|
|
5
|
+
* shebang runs Node. Windows can do neither: `PATHEXT` never matches an
|
|
6
|
+
* extensionless file, and an unprivileged process cannot create a file
|
|
7
|
+
* symlink. There the launchers are real files — `git.cmd` for cmd.exe and
|
|
8
|
+
* PowerShell, plus an extensionless `/bin/sh` script for Git Bash/MSYS, which
|
|
9
|
+
* searches PATH for the bare name. Without them branch protection is silently
|
|
10
|
+
* absent on Windows (T12605).
|
|
11
|
+
*
|
|
12
|
+
* @task T12605
|
|
13
|
+
*/
|
|
14
|
+
/** Options for {@link installGitShimLaunchers}. */
|
|
15
|
+
export interface GitShimLauncherOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Platform whose launcher form to install. Only the launcher FORM follows
|
|
18
|
+
* this; files are written with the host path module.
|
|
19
|
+
* @defaultValue `process.platform`
|
|
20
|
+
*/
|
|
21
|
+
platform?: NodeJS.Platform;
|
|
22
|
+
/** Node executable the win32 launchers invoke. @defaultValue `process.execPath` */
|
|
23
|
+
nodePath?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Install the launcher files for `git` in `shimDir`. Idempotent.
|
|
27
|
+
*
|
|
28
|
+
* @param shimDir - Directory prepended to the worker's PATH.
|
|
29
|
+
* @param shimBinPath - Absolute path to the shim entry point (`dist/shim.js`).
|
|
30
|
+
* @param opts - Platform and Node-path overrides.
|
|
31
|
+
* @returns Absolute paths of the launchers now present.
|
|
32
|
+
* @throws When a launcher cannot be written.
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* installGitShimLaunchers('/repo/.cleo/bin/git-shim', '/repo/node_modules/@cleocode/git-shim/dist/shim.js');
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare function installGitShimLaunchers(shimDir: string, shimBinPath: string, opts?: GitShimLauncherOptions): string[];
|
|
39
|
+
//# sourceMappingURL=launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAcH,mDAAmD;AACnD,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,sBAA2B,GAChC,MAAM,EAAE,CA0BV"}
|
package/dist/launcher.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install the `git` launcher(s) that route a shim-dir PATH lookup to the shim.
|
|
3
|
+
*
|
|
4
|
+
* POSIX resolves `<shimDir>/git` through a symlink to `dist/shim.js`, whose
|
|
5
|
+
* shebang runs Node. Windows can do neither: `PATHEXT` never matches an
|
|
6
|
+
* extensionless file, and an unprivileged process cannot create a file
|
|
7
|
+
* symlink. There the launchers are real files — `git.cmd` for cmd.exe and
|
|
8
|
+
* PowerShell, plus an extensionless `/bin/sh` script for Git Bash/MSYS, which
|
|
9
|
+
* searches PATH for the bare name. Without them branch protection is silently
|
|
10
|
+
* absent on Windows (T12605).
|
|
11
|
+
*
|
|
12
|
+
* @task T12605
|
|
13
|
+
*/
|
|
14
|
+
import { chmodSync, lstatSync, mkdirSync, readFileSync, readlinkSync, symlinkSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
/**
|
|
17
|
+
* Install the launcher files for `git` in `shimDir`. Idempotent.
|
|
18
|
+
*
|
|
19
|
+
* @param shimDir - Directory prepended to the worker's PATH.
|
|
20
|
+
* @param shimBinPath - Absolute path to the shim entry point (`dist/shim.js`).
|
|
21
|
+
* @param opts - Platform and Node-path overrides.
|
|
22
|
+
* @returns Absolute paths of the launchers now present.
|
|
23
|
+
* @throws When a launcher cannot be written.
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* installGitShimLaunchers('/repo/.cleo/bin/git-shim', '/repo/node_modules/@cleocode/git-shim/dist/shim.js');
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export function installGitShimLaunchers(shimDir, shimBinPath, opts = {}) {
|
|
30
|
+
const platform = opts.platform ?? process.platform;
|
|
31
|
+
mkdirSync(shimDir, { recursive: true });
|
|
32
|
+
if (platform !== 'win32') {
|
|
33
|
+
const linkPath = join(shimDir, 'git');
|
|
34
|
+
if (!isSymlinkTo(linkPath, shimBinPath)) {
|
|
35
|
+
removeIfPresent(linkPath);
|
|
36
|
+
symlinkSync(shimBinPath, linkPath);
|
|
37
|
+
// Only on create/replace: an existing correct link needs no write to
|
|
38
|
+
// the (possibly package-owned, read-only) shim binary.
|
|
39
|
+
chmodSync(shimBinPath, 0o755);
|
|
40
|
+
}
|
|
41
|
+
return [linkPath];
|
|
42
|
+
}
|
|
43
|
+
const node = opts.nodePath ?? process.execPath;
|
|
44
|
+
const cmdPath = join(shimDir, 'git.cmd');
|
|
45
|
+
const shPath = join(shimDir, 'git');
|
|
46
|
+
// `%*` forwards every argument; the launcher's exit code is Node's.
|
|
47
|
+
writeIfChanged(cmdPath, `@"${node}" "${shimBinPath}" %*\r\n`);
|
|
48
|
+
// Git Bash accepts forward-slash Windows paths; a symlink here would need
|
|
49
|
+
// privileges, so the sh launcher replaces any stale one.
|
|
50
|
+
const toSh = (p) => p.replace(/\\/g, '/');
|
|
51
|
+
writeIfChanged(shPath, `#!/bin/sh\nexec "${toSh(node)}" "${toSh(shimBinPath)}" "$@"\n`);
|
|
52
|
+
return [cmdPath, shPath];
|
|
53
|
+
}
|
|
54
|
+
/** Whether `linkPath` is a symlink whose target is exactly `target`. */
|
|
55
|
+
function isSymlinkTo(linkPath, target) {
|
|
56
|
+
try {
|
|
57
|
+
return lstatSync(linkPath).isSymbolicLink() && readlinkSync(linkPath) === target;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Remove a file or (dangling) symlink when one exists. */
|
|
64
|
+
function removeIfPresent(path) {
|
|
65
|
+
try {
|
|
66
|
+
lstatSync(path);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
unlinkSync(path);
|
|
72
|
+
}
|
|
73
|
+
/** Write `content`, replacing a symlink or differing file; skip identical content. */
|
|
74
|
+
function writeIfChanged(path, content) {
|
|
75
|
+
try {
|
|
76
|
+
if (!lstatSync(path).isSymbolicLink() && readFileSync(path, 'utf-8') === content)
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// absent or unreadable — (re)write below
|
|
81
|
+
}
|
|
82
|
+
removeIfPresent(path);
|
|
83
|
+
writeFileSync(path, content, { encoding: 'utf-8', mode: 0o755 });
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAcjC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAe,EACf,WAAmB,EACnB,OAA+B,EAAE;IAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACnD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;YACxC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC1B,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACnC,qEAAqE;YACrE,uDAAuD;YACvD,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACpC,oEAAoE;IACpE,cAAc,CAAC,OAAO,EAAE,KAAK,IAAI,MAAM,WAAW,UAAU,CAAC,CAAC;IAC9D,0EAA0E;IAC1E,yDAAyD;IACzD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1D,cAAc,CAAC,MAAM,EAAE,oBAAoB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACxF,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,wEAAwE;AACxE,SAAS,WAAW,CAAC,QAAgB,EAAE,MAAc;IACnD,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,sFAAsF;AACtF,SAAS,cAAc,CAAC,IAAY,EAAE,OAAe;IACnD,IAAI,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,IAAI,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,OAAO;YAAE,OAAO;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;IACD,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACnE,CAAC"}
|
package/dist/shim.js
CHANGED
|
@@ -36,8 +36,9 @@
|
|
|
36
36
|
*/
|
|
37
37
|
import { spawnSync } from 'node:child_process';
|
|
38
38
|
import { accessSync, constants, realpathSync, statSync } from 'node:fs';
|
|
39
|
-
import {
|
|
39
|
+
import { join } from 'node:path';
|
|
40
40
|
import { fileURLToPath } from 'node:url';
|
|
41
|
+
import { pathEnvKey, splitPathEnv } from '@cleocode/paths';
|
|
41
42
|
import { writeAuditRecord } from './audit-log.js';
|
|
42
43
|
import { validateAddPaths, validateCherryPickSource, validateCommitSubject, validateMergeAllowed, } from './boundary.js';
|
|
43
44
|
import { findDeniedOp, RESTRICTED_ROLES } from './denylist.js';
|
|
@@ -119,13 +120,19 @@ function resolveRealGit() {
|
|
|
119
120
|
process.stderr.write('[git-shim] ERROR: CLEO_REAL_GIT_PATH must name an executable outside the shim delegation chain\n');
|
|
120
121
|
return candidate;
|
|
121
122
|
}
|
|
122
|
-
const
|
|
123
|
+
const onWindows = process.platform === 'win32';
|
|
124
|
+
const pathDirs = splitPathEnv(process.env[pathEnvKey()]);
|
|
125
|
+
// Real Git for Windows is `git.exe`. The shim's own `git.cmd`/sh launchers
|
|
126
|
+
// (T12605) sit earlier on PATH and must never be taken for real git.
|
|
127
|
+
const gitName = onWindows ? 'git.exe' : 'git';
|
|
123
128
|
for (const dir of pathDirs) {
|
|
124
|
-
const candidate = candidatePath(join(dir,
|
|
129
|
+
const candidate = candidatePath(join(dir, gitName));
|
|
125
130
|
if (candidate)
|
|
126
131
|
return candidate;
|
|
127
132
|
}
|
|
128
|
-
const fallbacks =
|
|
133
|
+
const fallbacks = onWindows
|
|
134
|
+
? ['C:\\Program Files\\Git\\cmd\\git.exe']
|
|
135
|
+
: ['/usr/bin/git', '/usr/local/bin/git', '/opt/homebrew/bin/git'];
|
|
129
136
|
for (const fb of fallbacks) {
|
|
130
137
|
const candidate = candidatePath(fb);
|
|
131
138
|
if (candidate)
|
package/dist/shim.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shim.js","sourceRoot":"","sources":["../src/shim.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,
|
|
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.9.
|
|
3
|
+
"version": "2026.9.21",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Harness-agnostic git shim for CLEO agent branch-protection (T1118)",
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
"author": "CLEO Code <hello@cleocode.dev>",
|
|
33
33
|
"license": "MIT",
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@cleocode/contracts": "2026.9.
|
|
36
|
-
"@cleocode/paths": "2026.9.
|
|
35
|
+
"@cleocode/contracts": "2026.9.21",
|
|
36
|
+
"@cleocode/paths": "2026.9.21"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/node": "^24.3.0",
|