mcp-code-context 3.8.1 → 3.9.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 (98) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/INSTRUCTIONS.md +2 -2
  3. package/README.md +23 -11
  4. package/dist/src/core/engine.d.ts +1 -1
  5. package/dist/src/core/engine.js +1 -1
  6. package/dist/src/core/indexManager.d.ts +1 -1
  7. package/dist/src/core/indexManager.js +1 -1
  8. package/dist/src/core/sessionManager.d.ts +1 -1
  9. package/dist/src/core/sessionManager.js +1 -1
  10. package/dist/src/core/validator.d.ts +1 -1
  11. package/dist/src/core/validator.js +1 -1
  12. package/dist/src/index.d.ts +1 -1
  13. package/dist/src/index.js +2 -2
  14. package/dist/src/operations/astTransform.d.ts +1 -1
  15. package/dist/src/operations/astTransform.js +1 -1
  16. package/dist/src/operations/compress.d.ts +1 -1
  17. package/dist/src/operations/compress.js +53 -2
  18. package/dist/src/operations/compress.js.map +1 -1
  19. package/dist/src/operations/confirmationStore.d.ts +1 -1
  20. package/dist/src/operations/confirmationStore.js +1 -1
  21. package/dist/src/operations/impactAnalysis.js +11 -0
  22. package/dist/src/operations/impactAnalysis.js.map +1 -1
  23. package/dist/src/operations/write.d.ts +1 -1
  24. package/dist/src/operations/write.js +1 -1
  25. package/dist/src/parsers/base.d.ts +2 -2
  26. package/dist/src/parsers/base.js +2 -2
  27. package/dist/src/parsers/csharp.d.ts +1 -1
  28. package/dist/src/parsers/csharp.js +1 -1
  29. package/dist/src/parsers/dartTreeSitter.d.ts +1 -1
  30. package/dist/src/parsers/dartTreeSitter.js +1 -1
  31. package/dist/src/parsers/go.d.ts +1 -1
  32. package/dist/src/parsers/go.js +1 -1
  33. package/dist/src/parsers/java.d.ts +1 -1
  34. package/dist/src/parsers/java.js +1 -1
  35. package/dist/src/parsers/kotlin.d.ts +1 -1
  36. package/dist/src/parsers/kotlin.js +1 -1
  37. package/dist/src/parsers/php.d.ts +1 -1
  38. package/dist/src/parsers/php.js +1 -1
  39. package/dist/src/parsers/python.d.ts +2 -2
  40. package/dist/src/parsers/python.js +2 -2
  41. package/dist/src/parsers/registry.d.ts +1 -1
  42. package/dist/src/parsers/registry.js +1 -1
  43. package/dist/src/parsers/ruby.d.ts +2 -2
  44. package/dist/src/parsers/ruby.js +2 -2
  45. package/dist/src/parsers/rust.d.ts +1 -1
  46. package/dist/src/parsers/rust.js +1 -1
  47. package/dist/src/parsers/typescript.d.ts +1 -1
  48. package/dist/src/parsers/typescript.js +1 -1
  49. package/dist/src/tools/pipeline.js +4 -0
  50. package/dist/src/tools/pipeline.js.map +1 -1
  51. package/dist/src/tools/readHandlers.d.ts +18 -0
  52. package/dist/src/tools/readHandlers.js +52 -0
  53. package/dist/src/tools/readHandlers.js.map +1 -1
  54. package/dist/src/tools/toolDefinitions.d.ts +45 -0
  55. package/dist/src/tools/toolDefinitionsCore.d.ts +45 -0
  56. package/dist/src/tools/toolDefinitionsCore.js +39 -3
  57. package/dist/src/tools/toolDefinitionsCore.js.map +1 -1
  58. package/dist/src/utils/appDir.d.ts +1 -1
  59. package/dist/src/utils/appDir.js +1 -1
  60. package/dist/src/utils/auditLogger.d.ts +1 -1
  61. package/dist/src/utils/auditLogger.js +1 -1
  62. package/dist/src/utils/backupManager.d.ts +1 -1
  63. package/dist/src/utils/backupManager.js +1 -1
  64. package/dist/src/utils/constants.d.ts +1 -1
  65. package/dist/src/utils/constants.js +1 -1
  66. package/dist/src/utils/diff.d.ts +2 -2
  67. package/dist/src/utils/diff.js +2 -2
  68. package/dist/src/utils/fileLock.d.ts +1 -1
  69. package/dist/src/utils/fileLock.js +1 -1
  70. package/dist/src/utils/fileWalker.d.ts +1 -1
  71. package/dist/src/utils/fileWalker.js +1 -1
  72. package/dist/src/utils/fileWatcher.d.ts +1 -1
  73. package/dist/src/utils/fileWatcher.js +1 -1
  74. package/dist/src/utils/fuzzySearch.d.ts +1 -1
  75. package/dist/src/utils/fuzzySearch.js +1 -1
  76. package/dist/src/utils/gemDescriptions.json +22 -0
  77. package/dist/src/utils/gemfileParser.d.ts +17 -0
  78. package/dist/src/utils/gemfileParser.js +63 -0
  79. package/dist/src/utils/gemfileParser.js.map +1 -0
  80. package/dist/src/utils/logger.d.ts +1 -1
  81. package/dist/src/utils/logger.js +1 -1
  82. package/dist/src/utils/metaprogramming.d.ts +18 -0
  83. package/dist/src/utils/metaprogramming.js +139 -0
  84. package/dist/src/utils/metaprogramming.js.map +1 -0
  85. package/dist/src/utils/railsRoutes.d.ts +19 -0
  86. package/dist/src/utils/railsRoutes.js +143 -0
  87. package/dist/src/utils/railsRoutes.js.map +1 -0
  88. package/dist/src/utils/railsSchema.d.ts +1 -0
  89. package/dist/src/utils/railsSchema.js +23 -0
  90. package/dist/src/utils/railsSchema.js.map +1 -1
  91. package/dist/src/utils/rateLimiter.d.ts +1 -1
  92. package/dist/src/utils/rateLimiter.js +1 -1
  93. package/dist/src/utils/streaming.d.ts +1 -1
  94. package/dist/src/utils/streaming.js +1 -1
  95. package/dist/src/utils/telemetry.d.ts +1 -1
  96. package/dist/src/utils/telemetry.js +1 -1
  97. package/llms.txt +52 -21
  98. package/package.json +2 -2
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Gemfile Parser - v3.9.1
3
+ * Parses Ruby Gemfile to extract gem dependencies and infer implicit behavior.
4
+ * Uses a JSON data file for gem descriptions so they can be updated without recompile.
5
+ */
6
+ import * as fsSync from "node:fs";
7
+ import * as fs from "node:fs/promises";
8
+ import * as path from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+ // Load gem descriptions from JSON sibling file at module init time (sync, once)
11
+ function loadGemDescriptions() {
12
+ try {
13
+ const dir = path.dirname(fileURLToPath(import.meta.url));
14
+ const jsonPath = path.join(dir, "gemDescriptions.json");
15
+ return JSON.parse(fsSync.readFileSync(jsonPath, "utf-8"));
16
+ }
17
+ catch {
18
+ return {};
19
+ }
20
+ }
21
+ const GEM_DESCRIPTIONS = loadGemDescriptions();
22
+ // Cache: gemfilePath → { result, mtime }
23
+ const gemfileCache = new Map();
24
+ export async function parseGemfile(projectRoot) {
25
+ const gemfilePath = path.join(projectRoot, "Gemfile");
26
+ let mtime;
27
+ try {
28
+ mtime = (await fs.stat(gemfilePath)).mtimeMs;
29
+ }
30
+ catch {
31
+ return null; // No Gemfile — not a Ruby project
32
+ }
33
+ const cached = gemfileCache.get(gemfilePath);
34
+ if (cached?.mtime === mtime)
35
+ return cached.result;
36
+ const content = await fs.readFile(gemfilePath, "utf-8");
37
+ const result = parseGemfileContent(content);
38
+ gemfileCache.set(gemfilePath, { result, mtime });
39
+ return result;
40
+ }
41
+ export function parseGemfileContent(content) {
42
+ const gems = [];
43
+ // Match: gem 'name' | gem 'name', '~> 1.0' | gem "name", "version"
44
+ const gemRe = /^\s*gem\s+['"]([^'"]+)['"](?:\s*,\s*['"]([^'"]+)['"])?/gm;
45
+ let match;
46
+ while ((match = gemRe.exec(content)) !== null) {
47
+ const name = match[1].toLowerCase();
48
+ const version = match[2];
49
+ const implicitBehavior = GEM_DESCRIPTIONS[name];
50
+ gems.push({ name, version, implicitBehavior });
51
+ }
52
+ const knownGems = gems.filter(g => g.implicitBehavior !== undefined);
53
+ return { gems, knownGems };
54
+ }
55
+ export function formatGemAnnotation(knownGems) {
56
+ if (knownGems.length === 0)
57
+ return "";
58
+ const lines = knownGems
59
+ .map(g => ` <gem name="${g.name}"${g.version ? ` version="${g.version}"` : ""}>\n ${g.implicitBehavior}\n </gem>`)
60
+ .join("\n");
61
+ return `<!-- Gemfile: installed gems with implicit behavior\n${lines}\n-->`;
62
+ }
63
+ //# sourceMappingURL=gemfileParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemfileParser.js","sourceRoot":"","sources":["../../../src/utils/gemfileParser.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Logger - v3.8.1
2
+ * Logger - v3.9.1
3
3
  * Structured logging with pino (JSON to stderr, MCP-safe)
