@g3nomaly/mods 0.1.1 → 0.1.2

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 (52) hide show
  1. package/README.md +12 -11
  2. package/dist/cli/commands/add.d.ts.map +1 -1
  3. package/dist/cli/commands/add.js +2 -3
  4. package/dist/cli/commands/add.js.map +1 -1
  5. package/dist/cli/commands/init.d.ts +7 -4
  6. package/dist/cli/commands/init.d.ts.map +1 -1
  7. package/dist/cli/commands/init.js +6 -5
  8. package/dist/cli/commands/init.js.map +1 -1
  9. package/dist/cli/index.js +4 -3
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/cli/viewer.d.ts +16 -5
  12. package/dist/cli/viewer.d.ts.map +1 -1
  13. package/dist/cli/viewer.js +76 -18
  14. package/dist/cli/viewer.js.map +1 -1
  15. package/dist/relay/index.d.ts +2 -0
  16. package/dist/relay/index.d.ts.map +1 -0
  17. package/dist/relay/index.js +9 -0
  18. package/dist/relay/index.js.map +1 -0
  19. package/dist/relay/lines.d.ts +25 -0
  20. package/dist/relay/lines.d.ts.map +1 -0
  21. package/dist/relay/lines.js +35 -0
  22. package/dist/relay/lines.js.map +1 -0
  23. package/dist/relay/protocol.d.ts +123 -0
  24. package/dist/relay/protocol.d.ts.map +1 -0
  25. package/dist/relay/protocol.js +70 -0
  26. package/dist/relay/protocol.js.map +1 -0
  27. package/dist/relay/relay.d.ts +16 -0
  28. package/dist/relay/relay.d.ts.map +1 -0
  29. package/dist/relay/relay.js +213 -0
  30. package/dist/relay/relay.js.map +1 -0
  31. package/dist/relay/sessions.d.ts +28 -0
  32. package/dist/relay/sessions.d.ts.map +1 -0
  33. package/dist/relay/sessions.js +86 -0
  34. package/dist/relay/sessions.js.map +1 -0
  35. package/dist/viewer/index.d.ts +6 -0
  36. package/dist/viewer/index.d.ts.map +1 -1
  37. package/dist/viewer/index.js +3 -0
  38. package/dist/viewer/index.js.map +1 -1
  39. package/dist/viewer/machine.d.ts +37 -0
  40. package/dist/viewer/machine.d.ts.map +1 -0
  41. package/dist/viewer/machine.js +55 -0
  42. package/dist/viewer/machine.js.map +1 -0
  43. package/dist/viewer/relay.d.ts +23 -0
  44. package/dist/viewer/relay.d.ts.map +1 -0
  45. package/dist/viewer/relay.js +51 -0
  46. package/dist/viewer/relay.js.map +1 -0
  47. package/dist/viewer/viewerExtension.d.ts +27 -0
  48. package/dist/viewer/viewerExtension.d.ts.map +1 -0
  49. package/dist/viewer/viewerExtension.js +48 -0
  50. package/dist/viewer/viewerExtension.js.map +1 -0
  51. package/dist/vscode/g3n-mods-viewer.vsix +0 -0
  52. package/package.json +9 -5
