@praxis.guard/auditor-cli 0.0.35 → 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.
Files changed (99) hide show
  1. package/README.md +15 -4
  2. package/dist/adapters/claude-code.d.ts +34 -0
  3. package/dist/adapters/claude-code.d.ts.map +1 -0
  4. package/dist/adapters/claude-code.js +239 -0
  5. package/dist/adapters/claude-code.js.map +1 -0
  6. package/dist/adapters/claude-desktop.d.ts +20 -0
  7. package/dist/adapters/claude-desktop.d.ts.map +1 -0
  8. package/dist/adapters/claude-desktop.js +133 -0
  9. package/dist/adapters/claude-desktop.js.map +1 -0
  10. package/dist/adapters/cursor.d.ts +18 -0
  11. package/dist/adapters/cursor.d.ts.map +1 -0
  12. package/dist/adapters/cursor.js +72 -0
  13. package/dist/adapters/cursor.js.map +1 -0
  14. package/dist/adapters/registry.d.ts +10 -0
  15. package/dist/adapters/registry.d.ts.map +1 -0
  16. package/dist/adapters/registry.js +30 -0
  17. package/dist/adapters/registry.js.map +1 -0
  18. package/dist/adapters/select-targets.d.ts +22 -0
  19. package/dist/adapters/select-targets.d.ts.map +1 -0
  20. package/dist/adapters/select-targets.js +65 -0
  21. package/dist/adapters/select-targets.js.map +1 -0
  22. package/dist/adapters/types.d.ts +83 -0
  23. package/dist/adapters/types.d.ts.map +1 -0
  24. package/dist/adapters/types.js +10 -0
  25. package/dist/adapters/types.js.map +1 -0
  26. package/dist/approval/mcp-flow.js +2 -2
  27. package/dist/audit/jsonl.d.ts +2 -2
  28. package/dist/audit/jsonl.d.ts.map +1 -1
  29. package/dist/audit/jsonl.js +4 -3
  30. package/dist/audit/jsonl.js.map +1 -1
  31. package/dist/bridge/execution-ticket.js +2 -2
  32. package/dist/bridge/execution-ticket.js.map +1 -1
  33. package/dist/bridge/guard-storage-root.d.ts +14 -1
  34. package/dist/bridge/guard-storage-root.d.ts.map +1 -1
  35. package/dist/bridge/guard-storage-root.js +49 -2
  36. package/dist/bridge/guard-storage-root.js.map +1 -1
  37. package/dist/bridge/pending-approval-index.d.ts.map +1 -1
  38. package/dist/bridge/pending-approval-index.js +5 -7
  39. package/dist/bridge/pending-approval-index.js.map +1 -1
  40. package/dist/bridge/shell-approval-bridge.d.ts.map +1 -1
  41. package/dist/bridge/shell-approval-bridge.js +2 -1
  42. package/dist/bridge/shell-approval-bridge.js.map +1 -1
  43. package/dist/cli/cursor-config/constants.d.ts +1 -0
  44. package/dist/cli/cursor-config/constants.d.ts.map +1 -1
  45. package/dist/cli/cursor-config/constants.js +1 -0
  46. package/dist/cli/cursor-config/constants.js.map +1 -1
  47. package/dist/cli/cursor-config/mcp-config.d.ts.map +1 -1
  48. package/dist/cli/cursor-config/mcp-config.js +11 -8
  49. package/dist/cli/cursor-config/mcp-config.js.map +1 -1
  50. package/dist/cli/cursor-config.d.ts +2 -1
  51. package/dist/cli/cursor-config.d.ts.map +1 -1
  52. package/dist/cli/cursor-config.js +1 -1
  53. package/dist/cli/cursor-config.js.map +1 -1
  54. package/dist/cli/doctor.d.ts.map +1 -1
  55. package/dist/cli/doctor.js +51 -24
  56. package/dist/cli/doctor.js.map +1 -1
  57. package/dist/cli/main.d.ts.map +1 -1
  58. package/dist/cli/main.js +7 -1
  59. package/dist/cli/main.js.map +1 -1
  60. package/dist/cli/setup-all.d.ts +3 -2
  61. package/dist/cli/setup-all.d.ts.map +1 -1
  62. package/dist/cli/setup-all.js +34 -21
  63. package/dist/cli/setup-all.js.map +1 -1
  64. package/dist/cli/setup-cloud.d.ts +2 -0
  65. package/dist/cli/setup-cloud.d.ts.map +1 -1
  66. package/dist/cli/setup-cloud.js +20 -8
  67. package/dist/cli/setup-cloud.js.map +1 -1
  68. package/dist/cli/setup-doctor.d.ts.map +1 -1
  69. package/dist/cli/setup-doctor.js +50 -29
  70. package/dist/cli/setup-doctor.js.map +1 -1
  71. package/dist/cli/setup-hook.d.ts +3 -2
  72. package/dist/cli/setup-hook.d.ts.map +1 -1
  73. package/dist/cli/setup-hook.js +23 -14
  74. package/dist/cli/setup-hook.js.map +1 -1
  75. package/dist/cli/setup-mcp.d.ts +2 -0
  76. package/dist/cli/setup-mcp.d.ts.map +1 -1
  77. package/dist/cli/setup-mcp.js +16 -8
  78. package/dist/cli/setup-mcp.js.map +1 -1
  79. package/dist/hooks/run-claude-code-pre-tool-use.d.ts +13 -0
  80. package/dist/hooks/run-claude-code-pre-tool-use.d.ts.map +1 -0
  81. package/dist/hooks/run-claude-code-pre-tool-use.js +203 -0
  82. package/dist/hooks/run-claude-code-pre-tool-use.js.map +1 -0
  83. package/dist/mcp/guard-approval-block.js +1 -1
  84. package/dist/mcp/guard-heartbeat.d.ts +13 -0
  85. package/dist/mcp/guard-heartbeat.d.ts.map +1 -1
  86. package/dist/mcp/guard-heartbeat.js +11 -6
  87. package/dist/mcp/guard-heartbeat.js.map +1 -1
  88. package/dist/policies.v1.json +140 -0
  89. package/dist/shell/governed-tools.d.ts.map +1 -1
  90. package/dist/shell/governed-tools.js +7 -1
  91. package/dist/shell/governed-tools.js.map +1 -1
  92. package/dist/telemetry/agent-host.d.ts +11 -0
  93. package/dist/telemetry/agent-host.d.ts.map +1 -0
  94. package/dist/telemetry/agent-host.js +8 -0
  95. package/dist/telemetry/agent-host.js.map +1 -0
  96. package/dist/telemetry/guard-events.d.ts.map +1 -1
  97. package/dist/telemetry/guard-events.js +2 -0
  98. package/dist/telemetry/guard-events.js.map +1 -1
  99. package/package.json +2 -2
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @praxis/auditor-cli
2
2
 
