unfairly 0.2.0 → 0.5.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 (115) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +45 -1
  3. package/dist/auth/browser-flow.d.ts +15 -0
  4. package/dist/auth/browser-flow.d.ts.map +1 -0
  5. package/dist/auth/browser-flow.js +74 -0
  6. package/dist/auth/browser-flow.js.map +1 -0
  7. package/dist/cmd/init.d.ts +10 -0
  8. package/dist/cmd/init.d.ts.map +1 -0
  9. package/dist/cmd/init.js +12 -92
  10. package/dist/cmd/init.js.map +1 -0
  11. package/dist/cmd/login.d.ts +21 -0
  12. package/dist/cmd/login.d.ts.map +1 -0
  13. package/dist/cmd/login.js +13 -67
  14. package/dist/cmd/login.js.map +1 -0
  15. package/dist/cmd/mcp.d.ts +2 -0
  16. package/dist/cmd/mcp.d.ts.map +1 -0
  17. package/dist/cmd/mcp.js +1 -0
  18. package/dist/cmd/mcp.js.map +1 -0
  19. package/dist/cmd/pull.d.ts +2 -0
  20. package/dist/cmd/pull.d.ts.map +1 -0
  21. package/dist/cmd/pull.js +9 -0
  22. package/dist/cmd/pull.js.map +1 -0
  23. package/dist/cmd/push.d.ts +2 -0
  24. package/dist/cmd/push.d.ts.map +1 -0
  25. package/dist/cmd/push.js +1 -0
  26. package/dist/cmd/push.js.map +1 -0
  27. package/dist/cmd/resolve.d.ts +2 -0
  28. package/dist/cmd/resolve.d.ts.map +1 -0
  29. package/dist/cmd/resolve.js +1 -0
  30. package/dist/cmd/resolve.js.map +1 -0
  31. package/dist/cmd/setup.d.ts +20 -0
  32. package/dist/cmd/setup.d.ts.map +1 -0
  33. package/dist/cmd/setup.js +151 -0
  34. package/dist/cmd/setup.js.map +1 -0
  35. package/dist/cmd/status.d.ts +2 -0
  36. package/dist/cmd/status.d.ts.map +1 -0
  37. package/dist/cmd/status.js +1 -0
  38. package/dist/cmd/status.js.map +1 -0
  39. package/dist/cmd/watch.d.ts +2 -0
  40. package/dist/cmd/watch.d.ts.map +1 -0
  41. package/dist/cmd/watch.js +1 -0
  42. package/dist/cmd/watch.js.map +1 -0
  43. package/dist/hosts/claude-code.d.ts +23 -0
  44. package/dist/hosts/claude-code.d.ts.map +1 -0
  45. package/dist/hosts/claude-code.js +44 -0
  46. package/dist/hosts/claude-code.js.map +1 -0
  47. package/dist/hosts/codex.d.ts +39 -0
  48. package/dist/hosts/codex.d.ts.map +1 -0
  49. package/dist/hosts/codex.js +97 -0
  50. package/dist/hosts/codex.js.map +1 -0
  51. package/dist/hosts/shell-env.d.ts +16 -0
  52. package/dist/hosts/shell-env.d.ts.map +1 -0
  53. package/dist/hosts/shell-env.js +81 -0
  54. package/dist/hosts/shell-env.js.map +1 -0
  55. package/dist/index.d.ts +3 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +5 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/lib/client.d.ts +46 -0
  60. package/dist/lib/client.d.ts.map +1 -0
  61. package/dist/lib/client.js +58 -0
  62. package/dist/lib/client.js.map +1 -0
  63. package/dist/lib/events/emit.d.ts +16 -0
  64. package/dist/lib/events/emit.d.ts.map +1 -0
  65. package/dist/lib/events/emit.js +27 -0
  66. package/dist/lib/events/emit.js.map +1 -0
  67. package/dist/lib/index.d.ts +13 -0
  68. package/dist/lib/index.d.ts.map +1 -0
  69. package/dist/lib/index.js +11 -0
  70. package/dist/lib/index.js.map +1 -0
  71. package/dist/lib/transport.d.ts +46 -0
  72. package/dist/lib/transport.d.ts.map +1 -0
  73. package/dist/lib/transport.js +85 -0
  74. package/dist/lib/transport.js.map +1 -0
  75. package/dist/lib/types/index.d.ts +167 -0
  76. package/dist/lib/types/index.d.ts.map +1 -0
  77. package/dist/lib/types/index.js +50 -0
  78. package/dist/lib/types/index.js.map +1 -0
  79. package/dist/lib/vault/checkpoint.d.ts +12 -0
  80. package/dist/lib/vault/checkpoint.d.ts.map +1 -0
  81. package/dist/lib/vault/checkpoint.js +18 -0
  82. package/dist/lib/vault/checkpoint.js.map +1 -0
  83. package/dist/lib/vault/read.d.ts +4 -0
  84. package/dist/lib/vault/read.d.ts.map +1 -0
  85. package/dist/lib/vault/read.js +9 -0
  86. package/dist/lib/vault/read.js.map +1 -0
  87. package/dist/lib/vault/search.d.ts +8 -0
  88. package/dist/lib/vault/search.d.ts.map +1 -0
  89. package/dist/lib/vault/search.js +10 -0
  90. package/dist/lib/vault/search.js.map +1 -0
  91. package/dist/sync/api.d.ts +80 -0
  92. package/dist/sync/api.d.ts.map +1 -0
  93. package/dist/sync/api.js +1 -0
  94. package/dist/sync/api.js.map +1 -0
  95. package/dist/sync/autoloader.d.ts +7 -0
  96. package/dist/sync/autoloader.d.ts.map +1 -0
  97. package/dist/sync/autoloader.js +138 -0
  98. package/dist/sync/autoloader.js.map +1 -0
  99. package/dist/sync/conflict.d.ts +12 -0
  100. package/dist/sync/conflict.d.ts.map +1 -0
  101. package/dist/sync/conflict.js +1 -0
  102. package/dist/sync/conflict.js.map +1 -0
  103. package/dist/sync/credentials.d.ts +8 -0
  104. package/dist/sync/credentials.d.ts.map +1 -0
  105. package/dist/sync/credentials.js +1 -0
  106. package/dist/sync/credentials.js.map +1 -0
  107. package/dist/sync/files.d.ts +43 -0
  108. package/dist/sync/files.d.ts.map +1 -0
  109. package/dist/sync/files.js +1 -0
  110. package/dist/sync/files.js.map +1 -0
  111. package/dist/sync/manifest.d.ts +31 -0
  112. package/dist/sync/manifest.d.ts.map +1 -0
  113. package/dist/sync/manifest.js +1 -0
  114. package/dist/sync/manifest.js.map +1 -0
  115. package/package.json +26 -5
