@neurcode-ai/cli 0.9.50 → 0.9.59

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 (61) hide show
  1. package/dist/commands/fix.d.ts.map +1 -1
  2. package/dist/commands/fix.js +307 -31
  3. package/dist/commands/fix.js.map +1 -1
  4. package/dist/commands/verify.d.ts.map +1 -1
  5. package/dist/commands/verify.js +264 -13
  6. package/dist/commands/verify.js.map +1 -1
  7. package/dist/daemon/server.d.ts +23 -0
  8. package/dist/daemon/server.d.ts.map +1 -0
  9. package/dist/daemon/server.js +222 -0
  10. package/dist/daemon/server.js.map +1 -0
  11. package/dist/index.js +8 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/intent-engine/coverage.d.ts +69 -0
  14. package/dist/intent-engine/coverage.d.ts.map +1 -0
  15. package/dist/intent-engine/coverage.js +140 -0
  16. package/dist/intent-engine/coverage.js.map +1 -0
  17. package/dist/intent-engine/flow-rules.d.ts +21 -0
  18. package/dist/intent-engine/flow-rules.d.ts.map +1 -0
  19. package/dist/intent-engine/flow-rules.js +83 -0
  20. package/dist/intent-engine/flow-rules.js.map +1 -0
  21. package/dist/intent-engine/flow-validator.d.ts +29 -0
  22. package/dist/intent-engine/flow-validator.d.ts.map +1 -0
  23. package/dist/intent-engine/flow-validator.js +202 -0
  24. package/dist/intent-engine/flow-validator.js.map +1 -0
  25. package/dist/intent-engine/graph.d.ts +33 -0
  26. package/dist/intent-engine/graph.d.ts.map +1 -0
  27. package/dist/intent-engine/graph.js +67 -0
  28. package/dist/intent-engine/graph.js.map +1 -0
  29. package/dist/intent-engine/index.d.ts +35 -0
  30. package/dist/intent-engine/index.d.ts.map +1 -0
  31. package/dist/intent-engine/index.js +94 -0
  32. package/dist/intent-engine/index.js.map +1 -0
  33. package/dist/intent-engine/indexer.d.ts +18 -0
  34. package/dist/intent-engine/indexer.d.ts.map +1 -0
  35. package/dist/intent-engine/indexer.js +100 -0
  36. package/dist/intent-engine/indexer.js.map +1 -0
  37. package/dist/intent-engine/matcher.d.ts +35 -0
  38. package/dist/intent-engine/matcher.d.ts.map +1 -0
  39. package/dist/intent-engine/matcher.js +522 -0
  40. package/dist/intent-engine/matcher.js.map +1 -0
  41. package/dist/intent-engine/parser.d.ts +12 -0
  42. package/dist/intent-engine/parser.d.ts.map +1 -0
  43. package/dist/intent-engine/parser.js +93 -0
  44. package/dist/intent-engine/parser.js.map +1 -0
  45. package/dist/intent-engine/regression.d.ts +32 -0
  46. package/dist/intent-engine/regression.d.ts.map +1 -0
  47. package/dist/intent-engine/regression.js +166 -0
  48. package/dist/intent-engine/regression.js.map +1 -0
  49. package/dist/intent-engine/requirements.d.ts +22 -0
  50. package/dist/intent-engine/requirements.d.ts.map +1 -0
  51. package/dist/intent-engine/requirements.js +147 -0
  52. package/dist/intent-engine/requirements.js.map +1 -0
  53. package/dist/intent-engine/state.d.ts +44 -0
  54. package/dist/intent-engine/state.d.ts.map +1 -0
  55. package/dist/intent-engine/state.js +83 -0
  56. package/dist/intent-engine/state.js.map +1 -0
  57. package/dist/utils/ai-debt-budget.d.ts +3 -2
  58. package/dist/utils/ai-debt-budget.d.ts.map +1 -1
  59. package/dist/utils/ai-debt-budget.js +83 -2
  60. package/dist/utils/ai-debt-budget.js.map +1 -1
  61. package/package.json +1 -1
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Code Indexer — builds a lightweight FileMeta index from diff hunks.
3
+ * Operates entirely on the parsed diff (no disk I/O beyond what the diff
4
+ * parser has already done), so it adds negligible time to verify.
5
+ */
6
+ import type { DiffFile } from '@neurcode-ai/diff-parser';
7
+ export type FileLayer = 'ui' | 'api' | 'service' | 'core' | 'config' | 'test' | 'unknown';
8
+ export interface FileMeta {
9
+ path: string;
10
+ layer: FileLayer;
11
+ imports: string[];
12
+ keywords: string[];
13
+ addedLines: number;
14
+ removedLines: number;
15
+ addedContent: string;
16
+ }
17
+ export declare function indexDiffFiles(diffFiles: DiffFile[]): Map<string, FileMeta>;
18
+ //# sourceMappingURL=indexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../src/intent-engine/indexer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAUzD,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AA+D1F,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IAErB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,wBAAgB,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CA0B3E"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /**
3
+ * Code Indexer — builds a lightweight FileMeta index from diff hunks.
4
+ * Operates entirely on the parsed diff (no disk I/O beyond what the diff
5
+ * parser has already done), so it adds negligible time to verify.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.indexDiffFiles = indexDiffFiles;
9
+ // ── Layer detection ───────────────────────────────────────────────────────────
10
+ const UI_PATH = /(\/|^)(components?|pages?|views?|screens?|containers?|ui)[/\\]|\.tsx$/i;
11
+ const API_PATH = /(\/|^)(routes?|controllers?|handlers?|api|endpoints?)[/\\]/i;
12
+ const SERVICE_PATH = /(\/|^)(services?|repositories?|domain|usecases?)[/\\]/i;
13
+ const TEST_PATH = /\.(test|spec)\.[jt]sx?$|(\/|^)(__tests?__|tests?)[/\\]/i;
14
+ const CONFIG_PATH = /(\/|^)(config|configs?|settings?)[/\\]|\.config\.[jt]sx?$/i;
15
+ function inferLayer(filePath) {
16
+ if (TEST_PATH.test(filePath))
17
+ return 'test';
18
+ if (UI_PATH.test(filePath))
19
+ return 'ui';
20
+ if (API_PATH.test(filePath))
21
+ return 'api';
22
+ if (SERVICE_PATH.test(filePath))
23
+ return 'service';
24
+ if (CONFIG_PATH.test(filePath))
25
+ return 'config';
26
+ return 'unknown';
27
+ }
28
+ // ── Keyword extraction ────────────────────────────────────────────────────────
29
+ const IMPORT_RE = /import\s+.*from\s+['"]([^'"]+)['"]/g;
30
+ const REQUIRE_RE = /require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
31
+ function extractImports(code) {
32
+ const imports = [];
33
+ let m;
34
+ IMPORT_RE.lastIndex = 0;
35
+ while ((m = IMPORT_RE.exec(code)) !== null)
36
+ imports.push(m[1]);
37
+ REQUIRE_RE.lastIndex = 0;
38
+ while ((m = REQUIRE_RE.exec(code)) !== null)
39
+ imports.push(m[1]);
40
+ return imports;
41
+ }
42
+ const KEYWORD_TOKENS = new Set([
43
+ // auth
44
+ 'jwt', 'token', 'session', 'login', 'logout', 'auth', 'password', 'hash',
45
+ 'bcrypt', 'role', 'permission', 'bearer', 'oauth', 'middleware',
46
+ // validation
47
+ 'validate', 'validation', 'schema', 'zod', 'joi', 'yup', 'sanitize',
48
+ 'sanitization', 'parse',
49
+ // db
50
+ 'prisma', 'db', 'database', 'query', 'findMany', 'findOne', 'create',
51
+ 'update', 'delete', 'transaction', 'pool', 'knex', 'sequelize',
52
+ // api
53
+ 'req', 'res', 'request', 'response', 'router', 'route', 'endpoint',
54
+ 'controller', 'handler', 'express', 'fastify', 'hono', 'next',
55
+ // payment
56
+ 'stripe', 'payment', 'checkout', 'invoice', 'billing', 'webhook',
57
+ // security
58
+ 'encrypt', 'decrypt', 'crypto', 'hmac', 'tls', 'ssl',
59
+ // test
60
+ 'describe', 'it', 'test', 'expect', 'mock', 'beforeEach', 'afterEach',
61
+ ]);
62
+ function extractKeywords(code) {
63
+ const tokens = code.split(/\W+/).filter(Boolean);
64
+ const found = [];
65
+ const seen = new Set();
66
+ for (const tok of tokens) {
67
+ const lower = tok.toLowerCase();
68
+ if (KEYWORD_TOKENS.has(lower) && !seen.has(lower)) {
69
+ found.push(lower);
70
+ seen.add(lower);
71
+ }
72
+ }
73
+ return found;
74
+ }
75
+ // ── Public API ────────────────────────────────────────────────────────────────
76
+ function indexDiffFiles(diffFiles) {
77
+ const index = new Map();
78
+ for (const file of diffFiles) {
79
+ const addedLines = [];
80
+ for (const hunk of file.hunks ?? []) {
81
+ for (const line of hunk.lines ?? []) {
82
+ if (line.type === 'added')
83
+ addedLines.push(line.content);
84
+ }
85
+ }
86
+ const addedContent = addedLines.join('\n');
87
+ const meta = {
88
+ path: file.path,
89
+ layer: inferLayer(file.path),
90
+ imports: extractImports(addedContent),
91
+ keywords: extractKeywords(addedContent),
92
+ addedLines: file.addedLines,
93
+ removedLines: file.removedLines,
94
+ addedContent,
95
+ };
96
+ index.set(file.path, meta);
97
+ }
98
+ return index;
99
+ }
100
+ //# sourceMappingURL=indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/intent-engine/indexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Intent–Code Matcher — compares a ParsedIntent against a FileMeta index and
3
+ * returns:
4
+ *
5
+ * IntentIssue[] — missing / misplaced / partial issues
6
+ * componentMap — component → files where it was detected
7
+ * componentQuality — component → 'strong' | 'weak' quality signal
8
+ *
9
+ * No LLM calls. All checks are deterministic keyword/pattern matching.
10
+ */
11
+ import type { ParsedIntent } from './parser';
12
+ import type { FileMeta } from './indexer';
13
+ export interface IntentIssue {
14
+ type: 'missing' | 'misplaced' | 'partial';
15
+ message: string;
16
+ files?: string[];
17
+ severity: 'high' | 'medium';
18
+ rule: string;
19
+ }
20
+ export type ComponentQualityLevel = 'strong' | 'weak';
21
+ export interface MatchResult {
22
+ intentIssues: IntentIssue[];
23
+ checkedDomains: string[];
24
+ /** component key → files where it was detected in added diff content */
25
+ componentMap: Record<string, string[]>;
26
+ /** component key → quality of the detected implementation */
27
+ componentQuality: Record<string, ComponentQualityLevel>;
28
+ /**
29
+ * @deprecated Use componentMap instead. Kept for backward compatibility with
30
+ * coverage.ts which previously received Record<string, string[]> per domain.
31
+ */
32
+ foundComponents: Record<string, string[]>;
33
+ }
34
+ export declare function matchIntentToCode(intent: ParsedIntent, index: Map<string, FileMeta>): MatchResult;
35
+ //# sourceMappingURL=matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/intent-engine/matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAI1C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,6DAA6D;IAC7D,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IACxD;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC3C;AA2cD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC3B,WAAW,CA0Hb"}