@neurcode-ai/cli 0.9.48 → 0.9.50
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/commands/fix.d.ts +13 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +785 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/generate.d.ts +7 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +132 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/patch-apply.d.ts +7 -0
- package/dist/commands/patch-apply.d.ts.map +1 -0
- package/dist/commands/patch-apply.js +85 -0
- package/dist/commands/patch-apply.js.map +1 -0
- package/dist/commands/plan-show.d.ts +6 -0
- package/dist/commands/plan-show.d.ts.map +1 -0
- package/dist/commands/plan-show.js +33 -0
- package/dist/commands/plan-show.js.map +1 -0
- package/dist/commands/start-intent.d.ts +6 -0
- package/dist/commands/start-intent.d.ts.map +1 -0
- package/dist/commands/start-intent.js +80 -0
- package/dist/commands/start-intent.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +703 -186
- package/dist/commands/verify.js.map +1 -1
- package/dist/context-engine/graph.d.ts +6 -0
- package/dist/context-engine/graph.d.ts.map +1 -0
- package/dist/context-engine/graph.js +55 -0
- package/dist/context-engine/graph.js.map +1 -0
- package/dist/context-engine/index.d.ts +14 -0
- package/dist/context-engine/index.d.ts.map +1 -0
- package/dist/context-engine/index.js +26 -0
- package/dist/context-engine/index.js.map +1 -0
- package/dist/context-engine/scanner.d.ts +6 -0
- package/dist/context-engine/scanner.d.ts.map +1 -0
- package/dist/context-engine/scanner.js +62 -0
- package/dist/context-engine/scanner.js.map +1 -0
- package/dist/context-engine/scorer.d.ts +9 -0
- package/dist/context-engine/scorer.d.ts.map +1 -0
- package/dist/context-engine/scorer.js +112 -0
- package/dist/context-engine/scorer.js.map +1 -0
- package/dist/context-engine/suggestions.d.ts +12 -0
- package/dist/context-engine/suggestions.d.ts.map +1 -0
- package/dist/context-engine/suggestions.js +22 -0
- package/dist/context-engine/suggestions.js.map +1 -0
- package/dist/index.js +129 -55
- package/dist/index.js.map +1 -1
- package/dist/mcp/context-injector.d.ts +45 -0
- package/dist/mcp/context-injector.d.ts.map +1 -0
- package/dist/mcp/context-injector.js +587 -0
- package/dist/mcp/context-injector.js.map +1 -0
- package/dist/mcp/proximity.d.ts +3 -0
- package/dist/mcp/proximity.d.ts.map +1 -0
- package/dist/mcp/proximity.js +135 -0
- package/dist/mcp/proximity.js.map +1 -0
- package/dist/patch-engine/diff.d.ts +12 -0
- package/dist/patch-engine/diff.d.ts.map +1 -0
- package/dist/patch-engine/diff.js +74 -0
- package/dist/patch-engine/diff.js.map +1 -0
- package/dist/patch-engine/generator.d.ts +13 -0
- package/dist/patch-engine/generator.d.ts.map +1 -0
- package/dist/patch-engine/generator.js +51 -0
- package/dist/patch-engine/generator.js.map +1 -0
- package/dist/patch-engine/index.d.ts +47 -0
- package/dist/patch-engine/index.d.ts.map +1 -0
- package/dist/patch-engine/index.js +182 -0
- package/dist/patch-engine/index.js.map +1 -0
- package/dist/patch-engine/patterns.d.ts +4 -0
- package/dist/patch-engine/patterns.d.ts.map +1 -0
- package/dist/patch-engine/patterns.js +99 -0
- package/dist/patch-engine/patterns.js.map +1 -0
- package/dist/utils/git.d.ts +8 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +55 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/plan-sync.d.ts +34 -0
- package/dist/utils/plan-sync.d.ts.map +1 -0
- package/dist/utils/plan-sync.js +265 -0
- package/dist/utils/plan-sync.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Detection rules for deterministic patch generation.
|
|
3
|
+
// Each function returns the 0-based line index of the first match, or null.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.classifyViolation = classifyViolation;
|
|
6
|
+
exports.detectPattern = detectPattern;
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Classifiy a fix suggestion into a patchable pattern kind
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
function classifyViolation(issue, policy) {
|
|
11
|
+
const combined = `${issue} ${policy}`.toLowerCase();
|
|
12
|
+
if (combined.includes('todo') || combined.includes('fixme'))
|
|
13
|
+
return 'todo_fixme';
|
|
14
|
+
if (combined.includes('db') || combined.includes('database') ||
|
|
15
|
+
combined.includes('query') || combined.includes('data access') ||
|
|
16
|
+
combined.includes('direct access') ||
|
|
17
|
+
policy.includes('layer') || policy.includes('layering') || policy.includes('db')) {
|
|
18
|
+
return 'db_in_ui';
|
|
19
|
+
}
|
|
20
|
+
if (combined.includes('validation') || combined.includes('validate') ||
|
|
21
|
+
combined.includes('input') || policy.includes('validation')) {
|
|
22
|
+
return 'missing_validation';
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Pattern detectors (work on pre-split line arrays)
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
const DB_ACCESS_PATTERNS = [
|
|
30
|
+
/\bdb\s*\.\s*query\s*\(/,
|
|
31
|
+
/\bdb\s*\.\s*execute\s*\(/,
|
|
32
|
+
/\bdb\s*\.\s*run\s*\(/,
|
|
33
|
+
/\bdb\s*\.\s*find\b/,
|
|
34
|
+
/\bdb\s*\.\s*findOne\s*\(/,
|
|
35
|
+
/\bprisma\s*\.\s*\w+\s*\.\s*find/,
|
|
36
|
+
/\bprisma\s*\.\s*\w+\s*\.\s*create\s*\(/,
|
|
37
|
+
/\bprisma\s*\.\s*\w+\s*\.\s*update\s*\(/,
|
|
38
|
+
/\bprisma\s*\.\s*\w+\s*\.\s*delete\s*\(/,
|
|
39
|
+
/\bnew\s+Pool\s*\(/,
|
|
40
|
+
/\bknex\s*\(/,
|
|
41
|
+
];
|
|
42
|
+
const VALIDATION_PATTERNS = [
|
|
43
|
+
/\.validate\s*\(/,
|
|
44
|
+
/schema\.parse\s*\(/,
|
|
45
|
+
/\bJoi\s*\./,
|
|
46
|
+
/\byup\s*\./,
|
|
47
|
+
/\bzod\s*\./,
|
|
48
|
+
/\bajv\s*\.\s*compile/,
|
|
49
|
+
];
|
|
50
|
+
// Matches the request/response parameter pair in a handler signature
|
|
51
|
+
const REQ_HANDLER_RE = /\b(?:req|request)\s*,\s*(?:res|response|reply)\b/;
|
|
52
|
+
// Matches direct access to incoming data without a prior validation call
|
|
53
|
+
const REQ_INPUT_RE = /\b(?:req|request)\.(?:body|params|query)\b/;
|
|
54
|
+
const TODO_FIXME_RE = /\/\/\s*(?:TODO|FIXME)\b/;
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
function findDbAccessLine(lines) {
|
|
57
|
+
for (let i = 0; i < lines.length; i++) {
|
|
58
|
+
const trimmed = lines[i].trimStart();
|
|
59
|
+
// Skip lines that are themselves comments
|
|
60
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('*'))
|
|
61
|
+
continue;
|
|
62
|
+
if (DB_ACCESS_PATTERNS.some((re) => re.test(lines[i])))
|
|
63
|
+
return i;
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
function findMissingValidationLine(lines) {
|
|
68
|
+
let handlerStartIndex = -1;
|
|
69
|
+
for (let i = 0; i < lines.length; i++) {
|
|
70
|
+
if (REQ_HANDLER_RE.test(lines[i])) {
|
|
71
|
+
handlerStartIndex = i;
|
|
72
|
+
}
|
|
73
|
+
if (handlerStartIndex !== -1 && REQ_INPUT_RE.test(lines[i])) {
|
|
74
|
+
// Look backward from this line (within the handler) for a validation call
|
|
75
|
+
const searchFrom = Math.max(handlerStartIndex, i - 30);
|
|
76
|
+
const priorLines = lines.slice(searchFrom, i);
|
|
77
|
+
const hasValidation = priorLines.some((l) => VALIDATION_PATTERNS.some((re) => re.test(l)));
|
|
78
|
+
if (!hasValidation)
|
|
79
|
+
return i;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
function findTodoLine(lines) {
|
|
85
|
+
for (let i = 0; i < lines.length; i++) {
|
|
86
|
+
if (TODO_FIXME_RE.test(lines[i]))
|
|
87
|
+
return i;
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
function detectPattern(content, kind) {
|
|
92
|
+
const lines = content.split('\n');
|
|
93
|
+
switch (kind) {
|
|
94
|
+
case 'db_in_ui': return findDbAccessLine(lines);
|
|
95
|
+
case 'missing_validation': return findMissingValidationLine(lines);
|
|
96
|
+
case 'todo_fixme': return findTodoLine(lines);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/patch-engine/patterns.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/git.d.ts
CHANGED
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
*/
|
|
8
8
|
/** Git's canonical empty tree hash - safe to use when repo has only one commit */
|
|
9
9
|
export declare const GIT_EMPTY_TREE = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
|
|
10
|
+
export interface DefaultDiffContext {
|
|
11
|
+
mode: 'base' | 'staged';
|
|
12
|
+
baseRef: string | null;
|
|
13
|
+
currentBranch: string | null;
|
|
14
|
+
}
|
|
10
15
|
/**
|
|
11
16
|
* Execute a git command with large buffer
|
|
12
17
|
*/
|
|
@@ -15,6 +20,9 @@ export declare function execGitCommand(command: string, options?: {
|
|
|
15
20
|
stdio?: any;
|
|
16
21
|
cwd?: string;
|
|
17
22
|
}): string;
|
|
23
|
+
export declare function detectCurrentGitBranch(cwd?: string): string | null;
|
|
24
|
+
export declare function detectDefaultBaseRef(cwd?: string): string | null;
|
|
25
|
+
export declare function resolveDefaultDiffContext(cwd?: string): DefaultDiffContext;
|
|
18
26
|
/**
|
|
19
27
|
* Get diff from a base ref to current work tree.
|
|
20
28
|
* If base is invalid (e.g. HEAD~1 on initial commit), falls back to diff from empty tree to HEAD
|
package/dist/utils/git.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,kFAAkF;AAClF,eAAO,MAAM,cAAc,6CAA6C,CAAC;AAOzE;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,GAAG,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAO9H;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOpD"}
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,kFAAkF;AAClF,eAAO,MAAM,cAAc,6CAA6C,CAAC;AAOzE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,GAAG,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAO9H;AAmBD,wBAAgB,sBAAsB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIlE;AAED,wBAAgB,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUhE;AAED,wBAAgB,yBAAyB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAkB1E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOpD"}
|
package/dist/utils/git.js
CHANGED
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.GIT_EMPTY_TREE = void 0;
|
|
11
11
|
exports.execGitCommand = execGitCommand;
|
|
12
|
+
exports.detectCurrentGitBranch = detectCurrentGitBranch;
|
|
13
|
+
exports.detectDefaultBaseRef = detectDefaultBaseRef;
|
|
14
|
+
exports.resolveDefaultDiffContext = resolveDefaultDiffContext;
|
|
12
15
|
exports.getDiffFromBase = getDiffFromBase;
|
|
13
16
|
const child_process_1 = require("child_process");
|
|
14
17
|
/** Git's canonical empty tree hash - safe to use when repo has only one commit */
|
|
@@ -27,6 +30,58 @@ function execGitCommand(command, options = {}) {
|
|
|
27
30
|
};
|
|
28
31
|
return (0, child_process_1.execSync)(command, execOptions);
|
|
29
32
|
}
|
|
33
|
+
function tryExecGit(command, cwd) {
|
|
34
|
+
try {
|
|
35
|
+
return (0, child_process_1.execSync)(command, {
|
|
36
|
+
...EXEC_OPTS,
|
|
37
|
+
cwd,
|
|
38
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
39
|
+
}).trim();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function gitRefExists(ref, cwd) {
|
|
46
|
+
const value = tryExecGit(`git rev-parse --verify --quiet ${ref}`, cwd);
|
|
47
|
+
return Boolean(value);
|
|
48
|
+
}
|
|
49
|
+
function detectCurrentGitBranch(cwd) {
|
|
50
|
+
const value = tryExecGit('git rev-parse --abbrev-ref HEAD', cwd);
|
|
51
|
+
if (!value || value === 'HEAD')
|
|
52
|
+
return null;
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
function detectDefaultBaseRef(cwd) {
|
|
56
|
+
// Prefer explicit origin branches for normal PR workflows.
|
|
57
|
+
if (gitRefExists('refs/remotes/origin/main', cwd))
|
|
58
|
+
return 'origin/main';
|
|
59
|
+
if (gitRefExists('refs/remotes/origin/master', cwd))
|
|
60
|
+
return 'origin/master';
|
|
61
|
+
// Fallback to local branch names if remote refs are unavailable.
|
|
62
|
+
if (gitRefExists('refs/heads/main', cwd))
|
|
63
|
+
return 'main';
|
|
64
|
+
if (gitRefExists('refs/heads/master', cwd))
|
|
65
|
+
return 'master';
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
function resolveDefaultDiffContext(cwd) {
|
|
69
|
+
const currentBranch = detectCurrentGitBranch(cwd);
|
|
70
|
+
const baseRef = detectDefaultBaseRef(cwd);
|
|
71
|
+
if (baseRef) {
|
|
72
|
+
return {
|
|
73
|
+
mode: 'base',
|
|
74
|
+
baseRef,
|
|
75
|
+
currentBranch,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// When branch/base cannot be resolved, fall back to staged diff.
|
|
79
|
+
return {
|
|
80
|
+
mode: 'staged',
|
|
81
|
+
baseRef: null,
|
|
82
|
+
currentBranch,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
30
85
|
/**
|
|
31
86
|
* Get diff from a base ref to current work tree.
|
|
32
87
|
* If base is invalid (e.g. HEAD~1 on initial commit), falls back to diff from empty tree to HEAD
|
package/dist/utils/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAqBH,wCAOC;AAmBD,wDAIC;AAED,oDAUC;AAED,8DAkBC;AAOD,0CAOC;AA/FD,iDAA4E;AAE5E,kFAAkF;AACrE,QAAA,cAAc,GAAG,0CAA0C,CAAC;AAEzE,MAAM,SAAS,GAAsC;IACnD,QAAQ,EAAE,OAAO;IACjB,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,aAAa;CAC7C,CAAC;AAQF;;GAEG;AACH,SAAgB,cAAc,CAAC,OAAe,EAAE,UAAoE,EAAE;IACpH,MAAM,WAAW,GAAsC;QACrD,GAAG,SAAS;QACZ,GAAG,OAAO;KACX,CAAC;IAEF,OAAO,IAAA,wBAAQ,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,GAAY;IAC/C,IAAI,CAAC;QACH,OAAO,IAAA,wBAAQ,EAAC,OAAO,EAAE;YACvB,GAAG,SAAS;YACZ,GAAG;YACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,GAAY;IAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,kCAAkC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,SAAgB,sBAAsB,CAAC,GAAY;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;IACjE,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,oBAAoB,CAAC,GAAY;IAC/C,2DAA2D;IAC3D,IAAI,YAAY,CAAC,0BAA0B,EAAE,GAAG,CAAC;QAAE,OAAO,aAAa,CAAC;IACxE,IAAI,YAAY,CAAC,4BAA4B,EAAE,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC;IAE5E,iEAAiE;IACjE,IAAI,YAAY,CAAC,iBAAiB,EAAE,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACxD,IAAI,YAAY,CAAC,mBAAmB,EAAE,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE5D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,yBAAyB,CAAC,GAAY;IACpD,MAAM,aAAa,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAE1C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,OAAO;YACP,aAAa;SACd,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,IAAI;QACb,aAAa;KACd,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC;QACH,OAAO,IAAA,wBAAQ,EAAC,YAAY,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACvE,OAAO,IAAA,wBAAQ,EAAC,YAAY,sBAAc,OAAO,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface LocalPlanData {
|
|
2
|
+
intent: string;
|
|
3
|
+
expectedFiles: string[];
|
|
4
|
+
constraints: string[];
|
|
5
|
+
createdAt: string;
|
|
6
|
+
lastUpdated: string;
|
|
7
|
+
}
|
|
8
|
+
export interface LocalPlanSnapshot extends LocalPlanData {
|
|
9
|
+
path: string;
|
|
10
|
+
existed: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function resolveLocalPlanPath(projectRoot: string): string;
|
|
13
|
+
export declare function ensureLocalPlan(projectRoot: string): LocalPlanSnapshot;
|
|
14
|
+
export interface PlanSyncUpdateResult {
|
|
15
|
+
path: string;
|
|
16
|
+
addedFiles: string[];
|
|
17
|
+
expectedFiles: string[];
|
|
18
|
+
intent: string;
|
|
19
|
+
constraints: string[];
|
|
20
|
+
createdAt: string;
|
|
21
|
+
lastUpdated: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function addExpectedFilesToLocalPlan(projectRoot: string, files: string[]): PlanSyncUpdateResult;
|
|
24
|
+
export interface IntentPlanInitializationResult {
|
|
25
|
+
path: string;
|
|
26
|
+
intent: string;
|
|
27
|
+
detectedSignals: Array<'auth' | 'api' | 'ui'>;
|
|
28
|
+
expectedFiles: string[];
|
|
29
|
+
constraints: string[];
|
|
30
|
+
createdAt: string;
|
|
31
|
+
lastUpdated: string;
|
|
32
|
+
}
|
|
33
|
+
export declare function initializeLocalPlanFromIntent(projectRoot: string, intentInput: string): IntentPlanInitializationResult;
|
|
34
|
+
//# sourceMappingURL=plan-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-sync.d.ts","sourceRoot":"","sources":["../../src/utils/plan-sync.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAoFD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhE;AAMD,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,CAkDtE;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EAAE,GACd,oBAAoB,CAqCtB;AAyFD,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,8BAA8B,CAuBhC"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveLocalPlanPath = resolveLocalPlanPath;
|
|
4
|
+
exports.ensureLocalPlan = ensureLocalPlan;
|
|
5
|
+
exports.addExpectedFilesToLocalPlan = addExpectedFilesToLocalPlan;
|
|
6
|
+
exports.initializeLocalPlanFromIntent = initializeLocalPlanFromIntent;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const PLAN_DIRNAME = '.neurcode';
|
|
10
|
+
const PLAN_FILENAME = 'plan.json';
|
|
11
|
+
function nowIso() {
|
|
12
|
+
return new Date().toISOString();
|
|
13
|
+
}
|
|
14
|
+
function normalizeText(value) {
|
|
15
|
+
return value.replace(/\s+/g, ' ').trim();
|
|
16
|
+
}
|
|
17
|
+
function normalizeRepoPath(value) {
|
|
18
|
+
return value.replace(/\\/g, '/').replace(/^\.\//, '').trim();
|
|
19
|
+
}
|
|
20
|
+
function dedupeValues(values) {
|
|
21
|
+
const seen = new Set();
|
|
22
|
+
const out = [];
|
|
23
|
+
for (const value of values) {
|
|
24
|
+
const normalized = normalizeText(value);
|
|
25
|
+
if (!normalized)
|
|
26
|
+
continue;
|
|
27
|
+
const key = normalized.toLowerCase();
|
|
28
|
+
if (seen.has(key))
|
|
29
|
+
continue;
|
|
30
|
+
seen.add(key);
|
|
31
|
+
out.push(normalized);
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
function dedupePaths(paths) {
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
const out = [];
|
|
38
|
+
for (const path of paths) {
|
|
39
|
+
const normalized = normalizeRepoPath(path);
|
|
40
|
+
if (!normalized)
|
|
41
|
+
continue;
|
|
42
|
+
const key = normalized.toLowerCase();
|
|
43
|
+
if (seen.has(key))
|
|
44
|
+
continue;
|
|
45
|
+
seen.add(key);
|
|
46
|
+
out.push(normalized);
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
function coerceLocalPlan(value) {
|
|
51
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
52
|
+
const now = nowIso();
|
|
53
|
+
return {
|
|
54
|
+
intent: '',
|
|
55
|
+
expectedFiles: [],
|
|
56
|
+
constraints: [],
|
|
57
|
+
createdAt: now,
|
|
58
|
+
lastUpdated: now,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const record = value;
|
|
62
|
+
const intent = typeof record.intent === 'string' ? normalizeText(record.intent) : '';
|
|
63
|
+
const expectedFilesRaw = Array.isArray(record.expectedFiles) ? record.expectedFiles : [];
|
|
64
|
+
const expectedFiles = dedupePaths(expectedFilesRaw.filter((item) => typeof item === 'string'));
|
|
65
|
+
const constraintsRaw = Array.isArray(record.constraints) ? record.constraints : [];
|
|
66
|
+
const constraints = dedupeValues(constraintsRaw.filter((item) => typeof item === 'string'));
|
|
67
|
+
const createdAt = typeof record.createdAt === 'string' && record.createdAt.trim().length > 0
|
|
68
|
+
? record.createdAt
|
|
69
|
+
: typeof record.lastUpdated === 'string' && record.lastUpdated.trim().length > 0
|
|
70
|
+
? record.lastUpdated
|
|
71
|
+
: nowIso();
|
|
72
|
+
const lastUpdated = typeof record.lastUpdated === 'string' && record.lastUpdated.trim().length > 0
|
|
73
|
+
? record.lastUpdated
|
|
74
|
+
: createdAt;
|
|
75
|
+
return {
|
|
76
|
+
intent,
|
|
77
|
+
expectedFiles,
|
|
78
|
+
constraints,
|
|
79
|
+
createdAt,
|
|
80
|
+
lastUpdated,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function resolveLocalPlanPath(projectRoot) {
|
|
84
|
+
return (0, path_1.join)(projectRoot, PLAN_DIRNAME, PLAN_FILENAME);
|
|
85
|
+
}
|
|
86
|
+
function writeLocalPlan(path, data) {
|
|
87
|
+
(0, fs_1.writeFileSync)(path, `${JSON.stringify(data, null, 2)}\n`, 'utf-8');
|
|
88
|
+
}
|
|
89
|
+
function ensureLocalPlan(projectRoot) {
|
|
90
|
+
const planDir = (0, path_1.join)(projectRoot, PLAN_DIRNAME);
|
|
91
|
+
const planPath = resolveLocalPlanPath(projectRoot);
|
|
92
|
+
(0, fs_1.mkdirSync)(planDir, { recursive: true });
|
|
93
|
+
if (!(0, fs_1.existsSync)(planPath)) {
|
|
94
|
+
const now = nowIso();
|
|
95
|
+
const freshPlan = {
|
|
96
|
+
intent: '',
|
|
97
|
+
expectedFiles: [],
|
|
98
|
+
constraints: [],
|
|
99
|
+
createdAt: now,
|
|
100
|
+
lastUpdated: now,
|
|
101
|
+
};
|
|
102
|
+
writeLocalPlan(planPath, freshPlan);
|
|
103
|
+
return {
|
|
104
|
+
...freshPlan,
|
|
105
|
+
path: planPath,
|
|
106
|
+
existed: false,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
const raw = (0, fs_1.readFileSync)(planPath, 'utf-8');
|
|
111
|
+
const parsed = JSON.parse(raw);
|
|
112
|
+
const coerced = coerceLocalPlan(parsed);
|
|
113
|
+
if (JSON.stringify(coerced) !== JSON.stringify(parsed)) {
|
|
114
|
+
writeLocalPlan(planPath, coerced);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
...coerced,
|
|
118
|
+
path: planPath,
|
|
119
|
+
existed: true,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
const now = nowIso();
|
|
124
|
+
const repaired = {
|
|
125
|
+
intent: '',
|
|
126
|
+
expectedFiles: [],
|
|
127
|
+
constraints: [],
|
|
128
|
+
createdAt: now,
|
|
129
|
+
lastUpdated: now,
|
|
130
|
+
};
|
|
131
|
+
writeLocalPlan(planPath, repaired);
|
|
132
|
+
return {
|
|
133
|
+
...repaired,
|
|
134
|
+
path: planPath,
|
|
135
|
+
existed: true,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function addExpectedFilesToLocalPlan(projectRoot, files) {
|
|
140
|
+
const plan = ensureLocalPlan(projectRoot);
|
|
141
|
+
const incoming = dedupePaths(files);
|
|
142
|
+
const existingSet = new Set(plan.expectedFiles.map((item) => item.toLowerCase()));
|
|
143
|
+
const addedFiles = [];
|
|
144
|
+
for (const file of incoming) {
|
|
145
|
+
const key = file.toLowerCase();
|
|
146
|
+
if (existingSet.has(key))
|
|
147
|
+
continue;
|
|
148
|
+
existingSet.add(key);
|
|
149
|
+
addedFiles.push(file);
|
|
150
|
+
}
|
|
151
|
+
const shouldUpdateTimestamp = incoming.length > 0;
|
|
152
|
+
const nextExpectedFiles = shouldUpdateTimestamp
|
|
153
|
+
? dedupePaths([...plan.expectedFiles, ...addedFiles])
|
|
154
|
+
: plan.expectedFiles;
|
|
155
|
+
const nextLastUpdated = shouldUpdateTimestamp ? nowIso() : plan.lastUpdated;
|
|
156
|
+
const nextPlan = {
|
|
157
|
+
intent: plan.intent,
|
|
158
|
+
expectedFiles: nextExpectedFiles,
|
|
159
|
+
constraints: plan.constraints,
|
|
160
|
+
createdAt: plan.createdAt,
|
|
161
|
+
lastUpdated: nextLastUpdated,
|
|
162
|
+
};
|
|
163
|
+
writeLocalPlan(plan.path, nextPlan);
|
|
164
|
+
return {
|
|
165
|
+
path: plan.path,
|
|
166
|
+
addedFiles,
|
|
167
|
+
expectedFiles: nextPlan.expectedFiles,
|
|
168
|
+
intent: nextPlan.intent,
|
|
169
|
+
constraints: nextPlan.constraints,
|
|
170
|
+
createdAt: nextPlan.createdAt,
|
|
171
|
+
lastUpdated: nextPlan.lastUpdated,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
const INTENT_HEURISTIC_RULES = [
|
|
175
|
+
{
|
|
176
|
+
id: 'auth',
|
|
177
|
+
pattern: /\b(auth|authentication|authorization|jwt|token|login|rbac|role)\b/i,
|
|
178
|
+
files: [
|
|
179
|
+
'src/core/auth.ts',
|
|
180
|
+
'src/core/auth-service.ts',
|
|
181
|
+
'src/core/middleware/auth.ts',
|
|
182
|
+
'src/api/auth.ts',
|
|
183
|
+
],
|
|
184
|
+
constraints: [
|
|
185
|
+
'Preserve authentication and authorization checks.',
|
|
186
|
+
'Validate auth inputs before request handling.',
|
|
187
|
+
],
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
id: 'api',
|
|
191
|
+
pattern: /\b(api|endpoint|route|controller|backend|server)\b/i,
|
|
192
|
+
files: [
|
|
193
|
+
'src/core/api.ts',
|
|
194
|
+
'src/core/routes.ts',
|
|
195
|
+
'src/core/handlers.ts',
|
|
196
|
+
'src/api/index.ts',
|
|
197
|
+
],
|
|
198
|
+
constraints: [
|
|
199
|
+
'Validate inputs at API boundaries.',
|
|
200
|
+
'Keep endpoint changes localized to API/core layers.',
|
|
201
|
+
],
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
id: 'ui',
|
|
205
|
+
pattern: /\b(ui|frontend|component|react|page|screen)\b/i,
|
|
206
|
+
files: [
|
|
207
|
+
'src/ui/app.tsx',
|
|
208
|
+
'src/ui/users.tsx',
|
|
209
|
+
'src/ui/components/AuthForm.tsx',
|
|
210
|
+
'src/ui/components/index.ts',
|
|
211
|
+
],
|
|
212
|
+
constraints: [
|
|
213
|
+
'Keep business logic out of UI components.',
|
|
214
|
+
'Use core/service layers for data access.',
|
|
215
|
+
],
|
|
216
|
+
},
|
|
217
|
+
];
|
|
218
|
+
const DEFAULT_INTENT_FILES = ['src/core/index.ts'];
|
|
219
|
+
const DEFAULT_INTENT_CONSTRAINTS = ['Keep changes scoped to planned files.'];
|
|
220
|
+
function buildIntentHeuristic(intent) {
|
|
221
|
+
const normalizedIntent = normalizeText(intent);
|
|
222
|
+
const detectedSignals = INTENT_HEURISTIC_RULES
|
|
223
|
+
.filter((rule) => rule.pattern.test(normalizedIntent))
|
|
224
|
+
.map((rule) => rule.id);
|
|
225
|
+
const expectedFiles = dedupePaths(detectedSignals.length > 0
|
|
226
|
+
? INTENT_HEURISTIC_RULES
|
|
227
|
+
.filter((rule) => detectedSignals.includes(rule.id))
|
|
228
|
+
.flatMap((rule) => rule.files)
|
|
229
|
+
: DEFAULT_INTENT_FILES).slice(0, 12);
|
|
230
|
+
const constraints = dedupeValues([
|
|
231
|
+
...DEFAULT_INTENT_CONSTRAINTS,
|
|
232
|
+
...INTENT_HEURISTIC_RULES
|
|
233
|
+
.filter((rule) => detectedSignals.includes(rule.id))
|
|
234
|
+
.flatMap((rule) => rule.constraints),
|
|
235
|
+
]).slice(0, 8);
|
|
236
|
+
return {
|
|
237
|
+
detectedSignals,
|
|
238
|
+
expectedFiles,
|
|
239
|
+
constraints,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
function initializeLocalPlanFromIntent(projectRoot, intentInput) {
|
|
243
|
+
const intent = normalizeText(intentInput);
|
|
244
|
+
const plan = ensureLocalPlan(projectRoot);
|
|
245
|
+
const heuristic = buildIntentHeuristic(intent);
|
|
246
|
+
const now = nowIso();
|
|
247
|
+
const nextPlan = {
|
|
248
|
+
intent,
|
|
249
|
+
expectedFiles: heuristic.expectedFiles,
|
|
250
|
+
constraints: heuristic.constraints,
|
|
251
|
+
createdAt: now,
|
|
252
|
+
lastUpdated: now,
|
|
253
|
+
};
|
|
254
|
+
writeLocalPlan(plan.path, nextPlan);
|
|
255
|
+
return {
|
|
256
|
+
path: plan.path,
|
|
257
|
+
intent: nextPlan.intent,
|
|
258
|
+
detectedSignals: heuristic.detectedSignals,
|
|
259
|
+
expectedFiles: nextPlan.expectedFiles,
|
|
260
|
+
constraints: nextPlan.constraints,
|
|
261
|
+
createdAt: nextPlan.createdAt,
|
|
262
|
+
lastUpdated: nextPlan.lastUpdated,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=plan-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-sync.js","sourceRoot":"","sources":["../../src/utils/plan-sync.ts"],"names":[],"mappings":"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"}
|