@kamaras/venpm 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/cli/completions.d.ts +3 -0
  2. package/dist/cli/completions.d.ts.map +1 -0
  3. package/dist/cli/completions.js +78 -0
  4. package/dist/cli/completions.js.map +1 -0
  5. package/dist/cli/config-cmd.d.ts.map +1 -1
  6. package/dist/cli/config-cmd.js +30 -22
  7. package/dist/cli/config-cmd.js.map +1 -1
  8. package/dist/cli/context.d.ts.map +1 -1
  9. package/dist/cli/context.js +26 -9
  10. package/dist/cli/context.js.map +1 -1
  11. package/dist/cli/create.d.ts.map +1 -1
  12. package/dist/cli/create.js +20 -22
  13. package/dist/cli/create.js.map +1 -1
  14. package/dist/cli/doctor.d.ts.map +1 -1
  15. package/dist/cli/doctor.js +37 -24
  16. package/dist/cli/doctor.js.map +1 -1
  17. package/dist/cli/first-run.d.ts +4 -0
  18. package/dist/cli/first-run.d.ts.map +1 -0
  19. package/dist/cli/first-run.js +51 -0
  20. package/dist/cli/first-run.js.map +1 -0
  21. package/dist/cli/help.d.ts +3 -0
  22. package/dist/cli/help.d.ts.map +1 -0
  23. package/dist/cli/help.js +42 -0
  24. package/dist/cli/help.js.map +1 -0
  25. package/dist/cli/info.d.ts.map +1 -1
  26. package/dist/cli/info.js +48 -53
  27. package/dist/cli/info.js.map +1 -1
  28. package/dist/cli/install.d.ts.map +1 -1
  29. package/dist/cli/install.js +52 -67
  30. package/dist/cli/install.js.map +1 -1
  31. package/dist/cli/list.d.ts.map +1 -1
  32. package/dist/cli/list.js +20 -20
  33. package/dist/cli/list.js.map +1 -1
  34. package/dist/cli/rebuild.d.ts.map +1 -1
  35. package/dist/cli/rebuild.js +19 -26
  36. package/dist/cli/rebuild.js.map +1 -1
  37. package/dist/cli/repo.d.ts.map +1 -1
  38. package/dist/cli/repo.js +22 -32
  39. package/dist/cli/repo.js.map +1 -1
  40. package/dist/cli/search.d.ts.map +1 -1
  41. package/dist/cli/search.js +19 -20
  42. package/dist/cli/search.js.map +1 -1
  43. package/dist/cli/uninstall.d.ts.map +1 -1
  44. package/dist/cli/uninstall.js +14 -16
  45. package/dist/cli/uninstall.js.map +1 -1
  46. package/dist/cli/update.d.ts.map +1 -1
  47. package/dist/cli/update.js +26 -33
  48. package/dist/cli/update.js.map +1 -1
  49. package/dist/cli/validate.d.ts.map +1 -1
  50. package/dist/cli/validate.js +14 -21
  51. package/dist/cli/validate.js.map +1 -1
  52. package/dist/core/ansi.d.ts +14 -0
  53. package/dist/core/ansi.d.ts.map +1 -0
  54. package/dist/core/ansi.js +36 -0
  55. package/dist/core/ansi.js.map +1 -0
  56. package/dist/core/errors.d.ts +36 -0
  57. package/dist/core/errors.d.ts.map +1 -0
  58. package/dist/core/errors.js +70 -0
  59. package/dist/core/errors.js.map +1 -0
  60. package/dist/core/fuzzy.d.ts +3 -0
  61. package/dist/core/fuzzy.d.ts.map +1 -0
  62. package/dist/core/fuzzy.js +30 -0
  63. package/dist/core/fuzzy.js.map +1 -0
  64. package/dist/core/json-renderer.d.ts +5 -0
  65. package/dist/core/json-renderer.d.ts.map +1 -0
  66. package/dist/core/json-renderer.js +48 -0
  67. package/dist/core/json-renderer.js.map +1 -0
  68. package/dist/core/json.d.ts +5 -3
  69. package/dist/core/json.d.ts.map +1 -1
  70. package/dist/core/json.js +8 -4
  71. package/dist/core/json.js.map +1 -1
  72. package/dist/core/progress.d.ts +11 -0
  73. package/dist/core/progress.d.ts.map +1 -0
  74. package/dist/core/progress.js +53 -0
  75. package/dist/core/progress.js.map +1 -0
  76. package/dist/core/prompt.d.ts.map +1 -1
  77. package/dist/core/prompt.js +62 -4
  78. package/dist/core/prompt.js.map +1 -1
  79. package/dist/core/renderer.d.ts +13 -0
  80. package/dist/core/renderer.d.ts.map +1 -0
  81. package/dist/core/renderer.js +157 -0
  82. package/dist/core/renderer.js.map +1 -0
  83. package/dist/core/stream-renderer.d.ts +5 -0
  84. package/dist/core/stream-renderer.d.ts.map +1 -0
  85. package/dist/core/stream-renderer.js +71 -0
  86. package/dist/core/stream-renderer.js.map +1 -0
  87. package/dist/core/types.d.ts +46 -8
  88. package/dist/core/types.d.ts.map +1 -1
  89. package/dist/index.js +17 -1
  90. package/dist/index.js.map +1 -1
  91. package/package.json +1 -1
  92. package/dist/core/log.d.ts +0 -8
  93. package/dist/core/log.d.ts.map +0 -1
  94. package/dist/core/log.js +0 -24
  95. package/dist/core/log.js.map +0 -1
