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.
Files changed (53) hide show
  1. package/README.md +135 -0
  2. package/dist/cli.d.ts +1 -0
  3. package/dist/cli.js +58 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/detector/appDetector.d.ts +2 -0
  6. package/dist/detector/appDetector.js +18 -0
  7. package/dist/detector/appDetector.js.map +1 -0
  8. package/dist/index.d.ts +2 -0
  9. package/dist/index.js +3 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/installer/installer.d.ts +2 -0
  12. package/dist/installer/installer.js +29 -0
  13. package/dist/installer/installer.js.map +1 -0
  14. package/dist/registry/skills.d.ts +7 -0
  15. package/dist/registry/skills.js +50 -0
  16. package/dist/registry/skills.js.map +1 -0
  17. package/dist/registry/types.d.ts +21 -0
  18. package/dist/registry/types.js +2 -0
  19. package/dist/registry/types.js.map +1 -0
  20. package/dist/ui/appsMenu.d.ts +2 -0
  21. package/dist/ui/appsMenu.js +18 -0
  22. package/dist/ui/appsMenu.js.map +1 -0
  23. package/dist/ui/categoryMenu.d.ts +2 -0
  24. package/dist/ui/categoryMenu.js +12 -0
  25. package/dist/ui/categoryMenu.js.map +1 -0
  26. package/dist/ui/confirmMenu.d.ts +2 -0
  27. package/dist/ui/confirmMenu.js +14 -0
  28. package/dist/ui/confirmMenu.js.map +1 -0
  29. package/dist/ui/skillsMenu.d.ts +2 -0
  30. package/dist/ui/skillsMenu.js +27 -0
  31. package/dist/ui/skillsMenu.js.map +1 -0
  32. package/dist/ui/summary.d.ts +2 -0
  33. package/dist/ui/summary.js +33 -0
  34. package/dist/ui/summary.js.map +1 -0
  35. package/dist/ui/welcome.d.ts +1 -0
  36. package/dist/ui/welcome.js +24 -0
  37. package/dist/ui/welcome.js.map +1 -0
  38. package/dist/utils/logger.d.ts +7 -0
  39. package/dist/utils/logger.js +9 -0
  40. package/dist/utils/logger.js.map +1 -0
  41. package/dist/utils/paths.d.ts +2 -0
  42. package/dist/utils/paths.js +19 -0
  43. package/dist/utils/paths.js.map +1 -0
  44. package/package.json +51 -0
  45. package/skills/conteudo/estrutura-headings/SKILL.md +16 -0
  46. package/skills/conteudo/otimizacao-conteudo-seo/SKILL.md +17 -0
  47. package/skills/conteudo/pesquisa-palavras-chave/SKILL.md +17 -0
  48. package/skills/qualidade/analise-concorrentes/SKILL.md +17 -0
  49. package/skills/qualidade/auditoria-links/SKILL.md +17 -0
  50. package/skills/qualidade/checklist-qa-seo/SKILL.md +29 -0
  51. package/skills/tecnico/analise-schema-markup/SKILL.md +16 -0
  52. package/skills/tecnico/auditoria-core-web-vitals/SKILL.md +16 -0
  53. 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,8DAA8D,CAAC;KAC3E,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,WAAW,EAAE,CAAC;IAEd,qBAAqB;IACrB,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAE,CAAC;IAExC,sDAAsD;IACtD,MAAM,eAAe,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,iDAAiD,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,CAAC;IAE3D,2BAA2B;IAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,sCAAsC,CAAC,CAAC,KAAK,EAAE,CAAC;IACpE,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACrD,OAAO,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,MAAM,6BAA6B,CAAC,CAAC;IAErE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wBAAwB;IACxB,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,2CAA2C,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,aAAa;IACb,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAClE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,aAAa;IACb,MAAM,cAAc,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAChE,cAAc,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAEhD,kBAAkB;IAClB,WAAW,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { AppInfo } from '../registry/types.js';
2
+ export declare function detectApps(): AppInfo[];
@@ -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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import './cli.js';
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import './cli.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { SkillInfo, AppInfo, InstallResult } from '../registry/types.js';
2
+ export declare function installSkills(skills: SkillInfo[], apps: AppInfo[]): Promise<InstallResult[]>;
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import type { AppInfo } from '../registry/types.js';
2
+ export declare function promptApps(apps: AppInfo[]): Promise<AppInfo[]>;
@@ -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,2 @@
1
+ import type { SkillCategory } from '../registry/types.js';
2
+ export declare function promptCategory(): Promise<SkillCategory>;
@@ -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,2 @@
1
+ import type { SkillInfo, AppInfo } from '../registry/types.js';
2
+ export declare function promptConfirm(skills: SkillInfo[], apps: AppInfo[]): Promise<boolean>;
@@ -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,2 @@
1
+ import type { SkillInfo } from '../registry/types.js';
2
+ export declare function promptSkills(skills: SkillInfo[]): Promise<SkillInfo[]>;
@@ -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,2 @@
1
+ import type { InstallResult } from '../registry/types.js';
2
+ export declare function showSummary(results: InstallResult[]): void;
@@ -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,7 @@
1
+ export declare const logger: {
2
+ info: (msg: string) => void;
3
+ success: (msg: string) => void;
4
+ warn: (msg: string) => void;
5
+ error: (msg: string) => void;
6
+ blank: () => void;
7
+ };
@@ -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,2 @@
1
+ export declare const APP_SKILLS_DIRS: Record<string, string>;
2
+ export declare const APP_DETECTION_DIRS: Record<string, string>;
@@ -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