@neurcode-ai/governance-runtime 0.1.2 → 0.1.4

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 (54) hide show
  1. package/LICENSE +201 -0
  2. package/dist/admission-provenance.d.ts +111 -0
  3. package/dist/admission-provenance.d.ts.map +1 -0
  4. package/dist/admission-provenance.js +735 -0
  5. package/dist/admission-provenance.js.map +1 -0
  6. package/dist/agent-guard-posture.d.ts +40 -0
  7. package/dist/agent-guard-posture.d.ts.map +1 -0
  8. package/dist/agent-guard-posture.js +117 -0
  9. package/dist/agent-guard-posture.js.map +1 -0
  10. package/dist/agent-invocation-observability.d.ts +47 -0
  11. package/dist/agent-invocation-observability.d.ts.map +1 -0
  12. package/dist/agent-invocation-observability.js +229 -0
  13. package/dist/agent-invocation-observability.js.map +1 -0
  14. package/dist/agent-plan.d.ts +119 -0
  15. package/dist/agent-plan.d.ts.map +1 -0
  16. package/dist/agent-plan.js +565 -0
  17. package/dist/agent-plan.js.map +1 -0
  18. package/dist/agent-runtime-adapter.d.ts +69 -0
  19. package/dist/agent-runtime-adapter.d.ts.map +1 -0
  20. package/dist/agent-runtime-adapter.js +274 -0
  21. package/dist/agent-runtime-adapter.js.map +1 -0
  22. package/dist/ai-change-record.d.ts +185 -0
  23. package/dist/ai-change-record.d.ts.map +1 -0
  24. package/dist/ai-change-record.js +580 -0
  25. package/dist/ai-change-record.js.map +1 -0
  26. package/dist/architecture-graph.d.ts +153 -0
  27. package/dist/architecture-graph.d.ts.map +1 -0
  28. package/dist/architecture-graph.js +646 -0
  29. package/dist/architecture-graph.js.map +1 -0
  30. package/dist/architecture-obligations.d.ts +153 -0
  31. package/dist/architecture-obligations.d.ts.map +1 -0
  32. package/dist/architecture-obligations.js +505 -0
  33. package/dist/architecture-obligations.js.map +1 -0
  34. package/dist/constraints.d.ts +9 -1
  35. package/dist/constraints.d.ts.map +1 -1
  36. package/dist/constraints.js +285 -34
  37. package/dist/constraints.js.map +1 -1
  38. package/dist/index.d.ts +10 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +188 -10
  41. package/dist/index.js.map +1 -1
  42. package/dist/profile.d.ts +159 -0
  43. package/dist/profile.d.ts.map +1 -0
  44. package/dist/profile.js +611 -0
  45. package/dist/profile.js.map +1 -0
  46. package/dist/session.d.ts +428 -0
  47. package/dist/session.d.ts.map +1 -0
  48. package/dist/session.js +2052 -0
  49. package/dist/session.js.map +1 -0
  50. package/package.json +19 -8
  51. package/src/constraints.ts +0 -432
  52. package/src/index.test.ts +0 -382
  53. package/src/index.ts +0 -373
  54. package/tsconfig.json +0 -19
