@mnemonik/shared 7.97.1 → 7.98.0
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/ambientPointer.d.ts.map +1 -1
- package/dist/ambientPointer.js +2 -1
- package/dist/ambientPointer.js.map +1 -1
- package/dist/apiOrigin.d.ts +3 -0
- package/dist/apiOrigin.d.ts.map +1 -0
- package/dist/apiOrigin.js +5 -0
- package/dist/apiOrigin.js.map +1 -0
- package/dist/ast/astChunker.d.ts +12 -12
- package/dist/ast/astChunker.js +32 -32
- package/dist/ast/grammars.d.ts +9 -9
- package/dist/ast/grammars.js +15 -15
- package/dist/codeScanner.d.ts +56 -43
- package/dist/codeScanner.d.ts.map +1 -1
- package/dist/codeScanner.js +262 -143
- package/dist/codeScanner.js.map +1 -1
- package/dist/contextBudget.js +2 -2
- package/dist/contextBudget.js.map +1 -1
- package/dist/gitEditDetector.d.ts +6 -6
- package/dist/gitEditDetector.js +7 -7
- package/dist/hookRuntime.d.ts +35 -2
- package/dist/hookRuntime.d.ts.map +1 -1
- package/dist/hookRuntime.js +127 -33
- package/dist/hookRuntime.js.map +1 -1
- package/dist/hookTimeouts.d.ts +6 -6
- package/dist/hookTimeouts.js +6 -6
- package/dist/hostAdapter.d.ts +135 -0
- package/dist/hostAdapter.d.ts.map +1 -0
- package/dist/hostAdapter.js +323 -0
- package/dist/hostAdapter.js.map +1 -0
- package/dist/hostBinary.d.ts +29 -0
- package/dist/hostBinary.d.ts.map +1 -0
- package/dist/hostBinary.js +179 -0
- package/dist/hostBinary.js.map +1 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +26 -26
- package/dist/instructions.js +26 -26
- package/dist/jitDeliveryAck.d.ts.map +1 -1
- package/dist/jitDeliveryAck.js +2 -0
- package/dist/jitDeliveryAck.js.map +1 -1
- package/dist/projectIdentityFile.d.ts +25 -0
- package/dist/projectIdentityFile.d.ts.map +1 -0
- package/dist/projectIdentityFile.js +87 -0
- package/dist/projectIdentityFile.js.map +1 -0
- package/dist/projectSetupHandoff.d.ts +24 -0
- package/dist/projectSetupHandoff.d.ts.map +1 -0
- package/dist/projectSetupHandoff.js +249 -0
- package/dist/projectSetupHandoff.js.map +1 -0
- package/dist/protectedPaths.d.ts +9 -0
- package/dist/protectedPaths.d.ts.map +1 -0
- package/dist/protectedPaths.js +66 -0
- package/dist/protectedPaths.js.map +1 -0
- package/dist/readiness.d.ts +143 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +304 -0
- package/dist/readiness.js.map +1 -0
- package/dist/repositoryFingerprint.d.ts +50 -0
- package/dist/repositoryFingerprint.d.ts.map +1 -0
- package/dist/repositoryFingerprint.js +160 -0
- package/dist/repositoryFingerprint.js.map +1 -0
- package/dist/repositoryRoot.d.ts +56 -0
- package/dist/repositoryRoot.d.ts.map +1 -0
- package/dist/repositoryRoot.js +226 -0
- package/dist/repositoryRoot.js.map +1 -0
- package/dist/runtimeReader.d.ts +102 -0
- package/dist/runtimeReader.d.ts.map +1 -0
- package/dist/runtimeReader.js +408 -0
- package/dist/runtimeReader.js.map +1 -0
- package/dist/runtimeSigners.d.ts +37 -0
- package/dist/runtimeSigners.d.ts.map +1 -0
- package/dist/runtimeSigners.js +507 -0
- package/dist/runtimeSigners.js.map +1 -0
- package/dist/scannerSupervisor.d.ts +35 -0
- package/dist/scannerSupervisor.d.ts.map +1 -0
- package/dist/scannerSupervisor.js +2 -0
- package/dist/scannerSupervisor.js.map +1 -0
- package/dist/secretPatterns.d.ts +9 -9
- package/dist/secretPatterns.d.ts.map +1 -1
- package/dist/secretPatterns.js +27 -25
- package/dist/secretPatterns.js.map +1 -1
- package/dist/testing/hostAdapterConformance.d.ts +17 -0
- package/dist/testing/hostAdapterConformance.d.ts.map +1 -0
- package/dist/testing/hostAdapterConformance.js +477 -0
- package/dist/testing/hostAdapterConformance.js.map +1 -0
- package/dist/usageGuide.d.ts +1 -1
- package/dist/usageGuide.d.ts.map +1 -1
- package/dist/usageGuide.js +4 -4
- package/package.json +7 -2
- package/queries/bash.tags.scm +1 -1
- package/queries/groovy.tags.scm +1 -1
- package/scripts/vendor-grammars.ts +13 -13
- package/src/ambientPointer.ts +2 -1
- package/src/apiOrigin.ts +4 -0
- package/src/ast/astChunker.ts +39 -39
- package/src/ast/grammars.ts +16 -16
- package/src/codeScanner.ts +274 -149
- package/src/contextBudget.ts +2 -2
- package/src/gitEditDetector.ts +7 -7
- package/src/hookRuntime.ts +162 -34
- package/src/hookTimeouts.ts +6 -6
- package/src/hostAdapter.ts +468 -0
- package/src/hostBinary.ts +205 -0
- package/src/index.ts +20 -0
- package/src/instructions.ts +26 -26
- package/src/jitDeliveryAck.ts +2 -0
- package/src/projectIdentityFile.ts +100 -0
- package/src/projectSetupHandoff.ts +275 -0
- package/src/protectedPaths.ts +88 -0
- package/src/readiness.ts +516 -0
- package/src/repositoryFingerprint.ts +199 -0
- package/src/repositoryRoot.ts +261 -0
- package/src/runtimeReader.ts +495 -0
- package/src/runtimeSigners.ts +577 -0
- package/src/scannerSupervisor.ts +26 -0
- package/src/secretPatterns.ts +27 -25
- package/src/testing/hostAdapterConformance.ts +538 -0
- package/src/usageGuide.ts +4 -4
- package/test-fixtures/identity/runner.d.mts +12 -0
- package/test-fixtures/identity/runner.mjs +282 -0
- package/tests/fixtures/repository-fingerprint-v1.golden.json +834 -0
- package/tests/projectIdentity.test.ts +56 -0
- package/tests/readiness.test.ts +158 -0
- package/tests/repositoryFingerprint.test.ts +26 -0
- package/tsconfig.test.json +9 -0
- package/wasm/bash.tags.scm +1 -1
- package/wasm/groovy.tags.scm +1 -1
- package/wasm/javascript.tags.scm +2 -2
- package/wasm/solidity.tags.scm +1 -1
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { domainToASCII } from 'node:url';
|
|
3
|
+
/** Registry changes require review and golden cases; changed v1 outputs require v2. */
|
|
4
|
+
export const REPOSITORY_PROVIDER_RULES = Object.freeze([
|
|
5
|
+
Object.freeze({ name: 'github', host: 'github.com', sshUser: 'git', removeTerminalDotGit: true }),
|
|
6
|
+
]);
|
|
7
|
+
const controls = /\p{Cc}/u;
|
|
8
|
+
const reject = (reason) => ({ status: 'rejected', reason });
|
|
9
|
+
const encodeSegment = (segment) => encodeURIComponent(segment).replace(/[!'()*]/g, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`);
|
|
10
|
+
/** Parse the raw path ourselves: WHATWG URL would silently resolve dot segments. */
|
|
11
|
+
export function canonicalizeRemote(url, { providerRules = REPOSITORY_PROVIDER_RULES, } = {}) {
|
|
12
|
+
if (controls.test(url))
|
|
13
|
+
return reject('control_character');
|
|
14
|
+
if (url.includes('\\'))
|
|
15
|
+
return reject('backslash');
|
|
16
|
+
if (/^file:/i.test(url))
|
|
17
|
+
return reject('local_remote');
|
|
18
|
+
const input = url.split(/[?#]/, 1)[0] ?? '';
|
|
19
|
+
const scheme = /^([a-z][a-z0-9+.-]*):\/\//i.exec(input);
|
|
20
|
+
let transport;
|
|
21
|
+
let authority;
|
|
22
|
+
let path;
|
|
23
|
+
if (scheme) {
|
|
24
|
+
const protocol = (scheme[1] ?? '').toLowerCase();
|
|
25
|
+
if (protocol !== 'https' && protocol !== 'ssh')
|
|
26
|
+
return reject('unsupported_transport');
|
|
27
|
+
transport = protocol;
|
|
28
|
+
const parts = /^([^/]*)(?:\/(.*))?$/.exec(input.slice(scheme[0].length));
|
|
29
|
+
if (!parts)
|
|
30
|
+
return reject('invalid_remote');
|
|
31
|
+
authority = parts[1] ?? '';
|
|
32
|
+
path = parts[2] ?? '';
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
const scp = /^((?:[^@/:]+@)?(?:\[[^\]]+\]|[^/:]+)):(.*)$/.exec(input);
|
|
36
|
+
if (!scp)
|
|
37
|
+
return reject('invalid_remote');
|
|
38
|
+
transport = 'ssh';
|
|
39
|
+
authority = scp[1] ?? '';
|
|
40
|
+
path = scp[2] ?? '';
|
|
41
|
+
}
|
|
42
|
+
const at = authority.lastIndexOf('@');
|
|
43
|
+
let user = '';
|
|
44
|
+
if (at >= 0) {
|
|
45
|
+
if (transport === 'https')
|
|
46
|
+
return reject('https_userinfo');
|
|
47
|
+
user = authority.slice(0, at);
|
|
48
|
+
if (user.includes(':'))
|
|
49
|
+
return reject('ssh_password');
|
|
50
|
+
if (!/^[A-Za-z0-9._~!$&'()*+,;=-]+$/.test(user))
|
|
51
|
+
return reject('invalid_ssh_user');
|
|
52
|
+
authority = authority.slice(at + 1);
|
|
53
|
+
}
|
|
54
|
+
if (transport === 'ssh' && !user)
|
|
55
|
+
return reject('ssh_user_required');
|
|
56
|
+
const hostPort = /^(\[[^\]]+\]|[^:[\]]+)(?::([0-9]+))?$/.exec(authority);
|
|
57
|
+
if (!hostPort)
|
|
58
|
+
return reject(authority.includes(':') ? 'invalid_port' : 'invalid_host');
|
|
59
|
+
let host = hostPort[1] ?? '';
|
|
60
|
+
let port = hostPort[2] ?? '';
|
|
61
|
+
if (port && (Number(port) < 1 || Number(port) > 65535))
|
|
62
|
+
return reject('invalid_port');
|
|
63
|
+
if (port)
|
|
64
|
+
port = String(Number(port));
|
|
65
|
+
if (port === (transport === 'https' ? '443' : '22'))
|
|
66
|
+
port = '';
|
|
67
|
+
if (/[\s%/@?#]/u.test(host))
|
|
68
|
+
return reject('invalid_host');
|
|
69
|
+
try {
|
|
70
|
+
// Node's WHATWG host parser supplies UTS 46 ToASCII and IPv6 zero compression.
|
|
71
|
+
host = host.startsWith('[')
|
|
72
|
+
? new URL(`https://${host}/`).hostname
|
|
73
|
+
: domainToASCII(host).toLowerCase();
|
|
74
|
+
if (!host)
|
|
75
|
+
return reject('invalid_host');
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return reject('invalid_host');
|
|
79
|
+
}
|
|
80
|
+
const rule = providerRules.find((rule) => rule.host === host && !port && (transport === 'https' || user === rule.sshUser));
|
|
81
|
+
// Generic scp paths are home-relative; ssh:// paths are absolute. Only a
|
|
82
|
+
// reviewed provider rule can establish that both name the same repository.
|
|
83
|
+
if (!scheme && !rule)
|
|
84
|
+
return reject('scp_unreviewed_remote');
|
|
85
|
+
if (!scheme && path.startsWith('/'))
|
|
86
|
+
path = path.slice(1);
|
|
87
|
+
if (path.endsWith('/'))
|
|
88
|
+
path = path.slice(0, -1);
|
|
89
|
+
const segments = [];
|
|
90
|
+
for (const raw of path.split('/')) {
|
|
91
|
+
if (/%(?:2f|5c)/i.test(raw))
|
|
92
|
+
return reject('escaped_separator');
|
|
93
|
+
let segment;
|
|
94
|
+
try {
|
|
95
|
+
segment = decodeURIComponent(raw).normalize('NFC');
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return reject('invalid_encoding');
|
|
99
|
+
}
|
|
100
|
+
if (controls.test(segment))
|
|
101
|
+
return reject('control_character');
|
|
102
|
+
if (segment.includes('\\'))
|
|
103
|
+
return reject('backslash');
|
|
104
|
+
if (!segment)
|
|
105
|
+
return reject('empty_segment');
|
|
106
|
+
if (segment === '.' || segment === '..')
|
|
107
|
+
return reject('dot_segment');
|
|
108
|
+
try {
|
|
109
|
+
segments.push(encodeSegment(segment));
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return reject('invalid_encoding');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const parsed = { transport, host, user, port, path: segments.join('/') };
|
|
116
|
+
if (rule?.removeTerminalDotGit) {
|
|
117
|
+
parsed.path = parsed.path.replace(/\.git$/, '');
|
|
118
|
+
const last = parsed.path.split('/').at(-1);
|
|
119
|
+
if (!last)
|
|
120
|
+
return reject('empty_segment');
|
|
121
|
+
if (last === '.' || last === '..')
|
|
122
|
+
return reject('dot_segment');
|
|
123
|
+
}
|
|
124
|
+
const prefix = rule
|
|
125
|
+
? `${rule.name}:${host}`
|
|
126
|
+
: `${transport}:${transport === 'ssh' ? `${user}@` : ''}${host}${port ? `:${port}` : ''}`;
|
|
127
|
+
const canonical = `repo-v1:${prefix}/${parsed.path}`;
|
|
128
|
+
return {
|
|
129
|
+
canonical,
|
|
130
|
+
hash: createHash('sha256').update(canonical, 'utf8').digest('hex'),
|
|
131
|
+
algorithmVersion: 1,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/** Choice results carry names, never credential-bearing URLs. No URL is guessed. */
|
|
135
|
+
export function selectRemote(remotes) {
|
|
136
|
+
if (!remotes.length)
|
|
137
|
+
return { status: 'none', reason: 'no_remote' };
|
|
138
|
+
const origins = remotes.filter((remote) => remote.name === 'origin');
|
|
139
|
+
const selected = origins.length === 1 ? origins[0] : remotes.length === 1 ? remotes[0] : undefined;
|
|
140
|
+
if (!selected)
|
|
141
|
+
return {
|
|
142
|
+
status: 'choice_required',
|
|
143
|
+
reason: 'multiple_remotes',
|
|
144
|
+
remotes: remotes.map((r) => r.name),
|
|
145
|
+
};
|
|
146
|
+
if (!selected.fetchUrls.length)
|
|
147
|
+
return { status: 'none', reason: 'no_fetch_url' };
|
|
148
|
+
const results = [...selected.fetchUrls, ...(selected.pushUrls ?? [])].map((url) => canonicalizeRemote(url));
|
|
149
|
+
const first = results[0];
|
|
150
|
+
if (!first)
|
|
151
|
+
return { status: 'none', reason: 'no_fetch_url' };
|
|
152
|
+
if (results.length === 1 && 'reason' in first)
|
|
153
|
+
return { status: 'rejected', remote: selected.name, reason: first.reason };
|
|
154
|
+
if ('reason' in first ||
|
|
155
|
+
results.some((result) => 'reason' in result || result.canonical !== first.canonical)) {
|
|
156
|
+
return { status: 'choice_required', reason: 'different_urls', remotes: [selected.name] };
|
|
157
|
+
}
|
|
158
|
+
return { status: 'fingerprint', remote: selected.name, fingerprint: first };
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=repositoryFingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositoryFingerprint.js","sourceRoot":"","sources":["../src/repositoryFingerprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type ProjectIdentityFile } from './projectIdentityFile.js';
|
|
2
|
+
export interface RepositoryBoundary {
|
|
3
|
+
path: string;
|
|
4
|
+
kind: 'directory' | 'file';
|
|
5
|
+
}
|
|
6
|
+
export type RepositoryRootResult = {
|
|
7
|
+
kind: 'git';
|
|
8
|
+
root: string;
|
|
9
|
+
commonDir: string;
|
|
10
|
+
isLinkedWorktree: boolean;
|
|
11
|
+
nested: RepositoryBoundary[];
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'plain';
|
|
14
|
+
root: string;
|
|
15
|
+
} | {
|
|
16
|
+
kind: 'git_unavailable';
|
|
17
|
+
detail: string;
|
|
18
|
+
};
|
|
19
|
+
type ResolvedRepository = Exclude<RepositoryRootResult, {
|
|
20
|
+
kind: 'git_unavailable';
|
|
21
|
+
}>;
|
|
22
|
+
type ResolvedBase = {
|
|
23
|
+
root: string;
|
|
24
|
+
repository: ResolvedRepository;
|
|
25
|
+
nested: RepositoryBoundary[];
|
|
26
|
+
};
|
|
27
|
+
export type ProjectIdentityResolution = (ResolvedBase & {
|
|
28
|
+
kind: 'ok';
|
|
29
|
+
identity: ProjectIdentityFile;
|
|
30
|
+
}) | (ResolvedBase & {
|
|
31
|
+
kind: 'absent';
|
|
32
|
+
}) | (ResolvedBase & {
|
|
33
|
+
kind: 'unknown_version';
|
|
34
|
+
version: unknown;
|
|
35
|
+
path: string;
|
|
36
|
+
}) | (ResolvedBase & {
|
|
37
|
+
kind: 'malformed';
|
|
38
|
+
detail: string;
|
|
39
|
+
path: string;
|
|
40
|
+
}) | (ResolvedBase & {
|
|
41
|
+
kind: 'nested';
|
|
42
|
+
parentIdentity?: ProjectIdentityFile;
|
|
43
|
+
}) | (ResolvedBase & {
|
|
44
|
+
kind: 'conflict';
|
|
45
|
+
rootIdentity: ProjectIdentityFile;
|
|
46
|
+
nestedIdentity: ProjectIdentityFile;
|
|
47
|
+
}) | {
|
|
48
|
+
kind: 'git_unavailable';
|
|
49
|
+
detail: string;
|
|
50
|
+
};
|
|
51
|
+
export declare function resolveRepositoryRoot(cwd: string): Promise<RepositoryRootResult>;
|
|
52
|
+
export declare function resolveProjectIdentity(cwd: string, options?: {
|
|
53
|
+
allowNestedInherit?: boolean;
|
|
54
|
+
}): Promise<ProjectIdentityResolution>;
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=repositoryRoot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositoryRoot.d.ts","sourceRoot":"","sources":["../src/repositoryRoot.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEtF,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAC5B;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B,GACD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD,KAAK,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,EAAE;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAAC;AAErF,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC,CAAC,YAAY,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAE,CAAC,GAC9D,CAAC,YAAY,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,GACnC,CAAC,YAAY,GAAG;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5E,CAAC,YAAY,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACpE,CAAC,YAAY,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,cAAc,CAAC,EAAE,mBAAmB,CAAA;CAAE,CAAC,GACzE,CAAC,YAAY,GAAG;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,EAAE,mBAAmB,CAAC;IAClC,cAAc,EAAE,mBAAmB,CAAC;CACrC,CAAC,GACF;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAoGhD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkCtF;AA2BD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7C,OAAO,CAAC,yBAAyB,CAAC,CAuDpC"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { lstat, readFile } from 'node:fs/promises';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { dirname, join, resolve } from 'node:path';
|
|
5
|
+
import { readIdentityFile } from './projectIdentityFile.js';
|
|
6
|
+
const GIT_TIMEOUT_MS = 2_000;
|
|
7
|
+
const GIT_ENV_KEYS = [
|
|
8
|
+
'PATH',
|
|
9
|
+
'HOME',
|
|
10
|
+
'LANG',
|
|
11
|
+
'LC_ALL',
|
|
12
|
+
'SYSTEMROOT',
|
|
13
|
+
'TEMP',
|
|
14
|
+
'TMP',
|
|
15
|
+
'USERPROFILE',
|
|
16
|
+
];
|
|
17
|
+
function gitEnvironment() {
|
|
18
|
+
const env = {};
|
|
19
|
+
for (const key of GIT_ENV_KEYS) {
|
|
20
|
+
if (process.env[key] !== undefined)
|
|
21
|
+
env[key] = process.env[key];
|
|
22
|
+
}
|
|
23
|
+
env.LC_ALL = 'C';
|
|
24
|
+
return env;
|
|
25
|
+
}
|
|
26
|
+
function runGit(cwd, args) {
|
|
27
|
+
return new Promise((resolvePromise, reject) => {
|
|
28
|
+
execFile('git', args, { cwd, timeout: GIT_TIMEOUT_MS, encoding: 'utf8', env: gitEnvironment() }, (error, stdout, stderr) => {
|
|
29
|
+
if (error)
|
|
30
|
+
reject(Object.assign(error, { stdout, stderr }));
|
|
31
|
+
else
|
|
32
|
+
resolvePromise({ stdout, stderr });
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async function boundaryAt(path) {
|
|
37
|
+
try {
|
|
38
|
+
const stat = await lstat(join(path, '.git'));
|
|
39
|
+
if (stat.isDirectory())
|
|
40
|
+
return { path, kind: 'directory' };
|
|
41
|
+
if (stat.isFile())
|
|
42
|
+
return { path, kind: 'file' };
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
const code = error.code;
|
|
46
|
+
if (code !== 'ENOENT' && code !== 'ENOTDIR')
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
async function confirmedBoundaryAt(path) {
|
|
52
|
+
const boundary = await boundaryAt(path);
|
|
53
|
+
if (!boundary)
|
|
54
|
+
return undefined;
|
|
55
|
+
try {
|
|
56
|
+
const { stdout } = await runGit(path, ['rev-parse', '--git-dir']);
|
|
57
|
+
return stdout.trim() ? boundary : undefined;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function boundariesBetween(cwd, root) {
|
|
64
|
+
const boundaries = [];
|
|
65
|
+
let directory = cwd;
|
|
66
|
+
while (directory !== root) {
|
|
67
|
+
const boundary = await confirmedBoundaryAt(directory);
|
|
68
|
+
if (boundary)
|
|
69
|
+
boundaries.push(boundary);
|
|
70
|
+
const parent = dirname(directory);
|
|
71
|
+
if (parent === directory)
|
|
72
|
+
break;
|
|
73
|
+
directory = parent;
|
|
74
|
+
}
|
|
75
|
+
return boundaries;
|
|
76
|
+
}
|
|
77
|
+
async function containingRepository(root) {
|
|
78
|
+
let directory = dirname(root);
|
|
79
|
+
while (true) {
|
|
80
|
+
const boundary = await confirmedBoundaryAt(directory);
|
|
81
|
+
if (boundary)
|
|
82
|
+
return boundary;
|
|
83
|
+
const parent = dirname(directory);
|
|
84
|
+
if (parent === directory)
|
|
85
|
+
return undefined;
|
|
86
|
+
directory = parent;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function canonicalBoundaryRoot(boundary) {
|
|
90
|
+
if (boundary.kind === 'directory')
|
|
91
|
+
return boundary.path;
|
|
92
|
+
const pointer = /^gitdir:\s*(.+)\s*$/im.exec(await readFile(join(boundary.path, '.git'), 'utf8'))?.[1];
|
|
93
|
+
if (!pointer)
|
|
94
|
+
return boundary.path;
|
|
95
|
+
const gitDir = resolve(boundary.path, pointer);
|
|
96
|
+
try {
|
|
97
|
+
const commonDir = resolve(gitDir, (await readFile(join(gitDir, 'commondir'), 'utf8')).trim());
|
|
98
|
+
return dirname(commonDir);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
if (error.code === 'ENOENT')
|
|
102
|
+
return boundary.path;
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export async function resolveRepositoryRoot(cwd) {
|
|
107
|
+
const absoluteCwd = resolve(cwd);
|
|
108
|
+
try {
|
|
109
|
+
const { stdout } = await runGit(absoluteCwd, [
|
|
110
|
+
'rev-parse',
|
|
111
|
+
'--show-toplevel',
|
|
112
|
+
'--git-common-dir',
|
|
113
|
+
]);
|
|
114
|
+
const [rootLine, commonLine, ...extra] = stdout.trim().split(/\r?\n/);
|
|
115
|
+
if (!rootLine || !commonLine || extra.length) {
|
|
116
|
+
return { kind: 'git_unavailable', detail: 'git rev-parse returned an unexpected response' };
|
|
117
|
+
}
|
|
118
|
+
const root = resolve(rootLine);
|
|
119
|
+
const commonDir = resolve(root, commonLine);
|
|
120
|
+
const isLinkedWorktree = commonDir !== join(root, '.git');
|
|
121
|
+
const nested = await boundariesBetween(absoluteCwd, root);
|
|
122
|
+
if (!isLinkedWorktree && (await containingRepository(root))) {
|
|
123
|
+
const boundary = await boundaryAt(root);
|
|
124
|
+
if (boundary)
|
|
125
|
+
nested.push(boundary);
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
kind: 'git',
|
|
129
|
+
root,
|
|
130
|
+
commonDir,
|
|
131
|
+
isLinkedWorktree,
|
|
132
|
+
nested,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
const failure = error;
|
|
137
|
+
if (failure.code === 128 && /not a git repository/i.test(failure.stderr ?? failure.message)) {
|
|
138
|
+
return { kind: 'plain', root: absoluteCwd };
|
|
139
|
+
}
|
|
140
|
+
return { kind: 'git_unavailable', detail: failure.message };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async function readPlainIdentity(start) {
|
|
144
|
+
const home = resolve(homedir());
|
|
145
|
+
let directory = start;
|
|
146
|
+
while (true) {
|
|
147
|
+
const result = await readIdentityFile(directory);
|
|
148
|
+
if (result.kind !== 'absent')
|
|
149
|
+
return { root: directory, result };
|
|
150
|
+
if (directory === home)
|
|
151
|
+
break;
|
|
152
|
+
const parent = dirname(directory);
|
|
153
|
+
if (parent === directory)
|
|
154
|
+
break;
|
|
155
|
+
directory = parent;
|
|
156
|
+
}
|
|
157
|
+
return { root: start, result: { kind: 'absent' } };
|
|
158
|
+
}
|
|
159
|
+
function withBase(repository, root, nested) {
|
|
160
|
+
return { root, repository, nested };
|
|
161
|
+
}
|
|
162
|
+
export async function resolveProjectIdentity(cwd, options = {}) {
|
|
163
|
+
const repository = await resolveRepositoryRoot(cwd);
|
|
164
|
+
if (repository.kind === 'git_unavailable')
|
|
165
|
+
return repository;
|
|
166
|
+
if (repository.kind === 'plain') {
|
|
167
|
+
const { root, result } = await readPlainIdentity(repository.root);
|
|
168
|
+
const base = withBase(repository, root, []);
|
|
169
|
+
if (result.kind === 'ok')
|
|
170
|
+
return { ...base, ...result };
|
|
171
|
+
if (result.kind === 'unknown_version')
|
|
172
|
+
return { ...base, ...result, path: root };
|
|
173
|
+
if (result.kind === 'malformed')
|
|
174
|
+
return { ...base, ...result, path: root };
|
|
175
|
+
return { ...base, kind: 'absent' };
|
|
176
|
+
}
|
|
177
|
+
const ownRoot = repository.isLinkedWorktree ? dirname(repository.commonDir) : repository.root;
|
|
178
|
+
const outer = repository.isLinkedWorktree
|
|
179
|
+
? undefined
|
|
180
|
+
: await containingRepository(repository.root);
|
|
181
|
+
const own = await readIdentityFile(ownRoot);
|
|
182
|
+
if (!outer) {
|
|
183
|
+
const base = withBase(repository, ownRoot, repository.nested);
|
|
184
|
+
if (own.kind === 'ok')
|
|
185
|
+
return { ...base, ...own };
|
|
186
|
+
if (own.kind === 'unknown_version')
|
|
187
|
+
return { ...base, ...own, path: ownRoot };
|
|
188
|
+
if (own.kind === 'malformed')
|
|
189
|
+
return { ...base, ...own, path: ownRoot };
|
|
190
|
+
return { ...base, kind: 'absent' };
|
|
191
|
+
}
|
|
192
|
+
const nested = repository.nested;
|
|
193
|
+
const parentRoot = await canonicalBoundaryRoot(outer);
|
|
194
|
+
const parent = await readIdentityFile(parentRoot);
|
|
195
|
+
const base = withBase(repository, parentRoot, nested);
|
|
196
|
+
if (own.kind === 'unknown_version')
|
|
197
|
+
return { ...base, ...own, path: ownRoot };
|
|
198
|
+
if (own.kind === 'malformed')
|
|
199
|
+
return { ...base, ...own, path: ownRoot };
|
|
200
|
+
if (parent.kind === 'unknown_version')
|
|
201
|
+
return { ...base, ...parent, path: parentRoot };
|
|
202
|
+
if (parent.kind === 'malformed')
|
|
203
|
+
return { ...base, ...parent, path: parentRoot };
|
|
204
|
+
if (own.kind === 'ok' && parent.kind === 'ok') {
|
|
205
|
+
return {
|
|
206
|
+
...base,
|
|
207
|
+
kind: 'conflict',
|
|
208
|
+
rootIdentity: parent.identity,
|
|
209
|
+
nestedIdentity: own.identity,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
if (own.kind === 'ok') {
|
|
213
|
+
return { ...withBase(repository, ownRoot, nested), kind: 'ok', identity: own.identity };
|
|
214
|
+
}
|
|
215
|
+
if (!options.allowNestedInherit) {
|
|
216
|
+
return {
|
|
217
|
+
...base,
|
|
218
|
+
kind: 'nested',
|
|
219
|
+
...(parent.kind === 'ok' ? { parentIdentity: parent.identity } : {}),
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
if (parent.kind === 'ok')
|
|
223
|
+
return { ...base, kind: 'ok', identity: parent.identity };
|
|
224
|
+
return { ...base, kind: 'absent' };
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=repositoryRoot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repositoryRoot.js","sourceRoot":"","sources":["../src/repositoryRoot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { type Execute, type Signer } from './runtimeSigners.js';
|
|
2
|
+
export type HostArtifact = 'claude-code' | 'codex' | 'cursor' | 'grok';
|
|
3
|
+
export type Artifact = 'cli' | 'scanner' | HostArtifact;
|
|
4
|
+
export type Reason = 'digest_mismatch' | 'manifest_missing' | 'unsigned' | 'permission' | 'acl_unavailable' | 'lock_held';
|
|
5
|
+
export declare class RuntimeError extends Error {
|
|
6
|
+
readonly reason: Reason;
|
|
7
|
+
constructor(reason: Reason);
|
|
8
|
+
}
|
|
9
|
+
export declare const hash: (bytes: Buffer | string) => string;
|
|
10
|
+
export declare function safePath(path: string): string;
|
|
11
|
+
export interface NpmReceipt {
|
|
12
|
+
name: string;
|
|
13
|
+
version: string;
|
|
14
|
+
integrity: string;
|
|
15
|
+
tarball: string;
|
|
16
|
+
tarballSha256: string;
|
|
17
|
+
}
|
|
18
|
+
export interface Manifest {
|
|
19
|
+
schemaVersion: 1;
|
|
20
|
+
artifact: Artifact;
|
|
21
|
+
version: string;
|
|
22
|
+
entry: string;
|
|
23
|
+
files: Record<string, {
|
|
24
|
+
sha256: string;
|
|
25
|
+
size: number;
|
|
26
|
+
executable: boolean;
|
|
27
|
+
}>;
|
|
28
|
+
totalSize: number;
|
|
29
|
+
source: {
|
|
30
|
+
kind: 'npm';
|
|
31
|
+
packages: NpmReceipt[];
|
|
32
|
+
launchedFrom: string;
|
|
33
|
+
} | {
|
|
34
|
+
kind: 'release';
|
|
35
|
+
url: string;
|
|
36
|
+
};
|
|
37
|
+
signer?: Signer;
|
|
38
|
+
signingStatus?: 'unsigned' | 'signed';
|
|
39
|
+
disclosureVersion?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface RuntimeSource {
|
|
42
|
+
manifest: Manifest;
|
|
43
|
+
files: Record<string, Buffer>;
|
|
44
|
+
}
|
|
45
|
+
export interface Reference {
|
|
46
|
+
version: string;
|
|
47
|
+
manifestSha256: string;
|
|
48
|
+
}
|
|
49
|
+
interface Pointer {
|
|
50
|
+
current: Reference;
|
|
51
|
+
previous?: Reference;
|
|
52
|
+
}
|
|
53
|
+
export interface Verified {
|
|
54
|
+
directory: string;
|
|
55
|
+
manifest: Manifest;
|
|
56
|
+
entry: string;
|
|
57
|
+
reference: Reference;
|
|
58
|
+
}
|
|
59
|
+
export declare const missing: (e: unknown) => boolean;
|
|
60
|
+
export declare const versionName: (v: string) => string;
|
|
61
|
+
/** Only stdlib and the accepted bootstrap's signer adapter may load before verifyRuntime returns. */
|
|
62
|
+
export declare class RuntimeReader {
|
|
63
|
+
readonly run?: Execute | undefined;
|
|
64
|
+
readonly options: {
|
|
65
|
+
allowUnsigned?: boolean;
|
|
66
|
+
cacheDirectories?: boolean;
|
|
67
|
+
};
|
|
68
|
+
private readonly now;
|
|
69
|
+
readonly state: string;
|
|
70
|
+
private static readonly windowsSignatures;
|
|
71
|
+
private readonly windowsAudit;
|
|
72
|
+
private readonly windowsStats;
|
|
73
|
+
private readonly windowsDirectories;
|
|
74
|
+
private audits;
|
|
75
|
+
private readonly auditsInFlight;
|
|
76
|
+
private activeOperation;
|
|
77
|
+
private operations;
|
|
78
|
+
constructor(state: string, run?: Execute | undefined, options?: {
|
|
79
|
+
allowUnsigned?: boolean;
|
|
80
|
+
cacheDirectories?: boolean;
|
|
81
|
+
}, now?: () => number);
|
|
82
|
+
pointerPath(artifact: Artifact): string;
|
|
83
|
+
private guardedPath;
|
|
84
|
+
private auditRoot;
|
|
85
|
+
private traceAudit;
|
|
86
|
+
private invalidateAudit;
|
|
87
|
+
private audit;
|
|
88
|
+
private auditPending;
|
|
89
|
+
inspect(path: string, directory?: boolean, allowMissing?: boolean, replacing?: boolean): Promise<void>;
|
|
90
|
+
/** Call only after an owned atomic replacement: its parent ctime is our own write. */
|
|
91
|
+
recordReplacement(path: string): Promise<void>;
|
|
92
|
+
bytes(path: string): Promise<Buffer>;
|
|
93
|
+
/** An owned inheritable ACL update can change every cached descendant's ctime. */
|
|
94
|
+
protected recordAclWrite(path: string): Promise<void>;
|
|
95
|
+
protected pointer(artifact: Artifact): Promise<Pointer | undefined>;
|
|
96
|
+
private operation;
|
|
97
|
+
protected verifyAt(artifact: Artifact, ref: Reference, directory: string): Promise<Verified>;
|
|
98
|
+
private verifyOpen;
|
|
99
|
+
verifyRuntime(artifact: Artifact): Promise<Verified>;
|
|
100
|
+
}
|
|
101
|
+
export * from './runtimeSigners.js';
|
|
102
|
+
//# sourceMappingURL=runtimeReader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeReader.d.ts","sourceRoot":"","sources":["../src/runtimeReader.ts"],"names":[],"mappings":"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"}
|