3
- Shared **guard runtime** for Praxis shell policy: argv parsing (`shell-quote`), `evaluateShellProposal` / `evaluateArgv` / `gateShellCommand`, JSONL audit append, and the **shell approval bridge** under `.cursor/guard/bridge`.
3
+ Shared **guard runtime** for Praxis shell policy: argv parsing (`shell-quote`), `evaluateShellProposal` / `evaluateArgv` / `gateShellCommand`, JSONL audit append, and the **shell approval bridge** under `.praxis/guard/bridge`.
4
4
 
5
5
  ## Single entry: `auditor`
6
6
 
@@ -8,14 +8,25 @@ Use one built binary for **MCP stdio**, **Cursor hook**, and diagnostics:
8
8
 
9
9
  | Surface | Command |
10
10
  |--------|---------|
11
- | **MCP** (`mcp.json`) | `auditor` + args `["mcp"]`, or `node …/auditor-cli/dist/cli.js mcp` |
11
+ | **MCP** (`mcp.json` / `claude_desktop_config.json`) | `auditor` + args `["mcp"]`, or `node …/auditor-cli/dist/cli.js mcp` |
12
12
  | **Hook** (`.cursor/hooks.json`) | `node …/auditor-cli/dist/cli.js hook before-shell` (or `auditor hook before-shell` if `auditor` is on `PATH`) |
13
13
 
14
14
  Legacy configs that still reference `guard-mcp` are migrated by `auditor setup all` / `auditor setup doctor`.
15
15
 
16
+ ## Supported agent hosts
17
+
18
+ Each `auditor setup` command auto-detects installed agents and configures all of them. Use `--for=<agent>` (repeatable) to scope explicitly.
19
+
20
+ | Agent | MCP | Pre-tool hooks | Cloud Agents |
21
+ |-------|-----|----------------|--------------|
22
+ | **Cursor** (`--for=cursor`) | `~/.cursor/mcp.json` | `~/.cursor/hooks.json` (or `.cursor/hooks.json` per-project) | `.cursor/environment.json` |
23
+ | **Claude Desktop** (`--for=claude-desktop`) | `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) / `%APPDATA%/Claude/claude_desktop_config.json` (Windows) | — | — |
24
+
25
+ The MCP server tags itself with `PRAXIS_AGENT_HOST=<agent>` in its registration env so heartbeats report which host launched it. See [docs/auditor-cli-multi-agent-adapter-design.md](../../docs/auditor-cli-multi-agent-adapter-design.md) for the full design.
26
+
16
27
  ## MUTATE human approval
17
28
 
18
- Hooks **enforce** (deny without bridge). MCP **`guard`** / **`guard_wait`** **coordinate**: create `approval_requests` in Cloud Functions, human approves in the Praxis app (or dev: `auditor approvals approve` with `GUARD_APPROVAL_DEV=1`), then redeem grant and write the one-shot `.cursor/guard/bridge` file.
29
+ Hooks **enforce** (deny without bridge). MCP **`guard`** / **`guard_wait`** **coordinate**: create `approval_requests` in Cloud Functions, human approves in the Praxis app (or dev: `auditor approvals approve` with `GUARD_APPROVAL_DEV=1`), then redeem grant and write the one-shot `.praxis/guard/bridge` file.
19
30
 
20
31
  ### MCP `mode`: shadow vs enforce
21
32
 
@@ -43,7 +54,7 @@ Classification rules live in **`@praxis/auditor-policy`** (`loadPoliciesV1`, `cl
43
54
 
