@neurcode-ai/cli 0.4.0 → 0.4.1
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.
- package/dist/api-client.d.ts +105 -17
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +388 -85
- package/dist/api-client.js.map +1 -1
- package/dist/commands/allow.d.ts.map +1 -1
- package/dist/commands/allow.js +6 -33
- package/dist/commands/allow.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +56 -13
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/doctor.d.ts +7 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +134 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +365 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +209 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +7 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +70 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +210 -57
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/prompt.d.ts +6 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +254 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/revert.d.ts.map +1 -1
- package/dist/commands/revert.js +10 -0
- package/dist/commands/revert.js.map +1 -1
- package/dist/commands/session.d.ts +29 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +382 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +127 -13
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/watch.d.ts +8 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +78 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config.d.ts +29 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +186 -21
- package/dist/config.js.map +1 -1
- package/dist/index.js +120 -3
- package/dist/index.js.map +1 -1
- package/dist/services/integrations/TicketService.d.ts +68 -0
- package/dist/services/integrations/TicketService.d.ts.map +1 -0
- package/dist/services/integrations/TicketService.js +151 -0
- package/dist/services/integrations/TicketService.js.map +1 -0
- package/dist/services/security/SecurityGuard.d.ts +80 -0
- package/dist/services/security/SecurityGuard.d.ts.map +1 -0
- package/dist/services/security/SecurityGuard.js +410 -0
- package/dist/services/security/SecurityGuard.js.map +1 -0
- package/dist/services/watch/BlobStore.d.ts +33 -0
- package/dist/services/watch/BlobStore.d.ts.map +1 -0
- package/dist/services/watch/BlobStore.js +108 -0
- package/dist/services/watch/BlobStore.js.map +1 -0
- package/dist/services/watch/CommandPoller.d.ts +76 -0
- package/dist/services/watch/CommandPoller.d.ts.map +1 -0
- package/dist/services/watch/CommandPoller.js +298 -0
- package/dist/services/watch/CommandPoller.js.map +1 -0
- package/dist/services/watch/Journal.d.ts +58 -0
- package/dist/services/watch/Journal.d.ts.map +1 -0
- package/dist/services/watch/Journal.js +144 -0
- package/dist/services/watch/Journal.js.map +1 -0
- package/dist/services/watch/Sentinel.d.ts +49 -0
- package/dist/services/watch/Sentinel.d.ts.map +1 -0
- package/dist/services/watch/Sentinel.js +205 -0
- package/dist/services/watch/Sentinel.js.map +1 -0
- package/dist/services/watch/Syncer.d.ts +55 -0
- package/dist/services/watch/Syncer.d.ts.map +1 -0
- package/dist/services/watch/Syncer.js +231 -0
- package/dist/services/watch/Syncer.js.map +1 -0
- package/dist/utils/ROILogger.d.ts +16 -0
- package/dist/utils/ROILogger.d.ts.map +1 -0
- package/dist/utils/ROILogger.js +45 -0
- package/dist/utils/ROILogger.js.map +1 -0
- package/dist/utils/box.d.ts +16 -0
- package/dist/utils/box.d.ts.map +1 -0
- package/dist/utils/box.js +85 -0
- package/dist/utils/box.js.map +1 -0
- package/dist/utils/gitignore.d.ts +10 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +34 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/messages.d.ts +81 -0
- package/dist/utils/messages.d.ts.map +1 -0
- package/dist/utils/messages.js +306 -0
- package/dist/utils/messages.js.map +1 -0
- package/dist/utils/restore.d.ts +14 -0
- package/dist/utils/restore.d.ts.map +1 -0
- package/dist/utils/restore.js +89 -0
- package/dist/utils/restore.js.map +1 -0
- package/dist/utils/state.d.ts +69 -0
- package/dist/utils/state.d.ts.map +1 -0
- package/dist/utils/state.js +151 -0
- package/dist/utils/state.js.map +1 -0
- package/dist/utils/user-context.d.ts +28 -0
- package/dist/utils/user-context.d.ts.map +1 -0
- package/dist/utils/user-context.js +68 -0
- package/dist/utils/user-context.js.map +1 -0
- package/package.json +11 -4
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Restore a file from a blob hash
|
|
4
|
+
*
|
|
5
|
+
* Reads a GZIP-compressed blob from .neurcode/blobs/<hash> and
|
|
6
|
+
* writes it to the target file path.
|
|
7
|
+
*
|
|
8
|
+
* @param hash - SHA-256 hash of the file content
|
|
9
|
+
* @param targetPath - Relative path to the file to restore (e.g., "src/components/Button.tsx")
|
|
10
|
+
* @param projectRoot - Root directory of the project
|
|
11
|
+
* @returns Promise that resolves when the file is restored
|
|
12
|
+
* @throws Error if the blob doesn't exist, path is invalid, or write fails
|
|
13
|
+
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.restoreFile = restoreFile;
|
|
49
|
+
const zlib_1 = require("zlib");
|
|
50
|
+
const fs_1 = require("fs");
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const fsExtra = __importStar(require("fs-extra"));
|
|
53
|
+
async function restoreFile(hash, targetPath, projectRoot) {
|
|
54
|
+
// Resolve the target file path relative to project root
|
|
55
|
+
const resolvedTargetPath = path.resolve(projectRoot, targetPath);
|
|
56
|
+
// Security: Ensure the target path is within the project root
|
|
57
|
+
// This prevents path traversal attacks (e.g., ../../../etc/passwd)
|
|
58
|
+
const resolvedProjectRoot = path.resolve(projectRoot);
|
|
59
|
+
if (!resolvedTargetPath.startsWith(resolvedProjectRoot)) {
|
|
60
|
+
throw new Error(`Invalid file path: ${targetPath} - Path traversal detected`);
|
|
61
|
+
}
|
|
62
|
+
// Resolve blob path
|
|
63
|
+
const blobPath = path.join(projectRoot, '.neurcode', 'blobs', hash);
|
|
64
|
+
// Check if blob exists
|
|
65
|
+
try {
|
|
66
|
+
await fs_1.promises.access(blobPath);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
throw new Error(`Blob not found: ${hash}`);
|
|
70
|
+
}
|
|
71
|
+
// Read the compressed blob
|
|
72
|
+
const compressedData = await fs_1.promises.readFile(blobPath);
|
|
73
|
+
// Decompress using GZIP
|
|
74
|
+
let decompressedData;
|
|
75
|
+
try {
|
|
76
|
+
decompressedData = (0, zlib_1.gunzipSync)(compressedData);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw new Error(`Failed to decompress blob: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
80
|
+
}
|
|
81
|
+
// Convert to string (assuming UTF-8 encoding)
|
|
82
|
+
const fileContent = decompressedData.toString('utf-8');
|
|
83
|
+
// Ensure the target directory exists
|
|
84
|
+
const targetDir = path.dirname(resolvedTargetPath);
|
|
85
|
+
await fsExtra.ensureDir(targetDir);
|
|
86
|
+
// Write the file
|
|
87
|
+
await fs_1.promises.writeFile(resolvedTargetPath, fileContent, 'utf-8');
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=restore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/utils/restore.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOH,kCA6CC;AAlDD,+BAAkC;AAClC,2BAAoC;AACpC,2CAA6B;AAC7B,kDAAoC;AAE7B,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,UAAkB,EAClB,WAAmB;IAEnB,wDAAwD;IACxD,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAEjE,8DAA8D;IAC9D,mEAAmE;IACnE,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,sBAAsB,UAAU,4BAA4B,CAAC,CAAC;IAChF,CAAC;IAED,oBAAoB;IACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAEpE,uBAAuB;IACvB,IAAI,CAAC;QACH,MAAM,aAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,2BAA2B;IAC3B,MAAM,cAAc,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEnD,wBAAwB;IACxB,IAAI,gBAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,gBAAgB,GAAG,IAAA,iBAAU,EAAC,cAAc,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IAC5G,CAAC;IAED,8CAA8C;IAC9C,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEvD,qCAAqC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnD,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAEnC,iBAAiB;IACjB,MAAM,aAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Management Utility
|
|
3
|
+
*
|
|
4
|
+
* Manages CLI state in .neurcode/config.json (project-local state)
|
|
5
|
+
* Separates session state from user auth config
|
|
6
|
+
*/
|
|
7
|
+
export interface CliState {
|
|
8
|
+
projectId?: string;
|
|
9
|
+
sessionId?: string;
|
|
10
|
+
lastPlanId?: string;
|
|
11
|
+
activePlanId?: string;
|
|
12
|
+
activeSessionId?: string;
|
|
13
|
+
lastPlanGeneratedAt?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load state from .neurcode/config.json
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadState(): CliState;
|
|
19
|
+
/**
|
|
20
|
+
* Save state to .neurcode/config.json
|
|
21
|
+
*/
|
|
22
|
+
export declare function saveState(state: Partial<CliState>): void;
|
|
23
|
+
/**
|
|
24
|
+
* Get session ID from state
|
|
25
|
+
*/
|
|
26
|
+
export declare function getSessionId(): string | null;
|
|
27
|
+
/**
|
|
28
|
+
* Set session ID in state
|
|
29
|
+
*/
|
|
30
|
+
export declare function setSessionId(sessionId: string): void;
|
|
31
|
+
/**
|
|
32
|
+
* Clear session ID from state
|
|
33
|
+
*/
|
|
34
|
+
export declare function clearSessionId(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Get project ID from state
|
|
37
|
+
*/
|
|
38
|
+
export declare function getProjectId(): string | null;
|
|
39
|
+
/**
|
|
40
|
+
* Set project ID in state
|
|
41
|
+
*/
|
|
42
|
+
export declare function setProjectId(projectId: string): void;
|
|
43
|
+
/**
|
|
44
|
+
* Get last plan ID from state
|
|
45
|
+
*/
|
|
46
|
+
export declare function getLastPlanId(): string | null;
|
|
47
|
+
/**
|
|
48
|
+
* Set last plan ID in state
|
|
49
|
+
* @deprecated Use setActivePlanId instead
|
|
50
|
+
*/
|
|
51
|
+
export declare function setLastPlanId(planId: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Get active plan ID from state
|
|
54
|
+
* Falls back to lastPlanId for backward compatibility
|
|
55
|
+
*/
|
|
56
|
+
export declare function getActivePlanId(): string | null;
|
|
57
|
+
/**
|
|
58
|
+
* Set active plan ID in state
|
|
59
|
+
*/
|
|
60
|
+
export declare function setActivePlanId(planId: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Get last plan generated timestamp
|
|
63
|
+
*/
|
|
64
|
+
export declare function getLastPlanGeneratedAt(): string | null;
|
|
65
|
+
/**
|
|
66
|
+
* Set last plan generated timestamp
|
|
67
|
+
*/
|
|
68
|
+
export declare function setLastPlanGeneratedAt(timestamp: string): void;
|
|
69
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/utils/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,QAAQ;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AA4BD;;GAEG;AACH,wBAAgB,SAAS,IAAI,QAAQ,CAcpC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAOxD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAG5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAIrC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAG5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAG7C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAG/C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAGpD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAGtD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE9D"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* State Management Utility
|
|
4
|
+
*
|
|
5
|
+
* Manages CLI state in .neurcode/config.json (project-local state)
|
|
6
|
+
* Separates session state from user auth config
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.loadState = loadState;
|
|
10
|
+
exports.saveState = saveState;
|
|
11
|
+
exports.getSessionId = getSessionId;
|
|
12
|
+
exports.setSessionId = setSessionId;
|
|
13
|
+
exports.clearSessionId = clearSessionId;
|
|
14
|
+
exports.getProjectId = getProjectId;
|
|
15
|
+
exports.setProjectId = setProjectId;
|
|
16
|
+
exports.getLastPlanId = getLastPlanId;
|
|
17
|
+
exports.setLastPlanId = setLastPlanId;
|
|
18
|
+
exports.getActivePlanId = getActivePlanId;
|
|
19
|
+
exports.setActivePlanId = setActivePlanId;
|
|
20
|
+
exports.getLastPlanGeneratedAt = getLastPlanGeneratedAt;
|
|
21
|
+
exports.setLastPlanGeneratedAt = setLastPlanGeneratedAt;
|
|
22
|
+
const fs_1 = require("fs");
|
|
23
|
+
const path_1 = require("path");
|
|
24
|
+
const gitignore_1 = require("./gitignore");
|
|
25
|
+
const STATE_DIR = '.neurcode';
|
|
26
|
+
const CONFIG_FILE = 'config.json'; // Changed from state.json to config.json
|
|
27
|
+
/**
|
|
28
|
+
* Get path to config file in current working directory
|
|
29
|
+
*/
|
|
30
|
+
function getConfigPath() {
|
|
31
|
+
const cwd = process.cwd();
|
|
32
|
+
const stateDir = (0, path_1.join)(cwd, STATE_DIR);
|
|
33
|
+
const configPath = (0, path_1.join)(stateDir, CONFIG_FILE);
|
|
34
|
+
return configPath;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Ensure state directory exists and .neurcode is in .gitignore
|
|
38
|
+
*/
|
|
39
|
+
function ensureStateDir() {
|
|
40
|
+
const cwd = process.cwd();
|
|
41
|
+
const stateDir = (0, path_1.join)(cwd, STATE_DIR);
|
|
42
|
+
if (!(0, fs_1.existsSync)(stateDir)) {
|
|
43
|
+
(0, fs_1.mkdirSync)(stateDir, { recursive: true });
|
|
44
|
+
}
|
|
45
|
+
// Auto-add .neurcode to .gitignore
|
|
46
|
+
(0, gitignore_1.ensureNeurcodeInGitignore)(cwd);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Load state from .neurcode/config.json
|
|
50
|
+
*/
|
|
51
|
+
function loadState() {
|
|
52
|
+
const configPath = getConfigPath();
|
|
53
|
+
if (!(0, fs_1.existsSync)(configPath)) {
|
|
54
|
+
return {};
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const content = (0, fs_1.readFileSync)(configPath, 'utf-8');
|
|
58
|
+
return JSON.parse(content);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
// If file is corrupted, return empty state
|
|
62
|
+
return {};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Save state to .neurcode/config.json
|
|
67
|
+
*/
|
|
68
|
+
function saveState(state) {
|
|
69
|
+
ensureStateDir();
|
|
70
|
+
const configPath = getConfigPath();
|
|
71
|
+
const currentState = loadState();
|
|
72
|
+
const newState = { ...currentState, ...state };
|
|
73
|
+
(0, fs_1.writeFileSync)(configPath, JSON.stringify(newState, null, 2) + '\n', 'utf-8');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get session ID from state
|
|
77
|
+
*/
|
|
78
|
+
function getSessionId() {
|
|
79
|
+
const state = loadState();
|
|
80
|
+
return state.sessionId || null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Set session ID in state
|
|
84
|
+
*/
|
|
85
|
+
function setSessionId(sessionId) {
|
|
86
|
+
saveState({ sessionId });
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Clear session ID from state
|
|
90
|
+
*/
|
|
91
|
+
function clearSessionId() {
|
|
92
|
+
const state = loadState();
|
|
93
|
+
delete state.sessionId;
|
|
94
|
+
saveState(state);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get project ID from state
|
|
98
|
+
*/
|
|
99
|
+
function getProjectId() {
|
|
100
|
+
const state = loadState();
|
|
101
|
+
return state.projectId || null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Set project ID in state
|
|
105
|
+
*/
|
|
106
|
+
function setProjectId(projectId) {
|
|
107
|
+
saveState({ projectId });
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get last plan ID from state
|
|
111
|
+
*/
|
|
112
|
+
function getLastPlanId() {
|
|
113
|
+
const state = loadState();
|
|
114
|
+
return state.lastPlanId || null;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Set last plan ID in state
|
|
118
|
+
* @deprecated Use setActivePlanId instead
|
|
119
|
+
*/
|
|
120
|
+
function setLastPlanId(planId) {
|
|
121
|
+
saveState({ lastPlanId: planId });
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get active plan ID from state
|
|
125
|
+
* Falls back to lastPlanId for backward compatibility
|
|
126
|
+
*/
|
|
127
|
+
function getActivePlanId() {
|
|
128
|
+
const state = loadState();
|
|
129
|
+
return state.activePlanId || state.lastPlanId || null;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Set active plan ID in state
|
|
133
|
+
*/
|
|
134
|
+
function setActivePlanId(planId) {
|
|
135
|
+
// Save to both activePlanId (new) and lastPlanId (for backward compatibility)
|
|
136
|
+
saveState({ activePlanId: planId, lastPlanId: planId });
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get last plan generated timestamp
|
|
140
|
+
*/
|
|
141
|
+
function getLastPlanGeneratedAt() {
|
|
142
|
+
const state = loadState();
|
|
143
|
+
return state.lastPlanGeneratedAt || null;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Set last plan generated timestamp
|
|
147
|
+
*/
|
|
148
|
+
function setLastPlanGeneratedAt(timestamp) {
|
|
149
|
+
saveState({ lastPlanGeneratedAt: timestamp });
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/utils/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User Context Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides user information (name, email) for personalized CLI messaging.
|
|
5
|
+
* Caches user info to avoid repeated API calls.
|
|
6
|
+
*/
|
|
7
|
+
export interface UserInfo {
|
|
8
|
+
id: string;
|
|
9
|
+
email: string;
|
|
10
|
+
firstName?: string;
|
|
11
|
+
lastName?: string;
|
|
12
|
+
imageUrl?: string;
|
|
13
|
+
displayName: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get current user information
|
|
17
|
+
* Uses cache to avoid repeated API calls
|
|
18
|
+
*/
|
|
19
|
+
export declare function getUserInfo(): Promise<UserInfo | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Clear cached user info (useful after logout)
|
|
22
|
+
*/
|
|
23
|
+
export declare function clearUserCache(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Get user's first name or fallback
|
|
26
|
+
*/
|
|
27
|
+
export declare function getUserFirstName(): Promise<string>;
|
|
28
|
+
//# sourceMappingURL=user-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-context.d.ts","sourceRoot":"","sources":["../../src/utils/user-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAoC5D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAGrC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAGxD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* User Context Utility
|
|
4
|
+
*
|
|
5
|
+
* Provides user information (name, email) for personalized CLI messaging.
|
|
6
|
+
* Caches user info to avoid repeated API calls.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.getUserInfo = getUserInfo;
|
|
10
|
+
exports.clearUserCache = clearUserCache;
|
|
11
|
+
exports.getUserFirstName = getUserFirstName;
|
|
12
|
+
const config_1 = require("../config");
|
|
13
|
+
const api_client_1 = require("../api-client");
|
|
14
|
+
let cachedUserInfo = null;
|
|
15
|
+
let cacheTimestamp = 0;
|
|
16
|
+
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
|
17
|
+
/**
|
|
18
|
+
* Get current user information
|
|
19
|
+
* Uses cache to avoid repeated API calls
|
|
20
|
+
*/
|
|
21
|
+
async function getUserInfo() {
|
|
22
|
+
try {
|
|
23
|
+
// Return cached info if still valid
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
if (cachedUserInfo && (now - cacheTimestamp) < CACHE_TTL) {
|
|
26
|
+
return cachedUserInfo;
|
|
27
|
+
}
|
|
28
|
+
const config = (0, config_1.loadConfig)();
|
|
29
|
+
if (!config.apiKey) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const client = new api_client_1.ApiClient(config);
|
|
33
|
+
const user = await client.getCurrentUser();
|
|
34
|
+
// Build display name
|
|
35
|
+
const displayName = user.firstName && user.lastName
|
|
36
|
+
? `${user.firstName} ${user.lastName}`
|
|
37
|
+
: user.firstName || user.lastName || user.email.split('@')[0] || 'User';
|
|
38
|
+
cachedUserInfo = {
|
|
39
|
+
id: user.id,
|
|
40
|
+
email: user.email,
|
|
41
|
+
firstName: user.firstName,
|
|
42
|
+
lastName: user.lastName,
|
|
43
|
+
imageUrl: user.imageUrl,
|
|
44
|
+
displayName,
|
|
45
|
+
};
|
|
46
|
+
cacheTimestamp = now;
|
|
47
|
+
return cachedUserInfo;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
// Silently fail - user info is optional for messaging
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Clear cached user info (useful after logout)
|
|
56
|
+
*/
|
|
57
|
+
function clearUserCache() {
|
|
58
|
+
cachedUserInfo = null;
|
|
59
|
+
cacheTimestamp = 0;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get user's first name or fallback
|
|
63
|
+
*/
|
|
64
|
+
async function getUserFirstName() {
|
|
65
|
+
const user = await getUserInfo();
|
|
66
|
+
return user?.firstName || user?.displayName.split(' ')[0] || 'there';
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=user-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-context.js","sourceRoot":"","sources":["../../src/utils/user-context.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAsBH,kCAoCC;AAKD,wCAGC;AAKD,4CAGC;AAxED,sCAAuC;AACvC,8CAA0C;AAW1C,IAAI,cAAc,GAAoB,IAAI,CAAC;AAC3C,IAAI,cAAc,GAAW,CAAC,CAAC;AAC/B,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAE7C;;;GAGG;AACI,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,oCAAoC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,cAAc,IAAI,CAAC,GAAG,GAAG,cAAc,CAAC,GAAG,SAAS,EAAE,CAAC;YACzD,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,sBAAS,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QAE3C,qBAAqB;QACrB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ;YACjD,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE;YACtC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;QAE1E,cAAc,GAAG;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW;SACZ,CAAC;QAEF,cAAc,GAAG,GAAG,CAAC;QACrB,OAAO,cAAc,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sDAAsD;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc;IAC5B,cAAc,GAAG,IAAI,CAAC;IACtB,cAAc,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB;IACpC,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;IACjC,OAAO,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;AACvE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neurcode-ai/cli",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Neurcode CLI - AI code governance and diff analysis",
|
|
5
5
|
"bin": {
|
|
6
6
|
"neurcode": "./dist/index.js"
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
"scripts": {
|
|
15
15
|
"build": "rm -rf dist && tsc && chmod +x dist/index.js",
|
|
16
16
|
"dev": "tsc --watch",
|
|
17
|
-
"start": "node dist/index.js"
|
|
17
|
+
"start": "node dist/index.js",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
18
19
|
},
|
|
19
20
|
"keywords": [
|
|
20
21
|
"cli",
|
|
@@ -39,16 +40,22 @@
|
|
|
39
40
|
"@neurcode-ai/diff-parser": "^0.1.0",
|
|
40
41
|
"@neurcode-ai/policy-engine": "^0.1.0",
|
|
41
42
|
"chalk": "^4.1.2",
|
|
43
|
+
"chokidar": "^3.6.0",
|
|
42
44
|
"commander": "^11.1.0",
|
|
45
|
+
"fs-extra": "^11.2.0",
|
|
43
46
|
"glob": "^10.3.10",
|
|
44
|
-
"
|
|
47
|
+
"lowdb": "^1.0.0",
|
|
48
|
+
"ts-morph": "^24.0.0",
|
|
49
|
+
"uuid": "^9.0.1"
|
|
45
50
|
},
|
|
46
51
|
"publishConfig": {
|
|
47
52
|
"access": "public"
|
|
48
53
|
},
|
|
49
54
|
"devDependencies": {
|
|
50
|
-
"@types/
|
|
55
|
+
"@types/fs-extra": "^11.0.4",
|
|
51
56
|
"@types/glob": "^8.1.0",
|
|
57
|
+
"@types/node": "^20.10.0",
|
|
58
|
+
"@types/uuid": "^9.0.8",
|
|
52
59
|
"typescript": "^5.3.0"
|
|
53
60
|
}
|
|
54
61
|
}
|