@codeledger/engine 0.7.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/ccs/index.d.ts +11 -0
- package/dist/ccs/index.d.ts.map +1 -0
- package/dist/ccs/index.js +10 -0
- package/dist/ccs/index.js.map +1 -0
- package/dist/ccs/score.d.ts +61 -0
- package/dist/ccs/score.d.ts.map +1 -0
- package/dist/ccs/score.js +250 -0
- package/dist/ccs/score.js.map +1 -0
- package/dist/ecl/index.d.ts +9 -0
- package/dist/ecl/index.d.ts.map +1 -0
- package/dist/ecl/index.js +9 -0
- package/dist/ecl/index.js.map +1 -0
- package/dist/ecl/ledger.d.ts +84 -0
- package/dist/ecl/ledger.d.ts.map +1 -0
- package/dist/ecl/ledger.js +235 -0
- package/dist/ecl/ledger.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/iole/expansion-ladder.d.ts +51 -0
- package/dist/iole/expansion-ladder.d.ts.map +1 -0
- package/dist/iole/expansion-ladder.js +153 -0
- package/dist/iole/expansion-ladder.js.map +1 -0
- package/dist/iole/failure-vector.d.ts +21 -0
- package/dist/iole/failure-vector.d.ts.map +1 -0
- package/dist/iole/failure-vector.js +156 -0
- package/dist/iole/failure-vector.js.map +1 -0
- package/dist/iole/index.d.ts +19 -0
- package/dist/iole/index.d.ts.map +1 -0
- package/dist/iole/index.js +17 -0
- package/dist/iole/index.js.map +1 -0
- package/dist/iole/intent-decomposition.d.ts +33 -0
- package/dist/iole/intent-decomposition.d.ts.map +1 -0
- package/dist/iole/intent-decomposition.js +252 -0
- package/dist/iole/intent-decomposition.js.map +1 -0
- package/dist/iole/intent-signature.d.ts +37 -0
- package/dist/iole/intent-signature.d.ts.map +1 -0
- package/dist/iole/intent-signature.js +112 -0
- package/dist/iole/intent-signature.js.map +1 -0
- package/dist/iole/outcome-score.d.ts +25 -0
- package/dist/iole/outcome-score.d.ts.map +1 -0
- package/dist/iole/outcome-score.js +128 -0
- package/dist/iole/outcome-score.js.map +1 -0
- package/dist/isc/index.d.ts +8 -0
- package/dist/isc/index.d.ts.map +1 -0
- package/dist/isc/index.js +8 -0
- package/dist/isc/index.js.map +1 -0
- package/dist/isc/score.d.ts +27 -0
- package/dist/isc/score.d.ts.map +1 -0
- package/dist/isc/score.js +347 -0
- package/dist/isc/score.js.map +1 -0
- package/dist/license/index.d.ts +14 -0
- package/dist/license/index.d.ts.map +1 -0
- package/dist/license/index.js +11 -0
- package/dist/license/index.js.map +1 -0
- package/dist/license/parse.d.ts +42 -0
- package/dist/license/parse.d.ts.map +1 -0
- package/dist/license/parse.js +106 -0
- package/dist/license/parse.js.map +1 -0
- package/dist/license/publicKey.d.ts +37 -0
- package/dist/license/publicKey.d.ts.map +1 -0
- package/dist/license/publicKey.js +48 -0
- package/dist/license/publicKey.js.map +1 -0
- package/dist/license/verify.d.ts +33 -0
- package/dist/license/verify.d.ts.map +1 -0
- package/dist/license/verify.js +82 -0
- package/dist/license/verify.js.map +1 -0
- package/dist/orchestrator/index.d.ts +10 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +10 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +44 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.js +182 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/policy-sim/index.d.ts +8 -0
- package/dist/policy-sim/index.d.ts.map +1 -0
- package/dist/policy-sim/index.js +8 -0
- package/dist/policy-sim/index.js.map +1 -0
- package/dist/policy-sim/simulate.d.ts +18 -0
- package/dist/policy-sim/simulate.d.ts.map +1 -0
- package/dist/policy-sim/simulate.js +61 -0
- package/dist/policy-sim/simulate.js.map +1 -0
- package/dist/provenance/graph.d.ts +42 -0
- package/dist/provenance/graph.d.ts.map +1 -0
- package/dist/provenance/graph.js +139 -0
- package/dist/provenance/graph.js.map +1 -0
- package/dist/provenance/index.d.ts +8 -0
- package/dist/provenance/index.d.ts.map +1 -0
- package/dist/provenance/index.js +8 -0
- package/dist/provenance/index.js.map +1 -0
- package/dist/sce/index.d.ts +15 -0
- package/dist/sce/index.d.ts.map +1 -0
- package/dist/sce/index.js +14 -0
- package/dist/sce/index.js.map +1 -0
- package/dist/sce/slice-builder.d.ts +35 -0
- package/dist/sce/slice-builder.d.ts.map +1 -0
- package/dist/sce/slice-builder.js +198 -0
- package/dist/sce/slice-builder.js.map +1 -0
- package/dist/sce/symbol-graph.d.ts +21 -0
- package/dist/sce/symbol-graph.d.ts.map +1 -0
- package/dist/sce/symbol-graph.js +187 -0
- package/dist/sce/symbol-graph.js.map +1 -0
- package/dist/team-ledger/index.d.ts +8 -0
- package/dist/team-ledger/index.d.ts.map +1 -0
- package/dist/team-ledger/index.js +8 -0
- package/dist/team-ledger/index.js.map +1 -0
- package/dist/team-ledger/ledger.d.ts +48 -0
- package/dist/team-ledger/ledger.d.ts.map +1 -0
- package/dist/team-ledger/ledger.js +208 -0
- package/dist/team-ledger/ledger.js.map +1 -0
- package/dist/team-metrics/index.d.ts +8 -0
- package/dist/team-metrics/index.d.ts.map +1 -0
- package/dist/team-metrics/index.js +8 -0
- package/dist/team-metrics/index.js.map +1 -0
- package/dist/team-metrics/metrics.d.ts +42 -0
- package/dist/team-metrics/metrics.d.ts.map +1 -0
- package/dist/team-metrics/metrics.js +156 -0
- package/dist/team-metrics/metrics.js.map +1 -0
- package/dist/team-policy/index.d.ts +8 -0
- package/dist/team-policy/index.d.ts.map +1 -0
- package/dist/team-policy/index.js +8 -0
- package/dist/team-policy/index.js.map +1 -0
- package/dist/team-policy/policy.d.ts +35 -0
- package/dist/team-policy/policy.d.ts.map +1 -0
- package/dist/team-policy/policy.js +100 -0
- package/dist/team-policy/policy.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Context Quality Score — Implementation
|
|
3
|
+
*
|
|
4
|
+
* Aggregates across sessions:
|
|
5
|
+
* - recall, precision, intent drift, CCS, ISC
|
|
6
|
+
*
|
|
7
|
+
* Produces a composite [0,1] score with trend and weak area identification.
|
|
8
|
+
*
|
|
9
|
+
* Storage: .codeledger/team-metrics.json
|
|
10
|
+
*
|
|
11
|
+
* Weights:
|
|
12
|
+
* recall 0.30
|
|
13
|
+
* precision 0.25
|
|
14
|
+
* ccs 0.20
|
|
15
|
+
* isc 0.15
|
|
16
|
+
* drift 0.10 (inverted: lower drift = higher score)
|
|
17
|
+
*/
|
|
18
|
+
import { writeFileSync } from 'fs';
|
|
19
|
+
import { join } from 'path';
|
|
20
|
+
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
21
|
+
export const TEAM_METRICS_FILE = 'team-metrics.json';
|
|
22
|
+
const SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;
|
|
23
|
+
// Factor weights
|
|
24
|
+
const W_RECALL = 0.30;
|
|
25
|
+
const W_PRECISION = 0.25;
|
|
26
|
+
const W_CCS = 0.20;
|
|
27
|
+
const W_ISC = 0.15;
|
|
28
|
+
const W_DRIFT = 0.10;
|
|
29
|
+
// Weak area thresholds
|
|
30
|
+
const WEAK_THRESHOLD = 0.60;
|
|
31
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
32
|
+
/**
|
|
33
|
+
* Compute team-level quality metrics from session snapshots.
|
|
34
|
+
*
|
|
35
|
+
* Each snapshot is a session's summary metrics. The function computes
|
|
36
|
+
* averages, a composite score, trend vs the previous period, and weak areas.
|
|
37
|
+
*
|
|
38
|
+
* Persists to .codeledger/team-metrics.json.
|
|
39
|
+
*/
|
|
40
|
+
export function computeTeamMetrics(repoRoot, snapshots) {
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
if (snapshots.length === 0) {
|
|
43
|
+
const empty = {
|
|
44
|
+
score: 0,
|
|
45
|
+
sessionCount: 0,
|
|
46
|
+
avgRecall: 0,
|
|
47
|
+
avgPrecision: 0,
|
|
48
|
+
avgDrift: 0,
|
|
49
|
+
avgCcs: 0,
|
|
50
|
+
avgIsc: 0,
|
|
51
|
+
trend: 0,
|
|
52
|
+
weakAreas: [],
|
|
53
|
+
computedAt: new Date(now).toISOString(),
|
|
54
|
+
rangeStartMs: 0,
|
|
55
|
+
rangeEndMs: now,
|
|
56
|
+
};
|
|
57
|
+
persistMetrics(repoRoot, empty);
|
|
58
|
+
return empty;
|
|
59
|
+
}
|
|
60
|
+
// Split into current (last 7 days) and previous (7-14 days)
|
|
61
|
+
const current = snapshots.filter((s) => s.timestamp >= now - SEVEN_DAYS_MS);
|
|
62
|
+
const previous = snapshots.filter((s) => s.timestamp >= now - 2 * SEVEN_DAYS_MS && s.timestamp < now - SEVEN_DAYS_MS);
|
|
63
|
+
// Use all snapshots for the overall score
|
|
64
|
+
const avgRecall = avg(snapshots.map((s) => s.recall));
|
|
65
|
+
const avgPrecision = avg(snapshots.map((s) => s.precision));
|
|
66
|
+
const avgDrift = avg(snapshots.map((s) => s.drift));
|
|
67
|
+
const avgCcs = avg(snapshots.map((s) => s.ccs));
|
|
68
|
+
const avgIsc = avg(snapshots.map((s) => s.isc));
|
|
69
|
+
const score = computeComposite(avgRecall, avgPrecision, avgDrift, avgCcs, avgIsc);
|
|
70
|
+
// Trend: difference in composite between current and previous week
|
|
71
|
+
let trend = 0;
|
|
72
|
+
if (current.length > 0 && previous.length > 0) {
|
|
73
|
+
const currentScore = computeComposite(avg(current.map((s) => s.recall)), avg(current.map((s) => s.precision)), avg(current.map((s) => s.drift)), avg(current.map((s) => s.ccs)), avg(current.map((s) => s.isc)));
|
|
74
|
+
const previousScore = computeComposite(avg(previous.map((s) => s.recall)), avg(previous.map((s) => s.precision)), avg(previous.map((s) => s.drift)), avg(previous.map((s) => s.ccs)), avg(previous.map((s) => s.isc)));
|
|
75
|
+
trend = currentScore - previousScore;
|
|
76
|
+
}
|
|
77
|
+
const weakAreas = identifyWeakAreas(avgRecall, avgPrecision, avgDrift, avgCcs, avgIsc);
|
|
78
|
+
const timestamps = snapshots.map((s) => s.timestamp);
|
|
79
|
+
const metrics = {
|
|
80
|
+
score,
|
|
81
|
+
sessionCount: snapshots.length,
|
|
82
|
+
avgRecall,
|
|
83
|
+
avgPrecision,
|
|
84
|
+
avgDrift,
|
|
85
|
+
avgCcs,
|
|
86
|
+
avgIsc,
|
|
87
|
+
trend,
|
|
88
|
+
weakAreas,
|
|
89
|
+
computedAt: new Date(now).toISOString(),
|
|
90
|
+
rangeStartMs: Math.min(...timestamps),
|
|
91
|
+
rangeEndMs: Math.max(...timestamps),
|
|
92
|
+
};
|
|
93
|
+
persistMetrics(repoRoot, metrics);
|
|
94
|
+
return metrics;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Identify weak areas where individual factor scores fall below the threshold.
|
|
98
|
+
*/
|
|
99
|
+
export function identifyWeakAreas(recall, precision, drift, ccs, isc) {
|
|
100
|
+
const areas = [];
|
|
101
|
+
if (recall < WEAK_THRESHOLD) {
|
|
102
|
+
areas.push({
|
|
103
|
+
area: 'recall',
|
|
104
|
+
description: 'Bundle recall is low — agents are reading files outside the bundle',
|
|
105
|
+
score: recall,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (precision < WEAK_THRESHOLD) {
|
|
109
|
+
areas.push({
|
|
110
|
+
area: 'precision',
|
|
111
|
+
description: 'Bundle precision is low — bundles include files agents don\'t need',
|
|
112
|
+
score: precision,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if (drift > 1 - WEAK_THRESHOLD) {
|
|
116
|
+
areas.push({
|
|
117
|
+
area: 'drift',
|
|
118
|
+
description: 'Intent drift is high — tasks are diverging from their original scope',
|
|
119
|
+
score: 1 - drift,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
if (ccs < WEAK_THRESHOLD) {
|
|
123
|
+
areas.push({
|
|
124
|
+
area: 'context_confidence',
|
|
125
|
+
description: 'Context confidence is low — bundles may be missing critical files',
|
|
126
|
+
score: ccs,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
if (isc < WEAK_THRESHOLD) {
|
|
130
|
+
areas.push({
|
|
131
|
+
area: 'intent_sufficiency',
|
|
132
|
+
description: 'Task prompts are underspecified — agents start with ambiguous instructions',
|
|
133
|
+
score: isc,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return areas.sort((a, b) => a.score - b.score);
|
|
137
|
+
}
|
|
138
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
139
|
+
function computeComposite(recall, precision, drift, ccs, isc) {
|
|
140
|
+
// Drift is inverted: lower drift = higher contribution
|
|
141
|
+
return (W_RECALL * recall +
|
|
142
|
+
W_PRECISION * precision +
|
|
143
|
+
W_CCS * ccs +
|
|
144
|
+
W_ISC * isc +
|
|
145
|
+
W_DRIFT * (1 - drift));
|
|
146
|
+
}
|
|
147
|
+
function avg(values) {
|
|
148
|
+
if (values.length === 0)
|
|
149
|
+
return 0;
|
|
150
|
+
return values.reduce((sum, v) => sum + v, 0) / values.length;
|
|
151
|
+
}
|
|
152
|
+
function persistMetrics(repoRoot, metrics) {
|
|
153
|
+
const path = join(repoRoot, '.codeledger', TEAM_METRICS_FILE);
|
|
154
|
+
writeFileSync(path, JSON.stringify(metrics, null, 2), 'utf-8');
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/team-metrics/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Context Policy System
|
|
3
|
+
*
|
|
4
|
+
* Moves from "what NOT to do" → "what MUST be included".
|
|
5
|
+
* Evaluates required file inclusion rules against context bundles.
|
|
6
|
+
*/
|
|
7
|
+
export { loadTeamPolicy, evaluateTeamPolicy, matchTriggeredRules, DEFAULT_TEAM_POLICY, } from './policy.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/team-policy/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Context Policy System
|
|
3
|
+
*
|
|
4
|
+
* Moves from "what NOT to do" → "what MUST be included".
|
|
5
|
+
* Evaluates required file inclusion rules against context bundles.
|
|
6
|
+
*/
|
|
7
|
+
export { loadTeamPolicy, evaluateTeamPolicy, matchTriggeredRules, DEFAULT_TEAM_POLICY, } from './policy.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/team-policy/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Context Policy — Implementation
|
|
3
|
+
*
|
|
4
|
+
* Config: codeledger.team-policy.json at repo root or .codeledger/team-policy.json
|
|
5
|
+
*
|
|
6
|
+
* Enforcement during context build:
|
|
7
|
+
* - Ensure required files are present in the bundle
|
|
8
|
+
* - If missing: boost score (soft) or fail validation (hard)
|
|
9
|
+
*
|
|
10
|
+
* Integration points:
|
|
11
|
+
* - SCE (slice builder) — boost missing required files
|
|
12
|
+
* - CCS (score) — penalty if required files missing
|
|
13
|
+
* - context validate — block if enforcement is 'block'
|
|
14
|
+
*/
|
|
15
|
+
import type { TeamPolicyConfig, TeamPolicyRule, TeamPolicyEvaluation } from '@codeledger/types';
|
|
16
|
+
export declare const DEFAULT_TEAM_POLICY: TeamPolicyConfig;
|
|
17
|
+
/**
|
|
18
|
+
* Load team policy from the repo root.
|
|
19
|
+
* Searches for codeledger.team-policy.json and .codeledger/team-policy.json.
|
|
20
|
+
* Returns default (disabled) policy if not found.
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadTeamPolicy(repoRoot: string): TeamPolicyConfig;
|
|
23
|
+
/**
|
|
24
|
+
* Find which policy rules are triggered by a given task description.
|
|
25
|
+
* Matches trigger keywords against the task (case-insensitive).
|
|
26
|
+
*/
|
|
27
|
+
export declare function matchTriggeredRules(policy: TeamPolicyConfig, task: string): TeamPolicyRule[];
|
|
28
|
+
/**
|
|
29
|
+
* Evaluate team policy against a context bundle.
|
|
30
|
+
*
|
|
31
|
+
* For each triggered rule, checks whether all requiredFiles are present
|
|
32
|
+
* in the bundle's file list. Returns pass/fail with details.
|
|
33
|
+
*/
|
|
34
|
+
export declare function evaluateTeamPolicy(policy: TeamPolicyConfig, task: string, bundleFiles: string[]): TeamPolicyEvaluation;
|
|
35
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/team-policy/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAI3B,eAAO,MAAM,mBAAmB,EAAE,gBAIjC,CAAC;AASF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAcjE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,GACX,cAAc,EAAE,CAOlB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EAAE,GACpB,oBAAoB,CAsCtB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Context Policy — Implementation
|
|
3
|
+
*
|
|
4
|
+
* Config: codeledger.team-policy.json at repo root or .codeledger/team-policy.json
|
|
5
|
+
*
|
|
6
|
+
* Enforcement during context build:
|
|
7
|
+
* - Ensure required files are present in the bundle
|
|
8
|
+
* - If missing: boost score (soft) or fail validation (hard)
|
|
9
|
+
*
|
|
10
|
+
* Integration points:
|
|
11
|
+
* - SCE (slice builder) — boost missing required files
|
|
12
|
+
* - CCS (score) — penalty if required files missing
|
|
13
|
+
* - context validate — block if enforcement is 'block'
|
|
14
|
+
*/
|
|
15
|
+
import { readFileSync, existsSync } from 'fs';
|
|
16
|
+
import { join } from 'path';
|
|
17
|
+
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
18
|
+
export const DEFAULT_TEAM_POLICY = {
|
|
19
|
+
version: 1,
|
|
20
|
+
enabled: false,
|
|
21
|
+
rules: [],
|
|
22
|
+
};
|
|
23
|
+
const POLICY_FILENAMES = [
|
|
24
|
+
'codeledger.team-policy.json',
|
|
25
|
+
'.codeledger/team-policy.json',
|
|
26
|
+
];
|
|
27
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
28
|
+
/**
|
|
29
|
+
* Load team policy from the repo root.
|
|
30
|
+
* Searches for codeledger.team-policy.json and .codeledger/team-policy.json.
|
|
31
|
+
* Returns default (disabled) policy if not found.
|
|
32
|
+
*/
|
|
33
|
+
export function loadTeamPolicy(repoRoot) {
|
|
34
|
+
for (const filename of POLICY_FILENAMES) {
|
|
35
|
+
const path = join(repoRoot, filename);
|
|
36
|
+
if (existsSync(path)) {
|
|
37
|
+
try {
|
|
38
|
+
const raw = JSON.parse(readFileSync(path, 'utf-8'));
|
|
39
|
+
return { ...DEFAULT_TEAM_POLICY, ...raw };
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Malformed policy — return default
|
|
43
|
+
return DEFAULT_TEAM_POLICY;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return DEFAULT_TEAM_POLICY;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Find which policy rules are triggered by a given task description.
|
|
51
|
+
* Matches trigger keywords against the task (case-insensitive).
|
|
52
|
+
*/
|
|
53
|
+
export function matchTriggeredRules(policy, task) {
|
|
54
|
+
if (!policy.enabled || policy.rules.length === 0)
|
|
55
|
+
return [];
|
|
56
|
+
const taskLower = task.toLowerCase();
|
|
57
|
+
return policy.rules.filter((rule) => rule.triggerKeywords.some((kw) => taskLower.includes(kw.toLowerCase())));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Evaluate team policy against a context bundle.
|
|
61
|
+
*
|
|
62
|
+
* For each triggered rule, checks whether all requiredFiles are present
|
|
63
|
+
* in the bundle's file list. Returns pass/fail with details.
|
|
64
|
+
*/
|
|
65
|
+
export function evaluateTeamPolicy(policy, task, bundleFiles) {
|
|
66
|
+
const triggered = matchTriggeredRules(policy, task);
|
|
67
|
+
if (triggered.length === 0) {
|
|
68
|
+
return {
|
|
69
|
+
passed: true,
|
|
70
|
+
triggeredRules: [],
|
|
71
|
+
satisfiedRules: [],
|
|
72
|
+
violatedRules: [],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const bundleSet = new Set(bundleFiles);
|
|
76
|
+
const satisfied = [];
|
|
77
|
+
const violated = [];
|
|
78
|
+
for (const rule of triggered) {
|
|
79
|
+
const missing = rule.requiredFiles.filter((f) => !bundleSet.has(f));
|
|
80
|
+
if (missing.length === 0) {
|
|
81
|
+
satisfied.push(rule.name);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
violated.push({
|
|
85
|
+
rule: rule.name,
|
|
86
|
+
missingFiles: missing,
|
|
87
|
+
enforcement: rule.enforcement,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Passed only if no 'block' violations exist
|
|
92
|
+
const hasBlockViolation = violated.some((v) => v.enforcement === 'block');
|
|
93
|
+
return {
|
|
94
|
+
passed: !hasBlockViolation,
|
|
95
|
+
triggeredRules: triggered.map((r) => r.name),
|
|
96
|
+
satisfiedRules: satisfied,
|
|
97
|
+
violatedRules: violated,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/team-policy/policy.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@codeledger/engine",
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Deterministic Context Orchestration Layer (DCOL) — SCE and IOLE subsystems for CodeLedger v2",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/codeledgerECF/codeledger.git",
|
|
10
|
+
"directory": "packages/engine"
|
|
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
|
+
"./sce": {
|
|
26
|
+
"types": "./dist/sce/index.d.ts",
|
|
27
|
+
"import": "./dist/sce/index.js"
|
|
28
|
+
},
|
|
29
|
+
"./iole": {
|
|
30
|
+
"types": "./dist/iole/index.d.ts",
|
|
31
|
+
"import": "./dist/iole/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./license": {
|
|
34
|
+
"types": "./dist/license/index.d.ts",
|
|
35
|
+
"import": "./dist/license/index.js"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@codeledger/types": "0.7.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"typescript": "^5.4.0"
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsc",
|
|
46
|
+
"typecheck": "tsc --noEmit",
|
|
47
|
+
"clean": "rm -rf dist"
|
|
48
|
+
}
|
|
49
|
+
}
|