@primitive.ai/prim 0.1.0-alpha.26 → 0.1.0-alpha.28
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 +18 -5
- package/dist/index.js +64 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -47,12 +47,25 @@ prim daemon start
|
|
|
47
47
|
prim hooks install
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
`prim claude
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
`prim setup` (and `prim claude preauth`) also pre-authorize prim so an agent's own
|
|
51
|
+
calls never stall on a permission prompt: a scoped `Bash(npx --yes @primitive.ai/prim*)`
|
|
52
|
+
allow-rule for default mode (it covers both the `@latest` onboarding form and the bare
|
|
53
|
+
day-to-day form), plus an `autoMode.environment` trust line so auto mode's safety
|
|
54
|
+
classifier treats prim as trusted tooling rather than untrusted downloaded code.
|
|
54
55
|
|
|
55
|
-
|
|
56
|
+
### Set up with your coding agent
|
|
57
|
+
|
|
58
|
+
Paste this into Claude Code (or any coding agent). The command is in **your** message,
|
|
59
|
+
so the agent runs it directly — instead of fetching a doc and executing a command from
|
|
60
|
+
it, which an auto-mode safety classifier blocks as untrusted-origin code:
|
|
61
|
+
|
|
62
|
+
```text
|
|
63
|
+
Install the Primitive CLI: run `npx --yes @primitive.ai/prim@latest setup` and surface its output. It's an agent-first CLI — drive it yourself, don't hand the command back to me. The only thing I'll do is click "Authorize" in the browser if it asks. When it finishes, show me the welcome.
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
That single command runs the whole install in one process (auth → session hooks →
|
|
67
|
+
daemon → git hooks → skill → welcome). The detailed step-by-step the agent follows —
|
|
68
|
+
and the manual fallback — live in [`setup.md`](./setup.md).
|
|
56
69
|
|
|
57
70
|
## Commands
|
|
58
71
|
|
package/dist/index.js
CHANGED
|
@@ -401,12 +401,17 @@ var REGISTRATIONS = [
|
|
|
401
401
|
makeRegistration("SessionStart", "*", SESSION_START_BIN),
|
|
402
402
|
makeRegistration("SessionEnd", "*", SESSION_END_BIN)
|
|
403
403
|
];
|
|
404
|
-
var PRIM_PERMISSION_RULE = "Bash(npx --yes @primitive.ai/prim
|
|
405
|
-
var LEGACY_PRIM_PERMISSION_RULES = [
|
|
404
|
+
var PRIM_PERMISSION_RULE = "Bash(npx --yes @primitive.ai/prim*)";
|
|
405
|
+
var LEGACY_PRIM_PERMISSION_RULES = [
|
|
406
|
+
"Bash(npx --yes @primitive.ai/prim@latest:*)",
|
|
407
|
+
"Bash(npx --yes @primitive.ai/prim:*)"
|
|
408
|
+
];
|
|
406
409
|
var ALL_PRIM_PERMISSION_RULES = /* @__PURE__ */ new Set([
|
|
407
410
|
PRIM_PERMISSION_RULE,
|
|
408
411
|
...LEGACY_PRIM_PERMISSION_RULES
|
|
409
412
|
]);
|
|
413
|
+
var PRIM_AUTOMODE_TRUST = "Primitive CLI (prim): the @primitive.ai/prim npm package \u2014 run via `npx --yes @primitive.ai/prim \u2026` \u2014 and its API at api.getprimitive.ai are trusted developer tooling this user installed for passive decision capture, conflict checks, and team presence. Running prim and its routine API/daemon calls is expected, not untrusted code execution or data exfiltration.";
|
|
414
|
+
var AUTOMODE_DEFAULTS = "$defaults";
|
|
410
415
|
function settingsPathFor(scope) {
|
|
411
416
|
return scope === "user" ? USER_SCOPE_PATH : projectScopePath();
|
|
412
417
|
}
|
|
@@ -496,6 +501,29 @@ function removePrimPermission(settings) {
|
|
|
496
501
|
const hasOtherPerms = Object.values(nextPermissions).some((v) => v !== void 0);
|
|
497
502
|
return { ...settings, permissions: hasOtherPerms ? nextPermissions : void 0 };
|
|
498
503
|
}
|
|
504
|
+
function applyAutoModeTrust(settings) {
|
|
505
|
+
const autoMode = settings.autoMode ?? {};
|
|
506
|
+
const env = autoMode.environment;
|
|
507
|
+
if (env?.includes(PRIM_AUTOMODE_TRUST)) {
|
|
508
|
+
return settings;
|
|
509
|
+
}
|
|
510
|
+
const nextEnv = env ? [...env, PRIM_AUTOMODE_TRUST] : [AUTOMODE_DEFAULTS, PRIM_AUTOMODE_TRUST];
|
|
511
|
+
return { ...settings, autoMode: { ...autoMode, environment: nextEnv } };
|
|
512
|
+
}
|
|
513
|
+
function removeAutoModeTrust(settings) {
|
|
514
|
+
const autoMode = settings.autoMode;
|
|
515
|
+
if (!autoMode?.environment?.includes(PRIM_AUTOMODE_TRUST)) {
|
|
516
|
+
return settings;
|
|
517
|
+
}
|
|
518
|
+
const env = autoMode.environment.filter((e) => e !== PRIM_AUTOMODE_TRUST);
|
|
519
|
+
const onlyDefaultsLeft = env.length === 0 || env.length === 1 && env[0] === AUTOMODE_DEFAULTS;
|
|
520
|
+
const nextAutoMode = {
|
|
521
|
+
...autoMode,
|
|
522
|
+
environment: onlyDefaultsLeft ? void 0 : env
|
|
523
|
+
};
|
|
524
|
+
const hasOther = Object.values(nextAutoMode).some((v) => v !== void 0);
|
|
525
|
+
return { ...settings, autoMode: hasOther ? nextAutoMode : void 0 };
|
|
526
|
+
}
|
|
499
527
|
function applyInstall(settings, options = {}) {
|
|
500
528
|
const hooks = { ...settings.hooks ?? {} };
|
|
501
529
|
for (const reg of REGISTRATIONS) {
|
|
@@ -519,7 +547,7 @@ function applyUninstall(settings) {
|
|
|
519
547
|
if (isPrimStatusLine(next)) {
|
|
520
548
|
next.statusLine = void 0;
|
|
521
549
|
}
|
|
522
|
-
return removePrimPermission(next);
|
|
550
|
+
return removeAutoModeTrust(removePrimPermission(next));
|
|
523
551
|
}
|
|
524
552
|
function captureInstalled(settings) {
|
|
525
553
|
return CAPTURE_EVENTS.some(
|
|
@@ -582,6 +610,22 @@ function performUninstall(scope) {
|
|
|
582
610
|
changed
|
|
583
611
|
};
|
|
584
612
|
}
|
|
613
|
+
function performPermissionInstall(scope) {
|
|
614
|
+
const path = settingsPathFor(scope);
|
|
615
|
+
const before = readSettings(path);
|
|
616
|
+
const after = applyAutoModeTrust(applyPermissions(before));
|
|
617
|
+
const changed = JSON.stringify(before) !== JSON.stringify(after);
|
|
618
|
+
if (changed) {
|
|
619
|
+
atomicWrite(path, after);
|
|
620
|
+
}
|
|
621
|
+
return {
|
|
622
|
+
scope,
|
|
623
|
+
path,
|
|
624
|
+
allowed: (after.permissions?.allow ?? []).includes(PRIM_PERMISSION_RULE),
|
|
625
|
+
autoModeTrusted: (after.autoMode?.environment ?? []).includes(PRIM_AUTOMODE_TRUST),
|
|
626
|
+
changed
|
|
627
|
+
};
|
|
628
|
+
}
|
|
585
629
|
function performStatus() {
|
|
586
630
|
const statusFor = (path) => {
|
|
587
631
|
const settings = readSettings(path);
|
|
@@ -623,6 +667,19 @@ function registerClaudeCommands(program2) {
|
|
|
623
667
|
}
|
|
624
668
|
console.log(JSON.stringify(result, null, JSON_INDENT));
|
|
625
669
|
});
|
|
670
|
+
claude.command("preauth").description(
|
|
671
|
+
"Pre-authorize prim's own calls (allow-rule + auto-mode trust, no hooks) so they never prompt"
|
|
672
|
+
).option(
|
|
673
|
+
"--scope <scope>",
|
|
674
|
+
"user (default for preauth \u2014 covers every repo) or project (this repo's .claude/settings.json)"
|
|
675
|
+
).action((opts) => {
|
|
676
|
+
const scope = resolveScope(opts.scope ?? "user");
|
|
677
|
+
const result = performPermissionInstall(scope);
|
|
678
|
+
console.error(
|
|
679
|
+
result.changed ? `[prim] prim pre-authorization written (${scope} scope) at ${result.path} (allow-rule + auto-mode trust)` : `[prim] prim pre-authorization already present at ${result.path} (no changes)`
|
|
680
|
+
);
|
|
681
|
+
console.log(JSON.stringify(result, null, JSON_INDENT));
|
|
682
|
+
});
|
|
626
683
|
claude.command("uninstall").description("Remove all prim hooks + the prim statusline from settings.json").option(
|
|
627
684
|
"--scope <scope>",
|
|
628
685
|
"project (default, the repo's .claude/settings.json) or user (~/.claude/settings.json)"
|
|
@@ -2326,6 +2383,10 @@ function registerSetupCommand(program2) {
|
|
|
2326
2383
|
return false;
|
|
2327
2384
|
}
|
|
2328
2385
|
};
|
|
2386
|
+
if (agent === "claude") {
|
|
2387
|
+
note("pre-authorize \xB7 writing prim allow-rule (user scope)\u2026");
|
|
2388
|
+
results.preauth = run(["claude", "preauth", "--scope", "user"]).code === 0 ? "ok" : "skipped";
|
|
2389
|
+
}
|
|
2329
2390
|
if (isAuthed(run(["auth", "status", "--json"], true).stdout)) {
|
|
2330
2391
|
note("auth \xB7 already authenticated");
|
|
2331
2392
|
results.auth = "ok";
|
package/package.json
CHANGED