maestro-flow 0.3.32 → 0.3.34

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 (241) hide show
  1. package/.claude/commands/learn-retro.md +1 -1
  2. package/.claude/commands/maestro-composer.md +2 -2
  3. package/.claude/commands/maestro-ralph-execute.md +1 -1
  4. package/.claude/commands/maestro-ralph.md +11 -11
  5. package/.claude/commands/maestro-verify.md +1 -1
  6. package/.claude/commands/maestro.md +1 -2
  7. package/.claude/commands/quality-auto-test.md +124 -0
  8. package/.claude/commands/quality-refactor.md +1 -1
  9. package/.claude/commands/quality-test.md +3 -3
  10. package/.codex/skills/learn-retro/SKILL.md +1 -1
  11. package/.codex/skills/maestro/SKILL.md +1 -1
  12. package/.codex/skills/maestro-link-coordinate/SKILL.md +1 -1
  13. package/.codex/skills/maestro-milestone-audit/SKILL.md +9 -1
  14. package/.codex/skills/maestro-plan/SKILL.md +72 -6
  15. package/.codex/skills/maestro-ralph/SKILL.md +159 -159
  16. package/.codex/skills/maestro-roadmap/SKILL.md +31 -5
  17. package/.codex/skills/maestro-verify/SKILL.md +1 -1
  18. package/.codex/skills/quality-auto-test/SKILL.md +547 -0
  19. package/.codex/skills/quality-debug/SKILL.md +18 -6
  20. package/.codex/skills/quality-refactor/SKILL.md +8 -1
  21. package/.codex/skills/quality-sync/SKILL.md +23 -4
  22. package/.codex/skills/quality-test/SKILL.md +498 -166
  23. package/dashboard/dist-server/src/config/cli-tools-config.js +5 -20
  24. package/dashboard/dist-server/src/config/cli-tools-config.js.map +1 -1
  25. package/dashboard/dist-server/src/config/cli-tools-defaults.json +17 -0
  26. package/dist/src/commands/config.d.ts.map +1 -1
  27. package/dist/src/commands/config.js +168 -32
  28. package/dist/src/commands/config.js.map +1 -1
  29. package/dist/src/commands/hooks.d.ts +9 -0
  30. package/dist/src/commands/hooks.d.ts.map +1 -1
  31. package/dist/src/commands/hooks.js +1 -1
  32. package/dist/src/commands/hooks.js.map +1 -1
  33. package/dist/src/commands/install.js +1 -1
  34. package/dist/src/commands/install.js.map +1 -1
  35. package/dist/src/commands/overlay.js +1 -1
  36. package/dist/src/commands/overlay.js.map +1 -1
  37. package/dist/src/commands/tools.d.ts.map +1 -1
  38. package/dist/src/commands/tools.js +7 -17
  39. package/dist/src/commands/tools.js.map +1 -1
  40. package/dist/src/commands/uninstall.js +1 -1
  41. package/dist/src/commands/uninstall.js.map +1 -1
  42. package/dist/src/config/cli-tools-config.d.ts.map +1 -1
  43. package/dist/src/config/cli-tools-config.js +5 -20
  44. package/dist/src/config/cli-tools-config.js.map +1 -1
  45. package/dist/src/config/cli-tools-defaults.json +17 -0
  46. package/dist/src/tui/config-ui/ConfigHub.d.ts +14 -0
  47. package/dist/src/tui/config-ui/ConfigHub.d.ts.map +1 -0
  48. package/dist/src/tui/config-ui/ConfigHub.js +125 -0
  49. package/dist/src/tui/config-ui/ConfigHub.js.map +1 -0
  50. package/dist/src/tui/config-ui/ConfigSourcesView.d.ts +6 -0
  51. package/dist/src/tui/config-ui/ConfigSourcesView.d.ts.map +1 -0
  52. package/dist/src/tui/config-ui/ConfigSourcesView.js +25 -0
  53. package/dist/src/tui/config-ui/ConfigSourcesView.js.map +1 -0
  54. package/dist/src/tui/config-ui/HooksPanel.d.ts +6 -0
  55. package/dist/src/tui/config-ui/HooksPanel.d.ts.map +1 -0
  56. package/dist/src/tui/config-ui/HooksPanel.js +92 -0
  57. package/dist/src/tui/config-ui/HooksPanel.js.map +1 -0
  58. package/dist/src/tui/config-ui/SkillConfigDashboard.d.ts +9 -0
  59. package/dist/src/tui/config-ui/SkillConfigDashboard.d.ts.map +1 -0
  60. package/dist/src/tui/config-ui/SkillConfigDashboard.js +64 -0
  61. package/dist/src/tui/config-ui/SkillConfigDashboard.js.map +1 -0
  62. package/dist/src/tui/config-ui/SkillParamEditor.d.ts +12 -0
  63. package/dist/src/tui/config-ui/SkillParamEditor.d.ts.map +1 -0
  64. package/dist/src/tui/config-ui/SkillParamEditor.js +162 -0
  65. package/dist/src/tui/config-ui/SkillParamEditor.js.map +1 -0
  66. package/dist/src/tui/config-ui/SkillsList.d.ts +12 -0
  67. package/dist/src/tui/config-ui/SkillsList.d.ts.map +1 -0
  68. package/dist/src/tui/config-ui/SkillsList.js +91 -0
  69. package/dist/src/tui/config-ui/SkillsList.js.map +1 -0
  70. package/dist/src/tui/config-ui/SpecPanel.d.ts +6 -0
  71. package/dist/src/tui/config-ui/SpecPanel.d.ts.map +1 -0
  72. package/dist/src/tui/config-ui/SpecPanel.js +79 -0
  73. package/dist/src/tui/config-ui/SpecPanel.js.map +1 -0
  74. package/dist/src/tui/config-ui/index.d.ts +23 -0
  75. package/dist/src/tui/config-ui/index.d.ts.map +1 -0
  76. package/dist/src/tui/config-ui/index.js +34 -0
  77. package/dist/src/tui/config-ui/index.js.map +1 -0
  78. package/dist/src/tui/index.d.ts +7 -0
  79. package/dist/src/tui/index.d.ts.map +1 -0
  80. package/dist/src/tui/index.js +10 -0
  81. package/dist/src/tui/index.js.map +1 -0
  82. package/dist/src/tui/install-ui/BackupConfig.d.ts +10 -0
  83. package/dist/src/tui/install-ui/BackupConfig.d.ts.map +1 -0
  84. package/dist/src/tui/install-ui/BackupConfig.js +46 -0
  85. package/dist/src/tui/install-ui/BackupConfig.js.map +1 -0
  86. package/dist/src/tui/install-ui/BlueprintPreview.d.ts +9 -0
  87. package/dist/src/tui/install-ui/BlueprintPreview.d.ts.map +1 -0
  88. package/dist/src/tui/install-ui/BlueprintPreview.js +65 -0
  89. package/dist/src/tui/install-ui/BlueprintPreview.js.map +1 -0
  90. package/dist/src/tui/install-ui/BlueprintPreview.logic.d.ts +33 -0
  91. package/dist/src/tui/install-ui/BlueprintPreview.logic.d.ts.map +1 -0
  92. package/dist/src/tui/install-ui/BlueprintPreview.logic.js +51 -0
  93. package/dist/src/tui/install-ui/BlueprintPreview.logic.js.map +1 -0
  94. package/dist/src/tui/install-ui/ComponentGrid.d.ts +13 -0
  95. package/dist/src/tui/install-ui/ComponentGrid.d.ts.map +1 -0
  96. package/dist/src/tui/install-ui/ComponentGrid.js +75 -0
  97. package/dist/src/tui/install-ui/ComponentGrid.js.map +1 -0
  98. package/dist/src/tui/install-ui/ComponentGrid.logic.d.ts +31 -0
  99. package/dist/src/tui/install-ui/ComponentGrid.logic.d.ts.map +1 -0
  100. package/dist/src/tui/install-ui/ComponentGrid.logic.js +58 -0
  101. package/dist/src/tui/install-ui/ComponentGrid.logic.js.map +1 -0
  102. package/dist/src/tui/install-ui/ConfigPanel.d.ts +11 -0
  103. package/dist/src/tui/install-ui/ConfigPanel.d.ts.map +1 -0
  104. package/dist/src/tui/install-ui/ConfigPanel.js +35 -0
  105. package/dist/src/tui/install-ui/ConfigPanel.js.map +1 -0
  106. package/dist/src/tui/install-ui/CyberItem.d.ts +18 -0
  107. package/dist/src/tui/install-ui/CyberItem.d.ts.map +1 -0
  108. package/dist/src/tui/install-ui/CyberItem.js +33 -0
  109. package/dist/src/tui/install-ui/CyberItem.js.map +1 -0
  110. package/dist/src/tui/install-ui/CyberdeckBlueprint.d.ts +7 -0
  111. package/dist/src/tui/install-ui/CyberdeckBlueprint.d.ts.map +1 -0
  112. package/dist/src/tui/install-ui/CyberdeckBlueprint.js +91 -0
  113. package/dist/src/tui/install-ui/CyberdeckBlueprint.js.map +1 -0
  114. package/dist/src/tui/install-ui/ExecutionView.d.ts +12 -0
  115. package/dist/src/tui/install-ui/ExecutionView.d.ts.map +1 -0
  116. package/dist/src/tui/install-ui/ExecutionView.js +154 -0
  117. package/dist/src/tui/install-ui/ExecutionView.js.map +1 -0
  118. package/dist/src/tui/install-ui/GradientHeader.d.ts +8 -0
  119. package/dist/src/tui/install-ui/GradientHeader.d.ts.map +1 -0
  120. package/dist/src/tui/install-ui/GradientHeader.js +18 -0
  121. package/dist/src/tui/install-ui/GradientHeader.js.map +1 -0
  122. package/dist/src/tui/install-ui/HooksConfig.d.ts +8 -0
  123. package/dist/src/tui/install-ui/HooksConfig.d.ts.map +1 -0
  124. package/dist/src/tui/install-ui/HooksConfig.js +35 -0
  125. package/dist/src/tui/install-ui/HooksConfig.js.map +1 -0
  126. package/dist/src/tui/install-ui/InstallConfirm.d.ts +27 -0
  127. package/dist/src/tui/install-ui/InstallConfirm.d.ts.map +1 -0
  128. package/dist/src/tui/install-ui/InstallConfirm.js +25 -0
  129. package/dist/src/tui/install-ui/InstallConfirm.js.map +1 -0
  130. package/dist/src/tui/install-ui/InstallExecution.d.ts +21 -0
  131. package/dist/src/tui/install-ui/InstallExecution.d.ts.map +1 -0
  132. package/dist/src/tui/install-ui/InstallExecution.js +154 -0
  133. package/dist/src/tui/install-ui/InstallExecution.js.map +1 -0
  134. package/dist/src/tui/install-ui/InstallFlow.d.ts +14 -0
  135. package/dist/src/tui/install-ui/InstallFlow.d.ts.map +1 -0
  136. package/dist/src/tui/install-ui/InstallFlow.js +186 -0
  137. package/dist/src/tui/install-ui/InstallFlow.js.map +1 -0
  138. package/dist/src/tui/install-ui/InstallHub.d.ts +33 -0
  139. package/dist/src/tui/install-ui/InstallHub.d.ts.map +1 -0
  140. package/dist/src/tui/install-ui/InstallHub.js +97 -0
  141. package/dist/src/tui/install-ui/InstallHub.js.map +1 -0
  142. package/dist/src/tui/install-ui/InstallResult.d.ts +7 -0
  143. package/dist/src/tui/install-ui/InstallResult.d.ts.map +1 -0
  144. package/dist/src/tui/install-ui/InstallResult.js +15 -0
  145. package/dist/src/tui/install-ui/InstallResult.js.map +1 -0
  146. package/dist/src/tui/install-ui/McpConfig.d.ts +12 -0
  147. package/dist/src/tui/install-ui/McpConfig.d.ts.map +1 -0
  148. package/dist/src/tui/install-ui/McpConfig.js +69 -0
  149. package/dist/src/tui/install-ui/McpConfig.js.map +1 -0
  150. package/dist/src/tui/install-ui/ResultDashboard.d.ts +8 -0
  151. package/dist/src/tui/install-ui/ResultDashboard.d.ts.map +1 -0
  152. package/dist/src/tui/install-ui/ResultDashboard.js +17 -0
  153. package/dist/src/tui/install-ui/ResultDashboard.js.map +1 -0
  154. package/dist/src/tui/install-ui/ReviewPanel.d.ts +19 -0
  155. package/dist/src/tui/install-ui/ReviewPanel.d.ts.map +1 -0
  156. package/dist/src/tui/install-ui/ReviewPanel.js +25 -0
  157. package/dist/src/tui/install-ui/ReviewPanel.js.map +1 -0
  158. package/dist/src/tui/install-ui/ShortcutFooter.d.ts +7 -0
  159. package/dist/src/tui/install-ui/ShortcutFooter.d.ts.map +1 -0
  160. package/dist/src/tui/install-ui/ShortcutFooter.js +15 -0
  161. package/dist/src/tui/install-ui/ShortcutFooter.js.map +1 -0
  162. package/dist/src/tui/install-ui/StatuslineConfig.d.ts +11 -0
  163. package/dist/src/tui/install-ui/StatuslineConfig.d.ts.map +1 -0
  164. package/dist/src/tui/install-ui/StatuslineConfig.js +39 -0
  165. package/dist/src/tui/install-ui/StatuslineConfig.js.map +1 -0
  166. package/dist/src/tui/install-ui/StepSelector.d.ts +14 -0
  167. package/dist/src/tui/install-ui/StepSelector.d.ts.map +1 -0
  168. package/dist/src/tui/install-ui/StepSelector.js +46 -0
  169. package/dist/src/tui/install-ui/StepSelector.js.map +1 -0
  170. package/dist/src/tui/install-ui/index.d.ts +8 -0
  171. package/dist/src/tui/install-ui/index.d.ts.map +1 -0
  172. package/dist/src/tui/install-ui/index.js +10 -0
  173. package/dist/src/tui/install-ui/index.js.map +1 -0
  174. package/dist/src/tui/install-ui/types.d.ts +35 -0
  175. package/dist/src/tui/install-ui/types.d.ts.map +1 -0
  176. package/dist/src/tui/install-ui/types.js +25 -0
  177. package/dist/src/tui/install-ui/types.js.map +1 -0
  178. package/dist/src/tui/overlay-ui/OverlayList.d.ts +37 -0
  179. package/dist/src/tui/overlay-ui/OverlayList.d.ts.map +1 -0
  180. package/dist/src/tui/overlay-ui/OverlayList.js +146 -0
  181. package/dist/src/tui/overlay-ui/OverlayList.js.map +1 -0
  182. package/dist/src/tui/overlay-ui/index.d.ts +18 -0
  183. package/dist/src/tui/overlay-ui/index.d.ts.map +1 -0
  184. package/dist/src/tui/overlay-ui/index.js +204 -0
  185. package/dist/src/tui/overlay-ui/index.js.map +1 -0
  186. package/dist/src/tui/render.d.ts +13 -0
  187. package/dist/src/tui/render.d.ts.map +1 -0
  188. package/dist/src/tui/render.js +31 -0
  189. package/dist/src/tui/render.js.map +1 -0
  190. package/dist/src/tui/tools-ui/CommandReference.d.ts +7 -0
  191. package/dist/src/tui/tools-ui/CommandReference.d.ts.map +1 -0
  192. package/dist/src/tui/tools-ui/CommandReference.js +33 -0
  193. package/dist/src/tui/tools-ui/CommandReference.js.map +1 -0
  194. package/dist/src/tui/tools-ui/ConfigSources.d.ts +6 -0
  195. package/dist/src/tui/tools-ui/ConfigSources.d.ts.map +1 -0
  196. package/dist/src/tui/tools-ui/ConfigSources.js +27 -0
  197. package/dist/src/tui/tools-ui/ConfigSources.js.map +1 -0
  198. package/dist/src/tui/tools-ui/RegisterSettings.d.ts +8 -0
  199. package/dist/src/tui/tools-ui/RegisterSettings.d.ts.map +1 -0
  200. package/dist/src/tui/tools-ui/RegisterSettings.js +125 -0
  201. package/dist/src/tui/tools-ui/RegisterSettings.js.map +1 -0
  202. package/dist/src/tui/tools-ui/RoleMappings.d.ts +9 -0
  203. package/dist/src/tui/tools-ui/RoleMappings.d.ts.map +1 -0
  204. package/dist/src/tui/tools-ui/RoleMappings.js +104 -0
  205. package/dist/src/tui/tools-ui/RoleMappings.js.map +1 -0
  206. package/dist/src/tui/tools-ui/ToolsDashboard.d.ts +8 -0
  207. package/dist/src/tui/tools-ui/ToolsDashboard.d.ts.map +1 -0
  208. package/dist/src/tui/tools-ui/ToolsDashboard.js +60 -0
  209. package/dist/src/tui/tools-ui/ToolsDashboard.js.map +1 -0
  210. package/dist/src/tui/tools-ui/ToolsOverview.d.ts +9 -0
  211. package/dist/src/tui/tools-ui/ToolsOverview.d.ts.map +1 -0
  212. package/dist/src/tui/tools-ui/ToolsOverview.js +84 -0
  213. package/dist/src/tui/tools-ui/ToolsOverview.js.map +1 -0
  214. package/dist/src/tui/tools-ui/index.d.ts +3 -0
  215. package/dist/src/tui/tools-ui/index.d.ts.map +1 -0
  216. package/dist/src/tui/tools-ui/index.js +6 -0
  217. package/dist/src/tui/tools-ui/index.js.map +1 -0
  218. package/dist/src/tui/uninstall-ui/UninstallFlow.d.ts +7 -0
  219. package/dist/src/tui/uninstall-ui/UninstallFlow.d.ts.map +1 -0
  220. package/dist/src/tui/uninstall-ui/UninstallFlow.js +189 -0
  221. package/dist/src/tui/uninstall-ui/UninstallFlow.js.map +1 -0
  222. package/dist/src/tui/uninstall-ui/index.d.ts +3 -0
  223. package/dist/src/tui/uninstall-ui/index.d.ts.map +1 -0
  224. package/dist/src/tui/uninstall-ui/index.js +6 -0
  225. package/dist/src/tui/uninstall-ui/index.js.map +1 -0
  226. package/package.json +1 -1
  227. package/workflows/auto-test.md +682 -0
  228. package/workflows/business-test.md +570 -0
  229. package/workflows/integration-test.md +1 -1
  230. package/workflows/maestro.codex.md +4 -3
  231. package/workflows/maestro.md +5 -4
  232. package/workflows/status.md +2 -2
  233. package/workflows/test.md +1 -1
  234. package/workflows/verify.md +1 -1
  235. package/.claude/commands/quality-business-test.md +0 -110
  236. package/.claude/commands/quality-integration-test.md +0 -67
  237. package/.claude/commands/quality-test-gen.md +0 -68
  238. package/.codex/skills/maestro-ralph-execute/SKILL.md +0 -219
  239. package/.codex/skills/quality-business-test/SKILL.md +0 -218
  240. package/.codex/skills/quality-integration-test/SKILL.md +0 -427
  241. package/.codex/skills/quality-test-gen/SKILL.md +0 -352
