sdd-full 4.3.0 → 4.3.1
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/bin.js +91 -41
- package/package.json +1 -1
package/bin.js
CHANGED
|
@@ -6,7 +6,7 @@ const fs = require('fs');
|
|
|
6
6
|
const path = require('path');
|
|
7
7
|
|
|
8
8
|
const SDD = {
|
|
9
|
-
version: '4.3.
|
|
9
|
+
version: '4.3.1',
|
|
10
10
|
name: 'sdd-full',
|
|
11
11
|
description: '完整的软件设计开发技能包'
|
|
12
12
|
};
|
|
@@ -81,82 +81,132 @@ function install(targetDir, environment) {
|
|
|
81
81
|
console.log(` 版本: ${SDD.version}`);
|
|
82
82
|
console.log('========================================');
|
|
83
83
|
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
debug(
|
|
84
|
+
const skillsSourceDir = path.join(__dirname, 'skills');
|
|
85
|
+
const rulesSourceDir = path.join(__dirname, 'skills', 'rules');
|
|
86
|
+
debug(`技能源目录: ${skillsSourceDir}`);
|
|
87
|
+
debug(`规则源目录: ${rulesSourceDir}`);
|
|
88
|
+
debug(`技能源目录存在: ${fs.existsSync(skillsSourceDir)}`);
|
|
89
|
+
debug(`规则源目录存在: ${fs.existsSync(rulesSourceDir)}`);
|
|
87
90
|
|
|
88
91
|
// 根据环境选择安装目录
|
|
89
|
-
let
|
|
92
|
+
let installConfig;
|
|
90
93
|
|
|
91
94
|
if (environment === 'cc') {
|
|
92
|
-
|
|
93
|
-
{ name: 'Claude Code',
|
|
95
|
+
installConfig = [
|
|
96
|
+
{ name: 'Claude Code', skillsPath: path.join(baseDir, '.claude', 'skills'), rulesPath: path.join(baseDir, '.claude', 'rules') }
|
|
94
97
|
];
|
|
95
98
|
} else if (environment === 'all') {
|
|
96
|
-
|
|
97
|
-
{ name: 'Trae / Solo',
|
|
98
|
-
{ name: 'Claude Code',
|
|
99
|
-
{ name: '通用 sdd-full',
|
|
99
|
+
installConfig = [
|
|
100
|
+
{ name: 'Trae / Solo', skillsPath: path.join(baseDir, '.trae', 'skills'), rulesPath: path.join(baseDir, '.trae', 'rules') },
|
|
101
|
+
{ name: 'Claude Code', skillsPath: path.join(baseDir, '.claude', 'skills'), rulesPath: path.join(baseDir, '.claude', 'rules') },
|
|
102
|
+
{ name: '通用 sdd-full', skillsPath: path.join(baseDir, '.sdd-full', 'skills'), rulesPath: path.join(baseDir, '.sdd-full', 'rules') }
|
|
100
103
|
];
|
|
101
104
|
} else {
|
|
102
105
|
// 默认:Trae / Solo
|
|
103
|
-
|
|
104
|
-
{ name: 'Trae / Solo',
|
|
106
|
+
installConfig = [
|
|
107
|
+
{ name: 'Trae / Solo', skillsPath: path.join(baseDir, '.trae', 'skills'), rulesPath: path.join(baseDir, '.trae', 'rules') }
|
|
105
108
|
];
|
|
106
109
|
}
|
|
107
110
|
|
|
108
|
-
let
|
|
111
|
+
let totalSkillsCount = 0;
|
|
112
|
+
let totalRulesCount = 0;
|
|
109
113
|
|
|
110
|
-
|
|
111
|
-
const
|
|
112
|
-
|
|
114
|
+
installConfig.forEach(config => {
|
|
115
|
+
const skillsDestDir = config.skillsPath;
|
|
116
|
+
const rulesDestDir = config.rulesPath;
|
|
117
|
+
debug(`安装目标: ${config.name}`);
|
|
118
|
+
debug(` 技能目录: ${skillsDestDir}`);
|
|
119
|
+
debug(` 规则目录: ${rulesDestDir}`);
|
|
113
120
|
|
|
114
|
-
console.log(`\n正在安装到: ${
|
|
121
|
+
console.log(`\n正在安装到: ${config.name}`);
|
|
115
122
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
123
|
+
// 安装技能(不含rules目录)
|
|
124
|
+
console.log(` 📦 安装技能到: ${skillsDestDir}`);
|
|
125
|
+
if (!fs.existsSync(skillsDestDir)) {
|
|
126
|
+
debug(`创建技能目录: ${skillsDestDir}`);
|
|
127
|
+
fs.mkdirSync(skillsDestDir, { recursive: true });
|
|
119
128
|
}
|
|
120
129
|
|
|
121
|
-
let
|
|
122
|
-
if (fs.existsSync(
|
|
123
|
-
const items = fs.readdirSync(
|
|
124
|
-
debug(
|
|
130
|
+
let skillsCount = 0;
|
|
131
|
+
if (fs.existsSync(skillsSourceDir)) {
|
|
132
|
+
const items = fs.readdirSync(skillsSourceDir);
|
|
133
|
+
debug(`技能源目录内容: ${items.join(', ')}`);
|
|
125
134
|
|
|
126
135
|
items.forEach(item => {
|
|
127
|
-
|
|
128
|
-
|
|
136
|
+
// 跳过rules目录,它将单独安装
|
|
137
|
+
if (item === 'rules') {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const srcItem = path.join(skillsSourceDir, item);
|
|
142
|
+
const destItem = path.join(skillsDestDir, item);
|
|
129
143
|
const stat = fs.statSync(srcItem);
|
|
130
144
|
|
|
131
145
|
if (stat.isDirectory()) {
|
|
132
|
-
debug(
|
|
146
|
+
debug(`复制技能目录: ${item}`);
|
|
133
147
|
copyDirectory(srcItem, destItem);
|
|
134
|
-
|
|
148
|
+
skillsCount++;
|
|
135
149
|
} else if (stat.isFile() && item.endsWith('.md')) {
|
|
136
|
-
debug(
|
|
150
|
+
debug(`复制技能文件: ${item}`);
|
|
137
151
|
fs.copyFileSync(srcItem, destItem);
|
|
138
152
|
}
|
|
139
153
|
});
|
|
140
154
|
}
|
|
141
155
|
|
|
142
|
-
|
|
143
|
-
console.log(`
|
|
156
|
+
totalSkillsCount += skillsCount;
|
|
157
|
+
console.log(` ✅ ${skillsCount} 个技能`);
|
|
158
|
+
|
|
159
|
+
// 安装规则到.trae根目录下
|
|
160
|
+
console.log(` 📋 安装规则到: ${rulesDestDir}`);
|
|
161
|
+
if (!fs.existsSync(rulesDestDir)) {
|
|
162
|
+
debug(`创建规则目录: ${rulesDestDir}`);
|
|
163
|
+
fs.mkdirSync(rulesDestDir, { recursive: true });
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
let rulesCount = 0;
|
|
167
|
+
if (fs.existsSync(rulesSourceDir)) {
|
|
168
|
+
const items = fs.readdirSync(rulesSourceDir);
|
|
169
|
+
debug(`规则源目录内容: ${items.join(', ')}`);
|
|
170
|
+
|
|
171
|
+
items.forEach(item => {
|
|
172
|
+
const srcItem = path.join(rulesSourceDir, item);
|
|
173
|
+
const destItem = path.join(rulesDestDir, item);
|
|
174
|
+
const stat = fs.statSync(srcItem);
|
|
175
|
+
|
|
176
|
+
if (stat.isFile() && item.endsWith('.md')) {
|
|
177
|
+
debug(`复制规则文件: ${item}`);
|
|
178
|
+
fs.copyFileSync(srcItem, destItem);
|
|
179
|
+
rulesCount++;
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
totalRulesCount += rulesCount;
|
|
185
|
+
console.log(` ✅ ${rulesCount} 个规则文件`);
|
|
144
186
|
|
|
145
187
|
// 验证安装结果
|
|
146
|
-
if (fs.existsSync(
|
|
147
|
-
const
|
|
148
|
-
debug(
|
|
149
|
-
console.log(`
|
|
188
|
+
if (fs.existsSync(skillsDestDir)) {
|
|
189
|
+
const installedSkills = fs.readdirSync(skillsDestDir);
|
|
190
|
+
debug(`技能目录内容: ${installedSkills.join(', ')}`);
|
|
191
|
+
console.log(` 📁 技能内容: ${installedSkills.length} 项`);
|
|
192
|
+
}
|
|
193
|
+
if (fs.existsSync(rulesDestDir)) {
|
|
194
|
+
const installedRules = fs.readdirSync(rulesDestDir);
|
|
195
|
+
debug(`规则目录内容: ${installedRules.join(', ')}`);
|
|
196
|
+
console.log(` 📁 规则内容: ${installedRules.length} 项`);
|
|
150
197
|
}
|
|
151
198
|
});
|
|
152
199
|
|
|
153
200
|
console.log('\n========================================');
|
|
154
|
-
console.log(`✅
|
|
201
|
+
console.log(`✅ 安装完成!`);
|
|
202
|
+
console.log(` - 技能: ${totalSkillsCount} 个`);
|
|
203
|
+
console.log(` - 规则: ${totalRulesCount} 个文件`);
|
|
155
204
|
console.log('========================================');
|
|
156
|
-
console.log('\n
|
|
157
|
-
|
|
158
|
-
console.log(` - ${
|
|
159
|
-
console.log(`
|
|
205
|
+
console.log('\n现在您可以在以下环境中使用这些技能和规则:');
|
|
206
|
+
installConfig.forEach(config => {
|
|
207
|
+
console.log(` - ${config.name}`);
|
|
208
|
+
console.log(` 技能位置: ${config.skillsPath}`);
|
|
209
|
+
console.log(` 规则位置: ${config.rulesPath}`);
|
|
160
210
|
});
|
|
161
211
|
console.log('\n🎉 开始使用吧!\n');
|
|
162
212
|
}
|