unfairly 0.5.1 → 0.6.1

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 (47) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +16 -7
  3. package/dist/cmd/init.d.ts +2 -3
  4. package/dist/cmd/init.d.ts.map +1 -1
  5. package/dist/cmd/init.js +60 -44
  6. package/dist/cmd/init.js.map +1 -1
  7. package/dist/cmd/pull.d.ts.map +1 -1
  8. package/dist/cmd/pull.js +16 -2
  9. package/dist/cmd/pull.js.map +1 -1
  10. package/dist/cmd/setup.d.ts +19 -19
  11. package/dist/cmd/setup.d.ts.map +1 -1
  12. package/dist/cmd/setup.js +267 -87
  13. package/dist/cmd/setup.js.map +1 -1
  14. package/dist/cmd/status-card.d.ts +2 -0
  15. package/dist/cmd/status-card.d.ts.map +1 -0
  16. package/dist/cmd/status-card.js +156 -0
  17. package/dist/cmd/status-card.js.map +1 -0
  18. package/dist/cmd/status.d.ts.map +1 -1
  19. package/dist/cmd/status.js +3 -0
  20. package/dist/cmd/status.js.map +1 -1
  21. package/dist/hosts/claude-code.d.ts +48 -10
  22. package/dist/hosts/claude-code.d.ts.map +1 -1
  23. package/dist/hosts/claude-code.js +102 -29
  24. package/dist/hosts/claude-code.js.map +1 -1
  25. package/dist/hosts/claude-desktop.d.ts +47 -0
  26. package/dist/hosts/claude-desktop.d.ts.map +1 -0
  27. package/dist/hosts/claude-desktop.js +88 -0
  28. package/dist/hosts/claude-desktop.js.map +1 -0
  29. package/dist/index.js +58 -27
  30. package/dist/index.js.map +1 -1
  31. package/dist/sync/repo-root.d.ts +7 -0
  32. package/dist/sync/repo-root.d.ts.map +1 -0
  33. package/dist/sync/repo-root.js +24 -0
  34. package/dist/sync/repo-root.js.map +1 -0
  35. package/dist/sync/stitch-claude-md.d.ts +9 -0
  36. package/dist/sync/stitch-claude-md.d.ts.map +1 -0
  37. package/dist/sync/stitch-claude-md.js +48 -0
  38. package/dist/sync/stitch-claude-md.js.map +1 -0
  39. package/dist/ui/colors.d.ts +17 -0
  40. package/dist/ui/colors.d.ts.map +1 -0
  41. package/dist/ui/colors.js +28 -0
  42. package/dist/ui/colors.js.map +1 -0
  43. package/dist/ui/screens.d.ts +44 -0
  44. package/dist/ui/screens.d.ts.map +1 -0
  45. package/dist/ui/screens.js +135 -0
  46. package/dist/ui/screens.js.map +1 -0
  47. package/package.json +32 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
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
+
10
+ ## 0.6.0
11
+
12
+ - **Bare `unfairly` entrypoint** — one command auto-detects state and runs setup + workspace bind. Daily re-run shows a status card with team moves.
13
+ - **Claude Desktop MCP wiring** — new `hosts/claude-desktop.ts` patches `~/Library/Application Support/Claude/claude_desktop_config.json` (Mac) and `%APPDATA%\Claude\claude_desktop_config.json` (Win) with HTTP transport + bearer-via-env. The Mac chat app is now wired by `setup`.
14
+ - **CLAUDE.md auto-stitch** — `init` (and the chained init from bare entrypoint) idempotently adds `@.unfairly/CLAUDE.md` to your repo's root CLAUDE.md with a sentinel comment.
15
+ - **Styled presentation** — banner, step headers, glyphs, coral hand-off card. `picocolors` added as a 2 kB dep. Strips to plain ASCII when piped or `NO_COLOR` is set.
16
+ - Internal: new `ui/` module, `sync/repo-root.ts`, `sync/stitch-claude-md.ts`.
17
+
3
18
  ## 0.5.1 — 2026-05-12
4
19
 
5
20
  - Fix: `unfairly/events` subpath now re-exports `ALLOWED_EVENT_NAMES`,
