@primitive.ai/prim 0.1.0-alpha.68 → 0.1.0-alpha.69
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/README.md +39 -1
- package/SKILL.md +1 -1
- package/dist/{chunk-XPVNH3J6.js → chunk-2KW7DVFJ.js} +121 -130
- package/dist/chunk-3EEFL6NJ.js +529 -0
- package/dist/chunk-4A2XB2PC.js +310 -0
- package/dist/{chunk-G5D3FF3D.js → chunk-BQUJ4AFJ.js} +1 -83
- package/dist/chunk-CUE2LKLR.js +155 -0
- package/dist/chunk-FI3LIRCB.js +262 -0
- package/dist/{chunk-CPSE3Y3T.js → chunk-H64F6QHV.js} +27 -8
- package/dist/{chunk-I5BHJQH2.js → chunk-KKP2NYZ3.js} +206 -30
- package/dist/chunk-LEMX3IOG.js +79 -0
- package/dist/{chunk-U6L2RU67.js → chunk-LMRYZL3D.js} +52 -45
- package/dist/{chunk-XUAP572Z.js → chunk-RO3F6JYV.js} +8 -7
- package/dist/{chunk-TDRXHBEX.js → chunk-TJTVHDJ5.js} +41 -18
- package/dist/{chunk-TCDUH7AN.js → chunk-WB7AUZ4C.js} +17 -0
- package/dist/{chunk-UN5O5SYG.js → chunk-YWO7O6QG.js} +14 -53
- package/dist/chunk-Z7YPFWAZ.js +917 -0
- package/dist/{chunk-BDGQEJA5.js → chunk-ZOSNEO5N.js} +2 -2
- package/dist/daemon/server.js +11634 -391
- package/dist/hook-runtime/daemon/server.js +13353 -0
- package/dist/hook-runtime/hooks/post-commit.js +1128 -0
- package/dist/hook-runtime/hooks/post-rewrite.js +1148 -0
- package/dist/hook-runtime/hooks/post-tool-use.js +7586 -0
- package/dist/hook-runtime/hooks/pre-commit.js +1314 -0
- package/dist/hook-runtime/hooks/pre-tool-use.js +7099 -0
- package/dist/hook-runtime/hooks/prim-hook.js +7691 -0
- package/dist/hook-runtime/hooks/session-end.js +495 -0
- package/dist/hook-runtime/hooks/session-start.js +11284 -0
- package/dist/hook-runtime/index.js +42775 -0
- package/dist/hook-runtime/statusline-main.js +765 -0
- package/dist/hooks/post-commit.js +7 -4
- package/dist/hooks/post-rewrite.js +7 -4
- package/dist/hooks/post-tool-use.js +21 -19
- package/dist/hooks/pre-commit.js +4 -3
- package/dist/hooks/pre-tool-use.js +59 -18
- package/dist/hooks/prim-hook.js +39 -56
- package/dist/hooks/session-end.js +3 -2
- package/dist/hooks/session-start.js +15 -12
- package/dist/index.js +15050 -2479
- package/dist/statusline-main.js +477 -89
- package/package.json +11 -5
- package/dist/chunk-K3AYW6VZ.js +0 -300
- package/dist/chunk-RTLFE6EZ.js +0 -518
- package/dist/chunk-UTKQTZHL.js +0 -88
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@primitive.ai/prim",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.69",
|
|
4
4
|
"description": "CLI for Primitive's decision graph — passive decision capture, conflict gate, and team presence",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -48,13 +48,17 @@
|
|
|
48
48
|
"SKILL.md"
|
|
49
49
|
],
|
|
50
50
|
"scripts": {
|
|
51
|
-
"build": "tsup src/index.ts src/hooks/pre-commit.ts src/hooks/post-commit.ts src/hooks/post-rewrite.ts src/hooks/prim-hook.ts src/hooks/pre-tool-use.ts src/hooks/post-tool-use.ts src/hooks/session-start.ts src/hooks/session-end.ts --format esm --clean && tsup src/statusline-main.ts src/daemon/server.ts --format esm --splitting false",
|
|
51
|
+
"build": "tsup src/index.ts src/hooks/pre-commit.ts src/hooks/post-commit.ts src/hooks/post-rewrite.ts src/hooks/prim-hook.ts src/hooks/pre-tool-use.ts src/hooks/post-tool-use.ts src/hooks/session-start.ts src/hooks/session-end.ts --format esm --clean && tsup src/statusline-main.ts src/daemon/server.ts --format esm --splitting false && tsup --config tsup.hook-runtime.config.ts",
|
|
52
|
+
"contracts:generate": "node scripts/generate-cli-contract.mjs --write",
|
|
53
|
+
"contracts:check": "node scripts/generate-cli-contract.mjs --check",
|
|
54
|
+
"contracts:provenance": "node scripts/update-cli-contract.mjs --check",
|
|
55
|
+
"contracts:update": "node scripts/update-cli-contract.mjs",
|
|
52
56
|
"postbuild": "chmod +x ./dist/index.js ./dist/statusline-main.js ./dist/hooks/pre-commit.js ./dist/hooks/post-commit.js ./dist/hooks/post-rewrite.js ./dist/hooks/prim-hook.js ./dist/hooks/pre-tool-use.js ./dist/hooks/post-tool-use.js ./dist/hooks/session-start.js ./dist/hooks/session-end.js ./dist/daemon/server.js",
|
|
53
57
|
"dev": "tsup src/index.ts src/statusline-main.ts src/hooks/pre-commit.ts src/hooks/post-commit.ts src/hooks/post-rewrite.ts src/hooks/prim-hook.ts src/hooks/pre-tool-use.ts src/hooks/post-tool-use.ts src/hooks/session-start.ts src/hooks/session-end.ts src/daemon/server.ts --format esm --watch --clean --splitting false",
|
|
54
58
|
"clean": "rm -rf dist coverage",
|
|
55
|
-
"lint": "biome check src/",
|
|
56
|
-
"format": "biome check --fix src/",
|
|
57
|
-
"format:check": "biome check src/",
|
|
59
|
+
"lint": "biome check src/ scripts/",
|
|
60
|
+
"format": "biome check --fix src/ scripts/",
|
|
61
|
+
"format:check": "biome check src/ scripts/",
|
|
58
62
|
"typecheck": "tsc --noEmit",
|
|
59
63
|
"test": "vitest run",
|
|
60
64
|
"test:watch": "vitest",
|
|
@@ -73,6 +77,8 @@
|
|
|
73
77
|
"@types/node": "^25.5.0",
|
|
74
78
|
"@types/update-notifier": "^6.0.8",
|
|
75
79
|
"@vitest/coverage-v8": "^3.1.0",
|
|
80
|
+
"ajv": "8.20.0",
|
|
81
|
+
"json-schema-to-typescript": "15.0.4",
|
|
76
82
|
"tsup": "^8.0.0",
|
|
77
83
|
"typescript": "^5.5.0",
|
|
78
84
|
"vitest": "^3.1.0"
|
package/dist/chunk-K3AYW6VZ.js
DELETED
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
// src/lib/bin-path.ts
|
|
2
|
-
import { existsSync, readFileSync } from "fs";
|
|
3
|
-
import { dirname, isAbsolute, join } from "path";
|
|
4
|
-
import { fileURLToPath } from "url";
|
|
5
|
-
var PKG_NAME = "@primitive.ai/prim";
|
|
6
|
-
var ROOT_WALK_LIMIT = 6;
|
|
7
|
-
var NPX_FALLBACK = `npx --yes -p ${PKG_NAME}@latest`;
|
|
8
|
-
var resolvedRoot;
|
|
9
|
-
function locateRoot() {
|
|
10
|
-
if (resolvedRoot !== void 0) {
|
|
11
|
-
return resolvedRoot;
|
|
12
|
-
}
|
|
13
|
-
let dir = dirname(fileURLToPath(import.meta.url));
|
|
14
|
-
for (let depth = 0; depth < ROOT_WALK_LIMIT; depth++) {
|
|
15
|
-
const manifestPath = join(dir, "package.json");
|
|
16
|
-
if (existsSync(manifestPath)) {
|
|
17
|
-
try {
|
|
18
|
-
const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
|
|
19
|
-
if (manifest.name === PKG_NAME && manifest.bin) {
|
|
20
|
-
resolvedRoot = { dir, version: manifest.version, bin: manifest.bin };
|
|
21
|
-
return resolvedRoot;
|
|
22
|
-
}
|
|
23
|
-
} catch {
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
const parent = dirname(dir);
|
|
27
|
-
if (parent === dir) {
|
|
28
|
-
break;
|
|
29
|
-
}
|
|
30
|
-
dir = parent;
|
|
31
|
-
}
|
|
32
|
-
resolvedRoot = null;
|
|
33
|
-
return resolvedRoot;
|
|
34
|
-
}
|
|
35
|
-
function binFile(bin) {
|
|
36
|
-
const root = locateRoot();
|
|
37
|
-
const rel = root?.bin[bin];
|
|
38
|
-
if (!root || !rel) {
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
return isAbsolute(rel) ? rel : join(root.dir, rel);
|
|
42
|
-
}
|
|
43
|
-
function packageVersion() {
|
|
44
|
-
return locateRoot()?.version ?? null;
|
|
45
|
-
}
|
|
46
|
-
function shellQuote(value) {
|
|
47
|
-
return `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
48
|
-
}
|
|
49
|
-
function pinnedHookCommand(bin, args = "") {
|
|
50
|
-
const version = packageVersion();
|
|
51
|
-
if (!version) throw new Error("cannot determine Primitive package version");
|
|
52
|
-
const suffix = args ? ` ${args}` : "";
|
|
53
|
-
const fallback = `npx --yes -p ${PKG_NAME}@${version} ${bin}${suffix}`;
|
|
54
|
-
const file = binFile(bin);
|
|
55
|
-
if (!file) return fallback;
|
|
56
|
-
return `if [ -x ${shellQuote(process.execPath)} ] && [ -f ${shellQuote(file)} ]; then ${shellQuote(process.execPath)} ${shellQuote(file)}${suffix}; else ${fallback}; fi`;
|
|
57
|
-
}
|
|
58
|
-
function detachedHookShimCommand(bin, args = "") {
|
|
59
|
-
return `payload=$(cat); { trap '' HUP; export npm_config_fetch_retries=2 npm_config_fetch_retry_mintimeout=10000 npm_config_fetch_retry_maxtimeout=10000 npm_config_fetch_timeout=60000; printf '%s' "$payload" | { ${pinnedHookCommand(bin, args)}; }; } </dev/null >/dev/null 2>&1 &`;
|
|
60
|
-
}
|
|
61
|
-
function commandMatchesBin(command, bin) {
|
|
62
|
-
if (!command) {
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
const c = command.trim();
|
|
66
|
-
if (c === bin || c.startsWith(`${bin} `)) {
|
|
67
|
-
return true;
|
|
68
|
-
}
|
|
69
|
-
const exactBin = new RegExp(`(?:^|\\s)${bin.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}(?:\\s|;|$)`);
|
|
70
|
-
return c.includes(`command -v ${bin} `) || c.includes(`-p ${PKG_NAME}@`) && exactBin.test(c);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// src/lib/bin-cache.ts
|
|
74
|
-
import { chmodSync, mkdirSync, renameSync, writeFileSync } from "fs";
|
|
75
|
-
import { homedir } from "os";
|
|
76
|
-
import { join as join2 } from "path";
|
|
77
|
-
var CACHED_BINS = [
|
|
78
|
-
"prim",
|
|
79
|
-
"prim-hook",
|
|
80
|
-
"prim-pre-tool-use",
|
|
81
|
-
"prim-post-tool-use",
|
|
82
|
-
"prim-post-commit",
|
|
83
|
-
"prim-post-rewrite"
|
|
84
|
-
];
|
|
85
|
-
function binCacheDir() {
|
|
86
|
-
const base = process.env.XDG_CACHE_HOME || join2(homedir(), ".cache");
|
|
87
|
-
return join2(base, "prim", "bin");
|
|
88
|
-
}
|
|
89
|
-
function writeAtomic(path, content) {
|
|
90
|
-
const tmp = `${path}.${process.pid}.tmp`;
|
|
91
|
-
writeFileSync(tmp, content, { mode: 384 });
|
|
92
|
-
renameSync(tmp, path);
|
|
93
|
-
}
|
|
94
|
-
function warmBinCache() {
|
|
95
|
-
try {
|
|
96
|
-
if (process.env.PRIM_BIN_CACHE_HIT) {
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
if (process.env.PRIM_BIN_CACHE === "0") {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
const dir = binCacheDir();
|
|
103
|
-
mkdirSync(dir, { recursive: true, mode: 448 });
|
|
104
|
-
chmodSync(dir, 448);
|
|
105
|
-
writeAtomic(join2(dir, "node"), process.execPath);
|
|
106
|
-
for (const bin of CACHED_BINS) {
|
|
107
|
-
const file = binFile(bin);
|
|
108
|
-
if (file) {
|
|
109
|
-
writeAtomic(join2(dir, bin), file);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
} catch {
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// src/lib/ansi.ts
|
|
117
|
-
var ANSI_CODES = {
|
|
118
|
-
yellow: "\x1B[33m",
|
|
119
|
-
magenta: "\x1B[35m",
|
|
120
|
-
blue: "\x1B[34m",
|
|
121
|
-
cyan: "\x1B[36m",
|
|
122
|
-
green: "\x1B[32m",
|
|
123
|
-
red: "\x1B[31m",
|
|
124
|
-
// 256-color approximation of the orange trigger marker (xterm 208).
|
|
125
|
-
orange: "\x1B[38;5;208m",
|
|
126
|
-
gray: "\x1B[90m"
|
|
127
|
-
};
|
|
128
|
-
var ANSI_RESET = "\x1B[0m";
|
|
129
|
-
var ANSI_DIM = "\x1B[2m";
|
|
130
|
-
var ANSI_BOLD = "\x1B[1m";
|
|
131
|
-
function supportsColor() {
|
|
132
|
-
if (process.env.NO_COLOR !== void 0 && process.env.NO_COLOR !== "") {
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
return process.stderr.isTTY === true;
|
|
136
|
-
}
|
|
137
|
-
function color(text, c) {
|
|
138
|
-
if (!supportsColor()) {
|
|
139
|
-
return text;
|
|
140
|
-
}
|
|
141
|
-
return `${ANSI_CODES[c]}${text}${ANSI_RESET}`;
|
|
142
|
-
}
|
|
143
|
-
function dim(text) {
|
|
144
|
-
if (!supportsColor()) {
|
|
145
|
-
return text;
|
|
146
|
-
}
|
|
147
|
-
return `${ANSI_DIM}${text}${ANSI_RESET}`;
|
|
148
|
-
}
|
|
149
|
-
function bold(text) {
|
|
150
|
-
if (!supportsColor()) {
|
|
151
|
-
return text;
|
|
152
|
-
}
|
|
153
|
-
return `${ANSI_BOLD}${text}${ANSI_RESET}`;
|
|
154
|
-
}
|
|
155
|
-
var AREA_COLORS = {
|
|
156
|
-
auth: "yellow",
|
|
157
|
-
data: "magenta",
|
|
158
|
-
mobile: "blue",
|
|
159
|
-
infra: "cyan",
|
|
160
|
-
ui: "green",
|
|
161
|
-
billing: "orange",
|
|
162
|
-
api: "blue",
|
|
163
|
-
docs: "gray",
|
|
164
|
-
testing: "gray"
|
|
165
|
-
};
|
|
166
|
-
function colorForArea(area) {
|
|
167
|
-
if (!area) {
|
|
168
|
-
return "gray";
|
|
169
|
-
}
|
|
170
|
-
return AREA_COLORS[area] ?? "gray";
|
|
171
|
-
}
|
|
172
|
-
function stripControlChars(text) {
|
|
173
|
-
let out = "";
|
|
174
|
-
for (const ch of text) {
|
|
175
|
-
const code = ch.codePointAt(0) ?? 0;
|
|
176
|
-
if (code > 31 && !(code >= 127 && code <= 159)) {
|
|
177
|
-
out += ch;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
return out;
|
|
181
|
-
}
|
|
182
|
-
var MAX_HEALTH_ERROR_LENGTH = 240;
|
|
183
|
-
function boundedHealthError(value) {
|
|
184
|
-
if (!value) return void 0;
|
|
185
|
-
const clean = stripControlChars(value).replace(/\s+/g, " ").trim();
|
|
186
|
-
if (!clean) return void 0;
|
|
187
|
-
return clean.length <= MAX_HEALTH_ERROR_LENGTH ? clean : `${clean.slice(0, MAX_HEALTH_ERROR_LENGTH - 1)}\u2026`;
|
|
188
|
-
}
|
|
189
|
-
function stripAnsi(text) {
|
|
190
|
-
return text.replace(/\u001b\[[0-9;]*m/g, "");
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// src/lib/presence.ts
|
|
194
|
-
var DECISION_ORIGIN = "https://app.getprimitive.ai";
|
|
195
|
-
function validDecisionUrl(value) {
|
|
196
|
-
if (typeof value !== "string" || stripControlChars(value) !== value) {
|
|
197
|
-
return void 0;
|
|
198
|
-
}
|
|
199
|
-
try {
|
|
200
|
-
const url = new URL(value);
|
|
201
|
-
if (url.origin !== DECISION_ORIGIN || url.username !== "" || url.password !== "" || url.search !== "" || url.hash !== "" || !/^\/decisions\/[^/]+$/u.test(url.pathname)) {
|
|
202
|
-
return void 0;
|
|
203
|
-
}
|
|
204
|
-
return url.href;
|
|
205
|
-
} catch {
|
|
206
|
-
return void 0;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
function decisionLink(label, decisionUrl, plain) {
|
|
210
|
-
const url = validDecisionUrl(decisionUrl);
|
|
211
|
-
if (plain || !url) {
|
|
212
|
-
return label;
|
|
213
|
-
}
|
|
214
|
-
return `\x1B]8;;${url}\x07\x1B[34;4m${label}\x1B[0m\x1B]8;;\x07`;
|
|
215
|
-
}
|
|
216
|
-
function formatLabeled(labels, cap) {
|
|
217
|
-
if (labels === void 0) {
|
|
218
|
-
return "\u2014";
|
|
219
|
-
}
|
|
220
|
-
if (labels.length === 0) {
|
|
221
|
-
return "just you";
|
|
222
|
-
}
|
|
223
|
-
if (labels.length <= cap) {
|
|
224
|
-
return labels.join(", ");
|
|
225
|
-
}
|
|
226
|
-
return `${labels.slice(0, cap).join(", ")} +${String(labels.length - cap)}`;
|
|
227
|
-
}
|
|
228
|
-
function formatTeammates(names, cap) {
|
|
229
|
-
return formatLabeled(names?.map(stripControlChars), cap);
|
|
230
|
-
}
|
|
231
|
-
function formatTeammatesWithArea(teammates, cap, plainLinks = false) {
|
|
232
|
-
return formatLabeled(
|
|
233
|
-
teammates?.map((t) => {
|
|
234
|
-
const name = stripControlChars(t.name);
|
|
235
|
-
const area = stripControlChars(t.area ?? "").trim();
|
|
236
|
-
const label = area ? `${name} - ${area}` : name;
|
|
237
|
-
return decisionLink(label, t.decisionUrl, plainLinks);
|
|
238
|
-
}),
|
|
239
|
-
cap
|
|
240
|
-
);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// src/lib/statusline-render.ts
|
|
244
|
-
var STATUSLINE_NAME_CAP = 3;
|
|
245
|
-
function formatStatusline(version, snapshot, resolveIngestionStatus, options = {}) {
|
|
246
|
-
const ingestionSuffix = (status) => status === void 0 ? "" : ` \xB7 Decision ingestion ${status}`;
|
|
247
|
-
const ingestionStatus = snapshot === null || snapshot.healthy === false ? options.includeIngestionWhenUnavailable ? resolveIngestionStatus() : void 0 : resolveIngestionStatus();
|
|
248
|
-
if (!snapshot) {
|
|
249
|
-
return `primitive ${version} (daemon: down${ingestionSuffix(ingestionStatus)})`;
|
|
250
|
-
}
|
|
251
|
-
if (snapshot.healthy === false) {
|
|
252
|
-
if (snapshot.needsReauth) {
|
|
253
|
-
return `primitive ${version} (daemon: paused \xB7 run \`prim auth login\`${ingestionSuffix(ingestionStatus)})`;
|
|
254
|
-
}
|
|
255
|
-
if (snapshot.ingestion?.healthy === false) {
|
|
256
|
-
const pending = snapshot.ingestion.pendingCount;
|
|
257
|
-
const qualifier = snapshot.ingestion.pendingSampled ? "at least " : "";
|
|
258
|
-
return `primitive ${version} (daemon: degraded \xB7 delivery: stalled${typeof pending === "number" ? ` \xB7 ${qualifier}${String(pending)} pending` : ""}${ingestionSuffix(ingestionStatus)})`;
|
|
259
|
-
}
|
|
260
|
-
if (snapshot.heartbeat?.healthy === false) {
|
|
261
|
-
return `primitive ${version} (daemon: degraded \xB7 presence: unavailable${ingestionSuffix(ingestionStatus)})`;
|
|
262
|
-
}
|
|
263
|
-
return `primitive ${version} (daemon: starting${ingestionSuffix(ingestionStatus)})`;
|
|
264
|
-
}
|
|
265
|
-
if (snapshot.envMismatch) {
|
|
266
|
-
return `primitive ${version} (daemon: live, Decision ingestion ${ingestionStatus} \xB7 presence: other env)`;
|
|
267
|
-
}
|
|
268
|
-
if (snapshot.presenceStale) {
|
|
269
|
-
return `primitive ${version} (daemon: live, Decision ingestion ${ingestionStatus} \xB7 presence: stale)`;
|
|
270
|
-
}
|
|
271
|
-
let team;
|
|
272
|
-
if (snapshot.onlineTeammates !== void 0) {
|
|
273
|
-
team = `team: ${formatTeammatesWithArea(snapshot.onlineTeammates, STATUSLINE_NAME_CAP, options.plainLinks === true)}`;
|
|
274
|
-
} else if (snapshot.onlineNames !== void 0) {
|
|
275
|
-
team = `team: ${formatTeammates(snapshot.onlineNames, STATUSLINE_NAME_CAP)}`;
|
|
276
|
-
} else if (typeof snapshot.onlineCount === "number") {
|
|
277
|
-
team = `team: ${String(snapshot.onlineCount)} online`;
|
|
278
|
-
} else {
|
|
279
|
-
team = "team: \u2014";
|
|
280
|
-
}
|
|
281
|
-
return `primitive ${version} (daemon: live, Decision ingestion ${ingestionStatus} \xB7 ${team})`;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
export {
|
|
285
|
-
color,
|
|
286
|
-
dim,
|
|
287
|
-
bold,
|
|
288
|
-
colorForArea,
|
|
289
|
-
stripControlChars,
|
|
290
|
-
boundedHealthError,
|
|
291
|
-
stripAnsi,
|
|
292
|
-
binFile,
|
|
293
|
-
packageVersion,
|
|
294
|
-
pinnedHookCommand,
|
|
295
|
-
detachedHookShimCommand,
|
|
296
|
-
commandMatchesBin,
|
|
297
|
-
formatTeammates,
|
|
298
|
-
warmBinCache,
|
|
299
|
-
formatStatusline
|
|
300
|
-
};
|