package/CHANGELOG.md ADDED
@@ -0,0 +1,29 @@
1
+ # Changelog
2
+
3
+ ## 0.5.0 — 2026-05-12
4
+
5
+ - Added library exports: `createUnfairlyClient`, `UnfairlyApiError`,
6
+ `ALLOWED_EVENT_NAMES`, `EVENT_PAYLOAD_SCHEMAS`, and public types
7
+ (`UnfairlyClient`, `UnfairlyClientOptions`, `VaultClient`,
8
+ `AllowedEventName`, `EventPayload`, `CheckpointInput`, `CheckpointResult`,
9
+ `TrustTier`, `SearchHit`, `SearchDocumentSummary`, `SearchResponse`,
10
+ `VaultDocument`, `MeResponse`, `SdkErrorBody`).
11
+ - Library is a thin REST wrapper over `/api/sdk/v1/*` (search, read
12
+ document, checkpoint, events emit, identity).
13
+ - Subpath imports: `unfairly/client`, `unfairly/events`, `unfairly/types`.
14
+ - Consolidates the unpublished `@unfairly/sdk` package into this package.
15
+ `@unfairly/sdk` is deleted from the repo and was never on npm.
16
+ - No CLI behavior change. All existing commands (`init`, `login`, `pull`,
17
+ `push`, `status`, `resolve`, `watch`, `mcp`, `setup`) unchanged.
18
+ - ESM-only. No CJS bundle. Requires Node 20+.
19
+ - Adds `zod` (`^3.23.8`) as a runtime dependency (used by event payload
20
+ validation).
21
+
22
+ ## 0.4.0 — unpublished
23
+
24
+ Internal version bump on `main`; never reached npm.
25
+
26
+ ## 0.3.0 — 2026-05-08
27
+
28
+ Initial public release of `unfairly` CLI (browser auth, vault sync,
29
+ stdio MCP).
package/README.md CHANGED
@@ -31,7 +31,7 @@ unfairly push # broadcast back to cloud
31
31
  ├── manifest.json # vault list + per-doc sha map; atomic writes
