@fprad0/skill-master-mcp 0.0.10 → 0.0.11

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 (56) hide show
  1. package/CHANGELOG.md +5 -1
  2. package/README.md +29 -9
  3. package/VERSION.md +3 -3
  4. package/bin/lib/client-config.mjs +268 -0
  5. package/bin/lib/menu-core.mjs +47 -37
  6. package/bin/skill-master-bootstrap-global.mjs +2 -1
  7. package/bin/skill-master-doctor.mjs +42 -29
  8. package/bin/skill-master-install-global-skills.mjs +1 -1
  9. package/bin/skill-master-register-clients.mjs +36 -115
  10. package/docs/operations/GUIA_MULTI_COMPUTADOR.md +255 -0
  11. package/docs/operations/GUIA_NPM_PUBLICO.md +147 -0
  12. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/SKILL.md +399 -0
  13. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/common-patterns.md +331 -0
  14. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/complete-examples.md +872 -0
  15. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/component-patterns.md +502 -0
  16. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/data-fetching.md +767 -0
  17. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/file-organization.md +502 -0
  18. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/loading-and-error-states.md +501 -0
  19. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/performance.md +406 -0
  20. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/routing-guide.md +364 -0
  21. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/styling-guide.md +428 -0
  22. package/docs/skill-candidates/v0.0.11/frontend-dev-guidelines/resources/typescript-standards.md +418 -0
  23. package/docs/skill-candidates/v0.0.11/git-version-control-ops/SKILL.md +34 -0
  24. package/docs/skill-candidates/v0.0.11/go-engineering/SKILL.md +34 -0
  25. package/docs/skill-candidates/v0.0.11/java-engineering/SKILL.md +34 -0
  26. package/docs/skill-candidates/v0.0.11/javascript-engineering/SKILL.md +34 -0
  27. package/docs/skill-candidates/v0.0.11/json-contract-design/SKILL.md +34 -0
  28. package/docs/skill-candidates/v0.0.11/multi-client-mcp-ops/SKILL.md +36 -0
  29. package/docs/skill-candidates/v0.0.11/nextjs/SKILL.md +745 -0
  30. package/docs/skill-candidates/v0.0.11/nextjs/agents/openai.yaml +3 -0
  31. package/docs/skill-candidates/v0.0.11/nextjs/references/app-router-files.md +94 -0
  32. package/docs/skill-candidates/v0.0.11/python-engineering/SKILL.md +34 -0
  33. package/docs/skill-candidates/v0.0.11/ruby-engineering/SKILL.md +34 -0
  34. package/docs/skill-candidates/v0.0.11/senior-fullstack/SKILL.md +209 -0
  35. package/docs/skill-candidates/v0.0.11/senior-fullstack/references/architecture_patterns.md +103 -0
  36. package/docs/skill-candidates/v0.0.11/senior-fullstack/references/development_workflows.md +103 -0
  37. package/docs/skill-candidates/v0.0.11/senior-fullstack/references/tech_stack_guide.md +103 -0
  38. package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/code_quality_analyzer.py +114 -0
  39. package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/fullstack_scaffolder.py +114 -0
  40. package/docs/skill-candidates/v0.0.11/senior-fullstack/scripts/project_scaffolder.py +114 -0
  41. package/docs/skill-candidates/v0.0.11/shadcn/SKILL.md +573 -0
  42. package/docs/skill-candidates/v0.0.11/shadcn/agents/openai.yaml +3 -0
  43. package/docs/skill-candidates/v0.0.11/sql-postgresql-engineering/SKILL.md +34 -0
  44. package/docs/skill-candidates/v0.0.11/terminal-shell-ops/SKILL.md +34 -0
  45. package/docs/skill-candidates/v0.0.11/typescript-expert/SKILL.md +429 -0
  46. package/docs/skill-candidates/v0.0.11/typescript-expert/references/tsconfig-strict.json +92 -0
  47. package/docs/skill-candidates/v0.0.11/typescript-expert/references/typescript-cheatsheet.md +383 -0
  48. package/docs/skill-candidates/v0.0.11/typescript-expert/references/utility-types.ts +335 -0
  49. package/docs/skill-candidates/v0.0.11/typescript-expert/scripts/ts_diagnostic.py +203 -0
  50. package/docs/skill-candidates/v0.0.11/ui-component-primitives/SKILL.md +34 -0
  51. package/docs/skill-candidates/v0.0.11/web-mobile-design-systems/SKILL.md +34 -0
  52. package/docs/skill-candidates/v0.0.11/windows-linux-platform-ops/SKILL.md +34 -0
  53. package/manifests/channels/beta.json +7 -7
  54. package/manifests/channels/stable.json +8 -8
  55. package/package.json +6 -2
  56. package/scripts/verify-menu-actions.mjs +115 -0
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ TypeScript Project Diagnostic Script
4
+ Analyzes TypeScript projects for configuration, performance, and common issues.
5
+ """
6
+
7
+ import subprocess
8
+ import sys
9
+ import os
10
+ import json
11
+ from pathlib import Path
12
+
13
+ def run_cmd(cmd: str) -> str:
14
+ """Run shell command and return output."""
15
+ try:
16
+ result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
17
+ return result.stdout + result.stderr
18
+ except Exception as e:
19
+ return str(e)
20
+
21
+ def check_versions():
22
+ """Check TypeScript and Node versions."""
23
+ print("\n📦 Versions:")
24
+ print("-" * 40)
25
+
26
+ ts_version = run_cmd("npx tsc --version 2>/dev/null").strip()
27
+ node_version = run_cmd("node -v 2>/dev/null").strip()
28
+
29
+ print(f" TypeScript: {ts_version or 'Not found'}")
30
+ print(f" Node.js: {node_version or 'Not found'}")
31
+
32
+ def check_tsconfig():
33
+ """Analyze tsconfig.json settings."""
34
+ print("\n⚙️ TSConfig Analysis:")
35
+ print("-" * 40)
36
+
37
+ tsconfig_path = Path("tsconfig.json")
38
+ if not tsconfig_path.exists():
39
+ print("⚠️ tsconfig.json not found")
40
+ return
41
+
42
+ try:
43
+ with open(tsconfig_path) as f:
44
+ config = json.load(f)
45
+
46
+ compiler_opts = config.get("compilerOptions", {})
47
+
48
+ # Check strict mode
49
+ if compiler_opts.get("strict"):
50
+ print("✅ Strict mode enabled")
51
+ else:
52
+ print("⚠️ Strict mode NOT enabled")
53
+
54
+ # Check important flags
55
+ flags = {
56
+ "noUncheckedIndexedAccess": "Unchecked index access protection",
57
+ "noImplicitOverride": "Implicit override protection",
58
+ "skipLibCheck": "Skip lib check (performance)",
59
+ "incremental": "Incremental compilation"
60
+ }
61
+
62
+ for flag, desc in flags.items():
63
+ status = "✅" if compiler_opts.get(flag) else "⚪"
64
+ print(f" {status} {desc}: {compiler_opts.get(flag, 'not set')}")
65
+
66
+ # Check module settings
67
+ print(f"\n Module: {compiler_opts.get('module', 'not set')}")
68
+ print(f" Module Resolution: {compiler_opts.get('moduleResolution', 'not set')}")
69
+ print(f" Target: {compiler_opts.get('target', 'not set')}")
70
+
71
+ except json.JSONDecodeError:
72
+ print("❌ Invalid JSON in tsconfig.json")
73
+
74
+ def check_tooling():
75
+ """Detect TypeScript tooling ecosystem."""
76
+ print("\n🛠️ Tooling Detection:")
77
+ print("-" * 40)
78
+
79
+ pkg_path = Path("package.json")
80
+ if not pkg_path.exists():
81
+ print("⚠️ package.json not found")
82
+ return
83
+
84
+ try:
85
+ with open(pkg_path) as f:
86
+ pkg = json.load(f)
87
+
88
+ all_deps = {**pkg.get("dependencies", {}), **pkg.get("devDependencies", {})}
89
+
90
+ tools = {
91
+ "biome": "Biome (linter/formatter)",
92
+ "eslint": "ESLint",
93
+ "prettier": "Prettier",
94
+ "vitest": "Vitest (testing)",
95
+ "jest": "Jest (testing)",
96
+ "turborepo": "Turborepo (monorepo)",
97
+ "turbo": "Turbo (monorepo)",
98
+ "nx": "Nx (monorepo)",
99
+ "lerna": "Lerna (monorepo)"
100
+ }
101
+
102
+ for tool, desc in tools.items():
103
+ for dep in all_deps:
104
+ if tool in dep.lower():
105
+ print(f" ✅ {desc}")
106
+ break
107
+
108
+ except json.JSONDecodeError:
109
+ print("❌ Invalid JSON in package.json")
110
+
111
+ def check_monorepo():
112
+ """Check for monorepo configuration."""
113
+ print("\n📦 Monorepo Check:")
114
+ print("-" * 40)
115
+
116
+ indicators = [
117
+ ("pnpm-workspace.yaml", "PNPM Workspace"),
118
+ ("lerna.json", "Lerna"),
119
+ ("nx.json", "Nx"),
120
+ ("turbo.json", "Turborepo")
121
+ ]
122
+
123
+ found = False
124
+ for file, name in indicators:
125
+ if Path(file).exists():
126
+ print(f" ✅ {name} detected")
127
+ found = True
128
+
129
+ if not found:
130
+ print(" ⚪ No monorepo configuration detected")
131
+
132
+ def check_type_errors():
133
+ """Run quick type check."""
134
+ print("\n🔍 Type Check:")
135
+ print("-" * 40)
136
+
137
+ result = run_cmd("npx tsc --noEmit 2>&1 | head -20")
138
+ if "error TS" in result:
139
+ errors = result.count("error TS")
140
+ print(f" ❌ {errors}+ type errors found")
141
+ print(result[:500])
142
+ else:
143
+ print(" ✅ No type errors")
144
+
145
+ def check_any_usage():
146
+ """Check for any type usage."""
147
+ print("\n⚠️ 'any' Type Usage:")
148
+ print("-" * 40)
149
+
150
+ result = run_cmd("grep -r ': any' --include='*.ts' --include='*.tsx' src/ 2>/dev/null | wc -l")
151
+ count = result.strip()
152
+ if count and count != "0":
153
+ print(f" ⚠️ Found {count} occurrences of ': any'")
154
+ sample = run_cmd("grep -rn ': any' --include='*.ts' --include='*.tsx' src/ 2>/dev/null | head -5")
155
+ if sample:
156
+ print(sample)
157
+ else:
158
+ print(" ✅ No explicit 'any' types found")
159
+
160
+ def check_type_assertions():
161
+ """Check for type assertions."""
162
+ print("\n⚠️ Type Assertions (as):")
163
+ print("-" * 40)
164
+
165
+ result = run_cmd("grep -r ' as ' --include='*.ts' --include='*.tsx' src/ 2>/dev/null | grep -v 'import' | wc -l")
166
+ count = result.strip()
167
+ if count and count != "0":
168
+ print(f" ⚠️ Found {count} type assertions")
169
+ else:
170
+ print(" ✅ No type assertions found")
171
+
172
+ def check_performance():
173
+ """Check type checking performance."""
174
+ print("\n⏱️ Type Check Performance:")
175
+ print("-" * 40)
176
+
177
+ result = run_cmd("npx tsc --extendedDiagnostics --noEmit 2>&1 | grep -E 'Check time|Files:|Lines:|Nodes:'")
178
+ if result.strip():
179
+ for line in result.strip().split('\n'):
180
+ print(f" {line}")
181
+ else:
182
+ print(" ⚠️ Could not measure performance")
183
+
184
+ def main():
185
+ print("=" * 50)
186
+ print("🔍 TypeScript Project Diagnostic Report")
187
+ print("=" * 50)
188
+
189
+ check_versions()
190
+ check_tsconfig()
191
+ check_tooling()
192
+ check_monorepo()
193
+ check_any_usage()
194
+ check_type_assertions()
195
+ check_type_errors()
196
+ check_performance()
197
+
198
+ print("\n" + "=" * 50)
199
+ print("✅ Diagnostic Complete")
200
+ print("=" * 50)
201
+
202
+ if __name__ == "__main__":
203
+ main()
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: ui-component-primitives
3
+ description: "Design and implement reusable UI primitives and interaction components such as buttons, inputs, cards, modals, dropdowns, icons, toasts and navigation with accessibility and state clarity."
4
+ ---
5
+
6
+ # UI Component Primitives
7
+
8
+ Use this skill when the task is about reusable UI building blocks rather than page-level layout alone.
9
+
10
+ ## Workflow
11
+
12
+ - Start from the interaction contract: trigger, focus, keyboard, dismissal and state changes.
13
+ - Define component API, variants and states before styling details.
14
+ - Treat modal, dropdown, popover and navigation primitives as accessibility-sensitive systems.
15
+ - Keep icons, labels, spacing and motion consistent with the design system.
16
+ - Validate both mouse and keyboard behavior.
17
+
18
+ ## Coverage
19
+
20
+ - Components, primitives, modals, dropdowns, popovers, icons, buttons, forms and feedback.
21
+ - Variants, states, accessibility, composition and design-system reuse.
22
+ - Desktop and mobile interaction expectations.
23
+
24
+ ## Reference Anchors
25
+
26
+ - WAI-ARIA APG: `https://www.w3.org/WAI/ARIA/apg/`
27
+ - Material Design components: `https://m3.material.io/components`
28
+
29
+ ## Guardrails
30
+
31
+ - Do not ship inaccessible focus, escape or keyboard behavior.
32
+ - Do not let visual styling outrun interaction correctness.
33
+ - Do not duplicate primitives without a strong reason.
34
+ - Do not ignore empty, loading, disabled or error states.
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: web-mobile-design-systems
3
+ description: "Shape coherent web, mobile and app-facing design systems with attention to layout, hierarchy, navigation, responsive behavior, visual language and product-level usability."
4
+ ---
5
+
6
+ # Web Mobile Design Systems
7
+
8
+ Use this skill when the task spans layout, visual systems and product interaction across desktop and mobile surfaces.
9
+
10
+ ## Workflow
11
+
12
+ - Begin from information hierarchy, navigation and user goal flow.
13
+ - Design responsive layout behavior before polishing isolated screens.
14
+ - Keep typography, spacing, surface hierarchy and motion consistent across breakpoints.
15
+ - Reuse patterns deliberately across web and mobile contexts while respecting platform differences.
16
+ - Validate readability, rhythm and interaction clarity on both narrow and wide layouts.
17
+
18
+ ## Coverage
19
+
20
+ - Layout, web design, mobile, app surfaces, UX/UI systems and responsive behavior.
21
+ - Navigation, forms, cards, sections, density, hierarchy, motion and visual consistency.
22
+ - Design-system framing for product teams.
23
+
24
+ ## Reference Anchors
25
+
26
+ - Material Design 3: `https://m3.material.io/`
27
+ - Apple Human Interface Guidelines: `https://developer.apple.com/design/human-interface-guidelines/`
28
+
29
+ ## Guardrails
30
+
31
+ - Do not confuse visual complexity with product quality.
32
+ - Do not force desktop structure onto mobile flows.
33
+ - Do not treat responsiveness as a late patch.
34
+ - Do not sacrifice clarity for novelty.
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: windows-linux-platform-ops
3
+ description: "Operate Windows and Linux developer environments with focus on filesystems, PATH, permissions, services, shells, package managers and cross-platform reliability."
4
+ ---
5
+
6
+ # Windows Linux Platform Ops
7
+
8
+ Use this skill when the task depends on OS-specific environment behavior across Windows or Linux.
9
+
10
+ ## Workflow
11
+
12
+ - Identify the target OS, shell, path conventions and permission model first.
13
+ - Treat filesystem, service, environment and package-manager differences explicitly.
14
+ - Prefer cross-platform instructions only when they are truly equivalent.
15
+ - Keep operator-facing paths, config locations and restart steps concrete.
16
+ - Validate on the real platform path when possible.
17
+
18
+ ## Coverage
19
+
20
+ - Windows and Linux paths, permissions, PATH, services, package managers and shells.
21
+ - Config-file locations, CLI registration, restart/reload behavior and troubleshooting.
22
+ - Cross-platform readiness for developer tooling.
23
+
24
+ ## Reference Anchors
25
+
26
+ - Windows docs: `https://learn.microsoft.com/windows/`
27
+ - Linux kernel docs: `https://www.kernel.org/doc/html/latest/`
28
+
29
+ ## Guardrails
30
+
31
+ - Do not assume Linux semantics on Windows paths or permissions.
32
+ - Do not give cross-platform instructions that are only half-true.
33
+ - Do not omit restart/reload requirements for service or shell config changes.
34
+ - Do not hide elevated-privilege requirements.
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "skill_master",
3
3
  "channel": "beta",
4
- "version": "00.04-beta",
5
- "semver": "0.0.10",
6
- "publishedAt": "2026-06-28T14:00:39-03:00",
4
+ "version": "00.05-beta",
5
+ "semver": "0.0.11",
6
+ "publishedAt": "2026-06-28T22:16:21-03:00",
7
7
  "git": {
8
8
  "repo": "https://github.com/FPrad0/skill-master-mcp",
9
9
  "branch": "main",
10
- "commit": "f955c13"
10
+ "commit": "569679e"
11
11
  },
12
12
  "node": {
13
13
  "minimum": "18.0.0"
@@ -19,8 +19,8 @@
19
19
  "buildCommand": "npm run build"
20
20
  },
21
21
  "changelog": [
22
- "Canal beta acompanha o bundle global ampliado e a nova apresentacao cyberpunk do menu.",
23
- "Fluxo interativo volta selecionavel apos executar acoes e retornar ao TUI.",
24
- "Doctor, bootstrap global e registro multi-cliente continuam prontos para notebooks novos."
22
+ "Canal beta acompanha o bundle global v0.0.11 e o registro MCP robusto por Node absoluto.",
23
+ "Doctor e menu continuam auditando a matriz completa de acoes e os modos legados de configuracao.",
24
+ "Bootstrap global e registro multi-cliente seguem prontos para notebooks novos."
25
25
  ]
26
26
  }
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "skill_master",
3
3
  "channel": "stable",
4
- "version": "00.04",
5
- "semver": "0.0.10",
6
- "publishedAt": "2026-06-28T14:00:39-03:00",
4
+ "version": "00.05",
5
+ "semver": "0.0.11",
6
+ "publishedAt": "2026-06-28T22:16:21-03:00",
7
7
  "git": {
8
8
  "repo": "https://github.com/FPrad0/skill-master-mcp",
9
9
  "branch": "main",
10
- "commit": "f955c13"
10
+ "commit": "569679e"
11
11
  },
12
12
  "node": {
13
13
  "minimum": "18.0.0"
@@ -19,9 +19,9 @@
19
19
  "buildCommand": "npm run build"
20
20
  },
21
21
  "changelog": [
22
- "Catalogo global embutido cresce com skills de frontend, backend, CLI, GitHub, OpenAI docs, design, idiomas, ciencia e MCP.",
23
- "Menu visual exibe totais do bundle, dominios, metadata da acao selecionada e telemetria operacional em layout cyberpunk.",
24
- "Retorno ao menu volta a aceitar selecao por teclado depois de executar uma acao.",
25
- "Doctor e bootstrap continuam validando e preparando Codex, Claude, Gemini e Antigravity para uso global."
22
+ "Registro MCP multi-cliente agora usa Node absoluto e o entrypoint absoluto de bin/skill-master.mjs, evitando falhas de PATH em Windows, Linux, macOS e apps desktop.",
23
+ "Doctor passa a diferenciar registros robustos e legados, incluindo path-bin, launcher, custom, missing e invalid-json.",
24
+ "Menu operacional valida a matriz completa de 22 acoes e o bundle global passa a incluir o pacote ampliado de skills v0.0.11.",
25
+ "Bootstrap global continua instalando skills e registrando Codex, Claude, Gemini e Antigravity em um passo."
26
26
  ]
27
27
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fprad0/skill-master-mcp",
3
- "version": "0.0.10",
3
+ "version": "0.0.11",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Personal MCP server that catalogs, recommends and reports skills with update-aware metadata.",
@@ -25,12 +25,15 @@
25
25
  "docs/planning",
26
26
  "docs/skill-candidates",
27
27
  "docs/operations/GUIA_NPM_PRIVADO.md",
28
+ "docs/operations/GUIA_NPM_PUBLICO.md",
29
+ "docs/operations/GUIA_MULTI_COMPUTADOR.md",
28
30
  "manifests",
29
31
  "network",
30
32
  "README.md",
31
33
  "CHANGELOG.md",
32
34
  "VERSION.md",
33
35
  "examples/client-configs",
36
+ "scripts/verify-menu-actions.mjs",
34
37
  "scripts/configure-private-registry.mjs",
35
38
  "scripts/lib",
36
39
  "sources.json"
@@ -53,8 +56,9 @@
53
56
  "test": "vitest run",
54
57
  "setup:private-registry": "node scripts/configure-private-registry.mjs",
55
58
  "eval:activation": "npm run build && node bin/skill-master-eval-activation.mjs",
59
+ "verify:menu": "node scripts/verify-menu-actions.mjs",
56
60
  "check:manifest": "node scripts/check-manifest.mjs",
57
- "check": "npm run build && npm test && npm run check:manifest",
61
+ "check": "npm run build && npm test && npm run verify:menu && npm run check:manifest",
58
62
  "prepack": "npm run build",
59
63
  "pack:dry-run": "npm pack --dry-run",
60
64
  "publish:github": "npm publish --registry=https://npm.pkg.github.com",
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import {
6
+ buildMenuCommands,
7
+ resolveActionKey,
8
+ } from '../bin/lib/menu-core.mjs';
9
+
10
+ const here = dirname(fileURLToPath(import.meta.url));
11
+ const rootDir = dirname(here);
12
+ const currentFile = join(rootDir, 'bin', 'skill-master-menu.mjs');
13
+
14
+ const REQUIRED_ACTIONS = [
15
+ 'status',
16
+ 'doctor',
17
+ 'check',
18
+ 'build',
19
+ 'publicNpm',
20
+ 'updateGlobal',
21
+ 'privateRegistry',
22
+ 'activationStatus',
23
+ 'activationBalanced',
24
+ 'activationAlwaysOn',
25
+ 'installGlobalSkills',
26
+ 'bootstrapGlobal',
27
+ 'registerClients',
28
+ 'promptRecommendation',
29
+ 'successNotifications',
30
+ 'studySkills',
31
+ 'approvalPackage',
32
+ 'markLearnedStudy',
33
+ 'rejectLearnedSkill',
34
+ 'activateLearnedLocal',
35
+ 'activateLearnedGlobal',
36
+ 'notionSummary',
37
+ ];
38
+
39
+ const CONFIRMATION_REQUIRED = [
40
+ 'updateGlobal',
41
+ 'privateRegistry',
42
+ 'activationAlwaysOn',
43
+ 'installGlobalSkills',
44
+ 'bootstrapGlobal',
45
+ 'registerClients',
46
+ 'rejectLearnedSkill',
47
+ 'activateLearnedLocal',
48
+ 'activateLearnedGlobal',
49
+ ];
50
+
51
+ const READ_ONLY_ACTIONS = [
52
+ 'status',
53
+ 'doctor',
54
+ 'publicNpm',
55
+ 'activationStatus',
56
+ 'successNotifications',
57
+ 'studySkills',
58
+ 'approvalPackage',
59
+ 'notionSummary',
60
+ ];
61
+
62
+ const commands = buildMenuCommands({
63
+ rootDir,
64
+ currentFile,
65
+ nodeExecPath: process.execPath,
66
+ });
67
+
68
+ const byKey = new Map(commands.map((command) => [command.key, command]));
69
+ const failures = [];
70
+
71
+ for (const key of REQUIRED_ACTIONS) {
72
+ if (!byKey.has(key)) failures.push(`missing action: ${key}`);
73
+ }
74
+
75
+ for (const key of CONFIRMATION_REQUIRED) {
76
+ const command = byKey.get(key);
77
+ if (command && !command.confirmMessage) failures.push(`missing confirmation: ${key}`);
78
+ }
79
+
80
+ for (const command of commands) {
81
+ if (!command.command) failures.push(`missing command executable: ${command.key}`);
82
+ if (!Array.isArray(command.args)) failures.push(`args must be array: ${command.key}`);
83
+ for (const alias of command.aliases ?? []) {
84
+ if (resolveActionKey(alias, commands) !== command.key) failures.push(`alias does not resolve: ${command.key}:${alias}`);
85
+ }
86
+ }
87
+
88
+ for (const key of READ_ONLY_ACTIONS) {
89
+ const command = byKey.get(key);
90
+ if (!command) continue;
91
+ if (command.confirmMessage) failures.push(`read-only action unexpectedly asks confirmation: ${key}`);
92
+ }
93
+
94
+ console.log('Skill Master menu action verification');
95
+ console.log(`- Actions: ${commands.length}`);
96
+ console.log(`- Required actions: ${REQUIRED_ACTIONS.length}`);
97
+ console.log(`- Read-only smoke candidates: ${READ_ONLY_ACTIONS.join(', ')}`);
98
+ console.log(`- Confirmation protected: ${CONFIRMATION_REQUIRED.join(', ')}`);
99
+ console.log('');
100
+
101
+ for (const command of commands) {
102
+ const protection = command.confirmMessage ? 'confirm' : 'direct';
103
+ const disabled = command.disabledReason ? 'disabled' : 'enabled';
104
+ console.log(`- ${command.key}: ${disabled}, ${protection}, aliases=${command.aliases.join('|') || '-'}`);
105
+ }
106
+
107
+ if (failures.length) {
108
+ console.log('');
109
+ console.log('Failures:');
110
+ for (const failure of failures) console.log(`- ${failure}`);
111
+ process.exitCode = 1;
112
+ } else {
113
+ console.log('');
114
+ console.log('Menu action matrix OK.');
115
+ }