@fprad0/skill-master-mcp 0.0.12 → 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/CHANGELOG.md +96 -90
- package/README.md +472 -472
- package/VERSION.md +9 -9
- package/bin/lib/bootstrap-global-core.mjs +34 -0
- package/bin/lib/client-config.mjs +293 -293
- package/bin/lib/doctor-core.mjs +202 -0
- package/bin/lib/menu-core.mjs +1629 -1522
- package/bin/lib/operation-result.mjs +59 -0
- package/bin/lib/register-clients-core.mjs +247 -0
- package/bin/lib/skill-installation.mjs +215 -215
- package/bin/lib/update-cli-core.mjs +117 -0
- package/bin/skill-master-activation.mjs +163 -163
- package/bin/skill-master-bootstrap-global.mjs +61 -49
- package/bin/skill-master-configure-private-registry.mjs +3 -3
- package/bin/skill-master-doctor.mjs +239 -228
- package/bin/skill-master-eval-activation.mjs +32 -32
- package/bin/skill-master-install-global-skills.mjs +59 -59
- package/bin/skill-master-install-project-skills.mjs +97 -97
- package/bin/skill-master-menu.mjs +406 -405
- package/bin/skill-master-register-clients.mjs +232 -153
- package/bin/skill-master-success-skills.mjs +307 -307
- package/bin/skill-master-update.mjs +121 -72
- package/bin/skill-master.mjs +3 -3
- package/dist/activation.d.ts.map +1 -1
- package/dist/activation.js +12 -0
- package/dist/activation.js.map +1 -1
- package/dist/prompt-router.d.ts.map +1 -1
- package/dist/prompt-router.js +19 -0
- package/dist/prompt-router.js.map +1 -1
- package/dist/recommender.d.ts.map +1 -1
- package/dist/recommender.js +4 -1
- package/dist/recommender.js.map +1 -1
- package/docs/architecture/APRENDIZADO_DE_IMPLEMENTACOES_BEM_SUCEDIDAS.md +125 -125
- package/docs/architecture/ARQUITETURA_AUTO_UPDATE.md +9 -9
- package/docs/architecture/PLANO_MASTER_ACIONAMENTO_AUTOMATICO_E_APRENDIZADO.md +341 -341
- package/docs/architecture/REDE_SEGURA_DE_SKILLS.md +148 -148
- package/docs/operations/GUIA_MULTI_COMPUTADOR.md +262 -262
- package/docs/operations/GUIA_NPM_PRIVADO.md +294 -294
- package/docs/operations/GUIA_NPM_PUBLICO.md +147 -147
- package/docs/operations/MENU_VISUAL_EVIDENCE_2026-06-28.md +66 -66
- package/docs/operations/assets/menu-frame-compact.html +75 -75
- package/docs/operations/assets/menu-frame-large.html +83 -83
- package/docs/operations/assets/menu-frame-running.html +79 -79
- package/docs/operations/cross-platform-auth-transfer/ANALISE_COMPATIBILIDADE_MCP_2026-06-28.md +140 -140
- package/docs/operations/cross-platform-auth-transfer/README_TRANSFERENCIA.md +85 -85
- package/docs/operations/reborn-menu-cyberpunk-transfer/ANALISE_MENU_REBORN_CYBERPUNK_2026-06-28.md +174 -174
- package/docs/operations/reborn-menu-cyberpunk-transfer/HANDOFF_IMPLEMENTACAO_REBORN_CYBERPUNK_2026-06-28.md +119 -119
- package/docs/operations/reborn-menu-cyberpunk-transfer/ORDEM_DE_EXECUCAO_MENU_REBORN_CYBERPUNK.md +134 -134
- package/docs/operations/reborn-menu-cyberpunk-transfer/README_TRANSFERENCIA.md +84 -84
- package/docs/operations/reborn-menu-cyberpunk-transfer/README_TRANSFERENCIA_REBORN_PACKAGE.md +56 -56
- package/docs/operations/token-economy-transfer/ANALISE_AVANCADA_ECONOMIA_TOKENS_2026-06-30.md +141 -0
- package/docs/operations/token-economy-transfer/PLANO_DEV_SENIOR_MASTER_TOKEN_ECONOMY_2026-06-30.md +171 -0
- package/docs/operations/token-economy-transfer/README_TRANSFERENCIA_TOKEN_ECONOMY.md +31 -0
- package/docs/planning/MENU_RUNTIME_CORRECTION_PLAN_2026-06-30.md +551 -0
- package/docs/planning/V0_0_9_APROVACAO_CRITICA_MENSAGENS_DE_VENDA.md +85 -85
- package/docs/planning/V0_0_9_FONTES_E_CRITERIOS_DE_AUTORIDADE.md +139 -139
- package/docs/planning/V0_0_9_MATRIZ_SKILLS_MULTIDISCIPLINARES.md +105 -105
- package/docs/planning/V0_0_9_POLITICA_MORAL_CATOLICA_PARA_IA.md +181 -181
- package/docs/planning/V0_0_9_PROMPTS_EXECUCAO.md +59 -59
- package/docs/planning/V0_0_9_ROADMAP_DISCERNIMENTO_E_CONHECIMENTO_AMPLO.md +181 -181
- package/docs/prompt-tasks/PROMPT_TASK_001_BOOTSTRAP_SKILL_MASTER_MCP.md +6 -6
- package/docs/prompt-tasks/PROMPT_TASK_002_AUTO_UPDATE_LAUNCHER.md +6 -6
- package/docs/prompt-tasks/PROMPT_TASK_003_REMOTE_MANIFEST_AND_RELEASES.md +6 -6
- package/docs/prompt-tasks/PROMPT_TASK_004_MULTI_USER_DISTRIBUTION.md +6 -6
- package/docs/prompt-tasks/PROMPT_TASK_005_SECURITY_AND_QUALITY_GATE.md +6 -6
- package/docs/prompt-tasks/PROMPT_TASK_006_MASTER_ACIONAMENTO_APRENDIZADO.md +83 -83
- package/docs/prompt-tasks/PROMPT_TASK_007_PERSONA_ORQUESTRADORA.md +88 -88
- package/docs/prompt-tasks/PROMPT_TASK_008_PROMPT_ROUTER_MODOS_ATIVACAO.md +156 -156
- package/docs/prompt-tasks/PROMPT_TASK_009_PIPELINE_APRENDIZADO_SUCESSO.md +105 -105
- package/docs/prompt-tasks/PROMPT_TASK_010_EVALS_GOVERNANCA_ATIVACAO.md +119 -119
- package/docs/prompt-tasks/PROMPT_TASK_011_MENU_NOTIFICACOES_NOTION.md +120 -120
- package/docs/prompt-tasks/PROMPT_TASK_012_MENU_CYBERPUNK_PIXEL_FRAME.md +123 -123
- package/docs/prompt-tasks/PROMPT_TASK_013_MENU_FLUID_DNA_ANIMATION.md +114 -114
- package/docs/prompt-tasks/PROMPT_TASK_014_MENU_FUNCTIONAL_PARITY_QA.md +157 -157
- package/docs/prompt-tasks/PROMPT_TASK_015_TRANSFER_RELEASE_HANDOFF.md +127 -127
- package/docs/prompt-tasks/PROMPT_TASK_016_CROSS_PLATFORM_MCP_AUTH_REGISTRATION.md +107 -107
- package/docs/prompt-tasks/PROMPT_TASK_018_NPM_PUBLISH_2FA_SETUP.md +80 -80
- package/docs/prompt-tasks/PROMPT_TASK_019_TOKEN_ECONOMY_GLOBAL_SKILLS.md +56 -0
- package/docs/prompt-tasks/PROMPT_TASK_MASTER_EXECUTOR.md +6 -6
- package/docs/skill-candidates/v0.0.10/cli-creator/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/cli-creator/SKILL.md +160 -160
- package/docs/skill-candidates/v0.0.10/cli-creator/agents/openai.yaml +4 -4
- package/docs/skill-candidates/v0.0.10/cli-creator/references/agent-cli-patterns.md +154 -154
- package/docs/skill-candidates/v0.0.10/developer-workstation-ops/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.10/figma/LICENSE.txt +1 -1
- package/docs/skill-candidates/v0.0.10/figma/SKILL.md +42 -42
- package/docs/skill-candidates/v0.0.10/figma/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma/references/figma-mcp-config.md +35 -35
- package/docs/skill-candidates/v0.0.10/figma/references/figma-tools-and-prompts.md +34 -34
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/SKILL.md +349 -349
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/references/mapping-checklist.md +7 -7
- package/docs/skill-candidates/v0.0.10/figma-code-connect-components/scripts/normalize_node_id.py +25 -25
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/SKILL.md +537 -537
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/references/rule-template.md +15 -15
- package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/scripts/check_agents_md.sh +9 -9
- package/docs/skill-candidates/v0.0.10/figma-generate-design/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-generate-design/SKILL.md +341 -341
- package/docs/skill-candidates/v0.0.10/figma-generate-design/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-generate-design/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-generate-design/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-generate-design/maintainers.yml +1 -1
- package/docs/skill-candidates/v0.0.10/figma-generate-library/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-generate-library/SKILL.md +314 -314
- package/docs/skill-candidates/v0.0.10/figma-generate-library/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-generate-library/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-generate-library/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-generate-library/maintainers.yml +3 -3
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/code-connect-setup.md +260 -260
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/component-creation.md +1014 -1014
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/discovery-phase.md +518 -518
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/documentation-creation.md +834 -834
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/error-recovery.md +540 -540
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/naming-conventions.md +527 -527
- package/docs/skill-candidates/v0.0.10/figma-generate-library/references/token-creation.md +962 -962
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/bindVariablesToComponent.js +110 -110
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/cleanupOrphans.js +127 -127
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createComponentWithVariants.js +148 -148
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createDocumentationPage.js +139 -139
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createSemanticTokens.js +108 -108
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createVariableCollection.js +49 -49
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/inspectFileStructure.js +121 -121
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/rehydrateState.js +92 -92
- package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/validateCreation.js +83 -83
- package/docs/skill-candidates/v0.0.10/figma-implement-design/LICENSE.txt +1 -1
- package/docs/skill-candidates/v0.0.10/figma-implement-design/SKILL.md +258 -258
- package/docs/skill-candidates/v0.0.10/figma-implement-design/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-implement-design/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-implement-design/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-use/LICENSE.TXT +1 -1
- package/docs/skill-candidates/v0.0.10/figma-use/SKILL.md +233 -233
- package/docs/skill-candidates/v0.0.10/figma-use/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/figma-use/assets/figma-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/figma-use/assets/icon.svg +28 -28
- package/docs/skill-candidates/v0.0.10/figma-use/maintainers.yml +1 -1
- package/docs/skill-candidates/v0.0.10/figma-use/references/api-reference.md +301 -301
- package/docs/skill-candidates/v0.0.10/figma-use/references/common-patterns.md +512 -512
- package/docs/skill-candidates/v0.0.10/figma-use/references/component-patterns.md +488 -488
- package/docs/skill-candidates/v0.0.10/figma-use/references/effect-style-patterns.md +123 -123
- package/docs/skill-candidates/v0.0.10/figma-use/references/gotchas.md +599 -599
- package/docs/skill-candidates/v0.0.10/figma-use/references/maintainers.yml +12 -12
- package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-patterns.md +513 -513
- package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-standalone.d.ts +11293 -11293
- package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-standalone.index.md +441 -441
- package/docs/skill-candidates/v0.0.10/figma-use/references/text-style-patterns.md +203 -203
- package/docs/skill-candidates/v0.0.10/figma-use/references/validation-and-recovery.md +109 -109
- package/docs/skill-candidates/v0.0.10/figma-use/references/variable-patterns.md +354 -354
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/maintainers.yml +9 -9
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components--creating.md +17 -17
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components--using.md +17 -17
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components.md +50 -50
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-effect-styles.md +52 -52
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-text-styles.md +90 -90
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables--creating.md +13 -13
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables--using.md +13 -13
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables.md +64 -64
- package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds.md +41 -41
- package/docs/skill-candidates/v0.0.10/frontend-design/LICENSE.txt +177 -177
- package/docs/skill-candidates/v0.0.10/frontend-design/SKILL.md +55 -55
- package/docs/skill-candidates/v0.0.10/frontend-ui-ux-systems/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.10/github/SKILL.md +74 -74
- package/docs/skill-candidates/v0.0.10/github/agents/openai.yaml +6 -6
- package/docs/skill-candidates/v0.0.10/github/assets/github-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/image-graphic-design-rendering/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.10/language-quality-pt-en-fr-it-ru/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.10/math-physics-reasoning/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.10/mcp-builder/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/mcp-builder/SKILL.md +236 -236
- package/docs/skill-candidates/v0.0.10/mcp-builder/reference/evaluation.md +601 -601
- package/docs/skill-candidates/v0.0.10/mcp-builder/reference/mcp_best_practices.md +249 -249
- package/docs/skill-candidates/v0.0.10/mcp-builder/reference/node_mcp_server.md +969 -969
- package/docs/skill-candidates/v0.0.10/mcp-builder/reference/python_mcp_server.md +718 -718
- package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/connections.py +151 -151
- package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/evaluation.py +373 -373
- package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/example_evaluation.xml +22 -22
- package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/requirements.txt +2 -2
- package/docs/skill-candidates/v0.0.10/mcp-client-readiness/SKILL.md +31 -31
- package/docs/skill-candidates/v0.0.10/openai-docs/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/openai-docs/SKILL.md +161 -161
- package/docs/skill-candidates/v0.0.10/openai-docs/agents/openai.yaml +14 -14
- package/docs/skill-candidates/v0.0.10/openai-docs/assets/openai-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/openai-docs/references/latest-model.md +37 -37
- package/docs/skill-candidates/v0.0.10/openai-docs/references/prompting-guide.md +244 -244
- package/docs/skill-candidates/v0.0.10/openai-docs/references/upgrade-guide.md +181 -181
- package/docs/skill-candidates/v0.0.10/openai-docs/scripts/fetch-codex-manual.mjs +598 -598
- package/docs/skill-candidates/v0.0.10/openai-docs/scripts/resolve-latest-model-info.js +147 -147
- package/docs/skill-candidates/v0.0.10/playwright/NOTICE.txt +14 -14
- package/docs/skill-candidates/v0.0.10/playwright/SKILL.md +147 -147
- package/docs/skill-candidates/v0.0.10/playwright/agents/openai.yaml +6 -6
- package/docs/skill-candidates/v0.0.10/playwright/assets/playwright-small.svg +3 -3
- package/docs/skill-candidates/v0.0.10/playwright/references/cli.md +116 -116
- package/docs/skill-candidates/v0.0.10/playwright/references/workflows.md +95 -95
- package/docs/skill-candidates/v0.0.10/playwright/scripts/playwright_cli.sh +25 -25
- package/docs/skill-candidates/v0.0.10/polyglot-backend-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.10/screenshot/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/screenshot/SKILL.md +267 -267
- package/docs/skill-candidates/v0.0.10/screenshot/agents/openai.yaml +6 -6
- package/docs/skill-candidates/v0.0.10/screenshot/assets/screenshot-small.svg +5 -5
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/ensure_macos_permissions.sh +54 -54
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_display_info.swift +22 -22
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_permissions.swift +40 -40
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_window_info.swift +126 -126
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/take_screenshot.ps1 +163 -163
- package/docs/skill-candidates/v0.0.10/screenshot/scripts/take_screenshot.py +585 -585
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/SKILL.md +62 -62
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/agents/openai.yaml +4 -4
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/activation-policy.md +77 -77
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/human-approval-policy.md +83 -83
- package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/persona-dev-senior-master.md +46 -46
- package/docs/skill-candidates/v0.0.10/terminal-menu-operations/SKILL.md +30 -30
- package/docs/skill-candidates/v0.0.10/terminal-pixel-art-tui/SKILL.md +43 -43
- package/docs/skill-candidates/v0.0.10/webapp-testing/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/webapp-testing/SKILL.md +95 -95
- package/docs/skill-candidates/v0.0.10/webapp-testing/examples/console_logging.py +34 -34
- package/docs/skill-candidates/v0.0.10/webapp-testing/examples/element_discovery.py +39 -39
- package/docs/skill-candidates/v0.0.10/webapp-testing/examples/static_html_automation.py +32 -32
- package/docs/skill-candidates/v0.0.10/webapp-testing/scripts/with_server.py +105 -105
- package/docs/skill-candidates/v0.0.10/winui-app/LICENSE.txt +201 -201
- package/docs/skill-candidates/v0.0.10/winui-app/SKILL.md +94 -94
- package/docs/skill-candidates/v0.0.10/winui-app/agents/openai.yaml +5 -5
- package/docs/skill-candidates/v0.0.10/winui-app/config.yaml +50 -50
- package/docs/skill-candidates/v0.0.10/winui-app/references/_sections.md +96 -96
- package/docs/skill-candidates/v0.0.10/winui-app/references/accessibility-input-and-localization.md +51 -51
- package/docs/skill-candidates/v0.0.10/winui-app/references/build-run-and-launch-verification.md +72 -72
- package/docs/skill-candidates/v0.0.10/winui-app/references/community-toolkit-controls-and-helpers.md +57 -57
- package/docs/skill-candidates/v0.0.10/winui-app/references/controls-layout-and-adaptive-ui.md +84 -84
- package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-environment-audit-and-remediation.md +82 -82
- package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-setup-and-project-selection.md +67 -67
- package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-template-first-recovery.md +62 -62
- package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-winui-app-structure.md +62 -62
- package/docs/skill-candidates/v0.0.10/winui-app/references/motion-animations-and-polish.md +45 -45
- package/docs/skill-candidates/v0.0.10/winui-app/references/performance-diagnostics-and-responsiveness.md +46 -46
- package/docs/skill-candidates/v0.0.10/winui-app/references/sample-source-map.md +37 -37
- package/docs/skill-candidates/v0.0.10/winui-app/references/shell-navigation-and-windowing.md +67 -67
- package/docs/skill-candidates/v0.0.10/winui-app/references/styling-theming-materials-and-icons.md +71 -71
- package/docs/skill-candidates/v0.0.10/winui-app/references/testing-debugging-and-review-checklists.md +77 -77
- package/docs/skill-candidates/v0.0.10/winui-app/references/windows-app-sdk-lifecycle-notifications-and-deployment.md +52 -52
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/SKILL.md +398 -398
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/common-patterns.md +330 -330
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/complete-examples.md +871 -871
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/component-patterns.md +501 -501
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/data-fetching.md +766 -766
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/file-organization.md +501 -501
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/loading-and-error-states.md +500 -500
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/performance.md +405 -405
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/routing-guide.md +363 -363
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/styling-guide.md +427 -427
- package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/typescript-standards.md +417 -417
- package/docs/skill-candidates/v0.0.11/git-version-control-ops/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/go-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/java-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/javascript-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/json-contract-design/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/multi-client-mcp-ops/SKILL.md +36 -36
- package/docs/skill-candidates/v0.0.11/nextjs/SKILL.md +745 -745
- package/docs/skill-candidates/v0.0.11/nextjs/agents/openai.yaml +3 -3
- package/docs/skill-candidates/v0.0.11/nextjs/references/app-router-files.md +94 -94
- package/docs/skill-candidates/v0.0.11/python-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/ruby-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/senior-fullstack/SKILL.md +209 -209
- package/docs/skill-candidates/v0.0.11/senior-fullstack/references/architecture_patterns.md +103 -103
- package/docs/skill-candidates/v0.0.11/senior-fullstack/references/development_workflows.md +103 -103
- package/docs/skill-candidates/v0.0.11/senior-fullstack/references/tech_stack_guide.md +103 -103
- package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/code_quality_analyzer.py +114 -114
- package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/fullstack_scaffolder.py +114 -114
- package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/project_scaffolder.py +114 -114
- package/docs/skill-candidates/v0.0.11/shadcn/SKILL.md +573 -573
- package/docs/skill-candidates/v0.0.11/shadcn/agents/openai.yaml +3 -3
- package/docs/skill-candidates/v0.0.11/sql-postgresql-engineering/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/terminal-shell-ops/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/typescript-expert/SKILL.md +429 -429
- package/docs/skill-candidates/v0.0.11/typescript-expert/references/tsconfig-strict.json +91 -91
- package/docs/skill-candidates/v0.0.11/typescript-expert/references/typescript-cheatsheet.md +383 -383
- package/docs/skill-candidates/v0.0.11/typescript-expert/references/utility-types.ts +335 -335
- package/docs/skill-candidates/v0.0.11/typescript-expert/scripts/ts_diagnostic.py +203 -203
- package/docs/skill-candidates/v0.0.11/ui-component-primitives/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/web-mobile-design-systems/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.11/windows-linux-platform-ops/SKILL.md +34 -34
- package/docs/skill-candidates/v0.0.12/context-compression-handoff/SKILL.md +47 -0
- package/docs/skill-candidates/v0.0.12/csharp-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/css-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/go-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/html-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/javascript-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/json-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/prompt-budget-gate/SKILL.md +46 -0
- package/docs/skill-candidates/v0.0.12/python-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/react-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/ruby-senior-master-engineering/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.12/senior-master-code-optimizer/SKILL.md +48 -48
- package/docs/skill-candidates/v0.0.12/sql-senior-master-engineering/SKILL.md +31 -31
- package/docs/skill-candidates/v0.0.12/token-economy-orchestrator/SKILL.md +38 -0
- package/docs/skill-candidates/v0.0.12/typescript-senior-master-engineering/SKILL.md +35 -35
- package/docs/skill-candidates/v0.0.9/ai-ethics-human-dignity/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.9/broad-domain-router/SKILL.md +41 -41
- package/docs/skill-candidates/v0.0.9/catholic-moral-discernment/SKILL.md +31 -31
- package/docs/skill-candidates/v0.0.9/engineering-systems-master/SKILL.md +31 -31
- package/docs/skill-candidates/v0.0.9/language-quality-pt-en-fr/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.9/math-science-reasoning/SKILL.md +29 -29
- package/docs/skill-candidates/v0.0.9/philosophy-sociology-discernment/SKILL.md +28 -28
- package/docs/skill-candidates/v0.0.9/professional-boundary-triage/SKILL.md +40 -40
- package/docs/skill-candidates/v0.0.9/release-ethics-gate/SKILL.md +32 -32
- package/docs/skill-candidates/v0.0.9/source-authority-reviewer/SKILL.md +31 -31
- package/examples/client-configs/claude-code.commands.md +21 -21
- package/examples/client-configs/claude-code.project.mcp.json +18 -18
- package/examples/client-configs/claude-desktop.macos.json +18 -18
- package/examples/client-configs/claude-desktop.windows.json +20 -20
- package/examples/client-configs/codex.windows.toml +11 -11
- package/examples/client-configs/gemini-code-assist.intellij.mcp.json +18 -18
- package/examples/client-configs/gemini.linux.settings.json +21 -21
- package/examples/client-configs/gemini.windows.settings.json +23 -23
- package/examples/client-configs/generic-stdio.json +16 -16
- package/manifests/channels/beta.json +26 -26
- package/manifests/channels/stable.json +27 -27
- package/network/approved-skills.json +54 -54
- package/network/unapproved-skill-candidates.json +110 -110
- package/package.json +87 -86
- package/scripts/configure-private-registry.mjs +208 -208
- package/scripts/lib/private-registry.mjs +97 -97
- package/scripts/render-menu-evidence.mjs +130 -130
- package/scripts/verify-menu-actions.mjs +117 -117
- package/sources.json +11 -11
|
@@ -1,307 +1,307 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
4
|
-
import os from 'node:os';
|
|
5
|
-
import path from 'node:path';
|
|
6
|
-
import process from 'node:process';
|
|
7
|
-
import { fileURLToPath } from 'node:url';
|
|
8
|
-
import prompts from 'prompts';
|
|
9
|
-
import {
|
|
10
|
-
activateSuccessSkillDraft,
|
|
11
|
-
listSuccessSkillDraftManifests,
|
|
12
|
-
listUnapprovedSuccessSkills,
|
|
13
|
-
prepareSuccessSkillApprovalPackage,
|
|
14
|
-
readSuccessSkillDraft,
|
|
15
|
-
recordSuccessSkillDecision,
|
|
16
|
-
reviewSuccessSkillDraft,
|
|
17
|
-
} from '../dist/success-learning.js';
|
|
18
|
-
import { readApprovedSkillIndex } from '../dist/skill-network.js';
|
|
19
|
-
|
|
20
|
-
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
21
|
-
const rootDir = path.resolve(here, '..');
|
|
22
|
-
const skillMasterHome = process.env.SKILL_MASTER_HOME ?? path.join(os.homedir(), '.skill-master');
|
|
23
|
-
const successLearningDir = process.env.SKILL_MASTER_SUCCESS_LEARNING_DIR
|
|
24
|
-
?? path.join(skillMasterHome, 'data', 'success-learning');
|
|
25
|
-
const approvedSkillIndexPath = process.env.SKILL_MASTER_APPROVED_SKILLS_INDEX
|
|
26
|
-
?? path.join(rootDir, 'network', 'approved-skills.json');
|
|
27
|
-
const studyCandidatesPath = path.join(rootDir, 'network', 'unapproved-skill-candidates.json');
|
|
28
|
-
|
|
29
|
-
const isTty = () => Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
30
|
-
|
|
31
|
-
const workspaceSkillRoot = () => path.join(process.cwd(), '.codex', 'skills');
|
|
32
|
-
|
|
33
|
-
const globalSkillRoot = () => path.join(process.env.CODEX_HOME ?? path.join(os.homedir(), '.codex'), 'skills');
|
|
34
|
-
|
|
35
|
-
const parseArgs = (argv) => {
|
|
36
|
-
const parsed = {
|
|
37
|
-
command: 'notify',
|
|
38
|
-
target: 'local',
|
|
39
|
-
manifest: null,
|
|
40
|
-
reason: null,
|
|
41
|
-
yes: false,
|
|
42
|
-
overwrite: false,
|
|
43
|
-
directory: successLearningDir,
|
|
44
|
-
outputDir: successLearningDir,
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
for (let index = 0; index < argv.length; index += 1) {
|
|
48
|
-
const arg = argv[index];
|
|
49
|
-
if (arg === '--notify') parsed.command = 'notify';
|
|
50
|
-
else if (arg === '--list') parsed.command = 'list';
|
|
51
|
-
else if (arg === '--study') parsed.command = 'study';
|
|
52
|
-
else if (arg === '--approval-package') parsed.command = 'approval-package';
|
|
53
|
-
else if (arg === '--mark-study') {
|
|
54
|
-
parsed.command = 'mark-study';
|
|
55
|
-
parsed.manifest = argv[++index] ?? null;
|
|
56
|
-
} else if (arg === '--reject') {
|
|
57
|
-
parsed.command = 'reject';
|
|
58
|
-
parsed.manifest = argv[++index] ?? null;
|
|
59
|
-
} else if (arg === '--mark-study-interactive') parsed.command = 'mark-study-interactive';
|
|
60
|
-
else if (arg === '--reject-interactive') parsed.command = 'reject-interactive';
|
|
61
|
-
else if (arg === '--reason') parsed.reason = argv[++index] ?? null;
|
|
62
|
-
else if (arg === '--activate') {
|
|
63
|
-
parsed.command = 'activate';
|
|
64
|
-
parsed.manifest = argv[++index] ?? null;
|
|
65
|
-
} else if (arg === '--activate-interactive') parsed.command = 'activate-interactive';
|
|
66
|
-
else if (arg === '--yes') parsed.yes = true;
|
|
67
|
-
else if (arg === '--overwrite') parsed.overwrite = true;
|
|
68
|
-
else if (arg.startsWith('--target=')) parsed.target = arg.slice('--target='.length);
|
|
69
|
-
else if (arg === '--target') parsed.target = argv[++index] ?? parsed.target;
|
|
70
|
-
else if (arg.startsWith('--directory=')) parsed.directory = arg.slice('--directory='.length);
|
|
71
|
-
else if (arg === '--directory') parsed.directory = argv[++index] ?? parsed.directory;
|
|
72
|
-
else if (arg.startsWith('--output-dir=')) parsed.outputDir = arg.slice('--output-dir='.length);
|
|
73
|
-
else if (arg === '--output-dir') parsed.outputDir = argv[++index] ?? parsed.outputDir;
|
|
74
|
-
else if (arg === '--help' || arg === '-h') parsed.command = 'help';
|
|
75
|
-
else throw new Error(`Unknown argument: ${arg}`);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
return parsed;
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
const resolveTargetRoot = (target) => {
|
|
82
|
-
if (target === 'local') return workspaceSkillRoot();
|
|
83
|
-
if (target === 'global') return globalSkillRoot();
|
|
84
|
-
return path.resolve(target);
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const loadStudyCandidates = () => {
|
|
88
|
-
if (!existsSync(studyCandidatesPath)) return [];
|
|
89
|
-
const parsed = JSON.parse(readFileSync(studyCandidatesPath, 'utf8'));
|
|
90
|
-
return Array.isArray(parsed.candidates) ? parsed.candidates : [];
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
const printHelp = () => {
|
|
94
|
-
console.log(`Skill Master Success Skills
|
|
95
|
-
|
|
96
|
-
Usage:
|
|
97
|
-
skill-master-success-skills --notify
|
|
98
|
-
skill-master-success-skills --list
|
|
99
|
-
skill-master-success-skills --study
|
|
100
|
-
skill-master-success-skills --approval-package
|
|
101
|
-
skill-master-success-skills --mark-study <manifest.json> --reason "why"
|
|
102
|
-
skill-master-success-skills --reject <manifest.json> --reason "why"
|
|
103
|
-
skill-master-success-skills --mark-study-interactive
|
|
104
|
-
skill-master-success-skills --reject-interactive
|
|
105
|
-
skill-master-success-skills --activate <manifest.json> --target local|global|<path> --yes
|
|
106
|
-
skill-master-success-skills --activate-interactive --target local|global
|
|
107
|
-
`);
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
const notify = async (directory) => {
|
|
111
|
-
const drafts = await listUnapprovedSuccessSkills(directory);
|
|
112
|
-
const studyCandidates = loadStudyCandidates();
|
|
113
|
-
const readyDrafts = [];
|
|
114
|
-
const approvedIndex = await readApprovedSkillIndex(approvedSkillIndexPath);
|
|
115
|
-
|
|
116
|
-
for (const entry of drafts) {
|
|
117
|
-
const review = await reviewSuccessSkillDraft({ manifestPath: entry.filePath, approvedIndex });
|
|
118
|
-
if (review.recommendation === 'ready-for-human-approval') readyDrafts.push(entry);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
console.log('Skill Master - notificacoes');
|
|
122
|
-
console.log(`- Drafts pendentes: ${drafts.length}`);
|
|
123
|
-
console.log(`- Prontos para aprovacao humana: ${readyDrafts.length}`);
|
|
124
|
-
console.log(`- Skills externas para estudo: ${studyCandidates.length}`);
|
|
125
|
-
if (readyDrafts.length > 0) {
|
|
126
|
-
console.log('');
|
|
127
|
-
console.log('Acoes sugeridas:');
|
|
128
|
-
console.log('- skill-master-menu --run activate-learned-local');
|
|
129
|
-
console.log('- skill-master-menu --run approval-package');
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
const listDrafts = async (directory) => {
|
|
134
|
-
const drafts = await listUnapprovedSuccessSkills(directory);
|
|
135
|
-
if (drafts.length === 0) {
|
|
136
|
-
console.log('Nenhum draft pendente encontrado.');
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
for (const [index, draft] of drafts.entries()) {
|
|
141
|
-
console.log(`${index + 1}. ${draft.candidateName}`);
|
|
142
|
-
console.log(` Manifest: ${draft.filePath}`);
|
|
143
|
-
console.log(` Motivo: ${draft.reason}`);
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
const study = () => {
|
|
148
|
-
const candidates = loadStudyCandidates();
|
|
149
|
-
if (candidates.length === 0) {
|
|
150
|
-
console.log('Nenhuma skill externa para estudo encontrada.');
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
console.log('Skills para estudar');
|
|
155
|
-
for (const [index, candidate] of candidates.entries()) {
|
|
156
|
-
console.log(`${index + 1}. ${candidate.name}`);
|
|
157
|
-
console.log(` Criador: ${candidate.creatorName} - ${candidate.creatorUrl}`);
|
|
158
|
-
console.log(` Link: ${candidate.sourceUrl}`);
|
|
159
|
-
console.log(` Status: ${candidate.reviewStatus}`);
|
|
160
|
-
console.log(` Motivo: ${candidate.reason}`);
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
const createApprovalPackage = async ({ directory, outputDir }) => {
|
|
165
|
-
const approvedIndex = await readApprovedSkillIndex(approvedSkillIndexPath);
|
|
166
|
-
const result = await prepareSuccessSkillApprovalPackage({ directory, outputDir, approvedIndex });
|
|
167
|
-
console.log('Pacote de aprovacao humana criado.');
|
|
168
|
-
console.log(`- Arquivo: ${result.filePath}`);
|
|
169
|
-
console.log(`- Drafts: ${result.totalDrafts}`);
|
|
170
|
-
console.log(`- Prontos para aprovacao: ${result.readyForApproval}`);
|
|
171
|
-
console.log(`- Precisam de revisao: ${result.needsReview}`);
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
const chooseManifest = async (directory, { readyOnly = true } = {}) => {
|
|
175
|
-
const manifests = await listSuccessSkillDraftManifests(directory);
|
|
176
|
-
const approvedIndex = await readApprovedSkillIndex(approvedSkillIndexPath);
|
|
177
|
-
const choices = [];
|
|
178
|
-
|
|
179
|
-
for (const manifestPath of manifests) {
|
|
180
|
-
const draft = await readSuccessSkillDraft(manifestPath);
|
|
181
|
-
if (!draft || draft.governance.approved) continue;
|
|
182
|
-
const review = await reviewSuccessSkillDraft({ manifestPath, approvedIndex });
|
|
183
|
-
choices.push({
|
|
184
|
-
title: draft.candidateSkill.name,
|
|
185
|
-
description: `${review.recommendation} - ${manifestPath}`,
|
|
186
|
-
value: manifestPath,
|
|
187
|
-
disabled: readyOnly && review.recommendation !== 'ready-for-human-approval',
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
if (choices.length === 0) {
|
|
192
|
-
throw new Error('No pending success skill drafts found.');
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const response = await prompts({
|
|
196
|
-
type: 'select',
|
|
197
|
-
name: 'manifest',
|
|
198
|
-
message: 'Selecione a skill aprendida para ativar',
|
|
199
|
-
choices,
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
if (!response.manifest) {
|
|
203
|
-
throw new Error('No draft selected.');
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return response.manifest;
|
|
207
|
-
};
|
|
208
|
-
|
|
209
|
-
const activate = async ({ manifest, target, yes, overwrite }) => {
|
|
210
|
-
if (!manifest) throw new Error('Missing manifest path.');
|
|
211
|
-
const targetRoot = resolveTargetRoot(target);
|
|
212
|
-
|
|
213
|
-
if (!yes) {
|
|
214
|
-
if (!isTty()) {
|
|
215
|
-
throw new Error('Activation requires --yes outside an interactive terminal.');
|
|
216
|
-
}
|
|
217
|
-
const confirmation = await prompts({
|
|
218
|
-
type: 'confirm',
|
|
219
|
-
name: 'confirmed',
|
|
220
|
-
message: `Ativar skill em ${targetRoot}?`,
|
|
221
|
-
initial: false,
|
|
222
|
-
});
|
|
223
|
-
if (!confirmation.confirmed) {
|
|
224
|
-
console.log('Ativacao cancelada.');
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
const approvedIndex = await readApprovedSkillIndex(approvedSkillIndexPath);
|
|
230
|
-
const result = await activateSuccessSkillDraft({
|
|
231
|
-
manifestPath: path.resolve(manifest),
|
|
232
|
-
approvedIndex,
|
|
233
|
-
targetRoot,
|
|
234
|
-
approvedBy: 'skill-master-menu',
|
|
235
|
-
overwrite,
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
console.log('Skill ativada.');
|
|
239
|
-
console.log(`- Nome: ${result.candidateName}`);
|
|
240
|
-
console.log(`- Destino: ${result.installedSkillPath}`);
|
|
241
|
-
console.log(`- Registro: ${result.approvalRecordPath}`);
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
const recordDecision = async ({ command, manifest, reason }) => {
|
|
245
|
-
if (!manifest) throw new Error('Missing manifest path.');
|
|
246
|
-
if (!reason) throw new Error('Decision commands require --reason.');
|
|
247
|
-
const decision = command === 'mark-study' ? 'study' : 'rejected';
|
|
248
|
-
const result = await recordSuccessSkillDecision({
|
|
249
|
-
manifestPath: path.resolve(manifest),
|
|
250
|
-
decision,
|
|
251
|
-
decidedBy: 'skill-master-menu',
|
|
252
|
-
reason,
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
console.log('Decisao registrada.');
|
|
256
|
-
console.log(`- Skill: ${result.candidateName}`);
|
|
257
|
-
console.log(`- Decisao: ${result.decision}`);
|
|
258
|
-
console.log(`- Manifest: ${result.manifestPath}`);
|
|
259
|
-
console.log(`- Atualizar Notion: ${result.notionUpdateRecommended ? 'sim' : 'nao'}`);
|
|
260
|
-
};
|
|
261
|
-
|
|
262
|
-
const recordDecisionInteractive = async ({ command, directory }) => {
|
|
263
|
-
if (!isTty()) throw new Error('Interactive decision requires a TTY.');
|
|
264
|
-
const manifest = await chooseManifest(directory, { readyOnly: false });
|
|
265
|
-
const response = await prompts({
|
|
266
|
-
type: 'text',
|
|
267
|
-
name: 'reason',
|
|
268
|
-
message: command === 'mark-study-interactive'
|
|
269
|
-
? 'Por que manter esta skill para estudo?'
|
|
270
|
-
: 'Por que rejeitar esta skill candidata?',
|
|
271
|
-
validate: (value) => value.trim().length >= 5 || 'Informe um motivo com pelo menos 5 caracteres.',
|
|
272
|
-
});
|
|
273
|
-
if (!response.reason) throw new Error('Decision reason is required.');
|
|
274
|
-
|
|
275
|
-
await recordDecision({
|
|
276
|
-
command: command === 'mark-study-interactive' ? 'mark-study' : 'reject',
|
|
277
|
-
manifest,
|
|
278
|
-
reason: response.reason,
|
|
279
|
-
});
|
|
280
|
-
};
|
|
281
|
-
|
|
282
|
-
const main = async () => {
|
|
283
|
-
const args = parseArgs(process.argv.slice(2));
|
|
284
|
-
|
|
285
|
-
if (args.command === 'help') printHelp();
|
|
286
|
-
else if (args.command === 'notify') await notify(args.directory);
|
|
287
|
-
else if (args.command === 'list') await listDrafts(args.directory);
|
|
288
|
-
else if (args.command === 'study') study();
|
|
289
|
-
else if (args.command === 'approval-package') await createApprovalPackage(args);
|
|
290
|
-
else if (args.command === 'mark-study' || args.command === 'reject') await recordDecision(args);
|
|
291
|
-
else if (args.command === 'mark-study-interactive' || args.command === 'reject-interactive') await recordDecisionInteractive(args);
|
|
292
|
-
else if (args.command === 'activate') await activate(args);
|
|
293
|
-
else if (args.command === 'activate-interactive') {
|
|
294
|
-
if (!isTty()) throw new Error('Interactive activation requires a TTY.');
|
|
295
|
-
const manifest = await chooseManifest(args.directory);
|
|
296
|
-
await activate({ ...args, manifest });
|
|
297
|
-
} else {
|
|
298
|
-
throw new Error(`Unsupported command: ${args.command}`);
|
|
299
|
-
}
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
try {
|
|
303
|
-
await main();
|
|
304
|
-
} catch (error) {
|
|
305
|
-
process.stderr.write(`[skill_master] ${error instanceof Error ? error.message : String(error)}\n`);
|
|
306
|
-
process.exitCode = 1;
|
|
307
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import process from 'node:process';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import prompts from 'prompts';
|
|
9
|
+
import {
|
|
10
|
+
activateSuccessSkillDraft,
|
|
11
|
+
listSuccessSkillDraftManifests,
|
|
12
|
+
listUnapprovedSuccessSkills,
|
|
13
|
+
prepareSuccessSkillApprovalPackage,
|
|
14
|
+
readSuccessSkillDraft,
|
|
15
|
+
recordSuccessSkillDecision,
|
|
16
|
+
reviewSuccessSkillDraft,
|
|
17
|
+
} from '../dist/success-learning.js';
|
|
18
|
+
import { readApprovedSkillIndex } from '../dist/skill-network.js';
|
|
19
|
+
|
|
20
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
const rootDir = path.resolve(here, '..');
|
|
22
|
+
const skillMasterHome = process.env.SKILL_MASTER_HOME ?? path.join(os.homedir(), '.skill-master');
|
|
23
|
+
const successLearningDir = process.env.SKILL_MASTER_SUCCESS_LEARNING_DIR
|
|
24
|
+
?? path.join(skillMasterHome, 'data', 'success-learning');
|
|
25
|
+
const approvedSkillIndexPath = process.env.SKILL_MASTER_APPROVED_SKILLS_INDEX
|
|
26
|
+
?? path.join(rootDir, 'network', 'approved-skills.json');
|
|
27
|
+
const studyCandidatesPath = path.join(rootDir, 'network', 'unapproved-skill-candidates.json');
|
|
28
|
+
|
|
29
|
+
const isTty = () => Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
30
|
+
|
|
31
|
+
const workspaceSkillRoot = () => path.join(process.cwd(), '.codex', 'skills');
|
|
32
|
+
|
|
33
|
+
const globalSkillRoot = () => path.join(process.env.CODEX_HOME ?? path.join(os.homedir(), '.codex'), 'skills');
|
|
34
|
+
|
|
35
|
+
const parseArgs = (argv) => {
|
|
36
|
+
const parsed = {
|
|
37
|
+
command: 'notify',
|
|
38
|
+
target: 'local',
|
|
39
|
+
manifest: null,
|
|
40
|
+
reason: null,
|
|
41
|
+
yes: false,
|
|
42
|
+
overwrite: false,
|
|
43
|
+
directory: successLearningDir,
|
|
44
|
+
outputDir: successLearningDir,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
48
|
+
const arg = argv[index];
|
|
49
|
+
if (arg === '--notify') parsed.command = 'notify';
|
|
50
|
+
else if (arg === '--list') parsed.command = 'list';
|
|
51
|
+
else if (arg === '--study') parsed.command = 'study';
|
|
52
|
+
else if (arg === '--approval-package') parsed.command = 'approval-package';
|
|
53
|
+
else if (arg === '--mark-study') {
|
|
54
|
+
parsed.command = 'mark-study';
|
|
55
|
+
parsed.manifest = argv[++index] ?? null;
|
|
56
|
+
} else if (arg === '--reject') {
|
|
57
|
+
parsed.command = 'reject';
|
|
58
|
+
parsed.manifest = argv[++index] ?? null;
|
|
59
|
+
} else if (arg === '--mark-study-interactive') parsed.command = 'mark-study-interactive';
|
|
60
|
+
else if (arg === '--reject-interactive') parsed.command = 'reject-interactive';
|
|
61
|
+
else if (arg === '--reason') parsed.reason = argv[++index] ?? null;
|
|
62
|
+
else if (arg === '--activate') {
|
|
63
|
+
parsed.command = 'activate';
|
|
64
|
+
parsed.manifest = argv[++index] ?? null;
|
|
65
|
+
} else if (arg === '--activate-interactive') parsed.command = 'activate-interactive';
|
|
66
|
+
else if (arg === '--yes') parsed.yes = true;
|
|
67
|
+
else if (arg === '--overwrite') parsed.overwrite = true;
|
|
68
|
+
else if (arg.startsWith('--target=')) parsed.target = arg.slice('--target='.length);
|
|
69
|
+
else if (arg === '--target') parsed.target = argv[++index] ?? parsed.target;
|
|
70
|
+
else if (arg.startsWith('--directory=')) parsed.directory = arg.slice('--directory='.length);
|
|
71
|
+
else if (arg === '--directory') parsed.directory = argv[++index] ?? parsed.directory;
|
|
72
|
+
else if (arg.startsWith('--output-dir=')) parsed.outputDir = arg.slice('--output-dir='.length);
|
|
73
|
+
else if (arg === '--output-dir') parsed.outputDir = argv[++index] ?? parsed.outputDir;
|
|
74
|
+
else if (arg === '--help' || arg === '-h') parsed.command = 'help';
|
|
75
|
+
else throw new Error(`Unknown argument: ${arg}`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return parsed;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const resolveTargetRoot = (target) => {
|
|
82
|
+
if (target === 'local') return workspaceSkillRoot();
|
|
83
|
+
if (target === 'global') return globalSkillRoot();
|
|
84
|
+
return path.resolve(target);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const loadStudyCandidates = () => {
|
|
88
|
+
if (!existsSync(studyCandidatesPath)) return [];
|
|
89
|
+
const parsed = JSON.parse(readFileSync(studyCandidatesPath, 'utf8'));
|
|
90
|
+
return Array.isArray(parsed.candidates) ? parsed.candidates : [];
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const printHelp = () => {
|
|
94
|
+
console.log(`Skill Master Success Skills
|
|
95
|
+
|
|
96
|
+
Usage:
|
|
97
|
+
skill-master-success-skills --notify
|
|
98
|
+
skill-master-success-skills --list
|
|
99
|
+
skill-master-success-skills --study
|
|
100
|
+
skill-master-success-skills --approval-package
|
|
101
|
+
skill-master-success-skills --mark-study <manifest.json> --reason "why"
|
|
102
|
+
skill-master-success-skills --reject <manifest.json> --reason "why"
|
|
103
|
+
skill-master-success-skills --mark-study-interactive
|
|
104
|
+
skill-master-success-skills --reject-interactive
|
|
105
|
+
skill-master-success-skills --activate <manifest.json> --target local|global|<path> --yes
|
|
106
|
+
skill-master-success-skills --activate-interactive --target local|global
|
|
107
|
+
`);
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const notify = async (directory) => {
|
|
111
|
+
const drafts = await listUnapprovedSuccessSkills(directory);
|
|
112
|
+
const studyCandidates = loadStudyCandidates();
|
|
113
|
+
const readyDrafts = [];
|
|
114
|
+
const approvedIndex = await readApprovedSkillIndex(approvedSkillIndexPath);
|
|
115
|
+
|
|
116
|
+
for (const entry of drafts) {
|
|
117
|
+
const review = await reviewSuccessSkillDraft({ manifestPath: entry.filePath, approvedIndex });
|
|
118
|
+
if (review.recommendation === 'ready-for-human-approval') readyDrafts.push(entry);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
console.log('Skill Master - notificacoes');
|
|
122
|
+
console.log(`- Drafts pendentes: ${drafts.length}`);
|
|
123
|
+
console.log(`- Prontos para aprovacao humana: ${readyDrafts.length}`);
|
|
124
|
+
console.log(`- Skills externas para estudo: ${studyCandidates.length}`);
|
|
125
|
+
if (readyDrafts.length > 0) {
|
|
126
|
+
console.log('');
|
|
127
|
+
console.log('Acoes sugeridas:');
|
|
128
|
+
console.log('- skill-master-menu --run activate-learned-local');
|
|
129
|
+
console.log('- skill-master-menu --run approval-package');
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const listDrafts = async (directory) => {
|
|
134
|
+
const drafts = await listUnapprovedSuccessSkills(directory);
|
|
135
|
+
if (drafts.length === 0) {
|
|
136
|
+
console.log('Nenhum draft pendente encontrado.');
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
for (const [index, draft] of drafts.entries()) {
|
|
141
|
+
console.log(`${index + 1}. ${draft.candidateName}`);
|
|
142
|
+
console.log(` Manifest: ${draft.filePath}`);
|
|
143
|
+
console.log(` Motivo: ${draft.reason}`);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const study = () => {
|
|
148
|
+
const candidates = loadStudyCandidates();
|
|
149
|
+
if (candidates.length === 0) {
|
|
150
|
+
console.log('Nenhuma skill externa para estudo encontrada.');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
console.log('Skills para estudar');
|
|
155
|
+
for (const [index, candidate] of candidates.entries()) {
|
|
156
|
+
console.log(`${index + 1}. ${candidate.name}`);
|
|
157
|
+
console.log(` Criador: ${candidate.creatorName} - ${candidate.creatorUrl}`);
|
|
158
|
+
console.log(` Link: ${candidate.sourceUrl}`);
|
|
159
|
+
console.log(` Status: ${candidate.reviewStatus}`);
|
|
160
|
+
console.log(` Motivo: ${candidate.reason}`);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const createApprovalPackage = async ({ directory, outputDir }) => {
|
|
165
|
+
const approvedIndex = await readApprovedSkillIndex(approvedSkillIndexPath);
|
|
166
|
+
const result = await prepareSuccessSkillApprovalPackage({ directory, outputDir, approvedIndex });
|
|
167
|
+
console.log('Pacote de aprovacao humana criado.');
|
|
168
|
+
console.log(`- Arquivo: ${result.filePath}`);
|
|
169
|
+
console.log(`- Drafts: ${result.totalDrafts}`);
|
|
170
|
+
console.log(`- Prontos para aprovacao: ${result.readyForApproval}`);
|
|
171
|
+
console.log(`- Precisam de revisao: ${result.needsReview}`);
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const chooseManifest = async (directory, { readyOnly = true } = {}) => {
|
|
175
|
+
const manifests = await listSuccessSkillDraftManifests(directory);
|
|
176
|
+
const approvedIndex = await readApprovedSkillIndex(approvedSkillIndexPath);
|
|
177
|
+
const choices = [];
|
|
178
|
+
|
|
179
|
+
for (const manifestPath of manifests) {
|
|
180
|
+
const draft = await readSuccessSkillDraft(manifestPath);
|
|
181
|
+
if (!draft || draft.governance.approved) continue;
|
|
182
|
+
const review = await reviewSuccessSkillDraft({ manifestPath, approvedIndex });
|
|
183
|
+
choices.push({
|
|
184
|
+
title: draft.candidateSkill.name,
|
|
185
|
+
description: `${review.recommendation} - ${manifestPath}`,
|
|
186
|
+
value: manifestPath,
|
|
187
|
+
disabled: readyOnly && review.recommendation !== 'ready-for-human-approval',
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (choices.length === 0) {
|
|
192
|
+
throw new Error('No pending success skill drafts found.');
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const response = await prompts({
|
|
196
|
+
type: 'select',
|
|
197
|
+
name: 'manifest',
|
|
198
|
+
message: 'Selecione a skill aprendida para ativar',
|
|
199
|
+
choices,
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
if (!response.manifest) {
|
|
203
|
+
throw new Error('No draft selected.');
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return response.manifest;
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
const activate = async ({ manifest, target, yes, overwrite }) => {
|
|
210
|
+
if (!manifest) throw new Error('Missing manifest path.');
|
|
211
|
+
const targetRoot = resolveTargetRoot(target);
|
|
212
|
+
|
|
213
|
+
if (!yes) {
|
|
214
|
+
if (!isTty()) {
|
|
215
|
+
throw new Error('Activation requires --yes outside an interactive terminal.');
|
|
216
|
+
}
|
|
217
|
+
const confirmation = await prompts({
|
|
218
|
+
type: 'confirm',
|
|
219
|
+
name: 'confirmed',
|
|
220
|
+
message: `Ativar skill em ${targetRoot}?`,
|
|
221
|
+
initial: false,
|
|
222
|
+
});
|
|
223
|
+
if (!confirmation.confirmed) {
|
|
224
|
+
console.log('Ativacao cancelada.');
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const approvedIndex = await readApprovedSkillIndex(approvedSkillIndexPath);
|
|
230
|
+
const result = await activateSuccessSkillDraft({
|
|
231
|
+
manifestPath: path.resolve(manifest),
|
|
232
|
+
approvedIndex,
|
|
233
|
+
targetRoot,
|
|
234
|
+
approvedBy: 'skill-master-menu',
|
|
235
|
+
overwrite,
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
console.log('Skill ativada.');
|
|
239
|
+
console.log(`- Nome: ${result.candidateName}`);
|
|
240
|
+
console.log(`- Destino: ${result.installedSkillPath}`);
|
|
241
|
+
console.log(`- Registro: ${result.approvalRecordPath}`);
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
const recordDecision = async ({ command, manifest, reason }) => {
|
|
245
|
+
if (!manifest) throw new Error('Missing manifest path.');
|
|
246
|
+
if (!reason) throw new Error('Decision commands require --reason.');
|
|
247
|
+
const decision = command === 'mark-study' ? 'study' : 'rejected';
|
|
248
|
+
const result = await recordSuccessSkillDecision({
|
|
249
|
+
manifestPath: path.resolve(manifest),
|
|
250
|
+
decision,
|
|
251
|
+
decidedBy: 'skill-master-menu',
|
|
252
|
+
reason,
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
console.log('Decisao registrada.');
|
|
256
|
+
console.log(`- Skill: ${result.candidateName}`);
|
|
257
|
+
console.log(`- Decisao: ${result.decision}`);
|
|
258
|
+
console.log(`- Manifest: ${result.manifestPath}`);
|
|
259
|
+
console.log(`- Atualizar Notion: ${result.notionUpdateRecommended ? 'sim' : 'nao'}`);
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
const recordDecisionInteractive = async ({ command, directory }) => {
|
|
263
|
+
if (!isTty()) throw new Error('Interactive decision requires a TTY.');
|
|
264
|
+
const manifest = await chooseManifest(directory, { readyOnly: false });
|
|
265
|
+
const response = await prompts({
|
|
266
|
+
type: 'text',
|
|
267
|
+
name: 'reason',
|
|
268
|
+
message: command === 'mark-study-interactive'
|
|
269
|
+
? 'Por que manter esta skill para estudo?'
|
|
270
|
+
: 'Por que rejeitar esta skill candidata?',
|
|
271
|
+
validate: (value) => value.trim().length >= 5 || 'Informe um motivo com pelo menos 5 caracteres.',
|
|
272
|
+
});
|
|
273
|
+
if (!response.reason) throw new Error('Decision reason is required.');
|
|
274
|
+
|
|
275
|
+
await recordDecision({
|
|
276
|
+
command: command === 'mark-study-interactive' ? 'mark-study' : 'reject',
|
|
277
|
+
manifest,
|
|
278
|
+
reason: response.reason,
|
|
279
|
+
});
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
const main = async () => {
|
|
283
|
+
const args = parseArgs(process.argv.slice(2));
|
|
284
|
+
|
|
285
|
+
if (args.command === 'help') printHelp();
|
|
286
|
+
else if (args.command === 'notify') await notify(args.directory);
|
|
287
|
+
else if (args.command === 'list') await listDrafts(args.directory);
|
|
288
|
+
else if (args.command === 'study') study();
|
|
289
|
+
else if (args.command === 'approval-package') await createApprovalPackage(args);
|
|
290
|
+
else if (args.command === 'mark-study' || args.command === 'reject') await recordDecision(args);
|
|
291
|
+
else if (args.command === 'mark-study-interactive' || args.command === 'reject-interactive') await recordDecisionInteractive(args);
|
|
292
|
+
else if (args.command === 'activate') await activate(args);
|
|
293
|
+
else if (args.command === 'activate-interactive') {
|
|
294
|
+
if (!isTty()) throw new Error('Interactive activation requires a TTY.');
|
|
295
|
+
const manifest = await chooseManifest(args.directory);
|
|
296
|
+
await activate({ ...args, manifest });
|
|
297
|
+
} else {
|
|
298
|
+
throw new Error(`Unsupported command: ${args.command}`);
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
try {
|
|
303
|
+
await main();
|
|
304
|
+
} catch (error) {
|
|
305
|
+
process.stderr.write(`[skill_master] ${error instanceof Error ? error.message : String(error)}\n`);
|
|
306
|
+
process.exitCode = 1;
|
|
307
|
+
}
|