32
32
  ├── .gitignore # generated; ignores cache/
33
33
  ├── unfairly-app/ # repo-bound vault, git-tracked
34
- │ └── architecture/
34
+ │ └── canon/
35
35
  │ └── system.md
36
36
  └── cache/ # gitignored bucket for personal/sensitive vaults
37
37
  └── hq/
@@ -41,6 +41,50 @@ unfairly push # broadcast back to cloud
41
41
 
42
42
  Per-vault git-tracking is server-side via `rooms.track_in_git`. Tracked vaults live at the root; untracked vaults live under `cache/`.
43
43
 
44
+ ## Library usage
45
+
46
+ `unfairly` also ships a TypeScript library surface for building agent
47
+ runtimes against the hosted REST API. Same package, no extra install.
48
+
49
+ ```ts
50
+ import { createUnfairlyClient } from "unfairly";
51
+
52
+ const client = createUnfairlyClient({ apiKey: process.env.UNFAIRLY_API_KEY });
53
+
54
+ // Identify yourself + list reachable vaults
55
+ const me = await client.me();
56
+
57
+ // Search a vault
58
+ const hits = await client.vault("growth").search("burn rate", { matchCount: 8 });
59
+
60
+ // Read a document
61
+ const doc = await client.vault("growth").readDocument("operating-plan");
62
+
63
+ // Save a checkpoint (server derives identity from the token — do NOT pass actor_email)
64
+ await client.vault("growth").checkpoint({
65
+ built: "Shipped new growth funnel widget",
66
+ decided: "Use Inngest for delivery; keep auto-checkpoint synchronous",
67
+ });
68
+
69
+ // Emit a closed-allowlist event into the Unfairly Inngest queue
70
+ await client.event.emit("growth-agent/signal.detected", {
71
+ signal_id: "abc",
72
+ source: "x-listener",
73
+ trust_tier: "gold",
74
+ dedupe_key: "abc:1",
75
+ payload: { text: "..." },
76
+ });
77
+ ```
78
+
79
+ Subpath imports are available for advanced consumers:
80
+
81
+ ```ts
82
+ import { ALLOWED_EVENT_NAMES, EVENT_PAYLOAD_SCHEMAS } from "unfairly/events";
83
+ import type { CheckpointInput, SearchResponse } from "unfairly/types";
84
+ ```
85
+
86
+ ESM-only. Requires Node 20+.
87
+
44
88
  ## Design
45
89
 
46
90
  See [`docs/superpowers/specs/2026-05-07-local-context-sync-design.md`](../docs/superpowers/specs/2026-05-07-local-context-sync-design.md) in the main repo for architecture, conflict resolution, and integration with the cloud `/api/mcp` endpoint.
