@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
@@ -1,320 +1,406 @@
1
- #!/usr/bin/env node
2
-
3
- import prompts from 'prompts';
4
- import readline from 'node:readline';
5
- import { dirname } from 'node:path';
6
- import { fileURLToPath } from 'node:url';
7
- import {
8
- buildMenuCommands,
9
- formatActionHeader,
10
- formatCyberMenuFrame,
11
- formatHelp,
12
- formatRunningActionFrame,
13
- formatResultMessage,
14
- formatStatusReport,
15
- getMenuStatus,
16
- isInteractiveTerminal,
17
- resolveActionKey,
18
- runCommand,
19
- } from './lib/menu-core.mjs';
20
-
21
- const currentFile = fileURLToPath(import.meta.url);
22
- const rootDir = dirname(dirname(currentFile));
23
- const commands = buildMenuCommands({ rootDir, currentFile });
24
- readline.emitKeypressEvents(process.stdin);
25
- const CONTROL = {
26
- alternateScreenIn: '\x1b[?1049h',
27
- alternateScreenOut: '\x1b[?1049l',
28
- hideCursor: '\x1b[?25l',
29
- showCursor: '\x1b[?25h',
30
- cursorHome: '\x1b[H',
31
- clearScreen: '\x1b[2J',
32
- clearToEnd: '\x1b[0J',
33
- reset: '\x1b[0m',
34
- syncStart: '\x1b[?2026h',
35
- syncEnd: '\x1b[?2026l',
36
- };
37
-
38
- function parseArgs(argv) {
39
- const parsed = {
40
- help: false,
41
- status: false,
42
- yes: false,
43
- run: null,
44
- };
45
-
46
- for (let i = 0; i < argv.length; i += 1) {
47
- const arg = argv[i];
48
- switch (arg) {
49
- case '--help':
50
- case '-h':
51
- parsed.help = true;
52
- break;
53
- case '--status':
54
- parsed.status = true;
55
- break;
56
- case '--yes':
57
- parsed.yes = true;
58
- break;
59
- case '--run':
60
- parsed.run = argv[++i] ?? null;
61
- break;
62
- default:
63
- throw new Error(`Unknown argument: ${arg}`);
64
- }
65
- }
66
-
67
- return parsed;
68
- }
69
-
70
- function printHelp() {
71
- console.log(formatHelp(commands));
72
- }
73
-
74
- function printStatus() {
75
- console.log(formatStatusReport(getMenuStatus(rootDir)));
76
- }
77
-
78
- async function runSelectedAction(action, { yes = false, useColor = false } = {}) {
79
- if (action.disabledReason) {
80
- throw new Error(`Action ${action.key} is unavailable here: ${action.disabledReason}`);
81
- }
82
-
83
- if (action.confirmMessage && !yes) {
84
- if (!isInteractiveTerminal()) {
85
- throw new Error(`Action ${action.key} requires --yes outside an interactive terminal.`);
86
- }
87
-
88
- const confirmation = await prompts({
89
- type: 'confirm',
90
- name: 'confirmed',
91
- message: action.confirmMessage,
92
- initial: false,
93
- });
94
-
95
- if (!confirmation.confirmed) {
96
- return { cancelled: true, code: 0 };
97
- }
98
- }
99
-
100
- console.log('');
101
- console.log(formatActionHeader(action, { useColor }));
102
- console.log('');
103
- const code = await runCommand(action, { cwd: rootDir });
104
- console.log('');
105
- console.log(formatResultMessage(code, { useColor }));
106
- return { cancelled: false, code };
107
- }
108
-
109
- const readKey = () => new Promise((resolve) => {
110
- process.stdin.once('keypress', (_str, key) => resolve(key));
111
- });
112
-
113
- function createKeyReader() {
114
- const queue = [];
115
- const waiters = [];
116
- const onKeypress = (_str, key) => {
117
- const waiter = waiters.shift();
118
- if (waiter) {
119
- clearTimeout(waiter.timer);
120
- waiter.resolve(key);
121
- return;
122
- }
123
- queue.push(key);
124
- };
125
-
126
- process.stdin.on('keypress', onKeypress);
127
-
128
- return {
129
- read(timeoutMs) {
130
- if (queue.length) return Promise.resolve(queue.shift());
131
- return new Promise((resolve) => {
132
- const waiter = {
133
- resolve,
134
- timer: setTimeout(() => {
135
- const index = waiters.indexOf(waiter);
136
- if (index >= 0) waiters.splice(index, 1);
137
- resolve(null);
138
- }, timeoutMs),
139
- };
140
- waiters.push(waiter);
141
- });
142
- },
143
- close() {
144
- for (const waiter of waiters.splice(0)) {
145
- clearTimeout(waiter.timer);
146
- waiter.resolve(null);
147
- }
148
- process.stdin.off('keypress', onKeypress);
149
- },
150
- };
151
- }
152
-
153
- function setRawInput(enabled) {
154
- if (typeof process.stdin.setRawMode === 'function') {
155
- process.stdin.setRawMode(enabled);
156
- }
157
- if (enabled) process.stdin.resume();
158
- }
159
-
160
- function restoreMenuInput() {
161
- setRawInput(true);
162
- process.stdin.resume();
163
- }
164
-
165
- function enterVisualScreen() {
166
- process.stdout.write(`${CONTROL.alternateScreenIn}${CONTROL.hideCursor}${CONTROL.clearScreen}${CONTROL.cursorHome}`);
167
- }
168
-
169
- function leaveVisualScreen() {
170
- process.stdout.write(`${CONTROL.reset}${CONTROL.showCursor}${CONTROL.alternateScreenOut}`);
171
- }
172
-
173
- function writeStableFrame(frame, { clear = false } = {}) {
174
- const prefix = clear ? CONTROL.clearScreen : '';
175
- process.stdout.write([
176
- CONTROL.syncStart,
177
- CONTROL.cursorHome,
178
- prefix,
179
- frame,
180
- '\n',
181
- CONTROL.clearToEnd,
182
- CONTROL.syncEnd,
183
- ].join(''));
184
- }
185
-
186
- function renderCyberMenu(selectedIndex, tick, { clear = false } = {}) {
187
- const status = getMenuStatus(rootDir);
188
- const frame = formatCyberMenuFrame(status, commands, selectedIndex, tick, {
189
- columns: process.stdout.columns ?? 120,
190
- rows: process.stdout.rows ?? 32,
191
- useColor: true,
192
- });
193
- writeStableFrame(frame, { clear });
194
- }
195
-
196
- function renderRunningAction(action, tick) {
197
- const status = getMenuStatus(rootDir);
198
- const frame = formatRunningActionFrame(status, action, tick, {
199
- columns: process.stdout.columns ?? 120,
200
- rows: process.stdout.rows ?? 32,
201
- useColor: true,
202
- });
203
- writeStableFrame(frame, { clear: true });
204
- }
205
-
206
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
207
-
208
- async function waitForAnyKey(message = 'Pressione qualquer tecla para voltar ao menu...') {
209
- process.stdout.write(`\n${message}`);
210
- setRawInput(true);
211
- await readKey();
212
- setRawInput(false);
213
- }
214
-
215
- async function runVisualMenu() {
216
- let selectedIndex = 0;
217
- let tick = 0;
218
- let lastCode = 0;
219
- let keyReader = createKeyReader();
220
- let previousColumns = process.stdout.columns ?? 120;
221
- let previousRows = process.stdout.rows ?? 32;
222
- let needsClear = true;
223
-
224
- enterVisualScreen();
225
- restoreMenuInput();
226
-
227
- try {
228
- while (true) {
229
- const columns = process.stdout.columns ?? 120;
230
- const rows = process.stdout.rows ?? 32;
231
- const resized = columns !== previousColumns || rows !== previousRows;
232
- previousColumns = columns;
233
- previousRows = rows;
234
- renderCyberMenu(selectedIndex, tick, { clear: needsClear || resized });
235
- needsClear = false;
236
- const key = await keyReader.read(240);
237
-
238
- if (!key) {
239
- tick += 1;
240
- continue;
241
- }
242
-
243
- if (key.ctrl && key.name === 'c') return 130;
244
- if (key.name === 'escape' || key.name === 'q') return lastCode;
245
- if (key.name === 'up' || key.name === 'k') {
246
- selectedIndex = selectedIndex === 0 ? commands.length - 1 : selectedIndex - 1;
247
- continue;
248
- }
249
- if (key.name === 'down' || key.name === 'j') {
250
- selectedIndex = selectedIndex === commands.length - 1 ? 0 : selectedIndex + 1;
251
- continue;
252
- }
253
- if (key.name === 'return' || key.name === 'enter') {
254
- const action = commands[selectedIndex];
255
- keyReader.close();
256
- renderRunningAction(action, tick);
257
- await sleep(180);
258
- setRawInput(false);
259
- leaveVisualScreen();
260
- try {
261
- const result = await runSelectedAction(action, { useColor: true });
262
- lastCode = result.code;
263
- } catch (error) {
264
- const message = error instanceof Error ? error.message : String(error);
265
- process.stderr.write(`[skill_master] ${message}\n`);
266
- lastCode = 1;
267
- }
268
- await waitForAnyKey();
269
- keyReader = createKeyReader();
270
- restoreMenuInput();
271
- enterVisualScreen();
272
- needsClear = true;
273
- }
274
- }
275
- } finally {
276
- keyReader.close();
277
- setRawInput(false);
278
- process.stdin.pause();
279
- leaveVisualScreen();
280
- }
281
- }
282
-
283
- async function main() {
284
- const args = parseArgs(process.argv.slice(2));
285
-
286
- if (args.help) {
287
- printHelp();
288
- return 0;
289
- }
290
-
291
- if (args.status) {
292
- printStatus();
293
- return 0;
294
- }
295
-
296
- if (args.run) {
297
- const actionKey = resolveActionKey(args.run, commands);
298
- if (!actionKey) {
299
- throw new Error(`Unknown action: ${args.run}`);
300
- }
301
-
302
- const action = commands.find((entry) => entry.key === actionKey);
303
- const result = await runSelectedAction(action, { yes: args.yes, useColor: isInteractiveTerminal() });
304
- return result.code;
305
- }
306
-
307
- if (!isInteractiveTerminal()) {
308
- throw new Error('Interactive menu requires a TTY. Use --run <acao> or --status in automated environments.');
309
- }
310
-
311
- return runVisualMenu();
312
- }
313
-
314
- try {
315
- process.exitCode = await main();
316
- } catch (error) {
317
- const message = error instanceof Error ? error.message : String(error);
318
- process.stderr.write(`[skill_master] ${message}\n`);
319
- process.exitCode = 1;
320
- }
1
+ #!/usr/bin/env node
2
+
3
+ import prompts from 'prompts';
4
+ import readline from 'node:readline';
5
+ import { dirname } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import {
8
+ buildMenuCommands,
9
+ formatActionHeader,
10
+ formatCyberConfirmFrame,
11
+ formatCyberMenuFrame,
12
+ formatHelp,
13
+ formatRunningActionFrame,
14
+ formatResultMessage,
15
+ formatSkillMasterIntroFrame,
16
+ formatStatusReport,
17
+ getMenuStatus,
18
+ isInteractiveTerminal,
19
+ resolveActionKey,
20
+ resolveInitialSelectedIndex,
21
+ runCommand,
22
+ } from './lib/menu-core.mjs';
23
+
24
+ const currentFile = fileURLToPath(import.meta.url);
25
+ const rootDir = dirname(dirname(currentFile));
26
+ const invocationCwd = process.cwd();
27
+ const commands = buildMenuCommands({ rootDir, currentFile, invocationCwd });
28
+ readline.emitKeypressEvents(process.stdin);
29
+ const CONTROL = {
30
+ alternateScreenIn: '\x1b[?1049h',
31
+ alternateScreenOut: '\x1b[?1049l',
32
+ hideCursor: '\x1b[?25l',
33
+ showCursor: '\x1b[?25h',
34
+ cursorHome: '\x1b[H',
35
+ clearScreen: '\x1b[2J',
36
+ clearToEnd: '\x1b[0J',
37
+ reset: '\x1b[0m',
38
+ syncStart: '\x1b[?2026h',
39
+ syncEnd: '\x1b[?2026l',
40
+ };
41
+
42
+ function parseArgs(argv) {
43
+ const parsed = {
44
+ help: false,
45
+ status: false,
46
+ yes: false,
47
+ run: null,
48
+ };
49
+
50
+ for (let i = 0; i < argv.length; i += 1) {
51
+ const arg = argv[i];
52
+ switch (arg) {
53
+ case '--help':
54
+ case '-h':
55
+ parsed.help = true;
56
+ break;
57
+ case '--status':
58
+ parsed.status = true;
59
+ break;
60
+ case '--yes':
61
+ parsed.yes = true;
62
+ break;
63
+ case '--run':
64
+ parsed.run = argv[++i] ?? null;
65
+ break;
66
+ default:
67
+ throw new Error(`Unknown argument: ${arg}`);
68
+ }
69
+ }
70
+
71
+ return parsed;
72
+ }
73
+
74
+ function printHelp() {
75
+ console.log(formatHelp(commands));
76
+ }
77
+
78
+ function printStatus() {
79
+ console.log(formatStatusReport(getMenuStatus(rootDir)));
80
+ }
81
+
82
+ async function runSelectedAction(action, { yes = false, useColor = false } = {}) {
83
+ if (action.disabledReason) {
84
+ throw new Error(`Action ${action.key} is unavailable here: ${action.disabledReason}`);
85
+ }
86
+
87
+ if (action.confirmMessage && !yes) {
88
+ if (!isInteractiveTerminal()) {
89
+ throw new Error(`Action ${action.key} requires --yes outside an interactive terminal.`);
90
+ }
91
+
92
+ const confirmation = await prompts({
93
+ type: 'confirm',
94
+ name: 'confirmed',
95
+ message: action.confirmMessage,
96
+ initial: false,
97
+ });
98
+
99
+ if (!confirmation.confirmed) {
100
+ return { cancelled: true, code: 0 };
101
+ }
102
+ }
103
+
104
+ console.log('');
105
+ console.log(formatActionHeader(action, { useColor }));
106
+ console.log('');
107
+ const code = await runCommand(action, { cwd: action.cwd ?? rootDir });
108
+ console.log('');
109
+ console.log(formatResultMessage(code, { useColor }));
110
+ return { cancelled: false, code };
111
+ }
112
+
113
+ const readKey = () => new Promise((resolve) => {
114
+ process.stdin.once('keypress', (_str, key) => resolve(key));
115
+ });
116
+
117
+ function createKeyReader() {
118
+ const queue = [];
119
+ const waiters = [];
120
+ const onKeypress = (_str, key) => {
121
+ const waiter = waiters.shift();
122
+ if (waiter) {
123
+ clearTimeout(waiter.timer);
124
+ waiter.resolve(key);
125
+ return;
126
+ }
127
+ queue.push(key);
128
+ };
129
+
130
+ process.stdin.on('keypress', onKeypress);
131
+
132
+ return {
133
+ read(timeoutMs) {
134
+ if (queue.length) return Promise.resolve(queue.shift());
135
+ return new Promise((resolve) => {
136
+ const waiter = {
137
+ resolve,
138
+ timer: setTimeout(() => {
139
+ const index = waiters.indexOf(waiter);
140
+ if (index >= 0) waiters.splice(index, 1);
141
+ resolve(null);
142
+ }, timeoutMs),
143
+ };
144
+ waiters.push(waiter);
145
+ });
146
+ },
147
+ close() {
148
+ for (const waiter of waiters.splice(0)) {
149
+ clearTimeout(waiter.timer);
150
+ waiter.resolve(null);
151
+ }
152
+ process.stdin.off('keypress', onKeypress);
153
+ },
154
+ };
155
+ }
156
+
157
+ function setRawInput(enabled) {
158
+ if (typeof process.stdin.setRawMode === 'function') {
159
+ process.stdin.setRawMode(enabled);
160
+ }
161
+ if (enabled) process.stdin.resume();
162
+ }
163
+
164
+ function restoreMenuInput() {
165
+ setRawInput(true);
166
+ process.stdin.resume();
167
+ }
168
+
169
+ function enterVisualScreen() {
170
+ process.stdout.write(`${CONTROL.alternateScreenIn}${CONTROL.hideCursor}${CONTROL.clearScreen}${CONTROL.cursorHome}`);
171
+ }
172
+
173
+ function leaveVisualScreen() {
174
+ process.stdout.write(`${CONTROL.reset}${CONTROL.showCursor}${CONTROL.alternateScreenOut}`);
175
+ }
176
+
177
+ function writeStableFrame(frame, { clear = false } = {}) {
178
+ const prefix = clear ? CONTROL.clearScreen : '';
179
+ process.stdout.write([
180
+ CONTROL.syncStart,
181
+ CONTROL.cursorHome,
182
+ prefix,
183
+ frame,
184
+ '\n',
185
+ CONTROL.clearToEnd,
186
+ CONTROL.syncEnd,
187
+ ].join(''));
188
+ }
189
+
190
+ function visualHudAllowed() {
191
+ return isInteractiveTerminal()
192
+ && process.env.SKILL_MASTER_NO_VISUAL !== '1'
193
+ && process.env.CI !== 'true'
194
+ && process.env.TERM !== 'dumb';
195
+ }
196
+
197
+ function renderCyberMenu(selectedIndex, tick, { clear = false } = {}) {
198
+ const status = getMenuStatus(rootDir);
199
+ const frame = formatCyberMenuFrame(status, commands, selectedIndex, tick, {
200
+ columns: process.stdout.columns ?? 120,
201
+ rows: process.stdout.rows ?? 32,
202
+ useColor: true,
203
+ });
204
+ writeStableFrame(frame, { clear });
205
+ }
206
+
207
+ function renderRunningAction(action, tick) {
208
+ const status = getMenuStatus(rootDir);
209
+ const frame = formatRunningActionFrame(status, action, tick, {
210
+ columns: process.stdout.columns ?? 120,
211
+ rows: process.stdout.rows ?? 32,
212
+ useColor: true,
213
+ });
214
+ writeStableFrame(frame, { clear: true });
215
+ }
216
+
217
+ function renderIntro(tick, message) {
218
+ const status = getMenuStatus(rootDir);
219
+ const frame = formatSkillMasterIntroFrame(status, tick, {
220
+ columns: process.stdout.columns ?? 120,
221
+ rows: process.stdout.rows ?? 32,
222
+ useColor: true,
223
+ message,
224
+ });
225
+ writeStableFrame(frame, { clear: tick === 0 });
226
+ }
227
+
228
+ function renderConfirmAction(action, tick) {
229
+ const status = getMenuStatus(rootDir);
230
+ const frame = formatCyberConfirmFrame(status, action, tick, {
231
+ columns: process.stdout.columns ?? 120,
232
+ rows: process.stdout.rows ?? 32,
233
+ useColor: true,
234
+ });
235
+ writeStableFrame(frame, { clear: tick === 0 });
236
+ }
237
+
238
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
239
+
240
+ async function animateIntro(message = 'skill_master assumindo o workflow', frames = 6) {
241
+ for (let frame = 0; frame < frames; frame += 1) {
242
+ renderIntro(frame, message);
243
+ await sleep(70);
244
+ }
245
+ }
246
+
247
+ async function animateRunningAction(action, startTick) {
248
+ for (let frame = 0; frame < 5; frame += 1) {
249
+ renderRunningAction(action, startTick + frame);
250
+ await sleep(90);
251
+ }
252
+ }
253
+
254
+ async function confirmVisualAction(action, startTick) {
255
+ let tick = startTick;
256
+ const reader = createKeyReader();
257
+
258
+ try {
259
+ while (true) {
260
+ renderConfirmAction(action, tick);
261
+ const key = await reader.read(180);
262
+ if (!key) {
263
+ tick += 1;
264
+ continue;
265
+ }
266
+
267
+ if (key.ctrl && key.name === 'c') return { confirmed: false, code: 130 };
268
+ if (key.name === 'return' || key.name === 'enter' || key.name === 'y') return { confirmed: true, code: 0 };
269
+ if (key.name === 'escape' || key.name === 'q' || key.name === 'n') return { confirmed: false, code: 0 };
270
+ }
271
+ } finally {
272
+ reader.close();
273
+ }
274
+ }
275
+
276
+ async function waitForAnyKey(message = 'Pressione qualquer tecla para voltar ao menu...') {
277
+ process.stdout.write(`\n${message}`);
278
+ setRawInput(true);
279
+ await readKey();
280
+ setRawInput(false);
281
+ }
282
+
283
+ async function runVisualMenu() {
284
+ let selectedIndex = resolveInitialSelectedIndex(getMenuStatus(rootDir), commands);
285
+ let tick = 0;
286
+ let lastCode = 0;
287
+ let keyReader = createKeyReader();
288
+ let previousColumns = process.stdout.columns ?? 120;
289
+ let previousRows = process.stdout.rows ?? 32;
290
+ let needsClear = true;
291
+
292
+ enterVisualScreen();
293
+ restoreMenuInput();
294
+
295
+ try {
296
+ await animateIntro('skill_master online / carregando menu operacional', 7);
297
+
298
+ while (true) {
299
+ const columns = process.stdout.columns ?? 120;
300
+ const rows = process.stdout.rows ?? 32;
301
+ const resized = columns !== previousColumns || rows !== previousRows;
302
+ previousColumns = columns;
303
+ previousRows = rows;
304
+ renderCyberMenu(selectedIndex, tick, { clear: needsClear || resized });
305
+ needsClear = false;
306
+ const key = await keyReader.read(160);
307
+
308
+ if (!key) {
309
+ tick += 1;
310
+ continue;
311
+ }
312
+
313
+ if (key.ctrl && key.name === 'c') return 130;
314
+ if (key.name === 'escape' || key.name === 'q') return lastCode;
315
+ if (key.name === 'up' || key.name === 'k') {
316
+ selectedIndex = selectedIndex === 0 ? commands.length - 1 : selectedIndex - 1;
317
+ continue;
318
+ }
319
+ if (key.name === 'down' || key.name === 'j') {
320
+ selectedIndex = selectedIndex === commands.length - 1 ? 0 : selectedIndex + 1;
321
+ continue;
322
+ }
323
+ if (key.name === 'return' || key.name === 'enter') {
324
+ const action = commands[selectedIndex];
325
+ keyReader.close();
326
+ if (action.confirmMessage) {
327
+ const confirmation = await confirmVisualAction(action, tick);
328
+ if (confirmation.code === 130) return 130;
329
+ if (!confirmation.confirmed) {
330
+ keyReader = createKeyReader();
331
+ needsClear = true;
332
+ continue;
333
+ }
334
+ }
335
+ await animateRunningAction(action, tick);
336
+ setRawInput(false);
337
+ leaveVisualScreen();
338
+ try {
339
+ const result = await runSelectedAction(action, { yes: Boolean(action.confirmMessage), useColor: true });
340
+ lastCode = result.code;
341
+ } catch (error) {
342
+ const message = error instanceof Error ? error.message : String(error);
343
+ process.stderr.write(`[skill_master] ${message}\n`);
344
+ lastCode = 1;
345
+ }
346
+ await waitForAnyKey();
347
+ keyReader = createKeyReader();
348
+ restoreMenuInput();
349
+ enterVisualScreen();
350
+ needsClear = true;
351
+ }
352
+ }
353
+ } finally {
354
+ keyReader.close();
355
+ setRawInput(false);
356
+ process.stdin.pause();
357
+ leaveVisualScreen();
358
+ }
359
+ }
360
+
361
+ async function main() {
362
+ const args = parseArgs(process.argv.slice(2));
363
+
364
+ if (args.help) {
365
+ printHelp();
366
+ return 0;
367
+ }
368
+
369
+ if (args.status) {
370
+ printStatus();
371
+ return 0;
372
+ }
373
+
374
+ if (args.run) {
375
+ const actionKey = resolveActionKey(args.run, commands);
376
+ if (!actionKey) {
377
+ throw new Error(`Unknown action: ${args.run}`);
378
+ }
379
+
380
+ const action = commands.find((entry) => entry.key === actionKey);
381
+ if (visualHudAllowed()) {
382
+ enterVisualScreen();
383
+ try {
384
+ await animateIntro(`skill_master executando ${action.label}`, 6);
385
+ } finally {
386
+ leaveVisualScreen();
387
+ }
388
+ }
389
+ const result = await runSelectedAction(action, { yes: args.yes, useColor: isInteractiveTerminal() });
390
+ return result.code;
391
+ }
392
+
393
+ if (!isInteractiveTerminal()) {
394
+ throw new Error('Interactive menu requires a TTY. Use --run <acao> or --status in automated environments.');
395
+ }
396
+
397
+ return runVisualMenu();
398
+ }
399
+
400
+ try {
401
+ process.exitCode = await main();
402
+ } catch (error) {
403
+ const message = error instanceof Error ? error.message : String(error);
404
+ process.stderr.write(`[skill_master] ${message}\n`);
405
+ process.exitCode = 1;
406
+ }