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
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export type PullDoc = {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
slug: string;
|
|
5
|
+
markdown_content: string | null;
|
|
6
|
+
summary: string | null;
|
|
7
|
+
trust_tier: string;
|
|
8
|
+
role: string | null;
|
|
9
|
+
source_url: string | null;
|
|
10
|
+
source_type: string | null;
|
|
11
|
+
updated_at: string;
|
|
12
|
+
sections: {
|
|
13
|
+
name: string;
|
|
14
|
+
} | null;
|
|
15
|
+
};
|
|
16
|
+
export type PullResponse = {
|
|
17
|
+
vault: {
|
|
18
|
+
id: string;
|
|
19
|
+
slug: string;
|
|
20
|
+
name: string;
|
|
21
|
+
};
|
|
22
|
+
docs: PullDoc[];
|
|
23
|
+
deleted: Array<{
|
|
24
|
+
id: string;
|
|
25
|
+
last_known_path: string;
|
|
26
|
+
deleted_at: string;
|
|
27
|
+
}>;
|
|
28
|
+
next_cursor: string | null;
|
|
29
|
+
has_more: boolean;
|
|
30
|
+
};
|
|
31
|
+
export type RejectedKey = {
|
|
32
|
+
key: string;
|
|
33
|
+
server_value: unknown;
|
|
34
|
+
client_value: unknown;
|
|
35
|
+
reason: string;
|
|
36
|
+
};
|
|
37
|
+
export type PushResponse = {
|
|
38
|
+
ok: true;
|
|
39
|
+
updated_at: string;
|
|
40
|
+
rejected_frontmatter: RejectedKey[];
|
|
41
|
+
} | {
|
|
42
|
+
error: "stale";
|
|
43
|
+
server_updated_at: string;
|
|
44
|
+
server_body: string;
|
|
45
|
+
server_frontmatter: Record<string, unknown>;
|
|
46
|
+
rejected_frontmatter: RejectedKey[];
|
|
47
|
+
} | {
|
|
48
|
+
error: string;
|
|
49
|
+
};
|
|
50
|
+
export type StatusResponse = {
|
|
51
|
+
vaults: Array<{
|
|
52
|
+
id: string;
|
|
53
|
+
slug: string;
|
|
54
|
+
name: string;
|
|
55
|
+
track_in_git: boolean;
|
|
56
|
+
doc_count: number;
|
|
57
|
+
latest_updated_at: string | null;
|
|
58
|
+
}>;
|
|
59
|
+
};
|
|
60
|
+
export declare class SyncClient {
|
|
61
|
+
private apiUrl;
|
|
62
|
+
private token;
|
|
63
|
+
constructor(apiUrl: string, token: string);
|
|
64
|
+
private headers;
|
|
65
|
+
pull(vault: string, since: string | null): Promise<PullResponse>;
|
|
66
|
+
/** Loop pull until has_more=false, merging pages. */
|
|
67
|
+
pullAll(vault: string, since: string | null): Promise<PullResponse>;
|
|
68
|
+
push(args: {
|
|
69
|
+
vault: string;
|
|
70
|
+
doc_id: string;
|
|
71
|
+
expected_updated_at: string | null;
|
|
72
|
+
body: string;
|
|
73
|
+
client_frontmatter?: Record<string, unknown>;
|
|
74
|
+
}): Promise<{
|
|
75
|
+
status: number;
|
|
76
|
+
data: PushResponse;
|
|
77
|
+
}>;
|
|
78
|
+
status(): Promise<StatusResponse>;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/sync/api.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/api.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/sync/api.ts"],"names":[],"mappings":"AAmDA,MAAM,OAAO,UAAU;IAEX;IACA;IAFV,YACU,MAAc,EACd,KAAa;QADb,WAAM,GAAN,MAAM,CAAQ;QACd,UAAK,GAAL,KAAK,CAAQ;IACpB,CAAC;IAEI,OAAO;QACb,OAAO;YACL,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YACrC,cAAc,EAAE,kBAAkB;SACnC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,KAAoB;QAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,gBAAgB,CAAC,CAAC;QACpD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,KAAK;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAA2B,CAAC;IAC7C,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,KAAoB;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YACtC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAClC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAMV;QACC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,gBAAgB,EAAE;YACtD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;YACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiB,EAAE,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,kBAAkB,EAAE;YACxD,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAA6B,CAAC;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Manifest } from "./manifest.js";
|
|
2
|
+
/**
|
|
3
|
+
* After `unfairly pull` populates .unfairly/, scan local files, parse
|
|
4
|
+
* frontmatter, build the autoloader index, and write CLAUDE.md + .gitignore.
|
|
5
|
+
*/
|
|
6
|
+
export declare function writeAutoloader(unfairlyRoot: string, manifest: Manifest): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=autoloader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoloader.d.ts","sourceRoot":"","sources":["../../src/sync/autoloader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,eAAe,CAAC;AAc7D;;;GAGG;AACH,wBAAsB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB7F"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import matter from "gray-matter";
|
|
4
|
+
const SENTINEL_HEADER = "# Unfairly Vault Context (auto-generated by `unfairly`)";
|
|
5
|
+
const GENERATED_CLAUDE_MD = "CLAUDE.md";
|
|
6
|
+
/**
|
|
7
|
+
* After `unfairly pull` populates .unfairly/, scan local files, parse
|
|
8
|
+
* frontmatter, build the autoloader index, and write CLAUDE.md + .gitignore.
|
|
9
|
+
*/
|
|
10
|
+
export async function writeAutoloader(unfairlyRoot, manifest) {
|
|
11
|
+
const docs = await scanLocalDocs(unfairlyRoot, manifest);
|
|
12
|
+
const goldPrimitives = docs
|
|
13
|
+
.filter((d) => d.trust_tier === "gold" && d.role === "primitive")
|
|
14
|
+
.sort((a, b) => (b.updated_at ?? "").localeCompare(a.updated_at ?? ""))
|
|
15
|
+
.slice(0, 8);
|
|
16
|
+
const recentSilver = docs
|
|
17
|
+
.filter((d) => d.trust_tier === "silver")
|
|
18
|
+
.sort((a, b) => (b.updated_at ?? "").localeCompare(a.updated_at ?? ""))
|
|
19
|
+
.slice(0, 5);
|
|
20
|
+
const claudeMd = renderClaudeMd(goldPrimitives, recentSilver);
|
|
21
|
+
await fs.writeFile(path.join(unfairlyRoot, GENERATED_CLAUDE_MD), claudeMd, "utf8");
|
|
22
|
+
// .gitignore: write only if missing. The generated file invites users to
|
|
23
|
+
// uncomment !vault/ re-includes — regenerating on every pull would wipe them.
|
|
24
|
+
const gitignorePath = path.join(unfairlyRoot, ".gitignore");
|
|
25
|
+
try {
|
|
26
|
+
await fs.access(gitignorePath);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
await fs.writeFile(gitignorePath, renderGitignore(), "utf8");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function scanLocalDocs(root, manifest) {
|
|
33
|
+
const entries = [];
|
|
34
|
+
// manifest.vaults is Record<string, ManifestVault> keyed by slug.
|
|
35
|
+
for (const vault of Object.values(manifest.vaults)) {
|
|
36
|
+
// Repo-bound vaults live at the root; non-tracked vaults live under cache/.
|
|
37
|
+
const vaultRoot = vault.track_in_git
|
|
38
|
+
? path.join(root, vault.slug)
|
|
39
|
+
: path.join(root, "cache", vault.slug);
|
|
40
|
+
try {
|
|
41
|
+
await walkAndParse(vaultRoot, root, vault.slug, entries);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Vault dir doesn't exist yet (e.g., empty vault) — fine, skip.
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return entries;
|
|
48
|
+
}
|
|
49
|
+
async function walkAndParse(dir, unfairlyRoot, vaultSlug, out) {
|
|
50
|
+
const generatedRootPath = path.join(unfairlyRoot, GENERATED_CLAUDE_MD);
|
|
51
|
+
const items = await fs.readdir(dir, { withFileTypes: true });
|
|
52
|
+
for (const item of items) {
|
|
53
|
+
const full = path.join(dir, item.name);
|
|
54
|
+
if (item.isDirectory()) {
|
|
55
|
+
await walkAndParse(full, unfairlyRoot, vaultSlug, out);
|
|
56
|
+
}
|
|
57
|
+
else if (item.name.endsWith(".md")) {
|
|
58
|
+
// Skip ONLY our own generated file (not user docs that happen to be named CLAUDE.md).
|
|
59
|
+
if (path.resolve(full) === path.resolve(generatedRootPath))
|
|
60
|
+
continue;
|
|
61
|
+
try {
|
|
62
|
+
const raw = await fs.readFile(full, "utf8");
|
|
63
|
+
const { data } = matter(raw);
|
|
64
|
+
// Normalize to forward slashes — @-import processors expect POSIX-style paths.
|
|
65
|
+
const relative = path.relative(unfairlyRoot, full).split(path.sep).join("/");
|
|
66
|
+
// gray-matter / js-yaml auto-coerces ISO 8601 timestamps to Date — normalize to string.
|
|
67
|
+
const updatedAtRaw = data.updated_at;
|
|
68
|
+
const updated_at = updatedAtRaw instanceof Date
|
|
69
|
+
? updatedAtRaw.toISOString()
|
|
70
|
+
: typeof updatedAtRaw === "string"
|
|
71
|
+
? updatedAtRaw
|
|
72
|
+
: undefined;
|
|
73
|
+
out.push({
|
|
74
|
+
relativePath: relative,
|
|
75
|
+
trust_tier: typeof data.trust_tier === "string" ? data.trust_tier : undefined,
|
|
76
|
+
role: typeof data.role === "string" ? data.role : undefined,
|
|
77
|
+
updated_at,
|
|
78
|
+
vaultSlug,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Unparseable (malformed YAML, encoding) — skip.
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function renderClaudeMd(gold, silver) {
|
|
88
|
+
const lines = [];
|
|
89
|
+
lines.push(SENTINEL_HEADER);
|
|
90
|
+
lines.push("");
|
|
91
|
+
lines.push("This directory mirrors your accessible Unfairly vaults. Files below are");
|
|
92
|
+
lines.push("the active canon — read them before answering questions about this team's");
|
|
93
|
+
lines.push("architecture, decisions, brand, or in-flight work.");
|
|
94
|
+
lines.push("");
|
|
95
|
+
lines.push("## Canon (gold, top primitives)");
|
|
96
|
+
if (gold.length === 0) {
|
|
97
|
+
lines.push("(No gold primitives in your accessible vaults yet. Run `unfairly pull` after the team seeds canon docs.)");
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
for (const d of gold)
|
|
101
|
+
lines.push(`@${d.relativePath}`);
|
|
102
|
+
}
|
|
103
|
+
lines.push("");
|
|
104
|
+
lines.push("## Working knowledge (silver, recently touched)");
|
|
105
|
+
if (silver.length === 0) {
|
|
106
|
+
lines.push("(No recent silver docs.)");
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
for (const d of silver)
|
|
110
|
+
lines.push(`@${d.relativePath}`);
|
|
111
|
+
}
|
|
112
|
+
lines.push("");
|
|
113
|
+
lines.push("## Conventions");
|
|
114
|
+
lines.push("- Trust tier = audience signal, not visibility filter. All tiers are working memory.");
|
|
115
|
+
lines.push("- This file is regenerated on every `unfairly init` or `unfairly pull`.");
|
|
116
|
+
lines.push(" Don't hand-edit — your changes will be overwritten.");
|
|
117
|
+
lines.push("- For real-time multiplayer state (current checkpoints, applied edits,");
|
|
118
|
+
lines.push(" pending proposals, online teammates), call `enter_org` via MCP.");
|
|
119
|
+
lines.push(" This filesystem mirror is static-as-of-last-pull.");
|
|
120
|
+
return lines.join("\n") + "\n";
|
|
121
|
+
}
|
|
122
|
+
function renderGitignore() {
|
|
123
|
+
return `# Default: ignore everything in this directory.
|
|
124
|
+
# .unfairly/ is a local cache of vault content. By default, none of it is
|
|
125
|
+
# committed — agents read from disk; the source of truth is in cloud vaults.
|
|
126
|
+
*
|
|
127
|
+
|
|
128
|
+
# Re-include the autoloader and this gitignore so Claude Code finds them:
|
|
129
|
+
!CLAUDE.md
|
|
130
|
+
!.gitignore
|
|
131
|
+
|
|
132
|
+
# If you WANT a specific vault tracked in git (e.g., a repo-bound vault
|
|
133
|
+
# whose docs should be versioned alongside code), add explicit re-includes:
|
|
134
|
+
# !unfairly-app/
|
|
135
|
+
# !unfairly-app/**
|
|
136
|
+
`;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=autoloader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoloader.js","sourceRoot":"","sources":["../../src/sync/autoloader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a three-way merge file: server frontmatter (always wins for
|
|
3
|
+
* authoritative keys), then a conflict-marked body section. The user
|
|
4
|
+
* (or their agent) edits to remove markers, then runs `unfairly resolve`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildConflictFile(args: {
|
|
7
|
+
serverFrontmatter: Record<string, unknown>;
|
|
8
|
+
localBody: string;
|
|
9
|
+
serverBody: string;
|
|
10
|
+
serverUpdatedAt: string;
|
|
11
|
+
}): string;
|
|
12
|
+
//# sourceMappingURL=conflict.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict.d.ts","sourceRoot":"","sources":["../../src/sync/conflict.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,MAAM,CAQT"}
|
package/dist/sync/conflict.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict.js","sourceRoot":"","sources":["../../src/sync/conflict.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAKjC;IACC,MAAM,YAAY,GAAG;EACrB,IAAI,CAAC,SAAS;;EAEd,IAAI,CAAC,UAAU;4BACW,IAAI,CAAC,eAAe;CAC/C,CAAC;IACA,OAAO,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Try OS keychain via keytar; if unavailable (Linux without libsecret, CI,
|
|
3
|
+
* etc.), fall back to a 0600 file in ~/.unfairly/credentials.
|
|
4
|
+
*/
|
|
5
|
+
export declare function getToken(): Promise<string | null>;
|
|
6
|
+
export declare function setToken(token: string): Promise<void>;
|
|
7
|
+
export declare function clearToken(): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/sync/credentials.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAavD;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3D;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAQhD"}
|
package/dist/sync/credentials.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/sync/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,OAAO,GAAG,UAAU,CAAC;AAC3B,MAAM,OAAO,GAAG,SAAS,CAAC;AAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAE1E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;QAChD,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;IACD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAa;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;QAChD,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IACD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;QAChD,MAAM,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export type DocFile = {
|
|
2
|
+
frontmatter: Record<string, unknown>;
|
|
3
|
+
body: string;
|
|
4
|
+
};
|
|
5
|
+
export type DocServer = {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
slug: string;
|
|
9
|
+
markdown_content: string | null;
|
|
10
|
+
trust_tier: string;
|
|
11
|
+
role: string | null;
|
|
12
|
+
source_url: string | null;
|
|
13
|
+
source_type: string | null;
|
|
14
|
+
updated_at: string;
|
|
15
|
+
sections?: {
|
|
16
|
+
name: string;
|
|
17
|
+
} | null;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Sha of the canonical rendered file content. Pass the full markdown
|
|
21
|
+
* (frontmatter + body, as written to disk). Trailing whitespace is
|
|
22
|
+
* normalized so write→read round-trips don't trip false-dirty.
|
|
23
|
+
*/
|
|
24
|
+
export declare function computeSha(rendered: string): string;
|
|
25
|
+
/** Build a relative path for a doc within a vault directory. */
|
|
26
|
+
export declare function docPath(vaultSlug: string, sectionName: string | null, slug: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Build the markdown file content for a server-side doc. The caller
|
|
29
|
+
* substitutes the vaultSlug into `path` after this returns; we leave it
|
|
30
|
+
* generic so the same builder works for both tracked and cached vault
|
|
31
|
+
* roots.
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildFileFromServer(doc: DocServer, vaultRoot: string): {
|
|
34
|
+
path: string;
|
|
35
|
+
content: string;
|
|
36
|
+
sha: string;
|
|
37
|
+
};
|
|
38
|
+
/** Read the raw file content (frontmatter + body, no parsing). */
|
|
39
|
+
export declare function readDocRaw(absPath: string): Promise<string>;
|
|
40
|
+
export declare function readDocFile(absPath: string): Promise<DocFile>;
|
|
41
|
+
/** Atomic write (tmp + rename). */
|
|
42
|
+
export declare function writeDocFile(absPath: string, content: string): Promise<void>;
|
|
43
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/sync/files.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,OAAO,GAAG;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAInD;AASD,gEAAgE;AAChE,wBAAgB,OAAO,CACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,IAAI,EAAE,MAAM,GACX,MAAM,CAGR;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAmBhD;AAED,kEAAkE;AAClE,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjE;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,mCAAmC;AACnC,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
package/dist/sync/files.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/sync/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type ManifestDocEntry = {
|
|
2
|
+
slug: string;
|
|
3
|
+
path: string;
|
|
4
|
+
sha: string;
|
|
5
|
+
updated_at: string;
|
|
6
|
+
source_type: string;
|
|
7
|
+
};
|
|
8
|
+
export type ManifestVault = {
|
|
9
|
+
id: string;
|
|
10
|
+
slug: string;
|
|
11
|
+
name: string;
|
|
12
|
+
track_in_git: boolean;
|
|
13
|
+
last_pulled_at: string | null;
|
|
14
|
+
last_pushed_at: string | null;
|
|
15
|
+
docs: Record<string, ManifestDocEntry>;
|
|
16
|
+
};
|
|
17
|
+
export type Manifest = {
|
|
18
|
+
version: 1;
|
|
19
|
+
api_url: string;
|
|
20
|
+
vaults: Record<string, ManifestVault>;
|
|
21
|
+
generated_at: string;
|
|
22
|
+
};
|
|
23
|
+
export declare function manifestPath(rootDir: string): string;
|
|
24
|
+
export declare function readManifest(rootDir: string): Promise<Manifest | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Atomic write: tmp file → fsync → rename. Rename is atomic on POSIX,
|
|
27
|
+
* preventing a half-written manifest if the process is killed mid-write.
|
|
28
|
+
*/
|
|
29
|
+
export declare function writeManifest(rootDir: string, m: Manifest): Promise<void>;
|
|
30
|
+
export declare function emptyManifest(apiUrl: string): Manifest;
|
|
31
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/sync/manifest.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAIF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAQ5E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,CAAC,EAAE,QAAQ,GACV,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAOtD"}
|
package/dist/sync/manifest.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/sync/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AA2B7B,MAAM,aAAa,GAAG,eAAe,CAAC;AAEtC,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe;IAChD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;IACrC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,CAAW;IAEX,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,GAAG,MAAM,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO;QACL,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACvC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unfairly",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "CLI + stdio MCP for
|
|
5
|
-
"keywords": ["unfairly", "mcp", "ai", "context", "agents", "knowledge-base", "claude", "codex"],
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "CLI + stdio MCP + library SDK for the Unfairly multiplayer context layer — sync vaults, run agents, emit events",
|
|
5
|
+
"keywords": ["unfairly", "mcp", "ai", "context", "agents", "knowledge-base", "claude", "codex", "sdk"],
|
|
6
6
|
"homepage": "https://unfairly.ai",
|
|
7
7
|
"repository": { "type": "git", "url": "git+https://github.com/Unfairly-AI/unfairly-app.git", "directory": "cli" },
|
|
8
8
|
"bugs": { "url": "https://github.com/Unfairly-AI/unfairly-app/issues" },
|
|
9
9
|
"license": "MIT",
|
|
10
10
|
"author": "Unfairly <bob@hq.unfairly.ai>",
|
|
11
|
-
"bin": { "unfairly": "dist/index.js" },
|
|
12
11
|
"type": "module",
|
|
12
|
+
"main": "./dist/lib/index.js",
|
|
13
|
+
"types": "./dist/lib/index.d.ts",
|
|
14
|
+
"bin": { "unfairly": "./dist/index.js" },
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/lib/index.d.ts",
|
|
18
|
+
"import": "./dist/lib/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./client": {
|
|
21
|
+
"types": "./dist/lib/client.d.ts",
|
|
22
|
+
"import": "./dist/lib/client.js"
|
|
23
|
+
},
|
|
24
|
+
"./events": {
|
|
25
|
+
"types": "./dist/lib/events/emit.d.ts",
|
|
26
|
+
"import": "./dist/lib/events/emit.js"
|
|
27
|
+
},
|
|
28
|
+
"./types": {
|
|
29
|
+
"types": "./dist/lib/types/index.d.ts",
|
|
30
|
+
"import": "./dist/lib/types/index.js"
|
|
31
|
+
},
|
|
32
|
+
"./package.json": "./package.json"
|
|
33
|
+
},
|
|
13
34
|
"scripts": {
|
|
14
35
|
"build": "tsc && chmod +x dist/index.js",
|
|
15
36
|
"dev": "tsx src/index.ts",
|
|
@@ -32,5 +53,5 @@
|
|
|
32
53
|
"vitest": "^2.1.0"
|
|
33
54
|
},
|
|
34
55
|
"engines": { "node": ">=20" },
|
|
35
|
-
"files": ["dist", "README.md"]
|
|
56
|
+
"files": ["dist", "README.md", "CHANGELOG.md"]
|
|
36
57
|
}
|