@fprad0/skill-master-mcp 0.0.11 → 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 (337) hide show
  1. package/CHANGELOG.md +96 -83
  2. package/README.md +472 -443
  3. package/VERSION.md +9 -9
  4. package/bin/lib/bootstrap-global-core.mjs +34 -0
  5. package/bin/lib/client-config.mjs +293 -268
  6. package/bin/lib/doctor-core.mjs +202 -0
  7. package/bin/lib/menu-core.mjs +1629 -1154
  8. package/bin/lib/operation-result.mjs +59 -0
  9. package/bin/lib/register-clients-core.mjs +247 -0
  10. package/bin/lib/skill-installation.mjs +215 -0
  11. package/bin/lib/update-cli-core.mjs +117 -0
  12. package/bin/skill-master-activation.mjs +163 -163
  13. package/bin/skill-master-bootstrap-global.mjs +61 -49
  14. package/bin/skill-master-configure-private-registry.mjs +3 -3
  15. package/bin/skill-master-doctor.mjs +239 -181
  16. package/bin/skill-master-eval-activation.mjs +32 -32
  17. package/bin/skill-master-install-global-skills.mjs +59 -97
  18. package/bin/skill-master-install-project-skills.mjs +97 -0
  19. package/bin/skill-master-menu.mjs +406 -320
  20. package/bin/skill-master-register-clients.mjs +232 -98
  21. package/bin/skill-master-success-skills.mjs +307 -307
  22. package/bin/skill-master-update.mjs +121 -72
  23. package/bin/skill-master.mjs +3 -3
  24. package/dist/activation.d.ts.map +1 -1
  25. package/dist/activation.js +12 -0
  26. package/dist/activation.js.map +1 -1
  27. package/dist/prompt-router.d.ts.map +1 -1
  28. package/dist/prompt-router.js +19 -0
  29. package/dist/prompt-router.js.map +1 -1
  30. package/dist/recommender.d.ts.map +1 -1
  31. package/dist/recommender.js +4 -1
  32. package/dist/recommender.js.map +1 -1
  33. package/docs/architecture/APRENDIZADO_DE_IMPLEMENTACOES_BEM_SUCEDIDAS.md +125 -125
  34. package/docs/architecture/ARQUITETURA_AUTO_UPDATE.md +9 -9
  35. package/docs/architecture/PLANO_MASTER_ACIONAMENTO_AUTOMATICO_E_APRENDIZADO.md +341 -341
  36. package/docs/architecture/REDE_SEGURA_DE_SKILLS.md +148 -148
  37. package/docs/operations/GUIA_MULTI_COMPUTADOR.md +262 -255
  38. package/docs/operations/GUIA_NPM_PRIVADO.md +294 -294
  39. package/docs/operations/GUIA_NPM_PUBLICO.md +147 -147
  40. package/docs/operations/MENU_VISUAL_EVIDENCE_2026-06-28.md +66 -0
  41. package/docs/operations/assets/menu-frame-compact.html +76 -0
  42. package/docs/operations/assets/menu-frame-compact.png +0 -0
  43. package/docs/operations/assets/menu-frame-large.html +84 -0
  44. package/docs/operations/assets/menu-frame-large.png +0 -0
  45. package/docs/operations/assets/menu-frame-running.html +80 -0
  46. package/docs/operations/assets/menu-frame-running.png +0 -0
  47. package/docs/operations/cross-platform-auth-transfer/ANALISE_COMPATIBILIDADE_MCP_2026-06-28.md +140 -0
  48. package/docs/operations/cross-platform-auth-transfer/README_TRANSFERENCIA.md +85 -0
  49. package/docs/operations/reborn-menu-cyberpunk-transfer/ANALISE_MENU_REBORN_CYBERPUNK_2026-06-28.md +174 -0
  50. package/docs/operations/reborn-menu-cyberpunk-transfer/HANDOFF_IMPLEMENTACAO_REBORN_CYBERPUNK_2026-06-28.md +119 -0
  51. package/docs/operations/reborn-menu-cyberpunk-transfer/ORDEM_DE_EXECUCAO_MENU_REBORN_CYBERPUNK.md +134 -0
  52. package/docs/operations/reborn-menu-cyberpunk-transfer/README_TRANSFERENCIA.md +84 -0
  53. package/docs/operations/reborn-menu-cyberpunk-transfer/README_TRANSFERENCIA_REBORN_PACKAGE.md +56 -0
  54. package/docs/operations/reborn-menu-cyberpunk-transfer/references/cyan-hud-frame-sheet.jpg +0 -0
  55. package/docs/operations/reborn-menu-cyberpunk-transfer/references/cyberpunk-pattern-sheet.jpg +0 -0
  56. package/docs/operations/reborn-menu-cyberpunk-transfer/references/fluid-workflow-windows.gif +0 -0
  57. package/docs/operations/token-economy-transfer/ANALISE_AVANCADA_ECONOMIA_TOKENS_2026-06-30.md +141 -0
  58. package/docs/operations/token-economy-transfer/PLANO_DEV_SENIOR_MASTER_TOKEN_ECONOMY_2026-06-30.md +171 -0
  59. package/docs/operations/token-economy-transfer/README_TRANSFERENCIA_TOKEN_ECONOMY.md +31 -0
  60. package/docs/planning/MENU_RUNTIME_CORRECTION_PLAN_2026-06-30.md +551 -0
  61. package/docs/planning/V0_0_9_APROVACAO_CRITICA_MENSAGENS_DE_VENDA.md +85 -85
  62. package/docs/planning/V0_0_9_FONTES_E_CRITERIOS_DE_AUTORIDADE.md +139 -139
  63. package/docs/planning/V0_0_9_MATRIZ_SKILLS_MULTIDISCIPLINARES.md +105 -105
  64. package/docs/planning/V0_0_9_POLITICA_MORAL_CATOLICA_PARA_IA.md +181 -181
  65. package/docs/planning/V0_0_9_PROMPTS_EXECUCAO.md +59 -59
  66. package/docs/planning/V0_0_9_ROADMAP_DISCERNIMENTO_E_CONHECIMENTO_AMPLO.md +181 -181
  67. package/docs/prompt-tasks/PROMPT_TASK_001_BOOTSTRAP_SKILL_MASTER_MCP.md +6 -0
  68. package/docs/prompt-tasks/PROMPT_TASK_002_AUTO_UPDATE_LAUNCHER.md +6 -0
  69. package/docs/prompt-tasks/PROMPT_TASK_003_REMOTE_MANIFEST_AND_RELEASES.md +6 -0
  70. package/docs/prompt-tasks/PROMPT_TASK_004_MULTI_USER_DISTRIBUTION.md +6 -0
  71. package/docs/prompt-tasks/PROMPT_TASK_005_SECURITY_AND_QUALITY_GATE.md +6 -0
  72. package/docs/prompt-tasks/PROMPT_TASK_006_MASTER_ACIONAMENTO_APRENDIZADO.md +83 -0
  73. package/docs/prompt-tasks/PROMPT_TASK_007_PERSONA_ORQUESTRADORA.md +88 -0
  74. package/docs/prompt-tasks/PROMPT_TASK_008_PROMPT_ROUTER_MODOS_ATIVACAO.md +156 -0
  75. package/docs/prompt-tasks/PROMPT_TASK_009_PIPELINE_APRENDIZADO_SUCESSO.md +105 -0
  76. package/docs/prompt-tasks/PROMPT_TASK_010_EVALS_GOVERNANCA_ATIVACAO.md +119 -0
  77. package/docs/prompt-tasks/PROMPT_TASK_011_MENU_NOTIFICACOES_NOTION.md +120 -0
  78. package/docs/prompt-tasks/PROMPT_TASK_012_MENU_CYBERPUNK_PIXEL_FRAME.md +123 -0
  79. package/docs/prompt-tasks/PROMPT_TASK_013_MENU_FLUID_DNA_ANIMATION.md +114 -0
  80. package/docs/prompt-tasks/PROMPT_TASK_014_MENU_FUNCTIONAL_PARITY_QA.md +157 -0
  81. package/docs/prompt-tasks/PROMPT_TASK_015_TRANSFER_RELEASE_HANDOFF.md +127 -0
  82. package/docs/prompt-tasks/PROMPT_TASK_016_CROSS_PLATFORM_MCP_AUTH_REGISTRATION.md +107 -0
  83. package/docs/prompt-tasks/PROMPT_TASK_018_NPM_PUBLISH_2FA_SETUP.md +80 -0
  84. package/docs/prompt-tasks/PROMPT_TASK_019_TOKEN_ECONOMY_GLOBAL_SKILLS.md +56 -0
  85. package/docs/prompt-tasks/PROMPT_TASK_MASTER_EXECUTOR.md +6 -0
  86. package/docs/skill-candidates/v0.0.10/cli-creator/LICENSE.txt +201 -201
  87. package/docs/skill-candidates/v0.0.10/cli-creator/SKILL.md +160 -160
  88. package/docs/skill-candidates/v0.0.10/cli-creator/agents/openai.yaml +4 -4
  89. package/docs/skill-candidates/v0.0.10/cli-creator/references/agent-cli-patterns.md +154 -154
  90. package/docs/skill-candidates/v0.0.10/developer-workstation-ops/SKILL.md +32 -32
  91. package/docs/skill-candidates/v0.0.10/figma/LICENSE.txt +1 -1
  92. package/docs/skill-candidates/v0.0.10/figma/SKILL.md +42 -42
  93. package/docs/skill-candidates/v0.0.10/figma/agents/openai.yaml +14 -14
  94. package/docs/skill-candidates/v0.0.10/figma/assets/figma-small.svg +3 -3
  95. package/docs/skill-candidates/v0.0.10/figma/assets/icon.svg +28 -28
  96. package/docs/skill-candidates/v0.0.10/figma/references/figma-mcp-config.md +35 -35
  97. package/docs/skill-candidates/v0.0.10/figma/references/figma-tools-and-prompts.md +34 -34
  98. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/LICENSE.TXT +1 -1
  99. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/SKILL.md +349 -349
  100. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/agents/openai.yaml +14 -14
  101. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/assets/figma-small.svg +3 -3
  102. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/assets/icon.svg +28 -28
  103. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/references/mapping-checklist.md +7 -7
  104. package/docs/skill-candidates/v0.0.10/figma-code-connect-components/scripts/normalize_node_id.py +25 -25
  105. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/LICENSE.TXT +1 -1
  106. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/SKILL.md +537 -537
  107. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/agents/openai.yaml +14 -14
  108. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/assets/figma-small.svg +3 -3
  109. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/assets/icon.svg +28 -28
  110. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/references/rule-template.md +15 -15
  111. package/docs/skill-candidates/v0.0.10/figma-create-design-system-rules/scripts/check_agents_md.sh +9 -9
  112. package/docs/skill-candidates/v0.0.10/figma-generate-design/LICENSE.TXT +1 -1
  113. package/docs/skill-candidates/v0.0.10/figma-generate-design/SKILL.md +341 -341
  114. package/docs/skill-candidates/v0.0.10/figma-generate-design/agents/openai.yaml +14 -14
  115. package/docs/skill-candidates/v0.0.10/figma-generate-design/assets/figma-small.svg +3 -3
  116. package/docs/skill-candidates/v0.0.10/figma-generate-design/assets/icon.svg +28 -28
  117. package/docs/skill-candidates/v0.0.10/figma-generate-design/maintainers.yml +1 -1
  118. package/docs/skill-candidates/v0.0.10/figma-generate-library/LICENSE.TXT +1 -1
  119. package/docs/skill-candidates/v0.0.10/figma-generate-library/SKILL.md +314 -314
  120. package/docs/skill-candidates/v0.0.10/figma-generate-library/agents/openai.yaml +14 -14
  121. package/docs/skill-candidates/v0.0.10/figma-generate-library/assets/figma-small.svg +3 -3
  122. package/docs/skill-candidates/v0.0.10/figma-generate-library/assets/icon.svg +28 -28
  123. package/docs/skill-candidates/v0.0.10/figma-generate-library/maintainers.yml +3 -3
  124. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/code-connect-setup.md +260 -260
  125. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/component-creation.md +1014 -1014
  126. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/discovery-phase.md +518 -518
  127. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/documentation-creation.md +834 -834
  128. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/error-recovery.md +540 -540
  129. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/naming-conventions.md +527 -527
  130. package/docs/skill-candidates/v0.0.10/figma-generate-library/references/token-creation.md +962 -962
  131. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/bindVariablesToComponent.js +110 -110
  132. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/cleanupOrphans.js +127 -127
  133. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createComponentWithVariants.js +148 -148
  134. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createDocumentationPage.js +139 -139
  135. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createSemanticTokens.js +108 -108
  136. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/createVariableCollection.js +49 -49
  137. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/inspectFileStructure.js +121 -121
  138. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/rehydrateState.js +92 -92
  139. package/docs/skill-candidates/v0.0.10/figma-generate-library/scripts/validateCreation.js +83 -83
  140. package/docs/skill-candidates/v0.0.10/figma-implement-design/LICENSE.txt +1 -1
  141. package/docs/skill-candidates/v0.0.10/figma-implement-design/SKILL.md +258 -258
  142. package/docs/skill-candidates/v0.0.10/figma-implement-design/agents/openai.yaml +14 -14
  143. package/docs/skill-candidates/v0.0.10/figma-implement-design/assets/figma-small.svg +3 -3
  144. package/docs/skill-candidates/v0.0.10/figma-implement-design/assets/icon.svg +28 -28
  145. package/docs/skill-candidates/v0.0.10/figma-use/LICENSE.TXT +1 -1
  146. package/docs/skill-candidates/v0.0.10/figma-use/SKILL.md +233 -233
  147. package/docs/skill-candidates/v0.0.10/figma-use/agents/openai.yaml +14 -14
  148. package/docs/skill-candidates/v0.0.10/figma-use/assets/figma-small.svg +3 -3
  149. package/docs/skill-candidates/v0.0.10/figma-use/assets/icon.svg +28 -28
  150. package/docs/skill-candidates/v0.0.10/figma-use/maintainers.yml +1 -1
  151. package/docs/skill-candidates/v0.0.10/figma-use/references/api-reference.md +301 -301
  152. package/docs/skill-candidates/v0.0.10/figma-use/references/common-patterns.md +512 -512
  153. package/docs/skill-candidates/v0.0.10/figma-use/references/component-patterns.md +488 -488
  154. package/docs/skill-candidates/v0.0.10/figma-use/references/effect-style-patterns.md +123 -123
  155. package/docs/skill-candidates/v0.0.10/figma-use/references/gotchas.md +599 -599
  156. package/docs/skill-candidates/v0.0.10/figma-use/references/maintainers.yml +12 -12
  157. package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-patterns.md +513 -513
  158. package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-standalone.d.ts +11293 -11293
  159. package/docs/skill-candidates/v0.0.10/figma-use/references/plugin-api-standalone.index.md +441 -441
  160. package/docs/skill-candidates/v0.0.10/figma-use/references/text-style-patterns.md +203 -203
  161. package/docs/skill-candidates/v0.0.10/figma-use/references/validation-and-recovery.md +109 -109
  162. package/docs/skill-candidates/v0.0.10/figma-use/references/variable-patterns.md +354 -354
  163. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/maintainers.yml +9 -9
  164. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components--creating.md +17 -17
  165. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components--using.md +17 -17
  166. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-components.md +50 -50
  167. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-effect-styles.md +52 -52
  168. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-text-styles.md +90 -90
  169. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables--creating.md +13 -13
  170. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables--using.md +13 -13
  171. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds-variables.md +64 -64
  172. package/docs/skill-candidates/v0.0.10/figma-use/references/working-with-design-systems/wwds.md +41 -41
  173. package/docs/skill-candidates/v0.0.10/frontend-design/LICENSE.txt +177 -177
  174. package/docs/skill-candidates/v0.0.10/frontend-design/SKILL.md +55 -55
  175. package/docs/skill-candidates/v0.0.10/frontend-ui-ux-systems/SKILL.md +32 -32
  176. package/docs/skill-candidates/v0.0.10/github/SKILL.md +74 -74
  177. package/docs/skill-candidates/v0.0.10/github/agents/openai.yaml +6 -6
  178. package/docs/skill-candidates/v0.0.10/github/assets/github-small.svg +3 -3
  179. package/docs/skill-candidates/v0.0.10/image-graphic-design-rendering/SKILL.md +28 -28
  180. package/docs/skill-candidates/v0.0.10/language-quality-pt-en-fr-it-ru/SKILL.md +28 -28
  181. package/docs/skill-candidates/v0.0.10/math-physics-reasoning/SKILL.md +28 -28
  182. package/docs/skill-candidates/v0.0.10/mcp-builder/LICENSE.txt +201 -201
  183. package/docs/skill-candidates/v0.0.10/mcp-builder/SKILL.md +236 -236
  184. package/docs/skill-candidates/v0.0.10/mcp-builder/reference/evaluation.md +601 -601
  185. package/docs/skill-candidates/v0.0.10/mcp-builder/reference/mcp_best_practices.md +249 -249
  186. package/docs/skill-candidates/v0.0.10/mcp-builder/reference/node_mcp_server.md +969 -969
  187. package/docs/skill-candidates/v0.0.10/mcp-builder/reference/python_mcp_server.md +718 -718
  188. package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/connections.py +151 -151
  189. package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/evaluation.py +373 -373
  190. package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/example_evaluation.xml +22 -22
  191. package/docs/skill-candidates/v0.0.10/mcp-builder/scripts/requirements.txt +2 -2
  192. package/docs/skill-candidates/v0.0.10/mcp-client-readiness/SKILL.md +31 -31
  193. package/docs/skill-candidates/v0.0.10/openai-docs/LICENSE.txt +201 -201
  194. package/docs/skill-candidates/v0.0.10/openai-docs/SKILL.md +161 -161
  195. package/docs/skill-candidates/v0.0.10/openai-docs/agents/openai.yaml +14 -14
  196. package/docs/skill-candidates/v0.0.10/openai-docs/assets/openai-small.svg +3 -3
  197. package/docs/skill-candidates/v0.0.10/openai-docs/references/latest-model.md +37 -37
  198. package/docs/skill-candidates/v0.0.10/openai-docs/references/prompting-guide.md +244 -244
  199. package/docs/skill-candidates/v0.0.10/openai-docs/references/upgrade-guide.md +181 -181
  200. package/docs/skill-candidates/v0.0.10/openai-docs/scripts/fetch-codex-manual.mjs +598 -598
  201. package/docs/skill-candidates/v0.0.10/openai-docs/scripts/resolve-latest-model-info.js +147 -147
  202. package/docs/skill-candidates/v0.0.10/playwright/NOTICE.txt +14 -14
  203. package/docs/skill-candidates/v0.0.10/playwright/SKILL.md +147 -147
  204. package/docs/skill-candidates/v0.0.10/playwright/agents/openai.yaml +6 -6
  205. package/docs/skill-candidates/v0.0.10/playwright/assets/playwright-small.svg +3 -3
  206. package/docs/skill-candidates/v0.0.10/playwright/references/cli.md +116 -116
  207. package/docs/skill-candidates/v0.0.10/playwright/references/workflows.md +95 -95
  208. package/docs/skill-candidates/v0.0.10/playwright/scripts/playwright_cli.sh +25 -25
  209. package/docs/skill-candidates/v0.0.10/polyglot-backend-engineering/SKILL.md +32 -32
  210. package/docs/skill-candidates/v0.0.10/screenshot/LICENSE.txt +201 -201
  211. package/docs/skill-candidates/v0.0.10/screenshot/SKILL.md +267 -267
  212. package/docs/skill-candidates/v0.0.10/screenshot/agents/openai.yaml +6 -6
  213. package/docs/skill-candidates/v0.0.10/screenshot/assets/screenshot-small.svg +5 -5
  214. package/docs/skill-candidates/v0.0.10/screenshot/scripts/ensure_macos_permissions.sh +54 -54
  215. package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_display_info.swift +22 -22
  216. package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_permissions.swift +40 -40
  217. package/docs/skill-candidates/v0.0.10/screenshot/scripts/macos_window_info.swift +126 -126
  218. package/docs/skill-candidates/v0.0.10/screenshot/scripts/take_screenshot.ps1 +163 -163
  219. package/docs/skill-candidates/v0.0.10/screenshot/scripts/take_screenshot.py +585 -585
  220. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/SKILL.md +62 -62
  221. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/agents/openai.yaml +4 -4
  222. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/activation-policy.md +77 -77
  223. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/human-approval-policy.md +83 -83
  224. package/docs/skill-candidates/v0.0.10/skill-master-orchestrator/references/persona-dev-senior-master.md +46 -46
  225. package/docs/skill-candidates/v0.0.10/terminal-menu-operations/SKILL.md +30 -30
  226. package/docs/skill-candidates/v0.0.10/terminal-pixel-art-tui/SKILL.md +43 -43
  227. package/docs/skill-candidates/v0.0.10/webapp-testing/LICENSE.txt +201 -201
  228. package/docs/skill-candidates/v0.0.10/webapp-testing/SKILL.md +95 -95
  229. package/docs/skill-candidates/v0.0.10/webapp-testing/examples/console_logging.py +34 -34
  230. package/docs/skill-candidates/v0.0.10/webapp-testing/examples/element_discovery.py +39 -39
  231. package/docs/skill-candidates/v0.0.10/webapp-testing/examples/static_html_automation.py +32 -32
  232. package/docs/skill-candidates/v0.0.10/webapp-testing/scripts/with_server.py +105 -105
  233. package/docs/skill-candidates/v0.0.10/winui-app/LICENSE.txt +201 -201
  234. package/docs/skill-candidates/v0.0.10/winui-app/SKILL.md +94 -94
  235. package/docs/skill-candidates/v0.0.10/winui-app/agents/openai.yaml +5 -5
  236. package/docs/skill-candidates/v0.0.10/winui-app/config.yaml +50 -50
  237. package/docs/skill-candidates/v0.0.10/winui-app/references/_sections.md +96 -96
  238. package/docs/skill-candidates/v0.0.10/winui-app/references/accessibility-input-and-localization.md +51 -51
  239. package/docs/skill-candidates/v0.0.10/winui-app/references/build-run-and-launch-verification.md +72 -72
  240. package/docs/skill-candidates/v0.0.10/winui-app/references/community-toolkit-controls-and-helpers.md +57 -57
  241. package/docs/skill-candidates/v0.0.10/winui-app/references/controls-layout-and-adaptive-ui.md +84 -84
  242. package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-environment-audit-and-remediation.md +82 -82
  243. package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-setup-and-project-selection.md +67 -67
  244. package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-template-first-recovery.md +62 -62
  245. package/docs/skill-candidates/v0.0.10/winui-app/references/foundation-winui-app-structure.md +62 -62
  246. package/docs/skill-candidates/v0.0.10/winui-app/references/motion-animations-and-polish.md +45 -45
  247. package/docs/skill-candidates/v0.0.10/winui-app/references/performance-diagnostics-and-responsiveness.md +46 -46
  248. package/docs/skill-candidates/v0.0.10/winui-app/references/sample-source-map.md +37 -37
  249. package/docs/skill-candidates/v0.0.10/winui-app/references/shell-navigation-and-windowing.md +67 -67
  250. package/docs/skill-candidates/v0.0.10/winui-app/references/styling-theming-materials-and-icons.md +71 -71
  251. package/docs/skill-candidates/v0.0.10/winui-app/references/testing-debugging-and-review-checklists.md +77 -77
  252. package/docs/skill-candidates/v0.0.10/winui-app/references/windows-app-sdk-lifecycle-notifications-and-deployment.md +52 -52
  253. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/SKILL.md +398 -398
  254. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/common-patterns.md +330 -330
  255. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/complete-examples.md +871 -871
  256. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/component-patterns.md +501 -501
  257. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/data-fetching.md +766 -766
  258. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/file-organization.md +501 -501
  259. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/loading-and-error-states.md +500 -500
  260. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/performance.md +405 -405
  261. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/routing-guide.md +363 -363
  262. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/styling-guide.md +427 -427
  263. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/typescript-standards.md +417 -417
  264. package/docs/skill-candidates/v0.0.11/git-version-control-ops/SKILL.md +34 -34
  265. package/docs/skill-candidates/v0.0.11/go-engineering/SKILL.md +34 -34
  266. package/docs/skill-candidates/v0.0.11/java-engineering/SKILL.md +34 -34
  267. package/docs/skill-candidates/v0.0.11/javascript-engineering/SKILL.md +34 -34
  268. package/docs/skill-candidates/v0.0.11/json-contract-design/SKILL.md +34 -34
  269. package/docs/skill-candidates/v0.0.11/multi-client-mcp-ops/SKILL.md +36 -36
  270. package/docs/skill-candidates/v0.0.11/nextjs/SKILL.md +745 -745
  271. package/docs/skill-candidates/v0.0.11/nextjs/agents/openai.yaml +3 -3
  272. package/docs/skill-candidates/v0.0.11/nextjs/references/app-router-files.md +94 -94
  273. package/docs/skill-candidates/v0.0.11/python-engineering/SKILL.md +34 -34
  274. package/docs/skill-candidates/v0.0.11/ruby-engineering/SKILL.md +34 -34
  275. package/docs/skill-candidates/v0.0.11/senior-fullstack/SKILL.md +209 -209
  276. package/docs/skill-candidates/v0.0.11/senior-fullstack/references/architecture_patterns.md +103 -103
  277. package/docs/skill-candidates/v0.0.11/senior-fullstack/references/development_workflows.md +103 -103
  278. package/docs/skill-candidates/v0.0.11/senior-fullstack/references/tech_stack_guide.md +103 -103
  279. package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/code_quality_analyzer.py +114 -114
  280. package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/fullstack_scaffolder.py +114 -114
  281. package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/project_scaffolder.py +114 -114
  282. package/docs/skill-candidates/v0.0.11/shadcn/SKILL.md +573 -573
  283. package/docs/skill-candidates/v0.0.11/shadcn/agents/openai.yaml +3 -3
  284. package/docs/skill-candidates/v0.0.11/sql-postgresql-engineering/SKILL.md +34 -34
  285. package/docs/skill-candidates/v0.0.11/terminal-shell-ops/SKILL.md +34 -34
  286. package/docs/skill-candidates/v0.0.11/typescript-expert/SKILL.md +429 -429
  287. package/docs/skill-candidates/v0.0.11/typescript-expert/references/tsconfig-strict.json +91 -91
  288. package/docs/skill-candidates/v0.0.11/typescript-expert/references/typescript-cheatsheet.md +383 -383
  289. package/docs/skill-candidates/v0.0.11/typescript-expert/references/utility-types.ts +335 -335
  290. package/docs/skill-candidates/v0.0.11/typescript-expert/scripts/ts_diagnostic.py +203 -203
  291. package/docs/skill-candidates/v0.0.11/ui-component-primitives/SKILL.md +34 -34
  292. package/docs/skill-candidates/v0.0.11/web-mobile-design-systems/SKILL.md +34 -34
  293. package/docs/skill-candidates/v0.0.11/windows-linux-platform-ops/SKILL.md +34 -34
  294. package/docs/skill-candidates/v0.0.12/context-compression-handoff/SKILL.md +47 -0
  295. package/docs/skill-candidates/v0.0.12/csharp-senior-master-engineering/SKILL.md +32 -0
  296. package/docs/skill-candidates/v0.0.12/css-senior-master-engineering/SKILL.md +32 -0
  297. package/docs/skill-candidates/v0.0.12/go-senior-master-engineering/SKILL.md +32 -0
  298. package/docs/skill-candidates/v0.0.12/html-senior-master-engineering/SKILL.md +32 -0
  299. package/docs/skill-candidates/v0.0.12/javascript-senior-master-engineering/SKILL.md +32 -0
  300. package/docs/skill-candidates/v0.0.12/json-senior-master-engineering/SKILL.md +32 -0
  301. package/docs/skill-candidates/v0.0.12/prompt-budget-gate/SKILL.md +46 -0
  302. package/docs/skill-candidates/v0.0.12/python-senior-master-engineering/SKILL.md +32 -0
  303. package/docs/skill-candidates/v0.0.12/react-senior-master-engineering/SKILL.md +32 -0
  304. package/docs/skill-candidates/v0.0.12/ruby-senior-master-engineering/SKILL.md +32 -0
  305. package/docs/skill-candidates/v0.0.12/senior-master-code-optimizer/SKILL.md +48 -0
  306. package/docs/skill-candidates/v0.0.12/sql-senior-master-engineering/SKILL.md +31 -0
  307. package/docs/skill-candidates/v0.0.12/token-economy-orchestrator/SKILL.md +38 -0
  308. package/docs/skill-candidates/v0.0.12/typescript-senior-master-engineering/SKILL.md +35 -0
  309. package/docs/skill-candidates/v0.0.9/ai-ethics-human-dignity/SKILL.md +32 -32
  310. package/docs/skill-candidates/v0.0.9/broad-domain-router/SKILL.md +41 -41
  311. package/docs/skill-candidates/v0.0.9/catholic-moral-discernment/SKILL.md +31 -31
  312. package/docs/skill-candidates/v0.0.9/engineering-systems-master/SKILL.md +31 -31
  313. package/docs/skill-candidates/v0.0.9/language-quality-pt-en-fr/SKILL.md +28 -28
  314. package/docs/skill-candidates/v0.0.9/math-science-reasoning/SKILL.md +29 -29
  315. package/docs/skill-candidates/v0.0.9/philosophy-sociology-discernment/SKILL.md +28 -28
  316. package/docs/skill-candidates/v0.0.9/professional-boundary-triage/SKILL.md +40 -40
  317. package/docs/skill-candidates/v0.0.9/release-ethics-gate/SKILL.md +32 -32
  318. package/docs/skill-candidates/v0.0.9/source-authority-reviewer/SKILL.md +31 -31
  319. package/examples/client-configs/claude-code.commands.md +21 -17
  320. package/examples/client-configs/claude-code.project.mcp.json +18 -18
  321. package/examples/client-configs/claude-desktop.macos.json +18 -18
  322. package/examples/client-configs/claude-desktop.windows.json +20 -20
  323. package/examples/client-configs/codex.windows.toml +11 -11
  324. package/examples/client-configs/gemini-code-assist.intellij.mcp.json +18 -18
  325. package/examples/client-configs/gemini.linux.settings.json +21 -21
  326. package/examples/client-configs/gemini.windows.settings.json +23 -23
  327. package/examples/client-configs/generic-stdio.json +16 -16
  328. package/manifests/channels/beta.json +26 -26
  329. package/manifests/channels/stable.json +27 -27
  330. package/network/approved-skills.json +54 -54
  331. package/network/unapproved-skill-candidates.json +110 -110
  332. package/package.json +87 -78
  333. package/scripts/configure-private-registry.mjs +208 -208
  334. package/scripts/lib/private-registry.mjs +97 -97
  335. package/scripts/render-menu-evidence.mjs +130 -0
  336. package/scripts/verify-menu-actions.mjs +117 -115
  337. package/sources.json +11 -11