package/dist/cli/list.js CHANGED
@@ -1,32 +1,32 @@
1
1
  import { loadLockfile } from "../core/lockfile.js";
2
2
  import { getLockfilePath } from "../core/paths.js";
3
- import { jsonSuccess, writeJson } from "../core/json.js";
4
3
  import { createRealIOContext } from "./context.js";
5
4
  export async function executeList(ctx, options = {}) {
5
+ const { renderer } = ctx;
6
6
  const lockfile = await loadLockfile(ctx.fs, getLockfilePath());
7
7
  const installed = Object.entries(lockfile.installed);
8
- if (options.json) {
9
- writeJson(jsonSuccess({
10
- plugins: installed.map(([name, info]) => ({
11
- name,
12
- version: info.version,
13
- repo: info.repo,
14
- method: info.method,
15
- pinned: info.pinned,
16
- })),
17
- }));
18
- return;
19
- }
20
8
  if (installed.length === 0) {
21
- ctx.logger.info("No plugins installed");
9
+ renderer.text("No plugins installed");
10
+ renderer.finish(true, { plugins: [] });
22
11
  return;
23
12
  }
24
- ctx.logger.info(`Installed plugins (${installed.length}):\n`);
25
- for (const [name, info] of installed) {
26
- const pin = info.pinned ? " (pinned)" : "";
27
- const method = info.method === "local" ? " [local]" : "";
28
- ctx.logger.info(` ${name}@${info.version}${pin}${method} — from ${info.repo}`);
29
- }
13
+ renderer.heading(`Installed plugins (${installed.length})`);
14
+ renderer.table(["Name", "Version", "Repo", "Method", "Pinned"], installed.map(([name, info]) => [
15
+ name,
16
+ info.version,
17
+ info.repo,
18
+ info.method,
19
+ info.pinned ? "yes" : "no",
20
+ ]));
21
+ renderer.finish(true, {
22
+ plugins: installed.map(([name, info]) => ({
23
+ name,
24
+ version: info.version,
25
+ repo: info.repo,
26
+ method: info.method,
27
+ pinned: info.pinned,
28
+ })),
29
+ });
30
30
  }
