unfairly 0.8.1 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +17 -2
  3. package/dist/auth/browser-flow.d.ts +9 -0
  4. package/dist/auth/browser-flow.d.ts.map +1 -1
  5. package/dist/auth/browser-flow.js +11 -4
  6. package/dist/auth/browser-flow.js.map +1 -1
  7. package/dist/cmd/invite.js +2 -2
  8. package/dist/cmd/invite.js.map +1 -1
  9. package/dist/cmd/pace.d.ts +101 -0
  10. package/dist/cmd/pace.d.ts.map +1 -0
  11. package/dist/cmd/pace.js +426 -0
  12. package/dist/cmd/pace.js.map +1 -0
  13. package/dist/cmd/setup.d.ts +2 -0
  14. package/dist/cmd/setup.d.ts.map +1 -1
  15. package/dist/cmd/setup.js +20 -6
  16. package/dist/cmd/setup.js.map +1 -1
  17. package/dist/index.js +96 -2
  18. package/dist/index.js.map +1 -1
  19. package/dist/lib/types/index.d.ts +6 -6
  20. package/dist/pace/device.d.ts +104 -0
  21. package/dist/pace/device.d.ts.map +1 -0
  22. package/dist/pace/device.js +149 -0
  23. package/dist/pace/device.js.map +1 -0
  24. package/dist/pace/enroll.d.ts +80 -0
  25. package/dist/pace/enroll.d.ts.map +1 -0
  26. package/dist/pace/enroll.js +138 -0
  27. package/dist/pace/enroll.js.map +1 -0
  28. package/dist/pace/identity.d.ts +10 -0
  29. package/dist/pace/identity.d.ts.map +1 -0
  30. package/dist/pace/identity.js +17 -0
  31. package/dist/pace/identity.js.map +1 -0
  32. package/dist/pace/install.d.ts +28 -0
  33. package/dist/pace/install.d.ts.map +1 -0
  34. package/dist/pace/install.js +127 -0
  35. package/dist/pace/install.js.map +1 -0
  36. package/dist/pace/local-evidence.d.ts +75 -0
  37. package/dist/pace/local-evidence.d.ts.map +1 -0
  38. package/dist/pace/local-evidence.js +228 -0
  39. package/dist/pace/local-evidence.js.map +1 -0
  40. package/dist/pace/local-sessions.d.ts +48 -0
  41. package/dist/pace/local-sessions.d.ts.map +1 -0
  42. package/dist/pace/local-sessions.js +254 -0
  43. package/dist/pace/local-sessions.js.map +1 -0
  44. package/dist/pace/managed-config.d.ts +21 -0
  45. package/dist/pace/managed-config.d.ts.map +1 -0
  46. package/dist/pace/managed-config.js +102 -0
  47. package/dist/pace/managed-config.js.map +1 -0
  48. package/dist/pace/normalize.d.ts +10 -0
  49. package/dist/pace/normalize.d.ts.map +1 -0
  50. package/dist/pace/normalize.js +293 -0
  51. package/dist/pace/normalize.js.map +1 -0
  52. package/dist/pace/repository.d.ts +72 -0
  53. package/dist/pace/repository.d.ts.map +1 -0
  54. package/dist/pace/repository.js +120 -0
  55. package/dist/pace/repository.js.map +1 -0
  56. package/dist/pace/schema.d.ts +1325 -0
  57. package/dist/pace/schema.d.ts.map +1 -0
  58. package/dist/pace/schema.js +134 -0
  59. package/dist/pace/schema.js.map +1 -0
  60. package/dist/pace/session-summary.d.ts +179 -0
  61. package/dist/pace/session-summary.d.ts.map +1 -0
  62. package/dist/pace/session-summary.js +140 -0
  63. package/dist/pace/session-summary.js.map +1 -0
  64. package/dist/pace/spool.d.ts +6 -0
  65. package/dist/pace/spool.d.ts.map +1 -0
  66. package/dist/pace/spool.js +87 -0
  67. package/dist/pace/spool.js.map +1 -0
  68. package/dist/pace-runtime.d.ts +2 -0
  69. package/dist/pace-runtime.d.ts.map +1 -0
  70. package/dist/pace-runtime.js +67 -0
  71. package/dist/pace-runtime.js.map +1 -0
  72. package/package.json +5 -2
  73. package/plugin/.claude-plugin/plugin.json +9 -0
  74. package/plugin/.codex-plugin/plugin.json +21 -0
  75. package/plugin/.cursor-plugin/plugin.json +16 -0
  76. package/plugin/.mcp.json +8 -0
  77. package/plugin/README.md +15 -0
  78. package/plugin/deploy/README.md +30 -0
  79. package/plugin/gemini/GEMINI.md +3 -0
  80. package/plugin/gemini/gemini-extension.json +12 -0
  81. package/plugin/gemini/hooks/hooks.json +52 -0
  82. package/plugin/hooks/cursor-hooks.json +25 -0
  83. package/plugin/hooks/hooks.json +56 -0
  84. package/plugin/mcp.json +10 -0
  85. package/plugin/plugin.json +32 -0
  86. package/plugin/runtime/unfairly-intelligence.mjs +5513 -0
  87. package/plugin/scripts/capture.cjs +68 -0
  88. package/plugin/skills/find-company-playbook/SKILL.md +12 -0
  89. package/plugin/skills/publish-learning/SKILL.md +8 -0
