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.
Files changed (78) hide show
  1. package/README.md +191 -0
  2. package/dist/ai/index.d.ts +20 -0
  3. package/dist/ai/index.d.ts.map +1 -0
  4. package/dist/ai/index.js +251 -0
  5. package/dist/ai/index.js.map +1 -0
  6. package/dist/commands/config-cmd.d.ts +3 -0
  7. package/dist/commands/config-cmd.d.ts.map +1 -0
  8. package/dist/commands/config-cmd.js +106 -0
  9. package/dist/commands/config-cmd.js.map +1 -0
  10. package/dist/commands/files-cmd.d.ts +3 -0
  11. package/dist/commands/files-cmd.d.ts.map +1 -0
  12. package/dist/commands/files-cmd.js +29 -0
  13. package/dist/commands/files-cmd.js.map +1 -0
  14. package/dist/commands/git-cmd.d.ts +3 -0
  15. package/dist/commands/git-cmd.d.ts.map +1 -0
  16. package/dist/commands/git-cmd.js +114 -0
  17. package/dist/commands/git-cmd.js.map +1 -0
  18. package/dist/commands/help.d.ts +12 -0
  19. package/dist/commands/help.d.ts.map +1 -0
  20. package/dist/commands/help.js +97 -0
  21. package/dist/commands/help.js.map +1 -0
  22. package/dist/commands/image-cmd.d.ts +3 -0
  23. package/dist/commands/image-cmd.d.ts.map +1 -0
  24. package/dist/commands/image-cmd.js +38 -0
  25. package/dist/commands/image-cmd.js.map +1 -0
  26. package/dist/commands/index.d.ts +9 -0
  27. package/dist/commands/index.d.ts.map +1 -0
  28. package/dist/commands/index.js +263 -0
  29. package/dist/commands/index.js.map +1 -0
  30. package/dist/commands/review-cmd.d.ts +4 -0
  31. package/dist/commands/review-cmd.d.ts.map +1 -0
  32. package/dist/commands/review-cmd.js +72 -0
  33. package/dist/commands/review-cmd.js.map +1 -0
  34. package/dist/commands/terminal-cmd.d.ts +2 -0
  35. package/dist/commands/terminal-cmd.d.ts.map +1 -0
  36. package/dist/commands/terminal-cmd.js +34 -0
  37. package/dist/commands/terminal-cmd.js.map +1 -0
  38. package/dist/config/index.d.ts +6 -0
  39. package/dist/config/index.d.ts.map +1 -0
  40. package/dist/config/index.js +56 -0
  41. package/dist/config/index.js.map +1 -0
  42. package/dist/filesystem/index.d.ts +5 -0
  43. package/dist/filesystem/index.d.ts.map +1 -0
  44. package/dist/filesystem/index.js +174 -0
  45. package/dist/filesystem/index.js.map +1 -0
  46. package/dist/git/index.d.ts +9 -0
  47. package/dist/git/index.d.ts.map +1 -0
  48. package/dist/git/index.js +121 -0
  49. package/dist/git/index.js.map +1 -0
  50. package/dist/index.d.ts +3 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +108 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/memory/index.d.ts +10 -0
  55. package/dist/memory/index.d.ts.map +1 -0
  56. package/dist/memory/index.js +88 -0
  57. package/dist/memory/index.js.map +1 -0
  58. package/dist/terminal/index.d.ts +11 -0
  59. package/dist/terminal/index.d.ts.map +1 -0
  60. package/dist/terminal/index.js +64 -0
  61. package/dist/terminal/index.js.map +1 -0
  62. package/dist/types.d.ts +67 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +3 -0
  65. package/dist/types.js.map +1 -0
  66. package/dist/ui/index.d.ts +15 -0
  67. package/dist/ui/index.d.ts.map +1 -0
  68. package/dist/ui/index.js +74 -0
  69. package/dist/ui/index.js.map +1 -0
  70. package/dist/ui/stream-renderer.d.ts +15 -0
  71. package/dist/ui/stream-renderer.d.ts.map +1 -0
  72. package/dist/ui/stream-renderer.js +78 -0
  73. package/dist/ui/stream-renderer.js.map +1 -0
  74. package/dist/utils/index.d.ts +13 -0
  75. package/dist/utils/index.d.ts.map +1 -0
  76. package/dist/utils/index.js +68 -0
  77. package/dist/utils/index.js.map +1 -0
  78. 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,2 @@
1
+ export declare function terminalCommand(input: string): Promise<string>;
2
+ //# sourceMappingURL=terminal-cmd.d.ts.map
@@ -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":"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"}
@@ -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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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