devcore-ai 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/README.md +191 -0
- package/dist/ai/index.d.ts +20 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +251 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/commands/config-cmd.d.ts +3 -0
- package/dist/commands/config-cmd.d.ts.map +1 -0
- package/dist/commands/config-cmd.js +106 -0
- package/dist/commands/config-cmd.js.map +1 -0
- package/dist/commands/files-cmd.d.ts +3 -0
- package/dist/commands/files-cmd.d.ts.map +1 -0
- package/dist/commands/files-cmd.js +29 -0
- package/dist/commands/files-cmd.js.map +1 -0
- package/dist/commands/git-cmd.d.ts +3 -0
- package/dist/commands/git-cmd.d.ts.map +1 -0
- package/dist/commands/git-cmd.js +114 -0
- package/dist/commands/git-cmd.js.map +1 -0
- package/dist/commands/help.d.ts +12 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +97 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/image-cmd.d.ts +3 -0
- package/dist/commands/image-cmd.d.ts.map +1 -0
- package/dist/commands/image-cmd.js +38 -0
- package/dist/commands/image-cmd.js.map +1 -0
- package/dist/commands/index.d.ts +9 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +263 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/review-cmd.d.ts +4 -0
- package/dist/commands/review-cmd.d.ts.map +1 -0
- package/dist/commands/review-cmd.js +72 -0
- package/dist/commands/review-cmd.js.map +1 -0
- package/dist/commands/terminal-cmd.d.ts +2 -0
- package/dist/commands/terminal-cmd.d.ts.map +1 -0
- package/dist/commands/terminal-cmd.js +34 -0
- package/dist/commands/terminal-cmd.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +56 -0
- package/dist/config/index.js.map +1 -0
- package/dist/filesystem/index.d.ts +5 -0
- package/dist/filesystem/index.d.ts.map +1 -0
- package/dist/filesystem/index.js +174 -0
- package/dist/filesystem/index.js.map +1 -0
- package/dist/git/index.d.ts +9 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +121 -0
- package/dist/git/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +10 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +88 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/terminal/index.d.ts +11 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +64 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/index.d.ts +15 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +74 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/stream-renderer.d.ts +15 -0
- package/dist/ui/stream-renderer.d.ts.map +1 -0
- package/dist/ui/stream-renderer.js +78 -0
- package/dist/ui/stream-renderer.js.map +1 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +68 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,72 @@
|
|
|
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.reviewCommand = reviewCommand;
|
|
7
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const ora_1 = __importDefault(require("ora"));
|
|
11
|
+
const ui_1 = require("../ui");
|
|
12
|
+
async function reviewCommand(target, ctx, ai) {
|
|
13
|
+
let code = "";
|
|
14
|
+
let filePath = "";
|
|
15
|
+
if (target) {
|
|
16
|
+
filePath = path_1.default.resolve(process.cwd(), target);
|
|
17
|
+
try {
|
|
18
|
+
code = await promises_1.default.readFile(filePath, "utf-8");
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return chalk_1.default.red(`Could not read file: ${target}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
// review a few key files
|
|
26
|
+
const keyFiles = ctx.sourceFiles.slice(0, 5);
|
|
27
|
+
if (keyFiles.length === 0) {
|
|
28
|
+
return (0, ui_1.info)("No source files found to review");
|
|
29
|
+
}
|
|
30
|
+
const files = await Promise.all(keyFiles.map(async (f) => {
|
|
31
|
+
const content = await promises_1.default.readFile(path_1.default.join(ctx.rootPath, f), "utf-8");
|
|
32
|
+
return `--- ${f} ---\n${content}`;
|
|
33
|
+
}));
|
|
34
|
+
code = files.join("\n\n");
|
|
35
|
+
filePath = keyFiles.join(", ");
|
|
36
|
+
}
|
|
37
|
+
const spinner = (0, ora_1.default)("Analyzing code...").start();
|
|
38
|
+
let result = "";
|
|
39
|
+
try {
|
|
40
|
+
for await (const chunk of ai.streamChat([
|
|
41
|
+
{
|
|
42
|
+
role: "user",
|
|
43
|
+
content: `Perform a thorough code review of the following code. Analyze for:
|
|
44
|
+
1. Bugs and potential runtime errors
|
|
45
|
+
2. Security vulnerabilities
|
|
46
|
+
3. Code readability and maintainability
|
|
47
|
+
4. Performance issues
|
|
48
|
+
5. Architecture and design patterns
|
|
49
|
+
6. Specific actionable suggestions
|
|
50
|
+
|
|
51
|
+
${filePath ? `File(s): ${filePath}` : ""}
|
|
52
|
+
\`\`\`
|
|
53
|
+
${code.slice(0, 6000)}
|
|
54
|
+
\`\`\`
|
|
55
|
+
|
|
56
|
+
Provide your review in structured sections with clear headings.`,
|
|
57
|
+
},
|
|
58
|
+
], ctx)) {
|
|
59
|
+
if (!chunk.done) {
|
|
60
|
+
result += chunk.content;
|
|
61
|
+
process.stdout.write(chunk.content);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
spinner.stop();
|
|
67
|
+
return chalk_1.default.red("Review failed: " + err.message);
|
|
68
|
+
}
|
|
69
|
+
spinner.stop();
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=review-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-cmd.js","sourceRoot":"","sources":["../../src/commands/review-cmd.ts"],"names":[],"mappings":";;;;;AAQA,sCAqEC;AA7ED,2DAA6B;AAC7B,gDAAwB;AACxB,kDAA0B;AAC1B,8CAAsB;AAGtB,8BAAqC;AAE9B,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,GAAmB,EACnB,EAAa;IAEb,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,IAAI,MAAM,EAAE,CAAC;QACX,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,eAAK,CAAC,GAAG,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,yBAAyB;QACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAA,SAAI,EAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACvB,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACvE,OAAO,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;QACpC,CAAC,CAAC,CACH,CAAC;QACF,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEjD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC,UAAU,CACrC;YACE;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;;;;;;;;EAQjB,QAAQ,CAAC,CAAC,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;;EAEtC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;;;gEAG2C;aACvD;SACF,EACD,GAAG,CACJ,EAAE,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC;gBACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,eAAK,CAAC,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/terminal-cmd.ts"],"names":[],"mappings":"AAMA,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBpE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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.terminalCommand = terminalCommand;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const terminal_1 = require("../terminal");
|
|
10
|
+
const utils_1 = require("../utils");
|
|
11
|
+
const ui_1 = require("../ui");
|
|
12
|
+
async function terminalCommand(input) {
|
|
13
|
+
if (!input.trim()) {
|
|
14
|
+
return (0, ui_1.error)("Usage: /terminal <command>");
|
|
15
|
+
}
|
|
16
|
+
if ((0, utils_1.isDangerousCommand)(input)) {
|
|
17
|
+
return (0, ui_1.warning)("This command looks potentially dangerous and has been blocked.");
|
|
18
|
+
}
|
|
19
|
+
const { confirm } = await inquirer_1.default.prompt([
|
|
20
|
+
{
|
|
21
|
+
type: "confirm",
|
|
22
|
+
name: "confirm",
|
|
23
|
+
message: `Run: ${chalk_1.default.cyan(input)}?`,
|
|
24
|
+
default: true,
|
|
25
|
+
},
|
|
26
|
+
]);
|
|
27
|
+
if (!confirm) {
|
|
28
|
+
return chalk_1.default.dim("Command cancelled");
|
|
29
|
+
}
|
|
30
|
+
const cmd = (0, terminal_1.parseCommand)(input);
|
|
31
|
+
const result = await (0, terminal_1.executeCommand)(cmd);
|
|
32
|
+
return (0, terminal_1.formatExecResult)(result);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=terminal-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-cmd.js","sourceRoot":"","sources":["../../src/commands/terminal-cmd.ts"],"names":[],"mappings":";;;;;AAMA,0CAyBC;AA/BD,wDAAgC;AAChC,kDAA0B;AAC1B,0CAA6E;AAC7E,oCAA8C;AAC9C,8BAAuC;AAEhC,KAAK,UAAU,eAAe,CAAC,KAAa;IACjD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,OAAO,IAAA,UAAK,EAAC,4BAA4B,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,IAAA,0BAAkB,EAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAA,YAAO,EAAC,gEAAgE,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACxC;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,QAAQ,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG;YACrC,OAAO,EAAE,IAAI;SACd;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,eAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,uBAAY,EAAC,KAAK,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,GAAG,CAAC,CAAC;IACzC,OAAO,IAAA,2BAAgB,EAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { AppConfig } from "../types";
|
|
2
|
+
export declare function loadConfig(): Promise<AppConfig>;
|
|
3
|
+
export declare function saveConfig(config: Partial<AppConfig>): Promise<void>;
|
|
4
|
+
export declare function getConfigPath(): Promise<string>;
|
|
5
|
+
export declare function isConfigured(config: AppConfig): boolean;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAerC,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAoBrD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1E;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAErD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAEvD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
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.loadConfig = loadConfig;
|
|
7
|
+
exports.saveConfig = saveConfig;
|
|
8
|
+
exports.getConfigPath = getConfigPath;
|
|
9
|
+
exports.isConfigured = isConfigured;
|
|
10
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const os_1 = __importDefault(require("os"));
|
|
13
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
14
|
+
const CONFIG_DIR = path_1.default.join(os_1.default.homedir(), ".devcore");
|
|
15
|
+
const CONFIG_FILE = path_1.default.join(CONFIG_DIR, "config.json");
|
|
16
|
+
const ENV_FILE = path_1.default.join(process.cwd(), ".env");
|
|
17
|
+
const DEFAULT_CONFIG = {
|
|
18
|
+
apiKey: "",
|
|
19
|
+
model: "gpt-4o",
|
|
20
|
+
temperature: 0.7,
|
|
21
|
+
maxTokens: 4096,
|
|
22
|
+
provider: "openai",
|
|
23
|
+
theme: "default",
|
|
24
|
+
};
|
|
25
|
+
async function loadConfig() {
|
|
26
|
+
dotenv_1.default.config({ path: ENV_FILE });
|
|
27
|
+
try {
|
|
28
|
+
const raw = await promises_1.default.readFile(CONFIG_FILE, "utf-8");
|
|
29
|
+
const saved = JSON.parse(raw);
|
|
30
|
+
const config = { ...DEFAULT_CONFIG, ...saved };
|
|
31
|
+
if (!config.apiKey && process.env.DEVCORE_API_KEY) {
|
|
32
|
+
config.apiKey = process.env.DEVCORE_API_KEY;
|
|
33
|
+
}
|
|
34
|
+
return config;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
const config = { ...DEFAULT_CONFIG };
|
|
38
|
+
if (process.env.DEVCORE_API_KEY) {
|
|
39
|
+
config.apiKey = process.env.DEVCORE_API_KEY;
|
|
40
|
+
}
|
|
41
|
+
return config;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async function saveConfig(config) {
|
|
45
|
+
await promises_1.default.mkdir(CONFIG_DIR, { recursive: true });
|
|
46
|
+
const existing = await loadConfig();
|
|
47
|
+
const merged = { ...existing, ...config };
|
|
48
|
+
await promises_1.default.writeFile(CONFIG_FILE, JSON.stringify(merged, null, 2), "utf-8");
|
|
49
|
+
}
|
|
50
|
+
async function getConfigPath() {
|
|
51
|
+
return CONFIG_FILE;
|
|
52
|
+
}
|
|
53
|
+
function isConfigured(config) {
|
|
54
|
+
return Boolean(config.apiKey && config.apiKey.length > 0);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;;;;AAmBA,gCAoBC;AAED,gCAKC;AAED,sCAEC;AAED,oCAEC;AAtDD,2DAA6B;AAC7B,gDAAwB;AACxB,4CAAoB;AACpB,oDAA4B;AAG5B,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACvD,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACzD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;AAElD,MAAM,cAAc,GAAc;IAChC,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,QAAQ;IACf,WAAW,EAAE,GAAG;IAChB,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,SAAS;CACjB,CAAC;AAEK,KAAK,UAAU,UAAU;IAC9B,gBAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAElC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;QACpD,MAAM,MAAM,GAAc,EAAE,GAAG,cAAc,EAAE,GAAG,KAAK,EAAE,CAAC;QAE1D,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;YAClD,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC9C,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;YAChC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC9C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,MAA0B;IACzD,MAAM,kBAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,UAAU,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,MAAM,kBAAE,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5E,CAAC;AAEM,KAAK,UAAU,aAAa;IACjC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAgB,YAAY,CAAC,MAAiB;IAC5C,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ProjectContext } from "../types";
|
|
2
|
+
export declare function scanProject(rootPath: string): Promise<ProjectContext>;
|
|
3
|
+
export declare function readFileContent(filePath: string): Promise<string>;
|
|
4
|
+
export declare function fileExists(filePath: string): Promise<boolean>;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filesystem/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAqC1C,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoB3E;AAiGD,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEvE;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE"}
|
|
@@ -0,0 +1,174 @@
|
|
|
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.scanProject = scanProject;
|
|
7
|
+
exports.readFileContent = readFileContent;
|
|
8
|
+
exports.fileExists = fileExists;
|
|
9
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const IGNORE_DIRS = [
|
|
12
|
+
"node_modules",
|
|
13
|
+
".git",
|
|
14
|
+
"dist",
|
|
15
|
+
"build",
|
|
16
|
+
".next",
|
|
17
|
+
".nuxt",
|
|
18
|
+
"coverage",
|
|
19
|
+
"__pycache__",
|
|
20
|
+
".venv",
|
|
21
|
+
"vendor",
|
|
22
|
+
];
|
|
23
|
+
const CONFIG_PATTERNS = [
|
|
24
|
+
"package.json",
|
|
25
|
+
"tsconfig.json",
|
|
26
|
+
"jsconfig.json",
|
|
27
|
+
"next.config.*",
|
|
28
|
+
"vite.config.*",
|
|
29
|
+
"webpack.config.*",
|
|
30
|
+
"tailwind.config.*",
|
|
31
|
+
"postcss.config.*",
|
|
32
|
+
".eslintrc*",
|
|
33
|
+
".prettierrc*",
|
|
34
|
+
"Dockerfile",
|
|
35
|
+
"docker-compose.*",
|
|
36
|
+
".env",
|
|
37
|
+
".env.example",
|
|
38
|
+
"Makefile",
|
|
39
|
+
"Cargo.toml",
|
|
40
|
+
"go.mod",
|
|
41
|
+
"requirements.txt",
|
|
42
|
+
"pyproject.toml",
|
|
43
|
+
];
|
|
44
|
+
async function scanProject(rootPath) {
|
|
45
|
+
const ctx = {
|
|
46
|
+
rootPath,
|
|
47
|
+
packageJson: null,
|
|
48
|
+
framework: "unknown",
|
|
49
|
+
dependencies: [],
|
|
50
|
+
devDependencies: [],
|
|
51
|
+
structure: [],
|
|
52
|
+
configFiles: [],
|
|
53
|
+
sourceFiles: [],
|
|
54
|
+
};
|
|
55
|
+
try {
|
|
56
|
+
await scanDirectory(rootPath, ctx, rootPath, 0);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// partial scan is fine
|
|
60
|
+
}
|
|
61
|
+
await detectFramework(ctx);
|
|
62
|
+
return ctx;
|
|
63
|
+
}
|
|
64
|
+
async function scanDirectory(dir, ctx, root, depth) {
|
|
65
|
+
if (depth > 4)
|
|
66
|
+
return;
|
|
67
|
+
let entries;
|
|
68
|
+
try {
|
|
69
|
+
entries = await promises_1.default.readdir(dir);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
for (const entry of entries) {
|
|
75
|
+
if (IGNORE_DIRS.includes(entry))
|
|
76
|
+
continue;
|
|
77
|
+
if (entry.startsWith("."))
|
|
78
|
+
continue;
|
|
79
|
+
const fullPath = path_1.default.join(dir, entry);
|
|
80
|
+
let stat;
|
|
81
|
+
try {
|
|
82
|
+
stat = await promises_1.default.stat(fullPath);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (stat.isDirectory()) {
|
|
88
|
+
const rel = path_1.default.relative(root, fullPath);
|
|
89
|
+
ctx.structure.push(rel + "/");
|
|
90
|
+
await scanDirectory(fullPath, ctx, root, depth + 1);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
const rel = path_1.default.relative(root, fullPath);
|
|
94
|
+
if (entry === "package.json" && depth === 0) {
|
|
95
|
+
try {
|
|
96
|
+
const raw = await promises_1.default.readFile(fullPath, "utf-8");
|
|
97
|
+
const pkg = JSON.parse(raw);
|
|
98
|
+
ctx.packageJson = pkg;
|
|
99
|
+
ctx.dependencies = Object.keys(pkg.dependencies || {});
|
|
100
|
+
ctx.devDependencies = Object.keys(pkg.devDependencies || {});
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// skip
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const isConfig = CONFIG_PATTERNS.some((pattern) => {
|
|
107
|
+
const regex = new RegExp("^" + pattern.replace(/\*/g, ".*") + "$");
|
|
108
|
+
return regex.test(entry);
|
|
109
|
+
});
|
|
110
|
+
if (isConfig) {
|
|
111
|
+
ctx.configFiles.push(rel);
|
|
112
|
+
}
|
|
113
|
+
if (/\.(ts|tsx|js|jsx|py|go|rs|java|vue|svelte)$/.test(entry)) {
|
|
114
|
+
ctx.sourceFiles.push(rel);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function detectFramework(ctx) {
|
|
120
|
+
const deps = [...ctx.dependencies, ...ctx.devDependencies];
|
|
121
|
+
const configFiles = ctx.configFiles.map((f) => path_1.default.basename(f));
|
|
122
|
+
if (deps.includes("next") || configFiles.some((f) => f.startsWith("next.config"))) {
|
|
123
|
+
ctx.framework = "Next.js";
|
|
124
|
+
}
|
|
125
|
+
else if (deps.includes("nuxt") || configFiles.some((f) => f.startsWith("nuxt.config"))) {
|
|
126
|
+
ctx.framework = "Nuxt.js";
|
|
127
|
+
}
|
|
128
|
+
else if (deps.includes("react")) {
|
|
129
|
+
ctx.framework = "React";
|
|
130
|
+
}
|
|
131
|
+
else if (deps.includes("vue")) {
|
|
132
|
+
ctx.framework = "Vue.js";
|
|
133
|
+
}
|
|
134
|
+
else if (deps.includes("svelte")) {
|
|
135
|
+
ctx.framework = "Svelte";
|
|
136
|
+
}
|
|
137
|
+
else if (deps.includes("express")) {
|
|
138
|
+
ctx.framework = "Express.js";
|
|
139
|
+
}
|
|
140
|
+
else if (deps.includes("fastify")) {
|
|
141
|
+
ctx.framework = "Fastify";
|
|
142
|
+
}
|
|
143
|
+
else if (deps.includes("nestjs")) {
|
|
144
|
+
ctx.framework = "NestJS";
|
|
145
|
+
}
|
|
146
|
+
else if (deps.includes("angular")) {
|
|
147
|
+
ctx.framework = "Angular";
|
|
148
|
+
}
|
|
149
|
+
else if (configFiles.includes("Dockerfile")) {
|
|
150
|
+
ctx.framework = "Docker";
|
|
151
|
+
}
|
|
152
|
+
else if (configFiles.includes("go.mod")) {
|
|
153
|
+
ctx.framework = "Go";
|
|
154
|
+
}
|
|
155
|
+
else if (configFiles.includes("Cargo.toml")) {
|
|
156
|
+
ctx.framework = "Rust";
|
|
157
|
+
}
|
|
158
|
+
else if (configFiles.includes("requirements.txt") || configFiles.includes("pyproject.toml")) {
|
|
159
|
+
ctx.framework = "Python";
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async function readFileContent(filePath) {
|
|
163
|
+
return promises_1.default.readFile(filePath, "utf-8");
|
|
164
|
+
}
|
|
165
|
+
async function fileExists(filePath) {
|
|
166
|
+
try {
|
|
167
|
+
await promises_1.default.access(filePath);
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/filesystem/index.ts"],"names":[],"mappings":";;;;;AAuCA,kCAoBC;AAiGD,0CAEC;AAED,gCAOC;AAvKD,2DAA6B;AAC7B,gDAAwB;AAGxB,MAAM,WAAW,GAAG;IAClB,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,UAAU;IACV,aAAa;IACb,OAAO;IACP,QAAQ;CACT,CAAC;AAEF,MAAM,eAAe,GAAG;IACtB,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,kBAAkB;IAClB,mBAAmB;IACnB,kBAAkB;IAClB,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,kBAAkB;IAClB,MAAM;IACN,cAAc;IACd,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,kBAAkB;IAClB,gBAAgB;CACjB,CAAC;AAEK,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,MAAM,GAAG,GAAmB;QAC1B,QAAQ;QACR,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,SAAS;QACpB,YAAY,EAAE,EAAE;QAChB,eAAe,EAAE,EAAE;QACnB,SAAS,EAAE,EAAE;QACb,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,EAAE;KAChB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;IAED,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,GAAW,EACX,GAAmB,EACnB,IAAY,EACZ,KAAa;IAEb,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO;IAEtB,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAC1C,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAEpC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,kBAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,cAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC1C,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;YAC9B,MAAM,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,cAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAE1C,IAAI,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC5B,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC;oBACtB,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;oBACvD,GAAG,CAAC,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;gBAC/D,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO;gBACT,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;gBAChD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;gBACnE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;YAEH,IAAI,QAAQ,EAAE,CAAC;gBACb,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;YAED,IAAI,6CAA6C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9D,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAmB;IAChD,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QAClF,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACzF,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC;IAC1B,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC3B,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC3B,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,SAAS,GAAG,YAAY,CAAC;IAC/B,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC3B,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;SAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC3B,CAAC;SAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;IACvB,CAAC;SAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;IACzB,CAAC;SAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC9F,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC3B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,OAAO,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { GitStatus } from "../types";
|
|
2
|
+
export declare function getStatus(): Promise<GitStatus>;
|
|
3
|
+
export declare function getDiff(): Promise<string>;
|
|
4
|
+
export declare function getLog(count?: number): Promise<string>;
|
|
5
|
+
export declare function getBranches(): Promise<string>;
|
|
6
|
+
export declare function commit(message: string): Promise<string>;
|
|
7
|
+
export declare function stageAndCommit(files: string[], message: string): Promise<string>;
|
|
8
|
+
export declare function isGitRepo(): Promise<boolean>;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAWrC,wBAAsB,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAoBpD;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAO/C;AAED,wBAAsB,MAAM,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBhE;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBnD;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS7D;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAOlD"}
|
|
@@ -0,0 +1,121 @@
|
|
|
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.getStatus = getStatus;
|
|
7
|
+
exports.getDiff = getDiff;
|
|
8
|
+
exports.getLog = getLog;
|
|
9
|
+
exports.getBranches = getBranches;
|
|
10
|
+
exports.commit = commit;
|
|
11
|
+
exports.stageAndCommit = stageAndCommit;
|
|
12
|
+
exports.isGitRepo = isGitRepo;
|
|
13
|
+
const simple_git_1 = __importDefault(require("simple-git"));
|
|
14
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
15
|
+
let git = null;
|
|
16
|
+
function getGit() {
|
|
17
|
+
if (!git) {
|
|
18
|
+
git = (0, simple_git_1.default)(process.cwd());
|
|
19
|
+
}
|
|
20
|
+
return git;
|
|
21
|
+
}
|
|
22
|
+
async function getStatus() {
|
|
23
|
+
try {
|
|
24
|
+
const g = getGit();
|
|
25
|
+
const status = await g.status();
|
|
26
|
+
return {
|
|
27
|
+
branch: status.current || "detached",
|
|
28
|
+
staged: status.staged,
|
|
29
|
+
modified: status.modified,
|
|
30
|
+
untracked: status.not_added,
|
|
31
|
+
clean: status.isClean(),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return {
|
|
36
|
+
branch: "unknown",
|
|
37
|
+
staged: [],
|
|
38
|
+
modified: [],
|
|
39
|
+
untracked: [],
|
|
40
|
+
clean: true,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async function getDiff() {
|
|
45
|
+
try {
|
|
46
|
+
const g = getGit();
|
|
47
|
+
return await g.diff();
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
return chalk_1.default.red("Could not get diff: " + err.message);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function getLog(count = 10) {
|
|
54
|
+
try {
|
|
55
|
+
const g = getGit();
|
|
56
|
+
const log = await g.log({ maxCount: count });
|
|
57
|
+
let output = "";
|
|
58
|
+
for (const item of log.all) {
|
|
59
|
+
const hash = chalk_1.default.yellow(item.hash.slice(0, 7));
|
|
60
|
+
const msg = item.message;
|
|
61
|
+
const date = chalk_1.default.dim(item.date);
|
|
62
|
+
const author = chalk_1.default.dim(item.author_name);
|
|
63
|
+
output += `${hash} ${msg} ${date} ${author}\n`;
|
|
64
|
+
}
|
|
65
|
+
return output || chalk_1.default.dim("No commits found");
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
return chalk_1.default.red("Could not get log: " + err.message);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async function getBranches() {
|
|
72
|
+
try {
|
|
73
|
+
const g = getGit();
|
|
74
|
+
const branches = await g.branchLocal();
|
|
75
|
+
let output = "";
|
|
76
|
+
for (const branch of branches.all) {
|
|
77
|
+
if (branch === branches.current) {
|
|
78
|
+
output += chalk_1.default.green(`* ${branch}`) + " (current)\n";
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
output += ` ${branch}\n`;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return output || chalk_1.default.dim("No branches found");
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
return chalk_1.default.red("Could not get branches: " + err.message);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function commit(message) {
|
|
91
|
+
try {
|
|
92
|
+
const g = getGit();
|
|
93
|
+
await g.add(".");
|
|
94
|
+
const result = await g.commit(message);
|
|
95
|
+
return chalk_1.default.green(`✓ Committed: ${result.commit} — ${message}`);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return chalk_1.default.red("Commit failed: " + err.message);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function stageAndCommit(files, message) {
|
|
102
|
+
try {
|
|
103
|
+
const g = getGit();
|
|
104
|
+
await g.add(files);
|
|
105
|
+
const result = await g.commit(message);
|
|
106
|
+
return chalk_1.default.green(`✓ Committed: ${result.commit} — ${message}`);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
return chalk_1.default.red("Commit failed: " + err.message);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function isGitRepo() {
|
|
113
|
+
try {
|
|
114
|
+
await getGit().status();
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const config_1 = require("./config");
|
|
43
|
+
const memory_1 = require("./memory");
|
|
44
|
+
const ai_1 = require("./ai");
|
|
45
|
+
const commands_1 = require("./commands");
|
|
46
|
+
const ui_1 = require("./ui");
|
|
47
|
+
const config_cmd_1 = require("./commands/config-cmd");
|
|
48
|
+
const program = new commander_1.Command();
|
|
49
|
+
program
|
|
50
|
+
.name("devcore")
|
|
51
|
+
.description("DevCore AI — AI-Powered Coding Assistant")
|
|
52
|
+
.version("1.0.0");
|
|
53
|
+
program
|
|
54
|
+
.command("chat", { isDefault: true })
|
|
55
|
+
.description("Start an interactive chat session")
|
|
56
|
+
.action(async () => {
|
|
57
|
+
console.log(ui_1.LOGO);
|
|
58
|
+
const config = await (0, config_1.loadConfig)();
|
|
59
|
+
if (!(0, config_1.isConfigured)(config)) {
|
|
60
|
+
console.log((0, ui_1.error)("API key not configured.\n"));
|
|
61
|
+
console.log((0, ui_1.info)("Run: devcore config to set your API key\n"));
|
|
62
|
+
console.log((0, ui_1.info)("Or set DEVCORE_API_KEY in your .env file\n"));
|
|
63
|
+
const updated = await (0, config_cmd_1.configCommand)(config);
|
|
64
|
+
if (!updated.apiKey) {
|
|
65
|
+
console.log((0, ui_1.error)("Cannot start without an API key. Exiting."));
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const ai = new ai_1.AIService(config);
|
|
70
|
+
const session = await (0, memory_1.createSession)();
|
|
71
|
+
console.log((0, ui_1.info)(`Model: ${chalk_1.default.cyan(config.model)} | Type /help for commands\n`));
|
|
72
|
+
await (0, commands_1.chatLoop)(config, session, ai);
|
|
73
|
+
});
|
|
74
|
+
program
|
|
75
|
+
.command("config")
|
|
76
|
+
.description("Configure DevCore AI settings")
|
|
77
|
+
.action(async () => {
|
|
78
|
+
console.log(ui_1.LOGO);
|
|
79
|
+
const config = await (0, config_1.loadConfig)();
|
|
80
|
+
await (0, config_cmd_1.configCommand)(config);
|
|
81
|
+
});
|
|
82
|
+
program
|
|
83
|
+
.command("review")
|
|
84
|
+
.description("Review code in current project")
|
|
85
|
+
.argument("[file]", "Specific file to review")
|
|
86
|
+
.action(async (file) => {
|
|
87
|
+
const config = await (0, config_1.loadConfig)();
|
|
88
|
+
if (!(0, config_1.isConfigured)(config)) {
|
|
89
|
+
console.log((0, ui_1.error)("API key required. Run: devcore config"));
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
const ai = new ai_1.AIService(config);
|
|
93
|
+
const { scanProject } = await Promise.resolve().then(() => __importStar(require("./filesystem")));
|
|
94
|
+
const { reviewCommand } = await Promise.resolve().then(() => __importStar(require("./commands/review-cmd")));
|
|
95
|
+
const ctx = await scanProject(process.cwd());
|
|
96
|
+
console.log(await reviewCommand(file || "", ctx, ai));
|
|
97
|
+
});
|
|
98
|
+
program
|
|
99
|
+
.command("exec")
|
|
100
|
+
.description("Execute a terminal command with confirmation")
|
|
101
|
+
.argument("<command...>", "Command to execute")
|
|
102
|
+
.action(async (cmdParts) => {
|
|
103
|
+
const cmd = cmdParts.join(" ");
|
|
104
|
+
const { terminalCommand } = await Promise.resolve().then(() => __importStar(require("./commands/terminal-cmd")));
|
|
105
|
+
console.log(await terminalCommand(cmd));
|
|
106
|
+
});
|
|
107
|
+
program.parse(process.argv);
|
|
108
|
+
//# sourceMappingURL=index.js.map
|