@codeledger/codeledger-ci 0.7.8
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/LICENSE +27 -0
- package/dist/commentRenderer.d.ts +2 -0
- package/dist/commentRenderer.d.ts.map +1 -0
- package/dist/commentRenderer.js +58 -0
- package/dist/commentRenderer.js.map +1 -0
- package/dist/githubOutput.d.ts +2 -0
- package/dist/githubOutput.d.ts.map +1 -0
- package/dist/githubOutput.js +7 -0
- package/dist/githubOutput.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/prCheck.d.ts +12 -0
- package/dist/prCheck.d.ts.map +1 -0
- package/dist/prCheck.js +288 -0
- package/dist/prCheck.js.map +1 -0
- package/dist/riskSummary.d.ts +7 -0
- package/dist/riskSummary.d.ts.map +1 -0
- package/dist/riskSummary.js +12 -0
- package/dist/riskSummary.js.map +1 -0
- package/package.json +38 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Intelligent Context AI, Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
Note: This license applies to the CLI wrapper, types, repository scanning,
|
|
26
|
+
instrumentation, harness, and report packages (the "Plugin"). The scoring
|
|
27
|
+
engine (packages/core-engine/bin/) is licensed separately under LICENSE-CORE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commentRenderer.d.ts","sourceRoot":"","sources":["../src/commentRenderer.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA8DvE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export function renderPRComment(result) {
|
|
2
|
+
const summary = String(result['summary'] ?? 'No summary available.');
|
|
3
|
+
const mode = String(result['mode'] ?? 'observe');
|
|
4
|
+
const status = String(result['status'] ?? 'WARN');
|
|
5
|
+
const scopeAdherence = typeof result['scope_adherence'] === 'number'
|
|
6
|
+
? `${Math.round(result['scope_adherence'] * 100)}%`
|
|
7
|
+
: 'n/a';
|
|
8
|
+
const risks = Array.isArray(result['risks']) ? result['risks'] : [];
|
|
9
|
+
const outOfScope = Array.isArray(result['out_of_scope_edits']) ? result['out_of_scope_edits'] : [];
|
|
10
|
+
const tests = Array.isArray(result['nearby_tests']) ? result['nearby_tests'] : [];
|
|
11
|
+
const ambientTrace = typeof result['ambient_trace'] === 'object' && result['ambient_trace'] !== null
|
|
12
|
+
? result['ambient_trace']
|
|
13
|
+
: null;
|
|
14
|
+
const lines = [
|
|
15
|
+
'<!-- codeledger-pr-comment -->',
|
|
16
|
+
'## CodeLedger PR Check',
|
|
17
|
+
'',
|
|
18
|
+
`**Status:** ${status} `,
|
|
19
|
+
`**Mode:** ${mode} `,
|
|
20
|
+
`**Scope adherence:** ${scopeAdherence}`,
|
|
21
|
+
'',
|
|
22
|
+
'**Summary:** ',
|
|
23
|
+
summary,
|
|
24
|
+
];
|
|
25
|
+
if (outOfScope.length > 0) {
|
|
26
|
+
lines.push('', `**Out-of-scope edits:** ${outOfScope.length}`);
|
|
27
|
+
for (const file of outOfScope.slice(0, 5)) {
|
|
28
|
+
lines.push(`- ${file}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (tests.length > 0) {
|
|
32
|
+
lines.push('', `**Nearby tests:** ${tests.length}`);
|
|
33
|
+
for (const file of tests.slice(0, 5)) {
|
|
34
|
+
lines.push(`- ${file}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (risks.length > 0) {
|
|
38
|
+
lines.push('', '**Risk summary:**');
|
|
39
|
+
for (const risk of risks.slice(0, 5)) {
|
|
40
|
+
lines.push(`- ${risk}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (ambientTrace) {
|
|
44
|
+
lines.push('', '**Ambient trace:**');
|
|
45
|
+
if (typeof ambientTrace['task_id'] === 'string') {
|
|
46
|
+
lines.push(`- Originated from task ${ambientTrace['task_id']}`);
|
|
47
|
+
}
|
|
48
|
+
if (typeof ambientTrace['bundle_confidence'] === 'number') {
|
|
49
|
+
lines.push(`- Bundle confidence: ${ambientTrace['bundle_confidence'].toFixed(2)}`);
|
|
50
|
+
}
|
|
51
|
+
if (typeof ambientTrace['context_reuse'] === 'boolean') {
|
|
52
|
+
lines.push(`- Context reuse: ${ambientTrace['context_reuse'] ? 'yes' : 'no'}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
lines.push('', '---', '*Powered by CodeLedger*');
|
|
56
|
+
return lines.join('\n');
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=commentRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commentRenderer.js","sourceRoot":"","sources":["../src/commentRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubOutput.d.ts","sourceRoot":"","sources":["../src/githubOutput.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAIrF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { writeFileSync } from 'node:fs';
|
|
2
|
+
export function writeGitHubOutput(path, result) {
|
|
3
|
+
const status = String(result['status'] ?? 'WARN');
|
|
4
|
+
const summary = String(result['summary'] ?? '');
|
|
5
|
+
writeFileSync(path, `status=${status}\nsummary<<EOF\n${summary}\nEOF\n`);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=githubOutput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubOutput.js","sourceRoot":"","sources":["../src/githubOutput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,MAA+B;IAC7E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,aAAa,CAAC,IAAI,EAAE,UAAU,MAAM,mBAAmB,OAAO,SAAS,CAAC,CAAC;AAC3E,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface PRCheckOptions {
|
|
2
|
+
cwd: string;
|
|
3
|
+
mode: 'observe' | 'warn' | 'block';
|
|
4
|
+
base?: string;
|
|
5
|
+
title?: string;
|
|
6
|
+
body?: string;
|
|
7
|
+
json?: boolean;
|
|
8
|
+
commentFile?: string;
|
|
9
|
+
githubOutput?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function runAmbientPRCheck(opts: PRCheckOptions): Promise<Record<string, unknown>>;
|
|
12
|
+
//# sourceMappingURL=prCheck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prCheck.d.ts","sourceRoot":"","sources":["../src/prCheck.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAuE9F"}
|
package/dist/prCheck.js
ADDED
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { buildBundleArtifact, ensureScanFresh, readTaskLineage } from '@codeledger/codeledger-runtime';
|
|
5
|
+
import { renderPRComment } from './commentRenderer.js';
|
|
6
|
+
import { writeGitHubOutput } from './githubOutput.js';
|
|
7
|
+
import { summarizeRiskLines } from './riskSummary.js';
|
|
8
|
+
export async function runAmbientPRCheck(opts) {
|
|
9
|
+
const title = opts.title ?? inferPRTitle();
|
|
10
|
+
const body = opts.body ?? inferPRBody();
|
|
11
|
+
const base = opts.base ?? inferBaseBranch();
|
|
12
|
+
const task = [title, body].filter(Boolean).join('\n').trim() || 'Review pull request changes';
|
|
13
|
+
const scan = ensureScanFresh({ cwd: opts.cwd, staleAfterSeconds: 2 * 60 * 60, log: () => undefined });
|
|
14
|
+
const bundleResult = await buildBundleArtifact({ cwd: opts.cwd, task });
|
|
15
|
+
const bundle = bundleResult.bundle;
|
|
16
|
+
const diff = collectDiff(opts.cwd, base);
|
|
17
|
+
const repoIndex = loadRepoIndex(scan.indexPath);
|
|
18
|
+
const nearbyTests = findNearbyTests(diff.changedFiles, bundle, repoIndex);
|
|
19
|
+
const outOfScope = diff.changedFiles.filter((file) => !isAllowedByBundle(file, bundle, nearbyTests));
|
|
20
|
+
const duplicates = detectDuplicateRisk(opts.cwd, diff.newFiles, bundle);
|
|
21
|
+
const driftSignals = [
|
|
22
|
+
...(bundle.confidence?.level === 'low' ? ['Context confidence is low'] : []),
|
|
23
|
+
...(outOfScope.length > 0 ? ['Edits extend beyond bounded context'] : []),
|
|
24
|
+
...(nearbyTests.length === 0 ? ['Changed source files do not have nearby tests in scope'] : []),
|
|
25
|
+
];
|
|
26
|
+
const scopeAdherence = diff.changedFiles.length === 0
|
|
27
|
+
? 1
|
|
28
|
+
: Math.max(0, (diff.changedFiles.length - outOfScope.length) / diff.changedFiles.length);
|
|
29
|
+
const status = computeStatus(opts.mode, outOfScope.length, duplicates.length, nearbyTests.length, driftSignals.length);
|
|
30
|
+
const risks = summarizeRiskLines({
|
|
31
|
+
outOfScopeCount: outOfScope.length,
|
|
32
|
+
duplicateCount: duplicates.length,
|
|
33
|
+
nearbyTests: nearbyTests.length,
|
|
34
|
+
driftSignals,
|
|
35
|
+
});
|
|
36
|
+
const summary = buildSummary(status, scopeAdherence, outOfScope, duplicates, nearbyTests, bundle, scan.refreshed);
|
|
37
|
+
const result = {
|
|
38
|
+
status,
|
|
39
|
+
mode: opts.mode,
|
|
40
|
+
task,
|
|
41
|
+
base,
|
|
42
|
+
bundle_id: bundle.bundle_id,
|
|
43
|
+
scope_adherence: scopeAdherence,
|
|
44
|
+
out_of_scope_edits: outOfScope,
|
|
45
|
+
duplicate_logic_risk: duplicates,
|
|
46
|
+
nearby_tests: nearbyTests,
|
|
47
|
+
drift_signals: driftSignals,
|
|
48
|
+
risks,
|
|
49
|
+
summary,
|
|
50
|
+
bundle: {
|
|
51
|
+
files: bundle.files.length,
|
|
52
|
+
tokens: bundle.total_tokens,
|
|
53
|
+
confidence: bundle.confidence?.level ?? 'unknown',
|
|
54
|
+
},
|
|
55
|
+
diff: {
|
|
56
|
+
changed_files: diff.changedFiles,
|
|
57
|
+
new_files: diff.newFiles,
|
|
58
|
+
},
|
|
59
|
+
scan_refreshed: scan.refreshed,
|
|
60
|
+
};
|
|
61
|
+
const ambientTrace = loadAmbientTrace(opts.cwd, base, diff.changedFiles);
|
|
62
|
+
if (ambientTrace) {
|
|
63
|
+
result['ambient_trace'] = ambientTrace;
|
|
64
|
+
}
|
|
65
|
+
if (opts.commentFile) {
|
|
66
|
+
writeFileSync(opts.commentFile, renderPRComment(result) + '\n');
|
|
67
|
+
}
|
|
68
|
+
if (opts.githubOutput) {
|
|
69
|
+
writeGitHubOutput(opts.githubOutput, result);
|
|
70
|
+
}
|
|
71
|
+
if (opts.json) {
|
|
72
|
+
// caller prints
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
function inferPRTitle() {
|
|
77
|
+
if (process.env['GITHUB_EVENT_PATH']) {
|
|
78
|
+
try {
|
|
79
|
+
const event = JSON.parse(readFileSync(process.env['GITHUB_EVENT_PATH'], 'utf-8'));
|
|
80
|
+
return event.pull_request?.title ?? '';
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return '';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return process.env['CI_MERGE_REQUEST_TITLE'] ?? '';
|
|
87
|
+
}
|
|
88
|
+
function inferPRBody() {
|
|
89
|
+
if (process.env['GITHUB_EVENT_PATH']) {
|
|
90
|
+
try {
|
|
91
|
+
const event = JSON.parse(readFileSync(process.env['GITHUB_EVENT_PATH'], 'utf-8'));
|
|
92
|
+
return event.pull_request?.body ?? '';
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return '';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return '';
|
|
99
|
+
}
|
|
100
|
+
function inferBaseBranch() {
|
|
101
|
+
if (process.env['GITHUB_BASE_REF'])
|
|
102
|
+
return process.env['GITHUB_BASE_REF'];
|
|
103
|
+
return 'main';
|
|
104
|
+
}
|
|
105
|
+
function collectDiff(cwd, base) {
|
|
106
|
+
const mergeBase = runGit(cwd, `git merge-base ${base} HEAD`) || base;
|
|
107
|
+
const nameStatus = runGit(cwd, `git diff --name-status ${mergeBase}...HEAD`);
|
|
108
|
+
const changedFiles = [];
|
|
109
|
+
const newFiles = [];
|
|
110
|
+
for (const line of nameStatus.split('\n').filter(Boolean)) {
|
|
111
|
+
const parts = line.trim().split(/\s+/);
|
|
112
|
+
const status = parts[0] ?? '';
|
|
113
|
+
const file = parts[parts.length - 1] ?? '';
|
|
114
|
+
if (!file)
|
|
115
|
+
continue;
|
|
116
|
+
changedFiles.push(file);
|
|
117
|
+
if (status.startsWith('A'))
|
|
118
|
+
newFiles.push(file);
|
|
119
|
+
}
|
|
120
|
+
return { changedFiles, newFiles };
|
|
121
|
+
}
|
|
122
|
+
function loadRepoIndex(path) {
|
|
123
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
124
|
+
}
|
|
125
|
+
function findNearbyTests(changedFiles, bundle, repoIndex) {
|
|
126
|
+
const tests = new Set();
|
|
127
|
+
const bundled = new Set(bundle.files.map((file) => file.path));
|
|
128
|
+
for (const file of changedFiles) {
|
|
129
|
+
for (const mapping of repoIndex.test_map) {
|
|
130
|
+
if (mapping.source_file === file || bundled.has(mapping.source_file)) {
|
|
131
|
+
tests.add(mapping.test_file);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
for (const file of bundle.files) {
|
|
136
|
+
if (/(^|\/)(test|tests)\b|\.test\./.test(file.path)) {
|
|
137
|
+
tests.add(file.path);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return [...tests];
|
|
141
|
+
}
|
|
142
|
+
function isAllowedByBundle(file, bundle, nearbyTests) {
|
|
143
|
+
if (bundle.files.some((entry) => entry.path === file))
|
|
144
|
+
return true;
|
|
145
|
+
if (nearbyTests.includes(file))
|
|
146
|
+
return true;
|
|
147
|
+
if (file.startsWith('.github/') || file.startsWith('docs/'))
|
|
148
|
+
return true;
|
|
149
|
+
const dir = file.split('/').slice(0, 2).join('/');
|
|
150
|
+
return bundle.files.some((entry) => entry.path.startsWith(dir));
|
|
151
|
+
}
|
|
152
|
+
function detectDuplicateRisk(cwd, newFiles, bundle) {
|
|
153
|
+
const results = [];
|
|
154
|
+
const comparisonFiles = bundle.files.slice(0, 5).map((file) => file.path);
|
|
155
|
+
for (const newFile of newFiles) {
|
|
156
|
+
if (!/\.[jt]sx?$/.test(newFile))
|
|
157
|
+
continue;
|
|
158
|
+
const full = join(cwd, newFile);
|
|
159
|
+
if (!existsSync(full))
|
|
160
|
+
continue;
|
|
161
|
+
const content = readFileSync(full, 'utf-8');
|
|
162
|
+
const newTokens = tokenize(content);
|
|
163
|
+
if (newTokens.size < 10)
|
|
164
|
+
continue;
|
|
165
|
+
for (const existing of comparisonFiles) {
|
|
166
|
+
const existingPath = join(cwd, existing);
|
|
167
|
+
if (!existsSync(existingPath))
|
|
168
|
+
continue;
|
|
169
|
+
const similarity = jaccard(newTokens, tokenize(readFileSync(existingPath, 'utf-8')));
|
|
170
|
+
if (similarity >= 0.75) {
|
|
171
|
+
results.push({
|
|
172
|
+
new_file: newFile,
|
|
173
|
+
existing_file: existing,
|
|
174
|
+
similarity: Number(similarity.toFixed(2)),
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return results;
|
|
180
|
+
}
|
|
181
|
+
function tokenize(content) {
|
|
182
|
+
const cleaned = content
|
|
183
|
+
.replace(/\/\/.*$/gm, '')
|
|
184
|
+
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
185
|
+
.replace(/'[^']*'/g, '""')
|
|
186
|
+
.replace(/"[^"]*"/g, '""')
|
|
187
|
+
.replace(/`[^`]*`/g, '""');
|
|
188
|
+
const tokens = new Set();
|
|
189
|
+
const tokenRe = /[a-zA-Z_$][a-zA-Z0-9_$]*/g;
|
|
190
|
+
let match;
|
|
191
|
+
while ((match = tokenRe.exec(cleaned)) !== null) {
|
|
192
|
+
if (match[0].length > 1)
|
|
193
|
+
tokens.add(match[0].toLowerCase());
|
|
194
|
+
}
|
|
195
|
+
return tokens;
|
|
196
|
+
}
|
|
197
|
+
function jaccard(a, b) {
|
|
198
|
+
let intersection = 0;
|
|
199
|
+
for (const token of a) {
|
|
200
|
+
if (b.has(token))
|
|
201
|
+
intersection++;
|
|
202
|
+
}
|
|
203
|
+
const union = a.size + b.size - intersection;
|
|
204
|
+
return union > 0 ? intersection / union : 0;
|
|
205
|
+
}
|
|
206
|
+
function computeStatus(mode, outOfScope, duplicates, nearbyTests, drifts) {
|
|
207
|
+
const severe = outOfScope > 0 || duplicates > 0 || nearbyTests === 0 || drifts > 1;
|
|
208
|
+
if (!severe)
|
|
209
|
+
return 'PASS';
|
|
210
|
+
if (mode === 'block')
|
|
211
|
+
return 'BLOCK';
|
|
212
|
+
return 'WARN';
|
|
213
|
+
}
|
|
214
|
+
function buildSummary(status, scopeAdherence, outOfScope, duplicates, nearbyTests, bundle, scanRefreshed) {
|
|
215
|
+
const parts = [
|
|
216
|
+
`${status}: scope adherence ${(scopeAdherence * 100).toFixed(0)}%`,
|
|
217
|
+
`${bundle.files.length} bounded files`,
|
|
218
|
+
`${nearbyTests.length} nearby tests`,
|
|
219
|
+
scanRefreshed ? 'scan refreshed' : 'warm scan reused',
|
|
220
|
+
];
|
|
221
|
+
if (outOfScope.length > 0)
|
|
222
|
+
parts.push(`${outOfScope.length} out-of-scope edit(s)`);
|
|
223
|
+
if (duplicates.length > 0)
|
|
224
|
+
parts.push(`${duplicates.length} duplicate-logic risk(s)`);
|
|
225
|
+
return parts.join(' · ');
|
|
226
|
+
}
|
|
227
|
+
function loadAmbientTrace(cwd, base, changedFiles) {
|
|
228
|
+
const lineage = readTaskLineage(cwd);
|
|
229
|
+
if (lineage.length === 0)
|
|
230
|
+
return null;
|
|
231
|
+
const currentBranch = inferHeadBranch(cwd);
|
|
232
|
+
const currentHead = runGit(cwd, 'git rev-parse HEAD');
|
|
233
|
+
const matches = lineage
|
|
234
|
+
.filter((entry) => currentBranch ? entry.branch === currentBranch : true)
|
|
235
|
+
.filter((entry) => isAncestor(cwd, entry.startGitHead, currentHead))
|
|
236
|
+
.sort((a, b) => b.finishedAt.localeCompare(a.finishedAt));
|
|
237
|
+
const best = matches.find((entry) => entry.filesTouched.some((file) => changedFiles.includes(file))) ?? matches[0];
|
|
238
|
+
if (!best)
|
|
239
|
+
return null;
|
|
240
|
+
return {
|
|
241
|
+
task_id: best.taskId,
|
|
242
|
+
run_id: best.runId,
|
|
243
|
+
session_id: best.sessionId ?? null,
|
|
244
|
+
task: best.task,
|
|
245
|
+
branch: best.branch || currentBranch || base,
|
|
246
|
+
start_git_head: best.startGitHead,
|
|
247
|
+
git_head: best.finishedGitHead,
|
|
248
|
+
files_touched: best.filesTouched,
|
|
249
|
+
bundle_confidence: best.bundleConfidenceScore ?? null,
|
|
250
|
+
context_reuse: best.contextReuse,
|
|
251
|
+
value_signals: best.valueSignals,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function inferHeadBranch(cwd) {
|
|
255
|
+
if (process.env['GITHUB_HEAD_REF'])
|
|
256
|
+
return process.env['GITHUB_HEAD_REF'];
|
|
257
|
+
const branch = runGit(cwd, 'git rev-parse --abbrev-ref HEAD');
|
|
258
|
+
return branch === 'HEAD' ? '' : branch;
|
|
259
|
+
}
|
|
260
|
+
function isAncestor(cwd, ancestor, head) {
|
|
261
|
+
if (!ancestor || !head)
|
|
262
|
+
return false;
|
|
263
|
+
try {
|
|
264
|
+
execSync(`git merge-base --is-ancestor ${ancestor} ${head}`, {
|
|
265
|
+
cwd,
|
|
266
|
+
stdio: ['ignore', 'ignore', 'ignore'],
|
|
267
|
+
timeout: 5000,
|
|
268
|
+
});
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function runGit(cwd, cmd) {
|
|
276
|
+
try {
|
|
277
|
+
return execSync(cmd, {
|
|
278
|
+
cwd,
|
|
279
|
+
encoding: 'utf-8',
|
|
280
|
+
timeout: 10000,
|
|
281
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
282
|
+
}).trim();
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return '';
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=prCheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prCheck.js","sourceRoot":"","sources":["../src/prCheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"riskSummary.d.ts","sourceRoot":"","sources":["../src/riskSummary.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,GAAG,MAAM,EAAE,CAOX"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function summarizeRiskLines(opts) {
|
|
2
|
+
const lines = [];
|
|
3
|
+
if (opts.outOfScopeCount > 0)
|
|
4
|
+
lines.push(`${opts.outOfScopeCount} out-of-scope edit(s) detected`);
|
|
5
|
+
if (opts.duplicateCount > 0)
|
|
6
|
+
lines.push(`${opts.duplicateCount} duplicate-logic risk(s) detected`);
|
|
7
|
+
if (opts.nearbyTests === 0)
|
|
8
|
+
lines.push('No nearby tests were found for changed source files');
|
|
9
|
+
lines.push(...opts.driftSignals.slice(0, 3));
|
|
10
|
+
return lines;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=riskSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"riskSummary.js","sourceRoot":"","sources":["../src/riskSummary.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,IAKlC;IACC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,gCAAgC,CAAC,CAAC;IAClG,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,mCAAmC,CAAC,CAAC;IACnG,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAC9F,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@codeledger/codeledger-ci",
|
|
3
|
+
"version": "00.7.8",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "PR and CI trust loop for CodeLedger",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/codeledgerECF/codeledger.git",
|
|
10
|
+
"directory": "packages/codeledger-ci"
|
|
11
|
+
},
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"import": "./dist/index.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@codeledger/codeledger-runtime": "00.7.8",
|
|
28
|
+
"@codeledger/types": "00.7.8"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"typescript": "^5.4.0"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsc",
|
|
35
|
+
"typecheck": "tsc --noEmit",
|
|
36
|
+
"clean": "rm -rf dist"
|
|
37
|
+
}
|
|
38
|
+
}
|