@@ -0,0 +1,15 @@
1
+ export type BrowserAuthOptions = {
2
+ tokenName?: string;
3
+ timeoutMs?: number;
4
+ };
5
+ /**
6
+ * OAuth handshake via loopback HTTP server. Used by `unfairly setup`,
7
+ * `unfairly login`, and `unfairly init`.
8
+ *
9
+ * Flow: pop a /cli-auth page in the user's browser with a one-time `state`
10
+ * and a `cb=http://localhost:<port>/done` callback. The page mints a
11
+ * `mcp_*` token and redirects the browser back to `cb`. Our local server
12
+ * verifies the state echo and resolves with the token.
13
+ */
14
+ export declare function browserAuthFlow(apiUrl: string, opts?: BrowserAuthOptions): Promise<string | null>;
15
+ //# sourceMappingURL=browser-flow.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,74 @@
1
+ import http from "node:http";
2
+ import crypto from "node:crypto";
3
+ import { spawn } from "node:child_process";
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) {
6
+ const opener = process.platform === "darwin"
7
+ ? "open"
8
+ : process.platform === "win32"
9
+ ? "cmd"
10
+ : "xdg-open";
11
+ const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
12
+ try {
13
+ spawn(opener, args, { stdio: "ignore", detached: true }).unref();
14
+ }
15
+ catch {
16
+ // best-effort
17
+ }
18
+ }
19
+ /**
20
+ * OAuth handshake via loopback HTTP server. Used by `unfairly setup`,
21
+ * `unfairly login`, and `unfairly init`.
22
+ *
23
+ * Flow: pop a /cli-auth page in the user's browser with a one-time `state`
24
+ * and a `cb=http://localhost:<port>/done` callback. The page mints a
25
+ * `mcp_*` token and redirects the browser back to `cb`. Our local server
26
+ * verifies the state echo and resolves with the token.
27
+ */
28
+ export async function browserAuthFlow(apiUrl, opts = {}) {
29
+ const tokenName = opts.tokenName ?? "unfairly cli";
30
+ const timeoutMs = opts.timeoutMs ?? 5 * 60_000;
31
+ const state = crypto.randomBytes(16).toString("base64url");
32
+ return new Promise((resolve) => {
33
+ let resolved = false;
34
+ const cleanup = (val) => {
35
+ if (resolved)
36
+ return;
37
+ resolved = true;
38
+ setTimeout(() => server.close(), 500);
39
+ resolve(val);
40
+ };
41
+ const server = http.createServer((req, res) => {
42
+ const url = new URL(req.url ?? "/", "http://localhost");
43
+ if (url.pathname !== "/done") {
44
+ res.writeHead(404).end();
45
+ return;
46
+ }
47
+ const echoState = url.searchParams.get("state") ?? "";
48
+ const token = url.searchParams.get("token") ?? "";
49
+ if (echoState !== state || !token.startsWith("mcp_")) {
50
+ res.writeHead(400).end("Auth failed");
51
+ cleanup(null);
52
+ return;
53
+ }
54
+ res
55
+ .writeHead(200, { "Content-Type": "text/html; charset=utf-8" })
56
+ .end(SUCCESS_HTML);
57
+ cleanup(token);
58
+ });
59
+ const timeout = setTimeout(() => cleanup(null), timeoutMs);
60
+ server.on("close", () => clearTimeout(timeout));
61
+ server.listen(0, "127.0.0.1", () => {
62
+ const addr = server.address();
63
+ const port = typeof addr === "object" && addr ? addr.port : 0;
64
+ const cb = `http://localhost:${port}/done`;
65
+ const authUrl = new URL("/cli-auth", apiUrl);
66
+ authUrl.searchParams.set("cb", cb);
67
+ authUrl.searchParams.set("state", state);
68
+ authUrl.searchParams.set("name", tokenName);
69
+ console.error(`\nOpening browser to authorize:\n ${authUrl.toString()}\n(if it doesn't open, click the link above)\n`);
70
+ openBrowser(authUrl.toString());
71
+ });
72
+ });
73
+ }
74
+ //# sourceMappingURL=browser-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-flow.js","sourceRoot":"","sources":["../../src/auth/browser-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type InitOptions = {
2
+ /** mcp_* token for non-interactive runs (agents, CI, etc.) */
3
+ token?: string;
4
+ /** skip the .unfairly/ overwrite confirmation */
5
+ yes?: boolean;
6
+ /** disable browser-based OAuth and force the manual prompt fallback */
7
+ noBrowser?: boolean;
8
+ };
9
+ export declare function runInit(opts?: InitOptions): Promise<void>;
10
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +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"}
package/dist/cmd/init.js CHANGED
@@ -2,102 +2,15 @@ import { promises as fs } from "node:fs";
2
2
  import path from "node:path";
