@neurcode-ai/cli 0.8.4 → 0.8.6

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,535 @@
1
+ "use strict";
2
+ /**
3
+ * Project Knowledge Service
4
+ *
5
+ * Detects and maintains persistent knowledge about project tech stack and architecture.
6
+ * This service provides context-aware information that helps the Architect make better decisions.
7
+ *
8
+ * Features:
9
+ * - Tech stack detection (Node.js, Python, Go)
10
+ * - Architecture pattern detection and memory
11
+ * - Persistent storage in .neurcode/architecture.json
12
+ * - Natural language project summaries
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.ProjectKnowledgeService = void 0;
16
+ const fs_1 = require("fs");
17
+ const path_1 = require("path");
18
+ const zod_1 = require("zod");
19
+ /**
20
+ * Architecture memory schema
21
+ */
22
+ const ArchitectureMemorySchema = zod_1.z.object({
23
+ pattern: zod_1.z.enum(['feature-based', 'layered', 'mvc', 'unknown']),
24
+ invariants: zod_1.z.array(zod_1.z.string()),
25
+ domainBoundaries: zod_1.z.array(zod_1.z.string()),
26
+ });
27
+ class ProjectKnowledgeService {
28
+ /**
29
+ * Detect tech stack from project root
30
+ */
31
+ async detectTechStack(rootPath) {
32
+ const techStack = {
33
+ language: 'unknown',
34
+ };
35
+ // Try Node.js (package.json)
36
+ const packageJsonPath = (0, path_1.join)(rootPath, 'package.json');
37
+ if ((0, fs_1.existsSync)(packageJsonPath)) {
38
+ try {
39
+ const packageJson = JSON.parse((0, fs_1.readFileSync)(packageJsonPath, 'utf-8'));
40
+ techStack.language = 'node';
41
+ techStack.packageManager = this.detectPackageManager(rootPath);
42
+ techStack.version = packageJson.version;
43
+ // Detect framework
44
+ techStack.framework = this.detectNodeFramework(packageJson);
45
+ // Detect ORM
46
+ techStack.orm = this.detectNodeORM(packageJson);
47
+ // Detect styling
48
+ techStack.styling = this.detectStyling(packageJson);
49
+ // Detect build tool
50
+ techStack.buildTool = this.detectBuildTool(packageJson);
51
+ return techStack;
52
+ }
53
+ catch (error) {
54
+ console.warn('Failed to parse package.json:', error);
55
+ }
56
+ }
57
+ // Try Python (requirements.txt or pyproject.toml)
58
+ const requirementsPath = (0, path_1.join)(rootPath, 'requirements.txt');
59
+ const pyprojectPath = (0, path_1.join)(rootPath, 'pyproject.toml');
60
+ if ((0, fs_1.existsSync)(requirementsPath) || (0, fs_1.existsSync)(pyprojectPath)) {
61
+ techStack.language = 'python';
62
+ if ((0, fs_1.existsSync)(requirementsPath)) {
63
+ try {
64
+ const requirements = (0, fs_1.readFileSync)(requirementsPath, 'utf-8');
65
+ techStack.framework = this.detectPythonFramework(requirements);
66
+ techStack.orm = this.detectPythonORM(requirements);
67
+ }
68
+ catch (error) {
69
+ console.warn('Failed to read requirements.txt:', error);
70
+ }
71
+ }
72
+ if ((0, fs_1.existsSync)(pyprojectPath)) {
73
+ try {
74
+ const pyproject = (0, fs_1.readFileSync)(pyprojectPath, 'utf-8');
75
+ // Simple parsing for pyproject.toml (basic implementation)
76
+ if (pyproject.includes('django')) {
77
+ techStack.framework = 'Django';
78
+ }
79
+ else if (pyproject.includes('fastapi')) {
80
+ techStack.framework = 'FastAPI';
81
+ }
82
+ else if (pyproject.includes('flask')) {
83
+ techStack.framework = 'Flask';
84
+ }
85
+ }
86
+ catch (error) {
87
+ console.warn('Failed to read pyproject.toml:', error);
88
+ }
89
+ }
90
+ return techStack;
91
+ }
92
+ // Try Go (go.mod)
93
+ const goModPath = (0, path_1.join)(rootPath, 'go.mod');
94
+ if ((0, fs_1.existsSync)(goModPath)) {
95
+ try {
96
+ const goMod = (0, fs_1.readFileSync)(goModPath, 'utf-8');
97
+ techStack.language = 'go';
98
+ // Extract module name and version
99
+ const moduleMatch = goMod.match(/^module\s+(\S+)/m);
100
+ if (moduleMatch) {
101
+ techStack.version = moduleMatch[1];
102
+ }
103
+ // Detect Go framework
104
+ techStack.framework = this.detectGoFramework(goMod);
105
+ techStack.orm = this.detectGoORM(goMod);
106
+ return techStack;
107
+ }
108
+ catch (error) {
109
+ console.warn('Failed to read go.mod:', error);
110
+ }
111
+ }
112
+ return techStack;
113
+ }
114
+ /**
115
+ * Detect Node.js framework from package.json
116
+ */
117
+ detectNodeFramework(packageJson) {
118
+ const deps = {
119
+ ...packageJson.dependencies,
120
+ ...packageJson.devDependencies,
121
+ };
122
+ // React frameworks
123
+ if (deps['next'])
124
+ return 'Next.js';
125
+ if (deps['remix'])
126
+ return 'Remix';
127
+ if (deps['gatsby'])
128
+ return 'Gatsby';
129
+ if (deps['react']) {
130
+ // Check for Vite
131
+ if (deps['vite'])
132
+ return 'React + Vite';
133
+ if (deps['@vitejs/plugin-react'])
134
+ return 'React + Vite';
135
+ return 'React';
136
+ }
137
+ // Vue frameworks
138
+ if (deps['nuxt'])
139
+ return 'Nuxt.js';
140
+ if (deps['vue'])
141
+ return 'Vue.js';
142
+ // Angular
143
+ if (deps['@angular/core'])
144
+ return 'Angular';
145
+ // Backend frameworks
146
+ if (deps['express'])
147
+ return 'Express';
148
+ if (deps['fastify'])
149
+ return 'Fastify';
150
+ if (deps['koa'])
151
+ return 'Koa';
152
+ if (deps['nest'])
153
+ return 'NestJS';
154
+ if (deps['hapi'])
155
+ return 'Hapi';
156
+ // Check scripts for framework hints
157
+ if (packageJson.scripts) {
158
+ if (packageJson.scripts.dev?.includes('next'))
159
+ return 'Next.js';
160
+ if (packageJson.scripts.start?.includes('next'))
161
+ return 'Next.js';
162
+ }
163
+ return undefined;
164
+ }
165
+ /**
166
+ * Detect Node.js ORM from package.json
167
+ */
168
+ detectNodeORM(packageJson) {
169
+ const deps = {
170
+ ...packageJson.dependencies,
171
+ ...packageJson.devDependencies,
172
+ };
173
+ if (deps['prisma'])
174
+ return 'Prisma';
175
+ if (deps['typeorm'])
176
+ return 'TypeORM';
177
+ if (deps['sequelize'])
178
+ return 'Sequelize';
179
+ if (deps['mongoose'])
180
+ return 'Mongoose';
181
+ if (deps['drizzle-orm'])
182
+ return 'Drizzle ORM';
183
+ if (deps['kysely'])
184
+ return 'Kysely';
185
+ return undefined;
186
+ }
187
+ /**
188
+ * Detect styling library from package.json
189
+ */
190
+ detectStyling(packageJson) {
191
+ const deps = {
192
+ ...packageJson.dependencies,
193
+ ...packageJson.devDependencies,
194
+ };
195
+ if (deps['tailwindcss'])
196
+ return 'Tailwind CSS';
197
+ if (deps['@mui/material'] || deps['@material-ui/core'])
198
+ return 'Material UI';
199
+ if (deps['styled-components'])
200
+ return 'Styled Components';
201
+ if (deps['emotion'])
202
+ return 'Emotion';
203
+ if (deps['sass'] || deps['node-sass'])
204
+ return 'Sass';
205
+ if (deps['less'])
206
+ return 'Less';
207
+ if (deps['bootstrap'])
208
+ return 'Bootstrap';
209
+ return undefined;
210
+ }
211
+ /**
212
+ * Detect build tool from package.json
213
+ */
214
+ detectBuildTool(packageJson) {
215
+ const deps = {
216
+ ...packageJson.dependencies,
217
+ ...packageJson.devDependencies,
218
+ };
219
+ if (deps['vite'])
220
+ return 'Vite';
221
+ if (deps['webpack'])
222
+ return 'Webpack';
223
+ if (deps['rollup'])
224
+ return 'Rollup';
225
+ if (deps['esbuild'])
226
+ return 'esbuild';
227
+ if (deps['turbo'])
228
+ return 'Turborepo';
229
+ if (deps['nx'])
230
+ return 'Nx';
231
+ return undefined;
232
+ }
233
+ /**
234
+ * Detect package manager from lock files
235
+ */
236
+ detectPackageManager(rootPath) {
237
+ if ((0, fs_1.existsSync)((0, path_1.join)(rootPath, 'pnpm-lock.yaml')))
238
+ return 'pnpm';
239
+ if ((0, fs_1.existsSync)((0, path_1.join)(rootPath, 'yarn.lock')))
240
+ return 'yarn';
241
+ if ((0, fs_1.existsSync)((0, path_1.join)(rootPath, 'package-lock.json')))
242
+ return 'npm';
243
+ if ((0, fs_1.existsSync)((0, path_1.join)(rootPath, 'bun.lockb')))
244
+ return 'bun';
245
+ return undefined;
246
+ }
247
+ /**
248
+ * Detect Python framework from requirements.txt
249
+ */
250
+ detectPythonFramework(requirements) {
251
+ const lowerRequirements = requirements.toLowerCase();
252
+ if (lowerRequirements.includes('django'))
253
+ return 'Django';
254
+ if (lowerRequirements.includes('fastapi'))
255
+ return 'FastAPI';
256
+ if (lowerRequirements.includes('flask'))
257
+ return 'Flask';
258
+ if (lowerRequirements.includes('tornado'))
259
+ return 'Tornado';
260
+ if (lowerRequirements.includes('bottle'))
261
+ return 'Bottle';
262
+ return undefined;
263
+ }
264
+ /**
265
+ * Detect Python ORM from requirements.txt
266
+ */
267
+ detectPythonORM(requirements) {
268
+ const lowerRequirements = requirements.toLowerCase();
269
+ if (lowerRequirements.includes('sqlalchemy'))
270
+ return 'SQLAlchemy';
271
+ if (lowerRequirements.includes('django') && lowerRequirements.includes('orm'))
272
+ return 'Django ORM';
273
+ if (lowerRequirements.includes('peewee'))
274
+ return 'Peewee';
275
+ if (lowerRequirements.includes('tortoise-orm'))
276
+ return 'Tortoise ORM';
277
+ if (lowerRequirements.includes('prisma') || lowerRequirements.includes('prisma-client'))
278
+ return 'Prisma';
279
+ return undefined;
280
+ }
281
+ /**
282
+ * Detect Go framework from go.mod
283
+ */
284
+ detectGoFramework(goMod) {
285
+ if (goMod.includes('github.com/gin-gonic/gin'))
286
+ return 'Gin';
287
+ if (goMod.includes('github.com/gorilla/mux'))
288
+ return 'Gorilla Mux';
289
+ if (goMod.includes('github.com/labstack/echo'))
290
+ return 'Echo';
291
+ if (goMod.includes('github.com/go-chi/chi'))
292
+ return 'Chi';
293
+ if (goMod.includes('github.com/beego/beego'))
294
+ return 'Beego';
295
+ return undefined;
296
+ }
297
+ /**
298
+ * Detect Go ORM from go.mod
299
+ */
300
+ detectGoORM(goMod) {
301
+ if (goMod.includes('gorm.io/gorm'))
302
+ return 'GORM';
303
+ if (goMod.includes('github.com/jinzhu/gorm'))
304
+ return 'GORM (legacy)';
305
+ if (goMod.includes('github.com/volatiletech/sqlboiler'))
306
+ return 'SQLBoiler';
307
+ if (goMod.includes('github.com/go-pg/pg'))
308
+ return 'go-pg';
309
+ return undefined;
310
+ }
311
+ /**
312
+ * Detect architecture pattern from folder structure
313
+ */
314
+ detectArchitecturePattern(rootPath) {
315
+ // Check for Next.js App Router structure
316
+ if ((0, fs_1.existsSync)((0, path_1.join)(rootPath, 'src', 'app')) || (0, fs_1.existsSync)((0, path_1.join)(rootPath, 'app'))) {
317
+ return 'feature-based'; // Next.js App Router uses feature-based routing
318
+ }
319
+ // Check for feature-based structure (modules, features, domains)
320
+ if ((0, fs_1.existsSync)((0, path_1.join)(rootPath, 'src', 'modules')) ||
321
+ (0, fs_1.existsSync)((0, path_1.join)(rootPath, 'src', 'features')) ||
322
+ (0, fs_1.existsSync)((0, path_1.join)(rootPath, 'src', 'domains'))) {
323
+ return 'feature-based';
324
+ }
325
+ // Check for layered architecture (controllers, services, models)
326
+ if ((0, fs_1.existsSync)((0, path_1.join)(rootPath, 'src', 'controllers')) &&
327
+ (0, fs_1.existsSync)((0, path_1.join)(rootPath, 'src', 'services')) &&
328
+ (0, fs_1.existsSync)((0, path_1.join)(rootPath, 'src', 'models'))) {
329
+ return 'layered';
330
+ }
331
+ // Check for MVC structure
332
+ if ((0, fs_1.existsSync)((0, path_1.join)(rootPath, 'src', 'models')) &&
333
+ (0, fs_1.existsSync)((0, path_1.join)(rootPath, 'src', 'views')) &&
334
+ (0, fs_1.existsSync)((0, path_1.join)(rootPath, 'src', 'controllers'))) {
335
+ return 'mvc';
336
+ }
337
+ // Check for Django-like structure (apps)
338
+ if ((0, fs_1.existsSync)((0, path_1.join)(rootPath, 'apps')) ||
339
+ ((0, fs_1.existsSync)((0, path_1.join)(rootPath, 'src')) &&
340
+ (0, fs_1.existsSync)((0, path_1.join)(rootPath, 'manage.py')))) {
341
+ return 'feature-based';
342
+ }
343
+ return 'unknown';
344
+ }
345
+ /**
346
+ * Detect domain boundaries from folder structure
347
+ */
348
+ detectDomainBoundaries(rootPath) {
349
+ const boundaries = [];
350
+ // Check common patterns
351
+ const srcPath = (0, path_1.join)(rootPath, 'src');
352
+ if ((0, fs_1.existsSync)(srcPath)) {
353
+ // Feature-based boundaries
354
+ if ((0, fs_1.existsSync)((0, path_1.join)(srcPath, 'modules'))) {
355
+ boundaries.push('src/modules/*');
356
+ }
357
+ if ((0, fs_1.existsSync)((0, path_1.join)(srcPath, 'features'))) {
358
+ boundaries.push('src/features/*');
359
+ }
360
+ if ((0, fs_1.existsSync)((0, path_1.join)(srcPath, 'domains'))) {
361
+ boundaries.push('src/domains/*');
362
+ }
363
+ // App Router (Next.js)
364
+ if ((0, fs_1.existsSync)((0, path_1.join)(srcPath, 'app'))) {
365
+ boundaries.push('src/app/**/route.ts');
366
+ boundaries.push('src/app/**/page.tsx');
367
+ }
368
+ // Layered architecture boundaries
369
+ if ((0, fs_1.existsSync)((0, path_1.join)(srcPath, 'controllers'))) {
370
+ boundaries.push('src/controllers/*');
371
+ }
372
+ if ((0, fs_1.existsSync)((0, path_1.join)(srcPath, 'services'))) {
373
+ boundaries.push('src/services/*');
374
+ }
375
+ if ((0, fs_1.existsSync)((0, path_1.join)(srcPath, 'models'))) {
376
+ boundaries.push('src/models/*');
377
+ }
378
+ }
379
+ // Django apps
380
+ if ((0, fs_1.existsSync)((0, path_1.join)(rootPath, 'apps'))) {
381
+ boundaries.push('apps/*');
382
+ }
383
+ return boundaries;
384
+ }
385
+ /**
386
+ * Generate default invariants based on architecture pattern
387
+ */
388
+ generateDefaultInvariants(pattern) {
389
+ const invariants = [];
390
+ switch (pattern) {
391
+ case 'layered':
392
+ invariants.push('No direct database access in controllers');
393
+ invariants.push('Business logic must be in service layer');
394
+ invariants.push('Models should only contain data structures');
395
+ break;
396
+ case 'mvc':
397
+ invariants.push('Models should not contain business logic');
398
+ invariants.push('Views should not contain business logic');
399
+ invariants.push('Controllers should delegate to services');
400
+ break;
401
+ case 'feature-based':
402
+ invariants.push('Features should be self-contained modules');
403
+ invariants.push('No cross-feature dependencies without interfaces');
404
+ invariants.push('Shared code should be in common/shared directory');
405
+ break;
406
+ case 'unknown':
407
+ invariants.push('Follow existing project structure');
408
+ break;
409
+ }
410
+ return invariants;
411
+ }
412
+ /**
413
+ * Read architecture memory from .neurcode/architecture.json
414
+ */
415
+ async readArchitectureMemory(rootPath) {
416
+ const neurcodeDir = (0, path_1.join)(rootPath, '.neurcode');
417
+ const architecturePath = (0, path_1.join)(neurcodeDir, 'architecture.json');
418
+ if (!(0, fs_1.existsSync)(architecturePath)) {
419
+ return null;
420
+ }
421
+ try {
422
+ const content = (0, fs_1.readFileSync)(architecturePath, 'utf-8');
423
+ const parsed = JSON.parse(content);
424
+ const validated = ArchitectureMemorySchema.parse(parsed);
425
+ return validated;
426
+ }
427
+ catch (error) {
428
+ console.warn('Failed to read or validate architecture.json:', error);
429
+ return null;
430
+ }
431
+ }
432
+ /**
433
+ * Write architecture memory to .neurcode/architecture.json
434
+ */
435
+ async writeArchitectureMemory(rootPath, memory) {
436
+ const neurcodeDir = (0, path_1.join)(rootPath, '.neurcode');
437
+ const architecturePath = (0, path_1.join)(neurcodeDir, 'architecture.json');
438
+ // Ensure .neurcode directory exists
439
+ if (!(0, fs_1.existsSync)(neurcodeDir)) {
440
+ (0, fs_1.mkdirSync)(neurcodeDir, { recursive: true });
441
+ }
442
+ // Validate before writing
443
+ const validated = ArchitectureMemorySchema.parse(memory);
444
+ // Write to file
445
+ (0, fs_1.writeFileSync)(architecturePath, JSON.stringify(validated, null, 2), 'utf-8');
446
+ }
447
+ /**
448
+ * Initialize architecture memory with defaults based on folder structure
449
+ */
450
+ async initializeArchitectureMemory(rootPath) {
451
+ const pattern = this.detectArchitecturePattern(rootPath);
452
+ const domainBoundaries = this.detectDomainBoundaries(rootPath);
453
+ const invariants = this.generateDefaultInvariants(pattern);
454
+ const memory = {
455
+ pattern,
456
+ invariants,
457
+ domainBoundaries,
458
+ };
459
+ // Save to disk
460
+ await this.writeArchitectureMemory(rootPath, memory);
461
+ return memory;
462
+ }
463
+ /**
464
+ * Get or create architecture memory (reads from disk or initializes)
465
+ */
466
+ async getArchitectureMemory(rootPath) {
467
+ // Try to read existing
468
+ const existing = await this.readArchitectureMemory(rootPath);
469
+ if (existing) {
470
+ return existing;
471
+ }
472
+ // Initialize if not found
473
+ return await this.initializeArchitectureMemory(rootPath);
474
+ }
475
+ /**
476
+ * Generate natural language project summary
477
+ */
478
+ async getProjectSummary(rootPath) {
479
+ const techStack = await this.detectTechStack(rootPath);
480
+ const architecture = await this.getArchitectureMemory(rootPath);
481
+ // Build natural language summary
482
+ const parts = [];
483
+ // Tech stack description
484
+ if (techStack.language !== 'unknown') {
485
+ const stackParts = [];
486
+ if (techStack.framework) {
487
+ stackParts.push(techStack.framework);
488
+ }
489
+ else {
490
+ // Fallback to language name
491
+ const languageNames = {
492
+ node: 'Node.js',
493
+ python: 'Python',
494
+ go: 'Go',
495
+ };
496
+ stackParts.push(languageNames[techStack.language] || techStack.language);
497
+ }
498
+ if (techStack.orm) {
499
+ stackParts.push(`using ${techStack.orm}`);
500
+ }
501
+ if (techStack.styling) {
502
+ stackParts.push(`with ${techStack.styling}`);
503
+ }
504
+ if (techStack.buildTool) {
505
+ stackParts.push(`built with ${techStack.buildTool}`);
506
+ }
507
+ parts.push(stackParts.join(' ') + ' project');
508
+ }
509
+ else {
510
+ parts.push('Unknown technology stack');
511
+ }
512
+ // Architecture description
513
+ if (architecture.pattern !== 'unknown') {
514
+ const patternNames = {
515
+ 'feature-based': 'feature-based architecture',
516
+ 'layered': 'layered architecture',
517
+ 'mvc': 'MVC architecture',
518
+ 'unknown': 'unknown architecture',
519
+ };
520
+ parts.push(`Follows ${patternNames[architecture.pattern]}`);
521
+ }
522
+ // Add invariants if present
523
+ if (architecture.invariants.length > 0) {
524
+ parts.push(`Key architectural rules: ${architecture.invariants.slice(0, 2).join(', ')}`);
525
+ }
526
+ const summary = parts.join('. ') + '.';
527
+ return {
528
+ techStack,
529
+ architecture,
530
+ summary,
531
+ };
532
+ }
533
+ }
534
+ exports.ProjectKnowledgeService = ProjectKnowledgeService;
535
+ //# sourceMappingURL=project-knowledge-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-knowledge-service.js","sourceRoot":"","sources":["../../src/services/project-knowledge-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Toolbox Service
3
+ *
4
+ * Provides smart, context-aware toolbox summary generation with Top-K
5
+ * relevance filtering. This service is used by both `plan` and `prompt`
6
+ * commands to ensure consistent, intelligent tool selection.
7
+ */
8
+ import { ProjectMap } from './mapper/ProjectScanner';
9
+ /**
10
+ * Generate a concise "Toolbox Summary" from the asset map
11
+ * Uses Top-K relevance filtering to show only the most relevant tools
12
+ *
13
+ * @param map - Project map containing all global exports
14
+ * @param intent - User's intent/query for relevance scoring
15
+ * @returns Formatted toolbox summary string, or empty string if no exports
16
+ */
17
+ export declare function generateToolboxSummary(map: ProjectMap, intent: string): string;
18
+ //# sourceMappingURL=toolbox-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbox-service.d.ts","sourceRoot":"","sources":["../../src/services/toolbox-service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAc,MAAM,yBAAyB,CAAC;AAGjE;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAmD9E"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ /**
3
+ * Toolbox Service
4
+ *
5
+ * Provides smart, context-aware toolbox summary generation with Top-K
6
+ * relevance filtering. This service is used by both `plan` and `prompt`
7
+ * commands to ensure consistent, intelligent tool selection.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.generateToolboxSummary = generateToolboxSummary;
11
+ const RelevanceScorer_1 = require("../utils/RelevanceScorer");
12
+ /**
13
+ * Generate a concise "Toolbox Summary" from the asset map
14
+ * Uses Top-K relevance filtering to show only the most relevant tools
15
+ *
16
+ * @param map - Project map containing all global exports
17
+ * @param intent - User's intent/query for relevance scoring
18
+ * @returns Formatted toolbox summary string, or empty string if no exports
19
+ */
20
+ function generateToolboxSummary(map, intent) {
21
+ if (map.globalExports.length === 0) {
22
+ return '';
23
+ }
24
+ const totalExports = map.globalExports.length;
25
+ const topK = 20; // Show top 20 most relevant tools
26
+ // Filter exports using relevance scoring
27
+ const relevantExports = (0, RelevanceScorer_1.getTopKTools)(intent, map.globalExports, topK);
28
+ if (relevantExports.length === 0) {
29
+ return '';
30
+ }
31
+ // Group filtered exports by file
32
+ const exportsByFile = new Map();
33
+ for (const exp of relevantExports) {
34
+ if (!exportsByFile.has(exp.filePath)) {
35
+ exportsByFile.set(exp.filePath, []);
36
+ }
37
+ exportsByFile.get(exp.filePath).push(exp);
38
+ }
39
+ // Build summary string with header showing count
40
+ const lines = [];
41
+ lines.push(`\n=== Available Tools (Showing ${relevantExports.length} of ${totalExports} tools most relevant to your intent) ===`);
42
+ for (const [filePath, exports] of exportsByFile.entries()) {
43
+ const exportNames = exports
44
+ .map(exp => {
45
+ if (exp.name === 'default')
46
+ return 'default';
47
+ if (exp.signature) {
48
+ // Extract just the function/class name and params for brevity
49
+ const sig = exp.signature.replace(/\s+/g, ' ').trim();
50
+ return sig.length > 60 ? `${exp.name}(...)` : sig;
51
+ }
52
+ return exp.name;
53
+ })
54
+ .join(', ');
55
+ lines.push(`${filePath}: ${exportNames}`);
56
+ }
57
+ lines.push('=== END Available Tools ===');
58
+ if (totalExports > topK) {
59
+ lines.push(`\nšŸ’” If you need a tool not listed here, specify the file path in your next request.`);
60
+ }
61
+ lines.push('');
62
+ return lines.join('\n');
63
+ }
64
+ //# sourceMappingURL=toolbox-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbox-service.js","sourceRoot":"","sources":["../../src/services/toolbox-service.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAaH,wDAmDC;AA7DD,8DAAwD;AAExD;;;;;;;GAOG;AACH,SAAgB,sBAAsB,CAAC,GAAe,EAAE,MAAc;IACpE,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC;IAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,kCAAkC;IAEnD,yCAAyC;IACzC,MAAM,eAAe,GAAG,IAAA,8BAAY,EAAC,MAAM,EAAE,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAEtE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,iCAAiC;IACjC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,iDAAiD;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,kCAAkC,eAAe,CAAC,MAAM,OAAO,YAAY,0CAA0C,CAAC,CAAC;IAElI,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1D,MAAM,WAAW,GAAG,OAAO;aACxB,GAAG,CAAC,GAAG,CAAC,EAAE;YACT,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC7C,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAClB,8DAA8D;gBAC9D,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBACtD,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;YACpD,CAAC;YACD,OAAO,GAAG,CAAC,IAAI,CAAC;QAClB,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,KAAK,WAAW,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC1C,IAAI,YAAY,GAAG,IAAI,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;IACrG,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neurcode-ai/cli",
3
- "version": "0.8.4",
3
+ "version": "0.8.6",
4
4
  "description": "Neurcode CLI - AI code governance and diff analysis",
5
5
  "bin": {
6
6
  "neurcode": "./dist/index.js"
@@ -46,7 +46,8 @@
46
46
  "glob": "^10.3.10",
47
47
  "lowdb": "^1.0.0",
48
48
  "ts-morph": "^24.0.0",
49
- "uuid": "^9.0.1"
49
+ "uuid": "^9.0.1",
50
+ "zod": "^4.3.5"
50
51
  },
51
52
  "publishConfig": {
52
53
  "access": "public"