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.
- package/.claude/commands/learn-retro.md +1 -1
- package/.claude/commands/maestro-composer.md +2 -2
- package/.claude/commands/maestro-ralph-execute.md +1 -1
- package/.claude/commands/maestro-ralph.md +11 -11
- package/.claude/commands/maestro-verify.md +1 -1
- package/.claude/commands/maestro.md +1 -2
- package/.claude/commands/quality-auto-test.md +124 -0
- package/.claude/commands/quality-refactor.md +1 -1
- package/.claude/commands/quality-test.md +3 -3
- package/.codex/skills/learn-retro/SKILL.md +1 -1
- package/.codex/skills/maestro/SKILL.md +1 -1
- package/.codex/skills/maestro-link-coordinate/SKILL.md +1 -1
- package/.codex/skills/maestro-milestone-audit/SKILL.md +9 -1
- package/.codex/skills/maestro-plan/SKILL.md +72 -6
- package/.codex/skills/maestro-ralph/SKILL.md +159 -159
- package/.codex/skills/maestro-roadmap/SKILL.md +31 -5
- package/.codex/skills/maestro-verify/SKILL.md +1 -1
- package/.codex/skills/quality-auto-test/SKILL.md +547 -0
- package/.codex/skills/quality-debug/SKILL.md +18 -6
- package/.codex/skills/quality-refactor/SKILL.md +8 -1
- package/.codex/skills/quality-sync/SKILL.md +23 -4
- package/.codex/skills/quality-test/SKILL.md +498 -166
- package/dashboard/dist-server/src/config/cli-tools-config.js +5 -20
- package/dashboard/dist-server/src/config/cli-tools-config.js.map +1 -1
- package/dashboard/dist-server/src/config/cli-tools-defaults.json +17 -0
- package/dist/src/commands/config.d.ts.map +1 -1
- package/dist/src/commands/config.js +168 -32
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/hooks.d.ts +9 -0
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +1 -1
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/install.js +1 -1
- package/dist/src/commands/install.js.map +1 -1
- package/dist/src/commands/overlay.js +1 -1
- package/dist/src/commands/overlay.js.map +1 -1
- package/dist/src/commands/tools.d.ts.map +1 -1
- package/dist/src/commands/tools.js +7 -17
- package/dist/src/commands/tools.js.map +1 -1
- package/dist/src/commands/uninstall.js +1 -1
- package/dist/src/commands/uninstall.js.map +1 -1
- package/dist/src/config/cli-tools-config.d.ts.map +1 -1
- package/dist/src/config/cli-tools-config.js +5 -20
- package/dist/src/config/cli-tools-config.js.map +1 -1
- package/dist/src/config/cli-tools-defaults.json +17 -0
- package/dist/src/tui/config-ui/ConfigHub.d.ts +14 -0
- package/dist/src/tui/config-ui/ConfigHub.d.ts.map +1 -0
- package/dist/src/tui/config-ui/ConfigHub.js +125 -0
- package/dist/src/tui/config-ui/ConfigHub.js.map +1 -0
- package/dist/src/tui/config-ui/ConfigSourcesView.d.ts +6 -0
- package/dist/src/tui/config-ui/ConfigSourcesView.d.ts.map +1 -0
- package/dist/src/tui/config-ui/ConfigSourcesView.js +25 -0
- package/dist/src/tui/config-ui/ConfigSourcesView.js.map +1 -0
- package/dist/src/tui/config-ui/HooksPanel.d.ts +6 -0
- package/dist/src/tui/config-ui/HooksPanel.d.ts.map +1 -0
- package/dist/src/tui/config-ui/HooksPanel.js +92 -0
- package/dist/src/tui/config-ui/HooksPanel.js.map +1 -0
- package/dist/src/tui/config-ui/SkillConfigDashboard.d.ts +9 -0
- package/dist/src/tui/config-ui/SkillConfigDashboard.d.ts.map +1 -0
- package/dist/src/tui/config-ui/SkillConfigDashboard.js +64 -0
- package/dist/src/tui/config-ui/SkillConfigDashboard.js.map +1 -0
- package/dist/src/tui/config-ui/SkillParamEditor.d.ts +12 -0
- package/dist/src/tui/config-ui/SkillParamEditor.d.ts.map +1 -0
- package/dist/src/tui/config-ui/SkillParamEditor.js +162 -0
- package/dist/src/tui/config-ui/SkillParamEditor.js.map +1 -0
- package/dist/src/tui/config-ui/SkillsList.d.ts +12 -0
- package/dist/src/tui/config-ui/SkillsList.d.ts.map +1 -0
- package/dist/src/tui/config-ui/SkillsList.js +91 -0
- package/dist/src/tui/config-ui/SkillsList.js.map +1 -0
- package/dist/src/tui/config-ui/SpecPanel.d.ts +6 -0
- package/dist/src/tui/config-ui/SpecPanel.d.ts.map +1 -0
- package/dist/src/tui/config-ui/SpecPanel.js +79 -0
- package/dist/src/tui/config-ui/SpecPanel.js.map +1 -0
- package/dist/src/tui/config-ui/index.d.ts +23 -0
- package/dist/src/tui/config-ui/index.d.ts.map +1 -0
- package/dist/src/tui/config-ui/index.js +34 -0
- package/dist/src/tui/config-ui/index.js.map +1 -0
- package/dist/src/tui/index.d.ts +7 -0
- package/dist/src/tui/index.d.ts.map +1 -0
- package/dist/src/tui/index.js +10 -0
- package/dist/src/tui/index.js.map +1 -0
- package/dist/src/tui/install-ui/BackupConfig.d.ts +10 -0
- package/dist/src/tui/install-ui/BackupConfig.d.ts.map +1 -0
- package/dist/src/tui/install-ui/BackupConfig.js +46 -0
- package/dist/src/tui/install-ui/BackupConfig.js.map +1 -0
- package/dist/src/tui/install-ui/BlueprintPreview.d.ts +9 -0
- package/dist/src/tui/install-ui/BlueprintPreview.d.ts.map +1 -0
- package/dist/src/tui/install-ui/BlueprintPreview.js +65 -0
- package/dist/src/tui/install-ui/BlueprintPreview.js.map +1 -0
- package/dist/src/tui/install-ui/BlueprintPreview.logic.d.ts +33 -0
- package/dist/src/tui/install-ui/BlueprintPreview.logic.d.ts.map +1 -0
- package/dist/src/tui/install-ui/BlueprintPreview.logic.js +51 -0
- package/dist/src/tui/install-ui/BlueprintPreview.logic.js.map +1 -0
- package/dist/src/tui/install-ui/ComponentGrid.d.ts +13 -0
- package/dist/src/tui/install-ui/ComponentGrid.d.ts.map +1 -0
- package/dist/src/tui/install-ui/ComponentGrid.js +75 -0
- package/dist/src/tui/install-ui/ComponentGrid.js.map +1 -0
- package/dist/src/tui/install-ui/ComponentGrid.logic.d.ts +31 -0
- package/dist/src/tui/install-ui/ComponentGrid.logic.d.ts.map +1 -0
- package/dist/src/tui/install-ui/ComponentGrid.logic.js +58 -0
- package/dist/src/tui/install-ui/ComponentGrid.logic.js.map +1 -0
- package/dist/src/tui/install-ui/ConfigPanel.d.ts +11 -0
- package/dist/src/tui/install-ui/ConfigPanel.d.ts.map +1 -0
- package/dist/src/tui/install-ui/ConfigPanel.js +35 -0
- package/dist/src/tui/install-ui/ConfigPanel.js.map +1 -0
- package/dist/src/tui/install-ui/CyberItem.d.ts +18 -0
- package/dist/src/tui/install-ui/CyberItem.d.ts.map +1 -0
- package/dist/src/tui/install-ui/CyberItem.js +33 -0
- package/dist/src/tui/install-ui/CyberItem.js.map +1 -0
- package/dist/src/tui/install-ui/CyberdeckBlueprint.d.ts +7 -0
- package/dist/src/tui/install-ui/CyberdeckBlueprint.d.ts.map +1 -0
- package/dist/src/tui/install-ui/CyberdeckBlueprint.js +91 -0
- package/dist/src/tui/install-ui/CyberdeckBlueprint.js.map +1 -0
- package/dist/src/tui/install-ui/ExecutionView.d.ts +12 -0
- package/dist/src/tui/install-ui/ExecutionView.d.ts.map +1 -0
- package/dist/src/tui/install-ui/ExecutionView.js +154 -0
- package/dist/src/tui/install-ui/ExecutionView.js.map +1 -0
- package/dist/src/tui/install-ui/GradientHeader.d.ts +8 -0
- package/dist/src/tui/install-ui/GradientHeader.d.ts.map +1 -0
- package/dist/src/tui/install-ui/GradientHeader.js +18 -0
- package/dist/src/tui/install-ui/GradientHeader.js.map +1 -0
- package/dist/src/tui/install-ui/HooksConfig.d.ts +8 -0
- package/dist/src/tui/install-ui/HooksConfig.d.ts.map +1 -0
- package/dist/src/tui/install-ui/HooksConfig.js +35 -0
- package/dist/src/tui/install-ui/HooksConfig.js.map +1 -0
- package/dist/src/tui/install-ui/InstallConfirm.d.ts +27 -0
- package/dist/src/tui/install-ui/InstallConfirm.d.ts.map +1 -0
- package/dist/src/tui/install-ui/InstallConfirm.js +25 -0
- package/dist/src/tui/install-ui/InstallConfirm.js.map +1 -0
- package/dist/src/tui/install-ui/InstallExecution.d.ts +21 -0
- package/dist/src/tui/install-ui/InstallExecution.d.ts.map +1 -0
- package/dist/src/tui/install-ui/InstallExecution.js +154 -0
- package/dist/src/tui/install-ui/InstallExecution.js.map +1 -0
- package/dist/src/tui/install-ui/InstallFlow.d.ts +14 -0
- package/dist/src/tui/install-ui/InstallFlow.d.ts.map +1 -0
- package/dist/src/tui/install-ui/InstallFlow.js +186 -0
- package/dist/src/tui/install-ui/InstallFlow.js.map +1 -0
- package/dist/src/tui/install-ui/InstallHub.d.ts +33 -0
- package/dist/src/tui/install-ui/InstallHub.d.ts.map +1 -0
- package/dist/src/tui/install-ui/InstallHub.js +97 -0
- package/dist/src/tui/install-ui/InstallHub.js.map +1 -0
- package/dist/src/tui/install-ui/InstallResult.d.ts +7 -0
- package/dist/src/tui/install-ui/InstallResult.d.ts.map +1 -0
- package/dist/src/tui/install-ui/InstallResult.js +15 -0
- package/dist/src/tui/install-ui/InstallResult.js.map +1 -0
- package/dist/src/tui/install-ui/McpConfig.d.ts +12 -0
- package/dist/src/tui/install-ui/McpConfig.d.ts.map +1 -0
- package/dist/src/tui/install-ui/McpConfig.js +69 -0
- package/dist/src/tui/install-ui/McpConfig.js.map +1 -0
- package/dist/src/tui/install-ui/ResultDashboard.d.ts +8 -0
- package/dist/src/tui/install-ui/ResultDashboard.d.ts.map +1 -0
- package/dist/src/tui/install-ui/ResultDashboard.js +17 -0
- package/dist/src/tui/install-ui/ResultDashboard.js.map +1 -0
- package/dist/src/tui/install-ui/ReviewPanel.d.ts +19 -0
- package/dist/src/tui/install-ui/ReviewPanel.d.ts.map +1 -0
- package/dist/src/tui/install-ui/ReviewPanel.js +25 -0
- package/dist/src/tui/install-ui/ReviewPanel.js.map +1 -0
- package/dist/src/tui/install-ui/ShortcutFooter.d.ts +7 -0
- package/dist/src/tui/install-ui/ShortcutFooter.d.ts.map +1 -0
- package/dist/src/tui/install-ui/ShortcutFooter.js +15 -0
- package/dist/src/tui/install-ui/ShortcutFooter.js.map +1 -0
- package/dist/src/tui/install-ui/StatuslineConfig.d.ts +11 -0
- package/dist/src/tui/install-ui/StatuslineConfig.d.ts.map +1 -0
- package/dist/src/tui/install-ui/StatuslineConfig.js +39 -0
- package/dist/src/tui/install-ui/StatuslineConfig.js.map +1 -0
- package/dist/src/tui/install-ui/StepSelector.d.ts +14 -0
- package/dist/src/tui/install-ui/StepSelector.d.ts.map +1 -0
- package/dist/src/tui/install-ui/StepSelector.js +46 -0
- package/dist/src/tui/install-ui/StepSelector.js.map +1 -0
- package/dist/src/tui/install-ui/index.d.ts +8 -0
- package/dist/src/tui/install-ui/index.d.ts.map +1 -0
- package/dist/src/tui/install-ui/index.js +10 -0
- package/dist/src/tui/install-ui/index.js.map +1 -0
- package/dist/src/tui/install-ui/types.d.ts +35 -0
- package/dist/src/tui/install-ui/types.d.ts.map +1 -0
- package/dist/src/tui/install-ui/types.js +25 -0
- package/dist/src/tui/install-ui/types.js.map +1 -0
- package/dist/src/tui/overlay-ui/OverlayList.d.ts +37 -0
- package/dist/src/tui/overlay-ui/OverlayList.d.ts.map +1 -0
- package/dist/src/tui/overlay-ui/OverlayList.js +146 -0
- package/dist/src/tui/overlay-ui/OverlayList.js.map +1 -0
- package/dist/src/tui/overlay-ui/index.d.ts +18 -0
- package/dist/src/tui/overlay-ui/index.d.ts.map +1 -0
- package/dist/src/tui/overlay-ui/index.js +204 -0
- package/dist/src/tui/overlay-ui/index.js.map +1 -0
- package/dist/src/tui/render.d.ts +13 -0
- package/dist/src/tui/render.d.ts.map +1 -0
- package/dist/src/tui/render.js +31 -0
- package/dist/src/tui/render.js.map +1 -0
- package/dist/src/tui/tools-ui/CommandReference.d.ts +7 -0
- package/dist/src/tui/tools-ui/CommandReference.d.ts.map +1 -0
- package/dist/src/tui/tools-ui/CommandReference.js +33 -0
- package/dist/src/tui/tools-ui/CommandReference.js.map +1 -0
- package/dist/src/tui/tools-ui/ConfigSources.d.ts +6 -0
- package/dist/src/tui/tools-ui/ConfigSources.d.ts.map +1 -0
- package/dist/src/tui/tools-ui/ConfigSources.js +27 -0
- package/dist/src/tui/tools-ui/ConfigSources.js.map +1 -0
- package/dist/src/tui/tools-ui/RegisterSettings.d.ts +8 -0
- package/dist/src/tui/tools-ui/RegisterSettings.d.ts.map +1 -0
- package/dist/src/tui/tools-ui/RegisterSettings.js +125 -0
- package/dist/src/tui/tools-ui/RegisterSettings.js.map +1 -0
- package/dist/src/tui/tools-ui/RoleMappings.d.ts +9 -0
- package/dist/src/tui/tools-ui/RoleMappings.d.ts.map +1 -0
- package/dist/src/tui/tools-ui/RoleMappings.js +104 -0
- package/dist/src/tui/tools-ui/RoleMappings.js.map +1 -0
- package/dist/src/tui/tools-ui/ToolsDashboard.d.ts +8 -0
- package/dist/src/tui/tools-ui/ToolsDashboard.d.ts.map +1 -0
- package/dist/src/tui/tools-ui/ToolsDashboard.js +60 -0
- package/dist/src/tui/tools-ui/ToolsDashboard.js.map +1 -0
- package/dist/src/tui/tools-ui/ToolsOverview.d.ts +9 -0
- package/dist/src/tui/tools-ui/ToolsOverview.d.ts.map +1 -0
- package/dist/src/tui/tools-ui/ToolsOverview.js +84 -0
- package/dist/src/tui/tools-ui/ToolsOverview.js.map +1 -0
- package/dist/src/tui/tools-ui/index.d.ts +3 -0
- package/dist/src/tui/tools-ui/index.d.ts.map +1 -0
- package/dist/src/tui/tools-ui/index.js +6 -0
- package/dist/src/tui/tools-ui/index.js.map +1 -0
- package/dist/src/tui/uninstall-ui/UninstallFlow.d.ts +7 -0
- package/dist/src/tui/uninstall-ui/UninstallFlow.d.ts.map +1 -0
- package/dist/src/tui/uninstall-ui/UninstallFlow.js +189 -0
- package/dist/src/tui/uninstall-ui/UninstallFlow.js.map +1 -0
- package/dist/src/tui/uninstall-ui/index.d.ts +3 -0
- package/dist/src/tui/uninstall-ui/index.d.ts.map +1 -0
- package/dist/src/tui/uninstall-ui/index.js +6 -0
- package/dist/src/tui/uninstall-ui/index.js.map +1 -0
- package/package.json +1 -1
- package/workflows/auto-test.md +682 -0
- package/workflows/business-test.md +570 -0
- package/workflows/integration-test.md +1 -1
- package/workflows/maestro.codex.md +4 -3
- package/workflows/maestro.md +5 -4
- package/workflows/status.md +2 -2
- package/workflows/test.md +1 -1
- package/workflows/verify.md +1 -1
- package/.claude/commands/quality-business-test.md +0 -110
- package/.claude/commands/quality-integration-test.md +0 -67
- package/.claude/commands/quality-test-gen.md +0 -68
- package/.codex/skills/maestro-ralph-execute/SKILL.md +0 -219
- package/.codex/skills/quality-business-test/SKILL.md +0 -218
- package/.codex/skills/quality-integration-test/SKILL.md +0 -427
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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
|