@@ -0,0 +1,138 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { z } from "zod";
5
+ /**
6
+ * No-terminal connection for the plugin. On a session start without a
7
+ * collector credential, the plugin starts (or continues) a browser-approved
8
+ * enrollment and hands the person a link. Once approved, it claims a
9
+ * credential bound to this installation. Only these two small files are kept.
10
+ */
11
+ const CredentialSchema = z.object({ installation_id: z.string().uuid(), secret: z.string().regex(/^[A-Za-z0-9_-]{43}$/), org_id: z.string().uuid() }).strict();
12
+ const PendingSchema = z.object({ device_code: z.string(), user_code: z.string(), verification_uri: z.string().url(), expires_at: z.string() }).strict();
13
+ const dir = () => path.join(os.homedir(), ".unfairly", "pace");
14
+ export const collectorCredentialPath = () => process.env.UNFAIRLY_PACE_COLLECTOR ?? path.join(dir(), "collector.json");
15
+ const pendingPath = () => process.env.UNFAIRLY_PACE_ENROLLMENT ?? path.join(dir(), "enrollment.json");
16
+ async function readJson(file, schema) {
17
+ try {
18
+ const parsed = schema.safeParse(JSON.parse(await fs.readFile(file, "utf8")));
19
+ return parsed.success ? parsed.data : null;
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ async function writeJson(file, value) {
26
+ await fs.mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
27
+ await fs.writeFile(file, `${JSON.stringify(value)}\n`, { encoding: "utf8", mode: 0o600 });
28
+ }
29
+ export const readCollectorCredential = () => readJson(collectorCredentialPath(), CredentialSchema);
30
+ export function collectorAuthorization(credential) {
31
+ return `Collector ${credential.installation_id}.${credential.secret}`;
32
+ }
33
+ /** One step of the enrollment state machine; safe to call on every session start. */
34
+ export async function ensureEnrolled(input) {
35
+ const existing = await readCollectorCredential();
36
+ if (existing)
37
+ return { status: "connected", orgId: existing.org_id };
38
+ const call = input.fetchImpl ?? fetch;
39
+ const now = input.now ?? new Date();
40
+ const polled = await pollPendingEnrollment({ apiUrl: input.apiUrl, fetchImpl: call, now });
41
+ if (polled.status === "connected" || polled.status === "waiting")
42
+ return polled;
43
+ // No live enrollment, or it was denied, expired, or claimed elsewhere: start over.
44
+ const clients = input.clients.filter((client) => ["codex", "claude_code", "cursor", "gemini_cli"].includes(client));
45
+ const response = await call(`${input.apiUrl}/api/ai-pace/enroll`, {
46
+ method: "POST",
47
+ headers: { "Content-Type": "application/json" },
48
+ body: JSON.stringify({ installation_id: input.installationId, platform: input.platform, arch: input.arch, clients, ...(input.orgHint ? { org_hint: input.orgHint } : {}) }),
49
+ });
50
+ if (!response.ok)
51
+ return { status: "unavailable" };
52
+ const started = await response.json();
53
+ await writeJson(pendingPath(), { device_code: started.device_code, user_code: started.user_code, verification_uri: started.verification_uri, expires_at: new Date(now.getTime() + started.expires_in * 1000).toISOString() });
54
+ return { status: "waiting", link: started.verification_uri, code: started.user_code };
55
+ }
56
+ /**
57
+ * Checks the enrollment this machine is waiting on, without starting a new
58
+ * one. Claims and stores the credential when the person has approved it.
59
+ */
60
+ export async function pollPendingEnrollment(input) {
61
+ const existing = await readCollectorCredential();
62
+ if (existing)
63
+ return { status: "connected", orgId: existing.org_id };
64
+ const pending = await readJson(pendingPath(), PendingSchema);
65
+ if (!pending || Date.parse(pending.expires_at) <= (input.now ?? new Date()).getTime())
66
+ return { status: "none" };
67
+ const call = input.fetchImpl ?? fetch;
68
+ const response = await call(`${input.apiUrl}/api/ai-pace/enroll/poll`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ device_code: pending.device_code }) });
69
+ const body = await response.json().catch(() => ({}));
70
+ if (body.status === "approved" && body.installation_id && body.secret && body.org_id) {
71
+ await writeJson(collectorCredentialPath(), CredentialSchema.parse({ installation_id: body.installation_id, secret: body.secret, org_id: body.org_id }));
72
+ await fs.unlink(pendingPath()).catch(() => undefined);
73
+ return { status: "connected", orgId: body.org_id };
74
+ }
75
+ if (body.status === "pending")
76
+ return { status: "waiting", link: pending.verification_uri, code: pending.user_code };
77
+ return { status: "none" };
78
+ }
79
+ /**
80
+ * Keeps polling after the connect link is shown, so approving in the browser
81
+ * connects this machine within seconds instead of at the next session start.
82
+ * Stops when connected, when the enrollment ends, or at the deadline.
83
+ */
84
+ export async function awaitApproval(input) {
85
+ const clock = input.clock ?? Date.now;
86
+ const sleep = input.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
87
+ const deadline = clock() + (input.deadlineMs ?? 16 * 60_000);
88
+ while (clock() < deadline) {
89
+ const state = await pollPendingEnrollment({ apiUrl: input.apiUrl, fetchImpl: input.fetchImpl, now: new Date(clock()) }).catch(() => ({ status: "waiting" }));
90
+ if (state.status === "connected")
91
+ return true;
92
+ if (state.status === "none")
93
+ return false;
94
+ await sleep(input.intervalMs ?? 5_000);
95
+ }
96
+ return false;
97
+ }
98
+ const approvalLockPath = () => path.join(path.dirname(pendingPath()), "approval-wait.json");
99
+ /** At most one background poller per machine: sessions often start in bursts. */
100
+ export async function acquireApprovalLock(now = Date.now()) {
101
+ const file = approvalLockPath();
102
+ try {
103
+ const lock = JSON.parse(await fs.readFile(file, "utf8"));
104
+ const fresh = typeof lock.started_at === "number" && now - lock.started_at < 17 * 60_000;
105
+ let alive = false;
106
+ try {
107
+ if (typeof lock.pid === "number") {
108
+ process.kill(lock.pid, 0);
109
+ alive = true;
110
+ }
111
+ }
112
+ catch {
113
+ alive = false;
114
+ }
115
+ if (fresh && alive)
116
+ return false;
117
+ }
118
+ catch {
119
+ // No lock yet.
120
+ }
121
+ await writeJson(file, { pid: process.pid, started_at: now });
122
+ return true;
123
+ }
124
+ export const releaseApprovalLock = () => fs.unlink(approvalLockPath()).catch(() => undefined);
125
+ /** What a SessionStart hook prints: a visible message for the person plus context so the assistant can repeat the link. */
126
+ export function sessionStartOutput(state, hookEventName = "SessionStart") {
127
+ if (state.status !== "waiting")
128
+ return "";
129
+ const message = `Connect Unfairly Intelligence to your team: open ${state.link} and approve code ${state.code}. It shares session metadata only, never prompts or code.`;
130
+ return JSON.stringify({
131
+ systemMessage: message,
132
+ hookSpecificOutput: {
133
+ hookEventName,
134
+ additionalContext: `The Unfairly Intelligence plugin is installed but this machine is not connected yet. At a natural point, tell the user once: "${message}" Do not repeat it after they connect.`,
135
+ },
136
+ });
137
+ }
138
+ //# sourceMappingURL=enroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enroll.js","sourceRoot":"","sources":["../../src/pace/enroll.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Produces a stable, opaque UUID for one AI workflow without exposing the raw
3
+ * installation or session identifiers in downstream joins.
4
+ */
5
+ export declare function deterministicWorkflowId(input: {
6
+ installationId: string;
7
+ source: string;
8
+ sessionId: string;
9
+ }): string;
10
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/pace/identity.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAWT"}
@@ -0,0 +1,17 @@
1
+ import { createHash } from "node:crypto";
2
+ /**
3
+ * Produces a stable, opaque UUID for one AI workflow without exposing the raw
4
+ * installation or session identifiers in downstream joins.
5
+ */
6
+ export function deterministicWorkflowId(input) {
7
+ const bytes = createHash("sha256")
8
+ .update(`${input.installationId}\u0000${input.source}\u0000${input.sessionId}`, "utf8")
9
+ .digest()
10
+ .subarray(0, 16);
11
+ // Mark the deterministic hash as a name-based UUID and set the RFC variant.
12
+ bytes[6] = (bytes[6] & 0x0f) | 0x50;
13
+ bytes[8] = (bytes[8] & 0x3f) | 0x80;
14
+ const hex = bytes.toString("hex");
15
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
16
+ }
17
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/pace/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAIvC;IACC,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC;SAC/B,MAAM,CAAC,GAAG,KAAK,CAAC,cAAc,SAAS,KAAK,CAAC,MAAM,SAAS,KAAK,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC;SACtF,MAAM,EAAE;SACR,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEnB,4EAA4E;IAC5E,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7G,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { PaceClientCoverage, PaceClientId } from "./device.js";
2
+ export type IntelligenceActivation = {
3
+ client: PaceClientId;
4
+ status: "activated" | "skipped";
5
+ detail: string;
6
+ };
7
+ export type IntelligenceInstallResult = {
8
+ runtime_entrypoint: string;
9
+ marketplace_root: string;
10
+ activations: IntelligenceActivation[];
11
+ owned_paths: string[];
12
+ };
13
+ export type IntelligenceInstallerDeps = {
14
+ home?: string;
15
+ version: string;
16
+ pluginSource?: string;
17
+ clients: PaceClientCoverage[];
18
+ run?: (command: string, args: string[]) => {
19
+ ok: boolean;
20
+ detail: string;
21
+ };
22
+ installRuntime?: (input: {
23
+ version: string;
24
+ prefix: string;
25
+ }) => Promise<string>;
26
+ };
27
+ export declare function installIntelligence(deps: IntelligenceInstallerDeps): Promise<IntelligenceInstallResult>;
28
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/pace/install.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACtC,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3E,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAClF,CAAC;AAuEF,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAgE7G"}
@@ -0,0 +1,127 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import fs from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ const MARKETPLACE_NAME = "unfairly-intelligence";
7
+ function defaultPluginSource() {
8
+ const moduleDir = path.dirname(fileURLToPath(import.meta.url));
9
+ const packageRoot = path.resolve(moduleDir, "../..");
10
+ return path.join(packageRoot, "plugin");
11
+ }
12
+ function defaultRun(command, args) {
13
+ const result = spawnSync(command, args, { encoding: "utf8", timeout: 30_000 });
14
+ const detail = `${result.stdout || result.stderr || result.error?.message || ""}`.trim().slice(0, 500);
15
+ return { ok: !result.error && result.status === 0, detail };
16
+ }
17
+ async function defaultInstallRuntime(input) {
18
+ await fs.mkdir(input.prefix, { recursive: true, mode: 0o700 });
19
+ const result = spawnSync("npm", [
20
+ "install", "--prefix", input.prefix, `unfairly@${input.version}`,
21
+ "--omit=dev", "--no-audit", "--no-fund",
22
+ ], { encoding: "utf8", timeout: 120_000 });
23
+ if (result.error || result.status !== 0) {
24
+ throw new Error(`Could not install the Unfairly Intelligence runtime: ${`${result.stderr || result.error?.message || "unknown error"}`.trim()}`);
25
+ }
26
+ return path.join(input.prefix, "node_modules", "unfairly", "dist", "index.js");
27
+ }
28
+ async function requireDirectory(directory) {
29
+ const stat = await fs.stat(directory).catch(() => null);
30
+ if (!stat?.isDirectory())
31
+ throw new Error(`Bundled Unfairly Intelligence plugin not found at ${directory}`);
32
+ }
33
+ async function writeMarketplace(root, pluginSource) {
34
+ const pluginTarget = path.join(root, "plugins", "ai-pace");
35
+ await fs.rm(pluginTarget, { recursive: true, force: true });
36
+ await fs.mkdir(path.dirname(pluginTarget), { recursive: true, mode: 0o700 });
37
+ await fs.cp(pluginSource, pluginTarget, { recursive: true });
38
+ await fs.mkdir(path.join(root, ".agents", "plugins"), { recursive: true, mode: 0o700 });
39
+ await fs.mkdir(path.join(root, ".claude-plugin"), { recursive: true, mode: 0o700 });
40
+ const codexMarketplace = {
41
+ name: MARKETPLACE_NAME,
42
+ interface: { displayName: "Unfairly Intelligence" },
43
+ plugins: [{
44
+ name: "ai-pace",
45
+ source: { source: "local", path: "./plugins/ai-pace" },
46
+ policy: { installation: "AVAILABLE", authentication: "ON_INSTALL" },
47
+ category: "Productivity",
48
+ }],
49
+ };
50
+ const claudeMarketplace = {
51
+ name: MARKETPLACE_NAME,
52
+ description: "Unfairly Intelligence for AI-enabled teams.",
53
+ owner: { name: "Unfairly", url: "https://unfairly.ai" },
54
+ plugins: [{
55
+ name: "ai-pace",
56
+ description: "Content-free workflow evidence and reusable company playbooks.",
57
+ version: "0.1.0",
58
+ source: "./plugins/ai-pace",
59
+ category: "productivity",
60
+ }],
61
+ };
62
+ await fs.writeFile(path.join(root, ".agents", "plugins", "marketplace.json"), `${JSON.stringify(codexMarketplace, null, 2)}\n`, { mode: 0o600 });
63
+ await fs.writeFile(path.join(root, ".claude-plugin", "marketplace.json"), `${JSON.stringify(claudeMarketplace, null, 2)}\n`, { mode: 0o600 });
64
+ return pluginTarget;
65
+ }
66
+ function requireCommand(result, label) {
67
+ if (!result.ok)
68
+ throw new Error(`${label} failed${result.detail ? `: ${result.detail}` : ""}`);
69
+ }
70
+ export async function installIntelligence(deps) {
71
+ const home = deps.home ?? os.homedir();
72
+ const root = path.join(home, ".unfairly");
73
+ const runtimeRoot = path.join(root, "runtime", deps.version);
74
+ const marketplaceRoot = path.join(root, "marketplace");
75
+ const pluginSource = deps.pluginSource ?? defaultPluginSource();
76
+ const run = deps.run ?? defaultRun;
77
+ await requireDirectory(pluginSource);
78
+ const runtimeEntrypoint = await (deps.installRuntime ?? defaultInstallRuntime)({ version: deps.version, prefix: runtimeRoot });
79
+ const pluginTarget = await writeMarketplace(marketplaceRoot, pluginSource);
80
+ const runtimePointer = path.join(root, "runtime", "current.json");
81
+ await fs.mkdir(path.dirname(runtimePointer), { recursive: true, mode: 0o700 });
82
+ await fs.writeFile(runtimePointer, `${JSON.stringify({ version: deps.version, node: process.execPath, entrypoint: runtimeEntrypoint }, null, 2)}\n`, { mode: 0o600 });
83
+ const activations = [];
84
+ const ownedPaths = [runtimeRoot, marketplaceRoot, runtimePointer];
85
+ const installed = new Map(deps.clients.map((client) => [client.client, client.installed]));
86
+ if (installed.get("codex")) {
87
+ run("codex", ["plugin", "remove", `ai-pace@${MARKETPLACE_NAME}`, "--json"]);
88
+ run("codex", ["plugin", "marketplace", "remove", MARKETPLACE_NAME]);
89
+ requireCommand(run("codex", ["plugin", "marketplace", "add", marketplaceRoot, "--json"]), "Codex marketplace activation");
90
+ requireCommand(run("codex", ["plugin", "add", `ai-pace@${MARKETPLACE_NAME}`, "--json"]), "Codex plugin activation");
91
+ activations.push({ client: "codex", status: "activated", detail: "marketplace plugin installed" });
92
+ }
93
+ if (installed.get("claude_code")) {
94
+ run("claude", ["plugin", "uninstall", `ai-pace@${MARKETPLACE_NAME}`, "--scope", "user"]);
95
+ run("claude", ["plugin", "marketplace", "remove", MARKETPLACE_NAME, "--scope", "user"]);
96
+ requireCommand(run("claude", ["plugin", "marketplace", "add", marketplaceRoot, "--scope", "user"]), "Claude marketplace activation");
97
+ requireCommand(run("claude", ["plugin", "install", `ai-pace@${MARKETPLACE_NAME}`, "--scope", "user"]), "Claude plugin activation");
98
+ activations.push({ client: "claude_code", status: "activated", detail: "marketplace plugin installed" });
99
+ }
100
+ if (installed.get("cursor")) {
101
+ const cursorTarget = path.join(home, ".cursor", "plugins", "local", "ai-pace");
102
+ await fs.rm(cursorTarget, { recursive: true, force: true });
103
+ await fs.mkdir(path.dirname(cursorTarget), { recursive: true, mode: 0o700 });
104
+ await fs.cp(pluginTarget, cursorTarget, { recursive: true });
105
+ ownedPaths.push(cursorTarget);
106
+ activations.push({ client: "cursor", status: "activated", detail: "local plugin installed; reload Cursor to activate" });
107
+ }
108
+ if (installed.get("gemini_cli")) {
109
+ const geminiTarget = path.join(home, ".gemini", "extensions", "unfairly-intelligence");
110
+ await fs.rm(geminiTarget, { recursive: true, force: true });
111
+ await fs.mkdir(path.dirname(geminiTarget), { recursive: true, mode: 0o700 });
112
+ await fs.cp(path.join(pluginTarget, "gemini"), geminiTarget, { recursive: true });
113
+ const hooksPath = path.join(geminiTarget, "hooks", "hooks.json");
114
+ const hooks = await fs.readFile(hooksPath, "utf8");
115
+ const stableCommand = `${JSON.stringify(process.execPath)} ${JSON.stringify(runtimeEntrypoint)} intelligence capture`;
116
+ await fs.writeFile(hooksPath, hooks.replaceAll("unfairly pace capture", stableCommand), { mode: 0o600 });
117
+ ownedPaths.push(geminiTarget);
118
+ activations.push({ client: "gemini_cli", status: "activated", detail: "Gemini extension installed" });
119
+ }
120
+ for (const client of deps.clients) {
121
+ if (client.installed && !activations.some((activation) => activation.client === client.client)) {
122
+ activations.push({ client: client.client, status: "skipped", detail: "no passive lifecycle hook surface" });
123
+ }
124
+ }
125
+ return { runtime_entrypoint: runtimeEntrypoint, marketplace_root: marketplaceRoot, activations, owned_paths: ownedPaths };
126
+ }
127
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/pace/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { z } from "zod";
2
+ import { type PaceEvent } from "./schema.js";
3
+ export declare const localEvidencePolicySchema: z.ZodObject<{
4
+ version: z.ZodLiteral<1>;
5
+ include_file_names: z.ZodDefault<z.ZodBoolean>;
6
+ scan_interval_seconds: z.ZodDefault<z.ZodNumber>;
7
+ max_files_per_root: z.ZodDefault<z.ZodNumber>;
8
+ roots: z.ZodArray<z.ZodEffects<z.ZodObject<{
9
+ path: z.ZodString;
10
+ label: z.ZodString;
11
+ kind: z.ZodEnum<["output", "app_state"]>;
12
+ source_app: z.ZodOptional<z.ZodEnum<["chatgpt", "claude_desktop", "other"]>>;
13
+ extensions: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
14
+ }, "strict", z.ZodTypeAny, {
15
+ path: string;
16
+ label: string;
17
+ kind: "output" | "app_state";
18
+ source_app?: "chatgpt" | "claude_desktop" | "other" | undefined;
19
+ extensions?: string[] | undefined;
20
+ }, {
21
+ path: string;
22
+ label: string;
23
+ kind: "output" | "app_state";
24
+ source_app?: "chatgpt" | "claude_desktop" | "other" | undefined;
25
+ extensions?: string[] | undefined;
26
+ }>, {
27
+ path: string;
28
+ label: string;
29
+ kind: "output" | "app_state";
30
+ source_app?: "chatgpt" | "claude_desktop" | "other" | undefined;
31
+ extensions?: string[] | undefined;
32
+ }, {
33
+ path: string;
34
+ label: string;
35
+ kind: "output" | "app_state";
36
+ source_app?: "chatgpt" | "claude_desktop" | "other" | undefined;
37
+ extensions?: string[] | undefined;
38
+ }>, "many">;
39
+ }, "strict", z.ZodTypeAny, {
40
+ version: 1;
41
+ include_file_names: boolean;
42
+ scan_interval_seconds: number;
43
+ max_files_per_root: number;
44
+ roots: {
45
+ path: string;
46
+ label: string;
47
+ kind: "output" | "app_state";
48
+ source_app?: "chatgpt" | "claude_desktop" | "other" | undefined;
49
+ extensions?: string[] | undefined;
50
+ }[];
51
+ }, {
52
+ version: 1;
53
+ roots: {
54
+ path: string;
55
+ label: string;
56
+ kind: "output" | "app_state";
57
+ source_app?: "chatgpt" | "claude_desktop" | "other" | undefined;
58
+ extensions?: string[] | undefined;
59
+ }[];
60
+ include_file_names?: boolean | undefined;
61
+ scan_interval_seconds?: number | undefined;
62
+ max_files_per_root?: number | undefined;
63
+ }>;
64
+ export type LocalEvidencePolicy = z.infer<typeof localEvidencePolicySchema>;
65
+ export declare function localEvidencePolicyPath(): string;
66
+ export declare function localEvidenceStatePath(): string;
67
+ export declare function readLocalEvidencePolicy(policyPath?: string): Promise<LocalEvidencePolicy>;
68
+ export declare function scanLocalEvidence(input?: {
69
+ policyPath?: string;
70
+ installationId?: string;
71
+ }): Promise<{
72
+ events: PaceEvent[];
73
+ baselineRoots: string[];
74
+ }>;
75
+ //# sourceMappingURL=local-evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-evidence.d.ts","sourceRoot":"","sources":["../../src/pace/local-evidence.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAgB9D,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM3B,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAY5E,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAQD,wBAAsB,uBAAuB,CAAC,UAAU,SAA4B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgBlH;AA8HD,wBAAsB,iBAAiB,CAAC,KAAK,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA4B/J"}