sdd-toolkit 3.0.0 → 3.1.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sdd-toolkit",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "Instalador automatico dos agentes de desenvolvimento",
5
5
  "main": "src/index.js",
6
6
  "bin": {
package/src/index.js CHANGED
@@ -9,24 +9,9 @@ const pc = require('picocolors');
9
9
  // Internal Modules
10
10
  const { loadAgents } = require('./lib/agents');
11
11
  const { setLocale, t, getLocale } = require('./lib/i18n');
12
- const {
13
- toGeminiTOML,
14
- toGeminiSkill,
15
- toRooSkill,
16
- toKiloMarkdown,
17
- toKiloSkill,
18
- toCursorMDC,
19
- toCursorSkill,
20
- toClaudeCommand,
21
- toClaudeSkill,
22
- toClaudeSubagent,
23
- toOpenCodeSkill,
24
- toOpenCodeSubagent,
25
- toAntigravitySkill,
26
- toAntigravityWorkflow
27
- } = require('./lib/transformers');
28
12
  const { generateWorkflowGuide } = require('./lib/docs');
29
13
  const { view } = require('./commands/view');
14
+ const handlers = require('./lib/handlers');
30
15
 
31
16
  async function main() {
32
17
  console.clear();
@@ -71,20 +56,30 @@ async function main() {
71
56
  if (fs.existsSync(path.join(process.cwd(), '.roo'))) tools.push('roo');
72
57
  if (fs.existsSync(path.join(process.cwd(), '.cline'))) tools.push('cline');
73
58
  if (fs.existsSync(path.join(process.cwd(), '.cursor'))) tools.push('cursor');
74
- if (fs.existsSync(path.join(process.cwd(), '.windsurf'))) tools.push('windsurf');
75
59
  if (fs.existsSync(path.join(process.cwd(), '.claude'))) tools.push('claude');
76
- if (fs.existsSync(path.join(process.cwd(), '.trae'))) tools.push('trae');
77
60
  if (fs.existsSync(path.join(process.cwd(), '.kilocode'))) tools.push('kilo');
78
- if (fs.existsSync(path.join(process.cwd(), '.github'))) tools.push('copilot');
79
- if (fs.existsSync(path.join(process.cwd(), '.roo'))) tools.push('roo');
80
61
  if (fs.existsSync(path.join(process.cwd(), '.opencode'))) tools.push('opencode');
81
- if (fs.existsSync(path.join(process.cwd(), 'prompts'))) tools.push('web');
82
-
83
- if (fs.existsSync(path.join(process.cwd(), '.antigravity'))) tools.push('antigravity');
62
+ if (fs.existsSync(path.join(process.cwd(), '.antigravity')) || fs.existsSync(path.join(process.cwd(), '.agent'))) tools.push('antigravity');
84
63
  if (tools.length === 0) {
85
64
  note(t('UPGRADE.NO_CONFIG'), t('UPGRADE.NO_CONFIG_TITLE'));
86
65
  } else {
87
66
  note(t('UPGRADE.DETECTED_TOOLS', tools.join(', ')), t('UPGRADE.DETECTED_TITLE'));
67
+
68
+ // 1. Smart Scaffolding (Update folders, preserve files)
69
+ const s = spinner();
70
+ s.start(t('SCAFFOLD.LOADING'));
71
+ try {
72
+ const stats = generateWorkflowGuide(process.cwd());
73
+ if (stats.created > 0) {
74
+ s.stop(`${t('SCAFFOLD.SUCCESS')} (${stats.created} new, ${stats.verified} verified)`);
75
+ } else {
76
+ s.stop(t('SCAFFOLD.ALREADY_EXISTS'));
77
+ }
78
+ } catch (e) {
79
+ s.stop(pc.red(t('SCAFFOLD.ERROR')));
80
+ }
81
+
82
+ // 2. Update Agents
88
83
  await processAgentsInstallation(tools, { locale: getLocale() });
89
84
  outro(pc.green(t('UPGRADE.SUCCESS')));
90
85
  process.exit(0);
@@ -163,175 +158,10 @@ async function processAgentsInstallation(tools, options) {
163
158
 
164
159
  s.message(t('INSTALL.INSTALLING', tools.join(', ')));
165
160
 
166
- const toolHandlers = {
167
- gemini: async (validAgents, options) => {
168
- const commandsDir = path.join(process.cwd(), '.gemini', 'commands', 'dev');
169
- const skillsDir = path.join(process.cwd(), '.gemini', 'skills');
170
-
171
- await fsp.mkdir(commandsDir, { recursive: true });
172
- await fsp.mkdir(skillsDir, { recursive: true });
173
-
174
- await Promise.all(
175
- validAgents.map(async (agent) => {
176
- // Generate Command (TOML)
177
- const toml = toGeminiTOML(agent, options);
178
- const fileName = `${agent.originalName}.toml`;
179
- await fsp.writeFile(path.join(commandsDir, fileName), toml);
180
-
181
- // Generate Skill
182
- const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
183
- const agentSkillDir = path.join(skillsDir, skillName);
184
- await fsp.mkdir(agentSkillDir, { recursive: true });
185
- const skillContent = toGeminiSkill(agent, options);
186
- await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
187
- })
188
- );
189
- },
190
- roo: async (validAgents, options) => {
191
- const skillsDir = path.join(process.cwd(), '.roo', 'skills');
192
- await fsp.mkdir(skillsDir, { recursive: true });
193
-
194
- await Promise.all(
195
- validAgents.map(async (agent) => {
196
- const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
197
-
198
- // Generate Skill: .roo/skills/[agent-slug]/SKILL.md
199
- const agentSkillDir = path.join(skillsDir, skillName);
200
- await fsp.mkdir(agentSkillDir, { recursive: true });
201
- const skillContent = toRooSkill(agent, options);
202
- await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
203
- })
204
- );
205
- },
206
- claude: async (validAgents, options) => {
207
- const commandsDir = path.join(process.cwd(), '.claude', 'commands', 'agents');
208
- const skillsDir = path.join(process.cwd(), '.claude', 'skills');
209
- const agentsDir = path.join(process.cwd(), '.claude', 'agents');
210
-
211
- await fsp.mkdir(commandsDir, { recursive: true });
212
- await fsp.mkdir(skillsDir, { recursive: true });
213
- await fsp.mkdir(agentsDir, { recursive: true });
214
-
215
- await Promise.all(
216
- validAgents.map(async (agent) => {
217
- const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
218
-
219
- // Generate Command
220
- const command = toClaudeCommand(agent, options);
221
- await fsp.writeFile(path.join(commandsDir, `${agent.slug}.md`), command);
222
-
223
- // Generate Skill
224
- const agentSkillDir = path.join(skillsDir, skillName);
225
- await fsp.mkdir(agentSkillDir, { recursive: true });
226
- const skill = toClaudeSkill(agent, options);
227
- await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skill);
228
-
229
- // Generate Subagent
230
- const subagent = toClaudeSubagent(agent, options);
231
- await fsp.writeFile(path.join(agentsDir, `${skillName}.md`), subagent);
232
- })
233
- );
234
- },
235
- cursor: async (validAgents, options) => {
236
- const commandsDir = path.join(process.cwd(), '.cursor', 'commands');
237
- const skillsDir = path.join(process.cwd(), '.cursor', 'skills');
238
-
239
- await fsp.mkdir(commandsDir, { recursive: true });
240
- await fsp.mkdir(skillsDir, { recursive: true });
241
-
242
- await Promise.all(
243
- validAgents.map(async (agent) => {
244
- const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
245
-
246
- // Generate Commands (.mdc)
247
- const mdc = toCursorMDC(agent, options);
248
- await fsp.writeFile(path.join(commandsDir, `${agent.slug}.mdc`), mdc);
249
-
250
- // Generate Skills (SKILL.md)
251
- const skillDir = path.join(skillsDir, skillName);
252
- await fsp.mkdir(skillDir, { recursive: true });
253
- const skill = toCursorSkill(agent, options);
254
- await fsp.writeFile(path.join(skillDir, 'SKILL.md'), skill);
255
- })
256
- );
257
- },
258
- kilo: async (validAgents, options) => {
259
- const workflowsDir = path.join(process.cwd(), '.kilocode', 'workflows');
260
- const skillsDir = path.join(process.cwd(), '.kilocode', 'skills');
261
-
262
- await fsp.mkdir(workflowsDir, { recursive: true });
263
- await fsp.mkdir(skillsDir, { recursive: true });
264
-
265
- await Promise.all(
266
- validAgents.map(async (agent) => {
267
- const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
268
-
269
- // Generate Workflow
270
- const workflow = toKiloMarkdown(agent, options);
271
- await fsp.writeFile(path.join(workflowsDir, `${agent.slug}.md`), workflow);
272
-
273
- // Generate Skill
274
- const agentSkillDir = path.join(skillsDir, skillName);
275
- await fsp.mkdir(agentSkillDir, { recursive: true });
276
- const skill = toKiloSkill(agent, options);
277
- await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skill);
278
- })
279
- );
280
- },
281
- opencode: async (validAgents, options) => {
282
- const skillsDir = path.join(process.cwd(), '.opencode', 'skills');
283
- const agentsDir = path.join(process.cwd(), '.opencode', 'agents');
284
-
285
- // Ensure base directories exist
286
- await fsp.mkdir(skillsDir, { recursive: true });
287
- await fsp.mkdir(agentsDir, { recursive: true });
288
-
289
- await Promise.all(
290
- validAgents.map(async (agent) => {
291
- // Ensure compatibility with naming rules (lowercase, alphanumeric, single hyphens)
292
- const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
293
-
294
- // Generate Skill: .opencode/skills/[agent-slug]/SKILL.md
295
- const agentSkillDir = path.join(skillsDir, skillName);
296
- await fsp.mkdir(agentSkillDir, { recursive: true });
297
- const skillContent = toOpenCodeSkill(agent, options);
298
- await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
299
-
300
- // Generate Subagent: .opencode/agents/[agent-slug].md
301
- const subagentContent = toOpenCodeSubagent(agent, options);
302
- await fsp.writeFile(path.join(agentsDir, `${skillName}.md`), subagentContent);
303
- })
304
- );
305
- },
306
- antigravity: async (validAgents, options) => {
307
- const skillsDir = path.join(process.cwd(), '.agent', 'skills');
308
- const workflowsDir = path.join(process.cwd(), '.agent', 'workflows');
309
-
310
- await fsp.mkdir(skillsDir, { recursive: true });
311
- await fsp.mkdir(workflowsDir, { recursive: true });
312
-
313
- await Promise.all(
314
- validAgents.map(async (agent) => {
315
- const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
316
-
317
- // Generate Skill: .agent/skills/[agent-slug]/SKILL.md
318
- const agentSkillDir = path.join(skillsDir, skillName);
319
- await fsp.mkdir(agentSkillDir, { recursive: true });
320
- const skillContent = toAntigravitySkill(agent, options);
321
- await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
322
-
323
- // Generate Workflow: .agent/workflows/[agent-slug].md
324
- const workflowContent = toAntigravityWorkflow(agent, options);
325
- await fsp.writeFile(path.join(workflowsDir, `${skillName}.md`), workflowContent);
326
- })
327
- );
328
- }
329
- };
330
-
331
161
  for (const tool of tools) {
332
- const handler = toolHandlers[tool];
333
- if (handler) {
334
- await handler(validAgents, options);
162
+ const handler = handlers[tool];
163
+ if (handler && typeof handler.install === 'function') {
164
+ await handler.install(validAgents, options);
335
165
  }
336
166
  }
337
167
 
@@ -0,0 +1,34 @@
1
+ const fsp = require('fs/promises');
2
+ const path = require('path');
3
+ const { toAntigravitySkill, toAntigravityWorkflow } = require('../transformers');
4
+
5
+ /**
6
+ * Handles installation for Antigravity
7
+ * @param {Array} agents - List of agents to install
8
+ * @param {Object} options - Installation options
9
+ */
10
+ async function install(agents, options) {
11
+ const skillsDir = path.join(process.cwd(), '.agent', 'skills');
12
+ const workflowsDir = path.join(process.cwd(), '.agent', 'workflows');
13
+
14
+ await fsp.mkdir(skillsDir, { recursive: true });
15
+ await fsp.mkdir(workflowsDir, { recursive: true });
16
+
17
+ await Promise.all(
18
+ agents.map(async (agent) => {
19
+ const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
20
+
21
+ // Generate Skill: .agent/skills/[agent-slug]/SKILL.md
22
+ const agentSkillDir = path.join(skillsDir, skillName);
23
+ await fsp.mkdir(agentSkillDir, { recursive: true });
24
+ const skillContent = toAntigravitySkill(agent, options);
25
+ await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
26
+
27
+ // Generate Workflow: .agent/workflows/[agent-slug].md
28
+ const workflowContent = toAntigravityWorkflow(agent, options);
29
+ await fsp.writeFile(path.join(workflowsDir, `${skillName}.md`), workflowContent);
30
+ })
31
+ );
32
+ }
33
+
34
+ module.exports = { install };
@@ -0,0 +1,40 @@
1
+ const fsp = require('fs/promises');
2
+ const path = require('path');
3
+ const { toClaudeCommand, toClaudeSkill, toClaudeSubagent } = require('../transformers');
4
+
5
+ /**
6
+ * Handles installation for Claude Code
7
+ * @param {Array} agents - List of agents to install
8
+ * @param {Object} options - Installation options
9
+ */
10
+ async function install(agents, options) {
11
+ const commandsDir = path.join(process.cwd(), '.claude', 'commands', 'agents');
12
+ const skillsDir = path.join(process.cwd(), '.claude', 'skills');
13
+ const agentsDir = path.join(process.cwd(), '.claude', 'agents');
14
+
15
+ await fsp.mkdir(commandsDir, { recursive: true });
16
+ await fsp.mkdir(skillsDir, { recursive: true });
17
+ await fsp.mkdir(agentsDir, { recursive: true });
18
+
19
+ await Promise.all(
20
+ agents.map(async (agent) => {
21
+ const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
22
+
23
+ // Generate Command
24
+ const command = toClaudeCommand(agent, options);
25
+ await fsp.writeFile(path.join(commandsDir, `${agent.slug}.md`), command);
26
+
27
+ // Generate Skill
28
+ const agentSkillDir = path.join(skillsDir, skillName);
29
+ await fsp.mkdir(agentSkillDir, { recursive: true });
30
+ const skill = toClaudeSkill(agent, options);
31
+ await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skill);
32
+
33
+ // Generate Subagent
34
+ const subagent = toClaudeSubagent(agent, options);
35
+ await fsp.writeFile(path.join(agentsDir, `${skillName}.md`), subagent);
36
+ })
37
+ );
38
+ }
39
+
40
+ module.exports = { install };
@@ -0,0 +1,34 @@
1
+ const fsp = require('fs/promises');
2
+ const path = require('path');
3
+ const { toCursorMDC, toCursorSkill } = require('../transformers');
4
+
5
+ /**
6
+ * Handles installation for Cursor
7
+ * @param {Array} agents - List of agents to install
8
+ * @param {Object} options - Installation options
9
+ */
10
+ async function install(agents, options) {
11
+ const commandsDir = path.join(process.cwd(), '.cursor', 'commands');
12
+ const skillsDir = path.join(process.cwd(), '.cursor', 'skills');
13
+
14
+ await fsp.mkdir(commandsDir, { recursive: true });
15
+ await fsp.mkdir(skillsDir, { recursive: true });
16
+
17
+ await Promise.all(
18
+ agents.map(async (agent) => {
19
+ const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
20
+
21
+ // Generate Commands (.mdc)
22
+ const mdc = toCursorMDC(agent, options);
23
+ await fsp.writeFile(path.join(commandsDir, `${agent.slug}.mdc`), mdc);
24
+
25
+ // Generate Skills (SKILL.md)
26
+ const skillDir = path.join(skillsDir, skillName);
27
+ await fsp.mkdir(skillDir, { recursive: true });
28
+ const skill = toCursorSkill(agent, options);
29
+ await fsp.writeFile(path.join(skillDir, 'SKILL.md'), skill);
30
+ })
31
+ );
32
+ }
33
+
34
+ module.exports = { install };
@@ -0,0 +1,34 @@
1
+ const fsp = require('fs/promises');
2
+ const path = require('path');
3
+ const { toGeminiTOML, toGeminiSkill } = require('../transformers');
4
+
5
+ /**
6
+ * Handles installation for Gemini
7
+ * @param {Array} agents - List of agents to install
8
+ * @param {Object} options - Installation options
9
+ */
10
+ async function install(agents, options) {
11
+ const commandsDir = path.join(process.cwd(), '.gemini', 'commands', 'dev');
12
+ const skillsDir = path.join(process.cwd(), '.gemini', 'skills');
13
+
14
+ await fsp.mkdir(commandsDir, { recursive: true });
15
+ await fsp.mkdir(skillsDir, { recursive: true });
16
+
17
+ await Promise.all(
18
+ agents.map(async (agent) => {
19
+ // Generate Command (TOML)
20
+ const toml = toGeminiTOML(agent, options);
21
+ const fileName = `${agent.originalName}.toml`;
22
+ await fsp.writeFile(path.join(commandsDir, fileName), toml);
23
+
24
+ // Generate Skill
25
+ const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
26
+ const agentSkillDir = path.join(skillsDir, skillName);
27
+ await fsp.mkdir(agentSkillDir, { recursive: true });
28
+ const skillContent = toGeminiSkill(agent, options);
29
+ await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
30
+ })
31
+ );
32
+ }
33
+
34
+ module.exports = { install };
@@ -0,0 +1,17 @@
1
+ const gemini = require('./gemini');
2
+ const roo = require('./roo');
3
+ const claude = require('./claude');
4
+ const cursor = require('./cursor');
5
+ const kilo = require('./kilo');
6
+ const opencode = require('./opencode');
7
+ const antigravity = require('./antigravity');
8
+
9
+ module.exports = {
10
+ gemini,
11
+ roo,
12
+ claude,
13
+ cursor,
14
+ kilo,
15
+ opencode,
16
+ antigravity
17
+ };
@@ -0,0 +1,34 @@
1
+ const fsp = require('fs/promises');
2
+ const path = require('path');
3
+ const { toKiloMarkdown, toKiloSkill } = require('../transformers');
4
+
5
+ /**
6
+ * Handles installation for Kilo Code
7
+ * @param {Array} agents - List of agents to install
8
+ * @param {Object} options - Installation options
9
+ */
10
+ async function install(agents, options) {
11
+ const workflowsDir = path.join(process.cwd(), '.kilocode', 'workflows');
12
+ const skillsDir = path.join(process.cwd(), '.kilocode', 'skills');
13
+
14
+ await fsp.mkdir(workflowsDir, { recursive: true });
15
+ await fsp.mkdir(skillsDir, { recursive: true });
16
+
17
+ await Promise.all(
18
+ agents.map(async (agent) => {
19
+ const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
20
+
21
+ // Generate Workflow
22
+ const workflow = toKiloMarkdown(agent, options);
23
+ await fsp.writeFile(path.join(workflowsDir, `${agent.slug}.md`), workflow);
24
+
25
+ // Generate Skill
26
+ const agentSkillDir = path.join(skillsDir, skillName);
27
+ await fsp.mkdir(agentSkillDir, { recursive: true });
28
+ const skill = toKiloSkill(agent, options);
29
+ await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skill);
30
+ })
31
+ );
32
+ }
33
+
34
+ module.exports = { install };
@@ -0,0 +1,36 @@
1
+ const fsp = require('fs/promises');
2
+ const path = require('path');
3
+ const { toOpenCodeSkill, toOpenCodeSubagent } = require('../transformers');
4
+
5
+ /**
6
+ * Handles installation for OpenCode
7
+ * @param {Array} agents - List of agents to install
8
+ * @param {Object} options - Installation options
9
+ */
10
+ async function install(agents, options) {
11
+ const skillsDir = path.join(process.cwd(), '.opencode', 'skills');
12
+ const agentsDir = path.join(process.cwd(), '.opencode', 'agents');
13
+
14
+ // Ensure base directories exist
15
+ await fsp.mkdir(skillsDir, { recursive: true });
16
+ await fsp.mkdir(agentsDir, { recursive: true });
17
+
18
+ await Promise.all(
19
+ agents.map(async (agent) => {
20
+ // Ensure compatibility with naming rules (lowercase, alphanumeric, single hyphens)
21
+ const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
22
+
23
+ // Generate Skill: .opencode/skills/[agent-slug]/SKILL.md
24
+ const agentSkillDir = path.join(skillsDir, skillName);
25
+ await fsp.mkdir(agentSkillDir, { recursive: true });
26
+ const skillContent = toOpenCodeSkill(agent, options);
27
+ await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
28
+
29
+ // Generate Subagent: .opencode/agents/[agent-slug].md
30
+ const subagentContent = toOpenCodeSubagent(agent, options);
31
+ await fsp.writeFile(path.join(agentsDir, `${skillName}.md`), subagentContent);
32
+ })
33
+ );
34
+ }
35
+
36
+ module.exports = { install };
@@ -0,0 +1,27 @@
1
+ const fsp = require('fs/promises');
2
+ const path = require('path');
3
+ const { toRooSkill } = require('../transformers');
4
+
5
+ /**
6
+ * Handles installation for Roo Code
7
+ * @param {Array} agents - List of agents to install
8
+ * @param {Object} options - Installation options
9
+ */
10
+ async function install(agents, options) {
11
+ const skillsDir = path.join(process.cwd(), '.roo', 'skills');
12
+ await fsp.mkdir(skillsDir, { recursive: true });
13
+
14
+ await Promise.all(
15
+ agents.map(async (agent) => {
16
+ const skillName = agent.slug.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
17
+
18
+ // Generate Skill: .roo/skills/[agent-slug]/SKILL.md
19
+ const agentSkillDir = path.join(skillsDir, skillName);
20
+ await fsp.mkdir(agentSkillDir, { recursive: true });
21
+ const skillContent = toRooSkill(agent, options);
22
+ await fsp.writeFile(path.join(agentSkillDir, 'SKILL.md'), skillContent);
23
+ })
24
+ );
25
+ }
26
+
27
+ module.exports = { install };