@norescan/ecosystems 0.0.0-stage → 0.1.2

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 (70) hide show
  1. package/README.md +40 -2
  2. package/dist/adapters/cpp.d.ts +14 -0
  3. package/dist/adapters/cpp.d.ts.map +1 -0
  4. package/dist/adapters/cpp.js +148 -0
  5. package/dist/adapters/cpp.js.map +1 -0
  6. package/dist/adapters/dart.d.ts +14 -0
  7. package/dist/adapters/dart.d.ts.map +1 -0
  8. package/dist/adapters/dart.js +99 -0
  9. package/dist/adapters/dart.js.map +1 -0
  10. package/dist/adapters/dotnet.d.ts +14 -0
  11. package/dist/adapters/dotnet.d.ts.map +1 -0
  12. package/dist/adapters/dotnet.js +90 -0
  13. package/dist/adapters/dotnet.js.map +1 -0
  14. package/dist/adapters/golang.d.ts +14 -0
  15. package/dist/adapters/golang.d.ts.map +1 -0
  16. package/dist/adapters/golang.js +140 -0
  17. package/dist/adapters/golang.js.map +1 -0
  18. package/dist/adapters/java.d.ts +14 -0
  19. package/dist/adapters/java.d.ts.map +1 -0
  20. package/dist/adapters/java.js +179 -0
  21. package/dist/adapters/java.js.map +1 -0
  22. package/dist/adapters/javascript.d.ts +15 -0
  23. package/dist/adapters/javascript.d.ts.map +1 -0
  24. package/dist/adapters/javascript.js +200 -0
  25. package/dist/adapters/javascript.js.map +1 -0
  26. package/dist/adapters/php.d.ts +14 -0
  27. package/dist/adapters/php.d.ts.map +1 -0
  28. package/dist/adapters/php.js +88 -0
  29. package/dist/adapters/php.js.map +1 -0
  30. package/dist/adapters/polyglot.d.ts +38 -0
  31. package/dist/adapters/polyglot.d.ts.map +1 -0
  32. package/dist/adapters/polyglot.js +176 -0
  33. package/dist/adapters/polyglot.js.map +1 -0
  34. package/dist/adapters/python.d.ts +14 -0
  35. package/dist/adapters/python.d.ts.map +1 -0
  36. package/dist/adapters/python.js +219 -0
  37. package/dist/adapters/python.js.map +1 -0
  38. package/dist/adapters/ruby.d.ts +14 -0
  39. package/dist/adapters/ruby.d.ts.map +1 -0
  40. package/dist/adapters/ruby.js +86 -0
  41. package/dist/adapters/ruby.js.map +1 -0
  42. package/dist/adapters/rust.d.ts +14 -0
  43. package/dist/adapters/rust.d.ts.map +1 -0
  44. package/dist/adapters/rust.js +167 -0
  45. package/dist/adapters/rust.js.map +1 -0
  46. package/dist/detector.d.ts +20 -0
  47. package/dist/detector.d.ts.map +1 -0
  48. package/dist/detector.js +306 -0
  49. package/dist/detector.js.map +1 -0
  50. package/dist/environment.d.ts +18 -0
  51. package/dist/environment.d.ts.map +1 -0
  52. package/dist/environment.js +119 -0
  53. package/dist/environment.js.map +1 -0
  54. package/dist/index.d.ts +17 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +33 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/registry.d.ts +25 -0
  59. package/dist/registry.d.ts.map +1 -0
  60. package/dist/registry.js +103 -0
  61. package/dist/registry.js.map +1 -0
  62. package/dist/runner.d.ts +23 -0
  63. package/dist/runner.d.ts.map +1 -0
  64. package/dist/runner.js +68 -0
  65. package/dist/runner.js.map +1 -0
  66. package/dist/types.d.ts +84 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +3 -0
  69. package/dist/types.js.map +1 -0
  70. package/package.json +42 -3
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ZigAdapter = exports.ElixirAdapter = exports.SwiftAdapter = void 0;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ class SwiftAdapter {
10
+ id = 'spm';
11
+ displayName = 'Swift (Swift Package Manager)';
12
+ supportedLanguages = ['swift'];
13
+ manifestFiles = ['Package.swift'];
14
+ lockFiles = ['Package.resolved'];
15
+ async detect(projectRoot) {
16
+ try {
17
+ await promises_1.default.access(node_path_1.default.join(projectRoot, 'Package.swift'));
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ async extractDependencies(projectRoot) {
25
+ return [];
26
+ }
27
+ async extractCommands(projectRoot) {
28
+ return [
29
+ {
30
+ name: 'swift-build',
31
+ rawCommand: 'swift build',
32
+ category: 'build',
33
+ sourceFile: 'Package.swift',
34
+ workingDir: '.',
35
+ description: 'Build Swift package targets',
36
+ safeToRun: true,
37
+ requiresNetwork: false,
38
+ ecosystemId: this.id,
39
+ },
40
+ {
41
+ name: 'swift-test',
42
+ rawCommand: 'swift test',
43
+ category: 'test',
44
+ sourceFile: 'Package.swift',
45
+ workingDir: '.',
46
+ description: 'Execute XCTest test suite',
47
+ safeToRun: true,
48
+ requiresNetwork: false,
49
+ ecosystemId: this.id,
50
+ },
51
+ ];
52
+ }
53
+ async detectWorkspaces(projectRoot) {
54
+ return [];
55
+ }
56
+ async suggestCommands(projectRoot) {
57
+ return this.extractCommands(projectRoot);
58
+ }
59
+ }
60
+ exports.SwiftAdapter = SwiftAdapter;
61
+ class ElixirAdapter {
62
+ id = 'mix';
63
+ displayName = 'Elixir & Erlang (Mix / Hex)';
64
+ supportedLanguages = ['elixir', 'erlang'];
65
+ manifestFiles = ['mix.exs', 'rebar.config'];
66
+ lockFiles = ['mix.lock', 'rebar.lock'];
67
+ async detect(projectRoot) {
68
+ try {
69
+ await promises_1.default.access(node_path_1.default.join(projectRoot, 'mix.exs'));
70
+ return true;
71
+ }
72
+ catch {
73
+ return false;
74
+ }
75
+ }
76
+ async extractDependencies(projectRoot) {
77
+ return [];
78
+ }
79
+ async extractCommands(projectRoot) {
80
+ return [
81
+ {
82
+ name: 'mix-deps-get',
83
+ rawCommand: 'mix deps.get',
84
+ category: 'install',
85
+ sourceFile: 'mix.exs',
86
+ workingDir: '.',
87
+ description: 'Fetch project Hex dependencies',
88
+ safeToRun: true,
89
+ requiresNetwork: true,
90
+ ecosystemId: this.id,
91
+ },
92
+ {
93
+ name: 'mix-test',
94
+ rawCommand: 'mix test',
95
+ category: 'test',
96
+ sourceFile: 'mix.exs',
97
+ workingDir: '.',
98
+ description: 'Run ExUnit test suite',
99
+ safeToRun: true,
100
+ requiresNetwork: false,
101
+ ecosystemId: this.id,
102
+ },
103
+ {
104
+ name: 'mix-compile',
105
+ rawCommand: 'mix compile',
106
+ category: 'build',
107
+ sourceFile: 'mix.exs',
108
+ workingDir: '.',
109
+ description: 'Compile Elixir project source files',
110
+ safeToRun: true,
111
+ requiresNetwork: false,
112
+ ecosystemId: this.id,
113
+ },
114
+ ];
115
+ }
116
+ async detectWorkspaces(projectRoot) {
117
+ return [];
118
+ }
119
+ async suggestCommands(projectRoot) {
120
+ return this.extractCommands(projectRoot);
121
+ }
122
+ }
123
+ exports.ElixirAdapter = ElixirAdapter;
124
+ class ZigAdapter {
125
+ id = 'zig';
126
+ displayName = 'Zig (Zig Build System)';
127
+ supportedLanguages = ['zig'];
128
+ manifestFiles = ['build.zig', 'build.zig.zon'];
129
+ lockFiles = [];
130
+ async detect(projectRoot) {
131
+ try {
132
+ await promises_1.default.access(node_path_1.default.join(projectRoot, 'build.zig'));
133
+ return true;
134
+ }
135
+ catch {
136
+ return false;
137
+ }
138
+ }
139
+ async extractDependencies(projectRoot) {
140
+ return [];
141
+ }
142
+ async extractCommands(projectRoot) {
143
+ return [
144
+ {
145
+ name: 'zig-build',
146
+ rawCommand: 'zig build',
147
+ category: 'build',
148
+ sourceFile: 'build.zig',
149
+ workingDir: '.',
150
+ description: 'Build Zig targets',
151
+ safeToRun: true,
152
+ requiresNetwork: false,
153
+ ecosystemId: this.id,
154
+ },
155
+ {
156
+ name: 'zig-test',
157
+ rawCommand: 'zig build test',
158
+ category: 'test',
159
+ sourceFile: 'build.zig',
160
+ workingDir: '.',
161
+ description: 'Run Zig unit test targets',
162
+ safeToRun: true,
163
+ requiresNetwork: false,
164
+ ecosystemId: this.id,
165
+ },
166
+ ];
167
+ }
168
+ async detectWorkspaces(projectRoot) {
169
+ return [];
170
+ }
171
+ async suggestCommands(projectRoot) {
172
+ return this.extractCommands(projectRoot);
173
+ }
174
+ }
175
+ exports.ZigAdapter = ZigAdapter;
176
+ //# sourceMappingURL=polyglot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyglot.js","sourceRoot":"","sources":["../../src/adapters/polyglot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { EcosystemAdapter, SupportedLanguage, PackageDependency, ProjectCommand, WorkspaceMember } from '../types.js';
2
+ export declare class PythonAdapter implements EcosystemAdapter {
3
+ readonly id = "python";
4
+ readonly displayName = "Python (pip / uv / Poetry / venv)";
5
+ readonly supportedLanguages: SupportedLanguage[];
6
+ readonly manifestFiles: string[];
7
+ readonly lockFiles: string[];
8
+ detect(projectRoot: string): Promise<boolean>;
9
+ extractDependencies(projectRoot: string): Promise<PackageDependency[]>;
10
+ extractCommands(projectRoot: string): Promise<ProjectCommand[]>;
11
+ detectWorkspaces(projectRoot: string): Promise<WorkspaceMember[]>;
12
+ suggestCommands(projectRoot: string): Promise<ProjectCommand[]>;
13
+ }
14
+ //# sourceMappingURL=python.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../src/adapters/python.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,qBAAa,aAAc,YAAW,gBAAgB;IACpD,SAAgB,EAAE,YAAY;IAC9B,SAAgB,WAAW,uCAAuC;IAClE,SAAgB,kBAAkB,EAAE,iBAAiB,EAAE,CAAc;IACrE,SAAgB,aAAa,WAAoF;IACjH,SAAgB,SAAS,WAA0D;IAEtE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU7C,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA+EtE,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAyH/D,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAIjE,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAG7E"}
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PythonAdapter = void 0;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ class PythonAdapter {
10
+ id = 'python';
11
+ displayName = 'Python (pip / uv / Poetry / venv)';
12
+ supportedLanguages = ['python'];
13
+ manifestFiles = ['pyproject.toml', 'requirements.txt', 'Pipfile', 'setup.py', 'environment.yml'];
14
+ lockFiles = ['uv.lock', 'poetry.lock', 'Pipfile.lock', 'pdm.lock'];
15
+ async detect(projectRoot) {
16
+ for (const f of this.manifestFiles) {
17
+ try {
18
+ await promises_1.default.access(node_path_1.default.join(projectRoot, f));
19
+ return true;
20
+ }
21
+ catch { }
22
+ }
23
+ return false;
24
+ }
25
+ async extractDependencies(projectRoot) {
26
+ const deps = [];
27
+ // 1. Parse requirements.txt
28
+ try {
29
+ const content = await promises_1.default.readFile(node_path_1.default.join(projectRoot, 'requirements.txt'), 'utf8');
30
+ const lines = content.split('\n');
31
+ for (const line of lines) {
32
+ const trimmed = line.trim();
33
+ if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('-r') || trimmed.startsWith('-e'))
34
+ continue;
35
+ const match = trimmed.match(/^([a-zA-Z0-9_\-\.]+)(.*)$/);
36
+ if (match) {
37
+ const name = match[1];
38
+ const constraint = match[2].trim() || '*';
39
+ deps.push({
40
+ name,
41
+ declaredVersion: constraint,
42
+ versionConstraint: constraint,
43
+ dependencyType: 'production',
44
+ isDirect: true,
45
+ isOptional: false,
46
+ manifestPath: 'requirements.txt',
47
+ registry: 'pypi',
48
+ });
49
+ }
50
+ }
51
+ }
52
+ catch { }
53
+ // 2. Parse pyproject.toml
54
+ try {
55
+ const content = await promises_1.default.readFile(node_path_1.default.join(projectRoot, 'pyproject.toml'), 'utf8');
56
+ // Look for dependencies array under [project]
57
+ const depMatch = content.match(/dependencies\s*=\s*\[([\s\S]*?)\]/);
58
+ if (depMatch) {
59
+ const rawItems = depMatch[1].match(/"([^"]+)"|'([^']+)'/g) || [];
60
+ for (const item of rawItems) {
61
+ const cleaned = item.replace(/['"]/g, '').trim();
62
+ const parsed = cleaned.match(/^([a-zA-Z0-9_\-\.]+)(.*)$/);
63
+ if (parsed) {
64
+ deps.push({
65
+ name: parsed[1],
66
+ declaredVersion: parsed[2].trim() || '*',
67
+ versionConstraint: parsed[2].trim() || '*',
68
+ dependencyType: 'production',
69
+ isDirect: true,
70
+ isOptional: false,
71
+ manifestPath: 'pyproject.toml',
72
+ registry: 'pypi',
73
+ });
74
+ }
75
+ }
76
+ }
77
+ // Look for Poetry dependencies
78
+ const poetryMatch = content.match(/\[tool\.poetry\.dependencies\]([\s\S]*?)(\n\[|$)/);
79
+ if (poetryMatch) {
80
+ const lines = poetryMatch[1].split('\n');
81
+ for (const l of lines) {
82
+ const match = l.match(/^([a-zA-Z0-9_\-\.]+)\s*=\s*["']([^"']+)["']/);
83
+ if (match && match[1] !== 'python') {
84
+ deps.push({
85
+ name: match[1],
86
+ declaredVersion: match[2],
87
+ versionConstraint: match[2],
88
+ dependencyType: 'production',
89
+ isDirect: true,
90
+ isOptional: false,
91
+ manifestPath: 'pyproject.toml',
92
+ registry: 'pypi',
93
+ });
94
+ }
95
+ }
96
+ }
97
+ }
98
+ catch { }
99
+ return deps;
100
+ }
101
+ async extractCommands(projectRoot) {
102
+ const commands = [];
103
+ // Check for uv
104
+ let hasUvLock = false;
105
+ try {
106
+ await promises_1.default.access(node_path_1.default.join(projectRoot, 'uv.lock'));
107
+ hasUvLock = true;
108
+ }
109
+ catch { }
110
+ // Check for poetry
111
+ let hasPoetryLock = false;
112
+ try {
113
+ await promises_1.default.access(node_path_1.default.join(projectRoot, 'poetry.lock'));
114
+ hasPoetryLock = true;
115
+ }
116
+ catch { }
117
+ // Check for venv
118
+ let hasVenv = false;
119
+ for (const v of ['.venv', 'venv']) {
120
+ try {
121
+ await promises_1.default.access(node_path_1.default.join(projectRoot, v));
122
+ hasVenv = true;
123
+ break;
124
+ }
125
+ catch { }
126
+ }
127
+ if (hasUvLock) {
128
+ commands.push({
129
+ name: 'uv-sync',
130
+ rawCommand: 'uv sync',
131
+ category: 'install',
132
+ sourceFile: 'uv.lock',
133
+ workingDir: '.',
134
+ description: 'Synchronize project virtual environment using uv',
135
+ safeToRun: true,
136
+ requiresNetwork: true,
137
+ ecosystemId: this.id,
138
+ }, {
139
+ name: 'uv-test',
140
+ rawCommand: 'uv run pytest',
141
+ category: 'test',
142
+ sourceFile: 'pyproject.toml',
143
+ workingDir: '.',
144
+ description: 'Run test suite inside uv environment',
145
+ safeToRun: true,
146
+ requiresNetwork: false,
147
+ ecosystemId: this.id,
148
+ });
149
+ }
150
+ else if (hasPoetryLock) {
151
+ commands.push({
152
+ name: 'poetry-install',
153
+ rawCommand: 'poetry install',
154
+ category: 'install',
155
+ sourceFile: 'poetry.lock',
156
+ workingDir: '.',
157
+ description: 'Install dependencies using Poetry',
158
+ safeToRun: true,
159
+ requiresNetwork: true,
160
+ ecosystemId: this.id,
161
+ }, {
162
+ name: 'poetry-test',
163
+ rawCommand: 'poetry run pytest',
164
+ category: 'test',
165
+ sourceFile: 'pyproject.toml',
166
+ workingDir: '.',
167
+ description: 'Run test suite with Poetry',
168
+ safeToRun: true,
169
+ requiresNetwork: false,
170
+ ecosystemId: this.id,
171
+ });
172
+ }
173
+ else {
174
+ commands.push({
175
+ name: 'pip-install',
176
+ rawCommand: 'pip install -r requirements.txt',
177
+ category: 'install',
178
+ sourceFile: 'requirements.txt',
179
+ workingDir: '.',
180
+ description: 'Install requirements via pip',
181
+ safeToRun: true,
182
+ requiresNetwork: true,
183
+ ecosystemId: this.id,
184
+ }, {
185
+ name: 'pytest',
186
+ rawCommand: 'python -m pytest',
187
+ category: 'test',
188
+ sourceFile: 'pyproject.toml',
189
+ workingDir: '.',
190
+ description: 'Run tests with pytest module',
191
+ safeToRun: true,
192
+ requiresNetwork: false,
193
+ ecosystemId: this.id,
194
+ });
195
+ }
196
+ // Add virtual environment activation command
197
+ const isWindows = process.platform === 'win32';
198
+ commands.push({
199
+ name: 'activate-venv',
200
+ rawCommand: isWindows ? '.\\.venv\\Scripts\\Activate.ps1' : 'source .venv/bin/activate',
201
+ category: 'environment',
202
+ sourceFile: hasVenv ? '.venv' : 'python',
203
+ workingDir: '.',
204
+ description: hasVenv ? 'Activate existing local virtual environment' : 'Activate Python virtual environment',
205
+ safeToRun: true,
206
+ requiresNetwork: false,
207
+ ecosystemId: this.id,
208
+ });
209
+ return commands;
210
+ }
211
+ async detectWorkspaces(projectRoot) {
212
+ return [];
213
+ }
214
+ async suggestCommands(projectRoot) {
215
+ return this.extractCommands(projectRoot);
216
+ }
217
+ }
218
+ exports.PythonAdapter = PythonAdapter;
219
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../src/adapters/python.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAkC;AAClC,0DAA6B;AAS7B,MAAa,aAAa;IACR,EAAE,GAAG,QAAQ,CAAC;IACd,WAAW,GAAG,mCAAmC,CAAC;IAClD,kBAAkB,GAAwB,CAAC,QAAQ,CAAC,CAAC;IACrD,aAAa,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACjG,SAAS,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;IAE5E,KAAK,CAAC,MAAM,CAAC,WAAmB;QACrC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,kBAAE,CAAC,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3C,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,WAAmB;QAClD,MAAM,IAAI,GAAwB,EAAE,CAAC;QAErC,4BAA4B;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC,CAAC;YACtF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAE1G,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBACzD,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC;oBAC1C,IAAI,CAAC,IAAI,CAAC;wBACR,IAAI;wBACJ,eAAe,EAAE,UAAU;wBAC3B,iBAAiB,EAAE,UAAU;wBAC7B,cAAc,EAAE,YAAY;wBAC5B,QAAQ,EAAE,IAAI;wBACd,UAAU,EAAE,KAAK;wBACjB,YAAY,EAAE,kBAAkB;wBAChC,QAAQ,EAAE,MAAM;qBACjB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,0BAA0B;QAC1B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC;YACpF,8CAA8C;YAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACpE,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;gBACjE,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;oBAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBACjD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;oBAC1D,IAAI,MAAM,EAAE,CAAC;wBACX,IAAI,CAAC,IAAI,CAAC;4BACR,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;4BACf,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG;4BACxC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG;4BAC1C,cAAc,EAAE,YAAY;4BAC5B,QAAQ,EAAE,IAAI;4BACd,UAAU,EAAE,KAAK;4BACjB,YAAY,EAAE,gBAAgB;4BAC9B,QAAQ,EAAE,MAAM;yBACjB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,+BAA+B;YAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACtF,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;oBACrE,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;wBACnC,IAAI,CAAC,IAAI,CAAC;4BACR,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;4BACd,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;4BACzB,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC;4BAC3B,cAAc,EAAE,YAAY;4BAC5B,QAAQ,EAAE,IAAI;4BACd,UAAU,EAAE,KAAK;4BACjB,YAAY,EAAE,gBAAgB;4BAC9B,QAAQ,EAAE,MAAM;yBACjB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,WAAmB;QAC9C,MAAM,QAAQ,GAAqB,EAAE,CAAC;QAEtC,eAAe;QACf,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,kBAAE,CAAC,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;YACnD,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,mBAAmB;QACnB,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,kBAAE,CAAC,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;YACvD,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,iBAAiB;QACjB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,kBAAE,CAAC,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3C,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM;YACR,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CACX;gBACE,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,SAAS;gBACrB,QAAQ,EAAE,SAAS;gBACnB,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,kDAAkD;gBAC/D,SAAS,EAAE,IAAI;gBACf,eAAe,EAAE,IAAI;gBACrB,WAAW,EAAE,IAAI,CAAC,EAAE;aACrB,EACD;gBACE,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,eAAe;gBAC3B,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,gBAAgB;gBAC5B,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,sCAAsC;gBACnD,SAAS,EAAE,IAAI;gBACf,eAAe,EAAE,KAAK;gBACtB,WAAW,EAAE,IAAI,CAAC,EAAE;aACrB,CACF,CAAC;QACJ,CAAC;aAAM,IAAI,aAAa,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CACX;gBACE,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE,gBAAgB;gBAC5B,QAAQ,EAAE,SAAS;gBACnB,UAAU,EAAE,aAAa;gBACzB,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,mCAAmC;gBAChD,SAAS,EAAE,IAAI;gBACf,eAAe,EAAE,IAAI;gBACrB,WAAW,EAAE,IAAI,CAAC,EAAE;aACrB,EACD;gBACE,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,mBAAmB;gBAC/B,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,gBAAgB;gBAC5B,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,4BAA4B;gBACzC,SAAS,EAAE,IAAI;gBACf,eAAe,EAAE,KAAK;gBACtB,WAAW,EAAE,IAAI,CAAC,EAAE;aACrB,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CACX;gBACE,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,iCAAiC;gBAC7C,QAAQ,EAAE,SAAS;gBACnB,UAAU,EAAE,kBAAkB;gBAC9B,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,8BAA8B;gBAC3C,SAAS,EAAE,IAAI;gBACf,eAAe,EAAE,IAAI;gBACrB,WAAW,EAAE,IAAI,CAAC,EAAE;aACrB,EACD;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,kBAAkB;gBAC9B,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,gBAAgB;gBAC5B,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,8BAA8B;gBAC3C,SAAS,EAAE,IAAI;gBACf,eAAe,EAAE,KAAK;gBACtB,WAAW,EAAE,IAAI,CAAC,EAAE;aACrB,CACF,CAAC;QACJ,CAAC;QAED,6CAA6C;QAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;QAC/C,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,eAAe;YACrB,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,2BAA2B;YACvF,QAAQ,EAAE,aAAa;YACvB,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;YACxC,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC,CAAC,qCAAqC;YAC5G,SAAS,EAAE,IAAI;YACf,eAAe,EAAE,KAAK;YACtB,WAAW,EAAE,IAAI,CAAC,EAAE;SACrB,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,WAAmB;QAC/C,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,WAAmB;QAC9C,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;CACF;AAhOD,sCAgOC"}
@@ -0,0 +1,14 @@
1
+ import { EcosystemAdapter, SupportedLanguage, PackageDependency, ProjectCommand, WorkspaceMember } from '../types.js';
2
+ export declare class RubyAdapter implements EcosystemAdapter {
3
+ readonly id = "bundler";
4
+ readonly displayName = "Ruby (Bundler / RubyGems)";
5
+ readonly supportedLanguages: SupportedLanguage[];
6
+ readonly manifestFiles: string[];
7
+ readonly lockFiles: string[];
8
+ detect(projectRoot: string): Promise<boolean>;
9
+ extractDependencies(projectRoot: string): Promise<PackageDependency[]>;
10
+ extractCommands(projectRoot: string): Promise<ProjectCommand[]>;
11
+ detectWorkspaces(projectRoot: string): Promise<WorkspaceMember[]>;
12
+ suggestCommands(projectRoot: string): Promise<ProjectCommand[]>;
13
+ }
14
+ //# sourceMappingURL=ruby.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruby.d.ts","sourceRoot":"","sources":["../../src/adapters/ruby.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,qBAAa,WAAY,YAAW,gBAAgB;IAClD,SAAgB,EAAE,aAAa;IAC/B,SAAgB,WAAW,+BAA+B;IAC1D,SAAgB,kBAAkB,EAAE,iBAAiB,EAAE,CAAY;IACnE,SAAgB,aAAa,WAA4B;IACzD,SAAgB,SAAS,WAAoB;IAEhC,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS7C,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA8BtE,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA2B/D,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAIjE,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAG7E"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RubyAdapter = void 0;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ class RubyAdapter {
10
+ id = 'bundler';
11
+ displayName = 'Ruby (Bundler / RubyGems)';
12
+ supportedLanguages = ['ruby'];
13
+ manifestFiles = ['Gemfile', '*.gemspec'];
14
+ lockFiles = ['Gemfile.lock'];
15
+ async detect(projectRoot) {
16
+ try {
17
+ await promises_1.default.access(node_path_1.default.join(projectRoot, 'Gemfile'));
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ async extractDependencies(projectRoot) {
25
+ const deps = [];
26
+ const gemfilePath = node_path_1.default.join(projectRoot, 'Gemfile');
27
+ try {
28
+ const content = await promises_1.default.readFile(gemfilePath, 'utf8');
29
+ const lines = content.split('\n');
30
+ for (const line of lines) {
31
+ const trimmed = line.trim();
32
+ if (trimmed.startsWith('gem ')) {
33
+ const match = trimmed.match(/^gem\s+['"]([^'"]+)['"](?:\s*,\s*['"]([^'"]+)['"])?/);
34
+ if (match) {
35
+ deps.push({
36
+ name: match[1],
37
+ declaredVersion: match[2] || 'latest',
38
+ versionConstraint: match[2] || 'latest',
39
+ dependencyType: 'production',
40
+ isDirect: true,
41
+ isOptional: false,
42
+ manifestPath: 'Gemfile',
43
+ registry: 'rubygems.org',
44
+ });
45
+ }
46
+ }
47
+ }
48
+ }
49
+ catch { }
50
+ return deps;
51
+ }
52
+ async extractCommands(projectRoot) {
53
+ return [
54
+ {
55
+ name: 'bundle-install',
56
+ rawCommand: 'bundle install',
57
+ category: 'install',
58
+ sourceFile: 'Gemfile',
59
+ workingDir: '.',
60
+ description: 'Install dependencies with Bundler',
61
+ safeToRun: true,
62
+ requiresNetwork: true,
63
+ ecosystemId: this.id,
64
+ },
65
+ {
66
+ name: 'bundle-test',
67
+ rawCommand: 'bundle exec rspec',
68
+ category: 'test',
69
+ sourceFile: 'Gemfile',
70
+ workingDir: '.',
71
+ description: 'Run RSpec test suite',
72
+ safeToRun: true,
73
+ requiresNetwork: false,
74
+ ecosystemId: this.id,
75
+ },
76
+ ];
77
+ }
78
+ async detectWorkspaces(projectRoot) {
79
+ return [];
80
+ }
81
+ async suggestCommands(projectRoot) {
82
+ return this.extractCommands(projectRoot);
83
+ }
84
+ }
85
+ exports.RubyAdapter = RubyAdapter;
86
+ //# sourceMappingURL=ruby.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruby.js","sourceRoot":"","sources":["../../src/adapters/ruby.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAkC;AAClC,0DAA6B;AAS7B,MAAa,WAAW;IACN,EAAE,GAAG,SAAS,CAAC;IACf,WAAW,GAAG,2BAA2B,CAAC;IAC1C,kBAAkB,GAAwB,CAAC,MAAM,CAAC,CAAC;IACnD,aAAa,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzC,SAAS,GAAG,CAAC,cAAc,CAAC,CAAC;IAEtC,KAAK,CAAC,MAAM,CAAC,WAAmB;QACrC,IAAI,CAAC;YACH,MAAM,kBAAE,CAAC,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,WAAmB;QAClD,MAAM,IAAI,GAAwB,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;oBACnF,IAAI,KAAK,EAAE,CAAC;wBACV,IAAI,CAAC,IAAI,CAAC;4BACR,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;4BACd,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ;4BACrC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ;4BACvC,cAAc,EAAE,YAAY;4BAC5B,QAAQ,EAAE,IAAI;4BACd,UAAU,EAAE,KAAK;4BACjB,YAAY,EAAE,SAAS;4BACvB,QAAQ,EAAE,cAAc;yBACzB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,WAAmB;QAC9C,OAAO;YACL;gBACE,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE,gBAAgB;gBAC5B,QAAQ,EAAE,SAAS;gBACnB,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,mCAAmC;gBAChD,SAAS,EAAE,IAAI;gBACf,eAAe,EAAE,IAAI;gBACrB,WAAW,EAAE,IAAI,CAAC,EAAE;aACrB;YACD;gBACE,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,mBAAmB;gBAC/B,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,sBAAsB;gBACnC,SAAS,EAAE,IAAI;gBACf,eAAe,EAAE,KAAK;gBACtB,WAAW,EAAE,IAAI,CAAC,EAAE;aACrB;SACF,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,WAAmB;QAC/C,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,WAAmB;QAC9C,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;CACF;AAhFD,kCAgFC"}
@@ -0,0 +1,14 @@
1
+ import { EcosystemAdapter, SupportedLanguage, PackageDependency, ProjectCommand, WorkspaceMember } from '../types.js';
2
+ export declare class RustAdapter implements EcosystemAdapter {
3
+ readonly id = "cargo";
4
+ readonly displayName = "Rust (Cargo / crates.io)";
5
+ readonly supportedLanguages: SupportedLanguage[];
6
+ readonly manifestFiles: string[];
7
+ readonly lockFiles: string[];
8
+ detect(projectRoot: string): Promise<boolean>;
9
+ extractDependencies(projectRoot: string): Promise<PackageDependency[]>;
10
+ extractCommands(projectRoot: string): Promise<ProjectCommand[]>;
11
+ detectWorkspaces(projectRoot: string): Promise<WorkspaceMember[]>;
12
+ suggestCommands(projectRoot: string): Promise<ProjectCommand[]>;
13
+ }
14
+ //# sourceMappingURL=rust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust.d.ts","sourceRoot":"","sources":["../../src/adapters/rust.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,qBAAa,WAAY,YAAW,gBAAgB;IAClD,SAAgB,EAAE,WAAW;IAC7B,SAAgB,WAAW,8BAA8B;IACzD,SAAgB,kBAAkB,EAAE,iBAAiB,EAAE,CAAY;IACnE,SAAgB,aAAa,WAA2D;IACxF,SAAgB,SAAS,WAAkB;IAE9B,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS7C,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA6DtE,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA4D/D,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAyBjE,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAG7E"}