package/README.md CHANGED
@@ -5,15 +5,24 @@ CLI + stdio MCP for syncing Unfairly vaults to local markdown.
5
5
  ## Quick start
6
6
 
7
7
  ```bash
8
- npm install -g unfairly@latest
9
- cd ~/path/to/your/repo-or-workspace
10
- unfairly init # interactive: paste mcp_* token from app.unfairly.ai/dashboard/setup
11
- unfairly pull # fetch all accessible vaults to .unfairly/
12
- unfairly status # show modified-locally count per vault
13
- # edit any .md file in .unfairly/{vault}/{section}/{slug}.md
14
- unfairly push # broadcast back to cloud
8
+ cd ~/path/to/your/repo
9
+ npx unfairly@latest
15
10
  ```
16
11
 
12
+ That's it. One command — auto-detects state and:
13
+
14
+ - pops a browser for OAuth (skipped if you already have a token)
15
+ - wires Claude Desktop, Claude Code, and Codex to the Unfairly MCP server
16
+ - writes `UNFAIRLY_MCP_TOKEN` into your shell rc
17
+ - binds `.unfairly/` to your repo (pulls all accessible vaults)
18
+ - stitches `@.unfairly/CLAUDE.md` into your repo's `CLAUDE.md`
19
+
20
+ Re-run any time inside the repo for a daily check-in card showing what your team's been up to.
21
+
22
+ ### Power-user commands
23
+
24
+ `unfairly setup` (machine wiring only), `unfairly init` (workspace bind only), `unfairly pull`, `unfairly push`, `unfairly status`, `unfairly watch`, `unfairly mcp`, `unfairly login`. The bare command above delegates to these — they're available when you want fine-grained control.
25
+
17
26
  ## Commands
18
27
 
19
28
  - `unfairly init` — set up `.unfairly/` in cwd, prompt for token, run first pull
@@ -1,10 +1,9 @@
1
1
  export type InitOptions = {
2
- /** mcp_* token for non-interactive runs (agents, CI, etc.) */
3
2
  token?: string;
4
- /** skip the .unfairly/ overwrite confirmation */
5
3
  yes?: boolean;
6
- /** disable browser-based OAuth and force the manual prompt fallback */
7
4
  noBrowser?: boolean;
5
+ /** When chained from setup, skip our own banner (setup already drew it). */
6
+ assumeAuthed?: boolean;
8
7
  };
9
8
  export declare function runInit(opts?: InitOptions): Promise<void>;
10
9
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cmd/init.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,WAAW,GAAG;IACxB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,uEAAuE;IACvE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAMF,wBAAsB,OAAO,CAAC,IAAI,GAAE,WAAgB,iBAkInD"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cmd/init.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAMF,wBAAsB,OAAO,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuHnE"}
package/dist/cmd/init.js CHANGED
@@ -7,6 +7,9 @@ import { emptyManifest, writeManifest } from "../sync/manifest.js";
7
7
  import { getToken, setToken } from "../sync/credentials.js";
8
8
  import { browserAuthFlow } from "../auth/browser-flow.js";
9
9
  import { runPull } from "./pull.js";
10
+ import { findRepoRoot } from "../sync/repo-root.js";
11
+ import { stitchClaudeMd } from "../sync/stitch-claude-md.js";
12
+ import { banner, stepHeader, result, divider, defaultOpts } from "../ui/screens.js";
10
13
  const DEFAULT_API = "https://app.unfairly.ai";
