@neurcode-ai/cli 0.9.26 → 0.9.28

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 (59) hide show
  1. package/dist/commands/allow.d.ts.map +1 -1
  2. package/dist/commands/allow.js +5 -19
  3. package/dist/commands/allow.js.map +1 -1
  4. package/dist/commands/apply.d.ts +1 -0
  5. package/dist/commands/apply.d.ts.map +1 -1
  6. package/dist/commands/apply.js +105 -46
  7. package/dist/commands/apply.js.map +1 -1
  8. package/dist/commands/ask.d.ts.map +1 -1
  9. package/dist/commands/ask.js +1849 -1783
  10. package/dist/commands/ask.js.map +1 -1
  11. package/dist/commands/init.d.ts +2 -0
  12. package/dist/commands/init.d.ts.map +1 -1
  13. package/dist/commands/init.js +83 -24
  14. package/dist/commands/init.js.map +1 -1
  15. package/dist/commands/plan.d.ts +4 -0
  16. package/dist/commands/plan.d.ts.map +1 -1
  17. package/dist/commands/plan.js +344 -48
  18. package/dist/commands/plan.js.map +1 -1
  19. package/dist/commands/policy.d.ts.map +1 -1
  20. package/dist/commands/policy.js +629 -0
  21. package/dist/commands/policy.js.map +1 -1
  22. package/dist/commands/prompt.d.ts +7 -1
  23. package/dist/commands/prompt.d.ts.map +1 -1
  24. package/dist/commands/prompt.js +106 -25
  25. package/dist/commands/prompt.js.map +1 -1
  26. package/dist/commands/ship.d.ts +32 -0
  27. package/dist/commands/ship.d.ts.map +1 -1
  28. package/dist/commands/ship.js +1404 -75
  29. package/dist/commands/ship.js.map +1 -1
  30. package/dist/commands/verify.d.ts +6 -0
  31. package/dist/commands/verify.d.ts.map +1 -1
  32. package/dist/commands/verify.js +527 -102
  33. package/dist/commands/verify.js.map +1 -1
  34. package/dist/index.js +89 -3
  35. package/dist/index.js.map +1 -1
  36. package/dist/utils/custom-policy-rules.d.ts +21 -0
  37. package/dist/utils/custom-policy-rules.d.ts.map +1 -0
  38. package/dist/utils/custom-policy-rules.js +71 -0
  39. package/dist/utils/custom-policy-rules.js.map +1 -0
  40. package/dist/utils/plan-cache.d.ts.map +1 -1
  41. package/dist/utils/plan-cache.js +4 -0
  42. package/dist/utils/plan-cache.js.map +1 -1
  43. package/dist/utils/policy-audit.d.ts +29 -0
  44. package/dist/utils/policy-audit.d.ts.map +1 -0
  45. package/dist/utils/policy-audit.js +208 -0
  46. package/dist/utils/policy-audit.js.map +1 -0
  47. package/dist/utils/policy-exceptions.d.ts +96 -0
  48. package/dist/utils/policy-exceptions.d.ts.map +1 -0
  49. package/dist/utils/policy-exceptions.js +389 -0
  50. package/dist/utils/policy-exceptions.js.map +1 -0
  51. package/dist/utils/policy-governance.d.ts +24 -0
  52. package/dist/utils/policy-governance.d.ts.map +1 -0
  53. package/dist/utils/policy-governance.js +124 -0
  54. package/dist/utils/policy-governance.js.map +1 -0
  55. package/dist/utils/policy-packs.d.ts +72 -1
  56. package/dist/utils/policy-packs.d.ts.map +1 -1
  57. package/dist/utils/policy-packs.js +285 -0
  58. package/dist/utils/policy-packs.js.map +1 -1
  59. package/package.json +1 -1
