devlens-cli-susmit 1.0.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.
package/dist/cicd.js ADDED
@@ -0,0 +1,105 @@
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.adviseCicd = adviseCicd;
7
+ exports.formatCicdAdvisories = formatCicdAdvisories;
8
+ /**
9
+ * cicd.ts — CI/CD pipeline linter and advisor.
10
+ * Reads detected CI/CD config files and surfaces common issues.
11
+ */
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const path_1 = __importDefault(require("path"));
14
+ function readFile(p) {
15
+ try {
16
+ return fs_1.default.readFileSync(p, "utf-8");
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ function lintGitHubActions(projectRoot) {
23
+ const advisories = [];
24
+ const workflowDir = path_1.default.join(projectRoot, ".github", "workflows");
25
+ if (!fs_1.default.existsSync(workflowDir))
26
+ return [];
27
+ const files = fs_1.default.readdirSync(workflowDir).filter(f => f.endsWith(".yml") || f.endsWith(".yaml"));
28
+ for (const file of files) {
29
+ const content = readFile(path_1.default.join(workflowDir, file)) ?? "";
30
+ const issues = [];
31
+ const tips = [];
32
+ if (!content.includes("on:") && !content.includes("\"on\":"))
33
+ issues.push("Missing 'on:' trigger definition.");
34
+ if (!content.includes("runs-on:"))
35
+ issues.push("No 'runs-on' found — jobs need a runner.");
36
+ if (content.includes("actions/checkout") && !content.includes("with:"))
37
+ tips.push("Pin actions/checkout to a specific version for reproducibility.");
38
+ if (!content.includes("cache"))
39
+ tips.push("Consider adding dependency caching to speed up builds.");
40
+ if (content.includes("secrets.") && content.includes("echo"))
41
+ tips.push("Avoid echoing secrets in logs.");
42
+ advisories.push({ tool: "GitHub Actions", configFile: `.github/workflows/${file}`, issues, tips });
43
+ }
44
+ return advisories;
45
+ }
46
+ function lintDockerfile(projectRoot) {
47
+ const content = readFile(path_1.default.join(projectRoot, "Dockerfile"));
48
+ if (!content)
49
+ return null;
50
+ const issues = [];
51
+ const tips = [];
52
+ if (content.match(/^FROM .+:latest/m))
53
+ issues.push("Using 'latest' tag is unstable. Pin to a specific version.");
54
+ if (!content.includes("USER "))
55
+ tips.push("Run as a non-root user for security.");
56
+ if (!content.includes(".dockerignore"))
57
+ tips.push("Add a .dockerignore file to reduce image size.");
58
+ if (content.split("RUN ").length > 5)
59
+ tips.push("Combine RUN commands to reduce image layers.");
60
+ return { tool: "Docker", configFile: "Dockerfile", issues, tips };
61
+ }
62
+ function lintDockerCompose(projectRoot) {
63
+ for (const name of ["docker-compose.yml", "docker-compose.yaml"]) {
64
+ const content = readFile(path_1.default.join(projectRoot, name));
65
+ if (!content)
66
+ continue;
67
+ const issues = [];
68
+ const tips = [];
69
+ if (content.includes("version: '2'") || content.includes('version: "2"'))
70
+ tips.push("Consider upgrading to Compose v3 schema.");
71
+ if (!content.includes("healthcheck"))
72
+ tips.push("Add healthchecks to services for reliability.");
73
+ if (content.includes("privileged: true"))
74
+ issues.push("Privileged mode enabled — security risk.");
75
+ return { tool: "Docker Compose", configFile: name, issues, tips };
76
+ }
77
+ return null;
78
+ }
79
+ function adviseCicd(projectRoot, _detected) {
80
+ const advisories = [];
81
+ advisories.push(...lintGitHubActions(projectRoot));
82
+ const docker = lintDockerfile(projectRoot);
83
+ if (docker)
84
+ advisories.push(docker);
85
+ const compose = lintDockerCompose(projectRoot);
86
+ if (compose)
87
+ advisories.push(compose);
88
+ return advisories;
89
+ }
90
+ function formatCicdAdvisories(advisories) {
91
+ if (advisories.length === 0)
92
+ return "No CI/CD configuration found.";
93
+ const lines = [];
94
+ for (const a of advisories) {
95
+ lines.push(`\n🔧 ${a.tool} — ${a.configFile}`);
96
+ for (const issue of a.issues)
97
+ lines.push(` ❌ ${issue}`);
98
+ for (const tip of a.tips)
99
+ lines.push(` 💡 ${tip}`);
100
+ if (a.issues.length === 0 && a.tips.length === 0)
101
+ lines.push(" ✅ No issues found.");
102
+ }
103
+ return lines.join("\n");
104
+ }
105
+ //# sourceMappingURL=cicd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cicd.js","sourceRoot":"","sources":["../src/cicd.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * cli.ts — devlens command-line interface.
4
+ *
5
+ * devlens [options] [project-root]
6
+ *
7
+ * Commands:
8
+ * summarize Analyze & summarize the project (default)
9
+ * test Run tests and analyze output
10
+ * build Run build command and analyze output
11
+ * run Run the project and analyze output
12
+ * cicd Lint CI/CD configuration files
13
+ * analyze Analyze raw text output passed via stdin or --input
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
package/dist/cli.js ADDED
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * cli.ts — devlens command-line interface.
5
+ *
6
+ * devlens [options] [project-root]
7
+ *
8
+ * Commands:
9
+ * summarize Analyze & summarize the project (default)
10
+ * test Run tests and analyze output
11
+ * build Run build command and analyze output
12
+ * run Run the project and analyze output
13
+ * cicd Lint CI/CD configuration files
14
+ * analyze Analyze raw text output passed via stdin or --input
15
+ */
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ const commander_1 = require("commander");
54
+ const path_1 = __importDefault(require("path"));
55
+ const fs_1 = __importDefault(require("fs"));
56
+ const platform_1 = require("./platform");
57
+ // Dynamic import of chalk & ora to handle ESM-only packages at runtime
58
+ async function getChalk() {
59
+ return (await Promise.resolve().then(() => __importStar(require("chalk")))).default;
60
+ }
61
+ async function getOra() {
62
+ return (await Promise.resolve().then(() => __importStar(require("ora")))).default;
63
+ }
64
+ const program = new commander_1.Command();
65
+ program
66
+ .name("devlens")
67
+ .description("Universal project summarizer, error root-cause analyzer & test runner")
68
+ .version("1.0.0")
69
+ .argument("[project-root]", "Path to project root", process.cwd())
70
+ .option("-a, --action <action>", "Action: summarize | test | build | run | cicd | analyze", "summarize")
71
+ .option("-i, --input <file>", "File containing raw output to analyze (used with --action analyze)")
72
+ .option("--json", "Output as JSON")
73
+ .option("--no-color", "Disable colored output")
74
+ .action(async (projectRoot, options) => {
75
+ const chalk = await getChalk();
76
+ const ora = await getOra();
77
+ const root = path_1.default.resolve(projectRoot);
78
+ if (!fs_1.default.existsSync(root)) {
79
+ console.error(chalk.red(`Error: project root '${root}' does not exist.`));
80
+ process.exit(1);
81
+ }
82
+ const spinner = ora({ text: `devlens running on ${(0, platform_1.getPlatformLabel)()}…`, color: "cyan" }).start();
83
+ try {
84
+ const { devlens } = await Promise.resolve().then(() => __importStar(require("./index")));
85
+ let rawOutput;
86
+ if (options.action === "analyze") {
87
+ if (options.input) {
88
+ rawOutput = fs_1.default.readFileSync(path_1.default.resolve(options.input), "utf-8");
89
+ }
90
+ else if (!process.stdin.isTTY) {
91
+ rawOutput = fs_1.default.readFileSync("/dev/stdin", "utf-8");
92
+ }
93
+ }
94
+ const report = await devlens({
95
+ projectRoot: root,
96
+ action: options.action,
97
+ output: rawOutput,
98
+ onData: (chunk) => {
99
+ spinner.stop();
100
+ process.stdout.write(chunk);
101
+ },
102
+ });
103
+ spinner.stop();
104
+ if (options.json) {
105
+ console.log(JSON.stringify(report, null, 2));
106
+ return;
107
+ }
108
+ // ── Formatted output ────────────────────────────────────────────────────
109
+ console.log(chalk.bold.cyan("\n╔══════════════════════════════════════════════════════╗"));
110
+ console.log(chalk.bold.cyan("║ devlens — project intelligence ║"));
111
+ console.log(chalk.bold.cyan("╚══════════════════════════════════════════════════════╝\n"));
112
+ console.log(chalk.yellow(`Platform: ${(0, platform_1.getPlatformLabel)()}`));
113
+ console.log(chalk.yellow(`Project: ${root}\n`));
114
+ if (report.summary) {
115
+ // Print detected technologies
116
+ const t = report.summary.technologies;
117
+ console.log(chalk.bold("📦 Project Type: ") + chalk.green(report.summary.projectType));
118
+ if (report.summary.primaryLanguage)
119
+ console.log(chalk.bold("🔤 Language: ") + report.summary.primaryLanguage);
120
+ if (report.summary.primaryFramework)
121
+ console.log(chalk.bold("🛠 Framework: ") + report.summary.primaryFramework);
122
+ if (t.gameEngines.length)
123
+ console.log(chalk.bold("🎮 Game Engine: ") + t.gameEngines.join(", "));
124
+ if (t.ai.length)
125
+ console.log(chalk.bold("🤖 AI/ML: ") + t.ai.join(", "));
126
+ if (t.databases.length)
127
+ console.log(chalk.bold("🗄 Databases: ") + t.databases.join(", "));
128
+ if (t.cicd.length)
129
+ console.log(chalk.bold("⚙️ CI/CD: ") + t.cicd.join(", "));
130
+ if (t.apis.length)
131
+ console.log(chalk.bold("🌐 APIs: ") + t.apis.join(", "));
132
+ if (t.testing.length)
133
+ console.log(chalk.bold("🧪 Testing: ") + t.testing.join(", "));
134
+ if (t.app.length)
135
+ console.log(chalk.bold("📱 App: ") + t.app.join(", "));
136
+ if (t.dsa)
137
+ console.log(chalk.bold("📐 DSA: ") + "detected");
138
+ console.log(chalk.bold("\n📊 Stats:"));
139
+ console.log(` Files: ${report.summary.stats.totalFiles} | Dirs: ${report.summary.stats.totalDirs} | LoC: ${report.summary.stats.linesOfCode.toLocaleString()}`);
140
+ console.log(chalk.bold("\n⚙️ Commands:"));
141
+ if (report.summary.commands.test)
142
+ console.log(` test: ${chalk.cyan(report.summary.commands.test)}`);
143
+ if (report.summary.commands.build)
144
+ console.log(` build: ${chalk.cyan(report.summary.commands.build)}`);
145
+ if (report.summary.commands.run)
146
+ console.log(` run: ${chalk.cyan(report.summary.commands.run)}`);
147
+ if (report.summary.readmeSummary) {
148
+ console.log(chalk.bold("\n📖 README:"));
149
+ console.log(chalk.dim(` ${report.summary.readmeSummary}`));
150
+ }
151
+ }
152
+ // ── Test / Build / Run results ─────────────────────────────────────────
153
+ if (report.runResult) {
154
+ const r = report.runResult;
155
+ const icon = r.analysis.hasFailed ? chalk.red("❌") : chalk.green("✅");
156
+ console.log(chalk.bold(`\n${icon} Command: `) + chalk.cyan(r.command));
157
+ console.log(chalk.bold(" Duration: ") + `${r.durationMs}ms`);
158
+ console.log(chalk.bold(" Exit code: ") + `${r.exitCode}`);
159
+ if (r.analysis.hasFailed) {
160
+ console.log(chalk.red(r.analysis.summary));
161
+ for (const err of r.analysis.errors) {
162
+ console.log(chalk.red(`\n 🔴 [${err.type}]`));
163
+ console.log(` ${err.message}`);
164
+ if (err.file)
165
+ console.log(chalk.dim(` 📄 ${err.file}${err.line ? `:${err.line}` : ""}`));
166
+ console.log(chalk.yellow(` 🔍 Root Cause: ${err.rootCause}`));
167
+ console.log(chalk.cyan(` 💡 ${err.suggestion}`));
168
+ }
169
+ }
170
+ else {
171
+ console.log(chalk.green(" " + r.analysis.summary));
172
+ }
173
+ }
174
+ // ── Test strategy ──────────────────────────────────────────────────────
175
+ if (report.testStrategy && !report.runResult) {
176
+ const ts = report.testStrategy;
177
+ if (ts.framework !== "none") {
178
+ console.log(chalk.bold("\n🧪 Test Strategy: ") + ts.framework);
179
+ console.log(` Command: ${chalk.cyan(ts.command)}`);
180
+ if (ts.scaffolded)
181
+ console.log(chalk.yellow(" ⚡ GoogleTest CMakeLists.txt scaffolded — run the command above."));
182
+ }
183
+ }
184
+ // ── CI/CD ─────────────────────────────────────────────────────────────
185
+ if (options.action === "cicd" && report.cicdAdvisories.length > 0) {
186
+ const { formatCicdAdvisories } = await Promise.resolve().then(() => __importStar(require("./cicd")));
187
+ console.log(chalk.bold("\n🔧 CI/CD Advisories:"));
188
+ console.log(formatCicdAdvisories(report.cicdAdvisories));
189
+ }
190
+ console.log(chalk.dim("\n──────────────────────────────────────────────────────"));
191
+ console.log(chalk.dim("devlens v1.0.0 — macOS · Windows · Linux\n"));
192
+ }
193
+ catch (err) {
194
+ spinner.stop();
195
+ const msg = err instanceof Error ? err.message : String(err);
196
+ console.error((await getChalk()).red(`\nFatal error: ${msg}`));
197
+ if (process.env.DEBUG)
198
+ console.error(err);
199
+ process.exit(1);
200
+ }
201
+ });
202
+ program.parse();
203
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAAoC;AACpC,gDAAwB;AACxB,4CAAoB;AACpB,yCAA8C;AAE9C,uEAAuE;AACvE,KAAK,UAAU,QAAQ;IACrB,OAAO,CAAC,wDAAa,OAAO,GAAC,CAAC,CAAC,OAAO,CAAC;AACzC,CAAC;AACD,KAAK,UAAU,MAAM;IACnB,OAAO,CAAC,wDAAa,KAAK,GAAC,CAAC,CAAC,OAAO,CAAC;AACvC,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,uEAAuE,CAAC;KACpF,OAAO,CAAC,OAAO,CAAC;KAChB,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KACjE,MAAM,CAAC,uBAAuB,EAAE,yDAAyD,EAAE,WAAW,CAAC;KACvG,MAAM,CAAC,oBAAoB,EAAE,oEAAoE,CAAC;KAClG,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;KAC9C,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,OAA2E,EAAE,EAAE;IACjH,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;IAE3B,MAAM,IAAI,GAAG,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,IAAI,mBAAmB,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,sBAAsB,IAAA,2BAAgB,GAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAElG,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,wDAAa,SAAS,GAAC,CAAC;QAE5C,IAAI,SAA6B,CAAC;QAClC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,SAAS,GAAG,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YACpE,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChC,SAAS,GAAG,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAC3B,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,OAAO,CAAC,MAAqE;YACrF,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBAChB,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,2EAA2E;QAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,IAAA,2BAAgB,GAAE,EAAE,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,8BAA8B;YAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YACvF,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACnH,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACtH,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACnG,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACjF,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAChG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvF,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACtF,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5F,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACpF,IAAI,CAAC,CAAC,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,UAAU,CAAC,CAAC;YAEvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,cAAc,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,aAAa,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAErK,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC3C,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtG,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxG,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpG,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;YAC3B,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC3C,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;oBACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;oBAC/C,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBACnC,IAAI,GAAG,CAAC,IAAI;wBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC7F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uBAAuB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;oBAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC;YAC/B,IAAI,EAAE,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACrD,IAAI,EAAE,CAAC,UAAU;oBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oEAAoE,CAAC,CAAC,CAAC;YACrH,CAAC;QACH,CAAC;QAED,yEAAyE;QACzE,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClE,MAAM,EAAE,oBAAoB,EAAE,GAAG,wDAAa,QAAQ,GAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;IAEvE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/D,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { DetectedTech } from "./registry";
2
+ export type { DetectedTech };
3
+ export interface DetectionResult {
4
+ projectRoot: string;
5
+ detected: DetectedTech[];
6
+ primaryLanguage: string | null;
7
+ primaryFramework: string | null;
8
+ testCommand: string | null;
9
+ buildCommand: string | null;
10
+ runCommand: string | null;
11
+ }
12
+ export declare function detect(projectRoot: string): DetectionResult;
13
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"AAKA,OAAO,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAC;AAGzD,YAAY,EAAE,YAAY,EAAE,CAAC;AA6I7B,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAqC3D"}
@@ -0,0 +1,203 @@
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.detect = detect;
7
+ /**
8
+ * detector.ts — scans a project directory and returns all detected technologies.
9
+ */
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const registry_1 = require("./registry");
13
+ function fileExistsGlob(projectRoot, pattern) {
14
+ // Simple basename match (supports *.ext style)
15
+ if (pattern.includes("/")) {
16
+ // path-based check
17
+ const full = path_1.default.join(projectRoot, pattern);
18
+ if (fs_1.default.existsSync(full))
19
+ return true;
20
+ // Wildcard: scan parent dir
21
+ if (pattern.includes("*")) {
22
+ const parts = pattern.split("/");
23
+ const dir = path_1.default.join(projectRoot, ...parts.slice(0, -1));
24
+ const pat = parts[parts.length - 1];
25
+ if (fs_1.default.existsSync(dir)) {
26
+ const files = safeReaddir(dir);
27
+ return files.some(f => matchGlob(f, pat));
28
+ }
29
+ }
30
+ return false;
31
+ }
32
+ if (pattern.includes("*")) {
33
+ const files = safeReaddir(projectRoot);
34
+ return files.some(f => matchGlob(f, pattern));
35
+ }
36
+ return fs_1.default.existsSync(path_1.default.join(projectRoot, pattern));
37
+ }
38
+ function matchGlob(name, pattern) {
39
+ const regex = new RegExp("^" + pattern.replace(/\./g, "\\.").replace(/\*/g, ".*") + "$");
40
+ return regex.test(name);
41
+ }
42
+ function safeReaddir(dir) {
43
+ try {
44
+ return fs_1.default.readdirSync(dir);
45
+ }
46
+ catch {
47
+ return [];
48
+ }
49
+ }
50
+ function dirExists(projectRoot, dir) {
51
+ // support nested dirs like ".github/workflows"
52
+ return fs_1.default.existsSync(path_1.default.join(projectRoot, dir));
53
+ }
54
+ function getExtensions(projectRoot) {
55
+ const exts = new Set();
56
+ function walk(dir, depth) {
57
+ if (depth > 4)
58
+ return;
59
+ const entries = safeReaddir(dir);
60
+ for (const e of entries) {
61
+ if (e.startsWith(".") || e === "node_modules" || e === "vendor" || e === ".git")
62
+ continue;
63
+ const full = path_1.default.join(dir, e);
64
+ try {
65
+ const stat = fs_1.default.statSync(full);
66
+ if (stat.isDirectory()) {
67
+ walk(full, depth + 1);
68
+ }
69
+ else {
70
+ const ext = path_1.default.extname(e).toLowerCase();
71
+ if (ext)
72
+ exts.add(ext);
73
+ }
74
+ }
75
+ catch { /* ignore */ }
76
+ }
77
+ }
78
+ walk(projectRoot, 0);
79
+ return exts;
80
+ }
81
+ function getPackageKeywords(projectRoot) {
82
+ const keywords = new Set();
83
+ const pkgPath = path_1.default.join(projectRoot, "package.json");
84
+ const reqPath = path_1.default.join(projectRoot, "requirements.txt");
85
+ const cargoPath = path_1.default.join(projectRoot, "Cargo.toml");
86
+ const goModPath = path_1.default.join(projectRoot, "go.mod");
87
+ const pubspecPath = path_1.default.join(projectRoot, "pubspec.yaml");
88
+ if (fs_1.default.existsSync(pkgPath)) {
89
+ try {
90
+ const pkg = JSON.parse(fs_1.default.readFileSync(pkgPath, "utf-8"));
91
+ const deps = {
92
+ ...pkg.dependencies,
93
+ ...pkg.devDependencies,
94
+ ...pkg.peerDependencies,
95
+ };
96
+ Object.keys(deps).forEach(k => keywords.add(k.toLowerCase()));
97
+ }
98
+ catch { /* ignore */ }
99
+ }
100
+ if (fs_1.default.existsSync(reqPath)) {
101
+ try {
102
+ fs_1.default.readFileSync(reqPath, "utf-8")
103
+ .split("\n")
104
+ .forEach(line => keywords.add(line.split(/[>=<!]/)[0].trim().toLowerCase()));
105
+ }
106
+ catch { /* ignore */ }
107
+ }
108
+ if (fs_1.default.existsSync(cargoPath)) {
109
+ try {
110
+ const content = fs_1.default.readFileSync(cargoPath, "utf-8");
111
+ const matches = content.matchAll(/^\s*(\S+)\s*=/gm);
112
+ for (const m of matches)
113
+ keywords.add(m[1].toLowerCase());
114
+ }
115
+ catch { /* ignore */ }
116
+ }
117
+ if (fs_1.default.existsSync(goModPath)) {
118
+ try {
119
+ const content = fs_1.default.readFileSync(goModPath, "utf-8");
120
+ const matches = content.matchAll(/^\s+(\S+)\s+v/gm);
121
+ for (const m of matches)
122
+ keywords.add(m[1].split("/").pop()?.toLowerCase() ?? "");
123
+ }
124
+ catch { /* ignore */ }
125
+ }
126
+ if (fs_1.default.existsSync(pubspecPath)) {
127
+ try {
128
+ const content = fs_1.default.readFileSync(pubspecPath, "utf-8");
129
+ const matches = content.matchAll(/^\s{2,4}(\S+):/gm);
130
+ for (const m of matches)
131
+ keywords.add(m[1].toLowerCase());
132
+ }
133
+ catch { /* ignore */ }
134
+ }
135
+ return keywords;
136
+ }
137
+ function scoreSignal(signal, projectRoot, exts, keywords) {
138
+ let score = 0;
139
+ if (signal.files) {
140
+ for (const f of signal.files) {
141
+ if (fileExistsGlob(projectRoot, f))
142
+ score += 3;
143
+ }
144
+ }
145
+ if (signal.dirs) {
146
+ for (const d of signal.dirs) {
147
+ if (dirExists(projectRoot, d))
148
+ score += 2;
149
+ }
150
+ }
151
+ if (signal.extensions) {
152
+ for (const e of signal.extensions) {
153
+ if (exts.has(e))
154
+ score += 1;
155
+ }
156
+ }
157
+ if (signal.keywords) {
158
+ for (const k of signal.keywords) {
159
+ if (keywords.has(k.toLowerCase()))
160
+ score += 2;
161
+ }
162
+ }
163
+ return score;
164
+ }
165
+ function detect(projectRoot) {
166
+ const absRoot = path_1.default.resolve(projectRoot);
167
+ const exts = getExtensions(absRoot);
168
+ const keywords = getPackageKeywords(absRoot);
169
+ const detected = [];
170
+ for (const signal of registry_1.TECH_REGISTRY) {
171
+ const score = scoreSignal(signal, absRoot, exts, keywords);
172
+ if (score === 0)
173
+ continue;
174
+ const confidence = score >= 3 ? "high" : score >= 2 ? "medium" : "low";
175
+ detected.push({
176
+ name: signal.name,
177
+ category: signal.category,
178
+ confidence,
179
+ testCommand: signal.testCommand,
180
+ buildCommand: signal.buildCommand,
181
+ runCommand: signal.runCommand,
182
+ });
183
+ }
184
+ // Deduplicate by name, keeping highest confidence
185
+ const seen = new Map();
186
+ for (const d of detected) {
187
+ const existing = seen.get(d.name);
188
+ if (!existing || confidenceRank(d.confidence) > confidenceRank(existing.confidence)) {
189
+ seen.set(d.name, d);
190
+ }
191
+ }
192
+ const unique = Array.from(seen.values()).sort((a, b) => confidenceRank(b.confidence) - confidenceRank(a.confidence));
193
+ const primaryLanguage = unique.find(d => d.category === "language")?.name ?? null;
194
+ const primaryFramework = unique.find(d => d.category === "framework")?.name ?? null;
195
+ const testCommand = unique.find(d => d.testCommand)?.testCommand ?? null;
196
+ const buildCommand = unique.find(d => d.buildCommand)?.buildCommand ?? null;
197
+ const runCommand = unique.find(d => d.runCommand)?.runCommand ?? null;
198
+ return { projectRoot: absRoot, detected: unique, primaryLanguage, primaryFramework, testCommand, buildCommand, runCommand };
199
+ }
200
+ function confidenceRank(c) {
201
+ return c === "high" ? 3 : c === "medium" ? 2 : 1;
202
+ }
203
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * index.ts — public API entry point for devlens.
3
+ *
4
+ * Usage (programmatic):
5
+ * import { devlens } from "devlens";
6
+ * const report = await devlens({ projectRoot: "./my-project", run: "test" });
7
+ */
8
+ export { detect, type DetectionResult, type DetectedTech } from "./detector";
9
+ export { summarize, type ProjectSummary } from "./summarizer";
10
+ export { analyze, formatAnalysis, type AnalysisResult, type ErrorMatch } from "./analyzer";
11
+ export { runCommand, resolveTestStrategy, scaffoldGoogleTest, type RunResult, type TestStrategy } from "./runner";
12
+ export { adviseCicd, formatCicdAdvisories, type CicdAdvisory } from "./cicd";
13
+ export { TECH_REGISTRY, type Category } from "./registry";
14
+ import { summarize } from "./summarizer";
15
+ import { resolveTestStrategy, runCommand } from "./runner";
16
+ import { adviseCicd } from "./cicd";
17
+ export interface DevlensOptions {
18
+ /** Absolute or relative path to the project root. Defaults to cwd. */
19
+ projectRoot?: string;
20
+ /** What to do: "summarize" | "test" | "build" | "run" | "analyze" | "cicd". Defaults to "summarize". */
21
+ action?: "summarize" | "test" | "build" | "run" | "analyze" | "cicd";
22
+ /** Raw output to analyze (used with action: "analyze"). */
23
+ output?: string;
24
+ /** Stream command output to this callback (used with test/build/run). */
25
+ onData?: (chunk: string) => void;
26
+ }
27
+ export interface DevlensReport {
28
+ projectRoot: string;
29
+ summary: ReturnType<typeof summarize> | null;
30
+ runResult: Awaited<ReturnType<typeof runCommand>> | null;
31
+ cicdAdvisories: ReturnType<typeof adviseCicd>;
32
+ testStrategy: ReturnType<typeof resolveTestStrategy> | null;
33
+ formattedOutput: string;
34
+ }
35
+ export declare function devlens(options?: DevlensOptions): Promise<DevlensReport>;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAClH,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG1D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wGAAwG;IACxG,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;IACrE,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,GAAG,IAAI,CAAC;IAC7C,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC;IACzD,cAAc,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAC9C,YAAY,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,GAAG,IAAI,CAAC;IAC5D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA+ClF"}