@bundy-lmw/hive-server 1.0.1 → 1.0.3

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 (101) hide show
  1. package/dist/bootstrap.d.ts +3 -4
  2. package/dist/bootstrap.d.ts.map +1 -1
  3. package/dist/bootstrap.js +17 -24
  4. package/dist/bootstrap.js.map +1 -1
  5. package/dist/cli/commands/skill/index.d.ts +10 -0
  6. package/dist/cli/commands/skill/index.d.ts.map +1 -0
  7. package/dist/cli/commands/skill/index.js +174 -0
  8. package/dist/cli/commands/skill/index.js.map +1 -0
  9. package/dist/cli/commands/skill/installer.d.ts +75 -0
  10. package/dist/cli/commands/skill/installer.d.ts.map +1 -0
  11. package/dist/cli/commands/skill/installer.js +347 -0
  12. package/dist/cli/commands/skill/installer.js.map +1 -0
  13. package/dist/cli/index.d.ts.map +1 -1
  14. package/dist/cli/index.js +3 -0
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/gateway/http.d.ts +2 -1
  17. package/dist/gateway/http.d.ts.map +1 -1
  18. package/dist/gateway/http.js +17 -3
  19. package/dist/gateway/http.js.map +1 -1
  20. package/dist/gateway/ws/admin-handler.d.ts +24 -47
  21. package/dist/gateway/ws/admin-handler.d.ts.map +1 -1
  22. package/dist/gateway/ws/admin-handler.js +76 -465
  23. package/dist/gateway/ws/admin-handler.js.map +1 -1
  24. package/dist/gateway/ws/chat-handler.d.ts +42 -0
  25. package/dist/gateway/ws/chat-handler.d.ts.map +1 -0
  26. package/dist/gateway/ws/chat-handler.js +258 -0
  27. package/dist/gateway/ws/chat-handler.js.map +1 -0
  28. package/dist/gateway/ws/config-store.d.ts +16 -0
  29. package/dist/gateway/ws/config-store.d.ts.map +1 -0
  30. package/dist/gateway/ws/config-store.js +68 -0
  31. package/dist/gateway/ws/config-store.js.map +1 -0
  32. package/dist/gateway/ws/data-types.d.ts +3 -0
  33. package/dist/gateway/ws/data-types.d.ts.map +1 -1
  34. package/dist/gateway/ws/handler-context.d.ts +41 -0
  35. package/dist/gateway/ws/handler-context.d.ts.map +1 -0
  36. package/dist/gateway/ws/handler-context.js +8 -0
  37. package/dist/gateway/ws/handler-context.js.map +1 -0
  38. package/dist/gateway/ws/handlers/base.d.ts +14 -0
  39. package/dist/gateway/ws/handlers/base.d.ts.map +1 -0
  40. package/dist/gateway/ws/handlers/base.js +13 -0
  41. package/dist/gateway/ws/handlers/base.js.map +1 -0
  42. package/dist/gateway/ws/handlers/config-handler.d.ts +14 -0
  43. package/dist/gateway/ws/handlers/config-handler.d.ts.map +1 -0
  44. package/dist/gateway/ws/handlers/config-handler.js +53 -0
  45. package/dist/gateway/ws/handlers/config-handler.js.map +1 -0
  46. package/dist/gateway/ws/handlers/index.d.ts +10 -0
  47. package/dist/gateway/ws/handlers/index.d.ts.map +1 -0
  48. package/dist/gateway/ws/handlers/index.js +10 -0
  49. package/dist/gateway/ws/handlers/index.js.map +1 -0
  50. package/dist/gateway/ws/handlers/log-handler.d.ts +20 -0
  51. package/dist/gateway/ws/handlers/log-handler.d.ts.map +1 -0
  52. package/dist/gateway/ws/handlers/log-handler.js +65 -0
  53. package/dist/gateway/ws/handlers/log-handler.js.map +1 -0
  54. package/dist/gateway/ws/handlers/plugin-handler.d.ts +29 -0
  55. package/dist/gateway/ws/handlers/plugin-handler.d.ts.map +1 -0
  56. package/dist/gateway/ws/handlers/plugin-handler.js +197 -0
  57. package/dist/gateway/ws/handlers/plugin-handler.js.map +1 -0
  58. package/dist/gateway/ws/handlers/session-handler.d.ts +14 -0
  59. package/dist/gateway/ws/handlers/session-handler.d.ts.map +1 -0
  60. package/dist/gateway/ws/handlers/session-handler.js +36 -0
  61. package/dist/gateway/ws/handlers/session-handler.js.map +1 -0
  62. package/dist/gateway/ws/handlers/status-handler.d.ts +23 -0
  63. package/dist/gateway/ws/handlers/status-handler.d.ts.map +1 -0
  64. package/dist/gateway/ws/handlers/status-handler.js +136 -0
  65. package/dist/gateway/ws/handlers/status-handler.js.map +1 -0
  66. package/dist/gateway/ws/log-buffer.d.ts +1 -0
  67. package/dist/gateway/ws/log-buffer.d.ts.map +1 -1
  68. package/dist/gateway/ws/log-buffer.js +8 -0
  69. package/dist/gateway/ws/log-buffer.js.map +1 -1
  70. package/dist/gateway/ws/types.d.ts +1 -1
  71. package/dist/gateway/ws/types.d.ts.map +1 -1
  72. package/dist/gateway/ws/types.js.map +1 -1
  73. package/dist/graceful-shutdown.d.ts +13 -0
  74. package/dist/graceful-shutdown.d.ts.map +1 -0
  75. package/dist/graceful-shutdown.js +65 -0
  76. package/dist/graceful-shutdown.js.map +1 -0
  77. package/dist/logging/file-logger.d.ts +43 -0
  78. package/dist/logging/file-logger.d.ts.map +1 -0
  79. package/dist/logging/file-logger.js +134 -0
  80. package/dist/logging/file-logger.js.map +1 -0
  81. package/dist/logging/hive-logger.d.ts +26 -0
  82. package/dist/logging/hive-logger.d.ts.map +1 -0
  83. package/dist/logging/hive-logger.js +251 -0
  84. package/dist/logging/hive-logger.js.map +1 -0
  85. package/dist/main.d.ts +2 -0
  86. package/dist/main.d.ts.map +1 -1
  87. package/dist/main.js +68 -19
  88. package/dist/main.js.map +1 -1
  89. package/dist/plugin-manager/installer.d.ts +1 -1
  90. package/dist/plugin-manager/installer.d.ts.map +1 -1
  91. package/dist/plugin-manager/installer.js +84 -17
  92. package/dist/plugin-manager/installer.js.map +1 -1
  93. package/dist/plugin-manager/searcher.js +1 -1
  94. package/dist/plugin-manager/searcher.js.map +1 -1
  95. package/dist/plugin-manager/types.d.ts +1 -0
  96. package/dist/plugin-manager/types.d.ts.map +1 -1
  97. package/dist/plugins.d.ts +18 -0
  98. package/dist/plugins.d.ts.map +1 -1
  99. package/dist/plugins.js +50 -22
  100. package/dist/plugins.js.map +1 -1
  101. package/package.json +6 -3