4
4
  */
5
5
  import pino from 'pino';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Logger - v3.8.1
2
+ * Logger - v3.9.1
3
3
  * Structured logging with pino (JSON to stderr, MCP-safe)
4
4
  */
5
5
  import pino from 'pino';
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Metaprogramming Entry Point Scanner - v3.9.1
3
+ * Identifies where Ruby's "magic" methods are generated in a codebase.
4
+ * Does not resolve what methods are created — it surfaces WHERE to look.
5
+ */
6
+ export interface MetaprogrammingMatch {
7
+ file: string;
8
+ line: number;
9
+ pattern: string;
10
+ snippet: string;
11
+ description: string;
12
+ }
13
+ export declare function findMetaprogrammingEntryPoints(params: {
14
+ target: string;
15
+ projectRoot: string;
16
+ isFile?: boolean;
17
+ }): Promise<MetaprogrammingMatch[]>;
18
+ export declare function formatMetaprogrammingResults(matches: MetaprogrammingMatch[]): string;
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Metaprogramming Entry Point Scanner - v3.9.1
3
+ * Identifies where Ruby's "magic" methods are generated in a codebase.
4
+ * Does not resolve what methods are created — it surfaces WHERE to look.
5
+ */
6
+ import * as fs from "node:fs/promises";
7
+ import { EXCLUDE_DIRS } from "./constants.js";
8
+ import { walkDir } from "./fileWalker.js";
9
+ /** Patterns that generate methods dynamically in Ruby */
10
+ const METAPROGRAMMING_PATTERNS = [
11
+ {
12
+ regex: /\bmethod_missing\b/,
13
+ name: "method_missing",
14
+ description: "Catch-all for undefined method calls — generates methods on demand",
15
+ },
16
+ {
17
+ regex: /\bdefine_method\b/,
18
+ name: "define_method",
19
+ description: "Programmatically defines a method on a class at runtime",
20
+ },
21
+ {
22
+ regex: /\bclass_eval\b|\bmodule_eval\b/,
23
+ name: "class_eval/module_eval",
24
+ description: "Evaluates code in the context of a class — can define methods dynamically",
25
+ },
26
+ {
27
+ regex: /\binstance_eval\b/,
28
+ name: "instance_eval",
29
+ description: "Evaluates code in the context of an object — can define singleton methods",
30
+ },
31
+ {
32
+ regex: /\bsend\s*\(/,
33
+ name: "send",
34
+ description: "Invokes a method dynamically by name — may call generated methods",
35
+ },
36
+ {
37
+ regex: /\bpublic_send\s*\(/,
38
+ name: "public_send",
39
+ description: "Like send but restricted to public methods — dynamic dispatch",
40
+ },
41
+ {
42
+ regex: /\bincluded\s+do\b/,
43
+ name: "included do",
44
+ description: "ActiveSupport::Concern hook — runs when module is included, may add methods/callbacks",
45
+ },
46
+ {
47
+ regex: /\bprepended\s+do\b/,
48
+ name: "prepended do",
49
+ description: "Module prepend hook — methods are added before the including class in the MRO",
50
+ },
51
+ {
52
+ regex: /ActiveSupport::Concern/,
53
+ name: "ActiveSupport::Concern",
54
+ description: "Rails concern module — adds class methods and instance methods when included",
55
+ },
56
+ {
57
+ regex: /\battr_accessor\b|\battr_reader\b|\battr_writer\b/,
58
+ name: "attr_accessor/reader/writer",
59
+ description: "Generates getter/setter methods for the listed attributes",
60
+ },
61
+ {
62
+ regex: /\bdelegate\b.*:to\s*=>/,
63
+ name: "delegate",
64
+ description: "Rails delegate macro — generates forwarding methods to another object",
65
+ },
66
+ {
67
+ regex: /\bhas_many\b.*through:/,
68
+ name: "has_many :through",
69
+ description: "AR association — generates join-table query methods",
70
+ },
71
+ ];
72
+ export async function findMetaprogrammingEntryPoints(params) {
73
+ const matches = [];
74
+ if (params.isFile) {
75
+ const content = await fs.readFile(params.target, "utf-8").catch(() => null);
76
+ if (content) {
77
+ scanContent(content, params.target, matches);
78
+ }
79
+ }
80
+ else {
81
+ await walkDir(params.target, {
82
+ extensions: [".rb"],
83
+ excludeDirs: EXCLUDE_DIRS,
84
+ onFile: async (fullPath) => {
85
+ const content = await fs.readFile(fullPath, "utf-8").catch(() => null);
86
+ if (content) {
87
+ scanContent(content, fullPath, matches);
88
+ }
89
+ },
90
+ });
91
+ }
92
+ return matches;
93
+ }
94
+ function scanContent(content, filePath, matches) {
95
+ const lines = content.split("\n");
96
+ for (let i = 0; i < lines.length; i++) {
97
+ const line = lines[i];
98
+ for (const { regex, name, description } of METAPROGRAMMING_PATTERNS) {
99
+ if (regex.test(line)) {
100
+ // Get 1 line of context before and after
101
+ const snippet = lines.slice(Math.max(0, i - 1), i + 2).join("\n");
102
+ matches.push({
103
+ file: filePath,
104
+ line: i + 1,
105
+ pattern: name,
106
+ snippet: snippet.trim(),
107
+ description,
108
+ });
109
+ break; // one match per line
110
+ }
111
+ }
112
+ }
113
+ }
114
+ export function formatMetaprogrammingResults(matches) {
115
+ if (matches.length === 0) {
116
+ return JSON.stringify({ found: 0, message: "No metaprogramming entry points detected" });
117
+ }
118
+ // Group by file
119
+ const byFile = new Map();
120
+ for (const m of matches) {
121
+ const existing = byFile.get(m.file) ?? [];
122
+ existing.push(m);
123
+ byFile.set(m.file, existing);
124
+ }
125
+ const result = {
126
+ found: matches.length,
127
+ files: Array.from(byFile.entries()).map(([file, fileMatches]) => ({
128
+ file,
129
+ matches: fileMatches.map(m => ({
130
+ line: m.line,
131
+ pattern: m.pattern,
132
+ description: m.description,
133
+ snippet: m.snippet,
134
+ })),
135
+ })),
136
+ };
137
+ return JSON.stringify(result, null, 2);
138
+ }
139
+ //# sourceMappingURL=metaprogramming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metaprogramming.js","sourceRoot":"","sources":["../../../src/utils/metaprogramming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Rails Routes Parser - v3.9.1
3
+ * Parses config/routes.rb to map HTTP routes to controller actions.
4
+ * Uses indentation-based namespace tracking (immune to do/end counting errors).
5
+ * Supports: resources, resource, explicit HTTP verbs, namespace/scope, root.
6
+ * v1 limitations: only:/except:/shallow:/nested resources — emits warnings, no false routes.
7
+ */
8
+ export interface RouteEntry {
9
+ method: string;
10
+ path: string;
11
+ controller: string;
12
+ action: string;
13
+ }
14
+ export interface RoutesResult {
15
+ routes: RouteEntry[];
16
+ warnings: string[];
17
+ }
18
+ export declare function parseRailsRoutes(projectRoot: string): Promise<RoutesResult | null>;
19
+ export declare function parseRoutesContent(content: string): RoutesResult;
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Rails Routes Parser - v3.9.1
3
+ * Parses config/routes.rb to map HTTP routes to controller actions.
4
+ * Uses indentation-based namespace tracking (immune to do/end counting errors).
5
+ * Supports: resources, resource, explicit HTTP verbs, namespace/scope, root.
6
+ * v1 limitations: only:/except:/shallow:/nested resources — emits warnings, no false routes.
7
+ */
8
+ import * as fs from "node:fs/promises";
9
+ import * as path from "node:path";
10
+ // Cache: routesPath → { result, mtime }
11
+ const routesCache = new Map();
12
+ /** Standard 7 REST actions for `resources` */
13
+ const RESOURCES_ACTIONS = [
14
+ { method: "GET", path: "", action: "index" },
15
+ { method: "GET", path: "/new", action: "new" },
16
+ { method: "POST", path: "", action: "create" },
17
+ { method: "GET", path: "/:id", action: "show" },
18
+ { method: "GET", path: "/:id/edit", action: "edit" },
19
+ { method: "PATCH", path: "/:id", action: "update" },
20
+ { method: "DELETE", path: "/:id", action: "destroy" },
21
+ ];
22
+ /** Standard 6 singular REST actions for `resource` */
23
+ const RESOURCE_ACTIONS = [
24
+ { method: "GET", path: "/new", action: "new" },
25
+ { method: "POST", path: "", action: "create" },
26
+ { method: "GET", path: "", action: "show" },
27
+ { method: "GET", path: "/edit", action: "edit" },
28
+ { method: "PATCH", path: "", action: "update" },
29
+ { method: "DELETE", path: "", action: "destroy" },
30
+ ];
31
+ export async function parseRailsRoutes(projectRoot) {
32
+ const routesPath = path.join(projectRoot, "config", "routes.rb");
33
+ let mtime;
34
+ try {
35
+ mtime = (await fs.stat(routesPath)).mtimeMs;
36
+ }
37
+ catch {
38
+ return null; // No routes.rb — not a Rails app
39
+ }
40
+ const cached = routesCache.get(routesPath);
41
+ if (cached?.mtime === mtime)
42
+ return cached.result;
43
+ const content = await fs.readFile(routesPath, "utf-8");
44
+ const result = parseRoutesContent(content);
45
+ routesCache.set(routesPath, { result, mtime });
46
+ return result;
47
+ }
48
+ export function parseRoutesContent(content) {
49
+ const routes = [];
50
+ const warnings = [];
51
+ const nsStack = [];
52
+ // Helper: get current url prefix and controller namespace from stack
53
+ const getPrefix = () => nsStack.length > 0 ? "/" + nsStack.map(e => e.prefix).join("/") : "";
54
+ const getNsPrefix = () => nsStack.length > 0 ? nsStack.map(e => e.nsPrefix).join("/") + "/" : "";
55
+ // Helper: measure leading spaces
56
+ const indentOf = (raw) => raw.match(/^(\s*)/)?.[1].length ?? 0;
57
+ const lines = content.split("\n");
58
+ for (const rawLine of lines) {
59
+ const indent = indentOf(rawLine);
60
+ const line = rawLine.trim();
61
+ // Skip blank lines and comments
62
+ if (line === "" || line.startsWith("#"))
63
+ continue;
64
+ // Pop namespace stack entries whose indent is >= current indent
65
+ // (meaning we've dedented past them — their `end` was processed)
66
+ while (nsStack.length > 0 && indent <= nsStack[nsStack.length - 1].indent) {
67
+ nsStack.pop();
68
+ }
69
+ // namespace :admin do / namespace 'admin' do / scope :admin do
70
+ // Handles both symbol (:admin) and string ('admin'/"admin") syntax
71
+ const nsSymbolMatch = line.match(/^(?:namespace|scope)\s+:(\w+)/);
72
+ const nsStringMatch = line.match(/^(?:namespace|scope)\s+['"]([^'"]+)['"]/);
73
+ const nsMatch = nsSymbolMatch ?? nsStringMatch;
74
+ if (nsMatch) {
75
+ const seg = nsMatch[1];
76
+ // scope doesn't add controller namespace, namespace does
77
+ const isNamespace = line.startsWith("namespace");
78
+ nsStack.push({ indent, prefix: seg, nsPrefix: isNamespace ? seg : "" });
79
+ continue;
80
+ }
81
+ const urlPrefix = getPrefix();
82
+ const ctrlPrefix = getNsPrefix();
83
+ // Detect option flags
84
+ const hasOnlyExcept = /\bonly:\s*\[/.test(line) || /\bexcept:\s*\[/.test(line);
85
+ const hasShallow = /\bshallow:\s*true\b/.test(line);
86
+ // Nested resources: line ends with `do` (opens a block we won't parse deeply)
87
+ const hasNestedDo = /\bdo\s*$/.test(line) && (line.startsWith("resources") || line.startsWith("resource"));
88
+ // resources :name / resources :name, only: [...] / resources :name do
89
+ const resourcesMatch = line.match(/^resources\s+:(\w+)/);
90
+ if (resourcesMatch) {
91
+ const name = resourcesMatch[1];
92
+ const controller = `${ctrlPrefix}${name}`;
93
+ const basePath = `${urlPrefix}/${name}`;
94
+ if (hasOnlyExcept)
95
+ warnings.push(`resources :${name} uses only:/except: — route list may be incomplete. Full support planned for v2.`);
96
+ if (hasShallow)
97
+ warnings.push(`resources :${name} uses shallow: — nested shallow routes not fully parsed.`);
98
+ if (hasNestedDo)
99
+ warnings.push(`resources :${name} has nested resources (do block) — only top-level routes parsed.`);
100
+ for (const a of RESOURCES_ACTIONS) {
101
+ routes.push({ method: a.method, path: basePath + a.path, controller, action: a.action });
102
+ }
103
+ continue;
104
+ }
105
+ // resource :name (singular)
106
+ const resourceMatch = line.match(/^resource\s+:(\w+)/);
107
+ if (resourceMatch) {
108
+ const name = resourceMatch[1];
109
+ const controller = `${ctrlPrefix}${name}s`; // pluralize for controller
110
+ const basePath = `${urlPrefix}/${name}`;
111
+ if (hasOnlyExcept)
112
+ warnings.push(`resource :${name} uses only:/except: — route list may be incomplete.`);
113
+ for (const a of RESOURCE_ACTIONS) {
114
+ routes.push({ method: a.method, path: basePath + a.path, controller, action: a.action });
115
+ }
116
+ continue;
117
+ }
118
+ // Explicit HTTP verb: get '/path', to: 'controller#action'
119
+ const verbMatch = line.match(/^(get|post|patch|put|delete|head|options)\s+['"]([^'"]+)['"]\s*,\s*to:\s*['"]([^#'"]+)#([^'"]+)['"]/i);
120
+ if (verbMatch) {
121
+ routes.push({
122
+ method: verbMatch[1].toUpperCase(),
123
+ path: urlPrefix + verbMatch[2],
124
+ controller: verbMatch[3].trim(),
125
+ action: verbMatch[4].trim(),
126
+ });
127
+ continue;
128
+ }
129
+ // root to: 'controller#action' / root 'controller#action'
130
+ const rootMatch = line.match(/^root\s+(?:to:\s*)?['"]([^#'"]+)#([^'"]+)['"]/);
131
+ if (rootMatch) {
132
+ routes.push({
133
+ method: "GET",
134
+ path: urlPrefix + "/",
135
+ controller: rootMatch[1].trim(),
136
+ action: rootMatch[2].trim(),
137
+ });
138
+ continue;
139
+ }
140
+ }
141
+ return { routes, warnings };
142
+ }
143
+ //# sourceMappingURL=railsRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"railsRoutes.js","sourceRoot":"","sources":["../../../src/utils/railsRoutes.ts"],"names":[],"mappings":"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"}
@@ -8,3 +8,4 @@ export declare function loadRailsSchema(projectRoot: string): Promise<ProjectDbS
8
8
  export declare function parseSchemaRb(content: string): ProjectDbSchema;
9
9
  export declare function modelToTable(className: string): string;
10
10
  export declare function formatSchemaAnnotation(tableName: string, columns: TableSchema): string;
11
+ export declare function findRailsConcerns(projectRoot: string): Promise<Map<string, string[]>>;
@@ -101,4 +101,27 @@ export function formatSchemaAnnotation(tableName, columns) {
101
101
  .join("\n");
102
102
  return `<!-- ActiveRecord Virtual Schema: ${tableName}\n${cols}\n-->`;
103
103
  }
104
+ // R5: Concern Resolution - Scan for concerns in app/models/concerns and app/controllers/concerns
105
+ export async function findRailsConcerns(projectRoot) {
106
+ const concernMap = new Map();
107
+ const concernsDirs = [
108
+ path.join(projectRoot, "app", "models", "concerns"),
109
+ path.join(projectRoot, "app", "controllers", "concerns"),
110
+ ];
111
+ for (const dir of concernsDirs) {
112
+ try {
113
+ const files = await fs.readdir(dir, { withFileTypes: true });
114
+ for (const file of files) {
115
+ if (file.isFile() && file.name.endsWith(".rb")) {
116
+ const moduleName = file.name.replace(/\.rb$/, "").split("_").map(part => part.charAt(0).toUpperCase() + part.slice(1)).join("");
117
+ concernMap.set(moduleName, [path.join(dir, file.name)]);
118
+ }
119
+ }
120
+ }
121
+ catch {
122
+ // Directory doesn't exist, skip
123
+ }
124
+ }
125
+ return concernMap;
126
+ }
104
127
  //# sourceMappingURL=railsSchema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"railsSchema.js","sourceRoot":"","sources":["../../../src/utils/railsSchema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"railsSchema.js","sourceRoot":"","sources":["../../../src/utils/railsSchema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAUlC,gDAAgD;AAChD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsD,CAAC;AAElF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAE7D,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,2DAA2D;IAC1E,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,MAAM,EAAE,KAAK,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IAElD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,0BAA0B,CAAC;IAC3C,MAAM,KAAK,GAAG,sBAAsB,CAAC;IACrC,8EAA8E;IAC9E,MAAM,UAAU,GAAG,yBAAyB,CAAC;IAE7C,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,cAAc,GAAgB,EAAE,CAAC;IACrC,uEAAuE;IACvE,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,EAAE,CAAC;gBACN,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpB,cAAc,GAAG,EAAE,CAAC;gBACpB,KAAK,GAAG,CAAC,CAAC,CAAC,mCAAmC;YAChD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,8EAA8E;YAC9E,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,KAAK,EAAE,CAAC;gBACR,SAAS,CAAC,oDAAoD;YAChE,CAAC;YAED,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,KAAK,EAAE,CAAC;gBACR,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oBAChB,yCAAyC;oBACzC,MAAM,CAAC,YAAY,CAAC,GAAG,cAAc,CAAC;oBACtC,YAAY,GAAG,IAAI,CAAC;gBACtB,CAAC;gBACD,SAAS;YACX,CAAC;YAED,qEAAqE;YACrE,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7B,IAAI,GAAG,EAAE,CAAC;oBACR,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;gBACzD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,YAAY,CAAC,GAAG,cAAc,CAAC;IACxC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iDAAiD;AACjD,iEAAiE;AACjE,+FAA+F;AAC/F,0FAA0F;AAC1F,mFAAmF;AACnF,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,gFAAgF;IAChF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE1C,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEjE,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,kDAAkD;IAClD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAC1C,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAClD,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,wBAAwB;IACvF,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,GAAG,IAAI,CAAC;IACpD,OAAO,IAAI,GAAG,GAAG,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,OAAoB;IAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,mBAAmB,GAAG,WAAW,IAAI,MAAM,CAAC;SACjE,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,qCAAqC,SAAS,KAAK,IAAI,OAAO,CAAC;AACxE,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IACzD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC/C,MAAM,YAAY,GAAG;QACnB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC;KACzD,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAC9D,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACrD,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACX,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Rate Limiter - v3.8.1
2
+ * Rate Limiter - v3.9.1
3
3
  * Token bucket algorithm for DoS protection
4
4
  */
5
5
  interface RateLimitConfig {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Rate Limiter - v3.8.1
2
+ * Rate Limiter - v3.9.1
3
3
  * Token bucket algorithm for DoS protection
4
4
  */
5
5
  export class RateLimiter {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * File Streaming - v3.8.1
2
+ * File Streaming - v3.9.1
3
3
  * Stream large files in chunks to avoid memory exhaustion
4
4
  */
5
5
  import type { BaseParser, SymbolInfo } from "../parsers/base.js";
@@ -1,5 +1,5 @@
1
1
  /**
2
- * File Streaming - v3.8.1
2
+ * File Streaming - v3.9.1
3
3
  * Stream large files in chunks to avoid memory exhaustion
4
4
  */
5
5
  import * as fs from "node:fs";
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Telemetry - v3.8.1
2
+ * Telemetry - v3.9.1
3
3
  * Metrics collection and monitoring
4
4
  */
5
5
  export interface Metric {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Telemetry - v3.8.1
2
+ * Telemetry - v3.9.1
3
3
  * Metrics collection and monitoring
4
4
  */
5
5
  export class TelemetryCollector {