11
14
  function isTty() {
12
15
  return Boolean(process.stdin.isTTY);
@@ -14,22 +17,26 @@ function isTty() {
14
17
  export async function runInit(opts = {}) {
15
18
  const cwd = process.cwd();
16
19
  const target = path.join(cwd, ".unfairly");
20
+ const apiUrl = process.env.UNFAIRLY_API_URL ?? DEFAULT_API;
21
+ const ui = defaultOpts();
22
+ const write = (s) => process.stderr.write(`${s}\n`);
23
+ if (!opts.assumeAuthed) {
24
+ write(banner(ui));
25
+ write("");
26
+ }
17
27
  // Confirm overwrite if .unfairly/ already exists
18
28
  try {
19
29
  await fs.access(target);
20
- if (opts.yes) {
21
- // skip prompt
22
- }
23
- else if (!isTty()) {
24
- console.error(".unfairly/ already exists. Re-run with --yes to overwrite (non-interactive shell detected — can't prompt).");
25
- process.exit(1);
26
- }
27
- else {
30
+ if (!opts.yes) {
31
+ if (!isTty()) {
32
+ write(result("err", ".unfairly/ already exists — re-run with --yes to overwrite (non-TTY).", ui));
33
+ process.exit(1);
34
+ }
28
35
  const rl = readline.createInterface({ input, output });
29
36
  const ans = await rl.question(`.unfairly/ already exists. Re-initialize? [y/N] `);
30
37
  rl.close();
31
38
  if (ans.trim().toLowerCase() !== "y") {
32
- console.log("aborted");
39
+ write(result("skip", "aborted", ui));
33
40
  return;
34
41
  }
35
42
  }
@@ -37,61 +44,55 @@ export async function runInit(opts = {}) {
37
44
  catch {
38
45
  // didn't exist; fine
39
46
  }
40
- // Token resolution order:
41
- // 1. --token flag (agents, CI, scripts)
42
- // 2. UNFAIRLY_TOKEN env (persisted shell config)
43
- // 3. keychain / ~/.unfairly/credentials (last successful login)
44
- // 4. browser-based OAuth (default in TTY mode — no copy/paste)
45
- // 5. interactive prompt (fallback when --no-browser)
46
- const apiUrl = process.env.UNFAIRLY_API_URL ?? DEFAULT_API;
47
+ // Resolve token (flag → env → keychain → browser → paste)
47
48
  let token = opts.token ?? process.env.UNFAIRLY_TOKEN ?? (await getToken());
48
49
  if (!token) {
49
50
  if (!isTty()) {
50
- console.error("No token. Pass --token mcp_... or set UNFAIRLY_TOKEN env (non-interactive shell — can't prompt or open a browser). Get one at https://app.unfairly.ai/dashboard/setup.");
51
+ write(result("err", "No token. Pass --token or set UNFAIRLY_TOKEN (non-TTY).", ui));
51
52
  process.exit(1);
52
53
  }
53
54
  if (!opts.noBrowser) {
54
- console.log("Authorize this CLI in your browser (already signed in → one click).");
55
55
  const fromBrowser = await browserAuthFlow(apiUrl);
56
- if (fromBrowser) {
56
+ if (fromBrowser)
57
57
  token = fromBrowser;
58
- console.log("Authorized.");
59
- }
60
- else {
61
- console.log("Browser flow timed out or was cancelled. Falling back to manual paste.");
62
- }
63
58
  }
64
59
  if (!token) {
65
60
  const rl = readline.createInterface({ input, output });
66
- console.log("Get a token at https://app.unfairly.ai/dashboard/setup (click 'Issue token').");
67
61
  token = (await rl.question("Paste mcp_* token: ")).trim();
68
62
  rl.close();
69
63
  }
70
64
  }
71
65
  if (!token || !token.startsWith("mcp_")) {
72
- console.error("Token must start with mcp_");
66
+ write(result("err", "Token must start with mcp_", ui));
73
67
  process.exit(1);
74
68
  }
75
69
  await setToken(token);
76
- // Verify token + list vaults
70
+ // Verify + list vaults
77
71
  const client = new SyncClient(apiUrl, token);
72
+ write(stepHeader(1, 3, "VAULT INVENTORY", ui));
78
73
  let status;
79
74
  try {
80
75
  status = await client.status();
81
76
  }
82
77
  catch (err) {
83
- console.error(`Failed to reach ${apiUrl}/api/sync/status: ${err.message}`);
78
+ write(result("err", `failed to reach ${apiUrl}/api/sync/status — ${err.message}`, ui));
84
79
  process.exit(1);
85
80
  }
86
81
  if (status.vaults.length === 0) {
87
- console.error("No accessible vaults. Ask an admin to grant you access.");
82
+ write(result("err", "no accessible vaults. Ask an admin to grant you access.", ui));
88
83
  process.exit(1);
89
84
  }
90
- console.log(`Found ${status.vaults.length} accessible vault(s):`);
91
- for (const v of status.vaults) {
92
- console.log(` - ${v.name} (${v.slug}) — ${v.doc_count} docs${v.track_in_git ? "" : " · gitignored"}`);
85
+ for (const v of status.vaults.slice(0, 6)) {
86
+ write(result("ok", `${v.name.padEnd(20)} · ${v.doc_count} docs${v.track_in_git ? "" : " (gitignored)"}`, ui));
87
+ }
88
+ if (status.vaults.length > 6) {
89
+ const remaining = status.vaults.length - 6;
90
+ const totalDocs = status.vaults.reduce((s, v) => s + v.doc_count, 0);
91
+ write(result("skip", `… ${remaining} more vaults · ${totalDocs} docs total`, ui));
93
92
  }
94
- // Seed manifest
93
+ write("");
94
+ // Seed manifest + pull
95
+ write(stepHeader(2, 3, "PULL", ui));
95
96
  await fs.mkdir(target, { recursive: true });
96
97
  const manifest = emptyManifest(apiUrl);
97
98
  for (const v of status.vaults) {
@@ -106,17 +107,32 @@ export async function runInit(opts = {}) {
106
107
  };
107
108
  }
108
109
  await writeManifest(cwd, manifest);
109
- // First pull (all vaults). runPull writes .unfairly/CLAUDE.md and .gitignore
110
- // at the end, so we don't need a second writeAutoloader call here.
111
110
  await runPull(undefined);
112
- console.log("✓ Wrote .unfairly/CLAUDE.md (auto-loader) and .unfairly/.gitignore");
113
- console.log("");
114
- console.log("To make Claude Code / Codex / Cowork load the canon on every prompt,");
115
- console.log("add this line to your repo's root CLAUDE.md (idempotent — paste once):");
116
- console.log("");
117
- console.log(" @.unfairly/CLAUDE.md");
118
- console.log("");
119
- console.log("Or run: echo '@.unfairly/CLAUDE.md' >> CLAUDE.md");
120
- console.log("Done. Run `unfairly status` to confirm. Edit any .md file under .unfairly/ and run `unfairly push` to broadcast.");
111
+ write(result("ok", "wrote .unfairly/CLAUDE.md (auto-loader for Claude Code)", ui));
112
+ write("");
113
+ // Stitch repo's root CLAUDE.md
114
+ write(stepHeader(3, 3, "STITCH", ui));
115
+ const repoRoot = await findRepoRoot(cwd);
116
+ if (!repoRoot) {
117
+ write(result("skip", "not in a git repo — skipping CLAUDE.md stitch", ui));
118
+ }
119
+ else {
120
+ const stitch = await stitchClaudeMd(repoRoot);
121
+ if (stitch.action === "created") {
122
+ write(result("ok", `created ${stitch.path} with @.unfairly/CLAUDE.md`, ui));
123
+ }
124
+ else if (stitch.action === "appended") {
125
+ write(result("ok", `appended @.unfairly/CLAUDE.md to ${stitch.path}`, ui));
126
+ }
127
+ else if (stitch.action === "noop") {
128
+ write(result("skip", `${stitch.path} already references the autoloader`, ui));
129
+ }
130
+ else if (stitch.action === "error") {
131
+ write(result("warn", `couldn't stitch ${stitch.path} — ${stitch.message}`, ui));
132
+ }
133
+ }
134
+ write("");
135
+ write(divider(ui));
136
+ write("");
121
137
  }
122
138
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cmd/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cmd/init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/cmd/pull.ts"],"names":[],"mappings":"AA2BA,wBAAsB,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,iBAyF9C"}
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/cmd/pull.ts"],"names":[],"mappings":"AA2BA,wBAAsB,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,iBA0G9C"}
package/dist/cmd/pull.js CHANGED
@@ -52,8 +52,22 @@ export async function runPull(vaultArg) {
52
52
  let upserts = 0;
53
53
  let deletes = 0;
54
54
  let renames = 0;
55
+ let skipped = 0;
55
56
  for (const doc of result.docs) {
56
- const file = buildFileFromServer(doc, vaultRoot);
57
+ let file;
58
+ try {
59
+ file = buildFileFromServer(doc, vaultRoot);
60
+ }
61
+ catch (err) {
62
+ // One bad doc shouldn't kill the whole pull. Most commonly this is
63
+ // gray-matter/js-yaml choking on body content that the YAML
64
+ // serializer mis-parses (e.g. `*Foo` interpreted as an alias). The
65
+ // doc stays on the server; the user can re-pull after the upstream
66
+ // doc is sanitized.
67
+ process.stderr.write(` · skipped ${doc.slug} — ${err.message.split("\n")[0]}\n`);
68
+ skipped++;
69
+ continue;
70
+ }
57
71
  const relPath = file.path;
58
72
  const absPath = path.join(cwd, ".unfairly", relPath);
59
73
  // Detect rename: same id, different stored path
@@ -93,7 +107,7 @@ export async function runPull(vaultArg) {
93
107
  deletes++;
94
108
  }
95
109
  v.last_pulled_at = new Date().toISOString();
96
- console.log(`+${upserts} -${deletes}${renames ? ` ~${renames}` : ""}`);
110
+ console.log(`+${upserts} -${deletes}${renames ? ` ~${renames}` : ""}${skipped ? ` (skipped ${skipped})` : ""}`);
97
111
  }
98
112
  await writeManifest(cwd, manifest);
99
113
  // Regenerate .unfairly/CLAUDE.md autoloader + .gitignore from the latest mirror.
@@ -1 +1 @@
1
- {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/cmd/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,KAAK,UAAU,KAAK,CAAC,IAAY,EAAE,EAAU;IAC3C,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,CAAS;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAiB;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAErE,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,iBAAiB,CAAC,CAAC;YACnD,SAAS;QACX,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAE5D,6EAA6E;QAC7E,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAElD,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YAErD,gDAAgD;YAChD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvD,iDAAiD;gBACjD,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;oBACnB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC3D,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACzC,IAAI,CAAC,EAAE,EAAE,CAAC;wBACR,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC3B,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG;gBACf,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,OAAO;gBACb,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,UAAU;aAC3C,CAAC;YACF,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,CAAC,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAEnC,iFAAiF;IACjF,kEAAkE;IAClE,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/cmd/pull.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,20 @@
1
- /**
2
- * `unfairly setup` — one-shot agent host installer.
3
- *
4
- * 1. Browser OAuth → mint mcp_* token, cache in keychain.
5
- * 2. Append/replace a sentinel-marked block in the user's shell rcfile
6
- * (~/.zshenv on zsh, ~/.bash_profile on bash) with UNFAIRLY_MCP_TOKEN
7
- * + UNFAIRLY_TOKEN exports.
8
- * 3. Patch ~/.codex/config.toml with [mcp_servers.unfairly] including
9
- * bearer_token_env_var. Skips silently if Codex isn't installed.
10
- * 4. Register with Claude Code via `claude mcp add` if the binary is
11
- * in PATH. Non-destructive — tolerates "already exists" as success.
12
- * 5. Verify the new token works by calling /api/mcp with it. If the
13
- * handshake fails, print clear remediation instructions instead of
14
- * declaring victory.
15
- *
16
- * Idempotent — safe to re-run any time. Each write replaces in place
17
- * rather than duplicating.
18
- */
19
- export declare function runSetup(): Promise<void>;
1
+ import { type CodexResult } from "../hosts/codex.js";
2
+ import { type ClaudeCodeResult } from "../hosts/claude-code.js";
3
+ import { type ClaudeDesktopResult } from "../hosts/claude-desktop.js";
4
+ export type SetupOptions = {
5
+ /** When the caller (bare entrypoint) is in a repo, chain init after verify. */
6
+ chainInit?: boolean;
7
+ /** Skip the workspace-bind confirmation prompt. */
8
+ yes?: boolean;
9
+ };
10
+ export type SetupOutcome = {
11
+ ok: boolean;
12
+ token: string | null;
13
+ hosts: {
14
+ claudeDesktop: ClaudeDesktopResult;
15
+ claudeCode: ClaudeCodeResult;
16
+ codex: CodexResult;
17
+ };
18
+ };
19
+ export declare function runSetup(opts?: SetupOptions): Promise<SetupOutcome>;
20
20
  //# sourceMappingURL=setup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cmd/setup.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,QAAQ,kBAgF7B"}
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"}