3
3
  import readline from "node:readline/promises";
4
4
  import { stdin as input, stdout as output } from "node:process";
5
- import http from "node:http";
6
- import crypto from "node:crypto";
7
- import { spawn } from "node:child_process";
8
5
  import { SyncClient } from "../sync/api.js";
9
6
  import { emptyManifest, writeManifest } from "../sync/manifest.js";
10
7
  import { getToken, setToken } from "../sync/credentials.js";
8
+ import { browserAuthFlow } from "../auth/browser-flow.js";
11
9
  import { runPull } from "./pull.js";
12
10
  const DEFAULT_API = "https://app.unfairly.ai";
13
11
  function isTty() {
14
12
  return Boolean(process.stdin.isTTY);
15
13
  }
16
- /**
17
- * Open a URL in the user's default browser. Best-effort, never throws.
18
- * Uses spawn (not exec) — URL passed as an arg, never interpolated into
19
- * a shell command, so no injection surface.
20
- */
21
- function openBrowser(url) {
22
- const opener = process.platform === "darwin"
23
- ? "open"
24
- : process.platform === "win32"
25
- ? "cmd"
26
- : "xdg-open";
27
- const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
28
- try {
29
- spawn(opener, args, { stdio: "ignore", detached: true }).unref();
30
- }
31
- catch {
32
- // best-effort
33
- }
34
- }
35
- function successHtml() {
36
- return `<!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>`;
37
- }
38
- function failHtml(msg) {
39
- return `<!doctype html><html><head><meta charset="utf-8"><title>Unfairly CLI failed</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:24px}p{margin:0;color:rgba(26,22,18,.7);font-size:14px}</style></head><body><div class="card"><h1>Authorization failed</h1><p>${msg}</p></div></body></html>`;
40
- }
41
- /**
42
- * Browser-based OAuth handoff. Spins up a loopback HTTP server, opens
43
- * the browser to /cli-auth, waits for the redirect callback. Returns
44
- * the mcp_* token, or null on timeout/cancel/error.
45
- */
46
- async function browserAuthFlow(apiUrl) {
47
- const state = crypto.randomBytes(16).toString("base64url");
48
- return new Promise((resolve) => {
49
- let resolved = false;
50
- const cleanup = (val) => {
51
- if (resolved)
52
- return;
53
- resolved = true;
54
- setTimeout(() => server.close(), 500);
55
- resolve(val);
56
- };
57
- const server = http.createServer((req, res) => {
58
- const url = new URL(req.url ?? "/", "http://localhost");
59
- if (url.pathname !== "/done") {
60
- res.writeHead(404).end("Not found");
61
- return;
62
- }
63
- const echoState = url.searchParams.get("state") ?? "";
64
- const token = url.searchParams.get("token") ?? "";
65
- if (echoState !== state) {
66
- res
67
- .writeHead(400, { "Content-Type": "text/html; charset=utf-8" })
68
- .end(failHtml("State mismatch — possible CSRF. Try `unfairly init` again."));
69
- cleanup(null);
70
- return;
71
- }
72
- if (!token.startsWith("mcp_")) {
73
- res
74
- .writeHead(400, { "Content-Type": "text/html; charset=utf-8" })
75
- .end(failHtml("No token in callback."));
76
- cleanup(null);
77
- return;
78
- }
79
- res
80
- .writeHead(200, { "Content-Type": "text/html; charset=utf-8" })
81
- .end(successHtml());
82
- cleanup(token);
83
- });
84
- const timeout = setTimeout(() => cleanup(null), 5 * 60_000);
85
- server.on("close", () => clearTimeout(timeout));
86
- server.listen(0, "127.0.0.1", () => {
87
- const addr = server.address();
88
- const port = typeof addr === "object" && addr ? addr.port : 0;
89
- const cb = `http://localhost:${port}/done`;
90
- const authUrl = new URL("/cli-auth", apiUrl);
91
- authUrl.searchParams.set("cb", cb);
92
- authUrl.searchParams.set("state", state);
93
- authUrl.searchParams.set("name", "unfairly cli");
94
- console.log("Opening browser to authorize...");
95
- console.log(` ${authUrl.toString()}`);
96
- console.log("(if it doesn't open, click the link above)");
97
- openBrowser(authUrl.toString());
98
- });
99
- });
100
- }
101
14
  export async function runInit(opts = {}) {
102
15
  const cwd = process.cwd();
103
16
  const target = path.join(cwd, ".unfairly");
@@ -193,10 +106,17 @@ export async function runInit(opts = {}) {
193
106
  };
194
107
  }
