@zr-ovo/devforge 0.1.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 (77) hide show
  1. package/dist/ai/analyze.d.ts +25 -0
  2. package/dist/ai/analyze.d.ts.map +1 -0
  3. package/dist/ai/analyze.js +198 -0
  4. package/dist/ai/analyze.js.map +1 -0
  5. package/dist/commands/config.d.ts +6 -0
  6. package/dist/commands/config.d.ts.map +1 -0
  7. package/dist/commands/config.js +246 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/create.d.ts +2 -0
  10. package/dist/commands/create.d.ts.map +1 -0
  11. package/dist/commands/create.js +397 -0
  12. package/dist/commands/create.js.map +1 -0
  13. package/dist/commands/install.d.ts +2 -0
  14. package/dist/commands/install.d.ts.map +1 -0
  15. package/dist/commands/install.js +127 -0
  16. package/dist/commands/install.js.map +1 -0
  17. package/dist/commands/search.d.ts +2 -0
  18. package/dist/commands/search.d.ts.map +1 -0
  19. package/dist/commands/search.js +137 -0
  20. package/dist/commands/search.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +87 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/ui/badge.d.ts +15 -0
  26. package/dist/ui/badge.d.ts.map +1 -0
  27. package/dist/ui/badge.js +35 -0
  28. package/dist/ui/badge.js.map +1 -0
  29. package/dist/ui/box.d.ts +33 -0
  30. package/dist/ui/box.d.ts.map +1 -0
  31. package/dist/ui/box.js +76 -0
  32. package/dist/ui/box.js.map +1 -0
  33. package/dist/ui/card.d.ts +39 -0
  34. package/dist/ui/card.d.ts.map +1 -0
  35. package/dist/ui/card.js +81 -0
  36. package/dist/ui/card.js.map +1 -0
  37. package/dist/ui/divider.d.ts +32 -0
  38. package/dist/ui/divider.d.ts.map +1 -0
  39. package/dist/ui/divider.js +53 -0
  40. package/dist/ui/divider.js.map +1 -0
  41. package/dist/ui/format.d.ts +28 -0
  42. package/dist/ui/format.d.ts.map +1 -0
  43. package/dist/ui/format.js +93 -0
  44. package/dist/ui/format.js.map +1 -0
  45. package/dist/ui/index.d.ts +11 -0
  46. package/dist/ui/index.d.ts.map +1 -0
  47. package/dist/ui/index.js +27 -0
  48. package/dist/ui/index.js.map +1 -0
  49. package/dist/ui/progress.d.ts +47 -0
  50. package/dist/ui/progress.d.ts.map +1 -0
  51. package/dist/ui/progress.js +114 -0
  52. package/dist/ui/progress.js.map +1 -0
  53. package/dist/ui/screen.d.ts +37 -0
  54. package/dist/ui/screen.d.ts.map +1 -0
  55. package/dist/ui/screen.js +79 -0
  56. package/dist/ui/screen.js.map +1 -0
  57. package/dist/ui/spinner.d.ts +22 -0
  58. package/dist/ui/spinner.d.ts.map +1 -0
  59. package/dist/ui/spinner.js +78 -0
  60. package/dist/ui/spinner.js.map +1 -0
  61. package/dist/ui/status.d.ts +10 -0
  62. package/dist/ui/status.d.ts.map +1 -0
  63. package/dist/ui/status.js +40 -0
  64. package/dist/ui/status.js.map +1 -0
  65. package/dist/ui/theme.d.ts +33 -0
  66. package/dist/ui/theme.d.ts.map +1 -0
  67. package/dist/ui/theme.js +89 -0
  68. package/dist/ui/theme.js.map +1 -0
  69. package/dist/utils/art.d.ts +2 -0
  70. package/dist/utils/art.d.ts.map +1 -0
  71. package/dist/utils/art.js +27 -0
  72. package/dist/utils/art.js.map +1 -0
  73. package/dist/utils/installer.d.ts +35 -0
  74. package/dist/utils/installer.d.ts.map +1 -0
  75. package/dist/utils/installer.js +125 -0
  76. package/dist/utils/installer.js.map +1 -0
  77. package/package.json +31 -0
