@primitive.ai/prim 0.1.0-alpha.9 → 0.1.0-alpha.91
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 +303 -37
- package/SKILL.md +269 -0
- package/dist/chunk-4GLVJLEQ.js +55 -0
- package/dist/chunk-5AFRMOPX.js +209 -0
- package/dist/chunk-5GYQ4J3D.js +126 -0
- package/dist/chunk-67VNLLBN.js +789 -0
- package/dist/chunk-BTNNEH2W.js +79 -0
- package/dist/chunk-EWZMDD44.js +1474 -0
- package/dist/chunk-EZXEWFDG.js +210 -0
- package/dist/chunk-FBAYCS3X.js +327 -0
- package/dist/chunk-FKXFUUWJ.js +36 -0
- package/dist/chunk-FOLKHXLJ.js +1529 -0
- package/dist/chunk-H4UNYFUC.js +196 -0
- package/dist/chunk-HU4PW6I6.js +264 -0
- package/dist/chunk-KFXF2V5G.js +155 -0
- package/dist/chunk-LFFLHSQO.js +78 -0
- package/dist/chunk-M6RIJVRE.js +18358 -0
- package/dist/chunk-NAHHFSLH.js +258 -0
- package/dist/chunk-OAAP2MY6.js +262 -0
- package/dist/chunk-PCVGBE5B.js +659 -0
- package/dist/chunk-VW3FDYRT.js +517 -0
- package/dist/chunk-WX52U7Z2.js +112 -0
- package/dist/chunk-ZB4F75SZ.js +843 -0
- package/dist/daemon/server.js +21633 -0
- package/dist/hook-runtime/daemon/server.js +21633 -0
- package/dist/hook-runtime/hooks/post-commit.js +19258 -0
- package/dist/hook-runtime/hooks/post-rewrite.js +19273 -0
- package/dist/hook-runtime/hooks/post-tool-use.js +26365 -0
- package/dist/hook-runtime/hooks/pre-commit.js +1314 -0
- package/dist/hook-runtime/hooks/pre-tool-use.js +25832 -0
- package/dist/hook-runtime/hooks/prim-hook.js +26386 -0
- package/dist/hook-runtime/hooks/session-end.js +1078 -0
- package/dist/hook-runtime/hooks/session-start.js +28779 -0
- package/dist/hook-runtime/index.js +50987 -0
- package/dist/hook-runtime/statusline-main.js +809 -0
- package/dist/hooks/post-commit.js +190 -0
- package/dist/hooks/post-rewrite.js +203 -0
- package/dist/hooks/post-tool-use.js +288 -0
- package/dist/hooks/pre-commit.js +16 -101
- package/dist/hooks/pre-tool-use.js +369 -0
- package/dist/hooks/prim-hook.js +229 -0
- package/dist/hooks/session-end.js +59 -0
- package/dist/hooks/session-start.js +316 -0
- package/dist/index.js +8875 -429
- package/dist/statusline-main.js +809 -0
- package/package.json +35 -13
- package/dist/chunk-3APLWTLB.js +0 -165
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getClient,
|
|
3
|
+
getSiteUrl,
|
|
4
|
+
terminalSafeLine
|
|
5
|
+
} from "./chunk-PCVGBE5B.js";
|
|
6
|
+
import {
|
|
7
|
+
daemonRequest
|
|
8
|
+
} from "./chunk-KFXF2V5G.js";
|
|
9
|
+
|
|
10
|
+
// src/daemon/proxy.ts
|
|
11
|
+
var DAEMON_HTTP_TIMEOUT_MS = 1e4;
|
|
12
|
+
var DAEMON_PROBE_TIMEOUT_MS = 250;
|
|
13
|
+
async function daemonOrDirect(method, params, direct) {
|
|
14
|
+
const fromDaemon = await daemonRequest(
|
|
15
|
+
method,
|
|
16
|
+
{ ...params, callerEnv: getSiteUrl() },
|
|
17
|
+
{ timeoutMs: DAEMON_PROBE_TIMEOUT_MS }
|
|
18
|
+
);
|
|
19
|
+
if (fromDaemon !== null) {
|
|
20
|
+
return fromDaemon;
|
|
21
|
+
}
|
|
22
|
+
return await direct();
|
|
23
|
+
}
|
|
24
|
+
async function daemonOrDirectGet(method, path, client, timeoutMs = DAEMON_HTTP_TIMEOUT_MS) {
|
|
25
|
+
return await daemonOrDirect(
|
|
26
|
+
method,
|
|
27
|
+
{ path },
|
|
28
|
+
async () => await client.get(path, {
|
|
29
|
+
signal: AbortSignal.timeout(timeoutMs)
|
|
30
|
+
})
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// src/hooks/decisions-check.ts
|
|
35
|
+
var DECISIONS_CHECK_TIMEOUT_MS = 1e4;
|
|
36
|
+
var MAX_FILES_PER_REQUEST = 25;
|
|
37
|
+
var defaultDeps = { getClient };
|
|
38
|
+
function chunk(items, size) {
|
|
39
|
+
const out = [];
|
|
40
|
+
for (let i = 0; i < items.length; i += size) {
|
|
41
|
+
out.push(items.slice(i, i + size));
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
async function fetchAffecting(client, batch) {
|
|
46
|
+
const params = new URLSearchParams();
|
|
47
|
+
for (const file of batch) {
|
|
48
|
+
params.append("files", file);
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
return await daemonOrDirectGet(
|
|
52
|
+
"decisions_affecting",
|
|
53
|
+
`/api/cli/decisions/affecting?${params.toString()}`,
|
|
54
|
+
client,
|
|
55
|
+
DECISIONS_CHECK_TIMEOUT_MS
|
|
56
|
+
);
|
|
57
|
+
} catch (err) {
|
|
58
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
59
|
+
return { decisions: [], truncated: false, unavailable: `decision check failed: ${detail}` };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function checkAffectedDecisions(filePaths, deps = defaultDeps) {
|
|
63
|
+
if (filePaths.length === 0) {
|
|
64
|
+
return { decisions: [], truncated: false };
|
|
65
|
+
}
|
|
66
|
+
const client = deps.getClient();
|
|
67
|
+
const responses = await Promise.all(
|
|
68
|
+
chunk(filePaths, MAX_FILES_PER_REQUEST).map((batch) => fetchAffecting(client, batch))
|
|
69
|
+
);
|
|
70
|
+
const byId = /* @__PURE__ */ new Map();
|
|
71
|
+
let truncated = false;
|
|
72
|
+
let unavailable;
|
|
73
|
+
for (const res of responses) {
|
|
74
|
+
if (res.unavailable !== void 0 && unavailable === void 0) {
|
|
75
|
+
unavailable = res.unavailable;
|
|
76
|
+
}
|
|
77
|
+
truncated ||= res.truncated === true;
|
|
78
|
+
for (const d of res.decisions) {
|
|
79
|
+
const existing = byId.get(d.id);
|
|
80
|
+
if (existing) {
|
|
81
|
+
existing.matchedFiles = [.../* @__PURE__ */ new Set([...existing.matchedFiles, ...d.matchedFiles])];
|
|
82
|
+
} else {
|
|
83
|
+
byId.set(d.id, { ...d, matchedFiles: [...d.matchedFiles] });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const result = { decisions: [...byId.values()], truncated };
|
|
88
|
+
if (unavailable !== void 0) {
|
|
89
|
+
result.unavailable = unavailable;
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
var FILES_PREVIEW_LIMIT = 3;
|
|
94
|
+
function formatDecisionsWarning(result) {
|
|
95
|
+
const lines = [];
|
|
96
|
+
if (result.unavailable !== void 0) {
|
|
97
|
+
lines.push(`[prim] decision check not verified \u2014 ${terminalSafeLine(result.unavailable)}`);
|
|
98
|
+
}
|
|
99
|
+
if (result.decisions.length > 0) {
|
|
100
|
+
lines.push(
|
|
101
|
+
`[prim] ${String(result.decisions.length)} active decision(s) reference staged files:`
|
|
102
|
+
);
|
|
103
|
+
for (const d of result.decisions) {
|
|
104
|
+
const statusMark = d.status === "under_review" ? " (under review)" : "";
|
|
105
|
+
const preview = d.matchedFiles.slice(0, FILES_PREVIEW_LIMIT).map(terminalSafeLine).join(", ");
|
|
106
|
+
const overflow = d.matchedFiles.length > FILES_PREVIEW_LIMIT ? ` (+${String(d.matchedFiles.length - FILES_PREVIEW_LIMIT)} more)` : "";
|
|
107
|
+
lines.push(` \xB7 ${terminalSafeLine(d.intent)}${statusMark}`);
|
|
108
|
+
lines.push(` files: ${preview}${overflow}`);
|
|
109
|
+
if (d.rationale) {
|
|
110
|
+
lines.push(` rationale: ${terminalSafeLine(d.rationale)}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (result.truncated) {
|
|
115
|
+
lines.push(
|
|
116
|
+
"[prim] result truncated \u2014 more files than the server checks per request; not all decisions shown"
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
return lines.join("\n");
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export {
|
|
123
|
+
daemonOrDirectGet,
|
|
124
|
+
checkAffectedDecisions,
|
|
125
|
+
formatDecisionsWarning
|
|
126
|
+
};
|