@neurcode-ai/cli 0.3.9 → 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.
Files changed (111) hide show
  1. package/dist/api-client.d.ts +105 -17
  2. package/dist/api-client.d.ts.map +1 -1
  3. package/dist/api-client.js +388 -85
  4. package/dist/api-client.js.map +1 -1
  5. package/dist/commands/allow.d.ts.map +1 -1
  6. package/dist/commands/allow.js +6 -33
  7. package/dist/commands/allow.js.map +1 -1
  8. package/dist/commands/check.d.ts.map +1 -1
  9. package/dist/commands/check.js +56 -13
  10. package/dist/commands/check.js.map +1 -1
  11. package/dist/commands/doctor.d.ts +7 -0
  12. package/dist/commands/doctor.d.ts.map +1 -0
  13. package/dist/commands/doctor.js +134 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/init.d.ts +13 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +365 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/login.d.ts +8 -0
  20. package/dist/commands/login.d.ts.map +1 -0
  21. package/dist/commands/login.js +209 -0
  22. package/dist/commands/login.js.map +1 -0
  23. package/dist/commands/logout.d.ts +7 -0
  24. package/dist/commands/logout.d.ts.map +1 -0
  25. package/dist/commands/logout.js +70 -0
  26. package/dist/commands/logout.js.map +1 -0
  27. package/dist/commands/plan.d.ts +2 -0
  28. package/dist/commands/plan.d.ts.map +1 -1
  29. package/dist/commands/plan.js +210 -57
  30. package/dist/commands/plan.js.map +1 -1
  31. package/dist/commands/prompt.d.ts +6 -0
  32. package/dist/commands/prompt.d.ts.map +1 -0
  33. package/dist/commands/prompt.js +254 -0
  34. package/dist/commands/prompt.js.map +1 -0
  35. package/dist/commands/revert.d.ts.map +1 -1
  36. package/dist/commands/revert.js +10 -0
  37. package/dist/commands/revert.js.map +1 -1
  38. package/dist/commands/session.d.ts +29 -0
  39. package/dist/commands/session.d.ts.map +1 -0
  40. package/dist/commands/session.js +382 -0
  41. package/dist/commands/session.js.map +1 -0
  42. package/dist/commands/verify.d.ts.map +1 -1
  43. package/dist/commands/verify.js +132 -15
  44. package/dist/commands/verify.js.map +1 -1
  45. package/dist/commands/watch.d.ts +8 -0
  46. package/dist/commands/watch.d.ts.map +1 -0
  47. package/dist/commands/watch.js +78 -0
  48. package/dist/commands/watch.js.map +1 -0
  49. package/dist/config.d.ts +29 -4
  50. package/dist/config.d.ts.map +1 -1
  51. package/dist/config.js +186 -21
  52. package/dist/config.js.map +1 -1
  53. package/dist/index.js +120 -3
  54. package/dist/index.js.map +1 -1
  55. package/dist/services/integrations/TicketService.d.ts +68 -0
  56. package/dist/services/integrations/TicketService.d.ts.map +1 -0
  57. package/dist/services/integrations/TicketService.js +151 -0
  58. package/dist/services/integrations/TicketService.js.map +1 -0
  59. package/dist/services/security/SecurityGuard.d.ts +80 -0
  60. package/dist/services/security/SecurityGuard.d.ts.map +1 -0
  61. package/dist/services/security/SecurityGuard.js +410 -0
  62. package/dist/services/security/SecurityGuard.js.map +1 -0
  63. package/dist/services/watch/BlobStore.d.ts +33 -0
  64. package/dist/services/watch/BlobStore.d.ts.map +1 -0
  65. package/dist/services/watch/BlobStore.js +108 -0
  66. package/dist/services/watch/BlobStore.js.map +1 -0
  67. package/dist/services/watch/CommandPoller.d.ts +76 -0
  68. package/dist/services/watch/CommandPoller.d.ts.map +1 -0
  69. package/dist/services/watch/CommandPoller.js +298 -0
  70. package/dist/services/watch/CommandPoller.js.map +1 -0
  71. package/dist/services/watch/Journal.d.ts +58 -0
  72. package/dist/services/watch/Journal.d.ts.map +1 -0
  73. package/dist/services/watch/Journal.js +144 -0
  74. package/dist/services/watch/Journal.js.map +1 -0
  75. package/dist/services/watch/Sentinel.d.ts +49 -0
  76. package/dist/services/watch/Sentinel.d.ts.map +1 -0
  77. package/dist/services/watch/Sentinel.js +205 -0
  78. package/dist/services/watch/Sentinel.js.map +1 -0
  79. package/dist/services/watch/Syncer.d.ts +55 -0
  80. package/dist/services/watch/Syncer.d.ts.map +1 -0
  81. package/dist/services/watch/Syncer.js +231 -0
  82. package/dist/services/watch/Syncer.js.map +1 -0
  83. package/dist/utils/ROILogger.d.ts +16 -0
  84. package/dist/utils/ROILogger.d.ts.map +1 -0
  85. package/dist/utils/ROILogger.js +45 -0
  86. package/dist/utils/ROILogger.js.map +1 -0
  87. package/dist/utils/box.d.ts +16 -0
  88. package/dist/utils/box.d.ts.map +1 -0
  89. package/dist/utils/box.js +85 -0
  90. package/dist/utils/box.js.map +1 -0
  91. package/dist/utils/gitignore.d.ts +10 -0
  92. package/dist/utils/gitignore.d.ts.map +1 -0
  93. package/dist/utils/gitignore.js +34 -0
  94. package/dist/utils/gitignore.js.map +1 -0
  95. package/dist/utils/messages.d.ts +81 -0
  96. package/dist/utils/messages.d.ts.map +1 -0
  97. package/dist/utils/messages.js +306 -0
  98. package/dist/utils/messages.js.map +1 -0
  99. package/dist/utils/restore.d.ts +14 -0
  100. package/dist/utils/restore.d.ts.map +1 -0
  101. package/dist/utils/restore.js +89 -0
  102. package/dist/utils/restore.js.map +1 -0
  103. package/dist/utils/state.d.ts +69 -0
  104. package/dist/utils/state.d.ts.map +1 -0
  105. package/dist/utils/state.js +151 -0
  106. package/dist/utils/state.js.map +1 -0
  107. package/dist/utils/user-context.d.ts +28 -0
  108. package/dist/utils/user-context.d.ts.map +1 -0
  109. package/dist/utils/user-context.js +68 -0
  110. package/dist/utils/user-context.js.map +1 -0
  111. 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.3.9",
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
- "ts-morph": "^24.0.0"
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/node": "^20.10.0",
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
  }