cli-liveseo 1.0.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/README.md +135 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +58 -0
- package/dist/cli.js.map +1 -0
- package/dist/detector/appDetector.d.ts +2 -0
- package/dist/detector/appDetector.js +18 -0
- package/dist/detector/appDetector.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/installer/installer.d.ts +2 -0
- package/dist/installer/installer.js +29 -0
- package/dist/installer/installer.js.map +1 -0
- package/dist/registry/skills.d.ts +7 -0
- package/dist/registry/skills.js +50 -0
- package/dist/registry/skills.js.map +1 -0
- package/dist/registry/types.d.ts +21 -0
- package/dist/registry/types.js +2 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/ui/appsMenu.d.ts +2 -0
- package/dist/ui/appsMenu.js +18 -0
- package/dist/ui/appsMenu.js.map +1 -0
- package/dist/ui/categoryMenu.d.ts +2 -0
- package/dist/ui/categoryMenu.js +12 -0
- package/dist/ui/categoryMenu.js.map +1 -0
- package/dist/ui/confirmMenu.d.ts +2 -0
- package/dist/ui/confirmMenu.js +14 -0
- package/dist/ui/confirmMenu.js.map +1 -0
- package/dist/ui/skillsMenu.d.ts +2 -0
- package/dist/ui/skillsMenu.js +27 -0
- package/dist/ui/skillsMenu.js.map +1 -0
- package/dist/ui/summary.d.ts +2 -0
- package/dist/ui/summary.js +33 -0
- package/dist/ui/summary.js.map +1 -0
- package/dist/ui/welcome.d.ts +1 -0
- package/dist/ui/welcome.js +24 -0
- package/dist/ui/welcome.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.js +9 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +2 -0
- package/dist/utils/paths.js +19 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +51 -0
- package/skills/conteudo/estrutura-headings/SKILL.md +16 -0
- package/skills/conteudo/otimizacao-conteudo-seo/SKILL.md +17 -0
- package/skills/conteudo/pesquisa-palavras-chave/SKILL.md +17 -0
- package/skills/qualidade/analise-concorrentes/SKILL.md +17 -0
- package/skills/qualidade/auditoria-links/SKILL.md +17 -0
- package/skills/qualidade/checklist-qa-seo/SKILL.md +29 -0
- package/skills/tecnico/analise-schema-markup/SKILL.md +16 -0
- package/skills/tecnico/auditoria-core-web-vitals/SKILL.md +16 -0
- package/skills/tecnico/velocidade-pagina/SKILL.md +16 -0
package/README.md
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# cli-liveseo
|
|
2
|
+
|
|
3
|
+
CLI da LiveSEO para instalar **Agent Skills** de SEO nas suas ferramentas de IA com um único comando.
|
|
4
|
+
|
|
5
|
+
Agent Skills são capacidades modulares em formato `.md` que ampliam as habilidades das IAs. O `cli-liveseo` detecta automaticamente quais aplicativos você tem instalados e copia as skills para o lugar certo — sem precisar editar arquivos de configuração na mão.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Requisitos
|
|
10
|
+
|
|
11
|
+
- [Node.js](https://nodejs.org/) **18 ou superior**
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Instalação
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g cli-liveseo
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Após a instalação, o comando `liveseo` estará disponível globalmente no seu terminal.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Como usar
|
|
26
|
+
|
|
27
|
+
Execute o comando:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
liveseo
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
O CLI abre um menu interativo com o seguinte fluxo:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
1. Selecione a categoria de skills
|
|
37
|
+
❯ Tecnico
|
|
38
|
+
Conteudo
|
|
39
|
+
Qualidade
|
|
40
|
+
|
|
41
|
+
2. Selecione as skills para instalar
|
|
42
|
+
(espaço = selecionar, 'a' = todas)
|
|
43
|
+
◯ auditoria-core-web-vitals
|
|
44
|
+
Realiza auditoria completa de Core Web Vitals...
|
|
45
|
+
◯ analise-schema-markup
|
|
46
|
+
Analisa e implementa Schema Markup...
|
|
47
|
+
|
|
48
|
+
3. Selecione onde instalar
|
|
49
|
+
(apps detectados automaticamente)
|
|
50
|
+
◉ Claude Code / Claude Desktop
|
|
51
|
+
◉ Cursor
|
|
52
|
+
◉ Gemini CLI
|
|
53
|
+
|
|
54
|
+
4. Confirme e instale
|
|
55
|
+
As skills são copiadas para os diretórios corretos de cada app.
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Apps suportados
|
|
61
|
+
|
|
62
|
+
O CLI detecta automaticamente os seguintes aplicativos instalados na sua máquina:
|
|
63
|
+
|
|
64
|
+
| Aplicativo | Diretório de skills |
|
|
65
|
+
|---|---|
|
|
66
|
+
| **Claude Code / Claude Desktop** | `~/.claude/skills/` |
|
|
67
|
+
| **Cursor** | `~/.cursor/skills/` |
|
|
68
|
+
| **Gemini CLI** | `~/.gemini/skills/` |
|
|
69
|
+
| **Antigravity (Google)** | `~/.gemini/antigravity/skills/` |
|
|
70
|
+
| **Opencode** | `~/.config/opencode/skills/` |
|
|
71
|
+
|
|
72
|
+
> Após instalar as skills, reinicie o aplicativo para ativá-las.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Skills disponíveis
|
|
77
|
+
|
|
78
|
+
### Técnico
|
|
79
|
+
| Skill | Descrição |
|
|
80
|
+
|---|---|
|
|
81
|
+
| `auditoria-core-web-vitals` | Auditoria completa de LCP, INP e CLS |
|
|
82
|
+
| `analise-schema-markup` | Implementação e validação de dados estruturados (JSON-LD) |
|
|
83
|
+
| `velocidade-pagina` | Diagnóstico e otimização de performance |
|
|
84
|
+
|
|
85
|
+
### Conteúdo
|
|
86
|
+
| Skill | Descrição |
|
|
87
|
+
|---|---|
|
|
88
|
+
| `otimizacao-conteudo-seo` | Otimização de textos para ranqueamento |
|
|
89
|
+
| `pesquisa-palavras-chave` | Pesquisa e clusterização de palavras-chave |
|
|
90
|
+
| `estrutura-headings` | Hierarquia de H1-H6 para SEO e acessibilidade |
|
|
91
|
+
|
|
92
|
+
### Qualidade
|
|
93
|
+
| Skill | Descrição |
|
|
94
|
+
|---|---|
|
|
95
|
+
| `checklist-qa-seo` | Checklist completo de QA antes de publicar |
|
|
96
|
+
| `auditoria-links` | Identificação de links quebrados e oportunidades de link interno |
|
|
97
|
+
| `analise-concorrentes` | Análise comparativa de SEO com concorrentes |
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Para contribuidores: como adicionar novas skills
|
|
102
|
+
|
|
103
|
+
Cada skill é uma pasta dentro de `skills/<categoria>/` com um arquivo `SKILL.md`:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
skills/
|
|
107
|
+
tecnico/
|
|
108
|
+
minha-nova-skill/
|
|
109
|
+
SKILL.md
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
O `SKILL.md` deve ter o seguinte formato:
|
|
113
|
+
|
|
114
|
+
```markdown
|
|
115
|
+
---
|
|
116
|
+
name: minha-nova-skill
|
|
117
|
+
description: Descrição clara do que a skill faz e quando a IA deve usá-la.
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
# Minha Nova Skill
|
|
121
|
+
|
|
122
|
+
## Instruções
|
|
123
|
+
|
|
124
|
+
1. Passo 1
|
|
125
|
+
2. Passo 2
|
|
126
|
+
...
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Depois de criar a pasta, a skill aparece automaticamente no menu — nenhuma alteração de código necessária.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Licença
|
|
134
|
+
|
|
135
|
+
MIT — LiveSEO
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { showWelcome } from './ui/welcome.js';
|
|
4
|
+
import { promptCategory } from './ui/categoryMenu.js';
|
|
5
|
+
import { promptSkills } from './ui/skillsMenu.js';
|
|
6
|
+
import { promptApps } from './ui/appsMenu.js';
|
|
7
|
+
import { promptConfirm } from './ui/confirmMenu.js';
|
|
8
|
+
import { showSummary } from './ui/summary.js';
|
|
9
|
+
import { getSkillsByCategory } from './registry/skills.js';
|
|
10
|
+
import { detectApps } from './detector/appDetector.js';
|
|
11
|
+
import { installSkills } from './installer/installer.js';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
const program = new Command();
|
|
14
|
+
program
|
|
15
|
+
.name('liveseo')
|
|
16
|
+
.description('Instalador de Agent Skills da LiveSEO para ferramentas de IA')
|
|
17
|
+
.version('1.0.0')
|
|
18
|
+
.action(async () => {
|
|
19
|
+
showWelcome();
|
|
20
|
+
// 1. Select category
|
|
21
|
+
const category = await promptCategory();
|
|
22
|
+
// 2. Get skills for that category and let user select
|
|
23
|
+
const availableSkills = getSkillsByCategory(category);
|
|
24
|
+
if (availableSkills.length === 0) {
|
|
25
|
+
console.log(chalk.hex('#FFA500')('\n Nenhuma skill encontrada nesta categoria.\n'));
|
|
26
|
+
process.exit(0);
|
|
27
|
+
}
|
|
28
|
+
const selectedSkills = await promptSkills(availableSkills);
|
|
29
|
+
// 3. Detect installed apps
|
|
30
|
+
const spinner = ora('Detectando aplicativos instalados...').start();
|
|
31
|
+
const allApps = detectApps();
|
|
32
|
+
const detectedApps = allApps.filter(a => a.detected);
|
|
33
|
+
spinner.succeed(`${detectedApps.length} aplicativo(s) detectado(s)`);
|
|
34
|
+
if (detectedApps.length === 0) {
|
|
35
|
+
console.log(chalk.hex('#FFA500')('\n Nenhum aplicativo compativel encontrado.\n'));
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
// 4. Select target apps
|
|
39
|
+
const targetApps = await promptApps(allApps);
|
|
40
|
+
if (targetApps.length === 0) {
|
|
41
|
+
console.log(chalk.hex('#FFA500')('\n Nenhum app selecionado. Encerrando.\n'));
|
|
42
|
+
process.exit(0);
|
|
43
|
+
}
|
|
44
|
+
// 5. Confirm
|
|
45
|
+
const confirmed = await promptConfirm(selectedSkills, targetApps);
|
|
46
|
+
if (!confirmed) {
|
|
47
|
+
console.log(chalk.gray('\n Instalacao cancelada.\n'));
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
50
|
+
// 6. Install
|
|
51
|
+
const installSpinner = ora('Instalando skills...').start();
|
|
52
|
+
const results = await installSkills(selectedSkills, targetApps);
|
|
53
|
+
installSpinner.succeed('Instalacao concluida!');
|
|
54
|
+
// 7. Show summary
|
|
55
|
+
showSummary(results);
|
|
56
|
+
});
|
|
57
|
+
program.parse();
|
|
58
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { existsSync } from 'fs';
|
|
2
|
+
import { APP_DETECTION_DIRS, APP_SKILLS_DIRS } from '../utils/paths.js';
|
|
3
|
+
const APP_DEFINITIONS = [
|
|
4
|
+
{ id: 'claude', displayName: 'Claude Code / Claude Desktop' },
|
|
5
|
+
{ id: 'cursor', displayName: 'Cursor' },
|
|
6
|
+
{ id: 'gemini-cli', displayName: 'Gemini CLI' },
|
|
7
|
+
{ id: 'antigravity', displayName: 'Antigravity (Google)' },
|
|
8
|
+
{ id: 'opencode', displayName: 'Opencode' },
|
|
9
|
+
];
|
|
10
|
+
export function detectApps() {
|
|
11
|
+
return APP_DEFINITIONS.map(app => ({
|
|
12
|
+
id: app.id,
|
|
13
|
+
displayName: app.displayName,
|
|
14
|
+
skillsDir: APP_SKILLS_DIRS[app.id],
|
|
15
|
+
detected: existsSync(APP_DETECTION_DIRS[app.id]),
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=appDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appDetector.js","sourceRoot":"","sources":["../../src/detector/appDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAExE,MAAM,eAAe,GAA8C;IACjE,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;IAC7D,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE;IACvC,EAAE,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE;IAC/C,EAAE,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC1D,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE;CAC5C,CAAC;AAEF,MAAM,UAAU,UAAU;IACxB,OAAO,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,QAAQ,EAAE,UAAU,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;KACjD,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,UAAU,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { mkdirSync, cpSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
function copyDir(src, dest) {
|
|
4
|
+
mkdirSync(dest, { recursive: true });
|
|
5
|
+
cpSync(src, dest, { recursive: true, force: true });
|
|
6
|
+
}
|
|
7
|
+
export async function installSkills(skills, apps) {
|
|
8
|
+
const results = [];
|
|
9
|
+
for (const app of apps) {
|
|
10
|
+
mkdirSync(app.skillsDir, { recursive: true });
|
|
11
|
+
for (const skill of skills) {
|
|
12
|
+
try {
|
|
13
|
+
const destPath = join(app.skillsDir, skill.id);
|
|
14
|
+
copyDir(skill.dirPath, destPath);
|
|
15
|
+
results.push({ app, skillId: skill.id, success: true });
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
results.push({
|
|
19
|
+
app,
|
|
20
|
+
skillId: skill.id,
|
|
21
|
+
success: false,
|
|
22
|
+
error: err.message,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return results;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/installer/installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,SAAS,OAAO,CAAC,GAAW,EAAE,IAAY;IACxC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAmB,EACnB,IAAe;IAEf,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC/C,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC;oBACX,GAAG;oBACH,OAAO,EAAE,KAAK,CAAC,EAAE;oBACjB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAG,GAAa,CAAC,OAAO;iBAC9B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SkillCategory, SkillInfo } from './types.js';
|
|
2
|
+
export declare function getSkillsByCategory(category: SkillCategory): SkillInfo[];
|
|
3
|
+
export declare function getCategoryLabel(category: SkillCategory): string;
|
|
4
|
+
export declare const CATEGORY_OPTIONS: {
|
|
5
|
+
value: SkillCategory;
|
|
6
|
+
name: string;
|
|
7
|
+
}[];
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { readdirSync, existsSync } from 'fs';
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import matter from 'gray-matter';
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
// Go up from dist/ or src/ to the project root, then into skills/
|
|
8
|
+
// When compiled: dist/registry/skills.js -> up 2 levels -> project root
|
|
9
|
+
// When running with tsx: src/registry/skills.ts -> up 2 levels -> project root
|
|
10
|
+
const projectRoot = join(__filename, '..', '..', '..');
|
|
11
|
+
const skillsBaseDir = join(projectRoot, 'skills');
|
|
12
|
+
const CATEGORIES = ['tecnico', 'conteudo', 'qualidade'];
|
|
13
|
+
export function getSkillsByCategory(category) {
|
|
14
|
+
const categoryDir = join(skillsBaseDir, category);
|
|
15
|
+
if (!existsSync(categoryDir))
|
|
16
|
+
return [];
|
|
17
|
+
const skillDirs = readdirSync(categoryDir, { withFileTypes: true })
|
|
18
|
+
.filter(d => d.isDirectory())
|
|
19
|
+
.map(d => d.name);
|
|
20
|
+
const skills = [];
|
|
21
|
+
for (const skillDirName of skillDirs) {
|
|
22
|
+
const skillPath = join(categoryDir, skillDirName);
|
|
23
|
+
const skillMdPath = join(skillPath, 'SKILL.md');
|
|
24
|
+
if (!existsSync(skillMdPath))
|
|
25
|
+
continue;
|
|
26
|
+
const content = readFileSync(skillMdPath, 'utf-8');
|
|
27
|
+
const { data } = matter(content);
|
|
28
|
+
skills.push({
|
|
29
|
+
id: skillDirName,
|
|
30
|
+
name: data.name ?? skillDirName,
|
|
31
|
+
description: data.description ?? '',
|
|
32
|
+
category,
|
|
33
|
+
dirPath: skillPath,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return skills;
|
|
37
|
+
}
|
|
38
|
+
export function getCategoryLabel(category) {
|
|
39
|
+
const labels = {
|
|
40
|
+
tecnico: 'Tecnico',
|
|
41
|
+
conteudo: 'Conteudo',
|
|
42
|
+
qualidade: 'Qualidade',
|
|
43
|
+
};
|
|
44
|
+
return labels[category];
|
|
45
|
+
}
|
|
46
|
+
export const CATEGORY_OPTIONS = CATEGORIES.map(c => ({
|
|
47
|
+
value: c,
|
|
48
|
+
name: getCategoryLabel(c),
|
|
49
|
+
}));
|
|
50
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/registry/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,kEAAkE;AAClE,wEAAwE;AACxE,+EAA+E;AAC/E,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACvD,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAElD,MAAM,UAAU,GAAoB,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAEzE,MAAM,UAAU,mBAAmB,CAAC,QAAuB;IACzD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAChE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEpB,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,YAAY,IAAI,SAAS,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,SAAS;QAEvC,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjC,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,YAAY;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,QAAQ;YACR,OAAO,EAAE,SAAS;SACnB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAuB;IACtD,MAAM,MAAM,GAAkC;QAC5C,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,WAAW;KACvB,CAAC;IACF,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnD,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;CAC1B,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type SkillCategory = 'tecnico' | 'conteudo' | 'qualidade';
|
|
2
|
+
export interface SkillInfo {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
category: SkillCategory;
|
|
7
|
+
dirPath: string;
|
|
8
|
+
}
|
|
9
|
+
export type AppId = 'claude' | 'cursor' | 'gemini-cli' | 'antigravity' | 'opencode';
|
|
10
|
+
export interface AppInfo {
|
|
11
|
+
id: AppId;
|
|
12
|
+
displayName: string;
|
|
13
|
+
skillsDir: string;
|
|
14
|
+
detected: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface InstallResult {
|
|
17
|
+
app: AppInfo;
|
|
18
|
+
skillId: string;
|
|
19
|
+
success: boolean;
|
|
20
|
+
error?: string;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { checkbox } from '@inquirer/prompts';
|
|
2
|
+
export async function promptApps(apps) {
|
|
3
|
+
const detectedApps = apps.filter(a => a.detected);
|
|
4
|
+
if (detectedApps.length === 0) {
|
|
5
|
+
return [];
|
|
6
|
+
}
|
|
7
|
+
const selected = await checkbox({
|
|
8
|
+
message: 'Apps detectados. Selecione onde instalar:',
|
|
9
|
+
choices: detectedApps.map(a => ({
|
|
10
|
+
name: a.displayName,
|
|
11
|
+
value: a.id,
|
|
12
|
+
checked: true,
|
|
13
|
+
})),
|
|
14
|
+
required: true,
|
|
15
|
+
});
|
|
16
|
+
return apps.filter(a => selected.includes(a.id));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=appsMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appsMenu.js","sourceRoot":"","sources":["../../src/ui/appsMenu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAe;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAElD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC;QAC9B,OAAO,EAAE,2CAA2C;QACpD,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,EAAE,CAAC,CAAC,WAAW;YACnB,KAAK,EAAE,CAAC,CAAC,EAAE;YACX,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { select } from '@inquirer/prompts';
|
|
2
|
+
import { CATEGORY_OPTIONS } from '../registry/skills.js';
|
|
3
|
+
export async function promptCategory() {
|
|
4
|
+
return select({
|
|
5
|
+
message: 'Selecione a categoria de skills:',
|
|
6
|
+
choices: CATEGORY_OPTIONS.map(c => ({
|
|
7
|
+
name: c.name,
|
|
8
|
+
value: c.value,
|
|
9
|
+
})),
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=categoryMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categoryMenu.js","sourceRoot":"","sources":["../../src/ui/categoryMenu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,MAAM,CAAC;QACZ,OAAO,EAAE,kCAAkC;QAC3C,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { confirm } from '@inquirer/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
export async function promptConfirm(skills, apps) {
|
|
4
|
+
console.log();
|
|
5
|
+
console.log(chalk.hex('#FF6B00').bold(' Resumo da instalacao:'));
|
|
6
|
+
console.log(chalk.hex('#FF8C00')(` Skills: ${skills.map(s => s.name).join(', ')}`));
|
|
7
|
+
console.log(chalk.hex('#FF8C00')(` Apps: ${apps.map(a => a.displayName).join(', ')}`));
|
|
8
|
+
console.log();
|
|
9
|
+
return confirm({
|
|
10
|
+
message: `Instalar ${skills.length} skill(s) em ${apps.length} app(s)?`,
|
|
11
|
+
default: true,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=confirmMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmMenu.js","sourceRoot":"","sources":["../../src/ui/confirmMenu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAmB,EACnB,IAAe;IAEf,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,aAAa,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,aAAa,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,OAAO,OAAO,CAAC;QACb,OAAO,EAAE,YAAY,MAAM,CAAC,MAAM,gBAAgB,IAAI,CAAC,MAAM,UAAU;QACvE,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { checkbox } from '@inquirer/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
export async function promptSkills(skills) {
|
|
4
|
+
const selected = await checkbox({
|
|
5
|
+
message: `Selecione as skills para instalar: (espaco = selecionar, 'a' = todas)`,
|
|
6
|
+
choices: skills.map(s => ({
|
|
7
|
+
name: chalk.hex('#FF6B00').bold(s.name) + '\n ' + chalk.gray(s.description),
|
|
8
|
+
value: s.id,
|
|
9
|
+
short: s.name,
|
|
10
|
+
checked: false,
|
|
11
|
+
})),
|
|
12
|
+
required: true,
|
|
13
|
+
theme: {
|
|
14
|
+
icon: {
|
|
15
|
+
checked: chalk.hex('#FF6B00')('◉'),
|
|
16
|
+
unchecked: chalk.gray('◯'),
|
|
17
|
+
cursor: chalk.hex('#FF6B00')('>'),
|
|
18
|
+
},
|
|
19
|
+
style: {
|
|
20
|
+
highlight: (text) => chalk.hex('#FF6B00')(text),
|
|
21
|
+
description: (text) => chalk.gray(text),
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
return skills.filter(s => selected.includes(s.id));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=skillsMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillsMenu.js","sourceRoot":"","sources":["../../src/ui/skillsMenu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAmB;IACpD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC;QAC9B,OAAO,EAAE,uEAAuE;QAChF,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxB,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;YAC/E,KAAK,EAAE,CAAC,CAAC,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,IAAI;YACb,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE;YACL,IAAI,EAAE;gBACJ,OAAO,EAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC;gBACpC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC1B,MAAM,EAAK,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC;aACrC;YACD,KAAK,EAAE;gBACL,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;gBACvD,WAAW,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;aAChD;SACF;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export function showSummary(results) {
|
|
3
|
+
// Group results by app ID
|
|
4
|
+
const appResults = new Map();
|
|
5
|
+
for (const r of results) {
|
|
6
|
+
if (!appResults.has(r.app.id)) {
|
|
7
|
+
appResults.set(r.app.id, { app: r.app, successes: 0, errors: 0 });
|
|
8
|
+
}
|
|
9
|
+
const entry = appResults.get(r.app.id);
|
|
10
|
+
if (r.success) {
|
|
11
|
+
entry.successes++;
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
entry.errors++;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
console.log();
|
|
18
|
+
console.log(chalk.hex('#FF6B00').bold(' Resultado:'));
|
|
19
|
+
console.log();
|
|
20
|
+
for (const [, { app, successes, errors }] of appResults) {
|
|
21
|
+
if (errors === 0) {
|
|
22
|
+
console.log(chalk.hex('#FF6B00').bold(` ✓ ${app.displayName} — ${successes} skill(s) instalada(s)`));
|
|
23
|
+
console.log(chalk.gray(` → ${app.skillsDir}`));
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.log(chalk.hex('#FFA500')(` ⚠ ${app.displayName} — ${successes} ok, ${errors} com erro`));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
console.log();
|
|
30
|
+
console.log(chalk.hex('#FF8C00').bold(' Reinicie os aplicativos para ativar as skills.'));
|
|
31
|
+
console.log();
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/ui/summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,UAAU,WAAW,CAAC,OAAwB;IAClD,0BAA0B;IAC1B,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+D,CAAC;IAE1F,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QACxC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;QACxD,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,WAAW,MAAM,SAAS,wBAAwB,CAAC,CAAC,CAAC;YACtG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,WAAW,MAAM,SAAS,QAAQ,MAAM,WAAW,CAAC,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function showWelcome(): void;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export function showWelcome() {
|
|
3
|
+
console.clear();
|
|
4
|
+
console.log();
|
|
5
|
+
const gray = chalk.bold.gray;
|
|
6
|
+
const orange = chalk.bold.hex('#FF6B00');
|
|
7
|
+
const SPLIT = 30;
|
|
8
|
+
const lines = [
|
|
9
|
+
' ██╗ ██╗██╗ ██╗███████╗███████╗███████╗ ██████╗ ',
|
|
10
|
+
' ██║ ██║██║ ██║██╔════╝██╔════╝██╔════╝██╔═══██╗',
|
|
11
|
+
' ██║ ██║██║ ██║█████╗ ███████╗█████╗ ██║ ██║',
|
|
12
|
+
' ██║ ██║╚██╗ ██╔╝██╔══╝ ╚════██║██╔══╝ ██║ ██║',
|
|
13
|
+
' ███████╗██║ ╚████╔╝ ███████╗███████║███████╗╚██████╔╝',
|
|
14
|
+
' ╚══════╝╚═╝ ╚═══╝ ╚══════╝╚══════╝╚══════╝ ╚═════╝ ',
|
|
15
|
+
];
|
|
16
|
+
for (const line of lines) {
|
|
17
|
+
process.stdout.write(gray(line.slice(0, SPLIT)) + orange(line.slice(SPLIT)) + '\n');
|
|
18
|
+
}
|
|
19
|
+
console.log();
|
|
20
|
+
console.log(chalk.gray(' Instalador de Agent Skills para ferramentas de IA'));
|
|
21
|
+
console.log(chalk.gray(' ─────────────────────────────────────────────────'));
|
|
22
|
+
console.log();
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=welcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/ui/welcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,MAAM,IAAI,GAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,KAAK,GAAI,EAAE,CAAC;IAClB,MAAM,KAAK,GAAG;QACZ,yDAAyD;QACzD,yDAAyD;QACzD,yDAAyD;QACzD,yDAAyD;QACzD,yDAAyD;QACzD,yDAAyD;KAC1D,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export const logger = {
|
|
3
|
+
info: (msg) => console.log(chalk.hex('#FF8C00')(' ' + msg)),
|
|
4
|
+
success: (msg) => console.log(chalk.hex('#FF6B00').bold(' ✓ ' + msg)),
|
|
5
|
+
warn: (msg) => console.log(chalk.hex('#FFA500')(' ⚠ ' + msg)),
|
|
6
|
+
error: (msg) => console.log(chalk.red(' ✗ ' + msg)),
|
|
7
|
+
blank: () => console.log(),
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IACpE,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC9E,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACtE,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC5D,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;CAC3B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
// Use os.homedir() for cross-platform home directory (works on Windows too)
|
|
4
|
+
const HOME = homedir();
|
|
5
|
+
export const APP_SKILLS_DIRS = {
|
|
6
|
+
claude: join(HOME, '.claude', 'skills'),
|
|
7
|
+
cursor: join(HOME, '.cursor', 'skills'),
|
|
8
|
+
'gemini-cli': join(HOME, '.gemini', 'skills'),
|
|
9
|
+
antigravity: join(HOME, '.gemini', 'antigravity', 'skills'),
|
|
10
|
+
opencode: join(HOME, '.config', 'opencode', 'skills'),
|
|
11
|
+
};
|
|
12
|
+
export const APP_DETECTION_DIRS = {
|
|
13
|
+
claude: join(HOME, '.claude'),
|
|
14
|
+
cursor: join(HOME, '.cursor'),
|
|
15
|
+
'gemini-cli': join(HOME, '.gemini'),
|
|
16
|
+
antigravity: join(HOME, '.gemini', 'antigravity'),
|
|
17
|
+
opencode: join(HOME, '.config', 'opencode'),
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,4EAA4E;AAC5E,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AAEvB,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;IACvC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;IACvC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;IAC7C,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC;IAC3D,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC;CACtD,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;IAC7B,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;IAC7B,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;IACnC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC;IACjD,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC;CAC5C,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "cli-liveseo",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Instalador de Agent Skills da LiveSEO para ferramentas de IA",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"liveseo": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"dev": "tsx src/index.ts",
|
|
12
|
+
"start": "node dist/index.js",
|
|
13
|
+
"prepublishOnly": "npm run build"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"skills"
|
|
18
|
+
],
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=18.0.0"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"seo",
|
|
24
|
+
"skills",
|
|
25
|
+
"ai",
|
|
26
|
+
"liveseo",
|
|
27
|
+
"agent-skills",
|
|
28
|
+
"cli",
|
|
29
|
+
"claude",
|
|
30
|
+
"cursor",
|
|
31
|
+
"gemini"
|
|
32
|
+
],
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/lucasbueno-live/cli-liveseo.git"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/lucasbueno-live/cli-liveseo#readme",
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@inquirer/prompts": "^7.0.0",
|
|
41
|
+
"chalk": "^5.3.0",
|
|
42
|
+
"commander": "^13.0.0",
|
|
43
|
+
"gray-matter": "^4.0.3",
|
|
44
|
+
"ora": "^8.0.0"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/node": "^22.0.0",
|
|
48
|
+
"tsx": "^4.0.0",
|
|
49
|
+
"typescript": "^5.7.0"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: estrutura-headings
|
|
3
|
+
description: Analisa e corrige a estrutura de headings (H1-H6) para SEO e acessibilidade. Use quando precisar revisar ou criar a hierarquia de titulos de uma pagina.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Estrutura de Headings
|
|
7
|
+
|
|
8
|
+
Crie e valide a hierarquia de headings para SEO e acessibilidade.
|
|
9
|
+
|
|
10
|
+
## Instrucoes
|
|
11
|
+
|
|
12
|
+
1. Verifique se existe apenas um H1 por pagina
|
|
13
|
+
2. Valide a hierarquia logica (H1 > H2 > H3, sem pular niveis)
|
|
14
|
+
3. Certifique que cada heading contem a palavra-chave relevante
|
|
15
|
+
4. Verifique se os headings descrevem corretamente o conteudo abaixo
|
|
16
|
+
5. Ajuste para melhorar escaneabilidade e estrutura semantica
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: otimizacao-conteudo-seo
|
|
3
|
+
description: Otimiza conteudo para SEO mantendo qualidade e naturalidade. Use quando precisar melhorar o ranqueamento de um texto ou pagina existente.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Otimizacao de Conteudo SEO
|
|
7
|
+
|
|
8
|
+
Melhore o conteudo existente para ranquear melhor sem perder qualidade.
|
|
9
|
+
|
|
10
|
+
## Instrucoes
|
|
11
|
+
|
|
12
|
+
1. Identifique a palavra-chave principal e as secundarias do conteudo
|
|
13
|
+
2. Verifique densidade de palavras-chave (ideal: 1-2%)
|
|
14
|
+
3. Otimize title tag, meta description, H1 e subtitulos
|
|
15
|
+
4. Melhore a estrutura do conteudo com sections claras
|
|
16
|
+
5. Adicione links internos relevantes
|
|
17
|
+
6. Verifique legibilidade (Flesch Reading Ease)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pesquisa-palavras-chave
|
|
3
|
+
description: Realiza pesquisa e analise de palavras-chave para estrategia de conteudo. Use quando precisar identificar oportunidades de conteudo ou termos para otimizar.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Pesquisa de Palavras-Chave
|
|
7
|
+
|
|
8
|
+
Identifique as melhores palavras-chave para conteudo e otimizacao.
|
|
9
|
+
|
|
10
|
+
## Instrucoes
|
|
11
|
+
|
|
12
|
+
1. Defina o topico principal e o publico-alvo
|
|
13
|
+
2. Mapeie palavras-chave head, mid-tail e long-tail
|
|
14
|
+
3. Analise volume de busca, dificuldade e intencao de busca
|
|
15
|
+
4. Identifique gaps em relacao a concorrentes
|
|
16
|
+
5. Priorize por potencial de trafego x dificuldade
|
|
17
|
+
6. Agrupe por cluster semantico para estrategia de conteudo
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: analise-concorrentes
|
|
3
|
+
description: Realiza analise comparativa de SEO entre o site e seus principais concorrentes. Use para identificar gaps e oportunidades estrategicas.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Analise de Concorrentes SEO
|
|
7
|
+
|
|
8
|
+
Compare o desempenho SEO com concorrentes para identificar oportunidades.
|
|
9
|
+
|
|
10
|
+
## Instrucoes
|
|
11
|
+
|
|
12
|
+
1. Identifique os 3-5 principais concorrentes organicos
|
|
13
|
+
2. Compare autoridade de dominio e perfil de backlinks
|
|
14
|
+
3. Analise gap de palavras-chave (termos que concorrentes ranqueiam mas voce nao)
|
|
15
|
+
4. Compare volume e qualidade de conteudo
|
|
16
|
+
5. Identifique as melhores praticas que podem ser replicadas
|
|
17
|
+
6. Priorize acoes por potencial de impacto
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: auditoria-links
|
|
3
|
+
description: Audita links internos e externos para encontrar links quebrados, redirecionamentos e oportunidades de link building. Use para manutencao regular ou pre-lancamento.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Auditoria de Links
|
|
7
|
+
|
|
8
|
+
Identifique e corrija problemas de links internos e externos.
|
|
9
|
+
|
|
10
|
+
## Instrucoes
|
|
11
|
+
|
|
12
|
+
1. Mapeie todos os links internos do site
|
|
13
|
+
2. Identifique links quebrados (404) e redirecionamentos em cadeia
|
|
14
|
+
3. Verifique links externos com atributos nofollow/dofollow corretos
|
|
15
|
+
4. Identifique paginas orfas (sem links internos apontando para elas)
|
|
16
|
+
5. Sugira oportunidades de melhoria de link interno
|
|
17
|
+
6. Reporte links externos para sites de baixa autoridade
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: checklist-qa-seo
|
|
3
|
+
description: Executa checklist completo de QA para SEO tecnico e on-page. Use antes de publicar paginas ou apos migracoes para garantir que tudo esta correto.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Checklist de QA SEO
|
|
7
|
+
|
|
8
|
+
Execute verificacao completa de qualidade SEO em paginas web.
|
|
9
|
+
|
|
10
|
+
## Checklist
|
|
11
|
+
|
|
12
|
+
### SEO Tecnico
|
|
13
|
+
- [ ] Status HTTP 200 (sem redirecionamentos desnecessarios)
|
|
14
|
+
- [ ] Canonical tag correta
|
|
15
|
+
- [ ] Meta robots nao bloqueando indexacao
|
|
16
|
+
- [ ] Sitemap atualizado
|
|
17
|
+
- [ ] Robots.txt correto
|
|
18
|
+
|
|
19
|
+
### On-Page
|
|
20
|
+
- [ ] Title tag unica e otimizada (50-60 caracteres)
|
|
21
|
+
- [ ] Meta description atrativa (150-160 caracteres)
|
|
22
|
+
- [ ] H1 presente e unico
|
|
23
|
+
- [ ] Imagens com alt text
|
|
24
|
+
- [ ] Links internos funcionando
|
|
25
|
+
|
|
26
|
+
### Conteudo
|
|
27
|
+
- [ ] Conteudo original e de qualidade
|
|
28
|
+
- [ ] Palavras-chave naturalmente integradas
|
|
29
|
+
- [ ] Estrutura logica com headings
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: analise-schema-markup
|
|
3
|
+
description: Analisa e implementa Schema Markup (JSON-LD) para melhorar rich results no Google. Use quando precisar adicionar ou corrigir dados estruturados em paginas.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Analise de Schema Markup
|
|
7
|
+
|
|
8
|
+
Implemente e valide dados estruturados para melhorar a visibilidade nos resultados de busca.
|
|
9
|
+
|
|
10
|
+
## Instrucoes
|
|
11
|
+
|
|
12
|
+
1. Identifique o tipo de conteudo da pagina (artigo, produto, local, evento, etc.)
|
|
13
|
+
2. Verifique se ja existe Schema Markup implementado
|
|
14
|
+
3. Valide o markup existente contra as diretrizes do Google
|
|
15
|
+
4. Implemente ou corrija o JSON-LD com os campos obrigatorios e recomendados
|
|
16
|
+
5. Teste com o Rich Results Test do Google
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: auditoria-core-web-vitals
|
|
3
|
+
description: Realiza auditoria completa de Core Web Vitals (LCP, INP, CLS) e sugere otimizacoes. Use quando precisar analisar ou melhorar a performance de paginas web.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Auditoria de Core Web Vitals
|
|
7
|
+
|
|
8
|
+
Analise e otimize as metricas Core Web Vitals de paginas web.
|
|
9
|
+
|
|
10
|
+
## Instrucoes
|
|
11
|
+
|
|
12
|
+
1. Identifique as metricas atuais de LCP, INP e CLS da pagina
|
|
13
|
+
2. Compare com os benchmarks do Google (LCP < 2.5s, INP < 200ms, CLS < 0.1)
|
|
14
|
+
3. Aponte os elementos que mais impactam cada metrica
|
|
15
|
+
4. Sugira correcoes priorizadas por impacto
|
|
16
|
+
5. Documente as melhorias esperadas apos cada correcao
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: velocidade-pagina
|
|
3
|
+
description: Diagnostica e otimiza a velocidade de carregamento de paginas web. Use quando o site estiver lento ou precisar melhorar o Page Speed Score.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Otimizacao de Velocidade de Pagina
|
|
7
|
+
|
|
8
|
+
Diagnostique e corrija problemas de performance para melhorar o tempo de carregamento.
|
|
9
|
+
|
|
10
|
+
## Instrucoes
|
|
11
|
+
|
|
12
|
+
1. Execute uma analise completa com PageSpeed Insights
|
|
13
|
+
2. Identifique os principais gargalos (imagens, JavaScript, CSS, servidor)
|
|
14
|
+
3. Priorize otimizacoes por impacto no LCP e FCP
|
|
15
|
+
4. Implemente lazy loading, compressao de imagens e minificacao de assets
|
|
16
|
+
5. Verifique o impacto das mudancas com nova medicao
|