@@ -0,0 +1,389 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPolicyExceptionsPath = getPolicyExceptionsPath;
4
+ exports.readPolicyExceptions = readPolicyExceptions;
5
+ exports.writePolicyExceptions = writePolicyExceptions;
6
+ exports.listPolicyExceptions = listPolicyExceptions;
7
+ exports.addPolicyException = addPolicyException;
8
+ exports.approvePolicyException = approvePolicyException;
9
+ exports.revokePolicyException = revokePolicyException;
10
+ exports.pruneExpiredPolicyExceptions = pruneExpiredPolicyExceptions;
11
+ exports.applyPolicyExceptions = applyPolicyExceptions;
12
+ const fs_1 = require("fs");
13
+ const path_1 = require("path");
14
+ const POLICY_EXCEPTIONS_FILENAME = 'neurcode.policy.exceptions.json';
15
+ const LEGACY_POLICY_EXCEPTIONS_RELATIVE_PATH = ['.neurcode', 'policies', 'policy-exceptions.json'];
16
+ function normalizePath(value) {
17
+ return value.replace(/\\/g, '/').trim();
18
+ }
19
+ function normalizeActor(actor) {
20
+ return actor.trim().toLowerCase();
21
+ }
22
+ function normalizeActorList(input) {
23
+ return Array.from(new Set(input.map((item) => normalizeActor(item)).filter(Boolean))).sort((a, b) => a.localeCompare(b));
24
+ }
25
+ function toRegexFromPattern(pattern) {
26
+ const normalized = pattern.trim();
27
+ if (normalized.length === 0 || normalized === '*') {
28
+ return /^.*$/i;
29
+ }
30
+ if (normalized.startsWith('/') && normalized.endsWith('/') && normalized.length > 2) {
31
+ try {
32
+ return new RegExp(normalized.slice(1, -1), 'i');
33
+ }
34
+ catch {
35
+ // Fall through to wildcard handling.
36
+ }
37
+ }
38
+ const escaped = normalized.replace(/[.+^${}()|[\]\\]/g, '\\$&');
39
+ const wildcard = escaped.replace(/\*/g, '.*').replace(/\?/g, '.');
40
+ return new RegExp(`^${wildcard}$`, 'i');
41
+ }
42
+ function isFutureIso(value) {
43
+ const time = Date.parse(value);
44
+ return Number.isFinite(time) && time > Date.now();
45
+ }
46
+ function getLegacyPolicyExceptionsPath(cwd) {
47
+ return (0, path_1.join)(cwd, ...LEGACY_POLICY_EXCEPTIONS_RELATIVE_PATH);
48
+ }
49
+ function normalizeApprovals(value) {
50
+ if (!Array.isArray(value))
51
+ return [];
52
+ const approvals = value
53
+ .filter((item) => !!item && typeof item === 'object')
54
+ .map((item) => {
55
+ const approver = typeof item.approver === 'string' ? item.approver.trim() : '';
56
+ if (!approver)
57
+ return null;
58
+ return {
59
+ approver,
60
+ approvedAt: typeof item.approvedAt === 'string' && Number.isFinite(Date.parse(item.approvedAt))
61
+ ? new Date(item.approvedAt).toISOString()
62
+ : new Date().toISOString(),
63
+ comment: typeof item.comment === 'string' && item.comment.trim() ? item.comment.trim() : null,
64
+ };
65
+ })
66
+ .filter((item) => item !== null)
67
+ .sort((left, right) => left.approvedAt.localeCompare(right.approvedAt));
68
+ // Keep only latest approval per normalized approver.
69
+ const latestByApprover = new Map();
70
+ for (const approval of approvals) {
71
+ latestByApprover.set(normalizeActor(approval.approver), approval);
72
+ }
73
+ return Array.from(latestByApprover.values()).sort((a, b) => a.approvedAt.localeCompare(b.approvedAt));
74
+ }
75
+ function evaluatePolicyExceptionEligibility(entry, options) {
76
+ if (!entry.active || !isFutureIso(entry.expiresAt)) {
77
+ return {
78
+ usable: false,
79
+ reason: 'expired_or_inactive',
80
+ effectiveApprovalCount: 0,
81
+ };
82
+ }
83
+ if (!options.requireApproval) {
84
+ return {
85
+ usable: true,
86
+ reason: 'eligible',
87
+ effectiveApprovalCount: 0,
88
+ };
89
+ }
90
+ const allowedApprovers = normalizeActorList(options.allowedApprovers || []);
91
+ const requestedBy = normalizeActor(entry.requestedBy || entry.createdBy || '');
92
+ const acceptedApprovals = entry.approvals.filter((approval) => {
93
+ const actor = normalizeActor(approval.approver);
94
+ if (!actor)
95
+ return false;
96
+ if (allowedApprovers.length > 0 && !allowedApprovers.includes(actor))
97
+ return false;
98
+ if (options.disallowSelfApproval && requestedBy && actor === requestedBy)
99
+ return false;
100
+ return true;
101
+ });
102
+ const effectiveApprovalCount = acceptedApprovals.length;
103
+ if (effectiveApprovalCount >= Math.max(1, options.minApprovals)) {
104
+ return {
105
+ usable: true,
106
+ reason: 'eligible',
107
+ effectiveApprovalCount,
108
+ };
109
+ }
110
+ if (entry.approvals.length === 0) {
111
+ return {
112
+ usable: false,
113
+ reason: 'approval_required',
114
+ effectiveApprovalCount,
115
+ };
116
+ }
117
+ if (options.disallowSelfApproval && entry.approvals.length > 0 && acceptedApprovals.length === 0) {
118
+ const onlySelf = entry.approvals.every((approval) => normalizeActor(approval.approver) === requestedBy);
119
+ if (onlySelf) {
120
+ return {
121
+ usable: false,
122
+ reason: 'self_approval_only',
123
+ effectiveApprovalCount,
124
+ };
125
+ }
126
+ }
127
+ if (allowedApprovers.length > 0 && acceptedApprovals.length === 0) {
128
+ return {
129
+ usable: false,
130
+ reason: 'approver_not_allowed',
131
+ effectiveApprovalCount,
132
+ };
133
+ }
134
+ return {
135
+ usable: false,
136
+ reason: 'insufficient_approvals',
137
+ effectiveApprovalCount,
138
+ };
139
+ }
140
+ function getPolicyExceptionsPath(cwd) {
141
+ return (0, path_1.join)(cwd, POLICY_EXCEPTIONS_FILENAME);
142
+ }
143
+ function resolvePolicyExceptionsReadPath(cwd) {
144
+ const canonicalPath = getPolicyExceptionsPath(cwd);
145
+ if ((0, fs_1.existsSync)(canonicalPath)) {
146
+ return canonicalPath;
147
+ }
148
+ const legacyPath = getLegacyPolicyExceptionsPath(cwd);
149
+ return (0, fs_1.existsSync)(legacyPath) ? legacyPath : canonicalPath;
150
+ }
151
+ function readPolicyExceptions(cwd) {
152
+ const path = resolvePolicyExceptionsReadPath(cwd);
153
+ if (!(0, fs_1.existsSync)(path)) {
154
+ return [];
155
+ }
156
+ try {
157
+ const raw = (0, fs_1.readFileSync)(path, 'utf-8');
158
+ const parsed = JSON.parse(raw);
159
+ if (!parsed || parsed.schemaVersion !== 1 || !Array.isArray(parsed.exceptions)) {
160
+ return [];
161
+ }
162
+ return parsed.exceptions
163
+ .filter((entry) => {
164
+ if (!entry || typeof entry !== 'object')
165
+ return false;
166
+ return (typeof entry.id === 'string' &&
167
+ typeof entry.rulePattern === 'string' &&
168
+ typeof entry.filePattern === 'string' &&
169
+ typeof entry.reason === 'string' &&
170
+ typeof entry.expiresAt === 'string');
171
+ })
172
+ .map((entry) => ({
173
+ ...entry,
174
+ ticket: typeof entry.ticket === 'string' && entry.ticket.trim() ? entry.ticket : null,
175
+ createdBy: typeof entry.createdBy === 'string' && entry.createdBy.trim() ? entry.createdBy : 'unknown',
176
+ requestedBy: typeof entry.requestedBy === 'string' && entry.requestedBy.trim()
177
+ ? entry.requestedBy.trim()
178
+ : typeof entry.createdBy === 'string' && entry.createdBy.trim()
179
+ ? entry.createdBy.trim()
180
+ : 'unknown',
181
+ createdAt: typeof entry.createdAt === 'string' ? entry.createdAt : new Date(0).toISOString(),
182
+ active: entry.active !== false,
183
+ severity: entry.severity === 'allow' || entry.severity === 'warn' || entry.severity === 'block'
184
+ ? entry.severity
185
+ : null,
186
+ approvals: normalizeApprovals(entry.approvals),
187
+ }))
188
+ .sort((left, right) => right.createdAt.localeCompare(left.createdAt));
189
+ }
190
+ catch {
191
+ return [];
192
+ }
193
+ }
194
+ function writePolicyExceptions(cwd, entries) {
195
+ const path = getPolicyExceptionsPath(cwd);
196
+ const payload = {
197
+ schemaVersion: 1,
198
+ exceptions: entries,
199
+ };
200
+ (0, fs_1.writeFileSync)(path, JSON.stringify(payload, null, 2) + '\n', 'utf-8');
201
+ return path;
202
+ }
203
+ function listPolicyExceptions(cwd) {
204
+ const all = readPolicyExceptions(cwd);
205
+ const active = all.filter((entry) => entry.active && isFutureIso(entry.expiresAt));
206
+ const expired = all.filter((entry) => !entry.active || !isFutureIso(entry.expiresAt));
207
+ return { all, active, expired };
208
+ }
209
+ function addPolicyException(cwd, input) {
210
+ const rulePattern = input.rulePattern.trim();
211
+ const filePattern = normalizePath(input.filePattern || '*');
212
+ const reason = input.reason.trim();
213
+ const expiresAt = input.expiresAt.trim();
214
+ const expiresMs = Date.parse(expiresAt);
215
+ if (!rulePattern) {
216
+ throw new Error('rulePattern is required');
217
+ }
218
+ if (!filePattern) {
219
+ throw new Error('filePattern is required');
220
+ }
221
+ if (!reason) {
222
+ throw new Error('reason is required');
223
+ }
224
+ if (!Number.isFinite(expiresMs)) {
225
+ throw new Error('expiresAt must be a valid ISO datetime');
226
+ }
227
+ if (expiresMs <= Date.now()) {
228
+ throw new Error('expiresAt must be in the future');
229
+ }
230
+ const entries = readPolicyExceptions(cwd);
231
+ const nowIso = new Date().toISOString();
232
+ const actor = input.createdBy && input.createdBy.trim() ? input.createdBy.trim() : 'unknown';
233
+ const requestedBy = input.requestedBy && input.requestedBy.trim() ? input.requestedBy.trim() : actor;
234
+ const exception = {
235
+ id: `px_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`,
236
+ rulePattern,
237
+ filePattern,
238
+ reason,
239
+ ticket: input.ticket && input.ticket.trim() ? input.ticket.trim() : null,
240
+ createdAt: nowIso,
241
+ createdBy: actor,
242
+ requestedBy,
243
+ expiresAt: new Date(expiresMs).toISOString(),
244
+ severity: input.severity || null,
245
+ active: true,
246
+ approvals: [],
247
+ };
248
+ entries.unshift(exception);
249
+ writePolicyExceptions(cwd, entries);
250
+ return exception;
251
+ }
252
+ function approvePolicyException(cwd, id, input) {
253
+ const approver = input.approver.trim();
254
+ if (!approver) {
255
+ throw new Error('approver is required');
256
+ }
257
+ const entries = readPolicyExceptions(cwd);
258
+ let updated = null;
259
+ const next = entries.map((entry) => {
260
+ if (entry.id !== id) {
261
+ return entry;
262
+ }
263
+ if (!entry.active) {
264
+ updated = entry;
265
+ return entry;
266
+ }
267
+ const approvals = [...entry.approvals];
268
+ const key = normalizeActor(approver);
269
+ const existingIndex = approvals.findIndex((item) => normalizeActor(item.approver) === key);
270
+ const nextApproval = {
271
+ approver,
272
+ approvedAt: new Date().toISOString(),
273
+ comment: input.comment && input.comment.trim() ? input.comment.trim() : null,
274
+ };
275
+ if (existingIndex >= 0) {
276
+ approvals[existingIndex] = nextApproval;
277
+ }
278
+ else {
279
+ approvals.push(nextApproval);
280
+ }
281
+ const normalized = {
282
+ ...entry,
283
+ approvals: approvals.sort((a, b) => a.approvedAt.localeCompare(b.approvedAt)),
284
+ };
285
+ updated = normalized;
286
+ return normalized;
287
+ });
288
+ if (updated) {
289
+ writePolicyExceptions(cwd, next);
290
+ }
291
+ return updated;
292
+ }
293
+ function revokePolicyException(cwd, id) {
294
+ const entries = readPolicyExceptions(cwd);
295
+ let changed = false;
296
+ const next = entries.map((entry) => {
297
+ if (entry.id === id && entry.active) {
298
+ changed = true;
299
+ return {
300
+ ...entry,
301
+ active: false,
302
+ };
303
+ }
304
+ return entry;
305
+ });
306
+ if (changed) {
307
+ writePolicyExceptions(cwd, next);
308
+ }
309
+ return changed;
310
+ }
311
+ function pruneExpiredPolicyExceptions(cwd) {
312
+ const entries = readPolicyExceptions(cwd);
313
+ const now = Date.now();
314
+ const next = entries.filter((entry) => entry.active && Date.parse(entry.expiresAt) > now);
315
+ const removed = entries.length - next.length;
316
+ if (removed > 0 || entries.length === 0) {
317
+ writePolicyExceptions(cwd, next);
318
+ }
319
+ return {
320
+ removed,
321
+ remaining: next.length,
322
+ };
323
+ }
324
+ function applyPolicyExceptions(violations, exceptions, options) {
325
+ const applyOptions = {
326
+ requireApproval: options?.requireApproval === true,
327
+ minApprovals: Number.isFinite(options?.minApprovals)
328
+ ? Math.max(1, Math.floor(Number(options?.minApprovals)))
329
+ : 1,
330
+ disallowSelfApproval: options?.disallowSelfApproval !== false,
331
+ allowedApprovers: Array.isArray(options?.allowedApprovers) ? options.allowedApprovers : [],
332
+ };
333
+ const activeExceptions = exceptions.filter((entry) => entry.active && isFutureIso(entry.expiresAt));
334
+ const usableExceptions = activeExceptions.filter((entry) => evaluatePolicyExceptionEligibility(entry, applyOptions).usable);
335
+ const suppressedViolations = [];
336
+ const blockedViolations = [];
337
+ const remainingViolations = [];
338
+ const matchedExceptionIds = new Set();
339
+ const exceptionMatchers = activeExceptions.map((entry) => ({
340
+ entry,
341
+ eligibility: evaluatePolicyExceptionEligibility(entry, applyOptions),
342
+ ruleRegex: toRegexFromPattern(entry.rulePattern),
343
+ fileRegex: toRegexFromPattern(normalizePath(entry.filePattern || '*')),
344
+ }));
345
+ for (const violation of violations) {
346
+ const violationRule = String(violation.rule || '').trim();
347
+ const violationFile = normalizePath(String(violation.file || ''));
348
+ const violationSeverity = String(violation.severity || '').toLowerCase();
349
+ const candidates = exceptionMatchers.filter((matcher) => {
350
+ const severityAllowed = !matcher.entry.severity || matcher.entry.severity.toLowerCase() === violationSeverity;
351
+ return severityAllowed && matcher.ruleRegex.test(violationRule) && matcher.fileRegex.test(violationFile);
352
+ });
353
+ if (candidates.length === 0) {
354
+ remainingViolations.push(violation);
355
+ continue;
356
+ }
357
+ const usable = candidates.find((candidate) => candidate.eligibility.usable);
358
+ if (usable) {
359
+ matchedExceptionIds.add(usable.entry.id);
360
+ suppressedViolations.push({
361
+ ...violation,
362
+ exceptionId: usable.entry.id,
363
+ reason: usable.entry.reason,
364
+ expiresAt: usable.entry.expiresAt,
365
+ });
366
+ continue;
367
+ }
368
+ const blocked = candidates[0];
369
+ const blockedReason = blocked.eligibility.reason === 'eligible'
370
+ ? 'insufficient_approvals'
371
+ : blocked.eligibility.reason;
372
+ matchedExceptionIds.add(blocked.entry.id);
373
+ blockedViolations.push({
374
+ ...violation,
375
+ exceptionId: blocked.entry.id,
376
+ eligibilityReason: blockedReason,
377
+ });
378
+ remainingViolations.push(violation);
379
+ }
380
+ return {
381
+ remainingViolations,
382
+ suppressedViolations,
383
+ blockedViolations,
384
+ matchedExceptionIds: Array.from(matchedExceptionIds),
385
+ activeExceptions,
386
+ usableExceptions,
387
+ };
388
+ }
389
+ //# sourceMappingURL=policy-exceptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-exceptions.js","sourceRoot":"","sources":["../../src/utils/policy-exceptions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface PolicyGovernanceConfig {
2
+ schemaVersion: 1;
3
+ exceptionApprovals: {
4
+ required: boolean;
5
+ minApprovals: number;
6
+ disallowSelfApproval: boolean;
7
+ allowedApprovers: string[];
8
+ };
9
+ audit: {
10
+ requireIntegrity: boolean;
11
+ };
12
+ }
13
+ export declare function defaultPolicyGovernanceConfig(): PolicyGovernanceConfig;
14
+ export declare function getPolicyGovernancePath(cwd: string): string;
15
+ export declare function readPolicyGovernanceConfig(cwd: string): PolicyGovernanceConfig;
16
+ export declare function writePolicyGovernanceConfig(cwd: string, config: PolicyGovernanceConfig): string;
17
+ export declare function updatePolicyGovernanceConfig(cwd: string, input: Partial<{
18
+ required: boolean;
19
+ minApprovals: number;
20
+ disallowSelfApproval: boolean;
21
+ allowedApprovers: string[];
22
+ requireAuditIntegrity: boolean;
23
+ }>): PolicyGovernanceConfig;
24
+ //# sourceMappingURL=policy-governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-governance.d.ts","sourceRoot":"","sources":["../../src/utils/policy-governance.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,CAAC,CAAC;IACjB,kBAAkB,EAAE;QAClB,QAAQ,EAAE,OAAO,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,oBAAoB,EAAE,OAAO,CAAC;QAC9B,gBAAgB,EAAE,MAAM,EAAE,CAAC;KAC5B,CAAC;IACF,KAAK,EAAE;QACL,gBAAgB,EAAE,OAAO,CAAC;KAC3B,CAAC;CACH;AAmBD,wBAAgB,6BAA6B,IAAI,sBAAsB,CAatE;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3D;AAWD,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,CA0C9E;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAgB/F;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,qBAAqB,EAAE,OAAO,CAAC;CAChC,CAAC,GACD,sBAAsB,CA0BxB"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultPolicyGovernanceConfig = defaultPolicyGovernanceConfig;
4
+ exports.getPolicyGovernancePath = getPolicyGovernancePath;
5
+ exports.readPolicyGovernanceConfig = readPolicyGovernanceConfig;
6
+ exports.writePolicyGovernanceConfig = writePolicyGovernanceConfig;
7
+ exports.updatePolicyGovernanceConfig = updatePolicyGovernanceConfig;
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ const POLICY_GOVERNANCE_FILENAME = 'neurcode.policy.governance.json';
11
+ const LEGACY_POLICY_GOVERNANCE_RELATIVE_PATH = ['.neurcode', 'policies', 'policy-governance.json'];
12
+ function getLegacyPolicyGovernancePath(cwd) {
13
+ return (0, path_1.join)(cwd, ...LEGACY_POLICY_GOVERNANCE_RELATIVE_PATH);
14
+ }
15
+ function normalizeApprovers(values) {
16
+ return Array.from(new Set(values
17
+ .map((item) => item.trim())
18
+ .filter(Boolean))).sort((left, right) => left.localeCompare(right));
19
+ }
20
+ function defaultPolicyGovernanceConfig() {
21
+ return {
22
+ schemaVersion: 1,
23
+ exceptionApprovals: {
24
+ required: false,
25
+ minApprovals: 1,
26
+ disallowSelfApproval: true,
27
+ allowedApprovers: [],
28
+ },
29
+ audit: {
30
+ requireIntegrity: false,
31
+ },
32
+ };
33
+ }
34
+ function getPolicyGovernancePath(cwd) {
35
+ return (0, path_1.join)(cwd, POLICY_GOVERNANCE_FILENAME);
36
+ }
37
+ function resolvePolicyGovernanceReadPath(cwd) {
38
+ const canonicalPath = getPolicyGovernancePath(cwd);
39
+ if ((0, fs_1.existsSync)(canonicalPath)) {
40
+ return canonicalPath;
41
+ }
42
+ const legacyPath = getLegacyPolicyGovernancePath(cwd);
43
+ return (0, fs_1.existsSync)(legacyPath) ? legacyPath : canonicalPath;
44
+ }
45
+ function readPolicyGovernanceConfig(cwd) {
46
+ const path = resolvePolicyGovernanceReadPath(cwd);
47
+ if (!(0, fs_1.existsSync)(path)) {
48
+ return defaultPolicyGovernanceConfig();
49
+ }
50
+ try {
51
+ const raw = (0, fs_1.readFileSync)(path, 'utf-8');
52
+ const parsed = JSON.parse(raw);
53
+ const defaults = defaultPolicyGovernanceConfig();
54
+ const required = parsed.exceptionApprovals?.required === true;
55
+ const minApprovalsRaw = parsed.exceptionApprovals?.minApprovals;
56
+ const minApprovals = Number.isFinite(minApprovalsRaw)
57
+ ? Math.max(1, Math.min(5, Math.floor(Number(minApprovalsRaw))))
58
+ : defaults.exceptionApprovals.minApprovals;
59
+ const disallowSelfApproval = parsed.exceptionApprovals?.disallowSelfApproval !== false;
60
+ const allowedApprovers = Array.isArray(parsed.exceptionApprovals?.allowedApprovers)
61
+ ? normalizeApprovers(parsed.exceptionApprovals.allowedApprovers
62
+ .filter((item) => typeof item === 'string'))
63
+ : defaults.exceptionApprovals.allowedApprovers;
64
+ const requireIntegrity = parsed.audit?.requireIntegrity === true;
65
+ return {
66
+ schemaVersion: 1,
67
+ exceptionApprovals: {
68
+ required,
69
+ minApprovals,
70
+ disallowSelfApproval,
71
+ allowedApprovers,
72
+ },
73
+ audit: {
74
+ requireIntegrity,
75
+ },
76
+ };
77
+ }
78
+ catch {
79
+ return defaultPolicyGovernanceConfig();
80
+ }
81
+ }
82
+ function writePolicyGovernanceConfig(cwd, config) {
83
+ const normalized = {
84
+ schemaVersion: 1,
85
+ exceptionApprovals: {
86
+ required: config.exceptionApprovals.required === true,
87
+ minApprovals: Math.max(1, Math.min(5, Math.floor(config.exceptionApprovals.minApprovals || 1))),
88
+ disallowSelfApproval: config.exceptionApprovals.disallowSelfApproval !== false,
89
+ allowedApprovers: normalizeApprovers(config.exceptionApprovals.allowedApprovers || []),
90
+ },
91
+ audit: {
92
+ requireIntegrity: config.audit.requireIntegrity === true,
93
+ },
94
+ };
95
+ const path = getPolicyGovernancePath(cwd);
96
+ (0, fs_1.writeFileSync)(path, JSON.stringify(normalized, null, 2) + '\n', 'utf-8');
97
+ return path;
98
+ }
99
+ function updatePolicyGovernanceConfig(cwd, input) {
100
+ const current = readPolicyGovernanceConfig(cwd);
101
+ const next = {
102
+ schemaVersion: 1,
103
+ exceptionApprovals: {
104
+ required: typeof input.required === 'boolean' ? input.required : current.exceptionApprovals.required,
105
+ minApprovals: Number.isFinite(input.minApprovals)
106
+ ? Math.max(1, Math.min(5, Math.floor(Number(input.minApprovals))))
107
+ : current.exceptionApprovals.minApprovals,
108
+ disallowSelfApproval: typeof input.disallowSelfApproval === 'boolean'
109
+ ? input.disallowSelfApproval
110
+ : current.exceptionApprovals.disallowSelfApproval,
111
+ allowedApprovers: Array.isArray(input.allowedApprovers)
112
+ ? normalizeApprovers(input.allowedApprovers)
113
+ : current.exceptionApprovals.allowedApprovers,
114
+ },
115
+ audit: {
116
+ requireIntegrity: typeof input.requireAuditIntegrity === 'boolean'
117
+ ? input.requireAuditIntegrity
118
+ : current.audit.requireIntegrity,
119
+ },
120
+ };
121
+ writePolicyGovernanceConfig(cwd, next);
122
+ return next;
123
+ }
124
+ //# sourceMappingURL=policy-governance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-governance.js","sourceRoot":"","sources":["../../src/utils/policy-governance.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import type { Rule } from '@neurcode-ai/policy-engine';
1
+ import { type Rule } from '@neurcode-ai/policy-engine';
2
+ import type { ActiveCustomPolicy } from './custom-policy-rules';
2
3
  export type PolicyPackId = 'fintech' | 'hipaa' | 'soc2' | 'startup-fast';
