@fprad0/skill-master-mcp 0.0.7 → 0.0.9
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/CHANGELOG.md +16 -0
- package/README.md +129 -10
- package/VERSION.md +3 -3
- package/bin/lib/menu-core.mjs +284 -2
- package/bin/skill-master-activation.mjs +163 -0
- package/bin/skill-master-bootstrap-global.mjs +35 -0
- package/bin/skill-master-eval-activation.mjs +32 -0
- package/bin/skill-master-install-global-skills.mjs +77 -0
- package/bin/skill-master-register-clients.mjs +154 -0
- package/bin/skill-master-success-skills.mjs +307 -0
- package/dist/activation-evals.d.ts +32 -0
- package/dist/activation-evals.d.ts.map +1 -0
- package/dist/activation-evals.js +116 -0
- package/dist/activation-evals.js.map +1 -0
- package/dist/domain-router.d.ts +11 -0
- package/dist/domain-router.d.ts.map +1 -0
- package/dist/domain-router.js +79 -0
- package/dist/domain-router.js.map +1 -0
- package/dist/index.js +460 -1
- package/dist/index.js.map +1 -1
- package/dist/moral-governance.d.ts +24 -0
- package/dist/moral-governance.d.ts.map +1 -0
- package/dist/moral-governance.js +143 -0
- package/dist/moral-governance.js.map +1 -0
- package/dist/prompt-router.d.ts +47 -0
- package/dist/prompt-router.d.ts.map +1 -0
- package/dist/prompt-router.js +324 -0
- package/dist/prompt-router.js.map +1 -0
- package/dist/success-learning.d.ts +147 -0
- package/dist/success-learning.d.ts.map +1 -0
- package/dist/success-learning.js +444 -0
- package/dist/success-learning.js.map +1 -0
- package/docs/architecture/APRENDIZADO_DE_IMPLEMENTACOES_BEM_SUCEDIDAS.md +125 -0
- package/docs/architecture/ARQUITETURA_AUTO_UPDATE.md +9 -0
- package/docs/architecture/PLANO_MASTER_ACIONAMENTO_AUTOMATICO_E_APRENDIZADO.md +341 -0
- package/docs/architecture/REDE_SEGURA_DE_SKILLS.md +148 -0
- package/docs/planning/V0_0_9_APROVACAO_CRITICA_MENSAGENS_DE_VENDA.md +85 -0
- package/docs/planning/V0_0_9_FONTES_E_CRITERIOS_DE_AUTORIDADE.md +139 -0
- package/docs/planning/V0_0_9_MATRIZ_SKILLS_MULTIDISCIPLINARES.md +105 -0
- package/docs/planning/V0_0_9_POLITICA_MORAL_CATOLICA_PARA_IA.md +181 -0
- package/docs/planning/V0_0_9_PROMPTS_EXECUCAO.md +59 -0
- package/docs/planning/V0_0_9_ROADMAP_DISCERNIMENTO_E_CONHECIMENTO_AMPLO.md +181 -0
- package/docs/skill-candidates/v0.0.9/ai-ethics-human-dignity/SKILL.md +32 -0
- package/docs/skill-candidates/v0.0.9/broad-domain-router/SKILL.md +41 -0
- package/docs/skill-candidates/v0.0.9/catholic-moral-discernment/SKILL.md +31 -0
- package/docs/skill-candidates/v0.0.9/engineering-systems-master/SKILL.md +31 -0
- package/docs/skill-candidates/v0.0.9/language-quality-pt-en-fr/SKILL.md +28 -0
- package/docs/skill-candidates/v0.0.9/math-science-reasoning/SKILL.md +29 -0
- package/docs/skill-candidates/v0.0.9/philosophy-sociology-discernment/SKILL.md +28 -0
- package/docs/skill-candidates/v0.0.9/professional-boundary-triage/SKILL.md +40 -0
- package/docs/skill-candidates/v0.0.9/release-ethics-gate/SKILL.md +32 -0
- package/docs/skill-candidates/v0.0.9/source-authority-reviewer/SKILL.md +31 -0
- package/manifests/channels/beta.json +7 -6
- package/manifests/channels/stable.json +8 -7
- package/network/approved-skills.json +51 -2
- package/network/unapproved-skill-candidates.json +77 -0
- package/package.json +13 -3
- package/sources.json +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,9 +4,25 @@ All notable changes to `skill_master` will be tracked here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.0.9] - 2026-06-28
|
|
8
|
+
|
|
9
|
+
- Add Catholic-inspired moral governance with `skill_master_moral_discernment`, moral gates, and prompt-router integration.
|
|
10
|
+
- Add broad domain routing with `skill_master_domain_router` and global multidisciplinary skill recommendations.
|
|
11
|
+
- Add bundled global Skill Master skills for moral discernment, AI ethics, professional boundaries, languages, science, philosophy, sociology, engineering, source review, and release ethics.
|
|
12
|
+
- Add `skill-master-install-global-skills` to install bundled skills into `CODEX_HOME/skills` or `~/.codex/skills`.
|
|
13
|
+
- Add `skill-master-register-clients` to generate/apply MCP registration for Codex, Claude Desktop, and Gemini.
|
|
7
14
|
- Prepare a public npm publication path with dedicated workflow and operator guide.
|
|
8
15
|
- Upgrade release automation from Node `20` to Node `22`.
|
|
9
16
|
|
|
17
|
+
## [0.0.8] - 2026-06-27
|
|
18
|
+
|
|
19
|
+
- Add `skill_master_prompt_router` with `manual`, `balanced`, and `always-on-assisted` activation modes.
|
|
20
|
+
- Add Dev Senior Master persona routing, safety gates, Notion/update detection, and learned-skill signals.
|
|
21
|
+
- Add success-learning flows for human approval packages, local/global activation, study decisions, and rejection history.
|
|
22
|
+
- Add `skill-master-activation`, `skill-master-success-skills`, and `skill-master-eval-activation` operator CLIs.
|
|
23
|
+
- Expand the terminal menu with activation status, prompt recommendations, learned-skill notifications, study/reject actions, and Notion summaries.
|
|
24
|
+
- Add activation evals with positive, negative, and risk cases plus `npm run eval:activation`.
|
|
25
|
+
|
|
10
26
|
## [0.0.7] - 2026-06-26
|
|
11
27
|
|
|
12
28
|
- Add a visual terminal menu for `skill-master-menu` using `prompts`, with TTY detection and direct action mode.
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Skill Master MCP
|
|
2
2
|
|
|
3
|
-
Versao planejada: `00.
|
|
3
|
+
Versao planejada: `00.03`
|
|
4
4
|
|
|
5
5
|
Este repositorio e a base independente do MCP `skill_master`. Ele nao pertence ao LinkBiz e deve evoluir como um projeto pessoal, preferencialmente publicado em um GitHub particular.
|
|
6
6
|
|
|
@@ -8,9 +8,9 @@ Este repositorio e a base independente do MCP `skill_master`. Ele nao pertence a
|
|
|
8
8
|
|
|
9
9
|
Criar um MCP capaz de catalogar skills locais e remotas, recomendar as melhores skills para um prompt e manter atualizacoes automaticas para varios computadores e usuarios.
|
|
10
10
|
|
|
11
|
-
## Decisao da versao 00.
|
|
11
|
+
## Decisao da versao 00.03
|
|
12
12
|
|
|
13
|
-
A versao `00.
|
|
13
|
+
A versao `00.03` consolida:
|
|
14
14
|
|
|
15
15
|
- distribuicao publica por `npmjs.org`
|
|
16
16
|
- distribuicao privada por GitHub Packages
|
|
@@ -108,18 +108,23 @@ npm install -g @fprad0/skill-master-mcp
|
|
|
108
108
|
npx -y @fprad0/skill-master-mcp@latest
|
|
109
109
|
```
|
|
110
110
|
|
|
111
|
-
Estado atual
|
|
111
|
+
Estado atual preparado em `2026-06-28`:
|
|
112
112
|
|
|
113
|
-
-
|
|
114
|
-
-
|
|
115
|
-
-
|
|
116
|
-
- `npm install
|
|
113
|
+
- release publica: `@fprad0/skill-master-mcp@0.0.9`
|
|
114
|
+
- `latest` no npmjs aponta para `0.0.9`
|
|
115
|
+
- validacao de pacote por tarball local confirmada
|
|
116
|
+
- validacao de instalacao publica via `npm install @fprad0/skill-master-mcp@0.0.9` confirmada
|
|
117
117
|
|
|
118
118
|
Comandos globais principais:
|
|
119
119
|
|
|
120
120
|
```bash
|
|
121
|
+
skill-master-activation
|
|
122
|
+
skill-master-eval-activation
|
|
123
|
+
skill-master-install-global-skills
|
|
121
124
|
skill-master-mcp
|
|
122
125
|
skill-master-menu
|
|
126
|
+
skill-master-register-clients
|
|
127
|
+
skill-master-success-skills
|
|
123
128
|
skill-master-update
|
|
124
129
|
skill-master-configure-private-registry
|
|
125
130
|
```
|
|
@@ -136,10 +141,71 @@ O menu agora possui modo visual interativo para terminal com TTY e tambem aceita
|
|
|
136
141
|
skill-master-menu --run status
|
|
137
142
|
skill-master-menu --run check
|
|
138
143
|
skill-master-menu --run update --yes
|
|
144
|
+
skill-master-menu --run install-global-skills
|
|
145
|
+
skill-master-menu --run bootstrap-global
|
|
146
|
+
skill-master-menu --run register-clients
|
|
147
|
+
skill-master-menu --run notifications
|
|
148
|
+
skill-master-menu --run study-skills
|
|
149
|
+
skill-master-menu --run approval-package
|
|
150
|
+
skill-master-menu --run activation-status
|
|
151
|
+
skill-master-menu --run recommend-prompt
|
|
152
|
+
skill-master-menu --run notion-summary
|
|
139
153
|
```
|
|
140
154
|
|
|
141
155
|
O menu visual usa `prompts` para ficar mais legivel no terminal e manter compatibilidade com `Node 18+`.
|
|
142
156
|
|
|
157
|
+
Quando o menu detectar que o MCP ainda nao esta globalmente pronto neste computador, ele mostra um alerta forte e um aviso sutil explicando que a instalacao global e o registro dos clientes sao necessarios para o `skill_master` parecer parte do sistema em Codex, Claude e Gemini.
|
|
158
|
+
|
|
159
|
+
Para instalar as skills globais embutidas de discernimento, conhecimento amplo, engenharia e governanca moral:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
skill-master-install-global-skills
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Para fazer o bootstrap global completo em um passo:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
skill-master-bootstrap-global
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Para registrar o MCP nos clientes principais usando o binario global `skill-master-mcp`:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
skill-master-register-clients --apply-codex
|
|
175
|
+
skill-master-register-clients --apply-claude
|
|
176
|
+
skill-master-register-clients --apply-gemini
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Atalho para gerar snippets e aplicar nos tres:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
skill-master-register-clients --apply-all
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Isso configura o servidor MCP `skill_master` em Codex, Claude Desktop e Gemini quando os arquivos de configuracao locais estiverem disponiveis. Reinicie o cliente depois do registro.
|
|
186
|
+
|
|
187
|
+
O menu tambem mostra notificacoes de skills aprendidas pendentes e links externos para estudo. As acoes de ativacao sao:
|
|
188
|
+
|
|
189
|
+
- `skill-master-menu --run activate-learned-local`: instala uma skill aprovada em `.codex/skills` do workspace atual.
|
|
190
|
+
- `skill-master-menu --run activate-learned-global`: instala uma skill aprovada em `${CODEX_HOME:-~/.codex}/skills`.
|
|
191
|
+
- `skill-master-menu --run mark-study`: registra uma skill candidata como material para estudo.
|
|
192
|
+
- `skill-master-menu --run reject-skill`: rejeita uma skill candidata preservando historico.
|
|
193
|
+
|
|
194
|
+
Para modo de ativacao e recomendacao local:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
skill-master-activation --status
|
|
198
|
+
skill-master-activation --set-mode balanced
|
|
199
|
+
skill-master-activation --route-prompt "skill-master, recomende skills para este prompt"
|
|
200
|
+
skill-master-activation --notion-summary
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Para rodar as avaliacoes de ativacao antes de release:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
npm run eval:activation
|
|
207
|
+
```
|
|
208
|
+
|
|
143
209
|
Para atualizar a instalacao global via npm sem iniciar o servidor MCP:
|
|
144
210
|
|
|
145
211
|
```bash
|
|
@@ -173,7 +239,7 @@ Os dois caminhos configuram:
|
|
|
173
239
|
|
|
174
240
|
## Compatibilidade com Claude e Gemini
|
|
175
241
|
|
|
176
|
-
A versao `00.
|
|
242
|
+
A versao `00.03` documenta compatibilidade operacional ja preparada para:
|
|
177
243
|
|
|
178
244
|
- Claude Desktop
|
|
179
245
|
- Claude Code
|
|
@@ -200,18 +266,66 @@ O `skill_master` pode aprender com as skills ja existentes em cada maquina insta
|
|
|
200
266
|
Ferramentas MCP principais:
|
|
201
267
|
|
|
202
268
|
- `skill_master_refresh_catalog`
|
|
269
|
+
- `skill_master_prompt_router`
|
|
270
|
+
- `skill_master_activation_check`
|
|
271
|
+
- `skill_master_recommend`
|
|
272
|
+
- `skill_master_moral_discernment`
|
|
273
|
+
- `skill_master_domain_router`
|
|
274
|
+
- `skill_master_bootstrap_global`
|
|
275
|
+
- `skill_master_install_global_skills`
|
|
203
276
|
- `skill_master_prepare_skill_contribution`
|
|
204
277
|
- `skill_master_review_skill_contribution`
|
|
278
|
+
- `skill_master_prepare_success_skill`
|
|
279
|
+
- `skill_master_review_success_skill`
|
|
280
|
+
- `skill_master_list_unapproved_success_skills`
|
|
281
|
+
- `skill_master_prepare_success_skill_approval_package`
|
|
282
|
+
- `skill_master_activate_success_skill`
|
|
205
283
|
|
|
206
284
|
O pacote de contribuicao nao envia arquivos automaticamente, nao executa skills desconhecidas e nao inclui caminhos completos ou corpo bruto por padrao.
|
|
207
285
|
|
|
286
|
+
O fluxo de aprendizado por implementacoes bem-sucedidas cria rascunhos locais em staging, gera pacote de aprovacao humana e permite ativacao explicita em escopo local ou global. Ele exige evidencias, revisa risco/duplicidade e mantem candidatos externos como nao aprovados ate revisao humana. Nenhuma skill aprendida e publicada automaticamente.
|
|
287
|
+
|
|
208
288
|
Leia:
|
|
209
289
|
|
|
210
290
|
- [Rede segura de skills](docs/architecture/REDE_SEGURA_DE_SKILLS.md)
|
|
291
|
+
- [Aprendizado de implementacoes bem-sucedidas](docs/architecture/APRENDIZADO_DE_IMPLEMENTACOES_BEM_SUCEDIDAS.md)
|
|
211
292
|
|
|
212
293
|
## Modos de ativacao em prompts
|
|
213
294
|
|
|
214
|
-
|
|
295
|
+
Clientes e agentes podem usar `skill_master_prompt_router` como camada principal antes de decidir se devem acionar recomendacoes de skills, aplicar persona ou bloquear uma acao sensivel.
|
|
296
|
+
|
|
297
|
+
Modos suportados:
|
|
298
|
+
|
|
299
|
+
- `manual`: ativa apenas com mencao direta ao Skill Master ou gate bloqueante.
|
|
300
|
+
- `balanced`: modo recomendado; ativa por mencao direta, tarefa tecnica com skill relevante, Notion, aprendizado, validacao, MCP ou publicacao.
|
|
301
|
+
- `always-on-assisted`: avalia quase todo prompt, mas retorna `executionMode: no-op` quando nao houver ganho claro.
|
|
302
|
+
|
|
303
|
+
Exemplo de chamada conceitual:
|
|
304
|
+
|
|
305
|
+
```json
|
|
306
|
+
{
|
|
307
|
+
"prompt": "skill-master, veja se existe uma skill para validar este deploy",
|
|
308
|
+
"activationMode": "balanced",
|
|
309
|
+
"riskTolerance": "normal"
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
Saida esperada:
|
|
314
|
+
|
|
315
|
+
```json
|
|
316
|
+
{
|
|
317
|
+
"shouldActivate": true,
|
|
318
|
+
"personaOverlay": "Dev Senior Master",
|
|
319
|
+
"executionMode": "assist",
|
|
320
|
+
"safetyGates": [],
|
|
321
|
+
"learningOpportunity": false,
|
|
322
|
+
"notionUpdateNeeded": false
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
Use `skill_master_activation_check` quando precisar apenas de uma decisao menor e retrocompativel de ativacao/recomendacao.
|
|
327
|
+
|
|
328
|
+
Restricoes explicitas como `sem publicar`, `nao publicar` ou `nao publique` sao tratadas como execucao local. O router deve registrar `publication_explicitly_disabled` e nao pode transformar essa frase em autorizacao ou intencao de release.
|
|
215
329
|
|
|
216
330
|
Ativacao explicita:
|
|
217
331
|
|
|
@@ -241,6 +355,11 @@ Cliente: chama skill_master_activation_check.
|
|
|
241
355
|
Cliente: se ativar, chama skill_master_recommend ou segue as recomendacoes retornadas.
|
|
242
356
|
```
|
|
243
357
|
|
|
358
|
+
Diagnostico importante:
|
|
359
|
+
|
|
360
|
+
- `skill_master_list_sources` mostra `configPath`, `workspace` e se `workspaceRoots` esta configurado.
|
|
361
|
+
- Se `workspaceRoots` estiver vazio, skills em `.codex/skills` do projeto nao serao catalogadas ate atualizar `sources.json` e reiniciar o processo MCP.
|
|
362
|
+
|
|
244
363
|
## Atualizacao automatica via npm
|
|
245
364
|
|
|
246
365
|
Para instalacoes feitas por `npm install -g`, o caminho seguro de auto-update e executar `skill-master-update` fora do processo MCP.
|
package/VERSION.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Versão
|
|
2
2
|
|
|
3
|
-
Versão funcional planejada: `00.
|
|
3
|
+
Versão funcional planejada: `00.03`
|
|
4
4
|
|
|
5
|
-
Versão técnica para empacotamento semântico: `0.0.
|
|
5
|
+
Versão técnica para empacotamento semântico: `0.0.9`
|
|
6
6
|
|
|
7
7
|
## Observação
|
|
8
8
|
|
|
9
|
-
O nome `00.
|
|
9
|
+
O nome `00.03` será usado na comunicação e nos documentos. Para ferramentas que exigem SemVer, como npm e alguns fluxos de release, usar `0.0.9`.
|
package/bin/lib/menu-core.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
3
4
|
import { join } from 'node:path';
|
|
4
5
|
import process from 'node:process';
|
|
5
6
|
|
|
@@ -13,10 +14,91 @@ const ANSI = {
|
|
|
13
14
|
red: '\x1b[31m',
|
|
14
15
|
};
|
|
15
16
|
|
|
17
|
+
const REQUIRED_GLOBAL_SKILLS = [
|
|
18
|
+
'catholic-moral-discernment',
|
|
19
|
+
'ai-ethics-human-dignity',
|
|
20
|
+
'professional-boundary-triage',
|
|
21
|
+
'broad-domain-router',
|
|
22
|
+
'language-quality-pt-en-fr',
|
|
23
|
+
'math-science-reasoning',
|
|
24
|
+
'philosophy-sociology-discernment',
|
|
25
|
+
'engineering-systems-master',
|
|
26
|
+
'source-authority-reviewer',
|
|
27
|
+
'release-ethics-gate',
|
|
28
|
+
];
|
|
29
|
+
|
|
16
30
|
function colorize(text, color, enabled) {
|
|
17
31
|
return enabled ? `${color}${text}${ANSI.reset}` : text;
|
|
18
32
|
}
|
|
19
33
|
|
|
34
|
+
function globalSkillsRoot() {
|
|
35
|
+
return join(process.env.CODEX_HOME ?? join(os.homedir(), '.codex'), 'skills');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function readClientConfigState(filePath) {
|
|
39
|
+
if (!existsSync(filePath)) {
|
|
40
|
+
return { present: false, kind: 'missing', globalCommand: false };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const content = readFileSync(filePath, 'utf8');
|
|
44
|
+
const hasSkillMaster = content.includes('skill_master');
|
|
45
|
+
const hasGlobalCommand = content.includes('command = "skill-master-mcp"') || content.includes("command = 'skill-master-mcp'");
|
|
46
|
+
const hasLauncher = content.includes('skill-master-launcher');
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
present: true,
|
|
50
|
+
kind: hasGlobalCommand ? 'global' : hasLauncher ? 'launcher' : hasSkillMaster ? 'custom' : 'unknown',
|
|
51
|
+
globalCommand: hasGlobalCommand,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function readJsonState(filePath) {
|
|
56
|
+
if (!existsSync(filePath)) {
|
|
57
|
+
return { present: false, globalCommand: false };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
const parsed = JSON.parse(readFileSync(filePath, 'utf8'));
|
|
62
|
+
const server = parsed?.mcpServers?.skill_master;
|
|
63
|
+
return {
|
|
64
|
+
present: true,
|
|
65
|
+
globalCommand: server?.command === 'skill-master-mcp',
|
|
66
|
+
};
|
|
67
|
+
} catch {
|
|
68
|
+
return { present: true, globalCommand: false };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function inspectGlobalReadiness() {
|
|
73
|
+
const root = globalSkillsRoot();
|
|
74
|
+
const installed = REQUIRED_GLOBAL_SKILLS.filter((name) => existsSync(join(root, name, 'SKILL.md')));
|
|
75
|
+
const missing = REQUIRED_GLOBAL_SKILLS.filter((name) => !installed.includes(name));
|
|
76
|
+
const codexConfigPath = join(process.env.CODEX_HOME ?? join(os.homedir(), '.codex'), 'config.toml');
|
|
77
|
+
const claudeConfigPath = join(os.homedir(), '.config', 'Claude', 'claude_desktop_config.json');
|
|
78
|
+
const geminiConfigPath = join(os.homedir(), '.gemini', 'settings.json');
|
|
79
|
+
const codex = readClientConfigState(codexConfigPath);
|
|
80
|
+
const claude = readJsonState(claudeConfigPath);
|
|
81
|
+
const gemini = readJsonState(geminiConfigPath);
|
|
82
|
+
const ready = missing.length === 0 && codex.globalCommand && claude.globalCommand && gemini.globalCommand;
|
|
83
|
+
const mode = ready
|
|
84
|
+
? 'ready'
|
|
85
|
+
: codex.kind === 'launcher' || claude.present || gemini.present
|
|
86
|
+
? 'partial'
|
|
87
|
+
: 'missing';
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
root,
|
|
91
|
+
required: REQUIRED_GLOBAL_SKILLS.length,
|
|
92
|
+
installed,
|
|
93
|
+
missing,
|
|
94
|
+
ready,
|
|
95
|
+
mode,
|
|
96
|
+
codex,
|
|
97
|
+
claude,
|
|
98
|
+
gemini,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
20
102
|
export function readJson(rootDir, relativePath) {
|
|
21
103
|
const target = join(rootDir, relativePath);
|
|
22
104
|
if (!existsSync(target)) {
|
|
@@ -39,6 +121,10 @@ export function getMenuStatus(rootDir) {
|
|
|
39
121
|
const packageJson = readJson(rootDir, 'package.json');
|
|
40
122
|
const stableManifest = readJson(rootDir, 'manifests/channels/stable.json');
|
|
41
123
|
const versionText = readText(rootDir, 'VERSION.md');
|
|
124
|
+
const successLearningDir = process.env.SKILL_MASTER_SUCCESS_LEARNING_DIR
|
|
125
|
+
?? join(process.env.SKILL_MASTER_HOME ?? join(process.env.HOME ?? process.env.USERPROFILE ?? '', '.skill-master'), 'data', 'success-learning');
|
|
126
|
+
const studyCandidates = readJson(rootDir, 'network/unapproved-skill-candidates.json');
|
|
127
|
+
const globalReadiness = inspectGlobalReadiness();
|
|
42
128
|
|
|
43
129
|
return {
|
|
44
130
|
packageName: packageJson?.name ?? 'nao encontrado',
|
|
@@ -47,9 +133,30 @@ export function getMenuStatus(rootDir) {
|
|
|
47
133
|
manifestSemver: stableManifest?.semver ?? 'nao encontrado',
|
|
48
134
|
versionText,
|
|
49
135
|
rootDir,
|
|
136
|
+
pendingSuccessDrafts: countManifestFiles(successLearningDir),
|
|
137
|
+
studyCandidates: Array.isArray(studyCandidates?.candidates) ? studyCandidates.candidates.length : 0,
|
|
138
|
+
globalReadiness,
|
|
50
139
|
};
|
|
51
140
|
}
|
|
52
141
|
|
|
142
|
+
function countManifestFiles(directory) {
|
|
143
|
+
if (!directory || !existsSync(directory)) {
|
|
144
|
+
return 0;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
let count = 0;
|
|
148
|
+
const visit = (current) => {
|
|
149
|
+
for (const entry of readdirSync(current, { withFileTypes: true })) {
|
|
150
|
+
const fullPath = join(current, entry.name);
|
|
151
|
+
if (entry.isDirectory()) visit(fullPath);
|
|
152
|
+
else if (entry.isFile() && entry.name === 'manifest.json') count += 1;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
visit(directory);
|
|
157
|
+
return count;
|
|
158
|
+
}
|
|
159
|
+
|
|
53
160
|
export function buildMenuCommands({ rootDir, currentFile, nodeExecPath = process.execPath }) {
|
|
54
161
|
return [
|
|
55
162
|
{
|
|
@@ -107,6 +214,133 @@ export function buildMenuCommands({ rootDir, currentFile, nodeExecPath = process
|
|
|
107
214
|
args: ['scripts/configure-private-registry.mjs', '--validate'],
|
|
108
215
|
confirmMessage: 'Rodar a configuracao de registry privado agora?',
|
|
109
216
|
},
|
|
217
|
+
{
|
|
218
|
+
key: 'activationStatus',
|
|
219
|
+
aliases: ['activation-status', 'modo', 'modo-ativacao'],
|
|
220
|
+
label: 'Modo de ativacao atual',
|
|
221
|
+
description: 'Mostra o modo manual, balanced ou always-on-assisted configurado localmente.',
|
|
222
|
+
command: nodeExecPath,
|
|
223
|
+
args: [join(rootDir, 'bin', 'skill-master-activation.mjs'), '--status'],
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
key: 'activationBalanced',
|
|
227
|
+
aliases: ['set-balanced', 'balanced'],
|
|
228
|
+
label: 'Usar modo balanced',
|
|
229
|
+
description: 'Define balanced como modo padrao de ativacao do Skill Master.',
|
|
230
|
+
command: nodeExecPath,
|
|
231
|
+
args: [join(rootDir, 'bin', 'skill-master-activation.mjs'), '--set-mode', 'balanced'],
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
key: 'activationAlwaysOn',
|
|
235
|
+
aliases: ['set-always-on', 'always-on-assisted'],
|
|
236
|
+
label: 'Usar modo always-on-assisted',
|
|
237
|
+
description: 'Define avaliacao assistida quase sempre ativa, mantendo no-op quando nao houver ganho.',
|
|
238
|
+
command: nodeExecPath,
|
|
239
|
+
args: [join(rootDir, 'bin', 'skill-master-activation.mjs'), '--set-mode', 'always-on-assisted'],
|
|
240
|
+
confirmMessage: 'Alterar o modo local para always-on-assisted?',
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
key: 'installGlobalSkills',
|
|
244
|
+
aliases: ['install-global-skills', 'skills-globais', 'global-skills'],
|
|
245
|
+
label: 'Instalar skills globais do Skill Master',
|
|
246
|
+
description: 'Copia as skills amplas e morais embutidas para CODEX_HOME/skills ou ~/.codex/skills.',
|
|
247
|
+
command: nodeExecPath,
|
|
248
|
+
args: [join(rootDir, 'bin', 'skill-master-install-global-skills.mjs')],
|
|
249
|
+
confirmMessage: 'Instalar as skills globais embutidas neste usuario?',
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
key: 'bootstrapGlobal',
|
|
253
|
+
aliases: ['bootstrap-global', 'global-bootstrap', 'ativar-global-completo'],
|
|
254
|
+
label: 'Ativar MCP global neste computador',
|
|
255
|
+
description: 'Instala as skills globais e registra Codex, Claude e Gemini no mesmo passo.',
|
|
256
|
+
command: nodeExecPath,
|
|
257
|
+
args: [join(rootDir, 'bin', 'skill-master-bootstrap-global.mjs')],
|
|
258
|
+
confirmMessage: 'Executar o bootstrap global do Skill Master neste computador?',
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
key: 'registerClients',
|
|
262
|
+
aliases: ['register-clients', 'registrar-clientes', 'codex-claude-gemini'],
|
|
263
|
+
label: 'Registrar Codex, Claude e Gemini',
|
|
264
|
+
description: 'Gera/aplica configuracoes MCP para reconhecer skill_master nos clientes principais.',
|
|
265
|
+
command: nodeExecPath,
|
|
266
|
+
args: [join(rootDir, 'bin', 'skill-master-register-clients.mjs'), '--apply-all'],
|
|
267
|
+
confirmMessage: 'Aplicar registro do skill_master em Codex, Claude e Gemini?',
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
key: 'promptRecommendation',
|
|
271
|
+
aliases: ['recommend-prompt', 'recomendar-prompt', 'prompt-router'],
|
|
272
|
+
label: 'Ver recomendacao para um prompt',
|
|
273
|
+
description: 'Abre um fluxo interativo para avaliar um prompt pelo router local.',
|
|
274
|
+
command: nodeExecPath,
|
|
275
|
+
args: [join(rootDir, 'bin', 'skill-master-activation.mjs'), '--route-prompt-interactive'],
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
key: 'successNotifications',
|
|
279
|
+
aliases: ['notifications', 'notificacoes', 'success-notifications'],
|
|
280
|
+
label: 'Notificacoes de skills aprendidas',
|
|
281
|
+
description: 'Mostra drafts pendentes, aprovacoes e skills externas para estudar.',
|
|
282
|
+
command: nodeExecPath,
|
|
283
|
+
args: [join(rootDir, 'bin', 'skill-master-success-skills.mjs'), '--notify'],
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
key: 'studySkills',
|
|
287
|
+
aliases: ['study-skills', 'skills-estudo', 'estudar'],
|
|
288
|
+
label: 'Skills para estudar',
|
|
289
|
+
description: 'Lista skills externas e links de criadores ainda nao aprovados.',
|
|
290
|
+
command: nodeExecPath,
|
|
291
|
+
args: [join(rootDir, 'bin', 'skill-master-success-skills.mjs'), '--study'],
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
key: 'approvalPackage',
|
|
295
|
+
aliases: ['approval-package', 'aprovar', 'pacote-aprovacao'],
|
|
296
|
+
label: 'Gerar pacote de aprovacao humana',
|
|
297
|
+
description: 'Cria um relatorio local para revisar e aprovar skills aprendidas.',
|
|
298
|
+
command: nodeExecPath,
|
|
299
|
+
args: [join(rootDir, 'bin', 'skill-master-success-skills.mjs'), '--approval-package'],
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
key: 'markLearnedStudy',
|
|
303
|
+
aliases: ['mark-study', 'manter-estudo'],
|
|
304
|
+
label: 'Manter skill candidata para estudo',
|
|
305
|
+
description: 'Seleciona uma candidata e registra decisao de manter para estudo.',
|
|
306
|
+
command: nodeExecPath,
|
|
307
|
+
args: [join(rootDir, 'bin', 'skill-master-success-skills.mjs'), '--mark-study-interactive'],
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
key: 'rejectLearnedSkill',
|
|
311
|
+
aliases: ['reject-skill', 'rejeitar-skill'],
|
|
312
|
+
label: 'Rejeitar skill candidata',
|
|
313
|
+
description: 'Seleciona uma candidata, registra rejeicao e preserva historico.',
|
|
314
|
+
command: nodeExecPath,
|
|
315
|
+
args: [join(rootDir, 'bin', 'skill-master-success-skills.mjs'), '--reject-interactive'],
|
|
316
|
+
confirmMessage: 'Abrir fluxo para rejeitar uma skill candidata?',
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
key: 'activateLearnedLocal',
|
|
320
|
+
aliases: ['activate-learned-local', 'ativar-local', 'skill-local'],
|
|
321
|
+
label: 'Ativar skill aprendida no workspace',
|
|
322
|
+
description: 'Instala uma skill aprendida em .codex/skills do projeto atual.',
|
|
323
|
+
command: nodeExecPath,
|
|
324
|
+
args: [join(rootDir, 'bin', 'skill-master-success-skills.mjs'), '--activate-interactive', '--target', 'local'],
|
|
325
|
+
confirmMessage: 'Selecionar e ativar uma skill aprendida no workspace atual?',
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
key: 'activateLearnedGlobal',
|
|
329
|
+
aliases: ['activate-learned-global', 'ativar-global', 'skill-global'],
|
|
330
|
+
label: 'Ativar skill aprendida global',
|
|
331
|
+
description: 'Instala uma skill aprendida em CODEX_HOME/skills ou ~/.codex/skills.',
|
|
332
|
+
command: nodeExecPath,
|
|
333
|
+
args: [join(rootDir, 'bin', 'skill-master-success-skills.mjs'), '--activate-interactive', '--target', 'global'],
|
|
334
|
+
confirmMessage: 'Selecionar e ativar uma skill aprendida como skill global deste usuario?',
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
key: 'notionSummary',
|
|
338
|
+
aliases: ['notion-summary', 'resumo-notion'],
|
|
339
|
+
label: 'Abrir resumo para Notion',
|
|
340
|
+
description: 'Mostra um resumo copiavel do estado de ativacao para registrar no ledger Notion.',
|
|
341
|
+
command: nodeExecPath,
|
|
342
|
+
args: [join(rootDir, 'bin', 'skill-master-activation.mjs'), '--notion-summary'],
|
|
343
|
+
},
|
|
110
344
|
];
|
|
111
345
|
}
|
|
112
346
|
|
|
@@ -138,6 +372,7 @@ export function isInteractiveTerminal() {
|
|
|
138
372
|
}
|
|
139
373
|
|
|
140
374
|
export function formatStatusReport(status) {
|
|
375
|
+
const readiness = status.globalReadiness;
|
|
141
376
|
const lines = [
|
|
142
377
|
'Skill Master MCP - status local',
|
|
143
378
|
`Diretorio: ${status.rootDir}`,
|
|
@@ -145,6 +380,13 @@ export function formatStatusReport(status) {
|
|
|
145
380
|
`Semver local: ${status.semver}`,
|
|
146
381
|
`Manifesto stable: ${status.manifestVersion}`,
|
|
147
382
|
`Manifesto semver: ${status.manifestSemver}`,
|
|
383
|
+
`Drafts de skills aprendidas: ${status.pendingSuccessDrafts}`,
|
|
384
|
+
`Skills externas para estudar: ${status.studyCandidates}`,
|
|
385
|
+
`Global readiness: ${readiness.ready ? 'pronto' : readiness.mode}`,
|
|
386
|
+
`Global skills instaladas: ${readiness.installed.length}/${readiness.required}`,
|
|
387
|
+
`Codex global: ${readiness.codex.globalCommand ? 'sim' : readiness.codex.kind}`,
|
|
388
|
+
`Claude global: ${readiness.claude.globalCommand ? 'sim' : readiness.claude.present ? 'nao-global' : 'ausente'}`,
|
|
389
|
+
`Gemini global: ${readiness.gemini.globalCommand ? 'sim' : readiness.gemini.present ? 'nao-global' : 'ausente'}`,
|
|
148
390
|
];
|
|
149
391
|
|
|
150
392
|
if (status.versionText) {
|
|
@@ -155,6 +397,41 @@ export function formatStatusReport(status) {
|
|
|
155
397
|
return lines.join('\n');
|
|
156
398
|
}
|
|
157
399
|
|
|
400
|
+
function formatGlobalAlert(status, { useColor = false } = {}) {
|
|
401
|
+
const readiness = status.globalReadiness;
|
|
402
|
+
if (readiness.ready) {
|
|
403
|
+
return renderPanelLines(
|
|
404
|
+
[
|
|
405
|
+
colorize('GLOBAL READY', ANSI.bold, useColor),
|
|
406
|
+
'O MCP esta reconhecido como comando global neste computador.',
|
|
407
|
+
'Codex, Claude e Gemini podem ser apontados para skill-master-mcp.',
|
|
408
|
+
'A instalacao global e as skills embutidas ja estao prontas para uso.',
|
|
409
|
+
],
|
|
410
|
+
{ color: ANSI.green, useColor },
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
return [
|
|
415
|
+
renderPanelLines(
|
|
416
|
+
[
|
|
417
|
+
colorize('ALERTA GLOBAL', ANSI.bold, useColor),
|
|
418
|
+
'Este computador ainda nao esta pronto para uso global do Skill Master.',
|
|
419
|
+
'Execute agora: skill-master-menu --run bootstrap-global --yes',
|
|
420
|
+
'Isso instala as skills globais e registra Codex, Claude e Gemini.',
|
|
421
|
+
],
|
|
422
|
+
{ color: ANSI.red, useColor },
|
|
423
|
+
),
|
|
424
|
+
renderPanelLines(
|
|
425
|
+
[
|
|
426
|
+
colorize('AVISO SUTIL', ANSI.dim, useColor),
|
|
427
|
+
'Sem instalacao global, o MCP continua util localmente, mas nao fica integrado como parte do sistema em todos os clientes.',
|
|
428
|
+
`Skills globais detectadas: ${readiness.installed.length}/${readiness.required}`,
|
|
429
|
+
],
|
|
430
|
+
{ color: ANSI.yellow, useColor },
|
|
431
|
+
),
|
|
432
|
+
].join('\n\n');
|
|
433
|
+
}
|
|
434
|
+
|
|
158
435
|
function renderPanelLines(lines, { color = ANSI.cyan, useColor = false } = {}) {
|
|
159
436
|
const width = Math.max(...lines.map((line) => line.length), 24);
|
|
160
437
|
const border = `+${'-'.repeat(width + 2)}+`;
|
|
@@ -168,9 +445,14 @@ export function formatMenuBanner(status, { useColor = false } = {}) {
|
|
|
168
445
|
colorize('Skill Master MCP', ANSI.bold, useColor),
|
|
169
446
|
'Menu operacional para manutencao local',
|
|
170
447
|
`Versao local ${status.semver} | canal ${status.manifestVersion}`,
|
|
448
|
+
`Pendencias: ${status.pendingSuccessDrafts} drafts | estudo: ${status.studyCandidates} links`,
|
|
449
|
+
`Global: ${status.globalReadiness.ready ? 'pronto' : 'requer instalacao global'}`,
|
|
171
450
|
colorize('Setas + Enter para navegar', ANSI.dim, useColor),
|
|
172
451
|
];
|
|
173
|
-
return
|
|
452
|
+
return [
|
|
453
|
+
renderPanelLines(lines, { color: ANSI.cyan, useColor }),
|
|
454
|
+
formatGlobalAlert(status, { useColor }),
|
|
455
|
+
].join('\n\n');
|
|
174
456
|
}
|
|
175
457
|
|
|
176
458
|
export function formatActionHeader(action, { useColor = false } = {}) {
|