195
108
  await writeManifest(cwd, manifest);
196
- // Generate .gitignore (cache/ is the gitignored bucket for non-tracked vaults)
197
- const gitignorePath = path.join(target, ".gitignore");
198
- await fs.writeFile(gitignorePath, "# generated by `unfairly init`\ncache/\n*.tmp.*\n", "utf8");
199
- // First pull (all vaults)
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.
200
111
  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");
201
120
  console.log("Done. Run `unfairly status` to confirm. Edit any .md file under .unfairly/ and run `unfairly push` to broadcast.");
202
121
  }
122
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cmd/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export type LoginOptions = {
2
+ /** Print only the export line (no friendly preamble). For piping. */
3
+ quiet?: boolean;
4
+ };
5
+ /**
6
+ * `unfairly login` — runs the OAuth handoff and prints a shell snippet
7
+ * the user can paste into their shell config. Useful for setting up
8
+ * Codex CLI's UNFAIRLY_MCP_TOKEN env var without copy-pasting tokens.
9
+ *
10
+ * For most users `unfairly setup` is the better path — it handles env +
11
+ * agent host config in one shot. `login` is preserved for scripting use
12
+ * cases where you want just the export line on stdout.
13
+ *
14
+ * Stdout = the export line (only). Stderr = friendly hints.
15
+ *
16
+ * NOTE: do NOT pipe `unfairly login >> ~/.zshenv` via npx — npx's first-run
17
+ * "Ok to proceed?" confirmation goes to stdout and corrupts the file.
18
+ * Install globally first (`npm i -g unfairly`) or use `unfairly setup`.
19
+ */
20
+ export declare function runLogin(opts?: LoginOptions): Promise<void>;
21
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/cmd/login.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,YAAY,GAAG;IACzB,qEAAqE;IACrE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,QAAQ,CAAC,IAAI,GAAE,YAAiB,iBA6BrD"}
package/dist/cmd/login.js CHANGED
@@ -1,78 +1,24 @@
1
- import http from "node:http";
2
- import crypto from "node:crypto";
3
- import { spawn } from "node:child_process";
1
+ import { browserAuthFlow } from "../auth/browser-flow.js";
4
2
  import { setToken } from "../sync/credentials.js";
5
3
  const DEFAULT_API = "https://app.unfairly.ai";
