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.
- package/CHANGELOG.md +29 -0
- package/README.md +45 -1
- package/dist/auth/browser-flow.d.ts +15 -0
- package/dist/auth/browser-flow.d.ts.map +1 -0
- package/dist/auth/browser-flow.js +74 -0
- package/dist/auth/browser-flow.js.map +1 -0
- package/dist/cmd/init.d.ts +10 -0
- package/dist/cmd/init.d.ts.map +1 -0
- package/dist/cmd/init.js +12 -92
- package/dist/cmd/init.js.map +1 -0
- package/dist/cmd/login.d.ts +21 -0
- package/dist/cmd/login.d.ts.map +1 -0
- package/dist/cmd/login.js +13 -67
- package/dist/cmd/login.js.map +1 -0
- package/dist/cmd/mcp.d.ts +2 -0
- package/dist/cmd/mcp.d.ts.map +1 -0
- package/dist/cmd/mcp.js +1 -0
- package/dist/cmd/mcp.js.map +1 -0
- package/dist/cmd/pull.d.ts +2 -0
- package/dist/cmd/pull.d.ts.map +1 -0
- package/dist/cmd/pull.js +9 -0
- package/dist/cmd/pull.js.map +1 -0
- package/dist/cmd/push.d.ts +2 -0
- package/dist/cmd/push.d.ts.map +1 -0
- package/dist/cmd/push.js +1 -0
- package/dist/cmd/push.js.map +1 -0
- package/dist/cmd/resolve.d.ts +2 -0
- package/dist/cmd/resolve.d.ts.map +1 -0
- package/dist/cmd/resolve.js +1 -0
- package/dist/cmd/resolve.js.map +1 -0
- package/dist/cmd/setup.d.ts +20 -0
- package/dist/cmd/setup.d.ts.map +1 -0
- package/dist/cmd/setup.js +151 -0
- package/dist/cmd/setup.js.map +1 -0
- package/dist/cmd/status.d.ts +2 -0
- package/dist/cmd/status.d.ts.map +1 -0
- package/dist/cmd/status.js +1 -0
- package/dist/cmd/status.js.map +1 -0
- package/dist/cmd/watch.d.ts +2 -0
- package/dist/cmd/watch.d.ts.map +1 -0
- package/dist/cmd/watch.js +1 -0
- package/dist/cmd/watch.js.map +1 -0
- package/dist/hosts/claude-code.d.ts +23 -0
- package/dist/hosts/claude-code.d.ts.map +1 -0
- package/dist/hosts/claude-code.js +44 -0
- package/dist/hosts/claude-code.js.map +1 -0
- package/dist/hosts/codex.d.ts +39 -0
- package/dist/hosts/codex.d.ts.map +1 -0
- package/dist/hosts/codex.js +97 -0
- package/dist/hosts/codex.js.map +1 -0
- package/dist/hosts/shell-env.d.ts +16 -0
- package/dist/hosts/shell-env.d.ts.map +1 -0
- package/dist/hosts/shell-env.js +81 -0
- package/dist/hosts/shell-env.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/client.d.ts +46 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +58 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/events/emit.d.ts +16 -0
- package/dist/lib/events/emit.d.ts.map +1 -0
- package/dist/lib/events/emit.js +27 -0
- package/dist/lib/events/emit.js.map +1 -0
- package/dist/lib/index.d.ts +13 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +11 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/transport.d.ts +46 -0
- package/dist/lib/transport.d.ts.map +1 -0
- package/dist/lib/transport.js +85 -0
- package/dist/lib/transport.js.map +1 -0
- package/dist/lib/types/index.d.ts +167 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/types/index.js +50 -0
- package/dist/lib/types/index.js.map +1 -0
- package/dist/lib/vault/checkpoint.d.ts +12 -0
- package/dist/lib/vault/checkpoint.d.ts.map +1 -0
- package/dist/lib/vault/checkpoint.js +18 -0
- package/dist/lib/vault/checkpoint.js.map +1 -0
- package/dist/lib/vault/read.d.ts +4 -0
- package/dist/lib/vault/read.d.ts.map +1 -0
- package/dist/lib/vault/read.js +9 -0
- package/dist/lib/vault/read.js.map +1 -0
- package/dist/lib/vault/search.d.ts +8 -0
- package/dist/lib/vault/search.d.ts.map +1 -0
- package/dist/lib/vault/search.js +10 -0
- package/dist/lib/vault/search.js.map +1 -0
- package/dist/sync/api.d.ts +80 -0
- package/dist/sync/api.d.ts.map +1 -0
- package/dist/sync/api.js +1 -0
- package/dist/sync/api.js.map +1 -0
- package/dist/sync/autoloader.d.ts +7 -0
- package/dist/sync/autoloader.d.ts.map +1 -0
- package/dist/sync/autoloader.js +138 -0
- package/dist/sync/autoloader.js.map +1 -0
- package/dist/sync/conflict.d.ts +12 -0
- package/dist/sync/conflict.d.ts.map +1 -0
- package/dist/sync/conflict.js +1 -0
- package/dist/sync/conflict.js.map +1 -0
- package/dist/sync/credentials.d.ts +8 -0
- package/dist/sync/credentials.d.ts.map +1 -0
- package/dist/sync/credentials.js +1 -0
- package/dist/sync/credentials.js.map +1 -0
- package/dist/sync/files.d.ts +43 -0
- package/dist/sync/files.d.ts.map +1 -0
- package/dist/sync/files.js +1 -0
- package/dist/sync/files.js.map +1 -0
- package/dist/sync/manifest.d.ts +31 -0
- package/dist/sync/manifest.d.ts.map +1 -0
- package/dist/sync/manifest.js +1 -0
- package/dist/sync/manifest.js.map +1 -0
- 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
|
-
│ └──
|
|
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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,YAAY,GAAG,2kBAA2kB,CAAC;AAEjmB,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,MAAM,GACV,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,UAAU,CAAC;IACnB,MAAM,IAAI,GACR,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,IAAI,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAOD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,OAA2B,EAAE;IAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,cAAc,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,MAAM,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE3D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,OAAO,GAAG,CAAC,GAAkB,EAAE,EAAE;YACrC,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;YACxD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YACD,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACtD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,SAAS,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,GAAG;iBACA,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC;iBAC9D,GAAG,CAAC,YAAY,CAAC,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;QAC3D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,EAAE,GAAG,oBAAoB,IAAI,OAAO,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAC7C,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACzC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC5C,OAAO,CAAC,KAAK,CACX,sCAAsC,OAAO,CAAC,QAAQ,EAAE,gDAAgD,CACzG,CAAC;YACF,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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
|
-
//
|
|
197
|
-
|
|
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
|
|
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
|
-
*
|
|
71
|
-
*
|
|
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("
|
|
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 @@
|
|
|
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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/cmd/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/cmd/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
package/dist/cmd/resolve.js
CHANGED
|
@@ -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"}
|