3
4
  export interface PolicyPackDefinition {
4
5
  id: PolicyPackId;
@@ -17,6 +18,61 @@ export interface InstalledPolicyPack {
17
18
  tags: string[];
18
19
  rules: Rule[];
19
20
  }
21
+ export interface PolicyLockCustomPolicyRef {
22
+ id: string;
23
+ severity: 'low' | 'medium' | 'high';
24
+ updatedAt: string;
25
+ ruleTextHash: string;
26
+ }
27
+ export interface PolicyStateSnapshot {
28
+ schemaVersion: 1;
29
+ generatedAt: string;
30
+ defaultRules: {
31
+ count: number;
32
+ fingerprint: string;
33
+ };
34
+ policyPack: {
35
+ id: PolicyPackId;
36
+ name: string;
37
+ version: string;
38
+ ruleCount: number;
39
+ fingerprint: string;
40
+ } | null;
41
+ customPolicies: {
42
+ mode: 'dashboard' | 'disabled';
43
+ count: number;
44
+ fingerprint: string;
45
+ mappedRuleCount: number;
46
+ mappedRulesFingerprint: string;
47
+ refs: PolicyLockCustomPolicyRef[];
48
+ };
49
+ effective: {
50
+ ruleCount: number;
51
+ fingerprint: string;
52
+ };
53
+ }
54
+ export type PolicyLockFile = PolicyStateSnapshot;
55
+ export interface PolicyLockReadResult {
56
+ path: string;
57
+ exists: boolean;
58
+ lock: PolicyLockFile | null;
59
+ error?: string;
60
+ }
61
+ export interface PolicyLockMismatch {
62
+ code: 'POLICY_LOCK_MISSING' | 'POLICY_LOCK_INVALID' | 'POLICY_LOCK_MODE_MISMATCH' | 'POLICY_LOCK_PACK_MISMATCH' | 'POLICY_LOCK_DEFAULT_RULES_MISMATCH' | 'POLICY_LOCK_CUSTOM_POLICIES_MISMATCH' | 'POLICY_LOCK_CUSTOM_RULES_MISMATCH' | 'POLICY_LOCK_EFFECTIVE_RULES_MISMATCH';
63
+ message: string;
64
+ expected?: string;
65
+ actual?: string;
66
+ }
67
+ export interface PolicyLockValidationResult {
68
+ lockPath: string;
69
+ lockFileFound: boolean;
70
+ lockPresent: boolean;
71
+ enforced: boolean;
72
+ matched: boolean;
73
+ mismatches: PolicyLockMismatch[];
74
+ lock: PolicyLockFile | null;
75
+ }
20
76
  export declare function listPolicyPacks(): PolicyPackDefinition[];
21
77
  export declare function getPolicyPack(packId: string): PolicyPackDefinition | null;
22
78
  export declare function readInstalledPolicyPack(cwd: string): InstalledPolicyPack | null;
@@ -28,4 +84,19 @@ export declare function getInstalledPolicyPackRules(cwd: string): {
28
84
  version: string;
29
85
  rules: Rule[];
30
86
  } | null;
87
+ export declare function getPolicyLockPath(cwd: string): string;
88
+ export declare function readPolicyLockFile(cwd: string): PolicyLockReadResult;
89
+ export declare function writePolicyLockFile(cwd: string, lock: PolicyLockFile): string;
90
+ export declare function buildPolicyStateSnapshot(input: {
91
+ policyPack: ReturnType<typeof getInstalledPolicyPackRules>;
92
+ policyPackRules: Rule[];
93
+ customPolicies: ActiveCustomPolicy[];
94
+ customRules: Rule[];
95
+ includeDashboardPolicies: boolean;
96
+ generatedAt?: string;
97
+ }): PolicyStateSnapshot;
98
+ export declare function comparePolicyStateToLock(lock: PolicyLockFile, current: PolicyStateSnapshot): PolicyLockMismatch[];
99
+ export declare function evaluatePolicyLock(cwd: string, current: PolicyStateSnapshot, options?: {
100
+ requireLock?: boolean;
101
+ }): PolicyLockValidationResult;
31
102
  //# sourceMappingURL=policy-packs.d.ts.map