6
- function openBrowser(url) {
7
- const opener = process.platform === "darwin"
8
- ? "open"
9
- : process.platform === "win32"
10
- ? "cmd"
11
- : "xdg-open";
12
- const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
13
- try {
14
- spawn(opener, args, { stdio: "ignore", detached: true }).unref();
15
- }
16
- catch {
17
- // best-effort
18
- }
19
- }
20
- 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>`;
21
- async function browserAuthFlow(apiUrl) {
22
- const state = crypto.randomBytes(16).toString("base64url");
23
- return new Promise((resolve) => {
24
- let resolved = false;
25
- const cleanup = (val) => {
26
- if (resolved)
27
- return;
28
- resolved = true;
29
- setTimeout(() => server.close(), 500);
30
- resolve(val);
31
- };
32
- const server = http.createServer((req, res) => {
33
- const url = new URL(req.url ?? "/", "http://localhost");
34
- if (url.pathname !== "/done") {
35
- res.writeHead(404).end();
36
- return;
37
- }
38
- const echoState = url.searchParams.get("state") ?? "";
39
- const token = url.searchParams.get("token") ?? "";
40
- if (echoState !== state || !token.startsWith("mcp_")) {
41
- res.writeHead(400).end("Auth failed");
42
- cleanup(null);
43
- return;
44
- }
45
- res
46
- .writeHead(200, { "Content-Type": "text/html; charset=utf-8" })
47
- .end(SUCCESS_HTML);
48
- cleanup(token);
49
- });
50
- const timeout = setTimeout(() => cleanup(null), 5 * 60_000);
51
- server.on("close", () => clearTimeout(timeout));
52
- server.listen(0, "127.0.0.1", () => {
53
- const addr = server.address();
54
- const port = typeof addr === "object" && addr ? addr.port : 0;
55
- const cb = `http://localhost:${port}/done`;
56
- const authUrl = new URL("/cli-auth", apiUrl);
57
- authUrl.searchParams.set("cb", cb);
58
- authUrl.searchParams.set("state", state);
59
- authUrl.searchParams.set("name", "unfairly cli");
60
- console.error(`\nOpening browser to authorize:\n ${authUrl.toString()}\n(if it doesn't open, click the link above)\n`);
61
- openBrowser(authUrl.toString());
62
- });
63
- });
64
- }
65
4
  /**
66
5
  * `unfairly login` — runs the OAuth handoff and prints a shell snippet
67
6
  * the user can paste into their shell config. Useful for setting up
68
7
  * Codex CLI's UNFAIRLY_MCP_TOKEN env var without copy-pasting tokens.
69
8
  *
70
- * Stdout = the export line (only). Stderr = friendly hints. So users can
71
- * pipe: `unfairly login >> ~/.zshenv && source ~/.zshenv`.
9
+ * For most users `unfairly setup` is the better path — it handles env +
10
+ * agent host config in one shot. `login` is preserved for scripting use
11
+ * cases where you want just the export line on stdout.
12
+ *
13
+ * Stdout = the export line (only). Stderr = friendly hints.
14
+ *
15
+ * NOTE: do NOT pipe `unfairly login >> ~/.zshenv` via npx — npx's first-run
16
+ * "Ok to proceed?" confirmation goes to stdout and corrupts the file.
17
+ * Install globally first (`npm i -g unfairly`) or use `unfairly setup`.
72
18
  */
