@neurcode-ai/cli 0.9.28 → 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.
Files changed (37) hide show
  1. package/LICENSE +201 -0
  2. package/dist/api-client.d.ts +78 -0
  3. package/dist/api-client.d.ts.map +1 -1
  4. package/dist/api-client.js +49 -0
  5. package/dist/api-client.js.map +1 -1
  6. package/dist/commands/apply.d.ts.map +1 -1
  7. package/dist/commands/apply.js +33 -0
  8. package/dist/commands/apply.js.map +1 -1
  9. package/dist/commands/approve.d.ts +11 -0
  10. package/dist/commands/approve.d.ts.map +1 -0
  11. package/dist/commands/approve.js +116 -0
  12. package/dist/commands/approve.js.map +1 -0
  13. package/dist/commands/plan.d.ts.map +1 -1
  14. package/dist/commands/plan.js +244 -64
  15. package/dist/commands/plan.js.map +1 -1
  16. package/dist/commands/prompt.d.ts.map +1 -1
  17. package/dist/commands/prompt.js +71 -4
  18. package/dist/commands/prompt.js.map +1 -1
  19. package/dist/commands/ship.d.ts +2 -0
  20. package/dist/commands/ship.d.ts.map +1 -1
  21. package/dist/commands/ship.js +228 -1
  22. package/dist/commands/ship.js.map +1 -1
  23. package/dist/commands/verify.d.ts +2 -0
  24. package/dist/commands/verify.d.ts.map +1 -1
  25. package/dist/commands/verify.js +253 -18
  26. package/dist/commands/verify.js.map +1 -1
  27. package/dist/index.js +26 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/utils/governance.d.ts +33 -0
  30. package/dist/utils/governance.d.ts.map +1 -0
  31. package/dist/utils/governance.js +68 -0
  32. package/dist/utils/governance.js.map +1 -0
  33. package/dist/utils/manual-approvals.d.ts +20 -0
  34. package/dist/utils/manual-approvals.d.ts.map +1 -0
  35. package/dist/utils/manual-approvals.js +104 -0
  36. package/dist/utils/manual-approvals.js.map +1 -0
  37. package/package.json +12 -9
@@ -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.28",
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
+ }