@codeledger/engine 0.7.2 → 0.7.5

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.
Files changed (181) hide show
  1. package/dist/broker/completion.d.ts +9 -0
  2. package/dist/broker/completion.d.ts.map +1 -0
  3. package/dist/broker/completion.js +51 -0
  4. package/dist/broker/completion.js.map +1 -0
  5. package/dist/broker/evidence.d.ts +11 -0
  6. package/dist/broker/evidence.d.ts.map +1 -0
  7. package/dist/broker/evidence.js +39 -0
  8. package/dist/broker/evidence.js.map +1 -0
  9. package/dist/broker/index.d.ts +14 -0
  10. package/dist/broker/index.d.ts.map +1 -0
  11. package/dist/broker/index.js +14 -0
  12. package/dist/broker/index.js.map +1 -0
  13. package/dist/broker/memory-lookup.d.ts +41 -0
  14. package/dist/broker/memory-lookup.d.ts.map +1 -0
  15. package/dist/broker/memory-lookup.js +70 -0
  16. package/dist/broker/memory-lookup.js.map +1 -0
  17. package/dist/broker/preamble.d.ts +19 -0
  18. package/dist/broker/preamble.d.ts.map +1 -0
  19. package/dist/broker/preamble.js +13 -0
  20. package/dist/broker/preamble.js.map +1 -0
  21. package/dist/broker/structural.d.ts +10 -0
  22. package/dist/broker/structural.d.ts.map +1 -0
  23. package/dist/broker/structural.js +52 -0
  24. package/dist/broker/structural.js.map +1 -0
  25. package/dist/broker/task-resolution.d.ts +17 -0
  26. package/dist/broker/task-resolution.d.ts.map +1 -0
  27. package/dist/broker/task-resolution.js +386 -0
  28. package/dist/broker/task-resolution.js.map +1 -0
  29. package/dist/broker/validation.d.ts +14 -0
  30. package/dist/broker/validation.d.ts.map +1 -0
  31. package/dist/broker/validation.js +75 -0
  32. package/dist/broker/validation.js.map +1 -0
  33. package/dist/claims/claims.d.ts +14 -0
  34. package/dist/claims/claims.d.ts.map +1 -0
  35. package/dist/claims/claims.js +125 -0
  36. package/dist/claims/claims.js.map +1 -0
  37. package/dist/claims/index.d.ts +2 -0
  38. package/dist/claims/index.d.ts.map +1 -0
  39. package/dist/claims/index.js +2 -0
  40. package/dist/claims/index.js.map +1 -0
  41. package/dist/dashboard/index.d.ts +3 -0
  42. package/dist/dashboard/index.d.ts.map +1 -0
  43. package/dist/dashboard/index.js +3 -0
  44. package/dist/dashboard/index.js.map +1 -0
  45. package/dist/dashboard/metrics.d.ts +24 -0
  46. package/dist/dashboard/metrics.d.ts.map +1 -0
  47. package/dist/dashboard/metrics.js +358 -0
  48. package/dist/dashboard/metrics.js.map +1 -0
  49. package/dist/dashboard/store.d.ts +26 -0
  50. package/dist/dashboard/store.d.ts.map +1 -0
  51. package/dist/dashboard/store.js +97 -0
  52. package/dist/dashboard/store.js.map +1 -0
  53. package/dist/index.d.ts +12 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +23 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/insight/collector.d.ts +31 -0
  58. package/dist/insight/collector.d.ts.map +1 -0
  59. package/dist/insight/collector.js +172 -0
  60. package/dist/insight/collector.js.map +1 -0
  61. package/dist/insight/engine.d.ts +18 -0
  62. package/dist/insight/engine.d.ts.map +1 -0
  63. package/dist/insight/engine.js +84 -0
  64. package/dist/insight/engine.js.map +1 -0
  65. package/dist/insight/formatter.d.ts +9 -0
  66. package/dist/insight/formatter.d.ts.map +1 -0
  67. package/dist/insight/formatter.js +87 -0
  68. package/dist/insight/formatter.js.map +1 -0
  69. package/dist/insight/index.d.ts +13 -0
  70. package/dist/insight/index.d.ts.map +1 -0
  71. package/dist/insight/index.js +11 -0
  72. package/dist/insight/index.js.map +1 -0
  73. package/dist/insight/session.d.ts +11 -0
  74. package/dist/insight/session.d.ts.map +1 -0
  75. package/dist/insight/session.js +60 -0
  76. package/dist/insight/session.js.map +1 -0
  77. package/dist/integration/ambient-coordinator.d.ts +75 -0
  78. package/dist/integration/ambient-coordinator.d.ts.map +1 -0
  79. package/dist/integration/ambient-coordinator.js +183 -0
  80. package/dist/integration/ambient-coordinator.js.map +1 -0
  81. package/dist/integration/index.d.ts +4 -0
  82. package/dist/integration/index.d.ts.map +1 -0
  83. package/dist/integration/index.js +3 -0
  84. package/dist/integration/index.js.map +1 -0
  85. package/dist/integration/warning-throttle.d.ts +63 -0
  86. package/dist/integration/warning-throttle.d.ts.map +1 -0
  87. package/dist/integration/warning-throttle.js +347 -0
  88. package/dist/integration/warning-throttle.js.map +1 -0
  89. package/dist/intervention/escalation.d.ts +23 -0
  90. package/dist/intervention/escalation.d.ts.map +1 -0
  91. package/dist/intervention/escalation.js +149 -0
  92. package/dist/intervention/escalation.js.map +1 -0
  93. package/dist/intervention/generator.d.ts +12 -0
  94. package/dist/intervention/generator.d.ts.map +1 -0
  95. package/dist/intervention/generator.js +191 -0
  96. package/dist/intervention/generator.js.map +1 -0
  97. package/dist/intervention/index.d.ts +4 -0
  98. package/dist/intervention/index.d.ts.map +1 -0
  99. package/dist/intervention/index.js +4 -0
  100. package/dist/intervention/index.js.map +1 -0
  101. package/dist/intervention/signal-aggregator.d.ts +26 -0
  102. package/dist/intervention/signal-aggregator.d.ts.map +1 -0
  103. package/dist/intervention/signal-aggregator.js +274 -0
  104. package/dist/intervention/signal-aggregator.js.map +1 -0
  105. package/dist/layer-d/conflict-detector.d.ts +12 -0
  106. package/dist/layer-d/conflict-detector.d.ts.map +1 -0
  107. package/dist/layer-d/conflict-detector.js +150 -0
  108. package/dist/layer-d/conflict-detector.js.map +1 -0
  109. package/dist/layer-d/index.d.ts +3 -0
  110. package/dist/layer-d/index.d.ts.map +1 -0
  111. package/dist/layer-d/index.js +3 -0
  112. package/dist/layer-d/index.js.map +1 -0
  113. package/dist/layer-d/surface-extractor.d.ts +10 -0
  114. package/dist/layer-d/surface-extractor.d.ts.map +1 -0
  115. package/dist/layer-d/surface-extractor.js +96 -0
  116. package/dist/layer-d/surface-extractor.js.map +1 -0
  117. package/dist/policy-domains/domains.d.ts +31 -0
  118. package/dist/policy-domains/domains.d.ts.map +1 -0
  119. package/dist/policy-domains/domains.js +445 -0
  120. package/dist/policy-domains/domains.js.map +1 -0
  121. package/dist/policy-domains/index.d.ts +8 -0
  122. package/dist/policy-domains/index.d.ts.map +1 -0
  123. package/dist/policy-domains/index.js +8 -0
  124. package/dist/policy-domains/index.js.map +1 -0
  125. package/dist/pulse/index.d.ts +2 -0
  126. package/dist/pulse/index.d.ts.map +1 -0
  127. package/dist/pulse/index.js +2 -0
  128. package/dist/pulse/index.js.map +1 -0
  129. package/dist/pulse/pulse.d.ts +20 -0
  130. package/dist/pulse/pulse.d.ts.map +1 -0
  131. package/dist/pulse/pulse.js +253 -0
  132. package/dist/pulse/pulse.js.map +1 -0
  133. package/dist/severity/index.d.ts +2 -0
  134. package/dist/severity/index.d.ts.map +1 -0
  135. package/dist/severity/index.js +2 -0
  136. package/dist/severity/index.js.map +1 -0
  137. package/dist/severity/severity.d.ts +48 -0
  138. package/dist/severity/severity.d.ts.map +1 -0
  139. package/dist/severity/severity.js +134 -0
  140. package/dist/severity/severity.js.map +1 -0
  141. package/dist/staleness/index.d.ts +2 -0
  142. package/dist/staleness/index.d.ts.map +1 -0
  143. package/dist/staleness/index.js +2 -0
  144. package/dist/staleness/index.js.map +1 -0
  145. package/dist/staleness/jit-staleness.d.ts +29 -0
  146. package/dist/staleness/jit-staleness.d.ts.map +1 -0
  147. package/dist/staleness/jit-staleness.js +240 -0
  148. package/dist/staleness/jit-staleness.js.map +1 -0
  149. package/dist/team-policy/index.d.ts +1 -1
  150. package/dist/team-policy/index.d.ts.map +1 -1
  151. package/dist/team-policy/index.js +1 -1
  152. package/dist/team-policy/index.js.map +1 -1
  153. package/dist/team-policy/policy.d.ts +7 -0
  154. package/dist/team-policy/policy.d.ts.map +1 -1
  155. package/dist/team-policy/policy.js +38 -0
  156. package/dist/team-policy/policy.js.map +1 -1
  157. package/dist/trust/approval.d.ts +16 -0
  158. package/dist/trust/approval.d.ts.map +1 -0
  159. package/dist/trust/approval.js +183 -0
  160. package/dist/trust/approval.js.map +1 -0
  161. package/dist/trust/capsule.d.ts +36 -0
  162. package/dist/trust/capsule.d.ts.map +1 -0
  163. package/dist/trust/capsule.js +206 -0
  164. package/dist/trust/capsule.js.map +1 -0
  165. package/dist/trust/index.d.ts +6 -0
  166. package/dist/trust/index.d.ts.map +1 -0
  167. package/dist/trust/index.js +6 -0
  168. package/dist/trust/index.js.map +1 -0
  169. package/dist/trust/learning-feedback.d.ts +18 -0
  170. package/dist/trust/learning-feedback.d.ts.map +1 -0
  171. package/dist/trust/learning-feedback.js +146 -0
  172. package/dist/trust/learning-feedback.js.map +1 -0
  173. package/dist/trust/risk-scoring.d.ts +16 -0
  174. package/dist/trust/risk-scoring.d.ts.map +1 -0
  175. package/dist/trust/risk-scoring.js +142 -0
  176. package/dist/trust/risk-scoring.js.map +1 -0
  177. package/dist/trust/timeline.d.ts +42 -0
  178. package/dist/trust/timeline.d.ts.map +1 -0
  179. package/dist/trust/timeline.js +154 -0
  180. package/dist/trust/timeline.js.map +1 -0
  181. package/package.json +10 -2
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Soft Claims — Social Coordination
3
+ *
4
+ * Advisory claims that signal active work on files.
5
+ * Claims are ephemeral, timestamped, and never block operations.
6
+ * Stored in .codeledger/claims/<sessionId>.json (git-ignored).
7
+ */
8
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, unlinkSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ const CLAIMS_DIR = '.codeledger/claims';
11
+ const DEFAULT_EXPIRY_MS = 2 * 60 * 60 * 1000; // 2 hours
12
+ /** Ensure claims directory exists and is git-ignored */
13
+ function ensureClaimsDir(repoRoot) {
14
+ const dir = join(repoRoot, CLAIMS_DIR);
15
+ if (!existsSync(dir)) {
16
+ mkdirSync(dir, { recursive: true });
17
+ }
18
+ // Ensure .gitignore includes claims
19
+ const gitignore = join(repoRoot, CLAIMS_DIR, '.gitignore');
20
+ if (!existsSync(gitignore)) {
21
+ writeFileSync(gitignore, '*\n!.gitignore\n', 'utf-8');
22
+ }
23
+ return dir;
24
+ }
25
+ /** Write a soft claim for a session */
26
+ export function writeClaim(repoRoot, claim, expiryMs = DEFAULT_EXPIRY_MS) {
27
+ const dir = ensureClaimsDir(repoRoot);
28
+ const fullClaim = {
29
+ ...claim,
30
+ expiresAt: new Date(Date.now() + expiryMs).toISOString(),
31
+ };
32
+ const filePath = join(dir, `${claim.sessionId}.json`);
33
+ writeFileSync(filePath, JSON.stringify(fullClaim, null, 2) + '\n', 'utf-8');
34
+ return fullClaim;
35
+ }
36
+ /** Read all active (non-expired) claims */
37
+ export function readActiveClaims(repoRoot) {
38
+ const dir = join(repoRoot, CLAIMS_DIR);
39
+ if (!existsSync(dir))
40
+ return [];
41
+ const claims = [];
42
+ const now = Date.now();
43
+ for (const file of readdirSync(dir)) {
44
+ if (!file.endsWith('.json') || file === '.gitignore')
45
+ continue;
46
+ try {
47
+ const raw = readFileSync(join(dir, file), 'utf-8');
48
+ const claim = JSON.parse(raw);
49
+ if (new Date(claim.expiresAt).getTime() > now) {
50
+ claims.push(claim);
51
+ }
52
+ }
53
+ catch {
54
+ // Skip corrupted claim files
55
+ }
56
+ }
57
+ return claims;
58
+ }
59
+ /** Remove expired claims */
60
+ export function pruneExpiredClaims(repoRoot) {
61
+ const dir = join(repoRoot, CLAIMS_DIR);
62
+ if (!existsSync(dir))
63
+ return 0;
64
+ let pruned = 0;
65
+ const now = Date.now();
66
+ for (const file of readdirSync(dir)) {
67
+ if (!file.endsWith('.json') || file === '.gitignore')
68
+ continue;
69
+ try {
70
+ const raw = readFileSync(join(dir, file), 'utf-8');
71
+ const claim = JSON.parse(raw);
72
+ if (new Date(claim.expiresAt).getTime() <= now) {
73
+ unlinkSync(join(dir, file));
74
+ pruned++;
75
+ }
76
+ }
77
+ catch {
78
+ // Remove corrupted files too
79
+ try {
80
+ unlinkSync(join(dir, file));
81
+ pruned++;
82
+ }
83
+ catch { /* ignore */ }
84
+ }
85
+ }
86
+ return pruned;
87
+ }
88
+ /** Remove a specific session's claim */
89
+ export function removeClaim(repoRoot, sessionId) {
90
+ const filePath = join(repoRoot, CLAIMS_DIR, `${sessionId}.json`);
91
+ if (existsSync(filePath)) {
92
+ unlinkSync(filePath);
93
+ return true;
94
+ }
95
+ return false;
96
+ }
97
+ /** Get presence information: which actors are working on which files */
98
+ export function getPresence(repoRoot) {
99
+ const claims = readActiveClaims(repoRoot);
100
+ const fileMap = new Map();
101
+ for (const claim of claims) {
102
+ for (const file of claim.touchedFiles) {
103
+ if (!fileMap.has(file)) {
104
+ fileMap.set(file, []);
105
+ }
106
+ fileMap.get(file).push({
107
+ actorId: claim.actorId,
108
+ sessionId: claim.sessionId,
109
+ intentLabel: claim.intentLabel,
110
+ timestamp: claim.timestamp,
111
+ });
112
+ }
113
+ }
114
+ return [...fileMap.entries()]
115
+ .map(([file, actors]) => ({ file, actors }))
116
+ .sort((a, b) => b.actors.length - a.actors.length);
117
+ }
118
+ /** Format presence as human-readable strings */
119
+ export function formatPresence(presence) {
120
+ return presence.map(p => {
121
+ const actors = p.actors.map(a => `${a.actorId} (${a.intentLabel})`).join(', ');
122
+ return `${p.file}: ${actors}`;
123
+ });
124
+ }
125
+ //# sourceMappingURL=claims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claims.js","sourceRoot":"","sources":["../../src/claims/claims.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { writeClaim, readActiveClaims, pruneExpiredClaims, removeClaim, getPresence, formatPresence, } from './claims.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/claims/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { writeClaim, readActiveClaims, pruneExpiredClaims, removeClaim, getPresence, formatPresence, } from './claims.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/claims/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { computeDashboardMetrics, healthRating } from './metrics.js';
2
+ export { appendDashboardSnapshot, readDashboardHistory, computeTrends, DASHBOARD_HISTORY_FILE, } from './store.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dashboard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { computeDashboardMetrics, healthRating } from './metrics.js';
2
+ export { appendDashboardSnapshot, readDashboardHistory, computeTrends, DASHBOARD_HISTORY_FILE, } from './store.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dashboard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Dashboard Metrics Engine — Architecture Health Dashboard
3
+ *
4
+ * Computes 5 key metrics from existing subsystem data:
5
+ * - AHS: Architecture Health Score
6
+ * - DRI: Duplication Risk Index
7
+ * - EDS: Extension Discipline Score
8
+ * - STS: Source-of-Truth Stability
9
+ * - Override Frequency
10
+ *
11
+ * All scores are [0, 1]. Graceful degradation: missing data sources default to 0.5.
12
+ */
13
+ import type { DashboardMetrics, HealthRating } from '@codeledger/types';
14
+ /**
15
+ * Compute all 5 dashboard metrics from data stored under `dataDir` (.codeledger/).
16
+ *
17
+ * Each metric degrades gracefully: if its data source is missing, it uses 0.5 (neutral).
18
+ */
19
+ export declare function computeDashboardMetrics(dataDir: string): Promise<DashboardMetrics>;
20
+ /**
21
+ * Derive a qualitative health rating from the overall score.
22
+ */
23
+ export declare function healthRating(overall: number): HealthRating;
24
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/dashboard/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBxE;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwBxF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAM1D"}
@@ -0,0 +1,358 @@
1
+ /**
2
+ * Dashboard Metrics Engine — Architecture Health Dashboard
3
+ *
4
+ * Computes 5 key metrics from existing subsystem data:
5
+ * - AHS: Architecture Health Score
6
+ * - DRI: Duplication Risk Index
7
+ * - EDS: Extension Discipline Score
8
+ * - STS: Source-of-Truth Stability
9
+ * - Override Frequency
10
+ *
11
+ * All scores are [0, 1]. Graceful degradation: missing data sources default to 0.5.
12
+ */
13
+ import { readFileSync, existsSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ // ─── Weight Constants ────────────────────────────────────────────────────────
16
+ // AHS sub-weights (sum = 1.0)
17
+ const AHS_W_VIOLATIONS = 0.30;
18
+ const AHS_W_CONFIDENCE = 0.25;
19
+ const AHS_W_DRIFT = 0.15;
20
+ const AHS_W_TEST_COVERAGE = 0.15;
21
+ const AHS_W_CONFLICTS = 0.15;
22
+ // Overall dashboard weights (sum = 1.0)
23
+ const OVERALL_W_AHS = 0.35;
24
+ const OVERALL_W_DRI = 0.20;
25
+ const OVERALL_W_EDS = 0.20;
26
+ const OVERALL_W_STS = 0.15;
27
+ const OVERALL_W_OVERRIDE = 0.10;
28
+ // Neutral default when data is missing
29
+ const NEUTRAL = 0.5;
30
+ // ─── Public API ──────────────────────────────────────────────────────────────
31
+ /**
32
+ * Compute all 5 dashboard metrics from data stored under `dataDir` (.codeledger/).
33
+ *
34
+ * Each metric degrades gracefully: if its data source is missing, it uses 0.5 (neutral).
35
+ */
36
+ export async function computeDashboardMetrics(dataDir) {
37
+ const ahs = computeAHS(dataDir);
38
+ const dri = computeDRI(dataDir);
39
+ const eds = computeEDS(dataDir);
40
+ const sts = computeSTS(dataDir);
41
+ const overrideFrequency = computeOverrideFrequency(dataDir);
42
+ const overall = clamp(OVERALL_W_AHS * ahs +
43
+ OVERALL_W_DRI * (1 - dri) + // DRI is a risk index — lower is better
44
+ OVERALL_W_EDS * eds +
45
+ OVERALL_W_STS * sts +
46
+ OVERALL_W_OVERRIDE * (1 - overrideFrequency));
47
+ return {
48
+ ahs,
49
+ dri,
50
+ eds,
51
+ sts,
52
+ override_frequency: overrideFrequency,
53
+ overall,
54
+ timestamp: Date.now(),
55
+ };
56
+ }
57
+ /**
58
+ * Derive a qualitative health rating from the overall score.
59
+ */
60
+ export function healthRating(overall) {
61
+ if (overall >= 0.9)
62
+ return 'EXCELLENT';
63
+ if (overall >= 0.75)
64
+ return 'GOOD';
65
+ if (overall >= 0.6)
66
+ return 'FAIR';
67
+ if (overall >= 0.4)
68
+ return 'POOR';
69
+ return 'CRITICAL';
70
+ }
71
+ // ─── AHS: Architecture Health Score ──────────────────────────────────────────
72
+ function computeAHS(dataDir) {
73
+ const violationScore = loadViolationDensity(dataDir);
74
+ const confidenceScore = loadConfidenceAverage(dataDir);
75
+ const driftScore = loadDriftAverage(dataDir);
76
+ const testCoverageScore = loadTestCoveragePresence(dataDir);
77
+ const conflictScore = loadConflictSeverityAverage(dataDir);
78
+ return clamp(AHS_W_VIOLATIONS * violationScore +
79
+ AHS_W_CONFIDENCE * confidenceScore +
80
+ AHS_W_DRIFT * (1 - driftScore) + // lower drift = higher score
81
+ AHS_W_TEST_COVERAGE * testCoverageScore +
82
+ AHS_W_CONFLICTS * (1 - conflictScore));
83
+ }
84
+ // ─── DRI: Duplication Risk Index ─────────────────────────────────────────────
85
+ function computeDRI(dataDir) {
86
+ // DRI [0,1] where higher = more duplication risk
87
+ const overlapFrequency = loadOverlapFrequency(dataDir);
88
+ const ghostFileRatio = loadGhostFileRatio(dataDir);
89
+ const fragmentationSignal = loadFragmentationSignal(dataDir);
90
+ return clamp(0.40 * overlapFrequency +
91
+ 0.30 * ghostFileRatio +
92
+ 0.30 * fragmentationSignal);
93
+ }
94
+ // ─── EDS: Extension Discipline Score ─────────────────────────────────────────
95
+ function computeEDS(dataDir) {
96
+ const extensionRatio = loadExtensionRatio(dataDir);
97
+ const insertionCompliance = loadInsertionCompliance(dataDir);
98
+ const reuseCompliance = loadReuseCompliance(dataDir);
99
+ return clamp(0.40 * extensionRatio +
100
+ 0.30 * insertionCompliance +
101
+ 0.30 * reuseCompliance);
102
+ }
103
+ // ─── STS: Source-of-Truth Stability ──────────────────────────────────────────
104
+ function computeSTS(dataDir) {
105
+ const confidenceStability = loadConfidenceStability(dataDir);
106
+ const changeFrequency = loadSoTChangeFrequency(dataDir);
107
+ const fragFrequency = loadSoTFragmentationFrequency(dataDir);
108
+ return clamp(0.40 * confidenceStability +
109
+ 0.30 * (1 - changeFrequency) + // fewer changes = more stable
110
+ 0.30 * (1 - fragFrequency));
111
+ }
112
+ // ─── Override Frequency ──────────────────────────────────────────────────────
113
+ function computeOverrideFrequency(dataDir) {
114
+ const policyPath = join(dataDir, 'policy-evaluations.json');
115
+ if (!existsSync(policyPath))
116
+ return NEUTRAL;
117
+ try {
118
+ const data = JSON.parse(readFileSync(policyPath, 'utf-8'));
119
+ const total = data.total_evaluations ?? 0;
120
+ const overrides = data.override_count ?? 0;
121
+ if (total === 0)
122
+ return NEUTRAL;
123
+ return clamp(overrides / total);
124
+ }
125
+ catch {
126
+ return NEUTRAL;
127
+ }
128
+ }
129
+ // ─── Data Loaders (graceful degradation) ─────────────────────────────────────
130
+ function loadViolationDensity(dataDir) {
131
+ // Review Intelligence findings — fewer violations = higher score
132
+ const reportPath = join(dataDir, 'verify-report.json');
133
+ if (!existsSync(reportPath))
134
+ return NEUTRAL;
135
+ try {
136
+ const data = JSON.parse(readFileSync(reportPath, 'utf-8'));
137
+ const findings = data.review_intelligence?.total_findings ?? 0;
138
+ const filesScanned = data.review_intelligence?.files_scanned ?? 1;
139
+ if (filesScanned === 0)
140
+ return NEUTRAL;
141
+ // Density: findings per file. Cap at 1.0 and invert so fewer = higher score
142
+ const density = Math.min(findings / filesScanned, 1.0);
143
+ return clamp(1 - density);
144
+ }
145
+ catch {
146
+ return NEUTRAL;
147
+ }
148
+ }
149
+ function loadConfidenceAverage(dataDir) {
150
+ const metricsPath = join(dataDir, 'team-metrics.json');
151
+ if (!existsSync(metricsPath))
152
+ return NEUTRAL;
153
+ try {
154
+ const data = JSON.parse(readFileSync(metricsPath, 'utf-8'));
155
+ return typeof data.avgCcs === 'number' ? clamp(data.avgCcs) : NEUTRAL;
156
+ }
157
+ catch {
158
+ return NEUTRAL;
159
+ }
160
+ }
161
+ function loadDriftAverage(dataDir) {
162
+ const metricsPath = join(dataDir, 'team-metrics.json');
163
+ if (!existsSync(metricsPath))
164
+ return NEUTRAL;
165
+ try {
166
+ const data = JSON.parse(readFileSync(metricsPath, 'utf-8'));
167
+ return typeof data.avgDrift === 'number' ? clamp(data.avgDrift) : NEUTRAL;
168
+ }
169
+ catch {
170
+ return NEUTRAL;
171
+ }
172
+ }
173
+ function loadTestCoveragePresence(dataDir) {
174
+ const reportPath = join(dataDir, 'verify-report.json');
175
+ if (!existsSync(reportPath))
176
+ return NEUTRAL;
177
+ try {
178
+ const data = JSON.parse(readFileSync(reportPath, 'utf-8'));
179
+ if (data.coverage_attestation?.coverage_percent !== undefined) {
180
+ return clamp(data.coverage_attestation.coverage_percent / 100);
181
+ }
182
+ if (data.test_coverage_present !== undefined) {
183
+ return data.test_coverage_present ? 0.8 : 0.2;
184
+ }
185
+ return NEUTRAL;
186
+ }
187
+ catch {
188
+ return NEUTRAL;
189
+ }
190
+ }
191
+ function loadConflictSeverityAverage(dataDir) {
192
+ const conflictsPath = join(dataDir, 'layer-d-analysis.json');
193
+ if (!existsSync(conflictsPath))
194
+ return NEUTRAL;
195
+ try {
196
+ const data = JSON.parse(readFileSync(conflictsPath, 'utf-8'));
197
+ const conflicts = data.conflicts ?? [];
198
+ if (conflicts.length === 0)
199
+ return 0; // no conflicts = perfect
200
+ const avg = conflicts.reduce((sum, c) => sum + c.severity, 0) / conflicts.length;
201
+ return clamp(avg);
202
+ }
203
+ catch {
204
+ return NEUTRAL;
205
+ }
206
+ }
207
+ function loadOverlapFrequency(dataDir) {
208
+ // Look for discovery results
209
+ const discoveryPath = join(dataDir, 'discovery-results.json');
210
+ if (!existsSync(discoveryPath))
211
+ return NEUTRAL;
212
+ try {
213
+ const data = JSON.parse(readFileSync(discoveryPath, 'utf-8'));
214
+ const results = data.results ?? [];
215
+ if (results.length === 0)
216
+ return NEUTRAL;
217
+ const strongOverlaps = results.filter((r) => r.overlap === 'STRONG_OVERLAP' || r.overlap === 'FEATURE_ALREADY_EXISTS').length;
218
+ return clamp(strongOverlaps / results.length);
219
+ }
220
+ catch {
221
+ return NEUTRAL;
222
+ }
223
+ }
224
+ function loadGhostFileRatio(dataDir) {
225
+ const reportPath = join(dataDir, 'verify-report.json');
226
+ if (!existsSync(reportPath))
227
+ return NEUTRAL;
228
+ try {
229
+ const data = JSON.parse(readFileSync(reportPath, 'utf-8'));
230
+ const ghosts = data.ghost_files ?? 0;
231
+ const total = data.total_files ?? 1;
232
+ if (total === 0)
233
+ return NEUTRAL;
234
+ return clamp(ghosts / total);
235
+ }
236
+ catch {
237
+ return NEUTRAL;
238
+ }
239
+ }
240
+ function loadFragmentationSignal(dataDir) {
241
+ const sotPath = join(dataDir, 'sot-analysis.json');
242
+ if (!existsSync(sotPath))
243
+ return NEUTRAL;
244
+ try {
245
+ const data = JSON.parse(readFileSync(sotPath, 'utf-8'));
246
+ if (data.fragmented === true)
247
+ return 0.8;
248
+ if (data.fragmented === false)
249
+ return 0.1;
250
+ return NEUTRAL;
251
+ }
252
+ catch {
253
+ return NEUTRAL;
254
+ }
255
+ }
256
+ function loadExtensionRatio(dataDir) {
257
+ const statsPath = join(dataDir, 'commit-stats.json');
258
+ if (!existsSync(statsPath))
259
+ return NEUTRAL;
260
+ try {
261
+ const data = JSON.parse(readFileSync(statsPath, 'utf-8'));
262
+ const extensions = data.extensions ?? 0;
263
+ const newFiles = data.new_files ?? 0;
264
+ const total = extensions + newFiles;
265
+ if (total === 0)
266
+ return NEUTRAL;
267
+ return clamp(extensions / total);
268
+ }
269
+ catch {
270
+ return NEUTRAL;
271
+ }
272
+ }
273
+ function loadInsertionCompliance(dataDir) {
274
+ const compliancePath = join(dataDir, 'insertion-compliance.json');
275
+ if (!existsSync(compliancePath))
276
+ return NEUTRAL;
277
+ try {
278
+ const data = JSON.parse(readFileSync(compliancePath, 'utf-8'));
279
+ return typeof data.compliance_rate === 'number' ? clamp(data.compliance_rate) : NEUTRAL;
280
+ }
281
+ catch {
282
+ return NEUTRAL;
283
+ }
284
+ }
285
+ function loadReuseCompliance(dataDir) {
286
+ const compliancePath = join(dataDir, 'reuse-compliance.json');
287
+ if (!existsSync(compliancePath))
288
+ return NEUTRAL;
289
+ try {
290
+ const data = JSON.parse(readFileSync(compliancePath, 'utf-8'));
291
+ return typeof data.compliance_rate === 'number' ? clamp(data.compliance_rate) : NEUTRAL;
292
+ }
293
+ catch {
294
+ return NEUTRAL;
295
+ }
296
+ }
297
+ function loadConfidenceStability(dataDir) {
298
+ // Low variance in SoT confidence over time = high stability
299
+ const historyPath = join(dataDir, 'sot-history.json');
300
+ if (!existsSync(historyPath))
301
+ return NEUTRAL;
302
+ try {
303
+ const entries = JSON.parse(readFileSync(historyPath, 'utf-8'));
304
+ if (entries.length < 2)
305
+ return NEUTRAL;
306
+ const confidences = entries
307
+ .map((e) => e.confidence)
308
+ .filter((c) => typeof c === 'number');
309
+ if (confidences.length < 2)
310
+ return NEUTRAL;
311
+ const mean = confidences.reduce((s, v) => s + v, 0) / confidences.length;
312
+ const variance = confidences.reduce((s, v) => s + (v - mean) ** 2, 0) / confidences.length;
313
+ // Low variance = high stability. Variance of [0,1] values is at most 0.25.
314
+ return clamp(1 - variance * 4);
315
+ }
316
+ catch {
317
+ return NEUTRAL;
318
+ }
319
+ }
320
+ function loadSoTChangeFrequency(dataDir) {
321
+ const historyPath = join(dataDir, 'sot-history.json');
322
+ if (!existsSync(historyPath))
323
+ return NEUTRAL;
324
+ try {
325
+ const entries = JSON.parse(readFileSync(historyPath, 'utf-8'));
326
+ if (entries.length < 2)
327
+ return NEUTRAL;
328
+ let changes = 0;
329
+ for (let i = 1; i < entries.length; i++) {
330
+ if (entries[i].system !== entries[i - 1].system)
331
+ changes++;
332
+ }
333
+ return clamp(changes / (entries.length - 1));
334
+ }
335
+ catch {
336
+ return NEUTRAL;
337
+ }
338
+ }
339
+ function loadSoTFragmentationFrequency(dataDir) {
340
+ const historyPath = join(dataDir, 'sot-history.json');
341
+ if (!existsSync(historyPath))
342
+ return NEUTRAL;
343
+ try {
344
+ const entries = JSON.parse(readFileSync(historyPath, 'utf-8'));
345
+ if (entries.length === 0)
346
+ return NEUTRAL;
347
+ const fragCount = entries.filter((e) => e.fragmented === true).length;
348
+ return clamp(fragCount / entries.length);
349
+ }
350
+ catch {
351
+ return NEUTRAL;
352
+ }
353
+ }
354
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
355
+ function clamp(value) {
356
+ return Math.max(0, Math.min(1, value));
357
+ }
358
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/dashboard/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Dashboard Data Store — Append-only JSONL persistence for dashboard snapshots
3
+ *
4
+ * Storage: .codeledger/dashboard-history.jsonl
5
+ *
6
+ * Each line is a JSON-encoded DashboardSnapshot.
7
+ */
8
+ import type { DashboardMetrics, DashboardSnapshot, DashboardTrends } from '@codeledger/types';
9
+ export declare const DASHBOARD_HISTORY_FILE = "dashboard-history.jsonl";
10
+ /**
11
+ * Append a dashboard metrics snapshot to the JSONL history file.
12
+ */
13
+ export declare function appendDashboardSnapshot(dataDir: string, metrics: DashboardMetrics, source?: string): void;
14
+ /**
15
+ * Read all dashboard snapshots from the JSONL history file.
16
+ * Returns an empty array if the file does not exist.
17
+ */
18
+ export declare function readDashboardHistory(dataDir: string): DashboardSnapshot[];
19
+ /**
20
+ * Compute trend directions from dashboard history.
21
+ *
22
+ * Uses the last 5 entries to determine if each metric is improving, stable, or degrading.
23
+ * For DRI and override_frequency, a decrease is "improving" (lower risk is better).
24
+ */
25
+ export declare function computeTrends(history: DashboardSnapshot[]): DashboardTrends;
26
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/dashboard/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,sBAAsB,4BAA4B,CAAC;AAOhE;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,gBAAgB,EACzB,MAAM,GAAE,MAAc,GACrB,IAAI,CAQN;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAsBzE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,eAAe,CAyB3E"}