@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,86 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import { SAFE_DEFAULTS, mergePolicy, toResolved } from './schema.js';
|
|
5
|
+
import { loadOrgDefault, loadRepoOverride } from './load.js';
|
|
6
|
+
/**
|
|
7
|
+
* Resolve the effective policy through the cascade:
|
|
8
|
+
* 1. Hard-coded safe defaults
|
|
9
|
+
* 2. Org default (org/default.json) — deep merge
|
|
10
|
+
* 3. Repo override (repos/<name>.json) — deep merge
|
|
11
|
+
*
|
|
12
|
+
* Policy root resolution order:
|
|
13
|
+
* --policy-root flag > CODELEDGER_POLICY_PATH env > .codeledger/policy/ > safe defaults
|
|
14
|
+
*/
|
|
15
|
+
export function resolvePolicy(opts) {
|
|
16
|
+
const { cwd } = opts;
|
|
17
|
+
// Determine policy root directory
|
|
18
|
+
const policyRoot = determinePolicyRoot(opts);
|
|
19
|
+
// If no policy root found, return safe defaults
|
|
20
|
+
if (!policyRoot) {
|
|
21
|
+
return toResolved(SAFE_DEFAULTS, 'hardcoded-defaults');
|
|
22
|
+
}
|
|
23
|
+
// Layer 1: start from safe defaults
|
|
24
|
+
let policy = { ...SAFE_DEFAULTS };
|
|
25
|
+
let source = 'hardcoded-defaults';
|
|
26
|
+
// Layer 2: org default
|
|
27
|
+
const orgDefault = loadOrgDefault(policyRoot);
|
|
28
|
+
if (orgDefault) {
|
|
29
|
+
policy = mergePolicy(policy, orgDefault);
|
|
30
|
+
source = 'org-default';
|
|
31
|
+
}
|
|
32
|
+
// Layer 3: repo override
|
|
33
|
+
const repoName = getRepoName(cwd);
|
|
34
|
+
const repoOverride = loadRepoOverride(policyRoot, repoName);
|
|
35
|
+
if (repoOverride) {
|
|
36
|
+
policy = mergePolicy(policy, repoOverride);
|
|
37
|
+
source = 'repo-override';
|
|
38
|
+
}
|
|
39
|
+
return toResolved(policy, source);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Determine the policy root directory from the cascade:
|
|
43
|
+
* --policy-root > CODELEDGER_POLICY_PATH env > .codeledger/policy/
|
|
44
|
+
*/
|
|
45
|
+
function determinePolicyRoot(opts) {
|
|
46
|
+
// Highest precedence: explicit flag
|
|
47
|
+
if (opts.policyRoot) {
|
|
48
|
+
if (!existsSync(opts.policyRoot))
|
|
49
|
+
return null;
|
|
50
|
+
return opts.policyRoot;
|
|
51
|
+
}
|
|
52
|
+
// Second: env var
|
|
53
|
+
const envPath = process.env['CODELEDGER_POLICY_PATH'];
|
|
54
|
+
if (envPath) {
|
|
55
|
+
if (!existsSync(envPath))
|
|
56
|
+
return null;
|
|
57
|
+
return envPath;
|
|
58
|
+
}
|
|
59
|
+
// Third: default location
|
|
60
|
+
const defaultPath = join(opts.cwd, '.codeledger', 'policy');
|
|
61
|
+
if (existsSync(defaultPath))
|
|
62
|
+
return defaultPath;
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get the repo name from git origin remote URL.
|
|
67
|
+
* Falls back to working directory name if no origin remote.
|
|
68
|
+
*/
|
|
69
|
+
function getRepoName(cwd) {
|
|
70
|
+
try {
|
|
71
|
+
const url = execSync('git remote get-url origin', {
|
|
72
|
+
cwd,
|
|
73
|
+
encoding: 'utf-8',
|
|
74
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
75
|
+
}).trim();
|
|
76
|
+
// Extract last path component, strip .git suffix
|
|
77
|
+
const parts = url.replace(/\.git$/, '').split('/');
|
|
78
|
+
return parts[parts.length - 1] ?? 'unknown';
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// No origin remote — use directory name
|
|
82
|
+
const parts = cwd.replace(/\/$/, '').split('/');
|
|
83
|
+
return parts[parts.length - 1] ?? 'unknown';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/policy/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { MustangPolicyV1, ResolvedPolicyV1 } from '@codeledger/types';
|
|
2
|
+
export declare const POLICY_SCHEMA_VERSION: "mustang/policy/v1";
|
|
3
|
+
/**
|
|
4
|
+
* Hard-coded safe defaults. When no policy files exist, this is the effective
|
|
5
|
+
* policy. Observe mode, no enforcement, maximally permissive thresholds.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SAFE_DEFAULTS: MustangPolicyV1;
|
|
8
|
+
/**
|
|
9
|
+
* Validate a parsed policy object. Returns an error message string if invalid,
|
|
10
|
+
* or null if valid.
|
|
11
|
+
*/
|
|
12
|
+
export declare function validatePolicy(obj: unknown): string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Deep-merge a partial policy onto a base policy. Override wins for set fields.
|
|
15
|
+
* Arrays replace (not concatenate) — deny_paths in override replaces base.
|
|
16
|
+
*/
|
|
17
|
+
export declare function mergePolicy(base: MustangPolicyV1, override: Partial<MustangPolicyV1>): MustangPolicyV1;
|
|
18
|
+
/**
|
|
19
|
+
* Convert a MustangPolicyV1 to a ResolvedPolicyV1 with provenance.
|
|
20
|
+
*/
|
|
21
|
+
export declare function toResolved(policy: MustangPolicyV1, resolvedFrom: ResolvedPolicyV1['resolved_from']): ResolvedPolicyV1;
|
|
22
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/policy/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAc,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEvF,eAAO,MAAM,qBAAqB,EAAG,mBAA4B,CAAC;AAElE;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,eAW3B,CAAC;AAKF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAqC1D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAetG;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,gBAAgB,CAAC,eAAe,CAAC,GAC9C,gBAAgB,CAElB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export const POLICY_SCHEMA_VERSION = 'mustang/policy/v1';
|
|
2
|
+
/**
|
|
3
|
+
* Hard-coded safe defaults. When no policy files exist, this is the effective
|
|
4
|
+
* policy. Observe mode, no enforcement, maximally permissive thresholds.
|
|
5
|
+
*/
|
|
6
|
+
export const SAFE_DEFAULTS = {
|
|
7
|
+
schema_version: POLICY_SCHEMA_VERSION,
|
|
8
|
+
mode: 'observe',
|
|
9
|
+
min_confidence: 0.0,
|
|
10
|
+
max_drift: 1.0,
|
|
11
|
+
require_tests: false,
|
|
12
|
+
deny_paths: [],
|
|
13
|
+
bundle_max_files: 500,
|
|
14
|
+
bundle_max_bytes: 5_000_000,
|
|
15
|
+
redact_actor_identity: true,
|
|
16
|
+
store_file_paths: true,
|
|
17
|
+
};
|
|
18
|
+
/** All valid policy modes. */
|
|
19
|
+
const VALID_MODES = new Set(['observe', 'warn', 'block']);
|
|
20
|
+
/**
|
|
21
|
+
* Validate a parsed policy object. Returns an error message string if invalid,
|
|
22
|
+
* or null if valid.
|
|
23
|
+
*/
|
|
24
|
+
export function validatePolicy(obj) {
|
|
25
|
+
if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
|
|
26
|
+
return 'Policy must be a JSON object';
|
|
27
|
+
}
|
|
28
|
+
const policy = obj;
|
|
29
|
+
if (policy['mode'] !== undefined) {
|
|
30
|
+
if (typeof policy['mode'] !== 'string' || !VALID_MODES.has(policy['mode'])) {
|
|
31
|
+
return `Invalid policy mode: "${policy['mode']}". Must be one of: observe, warn, block`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (policy['min_confidence'] !== undefined) {
|
|
35
|
+
if (typeof policy['min_confidence'] !== 'number' || policy['min_confidence'] < 0 || policy['min_confidence'] > 1) {
|
|
36
|
+
return 'min_confidence must be a number between 0 and 1';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (policy['max_drift'] !== undefined) {
|
|
40
|
+
if (typeof policy['max_drift'] !== 'number' || policy['max_drift'] < 0 || policy['max_drift'] > 1) {
|
|
41
|
+
return 'max_drift must be a number between 0 and 1';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (policy['deny_paths'] !== undefined) {
|
|
45
|
+
if (!Array.isArray(policy['deny_paths'])) {
|
|
46
|
+
return 'deny_paths must be an array of strings';
|
|
47
|
+
}
|
|
48
|
+
for (const p of policy['deny_paths']) {
|
|
49
|
+
if (typeof p !== 'string') {
|
|
50
|
+
return 'deny_paths entries must be strings';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Deep-merge a partial policy onto a base policy. Override wins for set fields.
|
|
58
|
+
* Arrays replace (not concatenate) — deny_paths in override replaces base.
|
|
59
|
+
*/
|
|
60
|
+
export function mergePolicy(base, override) {
|
|
61
|
+
return {
|
|
62
|
+
schema_version: POLICY_SCHEMA_VERSION,
|
|
63
|
+
mode: (override.mode ?? base.mode),
|
|
64
|
+
min_confidence: override.min_confidence ?? base.min_confidence,
|
|
65
|
+
max_drift: override.max_drift ?? base.max_drift,
|
|
66
|
+
require_tests: override.require_tests ?? base.require_tests,
|
|
67
|
+
deny_paths: override.deny_paths ?? base.deny_paths,
|
|
68
|
+
bundle_max_files: override.bundle_max_files ?? base.bundle_max_files,
|
|
69
|
+
bundle_max_bytes: override.bundle_max_bytes ?? base.bundle_max_bytes,
|
|
70
|
+
redact_actor_identity: override.redact_actor_identity ?? base.redact_actor_identity,
|
|
71
|
+
store_file_paths: override.store_file_paths ?? base.store_file_paths,
|
|
72
|
+
min_review_coverage: override.min_review_coverage ?? base.min_review_coverage,
|
|
73
|
+
block_post_hoc_reads: override.block_post_hoc_reads ?? base.block_post_hoc_reads,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Convert a MustangPolicyV1 to a ResolvedPolicyV1 with provenance.
|
|
78
|
+
*/
|
|
79
|
+
export function toResolved(policy, resolvedFrom) {
|
|
80
|
+
return { ...policy, resolved_from: resolvedFrom };
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/policy/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/session-paths.d.ts
CHANGED
|
@@ -22,4 +22,10 @@ export declare function legacyBundlePath(cwd: string): string;
|
|
|
22
22
|
export declare function sessionsRootDir(cwd: string): string;
|
|
23
23
|
/** Registry file path. */
|
|
24
24
|
export declare function registryPath(cwd: string): string;
|
|
25
|
+
/** Path to the read log (JSONL, one record per file read). */
|
|
26
|
+
export declare function sessionReadLogPath(cwd: string, sessionId: SessionId | null): string;
|
|
27
|
+
/** Path to the review config (written when --mode review is used). */
|
|
28
|
+
export declare function sessionReviewConfigPath(cwd: string, sessionId: SessionId | null): string;
|
|
29
|
+
/** Path to the coverage report checkpoint (written by gatekeeper). */
|
|
30
|
+
export declare function sessionCoverageReportPath(cwd: string, sessionId: SessionId | null): string;
|
|
25
31
|
//# sourceMappingURL=session-paths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-paths.d.ts","sourceRoot":"","sources":["../src/session-paths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAK3E;AAED,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAElF;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAEnF;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAEhF;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAEpF;AAED,wCAAwC;AACxC,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAExF;AAED,qFAAqF;AACrF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAEvF;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,+BAA+B;AAC/B,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,0BAA0B;AAC1B,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD"}
|
|
1
|
+
{"version":3,"file":"session-paths.d.ts","sourceRoot":"","sources":["../src/session-paths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAK3E;AAED,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAElF;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAEnF;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAEhF;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAEpF;AAED,wCAAwC;AACxC,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAExF;AAED,qFAAqF;AACrF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAEvF;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,+BAA+B;AAC/B,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,0BAA0B;AAC1B,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,8DAA8D;AAC9D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAEnF;AAED,sEAAsE;AACtE,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAExF;AAED,sEAAsE;AACtE,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAE1F"}
|
package/dist/session-paths.js
CHANGED
|
@@ -45,4 +45,16 @@ export function sessionsRootDir(cwd) {
|
|
|
45
45
|
export function registryPath(cwd) {
|
|
46
46
|
return join(cwd, '.codeledger', 'sessions', 'registry.json');
|
|
47
47
|
}
|
|
48
|
+
/** Path to the read log (JSONL, one record per file read). */
|
|
49
|
+
export function sessionReadLogPath(cwd, sessionId) {
|
|
50
|
+
return join(sessionDir(cwd, sessionId), '.read-log.jsonl');
|
|
51
|
+
}
|
|
52
|
+
/** Path to the review config (written when --mode review is used). */
|
|
53
|
+
export function sessionReviewConfigPath(cwd, sessionId) {
|
|
54
|
+
return join(sessionDir(cwd, sessionId), '.review-config.json');
|
|
55
|
+
}
|
|
56
|
+
/** Path to the coverage report checkpoint (written by gatekeeper). */
|
|
57
|
+
export function sessionCoverageReportPath(cwd, sessionId) {
|
|
58
|
+
return join(sessionDir(cwd, sessionId), '.coverage-report.json');
|
|
59
|
+
}
|
|
48
60
|
//# sourceMappingURL=session-paths.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-paths.js","sourceRoot":"","sources":["../src/session-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,SAA2B;IACjE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;AAClC,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,SAA2B;IACxE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAC9D,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,SAA2B;IACzE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,eAAe,CAAC,CAAC;AAC3D,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,SAA2B;IACtE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAChE,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,SAA2B;IAC1E,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAC;AACjE,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,uBAAuB,CAAC,GAAW,EAAE,SAA2B;IAC9E,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC;AAC5D,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,sBAAsB,CAAC,GAAW,EAAE,SAA2B;IAC7E,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAC;AACjE,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC;AACtD,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;AAC/D,CAAC"}
|
|
1
|
+
{"version":3,"file":"session-paths.js","sourceRoot":"","sources":["../src/session-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,SAA2B;IACjE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;AAClC,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,SAA2B;IACxE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAC9D,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,SAA2B;IACzE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,eAAe,CAAC,CAAC;AAC3D,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,SAA2B;IACtE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAChE,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,SAA2B;IAC1E,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAC;AACjE,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,uBAAuB,CAAC,GAAW,EAAE,SAA2B;IAC9E,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC;AAC5D,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,sBAAsB,CAAC,GAAW,EAAE,SAA2B;IAC7E,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAC;AACjE,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC;AACtD,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;AAC/D,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,SAA2B;IACzE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,iBAAiB,CAAC,CAAC;AAC7D,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,uBAAuB,CAAC,GAAW,EAAE,SAA2B;IAC9E,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAC;AACjE,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,yBAAyB,CAAC,GAAW,EAAE,SAA2B;IAChF,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,uBAAuB,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JCS-compatible canonical JSON serialization (RFC 8785).
|
|
3
|
+
*
|
|
4
|
+
* Rules:
|
|
5
|
+
* - Objects: keys sorted lexicographically by Unicode code point
|
|
6
|
+
* - Arrays: preserve element order
|
|
7
|
+
* - Numbers: shortest JSON numeric form (no trailing zeros, no leading +, no NaN/Infinity)
|
|
8
|
+
* - Strings: standard JSON string escaping
|
|
9
|
+
* - No whitespace between tokens
|
|
10
|
+
* - Output is UTF-8
|
|
11
|
+
*
|
|
12
|
+
* This is a standalone, pure function. It will be reimplemented by the
|
|
13
|
+
* ingestion worker (potentially in a different language). The algorithm
|
|
14
|
+
* must be documented and deterministic.
|
|
15
|
+
*/
|
|
16
|
+
export declare function canonicalize(value: unknown): string;
|
|
17
|
+
//# sourceMappingURL=canonicalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonicalize.d.ts","sourceRoot":"","sources":["../../src/signing/canonicalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAqCnD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JCS-compatible canonical JSON serialization (RFC 8785).
|
|
3
|
+
*
|
|
4
|
+
* Rules:
|
|
5
|
+
* - Objects: keys sorted lexicographically by Unicode code point
|
|
6
|
+
* - Arrays: preserve element order
|
|
7
|
+
* - Numbers: shortest JSON numeric form (no trailing zeros, no leading +, no NaN/Infinity)
|
|
8
|
+
* - Strings: standard JSON string escaping
|
|
9
|
+
* - No whitespace between tokens
|
|
10
|
+
* - Output is UTF-8
|
|
11
|
+
*
|
|
12
|
+
* This is a standalone, pure function. It will be reimplemented by the
|
|
13
|
+
* ingestion worker (potentially in a different language). The algorithm
|
|
14
|
+
* must be documented and deterministic.
|
|
15
|
+
*/
|
|
16
|
+
export function canonicalize(value) {
|
|
17
|
+
if (value === null)
|
|
18
|
+
return 'null';
|
|
19
|
+
if (value === undefined)
|
|
20
|
+
return 'null';
|
|
21
|
+
switch (typeof value) {
|
|
22
|
+
case 'boolean':
|
|
23
|
+
return value ? 'true' : 'false';
|
|
24
|
+
case 'number': {
|
|
25
|
+
if (!Number.isFinite(value)) {
|
|
26
|
+
throw new Error(`Cannot canonicalize non-finite number: ${value}`);
|
|
27
|
+
}
|
|
28
|
+
// JSON.stringify produces shortest form for finite numbers
|
|
29
|
+
return JSON.stringify(value);
|
|
30
|
+
}
|
|
31
|
+
case 'string':
|
|
32
|
+
return JSON.stringify(value);
|
|
33
|
+
case 'object': {
|
|
34
|
+
if (Array.isArray(value)) {
|
|
35
|
+
const items = value.map((item) => canonicalize(item));
|
|
36
|
+
return '[' + items.join(',') + ']';
|
|
37
|
+
}
|
|
38
|
+
// Object: sort keys lexicographically by Unicode code point
|
|
39
|
+
const obj = value;
|
|
40
|
+
const keys = Object.keys(obj).sort();
|
|
41
|
+
const pairs = keys.map((key) => {
|
|
42
|
+
return JSON.stringify(key) + ':' + canonicalize(obj[key]);
|
|
43
|
+
});
|
|
44
|
+
return '{' + pairs.join(',') + '}';
|
|
45
|
+
}
|
|
46
|
+
default:
|
|
47
|
+
throw new Error(`Cannot canonicalize type: ${typeof value}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=canonicalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonicalize.js","sourceRoot":"","sources":["../../src/signing/canonicalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAEvC,QAAQ,OAAO,KAAK,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAElC,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,EAAE,CAAC,CAAC;YACrE,CAAC;YACD,2DAA2D;YAC3D,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE/B,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtD,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YACrC,CAAC;YAED,4DAA4D;YAC5D,MAAM,GAAG,GAAG,KAAgC,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QACrC,CAAC;QAED;YACE,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ManifestSigner } from './signer.js';
|
|
2
|
+
/**
|
|
3
|
+
* HMAC-SHA256 signer using a shared secret from env var.
|
|
4
|
+
*
|
|
5
|
+
* Signature value is base64-encoded.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createHmacSigner(secret: string): ManifestSigner;
|
|
8
|
+
//# sourceMappingURL=hmac.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmac.d.ts","sourceRoot":"","sources":["../../src/signing/hmac.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAQ/D"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createHmac } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* HMAC-SHA256 signer using a shared secret from env var.
|
|
4
|
+
*
|
|
5
|
+
* Signature value is base64-encoded.
|
|
6
|
+
*/
|
|
7
|
+
export function createHmacSigner(secret) {
|
|
8
|
+
return {
|
|
9
|
+
alg: 'HS256',
|
|
10
|
+
keyId: 'env:CODELEDGER_SIGNING_SECRET',
|
|
11
|
+
async sign(data) {
|
|
12
|
+
return createHmac('sha256', secret).update(data).digest('base64');
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=hmac.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmac.js","sourceRoot":"","sources":["../../src/signing/hmac.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO;QACL,GAAG,EAAE,OAAO;QACZ,KAAK,EAAE,+BAA+B;QACtC,KAAK,CAAC,IAAI,CAAC,IAAY;YACrB,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpE,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract signer interface for manifest signing.
|
|
3
|
+
*
|
|
4
|
+
* Mustang v1 uses HMAC-SHA256 with a shared secret. The interface is
|
|
5
|
+
* abstract to support future KMS-backed signers without changing the
|
|
6
|
+
* signing pipeline.
|
|
7
|
+
*/
|
|
8
|
+
export interface ManifestSigner {
|
|
9
|
+
/** Sign the given data and return a base64-encoded signature. */
|
|
10
|
+
sign(data: Buffer): Promise<string>;
|
|
11
|
+
/** Algorithm identifier (e.g., "HS256" for HMAC-SHA256). */
|
|
12
|
+
alg: string;
|
|
13
|
+
/** Key identifier for provenance (e.g., "env:CODELEDGER_SIGNING_SECRET"). */
|
|
14
|
+
keyId: string;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/signing/signer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC;IACZ,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/signing/signer.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wBAAgB,eAAe,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wBAAgB,eAAe,IAAI,MAAM,CA2JxC"}
|
|
@@ -13,6 +13,23 @@ export function claudeMdSection() {
|
|
|
13
13
|
'This repo uses [CodeLedger](https://github.com/codeledgerECF/codeledger-blackbox) for deterministic context selection.',
|
|
14
14
|
'CodeLedger is a **real CLI tool** installed in this repo — not a prompt technique or convention.',
|
|
15
15
|
'',
|
|
16
|
+
'### Rule 0: Activate Before Every Task',
|
|
17
|
+
'',
|
|
18
|
+
'Before starting ANY task — code review, bug fix, refactor, feature, documentation — **always run `codeledger activate` first.**',
|
|
19
|
+
'This is the single most important rule. CodeLedger selects the most relevant files for the task so you start with the right context.',
|
|
20
|
+
'',
|
|
21
|
+
'**When suggesting a task to the user**, always include the activate command:',
|
|
22
|
+
'',
|
|
23
|
+
'> "I\'ll start by running `codeledger activate --task "staged code review"` to select the most relevant files, then proceed with the review."',
|
|
24
|
+
'',
|
|
25
|
+
'**When the user confirms a task**, run activate immediately:',
|
|
26
|
+
'',
|
|
27
|
+
'```bash',
|
|
28
|
+
'npx codeledger activate --task "one-line description of the task"',
|
|
29
|
+
'```',
|
|
30
|
+
'',
|
|
31
|
+
'Then read `.codeledger/active-bundle.md` to see which files were selected.',
|
|
32
|
+
'',
|
|
16
33
|
'### Rule 1: ALWAYS Execute via Shell',
|
|
17
34
|
'',
|
|
18
35
|
'Every `codeledger` command **must** be executed in a real shell (Bash tool, terminal, subprocess).',
|
|
@@ -36,20 +53,60 @@ export function claudeMdSection() {
|
|
|
36
53
|
'2. Do NOT proceed as if the command succeeded',
|
|
37
54
|
'3. Suggest `npx codeledger init` if the error mentions missing config',
|
|
38
55
|
'',
|
|
56
|
+
'### Rule 3: Re-Engage Between Stages',
|
|
57
|
+
'',
|
|
58
|
+
'For multi-step tasks (staged code reviews, multi-file refactors, feature + tests, etc.),',
|
|
59
|
+
'**do not let CodeLedger go silent after the initial activate.** Re-engage between stages:',
|
|
60
|
+
'',
|
|
61
|
+
'| When | What to run |',
|
|
62
|
+
'|------|-------------|',
|
|
63
|
+
'| After completing a stage/phase | `npx codeledger progress-check` — see bundle coverage + suggestions |',
|
|
64
|
+
'| When you discover new context | `npx codeledger refine --learned "discovered X depends on Y"` — re-score the bundle |',
|
|
65
|
+
'| When moving to a different phase | `npx codeledger refine --learned "completed error handling, now reviewing performance"` |',
|
|
66
|
+
'| When most reads are off-bundle | `npx codeledger refine --learned "task shifted to X" --add-keywords "keyword1,keyword2"` |',
|
|
67
|
+
'| Mid-review (review mode) | `npx codeledger review-coverage` — check which required files are still unread |',
|
|
68
|
+
'',
|
|
69
|
+
'The `progress-check` command is lightweight and designed for mid-session use. It shows:',
|
|
70
|
+
'- How many bundle files you\'ve read vs not',
|
|
71
|
+
'- Off-bundle file hotspots',
|
|
72
|
+
'- Actionable next steps',
|
|
73
|
+
'',
|
|
74
|
+
'**Example multi-stage pattern:**',
|
|
75
|
+
'```',
|
|
76
|
+
'1. codeledger activate --task "staged code review"',
|
|
77
|
+
'2. ... complete Stage 1 (error handling) ...',
|
|
78
|
+
'3. codeledger progress-check',
|
|
79
|
+
'4. codeledger refine --learned "error handling solid, jitter issue found in retries"',
|
|
80
|
+
'5. ... complete Stage 2 (testing) ...',
|
|
81
|
+
'6. codeledger progress-check',
|
|
82
|
+
'7. ... continue through remaining stages ...',
|
|
83
|
+
'8. codeledger session-summary (auto-runs on session end)',
|
|
84
|
+
'```',
|
|
85
|
+
'',
|
|
39
86
|
'### Available Commands',
|
|
40
87
|
'',
|
|
41
88
|
'| Command | What It Does |',
|
|
42
89
|
'|---------|-------------|',
|
|
43
|
-
'| `npx codeledger
|
|
90
|
+
'| `npx codeledger init [--force]` | Initialize CodeLedger in a repo (creates `.codeledger/`, config, hooks) |',
|
|
44
91
|
'| `npx codeledger scan` | Rebuild the repo index (dependency graph, churn, test map) |',
|
|
92
|
+
'| `npx codeledger activate --task "..."` | Scan repo (if stale), generate context bundle, write `.codeledger/active-bundle.md` |',
|
|
45
93
|
'| `npx codeledger bundle --task "..."` | Generate a context bundle (JSON only, no active-bundle write) |',
|
|
94
|
+
'| `npx codeledger refine --learned "..."` | Re-score bundle mid-session with new context, keywords, or file exclusions |',
|
|
95
|
+
'| `npx codeledger progress-check` | Mid-session check: bundle coverage, off-bundle reads, suggestions |',
|
|
46
96
|
'| `npx codeledger session-progress` | Write a ground-truth session progress snapshot |',
|
|
47
97
|
'| `npx codeledger session-summary` | Show session-end value recap (recall, precision, token savings) |',
|
|
48
|
-
'| `npx codeledger
|
|
98
|
+
'| `npx codeledger review-coverage` | Check review coverage mid-session (review mode) |',
|
|
99
|
+
'| `npx codeledger doctor` | Integration health check (config, hooks, index, ledger) |',
|
|
100
|
+
'| `npx codeledger setup-ci [--mode ...]` | Generate GitHub Actions workflow + policy for CI integration |',
|
|
101
|
+
'| `npx codeledger manifest --task "..."` | Generate deterministic context manifest (evidence payload) |',
|
|
102
|
+
'| `npx codeledger verify --task "..."` | CI enforcement: evaluate policy, emit artifacts, return exit code |',
|
|
103
|
+
'| `npx codeledger intent init\\|show\\|set\\|ack` | Intent governance (deterministic drift detection) |',
|
|
104
|
+
'| `npx codeledger checkpoint create\\|restore\\|list` | Save/restore incremental session checkpoints |',
|
|
105
|
+
'| `npx codeledger vendor` | Vendor standalone CLI into repo for cloud/web environments |',
|
|
49
106
|
'',
|
|
50
107
|
'**Trigger phrases:** If the user asks for a "session summary", "session recap", "codeledger summary", "how did the bundle do", or anything similar — run `npx codeledger session-summary` in your shell. Do not construct the output yourself.',
|
|
51
108
|
'',
|
|
52
|
-
'### Rule
|
|
109
|
+
'### Rule 4: .codeledger/ Is Read-Only to Agents',
|
|
53
110
|
'',
|
|
54
111
|
'All files under `.codeledger/` are managed exclusively by the CLI.',
|
|
55
112
|
'**Never create, edit, or overwrite** any file in `.codeledger/` — not even to "help" or "fix" something.',
|
|
@@ -66,6 +123,7 @@ export function claudeMdSection() {
|
|
|
66
123
|
'CodeLedger hooks (`.claude/hooks.json`) run automatically:',
|
|
67
124
|
'',
|
|
68
125
|
'- **On session start:** warms the repo index and generates an initial bundle',
|
|
126
|
+
'- **After every 10 file reads:** nudges you to run `progress-check` or `refine`',
|
|
69
127
|
'- **On git commit:** shows bundle recall/precision for the current task',
|
|
70
128
|
'- **Before compaction:** saves a progress snapshot you can read after compaction',
|
|
71
129
|
'- **On session end:** shows a final session recap',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,2BAA2B;QAC3B,EAAE;QACF,wHAAwH;QACxH,kGAAkG;QAClG,EAAE;QACF,sCAAsC;QACtC,EAAE;QACF,oGAAoG;QACpG,oCAAoC;QACpC,EAAE;QACF,6CAA6C;QAC7C,4DAA4D;QAC5D,mDAAmD;QACnD,iEAAiE;QACjE,4DAA4D;QAC5D,6DAA6D;QAC7D,EAAE;QACF,0EAA0E;QAC1E,EAAE;QACF,4CAA4C;QAC5C,EAAE;QACF,yEAAyE;QACzE,iEAAiE;QACjE,EAAE;QACF,2CAA2C;QAC3C,+CAA+C;QAC/C,uEAAuE;QACvE,EAAE;QACF,wBAAwB;QACxB,EAAE;QACF,4BAA4B;QAC5B,2BAA2B;QAC3B,kIAAkI;QAClI,wFAAwF;QACxF,
|
|
1
|
+
{"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,2BAA2B;QAC3B,EAAE;QACF,wHAAwH;QACxH,kGAAkG;QAClG,EAAE;QACF,wCAAwC;QACxC,EAAE;QACF,iIAAiI;QACjI,sIAAsI;QACtI,EAAE;QACF,8EAA8E;QAC9E,EAAE;QACF,+IAA+I;QAC/I,EAAE;QACF,8DAA8D;QAC9D,EAAE;QACF,SAAS;QACT,mEAAmE;QACnE,KAAK;QACL,EAAE;QACF,4EAA4E;QAC5E,EAAE;QACF,sCAAsC;QACtC,EAAE;QACF,oGAAoG;QACpG,oCAAoC;QACpC,EAAE;QACF,6CAA6C;QAC7C,4DAA4D;QAC5D,mDAAmD;QACnD,iEAAiE;QACjE,4DAA4D;QAC5D,6DAA6D;QAC7D,EAAE;QACF,0EAA0E;QAC1E,EAAE;QACF,4CAA4C;QAC5C,EAAE;QACF,yEAAyE;QACzE,iEAAiE;QACjE,EAAE;QACF,2CAA2C;QAC3C,+CAA+C;QAC/C,uEAAuE;QACvE,EAAE;QACF,sCAAsC;QACtC,EAAE;QACF,0FAA0F;QAC1F,2FAA2F;QAC3F,EAAE;QACF,wBAAwB;QACxB,wBAAwB;QACxB,0GAA0G;QAC1G,yHAAyH;QACzH,gIAAgI;QAChI,+HAA+H;QAC/H,+GAA+G;QAC/G,EAAE;QACF,yFAAyF;QACzF,6CAA6C;QAC7C,4BAA4B;QAC5B,yBAAyB;QACzB,EAAE;QACF,kCAAkC;QAClC,KAAK;QACL,oDAAoD;QACpD,8CAA8C;QAC9C,8BAA8B;QAC9B,sFAAsF;QACtF,uCAAuC;QACvC,8BAA8B;QAC9B,8CAA8C;QAC9C,2DAA2D;QAC3D,KAAK;QACL,EAAE;QACF,wBAAwB;QACxB,EAAE;QACF,4BAA4B;QAC5B,2BAA2B;QAC3B,+GAA+G;QAC/G,wFAAwF;QACxF,kIAAkI;QAClI,0GAA0G;QAC1G,0HAA0H;QAC1H,yGAAyG;QACzG,wFAAwF;QACxF,wGAAwG;QACxG,wFAAwF;QACxF,uFAAuF;QACvF,2GAA2G;QAC3G,yGAAyG;QACzG,8GAA8G;QAC9G,yGAAyG;QACzG,wGAAwG;QACxG,0FAA0F;QAC1F,EAAE;QACF,gPAAgP;QAChP,EAAE;QACF,iDAAiD;QACjD,EAAE;QACF,oEAAoE;QACpE,0GAA0G;QAC1G,EAAE;QACF,iDAAiD;QACjD,gDAAgD;QAChD,6EAA6E;QAC7E,2EAA2E;QAC3E,wFAAwF;QACxF,+DAA+D;QAC/D,EAAE;QACF,uBAAuB;QACvB,EAAE;QACF,4DAA4D;QAC5D,EAAE;QACF,8EAA8E;QAC9E,iFAAiF;QACjF,yEAAyE;QACzE,kFAAkF;QAClF,mDAAmD;QACnD,EAAE;QACF,gJAAgJ;QAChJ,EAAE;QACF,8BAA8B;QAC9B,EAAE;QACF,6IAA6I;QAC7I,iJAAiJ;QACjJ,EAAE;QACF,uCAAuC;QACvC,EAAE;QACF,SAAS;QACT,yDAAyD;QACzD,KAAK;QACL,EAAE;QACF,6BAA6B;QAC7B,EAAE;QACF,6FAA6F;QAC7F,+EAA+E;QAC/E,0FAA0F;QAC1F,2EAA2E;QAC3E,EAAE;QACF,uDAAuD;QACvD,EAAE;QACF,wBAAwB;QACxB,EAAE;QACF,gDAAgD;QAChD,EAAE;QACF,SAAS;QACT,0BAA0B;QAC1B,KAAK;QACL,EAAE;QACF,8FAA8F;QAC9F,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/templates/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,wBAAgB,aAAa,IAAI,gBAAgB,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/templates/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,wBAAgB,aAAa,IAAI,gBAAgB,CAsHhD"}
|
package/dist/templates/config.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/templates/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE;YACT,OAAO,EAAE,uBAAuB;YAChC,SAAS,EAAE,mBAAmB;YAC9B,aAAa,EAAE,uBAAuB;YACtC,WAAW,EAAE,qBAAqB;YAClC,aAAa,EAAE,uBAAuB;SACvC;QACD,IAAI,EAAE;YACJ,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,OAAO,EAAE;gBACP,kBAAkB;gBAClB,SAAS;gBACT,mCAAmC;gBACnC,iBAAiB;gBACjB,WAAW;gBACX,UAAU;gBACV,SAAS;gBACT,eAAe;gBACf,SAAS;gBACT,UAAU;gBACV,QAAQ;gBACR,WAAW;gBACX,QAAQ;gBACR,SAAS;gBACT,gBAAgB;gBAChB,aAAa;gBACb,gBAAgB;gBAChB,SAAS;gBACT,gBAAgB;gBAChB,kBAAkB;gBAClB,uBAAuB;gBACvB,UAAU;gBACV,aAAa;gBACb,OAAO;gBACP,OAAO;gBACP,MAAM;gBACN,UAAU;gBACV,YAAY;gBACZ,6CAA6C;gBAC7C,mBAAmB;gBACnB,WAAW;gBACX,gBAAgB;gBAChB,cAAc;gBACd,aAAa;gBACb,QAAQ;gBACR,YAAY;aACb;YACD,aAAa,EAAE;gBACb,QAAQ;gBACR,aAAa;gBACb,aAAa;gBACb,iBAAiB;gBACjB,YAAY;gBACZ,SAAS;gBACT,cAAc;gBACd,cAAc;gBACd,kBAAkB;gBAClB,KAAK;gBACL,cAAc;gBACd,cAAc;gBACd,gBAAgB;gBAChB,OAAO;gBACP,kBAAkB;gBAClB,OAAO;gBACP,sBAAsB;gBACtB,sBAAsB;aACvB;YACD,mBAAmB,EAAE,EAAE;SACxB;QACD,QAAQ,EAAE;YACR,OAAO,EAAE;gBACP,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,IAAI;gBAClB,cAAc,EAAE,IAAI;gBACpB,YAAY,EAAE,IAAI;gBAClB,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,IAAI;gBAChB,oBAAoB,EAAE,IAAI;gBAC1B,cAAc,EAAE,IAAI;aACrB;YACD,cAAc,EAAE;gBACd,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,EAAE;aACd;YACD,qBAAqB,EAAE,IAAI;YAC3B,cAAc,EAAE,EAAE;YAClB,gBAAgB,EAAE,CAAC;YACnB,uBAAuB,EAAE,EAAE;YAC3B,2BAA2B,EAAE,GAAG;YAChC,oBAAoB,EAAE,EAAE;SACzB;QACD,SAAS,EAAE;YACT,YAAY,EAAE,gBAAgB;YAC9B,cAAc,EAAE,8BAA8B;SAC/C;QACD,OAAO,EAAE;YACP,eAAe,EAAE,CAAC;YAClB,mBAAmB,EAAE,IAAI;YACzB,kBAAkB,EAAE,GAAG;YACvB,wBAAwB,EAAE,SAAS;SACpC;QACD,SAAS,EAAE;YACT,gBAAgB,EAAE,KAAK;SACxB;QACD,SAAS,EAAE;YACT,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,KAAK;SAClB;KACF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/templates/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE;YACT,OAAO,EAAE,uBAAuB;YAChC,SAAS,EAAE,mBAAmB;YAC9B,aAAa,EAAE,uBAAuB;YACtC,WAAW,EAAE,qBAAqB;YAClC,aAAa,EAAE,uBAAuB;SACvC;QACD,IAAI,EAAE;YACJ,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,OAAO,EAAE;gBACP,kBAAkB;gBAClB,SAAS;gBACT,mCAAmC;gBACnC,iBAAiB;gBACjB,WAAW;gBACX,UAAU;gBACV,SAAS;gBACT,eAAe;gBACf,SAAS;gBACT,UAAU;gBACV,QAAQ;gBACR,WAAW;gBACX,QAAQ;gBACR,SAAS;gBACT,gBAAgB;gBAChB,aAAa;gBACb,gBAAgB;gBAChB,SAAS;gBACT,gBAAgB;gBAChB,kBAAkB;gBAClB,uBAAuB;gBACvB,UAAU;gBACV,aAAa;gBACb,OAAO;gBACP,OAAO;gBACP,MAAM;gBACN,UAAU;gBACV,YAAY;gBACZ,6CAA6C;gBAC7C,mBAAmB;gBACnB,WAAW;gBACX,gBAAgB;gBAChB,cAAc;gBACd,aAAa;gBACb,QAAQ;gBACR,YAAY;aACb;YACD,aAAa,EAAE;gBACb,QAAQ;gBACR,aAAa;gBACb,aAAa;gBACb,iBAAiB;gBACjB,YAAY;gBACZ,SAAS;gBACT,cAAc;gBACd,cAAc;gBACd,kBAAkB;gBAClB,KAAK;gBACL,cAAc;gBACd,cAAc;gBACd,gBAAgB;gBAChB,OAAO;gBACP,kBAAkB;gBAClB,OAAO;gBACP,sBAAsB;gBACtB,sBAAsB;aACvB;YACD,mBAAmB,EAAE,EAAE;SACxB;QACD,QAAQ,EAAE;YACR,OAAO,EAAE;gBACP,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,IAAI;gBAClB,cAAc,EAAE,IAAI;gBACpB,YAAY,EAAE,IAAI;gBAClB,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,IAAI;gBAChB,oBAAoB,EAAE,IAAI;gBAC1B,cAAc,EAAE,IAAI;aACrB;YACD,cAAc,EAAE;gBACd,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,EAAE;aACd;YACD,qBAAqB,EAAE,IAAI;YAC3B,cAAc,EAAE,EAAE;YAClB,gBAAgB,EAAE,CAAC;YACnB,uBAAuB,EAAE,EAAE;YAC3B,2BAA2B,EAAE,GAAG;YAChC,oBAAoB,EAAE,EAAE;SACzB;QACD,SAAS,EAAE;YACT,YAAY,EAAE,gBAAgB;YAC9B,cAAc,EAAE,8BAA8B;SAC/C;QACD,OAAO,EAAE;YACP,eAAe,EAAE,CAAC;YAClB,mBAAmB,EAAE,IAAI;YACzB,kBAAkB,EAAE,GAAG;YACvB,wBAAwB,EAAE,SAAS;SACpC;QACD,SAAS,EAAE;YACT,gBAAgB,EAAE,KAAK;SACxB;QACD,SAAS,EAAE;YACT,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,KAAK;SAClB;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;SACpB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/templates/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE;QACL,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC;QAC3B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;QACzB,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;QAC1B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC;KACpB,CAAC;CACH;AAED,wBAAgB,YAAY,IAAI,WAAW,
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/templates/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE;QACL,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC;QAC3B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;QACzB,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;QAC1B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC;KACpB,CAAC;CACH;AAED,wBAAgB,YAAY,IAAI,WAAW,CAmK1C"}
|
package/dist/templates/hooks.js
CHANGED
|
@@ -17,10 +17,11 @@
|
|
|
17
17
|
* the hook prints a diagnostic message instead of silently breaking.
|
|
18
18
|
*/
|
|
19
19
|
export function defaultHooks() {
|
|
20
|
-
// CLI resolution preamble: checks PATH, local node_modules, then monorepo source
|
|
20
|
+
// CLI resolution preamble: checks vendored bundle, PATH, local node_modules, then monorepo source
|
|
21
21
|
const CL_RESOLVE = [
|
|
22
22
|
'CL_CMD="";',
|
|
23
|
-
'if
|
|
23
|
+
'if [ -f ".codeledger/bin/codeledger-standalone.cjs" ]; then CL_CMD="node .codeledger/bin/codeledger-standalone.cjs";',
|
|
24
|
+
'elif command -v codeledger >/dev/null 2>&1; then CL_CMD="codeledger";',
|
|
24
25
|
'elif [ -x "node_modules/.bin/codeledger" ]; then CL_CMD="node_modules/.bin/codeledger";',
|
|
25
26
|
'elif [ -f "packages/cli/dist/index.js" ]; then CL_CMD="node packages/cli/dist/index.js";',
|
|
26
27
|
'fi;',
|
|
@@ -95,6 +96,38 @@ export function defaultHooks() {
|
|
|
95
96
|
].join(' '),
|
|
96
97
|
timeout: 10000,
|
|
97
98
|
},
|
|
99
|
+
// Periodic nudge after every N file reads — reminds the agent to
|
|
100
|
+
// run progress-check or refine between stages of multi-step tasks.
|
|
101
|
+
{
|
|
102
|
+
type: 'command',
|
|
103
|
+
command: [
|
|
104
|
+
'if [ "$TOOL_NAME" = "Read" ]; then',
|
|
105
|
+
' CL_SID="${CODELEDGER_SESSION:-}";',
|
|
106
|
+
' if [ -z "$CL_SID" ] && [ -n "$$" ]; then',
|
|
107
|
+
' CL_MARKER=".codeledger/.current-session-pid-$PPID";',
|
|
108
|
+
' [ -f "$CL_MARKER" ] && CL_SID=$(cat "$CL_MARKER" 2>/dev/null);',
|
|
109
|
+
' fi;',
|
|
110
|
+
' if [ -n "$CL_SID" ]; then',
|
|
111
|
+
' LOGDIR=".codeledger/sessions/$CL_SID";',
|
|
112
|
+
' else',
|
|
113
|
+
' LOGDIR=".codeledger";',
|
|
114
|
+
' fi;',
|
|
115
|
+
' LOGFILE="$LOGDIR/.read-log.jsonl";',
|
|
116
|
+
' NUDGE_MARKER="$LOGDIR/.last-nudge-count";',
|
|
117
|
+
' NUDGE_INTERVAL=10;',
|
|
118
|
+
' if [ -f "$LOGFILE" ]; then',
|
|
119
|
+
' TOTAL=$(wc -l < "$LOGFILE" 2>/dev/null | tr -d " ");',
|
|
120
|
+
' LAST_NUDGE=$(cat "$NUDGE_MARKER" 2>/dev/null || echo 0);',
|
|
121
|
+
' SINCE=$((TOTAL - LAST_NUDGE));',
|
|
122
|
+
' if [ "$SINCE" -ge "$NUDGE_INTERVAL" ]; then',
|
|
123
|
+
' echo "$TOTAL" > "$NUDGE_MARKER";',
|
|
124
|
+
' echo "CodeLedger: $TOTAL files read this session. Run codeledger progress-check to see bundle coverage, or codeledger refine --learned \\"...\\" to re-score.";',
|
|
125
|
+
' fi;',
|
|
126
|
+
' fi;',
|
|
127
|
+
'fi',
|
|
128
|
+
].join(' '),
|
|
129
|
+
timeout: 3000,
|
|
130
|
+
},
|
|
98
131
|
],
|
|
99
132
|
PreCompact: [
|
|
100
133
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/templates/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAkBH,MAAM,UAAU,YAAY;IAC1B,
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/templates/hooks.ts"],"names":[],"mappings":"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"}
|