@@ -0,0 +1,92 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text, useInput, useApp } from 'ink';
4
+ export function HooksPanel({ workDir, onBack }) {
5
+ const { exit } = useApp();
6
+ const [hooks, setHooks] = useState([]);
7
+ const [globalInstalled, setGlobalInstalled] = useState(false);
8
+ const [cursor, setCursor] = useState(0);
9
+ const [statusLine, setStatusLine] = useState(false);
10
+ useEffect(() => {
11
+ loadStatus();
12
+ }, []);
13
+ async function loadStatus() {
14
+ const { HOOK_DEFS, HOOK_LEVEL_DESCRIPTIONS, getClaudeSettingsPath, loadClaudeSettings, } = await import('../../commands/hooks.js');
15
+ const { loadHooksConfig } = await import('../../config/index.js');
16
+ const settingsPath = getClaudeSettingsPath();
17
+ const settings = loadClaudeSettings(settingsPath);
18
+ const config = loadHooksConfig();
19
+ const hasStatusline = settings.statusLine?.command?.includes('maestro') || false;
20
+ setStatusLine(hasStatusline);
21
+ setGlobalInstalled(!!settings.hooks);
22
+ const items = [];
23
+ for (const [name, def] of Object.entries(HOOK_DEFS)) {
24
+ // Check if installed in settings
25
+ const installed = findHook(settings, name);
26
+ // Check toggle
27
+ const toggleKey = name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
28
+ const enabled = config.toggles[toggleKey] !== false;
29
+ items.push({
30
+ name,
31
+ event: def.event,
32
+ matcher: def.matcher,
33
+ level: def.level,
34
+ installed,
35
+ enabled,
36
+ requiresWorkspace: !!def.requiresWorkspace,
37
+ });
38
+ }
39
+ setHooks(items);
40
+ }
41
+ useInput((input, key) => {
42
+ if (input === 'q' || key.escape) {
43
+ if (onBack)
44
+ onBack();
45
+ else
46
+ exit();
47
+ }
48
+ if (key.upArrow)
49
+ setCursor(c => Math.max(0, c - 1));
50
+ if (key.downArrow)
51
+ setCursor(c => Math.min(hooks.length - 1, c + 1));
52
+ });
53
+ if (hooks.length === 0) {
54
+ return _jsx(Text, { dimColor: true, children: "Loading hooks status..." });
55
+ }
56
+ const selected = hooks[cursor];
57
+ return (_jsx(Box, { flexDirection: "column", paddingX: 1, children: _jsxs(Box, { borderStyle: "round", borderColor: "cyan", flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "HOOKS STATUS" }), _jsx(Text, { children: " " }), _jsxs(Box, { gap: 2, children: [_jsx(Text, { children: "Statusline:" }), statusLine
58
+ ? _jsx(Text, { bold: true, color: "green", children: "installed" })
59
+ : _jsx(Text, { bold: true, color: "red", children: "not installed" })] }), _jsx(Text, { children: " " }), _jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: pad('', 2) }), _jsx(Text, { dimColor: true, bold: true, children: pad('Hook', 24) }), _jsx(Text, { dimColor: true, bold: true, children: pad('Event', 20) }), _jsx(Text, { dimColor: true, bold: true, children: pad('Level', 10) }), _jsx(Text, { dimColor: true, bold: true, children: pad('Status', 12) })] }), hooks.map((h, i) => {
60
+ const isCurrent = i === cursor;
61
+ const icon = h.installed
62
+ ? (h.enabled ? '✓' : '○')
63
+ : '✗';
64
+ const iconColor = h.installed
65
+ ? (h.enabled ? 'green' : 'yellow')
66
+ : 'red';
67
+ const matcher = h.matcher ? ` [${h.matcher}]` : '';
68
+ return (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: "cyan", children: isCurrent ? '›' : ' ' }), _jsx(Text, { color: iconColor, children: icon }), _jsx(Text, { bold: isCurrent, children: pad(h.name, 23) }), _jsx(Text, { dimColor: !isCurrent, children: pad(`${h.event}${matcher}`, 20) }), _jsx(Text, { dimColor: !isCurrent, children: pad(h.level, 10) }), _jsx(Text, { color: iconColor, children: h.installed ? (h.enabled ? 'active' : 'disabled') : 'not installed' })] }, h.name));
69
+ })] }), selected && (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: selected.requiresWorkspace ? '⚑ Requires workspace' : '' })] })), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: " \u2191/\u2193 navigate [q] back" }), _jsxs(Text, { dimColor: true, children: [" CLI: maestro hooks install --level ", '<', "minimal|standard|full", '>'] })] }) }));
70
+ }
71
+ function pad(s, width) {
72
+ return s.length >= width ? s : s + ' '.repeat(width - s.length);
73
+ }
74
+ function findHook(settings, name) {
75
+ if (!settings.hooks)
76
+ return false;
77
+ for (const eventKey of ['PreToolUse', 'PostToolUse', 'UserPromptSubmit', 'Notification', 'Stop']) {
78
+ const groups = settings.hooks[eventKey];
79
+ if (!Array.isArray(groups))
80
+ continue;
81
+ for (const group of groups) {
82
+ if (Array.isArray(group.hooks)) {
83
+ for (const h of group.hooks) {
84
+ if (h.command?.includes(name))
85
+ return true;
86
+ }
87
+ }
88
+ }
89
+ }
90
+ return false;
91
+ }
92
+ //# sourceMappingURL=HooksPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HooksPanel.js","sourceRoot":"","sources":["../../../../src/tui/config-ui/HooksPanel.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAiBlD,MAAM,UAAU,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAmB;IAC7D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAa,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,EAAE,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,KAAK,UAAU,UAAU;QACvB,MAAM,EACJ,SAAS,EACT,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,GACnB,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAQ,CAAC;QACnD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAElE,MAAM,YAAY,GAAG,qBAAqB,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QAEjC,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;QACjF,aAAa,CAAC,aAAa,CAAC,CAAC;QAC7B,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAErC,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAoB,EAAE,CAAC;YACvE,iCAAiC;YACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC3C,eAAe;YACf,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/E,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC;YAEpD,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI;gBACJ,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,SAAS;gBACT,OAAO;gBACP,iBAAiB,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB;aAC3C,CAAC,CAAC;QACL,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IAED,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,MAAM;gBAAE,MAAM,EAAE,CAAC;;gBAChB,IAAI,EAAE,CAAC;QACd,CAAC;QACD,IAAI,GAAG,CAAC,OAAO;YAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpD,IAAI,GAAG,CAAC,SAAS;YAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAC,IAAI,IAAC,QAAQ,8CAA+B,CAAC;IACvD,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAE/B,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,YACrC,MAAC,GAAG,IAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,aACzF,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,6BAAoB,EAC3C,KAAC,IAAI,oBAAS,EAEd,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,IAAI,8BAAmB,EACvB,UAAU;4BACT,CAAC,CAAC,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,OAAO,0BAAiB;4BAC3C,CAAC,CAAC,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,KAAK,8BAAqB,IAE3C,EACN,KAAC,IAAI,oBAAS,EAEd,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,IAAI,IAAC,QAAQ,kBAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAQ,EAClC,KAAC,IAAI,IAAC,QAAQ,QAAC,IAAI,kBAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,GAAQ,EAC5C,KAAC,IAAI,IAAC,QAAQ,QAAC,IAAI,kBAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,GAAQ,EAC7C,KAAC,IAAI,IAAC,QAAQ,QAAC,IAAI,kBAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,GAAQ,EAC7C,KAAC,IAAI,IAAC,QAAQ,QAAC,IAAI,kBAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAQ,IAC1C,EACL,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;4BAClB,MAAM,SAAS,GAAG,CAAC,KAAK,MAAM,CAAC;4BAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS;gCACtB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gCACzB,CAAC,CAAC,GAAG,CAAC;4BACR,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS;gCAC3B,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;gCAClC,CAAC,CAAC,KAAK,CAAC;4BACV,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;4BAEnD,OAAO,CACL,MAAC,GAAG,IAAc,GAAG,EAAE,CAAC,aACtB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAQ,EACjD,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,YAAG,IAAI,GAAQ,EACrC,KAAC,IAAI,IAAC,IAAI,EAAE,SAAS,YAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAQ,EAC/C,KAAC,IAAI,IAAC,QAAQ,EAAE,CAAC,SAAS,YAAG,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC,GAAQ,EACpE,KAAC,IAAI,IAAC,QAAQ,EAAE,CAAC,SAAS,YAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAQ,EACrD,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,YACnB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,eAAe,GAC/D,KARC,CAAC,CAAC,IAAI,CASV,CACP,CAAC;wBACJ,CAAC,CAAC,IACE,EAEL,QAAQ,IAAI,CACX,8BACE,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,QAAQ,kBACX,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,GACpD,IACN,CACJ,EAED,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,QAAQ,yDAAgC,EAC9C,MAAC,IAAI,IAAC,QAAQ,4DAAuC,GAAG,2BAAuB,GAAG,IAAQ,IACtF,GACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CAAC,CAAS,EAAE,KAAa;IACnC,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,QAAQ,CAAC,QAAa,EAAE,IAAY;IAC3C,IAAI,CAAC,QAAQ,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,KAAK,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC;QACjG,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,SAAS;QACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAC5B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC;wBAAE,OAAO,IAAI,CAAC;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,9 @@
1
+ type View = 'dashboard' | 'skills' | 'editor' | 'sources';
2
+ export interface SkillConfigDashboardProps {
3
+ workDir: string;
4
+ initialView?: View;
5
+ editSkill?: string;
6
+ }
7
+ export declare function SkillConfigDashboard({ workDir, initialView, editSkill }: SkillConfigDashboardProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=SkillConfigDashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillConfigDashboard.d.ts","sourceRoot":"","sources":["../../../../src/tui/config-ui/SkillConfigDashboard.tsx"],"names":[],"mappings":"AAeA,KAAK,IAAI,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE1D,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,yBAAyB,2CA8HlG"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text, useInput, useApp } from 'ink';
4
+ import { loadSkillConfig, } from '../../config/skill-config.js';
5
+ import { loadAllCommandDefs, } from '../../config/argument-hint-parser.js';
6
+ import { checkSkillContextHook } from '../../commands/config.js';
7
+ import { SkillsList } from './SkillsList.js';
8
+ import { SkillParamEditor } from './SkillParamEditor.js';
9
+ import { ConfigSourcesView } from './ConfigSourcesView.js';
10
+ export function SkillConfigDashboard({ workDir, initialView, editSkill }) {
11
+ const { exit } = useApp();
12
+ const [view, setView] = useState(initialView ?? 'dashboard');
13
+ const [config, setConfig] = useState(null);
14
+ const [commandDefs, setCommandDefs] = useState(null);
15
+ const [selectedSkill, setSelectedSkill] = useState(editSkill ?? null);
16
+ const [hookStatus, setHookStatus] = useState('installed');
17
+ const reload = () => {
18
+ setConfig(loadSkillConfig(workDir));
19
+ setCommandDefs(loadAllCommandDefs(workDir));
20
+ };
21
+ useEffect(() => {
22
+ reload();
23
+ setHookStatus(checkSkillContextHook());
24
+ // If editSkill was provided, jump directly to editor
25
+ if (editSkill)
26
+ setView('editor');
27
+ }, []);
28
+ useInput((input, key) => {
29
+ if (view !== 'dashboard')
30
+ return;
31
+ if (input === '1')
32
+ setView('skills');
33
+ if (input === '2')
34
+ setView('sources');
35
+ if (input === 'q' || key.escape)
36
+ exit();
37
+ });
38
+ if (!config || !commandDefs) {
39
+ return _jsx(Text, { dimColor: true, children: "Loading configuration..." });
40
+ }
41
+ if (view === 'skills') {
42
+ return (_jsx(SkillsList, { config: config, commandDefs: commandDefs, workDir: workDir, onBack: () => { reload(); setView('dashboard'); }, onEdit: (skill) => { setSelectedSkill(skill); setView('editor'); }, onReload: reload }));
43
+ }
44
+ if (view === 'editor' && selectedSkill) {
45
+ const def = commandDefs.get(selectedSkill);
46
+ return (_jsx(SkillParamEditor, { skillName: selectedSkill, commandDef: def ?? null, config: config, workDir: workDir, onBack: () => { reload(); setView('skills'); }, onReload: reload }));
47
+ }
48
+ if (view === 'sources') {
49
+ return _jsx(ConfigSourcesView, { workDir: workDir, onBack: () => { reload(); setView('dashboard'); } });
50
+ }
51
+ // Dashboard view
52
+ const configuredSkills = Object.entries(config.skills);
53
+ const totalCommands = commandDefs.size;
54
+ return (_jsx(Box, { flexDirection: "column", paddingX: 1, children: _jsxs(Box, { borderStyle: "round", borderColor: "cyan", flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "MAESTRO SKILL CONFIG" }), _jsx(Text, { children: " " }), _jsxs(Box, { gap: 2, children: [_jsx(Text, { children: "Commands discovered:" }), _jsx(Text, { bold: true, color: "green", children: totalCommands })] }), _jsxs(Box, { gap: 2, children: [_jsx(Text, { children: "Skills with defaults:" }), _jsx(Text, { bold: true, color: "yellow", children: configuredSkills.length })] }), _jsxs(Box, { gap: 2, children: [_jsx(Text, { children: "Hook (skill-context):" }), hookStatus === 'installed'
55
+ ? _jsx(Text, { bold: true, color: "green", children: "installed" })
56
+ : _jsx(Text, { bold: true, color: "red", children: "not installed" })] }), hookStatus === 'not-installed' && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "red", children: " Parameter injection requires the skill-context hook." }) })), hookStatus === 'not-installed' && (_jsx(Text, { dimColor: true, children: " Run: maestro hooks install --level standard" })), configuredSkills.length > 0 && (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "Configured:" }), configuredSkills.slice(0, 8).map(([name, defaults]) => {
57
+ const paramCount = Object.keys(defaults.params).length;
58
+ return (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: "green", children: " \u2713" }), _jsx(Text, { bold: true, children: padRight(name, 28) }), _jsxs(Text, { dimColor: true, children: [paramCount, " param", paramCount !== 1 ? 's' : ''] })] }, name));
59
+ }), configuredSkills.length > 8 && (_jsxs(Text, { dimColor: true, children: [" ... and ", configuredSkills.length - 8, " more"] }))] })), _jsx(Text, { children: " " }), _jsxs(Box, { gap: 2, children: [_jsx(Text, { color: "cyan", children: "[1]" }), _jsx(Text, { children: "Skills" }), _jsx(Text, { color: "cyan", children: "[2]" }), _jsx(Text, { children: "Config Sources" })] }), _jsx(Text, { dimColor: true, children: " [q] Quit" })] }) }));
60
+ }
61
+ function padRight(s, width) {
62
+ return s.length >= width ? s : s + ' '.repeat(width - s.length);
63
+ }
64
+ //# sourceMappingURL=SkillConfigDashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillConfigDashboard.js","sourceRoot":"","sources":["../../../../src/tui/config-ui/SkillConfigDashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type CommandDef } from '../../config/argument-hint-parser.js';
2
+ import { type SkillConfigFile } from '../../config/skill-config.js';
3
+ export interface SkillParamEditorProps {
4
+ skillName: string;
5
+ commandDef: CommandDef | null;
6
+ config: SkillConfigFile;
7
+ workDir: string;
8
+ onBack: () => void;
9
+ onReload: () => void;
10
+ }
11
+ export declare function SkillParamEditor({ skillName, commandDef, config, workDir, onBack, onReload, }: SkillParamEditorProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=SkillParamEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillParamEditor.d.ts","sourceRoot":"","sources":["../../../../src/tui/config-ui/SkillParamEditor.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,UAAU,EAEhB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAID,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,GACT,EAAE,qBAAqB,2CAoMvB"}
@@ -0,0 +1,162 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useMemo } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { TextInput } from '@inkjs/ui';
5
+ import { getConfigurableParams, } from '../../config/argument-hint-parser.js';
6
+ import { setSkillParam, unsetSkillParam, } from '../../config/skill-config.js';
7
+ export function SkillParamEditor({ skillName, commandDef, config, workDir, onBack, onReload, }) {
8
+ const params = useMemo(() => {
9
+ if (!commandDef)
10
+ return [];
11
+ return getConfigurableParams(commandDef.params);
12
+ }, [commandDef]);
13
+ const defaults = config.skills[skillName]?.params ?? {};
14
+ const [cursor, setCursor] = useState(0);
15
+ const [mode, setMode] = useState('list');
16
+ const [editValue, setEditValue] = useState('');
17
+ const [pendingSave, setPendingSave] = useState(null);
18
+ useInput((input, key) => {
19
+ if (mode === 'edit-value') {
20
+ if (key.escape) {
21
+ setMode('list');
22
+ return;
23
+ }
24
+ if (key.return) {
25
+ // Commit edit
26
+ const param = params[cursor];
27
+ if (param && editValue.trim()) {
28
+ const parsed = parseInputValue(editValue, param);
29
+ setPendingSave({ param: param.name, value: parsed });
30
+ setMode('scope-select');
31
+ }
32
+ else {
33
+ setMode('list');
34
+ }
35
+ return;
36
+ }
37
+ return; // TextInput handles the rest
38
+ }
39
+ if (mode === 'scope-select') {
40
+ if (input === 'g' && pendingSave) {
41
+ setSkillParam(skillName, pendingSave.param, pendingSave.value, 'global');
42
+ setPendingSave(null);
43
+ setMode('list');
44
+ onReload();
45
+ return;
46
+ }
47
+ if (input === 'p' && pendingSave) {
48
+ setSkillParam(skillName, pendingSave.param, pendingSave.value, 'workspace', workDir);
49
+ setPendingSave(null);
50
+ setMode('list');
51
+ onReload();
52
+ return;
53
+ }
54
+ if (key.escape) {
55
+ setPendingSave(null);
56
+ setMode('list');
57
+ return;
58
+ }
59
+ return;
60
+ }
61
+ // list mode
62
+ if (key.escape) {
63
+ onBack();
64
+ return;
65
+ }
66
+ if (params.length === 0)
67
+ return;
68
+ if (key.upArrow)
69
+ setCursor(c => c > 0 ? c - 1 : params.length - 1);
70
+ if (key.downArrow)
71
+ setCursor(c => c < params.length - 1 ? c + 1 : 0);
72
+ const param = params[cursor];
73
+ if (!param)
74
+ return;
75
+ if (input === ' ') {
76
+ // Toggle boolean / cycle enum
77
+ if (param.type === 'boolean') {
78
+ const current = defaults[param.name];
79
+ const newVal = current === true ? false : true;
80
+ setPendingSave({ param: param.name, value: newVal });
81
+ setMode('scope-select');
82
+ }
83
+ else if (param.type === 'enum' && param.choices) {
84
+ const current = defaults[param.name];
85
+ const idx = param.choices.indexOf(String(current));
86
+ const next = param.choices[(idx + 1) % param.choices.length];
87
+ setPendingSave({ param: param.name, value: next });
88
+ setMode('scope-select');
89
+ }
90
+ }
91
+ if (key.return || input === 'e') {
92
+ // Enter edit mode for string/number, or toggle boolean
93
+ if (param.type === 'boolean') {
94
+ const current = defaults[param.name];
95
+ const newVal = current === true ? false : true;
96
+ setPendingSave({ param: param.name, value: newVal });
97
+ setMode('scope-select');
98
+ }
99
+ else {
100
+ setEditValue(defaults[param.name] !== undefined ? String(defaults[param.name]) : '');
101
+ setMode('edit-value');
102
+ }
103
+ }
104
+ if (input === 'd') {
105
+ // Delete current param default
106
+ if (defaults[param.name] !== undefined) {
107
+ unsetSkillParam(skillName, param.name, 'global');
108
+ unsetSkillParam(skillName, param.name, 'workspace', workDir);
109
+ onReload();
110
+ }
111
+ }
112
+ });
113
+ if (!commandDef) {
114
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsxs(Text, { bold: true, color: "red", children: ["Skill not found: ", skillName] }), _jsx(Text, { dimColor: true, children: "No matching command in .claude/commands/" }), _jsx(Text, { dimColor: true, children: "[Esc] Back" })] }));
115
+ }
116
+ if (params.length === 0) {
117
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: skillName }), _jsxs(Text, { dimColor: true, children: ["hint: ", commandDef.argumentHint || '(none)'] }), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "No configurable parameters (only positional args)." }), _jsx(Text, { dimColor: true, children: "[Esc] Back" })] }));
118
+ }
119
+ // Scope selection overlay
120
+ if (mode === 'scope-select' && pendingSave) {
121
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsxs(Text, { bold: true, color: "cyan", children: ["Save: ", pendingSave.param, " = ", String(pendingSave.value)] }), _jsx(Text, { children: " " }), _jsxs(Box, { gap: 2, children: [_jsx(Text, { color: "yellow", children: "[g]" }), _jsx(Text, { children: "Global (~/.maestro/)" })] }), _jsxs(Box, { gap: 2, children: [_jsx(Text, { color: "yellow", children: "[p]" }), _jsx(Text, { children: "Project (.maestro/)" })] }), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "[Esc] Cancel" })] }));
122
+ }
123
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: skillName }), _jsxs(Text, { dimColor: true, children: ["hint: ", commandDef.argumentHint] }), _jsx(Text, { children: " " }), params.map((param, i) => {
124
+ const active = i === cursor;
125
+ const color = active ? 'cyan' : undefined;
126
+ const hasValue = defaults[param.name] !== undefined;
127
+ const displayValue = hasValue ? String(defaults[param.name]) : '<not set>';
128
+ const typeHint = formatTypeHint(param);
129
+ const isEditing = mode === 'edit-value' && active;
130
+ return (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: color, children: active ? '▸' : ' ' }), _jsx(Text, { bold: active, color: color, children: pad(param.name, 20) }), isEditing ? (_jsx(Box, { children: _jsx(TextInput, { defaultValue: editValue, onSubmit: (val) => {
131
+ const param = params[cursor];
132
+ if (param && val.trim()) {
133
+ const parsed = parseInputValue(val, param);
134
+ setPendingSave({ param: param.name, value: parsed });
135
+ setMode('scope-select');
136
+ }
137
+ else {
138
+ setMode('list');
139
+ }
140
+ } }) })) : (_jsxs(_Fragment, { children: [param.type === 'boolean' ? (_jsxs(Text, { color: hasValue ? (defaults[param.name] ? 'green' : 'red') : undefined, children: [hasValue ? (defaults[param.name] ? '[x]' : '[ ]') : '[ ]', ' ', displayValue] })) : (_jsx(Text, { color: hasValue ? 'yellow' : undefined, dimColor: !hasValue, children: pad(displayValue, 16) })), _jsxs(Text, { dimColor: true, children: ["(", typeHint, ")"] })] }))] }, param.name));
141
+ }), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "[\u2191\u2193] Navigate [Space] Toggle/Cycle [Enter] Edit [d] Delete [Esc] Back" })] }));
142
+ }
143
+ function formatTypeHint(param) {
144
+ if (param.type === 'enum' && param.choices) {
145
+ return param.choices.join('|');
146
+ }
147
+ return param.type;
148
+ }
149
+ function parseInputValue(raw, param) {
150
+ if (param.type === 'boolean') {
151
+ return raw === 'true' || raw === '1' || raw === 'yes';
152
+ }
153
+ if (param.type === 'number') {
154
+ const num = Number(raw);
155
+ return isNaN(num) ? raw : num;
156
+ }
157
+ return raw;
158
+ }
159
+ function pad(s, width) {
160
+ return s.length >= width ? s.slice(0, width) : s + ' '.repeat(width - s.length);
161
+ }
162
+ //# sourceMappingURL=SkillParamEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillParamEditor.js","sourceRoot":"","sources":["../../../../src/tui/config-ui/SkillParamEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type CommandDef } from '../../config/argument-hint-parser.js';
2
+ import { type SkillConfigFile } from '../../config/skill-config.js';
3
+ export interface SkillsListProps {
4
+ config: SkillConfigFile;
5
+ commandDefs: Map<string, CommandDef>;
6
+ workDir: string;
7
+ onBack: () => void;
8
+ onEdit: (skillName: string) => void;
9
+ onReload: () => void;
10
+ }
11
+ export declare function SkillsList({ config, commandDefs, workDir, onBack, onEdit, onReload }: SkillsListProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=SkillsList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillsList.d.ts","sourceRoot":"","sources":["../../../../src/tui/config-ui/SkillsList.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,UAAU,EAChB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,eAAe,2CAkHrG"}
@@ -0,0 +1,91 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState, useMemo } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { TextInput } from '@inkjs/ui';
5
+ import { getConfigurableParams, } from '../../config/argument-hint-parser.js';
6
+ import { resetSkillConfig, } from '../../config/skill-config.js';
7
+ export function SkillsList({ config, commandDefs, workDir, onBack, onEdit, onReload }) {
8
+ const [cursor, setCursor] = useState(0);
9
+ const [filter, setFilter] = useState('');
10
+ const [filterMode, setFilterMode] = useState(false);
11
+ // Build sorted list: configured skills first, then rest
12
+ const allSkills = useMemo(() => {
13
+ const entries = [...commandDefs.entries()]
14
+ .map(([name, def]) => ({
15
+ name,
16
+ def,
17
+ configurable: getConfigurableParams(def.params).length,
18
+ configured: config.skills[name] ? Object.keys(config.skills[name].params).length : 0,
19
+ }))
20
+ .sort((a, b) => {
21
+ // Configured first, then alphabetical
22
+ if (a.configured > 0 && b.configured === 0)
23
+ return -1;
24
+ if (a.configured === 0 && b.configured > 0)
25
+ return 1;
26
+ return a.name.localeCompare(b.name);
27
+ });
28
+ return entries;
29
+ }, [commandDefs, config]);
30
+ const filtered = useMemo(() => {
31
+ if (!filter)
32
+ return allSkills;
33
+ const q = filter.toLowerCase();
34
+ return allSkills.filter(s => s.name.toLowerCase().includes(q));
35
+ }, [allSkills, filter]);
36
+ // Page-based display (max 20 visible at a time)
37
+ const PAGE_SIZE = 20;
38
+ const pageStart = Math.floor(cursor / PAGE_SIZE) * PAGE_SIZE;
39
+ const visible = filtered.slice(pageStart, pageStart + PAGE_SIZE);
40
+ useInput((input, key) => {
41
+ if (filterMode) {
42
+ if (key.escape) {
43
+ setFilterMode(false);
44
+ setFilter('');
45
+ return;
46
+ }
47
+ if (key.return) {
48
+ setFilterMode(false);
49
+ setCursor(0);
50
+ return;
51
+ }
52
+ return; // TextInput handles the rest
53
+ }
54
+ if (key.escape) {
55
+ onBack();
56
+ return;
57
+ }
58
+ if (key.upArrow)
59
+ setCursor(c => c > 0 ? c - 1 : filtered.length - 1);
60
+ if (key.downArrow)
61
+ setCursor(c => c < filtered.length - 1 ? c + 1 : 0);
62
+ if (key.return && filtered.length > 0) {
63
+ onEdit(filtered[cursor].name);
64
+ }
65
+ if (input === '/' || input === 'f') {
66
+ setFilterMode(true);
67
+ setFilter('');
68
+ }
69
+ if (input === 'x' && filtered.length > 0) {
70
+ const skill = filtered[cursor];
71
+ if (skill.configured > 0) {
72
+ resetSkillConfig(skill.name, 'global', workDir);
73
+ onReload();
74
+ }
75
+ }
76
+ });
77
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsxs(Text, { bold: true, color: "cyan", children: ["Skills (", filtered.length, "/", allSkills.length, ")"] }), filterMode ? (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: "yellow", children: "Filter:" }), _jsx(TextInput, { defaultValue: filter, onSubmit: (val) => { setFilter(val); setFilterMode(false); setCursor(0); } })] })) : (filter && _jsxs(Text, { dimColor: true, children: ["Filter: ", filter] })), _jsx(Text, { children: " " }), _jsxs(Box, { gap: 1, children: [_jsxs(Text, { dimColor: true, children: [' ', pad('Skill', 28)] }), _jsx(Text, { dimColor: true, children: pad('Params', 8) }), _jsx(Text, { dimColor: true, children: pad('Set', 6) }), _jsx(Text, { dimColor: true, children: "Hint" })] }), _jsx(Text, { dimColor: true, children: ' ' + '─'.repeat(85) }), visible.map((skill, i) => {
78
+ const idx = pageStart + i;
79
+ const active = idx === cursor;
80
+ const color = active ? 'cyan' : undefined;
81
+ const hasConfig = skill.configured > 0;
82
+ const hint = skill.def.argumentHint.length > 38
83
+ ? skill.def.argumentHint.slice(0, 35) + '...'
84
+ : skill.def.argumentHint;
85
+ return (_jsxs(Box, { gap: 1, children: [_jsxs(Text, { color: hasConfig ? 'green' : color, children: [active ? '▸' : ' ', hasConfig ? '●' : ' '] }), _jsx(Text, { bold: active, color: color, children: pad(skill.name, 28) }), _jsx(Text, { color: color, children: pad(String(skill.configurable), 8) }), _jsx(Text, { color: hasConfig ? 'yellow' : undefined, dimColor: !hasConfig, children: pad(hasConfig ? String(skill.configured) : '—', 6) }), _jsx(Text, { dimColor: true, children: hint || '(no params)' })] }, skill.name));
86
+ }), filtered.length > PAGE_SIZE && (_jsxs(Text, { dimColor: true, children: [" Page ", Math.floor(cursor / PAGE_SIZE) + 1, "/", Math.ceil(filtered.length / PAGE_SIZE)] })), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "[\u2191\u2193] Navigate [Enter] Edit [/] Filter [x] Clear defaults [Esc] Back" })] }));
87
+ }
88
+ function pad(s, width) {
89
+ return s.length >= width ? s.slice(0, width) : s + ' '.repeat(width - s.length);
90
+ }
91
+ //# sourceMappingURL=SkillsList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillsList.js","sourceRoot":"","sources":["../../../../src/tui/config-ui/SkillsList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface SpecPanelProps {
2
+ workDir: string;
3
+ onBack?: () => void;
4
+ }
5
+ export declare function SpecPanel({ workDir, onBack }: SpecPanelProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=SpecPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpecPanel.d.ts","sourceRoot":"","sources":["../../../../src/tui/config-ui/SpecPanel.tsx"],"names":[],"mappings":"AAeA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAQD,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,cAAc,2CAqH5D"}
@@ -0,0 +1,79 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text, useInput, useApp } from 'ink';
4
+ const SCOPE_LABELS = {
5
+ project: 'Project',
6
+ global: 'Global',
7
+ team: 'Team',
8
+ };
9
+ export function SpecPanel({ workDir, onBack }) {
10
+ const { exit } = useApp();
11
+ const [scopes, setScopes] = useState([]);
12
+ const [activeScope, setActiveScope] = useState(0);
13
+ const [cursor, setCursor] = useState(0);
14
+ useEffect(() => {
15
+ loadStatus();
16
+ }, []);
17
+ async function loadStatus() {
18
+ const { existsSync, readdirSync, readFileSync } = await import('node:fs');
19
+ const { join } = await import('node:path');
20
+ const { resolveSpecDir } = await import('../../tools/spec-loader.js');
21
+ const result = [];
22
+ for (const scope of ['project', 'global', 'team']) {
23
+ const dir = resolveSpecDir(workDir, scope);
24
+ const exists = existsSync(dir);
25
+ const files = [];
26
+ if (exists) {
27
+ const entries = readdirSync(dir).filter((f) => f.endsWith('.md'));
28
+ for (const file of entries) {
29
+ const content = readFileSync(join(dir, file), 'utf-8');
30
+ const entryCount = (content.match(/<spec-entry\b/g) || []).length;
31
+ files.push({ name: file, entries: entryCount, size: content.length });
32
+ }
33
+ }
34
+ result.push({ scope, exists, files });
35
+ }
36
+ setScopes(result);
37
+ }
38
+ const currentScope = scopes[activeScope];
39
+ const fileCount = currentScope?.files.length ?? 0;
40
+ useInput((input, key) => {
41
+ if (input === 'q' || key.escape) {
42
+ if (onBack)
43
+ onBack();
44
+ else
45
+ exit();
46
+ }
47
+ if (key.leftArrow) {
48
+ setActiveScope(s => Math.max(0, s - 1));
49
+ setCursor(0);
50
+ }
51
+ if (key.rightArrow) {
52
+ setActiveScope(s => Math.min(scopes.length - 1, s + 1));
53
+ setCursor(0);
54
+ }
55
+ if (key.upArrow)
56
+ setCursor(c => Math.max(0, c - 1));
57
+ if (key.downArrow)
58
+ setCursor(c => Math.min(fileCount - 1, c + 1));
59
+ });
60
+ if (scopes.length === 0) {
61
+ return _jsx(Text, { dimColor: true, children: "Loading spec status..." });
62
+ }
63
+ return (_jsx(Box, { flexDirection: "column", paddingX: 1, children: _jsxs(Box, { borderStyle: "round", borderColor: "cyan", flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "SPEC SYSTEM" }), _jsx(Text, { children: " " }), _jsx(Box, { gap: 1, children: scopes.map((s, i) => (_jsx(Box, { paddingX: 1, children: i === activeScope
64
+ ? _jsx(Text, { bold: true, inverse: true, color: "cyan", children: ` ${SCOPE_LABELS[s.scope]} ` })
65
+ : _jsx(Text, { dimColor: true, children: ` ${SCOPE_LABELS[s.scope]} ` }) }, s.scope))) }), _jsx(Text, { children: " " }), !currentScope.exists ? (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "red", children: " Directory not initialized" }), _jsxs(Text, { dimColor: true, children: [" Run: maestro spec init --scope ", currentScope.scope] })] })) : currentScope.files.length === 0 ? (_jsx(Text, { dimColor: true, children: " No spec files found" })) : (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: pad('', 2) }), _jsx(Text, { dimColor: true, bold: true, children: pad('File', 30) }), _jsx(Text, { dimColor: true, bold: true, children: pad('Entries', 10) }), _jsx(Text, { dimColor: true, bold: true, children: "Size" })] }), currentScope.files.map((f, i) => {
66
+ const isCurrent = i === cursor;
67
+ const hasEntries = f.entries > 0;
68
+ return (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: "cyan", children: isCurrent ? '›' : ' ' }), _jsx(Text, { color: hasEntries ? 'green' : 'yellow', children: hasEntries ? '✓' : '○' }), _jsx(Text, { bold: isCurrent, children: pad(f.name, 29) }), _jsx(Text, { dimColor: !isCurrent, children: pad(String(f.entries), 10) }), _jsx(Text, { dimColor: true, children: formatSize(f.size) })] }, f.name));
69
+ })] })), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: " \u2190/\u2192 scope \u2191/\u2193 navigate [q] back" }), _jsxs(Text, { dimColor: true, children: [" CLI: maestro spec ", '<', "init|load|add|list|status", '>'] })] }) }));
70
+ }
71
+ function pad(s, width) {
72
+ return s.length >= width ? s : s + ' '.repeat(width - s.length);
73
+ }
74
+ function formatSize(bytes) {
75
+ if (bytes < 1024)
76
+ return `${bytes} B`;
77
+ return `${(bytes / 1024).toFixed(1)} KB`;
78
+ }
79
+ //# sourceMappingURL=SpecPanel.js.map