package/src/index.test.ts DELETED
@@ -1,382 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import {
4
- compileDeterministicConstraints,
5
- buildPlanVerificationMessage,
6
- evaluatePlanVerification,
7
- extractPlannedFilePaths,
8
- resolvePlanVerdict,
9
- type PlanDiffFile,
10
- } from './index';
11
-
12
- const SAMPLE_PLAN = [
13
- { path: 'src/a.ts', action: 'MODIFY' },
14
- { path: 'src/b.ts', action: 'CREATE' },
15
- { path: 'docs/readme.md', action: 'BLOCK' },
16
- ];
17
-
18
- function makeChangedFiles(paths: string[]): PlanDiffFile[] {
19
- return paths.map((path) => ({
20
- path,
21
- changeType: 'modify',
22
- added: 1,
23
- removed: 0,
24
- hunks: [
25
- {
26
- oldStart: 1,
27
- oldLines: 0,
28
- newStart: 1,
29
- newLines: 1,
30
- lines: [
31
- {
32
- type: 'added',
33
- content: 'const x = 1;',
34
- },
35
- ],
36
- },
37
- ],
38
- }));
39
- }
40
-
41
- test('extractPlannedFilePaths includes only CREATE/MODIFY actions', () => {
42
- const paths = extractPlannedFilePaths(SAMPLE_PLAN);
43
- assert.deepEqual(paths, ['src/a.ts', 'src/b.ts']);
44
- });
45
-
46
- test('resolvePlanVerdict reproduces legacy threshold rules', () => {
47
- assert.equal(
48
- resolvePlanVerdict({
49
- bloatCount: 0,
50
- adherenceScore: 100,
51
- totalPlannedFiles: 2,
52
- plannedFilesModified: 2,
53
- constraintViolations: [],
54
- }),
55
- 'PASS'
56
- );
57
-
58
- assert.equal(
59
- resolvePlanVerdict({
60
- bloatCount: 1,
61
- adherenceScore: 100,
62
- totalPlannedFiles: 2,
63
- plannedFilesModified: 2,
64
- constraintViolations: [],
65
- }),
66
- 'WARN'
67
- );
68
-
69
- assert.equal(
70
- resolvePlanVerdict({
71
- bloatCount: 2,
72
- adherenceScore: 40,
73
- totalPlannedFiles: 5,
74
- plannedFilesModified: 2,
75
- constraintViolations: [],
76
- }),
77
- 'FAIL'
78
- );
79
-
80
- assert.equal(
81
- resolvePlanVerdict({
82
- bloatCount: 0,
83
- adherenceScore: 0,
84
- totalPlannedFiles: 0,
85
- plannedFilesModified: 0,
86
- constraintViolations: [],
87
- }),
88
- 'FAIL'
89
- );
90
- });
91
-
92
- test('evaluatePlanVerification computes adherence and bloat deterministically', () => {
93
- const result = evaluatePlanVerification({
94
- planFiles: SAMPLE_PLAN,
95
- changedFiles: makeChangedFiles(['src/a.ts', 'src/unplanned.ts']),
96
- diffStats: {
97
- totalAdded: 2,
98
- totalRemoved: 0,
99
- totalFiles: 2,
100
- },
101
- });
102
-
103
- assert.equal(result.adherenceScore, 50);
104
- assert.equal(result.totalPlannedFiles, 2);
105
- assert.equal(result.plannedFilesModified, 1);
106
- assert.equal(result.bloatCount, 1);
107
- assert.deepEqual(result.bloatFiles, ['src/unplanned.ts']);
108
- assert.equal(result.verdict, 'WARN');
109
- assert.equal(result.scopeGuardPassed, false);
110
- assert.equal(result.diffSummary.added, 2);
111
- assert.equal(result.diffSummary.removed, 0);
112
- });
113
-
114
- test('evaluatePlanVerification fails on no-useEffect constraint violations', () => {
115
- const result = evaluatePlanVerification({
116
- planFiles: SAMPLE_PLAN,
117
- changedFiles: [
118
- {
119
- path: 'src/a.ts',
120
- changeType: 'modify',
121
- added: 1,
122
- removed: 0,
123
- hunks: [
124
- {
125
- oldStart: 1,
126
- oldLines: 0,
127
- newStart: 1,
128
- newLines: 1,
129
- lines: [
130
- {
131
- type: 'added',
132
- content: 'useEffect(() => { console.log(1); }, []);',
133
- },
134
- ],
135
- },
136
- ],
137
- },
138
- ],
139
- intentConstraints: 'No useEffect',
140
- });
141
-
142
- assert.equal(result.verdict, 'FAIL');
143
- assert.equal(result.constraintViolations.length, 1);
144
- assert.match(result.message, /Constraint violation/i);
145
- });
146
-
147
- test('compileDeterministicConstraints builds rules from intent and policy text', () => {
148
- const compiled = compileDeterministicConstraints({
149
- intentConstraints: 'Do not use useEffect; avoid console.log in this change',
150
- policyRules: ['No debugger statements', 'No process.env usage in frontend code'],
151
- });
152
-
153
- const ruleIds = compiled.rules.map((rule) => rule.id);
154
- assert.ok(ruleIds.includes('intent:no_useeffect'));
155
- assert.ok(ruleIds.includes('intent:no_console_log'));
156
- assert.ok(ruleIds.includes('policy:no_debugger'));
157
- assert.ok(ruleIds.includes('policy:no_process_env'));
158
- });
159
-
160
- test('compileDeterministicConstraints supports path-scoped rules', () => {
161
- const compiled = compileDeterministicConstraints({
162
- policyRules: ['No console.log in src/server/** except src/server/tests/**'],
163
- });
164
- const scopedRule = compiled.rules.find((rule) => rule.id === 'policy:no_console_log');
165
- assert.ok(scopedRule, 'expected path-scoped console.log rule');
166
- assert.deepEqual(scopedRule?.pathIncludePatterns, ['src/server/**']);
167
- assert.deepEqual(scopedRule?.pathExcludePatterns, ['src/server/tests/**']);
168
- });
169
-
170
- test('evaluatePlanVerification enforces compiled policy rules deterministically', () => {
171
- const result = evaluatePlanVerification({
172
- planFiles: SAMPLE_PLAN,
173
- changedFiles: [
174
- {
175
- path: 'src/a.ts',
176
- changeType: 'modify',
177
- added: 1,
178
- removed: 0,
179
- hunks: [
180
- {
181
- oldStart: 1,
182
- oldLines: 0,
183
- newStart: 1,
184
- newLines: 1,
185
- lines: [
186
- {
187
- type: 'added',
188
- content: 'console.log("debug");',
189
- },
190
- ],
191
- },
192
- ],
193
- },
194
- ],
195
- policyRules: ['No console.log in committed code'],
196
- });
197
-
198
- assert.equal(result.verdict, 'FAIL');
199
- assert.equal(result.constraintViolations.length, 1);
200
- assert.match(result.constraintViolations[0], /console\.log/i);
201
- });
202
-
203
- test('evaluatePlanVerification enforces path-scoped exclusions to reduce false positives', () => {
204
- const result = evaluatePlanVerification({
205
- planFiles: SAMPLE_PLAN,
206
- changedFiles: [
207
- {
208
- path: 'src/server/app.ts',
209
- changeType: 'modify',
210
- added: 1,
211
- removed: 0,
212
- hunks: [
213
- {
214
- oldStart: 1,
215
- oldLines: 0,
216
- newStart: 1,
217
- newLines: 1,
218
- lines: [
219
- {
220
- type: 'added',
221
- content: 'console.log("server");',
222
- },
223
- ],
224
- },
225
- ],
226
- },
227
- {
228
- path: 'src/server/tests/app.test.ts',
229
- changeType: 'modify',
230
- added: 1,
231
- removed: 0,
232
- hunks: [
233
- {
234
- oldStart: 1,
235
- oldLines: 0,
236
- newStart: 1,
237
- newLines: 1,
238
- lines: [
239
- {
240
- type: 'added',
241
- content: 'console.log("test");',
242
- },
243
- ],
244
- },
245
- ],
246
- },
247
- ],
248
- policyRules: ['No console.log in src/server/** except src/server/tests/**'],
249
- });
250
-
251
- assert.equal(result.constraintViolations.length, 1);
252
- assert.match(result.constraintViolations[0], /src\/server\/app\.ts/i);
253
- });
254
-
255
- test('evaluatePlanVerification supports deterministic invocation limits with full-file context', () => {
256
- const result = evaluatePlanVerification({
257
- planFiles: SAMPLE_PLAN,
258
- changedFiles: [
259
- {
260
- path: 'src/a.ts',
261
- changeType: 'modify',
262
- added: 1,
263
- removed: 0,
264
- hunks: [
265
- {
266
- oldStart: 1,
267
- oldLines: 0,
268
- newStart: 1,
269
- newLines: 1,
270
- lines: [
271
- {
272
- type: 'added',
273
- content: 'const marker = true;',
274
- },
275
- ],
276
- },
277
- ],
278
- },
279
- ],
280
- intentConstraints: 'foo invoked only 1 times in src/a.ts',
281
- fileContents: {
282
- 'src/a.ts': 'foo();\nfoo();\n',
283
- },
284
- });
285
-
286
- assert.equal(result.verdict, 'FAIL');
287
- assert.equal(result.constraintViolations.length, 1);
288
- assert.match(result.constraintViolations[0], /limit 1/i);
289
- });
290
-
291
- test('evaluatePlanVerification supports at-least invocation constraints', () => {
292
- const result = evaluatePlanVerification({
293
- planFiles: SAMPLE_PLAN,
294
- changedFiles: [
295
- {
296
- path: 'src/a.ts',
297
- changeType: 'modify',
298
- added: 1,
299
- removed: 0,
300
- hunks: [
301
- {
302
- oldStart: 1,
303
- oldLines: 0,
304
- newStart: 1,
305
- newLines: 1,
306
- lines: [
307
- {
308
- type: 'added',
309
- content: 'const marker = true;',
310
- },
311
- ],
312
- },
313
- ],
314
- },
315
- ],
316
- intentConstraints: 'foo should be called at least 2 times in src/a.ts',
317
- fileContents: {
318
- 'src/a.ts': 'foo();\n',
319
- },
320
- });
321
-
322
- assert.equal(result.verdict, 'FAIL');
323
- assert.equal(result.constraintViolations.length, 1);
324
- assert.match(result.constraintViolations[0], /minimum 2/i);
325
- });
326
-
327
- test('compileDeterministicConstraints supports exact invocation constraints', () => {
328
- const compiled = compileDeterministicConstraints({
329
- intentConstraints: 'bar should be called exactly 3 times in src/a.ts',
330
- });
331
-
332
- const rule = compiled.rules.find((item) => item.id.includes('exact_invocations_bar'));
333
- assert.ok(rule, 'expected exact invocation rule');
334
- assert.equal(rule?.minMatchesPerFile, 3);
335
- assert.equal(rule?.maxMatchesPerFile, 3);
336
- });
337
-
338
- test('evaluatePlanVerification detects network-call invariants deterministically', () => {
339
- const result = evaluatePlanVerification({
340
- planFiles: SAMPLE_PLAN,
341
- changedFiles: [
342
- {
343
- path: 'src/a.ts',
344
- changeType: 'modify',
345
- added: 1,
346
- removed: 0,
347
- hunks: [
348
- {
349
- oldStart: 1,
350
- oldLines: 0,
351
- newStart: 1,
352
- newLines: 1,
353
- lines: [
354
- {
355
- type: 'added',
356
- content: 'await fetch("https://api.example.com");',
357
- },
358
- ],
359
- },
360
- ],
361
- },
362
- ],
363
- policyRules: ['No network calls in committed code'],
364
- });
365
-
366
- assert.equal(result.verdict, 'FAIL');
367
- assert.equal(result.constraintViolations.length, 1);
368
- assert.match(result.constraintViolations[0], /network-call/i);
369
- });
370
-
371
- test('buildPlanVerificationMessage handles incomplete 0/0 plans', () => {
372
- const message = buildPlanVerificationMessage({
373
- constraintViolations: [],
374
- totalPlannedFiles: 0,
375
- plannedFilesModified: 0,
376
- verdict: 'FAIL',
377
- adherenceScore: 0,
378
- bloatCount: 0,
379
- });
380
-
381
- assert.match(message, /0\/0/);
382
- });