skillmux 0.1.3 → 0.1.5

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.
@@ -1,27 +1,22 @@
1
1
  import {
2
- InvalidIdentifierError,
3
- UserConfigValidationError,
4
- assertSkillSourceLayout,
5
2
  buildConfigPath,
6
- collectDoctorIssues,
7
- copySkillContentsToManagedStore,
8
- dedupeAndSortIssues,
9
3
  discoverAgents,
10
4
  loadUserConfig,
11
- normalizeId,
12
5
  printJson,
13
6
  printTable,
14
- readManifest,
15
7
  resolveSkillmuxHome,
16
8
  runAdopt,
9
+ runConfigAddAgent,
10
+ runConfigRemoveAgent,
11
+ runConfigUpdateAgent,
17
12
  runDisable,
13
+ runDoctor,
18
14
  runEnable,
15
+ runImport,
19
16
  runRemove,
20
17
  runScan,
21
- scanAgentSkills,
22
- supportedPlatforms,
23
- writeManifest
24
- } from "./chunk-DBEVDI27.js";
18
+ supportedPlatforms
19
+ } from "./chunk-OY3C7VIL.js";
25
20
 
26
21
  // src/index.ts
27
22
  import { Command } from "commander";
@@ -36,7 +31,7 @@ function buildTableOutput(agents) {
36
31
  path: agent.absoluteSkillsDirectoryPath,
37
32
  exists: String(agent.exists),
38
33
  supported: String(agent.supportedOnPlatform),
39
- discovery: agent.discovery
34
+ discovery: agent.autoDiscovered ? "auto" : agent.discovery
40
35
  })),
41
36
  [
42
37
  { key: "id", label: "Agent" },
@@ -63,308 +58,9 @@ async function runAgents(options = {}) {
63
58
  };
64
59
  }
65
60
 
66
- // src/commands/config-add-agent.ts
61
+ // src/commands/config.ts
67
62
  import { homedir as homedir2 } from "os";
