@neurcode-ai/governance-runtime 0.1.3 → 0.1.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 (49) hide show
  1. package/dist/admission-provenance.d.ts +111 -0
  2. package/dist/admission-provenance.d.ts.map +1 -0
  3. package/dist/admission-provenance.js +735 -0
  4. package/dist/admission-provenance.js.map +1 -0
  5. package/dist/agent-guard-posture.d.ts +40 -0
  6. package/dist/agent-guard-posture.d.ts.map +1 -0
  7. package/dist/agent-guard-posture.js +117 -0
  8. package/dist/agent-guard-posture.js.map +1 -0
  9. package/dist/agent-invocation-observability.d.ts +47 -0
  10. package/dist/agent-invocation-observability.d.ts.map +1 -0
  11. package/dist/agent-invocation-observability.js +229 -0
  12. package/dist/agent-invocation-observability.js.map +1 -0
  13. package/dist/agent-plan.d.ts +119 -0
  14. package/dist/agent-plan.d.ts.map +1 -0
  15. package/dist/agent-plan.js +590 -0
  16. package/dist/agent-plan.js.map +1 -0
  17. package/dist/agent-runtime-adapter.d.ts +69 -0
  18. package/dist/agent-runtime-adapter.d.ts.map +1 -0
  19. package/dist/agent-runtime-adapter.js +274 -0
  20. package/dist/agent-runtime-adapter.js.map +1 -0
  21. package/dist/ai-change-record.d.ts +185 -0
  22. package/dist/ai-change-record.d.ts.map +1 -0
  23. package/dist/ai-change-record.js +580 -0
  24. package/dist/ai-change-record.js.map +1 -0
  25. package/dist/architecture-graph.d.ts +153 -0
  26. package/dist/architecture-graph.d.ts.map +1 -0
  27. package/dist/architecture-graph.js +646 -0
  28. package/dist/architecture-graph.js.map +1 -0
  29. package/dist/architecture-obligations.d.ts +161 -0
  30. package/dist/architecture-obligations.d.ts.map +1 -0
  31. package/dist/architecture-obligations.js +553 -0
  32. package/dist/architecture-obligations.js.map +1 -0
  33. package/dist/index.d.ts +10 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +104 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/profile.d.ts +159 -0
  38. package/dist/profile.d.ts.map +1 -0
  39. package/dist/profile.js +611 -0
  40. package/dist/profile.js.map +1 -0
  41. package/dist/session.d.ts +428 -0
  42. package/dist/session.d.ts.map +1 -0
  43. package/dist/session.js +2206 -0
  44. package/dist/session.js.map +1 -0
  45. package/package.json +13 -2
  46. package/src/constraints.ts +0 -828
  47. package/src/index.test.ts +0 -502
  48. package/src/index.ts +0 -463
  49. package/tsconfig.json +0 -19
