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.
Files changed (2) hide show
  1. package/bin.js +91 -41
  2. 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.0',
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 sourceDir = path.join(__dirname, 'skills');
85
- debug(`技能源目录: ${sourceDir}`);
86
- debug(`技能源目录存在: ${fs.existsSync(sourceDir)}`);
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 dirsToInstall;
92
+ let installConfig;
90
93
 
91
94
  if (environment === 'cc') {
92
- dirsToInstall = [
93
- { name: 'Claude Code', path: path.join(baseDir, '.claude', 'skills') }
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
- dirsToInstall = [
97
- { name: 'Trae / Solo', path: path.join(baseDir, '.trae', 'skills') },
98
- { name: 'Claude Code', path: path.join(baseDir, '.claude', 'skills') },
99
- { name: '通用 sdd-full', path: path.join(baseDir, '.sdd-full', 'skills') }
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
- dirsToInstall = [
104
- { name: 'Trae / Solo', path: path.join(baseDir, '.trae', 'skills') }
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 totalCount = 0;
111
+ let totalSkillsCount = 0;
112
+ let totalRulesCount = 0;
109
113
 
110
- dirsToInstall.forEach(dirInfo => {
111
- const destDir = dirInfo.path;
112
- debug(`安装目标: ${dirInfo.name} -> ${destDir}`);
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正在安装到: ${dirInfo.name} (${destDir})`);
121
+ console.log(`\n正在安装到: ${config.name}`);
115
122
 
116
- if (!fs.existsSync(destDir)) {
117
- debug(`创建目标目录: ${destDir}`);
118
- fs.mkdirSync(destDir, { recursive: true });
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 count = 0;
122
- if (fs.existsSync(sourceDir)) {
123
- const items = fs.readdirSync(sourceDir);
124
- debug(`源目录内容: ${items.join(', ')}`);
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
- const srcItem = path.join(sourceDir, item);
128
- const destItem = path.join(destDir, item);
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(`复制目录: ${item}`);
146
+ debug(`复制技能目录: ${item}`);
133
147
  copyDirectory(srcItem, destItem);
134
- count++;
148
+ skillsCount++;
135
149
  } else if (stat.isFile() && item.endsWith('.md')) {
136
- debug(`复制文件: ${item}`);
150
+ debug(`复制技能文件: ${item}`);
137
151
  fs.copyFileSync(srcItem, destItem);
138
152
  }
139
153
  });
140
154
  }
141
155
 
142
- totalCount += count;
143
- console.log(` ✅ ${count} 个技能`);
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(destDir)) {
147
- const installedItems = fs.readdirSync(destDir);
148
- debug(`目标目录内容: ${installedItems.join(', ')}`);
149
- console.log(` 📁 已安装内容: ${installedItems.length} 项`);
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(`✅ 安装完成!共安装 ${totalCount} 个技能!`);
201
+ console.log(`✅ 安装完成!`);
202
+ console.log(` - 技能: ${totalSkillsCount} 个`);
203
+ console.log(` - 规则: ${totalRulesCount} 个文件`);
155
204
  console.log('========================================');
156
- console.log('\n现在您可以在以下环境中使用这些技能:');
157
- dirsToInstall.forEach(dirInfo => {
158
- console.log(` - ${dirInfo.name}`);
159
- console.log(` 位置: ${dirInfo.path}`);
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sdd-full",
3
- "version": "4.3.0",
3
+ "version": "4.3.1",
4
4
  "description": "SDD Full - 完整的软件设计开发技能包",
5
5
  "main": "index.js",
6
6
  "bin": "./bin.js",