skillmux 0.1.4 → 0.1.6
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/README.md +12 -5
- package/dist/{chunk-6TMTFWDX.js → chunk-IBW6H7BO.js} +4 -4
- package/dist/chunk-IBW6H7BO.js.map +1 -0
- package/dist/{chunk-EEIOA7GC.js → chunk-OY3C7VIL.js} +209 -102
- package/dist/chunk-OY3C7VIL.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/index.js +2 -2
- package/dist/{launch-tui-IC7COEGE.js → launch-tui-JD4F62FS.js} +418 -203
- package/dist/launch-tui-JD4F62FS.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-6TMTFWDX.js.map +0 -1
- package/dist/chunk-EEIOA7GC.js.map +0 -1
- package/dist/launch-tui-IC7COEGE.js.map +0 -1
package/README.md
CHANGED
|
@@ -81,7 +81,7 @@ agent 目录里通常只保留指向这里的链接。
|
|
|
81
81
|
|
|
82
82
|
## 支持的 agent 目录
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
SkillMux 会自动扫描用户 home 下的 `./xxx/skills` 目录并注册为新 agent。以下目录内置支持且无需自动发现:
|
|
85
85
|
|
|
86
86
|
- `.codex/skills`
|
|
87
87
|
- `.claude/skills`
|
|
@@ -89,7 +89,9 @@ agent 目录里通常只保留指向这里的链接。
|
|
|
89
89
|
- `.agents/skills`
|
|
90
90
|
- `.openclaw/skills`
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
当你安装了一个 SkillMux 不认识的新 agent(比如 `.cursor/skills`),它会在下次运行 `agents`、`scan` 或 `tui` 时自动注册到 `config.json`,标记为 `autoDiscovered`。
|
|
93
|
+
|
|
94
|
+
如果你的环境既不在内置列表、也没被自动发现,才需要手动 `skillmux config add-agent` 注册。
|
|
93
95
|
|
|
94
96
|
## 快速开始
|
|
95
97
|
|
|
@@ -99,13 +101,13 @@ agent 目录里通常只保留指向这里的链接。
|
|
|
99
101
|
skillmux agents
|
|
100
102
|
```
|
|
101
103
|
|
|
102
|
-
如果你的 agent
|
|
104
|
+
如果你的 agent 不在内置列表里,通常 SkillMux 会自动发现它。只有当自动发现未能识别到你的 agent 目录时,才需要手动添加:
|
|
103
105
|
|
|
104
106
|
```bash
|
|
105
107
|
skillmux config add-agent --id antigravity --root .gemini/antigravity --name "Gemini Antigravity"
|
|
106
108
|
```
|
|
107
109
|
|
|
108
|
-
如果之后不再需要这个自定义 agent
|
|
110
|
+
如果之后不再需要这个自定义 agent 规则,也可以删掉(自动发现的 agent 移除后不会被再次自动注册):
|
|
109
111
|
|
|
110
112
|
```bash
|
|
111
113
|
skillmux config remove-agent --id antigravity
|
|
@@ -169,7 +171,11 @@ skillmux doctor
|
|
|
169
171
|
|
|
170
172
|
### `skillmux agents`
|
|
171
173
|
|
|
172
|
-
查看当前识别到的 agent
|
|
174
|
+
查看当前识别到的 agent 目录,每行会标注发现方式:
|
|
175
|
+
|
|
176
|
+
- `builtin`:内置 agent
|
|
177
|
+
- `auto`:自动发现的 agent
|
|
178
|
+
- `custom`:手动注册的 agent
|
|
173
179
|
|
|
174
180
|
```bash
|
|
175
181
|
skillmux agents
|
|
@@ -352,6 +358,7 @@ skillmux config remove-agent --id antigravity --json
|
|
|
352
358
|
说明:
|
|
353
359
|
|
|
354
360
|
- 只会删除 `~/.skillmux/config.json` 里的该 agent override
|
|
361
|
+
- 如果是自动发现的 agent,移除后会被记录到 `removedAutoAgentIds`,不会被再次自动注册
|
|
355
362
|
- 不会删除 `manifest.json`
|
|
356
363
|
- 不会删除任何本地 skill、symlink 或 junction
|
|
357
364
|
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
runRemove,
|
|
17
17
|
runScan,
|
|
18
18
|
supportedPlatforms
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-OY3C7VIL.js";
|
|
20
20
|
|
|
21
21
|
// src/index.ts
|
|
22
22
|
import { Command } from "commander";
|
|
@@ -31,7 +31,7 @@ function buildTableOutput(agents) {
|
|
|
31
31
|
path: agent.absoluteSkillsDirectoryPath,
|
|
32
32
|
exists: String(agent.exists),
|
|
33
33
|
supported: String(agent.supportedOnPlatform),
|
|
34
|
-
discovery: agent.discovery
|
|
34
|
+
discovery: agent.autoDiscovered ? "auto" : agent.discovery
|
|
35
35
|
})),
|
|
36
36
|
[
|
|
37
37
|
{ key: "id", label: "Agent" },
|
|
@@ -244,7 +244,7 @@ var TuiNonInteractiveTerminalError = class extends Error {
|
|
|
244
244
|
}
|
|
245
245
|
};
|
|
246
246
|
async function launchDefaultTui(options) {
|
|
247
|
-
const { launchTui } = await import("./launch-tui-
|
|
247
|
+
const { launchTui } = await import("./launch-tui-JD4F62FS.js");
|
|
248
248
|
await launchTui(options);
|
|
249
249
|
}
|
|
250
250
|
async function runTui(options = {}) {
|
|
@@ -416,4 +416,4 @@ function buildCli() {
|
|
|
416
416
|
export {
|
|
417
417
|
buildCli
|
|
418
418
|
};
|
|
419
|
-
//# sourceMappingURL=chunk-
|
|
419
|
+
//# sourceMappingURL=chunk-IBW6H7BO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/agents.ts","../src/commands/config.ts","../src/commands/list.ts","../src/tui/tty.ts","../src/commands/tui.ts"],"sourcesContent":["import { Command } from \"commander\";\r\nimport { supportedPlatforms } from \"./config/default-agent-rules\";\r\nimport { runAdopt } from \"./commands/adopt\";\r\nimport { runAgents } from \"./commands/agents\";\r\nimport { runConfigAddAgent } from \"./commands/config-add-agent\";\r\nimport { runConfigRemoveAgent } from \"./commands/config-remove-agent\";\r\nimport { runConfigUpdateAgent } from \"./commands/config-update-agent\";\r\nimport { runConfig } from \"./commands/config\";\r\nimport { runDoctor } from \"./commands/doctor\";\r\nimport { runDisable } from \"./commands/disable\";\r\nimport { runEnable } from \"./commands/enable\";\r\nimport { runImport } from \"./commands/import\";\r\nimport { runList } from \"./commands/list\";\r\nimport { runRemove } from \"./commands/remove\";\r\nimport { runScan } from \"./commands/scan\";\r\nimport { runTui, TuiNonInteractiveTerminalError } from \"./commands/tui\";\n\r\nfunction collectValues(value: string, previous: string[] = []): string[] {\r\n return [...previous, value];\r\n}\r\n\r\nfunction requireSingleValue(values: string[], label: string): string {\r\n if (values.length !== 1) {\r\n throw new Error(`Expected exactly one ${label}`);\r\n }\r\n\r\n return values[0] as string;\r\n}\r\n\r\nfunction requireAtLeastOneValue(values: string[], label: string): string[] {\r\n if (values.length === 0) {\r\n throw new Error(`Expected at least one ${label}`);\r\n }\r\n\r\n return values;\r\n}\r\n\r\nexport function buildCli(): Command {\r\n const program = new Command();\r\n program.name(\"skillmux\");\r\n\r\n program\r\n .command(\"adopt\")\r\n .requiredOption(\"--agent <agent>\", \"Source agent id\")\r\n .option(\"--skill <skill>\", \"Repeatable installed skill to adopt\", collectValues, [])\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { agent: string; skill: string[]; json?: boolean }) => {\r\n const result = options.skill.length === 0\r\n ? await runAdopt({\r\n agent: options.agent,\r\n json: options.json === true\r\n })\r\n : options.skill.length === 1\r\n ? await runAdopt({\r\n agent: options.agent,\r\n skill: options.skill[0] as string,\r\n json: options.json === true\r\n })\r\n : await runAdopt({\r\n agent: options.agent,\r\n skills: options.skill,\r\n json: options.json === true\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"scan\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runScan({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"agents\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runAgents({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"list\")\r\n .option(\"--view <view>\", \"Select records, agents, or skills view\", \"records\")\r\n .option(\"--format <format>\", \"Select table or json output\", \"table\")\r\n .action(async (options: { view?: \"records\" | \"agents\" | \"skills\"; format?: \"table\" | \"json\" }) => {\r\n const result = await runList({\r\n view: options.view,\r\n format: options.format\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"import\")\r\n .requiredOption(\"--source <path>\", \"Local skill source directory\")\r\n .requiredOption(\"--name <name>\", \"Managed skill name\")\r\n .action(async (options: { source: string; name: string }) => {\r\n const result = await runImport({\r\n sourcePath: options.source,\r\n skillName: options.name\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"doctor\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runDoctor({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\n .command(\"tui\")\n .description(\"Open the interactive SkillMux dashboard\")\n .action(async () => {\n try {\n await runTui();\n } catch (error) {\n if (error instanceof TuiNonInteractiveTerminalError) {\n process.exitCode = 1;\n return;\n }\n\n throw error;\n }\n });\n\r\n const configCommand = program.command(\"config\");\r\n\r\n configCommand\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { json?: boolean }) => {\r\n const result = await runConfig({ json: options.json === true });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n configCommand\r\n .command(\"add-agent\")\r\n .requiredOption(\"--id <id>\", \"Agent id\")\r\n .requiredOption(\"--root <path>\", \"Home-relative root path\")\r\n .option(\"--skills <path>\", \"Skills directory path relative to the agent root\", \"skills\")\r\n .option(\"--name <name>\", \"Stable display name\")\r\n .option(\r\n \"--platform <platform>\",\r\n `Supported platform (${supportedPlatforms.join(\", \")})`,\r\n (value: string, previous: string[] = []) => [...previous, value],\r\n []\r\n )\r\n .option(\"--disabled-by-default\", \"Mark this custom agent as disabled by default\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(\r\n async (options: {\r\n id: string;\r\n root: string;\r\n skills?: string;\r\n name?: string;\r\n platform?: string[];\r\n disabledByDefault?: boolean;\r\n json?: boolean;\r\n }) => {\r\n const result = await runConfigAddAgent({\r\n id: options.id,\r\n root: options.root,\r\n skills: options.skills,\r\n name: options.name,\r\n platforms: options.platform,\r\n disabledByDefault: options.disabledByDefault === true,\r\n json: options.json === true\r\n });\r\n process.stdout.write(result.output);\r\n }\r\n );\r\n\r\n configCommand\r\n .command(\"remove-agent\")\r\n .requiredOption(\"--id <id>\", \"Agent id\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { id: string; json?: boolean }) => {\r\n const result = await runConfigRemoveAgent({\r\n id: options.id,\r\n json: options.json === true\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n configCommand\r\n .command(\"update-agent\")\r\n .requiredOption(\"--id <id>\", \"Agent id\")\r\n .option(\"--root <path>\", \"Home-relative root path\")\r\n .option(\"--skills <path>\", \"Skills directory path relative to the agent root\")\r\n .option(\"--name <name>\", \"Stable display name\")\r\n .option(\r\n \"--platform <platform>\",\r\n `Supported platform (${supportedPlatforms.join(\", \")})`,\r\n (value: string, previous: string[] = []) => [...previous, value],\r\n []\r\n )\r\n .option(\"--enabled-by-default\", \"Mark this custom agent as enabled by default\")\r\n .option(\"--disabled-by-default\", \"Mark this custom agent as disabled by default\")\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(\r\n async (options: {\r\n id: string;\r\n root?: string;\r\n skills?: string;\r\n name?: string;\r\n platform?: string[];\r\n enabledByDefault?: boolean;\r\n disabledByDefault?: boolean;\r\n json?: boolean;\r\n }) => {\r\n const result = await runConfigUpdateAgent({\r\n id: options.id,\r\n root: options.root,\r\n skills: options.skills,\r\n name: options.name,\r\n platforms:\r\n options.platform !== undefined && options.platform.length > 0\r\n ? options.platform\r\n : undefined,\r\n enabledByDefault:\r\n options.enabledByDefault === true ? true : undefined,\r\n disabledByDefault: options.disabledByDefault === true,\r\n json: options.json === true\r\n });\r\n process.stdout.write(result.output);\r\n }\r\n );\r\n\r\n program\r\n .command(\"enable\")\r\n .requiredOption(\"--skill <skill>\", \"Managed skill name or id\", collectValues, [])\r\n .requiredOption(\"--agent <agent>\", \"Repeatable target agent\", collectValues, [])\r\n .action(async (options: { skill: string[]; agent: string[] }) => {\r\n const result = await runEnable({\r\n skill: requireSingleValue(options.skill, \"skill\"),\r\n agents: requireAtLeastOneValue(options.agent, \"agent\")\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"disable\")\r\n .requiredOption(\"--skill <skill>\", \"Managed skill name or id\", collectValues, [])\r\n .requiredOption(\"--agent <agent>\", \"Repeatable target agent\", collectValues, [])\r\n .action(async (options: { skill: string[]; agent: string[] }) => {\r\n const result = await runDisable({\r\n skill: requireSingleValue(options.skill, \"skill\"),\r\n agents: requireAtLeastOneValue(options.agent, \"agent\")\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n program\r\n .command(\"remove\")\r\n .requiredOption(\"--skill <skill>\", \"Repeatable managed skill name or id\", collectValues, [])\r\n .option(\"--json\", \"Emit structured JSON output\")\r\n .action(async (options: { skill: string[]; json?: boolean }) => {\r\n const skills = requireAtLeastOneValue(options.skill, \"skill\");\r\n const result = skills.length === 1\r\n ? await runRemove({\r\n skill: skills[0] as string,\r\n json: options.json === true\r\n })\r\n : await runRemove({\r\n skills,\r\n json: options.json === true\r\n });\r\n process.stdout.write(result.output);\r\n });\r\n\r\n return program;\r\n}\r\n","import { homedir } from \"node:os\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n discoverAgents,\r\n type DiscoveredAgent\r\n} from \"../discovery/discover-agents\";\r\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunAgentsOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunAgentsResult = {\r\n agents: DiscoveredAgent[];\r\n output: string;\r\n};\r\n\r\nfunction buildTableOutput(agents: DiscoveredAgent[]): string {\r\n return printTable(\r\n agents.map((agent) => ({\r\n id: agent.id,\r\n name: agent.stableName,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n exists: String(agent.exists),\r\n supported: String(agent.supportedOnPlatform),\r\n discovery: agent.autoDiscovered ? \"auto\" : agent.discovery\r\n })),\r\n [\r\n { key: \"id\", label: \"Agent\" },\r\n { key: \"name\", label: \"Name\" },\r\n { key: \"path\", label: \"Path\" },\r\n { key: \"exists\", label: \"Exists\" },\r\n { key: \"supported\", label: \"Supported\" },\r\n { key: \"discovery\", label: \"Discovery\" }\r\n ]\r\n );\r\n}\r\n\r\nexport async function runAgents(\r\n options: RunAgentsOptions = {}\r\n): Promise<RunAgentsResult> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedPaths = resolveSkillmuxHome(homeDir);\r\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\r\n const agents = await discoverAgents({\r\n homeDir,\r\n skillmuxHome,\r\n platform: options.platform\r\n });\r\n\r\n return {\r\n agents,\r\n output:\r\n options.json === true\r\n ? printJson(agents)\r\n : buildTableOutput(agents)\r\n };\r\n}\r\n","import { homedir } from \"node:os\";\nimport { buildConfigPath } from \"../config/resolve-skillmux-home\";\nimport { loadUserConfig, type UserConfig } from \"../config/load-user-config\";\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\nimport { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\n\r\nexport type RunConfigOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n json?: boolean;\r\n};\r\n\r\nexport type RunConfigResult = {\r\n skillmuxHome: string;\r\n configPath: string;\r\n config: UserConfig;\r\n output: string;\r\n};\r\n\r\nfunction buildTableOutput(result: Omit<RunConfigResult, \"output\">): string {\r\n const summary = printTable(\r\n [\r\n {\r\n skillmuxHome: result.skillmuxHome,\r\n configPath: result.configPath,\r\n overrides: String(Object.keys(result.config.agents).length)\r\n }\r\n ],\r\n [\r\n { key: \"skillmuxHome\", label: \"SkillMux Home\" },\r\n { key: \"configPath\", label: \"Config Path\" },\r\n { key: \"overrides\", label: \"Overrides\" }\r\n ]\r\n );\r\n\r\n const agentRows = Object.entries(result.config.agents)\r\n .sort(([left], [right]) => left.localeCompare(right))\r\n .map(([agentId, agent]) => ({\r\n agentId,\r\n stableName: agent.stableName ?? \"\",\r\n root: agent.homeRelativeRootPath ?? \"\",\r\n skills: agent.skillsDirectoryPath ?? \"\"\r\n }));\r\n\r\n if (agentRows.length === 0) {\r\n return `${summary}\\nNo user overrides configured.\\n`;\r\n }\r\n\r\n return `${summary}\\n${printTable(agentRows, [\r\n { key: \"agentId\", label: \"Agent\" },\r\n { key: \"stableName\", label: \"Name\" },\r\n { key: \"root\", label: \"Root\" },\r\n { key: \"skills\", label: \"Skills Dir\" }\r\n ])}`;\r\n}\r\n\r\nexport async function runConfig(\r\n options: RunConfigOptions = {}\r\n): Promise<RunConfigResult> {\r\n const homeDir = options.homeDir ?? homedir();\n const resolvedPaths = resolveSkillmuxHome(homeDir);\n const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;\n const config = await loadUserConfig(skillmuxHome);\n\r\n const resultWithoutOutput = {\r\n skillmuxHome,\n configPath: buildConfigPath(skillmuxHome),\n config\n };\n\r\n return {\r\n ...resultWithoutOutput,\r\n output:\r\n options.json === true\r\n ? printJson(resultWithoutOutput)\r\n : buildTableOutput(resultWithoutOutput)\r\n };\r\n}\r\n","import { printJson } from \"../output/print-json\";\r\nimport { printTable } from \"../output/print-table\";\r\nimport { runScan, type RunScanOptions, type RunScanResult } from \"./scan\";\r\n\r\nexport type ListView = \"records\" | \"agents\" | \"skills\";\r\nexport type ListFormat = \"table\" | \"json\";\r\n\r\nexport type RunListOptions = Omit<RunScanOptions, \"json\"> & {\r\n view?: ListView;\r\n format?: ListFormat;\r\n};\r\n\r\nexport type RunListResult = {\r\n output: string;\r\n data: unknown;\r\n};\r\n\r\nfunction buildRecordsView(scanResult: RunScanResult) {\r\n return {\r\n view: \"records\" as const,\r\n records: scanResult.entries,\r\n issues: scanResult.issues\r\n };\r\n}\r\n\r\nfunction buildAgentsView(scanResult: RunScanResult) {\n const groups = new Map<\n string,\n {\r\n agentId: string;\r\n agentName: string;\r\n entries: RunScanResult[\"entries\"];\r\n }\n >();\n\n for (const agent of scanResult.agents) {\n groups.set(agent.id, {\n agentId: agent.id,\n agentName: agent.stableName,\n entries: []\n });\n }\n\n for (const entry of scanResult.entries) {\n const current = groups.get(entry.agentId) ?? {\n agentId: entry.agentId,\n agentName: entry.agentName,\r\n entries: []\r\n };\r\n current.entries.push(entry);\r\n groups.set(entry.agentId, current);\r\n }\r\n\r\n return {\r\n view: \"agents\" as const,\r\n agents: [...groups.values()].sort((left, right) =>\r\n left.agentId.localeCompare(right.agentId)\r\n ),\r\n issues: scanResult.issues\r\n };\r\n}\r\n\r\nfunction buildSkillsView(scanResult: RunScanResult) {\n const groups = new Map<\n string,\n {\r\n skillName: string;\r\n entries: RunScanResult[\"entries\"];\r\n }\n >();\n\n for (const skill of Object.values(scanResult.manifest.skills)) {\n groups.set(skill.id, {\n skillName: skill.id,\n entries: []\n });\n }\n\n for (const entry of scanResult.entries) {\n const current = groups.get(entry.skillName) ?? {\n skillName: entry.skillName,\n entries: []\r\n };\r\n current.entries.push(entry);\r\n groups.set(entry.skillName, current);\r\n }\r\n\r\n return {\r\n view: \"skills\" as const,\r\n skills: [...groups.values()].sort((left, right) =>\r\n left.skillName.localeCompare(right.skillName)\r\n ),\r\n issues: scanResult.issues\r\n };\r\n}\r\n\r\nfunction buildListData(scanResult: RunScanResult, view: ListView): unknown {\r\n if (view === \"agents\") {\r\n return buildAgentsView(scanResult);\r\n }\r\n\r\n if (view === \"skills\") {\r\n return buildSkillsView(scanResult);\r\n }\r\n\r\n return buildRecordsView(scanResult);\r\n}\r\n\r\nfunction buildTableOutput(data: unknown, view: ListView): string {\r\n if (view === \"agents\") {\r\n const agentRows = (data as { agents: Array<{ agentId: string; agentName: string; entries: unknown[] }> }).agents;\r\n return printTable(\r\n agentRows.map((agent) => ({\r\n agent: agent.agentId,\r\n name: agent.agentName,\r\n entries: String(agent.entries.length)\r\n })),\r\n [\r\n { key: \"agent\", label: \"Agent\" },\r\n { key: \"name\", label: \"Name\" },\r\n { key: \"entries\", label: \"Entries\" }\r\n ]\r\n );\r\n }\r\n\r\n if (view === \"skills\") {\r\n const skillRows = (data as { skills: Array<{ skillName: string; entries: unknown[] }> }).skills;\r\n return printTable(\r\n skillRows.map((skill) => ({\r\n skill: skill.skillName,\r\n entries: String(skill.entries.length)\r\n })),\r\n [\r\n { key: \"skill\", label: \"Skill\" },\r\n { key: \"entries\", label: \"Entries\" }\r\n ]\r\n );\r\n }\r\n\r\n const records = (data as { records: Array<{ agentId: string; skillName: string; kind: string }> }).records;\r\n return printTable(\r\n records.map((record) => ({\r\n agent: record.agentId,\r\n skill: record.skillName,\r\n kind: record.kind\r\n })),\r\n [\r\n { key: \"agent\", label: \"Agent\" },\r\n { key: \"skill\", label: \"Skill\" },\r\n { key: \"kind\", label: \"Kind\" }\r\n ]\r\n );\r\n}\r\n\r\nexport async function runList(options: RunListOptions = {}): Promise<RunListResult> {\r\n const view = options.view ?? \"records\";\r\n const format = options.format ?? \"table\";\r\n const scanResult = await runScan(options);\r\n const data = buildListData(scanResult, view);\r\n\r\n return {\r\n data,\r\n output: format === \"json\" ? printJson(data) : buildTableOutput(data, view)\r\n };\r\n}\r\n","export type TtyLike = {\r\n isTTY?: boolean;\r\n};\r\n\r\nexport function isInteractiveTerminal(stdin: TtyLike, stdout: TtyLike): boolean {\r\n return stdin.isTTY === true && stdout.isTTY === true;\r\n}\r\n","import type { LaunchTuiOptions } from \"../tui/launch-tui\";\r\nimport { isInteractiveTerminal, type TtyLike } from \"../tui/tty\";\r\n\r\nexport type RunTuiOptions = LaunchTuiOptions & {\n stdin?: TtyLike;\n stdout?: TtyLike;\n stderr?: { write(message: string): unknown };\n launch?: (options: LaunchTuiOptions) => Promise<void>;\n};\n\nexport class TuiNonInteractiveTerminalError extends Error {\n constructor() {\n super(\"skillmux tui requires an interactive terminal\");\n this.name = \"TuiNonInteractiveTerminalError\";\n }\n}\n\nasync function launchDefaultTui(options: LaunchTuiOptions): Promise<void> {\n const { launchTui } = await import(\"../tui/launch-tui\");\n\r\n await launchTui(options);\r\n}\r\n\r\nexport async function runTui(options: RunTuiOptions = {}): Promise<void> {\r\n const stdin = options.stdin ?? process.stdin;\r\n const stdout = options.stdout ?? process.stdout;\r\n const stderr = options.stderr ?? process.stderr;\r\n\r\n if (!isInteractiveTerminal(stdin, stdout)) {\r\n stderr.write(\n \"skillmux tui requires an interactive terminal. Use skillmux list, skillmux scan, or skillmux doctor for non-interactive output.\\n\"\n );\n throw new TuiNonInteractiveTerminalError();\n }\n\r\n await (options.launch ?? launchDefaultTui)({\r\n homeDir: options.homeDir,\r\n skillmuxHome: options.skillmuxHome\r\n });\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,eAAe;;;ACAxB,SAAS,eAAe;AAqBxB,SAAS,iBAAiB,QAAmC;AAC3D,SAAO;AAAA,IACL,OAAO,IAAI,CAAC,WAAW;AAAA,MACrB,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,QAAQ,OAAO,MAAM,MAAM;AAAA,MAC3B,WAAW,OAAO,MAAM,mBAAmB;AAAA,MAC3C,WAAW,MAAM,iBAAiB,SAAS,MAAM;AAAA,IACnD,EAAE;AAAA,IACF;AAAA,MACE,EAAE,KAAK,MAAM,OAAO,QAAQ;AAAA,MAC5B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,MAC7B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,MAC7B,EAAE,KAAK,UAAU,OAAO,SAAS;AAAA,MACjC,EAAE,KAAK,aAAa,OAAO,YAAY;AAAA,MACvC,EAAE,KAAK,aAAa,OAAO,YAAY;AAAA,IACzC;AAAA,EACF;AACF;AAEA,eAAsB,UACpB,UAA4B,CAAC,GACH;AAC1B,QAAM,UAAU,QAAQ,WAAW,QAAQ;AAC3C,QAAM,gBAAgB,oBAAoB,OAAO;AACjD,QAAM,eAAe,QAAQ,gBAAgB,cAAc;AAC3D,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC;AAAA,IACA;AAAA,IACA,UAAU,QAAQ;AAAA,EACpB,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,QACE,QAAQ,SAAS,OACb,UAAU,MAAM,IAChB,iBAAiB,MAAM;AAAA,EAC/B;AACF;;;AC7DA,SAAS,WAAAA,gBAAe;AAoBxB,SAASC,kBAAiB,QAAiD;AACzE,QAAM,UAAU;AAAA,IACd;AAAA,MACE;AAAA,QACE,cAAc,OAAO;AAAA,QACrB,YAAY,OAAO;AAAA,QACnB,WAAW,OAAO,OAAO,KAAK,OAAO,OAAO,MAAM,EAAE,MAAM;AAAA,MAC5D;AAAA,IACF;AAAA,IACA;AAAA,MACE,EAAE,KAAK,gBAAgB,OAAO,gBAAgB;AAAA,MAC9C,EAAE,KAAK,cAAc,OAAO,cAAc;AAAA,MAC1C,EAAE,KAAK,aAAa,OAAO,YAAY;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,QAAQ,OAAO,OAAO,MAAM,EAClD,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,SAAS,KAAK,OAAO;AAAA,IAC1B;AAAA,IACA,YAAY,MAAM,cAAc;AAAA,IAChC,MAAM,MAAM,wBAAwB;AAAA,IACpC,QAAQ,MAAM,uBAAuB;AAAA,EACvC,EAAE;AAEJ,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,GAAG,OAAO;AAAA;AAAA;AAAA,EACnB;AAEA,SAAO,GAAG,OAAO;AAAA,EAAK,WAAW,WAAW;AAAA,IAC1C,EAAE,KAAK,WAAW,OAAO,QAAQ;AAAA,IACjC,EAAE,KAAK,cAAc,OAAO,OAAO;AAAA,IACnC,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC7B,EAAE,KAAK,UAAU,OAAO,aAAa;AAAA,EACvC,CAAC,CAAC;AACJ;AAEA,eAAsB,UACpB,UAA4B,CAAC,GACH;AAC1B,QAAM,UAAU,QAAQ,WAAWC,SAAQ;AAC3C,QAAM,gBAAgB,oBAAoB,OAAO;AACjD,QAAM,eAAe,QAAQ,gBAAgB,cAAc;AAC3D,QAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA,YAAY,gBAAgB,YAAY;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QACE,QAAQ,SAAS,OACb,UAAU,mBAAmB,IAC7BD,kBAAiB,mBAAmB;AAAA,EAC5C;AACF;;;AC7DA,SAAS,iBAAiB,YAA2B;AACnD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,QAAQ,WAAW;AAAA,EACrB;AACF;AAEA,SAAS,gBAAgB,YAA2B;AAClD,QAAM,SAAS,oBAAI,IAOjB;AAEF,aAAW,SAAS,WAAW,QAAQ;AACrC,WAAO,IAAI,MAAM,IAAI;AAAA,MACnB,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,SAAS,CAAC;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,aAAW,SAAS,WAAW,SAAS;AACtC,UAAM,UAAU,OAAO,IAAI,MAAM,OAAO,KAAK;AAAA,MAC3C,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,SAAS,CAAC;AAAA,IACZ;AACA,YAAQ,QAAQ,KAAK,KAAK;AAC1B,WAAO,IAAI,MAAM,SAAS,OAAO;AAAA,EACnC;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE;AAAA,MAAK,CAAC,MAAM,UACvC,KAAK,QAAQ,cAAc,MAAM,OAAO;AAAA,IAC1C;AAAA,IACA,QAAQ,WAAW;AAAA,EACrB;AACF;AAEA,SAAS,gBAAgB,YAA2B;AAClD,QAAM,SAAS,oBAAI,IAMjB;AAEF,aAAW,SAAS,OAAO,OAAO,WAAW,SAAS,MAAM,GAAG;AAC7D,WAAO,IAAI,MAAM,IAAI;AAAA,MACnB,WAAW,MAAM;AAAA,MACjB,SAAS,CAAC;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,aAAW,SAAS,WAAW,SAAS;AACtC,UAAM,UAAU,OAAO,IAAI,MAAM,SAAS,KAAK;AAAA,MAC7C,WAAW,MAAM;AAAA,MACjB,SAAS,CAAC;AAAA,IACZ;AACA,YAAQ,QAAQ,KAAK,KAAK;AAC1B,WAAO,IAAI,MAAM,WAAW,OAAO;AAAA,EACrC;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE;AAAA,MAAK,CAAC,MAAM,UACvC,KAAK,UAAU,cAAc,MAAM,SAAS;AAAA,IAC9C;AAAA,IACA,QAAQ,WAAW;AAAA,EACrB;AACF;AAEA,SAAS,cAAc,YAA2B,MAAyB;AACzE,MAAI,SAAS,UAAU;AACrB,WAAO,gBAAgB,UAAU;AAAA,EACnC;AAEA,MAAI,SAAS,UAAU;AACrB,WAAO,gBAAgB,UAAU;AAAA,EACnC;AAEA,SAAO,iBAAiB,UAAU;AACpC;AAEA,SAASE,kBAAiB,MAAe,MAAwB;AAC/D,MAAI,SAAS,UAAU;AACrB,UAAM,YAAa,KAAuF;AAC1G,WAAO;AAAA,MACL,UAAU,IAAI,CAAC,WAAW;AAAA,QACxB,OAAO,MAAM;AAAA,QACb,MAAM,MAAM;AAAA,QACZ,SAAS,OAAO,MAAM,QAAQ,MAAM;AAAA,MACtC,EAAE;AAAA,MACF;AAAA,QACE,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,QAC/B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,QAC7B,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,UAAU;AACrB,UAAM,YAAa,KAAsE;AACzF,WAAO;AAAA,MACL,UAAU,IAAI,CAAC,WAAW;AAAA,QACxB,OAAO,MAAM;AAAA,QACb,SAAS,OAAO,MAAM,QAAQ,MAAM;AAAA,MACtC,EAAE;AAAA,MACF;AAAA,QACE,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,QAC/B,EAAE,KAAK,WAAW,OAAO,UAAU;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAW,KAAkF;AACnG,SAAO;AAAA,IACL,QAAQ,IAAI,CAAC,YAAY;AAAA,MACvB,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,MAAM,OAAO;AAAA,IACf,EAAE;AAAA,IACF;AAAA,MACE,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,MAC/B,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,MAC/B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,eAAsB,QAAQ,UAA0B,CAAC,GAA2B;AAClF,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,aAAa,MAAM,QAAQ,OAAO;AACxC,QAAM,OAAO,cAAc,YAAY,IAAI;AAE3C,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,WAAW,SAAS,UAAU,IAAI,IAAIA,kBAAiB,MAAM,IAAI;AAAA,EAC3E;AACF;;;AChKO,SAAS,sBAAsB,OAAgB,QAA0B;AAC9E,SAAO,MAAM,UAAU,QAAQ,OAAO,UAAU;AAClD;;;ACIO,IAAM,iCAAN,cAA6C,MAAM;AAAA,EACxD,cAAc;AACZ,UAAM,+CAA+C;AACrD,SAAK,OAAO;AAAA,EACd;AACF;AAEA,eAAe,iBAAiB,SAA0C;AACxE,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,0BAAmB;AAEtD,QAAM,UAAU,OAAO;AACzB;AAEA,eAAsB,OAAO,UAAyB,CAAC,GAAkB;AACvE,QAAM,QAAQ,QAAQ,SAAS,QAAQ;AACvC,QAAM,SAAS,QAAQ,UAAU,QAAQ;AACzC,QAAM,SAAS,QAAQ,UAAU,QAAQ;AAEzC,MAAI,CAAC,sBAAsB,OAAO,MAAM,GAAG;AACzC,WAAO;AAAA,MACL;AAAA,IACF;AACA,UAAM,IAAI,+BAA+B;AAAA,EAC3C;AAEA,SAAO,QAAQ,UAAU,kBAAkB;AAAA,IACzC,SAAS,QAAQ;AAAA,IACjB,cAAc,QAAQ;AAAA,EACxB,CAAC;AACH;;;ALtBA,SAAS,cAAc,OAAe,WAAqB,CAAC,GAAa;AACvE,SAAO,CAAC,GAAG,UAAU,KAAK;AAC5B;AAEA,SAAS,mBAAmB,QAAkB,OAAuB;AACnE,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,wBAAwB,KAAK,EAAE;AAAA,EACjD;AAEA,SAAO,OAAO,CAAC;AACjB;AAEA,SAAS,uBAAuB,QAAkB,OAAyB;AACzE,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,yBAAyB,KAAK,EAAE;AAAA,EAClD;AAEA,SAAO;AACT;AAEO,SAAS,WAAoB;AAClC,QAAM,UAAU,IAAI,QAAQ;AAC5B,UAAQ,KAAK,UAAU;AAEvB,UACG,QAAQ,OAAO,EACf,eAAe,mBAAmB,iBAAiB,EACnD,OAAO,mBAAmB,uCAAuC,eAAe,CAAC,CAAC,EAClF,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,YAAgE;AAC7E,UAAM,SAAS,QAAQ,MAAM,WAAW,IACpC,MAAM,SAAS;AAAA,MACb,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ,SAAS;AAAA,IACzB,CAAC,IACD,QAAQ,MAAM,WAAW,IACvB,MAAM,SAAS;AAAA,MACb,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ,MAAM,CAAC;AAAA,MACtB,MAAM,QAAQ,SAAS;AAAA,IACzB,CAAC,IACD,MAAM,SAAS;AAAA,MACb,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB,MAAM,QAAQ,SAAS;AAAA,IACzB,CAAC;AACP,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,YAAgC;AAC7C,UAAM,SAAS,MAAM,QAAQ,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAC5D,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,YAAgC;AAC7C,UAAM,SAAS,MAAM,UAAU,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAC9D,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,OAAO,iBAAiB,0CAA0C,SAAS,EAC3E,OAAO,qBAAqB,+BAA+B,OAAO,EAClE,OAAO,OAAO,YAAmF;AAChG,UAAM,SAAS,MAAM,QAAQ;AAAA,MAC3B,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,eAAe,mBAAmB,8BAA8B,EAChE,eAAe,iBAAiB,oBAAoB,EACpD,OAAO,OAAO,YAA8C;AAC3D,UAAM,SAAS,MAAM,UAAU;AAAA,MAC7B,YAAY,QAAQ;AAAA,MACpB,WAAW,QAAQ;AAAA,IACrB,CAAC;AACD,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,YAAgC;AAC7C,UAAM,SAAS,MAAM,UAAU,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAC9D,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,KAAK,EACb,YAAY,yCAAyC,EACrD,OAAO,YAAY;AAClB,QAAI;AACF,YAAM,OAAO;AAAA,IACf,SAAS,OAAO;AACd,UAAI,iBAAiB,gCAAgC;AACnD,gBAAQ,WAAW;AACnB;AAAA,MACF;AAEA,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AAEH,QAAM,gBAAgB,QAAQ,QAAQ,QAAQ;AAE9C,gBACG,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,YAAgC;AAC7C,UAAM,SAAS,MAAM,UAAU,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAC9D,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,gBACG,QAAQ,WAAW,EACnB,eAAe,aAAa,UAAU,EACtC,eAAe,iBAAiB,yBAAyB,EACzD,OAAO,mBAAmB,oDAAoD,QAAQ,EACtF,OAAO,iBAAiB,qBAAqB,EAC7C;AAAA,IACC;AAAA,IACA,uBAAuB,mBAAmB,KAAK,IAAI,CAAC;AAAA,IACpD,CAAC,OAAe,WAAqB,CAAC,MAAM,CAAC,GAAG,UAAU,KAAK;AAAA,IAC/D,CAAC;AAAA,EACH,EACC,OAAO,yBAAyB,+CAA+C,EAC/E,OAAO,UAAU,6BAA6B,EAC9C;AAAA,IACC,OAAO,YAQD;AACJ,YAAM,SAAS,MAAM,kBAAkB;AAAA,QACrC,IAAI,QAAQ;AAAA,QACZ,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,QAChB,MAAM,QAAQ;AAAA,QACd,WAAW,QAAQ;AAAA,QACnB,mBAAmB,QAAQ,sBAAsB;AAAA,QACjD,MAAM,QAAQ,SAAS;AAAA,MACzB,CAAC;AACD,cAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,IACpC;AAAA,EACF;AAEF,gBACG,QAAQ,cAAc,EACtB,eAAe,aAAa,UAAU,EACtC,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,YAA4C;AACzD,UAAM,SAAS,MAAM,qBAAqB;AAAA,MACxC,IAAI,QAAQ;AAAA,MACZ,MAAM,QAAQ,SAAS;AAAA,IACzB,CAAC;AACD,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,gBACG,QAAQ,cAAc,EACtB,eAAe,aAAa,UAAU,EACtC,OAAO,iBAAiB,yBAAyB,EACjD,OAAO,mBAAmB,kDAAkD,EAC5E,OAAO,iBAAiB,qBAAqB,EAC7C;AAAA,IACC;AAAA,IACA,uBAAuB,mBAAmB,KAAK,IAAI,CAAC;AAAA,IACpD,CAAC,OAAe,WAAqB,CAAC,MAAM,CAAC,GAAG,UAAU,KAAK;AAAA,IAC/D,CAAC;AAAA,EACH,EACC,OAAO,wBAAwB,8CAA8C,EAC7E,OAAO,yBAAyB,+CAA+C,EAC/E,OAAO,UAAU,6BAA6B,EAC9C;AAAA,IACC,OAAO,YASD;AACJ,YAAM,SAAS,MAAM,qBAAqB;AAAA,QACxC,IAAI,QAAQ;AAAA,QACZ,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,QAChB,MAAM,QAAQ;AAAA,QACd,WACE,QAAQ,aAAa,UAAa,QAAQ,SAAS,SAAS,IACxD,QAAQ,WACR;AAAA,QACN,kBACE,QAAQ,qBAAqB,OAAO,OAAO;AAAA,QAC7C,mBAAmB,QAAQ,sBAAsB;AAAA,QACjD,MAAM,QAAQ,SAAS;AAAA,MACzB,CAAC;AACD,cAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,IACpC;AAAA,EACF;AAEF,UACG,QAAQ,QAAQ,EAChB,eAAe,mBAAmB,4BAA4B,eAAe,CAAC,CAAC,EAC/E,eAAe,mBAAmB,2BAA2B,eAAe,CAAC,CAAC,EAC9E,OAAO,OAAO,YAAkD;AAC/D,UAAM,SAAS,MAAM,UAAU;AAAA,MAC7B,OAAO,mBAAmB,QAAQ,OAAO,OAAO;AAAA,MAChD,QAAQ,uBAAuB,QAAQ,OAAO,OAAO;AAAA,IACvD,CAAC;AACD,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,SAAS,EACjB,eAAe,mBAAmB,4BAA4B,eAAe,CAAC,CAAC,EAC/E,eAAe,mBAAmB,2BAA2B,eAAe,CAAC,CAAC,EAC9E,OAAO,OAAO,YAAkD;AAC/D,UAAM,SAAS,MAAM,WAAW;AAAA,MAC9B,OAAO,mBAAmB,QAAQ,OAAO,OAAO;AAAA,MAChD,QAAQ,uBAAuB,QAAQ,OAAO,OAAO;AAAA,IACvD,CAAC;AACD,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,eAAe,mBAAmB,uCAAuC,eAAe,CAAC,CAAC,EAC1F,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,YAAiD;AAC9D,UAAM,SAAS,uBAAuB,QAAQ,OAAO,OAAO;AAC5D,UAAM,SAAS,OAAO,WAAW,IAC7B,MAAM,UAAU;AAAA,MACd,OAAO,OAAO,CAAC;AAAA,MACf,MAAM,QAAQ,SAAS;AAAA,IACzB,CAAC,IACD,MAAM,UAAU;AAAA,MACd;AAAA,MACA,MAAM,QAAQ,SAAS;AAAA,IACzB,CAAC;AACL,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC,CAAC;AAEH,SAAO;AACT;","names":["homedir","buildTableOutput","homedir","buildTableOutput"]}
|