@neurcode-ai/cli 0.9.29 → 0.9.30

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.
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getManualApprovalsPath = getManualApprovalsPath;
4
+ exports.readManualApprovals = readManualApprovals;
5
+ exports.writeManualApprovals = writeManualApprovals;
6
+ exports.addManualApproval = addManualApproval;
7
+ exports.getManualApprovalsForCommit = getManualApprovalsForCommit;
8
+ exports.countDistinctApprovers = countDistinctApprovers;
9
+ const fs_1 = require("fs");
10
+ const path_1 = require("path");
11
+ const MANUAL_APPROVALS_FILE = ['.neurcode', 'manual-approvals.json'];
12
+ function normalizeText(value) {
13
+ return value.trim();
14
+ }
15
+ function normalizeActor(value) {
16
+ return normalizeText(value).toLowerCase();
17
+ }
18
+ function normalizeCommitSha(value) {
19
+ return normalizeText(value).toLowerCase();
20
+ }
21
+ function randomId() {
22
+ return Math.random().toString(36).slice(2, 10);
23
+ }
24
+ function getManualApprovalsPath(projectRoot) {
25
+ return (0, path_1.join)(projectRoot, ...MANUAL_APPROVALS_FILE);
26
+ }
27
+ function readManualApprovals(projectRoot) {
28
+ const path = getManualApprovalsPath(projectRoot);
29
+ if (!(0, fs_1.existsSync)(path)) {
30
+ return [];
31
+ }
32
+ try {
33
+ const raw = (0, fs_1.readFileSync)(path, 'utf-8');
34
+ const parsed = JSON.parse(raw);
35
+ if (!parsed || parsed.schemaVersion !== 1 || !Array.isArray(parsed.approvals)) {
36
+ return [];
37
+ }
38
+ return parsed.approvals
39
+ .filter((entry) => entry && typeof entry === 'object')
40
+ .map((entry) => ({
41
+ id: typeof entry.id === 'string' ? normalizeText(entry.id) : randomId(),
42
+ commitSha: typeof entry.commitSha === 'string' ? normalizeCommitSha(entry.commitSha) : '',
43
+ planId: typeof entry.planId === 'string' && entry.planId.trim() ? entry.planId.trim() : null,
44
+ approver: typeof entry.approver === 'string' ? normalizeText(entry.approver) : '',
45
+ reason: typeof entry.reason === 'string' && entry.reason.trim() ? entry.reason.trim() : null,
46
+ approvedAt: typeof entry.approvedAt === 'string' && Number.isFinite(Date.parse(entry.approvedAt))
47
+ ? new Date(entry.approvedAt).toISOString()
48
+ : new Date().toISOString(),
49
+ }))
50
+ .filter((entry) => entry.commitSha && entry.approver)
51
+ .sort((left, right) => left.approvedAt.localeCompare(right.approvedAt));
52
+ }
53
+ catch {
54
+ return [];
55
+ }
56
+ }
57
+ function writeManualApprovals(projectRoot, approvals) {
58
+ const path = getManualApprovalsPath(projectRoot);
59
+ const dir = (0, path_1.join)(projectRoot, '.neurcode');
60
+ if (!(0, fs_1.existsSync)(dir)) {
61
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
62
+ }
63
+ const normalized = approvals
64
+ .map((entry) => ({
65
+ id: normalizeText(entry.id),
66
+ commitSha: normalizeCommitSha(entry.commitSha),
67
+ planId: entry.planId ? normalizeText(entry.planId) : null,
68
+ approver: normalizeText(entry.approver),
69
+ reason: entry.reason ? normalizeText(entry.reason) : null,
70
+ approvedAt: Number.isFinite(Date.parse(entry.approvedAt))
71
+ ? new Date(entry.approvedAt).toISOString()
72
+ : new Date().toISOString(),
73
+ }))
74
+ .filter((entry) => entry.id && entry.commitSha && entry.approver);
75
+ const fileData = {
76
+ schemaVersion: 1,
77
+ approvals: normalized.sort((left, right) => left.approvedAt.localeCompare(right.approvedAt)),
78
+ };
79
+ (0, fs_1.writeFileSync)(path, `${JSON.stringify(fileData, null, 2)}\n`, 'utf-8');
80
+ return path;
81
+ }
82
+ function addManualApproval(projectRoot, input) {
83
+ const approvals = readManualApprovals(projectRoot);
84
+ const next = {
85
+ id: randomId(),
86
+ commitSha: normalizeCommitSha(input.commitSha),
87
+ planId: input.planId && input.planId.trim() ? input.planId.trim() : null,
88
+ approver: normalizeText(input.approver),
89
+ reason: input.reason && input.reason.trim() ? input.reason.trim() : null,
90
+ approvedAt: new Date().toISOString(),
91
+ };
92
+ approvals.push(next);
93
+ writeManualApprovals(projectRoot, approvals);
94
+ return next;
95
+ }
96
+ function getManualApprovalsForCommit(projectRoot, commitSha) {
97
+ const normalizedCommitSha = normalizeCommitSha(commitSha);
98
+ return readManualApprovals(projectRoot).filter((entry) => entry.commitSha === normalizedCommitSha);
99
+ }
100
+ function countDistinctApprovers(entries) {
101
+ const unique = new Set(entries.map((entry) => normalizeActor(entry.approver)).filter(Boolean));
102
+ return unique.size;
103
+ }
104
+ //# sourceMappingURL=manual-approvals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual-approvals.js","sourceRoot":"","sources":["../../src/utils/manual-approvals.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neurcode-ai/cli",
3
- "version": "0.9.29",
3
+ "version": "0.9.30",
4
4
  "description": "Neurcode CLI - AI code governance and diff analysis",
5
5
  "bin": {
6
6
  "neurcode": "dist/index.js"
@@ -11,12 +11,6 @@
11
11
  "dist",
12
12
  "README.md"
13
13
  ],
14
- "scripts": {
15
- "build": "rm -rf dist && tsc && chmod +x dist/index.js",
16
- "dev": "tsc --watch",
17
- "start": "node dist/index.js",
18
- "prepublishOnly": "npm run build"
19
- },
20
14
  "keywords": [
21
15
  "cli",
22
16
  "code-governance",
@@ -50,7 +44,11 @@
50
44
  "open": "^10.1.0",
51
45
  "ts-morph": "^24.0.0",
52
46
  "uuid": "^9.0.1",
53
- "zod": "^4.3.5"
47
+ "zod": "^4.3.5",
48
+ "@neurcode-ai/core": "0.1.0",
49
+ "@neurcode-ai/brain": "0.1.0",
50
+ "@neurcode-ai/analysis": "0.1.0",
51
+ "@neurcode-ai/policy": "0.1.0"
54
52
  },
55
53
  "publishConfig": {
56
54
  "access": "public"
@@ -61,5 +59,10 @@
61
59
  "@types/node": "^20.10.0",
62
60
  "@types/uuid": "^9.0.8",
63
61
  "typescript": "^5.3.0"
62
+ },
63
+ "scripts": {
64
+ "build": "rm -rf dist && tsc && chmod +x dist/index.js",
65
+ "dev": "tsc --watch",
66
+ "start": "node dist/index.js"
64
67
  }
65
- }
68
+ }