@@ -0,0 +1,59 @@
1
+ export const OPERATION_EXIT_CODES = {
2
+ ok: 0,
3
+ warning: 10,
4
+ error: 20,
5
+ fatal: 30,
6
+ };
7
+
8
+ export function classifyOperationResult(code) {
9
+ const numericCode = Number.isFinite(Number(code)) ? Number(code) : 1;
10
+
11
+ if (numericCode === OPERATION_EXIT_CODES.ok) {
12
+ return { kind: 'ok', code: numericCode };
13
+ }
14
+
15
+ if (numericCode === OPERATION_EXIT_CODES.warning) {
16
+ return { kind: 'warning', code: numericCode };
17
+ }
18
+
19
+ if (numericCode >= OPERATION_EXIT_CODES.fatal) {
20
+ return { kind: 'fatal', code: numericCode };
21
+ }
22
+
23
+ return { kind: 'error', code: numericCode };
24
+ }
25
+
26
+ export function buildOperationResultCopy(code) {
27
+ const result = classifyOperationResult(code);
28
+
29
+ if (result.kind === 'ok') {
30
+ return {
31
+ kind: result.kind,
32
+ code: result.code,
33
+ frameTitle: 'result-ok',
34
+ heading: 'SUBROUTINE COMPLETE',
35
+ summary: 'Comando concluido com sucesso.',
36
+ next: 'workflow liberado para a proxima acao',
37
+ };
38
+ }
39
+
40
+ if (result.kind === 'warning') {
41
+ return {
42
+ kind: result.kind,
43
+ code: result.code,
44
+ frameTitle: 'result-warn',
45
+ heading: 'SUBROUTINE COMPLETE WITH WARNINGS',
46
+ summary: 'Comando concluido com avisos.',
47
+ next: 'workflow liberado, mas existe uma acao recomendada',
48
+ };
49
+ }
50
+
51
+ return {
52
+ kind: result.kind,
53
+ code: result.code,
54
+ frameTitle: 'result-error',
55
+ heading: 'SUBROUTINE FAILED',
56
+ summary: `Comando terminou com codigo ${result.code}.`,
57
+ next: 'verifique o log acima antes de continuar',
58
+ };
59
+ }
@@ -0,0 +1,247 @@
1
+ import path from 'node:path';
2
+ import process from 'node:process';
3
+ import { spawnSync } from 'node:child_process';
4
+ import { formatShellCommand } from './client-config.mjs';
5
+ import { OPERATION_EXIT_CODES } from './operation-result.mjs';
6
+
7
+ function trimOutput(value) {
8
+ return String(value ?? '').trim();
9
+ }
10
+
11
+ function normalizeProcessResult(result = {}) {
12
+ return {
13
+ status: Number.isInteger(result.status) ? result.status : null,
14
+ signal: result.signal ?? null,
15
+ stdout: trimOutput(result.stdout),
16
+ stderr: trimOutput(result.stderr),
17
+ error: result.error
18
+ ? {
19
+ code: result.error.code ?? null,
20
+ message: result.error.message ?? String(result.error),
21
+ }
22
+ : null,
23
+ };
24
+ }
25
+
26
+ function firstNonEmpty(values) {
27
+ return values.map((value) => trimOutput(value)).find(Boolean) ?? '';
28
+ }
29
+
30
+ function quoteDetail(label, value) {
31
+ return value ? `${label}: ${value}` : null;
32
+ }
33
+
34
+ function looksLikePath(command) {
35
+ return /[\\/]/.test(command) || path.isAbsolute(command);
36
+ }
37
+
38
+ function dedupe(values) {
39
+ return [...new Set(values.filter(Boolean))];
40
+ }
41
+
42
+ export function buildClaudeCodeCommandCandidates(command = 'claude', { platform = process.platform } = {}) {
43
+ const candidates = [command];
44
+ if (platform === 'win32' && !looksLikePath(command) && !command.toLowerCase().endsWith('.cmd')) {
45
+ candidates.push(`${command}.cmd`);
46
+ }
47
+ return dedupe(candidates);
48
+ }
49
+
50
+ export function runCapturedCommand(command, args, {
51
+ spawnSyncImpl = spawnSync,
52
+ env = process.env,
53
+ } = {}) {
54
+ return normalizeProcessResult(spawnSyncImpl(command, args, {
55
+ encoding: 'utf8',
56
+ env,
57
+ stdio: ['ignore', 'pipe', 'pipe'],
58
+ }));
59
+ }
60
+
61
+ export function resolveClaudeCodeCommand(command = 'claude', {
62
+ platform = process.platform,
63
+ spawnSyncImpl = spawnSync,
64
+ env = process.env,
65
+ } = {}) {
66
+ const candidates = buildClaudeCodeCommandCandidates(command, { platform });
67
+
68
+ for (const candidate of candidates) {
69
+ if (looksLikePath(candidate)) {
70
+ return {
71
+ found: true,
72
+ command: candidate,
73
+ source: 'explicit',
74
+ tried: candidates,
75
+ };
76
+ }
77
+
78
+ const lookupCommand = platform === 'win32' ? 'where' : 'which';
79
+ const lookupResult = runCapturedCommand(lookupCommand, [candidate], {
80
+ spawnSyncImpl,
81
+ env,
82
+ });
83
+
84
+ if (lookupResult.status === 0) {
85
+ const resolvedPath = firstNonEmpty(lookupResult.stdout.split(/\r?\n/));
86
+ return {
87
+ found: true,
88
+ command: resolvedPath || candidate,
89
+ source: lookupCommand,
90
+ tried: candidates,
91
+ };
92
+ }
93
+ }
94
+
95
+ return {
96
+ found: false,
97
+ command: null,
98
+ source: null,
99
+ tried: candidates,
100
+ };
101
+ }
102
+
103
+ function detectClaudeCodeFailureKind({ versionProbe, listProbe, addResult }) {
104
+ const errorCode = addResult.error?.code ?? listProbe.error?.code ?? versionProbe.error?.code ?? null;
105
+ const combinedOutput = [
106
+ versionProbe.stderr,
107
+ listProbe.stderr,
108
+ listProbe.stdout,
109
+ addResult.stderr,
110
+ addResult.stdout,
111
+ ].join('\n').toLowerCase();
112
+
113
+ if (errorCode === 'ENOENT') {
114
+ return 'cli-missing';
115
+ }
116
+
117
+ if (versionProbe.status !== 0) {
118
+ return 'cli-not-runnable';
119
+ }
120
+
121
+ if (
122
+ combinedOutput.includes('unknown command')
123
+ || combinedOutput.includes('command not found')
124
+ || combinedOutput.includes('invalid choice')
125
+ || combinedOutput.includes('no such command')
126
+ ) {
127
+ return 'mcp-subcommand-missing';
128
+ }
129
+
130
+ if (listProbe.status !== 0) {
131
+ return 'mcp-list-failed';
132
+ }
133
+
134
+ return 'registration-failed';
135
+ }
136
+
137
+ export function classifyClaudeCodeResult({
138
+ attemptedCommand,
139
+ addArgs,
140
+ versionProbe,
141
+ listProbe,
142
+ addResult,
143
+ }) {
144
+ const manualCommand = formatShellCommand(attemptedCommand, addArgs);
145
+
146
+ if (addResult.status === 0) {
147
+ return {
148
+ key: 'claude-code',
149
+ client: 'Claude Code',
150
+ status: 'ok',
151
+ message: `Claude Code registered via ${manualCommand}`,
152
+ next: null,
153
+ };
154
+ }
155
+
156
+ const kind = detectClaudeCodeFailureKind({ versionProbe, listProbe, addResult });
157
+ const summaryOutput = firstNonEmpty([
158
+ addResult.stderr,
159
+ addResult.stdout,
160
+ listProbe.stderr,
161
+ listProbe.stdout,
162
+ versionProbe.stderr,
163
+ versionProbe.stdout,
164
+ ]);
165
+ const details = [
166
+ versionProbe.status === 0
167
+ ? quoteDetail('CLI', firstNonEmpty([versionProbe.stdout, 'ok']))
168
+ : quoteDetail('CLI probe', versionProbe.error?.message ?? `codigo ${versionProbe.status ?? 'unknown'}`),
169
+ listProbe.status === 0
170
+ ? quoteDetail('MCP list', 'ok')
171
+ : quoteDetail('MCP list', listProbe.error?.message ?? `codigo ${listProbe.status ?? 'unknown'}`),
172
+ addResult.error
173
+ ? quoteDetail('Add error', addResult.error.message)
174
+ : quoteDetail('Add exit', String(addResult.status ?? 'unknown')),
175
+ summaryOutput ? quoteDetail('Detalhe', summaryOutput) : null,
176
+ ].filter(Boolean);
177
+
178
+ let message;
179
+ if (kind === 'cli-missing') {
180
+ message = `Claude Code CLI nao encontrado. Registro manual pendente: ${manualCommand}`;
181
+ } else if (kind === 'cli-not-runnable') {
182
+ message = `Claude Code CLI encontrado, mas nao executou corretamente. ${details.join(' | ')}`;
183
+ } else if (kind === 'mcp-subcommand-missing') {
184
+ message = `Claude Code CLI encontrado, mas o subcomando MCP nao respondeu como esperado. ${details.join(' | ')}`;
185
+ } else if (kind === 'mcp-list-failed') {
186
+ message = `Claude Code CLI encontrado, mas 'claude mcp list' falhou antes do registro. ${details.join(' | ')}`;
187
+ } else {
188
+ message = `Claude Code CLI encontrado, mas o registro falhou. ${details.join(' | ')}`;
189
+ }
190
+
191
+ return {
192
+ key: 'claude-code',
193
+ client: 'Claude Code',
194
+ status: 'warning',
195
+ message,
196
+ next: `Execute manualmente: ${manualCommand}`,
197
+ diagnostic: kind,
198
+ };
199
+ }
200
+
201
+ export function determineRegistrationExitCode(results, {
202
+ applyAll = false,
203
+ selectedClients = [],
204
+ } = {}) {
205
+ if (results.some((result) => result.status === 'fatal')) {
206
+ return OPERATION_EXIT_CODES.fatal;
207
+ }
208
+
209
+ if (results.some((result) => result.status === 'error')) {
210
+ return OPERATION_EXIT_CODES.error;
211
+ }
212
+
213
+ const warnings = results.filter((result) => result.status === 'warning');
214
+ if (!warnings.length) {
215
+ return OPERATION_EXIT_CODES.ok;
216
+ }
217
+
218
+ const onlyClaudeCodeSelected = selectedClients.length === 1 && selectedClients[0] === 'claude-code';
219
+ if (onlyClaudeCodeSelected) {
220
+ return OPERATION_EXIT_CODES.error;
221
+ }
222
+
223
+ const warningKeys = new Set(warnings.map((result) => result.key));
224
+ const successCount = results.filter((result) => result.status === 'ok').length;
225
+
226
+ if (applyAll && successCount > 0 && warningKeys.size === 1 && warningKeys.has('claude-code')) {
227
+ return OPERATION_EXIT_CODES.warning;
228
+ }
229
+
230
+ return OPERATION_EXIT_CODES.error;
231
+ }
232
+
233
+ export function summarizeRegistrationResults(results, exitCode) {
234
+ const next = results.map((result) => result.next).find(Boolean) ?? 'reinicie os clientes MCP apos o registro';
235
+
236
+ return {
237
+ result: exitCode === OPERATION_EXIT_CODES.ok
238
+ ? 'ok'
239
+ : exitCode === OPERATION_EXIT_CODES.warning
240
+ ? 'warning'
241
+ : 'error',
242
+ applied: results.filter((result) => result.status === 'ok').length,
243
+ warnings: results.filter((result) => result.status === 'warning').length,
244
+ failed: results.filter((result) => result.status === 'error' || result.status === 'fatal').length,
245
+ next,
246
+ };
247
+ }
@@ -0,0 +1,215 @@
1
+ import {
2
+ cpSync,
3
+ existsSync,
4
+ mkdirSync,
5
+ readFileSync,
6
+ readdirSync,
7
+ writeFileSync,
8
+ } from 'node:fs';
9
+ import path from 'node:path';
10
+
11
+ export const DEFAULT_PROJECT_SKILL_ROOTS = [
12
+ '.agents/skills',
13
+ '.codex/skills',
14
+ '.claude/skills',
15
+ '.gemini/skills',
16
+ ];
17
+
18
+ export function listSkillSources(sourcePath) {
19
+ const entries = readdirSync(sourcePath, { withFileTypes: true });
20
+ const directSkills = entries
21
+ .filter((entry) => entry.isDirectory() && existsSync(path.join(sourcePath, entry.name, 'SKILL.md')))
22
+ .map((entry) => ({ name: entry.name, path: path.join(sourcePath, entry.name) }));
23
+
24
+ if (directSkills.length) {
25
+ return directSkills.sort((left, right) => left.name.localeCompare(right.name));
26
+ }
27
+
28
+ return entries
29
+ .filter((entry) => entry.isDirectory())
30
+ .flatMap((entry) => {
31
+ const versionPath = path.join(sourcePath, entry.name);
32
+ return readdirSync(versionPath, { withFileTypes: true })
33
+ .filter((skillEntry) => skillEntry.isDirectory() && existsSync(path.join(versionPath, skillEntry.name, 'SKILL.md')))
34
+ .map((skillEntry) => ({ name: skillEntry.name, path: path.join(versionPath, skillEntry.name) }));
35
+ })
36
+ .sort((left, right) => left.name.localeCompare(right.name));
37
+ }
38
+
39
+ export function parseRootList(value) {
40
+ return String(value ?? '')
41
+ .split(',')
42
+ .map((entry) => entry.trim())
43
+ .filter(Boolean);
44
+ }
45
+
46
+ export function normalizeProjectSkillRoots(projectRoot, roots = DEFAULT_PROJECT_SKILL_ROOTS) {
47
+ const uniqueRoots = Array.from(new Set(roots.map((root) => {
48
+ const normalized = root.replace(/\\/g, '/');
49
+ return path.isAbsolute(normalized) ? normalized : normalized.replace(/^\.\//, '');
50
+ })));
51
+ return uniqueRoots.map((root) => ({
52
+ relative: root,
53
+ absolute: path.isAbsolute(root) ? root : path.resolve(projectRoot, root),
54
+ }));
55
+ }
56
+
57
+ export function installSkillsToTarget({ skills, target, overwrite = false, dryRun = false }) {
58
+ if (!dryRun) {
59
+ mkdirSync(target, { recursive: true });
60
+ }
61
+
62
+ const installed = [];
63
+ const skipped = [];
64
+
65
+ for (const skill of skills) {
66
+ const destination = path.join(target, skill.name);
67
+ if (existsSync(destination) && !overwrite) {
68
+ skipped.push(skill.name);
69
+ continue;
70
+ }
71
+
72
+ if (!dryRun) {
73
+ cpSync(skill.path, destination, { recursive: true, force: overwrite });
74
+ }
75
+ installed.push(skill.name);
76
+ }
77
+
78
+ return { target, installed, skipped };
79
+ }
80
+
81
+ export function buildProjectSkillCatalog({
82
+ projectRoot,
83
+ skillRoots,
84
+ skills,
85
+ packageName,
86
+ packageVersion,
87
+ }) {
88
+ return {
89
+ schemaVersion: 1,
90
+ generatedAt: new Date().toISOString(),
91
+ packageName,
92
+ packageVersion,
93
+ projectRoot,
94
+ skillRoots: skillRoots.map((root) => root.relative),
95
+ skillCount: Array.from(new Set(skills.map((skill) => skill.name))).length,
96
+ skills: Array.from(new Set(skills.map((skill) => skill.name))).sort(),
97
+ };
98
+ }
99
+
100
+ export function writeProjectSkillCatalog({ projectRoot, catalog, catalogPath = '.skill-master/catalog.json', dryRun = false }) {
101
+ const absolutePath = path.isAbsolute(catalogPath)
102
+ ? catalogPath
103
+ : path.resolve(projectRoot, catalogPath);
104
+
105
+ if (!dryRun) {
106
+ mkdirSync(path.dirname(absolutePath), { recursive: true });
107
+ writeFileSync(absolutePath, `${JSON.stringify(catalog, null, 2)}\n`, 'utf8');
108
+ }
109
+
110
+ return absolutePath;
111
+ }
112
+
113
+ export function syncProjectPackageJson({
114
+ projectRoot,
115
+ skillRoots,
116
+ catalogPath = '.skill-master/catalog.json',
117
+ packageName,
118
+ packageVersion,
119
+ createIfMissing = false,
120
+ dryRun = false,
121
+ }) {
122
+ const packageJsonPath = path.join(projectRoot, 'package.json');
123
+ const packageJsonExists = existsSync(packageJsonPath);
124
+
125
+ if (!packageJsonExists && !createIfMissing) {
126
+ return { path: packageJsonPath, status: 'missing' };
127
+ }
128
+
129
+ const current = packageJsonExists
130
+ ? JSON.parse(readFileSync(packageJsonPath, 'utf8'))
131
+ : { private: true };
132
+
133
+ const scripts = current.scripts && typeof current.scripts === 'object' ? current.scripts : {};
134
+ const installScript = 'skill-master-install-project-skills --sync-package-json';
135
+
136
+ const next = {
137
+ ...current,
138
+ scripts: {
139
+ ...scripts,
140
+ 'skill-master:install-project-skills': scripts['skill-master:install-project-skills'] ?? installScript,
141
+ },
142
+ skillMaster: {
143
+ ...(current.skillMaster && typeof current.skillMaster === 'object' ? current.skillMaster : {}),
144
+ package: packageName,
145
+ packageVersion,
146
+ projectSkillRoots: skillRoots.map((root) => root.relative),
147
+ projectSkillCatalog: catalogPath,
148
+ installCommand: installScript,
149
+ },
150
+ };
151
+
152
+ if (!dryRun) {
153
+ writeFileSync(packageJsonPath, `${JSON.stringify(next, null, 2)}\n`, 'utf8');
154
+ }
155
+
156
+ if (dryRun) {
157
+ return { path: packageJsonPath, status: packageJsonExists ? 'would-update' : 'would-create' };
158
+ }
159
+
160
+ return { path: packageJsonPath, status: packageJsonExists ? 'updated' : 'created' };
161
+ }
162
+
163
+ export function installProjectSkills({
164
+ source,
165
+ projectRoot,
166
+ roots = DEFAULT_PROJECT_SKILL_ROOTS,
167
+ overwrite = false,
168
+ dryRun = false,
169
+ writeCatalog = true,
170
+ syncPackageJson = true,
171
+ createPackageJson = false,
172
+ catalogPath = '.skill-master/catalog.json',
173
+ packageName,
174
+ packageVersion,
175
+ }) {
176
+ const skills = listSkillSources(source);
177
+ const skillRoots = normalizeProjectSkillRoots(projectRoot, roots);
178
+ const targets = skillRoots.map((root) => installSkillsToTarget({
179
+ skills,
180
+ target: root.absolute,
181
+ overwrite,
182
+ dryRun,
183
+ }));
184
+ const catalog = buildProjectSkillCatalog({
185
+ projectRoot,
186
+ skillRoots,
187
+ skills,
188
+ packageName,
189
+ packageVersion,
190
+ });
191
+ const writtenCatalogPath = writeCatalog
192
+ ? writeProjectSkillCatalog({ projectRoot, catalog, catalogPath, dryRun })
193
+ : null;
194
+ const packageJson = syncPackageJson
195
+ ? syncProjectPackageJson({
196
+ projectRoot,
197
+ skillRoots,
198
+ catalogPath,
199
+ packageName,
200
+ packageVersion,
201
+ createIfMissing: createPackageJson,
202
+ dryRun,
203
+ })
204
+ : { path: path.join(projectRoot, 'package.json'), status: 'skipped' };
205
+
206
+ return {
207
+ source,
208
+ projectRoot,
209
+ roots: skillRoots,
210
+ skills,
211
+ targets,
212
+ catalogPath: writtenCatalogPath,
213
+ packageJson,
214
+ };
215
+ }
@@ -0,0 +1,117 @@
1
+ import { existsSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import process from 'node:process';
4
+ import { formatShellCommand } from './client-config.mjs';
5
+ import { OPERATION_EXIT_CODES } from './operation-result.mjs';
6
+
7
+ export const DEFAULT_UPDATE_PACKAGE = '@fprad0/skill-master-mcp@latest';
8
+ export const DEFAULT_UPDATE_REGISTRY = 'https://registry.npmjs.org';
9
+
10
+ export function readOption(args, name, fallback) {
11
+ const index = args.indexOf(name);
12
+ if (index === -1) {
13
+ return fallback;
14
+ }
15
+
16
+ return args[index + 1] || fallback;
17
+ }
18
+
19
+ export function buildInstallArgs(args) {
20
+ const packageName = readOption(args, '--package', DEFAULT_UPDATE_PACKAGE);
21
+ const registry = readOption(args, '--registry', DEFAULT_UPDATE_REGISTRY);
22
+ return ['install', '-g', packageName, `--registry=${registry}`];
23
+ }
24
+
25
+ export function resolveNpmExecutable({
26
+ platform = process.platform,
27
+ nodeExecPath = process.execPath,
28
+ env = process.env,
29
+ existsSyncImpl = existsSync,
30
+ } = {}) {
31
+ if (platform !== 'win32') {
32
+ return {
33
+ command: 'npm',
34
+ argsPrefix: [],
35
+ displayCommand: 'npm',
36
+ source: 'path',
37
+ };
38
+ }
39
+
40
+ const envNpmExecPath = env.npm_execpath;
41
+ if (envNpmExecPath && existsSyncImpl(envNpmExecPath)) {
42
+ return {
43
+ command: nodeExecPath,
44
+ argsPrefix: [envNpmExecPath],
45
+ displayCommand: 'npm',
46
+ source: 'npm_execpath',
47
+ };
48
+ }
49
+
50
+ const siblingNpmCli = path.join(path.dirname(nodeExecPath), 'node_modules', 'npm', 'bin', 'npm-cli.js');
51
+ if (existsSyncImpl(siblingNpmCli)) {
52
+ return {
53
+ command: nodeExecPath,
54
+ argsPrefix: [siblingNpmCli],
55
+ displayCommand: 'npm',
56
+ source: 'bundled-cli',
57
+ };
58
+ }
59
+
60
+ return {
61
+ command: 'cmd.exe',
62
+ argsPrefix: ['/d', '/s', '/c', 'npm.cmd'],
63
+ displayCommand: 'npm',
64
+ source: 'cmd-wrapper',
65
+ };
66
+ }
67
+
68
+ export function isInstalledGlobalPackageExecution(scriptPath, {
69
+ platform = process.platform,
70
+ } = {}) {
71
+ if (platform !== 'win32') {
72
+ return false;
73
+ }
74
+
75
+ const normalized = String(scriptPath ?? '').replace(/\\/g, '/').toLowerCase();
76
+ return normalized.includes('/node_modules/@fprad0/skill-master-mcp/');
77
+ }
78
+
79
+ export function buildUpdateCommandPreview(commandInfo, installArgs) {
80
+ return formatShellCommand(commandInfo.displayCommand ?? commandInfo.command, installArgs);
81
+ }
82
+
83
+ export function shouldBlockDirectUpdate({
84
+ platform = process.platform,
85
+ scriptPath,
86
+ forceDirect = false,
87
+ } = {}) {
88
+ if (forceDirect) {
89
+ return false;
90
+ }
91
+
92
+ return platform === 'win32' && isInstalledGlobalPackageExecution(scriptPath, { platform });
93
+ }
94
+
95
+ export function buildBlockedUpdateMessage(commandPreview) {
96
+ return [
97
+ 'A atualizacao exige que o processo atual seja encerrado antes da troca do pacote.',
98
+ 'O pacote global parece estar em uso nesta execucao do Windows.',
99
+ `Execute fora do menu: ${commandPreview}`,
100
+ 'Feche o menu e reinicie os clientes MCP depois da atualizacao.',
101
+ ].join('\n');
102
+ }
103
+
104
+ export function classifyUpdateFailure(output, exitCode) {
105
+ const normalized = String(output ?? '').toLowerCase();
106
+ if (normalized.includes('ebusy') || normalized.includes('resource busy or locked')) {
107
+ return {
108
+ exitCode: OPERATION_EXIT_CODES.error,
109
+ message: 'O pacote esta em uso neste momento. Feche o menu ou o cliente MCP e rode o update fora desta execucao.',
110
+ };
111
+ }
112
+
113
+ return {
114
+ exitCode: Number.isInteger(exitCode) ? exitCode : 1,
115
+ message: null,
116
+ };
117
+ }