package/src/index.test.ts DELETED
@@ -1,502 +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('compileDeterministicConstraints supports repo-scoped invocation constraints', () => {
339
- const compiled = compileDeterministicConstraints({
340
- intentConstraints: 'foo should be called at most 2 times across repository',
341
- });
342
-
343
- const rule = compiled.rules.find((item) => item.id.includes('invocations_foo_repo'));
344
- assert.ok(rule, 'expected repo-scoped invocation rule');
345
- assert.equal(rule?.evaluationScope, 'repo');
346
- assert.equal(rule?.maxMatchesPerFile, 2);
347
- });
348
-
349
- test('evaluatePlanVerification enforces repo-scoped invocation constraints', () => {
350
- const result = evaluatePlanVerification({
351
- planFiles: SAMPLE_PLAN,
352
- changedFiles: [
353
- {
354
- path: 'src/a.ts',
355
- changeType: 'modify',
356
- added: 1,
357
- removed: 0,
358
- hunks: [
359
- {
360
- oldStart: 1,
361
- oldLines: 0,
362
- newStart: 1,
363
- newLines: 1,
364
- lines: [
365
- {
366
- type: 'added',
367
- content: 'const marker = true;',
368
- },
369
- ],
370
- },
371
- ],
372
- },
373
- ],
374
- intentConstraints: 'foo called at most 1 times across repository',
375
- fileContents: {
376
- 'src/a.ts': 'foo();\n',
377
- 'src/b.ts': 'foo();\n',
378
- },
379
- });
380
-
381
- assert.equal(result.verdict, 'FAIL');
382
- assert.ok(result.constraintViolations.some((item) => /across repository scope/i.test(item)));
383
- });
384
-
385
- test('evaluatePlanVerification detects exported API signature drift constraints', () => {
386
- const result = evaluatePlanVerification({
387
- planFiles: SAMPLE_PLAN,
388
- changedFiles: [
389
- {
390
- path: 'src/api.ts',
391
- changeType: 'modify',
392
- added: 1,
393
- removed: 1,
394
- hunks: [
395
- {
396
- oldStart: 1,
397
- oldLines: 1,
398
- newStart: 1,
399
- newLines: 1,
400
- lines: [
401
- {
402
- type: 'removed',
403
- content: 'export function createUser(name: string): User {',
404
- },
405
- {
406
- type: 'added',
407
- content: 'export function createUser(name: string, email: string): User {',
408
- },
409
- ],
410
- },
411
- ],
412
- },
413
- ],
414
- intentConstraints: 'Do not change public API signatures',
415
- });
416
-
417
- assert.equal(result.verdict, 'FAIL');
418
- assert.ok(result.constraintViolations.some((item) => /signature delta/i.test(item)));
419
- });
420
-
421
- test('evaluatePlanVerification detects network-call invariants deterministically', () => {
422
- const result = evaluatePlanVerification({
423
- planFiles: SAMPLE_PLAN,
424
- changedFiles: [
425
- {
426
- path: 'src/a.ts',
427
- changeType: 'modify',
428
- added: 1,
429
- removed: 0,
430
- hunks: [
431
- {
432
- oldStart: 1,
433
- oldLines: 0,
434
- newStart: 1,
435
- newLines: 1,
436
- lines: [
437
- {
438
- type: 'added',
439
- content: 'await fetch("https://api.example.com");',
440
- },
441
- ],
442
- },
443
- ],
444
- },
445
- ],
446
- policyRules: ['No network calls in committed code'],
447
- });
448
-
449
- assert.equal(result.verdict, 'FAIL');
450
- assert.equal(result.constraintViolations.length, 1);
451
- assert.match(result.constraintViolations[0], /network-call/i);
452
- });
453
-
454
- test('compileDeterministicConstraints expands advanced architectural invariants', () => {
455
- const compiled = compileDeterministicConstraints({
456
- intentConstraints: [
457
- 'Preserve backward compatibility for public endpoints',
458
- 'Maintain async event ordering and do not process messages out of order',
459
- 'Do not remove required fields from event payload schema',
460
- 'Enforce multi-tenant isolation and avoid cross-tenant access',
461
- 'Do not invalidate global cache keys',
462
- 'Preserve idempotency guarantees for retryable writes',
463
- 'Avoid destructive schema migrations such as DROP COLUMN',
464
- ].join('; '),
465
- });
466
-
467
- const ruleIds = compiled.rules.map((rule) => rule.id);
468
- assert.ok(ruleIds.includes('intent:backward_compatibility'));
469
- assert.ok(ruleIds.includes('intent:async_ordering'));
470
- assert.ok(ruleIds.includes('intent:event_schema_consistency'));
471
- assert.ok(ruleIds.includes('intent:multi_tenant_isolation'));
472
- assert.ok(ruleIds.includes('intent:cache_invariant'));
473
- assert.ok(ruleIds.includes('intent:idempotency'));
474
- assert.ok(ruleIds.includes('intent:migration_safety'));
475
- });
476
-
477
- test('compileDeterministicConstraints attaches provenance metadata', () => {
478
- const compiled = compileDeterministicConstraints({
479
- intentConstraints: 'Preserve backward compatibility for public endpoints in src/api/**',
480
- });
481
-
482
- const rule = compiled.rules.find((item) => item.id === 'intent:backward_compatibility');
483
- assert.ok(rule, 'expected backward compatibility rule');
484
- assert.ok(rule?.provenance, 'expected provenance metadata');
485
- assert.equal(rule?.provenance?.why.length ? true : false, true);
486
- assert.ok((rule?.provenance?.evidence || []).length > 0);
487
- assert.ok((rule?.provenance?.trustBoundaries || []).includes('public-api'));
488
- assert.ok((rule?.provenance?.contributingGraphPaths || []).includes('src/api/**'));
489
- });
490
-
491
- test('buildPlanVerificationMessage handles incomplete 0/0 plans', () => {
492
- const message = buildPlanVerificationMessage({
493
- constraintViolations: [],
494
- totalPlannedFiles: 0,
495
- plannedFilesModified: 0,
496
- verdict: 'FAIL',
497
- adherenceScore: 0,
498
- bloatCount: 0,
499
- });
500
-
501
- assert.match(message, /0\/0/);
502
- });