@praxis.guard/auditor-cli 0.0.36 → 0.0.37
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 +15 -4
- package/dist/adapters/claude-code.d.ts +34 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +239 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/claude-desktop.d.ts +20 -0
- package/dist/adapters/claude-desktop.d.ts.map +1 -0
- package/dist/adapters/claude-desktop.js +133 -0
- package/dist/adapters/claude-desktop.js.map +1 -0
- package/dist/adapters/cursor.d.ts +18 -0
- package/dist/adapters/cursor.d.ts.map +1 -0
- package/dist/adapters/cursor.js +72 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/registry.d.ts +10 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +30 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/select-targets.d.ts +22 -0
- package/dist/adapters/select-targets.d.ts.map +1 -0
- package/dist/adapters/select-targets.js +65 -0
- package/dist/adapters/select-targets.js.map +1 -0
- package/dist/adapters/types.d.ts +83 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +10 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/approval/mcp-flow.js +2 -2
- package/dist/audit/jsonl.d.ts +2 -2
- package/dist/audit/jsonl.d.ts.map +1 -1
- package/dist/audit/jsonl.js +4 -3
- package/dist/audit/jsonl.js.map +1 -1
- package/dist/bridge/execution-ticket.js +2 -2
- package/dist/bridge/execution-ticket.js.map +1 -1
- package/dist/bridge/guard-storage-root.d.ts +14 -1
- package/dist/bridge/guard-storage-root.d.ts.map +1 -1
- package/dist/bridge/guard-storage-root.js +49 -2
- package/dist/bridge/guard-storage-root.js.map +1 -1
- package/dist/bridge/pending-approval-index.d.ts.map +1 -1
- package/dist/bridge/pending-approval-index.js +5 -7
- package/dist/bridge/pending-approval-index.js.map +1 -1
- package/dist/bridge/shell-approval-bridge.d.ts.map +1 -1
- package/dist/bridge/shell-approval-bridge.js +2 -1
- package/dist/bridge/shell-approval-bridge.js.map +1 -1
- package/dist/cli/cursor-config/constants.d.ts +1 -0
- package/dist/cli/cursor-config/constants.d.ts.map +1 -1
- package/dist/cli/cursor-config/constants.js +1 -0
- package/dist/cli/cursor-config/constants.js.map +1 -1
- package/dist/cli/cursor-config/mcp-config.d.ts.map +1 -1
- package/dist/cli/cursor-config/mcp-config.js +11 -8
- package/dist/cli/cursor-config/mcp-config.js.map +1 -1
- package/dist/cli/cursor-config.d.ts +2 -1
- package/dist/cli/cursor-config.d.ts.map +1 -1
- package/dist/cli/cursor-config.js +1 -1
- package/dist/cli/cursor-config.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +51 -24
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +7 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/setup-all.d.ts +3 -2
- package/dist/cli/setup-all.d.ts.map +1 -1
- package/dist/cli/setup-all.js +34 -21
- package/dist/cli/setup-all.js.map +1 -1
- package/dist/cli/setup-cloud.d.ts +2 -0
- package/dist/cli/setup-cloud.d.ts.map +1 -1
- package/dist/cli/setup-cloud.js +20 -8
- package/dist/cli/setup-cloud.js.map +1 -1
- package/dist/cli/setup-doctor.d.ts.map +1 -1
- package/dist/cli/setup-doctor.js +50 -29
- package/dist/cli/setup-doctor.js.map +1 -1
- package/dist/cli/setup-hook.d.ts +3 -2
- package/dist/cli/setup-hook.d.ts.map +1 -1
- package/dist/cli/setup-hook.js +23 -14
- package/dist/cli/setup-hook.js.map +1 -1
- package/dist/cli/setup-mcp.d.ts +2 -0
- package/dist/cli/setup-mcp.d.ts.map +1 -1
- package/dist/cli/setup-mcp.js +16 -8
- package/dist/cli/setup-mcp.js.map +1 -1
- package/dist/hooks/run-claude-code-pre-tool-use.d.ts +13 -0
- package/dist/hooks/run-claude-code-pre-tool-use.d.ts.map +1 -0
- package/dist/hooks/run-claude-code-pre-tool-use.js +203 -0
- package/dist/hooks/run-claude-code-pre-tool-use.js.map +1 -0
- package/dist/mcp/guard-approval-block.js +1 -1
- package/dist/mcp/guard-heartbeat.d.ts +13 -0
- package/dist/mcp/guard-heartbeat.d.ts.map +1 -1
- package/dist/mcp/guard-heartbeat.js +11 -6
- package/dist/mcp/guard-heartbeat.js.map +1 -1
- package/dist/telemetry/agent-host.d.ts +11 -0
- package/dist/telemetry/agent-host.d.ts.map +1 -0
- package/dist/telemetry/agent-host.js +8 -0
- package/dist/telemetry/agent-host.js.map +1 -0
- package/dist/telemetry/guard-events.d.ts.map +1 -1
- package/dist/telemetry/guard-events.js +2 -0
- package/dist/telemetry/guard-events.js.map +1 -1
- package/package.json +2 -2
package/dist/cli/setup-hook.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { AgentId, HookScope } from "../adapters/types.js";
|
|
2
2
|
export type HookSetupOptions = {
|
|
3
|
-
scope:
|
|
3
|
+
scope: HookScope;
|
|
4
4
|
projectDir: string;
|
|
5
5
|
explicitHooksPath?: string;
|
|
6
6
|
dryRun: boolean;
|
|
7
|
+
forIds: AgentId[];
|
|
7
8
|
};
|
|
8
9
|
export declare function parseSetupHookOptions(args: string[]): HookSetupOptions;
|
|
9
10
|
export declare function runSetupHook(args: string[]): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-hook.d.ts","sourceRoot":"","sources":["../../src/cli/setup-hook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup-hook.d.ts","sourceRoot":"","sources":["../../src/cli/setup-hook.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB,CAAC;AAMF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAqCtE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBhE"}
|
package/dist/cli/setup-hook.js
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
import process from "node:process";
|
|
2
|
-
import {
|
|
2
|
+
import { parseForFlag, selectTargetAdapters } from "../adapters/select-targets.js";
|
|
3
3
|
function isCliFlag(arg) {
|
|
4
4
|
return arg.startsWith("-");
|
|
5
5
|
}
|
|
6
6
|
export function parseSetupHookOptions(args) {
|
|
7
|
+
const { forIds, rest } = parseForFlag(args);
|
|
7
8
|
let scope = "global";
|
|
8
9
|
let projectDir = process.cwd();
|
|
9
10
|
let explicitHooksPath;
|
|
10
11
|
let dryRun = false;
|
|
11
|
-
for (let i = 0; i <
|
|
12
|
-
const arg =
|
|
12
|
+
for (let i = 0; i < rest.length; i++) {
|
|
13
|
+
const arg = rest[i];
|
|
13
14
|
if (arg === "--dry-run") {
|
|
14
15
|
dryRun = true;
|
|
15
16
|
continue;
|
|
16
17
|
}
|
|
17
18
|
if (arg === "--hooks-config") {
|
|
18
|
-
const value =
|
|
19
|
+
const value = rest[i + 1];
|
|
19
20
|
if (!value)
|
|
20
21
|
throw new Error("Missing value for --hooks-config");
|
|
21
22
|
explicitHooksPath = value;
|
|
@@ -24,7 +25,7 @@ export function parseSetupHookOptions(args) {
|
|
|
24
25
|
}
|
|
25
26
|
if (arg === "--project") {
|
|
26
27
|
scope = "project";
|
|
27
|
-
const value =
|
|
28
|
+
const value = rest[i + 1];
|
|
28
29
|
if (value && !isCliFlag(value)) {
|
|
29
30
|
projectDir = value;
|
|
30
31
|
i++;
|
|
@@ -36,17 +37,25 @@ export function parseSetupHookOptions(args) {
|
|
|
36
37
|
if (explicitHooksPath && scope === "project") {
|
|
37
38
|
throw new Error("Use either --project or --hooks-config, not both.");
|
|
38
39
|
}
|
|
39
|
-
return { scope, projectDir, explicitHooksPath, dryRun };
|
|
40
|
+
return { scope, projectDir, explicitHooksPath, dryRun, forIds };
|
|
40
41
|
}
|
|
41
42
|
export async function runSetupHook(args) {
|
|
42
43
|
const opts = parseSetupHookOptions(args);
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
const targets = selectTargetAdapters(opts.forIds);
|
|
45
|
+
process.stdout.write(`setup hook (${targets.map((a) => a.id).join(", ")}):\n`);
|
|
46
|
+
for (const adapter of targets) {
|
|
47
|
+
if (!adapter.upsertHook) {
|
|
48
|
+
process.stdout.write(` ${adapter.id}: not supported (this agent has no pre-tool hooks)\n`);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const result = await adapter.upsertHook({
|
|
52
|
+
scope: opts.scope,
|
|
53
|
+
projectDir: opts.projectDir,
|
|
54
|
+
explicitPath: opts.explicitHooksPath,
|
|
55
|
+
dryRun: opts.dryRun,
|
|
56
|
+
});
|
|
57
|
+
process.stdout.write(` ${adapter.id}: ${result.message}\n`);
|
|
58
|
+
process.stdout.write(` path: ${result.path}\n`);
|
|
59
|
+
}
|
|
51
60
|
}
|
|
52
61
|
//# sourceMappingURL=setup-hook.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-hook.js","sourceRoot":"","sources":["../../src/cli/setup-hook.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,
|
|
1
|
+
{"version":3,"file":"setup-hook.js","sourceRoot":"","sources":["../../src/cli/setup-hook.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/setup-mcp.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import type { AgentId } from "../adapters/types.js";
|
|
1
2
|
type McpOptions = {
|
|
2
3
|
userConfigPath?: string;
|
|
3
4
|
dryRun: boolean;
|
|
5
|
+
forIds: AgentId[];
|
|
4
6
|
};
|
|
5
7
|
export declare function parseSetupMcpOptions(args: string[]): McpOptions;
|
|
6
8
|
export declare function runSetupMcp(args: string[]): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-mcp.d.ts","sourceRoot":"","sources":["../../src/cli/setup-mcp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup-mcp.d.ts","sourceRoot":"","sources":["../../src/cli/setup-mcp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,KAAK,UAAU,GAAG;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAsB/D;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAa/D"}
|
package/dist/cli/setup-mcp.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import process from "node:process";
|
|
2
|
-
import {
|
|
2
|
+
import { parseForFlag, selectTargetAdapters } from "../adapters/select-targets.js";
|
|
3
3
|
export function parseSetupMcpOptions(args) {
|
|
4
|
+
const { forIds, rest } = parseForFlag(args);
|
|
4
5
|
let userConfigPath;
|
|
5
6
|
let dryRun = false;
|
|
6
|
-
for (let i = 0; i <
|
|
7
|
-
const arg =
|
|
7
|
+
for (let i = 0; i < rest.length; i++) {
|
|
8
|
+
const arg = rest[i];
|
|
8
9
|
if (arg === "--dry-run") {
|
|
9
10
|
dryRun = true;
|
|
10
11
|
continue;
|
|
11
12
|
}
|
|
12
13
|
if (arg === "--user-config") {
|
|
13
|
-
const value =
|
|
14
|
+
const value = rest[i + 1];
|
|
14
15
|
if (!value)
|
|
15
16
|
throw new Error("Missing value for --user-config");
|
|
16
17
|
userConfigPath = value;
|
|
@@ -19,12 +20,19 @@ export function parseSetupMcpOptions(args) {
|
|
|
19
20
|
}
|
|
20
21
|
throw new Error(`Unknown setup mcp option: ${arg}`);
|
|
21
22
|
}
|
|
22
|
-
return { userConfigPath, dryRun };
|
|
23
|
+
return { userConfigPath, dryRun, forIds };
|
|
23
24
|
}
|
|
24
25
|
export async function runSetupMcp(args) {
|
|
25
26
|
const opts = parseSetupMcpOptions(args);
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const targets = selectTargetAdapters(opts.forIds);
|
|
28
|
+
// --user-config only applies to Cursor (it overrides ~/.cursor/mcp.json).
|
|
29
|
+
// Pass it through only when Cursor is among the targets.
|
|
30
|
+
process.stdout.write(`setup mcp (${targets.map((a) => a.id).join(", ")}):\n`);
|
|
31
|
+
for (const adapter of targets) {
|
|
32
|
+
const explicitPath = adapter.id === "cursor" ? opts.userConfigPath : undefined;
|
|
33
|
+
const result = await adapter.upsertMcp({ explicitPath, dryRun: opts.dryRun });
|
|
34
|
+
process.stdout.write(` ${adapter.id}: ${result.message}\n`);
|
|
35
|
+
process.stdout.write(` path: ${result.path}\n`);
|
|
36
|
+
}
|
|
29
37
|
}
|
|
30
38
|
//# sourceMappingURL=setup-mcp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-mcp.js","sourceRoot":"","sources":["../../src/cli/setup-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"setup-mcp.js","sourceRoot":"","sources":["../../src/cli/setup-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AASnF,MAAM,UAAU,oBAAoB,CAAC,IAAc;IACjD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,cAAkC,CAAC;IACvC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAC/D,cAAc,GAAG,KAAK,CAAC;YACvB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAElD,0EAA0E;IAC1E,yDAAyD;IACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9E,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code PreToolUse hook handler.
|
|
3
|
+
*
|
|
4
|
+
* Reads the Claude Code PreToolUse JSON payload from stdin, classifies the
|
|
5
|
+
* shell command against Praxis policy, and writes a block/approve decision
|
|
6
|
+
* to stdout. For MUTATE tier, also checks for an existing execution ticket
|
|
7
|
+
* (written by the guard MCP tool after human approval) and allows if found.
|
|
8
|
+
*
|
|
9
|
+
* Simpler than run-before-shell.ts: no inline approval creation, no bridge
|
|
10
|
+
* writes — approval always goes through the guard MCP tool.
|
|
11
|
+
*/
|
|
12
|
+
export declare function runClaudeCodePreToolUseHookFromStdin(): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=run-claude-code-pre-tool-use.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-claude-code-pre-tool-use.d.ts","sourceRoot":"","sources":["../../src/hooks/run-claude-code-pre-tool-use.ts"],"names":[],"mappings":"AAqFA;;;;;;;;;;GAUG;AACH,wBAAsB,oCAAoC,IAAI,OAAO,CAAC,IAAI,CAAC,CAmJ1E"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { classifyArgv, loadPoliciesV1, readPoliciesV1Revision } from "../policy/index.js";
|
|
2
|
+
import { appendAuditJsonl } from "../audit/jsonl.js";
|
|
3
|
+
import { getInstallId } from "../cli/install-id.js";
|
|
4
|
+
import { DEFAULT_GOVERNED_SHELL_TOOLS } from "../shell/governed-tools.js";
|
|
5
|
+
import { parseCommandToArgv } from "../shell/parse.js";
|
|
6
|
+
import { resolveGuardStorageRoot } from "../bridge/guard-storage-root.js";
|
|
7
|
+
import { tryConsumeExecutionTicket } from "../bridge/execution-ticket.js";
|
|
8
|
+
import { sendGuardEvent } from "../telemetry/guard-events.js";
|
|
9
|
+
const AGENT = "claude-code";
|
|
10
|
+
const MUTATE_AGENT_MESSAGE = `[PRAXIS GUARD] This action requires human approval (MUTATE tier).\n\n` +
|
|
11
|
+
`Use the guard MCP tool to request approval:\n` +
|
|
12
|
+
` guard(mode="enforce", proposal={kind: "shell", argv: <argv>})\n` +
|
|
13
|
+
`Then use guard_wait with the returned request_id to poll for the decision.\n` +
|
|
14
|
+
`Do NOT retry this Bash command directly — wait for guard_wait to complete.`;
|
|
15
|
+
const DESTRUCTIVE_AGENT_MESSAGE = `[PRAXIS GUARD] Destructive action blocked. This action cannot be approved ` +
|
|
16
|
+
`via the guard MCP tool. It must be reviewed and executed manually outside ` +
|
|
17
|
+
`the agent session. Do not suggest workarounds or bypass steps.`;
|
|
18
|
+
async function readStdinJson() {
|
|
19
|
+
return await new Promise((resolve, reject) => {
|
|
20
|
+
let data = "";
|
|
21
|
+
process.stdin.setEncoding("utf8");
|
|
22
|
+
process.stdin.on("data", (chunk) => (data += chunk));
|
|
23
|
+
process.stdin.on("end", () => {
|
|
24
|
+
try {
|
|
25
|
+
resolve(JSON.parse(data));
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
reject(e);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function writeDecision(decision) {
|
|
34
|
+
process.stdout.write(JSON.stringify(decision));
|
|
35
|
+
}
|
|
36
|
+
async function tryAppendAuditEvent(evt, auditLogRoot) {
|
|
37
|
+
try {
|
|
38
|
+
await appendAuditJsonl(evt, auditLogRoot);
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
42
|
+
process.stderr.write(`[auditor] audit log append failed: ${msg}\n`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function tierToDecision(tier, command) {
|
|
46
|
+
if (tier === "READ")
|
|
47
|
+
return { decision: "approve" };
|
|
48
|
+
if (tier === "DESTRUCTIVE")
|
|
49
|
+
return { decision: "block", reason: DESTRUCTIVE_AGENT_MESSAGE };
|
|
50
|
+
// MUTATE
|
|
51
|
+
return {
|
|
52
|
+
decision: "block",
|
|
53
|
+
reason: MUTATE_AGENT_MESSAGE.replace("<argv>", JSON.stringify(parseCommandToArgv(command))),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Claude Code PreToolUse hook handler.
|
|
58
|
+
*
|
|
59
|
+
* Reads the Claude Code PreToolUse JSON payload from stdin, classifies the
|
|
60
|
+
* shell command against Praxis policy, and writes a block/approve decision
|
|
61
|
+
* to stdout. For MUTATE tier, also checks for an existing execution ticket
|
|
62
|
+
* (written by the guard MCP tool after human approval) and allows if found.
|
|
63
|
+
*
|
|
64
|
+
* Simpler than run-before-shell.ts: no inline approval creation, no bridge
|
|
65
|
+
* writes — approval always goes through the guard MCP tool.
|
|
66
|
+
*/
|
|
67
|
+
export async function runClaudeCodePreToolUseHookFromStdin() {
|
|
68
|
+
const decisionStarted = performance.now();
|
|
69
|
+
let payload;
|
|
70
|
+
try {
|
|
71
|
+
payload = await readStdinJson();
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
// Fail-closed: malformed stdin → block
|
|
75
|
+
const reason = `[PRAXIS GUARD] internal error (fail-closed): ${String(e)}`;
|
|
76
|
+
writeDecision({ decision: "block", reason });
|
|
77
|
+
process.exitCode = 2;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const command = payload.tool_input?.command ?? "";
|
|
81
|
+
const cwd = typeof payload.cwd === "string" ? payload.cwd : undefined;
|
|
82
|
+
if (!command.trim()) {
|
|
83
|
+
writeDecision({ decision: "approve" });
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const argv = parseCommandToArgv(command);
|
|
87
|
+
const tool = argv[0];
|
|
88
|
+
if (!tool || !DEFAULT_GOVERNED_SHELL_TOOLS.includes(tool)) {
|
|
89
|
+
const latency_ms = performance.now() - decisionStarted;
|
|
90
|
+
writeDecision({ decision: "approve" });
|
|
91
|
+
await tryAppendAuditEvent({
|
|
92
|
+
ts: new Date().toISOString(),
|
|
93
|
+
hook: "claudeCodePreToolUse",
|
|
94
|
+
agent: AGENT,
|
|
95
|
+
cwd,
|
|
96
|
+
command,
|
|
97
|
+
argv,
|
|
98
|
+
status: "skipped",
|
|
99
|
+
skipped: true,
|
|
100
|
+
skip_reason: "ungoverned_shell_tool",
|
|
101
|
+
tier: "READ",
|
|
102
|
+
decision: "approve",
|
|
103
|
+
latency_ms,
|
|
104
|
+
}, cwd);
|
|
105
|
+
const policyRevision = await readPoliciesV1Revision();
|
|
106
|
+
await sendGuardEvent({
|
|
107
|
+
ts: new Date().toISOString(),
|
|
108
|
+
status: "skipped",
|
|
109
|
+
skipped: true,
|
|
110
|
+
skip_reason: "ungoverned_shell_tool",
|
|
111
|
+
tool: "auditor-hook",
|
|
112
|
+
agent: AGENT,
|
|
113
|
+
command_path: tool,
|
|
114
|
+
verb: argv[1] ?? null,
|
|
115
|
+
resource: argv.length > 2 ? argv.slice(2).join(" ") : null,
|
|
116
|
+
reason: "ungoverned_shell_tool",
|
|
117
|
+
cmd: command,
|
|
118
|
+
tier: "READ",
|
|
119
|
+
decision: "allow",
|
|
120
|
+
latency_ms,
|
|
121
|
+
installId: getInstallId(),
|
|
122
|
+
kind: "shell",
|
|
123
|
+
...(policyRevision !== null ? { policy_revision: policyRevision } : {}),
|
|
124
|
+
meta: { hook: "claudeCodePreToolUse" },
|
|
125
|
+
});
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
let policy;
|
|
129
|
+
let policyRevision;
|
|
130
|
+
try {
|
|
131
|
+
[policy, policyRevision] = await Promise.all([loadPoliciesV1(), readPoliciesV1Revision()]);
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
// Fail-closed: policy load failure → block
|
|
135
|
+
const reason = `[PRAXIS GUARD] internal error (fail-closed): failed to load policy: ${String(e)}`;
|
|
136
|
+
writeDecision({ decision: "block", reason });
|
|
137
|
+
process.exitCode = 2;
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const { classification, flags } = classifyArgv(policy, argv);
|
|
141
|
+
let tier = classification.tier;
|
|
142
|
+
const reasons = [];
|
|
143
|
+
if (!classification.matched)
|
|
144
|
+
reasons.push("unknown_command(default_deny)");
|
|
145
|
+
if (flags.metacharacters)
|
|
146
|
+
reasons.push("metacharacters");
|
|
147
|
+
if (flags.dangerous_flags)
|
|
148
|
+
reasons.push("dangerous_flags");
|
|
149
|
+
if (flags.metacharacters && tier === "READ")
|
|
150
|
+
tier = "MUTATE";
|
|
151
|
+
if (flags.dangerous_flags)
|
|
152
|
+
tier = "DESTRUCTIVE";
|
|
153
|
+
const storageRoot = resolveGuardStorageRoot(cwd);
|
|
154
|
+
let finalTier = tier;
|
|
155
|
+
let ticketConsumed = false;
|
|
156
|
+
// For MUTATE, check if a human has already approved via the guard MCP tool.
|
|
157
|
+
if (tier === "MUTATE") {
|
|
158
|
+
ticketConsumed = await tryConsumeExecutionTicket(argv, { storageRoot, kind: "shell" });
|
|
159
|
+
if (ticketConsumed)
|
|
160
|
+
finalTier = "READ";
|
|
161
|
+
}
|
|
162
|
+
const decisionValue = finalTier === "READ" ? { decision: "approve" } : tierToDecision(finalTier, command);
|
|
163
|
+
const latency_ms = performance.now() - decisionStarted;
|
|
164
|
+
await tryAppendAuditEvent({
|
|
165
|
+
ts: new Date().toISOString(),
|
|
166
|
+
hook: "claudeCodePreToolUse",
|
|
167
|
+
agent: AGENT,
|
|
168
|
+
cwd,
|
|
169
|
+
command,
|
|
170
|
+
argv,
|
|
171
|
+
classification,
|
|
172
|
+
flags,
|
|
173
|
+
tier,
|
|
174
|
+
finalTier,
|
|
175
|
+
decision: decisionValue.decision,
|
|
176
|
+
ticketConsumed,
|
|
177
|
+
reasons,
|
|
178
|
+
latency_ms,
|
|
179
|
+
}, storageRoot);
|
|
180
|
+
writeDecision(decisionValue);
|
|
181
|
+
if (decisionValue.decision === "block")
|
|
182
|
+
process.exitCode = 2;
|
|
183
|
+
const status = decisionValue.decision === "approve" ? "passed" : "blocked";
|
|
184
|
+
await sendGuardEvent({
|
|
185
|
+
ts: new Date().toISOString(),
|
|
186
|
+
status,
|
|
187
|
+
tool: "auditor-hook",
|
|
188
|
+
agent: AGENT,
|
|
189
|
+
command_path: argv[0] ?? null,
|
|
190
|
+
verb: argv[1] ?? null,
|
|
191
|
+
resource: argv.length > 2 ? argv.slice(2).join(" ") : null,
|
|
192
|
+
reason: reasons[0] ?? null,
|
|
193
|
+
cmd: command,
|
|
194
|
+
tier,
|
|
195
|
+
decision: decisionValue.decision === "approve" ? "allow" : "block",
|
|
196
|
+
latency_ms,
|
|
197
|
+
installId: getInstallId(),
|
|
198
|
+
kind: "shell",
|
|
199
|
+
...(policyRevision !== null ? { policy_revision: policyRevision } : {}),
|
|
200
|
+
meta: { hook: "claudeCodePreToolUse", ticketConsumed },
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=run-claude-code-pre-tool-use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-claude-code-pre-tool-use.js","sourceRoot":"","sources":["../../src/hooks/run-claude-code-pre-tool-use.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,7 +33,7 @@ function approvalBlockFromOutcome(outcome, fallbackRequestId) {
|
|
|
33
33
|
request_id: outcome.request_id,
|
|
34
34
|
expires_at: null,
|
|
35
35
|
open_url: null,
|
|
36
|
-
instructions: "Approval redeemed but execution ticket was not written under .
|
|
36
|
+
instructions: "Approval redeemed but execution ticket was not written under .praxis/guard/tickets. Fix permissions and call guard_wait again.",
|
|
37
37
|
redeemed: false,
|
|
38
38
|
approved_by: outcome.approved_by,
|
|
39
39
|
},
|
|
@@ -1,5 +1,18 @@
|
|
|
1
|
+
import { resolveAgentHost } from "../telemetry/agent-host.js";
|
|
1
2
|
/** Reset adaptive heartbeat backoff after guard tool activity. */
|
|
2
3
|
export declare function resetHeartbeatIdle(): void;
|
|
4
|
+
export declare function buildHeartbeatPayload(): {
|
|
5
|
+
installId: string;
|
|
6
|
+
kind: "auditor-mcp";
|
|
7
|
+
agent: ReturnType<typeof resolveAgentHost>;
|
|
8
|
+
version: string;
|
|
9
|
+
status: "running";
|
|
10
|
+
client: {
|
|
11
|
+
os: NodeJS.Platform;
|
|
12
|
+
arch: string;
|
|
13
|
+
node: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
3
16
|
export declare function sendGuardHeartbeat(): Promise<void>;
|
|
4
17
|
/** Send an initial heartbeat and schedule periodic idle heartbeats. */
|
|
5
18
|
export declare function startGuardHeartbeatLoop(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard-heartbeat.d.ts","sourceRoot":"","sources":["../../src/mcp/guard-heartbeat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"guard-heartbeat.d.ts","sourceRoot":"","sources":["../../src/mcp/guard-heartbeat.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AA0B9D,kEAAkE;AAClE,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAgB,qBAAqB,IAAI;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D,CAaA;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBxD;AAED,uEAAuE;AACvE,wBAAgB,uBAAuB,IAAI,IAAI,CAG9C"}
|
|
@@ -2,6 +2,7 @@ import { resolveGuardToken } from "../cli/credentials.js";
|
|
|
2
2
|
import { getInstallId } from "../cli/install-id.js";
|
|
3
3
|
import { AUDITOR_CLI_VERSION } from "../runtime/version.js";
|
|
4
4
|
import { prodFunctionUrl } from "../cli/function-url.js";
|
|
5
|
+
import { resolveAgentHost } from "../telemetry/agent-host.js";
|
|
5
6
|
const DEFAULT_HEARTBEAT_URL = prodFunctionUrl("guardHeartbeat");
|
|
6
7
|
const HEARTBEAT_BASE_INTERVAL_MS = 5 * 60 * 1000;
|
|
7
8
|
const HEARTBEAT_MAX_INTERVAL_MS = 30 * 60 * 1000;
|
|
@@ -25,14 +26,11 @@ function scheduleNextHeartbeat() {
|
|
|
25
26
|
export function resetHeartbeatIdle() {
|
|
26
27
|
consecutiveIdleHeartbeats = 0;
|
|
27
28
|
}
|
|
28
|
-
export
|
|
29
|
-
|
|
30
|
-
const token = resolveGuardToken();
|
|
31
|
-
if (!token)
|
|
32
|
-
return;
|
|
33
|
-
const payload = {
|
|
29
|
+
export function buildHeartbeatPayload() {
|
|
30
|
+
return {
|
|
34
31
|
installId: getInstallId(),
|
|
35
32
|
kind: "auditor-mcp",
|
|
33
|
+
agent: resolveAgentHost(),
|
|
36
34
|
version: AUDITOR_CLI_VERSION,
|
|
37
35
|
status: "running",
|
|
38
36
|
client: {
|
|
@@ -41,6 +39,13 @@ export async function sendGuardHeartbeat() {
|
|
|
41
39
|
node: process.version,
|
|
42
40
|
},
|
|
43
41
|
};
|
|
42
|
+
}
|
|
43
|
+
export async function sendGuardHeartbeat() {
|
|
44
|
+
const heartbeatUrl = process.env.PRAXIS_GUARD_HEARTBEAT_URL || DEFAULT_HEARTBEAT_URL;
|
|
45
|
+
const token = resolveGuardToken();
|
|
46
|
+
if (!token)
|
|
47
|
+
return;
|
|
48
|
+
const payload = buildHeartbeatPayload();
|
|
44
49
|
try {
|
|
45
50
|
const res = await fetch(heartbeatUrl, {
|
|
46
51
|
method: "POST",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard-heartbeat.js","sourceRoot":"","sources":["../../src/mcp/guard-heartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"guard-heartbeat.js","sourceRoot":"","sources":["../../src/mcp/guard-heartbeat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AgentId } from "../adapters/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Identifies which agent host (Cursor, Claude Desktop, …) spawned the running
|
|
4
|
+
* MCP server. Set on the MCP server entry's `env` by each adapter's `upsertMcp`.
|
|
5
|
+
*
|
|
6
|
+
* Returns "unknown" when the env var is unset (legacy installs that pre-date
|
|
7
|
+
* adapter tagging). See docs/auditor-cli-multi-agent-adapter-design.md § PR 3.
|
|
8
|
+
*/
|
|
9
|
+
export type AgentHost = AgentId | "unknown";
|
|
10
|
+
export declare function resolveAgentHost(): AgentHost;
|
|
11
|
+
//# sourceMappingURL=agent-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-host.d.ts","sourceRoot":"","sources":["../../src/telemetry/agent-host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAI5C,wBAAgB,gBAAgB,IAAI,SAAS,CAI5C"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const KNOWN_HOSTS = ["cursor", "claude-desktop", "claude-code", "unknown"];
|
|
2
|
+
export function resolveAgentHost() {
|
|
3
|
+
const raw = process.env.PRAXIS_AGENT_HOST?.trim();
|
|
4
|
+
if (!raw)
|
|
5
|
+
return "unknown";
|
|
6
|
+
return KNOWN_HOSTS.includes(raw) ? raw : "unknown";
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=agent-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-host.js","sourceRoot":"","sources":["../../src/telemetry/agent-host.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,GAAyB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;AAEjG,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,OAAQ,WAAiC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard-events.d.ts","sourceRoot":"","sources":["../../src/telemetry/guard-events.ts"],"names":[],"mappings":"AAAA,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"guard-events.d.ts","sourceRoot":"","sources":["../../src/telemetry/guard-events.ts"],"names":[],"mappings":"AAAA,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA0BjD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoE9E"}
|
|
@@ -3,6 +3,7 @@ import { resolveGuardToken } from "../cli/credentials.js";
|
|
|
3
3
|
import { getInstallId } from "../cli/install-id.js";
|
|
4
4
|
import { prodFunctionUrl } from "../cli/function-url.js";
|
|
5
5
|
import { AUDITOR_CLI_VERSION } from "../runtime/version.js";
|
|
6
|
+
import { resolveAgentHost } from "./agent-host.js";
|
|
6
7
|
function getGuardEventUrl() {
|
|
7
8
|
if (process.env.PRAXIS_GUARD_EVENT_URL)
|
|
8
9
|
return process.env.PRAXIS_GUARD_EVENT_URL;
|
|
@@ -56,6 +57,7 @@ export async function sendGuardEvent(payload) {
|
|
|
56
57
|
const body = {
|
|
57
58
|
...payload,
|
|
58
59
|
installId,
|
|
60
|
+
agent: typeof payload.agent === "string" ? payload.agent : resolveAgentHost(),
|
|
59
61
|
version: AUDITOR_CLI_VERSION,
|
|
60
62
|
};
|
|
61
63
|
const res = await fetch(eventUrl, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard-events.js","sourceRoot":"","sources":["../../src/telemetry/guard-events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"guard-events.js","sourceRoot":"","sources":["../../src/telemetry/guard-events.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxis.guard/auditor-cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.37",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"lint": "eslint .",
|
|
23
23
|
"typecheck": "tsc -p tsconfig.json",
|
|
24
24
|
"pretest": "pnpm run build",
|
|
25
|
-
"test": "node --import tsx/esm --test src/**/*.test.ts",
|
|
25
|
+
"test": "node --import tsx/esm --test --test-reporter=tap --test-reporter-destination=stderr src/**/*.test.ts",
|
|
26
26
|
"mcp:dev": "tsx src/cli.ts mcp",
|
|
27
27
|
"prepack": "pnpm run build && node scripts/prepare-package.cjs",
|
|
28
28
|
"e2e:pack-install": "bash scripts/e2e-pack-install.sh",
|