@@ -0,0 +1,10 @@
1
+ export declare function iconSuccess(): string;
2
+ export declare function iconError(): string;
3
+ export declare function iconPending(): string;
4
+ export declare function iconBullet(): string;
5
+ export declare function iconSubBullet(): string;
6
+ export declare function iconStar(): string;
7
+ export declare function iconInfo(): string;
8
+ export declare function iconDiamond(): string;
9
+ export declare function iconWarning(): string;
10
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/ui/status.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.iconSuccess = iconSuccess;
4
+ exports.iconError = iconError;
5
+ exports.iconPending = iconPending;
6
+ exports.iconBullet = iconBullet;
7
+ exports.iconSubBullet = iconSubBullet;
8
+ exports.iconStar = iconStar;
9
+ exports.iconInfo = iconInfo;
10
+ exports.iconDiamond = iconDiamond;
11
+ exports.iconWarning = iconWarning;
12
+ const theme_1 = require("./theme");
13
+ function iconSuccess() {
14
+ return `${theme_1.SUCCESS}✓${theme_1.RESET}`;
15
+ }
16
+ function iconError() {
17
+ return `${theme_1.ERROR}✗${theme_1.RESET}`;
18
+ }
19
+ function iconPending() {
20
+ return `${theme_1.TEXT_MUTED}⏳${theme_1.RESET}`;
21
+ }
22
+ function iconBullet() {
23
+ return `${theme_1.TEXT_SECONDARY}▸${theme_1.RESET}`;
24
+ }
25
+ function iconSubBullet() {
26
+ return `${theme_1.TEXT_MUTED}▪${theme_1.RESET}`;
27
+ }
28
+ function iconStar() {
29
+ return `${theme_1.PRIMARY}★${theme_1.RESET}`;
30
+ }
31
+ function iconInfo() {
32
+ return `${theme_1.INFO}ℹ${theme_1.RESET}`;
33
+ }
34
+ function iconDiamond() {
35
+ return `${theme_1.PRIMARY}◆${theme_1.RESET}`;
36
+ }
37
+ function iconWarning() {
38
+ return `${theme_1.WARNING}⚠${theme_1.RESET}`;
39
+ }
40
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/ui/status.ts"],"names":[],"mappings":";;AAEA,kCAEC;AAED,8BAEC;AAED,kCAEC;AAED,gCAEC;AAED,sCAEC;AAED,4BAEC;AAED,4BAEC;AAED,kCAEC;AAED,kCAEC;AApCD,mCAAmG;AAEnG,SAAgB,WAAW;IACzB,OAAO,GAAG,eAAO,IAAI,aAAK,EAAE,CAAA;AAC9B,CAAC;AAED,SAAgB,SAAS;IACvB,OAAO,GAAG,aAAK,IAAI,aAAK,EAAE,CAAA;AAC5B,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,GAAG,kBAAU,IAAI,aAAK,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,UAAU;IACxB,OAAO,GAAG,sBAAc,IAAI,aAAK,EAAE,CAAA;AACrC,CAAC;AAED,SAAgB,aAAa;IAC3B,OAAO,GAAG,kBAAU,IAAI,aAAK,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,QAAQ;IACtB,OAAO,GAAG,eAAO,IAAI,aAAK,EAAE,CAAA;AAC9B,CAAC;AAED,SAAgB,QAAQ;IACtB,OAAO,GAAG,YAAI,IAAI,aAAK,EAAE,CAAA;AAC3B,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,GAAG,eAAO,IAAI,aAAK,EAAE,CAAA;AAC9B,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,GAAG,eAAO,IAAI,aAAK,EAAE,CAAA;AAC9B,CAAC"}
@@ -0,0 +1,33 @@
1
+ export declare const PRIMARY = "\u001B[38;2;6;182;212m";
2
+ export declare const PRIMARY_BRIGHT = "\u001B[38;2;34;211;238m";
3
+ export declare const PRIMARY_DIM = "\u001B[38;2;8;145;178m";
4
+ export declare const SECONDARY = "\u001B[38;2;129;140;248m";
5
+ export declare const SECONDARY_DIM = "\u001B[38;2;99;102;241m";
6
+ export declare const SUCCESS = "\u001B[38;2;52;211;153m";
7
+ export declare const WARNING = "\u001B[38;2;251;191;36m";
8
+ export declare const ERROR = "\u001B[38;2;251;113;133m";
9
+ export declare const INFO = "\u001B[38;2;56;189;248m";
10
+ export declare const TEXT_PRIMARY = "\u001B[38;2;226;232;240m";
11
+ export declare const TEXT_SECONDARY = "\u001B[38;2;148;163;184m";
12
+ export declare const TEXT_MUTED = "\u001B[38;2;100;116;139m";
13
+ export declare const BG_SURFACE = "\u001B[48;2;30;41;59m";
14
+ export declare const BG_DEEP = "\u001B[48;2;15;23;42m";
15
+ export declare const BORDER = "\u001B[38;2;51;65;85m";
16
+ export declare const BOLD = "\u001B[1m";
17
+ export declare const DIM = "\u001B[2m";
18
+ export declare const RESET = "\u001B[0m";
19
+ /** Build 24-bit foreground ANSI code from RGB */
20
+ export declare function fg(r: number, g: number, b: number): string;
21
+ /** Build 24-bit background ANSI code from RGB */
22
+ export declare function bg(r: number, g: number, b: number): string;
23
+ /** Interpolate between two RGB colors */
24
+ export declare function gradient(text: string, startR: number, startG: number, startB: number, endR: number, endG: number, endB: number): string;
25
+ /** Apply gradient across array of strings (line-by-line) */
26
+ export declare function gradientLines(lines: string[], startR: number, startG: number, startB: number, endR: number, endG: number, endB: number): string[];
27
+ /** Check if terminal supports 24-bit true color */
28
+ export declare function hasTrueColor(): boolean;
29
+ /** Strip ANSI escape codes from string for width measurement */
30
+ export declare function stripAnsi(text: string): string;
31
+ /** Measure visible width of string (excluding ANSI codes) */
32
+ export declare function visibleWidth(text: string): number;
33
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,OAAO,2BAAgC,CAAA;AACpD,eAAO,MAAM,cAAc,4BAA4B,CAAA;AACvD,eAAO,MAAM,WAAW,2BAA4B,CAAA;AAEpD,eAAO,MAAM,SAAS,6BAAgC,CAAA;AACtD,eAAO,MAAM,aAAa,4BAA4B,CAAA;AAEtD,eAAO,MAAM,OAAO,4BAAiC,CAAA;AACrD,eAAO,MAAM,OAAO,4BAAiC,CAAA;AACrD,eAAO,MAAM,KAAK,6BAAoC,CAAA;AACtD,eAAO,MAAM,IAAI,4BAAoC,CAAA;AAErD,eAAO,MAAM,YAAY,6BAA+B,CAAA;AACxD,eAAO,MAAM,cAAc,6BAA6B,CAAA;AACxD,eAAO,MAAM,UAAU,6BAAiC,CAAA;AAGxD,eAAO,MAAM,UAAU,0BAA2B,CAAA;AAClD,eAAO,MAAM,OAAO,0BAA8B,CAAA;AAGlD,eAAO,MAAM,MAAM,0BAA+B,CAAA;AAGlD,eAAO,MAAM,IAAI,cAAc,CAAA;AAC/B,eAAO,MAAM,GAAG,cAAe,CAAA;AAC/B,eAAO,MAAM,KAAK,cAAc,CAAA;AAIhC,iDAAiD;AACjD,wBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,iDAAiD;AACjD,wBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,yCAAyC;AACzC,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAC9C,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GACvC,MAAM,CAaR;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAC9C,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GACvC,MAAM,EAAE,CAQV;AAED,mDAAmD;AACnD,wBAAgB,YAAY,IAAI,OAAO,CAUtC;AAED,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ // ── Color Palette ──────────────────────────────────────
3
+ // Inspired by Claude Code, Vercel, Linear — cyan/indigo accent
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.RESET = exports.DIM = exports.BOLD = exports.BORDER = exports.BG_DEEP = exports.BG_SURFACE = exports.TEXT_MUTED = exports.TEXT_SECONDARY = exports.TEXT_PRIMARY = exports.INFO = exports.ERROR = exports.WARNING = exports.SUCCESS = exports.SECONDARY_DIM = exports.SECONDARY = exports.PRIMARY_DIM = exports.PRIMARY_BRIGHT = exports.PRIMARY = void 0;
6
+ exports.fg = fg;
7
+ exports.bg = bg;
8
+ exports.gradient = gradient;
9
+ exports.gradientLines = gradientLines;
10
+ exports.hasTrueColor = hasTrueColor;
11
+ exports.stripAnsi = stripAnsi;
12
+ exports.visibleWidth = visibleWidth;
13
+ const ESC = '\x1b';
14
+ // Foreground colors
15
+ exports.PRIMARY = `${ESC}[38;2;6;182;212m`; // #06B6D4 cyan-500
16
+ exports.PRIMARY_BRIGHT = `${ESC}[38;2;34;211;238m`; // #22D3EE cyan-400
17
+ exports.PRIMARY_DIM = `${ESC}[38;2;8;145;178m`; // #0891B2 cyan-600
18
+ exports.SECONDARY = `${ESC}[38;2;129;140;248m`; // #818CF8 indigo-400
19
+ exports.SECONDARY_DIM = `${ESC}[38;2;99;102;241m`; // #6366F1 indigo-500
20
+ exports.SUCCESS = `${ESC}[38;2;52;211;153m`; // #34D399 emerald-400
21
+ exports.WARNING = `${ESC}[38;2;251;191;36m`; // #FBBF24 amber-400
22
+ exports.ERROR = `${ESC}[38;2;251;113;133m`; // #FB7185 rose-400
23
+ exports.INFO = `${ESC}[38;2;56;189;248m`; // #38BDF8 sky-400
24
+ exports.TEXT_PRIMARY = `${ESC}[38;2;226;232;240m`; // #E2E8F0 slate-200
25
+ exports.TEXT_SECONDARY = `${ESC}[38;2;148;163;184m`; // #94A3B8 slate-400
26
+ exports.TEXT_MUTED = `${ESC}[38;2;100;116;139m`; // #64748B slate-500
27
+ // Background colors
28
+ exports.BG_SURFACE = `${ESC}[48;2;30;41;59m`; // #1E293B slate-800
29
+ exports.BG_DEEP = `${ESC}[48;2;15;23;42m`; // #0F172A slate-900
30
+ // Borders
31
+ exports.BORDER = `${ESC}[38;2;51;65;85m`; // #334155 slate-700
32
+ // ANSI attributes
33
+ exports.BOLD = `${ESC}[1m`;
34
+ exports.DIM = `${ESC}[2m`;
35
+ exports.RESET = `${ESC}[0m`;
36
+ // ── Helpers ────────────────────────────────────────────
37
+ /** Build 24-bit foreground ANSI code from RGB */
38
+ function fg(r, g, b) {
39
+ return `${ESC}[38;2;${r};${g};${b}m`;
40
+ }
41
+ /** Build 24-bit background ANSI code from RGB */
42
+ function bg(r, g, b) {
43
+ return `${ESC}[48;2;${r};${g};${b}m`;
44
+ }
45
+ /** Interpolate between two RGB colors */
46
+ function gradient(text, startR, startG, startB, endR, endG, endB) {
47
+ const chars = [...text];
48
+ const len = chars.length;
49
+ if (len === 0)
50
+ return text;
51
+ return chars
52
+ .map((ch, i) => {
53
+ const t = i / Math.max(len - 1, 1);
54
+ const r = Math.round(startR + (endR - startR) * t);
55
+ const g = Math.round(startG + (endG - startG) * t);
56
+ const b = Math.round(startB + (endB - startB) * t);
57
+ return `${fg(r, g, b)}${ch}`;
58
+ })
59
+ .join('') + exports.RESET;
60
+ }
61
+ /** Apply gradient across array of strings (line-by-line) */
62
+ function gradientLines(lines, startR, startG, startB, endR, endG, endB) {
63
+ return lines.map((line, i) => {
64
+ const t = i / Math.max(lines.length - 1, 1);
65
+ const r = Math.round(startR + (endR - startR) * t);
66
+ const g = Math.round(startG + (endG - startG) * t);
67
+ const b = Math.round(startB + (endB - startB) * t);
68
+ return `${fg(r, g, b)}${line}${exports.RESET}`;
69
+ });
70
+ }
71
+ /** Check if terminal supports 24-bit true color */
72
+ function hasTrueColor() {
73
+ const env = process.env;
74
+ return !!(env.COLORTERM === 'truecolor' ||
75
+ env.COLORTERM === '24bit' ||
76
+ env.TERM_PROGRAM === 'vscode' ||
77
+ env.TERM_PROGRAM === 'iterm' ||
78
+ env.TERM_PROGRAM === 'hyper' ||
79
+ (env.TERM && env.TERM.endsWith('-direct')));
80
+ }
81
+ /** Strip ANSI escape codes from string for width measurement */
82
+ function stripAnsi(text) {
83
+ return text.replace(/\x1b\[\d+(;\d+)*m/g, '');
84
+ }
85
+ /** Measure visible width of string (excluding ANSI codes) */
86
+ function visibleWidth(text) {
87
+ return stripAnsi(text).length;
88
+ }
89
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function printLogo(): void;
2
+ //# sourceMappingURL=art.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"art.d.ts","sourceRoot":"","sources":["../../src/utils/art.ts"],"names":[],"mappings":"AAgBA,wBAAgB,SAAS,IAAI,IAAI,CAahC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.printLogo = printLogo;
4
+ const package_json_1 = require("../../package.json");
5
+ const theme_1 = require("../ui/theme");
6
+ const LOGO = [
7
+ ' ███████ ███████ ',
8
+ ' ██ ██ ██ ',
9
+ ' ██ ██ ███████ ',
10
+ ' ██ ██ ██ ',
11
+ ' ██ ██ ██ ',
12
+ ' ███████ ██ ',
13
+ ];
14
+ // Cyan → Indigo gradient
15
+ const GRADIENT_START = [6, 182, 212]; // #06B6D4
16
+ const GRADIENT_END = [129, 140, 248]; // #818CF8
17
+ function printLogo() {
18
+ const colored = (0, theme_1.gradientLines)(LOGO, GRADIENT_START[0], GRADIENT_START[1], GRADIENT_START[2], GRADIENT_END[0], GRADIENT_END[1], GRADIENT_END[2]);
19
+ for (const line of colored) {
20
+ console.log(line);
21
+ }
22
+ // Version line — final gradient color
23
+ const [er, eg, eb] = GRADIENT_END;
24
+ console.log(`${(0, theme_1.fg)(er, eg, eb)} DevForge v${package_json_1.version}\x1b[0m`);
25
+ console.log('');
26
+ }
27
+ //# sourceMappingURL=art.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"art.js","sourceRoot":"","sources":["../../src/utils/art.ts"],"names":[],"mappings":";;AAgBA,8BAaC;AA7BD,qDAA4C;AAC5C,uCAA+C;AAE/C,MAAM,IAAI,GAAG;IACX,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;CACvB,CAAA;AAED,yBAAyB;AACzB,MAAM,cAAc,GAA6B,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA,CAAI,UAAU;AAC5E,MAAM,YAAY,GAA6B,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA,CAAG,UAAU;AAE3E,SAAgB,SAAS;IACvB,MAAM,OAAO,GAAG,IAAA,qBAAa,EAC3B,IAAI,EACJ,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EACvD,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAClD,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;IACD,sCAAsC;IACtC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,YAAY,CAAA;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAE,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,eAAe,sBAAO,SAAS,CAAC,CAAA;IAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACjB,CAAC"}
@@ -0,0 +1,35 @@
1
+ interface InstallTarget {
2
+ id: string;
3
+ name: string;
4
+ githubUrl: string;
5
+ }
6
+ export type ProgressEvent = 'downloading' | 'completed' | 'skipped' | 'failed';
7
+ export type ProgressCallback = (phase: string, item: string, status: ProgressEvent, detail?: string) => void;
8
+ interface SkillResult {
9
+ id: string;
10
+ name: string;
11
+ status: 'success' | 'skipped' | 'failed';
12
+ duration: number;
13
+ error?: string;
14
+ }
15
+ /**
16
+ * 从 GitHub URL 解析 owner/repo/branch/path
17
+ * https://github.com/{owner}/{repo}/tree/{branch}/{path}
18
+ * https://github.com/{owner}/{repo}/blob/{branch}/{path}
19
+ */
20
+ declare function parseGithubUrl(url: string): {
21
+ owner: string;
22
+ repo: string;
23
+ branch: string;
24
+ path: string;
25
+ } | null;
26
+ /** 安装 Skill 到目标目录的 .claude/skills/ 下 */
27
+ export declare function installSkills(skills: InstallTarget[], targetDir?: string, onProgress?: ProgressCallback): Promise<{
28
+ success: number;
29
+ failed: number;
30
+ skipped: number;
31
+ errors: string[];
32
+ results: SkillResult[];
33
+ }>;
34
+ export { parseGithubUrl };
35
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/utils/installer.ts"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAA;AAC9E,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;AAE5G,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;IACxC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAKD;;;;GAIG;AACH,iBAAS,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAkBzG;AAgDD,wCAAwC;AACxC,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EAAE,EACvB,SAAS,SAAgB,EACzB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC,CA+CzG;AAED,OAAO,EAAE,cAAc,EAAE,CAAA"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.installSkills = installSkills;
4
+ exports.parseGithubUrl = parseGithubUrl;
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ const FETCH_TIMEOUT = 30_000;
8
+ const MAX_RETRIES = 1;
9
+ /**
10
+ * 从 GitHub URL 解析 owner/repo/branch/path
11
+ * https://github.com/{owner}/{repo}/tree/{branch}/{path}
12
+ * https://github.com/{owner}/{repo}/blob/{branch}/{path}
13
+ */
14
+ function parseGithubUrl(url) {
15
+ try {
16
+ const u = new URL(url);
17
+ if (u.hostname !== 'github.com')
18
+ return null;
19
+ const parts = u.pathname.split('/').filter(Boolean);
20
+ // [owner, repo, 'tree'|'blob', branch, ...path]
21
+ if (parts.length < 4)
22
+ return null;
23
+ const branchIdx = parts.findIndex((p) => p === 'tree' || p === 'blob');
24
+ if (branchIdx === -1)
25
+ return null;
26
+ return {
27
+ owner: parts[0],
28
+ repo: parts[1],
29
+ branch: parts[branchIdx + 1],
30
+ path: parts.slice(branchIdx + 2).join('/'),
31
+ };
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ /** Fetch with timeout */
38
+ async function fetchWithTimeout(url, timeoutMs = FETCH_TIMEOUT) {
39
+ const controller = new AbortController();
40
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
41
+ try {
42
+ const res = await fetch(url, { signal: controller.signal });
43
+ return res;
44
+ }
45
+ finally {
46
+ clearTimeout(timer);
47
+ }
48
+ }
49
+ /** Fetch with retry */
50
+ async function fetchWithRetry(url, retries = MAX_RETRIES) {
51
+ for (let attempt = 0; attempt <= retries; attempt++) {
52
+ try {
53
+ const res = await fetchWithTimeout(url);
54
+ return res;
55
+ }
56
+ catch {
57
+ if (attempt >= retries)
58
+ return null;
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ /** 从 GitHub 获取 SKILL.md 原始内容 */
64
+ async function fetchSkillContent(skill) {
65
+ const parsed = parseGithubUrl(skill.githubUrl);
66
+ if (!parsed)
67
+ return null;
68
+ const rawUrl = `https://raw.githubusercontent.com/${parsed.owner}/${parsed.repo}/${parsed.branch}/${parsed.path}`;
69
+ try {
70
+ const res = await fetchWithRetry(rawUrl);
71
+ if (!res || !res.ok) {
72
+ // Try alternative: maybe it's a directory, try SKILL.md in that dir
73
+ const altUrl = `https://raw.githubusercontent.com/${parsed.owner}/${parsed.repo}/${parsed.branch}/${parsed.path}/SKILL.md`;
74
+ const altRes = await fetchWithRetry(altUrl);
75
+ if (!altRes || !altRes.ok)
76
+ return null;
77
+ return await altRes.text();
78
+ }
79
+ return await res.text();
80
+ }
81
+ catch {
82
+ return null;
83
+ }
84
+ }
85
+ /** 安装 Skill 到目标目录的 .claude/skills/ 下 */
86
+ async function installSkills(skills, targetDir = process.cwd(), onProgress) {
87
+ const skillsDir = (0, path_1.resolve)(targetDir, '.claude', 'skills');
88
+ (0, fs_1.mkdirSync)(skillsDir, { recursive: true });
89
+ let success = 0;
90
+ let failed = 0;
91
+ let skippedCount = 0;
92
+ const errors = [];
93
+ const results = [];
94
+ for (const skill of skills) {
95
+ const startTime = Date.now();
96
+ onProgress?.('downloading', skill.name, 'downloading');
97
+ const skillDir = (0, path_1.join)(skillsDir, skill.name);
98
+ (0, fs_1.mkdirSync)(skillDir, { recursive: true });
99
+ const destPath = (0, path_1.join)(skillDir, 'SKILL.md');
100
+ // Check if already exists
101
+ if ((0, fs_1.existsSync)(destPath)) {
102
+ const duration = Date.now() - startTime;
103
+ errors.push(`${skill.name}: 已存在,跳过`);
104
+ results.push({ id: skill.id, name: skill.name, status: 'skipped', duration });
105
+ onProgress?.('downloading', skill.name, 'skipped', '已存在');
106
+ skippedCount++;
107
+ continue;
108
+ }
109
+ const content = await fetchSkillContent(skill);
110
+ const duration = Date.now() - startTime;
111
+ if (!content) {
112
+ errors.push(`${skill.name}: 无法获取 SKILL.md`);
113
+ results.push({ id: skill.id, name: skill.name, status: 'failed', duration, error: '无法获取 SKILL.md' });
114
+ onProgress?.('downloading', skill.name, 'failed', '无法获取');
115
+ failed++;
116
+ continue;
117
+ }
118
+ (0, fs_1.writeFileSync)(destPath, content, 'utf-8');
119
+ results.push({ id: skill.id, name: skill.name, status: 'success', duration });
120
+ onProgress?.('downloading', skill.name, 'completed', `${(duration / 1000).toFixed(1)}s`);
121
+ success++;
122
+ }
123
+ return { success, failed, skipped: skippedCount, errors, results };
124
+ }
125
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/utils/installer.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@zr-ovo/devforge",
3
+ "version": "0.1.0",
4
+ "description": "AI Native Workspace Orchestrator — 用 AI 为项目发现并安装 Claude Code Skills",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "devforge": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc -b",
14
+ "dev": "tsc --watch"
15
+ },
16
+ "dependencies": {
17
+ "devforge-shared": "^0.1.0",
18
+ "devforge-skillsmp": "^0.1.0",
19
+ "@clack/prompts": "^0.9.0"
20
+ },
21
+ "engines": {
22
+ "node": ">=18"
23
+ },
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/yuxi-ovo/devforge.git"
28
+ },
29
+ "homepage": "https://github.com/yuxi-ovo/devforge",
30
+ "keywords": ["claude-code", "skillsmp", "ai", "cli", "workspace"]
31
+ }