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/runner.js ADDED
@@ -0,0 +1,157 @@
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.runCommand = runCommand;
7
+ exports.scaffoldGoogleTest = scaffoldGoogleTest;
8
+ exports.resolveTestStrategy = resolveTestStrategy;
9
+ /**
10
+ * runner.ts — cross-platform command runner that streams output,
11
+ * detects failures, and invokes the error analyzer.
12
+ */
13
+ const child_process_1 = require("child_process");
14
+ const os_1 = __importDefault(require("os"));
15
+ const path_1 = __importDefault(require("path"));
16
+ const fs_1 = __importDefault(require("fs"));
17
+ const analyzer_1 = require("./analyzer");
18
+ function isWindows() {
19
+ return os_1.default.platform() === "win32";
20
+ }
21
+ /**
22
+ * Run a shell command in a given directory, capture output, and analyze errors.
23
+ */
24
+ function runCommand(command, cwd, onData) {
25
+ return new Promise(resolve => {
26
+ const start = Date.now();
27
+ const shell = isWindows() ? "cmd.exe" : "/bin/sh";
28
+ const shellFlag = isWindows() ? "/C" : "-c";
29
+ let stdout = "";
30
+ let stderr = "";
31
+ const child = (0, child_process_1.spawn)(shell, [shellFlag, command], {
32
+ cwd,
33
+ env: { ...process.env },
34
+ stdio: ["ignore", "pipe", "pipe"],
35
+ });
36
+ child.stdout.on("data", (chunk) => {
37
+ const s = chunk.toString();
38
+ stdout += s;
39
+ onData?.(s);
40
+ });
41
+ child.stderr.on("data", (chunk) => {
42
+ const s = chunk.toString();
43
+ stderr += s;
44
+ onData?.(s);
45
+ });
46
+ child.on("close", exitCode => {
47
+ const combined = stdout + "\n" + stderr;
48
+ const analysis = (0, analyzer_1.analyze)(combined, exitCode);
49
+ resolve({
50
+ command,
51
+ stdout,
52
+ stderr,
53
+ exitCode,
54
+ analysis,
55
+ durationMs: Date.now() - start,
56
+ });
57
+ });
58
+ child.on("error", err => {
59
+ const msg = `Failed to start command: ${err.message}`;
60
+ stderr += msg;
61
+ const analysis = (0, analyzer_1.analyze)(msg, 1);
62
+ resolve({ command, stdout, stderr, exitCode: 1, analysis, durationMs: Date.now() - start });
63
+ });
64
+ });
65
+ }
66
+ // ── GoogleTest scaffold ───────────────────────────────────────────────────────
67
+ const GTEST_CMAKE = `cmake_minimum_required(VERSION 3.14)
68
+ project(devlens_tests)
69
+
70
+ set(CMAKE_CXX_STANDARD 17)
71
+
72
+ include(FetchContent)
73
+ FetchContent_Declare(
74
+ googletest
75
+ URL https://github.com/google/googletest/archive/refs/heads/main.zip
76
+ )
77
+ set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
78
+ FetchContent_MakeAvailable(googletest)
79
+
80
+ enable_testing()
81
+
82
+ file(GLOB_RECURSE TEST_SOURCES "*.cpp" "*.cc" "*.cxx")
83
+ list(FILTER TEST_SOURCES EXCLUDE REGEX ".*CMakeFiles.*")
84
+
85
+ add_executable(devlens_tests \${TEST_SOURCES})
86
+ target_link_libraries(devlens_tests GTest::gtest_main)
87
+ include(GoogleTestDiscover)
88
+ gtest_discover_tests(devlens_tests)
89
+ `;
90
+ const GTEST_WRAPPER_HEADER = `// devlens_test_wrapper.h — auto-generated by devlens
91
+ // Include this in your source to use GoogleTest without any setup.
92
+ #pragma once
93
+ #include <gtest/gtest.h>
94
+ `;
95
+ /**
96
+ * When no test framework is detected for a C/C++ project,
97
+ * scaffold GoogleTest CMake files and return the test command.
98
+ */
99
+ function scaffoldGoogleTest(projectRoot) {
100
+ const cmakePath = path_1.default.join(projectRoot, "CMakeLists.txt");
101
+ const headerPath = path_1.default.join(projectRoot, "devlens_test_wrapper.h");
102
+ // Only write CMakeLists.txt if it doesn't exist
103
+ if (!fs_1.default.existsSync(cmakePath)) {
104
+ fs_1.default.writeFileSync(cmakePath, GTEST_CMAKE, "utf-8");
105
+ }
106
+ else {
107
+ // Append GoogleTest section if not already present
108
+ const existing = fs_1.default.readFileSync(cmakePath, "utf-8");
109
+ if (!existing.includes("googletest") && !existing.includes("GTest")) {
110
+ fs_1.default.appendFileSync(cmakePath, "\n" + GTEST_CMAKE);
111
+ }
112
+ }
113
+ if (!fs_1.default.existsSync(headerPath)) {
114
+ fs_1.default.writeFileSync(headerPath, GTEST_WRAPPER_HEADER, "utf-8");
115
+ }
116
+ return "cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug && cmake --build build && cd build && ctest --output-on-failure";
117
+ }
118
+ /**
119
+ * Returns the best test command for the project.
120
+ * Falls back to GoogleTest scaffold for C/C++ with no detected test framework.
121
+ */
122
+ function resolveTestStrategy(detection) {
123
+ const { detected, projectRoot } = detection;
124
+ // Check for a dedicated testing framework first
125
+ const testingFramework = detected.find(d => d.category === "testing" && d.testCommand);
126
+ if (testingFramework) {
127
+ return { command: testingFramework.testCommand, framework: testingFramework.name, scaffolded: false };
128
+ }
129
+ // C/C++ without a dedicated test framework → scaffold GoogleTest
130
+ const hasCCpp = detected.some(d => ["C", "C++"].includes(d.name));
131
+ if (hasCCpp) {
132
+ const cmd = scaffoldGoogleTest(projectRoot);
133
+ return { command: cmd, framework: "GoogleTest (scaffolded)", scaffolded: true };
134
+ }
135
+ // Python without pytest → use unittest
136
+ if (detected.some(d => d.name === "Python")) {
137
+ return { command: "python -m pytest --tb=short", framework: "pytest (fallback)", scaffolded: false };
138
+ }
139
+ // JS/TS without jest → use jest
140
+ if (detected.some(d => ["JavaScript", "TypeScript"].includes(d.name))) {
141
+ return { command: "npx jest --passWithNoTests", framework: "Jest (fallback)", scaffolded: false };
142
+ }
143
+ // Go
144
+ if (detected.some(d => d.name === "Go")) {
145
+ return { command: "go test ./...", framework: "go test", scaffolded: false };
146
+ }
147
+ // Rust
148
+ if (detected.some(d => d.name === "Rust")) {
149
+ return { command: "cargo test", framework: "cargo test", scaffolded: false };
150
+ }
151
+ // Java
152
+ if (detected.some(d => d.name === "Java")) {
153
+ return { command: "mvn test", framework: "JUnit/Maven", scaffolded: false };
154
+ }
155
+ return { command: "", framework: "none", scaffolded: false };
156
+ }
157
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { DetectionResult } from "./detector";
2
+ export interface ProjectSummary {
3
+ name: string;
4
+ description: string;
5
+ projectType: string;
6
+ primaryLanguage: string | null;
7
+ primaryFramework: string | null;
8
+ technologies: {
9
+ languages: string[];
10
+ frameworks: string[];
11
+ gameEngines: string[];
12
+ ai: string[];
13
+ databases: string[];
14
+ cicd: string[];
15
+ apis: string[];
16
+ testing: string[];
17
+ app: string[];
18
+ dsa: boolean;
19
+ };
20
+ commands: {
21
+ test: string | null;
22
+ build: string | null;
23
+ run: string | null;
24
+ };
25
+ stats: {
26
+ totalFiles: number;
27
+ totalDirs: number;
28
+ linesOfCode: number;
29
+ };
30
+ readmeSummary: string | null;
31
+ markdown: string;
32
+ }
33
+ export declare function summarize(detection: DetectionResult): ProjectSummary;
34
+ //# sourceMappingURL=summarizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../src/summarizer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE;QACZ,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,EAAE,EAAE,MAAM,EAAE,CAAC;QACb,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,GAAG,EAAE,MAAM,EAAE,CAAC;QACd,GAAG,EAAE,OAAO,CAAC;KACd,CAAC;IACF,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;KACpB,CAAC;IACF,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAqHD,wBAAgB,SAAS,CAAC,SAAS,EAAE,eAAe,GAAG,cAAc,CAuBpE"}
@@ -0,0 +1,180 @@
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.summarize = summarize;
7
+ /**
8
+ * summarizer.ts — generates a human-readable project summary.
9
+ */
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ function groupByCategory(detected) {
13
+ const get = (cat) => detected.filter(d => d.category === cat).map(d => d.name);
14
+ return {
15
+ languages: get("language"),
16
+ frameworks: get("framework"),
17
+ gameEngines: get("game-engine"),
18
+ ai: get("ai"),
19
+ databases: get("database"),
20
+ cicd: get("cicd"),
21
+ apis: get("api"),
22
+ testing: get("testing"),
23
+ app: get("app"),
24
+ dsa: false, // enriched below
25
+ };
26
+ }
27
+ function inferProjectType(detected, hasDSA) {
28
+ const cats = new Set(detected.map(d => d.category));
29
+ if (cats.has("game-engine"))
30
+ return "Game Development";
31
+ if (cats.has("ai"))
32
+ return "AI / ML";
33
+ if (cats.has("app") && detected.some(d => ["Flutter", "React Native", "Expo", "iOS (Xcode)", "Android (Gradle)"].includes(d.name)))
34
+ return "Mobile App";
35
+ if (cats.has("app"))
36
+ return "Desktop / Cross-platform App";
37
+ if (hasDSA)
38
+ return "DSA / Competitive Programming";
39
+ if (cats.has("framework") || cats.has("database") || cats.has("api"))
40
+ return "Full-stack / Backend Web";
41
+ if (cats.has("language"))
42
+ return "General / Script / Library";
43
+ return "Unknown";
44
+ }
45
+ function countStats(projectRoot) {
46
+ let files = 0, dirs = 0, loc = 0;
47
+ const codeExts = new Set([".ts", ".tsx", ".js", ".jsx", ".py", ".go", ".rs", ".java", ".kt", ".c", ".cpp", ".cc", ".cxx", ".h", ".hpp", ".cs", ".rb", ".php", ".swift", ".dart", ".lua", ".zig", ".ex", ".exs", ".hs", ".scala", ".r", ".jl", ".sh", ".bash", ".ps1", ".sol"]);
48
+ function walk(dir, depth) {
49
+ if (depth > 5)
50
+ return;
51
+ let entries;
52
+ try {
53
+ entries = fs_1.default.readdirSync(dir);
54
+ }
55
+ catch {
56
+ return;
57
+ }
58
+ for (const e of entries) {
59
+ if (e === "node_modules" || e === "vendor" || e === ".git" || e === "dist" || e === "build" || e === "__pycache__")
60
+ continue;
61
+ const full = path_1.default.join(dir, e);
62
+ try {
63
+ const stat = fs_1.default.statSync(full);
64
+ if (stat.isDirectory()) {
65
+ dirs++;
66
+ walk(full, depth + 1);
67
+ }
68
+ else {
69
+ files++;
70
+ if (codeExts.has(path_1.default.extname(e).toLowerCase())) {
71
+ try {
72
+ const lines = fs_1.default.readFileSync(full, "utf-8").split("\n").length;
73
+ loc += lines;
74
+ }
75
+ catch { /* ignore */ }
76
+ }
77
+ }
78
+ }
79
+ catch { /* ignore */ }
80
+ }
81
+ }
82
+ walk(projectRoot, 0);
83
+ return { totalFiles: files, totalDirs: dirs, linesOfCode: loc };
84
+ }
85
+ function readReadme(projectRoot) {
86
+ for (const name of ["README.md", "README.txt", "README", "readme.md"]) {
87
+ const p = path_1.default.join(projectRoot, name);
88
+ if (fs_1.default.existsSync(p)) {
89
+ try {
90
+ const content = fs_1.default.readFileSync(p, "utf-8");
91
+ // Extract first non-empty paragraph (up to 400 chars)
92
+ const lines = content.split("\n").filter(l => l.trim() && !l.trim().startsWith("#")).join(" ").trim();
93
+ return lines.slice(0, 400) + (lines.length > 400 ? "…" : "");
94
+ }
95
+ catch { /* ignore */ }
96
+ }
97
+ }
98
+ return null;
99
+ }
100
+ function detectDSA(projectRoot) {
101
+ // Heuristic: look for common DSA folder/file names
102
+ const dsaHints = ["main.cpp", "main.c", "solution.py", "Solution.java", "solve.py", "main.py", "competitive", "leetcode", "codeforces", "hackerrank", "dsa", "algorithms", "data-structures", "ds"];
103
+ const entries = (() => { try {
104
+ return fs_1.default.readdirSync(projectRoot).map(e => e.toLowerCase());
105
+ }
106
+ catch {
107
+ return [];
108
+ } })();
109
+ return entries.some(e => dsaHints.includes(e) || dsaHints.some(h => e.includes(h)));
110
+ }
111
+ function buildMarkdown(summary) {
112
+ const t = summary.technologies;
113
+ const lines = [
114
+ `# 📦 ${summary.name}`,
115
+ "",
116
+ `> **Project Type:** ${summary.projectType}`,
117
+ "",
118
+ ];
119
+ if (summary.description)
120
+ lines.push(`${summary.description}`, "");
121
+ if (summary.readmeSummary)
122
+ lines.push(`**README:** ${summary.readmeSummary}`, "");
123
+ lines.push("## 🔍 Detected Technologies", "");
124
+ if (t.languages.length)
125
+ lines.push(`- **Languages:** ${t.languages.join(", ")}`);
126
+ if (t.frameworks.length)
127
+ lines.push(`- **Frameworks:** ${t.frameworks.join(", ")}`);
128
+ if (t.gameEngines.length)
129
+ lines.push(`- **Game Engines:** ${t.gameEngines.join(", ")}`);
130
+ if (t.ai.length)
131
+ lines.push(`- **AI / ML:** ${t.ai.join(", ")}`);
132
+ if (t.databases.length)
133
+ lines.push(`- **Databases:** ${t.databases.join(", ")}`);
134
+ if (t.cicd.length)
135
+ lines.push(`- **CI/CD:** ${t.cicd.join(", ")}`);
136
+ if (t.apis.length)
137
+ lines.push(`- **APIs:** ${t.apis.join(", ")}`);
138
+ if (t.testing.length)
139
+ lines.push(`- **Testing:** ${t.testing.join(", ")}`);
140
+ if (t.app.length)
141
+ lines.push(`- **App / Mobile:** ${t.app.join(", ")}`);
142
+ if (t.dsa)
143
+ lines.push(`- **DSA / Competitive Programming:** detected`);
144
+ lines.push("", "## ⚙️ Commands", "");
145
+ if (summary.commands.test)
146
+ lines.push(`- **Test:** \`${summary.commands.test}\``);
147
+ if (summary.commands.build)
148
+ lines.push(`- **Build:** \`${summary.commands.build}\``);
149
+ if (summary.commands.run)
150
+ lines.push(`- **Run:** \`${summary.commands.run}\``);
151
+ lines.push("", "## 📊 Project Stats", "");
152
+ lines.push(`- Files: ${summary.stats.totalFiles}`);
153
+ lines.push(`- Directories: ${summary.stats.totalDirs}`);
154
+ lines.push(`- Lines of code: ${summary.stats.linesOfCode.toLocaleString()}`);
155
+ return lines.join("\n");
156
+ }
157
+ function summarize(detection) {
158
+ const { projectRoot, detected, primaryLanguage, primaryFramework, testCommand, buildCommand, runCommand } = detection;
159
+ const name = path_1.default.basename(projectRoot);
160
+ const technologies = groupByCategory(detected);
161
+ const hasDSA = detectDSA(projectRoot);
162
+ technologies.dsa = hasDSA;
163
+ const projectType = inferProjectType(detected, hasDSA);
164
+ const stats = countStats(projectRoot);
165
+ const readmeSummary = readReadme(projectRoot);
166
+ const description = `${primaryLanguage ?? "Unknown"} project${primaryFramework ? ` using ${primaryFramework}` : ""}`;
167
+ const base = {
168
+ name,
169
+ description,
170
+ projectType,
171
+ primaryLanguage,
172
+ primaryFramework,
173
+ technologies,
174
+ commands: { test: testCommand, build: buildCommand, run: runCommand },
175
+ stats,
176
+ readmeSummary,
177
+ };
178
+ return { ...base, markdown: buildMarkdown(base) };
179
+ }
180
+ //# sourceMappingURL=summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../src/summarizer.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "devlens-cli-susmit",
3
+ "version": "1.0.0",
4
+ "description": "Universal project summarizer, error root-cause analyzer and test runner — supports full-stack, app, game, AI, DSA and any language/framework.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "devlens": "dist/cli.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "lint": "eslint src --ext .ts",
14
+ "test": "jest --testPathPattern=tests/",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "keywords": [
18
+ "summarize",
19
+ "error",
20
+ "root-cause",
21
+ "testing",
22
+ "multi-language",
23
+ "fullstack",
24
+ "gamedev",
25
+ "ai",
26
+ "dsa",
27
+ "cicd",
28
+ "database",
29
+ "api",
30
+ "cross-platform"
31
+ ],
32
+ "author": "",
33
+ "license": "MIT",
34
+ "dependencies": {
35
+ "chalk": "^5.3.0",
36
+ "commander": "^12.0.0",
37
+ "glob": "^10.3.12",
38
+ "ora": "^8.0.1",
39
+ "yaml": "^2.4.1"
40
+ },
41
+ "devDependencies": {
42
+ "@types/jest": "^29.5.12",
43
+ "@types/node": "^20.12.7",
44
+ "@typescript-eslint/eslint-plugin": "^7.7.1",
45
+ "@typescript-eslint/parser": "^7.7.1",
46
+ "eslint": "^8.57.0",
47
+ "jest": "^29.7.0",
48
+ "ts-jest": "^29.1.2",
49
+ "typescript": "^5.4.5"
50
+ },
51
+ "engines": {
52
+ "node": ">=18.0.0"
53
+ },
54
+ "os": ["linux", "darwin", "win32"],
55
+ "files": [
56
+ "dist/",
57
+ "README.md",
58
+ "LICENSE"
59
+ ]
60
+ }