@@ -5,6 +5,7 @@
5
5
  * returns a HiveContext compatible with the existing API surface.
6
6
  */
7
7
  import { type Agent, type IPlugin, type ILogger, type Server, type MessageBus } from '@bundy-lmw/hive-core';
8
+ import type { Logger as PinoLogger } from 'pino';
8
9
  import type { ServerConfig } from './config.js';
9
10
  export interface HiveContext {
10
11
  /** Message bus for event-driven communication */
@@ -26,11 +27,9 @@ export interface HiveContext {
26
27
  }
27
28
  export interface BootstrapOptions {
28
29
  config: ServerConfig;
30
+ /** Optional pino Logger — when provided, ILogger wraps this instance instead of raw console */
31
+ pinoLogger?: PinoLogger;
29
32
  }
30
33
  export declare function bootstrap(options: BootstrapOptions): Promise<HiveContext>;
31
34
  export declare function shutdown(ctx: HiveContext): Promise<void>;
32
- /**
33
- * Normalize feishu plugin config: ensure `groups` field exists and is a plain object.
34
- */
35
- export declare function normalizeFeishuPluginConfig(pluginConfig: Record<string, unknown>): Record<string, unknown>;
36
35
  //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,KAAK,UAAU,EAEhB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI/C,MAAM,WAAW,WAAW;IAC1B,iDAAiD;IACjD,GAAG,EAAE,UAAU,CAAA;IACf,0BAA0B;IAC1B,KAAK,EAAE,KAAK,CAAA;IACZ,2BAA2B;IAC3B,MAAM,EAAE,YAAY,CAAA;IACpB,qBAAqB;IACrB,OAAO,EAAE,OAAO,EAAE,CAAA;IAClB,sBAAsB;IACtB,MAAM,EAAE,OAAO,CAAA;IACf,gEAAgE;IAChE,kBAAkB,EAAE,IAAI,CAAA;IACxB,4DAA4D;IAC5D,cAAc,EAAE,IAAI,CAAA;IACpB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAA;CACrB;AAcD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAqC/E;AAMD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoB1G"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,KAAK,UAAU,EAGhB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAA;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI/C,MAAM,WAAW,WAAW;IAC1B,iDAAiD;IACjD,GAAG,EAAE,UAAU,CAAA;IACf,0BAA0B;IAC1B,KAAK,EAAE,KAAK,CAAA;IACZ,2BAA2B;IAC3B,MAAM,EAAE,YAAY,CAAA;IACpB,qBAAqB;IACrB,OAAO,EAAE,OAAO,EAAE,CAAA;IAClB,sBAAsB;IACtB,MAAM,EAAE,OAAO,CAAA;IACf,gEAAgE;IAChE,kBAAkB,EAAE,IAAI,CAAA;IACxB,4DAA4D;IAC5D,cAAc,EAAE,IAAI,CAAA;IACpB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAA;IACpB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,UAAU,CAAA;CACxB;AA0BD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CA2C/E;AAMD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9D"}
package/dist/bootstrap.js CHANGED
@@ -4,7 +4,7 @@
4
4
  * Thin wrapper around createServer() that reads ServerConfig and
5
5
  * returns a HiveContext compatible with the existing API surface.
6
6
  */
7
- import { createServer, } from '@bundy-lmw/hive-core';
7
+ import { createServer, probeEnvironment, } from '@bundy-lmw/hive-core';
8
8
  import { join } from 'path';
9
9
  import { loadPlugins } from './plugins.js';
10
10
  import { HIVE_HOME } from './config.js';
@@ -18,10 +18,24 @@ function createLogger(level) {
18
18
  error: (msg, ...args) => currentLevel <= 3 && console.error(`[ERROR] ${msg}`, ...args),
19
19
  };
20
20
  }
