listen-agent 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/README.md +132 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +157 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +210 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +65 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/setup.d.ts +2 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +50 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +25 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +26 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/detect.d.ts +4 -0
- package/dist/utils/detect.d.ts.map +1 -0
- package/dist/utils/detect.js +52 -0
- package/dist/utils/detect.js.map +1 -0
- package/dist/utils/files.d.ts +7 -0
- package/dist/utils/files.d.ts.map +1 -0
- package/dist/utils/files.js +70 -0
- package/dist/utils/files.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +10 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +66 -0
- package/skills/mac-m4-lora-training/README.md +152 -0
- package/skills/mac-m4-lora-training/SKILL.md +181 -0
- package/skills/mac-m4-lora-training/scripts/auto_lora_train_mps.py +474 -0
- package/skills/mac-m4-lora-training/scripts/install_dependencies.sh +226 -0
- package/skills/mac-m4-lora-training/scripts/quick_train.sh +88 -0
- package/skills/wechat-work-notification/README.md +88 -0
- package/skills/wechat-work-notification/SKILL.md +187 -0
- package/templates/advanced/README.md +45 -0
- package/templates/advanced/SKILL.md +149 -0
- package/templates/advanced/scripts/install_dependencies.sh +14 -0
- package/templates/advanced/scripts/run_task.sh +48 -0
- package/templates/basic/README.md +17 -0
- package/templates/basic/SKILL.md +72 -0
package/README.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# Listen Agent Skills Framework
|
|
2
|
+
|
|
3
|
+
一个用于管理和安装AI助手技能的CLI工具框架。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- 🚀 支持多种AI助手 (Claude, Cursor, Windsurf, Kiro等)
|
|
8
|
+
- 📦 统一的技能管理系统
|
|
9
|
+
- 🛠️ 简单的CLI命令
|
|
10
|
+
- 📝 模板化技能创建
|
|
11
|
+
- 🔍 智能AI助手检测
|
|
12
|
+
|
|
13
|
+
## 安装
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g listen-agent
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 使用方法
|
|
20
|
+
|
|
21
|
+
### 初始化项目
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# 自动检测AI助手类型
|
|
25
|
+
listen-agent init
|
|
26
|
+
|
|
27
|
+
# 指定AI助手类型
|
|
28
|
+
listen-agent init --ai claude
|
|
29
|
+
listen-agent init --ai cursor
|
|
30
|
+
listen-agent init --ai all
|
|
31
|
+
|
|
32
|
+
# 强制覆盖现有文件
|
|
33
|
+
listen-agent init --force
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 创建技能
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# 创建基础技能
|
|
40
|
+
listen-agent create my-skill
|
|
41
|
+
|
|
42
|
+
# 使用高级模板
|
|
43
|
+
listen-agent create my-skill --template advanced
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 列出技能
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
listen-agent list
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 支持的AI助手
|
|
53
|
+
|
|
54
|
+
| AI助手 | 检测文件夹 | 安装路径 | 状态 |
|
|
55
|
+
|--------|------------|----------|------|
|
|
56
|
+
| Claude Code | `.claude/` | `.claude/skills/` | ✅ |
|
|
57
|
+
| Cursor | `.cursor/` | `.cursor/commands/` + `.shared/` | ✅ |
|
|
58
|
+
| Windsurf | `.windsurf/` | `.windsurf/workflows/` + `.shared/` | ✅ |
|
|
59
|
+
| Kiro | `.kiro/` | `.kiro/steering/` + `.shared/` | ✅ |
|
|
60
|
+
| Antigravity | `.agent/` | `.agent/workflows/` + `.shared/` | ✅ |
|
|
61
|
+
| GitHub Copilot | `.github/` | `.github/prompts/` + `.shared/` | ✅ |
|
|
62
|
+
| Codex | `.codex/` | `.codex/skills/` | ✅ |
|
|
63
|
+
| RooCode | `.roo/` | `.roo/commands/` + `.shared/` | ✅ |
|
|
64
|
+
| Qoder | `.qoder/` | `.qoder/rules/` + `.shared/` | ✅ |
|
|
65
|
+
| Gemini CLI | `.gemini/` | `.gemini/skills/` + `.shared/` | ✅ |
|
|
66
|
+
|
|
67
|
+
## 项目结构
|
|
68
|
+
|
|
69
|
+
初始化后的项目结构:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
your-project/
|
|
73
|
+
├── skills/ # 技能目录
|
|
74
|
+
│ └── my-skill/
|
|
75
|
+
│ ├── skill.json # 技能元数据
|
|
76
|
+
│ ├── README.md # 技能说明
|
|
77
|
+
│ └── prompt.md # 技能提示词
|
|
78
|
+
├── templates/ # 模板目录
|
|
79
|
+
├── listen-agent.config.json # 配置文件
|
|
80
|
+
└── .shared/ # 共享资源 (如果适用)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 技能开发
|
|
84
|
+
|
|
85
|
+
### 技能结构
|
|
86
|
+
|
|
87
|
+
每个技能包含以下文件:
|
|
88
|
+
|
|
89
|
+
- `skill.json` - 技能元数据和配置
|
|
90
|
+
- `README.md` - 技能文档
|
|
91
|
+
- `prompt.md` - AI助手提示词
|
|
92
|
+
- `config.json` - 高级配置 (可选)
|
|
93
|
+
|
|
94
|
+
### 示例技能
|
|
95
|
+
|
|
96
|
+
```json
|
|
97
|
+
{
|
|
98
|
+
"name": "my-skill",
|
|
99
|
+
"version": "1.0.0",
|
|
100
|
+
"description": "My awesome agent skill",
|
|
101
|
+
"author": "Your Name",
|
|
102
|
+
"tags": ["productivity", "automation"],
|
|
103
|
+
"aiTypes": ["claude", "cursor", "windsurf"],
|
|
104
|
+
"createdAt": "2024-01-01T00:00:00.000Z",
|
|
105
|
+
"updatedAt": "2024-01-01T00:00:00.000Z"
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 开发
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# 克隆项目
|
|
113
|
+
git clone <repository-url>
|
|
114
|
+
cd listen-agent
|
|
115
|
+
|
|
116
|
+
# 安装依赖
|
|
117
|
+
npm install
|
|
118
|
+
|
|
119
|
+
# 开发模式
|
|
120
|
+
npm run dev
|
|
121
|
+
|
|
122
|
+
# 构建
|
|
123
|
+
npm run build
|
|
124
|
+
|
|
125
|
+
# 本地测试
|
|
126
|
+
npm link
|
|
127
|
+
listen-agent --help
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## 许可证
|
|
131
|
+
|
|
132
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDvF"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { writeFile, readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
import { createDirectory, exists } from '../utils/files.js';
|
|
6
|
+
export async function createCommand(name, options) {
|
|
7
|
+
logger.title(`Creating Agent Skill: ${name}`);
|
|
8
|
+
const cwd = process.cwd();
|
|
9
|
+
const skillsDir = join(cwd, 'skills');
|
|
10
|
+
const skillPath = join(skillsDir, name);
|
|
11
|
+
// 检查skills目录是否存在
|
|
12
|
+
if (!(await exists(skillsDir))) {
|
|
13
|
+
logger.error('Skills directory not found. Run "listen-agent setup" first.');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
// 检查skill是否已存在
|
|
17
|
+
if (await exists(skillPath)) {
|
|
18
|
+
logger.error(`Skill "${name}" already exists`);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
// 创建skill目录
|
|
23
|
+
await createDirectory(skillPath);
|
|
24
|
+
// 根据模板创建文件
|
|
25
|
+
await createFromTemplate(skillPath, name, options.template || 'basic');
|
|
26
|
+
logger.success(`Skill "${name}" created successfully!`);
|
|
27
|
+
console.log();
|
|
28
|
+
console.log(chalk.bold('Created files:'));
|
|
29
|
+
console.log(` ${chalk.green('+')} skills/${name}/SKILL.md`);
|
|
30
|
+
console.log(` ${chalk.green('+')} skills/${name}/README.md`);
|
|
31
|
+
if (options.template === 'advanced') {
|
|
32
|
+
console.log(` ${chalk.green('+')} skills/${name}/scripts/`);
|
|
33
|
+
}
|
|
34
|
+
console.log();
|
|
35
|
+
console.log(chalk.bold('Next steps:'));
|
|
36
|
+
console.log(chalk.dim(` 1. Edit skills/${name}/SKILL.md to define your skill`));
|
|
37
|
+
console.log(chalk.dim(` 2. Update the metadata and instructions`));
|
|
38
|
+
console.log(chalk.dim(` 3. Test your skill with your AI assistant`));
|
|
39
|
+
console.log();
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
logger.error(`Failed to create skill "${name}"`);
|
|
43
|
+
if (error instanceof Error) {
|
|
44
|
+
logger.error(error.message);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function createFromTemplate(skillPath, name, template) {
|
|
49
|
+
const cwd = process.cwd();
|
|
50
|
+
const templateDir = join(cwd, 'templates', template);
|
|
51
|
+
// 检查模板是否存在
|
|
52
|
+
if (!(await exists(templateDir))) {
|
|
53
|
+
throw new Error(`Template "${template}" not found`);
|
|
54
|
+
}
|
|
55
|
+
// 模板变量
|
|
56
|
+
const variables = {
|
|
57
|
+
name,
|
|
58
|
+
description: `Agent skill for ${name}`,
|
|
59
|
+
author: '',
|
|
60
|
+
tags: '[]',
|
|
61
|
+
task_overview: `completing ${name} related tasks`,
|
|
62
|
+
domain: name,
|
|
63
|
+
capabilities: 'comprehensive',
|
|
64
|
+
features: 'advanced functionality',
|
|
65
|
+
capability_1_description: 'Primary capability description',
|
|
66
|
+
capability_2_description: 'Secondary capability description',
|
|
67
|
+
capability_3_description: 'Additional capability description',
|
|
68
|
+
capability_4_description: 'Extended capability description',
|
|
69
|
+
capability_5_description: 'Advanced capability description',
|
|
70
|
+
processor_requirement: 'Modern CPU',
|
|
71
|
+
memory_requirement: '≥8GB RAM',
|
|
72
|
+
storage_requirement: '≥10GB available space',
|
|
73
|
+
dependency_1: 'Python 3.8+',
|
|
74
|
+
dependency_2: 'Node.js 16+',
|
|
75
|
+
dependency_3: 'Required libraries',
|
|
76
|
+
config_param: 'default',
|
|
77
|
+
input_param: 'input_path',
|
|
78
|
+
output_param: 'output_path',
|
|
79
|
+
config_file: 'config.json',
|
|
80
|
+
result_path: 'results/',
|
|
81
|
+
param_1: 'input_path',
|
|
82
|
+
default_1: './input',
|
|
83
|
+
param_1_desc: 'Input file or directory path',
|
|
84
|
+
param_2: 'batch_size',
|
|
85
|
+
default_2: '10',
|
|
86
|
+
param_2_desc: 'Processing batch size',
|
|
87
|
+
param_3: 'verbose',
|
|
88
|
+
default_3: 'false',
|
|
89
|
+
param_3_desc: 'Enable verbose output',
|
|
90
|
+
performance_tip_1: 'Use appropriate batch sizes',
|
|
91
|
+
performance_tip_2: 'Enable parallel processing when possible',
|
|
92
|
+
security_tip_1: 'Validate all input parameters',
|
|
93
|
+
security_tip_2: 'Use secure file permissions',
|
|
94
|
+
error_handling_tip_1: 'Always check return codes',
|
|
95
|
+
error_handling_tip_2: 'Implement proper logging',
|
|
96
|
+
error_1: 'Command not found',
|
|
97
|
+
cause_1: 'Missing dependencies',
|
|
98
|
+
solution_1: 'Run install_dependencies.sh',
|
|
99
|
+
error_2: 'Permission denied',
|
|
100
|
+
cause_2: 'Insufficient file permissions',
|
|
101
|
+
solution_2: 'Check file and directory permissions',
|
|
102
|
+
error_3: 'Out of memory',
|
|
103
|
+
cause_3: 'Large dataset processing',
|
|
104
|
+
solution_3: 'Reduce batch size or increase system memory',
|
|
105
|
+
plugin_description: 'Extensible plugin architecture',
|
|
106
|
+
api_description: 'RESTful API integration',
|
|
107
|
+
batch_description: 'Batch processing capabilities',
|
|
108
|
+
monitoring_description: 'Real-time monitoring and reporting',
|
|
109
|
+
framework: 'Custom framework',
|
|
110
|
+
data_processing: 'Stream processing',
|
|
111
|
+
storage_solution: 'File-based storage',
|
|
112
|
+
communication_protocol: 'HTTP/REST',
|
|
113
|
+
feature_1: 'Feature 1 description',
|
|
114
|
+
feature_2: 'Feature 2 description',
|
|
115
|
+
feature_3: 'Feature 3 description'
|
|
116
|
+
};
|
|
117
|
+
// 复制并处理SKILL.md
|
|
118
|
+
const skillTemplate = await readFile(join(templateDir, 'SKILL.md'), 'utf-8');
|
|
119
|
+
const skillContent = replaceVariables(skillTemplate, variables);
|
|
120
|
+
await writeFile(join(skillPath, 'SKILL.md'), skillContent);
|
|
121
|
+
// 复制并处理README.md
|
|
122
|
+
const readmeTemplate = await readFile(join(templateDir, 'README.md'), 'utf-8');
|
|
123
|
+
const readmeContent = replaceVariables(readmeTemplate, variables);
|
|
124
|
+
await writeFile(join(skillPath, 'README.md'), readmeContent);
|
|
125
|
+
// 如果是高级模板,复制scripts目录
|
|
126
|
+
if (template === 'advanced') {
|
|
127
|
+
const scriptsDir = join(templateDir, 'scripts');
|
|
128
|
+
const targetScriptsDir = join(skillPath, 'scripts');
|
|
129
|
+
if (await exists(scriptsDir)) {
|
|
130
|
+
await createDirectory(targetScriptsDir);
|
|
131
|
+
// 复制脚本文件
|
|
132
|
+
const { readdir } = await import('node:fs/promises');
|
|
133
|
+
const scriptFiles = await readdir(scriptsDir);
|
|
134
|
+
for (const file of scriptFiles) {
|
|
135
|
+
const scriptTemplate = await readFile(join(scriptsDir, file), 'utf-8');
|
|
136
|
+
const scriptContent = replaceVariables(scriptTemplate, variables);
|
|
137
|
+
await writeFile(join(targetScriptsDir, file), scriptContent);
|
|
138
|
+
}
|
|
139
|
+
// 设置脚本执行权限
|
|
140
|
+
const { chmod } = await import('node:fs/promises');
|
|
141
|
+
for (const file of scriptFiles) {
|
|
142
|
+
if (file.endsWith('.sh')) {
|
|
143
|
+
await chmod(join(targetScriptsDir, file), 0o755);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function replaceVariables(content, variables) {
|
|
150
|
+
let result = content;
|
|
151
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
152
|
+
const regex = new RegExp(`{{${key}}}`, 'g');
|
|
153
|
+
result = result.replace(regex, value);
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,mBAAmB,CAAC;AAmL5E,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA0FrE"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { dirname, join } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { readdir, readFile, writeFile } from 'node:fs/promises';
|
|
4
|
+
import prompts from 'prompts';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
import { detectAIType, getAITypeDescription } from '../utils/detect.js';
|
|
9
|
+
import { exists, createDirectory } from '../utils/files.js';
|
|
10
|
+
import { AI_TYPES, AI_FOLDERS } from '../types/index.js';
|
|
11
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
async function getAvailableSkills(skillsDir) {
|
|
13
|
+
const skills = [];
|
|
14
|
+
try {
|
|
15
|
+
const skillDirs = await readdir(skillsDir, { withFileTypes: true });
|
|
16
|
+
for (const dirent of skillDirs) {
|
|
17
|
+
if (!dirent.isDirectory())
|
|
18
|
+
continue;
|
|
19
|
+
const skillPath = join(skillsDir, dirent.name);
|
|
20
|
+
const metadataPath = join(skillPath, 'skill.json');
|
|
21
|
+
if (await exists(metadataPath)) {
|
|
22
|
+
try {
|
|
23
|
+
const metadataContent = await readFile(metadataPath, 'utf-8');
|
|
24
|
+
const metadata = JSON.parse(metadataContent);
|
|
25
|
+
skills.push(metadata);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// 跳过无效的skill.json
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// 目录不存在或读取失败
|
|
35
|
+
}
|
|
36
|
+
return skills;
|
|
37
|
+
}
|
|
38
|
+
async function installSkillsToAI(cwd, skills, aiType, force) {
|
|
39
|
+
const installed = [];
|
|
40
|
+
// 确定要安装的AI类型
|
|
41
|
+
const aiTypes = aiType === 'all'
|
|
42
|
+
? Object.keys(AI_FOLDERS)
|
|
43
|
+
: [aiType];
|
|
44
|
+
for (const currentAiType of aiTypes) {
|
|
45
|
+
const folders = AI_FOLDERS[currentAiType];
|
|
46
|
+
for (const folder of folders) {
|
|
47
|
+
const targetDir = join(cwd, folder);
|
|
48
|
+
// 创建目标目录
|
|
49
|
+
await createDirectory(targetDir);
|
|
50
|
+
// 为每个skill安装到对应目录
|
|
51
|
+
for (const skill of skills) {
|
|
52
|
+
const skillSourceDir = join(cwd, 'skills', skill.name);
|
|
53
|
+
const result = await installSkillToFolder(skillSourceDir, targetDir, skill, currentAiType, force);
|
|
54
|
+
if (result) {
|
|
55
|
+
installed.push(result);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return installed;
|
|
61
|
+
}
|
|
62
|
+
async function installSkillToFolder(skillSourceDir, targetDir, skill, aiType, force) {
|
|
63
|
+
const promptPath = join(skillSourceDir, 'prompt.md');
|
|
64
|
+
if (!(await exists(promptPath))) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
let targetPath;
|
|
68
|
+
let targetFileName;
|
|
69
|
+
// 根据AI类型确定目标路径和文件名
|
|
70
|
+
switch (aiType) {
|
|
71
|
+
case 'claude':
|
|
72
|
+
targetPath = join(targetDir, 'skills', skill.name);
|
|
73
|
+
await createDirectory(targetPath);
|
|
74
|
+
targetFileName = join(targetPath, 'skill.md');
|
|
75
|
+
break;
|
|
76
|
+
case 'cursor':
|
|
77
|
+
targetPath = join(targetDir, 'commands');
|
|
78
|
+
await createDirectory(targetPath);
|
|
79
|
+
targetFileName = join(targetPath, `${skill.name}.md`);
|
|
80
|
+
break;
|
|
81
|
+
case 'windsurf':
|
|
82
|
+
targetPath = join(targetDir, 'workflows');
|
|
83
|
+
await createDirectory(targetPath);
|
|
84
|
+
targetFileName = join(targetPath, `${skill.name}.md`);
|
|
85
|
+
break;
|
|
86
|
+
case 'kiro':
|
|
87
|
+
targetPath = join(targetDir, 'steering');
|
|
88
|
+
await createDirectory(targetPath);
|
|
89
|
+
targetFileName = join(targetPath, `${skill.name}.md`);
|
|
90
|
+
break;
|
|
91
|
+
case 'antigravity':
|
|
92
|
+
targetPath = join(targetDir, 'workflows');
|
|
93
|
+
await createDirectory(targetPath);
|
|
94
|
+
targetFileName = join(targetPath, `${skill.name}.md`);
|
|
95
|
+
break;
|
|
96
|
+
case 'copilot':
|
|
97
|
+
targetPath = join(targetDir, 'prompts');
|
|
98
|
+
await createDirectory(targetPath);
|
|
99
|
+
targetFileName = join(targetPath, `${skill.name}.prompt.md`);
|
|
100
|
+
break;
|
|
101
|
+
case 'codex':
|
|
102
|
+
targetPath = join(targetDir, 'skills', skill.name);
|
|
103
|
+
await createDirectory(targetPath);
|
|
104
|
+
targetFileName = join(targetPath, 'skill.md');
|
|
105
|
+
break;
|
|
106
|
+
case 'roocode':
|
|
107
|
+
targetPath = join(targetDir, 'commands');
|
|
108
|
+
await createDirectory(targetPath);
|
|
109
|
+
targetFileName = join(targetPath, `${skill.name}.md`);
|
|
110
|
+
break;
|
|
111
|
+
case 'qoder':
|
|
112
|
+
targetPath = join(targetDir, 'rules');
|
|
113
|
+
await createDirectory(targetPath);
|
|
114
|
+
targetFileName = join(targetPath, `${skill.name}.md`);
|
|
115
|
+
break;
|
|
116
|
+
case 'gemini':
|
|
117
|
+
targetPath = join(targetDir, 'skills', skill.name);
|
|
118
|
+
await createDirectory(targetPath);
|
|
119
|
+
targetFileName = join(targetPath, 'skill.md');
|
|
120
|
+
break;
|
|
121
|
+
default:
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
// 检查目标文件是否已存在
|
|
125
|
+
if (!force && await exists(targetFileName)) {
|
|
126
|
+
return null; // 跳过已存在的文件
|
|
127
|
+
}
|
|
128
|
+
// 复制prompt.md到目标位置
|
|
129
|
+
const promptContent = await readFile(promptPath, 'utf-8');
|
|
130
|
+
await writeFile(targetFileName, promptContent);
|
|
131
|
+
return {
|
|
132
|
+
name: skill.name,
|
|
133
|
+
targetPath: targetFileName.replace(process.cwd() + '/', '')
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
export async function initCommand(options) {
|
|
137
|
+
// 1. 显示标题
|
|
138
|
+
logger.title('Listen Agent Skills Installer');
|
|
139
|
+
const cwd = process.cwd();
|
|
140
|
+
const skillsDir = join(cwd, 'skills');
|
|
141
|
+
// 检查skills目录是否存在
|
|
142
|
+
if (!(await exists(skillsDir))) {
|
|
143
|
+
logger.error('No skills directory found in current project.');
|
|
144
|
+
logger.info('This command installs existing skills to AI assistant projects.');
|
|
145
|
+
logger.info('Make sure you are in a listen-agent skills project directory.');
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// 2. 获取AI类型
|
|
149
|
+
let aiType = options.ai;
|
|
150
|
+
if (!aiType) {
|
|
151
|
+
const { detected, suggested } = detectAIType();
|
|
152
|
+
// 显示检测结果
|
|
153
|
+
if (detected.length > 0) {
|
|
154
|
+
logger.info(`Detected: ${detected.map(t => chalk.cyan(t)).join(', ')}`);
|
|
155
|
+
}
|
|
156
|
+
// 交互式选择菜单
|
|
157
|
+
const response = await prompts({
|
|
158
|
+
type: 'select',
|
|
159
|
+
name: 'aiType',
|
|
160
|
+
message: 'Select AI assistant to install skills for:',
|
|
161
|
+
choices: AI_TYPES.map(type => ({
|
|
162
|
+
title: getAITypeDescription(type),
|
|
163
|
+
value: type,
|
|
164
|
+
})),
|
|
165
|
+
initial: suggested ? AI_TYPES.indexOf(suggested) : 0,
|
|
166
|
+
});
|
|
167
|
+
// 处理用户取消
|
|
168
|
+
if (!response.aiType) {
|
|
169
|
+
logger.warn('Installation cancelled');
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
aiType = response.aiType;
|
|
173
|
+
}
|
|
174
|
+
logger.info(`Installing skills for: ${chalk.cyan(getAITypeDescription(aiType))}`);
|
|
175
|
+
const spinner = ora('Installing skills...').start();
|
|
176
|
+
try {
|
|
177
|
+
// 获取所有skills
|
|
178
|
+
const skills = await getAvailableSkills(skillsDir);
|
|
179
|
+
if (skills.length === 0) {
|
|
180
|
+
spinner.fail('No skills found to install');
|
|
181
|
+
logger.info('Create skills first using: listen-agent create <skill-name>');
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// 安装skills到对应的AI助手目录
|
|
185
|
+
const installedSkills = await installSkillsToAI(cwd, skills, aiType, options.force);
|
|
186
|
+
spinner.succeed('Skills installation complete!');
|
|
187
|
+
// 显示安装摘要
|
|
188
|
+
console.log();
|
|
189
|
+
logger.info('Installed skills:');
|
|
190
|
+
installedSkills.forEach(skill => {
|
|
191
|
+
console.log(` ${chalk.green('+')} ${skill.name} → ${skill.targetPath}`);
|
|
192
|
+
});
|
|
193
|
+
console.log();
|
|
194
|
+
logger.success(`${installedSkills.length} skill${installedSkills.length > 1 ? 's' : ''} installed successfully!`);
|
|
195
|
+
// 显示后续步骤
|
|
196
|
+
console.log();
|
|
197
|
+
console.log(chalk.bold('Next steps:'));
|
|
198
|
+
console.log(chalk.dim(' 1. Restart your AI coding assistant'));
|
|
199
|
+
console.log(chalk.dim(' 2. Skills are now available in your AI assistant'));
|
|
200
|
+
console.log();
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
spinner.fail('Installation failed');
|
|
204
|
+
if (error instanceof Error) {
|
|
205
|
+
logger.error(error.message);
|
|
206
|
+
}
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAOA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAmEjD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
import { exists } from '../utils/files.js';
|
|
6
|
+
export async function listCommand() {
|
|
7
|
+
logger.title('Installed Agent Skills');
|
|
8
|
+
const cwd = process.cwd();
|
|
9
|
+
const skillsDir = join(cwd, 'skills');
|
|
10
|
+
// 检查skills目录是否存在
|
|
11
|
+
if (!(await exists(skillsDir))) {
|
|
12
|
+
logger.warn('No skills directory found. Run "listen-agent init" first.');
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const skillDirs = await readdir(skillsDir, { withFileTypes: true });
|
|
17
|
+
const skills = skillDirs.filter(dirent => dirent.isDirectory());
|
|
18
|
+
if (skills.length === 0) {
|
|
19
|
+
logger.info('No skills found. Create your first skill with "listen-agent create <name>"');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
console.log();
|
|
23
|
+
for (const skill of skills) {
|
|
24
|
+
const skillPath = join(skillsDir, skill.name);
|
|
25
|
+
const metadataPath = join(skillPath, 'skill.json');
|
|
26
|
+
let metadata = null;
|
|
27
|
+
// 尝试读取skill.json
|
|
28
|
+
if (await exists(metadataPath)) {
|
|
29
|
+
try {
|
|
30
|
+
const metadataContent = await readFile(metadataPath, 'utf-8');
|
|
31
|
+
metadata = JSON.parse(metadataContent);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// 忽略解析错误
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// 显示skill信息
|
|
38
|
+
console.log(chalk.bold.cyan(`📦 ${skill.name}`));
|
|
39
|
+
if (metadata) {
|
|
40
|
+
console.log(` ${chalk.dim('Version:')} ${metadata.version}`);
|
|
41
|
+
console.log(` ${chalk.dim('Description:')} ${metadata.description}`);
|
|
42
|
+
if (metadata.author) {
|
|
43
|
+
console.log(` ${chalk.dim('Author:')} ${metadata.author}`);
|
|
44
|
+
}
|
|
45
|
+
if (metadata.tags && metadata.tags.length > 0) {
|
|
46
|
+
console.log(` ${chalk.dim('Tags:')} ${metadata.tags.join(', ')}`);
|
|
47
|
+
}
|
|
48
|
+
console.log(` ${chalk.dim('AI Types:')} ${metadata.aiTypes.join(', ')}`);
|
|
49
|
+
console.log(` ${chalk.dim('Updated:')} ${new Date(metadata.updatedAt).toLocaleDateString()}`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.log(` ${chalk.dim('No metadata found')}`);
|
|
53
|
+
}
|
|
54
|
+
console.log();
|
|
55
|
+
}
|
|
56
|
+
logger.success(`Found ${skills.length} skill${skills.length > 1 ? 's' : ''}`);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
logger.error('Failed to list skills');
|
|
60
|
+
if (error instanceof Error) {
|
|
61
|
+
logger.error(error.message);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAqClD"}
|