@bundy-lmw/hive-server 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bootstrap.d.ts +3 -4
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +17 -24
- package/dist/bootstrap.js.map +1 -1
- package/dist/cli/commands/skill/index.d.ts +10 -0
- package/dist/cli/commands/skill/index.d.ts.map +1 -0
- package/dist/cli/commands/skill/index.js +174 -0
- package/dist/cli/commands/skill/index.js.map +1 -0
- package/dist/cli/commands/skill/installer.d.ts +75 -0
- package/dist/cli/commands/skill/installer.d.ts.map +1 -0
- package/dist/cli/commands/skill/installer.js +347 -0
- package/dist/cli/commands/skill/installer.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/gateway/http.d.ts +2 -1
- package/dist/gateway/http.d.ts.map +1 -1
- package/dist/gateway/http.js +17 -3
- package/dist/gateway/http.js.map +1 -1
- package/dist/gateway/ws/admin-handler.d.ts +24 -47
- package/dist/gateway/ws/admin-handler.d.ts.map +1 -1
- package/dist/gateway/ws/admin-handler.js +76 -465
- package/dist/gateway/ws/admin-handler.js.map +1 -1
- package/dist/gateway/ws/chat-handler.d.ts +42 -0
- package/dist/gateway/ws/chat-handler.d.ts.map +1 -0
- package/dist/gateway/ws/chat-handler.js +258 -0
- package/dist/gateway/ws/chat-handler.js.map +1 -0
- package/dist/gateway/ws/config-store.d.ts +16 -0
- package/dist/gateway/ws/config-store.d.ts.map +1 -0
- package/dist/gateway/ws/config-store.js +68 -0
- package/dist/gateway/ws/config-store.js.map +1 -0
- package/dist/gateway/ws/data-types.d.ts +3 -0
- package/dist/gateway/ws/data-types.d.ts.map +1 -1
- package/dist/gateway/ws/handler-context.d.ts +41 -0
- package/dist/gateway/ws/handler-context.d.ts.map +1 -0
- package/dist/gateway/ws/handler-context.js +8 -0
- package/dist/gateway/ws/handler-context.js.map +1 -0
- package/dist/gateway/ws/handlers/base.d.ts +14 -0
- package/dist/gateway/ws/handlers/base.d.ts.map +1 -0
- package/dist/gateway/ws/handlers/base.js +13 -0
- package/dist/gateway/ws/handlers/base.js.map +1 -0
- package/dist/gateway/ws/handlers/config-handler.d.ts +14 -0
- package/dist/gateway/ws/handlers/config-handler.d.ts.map +1 -0
- package/dist/gateway/ws/handlers/config-handler.js +53 -0
- package/dist/gateway/ws/handlers/config-handler.js.map +1 -0
- package/dist/gateway/ws/handlers/index.d.ts +10 -0
- package/dist/gateway/ws/handlers/index.d.ts.map +1 -0
- package/dist/gateway/ws/handlers/index.js +10 -0
- package/dist/gateway/ws/handlers/index.js.map +1 -0
- package/dist/gateway/ws/handlers/log-handler.d.ts +20 -0
- package/dist/gateway/ws/handlers/log-handler.d.ts.map +1 -0
- package/dist/gateway/ws/handlers/log-handler.js +65 -0
- package/dist/gateway/ws/handlers/log-handler.js.map +1 -0
- package/dist/gateway/ws/handlers/plugin-handler.d.ts +29 -0
- package/dist/gateway/ws/handlers/plugin-handler.d.ts.map +1 -0
- package/dist/gateway/ws/handlers/plugin-handler.js +197 -0
- package/dist/gateway/ws/handlers/plugin-handler.js.map +1 -0
- package/dist/gateway/ws/handlers/session-handler.d.ts +14 -0
- package/dist/gateway/ws/handlers/session-handler.d.ts.map +1 -0
- package/dist/gateway/ws/handlers/session-handler.js +36 -0
- package/dist/gateway/ws/handlers/session-handler.js.map +1 -0
- package/dist/gateway/ws/handlers/status-handler.d.ts +23 -0
- package/dist/gateway/ws/handlers/status-handler.d.ts.map +1 -0
- package/dist/gateway/ws/handlers/status-handler.js +136 -0
- package/dist/gateway/ws/handlers/status-handler.js.map +1 -0
- package/dist/gateway/ws/log-buffer.d.ts +1 -0
- package/dist/gateway/ws/log-buffer.d.ts.map +1 -1
- package/dist/gateway/ws/log-buffer.js +8 -0
- package/dist/gateway/ws/log-buffer.js.map +1 -1
- package/dist/gateway/ws/types.d.ts +1 -1
- package/dist/gateway/ws/types.d.ts.map +1 -1
- package/dist/gateway/ws/types.js.map +1 -1
- package/dist/graceful-shutdown.d.ts +13 -0
- package/dist/graceful-shutdown.d.ts.map +1 -0
- package/dist/graceful-shutdown.js +65 -0
- package/dist/graceful-shutdown.js.map +1 -0
- package/dist/logging/file-logger.d.ts +43 -0
- package/dist/logging/file-logger.d.ts.map +1 -0
- package/dist/logging/file-logger.js +134 -0
- package/dist/logging/file-logger.js.map +1 -0
- package/dist/logging/hive-logger.d.ts +26 -0
- package/dist/logging/hive-logger.d.ts.map +1 -0
- package/dist/logging/hive-logger.js +251 -0
- package/dist/logging/hive-logger.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +68 -19
- package/dist/main.js.map +1 -1
- package/dist/plugin-manager/installer.d.ts +1 -1
- package/dist/plugin-manager/installer.d.ts.map +1 -1
- package/dist/plugin-manager/installer.js +84 -17
- package/dist/plugin-manager/installer.js.map +1 -1
- package/dist/plugin-manager/searcher.js +1 -1
- package/dist/plugin-manager/searcher.js.map +1 -1
- package/dist/plugin-manager/types.d.ts +1 -0
- package/dist/plugin-manager/types.d.ts.map +1 -1
- package/dist/plugins.d.ts +18 -0
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +50 -22
- package/dist/plugins.js.map +1 -1
- package/package.json +5 -2
package/dist/bootstrap.d.ts
CHANGED
|
@@ -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
|
package/dist/bootstrap.d.ts.map
CHANGED
|
@@ -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,
|
|
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 =
|
|
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
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,YAAY,
|
|
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"}
|