cc-recommender 0.4.0 → 0.5.0

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 (37) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/services/analyzer/parsers/build-gradle.parser.d.ts +12 -0
  3. package/dist/services/analyzer/parsers/build-gradle.parser.d.ts.map +1 -0
  4. package/dist/services/analyzer/parsers/build-gradle.parser.js +77 -0
  5. package/dist/services/analyzer/parsers/build-gradle.parser.js.map +1 -0
  6. package/dist/services/analyzer/parsers/cargo-toml.parser.d.ts +11 -0
  7. package/dist/services/analyzer/parsers/cargo-toml.parser.d.ts.map +1 -0
  8. package/dist/services/analyzer/parsers/cargo-toml.parser.js +56 -0
  9. package/dist/services/analyzer/parsers/cargo-toml.parser.js.map +1 -0
  10. package/dist/services/analyzer/parsers/composer-json.parser.d.ts +11 -0
  11. package/dist/services/analyzer/parsers/composer-json.parser.d.ts.map +1 -0
  12. package/dist/services/analyzer/parsers/composer-json.parser.js +52 -0
  13. package/dist/services/analyzer/parsers/composer-json.parser.js.map +1 -0
  14. package/dist/services/analyzer/parsers/docker-compose.parser.d.ts +11 -0
  15. package/dist/services/analyzer/parsers/docker-compose.parser.d.ts.map +1 -0
  16. package/dist/services/analyzer/parsers/docker-compose.parser.js +81 -0
  17. package/dist/services/analyzer/parsers/docker-compose.parser.js.map +1 -0
  18. package/dist/services/analyzer/parsers/dotenv.parser.d.ts +13 -0
  19. package/dist/services/analyzer/parsers/dotenv.parser.d.ts.map +1 -0
  20. package/dist/services/analyzer/parsers/dotenv.parser.js +77 -0
  21. package/dist/services/analyzer/parsers/dotenv.parser.js.map +1 -0
  22. package/dist/services/analyzer/parsers/gemfile.parser.d.ts +11 -0
  23. package/dist/services/analyzer/parsers/gemfile.parser.d.ts.map +1 -0
  24. package/dist/services/analyzer/parsers/gemfile.parser.js +62 -0
  25. package/dist/services/analyzer/parsers/gemfile.parser.js.map +1 -0
  26. package/dist/services/analyzer/parsers/pom-xml.parser.d.ts +11 -0
  27. package/dist/services/analyzer/parsers/pom-xml.parser.d.ts.map +1 -0
  28. package/dist/services/analyzer/parsers/pom-xml.parser.js +66 -0
  29. package/dist/services/analyzer/parsers/pom-xml.parser.js.map +1 -0
  30. package/dist/services/analyzer/parsers/pyproject-toml.parser.d.ts +12 -0
  31. package/dist/services/analyzer/parsers/pyproject-toml.parser.d.ts.map +1 -0
  32. package/dist/services/analyzer/parsers/pyproject-toml.parser.js +108 -0
  33. package/dist/services/analyzer/parsers/pyproject-toml.parser.js.map +1 -0
  34. package/dist/services/analyzer/project-analyzer.service.d.ts.map +1 -1
  35. package/dist/services/analyzer/project-analyzer.service.js +16 -0
  36. package/dist/services/analyzer/project-analyzer.service.js.map +1 -1
  37. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,20 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.5.0](https://github.com/yuji0809/cc-recommender/compare/v0.4.1...v0.5.0) (2026-01-31)
9
+
10
+
11
+ ### Features
12
+
13
+ * add support for multiple new project file parsers ([93cb69f](https://github.com/yuji0809/cc-recommender/commit/93cb69f34c5c64763afcbf873c37645f34c2e8fc))
14
+
15
+ ## [0.4.1](https://github.com/yuji0809/cc-recommender/compare/v0.4.0...v0.4.1) (2026-01-30)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * reorganize services and update fetcher structure ([1a00357](https://github.com/yuji0809/cc-recommender/commit/1a0035791606aead2482d9acba68a8bc7f4a2243))
21
+
8
22
  ## [0.4.0](https://github.com/yuji0809/cc-recommender/compare/v0.3.0...v0.4.0) (2026-01-30)
9
23
 
10
24
 
@@ -0,0 +1,12 @@
1
+ /**
2
+ * build.gradle Parser
3
+ *
4
+ * Parses Gradle build.gradle files for dependencies and frameworks
5
+ * Supports both Groovy and Kotlin DSL
6
+ */
7
+ import type { ProjectInfo } from "../../../types/service-types.js";
8
+ /**
9
+ * Parse build.gradle and extract dependencies and frameworks
10
+ */
11
+ export declare function parseBuildGradle(projectPath: string, info: ProjectInfo): Promise<void>;
12
+ //# sourceMappingURL=build-gradle.parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-gradle.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/build-gradle.parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAkCnE;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC5F"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * build.gradle Parser
3
+ *
4
+ * Parses Gradle build.gradle files for dependencies and frameworks
5
+ * Supports both Groovy and Kotlin DSL
6
+ */
7
+ import { readFile } from "node:fs/promises";
8
+ import { join } from "node:path";
9
+ /** Framework detection mappings for Java/Kotlin/Gradle dependencies */
10
+ const FRAMEWORK_MAPPINGS = {
11
+ "spring-boot": "spring-boot",
12
+ "org.springframework.boot": "spring-boot",
13
+ "spring-framework": "spring",
14
+ "org.springframework": "spring",
15
+ ktor: "ktor",
16
+ "io.ktor": "ktor",
17
+ hibernate: "hibernate",
18
+ junit: "junit",
19
+ "org.junit": "junit",
20
+ mockito: "mockito",
21
+ mockk: "mockk",
22
+ lombok: "lombok",
23
+ guava: "guava",
24
+ "com.google.guava": "guava",
25
+ jackson: "jackson",
26
+ "com.fasterxml.jackson": "jackson",
27
+ postgresql: "postgresql",
28
+ mysql: "mysql",
29
+ h2: "h2",
30
+ kafka: "kafka",
31
+ "org.apache.kafka": "kafka",
32
+ redis: "redis",
33
+ jedis: "redis",
34
+ lettuce: "redis",
35
+ mongodb: "mongodb",
36
+ "org.mongodb": "mongodb",
37
+ exposed: "exposed",
38
+ "org.jetbrains.exposed": "exposed",
39
+ };
40
+ /**
41
+ * Parse build.gradle and extract dependencies and frameworks
42
+ */
43
+ export async function parseBuildGradle(projectPath, info) {
44
+ const gradleFiles = ["build.gradle", "build.gradle.kts"];
45
+ for (const gradleFile of gradleFiles) {
46
+ try {
47
+ const gradlePath = join(projectPath, gradleFile);
48
+ const content = await readFile(gradlePath, "utf-8");
49
+ // Extract dependencies from various declaration styles
50
+ // Supports: implementation("..."), implementation '...', compile("..."), etc.
51
+ const dependencyPatterns = [
52
+ /(?:implementation|api|compile|testImplementation|runtimeOnly)\s*\(?['"]([^'"]+)['"]\)?/g,
53
+ /(?:implementation|api|compile|testImplementation|runtimeOnly)\s*\([^)]*group\s*[:=]\s*['"]([^'"]+)['"][^)]*\)/g,
54
+ ];
55
+ for (const pattern of dependencyPatterns) {
56
+ const matches = content.matchAll(pattern);
57
+ for (const match of matches) {
58
+ const dependency = match[1].toLowerCase();
59
+ info.dependencies.push(dependency);
60
+ // Check if this dependency matches known frameworks
61
+ for (const [frameworkPattern, framework] of Object.entries(FRAMEWORK_MAPPINGS)) {
62
+ if (dependency.includes(frameworkPattern)) {
63
+ info.frameworks.push(framework);
64
+ break;
65
+ }
66
+ }
67
+ }
68
+ }
69
+ // Only parse the first found file
70
+ break;
71
+ }
72
+ catch {
73
+ // File doesn't exist, continue to next
74
+ }
75
+ }
76
+ }
77
+ //# sourceMappingURL=build-gradle.parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-gradle.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/build-gradle.parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,uEAAuE;AACvE,MAAM,kBAAkB,GAA2B;IACjD,aAAa,EAAE,aAAa;IAC5B,0BAA0B,EAAE,aAAa;IACzC,kBAAkB,EAAE,QAAQ;IAC5B,qBAAqB,EAAE,QAAQ;IAC/B,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,OAAO;IACpB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,kBAAkB,EAAE,OAAO;IAC3B,OAAO,EAAE,SAAS;IAClB,uBAAuB,EAAE,SAAS;IAClC,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,OAAO;IACd,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,OAAO;IACd,kBAAkB,EAAE,OAAO;IAC3B,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,SAAS;IAClB,aAAa,EAAE,SAAS;IACxB,OAAO,EAAE,SAAS;IAClB,uBAAuB,EAAE,SAAS;CACnC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB,EAAE,IAAiB;IAC3E,MAAM,WAAW,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAEzD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAEpD,uDAAuD;YACvD,8EAA8E;YAC9E,MAAM,kBAAkB,GAAG;gBACzB,yFAAyF;gBACzF,gHAAgH;aACjH,CAAC;YAEF,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAEnC,oDAAoD;oBACpD,KAAK,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;wBAC/E,IAAI,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;4BAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BAChC,MAAM;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,kCAAkC;YAClC,MAAM;QACR,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Cargo.toml Parser
3
+ *
4
+ * Parses Rust Cargo.toml files for dependencies and frameworks
5
+ */
6
+ import type { ProjectInfo } from "../../../types/service-types.js";
7
+ /**
8
+ * Parse Cargo.toml and extract dependencies and frameworks
9
+ */
10
+ export declare function parseCargoToml(projectPath: string, info: ProjectInfo): Promise<void>;
11
+ //# sourceMappingURL=cargo-toml.parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cargo-toml.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/cargo-toml.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAmBnE;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B1F"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Cargo.toml Parser
3
+ *
4
+ * Parses Rust Cargo.toml files for dependencies and frameworks
5
+ */
6
+ import { readFile } from "node:fs/promises";
7
+ import { join } from "node:path";
8
+ /** Framework detection mappings for Rust dependencies */
9
+ const FRAMEWORK_MAPPINGS = {
10
+ axum: "axum",
11
+ "actix-web": "actix-web",
12
+ rocket: "rocket",
13
+ tokio: "tokio",
14
+ "async-std": "async-std",
15
+ serde: "serde",
16
+ sqlx: "sqlx",
17
+ diesel: "diesel",
18
+ "sea-orm": "sea-orm",
19
+ tauri: "tauri",
20
+ leptos: "leptos",
21
+ yew: "yew",
22
+ bevy: "bevy",
23
+ };
24
+ /**
25
+ * Parse Cargo.toml and extract dependencies and frameworks
26
+ */
27
+ export async function parseCargoToml(projectPath, info) {
28
+ try {
29
+ const cargoPath = join(projectPath, "Cargo.toml");
30
+ const content = await readFile(cargoPath, "utf-8");
31
+ // Extract dependencies section
32
+ const depsMatch = content.match(/\[dependencies\]([\s\S]*?)(?=\n\[|$)/);
33
+ if (depsMatch) {
34
+ const deps = depsMatch[1]
35
+ .split("\n")
36
+ .map((line) => line.trim())
37
+ .filter((line) => line && !line.startsWith("#"))
38
+ .map((line) => {
39
+ const match = line.match(/^([a-zA-Z0-9_-]+)/);
40
+ return match ? match[1].toLowerCase() : null;
41
+ })
42
+ .filter((dep) => dep !== null);
43
+ info.dependencies.push(...deps);
44
+ // Detect Rust frameworks
45
+ for (const [dep, framework] of Object.entries(FRAMEWORK_MAPPINGS)) {
46
+ if (deps.includes(dep)) {
47
+ info.frameworks.push(framework);
48
+ }
49
+ }
50
+ }
51
+ }
52
+ catch {
53
+ // No Cargo.toml
54
+ }
55
+ }
56
+ //# sourceMappingURL=cargo-toml.parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cargo-toml.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/cargo-toml.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,yDAAyD;AACzD,MAAM,kBAAkB,GAA2B;IACjD,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,WAAW;IACxB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,WAAW;IACxB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,IAAiB;IACzE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEnD,+BAA+B;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACxE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;iBACtB,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;iBAC/C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/C,CAAC,CAAC;iBACD,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;YAEhD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAEhC,yBAAyB;YACzB,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAClE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Composer.json Parser
3
+ *
4
+ * Parses PHP composer.json files for dependencies and frameworks
5
+ */
6
+ import type { ProjectInfo } from "../../../types/service-types.js";
7
+ /**
8
+ * Parse composer.json and extract dependencies and frameworks
9
+ */
10
+ export declare function parseComposerJson(projectPath: string, info: ProjectInfo): Promise<void>;
11
+ //# sourceMappingURL=composer-json.parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-json.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/composer-json.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAkBnE;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B7F"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Composer.json Parser
3
+ *
4
+ * Parses PHP composer.json files for dependencies and frameworks
5
+ */
6
+ import { readFile } from "node:fs/promises";
7
+ import { join } from "node:path";
8
+ /** Framework detection mappings for PHP dependencies */
9
+ const FRAMEWORK_MAPPINGS = {
10
+ "laravel/framework": "laravel",
11
+ "symfony/symfony": "symfony",
12
+ "symfony/framework-bundle": "symfony",
13
+ "codeigniter4/framework": "codeigniter",
14
+ "cakephp/cakephp": "cakephp",
15
+ "yiisoft/yii2": "yii",
16
+ "slim/slim": "slim",
17
+ wordpress: "wordpress",
18
+ drupal: "drupal",
19
+ "guzzlehttp/guzzle": "guzzle",
20
+ "phpunit/phpunit": "phpunit",
21
+ "doctrine/orm": "doctrine",
22
+ };
23
+ /**
24
+ * Parse composer.json and extract dependencies and frameworks
25
+ */
26
+ export async function parseComposerJson(projectPath, info) {
27
+ try {
28
+ const composerPath = join(projectPath, "composer.json");
29
+ const content = await readFile(composerPath, "utf-8");
30
+ const composer = JSON.parse(content);
31
+ // Add description if available
32
+ if (composer.description) {
33
+ info.description = composer.description;
34
+ }
35
+ // Collect dependencies
36
+ const allDeps = [
37
+ ...Object.keys(composer.require || {}),
38
+ ...Object.keys(composer["require-dev"] || {}),
39
+ ];
40
+ info.dependencies.push(...allDeps);
41
+ // Detect frameworks from dependencies
42
+ for (const [dep, framework] of Object.entries(FRAMEWORK_MAPPINGS)) {
43
+ if (allDeps.includes(dep)) {
44
+ info.frameworks.push(framework);
45
+ }
46
+ }
47
+ }
48
+ catch {
49
+ // No composer.json or parse error
50
+ }
51
+ }
52
+ //# sourceMappingURL=composer-json.parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-json.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/composer-json.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,wDAAwD;AACxD,MAAM,kBAAkB,GAA2B;IACjD,mBAAmB,EAAE,SAAS;IAC9B,iBAAiB,EAAE,SAAS;IAC5B,0BAA0B,EAAE,SAAS;IACrC,wBAAwB,EAAE,aAAa;IACvC,iBAAiB,EAAE,SAAS;IAC5B,cAAc,EAAE,KAAK;IACrB,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,mBAAmB,EAAE,QAAQ;IAC7B,iBAAiB,EAAE,SAAS;IAC5B,cAAc,EAAE,UAAU;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB,EAAE,IAAiB;IAC5E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAErC,+BAA+B;QAC/B,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;QAC1C,CAAC;QAED,uBAAuB;QACvB,MAAM,OAAO,GAAG;YACd,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;YACtC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;SAC9C,CAAC;QAEF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAEnC,sCAAsC;QACtC,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAClE,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Docker Compose Parser
3
+ *
4
+ * Parses docker-compose.yml files to detect infrastructure services
5
+ */
6
+ import type { ProjectInfo } from "../../../types/service-types.js";
7
+ /**
8
+ * Parse docker-compose.yml and detect infrastructure services
9
+ */
10
+ export declare function parseDockerCompose(projectPath: string, info: ProjectInfo): Promise<void>;
11
+ //# sourceMappingURL=docker-compose.parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-compose.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/docker-compose.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AA+BnE;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD9F"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Docker Compose Parser
3
+ *
4
+ * Parses docker-compose.yml files to detect infrastructure services
5
+ */
6
+ import { readFile } from "node:fs/promises";
7
+ import { join } from "node:path";
8
+ /** Service detection mappings for Docker Compose services */
9
+ const SERVICE_MAPPINGS = {
10
+ postgres: "postgresql",
11
+ postgresql: "postgresql",
12
+ mysql: "mysql",
13
+ mariadb: "mysql",
14
+ redis: "redis",
15
+ mongodb: "mongodb",
16
+ mongo: "mongodb",
17
+ elasticsearch: "elasticsearch",
18
+ nginx: "nginx",
19
+ apache: "apache",
20
+ rabbitmq: "rabbitmq",
21
+ kafka: "kafka",
22
+ memcached: "memcached",
23
+ minio: "minio",
24
+ grafana: "grafana",
25
+ prometheus: "prometheus",
26
+ jaeger: "jaeger",
27
+ zipkin: "zipkin",
28
+ consul: "consul",
29
+ vault: "vault",
30
+ traefik: "traefik",
31
+ caddy: "caddy",
32
+ mailhog: "mailhog",
33
+ localstack: "aws",
34
+ azurite: "azure",
35
+ };
36
+ /**
37
+ * Parse docker-compose.yml and detect infrastructure services
38
+ */
39
+ export async function parseDockerCompose(projectPath, info) {
40
+ const composeFiles = ["docker-compose.yml", "docker-compose.yaml", "compose.yml", "compose.yaml"];
41
+ for (const composeFile of composeFiles) {
42
+ try {
43
+ const composePath = join(projectPath, composeFile);
44
+ const content = await readFile(composePath, "utf-8");
45
+ // Extract service names from docker-compose
46
+ // Look for "image:" lines to detect services
47
+ const imageMatches = content.matchAll(/^\s*image:\s*([^\s:]+)/gm);
48
+ for (const match of imageMatches) {
49
+ const imageName = match[1].toLowerCase();
50
+ // Check if image name matches known services
51
+ for (const [pattern, service] of Object.entries(SERVICE_MAPPINGS)) {
52
+ if (imageName.includes(pattern)) {
53
+ info.frameworks.push(service);
54
+ break;
55
+ }
56
+ }
57
+ }
58
+ // Also check service names directly
59
+ const serviceMatches = content.matchAll(/^\s{2,4}([a-z0-9_-]+):/gm);
60
+ for (const match of serviceMatches) {
61
+ const serviceName = match[1].toLowerCase();
62
+ // Skip common docker-compose keys
63
+ if (["services", "networks", "volumes", "version"].includes(serviceName)) {
64
+ continue;
65
+ }
66
+ // Check if service name matches known services
67
+ if (SERVICE_MAPPINGS[serviceName]) {
68
+ info.frameworks.push(SERVICE_MAPPINGS[serviceName]);
69
+ }
70
+ }
71
+ // If we found a docker-compose file, add docker framework
72
+ info.frameworks.push("docker");
73
+ // Only parse the first found file
74
+ break;
75
+ }
76
+ catch {
77
+ // File doesn't exist, continue to next
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=docker-compose.parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-compose.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/docker-compose.parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * .env.example Parser
3
+ *
4
+ * Parses .env.example and similar template files to detect external services and APIs
5
+ * Note: Only reads template files (.env.example, .env.template, .env.sample) for security
6
+ */
7
+ import type { ProjectInfo } from "../../../types/service-types.js";
8
+ /**
9
+ * Parse .env template files and detect external services
10
+ * Only reads template files for security (no actual .env files with secrets)
11
+ */
12
+ export declare function parseDotenv(projectPath: string, info: ProjectInfo): Promise<void>;
13
+ //# sourceMappingURL=dotenv.parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotenv.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/dotenv.parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAqCnE;;;GAGG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCvF"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * .env.example Parser
3
+ *
4
+ * Parses .env.example and similar template files to detect external services and APIs
5
+ * Note: Only reads template files (.env.example, .env.template, .env.sample) for security
6
+ */
7
+ import { readFile } from "node:fs/promises";
8
+ import { join } from "node:path";
9
+ /** Service detection mappings based on environment variable prefixes/patterns */
10
+ const SERVICE_PATTERNS = [
11
+ { pattern: /^SUPABASE_/i, service: "supabase" },
12
+ { pattern: /^OPENAI_/i, service: "openai" },
13
+ { pattern: /^ANTHROPIC_/i, service: "anthropic" },
14
+ { pattern: /^AWS_/i, service: "aws" },
15
+ { pattern: /^AZURE_/i, service: "azure" },
16
+ { pattern: /^GCP_/i, service: "gcp" },
17
+ { pattern: /^GOOGLE_/i, service: "google-cloud" },
18
+ { pattern: /^STRIPE_/i, service: "stripe" },
19
+ { pattern: /^TWILIO_/i, service: "twilio" },
20
+ { pattern: /^SENDGRID_/i, service: "sendgrid" },
21
+ { pattern: /^FIREBASE_/i, service: "firebase" },
22
+ { pattern: /^VERCEL_/i, service: "vercel" },
23
+ { pattern: /^NETLIFY_/i, service: "netlify" },
24
+ { pattern: /^CLOUDFLARE_/i, service: "cloudflare" },
25
+ { pattern: /^GITHUB_/i, service: "github" },
26
+ { pattern: /^GITLAB_/i, service: "gitlab" },
27
+ { pattern: /^SLACK_/i, service: "slack" },
28
+ { pattern: /^DISCORD_/i, service: "discord" },
29
+ { pattern: /^DATABASE_URL/i, service: "database" },
30
+ { pattern: /^POSTGRES/i, service: "postgresql" },
31
+ { pattern: /^MYSQL/i, service: "mysql" },
32
+ { pattern: /^MONGODB/i, service: "mongodb" },
33
+ { pattern: /^REDIS_/i, service: "redis" },
34
+ { pattern: /^ELASTICSEARCH_/i, service: "elasticsearch" },
35
+ { pattern: /^ALGOLIA_/i, service: "algolia" },
36
+ { pattern: /^SENTRY_/i, service: "sentry" },
37
+ { pattern: /^DATADOG_/i, service: "datadog" },
38
+ { pattern: /^NEW_RELIC_/i, service: "newrelic" },
39
+ { pattern: /^MAILGUN_/i, service: "mailgun" },
40
+ { pattern: /^POSTMARK_/i, service: "postmark" },
41
+ { pattern: /^RESEND_/i, service: "resend" },
42
+ ];
43
+ /**
44
+ * Parse .env template files and detect external services
45
+ * Only reads template files for security (no actual .env files with secrets)
46
+ */
47
+ export async function parseDotenv(projectPath, info) {
48
+ // Only check template files that don't contain secrets
49
+ const envFiles = [".env.example", ".env.template", ".env.sample", ".env.dist"];
50
+ for (const envFile of envFiles) {
51
+ try {
52
+ const envPath = join(projectPath, envFile);
53
+ const content = await readFile(envPath, "utf-8");
54
+ const lines = content
55
+ .split("\n")
56
+ .map((line) => line.trim())
57
+ .filter((line) => line && !line.startsWith("#"));
58
+ for (const line of lines) {
59
+ const match = line.match(/^([A-Z_][A-Z0-9_]*)/);
60
+ if (match) {
61
+ const envVar = match[1];
62
+ // Check against service patterns
63
+ for (const { pattern, service } of SERVICE_PATTERNS) {
64
+ if (pattern.test(envVar)) {
65
+ info.frameworks.push(service);
66
+ break;
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ catch {
73
+ // File doesn't exist, continue to next
74
+ }
75
+ }
76
+ }
77
+ //# sourceMappingURL=dotenv.parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotenv.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/dotenv.parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Gemfile Parser
3
+ *
4
+ * Parses Ruby Gemfile for dependencies and frameworks
5
+ */
6
+ import type { ProjectInfo } from "../../../types/service-types.js";
7
+ /**
8
+ * Parse Gemfile and extract dependencies and frameworks
9
+ */
10
+ export declare function parseGemfile(projectPath: string, info: ProjectInfo): Promise<void>;
11
+ //# sourceMappingURL=gemfile.parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemfile.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/gemfile.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AA0BnE;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BxF"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Gemfile Parser
3
+ *
4
+ * Parses Ruby Gemfile for dependencies and frameworks
5
+ */
6
+ import { readFile } from "node:fs/promises";
7
+ import { join } from "node:path";
8
+ /** Framework detection mappings for Ruby gems */
9
+ const FRAMEWORK_MAPPINGS = {
10
+ rails: "rails",
11
+ sinatra: "sinatra",
12
+ hanami: "hanami",
13
+ padrino: "padrino",
14
+ grape: "grape",
15
+ roda: "roda",
16
+ rspec: "rspec",
17
+ minitest: "minitest",
18
+ capybara: "capybara",
19
+ devise: "devise",
20
+ activerecord: "activerecord",
21
+ sequel: "sequel",
22
+ sidekiq: "sidekiq",
23
+ puma: "puma",
24
+ unicorn: "unicorn",
25
+ pg: "postgresql",
26
+ mysql2: "mysql",
27
+ redis: "redis",
28
+ mongoid: "mongodb",
29
+ elasticsearch: "elasticsearch",
30
+ };
31
+ /**
32
+ * Parse Gemfile and extract dependencies and frameworks
33
+ */
34
+ export async function parseGemfile(projectPath, info) {
35
+ try {
36
+ const gemfilePath = join(projectPath, "Gemfile");
37
+ const content = await readFile(gemfilePath, "utf-8");
38
+ const deps = content
39
+ .split("\n")
40
+ .map((line) => line.trim())
41
+ .filter((line) => line.startsWith("gem ") && !line.startsWith("#"))
42
+ .map((line) => {
43
+ // Extract gem name from: gem 'name' or gem "name"
44
+ const match = line.match(/gem\s+['"]([^'"]+)['"]/);
45
+ return match ? match[1].toLowerCase() : null;
46
+ })
47
+ .filter((dep) => dep !== null);
48
+ info.dependencies.push(...deps);
49
+ // Detect Ruby frameworks
50
+ for (const [dep, framework] of Object.entries(FRAMEWORK_MAPPINGS)) {
51
+ // Check exact match or if any dependency starts with the gem name
52
+ // (e.g., "rspec-rails" should match "rspec")
53
+ if (deps.includes(dep) || deps.some((d) => d.startsWith(`${dep}-`))) {
54
+ info.frameworks.push(framework);
55
+ }
56
+ }
57
+ }
58
+ catch {
59
+ // No Gemfile
60
+ }
61
+ }
62
+ //# sourceMappingURL=gemfile.parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemfile.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/gemfile.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,iDAAiD;AACjD,MAAM,kBAAkB,GAA2B;IACjD,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,YAAY,EAAE,cAAc;IAC5B,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,EAAE,EAAE,YAAY;IAChB,MAAM,EAAE,OAAO;IACf,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,aAAa,EAAE,eAAe;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB,EAAE,IAAiB;IACvE,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAErD,MAAM,IAAI,GAAG,OAAO;aACjB,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aAClE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,kDAAkD;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACnD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;QAEhD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAEhC,yBAAyB;QACzB,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAClE,kEAAkE;YAClE,6CAA6C;YAC7C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;gBACpE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,aAAa;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * pom.xml Parser
3
+ *
4
+ * Parses Maven pom.xml files for dependencies and frameworks
5
+ */
6
+ import type { ProjectInfo } from "../../../types/service-types.js";
7
+ /**
8
+ * Parse pom.xml and extract dependencies and frameworks
9
+ */
10
+ export declare function parsePomXml(projectPath: string, info: ProjectInfo): Promise<void>;
11
+ //# sourceMappingURL=pom-xml.parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pom-xml.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/pom-xml.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AA+BnE;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BvF"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * pom.xml Parser
3
+ *
4
+ * Parses Maven pom.xml files for dependencies and frameworks
5
+ */
6
+ import { readFile } from "node:fs/promises";
7
+ import { join } from "node:path";
8
+ /** Framework detection mappings for Java/Maven dependencies */
9
+ const FRAMEWORK_MAPPINGS = {
10
+ "spring-boot": "spring-boot",
11
+ "spring-framework": "spring",
12
+ "spring-web": "spring",
13
+ "spring-webmvc": "spring",
14
+ hibernate: "hibernate",
15
+ "hibernate-core": "hibernate",
16
+ junit: "junit",
17
+ "junit-jupiter": "junit",
18
+ mockito: "mockito",
19
+ "mockito-core": "mockito",
20
+ lombok: "lombok",
21
+ guava: "guava",
22
+ jackson: "jackson",
23
+ "jackson-databind": "jackson",
24
+ "postgresql-driver": "postgresql",
25
+ "mysql-connector": "mysql",
26
+ h2: "h2",
27
+ kafka: "kafka",
28
+ "kafka-clients": "kafka",
29
+ "spring-kafka": "kafka",
30
+ redis: "redis",
31
+ jedis: "redis",
32
+ lettuce: "redis",
33
+ mongodb: "mongodb",
34
+ "mongodb-driver": "mongodb",
35
+ };
36
+ /**
37
+ * Parse pom.xml and extract dependencies and frameworks
38
+ */
39
+ export async function parsePomXml(projectPath, info) {
40
+ try {
41
+ const pomPath = join(projectPath, "pom.xml");
42
+ const content = await readFile(pomPath, "utf-8");
43
+ // Extract dependencies from <dependency> tags
44
+ const dependencyPattern = /<dependency>[\s\S]*?<\/dependency>/g;
45
+ const dependencies = content.match(dependencyPattern) || [];
46
+ for (const dep of dependencies) {
47
+ // Extract artifactId
48
+ const artifactMatch = dep.match(/<artifactId>([^<]+)<\/artifactId>/);
49
+ if (artifactMatch) {
50
+ const artifactId = artifactMatch[1].toLowerCase();
51
+ info.dependencies.push(artifactId);
52
+ // Check if this dependency matches known frameworks
53
+ for (const [pattern, framework] of Object.entries(FRAMEWORK_MAPPINGS)) {
54
+ if (artifactId.includes(pattern)) {
55
+ info.frameworks.push(framework);
56
+ break;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ }
62
+ catch {
63
+ // No pom.xml
64
+ }
65
+ }
66
+ //# sourceMappingURL=pom-xml.parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pom-xml.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/pom-xml.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,+DAA+D;AAC/D,MAAM,kBAAkB,GAA2B;IACjD,aAAa,EAAE,aAAa;IAC5B,kBAAkB,EAAE,QAAQ;IAC5B,YAAY,EAAE,QAAQ;IACtB,eAAe,EAAE,QAAQ;IACzB,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,WAAW;IAC7B,KAAK,EAAE,OAAO;IACd,eAAe,EAAE,OAAO;IACxB,OAAO,EAAE,SAAS;IAClB,cAAc,EAAE,SAAS;IACzB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,kBAAkB,EAAE,SAAS;IAC7B,mBAAmB,EAAE,YAAY;IACjC,iBAAiB,EAAE,OAAO;IAC1B,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,OAAO;IACd,eAAe,EAAE,OAAO;IACxB,cAAc,EAAE,OAAO;IACvB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,SAAS;IAClB,gBAAgB,EAAE,SAAS;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,IAAiB;IACtE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEjD,8CAA8C;QAC9C,MAAM,iBAAiB,GAAG,qCAAqC,CAAC;QAChE,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;QAE5D,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,qBAAqB;YACrB,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACrE,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBAClD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAEnC,oDAAoD;gBACpD,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBACtE,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;wBACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBAChC,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,aAAa;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * pyproject.toml Parser
3
+ *
4
+ * Parses Python pyproject.toml files for dependencies and frameworks
5
+ * (Modern Python packaging with Poetry, PDM, Hatch, etc.)
6
+ */
7
+ import type { ProjectInfo } from "../../../types/service-types.js";
8
+ /**
9
+ * Parse pyproject.toml and extract dependencies and frameworks
10
+ */
11
+ export declare function parsePyprojectToml(projectPath: string, info: ProjectInfo): Promise<void>;
12
+ //# sourceMappingURL=pyproject-toml.parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyproject-toml.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/pyproject-toml.parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAuBnE;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+E9F"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * pyproject.toml Parser
3
+ *
4
+ * Parses Python pyproject.toml files for dependencies and frameworks
5
+ * (Modern Python packaging with Poetry, PDM, Hatch, etc.)
6
+ */
7
+ import { readFile } from "node:fs/promises";
8
+ import { join } from "node:path";
9
+ /** Framework detection mappings for Python dependencies */
10
+ const FRAMEWORK_MAPPINGS = {
11
+ django: "django",
12
+ flask: "flask",
13
+ fastapi: "fastapi",
14
+ starlette: "starlette",
15
+ pytorch: "pytorch",
16
+ torch: "pytorch",
17
+ tensorflow: "tensorflow",
18
+ pandas: "pandas",
19
+ numpy: "numpy",
20
+ "scikit-learn": "sklearn",
21
+ sklearn: "sklearn",
22
+ pydantic: "pydantic",
23
+ sqlalchemy: "sqlalchemy",
24
+ celery: "celery",
25
+ pytest: "pytest",
26
+ streamlit: "streamlit",
27
+ gradio: "gradio",
28
+ };
29
+ /**
30
+ * Parse pyproject.toml and extract dependencies and frameworks
31
+ */
32
+ export async function parsePyprojectToml(projectPath, info) {
33
+ try {
34
+ const pyprojectPath = join(projectPath, "pyproject.toml");
35
+ const content = await readFile(pyprojectPath, "utf-8");
36
+ // Extract dependencies from [tool.poetry.dependencies], [project.dependencies], etc.
37
+ const deps = [];
38
+ // Poetry format: [tool.poetry.dependencies]
39
+ const poetryMatch = content.match(/\[tool\.poetry\.dependencies\]([\s\S]*?)(?=\n\[|$)/);
40
+ if (poetryMatch) {
41
+ const poetryDeps = poetryMatch[1]
42
+ .split("\n")
43
+ .map((line) => line.trim())
44
+ .filter((line) => line && !line.startsWith("#") && line !== "python")
45
+ .map((line) => {
46
+ const match = line.match(/^([a-zA-Z0-9_-]+)/);
47
+ return match ? match[1].toLowerCase() : null;
48
+ })
49
+ .filter((dep) => dep !== null);
50
+ deps.push(...poetryDeps);
51
+ }
52
+ // Poetry dev dependencies: [tool.poetry.dev-dependencies]
53
+ const poetryDevMatch = content.match(/\[tool\.poetry\.dev-dependencies\]([\s\S]*?)(?=\n\[|$)/);
54
+ if (poetryDevMatch) {
55
+ const poetryDevDeps = poetryDevMatch[1]
56
+ .split("\n")
57
+ .map((line) => line.trim())
58
+ .filter((line) => line && !line.startsWith("#"))
59
+ .map((line) => {
60
+ const match = line.match(/^([a-zA-Z0-9_-]+)/);
61
+ return match ? match[1].toLowerCase() : null;
62
+ })
63
+ .filter((dep) => dep !== null);
64
+ deps.push(...poetryDevDeps);
65
+ }
66
+ // PEP 621 format: [project.dependencies]
67
+ const projectMatch = content.match(/\[project\.dependencies\]([\s\S]*?)(?=\n\[|$)/);
68
+ if (!projectMatch) {
69
+ // Try inline array format: dependencies = ["package1", "package2"]
70
+ const inlineMatch = content.match(/dependencies\s*=\s*\[([\s\S]*?)\]/);
71
+ if (inlineMatch) {
72
+ const inlineDeps = inlineMatch[1]
73
+ .split(",")
74
+ .map((line) => line.trim())
75
+ .filter((line) => line && !line.startsWith("#"))
76
+ .map((line) => {
77
+ const match = line.match(/['"]([a-zA-Z0-9_-]+)/);
78
+ return match ? match[1].toLowerCase() : null;
79
+ })
80
+ .filter((dep) => dep !== null);
81
+ deps.push(...inlineDeps);
82
+ }
83
+ }
84
+ else {
85
+ const projectDeps = projectMatch[1]
86
+ .split("\n")
87
+ .map((line) => line.trim())
88
+ .filter((line) => line && !line.startsWith("#"))
89
+ .map((line) => {
90
+ const match = line.match(/^['"]?([a-zA-Z0-9_-]+)/);
91
+ return match ? match[1].toLowerCase() : null;
92
+ })
93
+ .filter((dep) => dep !== null);
94
+ deps.push(...projectDeps);
95
+ }
96
+ info.dependencies.push(...deps);
97
+ // Detect Python frameworks
98
+ for (const [dep, framework] of Object.entries(FRAMEWORK_MAPPINGS)) {
99
+ if (deps.includes(dep)) {
100
+ info.frameworks.push(framework);
101
+ }
102
+ }
103
+ }
104
+ catch {
105
+ // No pyproject.toml
106
+ }
107
+ }
108
+ //# sourceMappingURL=pyproject-toml.parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyproject-toml.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/pyproject-toml.parser.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"project-analyzer.service.d.ts","sourceRoot":"","sources":["../../../src/services/analyzer/project-analyzer.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAKhE;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA2B9E"}
1
+ {"version":3,"file":"project-analyzer.service.d.ts","sourceRoot":"","sources":["../../../src/services/analyzer/project-analyzer.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAahE;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmC9E"}
@@ -7,8 +7,16 @@ import { readdir } from "node:fs/promises";
7
7
  import { extname, join } from "node:path";
8
8
  import { FILE_SCAN_CONFIG, SKIP_DIRECTORIES } from "../../config/constants.js";
9
9
  import { CONFIG_FILE_MAPPINGS, EXTENSION_TO_LANGUAGE } from "../../config/file-mappings.js";
10
+ import { parseBuildGradle } from "./parsers/build-gradle.parser.js";
11
+ import { parseCargoToml } from "./parsers/cargo-toml.parser.js";
12
+ import { parseComposerJson } from "./parsers/composer-json.parser.js";
13
+ import { parseDockerCompose } from "./parsers/docker-compose.parser.js";
14
+ import { parseDotenv } from "./parsers/dotenv.parser.js";
15
+ import { parseGemfile } from "./parsers/gemfile.parser.js";
10
16
  import { parseGoMod } from "./parsers/go-mod.parser.js";
11
17
  import { parsePackageJson } from "./parsers/package-json.parser.js";
18
+ import { parsePomXml } from "./parsers/pom-xml.parser.js";
19
+ import { parsePyprojectToml } from "./parsers/pyproject-toml.parser.js";
12
20
  import { parseRequirementsTxt } from "./parsers/requirements-txt.parser.js";
13
21
  /**
14
22
  * Analyze a project directory and extract information
@@ -27,7 +35,15 @@ export async function analyzeProject(projectPath) {
27
35
  // Parse dependency files
28
36
  await parsePackageJson(projectPath, info);
29
37
  await parseRequirementsTxt(projectPath, info);
38
+ await parsePyprojectToml(projectPath, info);
30
39
  await parseGoMod(projectPath, info);
40
+ await parseCargoToml(projectPath, info);
41
+ await parseComposerJson(projectPath, info);
42
+ await parseGemfile(projectPath, info);
43
+ await parsePomXml(projectPath, info);
44
+ await parseBuildGradle(projectPath, info);
45
+ await parseDotenv(projectPath, info);
46
+ await parseDockerCompose(projectPath, info);
31
47
  // Deduplicate
32
48
  info.languages = [...new Set(info.languages)];
33
49
  info.dependencies = [...new Set(info.dependencies)];
@@ -1 +1 @@
1
- {"version":3,"file":"project-analyzer.service.js","sourceRoot":"","sources":["../../../src/services/analyzer/project-analyzer.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-analyzer.service.js","sourceRoot":"","sources":["../../../src/services/analyzer/project-analyzer.service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-recommender",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "MCP server for recommending Claude Code skills, plugins, and MCP servers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",