@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,137 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.searchCommand = searchCommand;
37
+ const p = __importStar(require("@clack/prompts"));
38
+ const devforge_skillsmp_1 = require("devforge-skillsmp");
39
+ const devforge_shared_1 = require("devforge-shared");
40
+ const installer_1 = require("../utils/installer");
41
+ const ui_1 = require("../ui");
42
+ const theme_1 = require("../ui/theme");
43
+ const format_1 = require("../ui/format");
44
+ async function searchCommand(query) {
45
+ if (!query) {
46
+ query = (await p.text({
47
+ message: '搜索 Skill:',
48
+ placeholder: '例如:mcp server, testing, database...',
49
+ validate: (v) => (v.length < 1 ? '请输入关键词' : undefined),
50
+ }));
51
+ if (p.isCancel(query))
52
+ return;
53
+ }
54
+ // Search
55
+ const client = new devforge_skillsmp_1.SkillsMPClient(devforge_shared_1.config.skillsmp.apiKey, devforge_shared_1.config.skillsmp.dailyLimit);
56
+ const spinner = new ui_1.Spinner('搜索中...');
57
+ spinner.start();
58
+ let result;
59
+ try {
60
+ result = await client.search({ q: query, limit: 20, sortBy: 'stars' });
61
+ spinner.succeed(`找到 ${result.skills.length} 个 Skill`);
62
+ }
63
+ catch {
64
+ spinner.fail('搜索失败');
65
+ return;
66
+ }
67
+ if (result.skills.length === 0) {
68
+ console.log(` ${(0, ui_1.iconInfo)()} 没有找到匹配的 Skill`);
69
+ return;
70
+ }
71
+ // Display results as cards
72
+ console.log();
73
+ console.log((0, ui_1.renderSection)('搜索结果', { color: theme_1.PRIMARY }));
74
+ const cards = result.skills.map((skill) => ({
75
+ name: skill.name,
76
+ subtitle: `by ${skill.author}`,
77
+ metadata: (0, format_1.formatStars)(skill.stars),
78
+ description: skill.description,
79
+ }));
80
+ console.log((0, ui_1.renderCardList)(cards, { width: 72 }).join('\n'));
81
+ // Selection
82
+ console.log();
83
+ const selected = (await p.multiselect({
84
+ message: '选择要安装的 Skill:',
85
+ options: result.skills.map((s) => ({
86
+ value: s.id,
87
+ label: `${s.name} ${theme_1.DIM}· ${s.author} ${(0, format_1.formatStars)(s.stars)}${theme_1.RESET}`,
88
+ hint: (0, format_1.truncate)(s.description, 30),
89
+ })),
90
+ required: false,
91
+ }));
92
+ if (p.isCancel(selected) || selected.length === 0) {
93
+ console.log(` ${(0, ui_1.iconInfo)()} 未选择任何 Skill`);
94
+ return;
95
+ }
96
+ const toInstall = result.skills.filter((s) => selected.includes(s.id));
97
+ // Install with phase tracker
98
+ console.log();
99
+ console.log((0, ui_1.renderSection)('安装 Skill', { color: theme_1.SUCCESS }));
100
+ const pt = new ui_1.PhaseTracker(72);
101
+ pt.setPhases([
102
+ { name: '下载 Skill', status: 'active' },
103
+ { name: '完成配置', status: 'pending' },
104
+ ]);
105
+ pt.begin();
106
+ for (let i = 0; i < toInstall.length; i++) {
107
+ pt.addSubTask(0, { name: toInstall[i].name, status: 'pending' });
108
+ }
109
+ const installResult = await (0, installer_1.installSkills)(toInstall.map((s) => ({ id: s.id, name: s.name, githubUrl: s.githubUrl })), undefined, (phase, item, status, detail) => {
110
+ if (phase === 'downloading') {
111
+ const idx = toInstall.findIndex((s) => s.name === item);
112
+ if (idx >= 0) {
113
+ if (status === 'downloading')
114
+ pt.updateSubTask(0, idx, 'active', '下载中...');
115
+ else if (status === 'completed')
116
+ pt.updateSubTask(0, idx, 'completed', detail);
117
+ else if (status === 'skipped')
118
+ pt.updateSubTask(0, idx, 'failed', '已存在');
119
+ else if (status === 'failed')
120
+ pt.updateSubTask(0, idx, 'failed', detail);
121
+ }
122
+ }
123
+ });
124
+ pt.updatePhase(0, installResult.failed > 0 && installResult.success === 0 ? 'failed' : 'completed');
125
+ pt.updatePhase(1, installResult.success > 0 ? 'completed' : 'failed');
126
+ pt.complete();
127
+ // Summary
128
+ console.log();
129
+ console.log(` ${(0, ui_1.iconSuccess)()} ${theme_1.BOLD}成功安装 ${installResult.success} 个 Skill${theme_1.RESET}`);
130
+ if (installResult.failed > 0) {
131
+ console.log(` ${theme_1.WARNING}⚠${theme_1.RESET} ${installResult.failed} 个安装失败`);
132
+ for (const err of installResult.errors)
133
+ console.log(` ${theme_1.DIM}${err}${theme_1.RESET}`);
134
+ }
135
+ console.log();
136
+ }
137
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.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,87 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const create_1 = require("./commands/create");
5
+ const search_1 = require("./commands/search");
6
+ const install_1 = require("./commands/install");
7
+ const config_1 = require("./commands/config");
8
+ const art_1 = require("./utils/art");
9
+ const ui_1 = require("./ui");
10
+ const theme_1 = require("./ui/theme");
11
+ const VERSION = '0.1.0';
12
+ async function main() {
13
+ const args = process.argv.slice(2);
14
+ const command = args[0] || '';
15
+ try {
16
+ switch (command) {
17
+ case 'create':
18
+ await (0, config_1.ensureConfig)();
19
+ await (0, create_1.createCommand)(args.slice(1).join(' ') || undefined);
20
+ break;
21
+ case 'init':
22
+ await (0, config_1.ensureConfig)();
23
+ await (0, create_1.createCommand)(undefined, true);
24
+ break;
25
+ case 'install':
26
+ await (0, config_1.ensureConfig)();
27
+ await (0, install_1.installCommand)(args.slice(1));
28
+ break;
29
+ case 'search':
30
+ await (0, config_1.ensureConfig)();
31
+ await (0, search_1.searchCommand)(args.slice(1).join(' ') || undefined);
32
+ break;
33
+ case 'config':
34
+ await (0, config_1.configCommand)();
35
+ break;
36
+ case '--version':
37
+ case '-v':
38
+ console.log(`DevForge v${VERSION}`);
39
+ break;
40
+ case '--help':
41
+ case '-h':
42
+ case 'help':
43
+ showHelp();
44
+ break;
45
+ default:
46
+ if (command && !command.startsWith('-')) {
47
+ await (0, create_1.createCommand)(command);
48
+ }
49
+ else if (process.stdin.isTTY) {
50
+ await (0, create_1.createCommand)();
51
+ }
52
+ else {
53
+ showHelp();
54
+ }
55
+ break;
56
+ }
57
+ }
58
+ catch (err) {
59
+ console.error(`${String(err)}`);
60
+ process.exit(1);
61
+ }
62
+ }
63
+ function showHelp() {
64
+ (0, art_1.printLogo)();
65
+ console.log(` ${theme_1.BOLD}DevForge${theme_1.RESET} ${theme_1.TEXT_MUTED}v${VERSION}${theme_1.RESET} ${theme_1.DIM}— AI Native Workspace Orchestrator${theme_1.RESET}`);
66
+ console.log(` ${theme_1.DIM}为你的项目发现并安装 AI Skill${theme_1.RESET}`);
67
+ console.log();
68
+ console.log(` ${theme_1.PRIMARY}${theme_1.BOLD}用法:${theme_1.RESET}`);
69
+ console.log(` ${theme_1.BOLD}devforge create <项目名>${theme_1.RESET} 创建项目并安装 Skill`);
70
+ console.log(` ${theme_1.BOLD}devforge init${theme_1.RESET} 在当前项目初始化 Skill`);
71
+ console.log(` ${theme_1.BOLD}devforge search <关键词>${theme_1.RESET} 搜索 Skill`);
72
+ console.log(` ${theme_1.BOLD}devforge install <id...>${theme_1.RESET} 安装 Skill 到当前项目`);
73
+ console.log(` ${theme_1.BOLD}devforge config${theme_1.RESET} 配置 AI`);
74
+ console.log(` ${theme_1.BOLD}devforge --version${theme_1.RESET} 查看版本`);
75
+ console.log();
76
+ console.log(` ${theme_1.TEXT_SECONDARY}${theme_1.BOLD}示例:${theme_1.RESET}`);
77
+ console.log(` ${theme_1.DIM}devforge create my-mcp-server${theme_1.RESET}`);
78
+ console.log(` ${theme_1.DIM}devforge init${theme_1.RESET}`);
79
+ console.log(` ${theme_1.DIM}devforge search "mcp server"${theme_1.RESET}`);
80
+ console.log(` ${theme_1.DIM}devforge install mcp-server-patterns testing-standards${theme_1.RESET}`);
81
+ console.log();
82
+ console.log((0, ui_1.renderDivider)({ char: '─', color: theme_1.BORDER }));
83
+ console.log(` ${theme_1.DIM}环境变量配置: devforge config${theme_1.RESET}`);
84
+ console.log();
85
+ }
86
+ main();
87
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Render a badge/tag: `[text]`
3
+ */
4
+ export declare function renderBadge(text: string, color?: string): string;
5
+ export declare const BADGE_AI: string;
6
+ export declare const BADGE_CORE: string;
7
+ export declare const BADGE_TESTING: string;
8
+ export declare const BADGE_DB: string;
9
+ export declare const BADGE_API: string;
10
+ export declare const BADGE_DEPLOY: string;
11
+ export declare const BADGE_TOOL: string;
12
+ export declare const BADGE_POPULAR: string;
13
+ /** Map category string to pre-built badge */
14
+ export declare function badgeForCategory(category: string): string;
15
+ //# sourceMappingURL=badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../src/ui/badge.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAgB,GAAG,MAAM,CAEzE;AAID,eAAO,MAAM,QAAQ,QAA8C,CAAA;AACnE,eAAO,MAAM,UAAU,QAAqC,CAAA;AAC5D,eAAO,MAAM,aAAa,QAA+B,CAAA;AACzD,eAAO,MAAM,QAAQ,QAAwC,CAAA;AAC7D,eAAO,MAAM,SAAS,QAAwC,CAAA;AAC9D,eAAO,MAAM,YAAY,QAAiC,CAAA;AAC1D,eAAO,MAAM,UAAU,QAAwC,CAAA;AAC/D,eAAO,MAAM,aAAa,QAAkC,CAAA;AAE5D,6CAA6C;AAC7C,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWzD"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BADGE_POPULAR = exports.BADGE_TOOL = exports.BADGE_DEPLOY = exports.BADGE_API = exports.BADGE_DB = exports.BADGE_TESTING = exports.BADGE_CORE = exports.BADGE_AI = void 0;
4
+ exports.renderBadge = renderBadge;
5
+ exports.badgeForCategory = badgeForCategory;
6
+ const theme_1 = require("./theme");
7
+ /**
8
+ * Render a badge/tag: `[text]`
9
+ */
10
+ function renderBadge(text, color = theme_1.PRIMARY) {
11
+ return `${color}[${text}]${theme_1.RESET}`;
12
+ }
13
+ // ── Presets ───────────────────────────────────────────
14
+ exports.BADGE_AI = renderBadge('AI推荐', theme_1.PRIMARY_BRIGHT);
15
+ exports.BADGE_CORE = renderBadge('核心', theme_1.SUCCESS);
16
+ exports.BADGE_TESTING = renderBadge('测试', theme_1.INFO);
17
+ exports.BADGE_DB = renderBadge('数据库', theme_1.SECONDARY);
18
+ exports.BADGE_API = renderBadge('API', theme_1.WARNING);
19
+ exports.BADGE_DEPLOY = renderBadge('部署', theme_1.ERROR);
20
+ exports.BADGE_TOOL = renderBadge('工具', theme_1.TEXT_MUTED);
21
+ exports.BADGE_POPULAR = renderBadge('热门', theme_1.WARNING);
22
+ /** Map category string to pre-built badge */
23
+ function badgeForCategory(category) {
24
+ const map = {
25
+ '核心': exports.BADGE_CORE,
26
+ '测试': exports.BADGE_TESTING,
27
+ '数据库': exports.BADGE_DB,
28
+ 'API': exports.BADGE_API,
29
+ 'api': exports.BADGE_API,
30
+ '部署': exports.BADGE_DEPLOY,
31
+ '工具': exports.BADGE_TOOL,
32
+ };
33
+ return map[category] || renderBadge(category, theme_1.PRIMARY);
34
+ }
35
+ //# sourceMappingURL=badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.js","sourceRoot":"","sources":["../../src/ui/badge.ts"],"names":[],"mappings":";;;AAKA,kCAEC;AAcD,4CAWC;AAhCD,mCAA8G;AAE9G;;GAEG;AACH,SAAgB,WAAW,CAAC,IAAY,EAAE,QAAgB,eAAO;IAC/D,OAAO,GAAG,KAAK,IAAI,IAAI,IAAI,aAAK,EAAE,CAAA;AACpC,CAAC;AAED,yDAAyD;AAE5C,QAAA,QAAQ,GAAQ,WAAW,CAAC,MAAM,EAAK,sBAAc,CAAC,CAAA;AACtD,QAAA,UAAU,GAAM,WAAW,CAAC,IAAI,EAAO,eAAO,CAAC,CAAA;AAC/C,QAAA,aAAa,GAAG,WAAW,CAAC,IAAI,EAAO,YAAI,CAAC,CAAA;AAC5C,QAAA,QAAQ,GAAQ,WAAW,CAAC,KAAK,EAAK,iBAAS,CAAC,CAAA;AAChD,QAAA,SAAS,GAAO,WAAW,CAAC,KAAK,EAAQ,eAAO,CAAC,CAAA;AACjD,QAAA,YAAY,GAAI,WAAW,CAAC,IAAI,EAAO,aAAK,CAAC,CAAA;AAC7C,QAAA,UAAU,GAAM,WAAW,CAAC,IAAI,EAAO,kBAAU,CAAC,CAAA;AAClD,QAAA,aAAa,GAAG,WAAW,CAAC,IAAI,EAAO,eAAO,CAAC,CAAA;AAE5D,6CAA6C;AAC7C,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,GAAG,GAA2B;QAClC,IAAI,EAAE,kBAAU;QAChB,IAAI,EAAE,qBAAa;QACnB,KAAK,EAAE,gBAAQ;QACf,KAAK,EAAE,iBAAS;QAChB,KAAK,EAAE,iBAAS;QAChB,IAAI,EAAE,oBAAY;QAClB,IAAI,EAAE,kBAAU;KACjB,CAAA;IACD,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,QAAQ,EAAE,eAAO,CAAC,CAAA;AACxD,CAAC"}
@@ -0,0 +1,33 @@
1
+ interface BoxOptions {
2
+ width?: number;
3
+ padding?: number;
4
+ borderColor?: string;
5
+ }
6
+ /**
7
+ * Render a bordered box around content lines.
8
+ * ```
9
+ * ┌──────────────────────┐
10
+ * │ content │
11
+ * │ content │
12
+ * └──────────────────────┘
13
+ * ```
14
+ */
15
+ export declare function renderBox(content: string[], opts?: BoxOptions): string[];
16
+ interface TitledBoxOptions extends BoxOptions {
17
+ titleColor?: string;
18
+ }
19
+ /**
20
+ * Render a bordered box with an inline title at top-left.
21
+ * ```
22
+ * ┌── 📋 项目概览 ─────────────────────────────────────┐
23
+ * │ content │
24
+ * └────────────────────────────────────────────────────┘
25
+ * ```
26
+ */
27
+ export declare function renderTitledBox(title: string, content: string[], opts?: TitledBoxOptions): string[];
28
+ /**
29
+ * Render a simple full-width banner (no borders).
30
+ */
31
+ export declare function renderBanner(lines: string[]): string[];
32
+ export {};
33
+ //# sourceMappingURL=box.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../src/ui/box.ts"],"names":[],"mappings":"AAGA,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,UAAe,GAAG,MAAM,EAAE,CA0B5E;AAED,UAAU,gBAAiB,SAAQ,UAAU;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,gBAAqB,GAAG,MAAM,EAAE,CA4BvG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEtD"}
package/dist/ui/box.js ADDED
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderBox = renderBox;
4
+ exports.renderTitledBox = renderTitledBox;
5
+ exports.renderBanner = renderBanner;
6
+ const theme_1 = require("./theme");
7
+ /**
8
+ * Render a bordered box around content lines.
9
+ * ```
10
+ * ┌──────────────────────┐
11
+ * │ content │
12
+ * │ content │
13
+ * └──────────────────────┘
14
+ * ```
15
+ */
16
+ function renderBox(content, opts = {}) {
17
+ const width = opts.width ?? 72;
18
+ const padding = opts.padding ?? 1;
19
+ const border = opts.borderColor || theme_1.BORDER;
20
+ const innerWidth = width - 2 - padding * 2;
21
+ const result = [];
22
+ // Top border
23
+ result.push(`${border}┌${'─'.repeat(width - 2)}┐${theme_1.RESET}`);
24
+ // Content lines
25
+ for (const line of content) {
26
+ const plain = (0, theme_1.stripAnsi)(line);
27
+ const lineWidth = (0, theme_1.visibleWidth)(line);
28
+ if (lineWidth > innerWidth) {
29
+ // TODO: word-wrap long content
30
+ }
31
+ const padded = ' '.repeat(padding) + line + ' '.repeat(Math.max(0, width - 2 - padding - lineWidth));
32
+ result.push(`${border}│${theme_1.RESET}${padded}${border}│${theme_1.RESET}`);
33
+ }
34
+ // Bottom border
35
+ result.push(`${border}└${'─'.repeat(width - 2)}┘${theme_1.RESET}`);
36
+ return result;
37
+ }
38
+ /**
39
+ * Render a bordered box with an inline title at top-left.
40
+ * ```
41
+ * ┌── 📋 项目概览 ─────────────────────────────────────┐
42
+ * │ content │
43
+ * └────────────────────────────────────────────────────┘
44
+ * ```
45
+ */
46
+ function renderTitledBox(title, content, opts = {}) {
47
+ const width = opts.width ?? 72;
48
+ const padding = opts.padding ?? 1;
49
+ const border = opts.borderColor || theme_1.BORDER;
50
+ const titleColor = opts.titleColor || theme_1.TEXT_PRIMARY;
51
+ const result = [];
52
+ // Top border with title
53
+ const titlePrefix = '── ';
54
+ const titleSuffix = ' ─';
55
+ const titleFull = `${titlePrefix}${title}${titleSuffix}`;
56
+ const titleLen = (0, theme_1.visibleWidth)(titleFull);
57
+ const fillLen = Math.max(0, width - 2 - titleLen);
58
+ result.push(`${border}┌${titlePrefix}${titleColor}${title}${theme_1.RESET}${border}${titleSuffix}${'─'.repeat(fillLen)}┐${theme_1.RESET}`);
59
+ // Content lines
60
+ const innerWidth = width - 2 - padding * 2;
61
+ for (const line of content) {
62
+ const lw = (0, theme_1.visibleWidth)(line);
63
+ const padded = ' '.repeat(padding) + line + ' '.repeat(Math.max(0, width - 2 - padding - lw));
64
+ result.push(`${border}│${theme_1.RESET}${padded}${border}│${theme_1.RESET}`);
65
+ }
66
+ // Bottom border
67
+ result.push(`${border}└${'─'.repeat(width - 2)}┘${theme_1.RESET}`);
68
+ return result;
69
+ }
70
+ /**
71
+ * Render a simple full-width banner (no borders).
72
+ */
73
+ function renderBanner(lines) {
74
+ return lines;
75
+ }
76
+ //# sourceMappingURL=box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box.js","sourceRoot":"","sources":["../../src/ui/box.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ interface BadgeDef {
2
+ text: string;
3
+ color: string;
4
+ }
5
+ interface CardOptions {
6
+ icon?: string;
7
+ name: string;
8
+ subtitle?: string;
9
+ badges?: BadgeDef[];
10
+ metadata?: string;
11
+ description: string;
12
+ aiReasoning?: string;
13
+ accent?: string;
14
+ width?: number;
15
+ selected?: boolean;
16
+ }
17
+ /**
18
+ * Render a recommendation card.
19
+ *
20
+ * ```
21
+ * ┌── [AI推荐] [核心] ──────────────────────────────────┐
22
+ * │ ★ mcp-server-patterns ⭐ 1,234 热门 │
23
+ * │ ─────────────────────────────────────────────────── │
24
+ * │ MCP 服务器开发规范与最佳实践模板... │
25
+ * │ AI: 这是您项目的核心 Skill │
26
+ * └────────────────────────────────────────────────────┘
27
+ * ```
28
+ */
29
+ export declare function renderCard(opts: CardOptions): string[];
30
+ interface ListOptions {
31
+ width?: number;
32
+ gap?: number;
33
+ }
34
+ /**
35
+ * Render a vertical list of cards.
36
+ */
37
+ export declare function renderCardList(items: CardOptions[], opts?: ListOptions): string[];
38
+ export {};
39
+ //# sourceMappingURL=card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/ui/card.ts"],"names":[],"mappings":"AASA,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAqDtD;AAED,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,IAAI,GAAE,WAAgB,GAAG,MAAM,EAAE,CAWrF"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderCard = renderCard;
4
+ exports.renderCardList = renderCardList;
5
+ const theme_1 = require("./theme");
6
+ const format_1 = require("./format");
7
+ const badge_1 = require("./badge");
8
+ /**
9
+ * Render a recommendation card.
10
+ *
11
+ * ```
12
+ * ┌── [AI推荐] [核心] ──────────────────────────────────┐
13
+ * │ ★ mcp-server-patterns ⭐ 1,234 热门 │
14
+ * │ ─────────────────────────────────────────────────── │
15
+ * │ MCP 服务器开发规范与最佳实践模板... │
16
+ * │ AI: 这是您项目的核心 Skill │
17
+ * └────────────────────────────────────────────────────┘
18
+ * ```
19
+ */
20
+ function renderCard(opts) {
21
+ const width = opts.width ?? 72;
22
+ const border = theme_1.BORDER;
23
+ const accent = opts.accent || theme_1.PRIMARY;
24
+ const inner = width - 4; // 2 border + 2 padding
25
+ const result = [];
26
+ // ── Top border with badges ──
27
+ const badges = (opts.badges || []).map((b) => (0, badge_1.renderBadge)(b.text, b.color));
28
+ const badgeStr = badges.length > 0 ? ` ${badges.join(' ')} ` : '';
29
+ const badgeLen = (0, theme_1.visibleWidth)(badgeStr);
30
+ const topFill = Math.max(0, inner - badgeLen);
31
+ result.push(`${border}┌${badgeStr}${'─'.repeat(topFill)}┐${theme_1.RESET}`);
32
+ // ── Title line ──
33
+ const prefix = opts.selected
34
+ ? `${theme_1.SUCCESS}✓${theme_1.RESET} `
35
+ : opts.icon
36
+ ? `${opts.icon} `
37
+ : ' ';
38
+ const nameStr = `${theme_1.BOLD}${theme_1.TEXT_PRIMARY}${opts.name}${theme_1.RESET}`;
39
+ const metaStr = opts.metadata ? ` ${theme_1.TEXT_MUTED}${opts.metadata}${theme_1.RESET}` : '';
40
+ const titleLeft = `${prefix}${nameStr}${metaStr}`;
41
+ const titleLeftLen = (0, theme_1.visibleWidth)(titleLeft);
42
+ const rightEdge = inner - titleLeftLen;
43
+ const rightContent = '';
44
+ const titleLine = ` ${titleLeft}`;
45
+ result.push(`${border}│${theme_1.RESET}${(0, format_1.padEnd)(titleLine, inner)}${border}│${theme_1.RESET}`);
46
+ // ── Separator if there's description ──
47
+ if (opts.description || opts.aiReasoning) {
48
+ result.push(`${border}│${theme_1.RESET} ${theme_1.DIM}${'─'.repeat(inner - 2)}${theme_1.RESET} ${border}│${theme_1.RESET}`);
49
+ }
50
+ // ── Description ──
51
+ if (opts.description) {
52
+ const descLines = (0, format_1.wrap)(opts.description, inner - 4, 2);
53
+ for (const line of descLines) {
54
+ result.push(`${border}│${theme_1.RESET}${(0, format_1.padEnd)(line, inner)}${border}│${theme_1.RESET}`);
55
+ }
56
+ }
57
+ // ── AI Reasoning ──
58
+ if (opts.aiReasoning) {
59
+ const aiLine = `${theme_1.PRIMARY}AI:${theme_1.RESET} ${opts.aiReasoning}`;
60
+ result.push(`${border}│${theme_1.RESET}${(0, format_1.padEnd)(aiLine, inner)}${border}│${theme_1.RESET}`);
61
+ }
62
+ // ── Bottom border ──
63
+ result.push(`${border}└${'─'.repeat(inner)}┘${theme_1.RESET}`);
64
+ return result;
65
+ }
66
+ /**
67
+ * Render a vertical list of cards.
68
+ */
69
+ function renderCardList(items, opts = {}) {
70
+ const gap = opts.gap ?? 1;
71
+ const result = [];
72
+ for (let i = 0; i < items.length; i++) {
73
+ const card = renderCard({ ...items[i], width: opts.width });
74
+ result.push(...card);
75
+ if (i < items.length - 1 && gap > 0) {
76
+ result.push('');
77
+ }
78
+ }
79
+ return result;
80
+ }
81
+ //# sourceMappingURL=card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/ui/card.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ interface DividerOptions {
2
+ char?: string;
3
+ width?: number;
4
+ color?: string;
5
+ }
6
+ /**
7
+ * Render a horizontal divider line.
8
+ * ```
9
+ * ──────────────────────────────────────────────────────
10
+ * ```
11
+ */
12
+ export declare function renderDivider(opts?: DividerOptions): string;
13
+ interface SectionOptions extends DividerOptions {
14
+ title?: string;
15
+ titleColor?: string;
16
+ }
17
+ /**
18
+ * Render a section header with title on the left.
19
+ * ```
20
+ * ━━━ AI 分析 ——————————————————————————————————————
21
+ * ```
22
+ */
23
+ export declare function renderSection(title: string, opts?: SectionOptions): string;
24
+ /**
25
+ * Render a dimmed sub-section.
26
+ * ```
27
+ * ── 已安装 Skill ────────────────────────────────
28
+ * ```
29
+ */
30
+ export declare function renderSubSection(title: string, opts?: SectionOptions): string;
31
+ export {};
32
+ //# sourceMappingURL=divider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"divider.d.ts","sourceRoot":"","sources":["../../src/ui/divider.ts"],"names":[],"mappings":"AAIA,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,cAAmB,GAAG,MAAM,CAK/D;AAED,UAAU,cAAe,SAAQ,cAAc;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,MAAM,CAW9E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,MAAM,CAUjF"}