@sysvv/ai-skill 1.4.0 → 1.6.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/dist/index.js
CHANGED
|
@@ -24,9 +24,9 @@ const WHITE = '\x1b[97m';
|
|
|
24
24
|
// ── Inquirer Theme ──────────────────────────────────────────────────────
|
|
25
25
|
const sysTheme = {
|
|
26
26
|
icon: {
|
|
27
|
-
cursor: PINK + '❯' + ANSI.reset,
|
|
28
|
-
checked:
|
|
29
|
-
unchecked: ANSI.dim + '○' + ANSI.reset,
|
|
27
|
+
cursor: PINK + ' ❯' + ANSI.reset,
|
|
28
|
+
checked: GREEN + ' ✔' + ANSI.reset,
|
|
29
|
+
unchecked: ANSI.dim + ' ○' + ANSI.reset,
|
|
30
30
|
},
|
|
31
31
|
style: {
|
|
32
32
|
highlight: (text) => PINK + ANSI.bold + text + ANSI.reset,
|
|
@@ -121,10 +121,10 @@ async function installSkills(agent) {
|
|
|
121
121
|
const { metadata } = parseSkillFile(content);
|
|
122
122
|
available.push({
|
|
123
123
|
file,
|
|
124
|
-
name: metadata.
|
|
125
|
-
title: metadata.
|
|
124
|
+
name: metadata.id,
|
|
125
|
+
title: metadata.name ?? metadata.id,
|
|
126
126
|
description: metadata.description,
|
|
127
|
-
mcps: metadata.
|
|
127
|
+
mcps: metadata.requires?.mcp ?? []
|
|
128
128
|
});
|
|
129
129
|
}
|
|
130
130
|
if (available.length === 0) {
|
|
@@ -146,27 +146,23 @@ async function installSkills(agent) {
|
|
|
146
146
|
]);
|
|
147
147
|
const destBase = path.resolve(AGENT_DIRS[agent]);
|
|
148
148
|
const mcpsToInstall = new Set();
|
|
149
|
-
// Instala skills
|
|
150
149
|
console.log('');
|
|
151
150
|
for (const file of selected) {
|
|
152
151
|
const skill = await loadSkill(file, agent);
|
|
153
|
-
const skillDir = path.join(destBase, skill.metadata.
|
|
152
|
+
const skillDir = path.join(destBase, skill.metadata.id);
|
|
154
153
|
await fs.ensureDir(skillDir);
|
|
155
154
|
await fs.writeFile(path.join(skillDir, "SKILL.md"), skill.renderedBody, "utf8");
|
|
156
|
-
console.log(` ${GREEN}✔${ANSI.reset} ${skill.metadata.
|
|
157
|
-
|
|
158
|
-
for (const mcpName of skill.metadata.mcps ?? []) {
|
|
155
|
+
console.log(` ${GREEN}✔${ANSI.reset} ${skill.metadata.id}`);
|
|
156
|
+
for (const mcpName of skill.metadata.requires?.mcp ?? []) {
|
|
159
157
|
mcpsToInstall.add(mcpName);
|
|
160
158
|
}
|
|
161
159
|
}
|
|
162
|
-
// Instala MCPs automaticamente
|
|
163
160
|
if (mcpsToInstall.size > 0) {
|
|
164
161
|
console.log('');
|
|
165
|
-
let mcpTarget = '';
|
|
166
162
|
for (const mcpName of mcpsToInstall) {
|
|
167
163
|
try {
|
|
168
164
|
const mcp = await loadMcp(mcpName);
|
|
169
|
-
mcpTarget = await writeMcp(agent, mcp);
|
|
165
|
+
const mcpTarget = await writeMcp(agent, mcp);
|
|
170
166
|
console.log(` ${GREEN}✔${ANSI.reset} MCP ${ANSI.bold}${mcpName}${ANSI.reset} ${ANSI.dim}→ ${mcpTarget}${ANSI.reset}`);
|
|
171
167
|
}
|
|
172
168
|
catch (err) {
|
|
@@ -176,36 +172,75 @@ async function installSkills(agent) {
|
|
|
176
172
|
}
|
|
177
173
|
console.log(`\n Skills instaladas em ${ANSI.bold}${destBase}/${ANSI.reset}\n`);
|
|
178
174
|
}
|
|
179
|
-
// ── Clear
|
|
180
|
-
async function
|
|
181
|
-
|
|
175
|
+
// ── Clear ───────────────────────────────────────────────────────────────
|
|
176
|
+
async function clearFlow() {
|
|
177
|
+
// Descobre o que existe
|
|
178
|
+
const foundSkills = [];
|
|
179
|
+
const foundMcps = [];
|
|
182
180
|
for (const [agent, dir] of Object.entries(AGENT_DIRS)) {
|
|
183
181
|
const skillsFull = path.resolve(dir);
|
|
182
|
+
if (await fs.pathExists(skillsFull)) {
|
|
183
|
+
foundSkills.push({ agent, dir: skillsFull });
|
|
184
|
+
}
|
|
184
185
|
const mcpTarget = getMcpTargetPath(agent);
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
186
|
+
if (mcpTarget) {
|
|
187
|
+
const mcpFull = path.resolve(mcpTarget);
|
|
188
|
+
if (await fs.pathExists(mcpFull)) {
|
|
189
|
+
foundMcps.push({ agent, file: mcpFull });
|
|
190
|
+
}
|
|
190
191
|
}
|
|
191
192
|
}
|
|
192
|
-
|
|
193
|
-
|
|
193
|
+
const hasSkills = foundSkills.length > 0;
|
|
194
|
+
const hasMcps = foundMcps.length > 0;
|
|
195
|
+
if (!hasSkills && !hasMcps) {
|
|
196
|
+
console.log(" Nenhuma skill ou MCP instalado.\n");
|
|
194
197
|
return;
|
|
195
198
|
}
|
|
199
|
+
// Mostra o que encontrou
|
|
196
200
|
console.log(` ${RED}⚠${ANSI.reset} Encontrado:\n`);
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
201
|
+
if (hasSkills) {
|
|
202
|
+
console.log(` ${ANSI.bold}Skills${ANSI.reset}`);
|
|
203
|
+
for (const s of foundSkills) {
|
|
204
|
+
console.log(` ${ANSI.dim}${s.dir}${ANSI.reset}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (hasMcps) {
|
|
208
|
+
if (hasSkills)
|
|
209
|
+
console.log('');
|
|
210
|
+
console.log(` ${ANSI.bold}MCPs${ANSI.reset}`);
|
|
211
|
+
for (const m of foundMcps) {
|
|
212
|
+
console.log(` ${ANSI.dim}${m.file}${ANSI.reset}`);
|
|
213
|
+
}
|
|
202
214
|
}
|
|
203
215
|
console.log('');
|
|
216
|
+
const choices = [];
|
|
217
|
+
if (hasSkills && hasMcps) {
|
|
218
|
+
choices.push({ name: `${RED}Tudo${ANSI.reset} ${ANSI.dim}(skills + MCPs)${ANSI.reset}`, value: "all" }, { name: `Apenas Skills`, value: "skills" }, { name: `Apenas MCPs`, value: "mcps" });
|
|
219
|
+
}
|
|
220
|
+
else if (hasSkills) {
|
|
221
|
+
choices.push({ name: `Apagar Skills`, value: "skills" });
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
choices.push({ name: `Apagar MCPs`, value: "mcps" });
|
|
225
|
+
}
|
|
226
|
+
const { action } = await inquirer.prompt([
|
|
227
|
+
{
|
|
228
|
+
type: "list",
|
|
229
|
+
name: "action",
|
|
230
|
+
message: "O que deseja remover?",
|
|
231
|
+
choices,
|
|
232
|
+
theme: sysTheme
|
|
233
|
+
}
|
|
234
|
+
]);
|
|
235
|
+
const removeSkills = action === "all" || action === "skills";
|
|
236
|
+
const removeMcps = action === "all" || action === "mcps";
|
|
237
|
+
// Confirmação
|
|
238
|
+
const target = action === "all" ? "skills e MCPs" : action === "skills" ? "skills" : "MCPs";
|
|
204
239
|
const { confirm } = await inquirer.prompt([
|
|
205
240
|
{
|
|
206
241
|
type: "confirm",
|
|
207
242
|
name: "confirm",
|
|
208
|
-
message:
|
|
243
|
+
message: `Confirma a remoção de ${target}?`,
|
|
209
244
|
default: false,
|
|
210
245
|
theme: sysTheme
|
|
211
246
|
}
|
|
@@ -214,24 +249,27 @@ async function clearSkills() {
|
|
|
214
249
|
console.log("\n Operação cancelada.\n");
|
|
215
250
|
return;
|
|
216
251
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
252
|
+
console.log('');
|
|
253
|
+
if (removeSkills) {
|
|
254
|
+
for (const s of foundSkills) {
|
|
255
|
+
await fs.remove(s.dir);
|
|
256
|
+
console.log(` ${RED}✖${ANSI.reset} ${ANSI.dim}${s.dir}${ANSI.reset}`);
|
|
221
257
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
258
|
+
}
|
|
259
|
+
if (removeMcps) {
|
|
260
|
+
for (const m of foundMcps) {
|
|
261
|
+
await fs.remove(m.file);
|
|
262
|
+
console.log(` ${RED}✖${ANSI.reset} ${ANSI.dim}${m.file}${ANSI.reset}`);
|
|
225
263
|
}
|
|
226
264
|
}
|
|
227
|
-
console.log("\n
|
|
265
|
+
console.log("\n Removido com sucesso.\n");
|
|
228
266
|
}
|
|
229
267
|
// ── Main ────────────────────────────────────────────────────────────────
|
|
230
268
|
async function main() {
|
|
231
269
|
showBanner();
|
|
232
270
|
const { agent, clear } = parseArgs();
|
|
233
271
|
if (clear) {
|
|
234
|
-
await
|
|
272
|
+
await clearFlow();
|
|
235
273
|
return;
|
|
236
274
|
}
|
|
237
275
|
if (agent) {
|
package/package.json
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
description: gerenciar work items do Azure DevOps integrado com Git local. Sincroniza estados, vincula commits e mantém ADO atualizado.
|
|
2
|
+
id: ado-workflow
|
|
3
|
+
name: Azure DevOps Workflow
|
|
5
4
|
version: 1.0.0
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
5
|
+
description: Development workflow integrating Azure DevOps work items with Git commits and state management.
|
|
6
|
+
category: workflow
|
|
7
|
+
language: en
|
|
8
|
+
dependencies: [git-cli]
|
|
9
|
+
requires:
|
|
10
|
+
mcp: [azure-devops]
|
|
11
|
+
cli: [git]
|
|
12
|
+
env: [AZURE_DEVOPS_PAT]
|
|
13
|
+
tags: [azure-devops, work-items, workflow, state-management]
|
|
15
14
|
---
|
|
16
15
|
|
|
17
16
|
# ADO Workflow Skill
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
description: criar tickets técnicos claros a partir de contexto solto.
|
|
2
|
+
id: create-ticket
|
|
3
|
+
name: Create Ticket
|
|
5
4
|
version: 1.0.0
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
description: Create clear technical tickets from loose context.
|
|
6
|
+
category: productivity
|
|
7
|
+
language: pt-BR
|
|
8
|
+
tags: [ticket, task, productivity]
|
|
10
9
|
variables:
|
|
11
10
|
language: pt-BR
|
|
12
11
|
provider_overrides:
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
description: gerar respostas profissionais para clientes a partir de contexto interno.
|
|
2
|
+
id: customer-reply
|
|
3
|
+
name: Customer Reply
|
|
5
4
|
version: 1.0.0
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
description: Generate professional customer replies from internal context.
|
|
6
|
+
category: communication
|
|
7
|
+
language: pt-BR
|
|
8
|
+
tags: [customer, reply, communication]
|
|
10
9
|
variables:
|
|
11
10
|
language: pt-BR
|
|
12
11
|
tone: profissional
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
description: resumir reuniões em formato executivo com decisões, riscos e próximos passos.
|
|
2
|
+
id: summarize-meeting
|
|
3
|
+
name: Summarize Meeting
|
|
5
4
|
version: 1.0.0
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
description: Summarize meetings into executive format with decisions, risks and next steps.
|
|
6
|
+
category: productivity
|
|
7
|
+
language: pt-BR
|
|
8
|
+
tags: [meeting, summary, executive]
|
|
10
9
|
variables:
|
|
11
10
|
language: pt-BR
|
|
12
11
|
tone: executivo
|
|
@@ -17,8 +16,6 @@ provider_overrides:
|
|
|
17
16
|
style: "retornar texto mais didático e organizado"
|
|
18
17
|
claude:
|
|
19
18
|
style: "retornar bullets curtos e alta clareza"
|
|
20
|
-
output:
|
|
21
|
-
format: markdown
|
|
22
19
|
---
|
|
23
20
|
|
|
24
21
|
Você é um assistente especialista em resumir reuniões.
|