31
31
  export function registerListCommand(program) {
32
32
  program
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/cli/list.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAc,EAAE,UAAyB,EAAE;IACzE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,SAAS,CAAC,WAAW,CAAC;YAClB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtC,IAAI;gBACJ,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;aACtB,CAAC,CAAC;SACN,CAAC,CAAC,CAAC;QACJ,OAAO;IACX,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACxC,OAAO;IACX,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,SAAS,CAAC,MAAM,MAAM,CAAC,CAAC;IAC9D,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,MAAM,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACpF,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAChD,OAAO;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAC;QACjD,MAAM,GAAG,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/cli/list.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAc,EAAE,UAAyB,EAAE;IACzE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IACzB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAErD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACtC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,OAAO;IACX,CAAC;IAED,QAAQ,CAAC,OAAO,CAAC,sBAAsB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5D,QAAQ,CAAC,KAAK,CACV,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAC/C,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI;QACJ,IAAI,CAAC,OAAO;QACZ,IAAI,CAAC,IAAI;QACT,IAAI,CAAC,MAAM;QACX,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;KAC7B,CAAC,CACL,CAAC;IAEF,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;QAClB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI;YACJ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACtB,CAAC,CAAC;KACN,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAChD,OAAO;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAC;QACjD,MAAM,GAAG,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"rebuild.d.ts","sourceRoot":"","sources":["../../src/cli/rebuild.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgF7D"}
1
+ {"version":3,"file":"rebuild.d.ts","sourceRoot":"","sources":["../../src/cli/rebuild.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyE7D"}
@@ -2,7 +2,7 @@ import { loadConfig } from "../core/config.js";
2
2
  import { getConfigPath } from "../core/paths.js";
3
3
  import { detectVencordPath, detectDiscordBinary } from "../core/detect.js";
4
4
  import { buildAndDeploy } from "../core/builder.js";
5
- import { jsonSuccess, jsonError, writeJson } from "../core/json.js";
5
+ import { ErrorCode, makeError, exitCodeForError } from "../core/errors.js";
6
6
  import { createRealIOContext } from "./context.js";
7
7
  export function registerRebuildCommand(program) {
8
8
  program
@@ -13,17 +13,15 @@ export function registerRebuildCommand(program) {
13
13
  .action(async (cmdOptions) => {
14
14
  const globalOpts = program.opts();
15
15
  const ctx = createRealIOContext(globalOpts);
16
+ const { renderer } = ctx;
16
17
  const configPath = globalOpts.config ?? getConfigPath();
17
18
  const config = await loadConfig(ctx.fs, configPath);
18
19
  // Resolve Vencord path
19
20
  const vencordPath = config.vencord.path ?? await detectVencordPath(ctx.fs);
20
21
  if (!vencordPath) {
21
- if (globalOpts.json) {
22
- writeJson(jsonError("Vencord path not found. Set vencord.path in config or $VENPM_VENCORD_PATH."));
23
- return;
24
- }
25
- ctx.logger.error("Vencord path not found. Set vencord.path in config or $VENPM_VENCORD_PATH.");
26
- process.exitCode = 1;
22
+ renderer.error(makeError(ErrorCode.VENCORD_NOT_FOUND, "Vencord path not found. Set vencord.path in config or $VENPM_VENCORD_PATH."));
23
+ renderer.finish(false);
24
+ process.exitCode = exitCodeForError(ErrorCode.VENCORD_NOT_FOUND);
27
25
  return;
28
26
  }
29
27
  // Resolve Discord binary for optional restart
@@ -45,38 +43,33 @@ export function registerRebuildCommand(program) {
45
43
  shouldRestart = await ctx.prompter.confirm("Restart Discord after rebuild?", false);
46
44
  }
47
45
  }
48
- ctx.logger.info(`Building Vencord at ${vencordPath}...`);
46
+ const p = renderer.progress("rebuild", `Building Vencord at ${vencordPath}...`);
49
47
  try {
50
48
  const result = await buildAndDeploy(ctx.fs, ctx.shell, vencordPath, {
51
49
  restart: shouldRestart,
52
50
  discordBinary: discordBinary ?? undefined,
53
51
  });
54
- if (globalOpts.json) {
55
- writeJson(jsonSuccess({
56
- built: true,
57
- deployed: result.deployed,
58
- restarted: result.restarted,
59
- }));
60
- return;
61
- }
62
- ctx.logger.success("Build complete");
52
+ p.succeed("Build complete");
63
53
  if (result.deployed && result.deployPath) {
64
- ctx.logger.info(`Deployed to ${result.deployPath}`);
54
+ renderer.text(`Deployed to ${result.deployPath}`);
65
55
  }
66
56
  else if (!result.deployed) {
67
- ctx.logger.warn("Deploy target not found — skipped copy step");
57
+ renderer.warn("Deploy target not found — skipped copy step");
68
58
  }
69
59
  if (result.restarted) {
70
- ctx.logger.info("Discord restarted");
60
+ renderer.text("Discord restarted");
71
61
  }
62
+ renderer.finish(true, {
63
+ built: true,
64
+ deployed: result.deployed,
65
+ restarted: result.restarted,
66
+ });
72
67
  }
73
68
  catch (err) {
74
- if (globalOpts.json) {
75
- writeJson(jsonError(`Build failed: ${err.message}`));
76
- return;
77
- }
78
- ctx.logger.error(`Build failed: ${err.message}`);
79
- process.exitCode = 1;
69
+ p.fail("Build failed");
70
+ renderer.error(makeError(ErrorCode.BUILD_FAILED, `Build failed: ${err.message}`));
71
+ renderer.finish(false);
72
+ process.exitCode = exitCodeForError(ErrorCode.BUILD_FAILED);
80
73
  return;
81
74
  }
82
75
  });
@@ -1 +1 @@
1
- {"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../../src/cli/rebuild.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../../src/cli/rebuild.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/cli/repo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmG1D"}
1
+ {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/cli/repo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4F1D"}
package/dist/cli/repo.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { loadConfig, saveConfig } from "../core/config.js";
2
2
  import { getConfigPath } from "../core/paths.js";
3
- import { jsonSuccess, jsonError, writeJson } from "../core/json.js";
3
+ import { ErrorCode, makeError, exitCodeForError } from "../core/errors.js";
4
4
  import { createRealIOContext } from "./context.js";
5
5
  export function registerRepoCommand(program) {
6
6
  const repo = program
@@ -13,6 +13,7 @@ export function registerRepoCommand(program) {
13
13
  .action(async (url, options) => {
14
14
  const parentOpts = program.opts();
15
15
  const ctx = createRealIOContext(parentOpts);
16
+ const { renderer } = ctx;
16
17
  const configPath = parentOpts.config ?? getConfigPath();
17
18
  const config = await loadConfig(ctx.fs, configPath);
18
19
  let name = options.name;
@@ -26,21 +27,15 @@ export function registerRepoCommand(program) {
26
27
  }
27
28
  const existing = config.repos.find(r => r.name === name);
28
29
  if (existing) {
29
- if (parentOpts.json) {
30
- writeJson(jsonError(`Repository with name "${name}" already exists (${existing.url})`));
31
- return;
32
- }
33
- ctx.logger.error(`Repository with name "${name}" already exists (${existing.url})`);
34
- process.exitCode = 1;
30
+ renderer.error(makeError(ErrorCode.REPO_FETCH_FAILED, `Repository with name "${name}" already exists (${existing.url})`));
31
+ renderer.finish(false);
32
+ process.exitCode = exitCodeForError(ErrorCode.REPO_FETCH_FAILED);
35
33
  return;
36
34
  }
37
35
  config.repos.push({ name, url });
38
36
  await saveConfig(ctx.fs, configPath, config);
39
- if (parentOpts.json) {
40
- writeJson(jsonSuccess({ name, url }));
41
- return;
42
- }
43
- ctx.logger.success(`Added repository "${name}" → ${url}`);
37
+ renderer.success(`Added repository "${name}" → ${url}`);
38
+ renderer.finish(true, { name, url });
44
39
  });
45
40
  repo
46
41
  .command("remove <name>")
@@ -48,25 +43,23 @@ export function registerRepoCommand(program) {
48
43
  .action(async (name) => {
49
44
  const parentOpts = program.opts();
50
45
  const ctx = createRealIOContext(parentOpts);
46
+ const { renderer } = ctx;
51
47
  const configPath = parentOpts.config ?? getConfigPath();
52
48
  const config = await loadConfig(ctx.fs, configPath);
53
49
  const index = config.repos.findIndex(r => r.name === name);
54
50
  if (index === -1) {
55
- if (parentOpts.json) {
56
- writeJson(jsonError(`Repository "${name}" not found`));
57
- return;
58
- }
59
- ctx.logger.error(`Repository "${name}" not found`);
60
- process.exitCode = 1;
51
+ const repoNames = config.repos.map(r => r.name);
52
+ renderer.error(makeError(ErrorCode.REPO_FETCH_FAILED, `Repository "${name}" not found`, {
53
+ candidates: repoNames.length > 0 ? repoNames : undefined,
54
+ }));
55
+ renderer.finish(false);
56
+ process.exitCode = exitCodeForError(ErrorCode.REPO_FETCH_FAILED);
61
57
  return;
62
58
  }
63
59
  config.repos.splice(index, 1);
64
60
  await saveConfig(ctx.fs, configPath, config);
65
- if (parentOpts.json) {
66
- writeJson(jsonSuccess({ removed: name }));
67
- return;
68
- }
69
- ctx.logger.success(`Removed repository "${name}"`);
61
+ renderer.success(`Removed repository "${name}"`);
62
+ renderer.finish(true, { removed: name });
70
63
  });
71
64
  repo
72
65
  .command("list")
@@ -74,20 +67,17 @@ export function registerRepoCommand(program) {
74
67
  .action(async () => {
75
68
  const parentOpts = program.opts();
76
69
  const ctx = createRealIOContext(parentOpts);
70
+ const { renderer } = ctx;
77
71
  const configPath = parentOpts.config ?? getConfigPath();
78
72
  const config = await loadConfig(ctx.fs, configPath);
79
- if (parentOpts.json) {
80
- writeJson(jsonSuccess({ repos: config.repos.map(r => ({ name: r.name, url: r.url })) }));
81
- return;
82
- }
83
73
  if (config.repos.length === 0) {
84
- ctx.logger.info("No repositories configured");
74
+ renderer.text("No repositories configured");
75
+ renderer.finish(true, { repos: [] });
85
76
  return;
86
77
  }
87
- ctx.logger.info(`Configured repositories (${config.repos.length}):\n`);
88
- for (const r of config.repos) {
89
- ctx.logger.info(` ${r.name} ${r.url}`);
90
- }
78
+ renderer.heading(`Configured repositories (${config.repos.length})`);
79
+ renderer.table(["Name", "URL"], config.repos.map(r => [r.name, r.url]));
80
+ renderer.finish(true, { repos: config.repos.map(r => ({ name: r.name, url: r.url })) });
91
81
  });
92
82
  }
93
83
  //# sourceMappingURL=repo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/cli/repo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/cli/repo.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/cli/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjE,wBAAsB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC7G;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAS5D"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/cli/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOjE,wBAAsB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC7G;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAS5D"}
@@ -2,40 +2,39 @@ import { loadConfig } from "../core/config.js";
2
2
  import { getConfigPath } from "../core/paths.js";
3
3
  import { fetchAllIndexes, searchPlugins } from "../core/registry.js";
4
4
  import { loadCache, saveCache } from "../core/cache.js";
5
- import { jsonSuccess, writeJson } from "../core/json.js";
6
5
  import { createRealIOContext } from "./context.js";
7
6
  export async function executeSearch(ctx, query, options = {}) {
7
+ const { renderer } = ctx;
8
8
  const config = await loadConfig(ctx.fs, options.config ?? getConfigPath());
9
9
  const cache = await loadCache(ctx.fs);
10
10
  const { results: indexes, updatedCache } = await fetchAllIndexes(ctx.http, config.repos, { cache });
11
11
  await saveCache(ctx.fs, updatedCache);
12
12
  for (const fi of indexes) {
13
13
  if (fi.error) {
14
- ctx.logger.warn(`Failed to fetch index from "${fi.repoName}": ${fi.error}`);
14
+ renderer.warn(`Failed to fetch index from "${fi.repoName}": ${fi.error}`);
15
15
  }
16
16
  }
17
17
  const results = searchPlugins(indexes, query);
18
- if (options.json) {
19
- writeJson(jsonSuccess({
20
- results: results.map(r => ({
21
- name: r.name,
22
- version: r.entry.version,
23
- description: r.entry.description ?? null,
24
- repo: r.repoName,
25
- })),
26
- }));
27
- return;
28
- }
29
18
  if (results.length === 0) {
30
- ctx.logger.info(`No plugins found matching "${query}"`);
19
+ renderer.text(`No plugins found matching "${query}"`);
20
+ renderer.finish(true, { results: [] });
31
21
  return;
32
22
  }
33
- ctx.logger.info(`Search results for "${query}" (${results.length} found):\n`);
34
- for (const match of results) {
35
- const desc = match.entry.description ? ` — ${match.entry.description}` : "";
36
- ctx.logger.info(` ${match.name}@${match.entry.version}${desc}`);
37
- ctx.logger.info(` repo: ${match.repoName}`);
38
- }
23
+ renderer.heading(`Search results for "${query}" (${results.length} found)`);
24
+ renderer.table(["Name", "Version", "Description", "Repo"], results.map(r => [
25
+ r.name,
26
+ r.entry.version,
27
+ r.entry.description ?? "",
28
+ r.repoName,
29
+ ]));
30
+ renderer.finish(true, {
31
+ results: results.map(r => ({
32
+ name: r.name,
33
+ version: r.entry.version,
34
+ description: r.entry.description ?? null,
35
+ repo: r.repoName,
36
+ })),
37
+ });
39
38
  }
40
39
  export function registerSearchCommand(program) {
41
40
  program
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/cli/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/cli/search.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/cli/uninstall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AASjE,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDhH;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc/D"}
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/cli/uninstall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAUjE,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ChH;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc/D"}
@@ -4,21 +4,21 @@ import { loadLockfile, saveLockfile, isInstalled, removeInstalled } from "../cor
4
4
  import { getConfigPath, getLockfilePath } from "../core/paths.js";
5
5
  import { fetchAllIndexes, resolvePlugin } from "../core/registry.js";
6
6
  import { loadCache, saveCache } from "../core/cache.js";
7
- import { jsonSuccess, jsonError, writeJson } from "../core/json.js";
7
+ import { ErrorCode, makeError, exitCodeForError } from "../core/errors.js";
8
+ import { findCandidates } from "../core/fuzzy.js";
8
9
  import { createRealIOContext } from "./context.js";
9
10
  export async function executeUninstall(ctx, pluginName, options) {
11
+ const { renderer } = ctx;
10
12
  const configPath = options.config ?? getConfigPath();
11
13
  const lockfilePath = getLockfilePath();
12
14
  const config = await loadConfig(ctx.fs, configPath);
13
15
  let lockfile = await loadLockfile(ctx.fs, lockfilePath);
14
16
  if (!isInstalled(lockfile, pluginName)) {
15
- if (options.json) {
16
- process.exitCode = 1;
17
- writeJson(jsonError(`Plugin "${pluginName}" is not installed.`));
18
- return;
19
- }
20
- ctx.logger.error(`Plugin "${pluginName}" is not installed.`);
21
- process.exitCode = 1;
17
+ const installedNames = Object.keys(lockfile.installed);
18
+ const candidates = findCandidates(pluginName, installedNames);
19
+ renderer.error(makeError(ErrorCode.PLUGIN_NOT_INSTALLED, `Plugin "${pluginName}" is not installed.`, { candidates }));
20
+ renderer.finish(false);
21
+ process.exitCode = exitCodeForError(ErrorCode.PLUGIN_NOT_INSTALLED);
22
22
  return;
23
23
  }
24
24
  // Warn if other installed plugins depend on this one
@@ -29,26 +29,24 @@ export async function executeUninstall(ctx, pluginName, options) {
29
29
  for (const other of otherInstalled) {
30
30
  const match = resolvePlugin(fetchedIndexes, other);
31
31
  if (match?.entry.dependencies?.includes(pluginName)) {
32
- ctx.logger.warn(`"${other}" depends on this plugin`);
32
+ renderer.warn(`"${other}" depends on this plugin`);
33
33
  }
34
34
  }
35
35
  const confirmed = await ctx.prompter.confirm(`Remove plugin "${pluginName}"?`, true);
36
36
  if (!confirmed) {
37
- ctx.logger.info("Uninstall cancelled.");
37
+ renderer.text("Uninstall cancelled.");
38
+ renderer.finish(false);
38
39
  return;
39
40
  }
40
41
  if (config.vencord.path !== null) {
41
42
  const pluginDir = join(config.vencord.path, "src", "userplugins", pluginName);
42
43
  await ctx.fs.rm(pluginDir, { recursive: true, force: true });
43
- ctx.logger.success(`Removed plugin directory: ${pluginDir}`);
44
+ renderer.success(`Removed plugin directory: ${pluginDir}`);
44
45
  }
45
46
  lockfile = removeInstalled(lockfile, pluginName);
46
47
  await saveLockfile(ctx.fs, lockfilePath, lockfile);
47
- if (options.json) {
48
- writeJson(jsonSuccess({ removed: pluginName }));
49
- return;
50
- }
51
- ctx.logger.success(`Uninstalled "${pluginName}".`);
48
+ renderer.success(`Uninstalled "${pluginName}".`);
49
+ renderer.finish(true, { removed: pluginName });
52
50
  }
53
51
  export function registerUninstallCommand(program) {
54
52
  program
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/cli/uninstall.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/cli/uninstall.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/cli/update.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AAWnF,wBAAsB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsJzH;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAS5D"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/cli/update.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AAYnF,wBAAsB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAoJzH;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAS5D"}
@@ -5,21 +5,20 @@ import { getConfigPath, getLockfilePath } from "../core/paths.js";
5
5
  import { fetchAllIndexes, resolvePlugin } from "../core/registry.js";
6
6
  import { loadCache, saveCache } from "../core/cache.js";
7
7
  import { fetchPlugin } from "../core/fetcher.js";
8
- import { jsonSuccess, jsonError, writeJson } from "../core/json.js";
8
+ import { ErrorCode, makeError, exitCodeForError } from "../core/errors.js";
9
+ import { findCandidates } from "../core/fuzzy.js";
9
10
  import { createRealIOContext } from "./context.js";
10
11
  import { selectMethodFromSource } from "../core/resolver.js";
11
12
  export async function executeUpdate(ctx, pluginName, options) {
13
+ const { renderer } = ctx;
12
14
  const configPath = options.config ?? getConfigPath();
13
15
  const lockfilePath = getLockfilePath();
14
16
  const config = await loadConfig(ctx.fs, configPath);
15
17
  let lockfile = await loadLockfile(ctx.fs, lockfilePath);
16
18
  const installedEntries = Object.entries(lockfile.installed);
17
19
  if (installedEntries.length === 0) {
18
- if (options.json) {
19
- writeJson(jsonSuccess({ updated: [], skipped: [] }));
20
- return;
21
- }
22
- ctx.logger.info("No plugins installed.");
20
+ renderer.text("No plugins installed.");
21
+ renderer.finish(true, { updated: [], skipped: [] });
23
22
  return;
24
23
  }
25
24
  // Determine which plugins to update
@@ -27,13 +26,11 @@ export async function executeUpdate(ctx, pluginName, options) {
27
26
  if (pluginName !== undefined) {
28
27
  const info = getInstalled(lockfile, pluginName);
29
28
  if (!info) {
30
- if (options.json) {
31
- writeJson(jsonError(`Plugin "${pluginName}" is not installed.`));
32
- process.exitCode = 1;
33
- return;
34
- }
35
- ctx.logger.error(`Plugin "${pluginName}" is not installed.`);
36
- process.exitCode = 1;
29
+ const installedNames = Object.keys(lockfile.installed);
30
+ const candidates = findCandidates(pluginName, installedNames);
31
+ renderer.error(makeError(ErrorCode.PLUGIN_NOT_INSTALLED, `Plugin "${pluginName}" is not installed.`, { candidates }));
32
+ renderer.finish(false);
33
+ process.exitCode = exitCodeForError(ErrorCode.PLUGIN_NOT_INSTALLED);
37
34
  return;
38
35
  }
39
36
  targets = [pluginName];
@@ -45,50 +42,49 @@ export async function executeUpdate(ctx, pluginName, options) {
45
42
  const updateable = targets.filter(name => {
46
43
  const info = getInstalled(lockfile, name);
47
44
  if (info.pinned) {
48
- ctx.logger.info(`Skipping pinned plugin: ${name}`);
45
+ renderer.verbose(`Skipping pinned plugin: ${name}`);
49
46
  return false;
50
47
  }
51
48
  if (info.method === "local") {
52
- ctx.logger.info(`Skipping local plugin: ${name}`);
49
+ renderer.verbose(`Skipping local plugin: ${name}`);
53
50
  return false;
54
51
  }
55
52
  return true;
56
53
  });
57
54
  if (updateable.length === 0) {
58
- if (options.json) {
59
- writeJson(jsonSuccess({ updated: [], skipped: [] }));
60
- return;
61
- }
62
- ctx.logger.info("Nothing to update.");
55
+ renderer.text("Nothing to update.");
56
+ renderer.finish(true, { updated: [], skipped: [] });
63
57
  return;
64
58
  }
59
+ const p = renderer.progress("fetch-indexes", "Fetching indexes...");
65
60
  const cache = await loadCache(ctx.fs);
66
61
  const { results: indexes, updatedCache } = await fetchAllIndexes(ctx.http, config.repos, { cache });
67
62
  await saveCache(ctx.fs, updatedCache);
63
+ p.succeed(`${indexes.filter(fi => fi.index).length} repo(s) fetched`);
68
64
  for (const fi of indexes) {
69
65
  if (fi.error) {
70
- ctx.logger.warn(`Failed to fetch index from "${fi.repoName}": ${fi.error}`);
66
+ renderer.warn(`Failed to fetch index from "${fi.repoName}": ${fi.error}`);
71
67
  }
72
68
  }
73
69
  const gitAvailable = await ctx.git.available();
74
70
  let updatedCount = 0;
75
- const updatedEntries = [];
71
+ const updatedResults = [];
76
72
  const skippedNames = [];
77
73
  for (const name of updateable) {
78
74
  const installedInfo = getInstalled(lockfile, name);
79
75
  const match = resolvePlugin(indexes, name, installedInfo.repo);
80
76
  if (!match) {
81
- ctx.logger.warn(`Plugin "${name}" not found in repo "${installedInfo.repo}" — skipping`);
77
+ renderer.warn(`Plugin "${name}" not found in repo "${installedInfo.repo}" — skipping`);
82
78
  skippedNames.push(name);
83
79
  continue;
84
80
  }
85
81
  const latestVersion = match.entry.version;
86
82
  if (latestVersion === installedInfo.version) {
87
- ctx.logger.verbose(`${name} is up to date (${installedInfo.version})`);
83
+ renderer.verbose(`${name} is up to date (${installedInfo.version})`);
88
84
  skippedNames.push(name);
89
85
  continue;
90
86
  }
91
- ctx.logger.info(`Updating ${name}: ${installedInfo.version} → ${latestVersion}`);
87
+ const up = renderer.progress(`update-${name}`, `Updating ${name}: ${installedInfo.version} → ${latestVersion}`);
92
88
  // Remove old plugin directory if vencord.path is configured
93
89
  if (config.vencord.path !== null) {
94
90
  const oldDir = join(config.vencord.path, "src", "userplugins", name);
@@ -127,21 +123,18 @@ export async function executeUpdate(ctx, pluginName, options) {
127
123
  version: latestVersion,
128
124
  });
129
125
  }
130
- ctx.logger.success(`Updated ${name} to ${latestVersion}`);
131
- updatedEntries.push({ name, from: installedInfo.version, to: latestVersion });
126
+ up.succeed(`${name}: ${installedInfo.version} ${latestVersion}`);
127
+ updatedResults.push({ name, from: installedInfo.version, to: latestVersion });
132
128
  updatedCount++;
133
129
  }
134
130
  await saveLockfile(ctx.fs, lockfilePath, lockfile);
135
- if (options.json) {
136
- writeJson(jsonSuccess({ updated: updatedEntries, skipped: skippedNames }));
137
- return;
138
- }
139
131
  if (updatedCount === 0) {
140
- ctx.logger.info("All plugins are up to date.");
132
+ renderer.text("All plugins are up to date.");
141
133
  }
142
134
  else {
143
- ctx.logger.success(`Updated ${updatedCount} plugin(s).`);
135
+ renderer.success(`Updated ${updatedCount} plugin(s).`);
144
136
  }
137
+ renderer.finish(true, { updated: updatedResults, skipped: skippedNames });
145
138
  }
146
139
  export function registerUpdateCommand(program) {
147
140
  program