21
+ /** Wrap a pino Logger to satisfy the ILogger interface */
22
+ function createPinoAdapter(logger) {
23
+ const fmt = (msg, args) => args.length > 0 ? `${msg} ${args.map(a => typeof a === 'object' ? JSON.stringify(a) : String(a)).join(' ')}` : msg;
24
+ return {
25
+ debug: (msg, ...args) => logger.debug({ source: 'server' }, fmt(msg, args)),
26
+ info: (msg, ...args) => logger.info({ source: 'server' }, fmt(msg, args)),
27
+ warn: (msg, ...args) => logger.warn({ source: 'server' }, fmt(msg, args)),
28
+ error: (msg, ...args) => logger.error({ source: 'server' }, fmt(msg, args)),
29
+ };
30
+ }
21
31
  export async function bootstrap(options) {
22
32
  const { config } = options;
23
- const logger = createLogger(config.logLevel);
33
+ const logger = options.pinoLogger
34
+ ? createPinoAdapter(options.pinoLogger)
35
+ : createLogger(config.logLevel);
24
36
  const plugins = await loadPlugins();
37
+ // Probe environment once at startup
38
+ const environmentContext = probeEnvironment();
25
39
  const server = createServer({
26
40
  config: {
27
41
  externalConfig: {
@@ -40,6 +54,7 @@ export async function bootstrap(options) {
40
54
  plugins,
41
55
  dbPath: join(HIVE_HOME, 'hive.db'),
42
56
  logger,
57
+ environmentContext,
43
58
  });
44
59
  await server.start();
45
60
  return {
@@ -61,26 +76,4 @@ export async function shutdown(ctx) {
61
76
  await ctx.server.stop();
62
77
  ctx.logger.info('[shutdown] Shutdown complete');
63
78
  }
64
- /**
65
- * Normalize feishu plugin config: ensure `groups` field exists and is a plain object.
66
- */
67
- export function normalizeFeishuPluginConfig(pluginConfig) {
68
- const channels = pluginConfig.channels;
69
- if (!channels || typeof channels !== 'object')
70
- return pluginConfig;
71
- const feishu = channels.feishu;
72
- if (!feishu || typeof feishu !== 'object')
73
- return pluginConfig;
74
- const feishuConfig = feishu;
75
- if ('groups' in feishuConfig && feishuConfig.groups !== null && typeof feishuConfig.groups === 'object' && !Array.isArray(feishuConfig.groups)) {
76
- return pluginConfig;
77
- }
78
- return {
79
- ...pluginConfig,
80
- channels: {
81
- ...channels,
82
- feishu: { ...feishuConfig, groups: {} },
83
- },
84
- };
85
- }
86
79
  //# sourceMappingURL=bootstrap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Skill CLI 命令组
3
+ *
4
+ * hive skill add <source> — 从 GitHub 仓库安装技能
5
+ * hive skill list — 列出已安装技能
6
+ * hive skill remove <name> — 移除用户技能
7
+ */
8
+ import { Command } from 'commander';
9
+ export declare function createSkillCommand(): Command;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/skill/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyLpC,wBAAgB,kBAAkB,IAAI,OAAO,CAM5C"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Skill CLI 命令组
3
+ *
4
+ * hive skill add <source> — 从 GitHub 仓库安装技能
5
+ * hive skill list — 列出已安装技能
6
+ * hive skill remove <name> — 移除用户技能
7
+ */
8
+ import { Command } from 'commander';
9
+ import * as fs from 'node:fs';
10
+ import * as path from 'node:path';
11
+ import { DEFAULT_WORKSPACE_DIR, parseFrontmatter } from '@bundy-lmw/hive-core';
12
+ import { installFromSource, } from './installer.js';
13
+ const DEFAULT_BUILTIN_DIR = `${DEFAULT_WORKSPACE_DIR}/skills`;
14
+ const DEFAULT_USER_DIR = `${DEFAULT_WORKSPACE_DIR}/skills.local`;
15
+ function getBuiltinDir() {
16
+ const envDir = process.env.HIVE_SKILLS_DIR?.trim();
17
+ return envDir ? path.resolve(envDir) : path.resolve(process.cwd(), DEFAULT_BUILTIN_DIR);
18
+ }
19
+ function getUserDir() {
20
+ return path.resolve(process.cwd(), DEFAULT_USER_DIR);
21
+ }
22
+ function readSkillMetadata(skillDir) {
23
+ const skillMdPath = path.join(skillDir, 'SKILL.md');
24
+ if (!fs.existsSync(skillMdPath))
25
+ return null;
26
+ const content = fs.readFileSync(skillMdPath, 'utf-8');
27
+ try {
28
+ const { metadata } = parseFrontmatter(content);
29
+ return {
30
+ name: metadata.name,
31
+ description: metadata.description,
32
+ version: metadata.version,
33
+ };
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ function formatSkillList(skills, title) {
40
+ if (skills.length === 0)
41
+ return;
42
+ console.log(`\n ${title}:\n`);
43
+ for (const skill of skills) {
44
+ console.log(` • ${skill.name} ${skill.version ? `v${skill.version}` : ''}`);
45
+ if (skill.description) {
46
+ console.log(` ${skill.description}`);
47
+ }
48
+ }
49
+ }
50
+ function listSkillsInDir(dir) {
51
+ if (!fs.existsSync(dir))
52
+ return [];
53
+ const skills = [];
54
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
55
+ for (const entry of entries) {
56
+ if (!entry.isDirectory())
57
+ continue;
58
+ const meta = readSkillMetadata(path.join(dir, entry.name));
59
+ if (meta) {
60
+ skills.push(meta);
61
+ }
62
+ }
63
+ return skills.sort((a, b) => a.name.localeCompare(b.name));
64
+ }
65
+ // ============================================
66
+ // skill add
67
+ // ============================================
68
+ const addCommand = new Command('add')
69
+ .description('Install skills from a GitHub repository')
70
+ .argument('<source>', 'GitHub repository (owner/repo or URL)')
71
+ .option('-s, --skill <names...>', 'Install specific skills by name')
72
+ .option('-l, --list', 'List available skills without installing')
73
+ .action(async (source, options) => {
74
+ try {
75
+ const { result, discovered } = await installFromSource(source, {
76
+ listOnly: options.list,
77
+ skills: options.skill,
78
+ });
79
+ if (options.list) {
80
+ console.log(`\n Available skills in "${source}":\n`);
81
+ for (const skill of discovered) {
82
+ console.log(` • ${skill.name}`);
83
+ }
84
+ console.log();
85
+ return;
86
+ }
87
+ const total = result.installed.length + result.updated.length;
88
+ if (total === 0) {
89
+ console.log('\n No skills installed.');
90
+ if (result.skipped.length > 0) {
91
+ console.log(` Skipped (not found): ${result.skipped.join(', ')}`);
92
+ }
93
+ return;
94
+ }
95
+ if (result.installed.length > 0) {
96
+ console.log(`\n ✓ Installed: ${result.installed.join(', ')}`);
97
+ }
98
+ if (result.updated.length > 0) {
99
+ console.log(` ✓ Updated: ${result.updated.join(', ')}`);
100
+ }
101
+ if (result.skipped.length > 0) {
102
+ console.log(` ⚠ Skipped: ${result.skipped.join(', ')}`);
103
+ }
104
+ console.log();
105
+ }
106
+ catch (error) {
107
+ console.error(`\n ✗ ${error instanceof Error ? error.message : String(error)}\n`);
108
+ process.exit(1);
109
+ }
110
+ });
111
+ // ============================================
112
+ // skill list
113
+ // ============================================
114
+ const listCommand = new Command('list')
115
+ .description('List installed skills')
116
+ .action(() => {
117
+ const builtinSkills = listSkillsInDir(getBuiltinDir());
118
+ const userSkills = listSkillsInDir(getUserDir());
119
+ if (builtinSkills.length === 0 && userSkills.length === 0) {
120
+ console.log('\n No skills installed.\n');
121
+ return;
122
+ }
123
+ formatSkillList(builtinSkills, 'Built-in skills');
124
+ formatSkillList(userSkills, 'User skills');
125
+ console.log();
126
+ });
127
+ // ============================================
128
+ // skill remove
129
+ // ============================================
130
+ const removeCommand = new Command('remove')
131
+ .description('Remove a user-installed skill')
132
+ .argument('<name>', 'Skill name to remove')
133
+ .action((name) => {
134
+ const userDir = getUserDir();
135
+ const builtinDir = getBuiltinDir();
136
+ const skillPath = path.join(userDir, name);
137
+ // 路径穿越检查
138
+ const resolvedSkill = path.resolve(skillPath);
139
+ const resolvedUserDir = path.resolve(userDir);
140
+ if (!resolvedSkill.startsWith(resolvedUserDir + path.sep) && resolvedSkill !== resolvedUserDir) {
141
+ console.error(`\n ✗ Invalid skill name: "${name}"\n`);
142
+ process.exit(1);
143
+ }
144
+ // 检查是否是内置技能
145
+ const builtinSkillPath = path.join(builtinDir, name);
146
+ if (fs.existsSync(builtinSkillPath)) {
147
+ console.error(`\n ✗ Cannot remove built-in skill: ${name}. Use 'skill remove' only for user-installed skills.\n`);
148
+ process.exit(1);
149
+ }
150
+ // 检查用户技能是否存在
151
+ if (!fs.existsSync(skillPath)) {
152
+ console.error(`\n ✗ Skill not found: ${name}\n`);
153
+ process.exit(1);
154
+ }
155
+ try {
156
+ fs.rmSync(skillPath, { recursive: true, force: true });
157
+ console.log(`\n ✓ Removed: ${name}\n`);
158
+ }
159
+ catch (error) {
160
+ console.error(`\n ✗ Failed to remove ${name}: ${error instanceof Error ? error.message : String(error)}\n`);
161
+ process.exit(1);
162
+ }
163
+ });
164
+ // ============================================
165
+ // skill command group
166
+ // ============================================
167
+ export function createSkillCommand() {
168
+ return new Command('skill')
169
+ .description('Manage skills (install, list, remove)')
170
+ .addCommand(addCommand)
171
+ .addCommand(listCommand)
172
+ .addCommand(removeCommand);
173
+ }
174
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/skill/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Skill Installer
3
+ *
4
+ * 从 GitHub 仓库安装技能到 skills.local/ 目录
5
+ * 遵循 agentskills.io 标准路径发现 SKILL.md
6
+ */
7
+ export interface DiscoveredSkill {
8
+ name: string;
9
+ sourceDir: string;
10
+ skillMdPath: string;
11
+ }
12
+ export interface InstallResult {
13
+ installed: string[];
14
+ updated: string[];
15
+ skipped: string[];
16
+ }
17
+ export interface InstallOptions {
18
+ targetDir?: string;
19
+ skills?: string[];
20
+ listOnly?: boolean;
21
+ }
22
+ /**
23
+ * 解析安装源
24
+ *
25
+ * 支持格式:
26
+ * - owner/repo → https://github.com/owner/repo
27
+ * - https://github.com/owner/repo → 直通
28
+ * - git@github.com:owner/repo.git → 直通
29
+ */
30
+ export declare function parseSource(source: string): {
31
+ url: string;
32
+ repoName: string;
33
+ };
34
+ /**
35
+ * 校验 URL 安全性,防止命令注入
36
+ *
37
+ * 拒绝含空格、引号、反引号、$()、分号、-- 的输入
38
+ */
39
+ export declare function validateCloneUrl(url: string): void;
40
+ /**
41
+ * 克隆仓库到临时目录
42
+ */
43
+ export declare function cloneRepo(url: string): Promise<string>;
44
+ /**
45
+ * 在克隆的仓库目录中发现技能
46
+ *
47
+ * 按标准路径顺序查找 SKILL.md,最后递归兜底
48
+ */
49
+ export declare function discoverSkills(repoDir: string): DiscoveredSkill[];
50
+ /**
51
+ * 安装技能到目标目录
52
+ *
53
+ * 含路径穿越检查和同名覆盖处理
54
+ */
55
+ export declare function installSkills(skills: DiscoveredSkill[], targetDir: string, options?: {
56
+ filter?: string[];
57
+ }): InstallResult;
58
+ /**
59
+ * 递归删除临时目录
60
+ */
61
+ export declare function cleanup(dir: string): void;
62
+ /**
63
+ * 清理当前活跃的临时目录
64
+ */
65
+ export declare function cleanupActive(): void;
66
+ /**
67
+ * 从 GitHub 仓库安装技能
68
+ *
69
+ * 完整流程: parseSource → cloneRepo → discoverSkills → installSkills → cleanup
70
+ */
71
+ export declare function installFromSource(source: string, options?: InstallOptions): Promise<{
72
+ result: InstallResult;
73
+ discovered: DiscoveredSkill[];
74
+ }>;
75
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/skill/installer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAMD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAsB7E;AAkCD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAUlD;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB5D;AAmBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAyDjE;AAgCD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,eAAe,EAAE,EACzB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAClC,aAAa,CA4Cf;AAkCD;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAQzC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAMD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,CAuCnE"}