unfairly 0.6.0 → 0.7.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.6.1 — 2026-05-14
4
+
5
+ - **Fix(Claude Code wiring)** — `unfairly setup` now writes the user-scope `unfairly` entry directly to `~/.claude.json` instead of shelling out to `claude mcp add --header=…`. The shell-out form previously omitted the bearer entirely (`claude mcp list` showed "Needs authentication"), and even when fixed would have placed the raw token in process argv for the lifetime of the subprocess — visible to same-user processes via `ps aux` / `/proc/<pid>/cmdline`. Direct JSON edit keeps the token off the process table, same threat model as the Claude Desktop wiring. Strips any stale project-scope `projects[<cwd>].mcpServers.unfairly` left over from earlier local-scope installs so they don't shadow the user-scope entry.
6
+ - **Fix(Claude Desktop wiring)** — `claude_desktop_config.json` now stores the literal bearer token, not the `${UNFAIRLY_MCP_TOKEN}` placeholder. macOS GUI apps don't inherit env vars from `~/.zshenv`, so the placeholder silently expanded to an empty string and broke every request.
7
+ - **Fix(setup handshake)** — replaced the single in-process token verification with per-host real verification: setup now re-reads what each wired host (Claude Desktop, Claude Code) will actually send and POSTs `initialize` to `/api/mcp` through that header. The Codex step verifies the just-minted token is alive on the server (Codex's runtime env-var resolution chain can't be faithfully reproduced from inside this Node process, so we don't pretend to). Catches the wiring bugs above before the user closes the terminal.
8
+ - **Behavior change** — `configureClaudeCode` is no longer idempotent-skip on existing entry; it always overwrites. Re-running setup is now the supported way to rotate tokens.
9
+
3
10
  ## 0.6.0
4
11
 
5
12
  - **Bare `unfairly` entrypoint** — one command auto-detects state and runs setup + workspace bind. Daily re-run shows a status card with team moves.
@@ -1,3 +1,4 @@
1
+ export declare function openBrowser(url: string): void;
1
2
  export type BrowserAuthOptions = {
2
3
  tokenName?: string;
3
4
  timeoutMs?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"browser-flow.d.ts","sourceRoot":"","sources":["../../src/auth/browser-flow.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+CxB"}
1
+ {"version":3,"file":"browser-flow.d.ts","sourceRoot":"","sources":["../../src/auth/browser-flow.ts"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAc7C;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+CxB"}
@@ -2,7 +2,7 @@ import http from "node:http";
2
2
  import crypto from "node:crypto";
3
3
  import { spawn } from "node:child_process";
4
4
  const SUCCESS_HTML = `<!doctype html><html><head><meta charset="utf-8"><title>Unfairly CLI authorized</title><style>body{margin:0;background:#FAF5EB;font-family:system-ui;color:#1a1612;display:flex;align-items:center;justify-content:center;min-height:100vh}.card{background:#fff;border:3px solid #1a1612;border-radius:20px;box-shadow:6px 6px 0 #1a1612;padding:36px;max-width:420px;text-align:center}h1{margin:0 0 8px;font-size:28px}p{margin:0;color:rgba(26,22,18,.7)}</style></head><body><div class="card"><h1>Authorized.</h1><p>You can close this window and return to your terminal.</p></div></body></html>`;
5
- function openBrowser(url) {
5
+ export function openBrowser(url) {
6
6
  const opener = process.platform === "darwin"
7
7
  ? "open"
8
8
  : process.platform === "win32"
@@ -1 +1 @@
1
- {"version":3,"file":"browser-flow.js","sourceRoot":"","sources":["../../src/auth/browser-flow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser-flow.js","sourceRoot":"","sources":["../../src/auth/browser-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Argv } from "yargs";
2
+ type InviteArgs = {
3
+ email: string;
4
+ "persona-surface": string;
5
+ "persona-workflow"?: string;
6
+ org?: string;
7
+ api: string;
8
+ };
9
+ export declare const inviteCommand: {
10
+ command: string;
11
+ describe: string;
12
+ builder: (yargs: Argv) => Argv<{
13
+ email: string;
14
+ } & {
15
+ "persona-surface": string;
16
+ } & {
17
+ "persona-workflow": string | undefined;
18
+ } & {
19
+ org: string | undefined;
20
+ } & {
21
+ api: string;
22
+ }>;
23
+ handler: (args: InviteArgs) => Promise<void>;
24
+ };
25
+ export {};
26
+ //# sourceMappingURL=invite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invite.d.ts","sourceRoot":"","sources":["../../src/cmd/invite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAGlC,KAAK,UAAU,GAAG;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAIF,eAAO,MAAM,aAAa;;;qBAGP,IAAI;;;;;;;;;;;oBAkCC,UAAU;CAsCjC,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { getToken } from "../sync/credentials.js";
2
+ const API_DEFAULT = "https://app.unfairly.ai";
3
+ export const inviteCommand = {
4
+ command: "invite",
5
+ describe: "Generate a persona-tagged invite link for a teammate",
6
+ builder: (yargs) => yargs
7
+ .option("email", {
8
+ type: "string",
9
+ demandOption: true,
10
+ describe: "Email of the person you're inviting",
11
+ })
12
+ .option("persona-surface", {
13
+ type: "string",
14
+ demandOption: true,
15
+ choices: ["builder-terminal", "oracle-cowork", "player-web"],
16
+ describe: "Which surface they'll primarily use",
17
+ })
18
+ .option("persona-workflow", {
19
+ type: "string",
20
+ choices: [
21
+ "strategy",
22
+ "synthesis",
23
+ "clinical-operations",
24
+ "credentialing",
25
+ "technical",
26
+ "recruiting",
27
+ ],
28
+ describe: "What workflow they own",
29
+ })
30
+ .option("org", {
31
+ type: "string",
32
+ describe: "Org slug or id (required for CLI; web infers from cookie)",
33
+ })
34
+ .option("api", {
35
+ type: "string",
36
+ default: API_DEFAULT,
37
+ describe: "API origin",
38
+ }),
39
+ handler: async (args) => {
40
+ const token = await getToken();
41
+ if (!token) {
42
+ console.error("Not signed in. Run `unfairly login` first, then re-run `unfairly invite`.");
43
+ process.exit(1);
44
+ }
45
+ const res = await fetch(`${args.api}/api/onboard/invite`, {
46
+ method: "POST",
47
+ headers: {
48
+ "Content-Type": "application/json",
49
+ Authorization: `Bearer ${token}`,
50
+ },
51
+ body: JSON.stringify({
52
+ email: args.email,
53
+ persona_surface: args["persona-surface"],
54
+ persona_workflow: args["persona-workflow"],
55
+ org_slug: args.org,
56
+ }),
57
+ });
58
+ if (!res.ok) {
59
+ const err = await res.text();
60
+ console.error(`Failed to create invite: ${res.status} ${err}`);
61
+ process.exit(1);
62
+ }
63
+ const data = await res.json();
64
+ console.log(`\n✦ Invite ready for ${data.target_email}`);
65
+ console.log(` Surface: ${data.persona_surface}`);
66
+ if (data.persona_workflow) {
67
+ console.log(` Workflow: ${data.persona_workflow}`);
68
+ }
69
+ console.log(`\n ${data.url}\n`);
70
+ console.log(`Send that to them. They'll paste-run \`npx unfairly join\` from there.\n`);
71
+ },
72
+ };
73
+ //# sourceMappingURL=invite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invite.js","sourceRoot":"","sources":["../../src/cmd/invite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAUlD,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAE9C,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,sDAAsD;IAChE,OAAO,EAAE,CAAC,KAAW,EAAE,EAAE,CACvB,KAAK;SACF,MAAM,CAAC,OAAO,EAAE;QACf,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,qCAAqC;KAChD,CAAC;SACD,MAAM,CAAC,iBAAiB,EAAE;QACzB,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;QAClB,OAAO,EAAE,CAAC,kBAAkB,EAAE,eAAe,EAAE,YAAY,CAAC;QAC5D,QAAQ,EAAE,qCAAqC;KAChD,CAAC;SACD,MAAM,CAAC,kBAAkB,EAAE;QAC1B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,UAAU;YACV,WAAW;YACX,qBAAqB;YACrB,eAAe;YACf,WAAW;YACX,YAAY;SACb;QACD,QAAQ,EAAE,wBAAwB;KACnC,CAAC;SACD,MAAM,CAAC,KAAK,EAAE;QACb,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,2DAA2D;KACtE,CAAC;SACD,MAAM,CAAC,KAAK,EAAE;QACb,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW;QACpB,QAAQ,EAAE,YAAY;KACvB,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAgB,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CACX,2EAA2E,CAC5E,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,qBAAqB,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,KAAK,EAAE;aACjC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC;gBACxC,gBAAgB,EAAE,IAAI,CAAC,kBAAkB,CAAC;gBAC1C,QAAQ,EAAE,IAAI,CAAC,GAAG;aACnB,CAAC;SACH,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CACT,0EAA0E,CAC3E,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Argv } from "yargs";
2
+ type JoinArgs = {
3
+ token: string;
4
+ api: string;
5
+ host?: string;
6
+ };
7
+ export declare const joinCommand: {
8
+ command: string;
9
+ describe: string;
10
+ builder: (yargs: Argv) => Argv<{
11
+ token: string;
12
+ } & {
13
+ api: string;
14
+ } & {
15
+ host: string | undefined;
16
+ }>;
17
+ handler: (args: JoinArgs) => Promise<void>;
18
+ };
19
+ export {};
20
+ //# sourceMappingURL=join.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join.d.ts","sourceRoot":"","sources":["../../src/cmd/join.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAKlC,KAAK,QAAQ,GAAG;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAyBF,eAAO,MAAM,WAAW;;;qBAGL,IAAI;;;;;;;oBASC,QAAQ;CA0F/B,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { setTimeout as sleep } from "node:timers/promises";
2
+ import { openBrowser } from "../auth/browser-flow.js";
3
+ import { setToken } from "../sync/credentials.js";
4
+ const API_DEFAULT = "https://app.unfairly.ai";
5
+ export const joinCommand = {
6
+ command: "join <token>",
7
+ describe: "Join an Unfairly org via a persona-tagged invite token",
8
+ builder: (yargs) => yargs
9
+ .positional("token", { type: "string", demandOption: true })
10
+ .option("api", { type: "string", default: API_DEFAULT })
11
+ .option("host", {
12
+ type: "string",
13
+ choices: ["claude-code", "codex", "cowork"],
14
+ describe: "Force a specific host (default: pick by persona)",
15
+ }),
16
+ handler: async (args) => {
17
+ // 1. Init session
18
+ console.log("✦ Initializing join session…");
19
+ const initRes = await fetch(`${args.api}/api/cli/join/init`, {
20
+ method: "POST",
21
+ headers: { "Content-Type": "application/json" },
22
+ body: JSON.stringify({ token: args.token }),
23
+ });
24
+ if (!initRes.ok) {
25
+ const err = await initRes.text();
26
+ console.error(`Failed to init: ${initRes.status} ${err}`);
27
+ process.exit(1);
28
+ }
29
+ const init = await initRes.json();
30
+ // 2. Open browser
31
+ console.log(`✓ Opening browser to authorize…`);
32
+ console.log(` (if it doesn't open: ${init.auth_url})`);
33
+ openBrowser(init.auth_url);
34
+ // 3. Poll for completion
35
+ let waited = 0;
36
+ let interval = init.poll_interval_seconds * 1000;
37
+ let result = null;
38
+ while (waited < init.ttl_seconds * 1000) {
39
+ await sleep(interval);
40
+ waited += interval;
41
+ const pollRes = await fetch(init.poll_url);
42
+ if (!pollRes.ok) {
43
+ console.error(`Poll error: ${pollRes.status}`);
44
+ process.exit(1);
45
+ }
46
+ const poll = await pollRes.json();
47
+ if (poll.status === "completed") {
48
+ result = poll;
49
+ break;
50
+ }
51
+ if (poll.status === "expired") {
52
+ console.error("Session expired. Re-run the command.");
53
+ process.exit(1);
54
+ }
55
+ if (waited > init.poll_backoff_after_seconds * 1000) {
56
+ interval = init.poll_backoff_interval_seconds * 1000;
57
+ }
58
+ }
59
+ if (!result) {
60
+ console.error("Timed out waiting for browser auth. Re-run the command.");
61
+ process.exit(1);
62
+ }
63
+ console.log(`✓ You're in. Joining as: ${result.display_name} (${result.persona_surface}/${result.persona_workflow ?? "—"})`);
64
+ // 4. Pick host (default by persona surface)
65
+ const host = args.host ??
66
+ (result.persona_surface === "oracle-cowork" ? "cowork" : "claude-code");
67
+ // 5. Persist the join JWT via existing credential store + configure host.
68
+ // Existing host writers take a single `apiUrl: string` arg and read
69
+ // the token from credentials.
70
+ await setToken(result.jwt);
71
+ console.log(`✓ Configuring ${host}…`);
72
+ if (host === "claude-code") {
73
+ const { configureClaudeCode } = await import("../hosts/claude-code.js");
74
+ await configureClaudeCode(args.api, result.jwt);
75
+ }
76
+ else if (host === "codex") {
77
+ const { configureCodex } = await import("../hosts/codex.js");
78
+ await configureCodex(args.api);
79
+ }
80
+ else if (host === "cowork") {
81
+ const { configureClaudeDesktop } = await import("../hosts/claude-desktop.js");
82
+ await configureClaudeDesktop(args.api, result.jwt);
83
+ console.log("⚠ Quit and relaunch Claude Desktop to load the new MCP server.");
84
+ }
85
+ // 6. Print persona-shaped welcome
86
+ const welcomeRes = await fetch(`${args.api}/api/cli/welcome?persona=${result.persona_surface}&workflow=${result.persona_workflow ?? ""}`);
87
+ const welcome = await welcomeRes.text();
88
+ console.log(welcome);
89
+ },
90
+ };
91
+ //# sourceMappingURL=join.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join.js","sourceRoot":"","sources":["../../src/cmd/join.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cmd/setup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAM9F,MAAM,MAAM,YAAY,GAAG;IACzB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE;QACL,aAAa,EAAE,mBAAmB,CAAC;QACnC,UAAU,EAAE,gBAAgB,CAAC;QAC7B,KAAK,EAAE,WAAW,CAAC;KACpB,CAAC;CACH,CAAC;AAEF,wBAAsB,QAAQ,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CA+I7E"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cmd/setup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAM9F,MAAM,MAAM,YAAY,GAAG;IACzB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE;QACL,aAAa,EAAE,mBAAmB,CAAC;QACnC,UAAU,EAAE,gBAAgB,CAAC;QAC7B,KAAK,EAAE,WAAW,CAAC;KACpB,CAAC;CACH,CAAC;AAEF,wBAAsB,QAAQ,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CA2K7E"}
package/dist/cmd/setup.js CHANGED
@@ -43,24 +43,55 @@ export async function runSetup(opts = {}) {
43
43
  // partial success path is far better than zero hosts). We exit non-zero
44
44
  // at the end of setup so the user knows something needs attention.
45
45
  write(stepHeader(3, 5, "CLAUDE DESKTOP", ui));
46
- const cd = await configureClaudeDesktop(apiUrl);
46
+ const cd = await configureClaudeDesktop(apiUrl, token);
47
47
  write(formatClaudeDesktop(cd, ui));
48
48
  write("");
49
49
  // [4/5] CLAUDE CODE · CODEX
50
50
  write(stepHeader(4, 5, "CLAUDE CODE · CODEX", ui));
51
- const cc = await configureClaudeCode(apiUrl);
51
+ const cc = await configureClaudeCode(apiUrl, token);
52
52
  write(formatClaudeCode(cc, ui));
53
53
  const codex = await configureCodex(apiUrl);
54
54
  write(formatCodex(codex, ui));
55
55
  write("");
56
- // [5/5] HANDSHAKE
56
+ // [5/5] HANDSHAKE — verify each wired host independently by reading the
57
+ // auth value it will actually send and POSTing through it. Catching this
58
+ // per-host (rather than just trusting the freshly-minted token) is how we
59
+ // make sure host-wiring bugs don't silently ship to users.
57
60
  write(stepHeader(5, 5, "HANDSHAKE", ui));
58
- const verified = await verifyToken(apiUrl, token);
59
- if (!verified.ok) {
60
- write(result("err", `/api/mcp rejected the token — ${verified.message}`, ui));
61
+ const hsErrors = [];
62
+ let hsRan = 0;
63
+ if (cd.status === "configured") {
64
+ hsRan++;
65
+ const r = await verifyClaudeDesktopHost(apiUrl);
66
+ write(formatHandshake("claude desktop", r, ui));
67
+ if (!r.ok)
68
+ hsErrors.push(`Claude Desktop: ${r.message}`);
69
+ }
70
+ if (cc.status === "configured") {
71
+ hsRan++;
72
+ const r = await verifyClaudeCodeHost(apiUrl);
73
+ write(formatHandshake("claude code", r, ui));
74
+ if (!r.ok)
75
+ hsErrors.push(`Claude Code: ${r.message}`);
76
+ }
77
+ if (codex.status === "configured") {
78
+ hsRan++;
79
+ const r = await verifyCodexTokenAlive(apiUrl, token);
80
+ write(formatHandshake("codex (token alive)", r, ui));
81
+ if (!r.ok)
82
+ hsErrors.push(`Codex: ${r.message}`);
83
+ }
84
+ if (hsRan === 0) {
85
+ // No hosts were wired — silent step would imply success. Be explicit
86
+ // and fail the run so a misinstall (e.g., Claude Desktop config malformed,
87
+ // Claude Code binary missing, no Codex) doesn't read as "all good."
88
+ write(result("warn", "no hosts wired — nothing to verify. Install Claude Desktop / Code / Codex and re-run `unfairly setup`.", ui));
89
+ process.exit(2);
90
+ }
91
+ if (hsErrors.length > 0) {
92
+ write(result("err", `${hsErrors.length} host(s) failed handshake — see above`, ui));
61
93
  process.exit(2);
62
94
  }
63
- write(result("ok", "/api/mcp accepted the token", ui));
64
95
  write("");
65
96
  write(divider(ui));
66
97
  write("");
@@ -155,13 +186,11 @@ function formatClaudeDesktop(r, ui) {
155
186
  function formatClaudeCode(r, ui) {
156
187
  switch (r.status) {
157
188
  case "configured":
158
- return result("ok", "claude mcp add unfairly", ui);
159
- case "already-registered":
160
- return result("skip", "claude mcp · already registered (left as-is)", ui);
189
+ return result("ok", `${r.path}`, ui);
161
190
  case "not-installed":
162
191
  return result("skip", "Claude Code (`claude` binary) not detected", ui);
163
192
  case "error":
164
- return result("err", `claude mcp add — ${r.message}`, ui);
193
+ return result("err", r.message, ui);
165
194
  }
166
195
  }
167
196
  function formatCodex(r, ui) {
@@ -174,13 +203,19 @@ function formatCodex(r, ui) {
174
203
  return result("err", `${r.path} — ${r.message}`, ui);
175
204
  }
176
205
  }
177
- async function verifyToken(apiUrl, token) {
206
+ function formatHandshake(host, r, ui) {
207
+ if (r.ok)
208
+ return result("ok", `${host} · /api/mcp accepted the auth`, ui);
209
+ return result("err", `${host} · ${r.message}`, ui);
210
+ }
211
+ /** POST `initialize` to /api/mcp with the given Authorization header. */
212
+ async function pingMcp(apiUrl, authorization) {
178
213
  const url = `${apiUrl.replace(/\/$/, "")}/api/mcp`;
179
214
  try {
180
215
  const res = await fetch(url, {
181
216
  method: "POST",
182
217
  headers: {
183
- Authorization: `Bearer ${token}`,
218
+ Authorization: authorization,
184
219
  "Content-Type": "application/json",
185
220
  Accept: "application/json, text/event-stream",
186
221
  },
@@ -191,7 +226,7 @@ async function verifyToken(apiUrl, token) {
191
226
  params: {
192
227
  protocolVersion: "2024-11-05",
193
228
  capabilities: {},
194
- clientInfo: { name: "unfairly-setup", version: "0.6.0" },
229
+ clientInfo: { name: "unfairly-setup", version: "0.6.1" },
195
230
  },
196
231
  }),
197
232
  });
@@ -207,4 +242,90 @@ async function verifyToken(apiUrl, token) {
207
242
  return { ok: false, message: e.message };
208
243
  }
209
244
  }
245
+ /**
246
+ * Re-read Claude Desktop's config and replay the Authorization header it will
247
+ * actually send. Catches bugs like literal `${UNFAIRLY_MCP_TOKEN}` placeholder
248
+ * (macOS GUI apps don't inherit `~/.zshenv` so the env interpolation fails).
249
+ */
250
+ async function verifyClaudeDesktopHost(apiUrl) {
251
+ const { configPath } = await import("../hosts/claude-desktop.js");
252
+ const fs = await import("node:fs/promises");
253
+ const cfgPath = configPath();
254
+ if (!cfgPath)
255
+ return { ok: false, message: "config path unavailable" };
256
+ let raw;
257
+ try {
258
+ raw = await fs.readFile(cfgPath, "utf8");
259
+ }
260
+ catch (e) {
261
+ return { ok: false, message: `read failed: ${e.message}` };
262
+ }
263
+ let cfg;
264
+ try {
265
+ cfg = JSON.parse(raw);
266
+ }
267
+ catch (e) {
268
+ return { ok: false, message: `parse failed: ${e.message}` };
269
+ }
270
+ const auth = cfg.mcpServers?.unfairly?.headers?.Authorization;
271
+ if (!auth)
272
+ return { ok: false, message: "no Authorization header in wired entry" };
273
+ if (auth.includes("${")) {
274
+ return {
275
+ ok: false,
276
+ message: "config still uses ${VAR} placeholder — re-run setup",
277
+ };
278
+ }
279
+ return pingMcp(apiUrl, auth);
280
+ }
281
+ /**
282
+ * Re-read Claude Code's user-level config (`~/.claude.json`) and replay the
283
+ * `unfairly` entry's Authorization header. We write to the root `mcpServers`
284
+ * (user scope) — the root entry is the source of truth. We still check
285
+ * `projects[<cwd>]` as a defensive fallback so an older install that landed
286
+ * in project-local scope doesn't silently fail this handshake.
287
+ */
288
+ async function verifyClaudeCodeHost(apiUrl) {
289
+ const { configPath } = await import("../hosts/claude-code.js");
290
+ const fs = await import("node:fs/promises");
291
+ const cfgPath = configPath();
292
+ let raw;
293
+ try {
294
+ raw = await fs.readFile(cfgPath, "utf8");
295
+ }
296
+ catch (e) {
297
+ return { ok: false, message: `read failed: ${e.message}` };
298
+ }
299
+ let cfg;
300
+ try {
301
+ cfg = JSON.parse(raw);
302
+ }
303
+ catch (e) {
304
+ return { ok: false, message: `parse failed: ${e.message}` };
305
+ }
306
+ const rootEntry = cfg.mcpServers?.unfairly;
307
+ const projectEntry = cfg.projects?.[process.cwd()]?.mcpServers?.unfairly;
308
+ const auth = (rootEntry ?? projectEntry)?.headers?.Authorization;
309
+ if (!auth) {
310
+ return {
311
+ ok: false,
312
+ message: "no Authorization header on unfairly entry — re-run setup",
313
+ };
314
+ }
315
+ return pingMcp(apiUrl, auth);
316
+ }
317
+ /**
318
+ * Verify the just-minted token is alive on /api/mcp. Codex reads its bearer
319
+ * from the env var declared in `~/.codex/config.toml` (we set
320
+ * `bearer_token_env_var = "UNFAIRLY_MCP_TOKEN"`), and a *fresh login shell*
321
+ * will pick that up from `~/.zshenv`. We can't faithfully reproduce that
322
+ * fresh-shell env from inside this Node process (`urun`/Conductor/etc. may
323
+ * have shaded the var), so we deliberately check only that the token we
324
+ * just wrote to disk in step [2/5] is accepted by the server. Catches a
325
+ * revoked/expired/wrong token without pretending to verify Codex's runtime
326
+ * resolution chain.
327
+ */
328
+ async function verifyCodexTokenAlive(apiUrl, token) {
329
+ return pingMcp(apiUrl, `Bearer ${token}`);
330
+ }
210
331
  //# sourceMappingURL=setup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cmd/setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cmd/setup.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,6 @@
1
1
  export type ClaudeCodeResult = {
2
2
  status: "configured";
3
- message: string;
4
- } | {
5
- status: "already-registered";
3
+ path: string;
6
4
  message: string;
7
5
  } | {
8
6
  status: "not-installed";
@@ -10,14 +8,54 @@ export type ClaudeCodeResult = {
10
8
  status: "error";
11
9
  message: string;
12
10
  };
11
+ export type ClaudeCodeEntry = {
12
+ type: "http";
13
+ url: string;
14
+ headers: {
15
+ Authorization: string;
16
+ };
17
+ };
18
+ type ClaudeConfig = {
19
+ mcpServers?: Record<string, unknown>;
20
+ projects?: Record<string, {
21
+ mcpServers?: Record<string, unknown>;
22
+ }>;
23
+ [key: string]: unknown;
24
+ };
25
+ /**
26
+ * Path to Claude Code's user-level config. Returns null on Linux only if
27
+ * HOME is unset (effectively never).
28
+ */
29
+ export declare function configPath(): string;
30
+ /**
31
+ * Build the canonical user-scope unfairly entry. Inlines the literal token —
32
+ * matches the Claude Desktop pattern. Keeps the token out of any process
33
+ * argv (the previous `claude mcp add --header=…` form leaked it via
34
+ * `/proc/<pid>/cmdline` for the lifetime of the subprocess).
35
+ */
36
+ export declare function buildEntry(apiUrl: string, token: string): ClaudeCodeEntry;
37
+ /**
38
+ * Merge our canonical unfairly entry into ~/.claude.json:
39
+ * - Writes the user-scope entry at root `mcpServers.unfairly`.
40
+ * - Strips any project-scoped `projects[<cwd>].mcpServers.unfairly` left over
41
+ * from previous local-scope runs of setup. Without this, a stale entry in
42
+ * the active project would shadow the user-scope one and silently keep an
43
+ * old (or empty) bearer.
44
+ * - Preserves all unrelated keys.
45
+ */
46
+ export declare function mergeIntoConfig(existing: ClaudeConfig, apiUrl: string, token: string): ClaudeConfig;
13
47
  /**
14
- * Register Unfairly with Claude Code via `claude mcp add`. Non-destructive:
15
- * if a server named `unfairly` already exists we don't remove it (the user
16
- * may have a custom config). Instead we tolerate the "already exists" error
17
- * and report `already-registered`.
48
+ * Wire Unfairly into Claude Code by mutating ~/.claude.json directly. We
49
+ * intentionally do NOT shell out to `claude mcp add --header=…` — that form
50
+ * exposes the bearer token to `ps aux` and `/proc/<pid>/cmdline` for the
51
+ * duration of the subprocess. Same threat model as Claude Desktop, same
52
+ * mitigation: write the JSON ourselves.
18
53
  *
19
- * Skips silently if the `claude` binary is not in PATH (most CLI users have
20
- * one host installed, not both).
54
+ * Skips silently only when the `claude` binary is not in PATH. If the binary
55
+ * exists but `~/.claude.json` doesn't yet (fresh install, before first
56
+ * launch of Claude Code), we create the file with our entry — that's what
57
+ * `claude mcp add` would have done implicitly.
21
58
  */
22
- export declare function configureClaudeCode(apiUrl: string): Promise<ClaudeCodeResult>;
59
+ export declare function configureClaudeCode(apiUrl: string, token: string): Promise<ClaudeCodeResult>;
60
+ export {};
23
61
  //# sourceMappingURL=claude-code.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/hosts/claude-code.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,eAAe,CAAA;CAAE,GAC3B;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,CAAC,CA2C3B"}
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/hosts/claude-code.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,MAAM,EAAE,eAAe,CAAA;CAAE,GAC3B;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;CACpC,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IACpE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAMzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,YAAY,CAuBd;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,CAAC,CA6C3B"}
@@ -1,44 +1,117 @@
1
1
  import { spawnSync } from "node:child_process";
2
+ import fs from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
2
5
  /**
3
- * Register Unfairly with Claude Code via `claude mcp add`. Non-destructive:
4
- * if a server named `unfairly` already exists we don't remove it (the user
5
- * may have a custom config). Instead we tolerate the "already exists" error
6
- * and report `already-registered`.
6
+ * Path to Claude Code's user-level config. Returns null on Linux only if
7
+ * HOME is unset (effectively never).
8
+ */
9
+ export function configPath() {
10
+ return path.join(os.homedir(), ".claude.json");
11
+ }
12
+ /**
13
+ * Build the canonical user-scope unfairly entry. Inlines the literal token —
14
+ * matches the Claude Desktop pattern. Keeps the token out of any process
15
+ * argv (the previous `claude mcp add --header=…` form leaked it via
16
+ * `/proc/<pid>/cmdline` for the lifetime of the subprocess).
17
+ */
18
+ export function buildEntry(apiUrl, token) {
19
+ return {
20
+ type: "http",
21
+ url: `${apiUrl.replace(/\/$/, "")}/api/mcp`,
22
+ headers: { Authorization: `Bearer ${token}` },
23
+ };
24
+ }
25
+ /**
26
+ * Merge our canonical unfairly entry into ~/.claude.json:
27
+ * - Writes the user-scope entry at root `mcpServers.unfairly`.
28
+ * - Strips any project-scoped `projects[<cwd>].mcpServers.unfairly` left over
29
+ * from previous local-scope runs of setup. Without this, a stale entry in
30
+ * the active project would shadow the user-scope one and silently keep an
31
+ * old (or empty) bearer.
32
+ * - Preserves all unrelated keys.
33
+ */
34
+ export function mergeIntoConfig(existing, apiUrl, token) {
35
+ const next = { ...existing };
36
+ const servers = { ...(existing.mcpServers ?? {}) };
37
+ servers.unfairly = buildEntry(apiUrl, token);
38
+ next.mcpServers = servers;
39
+ if (existing.projects) {
40
+ const projects = {};
41
+ for (const [k, v] of Object.entries(existing.projects)) {
42
+ // Only touch the project entry when it actually has an `unfairly`
43
+ // mcpServer to strip. Preserves the original shape (including the
44
+ // absence of `mcpServers` entirely) for unrelated projects.
45
+ if (v.mcpServers && "unfairly" in v.mcpServers) {
46
+ const ps = { ...v.mcpServers };
47
+ delete ps.unfairly;
48
+ projects[k] = { ...v, mcpServers: ps };
49
+ }
50
+ else {
51
+ projects[k] = v;
52
+ }
53
+ }
54
+ next.projects = projects;
55
+ }
56
+ return next;
57
+ }
58
+ /**
59
+ * Wire Unfairly into Claude Code by mutating ~/.claude.json directly. We
60
+ * intentionally do NOT shell out to `claude mcp add --header=…` — that form
61
+ * exposes the bearer token to `ps aux` and `/proc/<pid>/cmdline` for the
62
+ * duration of the subprocess. Same threat model as Claude Desktop, same
63
+ * mitigation: write the JSON ourselves.
7
64
  *
8
- * Skips silently if the `claude` binary is not in PATH (most CLI users have
9
- * one host installed, not both).
65
+ * Skips silently only when the `claude` binary is not in PATH. If the binary
66
+ * exists but `~/.claude.json` doesn't yet (fresh install, before first
67
+ * launch of Claude Code), we create the file with our entry — that's what
68
+ * `claude mcp add` would have done implicitly.
10
69
  */
11
- export async function configureClaudeCode(apiUrl) {
12
- const url = `${apiUrl.replace(/\/$/, "")}/api/mcp`;
13
- const result = spawnSync("claude", ["mcp", "add", "unfairly", "--transport", "http", url], { encoding: "utf-8" });
14
- if (result.error) {
15
- const e = result.error;
16
- if (e.code === "ENOENT") {
70
+ export async function configureClaudeCode(apiUrl, token) {
71
+ const probe = spawnSync("claude", ["--version"], { encoding: "utf-8" });
72
+ if (probe.error) {
73
+ const e = probe.error;
74
+ if (e.code === "ENOENT")
17
75
  return { status: "not-installed" };
18
- }
19
76
  return { status: "error", message: e.message };
20
77
  }
21
- const stderr = (result.stderr ?? "").toString();
22
- const stdout = (result.stdout ?? "").toString();
23
- const combined = `${stderr}\n${stdout}`.toLowerCase();
24
- if (result.status === 0) {
25
- return {
26
- status: "configured",
27
- message: "registered (Claude Code will pop OAuth on first call)",
28
- };
78
+ const cfgPath = configPath();
79
+ let raw;
80
+ try {
81
+ raw = await fs.readFile(cfgPath, "utf8");
82
+ }
83
+ catch (err) {
84
+ const e = err;
85
+ if (e.code === "ENOENT") {
86
+ // Fresh Claude Code install — binary exists but config not yet
87
+ // created. Treat as empty and let the writeFile below create it.
88
+ raw = "";
89
+ }
90
+ else {
91
+ return { status: "error", message: `Could not read ${cfgPath}: ${e.message}` };
92
+ }
29
93
  }
30
- // Claude CLI exits non-zero with a stderr message containing "already
31
- // exists" (or similar) when the server name is taken. Don't destroy the
32
- // user's existing config — surface as already-registered.
33
- if (/already exists|already configured|duplicate/.test(combined)) {
94
+ let parsed;
95
+ try {
96
+ parsed = raw.trim() === "" ? {} : JSON.parse(raw);
97
+ }
98
+ catch (err) {
34
99
  return {
35
- status: "already-registered",
36
- message: "already registered (left as-is)",
100
+ status: "error",
101
+ message: `Refusing to overwrite — config is not valid JSON: ${err.message}`,
37
102
  };
38
103
  }
104
+ const merged = mergeIntoConfig(parsed, apiUrl, token);
105
+ try {
106
+ await fs.writeFile(cfgPath, JSON.stringify(merged, null, 2) + "\n", "utf8");
107
+ }
108
+ catch (err) {
109
+ return { status: "error", message: err.message };
110
+ }
39
111
  return {
40
- status: "error",
41
- message: stderr.trim() || `claude mcp add exited ${result.status}`,
112
+ status: "configured",
113
+ path: cfgPath,
114
+ message: "wired unfairly into ~/.claude.json (user scope, literal token)",
42
115
  };
43
116
  }
44
117
  //# sourceMappingURL=claude-code.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/hosts/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQ/C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAc;IAEd,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC;IACnD,MAAM,MAAM,GAAG,SAAS,CACtB,QAAQ,EACR,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,EACtD,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC;IAEF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,MAAM,CAAC,KAA8B,CAAC;QAChD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QACrC,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;IAEtD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,uDAAuD;SACjE,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,wEAAwE;IACxE,0DAA0D;IAC1D,IACE,6CAA6C,CAAC,IAAI,CAAC,QAAQ,CAAC,EAC5D,CAAC;QACD,OAAO;YACL,MAAM,EAAE,oBAAoB;YAC5B,OAAO,EAAE,iCAAiC;SAC3C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,yBAAyB,MAAM,CAAC,MAAM,EAAE;KACnE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/hosts/claude-code.ts"],"names":[],"mappings":"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"}
@@ -26,14 +26,14 @@ type ConfigShape = {
26
26
  * (Claude Desktop is Mac/Windows only per official docs).
27
27
  */
28
28
  export declare function configPath(): string | null;
29
- export declare function buildEntry(apiUrl: string): UnfairlyEntry;
29
+ export declare function buildEntry(apiUrl: string, token: string): UnfairlyEntry;
30
30
  /**
31
31
  * Merge our canonical unfairly entry into an existing config object.
32
32
  * - Preserves other mcpServers
33
- * - Replaces any existing unfairly entry
33
+ * - Replaces any existing unfairly entry (including stale tokens / placeholder)
34
34
  * - Preserves all unrelated top-level keys
35
35
  */
36
- export declare function mergeIntoConfig(existing: ConfigShape, apiUrl: string): {
36
+ export declare function mergeIntoConfig(existing: ConfigShape, apiUrl: string, token: string): {
37
37
  mcpServers: Record<string, unknown>;
38
38
  } & ConfigShape;
39
39
  /**
@@ -42,6 +42,6 @@ export declare function mergeIntoConfig(existing: ConfigShape, apiUrl: string):
42
42
  * - If file exists but is malformed JSON → error (don't overwrite precious config).
43
43
  * - Otherwise → merge canonical block, write back.
44
44
  */
45
- export declare function configureClaudeDesktop(apiUrl: string): Promise<ClaudeDesktopResult>;
45
+ export declare function configureClaudeDesktop(apiUrl: string, token: string): Promise<ClaudeDesktopResult>;
46
46
  export {};
47
47
  //# sourceMappingURL=claude-desktop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-desktop.d.ts","sourceRoot":"","sources":["../../src/hosts/claude-desktop.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,mBAAmB,GAC3B;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,GACrE;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;CACpC,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAU1C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAOxD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,MAAM,GACb;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,WAAW,CAMvD;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqCzF"}
1
+ {"version":3,"file":"claude-desktop.d.ts","sourceRoot":"","sources":["../../src/hosts/claude-desktop.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,mBAAmB,GAC3B;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,GACrE;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;CACpC,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAU1C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAYvE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,WAAW,CAMvD;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,mBAAmB,CAAC,CAqC9B"}
@@ -16,24 +16,29 @@ export function configPath() {
16
16
  }
17
17
  return null;
18
18
  }
19
- export function buildEntry(apiUrl) {
19
+ export function buildEntry(apiUrl, token) {
20
20
  const url = `${apiUrl.replace(/\/$/, "")}/api/mcp`;
21
+ // Inline the literal token. macOS GUI apps don't inherit env vars from
22
+ // ~/.zshenv (only LaunchAgent env via `launchctl setenv`), so the
23
+ // `${UNFAIRLY_MCP_TOKEN}` placeholder pattern silently fails. Claude Desktop
24
+ // already stores credentials on disk for other MCP servers — this is the
25
+ // standard pattern.
21
26
  return {
22
27
  type: "http",
23
28
  url,
24
- headers: { Authorization: "Bearer ${UNFAIRLY_MCP_TOKEN}" },
29
+ headers: { Authorization: `Bearer ${token}` },
25
30
  };
26
31
  }
27
32
  /**
28
33
  * Merge our canonical unfairly entry into an existing config object.
29
34
  * - Preserves other mcpServers
30
- * - Replaces any existing unfairly entry
35
+ * - Replaces any existing unfairly entry (including stale tokens / placeholder)
31
36
  * - Preserves all unrelated top-level keys
32
37
  */
33
- export function mergeIntoConfig(existing, apiUrl) {
38
+ export function mergeIntoConfig(existing, apiUrl, token) {
34
39
  const next = { ...existing };
35
40
  const servers = { ...(existing.mcpServers ?? {}) };
36
- servers.unfairly = buildEntry(apiUrl);
41
+ servers.unfairly = buildEntry(apiUrl, token);
37
42
  next.mcpServers = servers;
38
43
  return next;
39
44
  }
@@ -43,7 +48,7 @@ export function mergeIntoConfig(existing, apiUrl) {
43
48
  * - If file exists but is malformed JSON → error (don't overwrite precious config).
44
49
  * - Otherwise → merge canonical block, write back.
45
50
  */
46
- export async function configureClaudeDesktop(apiUrl) {
51
+ export async function configureClaudeDesktop(apiUrl, token) {
47
52
  const cfgPath = configPath();
48
53
  if (!cfgPath) {
49
54
  return { status: "not-installed", path: "(Claude Desktop not available on this platform)" };
@@ -70,7 +75,7 @@ export async function configureClaudeDesktop(apiUrl) {
70
75
  };
71
76
  }
72
77
  const had = parsed.mcpServers && parsed.mcpServers.unfairly !== undefined;
73
- const merged = mergeIntoConfig(parsed, apiUrl);
78
+ const merged = mergeIntoConfig(parsed, apiUrl, token);
74
79
  const serialized = JSON.stringify(merged, null, 2) + "\n";
75
80
  try {
76
81
  await fs.writeFile(cfgPath, serialized, "utf8");
@@ -1 +1 @@
1
- {"version":3,"file":"claude-desktop.js","sourceRoot":"","sources":["../../src/hosts/claude-desktop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-desktop.js","sourceRoot":"","sources":["../../src/hosts/claude-desktop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAkB7B;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;IACnG,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,KAAa;IACtD,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC;IACnD,uEAAuE;IACvE,kEAAkE;IAClE,6EAA6E;IAC7E,yEAAyE;IACzE,oBAAoB;IACpB,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,GAAG;QACH,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;KAC9C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAqB,EACrB,MAAc,EACd,KAAa;IAEb,MAAM,IAAI,GAAgB,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;IACnD,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;IAC1B,OAAO,IAA6D,CAAC;AACvE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAc,EACd,KAAa;IAEb,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,iDAAiD,EAAE,CAAC;IAC9F,CAAC;IAED,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA4B,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3E,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,OAAO,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;IAChG,CAAC;IAED,IAAI,MAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,qDAAsD,GAAa,CAAC,OAAO,EAAE;SACvF,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,IAAK,MAAM,CAAC,UAAsC,CAAC,QAAQ,KAAK,SAAS,CAAC;IACvG,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAE1D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AACtF,CAAC"}
package/dist/index.js CHANGED
@@ -5,6 +5,8 @@ import { fileURLToPath } from "node:url";
5
5
  import { dirname, join } from "node:path";
6
6
  import yargs from "yargs";
7
7
  import { hideBin } from "yargs/helpers";
8
+ import { inviteCommand } from "./cmd/invite.js";
9
+ import { joinCommand } from "./cmd/join.js";
8
10
  const pkg = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), "..", "package.json"), "utf8"));
9
11
  await yargs(hideBin(process.argv))
10
12
  .scriptName("unfairly")
@@ -61,6 +63,8 @@ await yargs(hideBin(process.argv))
61
63
  const { runMcp } = await import("./cmd/mcp.js");
62
64
  await runMcp();
63
65
  })
66
+ .command(inviteCommand)
67
+ .command(joinCommand)
64
68
  .strict()
65
69
  .help()
66
70
  .parse();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CACV,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,EACnE,MAAM,CACP,CACF,CAAC;AAEF,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC/B,UAAU,CAAC,UAAU,CAAC;KACtB,KAAK,CAAC,iBAAiB,CAAC;KACxB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,OAAO,CACN,IAAI,EACJ,sFAAsF,EACtF,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE;IACd,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,2BAA2B;CACtC,CAAC,EACJ,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAc,EAAE,CAAC,CAAC;AAC9C,CAAC,CACF;KACA,OAAO,CACN,OAAO,EACP,mEAAmE,EACnE,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAClE,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACpD,MAAM,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAc,EAAE,CAAC,CAAC;AACjE,CAAC,CACF;KACA,OAAO,CACN,OAAO,EACP,yDAAyD,EACzD,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EACpE,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACpD,MAAM,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAgB,EAAE,CAAC,CAAC;AACnD,CAAC,CACF;KACA,OAAO,CACN,MAAM,EACN,uDAAuD,EACvD,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC;KACE,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;KACnC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;KAC9D,MAAM,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAC9D,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAClD,MAAM,OAAO,CAAC;QACZ,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,GAAG,EAAE,IAAI,CAAC,GAAc;QACxB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAY;KACzC,CAAC,CAAC;AACL,CAAC,CACF;KACA,OAAO,CACN,cAAc,EACd,0BAA0B,EAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAChD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAClD,MAAM,OAAO,CAAC,IAAI,CAAC,KAA2B,CAAC,CAAC;AAClD,CAAC,CACF;KACA,OAAO,CACN,cAAc,EACd,2BAA2B,EAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAChD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAClD,MAAM,OAAO,CAAC,IAAI,CAAC,KAA2B,CAAC,CAAC;AAClD,CAAC,CACF;KACA,OAAO,CACN,QAAQ,EACR,iCAAiC,EACjC,GAAG,EAAE,GAAE,CAAC,EACR,KAAK,IAAI,EAAE;IACT,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACtD,MAAM,SAAS,EAAE,CAAC;AACpB,CAAC,CACF;KACA,OAAO,CACN,gBAAgB,EAChB,oCAAoC,EACpC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EACnE,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACxD,MAAM,UAAU,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC;AACxC,CAAC,CACF;KACA,OAAO,CACN,OAAO,EACP,mDAAmD,EACnD,GAAG,EAAE,GAAE,CAAC,EACR,KAAK,IAAI,EAAE;IACT,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACpD,MAAM,QAAQ,EAAE,CAAC;AACnB,CAAC,CACF;KACA,OAAO,CACN,KAAK,EACL,sCAAsC,EACtC,GAAG,EAAE,GAAE,CAAC,EACR,KAAK,IAAI,EAAE;IACT,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IAChD,MAAM,MAAM,EAAE,CAAC;AACjB,CAAC,CACF;KACA,OAAO,CAAC,aAAa,CAAC;KACtB,OAAO,CAAC,WAAW,CAAC;KACpB,MAAM,EAAE;KACR,IAAI,EAAE;KACN,KAAK,EAAE,CAAC;AAMX,KAAK,UAAU,OAAO,CAAC,IAAc;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAC3D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE9C,wEAAwE;IACxE,4EAA4E;IAC5E,yEAAyE;IACzE,wCAAwC;IACxC,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAEnC,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC/B,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;IAE1F,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,qDAAqD;QACrD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAM,QAAQ,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,IAAI,CAAC,cAAc,IAAI,QAAQ,EAAE,CAAC;QAChC,gEAAgE;QAChE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAClD,MAAM,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC/D,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,CAAS;IACjC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unfairly",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "CLI + stdio MCP + library SDK for the Unfairly multiplayer context layer — sync vaults, run agents, emit events",
5
5
  "keywords": [
6
6
  "unfairly",