73
19
  export async function runLogin(opts = {}) {
74
20
  const apiUrl = process.env.UNFAIRLY_API_URL ?? DEFAULT_API;
75
- const token = await browserAuthFlow(apiUrl);
21
+ const token = await browserAuthFlow(apiUrl, { tokenName: "unfairly login" });
76
22
  if (!token) {
77
23
  console.error("Login failed — browser flow timed out or was cancelled.");
78
24
  process.exit(1);
@@ -89,7 +35,7 @@ export async function runLogin(opts = {}) {
89
35
  process.stdout.write(`export UNFAIRLY_TOKEN=${token}\n`);
90
36
  if (!opts.quiet) {
91
37
  console.error("");
92
- console.error("Or pipe directly: npx unfairly@latest login >> ~/.zshenv && source ~/.zshenv");
93
- console.error("Then restart any agent host (Codex, Claude Code) that needs the env.");
38
+ console.error("Tip: `unfairly setup` handles this AND patches your Codex / Claude Code config in one shot.");
94
39
  }
95
40
  }
41
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/cmd/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAO9C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAqB,EAAE;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,WAAW,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CACX,kEAAkE,CACnE,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,qDAAqD;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,KAAK,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,KAAK,IAAI,CAAC,CAAC;IAEzD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CACX,6FAA6F,CAC9F,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runMcp(): Promise<void>;
2
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/cmd/mcp.ts"],"names":[],"mappings":"AAeA,wBAAsB,MAAM,kBAoF3B"}
package/dist/cmd/mcp.js CHANGED
@@ -83,3 +83,4 @@ export async function runMcp() {
83
83
  const transport = new StdioServerTransport();
84
84
  await server.connect(transport);
85
85
  }
86
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/cmd/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AACtE,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AACtE,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,EAC3C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,YAAY;gBAClB,WAAW,EACT,0IAA0I;gBAC5I,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE;4BACJ,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,mCAAmC;yBACjD;qBACF;iBACF;aACF;YACD;gBACE,IAAI,EAAE,YAAY;gBAClB,WAAW,EACT,wJAAwJ;gBAC1J,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE;4BACJ,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,mCAAmC;yBACjD;qBACF;iBACF;aACF;YACD;gBACE,IAAI,EAAE,aAAa;gBACnB,WAAW,EACT,mFAAmF;gBACrF,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;aAChD;SACF;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5D,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAC7C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;QAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;QAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;QAChC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,CAAY,EAAE,EAAE,CAChC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,CAAY,EAAE,EAAE,CACjC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,CAAY,EAAE,EAAE,CAClC,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC9C,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;iBAAM,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBACjC,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC9C,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;iBAAM,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;gBAClC,YAAY,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC/B,MAAM,SAAS,EAAE,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC;YACtB,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC;YACxB,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;QAC5B,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;SAC/D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runPull(vaultArg?: string): Promise<void>;
2
+ //# sourceMappingURL=pull.d.ts.map
@@ -0,0 +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"}
package/dist/cmd/pull.js CHANGED
@@ -6,6 +6,7 @@ import { SyncClient } from "../sync/api.js";
6
6
  import { readManifest, writeManifest } from "../sync/manifest.js";
7
7
  import { buildFileFromServer, writeDocFile } from "../sync/files.js";
8
8
  import { getToken } from "../sync/credentials.js";
9
+ import { writeAutoloader } from "../sync/autoloader.js";
9
10
  const execFileAsync = promisify(execFile);
10
11
  async function gitMv(from, to) {
11
12
  try {
@@ -95,4 +96,12 @@ export async function runPull(vaultArg) {
95
96
  console.log(`+${upserts} -${deletes}${renames ? ` ~${renames}` : ""}`);
96
97
  }
97
98
  await writeManifest(cwd, manifest);
99
+ // Regenerate .unfairly/CLAUDE.md autoloader + .gitignore from the latest mirror.
100
+ // (init prints the @-import paste instruction; pull stays quiet.)
101
+ const refreshed = await readManifest(cwd);
102
+ if (refreshed) {
103
+ const target = path.join(cwd, ".unfairly");
104
+ await writeAutoloader(target, refreshed);
105
+ }
98
106
  }
107
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/cmd/pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runPush(vaultArg?: string): Promise<void>;
2
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/cmd/push.ts"],"names":[],"mappings":"AAQA,wBAAsB,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,iBAoF9C"}
package/dist/cmd/push.js CHANGED
@@ -82,3 +82,4 @@ export async function runPush(vaultArg) {
82
82
  await writeManifest(cwd, manifest);
83
83
  console.log(`pushed ${pushed}, conflicts ${conflicts}`);
84
84
  }
85
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/cmd/push.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runResolve(relOrAbsPath: string): Promise<void>;
2
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/cmd/resolve.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,CAAC,YAAY,EAAE,MAAM,iBAoCpD"}
@@ -32,3 +32,4 @@ export async function runResolve(relOrAbsPath) {
32
32
  console.error("path not found in manifest");
33
33
  process.exit(1);
34
34
  }
35
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/cmd/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,YAAoB;IACnD,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,sBAAsB,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QACvC,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAEjC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,KAAK,CACX,iFAAiF,CAClF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2EAA2E;IAC3E,wEAAwE;IACxE,wEAAwE;IACxE,mEAAmE;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC;IAChE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CACT,sDAAsD,CACvD,CAAC;gBACF,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +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>;
20
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cmd/setup.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,QAAQ,kBAgF7B"}