@@ -0,0 +1,51 @@
1
+ // packages/mods/src/viewer/relay.ts
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { hashString } from "@g3nomaly/core/hash";
6
+ import { findPackageRoot } from "@g3nomaly/core/utils";
7
+ /** Where `init` builds the relay: one executable per machine, since VS Code sets the wrapper per machine. */
8
+ export function relayBinaryPath(home = os.homedir()) {
9
+ return path.join(home, ".claude", "g3n-mods", "bin", "g3n-mods-relay");
10
+ }
11
+ /** The relay's entry and the files it is built from: the compiled ones of an installed package, else the sources of this repository. */
12
+ function relaySources() {
13
+ const root = findPackageRoot(import.meta.dir);
14
+ for (const [dir, entry] of [["dist/relay", "index.js"], ["src/relay", "index.ts"]]) {
15
+ const folder = path.join(root, dir);
16
+ if (fs.existsSync(path.join(folder, entry))) {
17
+ const files = fs.readdirSync(folder).filter((name) => /\.(js|ts)$/.test(name) && !name.endsWith(".d.ts")).sort().map((name) => path.join(folder, name));
18
+ return { entry: path.join(folder, entry), files };
19
+ }
20
+ }
21
+ throw new Error(`no relay sources under ${root}`);
22
+ }
23
+ /**
24
+ * Builds the relay into a standalone executable with `bun build --compile`,
25
+ * unless the one already there was built from the same sources. A stamp
26
+ * file beside it holds the hash of those sources.
27
+ *
28
+ * @param home - Home directory the executable goes under; the current user's by default
29
+ */
30
+ export async function installRelay(home = os.homedir()) {
31
+ const binary = relayBinaryPath(home);
32
+ const stamp = `${binary}.sources`;
33
+ let sources;
34
+ try {
35
+ sources = relaySources();
36
+ }
37
+ catch (error) {
38
+ return { kind: "failed", binary, reason: error instanceof Error ? error.message : String(error) };
39
+ }
40
+ const hash = await hashString(sources.files.map((file) => fs.readFileSync(file, "utf8")).join("\0"));
41
+ if (fs.existsSync(binary) && fs.existsSync(stamp) && fs.readFileSync(stamp, "utf8") === hash)
42
+ return { kind: "current", binary };
43
+ fs.mkdirSync(path.dirname(binary), { recursive: true });
44
+ const built = Bun.spawnSync(["bun", "build", "--compile", sources.entry, "--outfile", binary], { stdout: "pipe", stderr: "pipe" });
45
+ if (built.exitCode !== 0) {
46
+ return { kind: "failed", binary, reason: built.stderr.toString().trim() || `bun build exited with ${built.exitCode}` };
47
+ }
48
+ fs.writeFileSync(stamp, hash);
49
+ return { kind: "built", binary };
50
+ }
51
+ //# sourceMappingURL=relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/viewer/relay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /** The viewer extension's id in VS Code: `<publisher>.<name>` from `vscode/package.json`. */
2
+ export declare const VIEWER_EXTENSION_ID = "g3nomaly.g3n-mods-viewer";
3
+ /** Absolute path of the packed viewer, built into `dist/vscode/` by `bun run build`. */
4
+ export declare function viewerPackagePath(): string;
5
+ /** What `installViewer` did. */
6
+ export type ViewerInstallResult = {
7
+ kind: "installed";
8
+ cli: string;
9
+ } | {
10
+ kind: "no-package";
11
+ vsix: string;
12
+ } | {
13
+ kind: "no-cli";
14
+ vsix: string;
15
+ } | {
16
+ kind: "failed";
17
+ vsix: string;
18
+ reason: string;
19
+ };
20
+ /**
21
+ * Installs the viewer extension into VS Code with `code --install-extension`,
22
+ * replacing an older copy.
23
+ *
24
+ * @param home - Home directory to look for a VS Code server under; the current user's by default
25
+ */
26
+ export declare function installViewer(home?: string): ViewerInstallResult;
27
+ //# sourceMappingURL=viewerExtension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewerExtension.d.ts","sourceRoot":"","sources":["../../src/viewer/viewerExtension.ts"],"names":[],"mappings":"AAMA,6FAA6F;AAC7F,eAAO,MAAM,mBAAmB,6BAA6B,CAAC;AAE9D,wFAAwF;AACxF,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,gCAAgC;AAChC,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAmBrD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,MAAqB,GAAG,mBAAmB,CAQ9E"}
@@ -0,0 +1,48 @@
1
+ // packages/mods/src/viewer/viewerExtension.ts
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { findPackageRoot } from "@g3nomaly/core/utils";
6
+ /** The viewer extension's id in VS Code: `<publisher>.<name>` from `vscode/package.json`. */
7
+ export const VIEWER_EXTENSION_ID = "g3nomaly.g3n-mods-viewer";
8
+ /** Absolute path of the packed viewer, built into `dist/vscode/` by `bun run build`. */
9
+ export function viewerPackagePath() {
10
+ return path.join(findPackageRoot(import.meta.dir), "dist", "vscode", "g3n-mods-viewer.vsix");
11
+ }
12
+ /** VS Code's `code` command: on the PATH, else the one a VS Code server ships for its own terminals. */
13
+ function findCodeCli(home) {
14
+ for (const dir of (process.env.PATH ?? "").split(path.delimiter)) {
15
+ for (const name of process.platform === "win32" ? ["code.cmd", "code"] : ["code"]) {
16
+ const candidate = path.join(dir, name);
17
+ if (dir !== "" && fs.existsSync(candidate))
18
+ return candidate;
19
+ }
20
+ }
21
+ const servers = path.join(home, ".vscode-server", "bin");
22
+ if (!fs.existsSync(servers))
23
+ return null;
24
+ const clis = fs.readdirSync(servers)
25
+ .map((commit) => path.join(servers, commit, "bin", "remote-cli", "code"))
26
+ .filter((cli) => fs.existsSync(cli))
27
+ .sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
28
+ return clis[0] ?? null;
29
+ }
30
+ /**
31
+ * Installs the viewer extension into VS Code with `code --install-extension`,
32
+ * replacing an older copy.
33
+ *
34
+ * @param home - Home directory to look for a VS Code server under; the current user's by default
35
+ */
36
+ export function installViewer(home = os.homedir()) {
37
+ const vsix = viewerPackagePath();
38
+ if (!fs.existsSync(vsix))
39
+ return { kind: "no-package", vsix };
40
+ const cli = findCodeCli(home);
41
+ if (cli === null)
42
+ return { kind: "no-cli", vsix };
43
+ const run = Bun.spawnSync([cli, "--install-extension", vsix, "--force"], { stdout: "pipe", stderr: "pipe" });
44
+ if (run.exitCode !== 0)
45
+ return { kind: "failed", vsix, reason: (run.stderr.toString() || run.stdout.toString()).trim() };
46
+ return { kind: "installed", cli };
47
+ }
48
+ //# sourceMappingURL=viewerExtension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewerExtension.js","sourceRoot":"","sources":["../../src/viewer/viewerExtension.ts"],"names":[],"mappings":"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"}
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@g3nomaly/mods",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Installer for Claude Code mods: registers mod sources and installs, updates and removes mods from them.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -18,18 +18,22 @@
18
18
  "dist"
19
19
  ],
20
20
  "scripts": {
21
- "build": "rm -rf dist && tsc --project tsconfig.build.json",
22
- "typecheck": "tsc --noEmit",
23
- "mods": "bun run src/cli/index.ts"
21
+ "build": "rm -rf dist && tsc --project tsconfig.build.json && bun run build:viewer",
22
+ "typecheck": "tsc --noEmit && tsc --noEmit --project vscode/tsconfig.json",
23
+ "mods": "bun run src/cli/index.ts",
24
+ "build:viewer": "bun scripts/build-viewer.ts"
24
25
  },
25
26
  "dependencies": {
26
- "@g3nomaly/core": "^0.3.2",
27
+ "@g3nomaly/core": "^0.3.3",
27
28
  "chalk": "^6.0.0",
28
29
  "commander": "^15.0.0",
29
30
  "zod": "^4.4.3"
30
31
  },
31
32
  "devDependencies": {
32
33
  "@types/bun": "^1.4.0",
34
+ "@types/node": "^22",
35
+ "@types/vscode": "~1.100.0",
36
+ "marked": "^16",
33
37
  "typescript": "~7.0.2"
34
38
  },
35
39
  "license": "Elastic-2.0",