@codeledger/cli 0.5.0 → 0.6.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/artifacts/summary.d.ts +6 -0
- package/dist/artifacts/summary.d.ts.map +1 -0
- package/dist/artifacts/summary.js +49 -0
- package/dist/artifacts/summary.js.map +1 -0
- package/dist/commands/activate.d.ts.map +1 -1
- package/dist/commands/activate.js +64 -23
- package/dist/commands/activate.js.map +1 -1
- package/dist/commands/bundle.d.ts.map +1 -1
- package/dist/commands/bundle.js +28 -5
- package/dist/commands/bundle.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +10 -12
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/intent.d.ts.map +1 -1
- package/dist/commands/intent.js +17 -2
- package/dist/commands/intent.js.map +1 -1
- package/dist/commands/manifest.d.ts +8 -0
- package/dist/commands/manifest.d.ts.map +1 -0
- package/dist/commands/manifest.js +144 -0
- package/dist/commands/manifest.js.map +1 -0
- package/dist/commands/policy.d.ts +8 -0
- package/dist/commands/policy.d.ts.map +1 -0
- package/dist/commands/policy.js +27 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/commands/progress-check.d.ts +14 -0
- package/dist/commands/progress-check.d.ts.map +1 -0
- package/dist/commands/progress-check.js +153 -0
- package/dist/commands/progress-check.js.map +1 -0
- package/dist/commands/review-coverage.d.ts +12 -0
- package/dist/commands/review-coverage.d.ts.map +1 -0
- package/dist/commands/review-coverage.js +142 -0
- package/dist/commands/review-coverage.js.map +1 -0
- package/dist/commands/review-gate.d.ts +12 -0
- package/dist/commands/review-gate.d.ts.map +1 -0
- package/dist/commands/review-gate.js +130 -0
- package/dist/commands/review-gate.js.map +1 -0
- package/dist/commands/session-summary.d.ts.map +1 -1
- package/dist/commands/session-summary.js +39 -5
- package/dist/commands/session-summary.js.map +1 -1
- package/dist/commands/setup-ci.d.ts +9 -0
- package/dist/commands/setup-ci.d.ts.map +1 -0
- package/dist/commands/setup-ci.js +139 -0
- package/dist/commands/setup-ci.js.map +1 -0
- package/dist/commands/sign-manifest.d.ts +8 -0
- package/dist/commands/sign-manifest.d.ts.map +1 -0
- package/dist/commands/sign-manifest.js +58 -0
- package/dist/commands/sign-manifest.js.map +1 -0
- package/dist/commands/vendor.d.ts +20 -0
- package/dist/commands/vendor.d.ts.map +1 -0
- package/dist/commands/vendor.js +157 -0
- package/dist/commands/vendor.js.map +1 -0
- package/dist/commands/verify.d.ts +13 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +288 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +98 -2
- package/dist/index.js.map +1 -1
- package/dist/integrations/github-actions.d.ts +17 -0
- package/dist/integrations/github-actions.d.ts.map +1 -0
- package/dist/integrations/github-actions.js +64 -0
- package/dist/integrations/github-actions.js.map +1 -0
- package/dist/manifest/build.d.ts +19 -0
- package/dist/manifest/build.d.ts.map +1 -0
- package/dist/manifest/build.js +82 -0
- package/dist/manifest/build.js.map +1 -0
- package/dist/manifest/schema.d.ts +2 -0
- package/dist/manifest/schema.d.ts.map +1 -0
- package/dist/manifest/schema.js +2 -0
- package/dist/manifest/schema.js.map +1 -0
- package/dist/manifest/write.d.ts +13 -0
- package/dist/manifest/write.d.ts.map +1 -0
- package/dist/manifest/write.js +69 -0
- package/dist/manifest/write.js.map +1 -0
- package/dist/policy/load.d.ts +21 -0
- package/dist/policy/load.d.ts.map +1 -0
- package/dist/policy/load.js +63 -0
- package/dist/policy/load.js.map +1 -0
- package/dist/policy/resolve.d.ts +18 -0
- package/dist/policy/resolve.d.ts.map +1 -0
- package/dist/policy/resolve.js +86 -0
- package/dist/policy/resolve.js.map +1 -0
- package/dist/policy/schema.d.ts +22 -0
- package/dist/policy/schema.d.ts.map +1 -0
- package/dist/policy/schema.js +82 -0
- package/dist/policy/schema.js.map +1 -0
- package/dist/session-paths.d.ts +6 -0
- package/dist/session-paths.d.ts.map +1 -1
- package/dist/session-paths.js +12 -0
- package/dist/session-paths.js.map +1 -1
- package/dist/signing/canonicalize.d.ts +17 -0
- package/dist/signing/canonicalize.d.ts.map +1 -0
- package/dist/signing/canonicalize.js +50 -0
- package/dist/signing/canonicalize.js.map +1 -0
- package/dist/signing/hmac.d.ts +8 -0
- package/dist/signing/hmac.d.ts.map +1 -0
- package/dist/signing/hmac.js +16 -0
- package/dist/signing/hmac.js.map +1 -0
- package/dist/signing/signer.d.ts +16 -0
- package/dist/signing/signer.d.ts.map +1 -0
- package/dist/signing/signer.js +2 -0
- package/dist/signing/signer.js.map +1 -0
- package/dist/templates/claude-md.d.ts.map +1 -1
- package/dist/templates/claude-md.js +61 -3
- package/dist/templates/claude-md.js.map +1 -1
- package/dist/templates/config.d.ts.map +1 -1
- package/dist/templates/config.js +3 -0
- package/dist/templates/config.js.map +1 -1
- package/dist/templates/hooks.d.ts.map +1 -1
- package/dist/templates/hooks.js +35 -2
- package/dist/templates/hooks.js.map +1 -1
- package/dist/verify/evaluate.d.ts +10 -0
- package/dist/verify/evaluate.d.ts.map +1 -0
- package/dist/verify/evaluate.js +117 -0
- package/dist/verify/evaluate.js.map +1 -0
- package/dist/verify/policy-snapshot.d.ts +7 -0
- package/dist/verify/policy-snapshot.d.ts.map +1 -0
- package/dist/verify/policy-snapshot.js +36 -0
- package/dist/verify/policy-snapshot.js.map +1 -0
- package/dist/verify/report.d.ts +11 -0
- package/dist/verify/report.d.ts.map +1 -0
- package/dist/verify/report.js +64 -0
- package/dist/verify/report.js.map +1 -0
- package/package.json +10 -10
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { canonicalize } from '../signing/canonicalize.js';
|
|
4
|
+
import { createHmacSigner } from '../signing/hmac.js';
|
|
5
|
+
/**
|
|
6
|
+
* `codeledger sign-manifest --in <manifest.json> --out <signed.json>`
|
|
7
|
+
*
|
|
8
|
+
* Sign a context manifest with HMAC-SHA256 using CODELEDGER_SIGNING_SECRET.
|
|
9
|
+
* Signature covers the canonicalized payload only.
|
|
10
|
+
*/
|
|
11
|
+
export async function runSignManifest(_cwd, flags) {
|
|
12
|
+
const inPath = flags['in'];
|
|
13
|
+
if (!inPath) {
|
|
14
|
+
console.error('--in is required. Usage: codeledger sign-manifest --in <manifest.json> --out <signed.json>');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
if (!existsSync(inPath)) {
|
|
18
|
+
console.error(`Input file not found: ${inPath}`);
|
|
19
|
+
process.exit(2);
|
|
20
|
+
}
|
|
21
|
+
const outPath = flags['out'];
|
|
22
|
+
if (!outPath) {
|
|
23
|
+
console.error('--out is required. Usage: codeledger sign-manifest --in <manifest.json> --out <signed.json>');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const secret = process.env['CODELEDGER_SIGNING_SECRET'];
|
|
27
|
+
if (!secret) {
|
|
28
|
+
console.error('CODELEDGER_SIGNING_SECRET environment variable is not set. Cannot sign manifest.');
|
|
29
|
+
process.exit(2);
|
|
30
|
+
}
|
|
31
|
+
// Read manifest payload
|
|
32
|
+
let payload;
|
|
33
|
+
try {
|
|
34
|
+
payload = JSON.parse(readFileSync(inPath, 'utf-8'));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
console.error(`Failed to parse manifest file: ${inPath}`);
|
|
38
|
+
process.exit(2);
|
|
39
|
+
}
|
|
40
|
+
// Canonicalize and sign
|
|
41
|
+
const canonical = canonicalize(payload);
|
|
42
|
+
const signer = createHmacSigner(secret);
|
|
43
|
+
const signatureValue = await signer.sign(Buffer.from(canonical, 'utf-8'));
|
|
44
|
+
// Build signed wrapper
|
|
45
|
+
const signed = {
|
|
46
|
+
schema_version: 'mustang/signed-manifest/v1',
|
|
47
|
+
payload,
|
|
48
|
+
signature: {
|
|
49
|
+
alg: signer.alg,
|
|
50
|
+
value: signatureValue,
|
|
51
|
+
key_id: signer.keyId,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
55
|
+
writeFileSync(outPath, JSON.stringify(signed, null, 2) + '\n');
|
|
56
|
+
console.log(`Signed manifest written to ${outPath}`);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=sign-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-manifest.js","sourceRoot":"","sources":["../../src/commands/sign-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,KAA6B;IAE7B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,4FAA4F,CAAC,CAAC;QAC5G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6FAA6F,CAAC,CAAC;QAC7G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,kFAAkF,CAAC,CAAC;QAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wBAAwB;IACxB,IAAI,OAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAsB,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,kCAAkC,MAAM,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wBAAwB;IACxB,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1E,uBAAuB;IACvB,MAAM,MAAM,GAAqB;QAC/B,cAAc,EAAE,4BAA4B;QAC5C,OAAO;QACP,SAAS,EAAE;YACT,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,KAAK,EAAE,cAAc;YACrB,MAAM,EAAE,MAAM,CAAC,KAAK;SACrB;KACF,CAAC;IAEF,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codeledger vendor [--target <dir>]`
|
|
3
|
+
*
|
|
4
|
+
* Copies the standalone CLI bundle into a target repo so that CodeLedger
|
|
5
|
+
* works in cloud/web environments (e.g., Claude Code browser sessions)
|
|
6
|
+
* without needing npm install.
|
|
7
|
+
*
|
|
8
|
+
* What it does:
|
|
9
|
+
* 1. Builds the standalone CLI if not already built
|
|
10
|
+
* 2. Copies it to <target>/.codeledger/bin/codeledger-standalone.cjs
|
|
11
|
+
* 3. Writes a wrapper script at <target>/.codeledger/bin/codeledger
|
|
12
|
+
* 4. Updates the target's .claude/hooks.json to find the vendored CLI
|
|
13
|
+
* 5. Adds .codeledger/bin/ to .gitignore exceptions so it's committed
|
|
14
|
+
*
|
|
15
|
+
* The vendored CLI is a single ~260KB file with no native dependencies.
|
|
16
|
+
* Benchmark commands (run, compare) require a full install; all other
|
|
17
|
+
* commands work normally.
|
|
18
|
+
*/
|
|
19
|
+
export declare function runVendor(cwd: string, flags: Record<string, string>): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=vendor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor.d.ts","sourceRoot":"","sources":["../../src/commands/vendor.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync } from 'node:fs';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import { CLI_VERSION } from '../version.js';
|
|
5
|
+
/**
|
|
6
|
+
* `codeledger vendor [--target <dir>]`
|
|
7
|
+
*
|
|
8
|
+
* Copies the standalone CLI bundle into a target repo so that CodeLedger
|
|
9
|
+
* works in cloud/web environments (e.g., Claude Code browser sessions)
|
|
10
|
+
* without needing npm install.
|
|
11
|
+
*
|
|
12
|
+
* What it does:
|
|
13
|
+
* 1. Builds the standalone CLI if not already built
|
|
14
|
+
* 2. Copies it to <target>/.codeledger/bin/codeledger-standalone.cjs
|
|
15
|
+
* 3. Writes a wrapper script at <target>/.codeledger/bin/codeledger
|
|
16
|
+
* 4. Updates the target's .claude/hooks.json to find the vendored CLI
|
|
17
|
+
* 5. Adds .codeledger/bin/ to .gitignore exceptions so it's committed
|
|
18
|
+
*
|
|
19
|
+
* The vendored CLI is a single ~260KB file with no native dependencies.
|
|
20
|
+
* Benchmark commands (run, compare) require a full install; all other
|
|
21
|
+
* commands work normally.
|
|
22
|
+
*/
|
|
23
|
+
export async function runVendor(cwd, flags) {
|
|
24
|
+
const target = flags['target'] ? resolve(flags['target']) : cwd;
|
|
25
|
+
console.log(`CodeLedger v${CLI_VERSION} — Vendor standalone CLI\n`);
|
|
26
|
+
// Step 1: Find or build the standalone bundle
|
|
27
|
+
const standalonePath = findStandaloneBuild(cwd);
|
|
28
|
+
if (!standalonePath) {
|
|
29
|
+
console.error('Standalone CLI not found. Build it first:');
|
|
30
|
+
console.error(' node scripts/build-standalone.mjs');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
const standaloneSize = (readFileSync(standalonePath).length / 1024).toFixed(1);
|
|
34
|
+
console.log(` Source: ${standalonePath} (${standaloneSize} KB)`);
|
|
35
|
+
// Step 2: Copy to target
|
|
36
|
+
const targetBinDir = join(target, '.codeledger', 'bin');
|
|
37
|
+
mkdirSync(targetBinDir, { recursive: true });
|
|
38
|
+
const targetBundlePath = join(targetBinDir, 'codeledger-standalone.cjs');
|
|
39
|
+
copyFileSync(standalonePath, targetBundlePath);
|
|
40
|
+
console.log(` Copied to: ${targetBundlePath}`);
|
|
41
|
+
// Step 3: Write a shell wrapper for convenience
|
|
42
|
+
const wrapperPath = join(targetBinDir, 'codeledger');
|
|
43
|
+
writeFileSync(wrapperPath, [
|
|
44
|
+
'#!/usr/bin/env bash',
|
|
45
|
+
'# CodeLedger vendored CLI wrapper — auto-generated by codeledger vendor',
|
|
46
|
+
'SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"',
|
|
47
|
+
'exec node "$SCRIPT_DIR/codeledger-standalone.cjs" "$@"',
|
|
48
|
+
'',
|
|
49
|
+
].join('\n'), { mode: 0o755 });
|
|
50
|
+
console.log(` Wrapper: ${wrapperPath}`);
|
|
51
|
+
// Step 4: Ensure .codeledger/bin/ is NOT gitignored
|
|
52
|
+
// (.codeledger/ is normally in .gitignore, but we need bin/ to be committed)
|
|
53
|
+
ensureBinNotIgnored(target);
|
|
54
|
+
// Step 5: Update hooks if they exist
|
|
55
|
+
updateHooksForVendor(target);
|
|
56
|
+
console.log(`\n Done! The vendored CLI is ready.`);
|
|
57
|
+
console.log(` It will be found by hooks at: .codeledger/bin/codeledger-standalone.cjs`);
|
|
58
|
+
console.log(`\n Next: commit the vendored files so they're available in cloud environments:`);
|
|
59
|
+
console.log(` git add .codeledger/bin/ .gitignore`);
|
|
60
|
+
console.log(` git commit -m "chore: vendor codeledger CLI for cloud environments"`);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Find the standalone build, checking multiple possible locations.
|
|
64
|
+
*/
|
|
65
|
+
function findStandaloneBuild(cwd) {
|
|
66
|
+
const candidates = [
|
|
67
|
+
join(cwd, 'packages', 'cli', 'bin', 'codeledger-standalone.cjs'),
|
|
68
|
+
join(cwd, '..', 'codeledger-blackbox', 'packages', 'cli', 'bin', 'codeledger-standalone.cjs'),
|
|
69
|
+
];
|
|
70
|
+
for (const p of candidates) {
|
|
71
|
+
if (existsSync(p))
|
|
72
|
+
return p;
|
|
73
|
+
}
|
|
74
|
+
// Try to build it if we're in the codeledger-blackbox repo
|
|
75
|
+
const buildScript = join(cwd, 'scripts', 'build-standalone.mjs');
|
|
76
|
+
if (existsSync(buildScript)) {
|
|
77
|
+
console.log(' Building standalone CLI...');
|
|
78
|
+
try {
|
|
79
|
+
execSync('node scripts/build-standalone.mjs', {
|
|
80
|
+
cwd,
|
|
81
|
+
encoding: 'utf-8',
|
|
82
|
+
timeout: 30000,
|
|
83
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
84
|
+
});
|
|
85
|
+
const built = join(cwd, 'packages', 'cli', 'bin', 'codeledger-standalone.cjs');
|
|
86
|
+
if (existsSync(built))
|
|
87
|
+
return built;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Fall through to error
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Add a .gitignore exception so .codeledger/bin/ is committed.
|
|
97
|
+
* The pattern is: first ignore .codeledger/, then un-ignore .codeledger/bin/.
|
|
98
|
+
*/
|
|
99
|
+
function ensureBinNotIgnored(target) {
|
|
100
|
+
const gitignorePath = join(target, '.gitignore');
|
|
101
|
+
if (!existsSync(gitignorePath))
|
|
102
|
+
return;
|
|
103
|
+
const content = readFileSync(gitignorePath, 'utf-8');
|
|
104
|
+
const lines = content.split('\n');
|
|
105
|
+
// Check if the exception already exists
|
|
106
|
+
if (lines.some((l) => l.trim() === '!.codeledger/bin/')) {
|
|
107
|
+
console.log(` .gitignore: already has !.codeledger/bin/ exception`);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Find the .codeledger/ ignore line and add the exception after it
|
|
111
|
+
const clIdx = lines.findIndex((l) => l.trim() === '.codeledger/');
|
|
112
|
+
if (clIdx !== -1) {
|
|
113
|
+
lines.splice(clIdx + 1, 0, '!.codeledger/bin/');
|
|
114
|
+
writeFileSync(gitignorePath, lines.join('\n'));
|
|
115
|
+
console.log(` .gitignore: added !.codeledger/bin/ exception`);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// .codeledger/ isn't in gitignore — just append both lines
|
|
119
|
+
const suffix = content.endsWith('\n') ? '' : '\n';
|
|
120
|
+
writeFileSync(gitignorePath, content + suffix + '.codeledger/\n!.codeledger/bin/\n');
|
|
121
|
+
console.log(` .gitignore: added .codeledger/ and !.codeledger/bin/`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Update .claude/hooks.json to add the vendored CLI as a resolution fallback.
|
|
126
|
+
* Adds `.codeledger/bin/codeledger-standalone.cjs` as the first check.
|
|
127
|
+
*/
|
|
128
|
+
function updateHooksForVendor(target) {
|
|
129
|
+
const hooksPath = join(target, '.claude', 'hooks.json');
|
|
130
|
+
if (!existsSync(hooksPath)) {
|
|
131
|
+
console.log(` Hooks: no .claude/hooks.json found — skipped`);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
let content = readFileSync(hooksPath, 'utf-8');
|
|
135
|
+
// The resolution preamble sets CL_CMD by checking multiple locations.
|
|
136
|
+
// Add the vendored path as the FIRST check (highest priority).
|
|
137
|
+
const vendorCheck = 'if [ -f ".codeledger/bin/codeledger-standalone.cjs" ]; then CL_CMD="node .codeledger/bin/codeledger-standalone.cjs";';
|
|
138
|
+
if (content.includes('.codeledger/bin/codeledger-standalone.cjs')) {
|
|
139
|
+
console.log(` Hooks: already has vendored CLI fallback`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Replace the CL_CMD="" initialization to start with the vendor check
|
|
143
|
+
const oldInit = 'CL_CMD=\\"\\"; if command -v codeledger';
|
|
144
|
+
const newInit = `CL_CMD=\\"\\"; ${vendorCheck} elif command -v codeledger`;
|
|
145
|
+
if (content.includes(oldInit)) {
|
|
146
|
+
content = content.replace(new RegExp(escapeRegex(oldInit), 'g'), newInit);
|
|
147
|
+
writeFileSync(hooksPath, content);
|
|
148
|
+
console.log(` Hooks: added vendored CLI as first resolution fallback`);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
console.log(` Hooks: could not find resolution preamble — update manually`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function escapeRegex(s) {
|
|
155
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=vendor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor.js","sourceRoot":"","sources":["../../src/commands/vendor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codeledger verify --task "..." [--policy-root <dir>] [--artifacts-dir <dir>]`
|
|
3
|
+
*
|
|
4
|
+
* CI enforcement bridge: build bundle → compute confidence/drift → resolve policy
|
|
5
|
+
* → evaluate violations → emit report + manifest + policy snapshot.
|
|
6
|
+
*
|
|
7
|
+
* Exit codes:
|
|
8
|
+
* 0 = pass (or observe/warn mode with violations)
|
|
9
|
+
* 1 = policy fail (block mode + violations)
|
|
10
|
+
* 2 = internal error
|
|
11
|
+
*/
|
|
12
|
+
export declare function runVerify(cwd: string, flags: Record<string, string>): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AA8BA;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CA6Mf"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { readFileSync, existsSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import { buildBundleViaEngine } from '@codeledger/core-engine';
|
|
5
|
+
import { buildRepoIndex } from '@codeledger/repo';
|
|
6
|
+
import { intentHash as computeIntentHash, intentNorm as norm, intentNormArr as normArr, } from '@codeledger/selector';
|
|
7
|
+
import { buildManifest } from '../manifest/build.js';
|
|
8
|
+
import { writeManifest } from '../manifest/write.js';
|
|
9
|
+
import { resolvePolicy } from '../policy/resolve.js';
|
|
10
|
+
import { evaluatePolicy } from '../verify/evaluate.js';
|
|
11
|
+
import { buildVerifyReport } from '../verify/report.js';
|
|
12
|
+
import { writePolicySnapshot } from '../verify/policy-snapshot.js';
|
|
13
|
+
import { canonicalize } from '../signing/canonicalize.js';
|
|
14
|
+
import { createHmacSigner } from '../signing/hmac.js';
|
|
15
|
+
import { buildChecksSummary } from '../artifacts/summary.js';
|
|
16
|
+
import { isGitHubActions, emitAnnotations, writeStepSummary } from '../integrations/github-actions.js';
|
|
17
|
+
import { CLI_VERSION } from '../version.js';
|
|
18
|
+
/**
|
|
19
|
+
* `codeledger verify --task "..." [--policy-root <dir>] [--artifacts-dir <dir>]`
|
|
20
|
+
*
|
|
21
|
+
* CI enforcement bridge: build bundle → compute confidence/drift → resolve policy
|
|
22
|
+
* → evaluate violations → emit report + manifest + policy snapshot.
|
|
23
|
+
*
|
|
24
|
+
* Exit codes:
|
|
25
|
+
* 0 = pass (or observe/warn mode with violations)
|
|
26
|
+
* 1 = policy fail (block mode + violations)
|
|
27
|
+
* 2 = internal error
|
|
28
|
+
*/
|
|
29
|
+
export async function runVerify(cwd, flags) {
|
|
30
|
+
const task = flags['task'];
|
|
31
|
+
if (!task) {
|
|
32
|
+
console.error('--task is required. Usage: codeledger verify --task "your task description" [--policy-root <dir>]');
|
|
33
|
+
process.exit(2);
|
|
34
|
+
}
|
|
35
|
+
// Validate git repo
|
|
36
|
+
if (!existsSync(join(cwd, '.git'))) {
|
|
37
|
+
console.error('Not a git repository. codeledger verify requires a git repo.');
|
|
38
|
+
process.exit(2);
|
|
39
|
+
}
|
|
40
|
+
// Load config
|
|
41
|
+
const configPath = join(cwd, '.codeledger', 'config.json');
|
|
42
|
+
if (!existsSync(configPath)) {
|
|
43
|
+
console.error('No .codeledger/config.json found. Run "codeledger init" first.');
|
|
44
|
+
process.exit(2);
|
|
45
|
+
}
|
|
46
|
+
let config;
|
|
47
|
+
try {
|
|
48
|
+
config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
console.error('Failed to parse .codeledger/config.json. Check for syntax errors.');
|
|
52
|
+
process.exit(2);
|
|
53
|
+
}
|
|
54
|
+
// Resolve policy (may throw on malformed JSON → exit 2)
|
|
55
|
+
let policy;
|
|
56
|
+
try {
|
|
57
|
+
policy = resolvePolicy({
|
|
58
|
+
cwd,
|
|
59
|
+
policyRoot: flags['policy-root'],
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
console.error(err.message);
|
|
64
|
+
process.exit(2);
|
|
65
|
+
}
|
|
66
|
+
// Ensure repo index
|
|
67
|
+
const indexPath = join(cwd, config.workspace.cache_dir, 'repo-index.json');
|
|
68
|
+
if (!existsSync(indexPath)) {
|
|
69
|
+
buildRepoIndex({
|
|
70
|
+
root: cwd,
|
|
71
|
+
repoConfig: config.repo,
|
|
72
|
+
outputPath: indexPath,
|
|
73
|
+
log: () => { },
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
let repoIndex;
|
|
77
|
+
try {
|
|
78
|
+
repoIndex = JSON.parse(readFileSync(indexPath, 'utf-8'));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
console.error('Failed to parse repo index. Try running "codeledger scan" to rebuild it.');
|
|
82
|
+
process.exit(2);
|
|
83
|
+
}
|
|
84
|
+
// Build bundle using existing engine
|
|
85
|
+
let bundle;
|
|
86
|
+
try {
|
|
87
|
+
bundle = await buildBundleViaEngine({
|
|
88
|
+
taskText: task,
|
|
89
|
+
repoIndex,
|
|
90
|
+
selectorConfig: config.selector,
|
|
91
|
+
budget: config.selector.default_budget,
|
|
92
|
+
explain: false,
|
|
93
|
+
indexPath,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
console.error(`Bundle engine error: ${err.message}`);
|
|
98
|
+
process.exit(2);
|
|
99
|
+
}
|
|
100
|
+
// Compute intent hash
|
|
101
|
+
const contract = {
|
|
102
|
+
version: 1,
|
|
103
|
+
objective: task,
|
|
104
|
+
deliverable: null,
|
|
105
|
+
scope_in: [],
|
|
106
|
+
scope_out: [],
|
|
107
|
+
constraints: [],
|
|
108
|
+
acceptance_criteria: [],
|
|
109
|
+
risk_flags: [],
|
|
110
|
+
repo_paths_in_scope: [],
|
|
111
|
+
timestamp: '',
|
|
112
|
+
};
|
|
113
|
+
const intentHashValue = computeIntentHash(contract);
|
|
114
|
+
const normalizedIntent = {
|
|
115
|
+
acceptance_criteria: normArr(contract.acceptance_criteria),
|
|
116
|
+
constraints: normArr(contract.constraints),
|
|
117
|
+
deliverable: contract.deliverable ? norm(contract.deliverable) : null,
|
|
118
|
+
objective: norm(contract.objective),
|
|
119
|
+
repo_paths_in_scope: normArr(contract.repo_paths_in_scope),
|
|
120
|
+
risk_flags: normArr(contract.risk_flags),
|
|
121
|
+
scope_in: normArr(contract.scope_in),
|
|
122
|
+
scope_out: normArr(contract.scope_out),
|
|
123
|
+
version: contract.version,
|
|
124
|
+
};
|
|
125
|
+
// Determine artifacts directory
|
|
126
|
+
const commitSha = getCommitSha(cwd);
|
|
127
|
+
const artifactsBase = flags['artifacts-dir'] ?? join(cwd, '.codeledger', 'artifacts');
|
|
128
|
+
const sha = commitSha ?? 'unknown';
|
|
129
|
+
const artifactsDir = join(artifactsBase, sha);
|
|
130
|
+
mkdirSync(artifactsDir, { recursive: true });
|
|
131
|
+
// Compute drift from previous manifest (if exists)
|
|
132
|
+
const driftScore = computeDriftFromBaseline(artifactsBase, intentHashValue);
|
|
133
|
+
// Build manifest (Phase 1 — unchanged, no policy fields)
|
|
134
|
+
const repoName = getRepoName(cwd);
|
|
135
|
+
const manifest = buildManifest({
|
|
136
|
+
bundle,
|
|
137
|
+
repoRoot: cwd,
|
|
138
|
+
repoName,
|
|
139
|
+
commitSha,
|
|
140
|
+
codeledgerVersion: CLI_VERSION,
|
|
141
|
+
intentNormalized: normalizedIntent,
|
|
142
|
+
intentHash: intentHashValue,
|
|
143
|
+
driftScore,
|
|
144
|
+
});
|
|
145
|
+
// Load optional coverage attestation
|
|
146
|
+
let coverageAttestation;
|
|
147
|
+
const coverageAttestationPath = flags['coverage-attestation'];
|
|
148
|
+
if (coverageAttestationPath && existsSync(coverageAttestationPath)) {
|
|
149
|
+
try {
|
|
150
|
+
coverageAttestation = JSON.parse(readFileSync(coverageAttestationPath, 'utf-8'));
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
console.error(`Warning: Failed to parse coverage attestation at ${coverageAttestationPath}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Evaluate policy violations
|
|
157
|
+
const violations = evaluatePolicy(manifest, policy, coverageAttestation);
|
|
158
|
+
// Build verify report
|
|
159
|
+
const report = buildVerifyReport({
|
|
160
|
+
manifest,
|
|
161
|
+
policy,
|
|
162
|
+
violations,
|
|
163
|
+
codeledgerVersion: CLI_VERSION,
|
|
164
|
+
});
|
|
165
|
+
// Write all artifacts
|
|
166
|
+
const manifestPath = join(artifactsDir, 'context-manifest.json');
|
|
167
|
+
writeManifest(manifest, manifestPath);
|
|
168
|
+
const reportPath = join(artifactsDir, 'verify-report.json');
|
|
169
|
+
writeFileSync(reportPath, JSON.stringify(report, null, 2) + '\n');
|
|
170
|
+
const snapshotPath = join(artifactsDir, 'policy-snapshot.json');
|
|
171
|
+
writePolicySnapshot(policy, snapshotPath);
|
|
172
|
+
// Optionally sign manifest if secret is present
|
|
173
|
+
const secret = process.env['CODELEDGER_SIGNING_SECRET'];
|
|
174
|
+
if (secret) {
|
|
175
|
+
const signedPath = join(artifactsDir, 'signed-context-manifest.json');
|
|
176
|
+
const canonical = canonicalize(manifest);
|
|
177
|
+
const signer = createHmacSigner(secret);
|
|
178
|
+
const signatureValue = await signer.sign(Buffer.from(canonical, 'utf-8'));
|
|
179
|
+
const signed = {
|
|
180
|
+
schema_version: 'mustang/signed-manifest/v1',
|
|
181
|
+
payload: manifest,
|
|
182
|
+
signature: {
|
|
183
|
+
alg: signer.alg,
|
|
184
|
+
value: signatureValue,
|
|
185
|
+
key_id: signer.keyId,
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
writeFileSync(signedPath, JSON.stringify(signed, null, 2) + '\n');
|
|
189
|
+
}
|
|
190
|
+
// Write checks-summary.txt (Phase 5)
|
|
191
|
+
const summaryText = buildChecksSummary(report);
|
|
192
|
+
writeFileSync(join(artifactsDir, 'checks-summary.txt'), summaryText);
|
|
193
|
+
// GitHub Actions annotations (Phase 5)
|
|
194
|
+
if (isGitHubActions()) {
|
|
195
|
+
if (violations.length > 0) {
|
|
196
|
+
emitAnnotations(report);
|
|
197
|
+
}
|
|
198
|
+
writeStepSummary(report, summaryText);
|
|
199
|
+
}
|
|
200
|
+
// Mode-specific output
|
|
201
|
+
if (policy.mode === 'warn' && violations.length > 0) {
|
|
202
|
+
for (const v of violations) {
|
|
203
|
+
console.error(`Warning: [${v.code}] ${v.message}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Summary
|
|
207
|
+
const status = report.decision.passed ? 'PASS' : 'FAIL';
|
|
208
|
+
console.log(`Verify: ${status} (${policy.mode} mode, ${violations.length} violation(s))`);
|
|
209
|
+
console.log(`Artifacts: ${artifactsDir}`);
|
|
210
|
+
// Exit code based on mode
|
|
211
|
+
if (!report.decision.passed) {
|
|
212
|
+
process.exit(1);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function getRepoName(cwd) {
|
|
216
|
+
try {
|
|
217
|
+
const url = execSync('git remote get-url origin', {
|
|
218
|
+
cwd,
|
|
219
|
+
encoding: 'utf-8',
|
|
220
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
221
|
+
}).trim();
|
|
222
|
+
const parts = url.replace(/\.git$/, '').split('/');
|
|
223
|
+
return parts[parts.length - 1] ?? 'unknown';
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
const parts = cwd.replace(/\/$/, '').split('/');
|
|
227
|
+
return parts[parts.length - 1] ?? 'unknown';
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function getCommitSha(cwd) {
|
|
231
|
+
try {
|
|
232
|
+
return execSync('git rev-parse HEAD', {
|
|
233
|
+
cwd,
|
|
234
|
+
encoding: 'utf-8',
|
|
235
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
236
|
+
}).trim();
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Compute drift from the most recent baseline manifest in the artifacts directory.
|
|
244
|
+
* If no previous manifest exists, drift is 0.0 (first run).
|
|
245
|
+
*/
|
|
246
|
+
function computeDriftFromBaseline(artifactsBase, currentIntentHash) {
|
|
247
|
+
if (!existsSync(artifactsBase))
|
|
248
|
+
return 0.0;
|
|
249
|
+
// Walk artifact subdirectories to find the most recent context-manifest.json
|
|
250
|
+
// (by directory name, which is a commit sha)
|
|
251
|
+
try {
|
|
252
|
+
const { readdirSync, statSync } = require('node:fs');
|
|
253
|
+
const entries = readdirSync(artifactsBase);
|
|
254
|
+
let latestManifest = null;
|
|
255
|
+
let latestMtime = 0;
|
|
256
|
+
for (const entry of entries) {
|
|
257
|
+
const manifestPath = join(artifactsBase, entry, 'context-manifest.json');
|
|
258
|
+
if (existsSync(manifestPath)) {
|
|
259
|
+
const mtime = statSync(manifestPath).mtimeMs;
|
|
260
|
+
if (mtime > latestMtime) {
|
|
261
|
+
try {
|
|
262
|
+
const content = readFileSync(manifestPath, 'utf-8');
|
|
263
|
+
const parsed = JSON.parse(content);
|
|
264
|
+
if (parsed.intent?.intent_hash) {
|
|
265
|
+
latestManifest = parsed;
|
|
266
|
+
latestMtime = mtime;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
// Skip malformed files
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (!latestManifest)
|
|
276
|
+
return 0.0;
|
|
277
|
+
if (latestManifest.intent.intent_hash === currentIntentHash)
|
|
278
|
+
return 0.0;
|
|
279
|
+
// Different intent hash — basic drift detection
|
|
280
|
+
// Full drift would require the original TaskContractV1; for CI we use a
|
|
281
|
+
// simple binary: same hash = 0, different hash = a moderate drift signal
|
|
282
|
+
return 0.3;
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return 0.0;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAsCA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBhE"}
|