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.
- package/CHANGELOG.md +15 -0
- package/README.md +16 -7
- package/dist/cmd/init.d.ts +2 -3
- package/dist/cmd/init.d.ts.map +1 -1
- package/dist/cmd/init.js +60 -44
- package/dist/cmd/init.js.map +1 -1
- package/dist/cmd/pull.d.ts.map +1 -1
- package/dist/cmd/pull.js +16 -2
- package/dist/cmd/pull.js.map +1 -1
- package/dist/cmd/setup.d.ts +19 -19
- package/dist/cmd/setup.d.ts.map +1 -1
- package/dist/cmd/setup.js +267 -87
- package/dist/cmd/setup.js.map +1 -1
- package/dist/cmd/status-card.d.ts +2 -0
- package/dist/cmd/status-card.d.ts.map +1 -0
- package/dist/cmd/status-card.js +156 -0
- package/dist/cmd/status-card.js.map +1 -0
- package/dist/cmd/status.d.ts.map +1 -1
- package/dist/cmd/status.js +3 -0
- package/dist/cmd/status.js.map +1 -1
- package/dist/hosts/claude-code.d.ts +48 -10
- package/dist/hosts/claude-code.d.ts.map +1 -1
- package/dist/hosts/claude-code.js +102 -29
- package/dist/hosts/claude-code.js.map +1 -1
- package/dist/hosts/claude-desktop.d.ts +47 -0
- package/dist/hosts/claude-desktop.d.ts.map +1 -0
- package/dist/hosts/claude-desktop.js +88 -0
- package/dist/hosts/claude-desktop.js.map +1 -0
- package/dist/index.js +58 -27
- package/dist/index.js.map +1 -1
- package/dist/sync/repo-root.d.ts +7 -0
- package/dist/sync/repo-root.d.ts.map +1 -0
- package/dist/sync/repo-root.js +24 -0
- package/dist/sync/repo-root.js.map +1 -0
- package/dist/sync/stitch-claude-md.d.ts +9 -0
- package/dist/sync/stitch-claude-md.d.ts.map +1 -0
- package/dist/sync/stitch-claude-md.js +48 -0
- package/dist/sync/stitch-claude-md.js.map +1 -0
- package/dist/ui/colors.d.ts +17 -0
- package/dist/ui/colors.d.ts.map +1 -0
- package/dist/ui/colors.js +28 -0
- package/dist/ui/colors.js.map +1 -0
- package/dist/ui/screens.d.ts +44 -0
- package/dist/ui/screens.d.ts.map +1 -0
- package/dist/ui/screens.js +135 -0
- package/dist/ui/screens.js.map +1 -0
- package/package.json +32 -7
package/dist/cmd/setup.js
CHANGED
|
@@ -2,124 +2,220 @@ import { browserAuthFlow } from "../auth/browser-flow.js";
|
|
|
2
2
|
import { setToken } from "../sync/credentials.js";
|
|
3
3
|
import { writeShellEnv } from "../hosts/shell-env.js";
|
|
4
4
|
import { configureCodex } from "../hosts/codex.js";
|
|
5
|
-
import { configureClaudeCode
|
|
5
|
+
import { configureClaudeCode } from "../hosts/claude-code.js";
|
|
6
|
+
import { configureClaudeDesktop } from "../hosts/claude-desktop.js";
|
|
7
|
+
import { banner, stepHeader, result, divider, defaultOpts } from "../ui/screens.js";
|
|
8
|
+
import { brand } from "../ui/colors.js";
|
|
6
9
|
const DEFAULT_API = "https://app.unfairly.ai";
|
|
7
|
-
|
|
8
|
-
* `unfairly setup` — one-shot agent host installer.
|
|
9
|
-
*
|
|
10
|
-
* 1. Browser OAuth → mint mcp_* token, cache in keychain.
|
|
11
|
-
* 2. Append/replace a sentinel-marked block in the user's shell rcfile
|
|
12
|
-
* (~/.zshenv on zsh, ~/.bash_profile on bash) with UNFAIRLY_MCP_TOKEN
|
|
13
|
-
* + UNFAIRLY_TOKEN exports.
|
|
14
|
-
* 3. Patch ~/.codex/config.toml with [mcp_servers.unfairly] including
|
|
15
|
-
* bearer_token_env_var. Skips silently if Codex isn't installed.
|
|
16
|
-
* 4. Register with Claude Code via `claude mcp add` if the binary is
|
|
17
|
-
* in PATH. Non-destructive — tolerates "already exists" as success.
|
|
18
|
-
* 5. Verify the new token works by calling /api/mcp with it. If the
|
|
19
|
-
* handshake fails, print clear remediation instructions instead of
|
|
20
|
-
* declaring victory.
|
|
21
|
-
*
|
|
22
|
-
* Idempotent — safe to re-run any time. Each write replaces in place
|
|
23
|
-
* rather than duplicating.
|
|
24
|
-
*/
|
|
25
|
-
export async function runSetup() {
|
|
10
|
+
export async function runSetup(opts = {}) {
|
|
26
11
|
const apiUrl = process.env.UNFAIRLY_API_URL ?? DEFAULT_API;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
12
|
+
const ui = defaultOpts();
|
|
13
|
+
const c = brand({ enabled: ui.color });
|
|
14
|
+
const write = (s) => process.stderr.write(`${s}\n`);
|
|
15
|
+
write(banner(ui));
|
|
16
|
+
write("");
|
|
17
|
+
write(`${c.coral("▶")} player 2 booting…`);
|
|
18
|
+
write("");
|
|
19
|
+
// [1/5] AUTH
|
|
20
|
+
write(stepHeader(1, 5, "AUTH", ui));
|
|
21
|
+
write(result("progress", "browser opening — click to authorize", ui));
|
|
31
22
|
const token = await browserAuthFlow(apiUrl, { tokenName: "unfairly setup" });
|
|
32
23
|
if (!token) {
|
|
33
|
-
|
|
24
|
+
write(result("err", "browser flow cancelled or timed out. Run `unfairly` again.", ui));
|
|
34
25
|
process.exit(1);
|
|
35
26
|
}
|
|
36
27
|
await setToken(token);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
//
|
|
40
|
-
|
|
28
|
+
write(result("ok", `token minted (${token.slice(0, 8)}…) · cached in keychain`, ui));
|
|
29
|
+
write("");
|
|
30
|
+
// [2/5] SHELL ENV
|
|
31
|
+
write(stepHeader(2, 5, "SHELL ENV", ui));
|
|
41
32
|
const env = await writeShellEnv(token);
|
|
42
33
|
if (env.shell === "unknown") {
|
|
43
|
-
|
|
44
|
-
console.error(" Add this to your shell config manually:");
|
|
45
|
-
console.error(` export UNFAIRLY_MCP_TOKEN=${token}`);
|
|
34
|
+
write(result("warn", "couldn't detect $SHELL — add manually: export UNFAIRLY_MCP_TOKEN=…", ui));
|
|
46
35
|
}
|
|
47
36
|
else {
|
|
48
|
-
|
|
37
|
+
write(result("ok", `${env.path} · added UNFAIRLY_MCP_TOKEN`, ui));
|
|
49
38
|
}
|
|
50
|
-
|
|
51
|
-
//
|
|
52
|
-
|
|
39
|
+
write("");
|
|
40
|
+
// [3/5] CLAUDE DESKTOP
|
|
41
|
+
// We track host-write errors but DON'T early-exit — a user with a malformed
|
|
42
|
+
// Claude Desktop config should still get Claude Code + Codex wired (the
|
|
43
|
+
// partial success path is far better than zero hosts). We exit non-zero
|
|
44
|
+
// at the end of setup so the user knows something needs attention.
|
|
45
|
+
write(stepHeader(3, 5, "CLAUDE DESKTOP", ui));
|
|
46
|
+
const cd = await configureClaudeDesktop(apiUrl, token);
|
|
47
|
+
write(formatClaudeDesktop(cd, ui));
|
|
48
|
+
write("");
|
|
49
|
+
// [4/5] CLAUDE CODE · CODEX
|
|
50
|
+
write(stepHeader(4, 5, "CLAUDE CODE · CODEX", ui));
|
|
51
|
+
const cc = await configureClaudeCode(apiUrl, token);
|
|
52
|
+
write(formatClaudeCode(cc, ui));
|
|
53
53
|
const codex = await configureCodex(apiUrl);
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
//
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
54
|
+
write(formatCodex(codex, ui));
|
|
55
|
+
write("");
|
|
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.
|
|
60
|
+
write(stepHeader(5, 5, "HANDSHAKE", 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}`);
|
|
63
69
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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));
|
|
68
93
|
process.exit(2);
|
|
69
94
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if
|
|
77
|
-
|
|
78
|
-
|
|
95
|
+
write("");
|
|
96
|
+
write(divider(ui));
|
|
97
|
+
write("");
|
|
98
|
+
// If any host write surfaced a real error (not "not-installed"), warn the
|
|
99
|
+
// user clearly and defer a non-zero exit until after init has had a chance
|
|
100
|
+
// to run — that way they at least get a wired token + workspace bind even
|
|
101
|
+
// if one host is busted. The exit happens at the very end of runSetup.
|
|
102
|
+
const hostErrors = [];
|
|
103
|
+
if (cd.status === "error")
|
|
104
|
+
hostErrors.push(`Claude Desktop: ${cd.message}`);
|
|
105
|
+
if (cc.status === "error")
|
|
106
|
+
hostErrors.push(`Claude Code: ${cc.message}`);
|
|
107
|
+
if (codex.status === "error")
|
|
108
|
+
hostErrors.push(`Codex: ${codex.message}`);
|
|
109
|
+
if (hostErrors.length > 0) {
|
|
110
|
+
write(result("warn", `${hostErrors.length} host(s) failed to wire — fix and re-run \`unfairly setup\`:`, ui));
|
|
111
|
+
for (const m of hostErrors)
|
|
112
|
+
write(result("warn", ` ${m}`, ui));
|
|
113
|
+
write("");
|
|
79
114
|
}
|
|
80
|
-
|
|
81
|
-
|
|
115
|
+
// Chain into init when caller asked AND cwd is a repo.
|
|
116
|
+
let workspaceBound = null;
|
|
117
|
+
if (opts.chainInit) {
|
|
118
|
+
const { findRepoRoot } = await import("../sync/repo-root.js");
|
|
119
|
+
const repoRoot = await findRepoRoot(process.cwd());
|
|
120
|
+
if (repoRoot) {
|
|
121
|
+
write(`${c.coral("▶")} repo detected: ${c.dim(repoRoot)}`);
|
|
122
|
+
let shouldBind = Boolean(opts.yes);
|
|
123
|
+
if (!opts.yes) {
|
|
124
|
+
const { createInterface } = await import("node:readline/promises");
|
|
125
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
126
|
+
const ans = await rl.question(` ${c.dim("◆")} Bind .unfairly/ here? [Y/n] `);
|
|
127
|
+
rl.close();
|
|
128
|
+
const v = ans.trim().toLowerCase();
|
|
129
|
+
shouldBind = v === "" || v === "y" || v === "yes";
|
|
130
|
+
}
|
|
131
|
+
if (shouldBind) {
|
|
132
|
+
const { runInit } = await import("./init.js");
|
|
133
|
+
await runInit({ assumeAuthed: true, yes: true, token });
|
|
134
|
+
try {
|
|
135
|
+
const { readManifest } = await import("../sync/manifest.js");
|
|
136
|
+
const m = await readManifest(process.cwd());
|
|
137
|
+
if (m) {
|
|
138
|
+
const vaultCount = Object.keys(m.vaults).length;
|
|
139
|
+
const docCount = Object.values(m.vaults).reduce((s, v) => s + Object.keys(v.docs).length, 0);
|
|
140
|
+
workspaceBound = { vaultCount, docCount };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// best-effort summary
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
write(result("skip", "skipped workspace bind — re-run `unfairly` in any repo to bind later", ui));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
82
151
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
152
|
+
// Hand-off card
|
|
153
|
+
const { handoffCard } = await import("../ui/screens.js");
|
|
154
|
+
const card = handoffCard({
|
|
155
|
+
vaultCount: workspaceBound?.vaultCount ?? 0,
|
|
156
|
+
docCount: workspaceBound?.docCount ?? 0,
|
|
157
|
+
recentMove: null,
|
|
158
|
+
hint: "open Claude Desktop — say anything",
|
|
159
|
+
}, ui);
|
|
160
|
+
write(card);
|
|
161
|
+
write("");
|
|
162
|
+
write(` ${c.dim("re-run")} ${c.bold("unfairly")} ${c.dim("anytime to see what your team's up to.")}`);
|
|
163
|
+
// Deferred non-zero exit if any host failed to write. The user got the
|
|
164
|
+
// partial-success card with errors listed above; CI/scripts can still
|
|
165
|
+
// detect the failure via the exit code.
|
|
166
|
+
if (hostErrors.length > 0) {
|
|
167
|
+
process.exit(2);
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
ok: true,
|
|
171
|
+
token,
|
|
172
|
+
hosts: { claudeDesktop: cd, claudeCode: cc, codex },
|
|
173
|
+
};
|
|
86
174
|
}
|
|
87
|
-
|
|
175
|
+
// --- formatters ---
|
|
176
|
+
function formatClaudeDesktop(r, ui) {
|
|
88
177
|
switch (r.status) {
|
|
89
178
|
case "configured":
|
|
90
|
-
return
|
|
179
|
+
return result("ok", `${r.path}`, ui);
|
|
91
180
|
case "not-installed":
|
|
92
|
-
return
|
|
181
|
+
return result("skip", `Claude Desktop not detected (${r.path}) — install and re-run`, ui);
|
|
93
182
|
case "error":
|
|
94
|
-
return
|
|
183
|
+
return result("err", `${r.path} — ${r.message}`, ui);
|
|
95
184
|
}
|
|
96
185
|
}
|
|
97
|
-
function formatClaudeCode(r) {
|
|
186
|
+
function formatClaudeCode(r, ui) {
|
|
98
187
|
switch (r.status) {
|
|
99
188
|
case "configured":
|
|
100
|
-
return
|
|
101
|
-
case "already-registered":
|
|
102
|
-
return `· Claude Code — ${r.message}`;
|
|
189
|
+
return result("ok", `${r.path}`, ui);
|
|
103
190
|
case "not-installed":
|
|
104
|
-
return "
|
|
191
|
+
return result("skip", "Claude Code (`claude` binary) not detected", ui);
|
|
105
192
|
case "error":
|
|
106
|
-
return
|
|
193
|
+
return result("err", r.message, ui);
|
|
107
194
|
}
|
|
108
195
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
196
|
+
function formatCodex(r, ui) {
|
|
197
|
+
switch (r.status) {
|
|
198
|
+
case "configured":
|
|
199
|
+
return result("ok", `${r.path}`, ui);
|
|
200
|
+
case "not-installed":
|
|
201
|
+
return result("skip", `Codex not detected at ${r.path}`, ui);
|
|
202
|
+
case "error":
|
|
203
|
+
return result("err", `${r.path} — ${r.message}`, ui);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
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) {
|
|
117
213
|
const url = `${apiUrl.replace(/\/$/, "")}/api/mcp`;
|
|
118
214
|
try {
|
|
119
215
|
const res = await fetch(url, {
|
|
120
216
|
method: "POST",
|
|
121
217
|
headers: {
|
|
122
|
-
Authorization:
|
|
218
|
+
Authorization: authorization,
|
|
123
219
|
"Content-Type": "application/json",
|
|
124
220
|
Accept: "application/json, text/event-stream",
|
|
125
221
|
},
|
|
@@ -130,13 +226,12 @@ async function verifyToken(apiUrl, token) {
|
|
|
130
226
|
params: {
|
|
131
227
|
protocolVersion: "2024-11-05",
|
|
132
228
|
capabilities: {},
|
|
133
|
-
clientInfo: { name: "unfairly-setup", version: "0.
|
|
229
|
+
clientInfo: { name: "unfairly-setup", version: "0.6.1" },
|
|
134
230
|
},
|
|
135
231
|
}),
|
|
136
232
|
});
|
|
137
|
-
if (res.status !== 200)
|
|
233
|
+
if (res.status !== 200)
|
|
138
234
|
return { ok: false, message: `HTTP ${res.status}` };
|
|
139
|
-
}
|
|
140
235
|
const text = await res.text();
|
|
141
236
|
if (!text.includes('"result"') || !text.includes("protocolVersion")) {
|
|
142
237
|
return { ok: false, message: "unexpected response shape" };
|
|
@@ -144,8 +239,93 @@ async function verifyToken(apiUrl, token) {
|
|
|
144
239
|
return { ok: true };
|
|
145
240
|
}
|
|
146
241
|
catch (e) {
|
|
147
|
-
|
|
148
|
-
|
|
242
|
+
return { ok: false, message: e.message };
|
|
243
|
+
}
|
|
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
|
+
};
|
|
149
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}`);
|
|
150
330
|
}
|
|
151
331
|
//# sourceMappingURL=setup.js.map
|
package/dist/cmd/setup.js.map
CHANGED
|
@@ -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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-card.d.ts","sourceRoot":"","sources":["../../src/cmd/status-card.ts"],"names":[],"mappings":"AAUA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA+BnD"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import { readManifest } from "../sync/manifest.js";
|
|
5
|
+
import { getToken } from "../sync/credentials.js";
|
|
6
|
+
import { configPath as claudeDesktopPath } from "../hosts/claude-desktop.js";
|
|
7
|
+
import { banner, statusCard, defaultOpts } from "../ui/screens.js";
|
|
8
|
+
const DEFAULT_API = "https://app.unfairly.ai";
|
|
9
|
+
export async function runStatusCard() {
|
|
10
|
+
const cwd = process.cwd();
|
|
11
|
+
const ui = defaultOpts();
|
|
12
|
+
const write = (s) => process.stdout.write(`${s}\n`);
|
|
13
|
+
const apiUrl = process.env.UNFAIRLY_API_URL ?? DEFAULT_API;
|
|
14
|
+
const hosts = {
|
|
15
|
+
claudeDesktop: await checkClaudeDesktop(),
|
|
16
|
+
claudeCode: await checkClaudeCode(),
|
|
17
|
+
codex: await checkCodex(),
|
|
18
|
+
};
|
|
19
|
+
const manifest = await readManifest(cwd);
|
|
20
|
+
const workspace = manifest
|
|
21
|
+
? {
|
|
22
|
+
cwd,
|
|
23
|
+
vaultCount: Object.keys(manifest.vaults).length,
|
|
24
|
+
docCount: Object.values(manifest.vaults).reduce((s, v) => s + Object.keys(v.docs).length, 0),
|
|
25
|
+
lastPulledAt: latestPullTimestamp(manifest),
|
|
26
|
+
}
|
|
27
|
+
: null;
|
|
28
|
+
// Recent moves: best-effort enter_org. Silent on failure.
|
|
29
|
+
const recent = await fetchRecentMoves(apiUrl).catch(() => []);
|
|
30
|
+
const state = { hosts, workspace, recent };
|
|
31
|
+
write(banner(ui));
|
|
32
|
+
write("");
|
|
33
|
+
write(statusCard(state, ui));
|
|
34
|
+
write("");
|
|
35
|
+
}
|
|
36
|
+
async function checkClaudeDesktop() {
|
|
37
|
+
// "wired" requires the full canonical block: type=http, url ending in
|
|
38
|
+
// /api/mcp, and a bearer-style Authorization header. A stale entry with
|
|
39
|
+
// the right URL but wrong transport or missing auth is "rotted", not wired.
|
|
40
|
+
const p = claudeDesktopPath();
|
|
41
|
+
if (!p)
|
|
42
|
+
return "missing";
|
|
43
|
+
try {
|
|
44
|
+
const raw = await fs.readFile(p, "utf8");
|
|
45
|
+
const parsed = JSON.parse(raw);
|
|
46
|
+
const u = parsed?.mcpServers?.unfairly;
|
|
47
|
+
if (!u)
|
|
48
|
+
return "missing";
|
|
49
|
+
const typeOk = u.type === "http";
|
|
50
|
+
const urlOk = typeof u.url === "string" && u.url.endsWith("/api/mcp");
|
|
51
|
+
const auth = u.headers?.Authorization;
|
|
52
|
+
const authOk = typeof auth === "string" && /^Bearer\s+\S+/.test(auth);
|
|
53
|
+
if (typeOk && urlOk && authOk)
|
|
54
|
+
return "wired";
|
|
55
|
+
return "rotted";
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return "missing";
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Claude Code stores MCP servers in a per-user JSON config.
|
|
63
|
+
* We do NOT shell out to the claude binary — file inspection is faster and
|
|
64
|
+
* does not depend on the claude binary being on PATH.
|
|
65
|
+
*/
|
|
66
|
+
async function checkClaudeCode() {
|
|
67
|
+
// Inspect only:
|
|
68
|
+
// 1. Global mcpServers.unfairly (machine-wide registration)
|
|
69
|
+
// 2. projects[cwd].mcpServers.unfairly (this-workspace registration)
|
|
70
|
+
// Do NOT walk every project entry — a sibling project's "unfairly" entry
|
|
71
|
+
// is not evidence the current workspace is wired.
|
|
72
|
+
const home = os.homedir();
|
|
73
|
+
const cwd = process.cwd();
|
|
74
|
+
const candidates = [
|
|
75
|
+
path.join(home, ".claude.json"),
|
|
76
|
+
path.join(home, ".config", "claude", "config.json"),
|
|
77
|
+
];
|
|
78
|
+
for (const p of candidates) {
|
|
79
|
+
try {
|
|
80
|
+
const raw = await fs.readFile(p, "utf8");
|
|
81
|
+
const parsed = JSON.parse(raw);
|
|
82
|
+
// Global scope
|
|
83
|
+
if (parsed?.mcpServers?.unfairly)
|
|
84
|
+
return "wired";
|
|
85
|
+
// Workspace scope: keyed by absolute path
|
|
86
|
+
const workspace = parsed?.projects?.[cwd];
|
|
87
|
+
if (workspace?.mcpServers?.unfairly)
|
|
88
|
+
return "wired";
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// file missing or unparseable; try next candidate
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return "missing";
|
|
95
|
+
}
|
|
96
|
+
async function checkCodex() {
|
|
97
|
+
const p = path.join(os.homedir(), ".codex", "config.toml");
|
|
98
|
+
try {
|
|
99
|
+
const raw = await fs.readFile(p, "utf8");
|
|
100
|
+
return /^\[mcp_servers\.unfairly\]/m.test(raw) ? "wired" : "missing";
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return "missing";
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function latestPullTimestamp(manifest) {
|
|
107
|
+
let latest = null;
|
|
108
|
+
for (const v of Object.values(manifest.vaults)) {
|
|
109
|
+
if (v.last_pulled_at && (!latest || v.last_pulled_at > latest))
|
|
110
|
+
latest = v.last_pulled_at;
|
|
111
|
+
}
|
|
112
|
+
return latest;
|
|
113
|
+
}
|
|
114
|
+
async function fetchRecentMoves(apiUrl) {
|
|
115
|
+
const token = await getToken();
|
|
116
|
+
if (!token)
|
|
117
|
+
return [];
|
|
118
|
+
const url = `${apiUrl.replace(/\/$/, "")}/api/mcp`;
|
|
119
|
+
try {
|
|
120
|
+
const res = await fetch(url, {
|
|
121
|
+
method: "POST",
|
|
122
|
+
headers: {
|
|
123
|
+
Authorization: `Bearer ${token}`,
|
|
124
|
+
"Content-Type": "application/json",
|
|
125
|
+
Accept: "application/json, text/event-stream",
|
|
126
|
+
},
|
|
127
|
+
body: JSON.stringify({
|
|
128
|
+
jsonrpc: "2.0",
|
|
129
|
+
id: 1,
|
|
130
|
+
method: "tools/call",
|
|
131
|
+
params: { name: "enter_org", arguments: {} },
|
|
132
|
+
}),
|
|
133
|
+
});
|
|
134
|
+
if (res.status !== 200)
|
|
135
|
+
return [];
|
|
136
|
+
const text = await res.text();
|
|
137
|
+
// The response is text-formatted. Parse the "RECENT MOVES" block lines like:
|
|
138
|
+
// **bob** · `unfairly-growth` · 1m ago · other
|
|
139
|
+
const moves = [];
|
|
140
|
+
const re = /\*\*(?<who>[^*]+)\*\*\s*·\s*`(?<room>[^`]+)`\s*·\s*(?<ago>[^·\n]+)·/g;
|
|
141
|
+
let m;
|
|
142
|
+
while ((m = re.exec(text)) && moves.length < 5) {
|
|
143
|
+
moves.push({
|
|
144
|
+
who: m.groups.who.trim(),
|
|
145
|
+
room: m.groups.room.trim(),
|
|
146
|
+
ago: m.groups.ago.trim(),
|
|
147
|
+
title: "—",
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return moves;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return [];
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=status-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-card.js","sourceRoot":"","sources":["../../src/cmd/status-card.ts"],"names":[],"mappings":"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"}
|
package/dist/cmd/status.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cmd/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cmd/status.ts"],"names":[],"mappings":"AAKA,wBAAsB,SAAS,kBAuB9B"}
|
package/dist/cmd/status.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { readManifest } from "../sync/manifest.js";
|
|
3
3
|
import { computeSha, readDocRaw } from "../sync/files.js";
|
|
4
|
+
import { banner, defaultOpts } from "../ui/screens.js";
|
|
4
5
|
export async function runStatus() {
|
|
6
|
+
const ui = defaultOpts();
|
|
7
|
+
process.stdout.write(`${banner(ui)}\n\n`);
|
|
5
8
|
const cwd = process.cwd();
|
|
6
9
|
const manifest = await readManifest(cwd);
|
|
7
10
|
if (!manifest) {
|