44
55
  One-shot approvals for terminal execution use:
45
56
 
46
- - **Directory:** `path.resolve(cwd, ".cursor/guard/bridge")`
57
+ - **Directory:** `<workspace>/.praxis/guard/bridge` (auto-detected from the hook payload `cwd`; falls back to legacy `.cursor/guard/bridge` via one-shot migration)
47
58
  - **Files:** `${sha256(JSON.stringify(argv))}_${uuid}.json` with TTL **10 minutes** (`DEFAULT_SHELL_BRIDGE_TTL_MS`).
48
59
 
49
60
  Do not change this layout without updating Cursor + MCP flows that rely on it.
@@ -0,0 +1,34 @@
1
+ import type { AgentAdapter, AgentStatus, SetupResult, StatusOpts, UpsertHookOpts, UpsertMcpOpts } from "./types.js";
2
+ /**
3
+ * Resolve the Claude Code settings file path.
4
+ *
5
+ * Set `PRAXIS_CLAUDE_CODE_SETTINGS` to override (used by tests).
6
+ */
7
+ export declare function claudeCodeSettingsPath(): string;
8
+ /**
9
+ * ClaudeCodeAdapter: hook (PreToolUse on Bash) + MCP, both in ~/.claude/settings.json.
10
+ *
11
+ * Unlike ClaudeDesktopAdapter (MCP-only), Claude Code exposes a PreToolUse hook that
12
+ * fires before every Bash tool call, giving Praxis shell governance.
13
+ *
14
+ * IMPORTANT — hook output format:
15
+ * Verify the exact format with a test script before relying on this adapter in production.
16
+ * Run docs/auditor-cli-claude-code-hook-format-test.sh and confirm Claude Code blocks.
17
+ * If the format is wrong, edit HOOK_BLOCK_RESPONSE in run-claude-code-pre-tool-use.ts.
18
+ *
19
+ * Binary path:
20
+ * The hook config uses the bare "auditor" command (consistent with Cursor's adapter),
21
+ * NOT an absolute path. Absolute paths break with mise/nvm node version upgrades.
22
+ * At setup time we warn if auditor is not on PATH, but do not abort.
23
+ *
24
+ * See docs/auditor-cli-multi-agent-adapter-design.md.
25
+ */
26
+ export declare class ClaudeCodeAdapter implements AgentAdapter {
27
+ readonly id: "claude-code";
28
+ readonly label = "Claude Code";
29
+ detectInstalled(): boolean;
30
+ upsertHook(opts: UpsertHookOpts): Promise<SetupResult>;
31
+ upsertMcp(opts: UpsertMcpOpts): Promise<SetupResult>;
32
+ status(opts?: StatusOpts): Promise<AgentStatus>;
33
+ }
34
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAEX,WAAW,EACX,UAAU,EACV,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AAQpB;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAI/C;AAyED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,QAAQ,CAAC,EAAE,EAAG,aAAa,CAAU;IACrC,QAAQ,CAAC,KAAK,iBAAiB;IAE/B,eAAe,IAAI,OAAO;IAOpB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAqDtD,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IA0CpD,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CAiCtD"}
@@ -0,0 +1,239 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ const MCP_SERVER_KEY = "praxis-guard";
6
+ const AGENT_HOST = "claude-code";
7
+ const HOOK_COMMAND = "auditor hook claude-code";
8
+ /**
9
+ * Resolve the Claude Code settings file path.
10
+ *
11
+ * Set `PRAXIS_CLAUDE_CODE_SETTINGS` to override (used by tests).
12
+ */
13
+ export function claudeCodeSettingsPath() {
14
+ const override = process.env.PRAXIS_CLAUDE_CODE_SETTINGS?.trim();
15
+ if (override)
16
+ return override;
17
+ return path.join(os.homedir(), ".claude", "settings.json");
18
+ }
19
+ async function readJson(pathname) {
20
+ try {
21
+ const raw = await readFile(pathname, "utf8");
22
+ const parsed = JSON.parse(raw);
23
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
24
+ throw new Error("JSON root must be an object");
25
+ }
26
+ return parsed;
27
+ }
28
+ catch (e) {
29
+ const msg = e instanceof Error ? e.message : String(e);
30
+ if (e.code === "ENOENT")
31
+ return null;
32
+ throw new Error([
33
+ `Invalid JSON at ${pathname}: ${msg}`,
34
+ "Refusing to overwrite existing file.",
35
+ "Fix the JSON manually or back up the file and re-run setup.",
36
+ ].join(" "));
37
+ }
38
+ }
39
+ /**
40
+ * Atomic write: write to a temp file then rename into place.
41
+ * Prevents partial writes from corrupting ~/.claude/settings.json.
42
+ */
43
+ async function writeJsonAtomic(pathname, data) {
44
+ const dir = path.dirname(pathname);
45
+ await mkdir(dir, { recursive: true });
46
+ const tmp = path.join(dir, `.${path.basename(pathname)}.tmp.${Date.now()}`);
47
+ try {
48
+ await writeFile(tmp, `${JSON.stringify(data, null, 2)}\n`, "utf8");
49
+ await rename(tmp, pathname);
50
+ }
51
+ catch (e) {
52
+ // Best-effort cleanup of the temp file on failure.
53
+ await writeFile(tmp, "", "utf8").catch(() => undefined);
54
+ throw e;
55
+ }
56
+ }
57
+ function hasConfiguredMcpServer(config) {
58
+ if (!config)
59
+ return false;
60
+ const servers = (config.mcpServers ?? {});
61
+ const server = servers[MCP_SERVER_KEY];
62
+ if (!server || typeof server !== "object")
63
+ return false;
64
+ const map = server;
65
+ if (map.command !== "auditor")
66
+ return false;
67
+ if (!Array.isArray(map.args) || map.args.length !== 1 || map.args[0] !== "mcp")
68
+ return false;
69
+ const env = map.env;
70
+ if (!env || typeof env !== "object")
71
+ return false;
72
+ return env.PRAXIS_AGENT_HOST === AGENT_HOST;
73
+ }
74
+ function hasConfiguredPreToolUseHook(config) {
75
+ if (!config)
76
+ return false;
77
+ const hooks = config.hooks;
78
+ if (!hooks || typeof hooks !== "object" || Array.isArray(hooks))
79
+ return false;
80
+ const preToolUse = hooks.PreToolUse;
81
+ if (!Array.isArray(preToolUse))
82
+ return false;
83
+ return preToolUse.some((entry) => {
84
+ if (!entry || typeof entry !== "object")
85
+ return false;
86
+ const e = entry;
87
+ if (e.matcher !== "Bash")
88
+ return false;
89
+ const innerHooks = e.hooks;
90
+ if (!Array.isArray(innerHooks))
91
+ return false;
92
+ return innerHooks.some((h) => {
93
+ if (!h || typeof h !== "object")
94
+ return false;
95
+ return h.command === HOOK_COMMAND;
96
+ });
97
+ });
98
+ }
99
+ /**
100
+ * ClaudeCodeAdapter: hook (PreToolUse on Bash) + MCP, both in ~/.claude/settings.json.
101
+ *
102
+ * Unlike ClaudeDesktopAdapter (MCP-only), Claude Code exposes a PreToolUse hook that
103
+ * fires before every Bash tool call, giving Praxis shell governance.
104
+ *
105
+ * IMPORTANT — hook output format:
106
+ * Verify the exact format with a test script before relying on this adapter in production.
107
+ * Run docs/auditor-cli-claude-code-hook-format-test.sh and confirm Claude Code blocks.
108
+ * If the format is wrong, edit HOOK_BLOCK_RESPONSE in run-claude-code-pre-tool-use.ts.
109
+ *
110
+ * Binary path:
111
+ * The hook config uses the bare "auditor" command (consistent with Cursor's adapter),
112
+ * NOT an absolute path. Absolute paths break with mise/nvm node version upgrades.
113
+ * At setup time we warn if auditor is not on PATH, but do not abort.
114
+ *
115
+ * See docs/auditor-cli-multi-agent-adapter-design.md.
116
+ */
117
+ export class ClaudeCodeAdapter {
118
+ id = "claude-code";
119
+ label = "Claude Code";
120
+ detectInstalled() {
121
+ // Check for the ~/.claude directory that Claude Code creates on first run.
122
+ // This is the same heuristic used for Cursor (~/.cursor).
123
+ const settingsDir = path.dirname(claudeCodeSettingsPath());
124
+ return existsSync(settingsDir);
125
+ }
126
+ async upsertHook(opts) {
127
+ const dryRun = opts.dryRun ?? false;
128
+ const cfgPath = opts.explicitPath?.trim() || claudeCodeSettingsPath();
129
+ const existing = await readJson(cfgPath);
130
+ const before = JSON.stringify(existing ?? {});
131
+ const config = existing ? JSON.parse(JSON.stringify(existing)) : {};
132
+ if (!config.hooks || typeof config.hooks !== "object" || Array.isArray(config.hooks)) {
133
+ config.hooks = {};
134
+ }
135
+ const hooksMap = config.hooks;
136
+ if (!Array.isArray(hooksMap.PreToolUse)) {
137
+ hooksMap.PreToolUse = [];
138
+ }
139
+ const preToolUse = hooksMap.PreToolUse;
140
+ // Remove any existing Praxis PreToolUse[Bash] entry (idempotent upsert).
141
+ const filtered = preToolUse.filter((entry) => {
142
+ if (!entry || typeof entry !== "object")
143
+ return true;
144
+ const e = entry;
145
+ if (e.matcher !== "Bash")
146
+ return true;
147
+ const innerHooks = e.hooks;
148
+ if (!Array.isArray(innerHooks))
149
+ return true;
150
+ return !innerHooks.some((h) => {
151
+ if (!h || typeof h !== "object")
152
+ return false;
153
+ return h.command === HOOK_COMMAND;
154
+ });
155
+ });
156
+ filtered.push({
157
+ matcher: "Bash",
158
+ hooks: [{ type: "command", command: HOOK_COMMAND }],
159
+ });
160
+ hooksMap.PreToolUse = filtered;
161
+ const changed = before !== JSON.stringify(config);
162
+ if (changed && !dryRun) {
163
+ await writeJsonAtomic(cfgPath, config);
164
+ }
165
+ return {
166
+ path: cfgPath,
167
+ changed,
168
+ message: changed
169
+ ? dryRun
170
+ ? "would update Claude Code hook config (PreToolUse)"
171
+ : "updated Claude Code hook config (PreToolUse)"
172
+ : "Claude Code hook config already up to date",
173
+ };
174
+ }
175
+ async upsertMcp(opts) {
176
+ const dryRun = opts.dryRun ?? false;
177
+ const cfgPath = opts.explicitPath?.trim() || claudeCodeSettingsPath();
178
+ const existing = await readJson(cfgPath);
179
+ const before = JSON.stringify(existing ?? {});
180
+ const config = existing ? JSON.parse(JSON.stringify(existing)) : {};
181
+ if (!config.mcpServers || typeof config.mcpServers !== "object" || Array.isArray(config.mcpServers)) {
182
+ config.mcpServers = {};
183
+ }
184
+ const servers = config.mcpServers;
185
+ const existingEntry = servers[MCP_SERVER_KEY] && typeof servers[MCP_SERVER_KEY] === "object"
186
+ ? servers[MCP_SERVER_KEY]
187
+ : {};
188
+ const existingEnv = existingEntry.env && typeof existingEntry.env === "object" && !Array.isArray(existingEntry.env)
189
+ ? existingEntry.env
190
+ : {};
191
+ servers[MCP_SERVER_KEY] = {
192
+ ...existingEntry,
193
+ command: "auditor",
194
+ args: ["mcp"],
195
+ env: { ...existingEnv, PRAXIS_AGENT_HOST: AGENT_HOST },
196
+ };
197
+ const changed = before !== JSON.stringify(config);
198
+ if (changed && !dryRun) {
199
+ await writeJsonAtomic(cfgPath, config);
200
+ }
201
+ return {
202
+ path: cfgPath,
203
+ changed,
204
+ message: changed
205
+ ? dryRun
206
+ ? "would update Claude Code MCP config"
207
+ : "updated Claude Code MCP config"
208
+ : "Claude Code MCP config already up to date",
209
+ };
210
+ }
211
+ async status(opts) {
212
+ const cfgPath = opts?.mcpConfigPath?.trim() || claudeCodeSettingsPath();
213
+ const config = await readJson(cfgPath).catch(() => null);
214
+ const hookConfigured = hasConfiguredPreToolUseHook(config);
215
+ const mcpConfigured = hasConfiguredMcpServer(config);
216
+ // Claude Code has one hook (PreToolUse) covering all tool calls.
217
+ // Report shell=true when PreToolUse is configured; mcp=true mirrors it
218
+ // (no separate MCP hook needed) so adapterReady() passes correctly.
219
+ const hook = {
220
+ global: {
221
+ shell: hookConfigured,
222
+ mcp: hookConfigured,
223
+ path: cfgPath,
224
+ },
225
+ };
226
+ const warnings = [];
227
+ if (hookConfigured && !mcpConfigured) {
228
+ warnings.push("Hook is configured but MCP is not. " +
229
+ "MUTATE approvals require both. Run: auditor setup mcp --for=claude-code");
230
+ }
231
+ return {
232
+ installed: this.detectInstalled(),
233
+ hook,
234
+ mcp: { configured: mcpConfigured, path: cfgPath },
235
+ warnings,
236
+ };
237
+ }
238
+ }
239
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { AgentAdapter, AgentStatus, SetupResult, StatusOpts, UpsertMcpOpts } from "./types.js";
2
+ /**
3
+ * Resolve the Claude Desktop config file path for this platform.
4
+ *
5
+ * Set `PRAXIS_CLAUDE_DESKTOP_CONFIG` to override (used by tests and edge cases).
6
+ */
7
+ export declare function claudeDesktopConfigPath(): string;
8
+ /**
9
+ * ClaudeDesktopAdapter: MCP-only adapter (no pre-tool hooks, no cloud agents).
10
+ *
11
+ * See docs/auditor-cli-multi-agent-adapter-design.md.
12
+ */
13
+ export declare class ClaudeDesktopAdapter implements AgentAdapter {
14
+ readonly id: "claude-desktop";
15
+ readonly label = "Claude Desktop";
16
+ detectInstalled(): boolean;
17
+ upsertMcp(opts: UpsertMcpOpts): Promise<SetupResult>;
18
+ status(opts?: StatusOpts): Promise<AgentStatus>;
19
+ }
20
+ //# sourceMappingURL=claude-desktop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-desktop.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-desktop.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACd,MAAM,YAAY,CAAC;AAOpB;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAchD;AAyCD;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACvD,QAAQ,CAAC,EAAE,EAAG,gBAAgB,CAAU;IACxC,QAAQ,CAAC,KAAK,oBAAoB;IAElC,eAAe,IAAI,OAAO;IAQpB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IA4CpD,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CAStD"}
@@ -0,0 +1,133 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ const MCP_SERVER_KEY = "praxis-guard";
6
+ const AGENT_HOST = "claude-desktop";
7
+ /**
8
+ * Resolve the Claude Desktop config file path for this platform.
9
+ *
10
+ * Set `PRAXIS_CLAUDE_DESKTOP_CONFIG` to override (used by tests and edge cases).
11
+ */
12
+ export function claudeDesktopConfigPath() {
13
+ const override = process.env.PRAXIS_CLAUDE_DESKTOP_CONFIG?.trim();
14
+ if (override)
15
+ return override;
16
+ const home = os.homedir();
17
+ switch (process.platform) {
18
+ case "darwin":
19
+ return path.join(home, "Library", "Application Support", "Claude", "claude_desktop_config.json");
20
+ case "win32":
21
+ return path.join(process.env.APPDATA ?? path.join(home, "AppData", "Roaming"), "Claude", "claude_desktop_config.json");
22
+ default:
23
+ // Claude Desktop is not officially distributed for Linux; treat .config/Claude/
24
+ // as a forward-looking fallback so adapter behavior is testable on CI.
25
+ return path.join(home, ".config", "Claude", "claude_desktop_config.json");
26
+ }
27
+ }
28
+ async function readJson(pathname) {
29
+ try {
30
+ const raw = await readFile(pathname, "utf8");
31
+ const parsed = JSON.parse(raw);
32
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
33
+ throw new Error("JSON root must be an object");
34
+ }
35
+ return parsed;
36
+ }
37
+ catch (e) {
38
+ const msg = e instanceof Error ? e.message : String(e);
39
+ if (e.code === "ENOENT")
40
+ return null;
41
+ throw new Error([
42
+ `Invalid JSON at ${pathname}: ${msg}`,
43
+ "Refusing to overwrite existing file.",
44
+ "Fix the JSON manually or back up the file and re-run setup.",
45
+ ].join(" "));
46
+ }
47
+ }
48
+ async function writeJson(pathname, data) {
49
+ await mkdir(path.dirname(pathname), { recursive: true });
50
+ await writeFile(pathname, `${JSON.stringify(data, null, 2)}\n`, "utf8");
51
+ }
52
+ function hasConfiguredMcpServer(config) {
53
+ if (!config)
54
+ return false;
55
+ const servers = (config.mcpServers ?? {});
56
+ const server = servers[MCP_SERVER_KEY];
57
+ if (!server || typeof server !== "object")
58
+ return false;
59
+ const map = server;
60
+ if (map.command !== "auditor")
61
+ return false;
62
+ if (!Array.isArray(map.args) || map.args.length !== 1 || map.args[0] !== "mcp")
63
+ return false;
64
+ const env = map.env;
65
+ if (!env || typeof env !== "object")
66
+ return false;
67
+ return env.PRAXIS_AGENT_HOST === AGENT_HOST;
68
+ }
69
+ /**
70
+ * ClaudeDesktopAdapter: MCP-only adapter (no pre-tool hooks, no cloud agents).
71
+ *
72
+ * See docs/auditor-cli-multi-agent-adapter-design.md.
73
+ */
74
+ export class ClaudeDesktopAdapter {
75
+ id = "claude-desktop";
76
+ label = "Claude Desktop";
77
+ detectInstalled() {
78
+ // Treat the presence of (a directory holding) the config file as "installed".
79
+ // On a clean Claude Desktop install the directory exists even before our setup runs.
80
+ const cfg = claudeDesktopConfigPath();
81
+ if (existsSync(cfg))
82
+ return true;
83
+ return existsSync(path.dirname(cfg));
84
+ }
85
+ async upsertMcp(opts) {
86
+ const dryRun = opts.dryRun ?? false;
87
+ const cfgPath = opts.explicitPath?.trim() || claudeDesktopConfigPath();
88
+ const existing = await readJson(cfgPath);
89
+ const before = JSON.stringify(existing ?? {});
90
+ const config = existing
91
+ ? JSON.parse(JSON.stringify(existing))
92
+ : {};
93
+ if (!config.mcpServers || typeof config.mcpServers !== "object" || Array.isArray(config.mcpServers)) {
94
+ config.mcpServers = {};
95
+ }
96
+ const servers = config.mcpServers;
97
+ const existingEntry = servers[MCP_SERVER_KEY] && typeof servers[MCP_SERVER_KEY] === "object"
98
+ ? servers[MCP_SERVER_KEY]
99
+ : {};
100
+ const existingEnv = existingEntry.env && typeof existingEntry.env === "object" && !Array.isArray(existingEntry.env)
101
+ ? existingEntry.env
102
+ : {};
103
+ servers[MCP_SERVER_KEY] = {
104
+ ...existingEntry,
105
+ command: "auditor",
106
+ args: ["mcp"],
107
+ env: { ...existingEnv, PRAXIS_AGENT_HOST: AGENT_HOST },
108
+ };
109
+ const changed = before !== JSON.stringify(config);
110
+ if (changed && !dryRun) {
111
+ await writeJson(cfgPath, config);
112
+ }
113
+ return {
114
+ path: cfgPath,
115
+ changed,
116
+ message: changed
117
+ ? dryRun
118
+ ? "would update Claude Desktop MCP config"
119
+ : "updated Claude Desktop MCP config"
120
+ : "Claude Desktop MCP config already up to date",
121
+ };
122
+ }
123
+ async status(opts) {
124
+ const cfgPath = opts?.mcpConfigPath?.trim() || claudeDesktopConfigPath();
125
+ const config = await readJson(cfgPath).catch(() => null);
126
+ return {
127
+ installed: this.detectInstalled(),
128
+ mcp: { configured: hasConfiguredMcpServer(config), path: cfgPath },
129
+ warnings: [],
130
+ };
131
+ }
132
+ }
133
+ //# sourceMappingURL=claude-desktop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-desktop.js","sourceRoot":"","sources":["../../src/adapters/claude-desktop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { AgentAdapter, AgentStatus, SetupResult, StatusOpts, UpsertCloudOpts, UpsertHookOpts, UpsertMcpOpts } from "./types.js";
2
+ /**
3
+ * CursorAdapter: hook + MCP + Cloud Agents (`.cursor/environment.json`) for Cursor.
4
+ *
5
+ * Delegates to the existing helpers in `cli/cursor-config.ts` so this is a
6
+ * pure structural refactor with no behavior change. See
7
+ * docs/auditor-cli-multi-agent-adapter-design.md.
8
+ */
9
+ export declare class CursorAdapter implements AgentAdapter {
10
+ readonly id: "cursor";
11
+ readonly label = "Cursor";
12
+ detectInstalled(): boolean;
13
+ upsertHook(opts: UpsertHookOpts): Promise<SetupResult>;
14
+ upsertMcp(opts: UpsertMcpOpts): Promise<SetupResult>;
15
+ upsertCloud(opts: UpsertCloudOpts): Promise<SetupResult>;
16
+ status(opts?: StatusOpts): Promise<AgentStatus>;
17
+ }
18
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/adapters/cursor.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB;;;;;;GAMG;AACH,qBAAa,aAAc,YAAW,YAAY;IAChD,QAAQ,CAAC,EAAE,EAAG,QAAQ,CAAU;IAChC,QAAQ,CAAC,KAAK,YAAY;IAE1B,eAAe,IAAI,OAAO;IAI1B,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAStD,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IAIpD,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAIlD,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CA2CtD"}
@@ -0,0 +1,72 @@
1
+ import { existsSync } from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { duplicatePraxisHooksWarning, readGlobalHooksConfigured, readMcpConfigured, readProjectHooksConfigured, readEnvironmentConfigured, resolveEnvironmentJsonPath, resolveProjectHooksPath, resolveUserHooksPath, resolveUserMcpConfigPath, upsertEnvironmentConfig, upsertHookConfig, upsertMcpConfig, } from "../cli/cursor-config.js";
5
+ /**
6
+ * CursorAdapter: hook + MCP + Cloud Agents (`.cursor/environment.json`) for Cursor.
7
+ *
8
+ * Delegates to the existing helpers in `cli/cursor-config.ts` so this is a
9
+ * pure structural refactor with no behavior change. See
10
+ * docs/auditor-cli-multi-agent-adapter-design.md.
11
+ */
12
+ export class CursorAdapter {
13
+ id = "cursor";
14
+ label = "Cursor";
15
+ detectInstalled() {
16
+ return existsSync(path.join(os.homedir(), ".cursor"));
17
+ }
18
+ upsertHook(opts) {
19
+ return upsertHookConfig({
20
+ scope: opts.scope,
21
+ projectDir: opts.projectDir,
22
+ explicitPath: opts.explicitPath,
23
+ dryRun: opts.dryRun,
24
+ });
25
+ }
26
+ upsertMcp(opts) {
27
+ return upsertMcpConfig(opts.explicitPath, opts.dryRun);
28
+ }
29
+ upsertCloud(opts) {
30
+ return upsertEnvironmentConfig(opts.projectDir, opts.dryRun);
31
+ }
32
+ async status(opts) {
33
+ const projectDir = opts?.projectDir;
34
+ const globalPath = resolveUserHooksPath();
35
+ const globalHook = await readGlobalHooksConfigured();
36
+ const projectHookEntry = projectDir
37
+ ? await (async () => {
38
+ const status = await readProjectHooksConfigured(projectDir);
39
+ return {
40
+ shell: status.shell,
41
+ mcp: status.mcp,
42
+ path: resolveProjectHooksPath(projectDir),
43
+ };
44
+ })()
45
+ : undefined;
46
+ const mcpPath = resolveUserMcpConfigPath(opts?.mcpConfigPath);
47
+ const mcpConfigured = await readMcpConfigured(opts?.mcpConfigPath);
48
+ const cloudEntry = projectDir
49
+ ? {
50
+ configured: await readEnvironmentConfigured(projectDir),
51
+ path: resolveEnvironmentJsonPath(projectDir),
52
+ }
53
+ : undefined;
54
+ const warnings = [];
55
+ if (projectDir) {
56
+ const dup = await duplicatePraxisHooksWarning(projectDir);
57
+ if (dup)
58
+ warnings.push(dup);
59
+ }
60
+ return {
61
+ installed: this.detectInstalled(),
62
+ hook: {
63
+ global: { shell: globalHook.shell, mcp: globalHook.mcp, path: globalPath },
64
+ project: projectHookEntry,
65
+ },
66
+ mcp: { configured: mcpConfigured, path: mcpPath },
67
+ cloud: cloudEntry,
68
+ warnings,
69
+ };
70
+ }
71
+ }
72
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/adapters/cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { AgentAdapter, AgentId } from "./types.js";
2
+ /**
3
+ * The set of agent adapters known to the CLI. Adding a new host is one append
4
+ * here plus the new adapter file.
5
+ */
6
+ export declare const ALL_ADAPTERS: readonly AgentAdapter[];
7
+ export declare function getAdapter(id: AgentId): AgentAdapter;
8
+ /** Adapters whose `detectInstalled()` returns true. */
9
+ export declare function detectInstalledAdapters(): AgentAdapter[];
10
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/adapters/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,YAAY,EAI/C,CAAC;AAEF,wBAAgB,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,YAAY,CAIpD;AAED,uDAAuD;AACvD,wBAAgB,uBAAuB,IAAI,YAAY,EAAE,CAQxD"}
@@ -0,0 +1,30 @@
1
+ import { ClaudeCodeAdapter } from "./claude-code.js";
2
+ import { ClaudeDesktopAdapter } from "./claude-desktop.js";
3
+ import { CursorAdapter } from "./cursor.js";
4
+ /**
5
+ * The set of agent adapters known to the CLI. Adding a new host is one append
6
+ * here plus the new adapter file.
7
+ */
8
+ export const ALL_ADAPTERS = [
9
+ new CursorAdapter(),
10
+ new ClaudeDesktopAdapter(),
11
+ new ClaudeCodeAdapter(),
12
+ ];
13
+ export function getAdapter(id) {
14
+ const found = ALL_ADAPTERS.find((a) => a.id === id);
15
+ if (!found)
16
+ throw new Error(`No agent adapter registered for id: ${id}`);
17
+ return found;
18
+ }
19
+ /** Adapters whose `detectInstalled()` returns true. */
20
+ export function detectInstalledAdapters() {
21
+ return ALL_ADAPTERS.filter((a) => {
22
+ try {
23
+ return a.detectInstalled();
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ });
29
+ }
30
+ //# sourceMappingURL=registry.js.map