68
-
69
- // src/config/agent-override-validation.ts
70
- import { isAbsolute } from "path";
71
- function normalizeRelativePath(value, field) {
72
- const trimmed = value.trim();
73
- if (trimmed.length === 0) {
74
- throw new UserConfigValidationError(`${field} must not be empty`);
75
- }
76
- if (isAbsolute(trimmed)) {
77
- throw new UserConfigValidationError(`${field} must be a relative path`);
78
- }
79
- const normalized = trimmed.replaceAll("\\", "/");
80
- if (normalized === "." || normalized === ".." || normalized.startsWith("../") || normalized.includes("/../")) {
81
- throw new UserConfigValidationError(`${field} must stay within the configured home-relative tree`);
82
- }
83
- return normalized.replace(/^\.\/+/, "");
84
- }
85
- function normalizeAgentId(value) {
86
- const trimmed = value.trim();
87
- if (trimmed.length === 0 || /[a-z0-9]/i.test(trimmed) === false) {
88
- throw new InvalidIdentifierError("agent id", value);
89
- }
90
- return normalizeId(trimmed);
91
- }
92
- function normalizePlatforms(value) {
93
- if (value === void 0 || value.length === 0) {
94
- return [process.platform];
95
- }
96
- const normalized = [...new Set(value.map((entry) => entry.trim().toLowerCase()))];
97
- const invalid = normalized.filter(
98
- (entry) => supportedPlatforms.includes(entry) === false
99
- );
100
- if (invalid.length > 0) {
101
- throw new UserConfigValidationError(
102
- `platform must be one of: ${supportedPlatforms.join(", ")}`
103
- );
104
- }
105
- return normalized;
106
- }
107
-
108
- // src/config/write-user-config.ts
109
- import * as fs from "fs/promises";
110
- async function writeUserConfig(skillmuxHome, config) {
111
- const configPath = buildConfigPath(skillmuxHome);
112
- await fs.mkdir(skillmuxHome, { recursive: true });
113
- await fs.writeFile(configPath, `${JSON.stringify(config, null, 2)}
114
- `, "utf8");
115
- return {
116
- skillmuxHome,
117
- configPath
118
- };
119
- }
120
-
121
- // src/commands/config-add-agent.ts
122
- function buildAgentOverride(options) {
123
- const agentId = normalizeAgentId(options.id);
124
- const agent = {
125
- supportedPlatforms: normalizePlatforms(options.platforms),
126
- homeRelativeRootPath: normalizeRelativePath(options.root, "root"),
127
- skillsDirectoryPath: normalizeRelativePath(options.skills ?? "skills", "skills")
128
- };
129
- if (options.name !== void 0 && options.name.trim().length > 0) {
130
- agent.stableName = options.name.trim();
131
- }
132
- if (options.disabledByDefault === true) {
133
- agent.enabledByDefault = false;
134
- }
135
- return { agentId, agent };
136
- }
137
63
  function buildTableOutput2(result) {
138
- const summary = printTable(
139
- [
140
- {
141
- agentId: result.agentId,
142
- configPath: result.configPath,
143
- changed: String(result.changed)
144
- }
145
- ],
146
- [
147
- { key: "agentId", label: "Agent" },
148
- { key: "configPath", label: "Config Path" },
149
- { key: "changed", label: "Changed" }
150
- ]
151
- );
152
- const detail = printTable(
153
- [
154
- {
155
- stableName: result.agent.stableName ?? "",
156
- platforms: (result.agent.supportedPlatforms ?? []).join(","),
157
- root: result.agent.homeRelativeRootPath ?? "",
158
- skills: result.agent.skillsDirectoryPath ?? "",
159
- enabledByDefault: result.agent.enabledByDefault === void 0 ? "" : String(result.agent.enabledByDefault)
160
- }
161
- ],
162
- [
163
- { key: "stableName", label: "Name" },
164
- { key: "platforms", label: "Platforms" },
165
- { key: "root", label: "Root" },
166
- { key: "skills", label: "Skills Dir" },
167
- { key: "enabledByDefault", label: "Enabled By Default" }
168
- ]
169
- );
170
- return `${summary}${detail}`;
171
- }
172
- async function runConfigAddAgent(options) {
173
- const homeDir = options.homeDir ?? homedir2();
174
- const resolvedPaths = resolveSkillmuxHome(homeDir);
175
- const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;
176
- const configPath = buildConfigPath(skillmuxHome);
177
- const config = await loadUserConfig(skillmuxHome);
178
- const { agentId, agent } = buildAgentOverride(options);
179
- const previous = config.agents[agentId];
180
- const changed = JSON.stringify(previous ?? null) !== JSON.stringify(agent);
181
- const nextConfig = {
182
- ...config,
183
- agents: {
184
- ...config.agents,
185
- [agentId]: agent
186
- }
187
- };
188
- await writeUserConfig(skillmuxHome, nextConfig);
189
- const resultWithoutOutput = {
190
- skillmuxHome,
191
- configPath,
192
- agentId,
193
- changed,
194
- agent,
195
- config: nextConfig
196
- };
197
- return {
198
- ...resultWithoutOutput,
199
- output: options.json === true ? printJson(resultWithoutOutput) : buildTableOutput2(resultWithoutOutput)
200
- };
201
- }
202
-
203
- // src/commands/config-remove-agent.ts
204
- import { homedir as homedir3 } from "os";
205
- function normalizeAgentId2(value) {
206
- const trimmed = value.trim();
207
- if (trimmed.length === 0 || /[a-z0-9]/i.test(trimmed) === false) {
208
- throw new InvalidIdentifierError("agent id", value);
209
- }
210
- return normalizeId(trimmed);
211
- }
212
- function buildTableOutput3(result) {
213
- return printTable(
214
- [
215
- {
216
- agentId: result.agentId,
217
- configPath: result.configPath,
218
- changed: String(result.changed),
219
- removed: String(result.removed)
220
- }
221
- ],
222
- [
223
- { key: "agentId", label: "Agent" },
224
- { key: "configPath", label: "Config Path" },
225
- { key: "changed", label: "Changed" },
226
- { key: "removed", label: "Removed" }
227
- ]
228
- );
229
- }
230
- async function runConfigRemoveAgent(options) {
231
- const homeDir = options.homeDir ?? homedir3();
232
- const resolvedPaths = resolveSkillmuxHome(homeDir);
233
- const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;
234
- const configPath = buildConfigPath(skillmuxHome);
235
- const config = await loadUserConfig(skillmuxHome);
236
- const agentId = normalizeAgentId2(options.id);
237
- const removed = agentId in config.agents;
238
- const nextConfig = {
239
- ...config,
240
- agents: Object.fromEntries(
241
- Object.entries(config.agents).filter(([currentAgentId]) => currentAgentId !== agentId)
242
- )
243
- };
244
- if (removed) {
245
- await writeUserConfig(skillmuxHome, nextConfig);
246
- }
247
- const resultWithoutOutput = {
248
- skillmuxHome,
249
- configPath,
250
- agentId,
251
- changed: removed,
252
- removed,
253
- config: nextConfig
254
- };
255
- return {
256
- ...resultWithoutOutput,
257
- output: options.json === true ? printJson(resultWithoutOutput) : buildTableOutput3(resultWithoutOutput)
258
- };
259
- }
260
-
261
- // src/commands/config-update-agent.ts
262
- import { homedir as homedir4 } from "os";
263
- function buildAgentPatch(options) {
264
- const patch = {};
265
- if (options.root !== void 0) {
266
- patch.homeRelativeRootPath = normalizeRelativePath(options.root, "root");
267
- }
268
- if (options.skills !== void 0) {
269
- patch.skillsDirectoryPath = normalizeRelativePath(options.skills, "skills");
270
- }
271
- if (options.name !== void 0 && options.name.trim().length > 0) {
272
- patch.stableName = options.name.trim();
273
- }
274
- if (options.platforms !== void 0) {
275
- patch.supportedPlatforms = normalizePlatforms(options.platforms);
276
- }
277
- if (options.enabledByDefault !== void 0 && options.disabledByDefault === true) {
278
- throw new UserConfigValidationError(
279
- "enabled-by-default and disabled-by-default cannot both be set"
280
- );
281
- }
282
- if (options.enabledByDefault !== void 0) {
283
- patch.enabledByDefault = options.enabledByDefault;
284
- }
285
- if (options.disabledByDefault === true) {
286
- patch.enabledByDefault = false;
287
- }
288
- return patch;
289
- }
290
- function buildTableOutput4(result) {
291
- const summary = printTable(
292
- [
293
- {
294
- agentId: result.agentId,
295
- configPath: result.configPath,
296
- changed: String(result.changed)
297
- }
298
- ],
299
- [
300
- { key: "agentId", label: "Agent" },
301
- { key: "configPath", label: "Config Path" },
302
- { key: "changed", label: "Changed" }
303
- ]
304
- );
305
- const detail = printTable(
306
- [
307
- {
308
- stableName: result.agent.stableName ?? "",
309
- platforms: (result.agent.supportedPlatforms ?? []).join(","),
310
- root: result.agent.homeRelativeRootPath ?? "",
311
- skills: result.agent.skillsDirectoryPath ?? "",
312
- enabledByDefault: result.agent.enabledByDefault === void 0 ? "" : String(result.agent.enabledByDefault)
313
- }
314
- ],
315
- [
316
- { key: "stableName", label: "Name" },
317
- { key: "platforms", label: "Platforms" },
318
- { key: "root", label: "Root" },
319
- { key: "skills", label: "Skills Dir" },
320
- { key: "enabledByDefault", label: "Enabled By Default" }
321
- ]
322
- );
323
- return `${summary}${detail}`;
324
- }
325
- async function runConfigUpdateAgent(options) {
326
- const homeDir = options.homeDir ?? homedir4();
327
- const resolvedPaths = resolveSkillmuxHome(homeDir);
328
- const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;
329
- const configPath = buildConfigPath(skillmuxHome);
330
- const config = await loadUserConfig(skillmuxHome);
331
- const agentId = normalizeAgentId(options.id);
332
- const previous = config.agents[agentId];
333
- if (previous === void 0) {
334
- throw new UserConfigValidationError(`Agent override does not exist: ${agentId}`);
335
- }
336
- const agent = {
337
- ...previous,
338
- ...buildAgentPatch(options)
339
- };
340
- const changed = JSON.stringify(previous) !== JSON.stringify(agent);
341
- const nextConfig = {
342
- ...config,
343
- agents: {
344
- ...config.agents,
345
- [agentId]: agent
346
- }
347
- };
348
- if (changed) {
349
- await writeUserConfig(skillmuxHome, nextConfig);
350
- }
351
- const resultWithoutOutput = {
352
- skillmuxHome,
353
- configPath,
354
- agentId,
355
- changed,
356
- agent,
357
- config: nextConfig
358
- };
359
- return {
360
- ...resultWithoutOutput,
361
- output: options.json === true ? printJson(resultWithoutOutput) : buildTableOutput4(resultWithoutOutput)
362
- };
363
- }
364
-
365
- // src/commands/config.ts
366
- import { homedir as homedir5 } from "os";
367
- function buildTableOutput5(result) {
368
64
  const summary = printTable(
369
65
  [
370
66
  {
@@ -399,7 +95,7 @@ ${printTable(agentRows, [
399
95
  ])}`;
400
96
  }
401
97
  async function runConfig(options = {}) {
402
- const homeDir = options.homeDir ?? homedir5();
98
+ const homeDir = options.homeDir ?? homedir2();
403
99
  const resolvedPaths = resolveSkillmuxHome(homeDir);
404
100
  const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;
405
101
  const config = await loadUserConfig(skillmuxHome);
@@ -410,120 +106,7 @@ async function runConfig(options = {}) {
410
106
  };
411
107
  return {
412
108
  ...resultWithoutOutput,
413
- output: options.json === true ? printJson(resultWithoutOutput) : buildTableOutput5(resultWithoutOutput)
414
- };
415
- }
416
-
417
- // src/commands/doctor.ts
418
- import { homedir as homedir6 } from "os";
419
- function buildTableOutput6(issues) {
420
- if (issues.length === 0) {
421
- return "No doctor issues found.\n";
422
- }
423
- return printTable(
424
- issues.map((issue) => ({
425
- severity: issue.severity,
426
- code: issue.code,
427
- path: issue.path ?? "",
428
- message: issue.message
429
- })),
430
- [
431
- { key: "severity", label: "Severity" },
432
- { key: "code", label: "Code" },
433
- { key: "path", label: "Path" },
434
- { key: "message", label: "Message" }
435
- ]
436
- );
437
- }
438
- function buildJsonOutput(result) {
439
- return printJson({
440
- skillmuxHome: result.skillmuxHome,
441
- issues: result.issues,
442
- agents: result.agents.map((agent) => ({
443
- id: agent.id,
444
- path: agent.absoluteSkillsDirectoryPath,
445
- supportedOnPlatform: agent.supportedOnPlatform
446
- })),
447
- entries: result.entries
448
- });
449
- }
450
- async function runDoctor(options = {}) {
451
- const homeDir = options.homeDir ?? homedir6();
452
- const resolvedPaths = resolveSkillmuxHome(homeDir);
453
- const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;
454
- const [manifest, config, agents] = await Promise.all([
455
- readManifest(skillmuxHome),
456
- loadUserConfig(skillmuxHome),
457
- discoverAgents({
458
- homeDir,
459
- skillmuxHome,
460
- platform: options.platform
461
- })
462
- ]);
463
- const entries = [];
464
- const issues = [];
465
- for (const agent of agents) {
466
- const scannedAgent = await scanAgentSkills(agent, skillmuxHome);
467
- entries.push(...scannedAgent.entries);
468
- issues.push(...scannedAgent.issues);
469
- }
470
- const doctorIssues = await collectDoctorIssues({
471
- manifest,
472
- agents,
473
- entries
474
- });
475
- const dedupedIssues = dedupeAndSortIssues([...issues, ...doctorIssues]);
476
- const resultWithoutOutput = {
477
- skillmuxHome,
478
- manifest,
479
- config,
480
- agents,
481
- entries,
482
- issues: dedupedIssues
483
- };
484
- return {
485
- ...resultWithoutOutput,
486
- output: options.json === true ? buildJsonOutput(resultWithoutOutput) : buildTableOutput6(dedupedIssues)
487
- };
488
- }
489
-
490
- // src/commands/import.ts
491
- import { resolve } from "path";
492
- import { homedir as homedir7 } from "os";
493
- function buildManagedSkillPath(skillmuxHome, skillId) {
494
- return resolve(skillmuxHome, "skills", skillId);
495
- }
496
- async function runImport(options) {
497
- const homeDir = options.homeDir ?? homedir7();
498
- const resolvedPaths = resolveSkillmuxHome(homeDir);
499
- const skillmuxHome = options.skillmuxHome ?? resolvedPaths.skillmuxHome;
500
- const sourcePath = resolve(options.sourcePath);
501
- const skillId = normalizeId(options.skillName);
502
- const importedAt = (options.now ?? /* @__PURE__ */ new Date()).toISOString();
503
- const manifest = await readManifest(skillmuxHome);
504
- const managedSkillPath = buildManagedSkillPath(skillmuxHome, skillId);
505
- await assertSkillSourceLayout(sourcePath);
506
- if (manifest.skills[skillId] !== void 0) {
507
- throw new Error(`Managed skill already exists for ${skillId}`);
508
- }
509
- await copySkillContentsToManagedStore(sourcePath, managedSkillPath);
510
- const skill = {
511
- id: skillId,
512
- name: options.skillName,
513
- path: managedSkillPath,
514
- source: {
515
- kind: "local",
516
- path: sourcePath
517
- },
518
- importedAt
519
- };
520
- manifest.skills[skillId] = skill;
521
- await writeManifest(skillmuxHome, manifest);
522
- return {
523
- skill,
524
- manifest,
525
- output: `Imported ${skillId} to ${managedSkillPath}
526
- `
109
+ output: options.json === true ? printJson(resultWithoutOutput) : buildTableOutput2(resultWithoutOutput)
527
110
  };
528
111
  }
529
112
 
@@ -594,7 +177,7 @@ function buildListData(scanResult, view) {
594
177
  }
595
178
  return buildRecordsView(scanResult);
596
179
  }
597
- function buildTableOutput7(data, view) {
180
+ function buildTableOutput3(data, view) {
598
181
  if (view === "agents") {
599
182
  const agentRows = data.agents;
600
183
  return printTable(
@@ -644,7 +227,7 @@ async function runList(options = {}) {
644
227
  const data = buildListData(scanResult, view);
645
228
  return {
646
229
  data,
647
- output: format === "json" ? printJson(data) : buildTableOutput7(data, view)
230
+ output: format === "json" ? printJson(data) : buildTableOutput3(data, view)
648
231
  };
649
232
  }
650
233
 
@@ -661,7 +244,7 @@ var TuiNonInteractiveTerminalError = class extends Error {
661
244
  }
662
245
  };
663
246
  async function launchDefaultTui(options) {
664
- const { launchTui } = await import("./launch-tui-PHWJPIQZ.js");
247
+ const { launchTui } = await import("./launch-tui-4TJFQA3L.js");
665
248
  await launchTui(options);
666
249
  }
667
250
  async function runTui(options = {}) {
@@ -833,4 +416,4 @@ function buildCli() {
833
416
  export {
834
417
  buildCli
835
418
  };
836
- //# sourceMappingURL=chunk-UMN3UJFN.js.map
419
+ //# sourceMappingURL=chunk-R5V2WOZV.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":"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","names":["homedir","buildTableOutput","homedir","buildTableOutput"]}
package/dist/cli.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  buildCli
4
- } from "./chunk-UMN3UJFN.js";
5
- import "./chunk-DBEVDI27.js";
4
+ } from "./chunk-R5V2WOZV.js";
5
+ import "./chunk-OY3C7VIL.js";
6
6
 
7
7
  // src/cli.ts
8
8
  await buildCli().parseAsync(process.argv);
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  buildCli
3
- } from "./chunk-UMN3UJFN.js";
4
- import "./chunk-DBEVDI27.js";
3
+ } from "./chunk-R5V2WOZV.js";
4
+ import "./chunk-OY3C7VIL.js";
5
5
  export {
6
6
  buildCli
7
7
  };