@praxis.guard/auditor-cli 0.0.29 → 0.0.30
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/dist/cli/cursor-config/constants.d.ts +4 -0
- package/dist/cli/cursor-config/constants.d.ts.map +1 -0
- package/dist/cli/cursor-config/constants.js +4 -0
- package/dist/cli/cursor-config/constants.js.map +1 -0
- package/dist/cli/cursor-config/environment-config.d.ts +7 -0
- package/dist/cli/cursor-config/environment-config.d.ts.map +1 -0
- package/dist/cli/cursor-config/environment-config.js +100 -0
- package/dist/cli/cursor-config/environment-config.js.map +1 -0
- package/dist/cli/cursor-config/hooks-config.d.ts +23 -0
- package/dist/cli/cursor-config/hooks-config.d.ts.map +1 -0
- package/dist/cli/cursor-config/hooks-config.js +137 -0
- package/dist/cli/cursor-config/hooks-config.js.map +1 -0
- package/dist/cli/cursor-config/index.d.ts +8 -0
- package/dist/cli/cursor-config/index.d.ts.map +1 -0
- package/dist/cli/cursor-config/index.js +7 -0
- package/dist/cli/cursor-config/index.js.map +1 -0
- package/dist/cli/cursor-config/json-io.d.ts +5 -0
- package/dist/cli/cursor-config/json-io.d.ts.map +1 -0
- package/dist/cli/cursor-config/json-io.js +32 -0
- package/dist/cli/cursor-config/json-io.js.map +1 -0
- package/dist/cli/cursor-config/legacy-guard-mcp.d.ts +9 -0
- package/dist/cli/cursor-config/legacy-guard-mcp.d.ts.map +1 -0
- package/dist/cli/cursor-config/legacy-guard-mcp.js +73 -0
- package/dist/cli/cursor-config/legacy-guard-mcp.js.map +1 -0
- package/dist/cli/cursor-config/mcp-config.d.ts +5 -0
- package/dist/cli/cursor-config/mcp-config.d.ts.map +1 -0
- package/dist/cli/cursor-config/mcp-config.js +56 -0
- package/dist/cli/cursor-config/mcp-config.js.map +1 -0
- package/dist/cli/cursor-config/paths.d.ts +11 -0
- package/dist/cli/cursor-config/paths.d.ts.map +1 -0
- package/dist/cli/cursor-config/paths.js +27 -0
- package/dist/cli/cursor-config/paths.js.map +1 -0
- package/dist/cli/cursor-config/types.d.ts +14 -0
- package/dist/cli/cursor-config/types.d.ts.map +1 -0
- package/dist/cli/cursor-config/types.js +2 -0
- package/dist/cli/cursor-config/types.js.map +1 -0
- package/dist/cli/cursor-config.d.ts +1 -56
- package/dist/cli/cursor-config.d.ts.map +1 -1
- package/dist/cli/cursor-config.js +1 -409
- package/dist/cli/cursor-config.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/cursor-config/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAC9D,eAAO,MAAM,gBAAgB,4BAA4B,CAAC;AAC1D,eAAO,MAAM,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/cli/cursor-config/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AAC9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { JsonMap, SetupResult } from "./types.js";
|
|
2
|
+
export declare function detectMonorepoGuardInstallCommand(projectDir: string): string | null;
|
|
3
|
+
export declare function detectInstallCommand(projectDir: string): string;
|
|
4
|
+
export declare function hasConfiguredEnvironment(config: JsonMap | null): boolean;
|
|
5
|
+
export declare function upsertEnvironmentConfig(projectDir: string, dryRun?: boolean): Promise<SetupResult>;
|
|
6
|
+
export declare function readEnvironmentConfigured(projectDir: string): Promise<boolean>;
|
|
7
|
+
//# sourceMappingURL=environment-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-config.d.ts","sourceRoot":"","sources":["../../../src/cli/cursor-config/environment-config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAmBvD,wBAAgB,iCAAiC,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYnF;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAiB/D;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAExE;AAED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,MAAM,UAAQ,GACb,OAAO,CAAC,WAAW,CAAC,CAyCtB;AAED,wBAAsB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGpF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { cloneJsonMap, readJson, writeJson } from "./json-io.js";
|
|
4
|
+
import { resolveEnvironmentJsonPath } from "./paths.js";
|
|
5
|
+
function detectPackageManager(projectDir) {
|
|
6
|
+
try {
|
|
7
|
+
const raw = fs.readFileSync(path.join(projectDir, "package.json"), "utf8");
|
|
8
|
+
const pkg = JSON.parse(raw);
|
|
9
|
+
if (typeof pkg.packageManager === "string" && pkg.packageManager.startsWith("pnpm")) {
|
|
10
|
+
return "pnpm";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// No package.json or invalid — check lockfiles only
|
|
15
|
+
}
|
|
16
|
+
if (!fs.existsSync(path.join(projectDir, "package.json")))
|
|
17
|
+
return null;
|
|
18
|
+
if (fs.existsSync(path.join(projectDir, "pnpm-lock.yaml")))
|
|
19
|
+
return "pnpm";
|
|
20
|
+
if (fs.existsSync(path.join(projectDir, "yarn.lock")))
|
|
21
|
+
return "yarn";
|
|
22
|
+
return "npm";
|
|
23
|
+
}
|
|
24
|
+
export function detectMonorepoGuardInstallCommand(projectDir) {
|
|
25
|
+
const auditorCli = path.join(projectDir, "packages", "auditor-cli", "package.json");
|
|
26
|
+
const auditorPolicy = path.join(projectDir, "packages", "auditor-policy", "package.json");
|
|
27
|
+
if (!fs.existsSync(auditorCli) || !fs.existsSync(auditorPolicy))
|
|
28
|
+
return null;
|
|
29
|
+
const pm = detectPackageManager(projectDir);
|
|
30
|
+
const prefix = pm === "pnpm"
|
|
31
|
+
? "corepack enable && corepack prepare pnpm@10.33.0 --activate && pnpm install --frozen-lockfile && "
|
|
32
|
+
: pm === "yarn"
|
|
33
|
+
? "yarn install --frozen-lockfile && "
|
|
34
|
+
: "";
|
|
35
|
+
return `${prefix}pnpm -C packages/auditor-policy build && pnpm -C packages/auditor-cli build`;
|
|
36
|
+
}
|
|
37
|
+
export function detectInstallCommand(projectDir) {
|
|
38
|
+
const monorepo = detectMonorepoGuardInstallCommand(projectDir);
|
|
39
|
+
if (monorepo)
|
|
40
|
+
return monorepo;
|
|
41
|
+
const pm = detectPackageManager(projectDir);
|
|
42
|
+
switch (pm) {
|
|
43
|
+
case "pnpm":
|
|
44
|
+
return "pnpm install --frozen-lockfile";
|
|
45
|
+
case "yarn":
|
|
46
|
+
return "yarn install --frozen-lockfile";
|
|
47
|
+
case "npm":
|
|
48
|
+
return fs.existsSync(path.join(projectDir, "package-lock.json"))
|
|
49
|
+
? "npm ci"
|
|
50
|
+
: "npm install";
|
|
51
|
+
default:
|
|
52
|
+
return "npm install -g @praxis.guard/auditor-cli";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function hasConfiguredEnvironment(config) {
|
|
56
|
+
return !!config && typeof config.install === "string" && config.install.length > 0;
|
|
57
|
+
}
|
|
58
|
+
export async function upsertEnvironmentConfig(projectDir, dryRun = false) {
|
|
59
|
+
const envPath = resolveEnvironmentJsonPath(projectDir);
|
|
60
|
+
const existing = await readJson(envPath);
|
|
61
|
+
const installCmd = detectInstallCommand(projectDir);
|
|
62
|
+
const existingInstall = existing?.install && typeof existing.install === "string" ? existing.install : "";
|
|
63
|
+
if (existingInstall && !existingInstall.includes("guard-mcp")) {
|
|
64
|
+
return {
|
|
65
|
+
path: envPath,
|
|
66
|
+
changed: false,
|
|
67
|
+
message: "environment.json already has install command",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
if (existingInstall.includes("guard-mcp")) {
|
|
71
|
+
const config = { ...(existing ? cloneJsonMap(existing) : {}), install: installCmd };
|
|
72
|
+
const changed = JSON.stringify(existing ?? {}) !== JSON.stringify(config);
|
|
73
|
+
if (changed && !dryRun)
|
|
74
|
+
await writeJson(envPath, config);
|
|
75
|
+
return {
|
|
76
|
+
path: envPath,
|
|
77
|
+
changed,
|
|
78
|
+
message: changed ? "migrated environment.json install (removed guard-mcp)" : "unchanged",
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const config = { ...(existing ? cloneJsonMap(existing) : {}), install: installCmd };
|
|
82
|
+
const changed = JSON.stringify(existing ?? {}) !== JSON.stringify(config);
|
|
83
|
+
if (changed && !dryRun) {
|
|
84
|
+
await writeJson(envPath, config);
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
path: envPath,
|
|
88
|
+
changed,
|
|
89
|
+
message: changed
|
|
90
|
+
? dryRun
|
|
91
|
+
? "would create environment.json"
|
|
92
|
+
: "created environment.json"
|
|
93
|
+
: "environment.json already up to date",
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export async function readEnvironmentConfigured(projectDir) {
|
|
97
|
+
const config = await readJson(resolveEnvironmentJsonPath(projectDir));
|
|
98
|
+
return hasConfiguredEnvironment(config);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=environment-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-config.js","sourceRoot":"","sources":["../../../src/cli/cursor-config/environment-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { JsonMap, SetupResult, UpsertHookConfigOptions } from "./types.js";
|
|
2
|
+
export declare function hasConfiguredHook(config: JsonMap | null): boolean;
|
|
3
|
+
export declare function hasConfiguredBeforeMcpHook(config: JsonMap | null): boolean;
|
|
4
|
+
export declare function upsertHookConfig(opts: UpsertHookConfigOptions): Promise<SetupResult>;
|
|
5
|
+
export declare function hasAnyPraxisHookEntry(config: JsonMap | null): boolean;
|
|
6
|
+
export declare function readHooksStatusAt(hooksPath: string): Promise<{
|
|
7
|
+
shell: boolean;
|
|
8
|
+
mcp: boolean;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function readGlobalHooksConfigured(): Promise<{
|
|
11
|
+
shell: boolean;
|
|
12
|
+
mcp: boolean;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function readProjectHooksConfigured(projectDir: string): Promise<{
|
|
15
|
+
shell: boolean;
|
|
16
|
+
mcp: boolean;
|
|
17
|
+
}>;
|
|
18
|
+
/** Global ~/.cursor/hooks.json — primary scope for GA setup. */
|
|
19
|
+
export declare function readHookConfigured(_projectDir?: string): Promise<boolean>;
|
|
20
|
+
/** Global ~/.cursor/hooks.json — primary scope for GA setup. */
|
|
21
|
+
export declare function readBeforeMcpHookConfigured(_projectDir?: string): Promise<boolean>;
|
|
22
|
+
export declare function duplicatePraxisHooksWarning(projectDir: string): Promise<string | null>;
|
|
23
|
+
//# sourceMappingURL=hooks-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-config.d.ts","sourceRoot":"","sources":["../../../src/cli/cursor-config/hooks-config.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAWhF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAYjE;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAY1E;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC,CAiE1F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAErE;AAED,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;CACd,CAAC,CAMD;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC,CAE3F;AAED,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC,CAE3C;AAED,gEAAgE;AAChE,wBAAsB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG/E;AAED,gEAAgE;AAChE,wBAAsB,2BAA2B,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGxF;AAED,wBAAsB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS5F"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { HOOK_COMMAND_MCP, HOOK_COMMAND_SHELL } from "./constants.js";
|
|
2
|
+
import { isLegacyMcpHookCommand, isLegacyShellHookCommand } from "./legacy-guard-mcp.js";
|
|
3
|
+
import { cloneJsonMap, readJson, writeJson } from "./json-io.js";
|
|
4
|
+
import { resolveProjectHooksPath, resolveHooksConfigPath, resolveUserHooksPath, } from "./paths.js";
|
|
5
|
+
function normalizeHooksConfig(existing) {
|
|
6
|
+
const base = existing ?? { version: 1, hooks: {} };
|
|
7
|
+
if (typeof base.version !== "number")
|
|
8
|
+
base.version = 1;
|
|
9
|
+
if (!base.hooks || typeof base.hooks !== "object" || Array.isArray(base.hooks)) {
|
|
10
|
+
base.hooks = {};
|
|
11
|
+
}
|
|
12
|
+
return base;
|
|
13
|
+
}
|
|
14
|
+
export function hasConfiguredHook(config) {
|
|
15
|
+
if (!config)
|
|
16
|
+
return false;
|
|
17
|
+
const hooks = (config.hooks ?? {});
|
|
18
|
+
const arr = hooks.beforeShellExecution;
|
|
19
|
+
if (!Array.isArray(arr))
|
|
20
|
+
return false;
|
|
21
|
+
return arr.some((entry) => entry &&
|
|
22
|
+
typeof entry === "object" &&
|
|
23
|
+
entry.command === HOOK_COMMAND_SHELL &&
|
|
24
|
+
entry.failClosed === true);
|
|
25
|
+
}
|
|
26
|
+
export function hasConfiguredBeforeMcpHook(config) {
|
|
27
|
+
if (!config)
|
|
28
|
+
return false;
|
|
29
|
+
const hooks = (config.hooks ?? {});
|
|
30
|
+
const arr = hooks.beforeMCPExecution;
|
|
31
|
+
if (!Array.isArray(arr))
|
|
32
|
+
return false;
|
|
33
|
+
return arr.some((entry) => entry &&
|
|
34
|
+
typeof entry === "object" &&
|
|
35
|
+
entry.command === HOOK_COMMAND_MCP &&
|
|
36
|
+
entry.failClosed === true);
|
|
37
|
+
}
|
|
38
|
+
export async function upsertHookConfig(opts) {
|
|
39
|
+
const dryRun = opts.dryRun ?? false;
|
|
40
|
+
const hooksPath = resolveHooksConfigPath(opts);
|
|
41
|
+
const existing = await readJson(hooksPath);
|
|
42
|
+
const beforeJson = JSON.stringify(existing ?? {});
|
|
43
|
+
const config = normalizeHooksConfig(cloneJsonMap(existing));
|
|
44
|
+
const hooks = config.hooks;
|
|
45
|
+
const before = Array.isArray(hooks.beforeShellExecution) ? [...hooks.beforeShellExecution] : [];
|
|
46
|
+
const rewritten = [];
|
|
47
|
+
let found = false;
|
|
48
|
+
for (const item of before) {
|
|
49
|
+
if (!item || typeof item !== "object") {
|
|
50
|
+
rewritten.push(item);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const map = item;
|
|
54
|
+
if (map.command === HOOK_COMMAND_SHELL || isLegacyShellHookCommand(map.command)) {
|
|
55
|
+
if (!found) {
|
|
56
|
+
found = true;
|
|
57
|
+
rewritten.push({ ...map, command: HOOK_COMMAND_SHELL, failClosed: true });
|
|
58
|
+
}
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
rewritten.push(item);
|
|
62
|
+
}
|
|
63
|
+
if (!found)
|
|
64
|
+
rewritten.push({ command: HOOK_COMMAND_SHELL, failClosed: true });
|
|
65
|
+
hooks.beforeShellExecution = rewritten;
|
|
66
|
+
const beforeMcp = Array.isArray(hooks.beforeMCPExecution) ? [...hooks.beforeMCPExecution] : [];
|
|
67
|
+
const rewrittenMcp = [];
|
|
68
|
+
let foundMcp = false;
|
|
69
|
+
for (const item of beforeMcp) {
|
|
70
|
+
if (!item || typeof item !== "object") {
|
|
71
|
+
rewrittenMcp.push(item);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const map = item;
|
|
75
|
+
if (map.command === HOOK_COMMAND_MCP || isLegacyMcpHookCommand(map.command)) {
|
|
76
|
+
if (!foundMcp) {
|
|
77
|
+
foundMcp = true;
|
|
78
|
+
rewrittenMcp.push({ ...map, command: HOOK_COMMAND_MCP, failClosed: true });
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
rewrittenMcp.push(item);
|
|
83
|
+
}
|
|
84
|
+
if (!foundMcp)
|
|
85
|
+
rewrittenMcp.push({ command: HOOK_COMMAND_MCP, failClosed: true });
|
|
86
|
+
hooks.beforeMCPExecution = rewrittenMcp;
|
|
87
|
+
const changed = beforeJson !== JSON.stringify(config);
|
|
88
|
+
if (changed && !dryRun) {
|
|
89
|
+
await writeJson(hooksPath, config);
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
path: hooksPath,
|
|
93
|
+
changed,
|
|
94
|
+
message: changed
|
|
95
|
+
? dryRun
|
|
96
|
+
? "would update hooks config"
|
|
97
|
+
: "updated hooks config"
|
|
98
|
+
: "hooks config already up to date",
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export function hasAnyPraxisHookEntry(config) {
|
|
102
|
+
return hasConfiguredHook(config) || hasConfiguredBeforeMcpHook(config);
|
|
103
|
+
}
|
|
104
|
+
export async function readHooksStatusAt(hooksPath) {
|
|
105
|
+
const config = await readJson(hooksPath).catch(() => null);
|
|
106
|
+
return {
|
|
107
|
+
shell: hasConfiguredHook(config),
|
|
108
|
+
mcp: hasConfiguredBeforeMcpHook(config),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export async function readGlobalHooksConfigured() {
|
|
112
|
+
return readHooksStatusAt(resolveUserHooksPath());
|
|
113
|
+
}
|
|
114
|
+
export async function readProjectHooksConfigured(projectDir) {
|
|
115
|
+
return readHooksStatusAt(resolveProjectHooksPath(projectDir));
|
|
116
|
+
}
|
|
117
|
+
/** Global ~/.cursor/hooks.json — primary scope for GA setup. */
|
|
118
|
+
export async function readHookConfigured(_projectDir) {
|
|
119
|
+
const { shell } = await readGlobalHooksConfigured();
|
|
120
|
+
return shell;
|
|
121
|
+
}
|
|
122
|
+
/** Global ~/.cursor/hooks.json — primary scope for GA setup. */
|
|
123
|
+
export async function readBeforeMcpHookConfigured(_projectDir) {
|
|
124
|
+
const { mcp } = await readGlobalHooksConfigured();
|
|
125
|
+
return mcp;
|
|
126
|
+
}
|
|
127
|
+
export async function duplicatePraxisHooksWarning(projectDir) {
|
|
128
|
+
const [globalConfig, projectConfig] = await Promise.all([
|
|
129
|
+
readJson(resolveUserHooksPath()).catch(() => null),
|
|
130
|
+
readJson(resolveProjectHooksPath(projectDir)).catch(() => null),
|
|
131
|
+
]);
|
|
132
|
+
if (hasAnyPraxisHookEntry(globalConfig) && hasAnyPraxisHookEntry(projectConfig)) {
|
|
133
|
+
return "Praxis hooks in both ~/.cursor/hooks.json and project .cursor/hooks.json — prefer global OR project, not both.";
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=hooks-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-config.js","sourceRoot":"","sources":["../../../src/cli/cursor-config/hooks-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type { HookConfigScope, JsonMap, SetupResult, UpsertHookConfigOptions, } from "./types.js";
|
|
2
|
+
export { referencesGuardMcp, scanHooksForLegacyGuardMcp, scanMcpForLegacyGuardMcp } from "./legacy-guard-mcp.js";
|
|
3
|
+
export { readJson } from "./json-io.js";
|
|
4
|
+
export { resolveEnvironmentJsonPath, resolveHooksConfigPath, resolveProjectHooksPath, resolveUserHooksPath, resolveUserMcpConfigPath, } from "./paths.js";
|
|
5
|
+
export { duplicatePraxisHooksWarning, hasConfiguredBeforeMcpHook, hasConfiguredHook, hasAnyPraxisHookEntry, readBeforeMcpHookConfigured, readGlobalHooksConfigured, readHookConfigured, readHooksStatusAt, readProjectHooksConfigured, upsertHookConfig, } from "./hooks-config.js";
|
|
6
|
+
export { hasConfiguredMcpServer, readMcpConfigured, upsertMcpConfig } from "./mcp-config.js";
|
|
7
|
+
export { detectInstallCommand, detectMonorepoGuardInstallCommand, hasConfiguredEnvironment, readEnvironmentConfigured, upsertEnvironmentConfig, } from "./environment-config.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/cursor-config/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,OAAO,EACP,WAAW,EACX,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjH,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,EAC3B,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EACjB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE7F,OAAO,EACL,oBAAoB,EACpB,iCAAiC,EACjC,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { referencesGuardMcp, scanHooksForLegacyGuardMcp, scanMcpForLegacyGuardMcp } from "./legacy-guard-mcp.js";
|
|
2
|
+
export { readJson } from "./json-io.js";
|
|
3
|
+
export { resolveEnvironmentJsonPath, resolveHooksConfigPath, resolveProjectHooksPath, resolveUserHooksPath, resolveUserMcpConfigPath, } from "./paths.js";
|
|
4
|
+
export { duplicatePraxisHooksWarning, hasConfiguredBeforeMcpHook, hasConfiguredHook, hasAnyPraxisHookEntry, readBeforeMcpHookConfigured, readGlobalHooksConfigured, readHookConfigured, readHooksStatusAt, readProjectHooksConfigured, upsertHookConfig, } from "./hooks-config.js";
|
|
5
|
+
export { hasConfiguredMcpServer, readMcpConfigured, upsertMcpConfig } from "./mcp-config.js";
|
|
6
|
+
export { detectInstallCommand, detectMonorepoGuardInstallCommand, hasConfiguredEnvironment, readEnvironmentConfigured, upsertEnvironmentConfig, } from "./environment-config.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/cursor-config/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjH,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,EAC3B,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EACjB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE7F,OAAO,EACL,oBAAoB,EACpB,iCAAiC,EACjC,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { JsonMap } from "./types.js";
|
|
2
|
+
export declare function readJson(pathname: string): Promise<JsonMap | null>;
|
|
3
|
+
export declare function writeJson(pathname: string, data: JsonMap): Promise<void>;
|
|
4
|
+
export declare function cloneJsonMap(existing: JsonMap | null): JsonMap;
|
|
5
|
+
//# sourceMappingURL=json-io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-io.d.ts","sourceRoot":"","sources":["../../../src/cli/cursor-config/json-io.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAmBxE;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAG9D"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export async function readJson(pathname) {
|
|
4
|
+
try {
|
|
5
|
+
const raw = await readFile(pathname, "utf8");
|
|
6
|
+
const parsed = JSON.parse(raw);
|
|
7
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
8
|
+
throw new Error("JSON root must be an object");
|
|
9
|
+
}
|
|
10
|
+
return parsed;
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
14
|
+
if (e.code === "ENOENT")
|
|
15
|
+
return null;
|
|
16
|
+
throw new Error([
|
|
17
|
+
`Invalid JSON at ${pathname}: ${msg}`,
|
|
18
|
+
"Refusing to overwrite existing file.",
|
|
19
|
+
"Fix the JSON manually or back up the file and re-run setup.",
|
|
20
|
+
].join(" "));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function writeJson(pathname, data) {
|
|
24
|
+
await mkdir(path.dirname(pathname), { recursive: true });
|
|
25
|
+
await writeFile(pathname, `${JSON.stringify(data, null, 2)}\n`, "utf8");
|
|
26
|
+
}
|
|
27
|
+
export function cloneJsonMap(existing) {
|
|
28
|
+
if (!existing)
|
|
29
|
+
return {};
|
|
30
|
+
return JSON.parse(JSON.stringify(existing));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=json-io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-io.js","sourceRoot":"","sources":["../../../src/cli/cursor-config/json-io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,MAAiB,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAChE,MAAM,IAAI,KAAK,CACb;YACE,mBAAmB,QAAQ,KAAK,GAAG,EAAE;YACrC,sCAAsC;YACtC,6DAA6D;SAC9D,CAAC,IAAI,CAAC,GAAG,CAAC,CACZ,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,IAAa;IAC7D,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAwB;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAY,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { JsonMap } from "./types.js";
|
|
2
|
+
export declare function referencesGuardMcp(value: unknown): boolean;
|
|
3
|
+
declare function isLegacyShellHookCommand(command: unknown): boolean;
|
|
4
|
+
declare function isLegacyMcpHookCommand(command: unknown): boolean;
|
|
5
|
+
export declare function isLegacyPraxisGuardMcpServer(server: unknown): boolean;
|
|
6
|
+
export declare function scanHooksForLegacyGuardMcp(config: JsonMap | null): string[];
|
|
7
|
+
export declare function scanMcpForLegacyGuardMcp(config: JsonMap | null): string[];
|
|
8
|
+
export { isLegacyMcpHookCommand, isLegacyShellHookCommand };
|
|
9
|
+
//# sourceMappingURL=legacy-guard-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-guard-mcp.d.ts","sourceRoot":"","sources":["../../../src/cli/cursor-config/legacy-guard-mcp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAW1D;AAED,iBAAS,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAI3D;AAED,iBAAS,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAIzD;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAUrE;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,CAc3E;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,CAUzE;AAED,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { HOOK_COMMAND_MCP, HOOK_COMMAND_SHELL } from "./constants.js";
|
|
2
|
+
export function referencesGuardMcp(value) {
|
|
3
|
+
if (typeof value === "string") {
|
|
4
|
+
return value.includes("guard-mcp") || value.includes("before-shell-execution.js");
|
|
5
|
+
}
|
|
6
|
+
if (Array.isArray(value)) {
|
|
7
|
+
return value.some((v) => referencesGuardMcp(v));
|
|
8
|
+
}
|
|
9
|
+
if (value && typeof value === "object") {
|
|
10
|
+
return Object.values(value).some((v) => referencesGuardMcp(v));
|
|
11
|
+
}
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
function isLegacyShellHookCommand(command) {
|
|
15
|
+
if (typeof command !== "string")
|
|
16
|
+
return false;
|
|
17
|
+
if (command === HOOK_COMMAND_SHELL)
|
|
18
|
+
return false;
|
|
19
|
+
return command.includes("guard-mcp") || command.includes("before-shell-execution");
|
|
20
|
+
}
|
|
21
|
+
function isLegacyMcpHookCommand(command) {
|
|
22
|
+
if (typeof command !== "string")
|
|
23
|
+
return false;
|
|
24
|
+
if (command === HOOK_COMMAND_MCP)
|
|
25
|
+
return false;
|
|
26
|
+
return command.includes("guard-mcp") || command.includes("before-mcp");
|
|
27
|
+
}
|
|
28
|
+
export function isLegacyPraxisGuardMcpServer(server) {
|
|
29
|
+
if (!server || typeof server !== "object")
|
|
30
|
+
return false;
|
|
31
|
+
const map = server;
|
|
32
|
+
const cmd = String(map.command ?? "");
|
|
33
|
+
const args = map.args;
|
|
34
|
+
const argsStr = Array.isArray(args) ? args.join(" ") : "";
|
|
35
|
+
if (referencesGuardMcp(cmd) || referencesGuardMcp(argsStr))
|
|
36
|
+
return true;
|
|
37
|
+
if (cmd === "pnpm" && argsStr.includes("guard-mcp"))
|
|
38
|
+
return true;
|
|
39
|
+
if (cmd === "node" && argsStr.includes("guard-mcp"))
|
|
40
|
+
return true;
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
export function scanHooksForLegacyGuardMcp(config) {
|
|
44
|
+
const issues = [];
|
|
45
|
+
if (!config?.hooks || typeof config.hooks !== "object")
|
|
46
|
+
return issues;
|
|
47
|
+
const hooks = config.hooks;
|
|
48
|
+
for (const key of ["beforeShellExecution", "beforeMCPExecution"]) {
|
|
49
|
+
const arr = hooks[key];
|
|
50
|
+
if (!Array.isArray(arr))
|
|
51
|
+
continue;
|
|
52
|
+
for (const entry of arr) {
|
|
53
|
+
if (entry && typeof entry === "object" && referencesGuardMcp(entry.command)) {
|
|
54
|
+
issues.push(`hooks.${key} still references guard-mcp`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return issues;
|
|
59
|
+
}
|
|
60
|
+
export function scanMcpForLegacyGuardMcp(config) {
|
|
61
|
+
const issues = [];
|
|
62
|
+
if (!config?.mcpServers || typeof config.mcpServers !== "object")
|
|
63
|
+
return issues;
|
|
64
|
+
const servers = config.mcpServers;
|
|
65
|
+
for (const [key, server] of Object.entries(servers)) {
|
|
66
|
+
if (isLegacyPraxisGuardMcpServer(server) || referencesGuardMcp(server)) {
|
|
67
|
+
issues.push(`mcpServers.${key} still references guard-mcp`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return issues;
|
|
71
|
+
}
|
|
72
|
+
export { isLegacyMcpHookCommand, isLegacyShellHookCommand };
|
|
73
|
+
//# sourceMappingURL=legacy-guard-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-guard-mcp.js","sourceRoot":"","sources":["../../../src/cli/cursor-config/legacy-guard-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { JsonMap, SetupResult } from "./types.js";
|
|
2
|
+
export declare function hasConfiguredMcpServer(config: JsonMap | null): boolean;
|
|
3
|
+
export declare function upsertMcpConfig(explicitPath?: string, dryRun?: boolean): Promise<SetupResult>;
|
|
4
|
+
export declare function readMcpConfigured(explicitPath?: string): Promise<boolean>;
|
|
5
|
+
//# sourceMappingURL=mcp-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../../src/cli/cursor-config/mcp-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEvD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAQtE;AAED,wBAAsB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAqCjG;AAED,wBAAsB,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG/E"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { MCP_SERVER_KEY } from "./constants.js";
|
|
2
|
+
import { isLegacyPraxisGuardMcpServer } from "./legacy-guard-mcp.js";
|
|
3
|
+
import { cloneJsonMap, readJson, writeJson } from "./json-io.js";
|
|
4
|
+
import { resolveUserMcpConfigPath } from "./paths.js";
|
|
5
|
+
export function hasConfiguredMcpServer(config) {
|
|
6
|
+
if (!config)
|
|
7
|
+
return false;
|
|
8
|
+
const servers = (config.mcpServers ?? {});
|
|
9
|
+
const server = servers[MCP_SERVER_KEY];
|
|
10
|
+
if (!server || typeof server !== "object")
|
|
11
|
+
return false;
|
|
12
|
+
const map = server;
|
|
13
|
+
const args = map.args;
|
|
14
|
+
return map.command === "auditor" && Array.isArray(args) && args.length === 1 && args[0] === "mcp";
|
|
15
|
+
}
|
|
16
|
+
export async function upsertMcpConfig(explicitPath, dryRun = false) {
|
|
17
|
+
const mcpPath = resolveUserMcpConfigPath(explicitPath);
|
|
18
|
+
const existing = await readJson(mcpPath);
|
|
19
|
+
const beforeJson = JSON.stringify(existing ?? {});
|
|
20
|
+
const config = cloneJsonMap(existing);
|
|
21
|
+
if (!config.mcpServers || typeof config.mcpServers !== "object" || Array.isArray(config.mcpServers)) {
|
|
22
|
+
config.mcpServers = {};
|
|
23
|
+
}
|
|
24
|
+
const servers = config.mcpServers;
|
|
25
|
+
for (const [key, server] of Object.entries(servers)) {
|
|
26
|
+
if (key === MCP_SERVER_KEY || isLegacyPraxisGuardMcpServer(server)) {
|
|
27
|
+
const current = server && typeof server === "object" ? server : {};
|
|
28
|
+
servers[key === MCP_SERVER_KEY ? MCP_SERVER_KEY : key] = {
|
|
29
|
+
...current,
|
|
30
|
+
command: "auditor",
|
|
31
|
+
args: ["mcp"],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (!servers[MCP_SERVER_KEY]) {
|
|
36
|
+
servers[MCP_SERVER_KEY] = { command: "auditor", args: ["mcp"] };
|
|
37
|
+
}
|
|
38
|
+
const changed = beforeJson !== JSON.stringify(config);
|
|
39
|
+
if (changed && !dryRun) {
|
|
40
|
+
await writeJson(mcpPath, config);
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
path: mcpPath,
|
|
44
|
+
changed,
|
|
45
|
+
message: changed
|
|
46
|
+
? dryRun
|
|
47
|
+
? "would update MCP config"
|
|
48
|
+
: "updated MCP config"
|
|
49
|
+
: "MCP config already up to date",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export async function readMcpConfigured(explicitPath) {
|
|
53
|
+
const config = await readJson(resolveUserMcpConfigPath(explicitPath));
|
|
54
|
+
return hasConfiguredMcpServer(config);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=mcp-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../src/cli/cursor-config/mcp-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { HookConfigScope } from "./types.js";
|
|
2
|
+
export declare function resolveProjectHooksPath(projectDir: string): string;
|
|
3
|
+
export declare function resolveUserHooksPath(explicitPath?: string): string;
|
|
4
|
+
export declare function resolveHooksConfigPath(opts: {
|
|
5
|
+
scope: HookConfigScope;
|
|
6
|
+
projectDir?: string;
|
|
7
|
+
explicitPath?: string;
|
|
8
|
+
}): string;
|
|
9
|
+
export declare function resolveUserMcpConfigPath(explicitPath?: string): string;
|
|
10
|
+
export declare function resolveEnvironmentJsonPath(projectDir: string): string;
|
|
11
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/cli/cursor-config/paths.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,oBAAoB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAGlE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,eAAe,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,MAAM,CAIT;AAED,wBAAgB,wBAAwB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAErE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
export function resolveProjectHooksPath(projectDir) {
|
|
5
|
+
return path.join(projectDir, ".cursor", "hooks.json");
|
|
6
|
+
}
|
|
7
|
+
export function resolveUserHooksPath(explicitPath) {
|
|
8
|
+
if (explicitPath?.trim())
|
|
9
|
+
return explicitPath.trim();
|
|
10
|
+
return path.join(os.homedir(), ".cursor", "hooks.json");
|
|
11
|
+
}
|
|
12
|
+
export function resolveHooksConfigPath(opts) {
|
|
13
|
+
if (opts.explicitPath?.trim())
|
|
14
|
+
return opts.explicitPath.trim();
|
|
15
|
+
if (opts.scope === "global")
|
|
16
|
+
return resolveUserHooksPath();
|
|
17
|
+
return resolveProjectHooksPath(opts.projectDir ?? process.cwd());
|
|
18
|
+
}
|
|
19
|
+
export function resolveUserMcpConfigPath(explicitPath) {
|
|
20
|
+
if (explicitPath?.trim())
|
|
21
|
+
return explicitPath.trim();
|
|
22
|
+
return path.join(os.homedir(), ".cursor", "mcp.json");
|
|
23
|
+
}
|
|
24
|
+
export function resolveEnvironmentJsonPath(projectDir) {
|
|
25
|
+
return path.join(projectDir, ".cursor", "environment.json");
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/cli/cursor-config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AAInC,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACxD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,YAAqB;IACxD,IAAI,YAAY,EAAE,IAAI,EAAE;QAAE,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAItC;IACC,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC/D,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,oBAAoB,EAAE,CAAC;IAC3D,OAAO,uBAAuB,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,YAAqB;IAC5D,IAAI,YAAY,EAAE,IAAI,EAAE;QAAE,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,UAAkB;IAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type JsonMap = Record<string, unknown>;
|
|
2
|
+
export type SetupResult = {
|
|
3
|
+
path: string;
|
|
4
|
+
changed: boolean;
|
|
5
|
+
message: string;
|
|
6
|
+
};
|
|
7
|
+
export type HookConfigScope = "global" | "project";
|
|
8
|
+
export type UpsertHookConfigOptions = {
|
|
9
|
+
scope: HookConfigScope;
|
|
10
|
+
projectDir?: string;
|
|
11
|
+
explicitPath?: string;
|
|
12
|
+
dryRun?: boolean;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/cursor-config/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEnD,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,eAAe,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cli/cursor-config/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,57 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export type SetupResult = {
|
|
3
|
-
path: string;
|
|
4
|
-
changed: boolean;
|
|
5
|
-
message: string;
|
|
6
|
-
};
|
|
7
|
-
export declare function referencesGuardMcp(value: unknown): boolean;
|
|
8
|
-
export declare function scanHooksForLegacyGuardMcp(config: JsonMap | null): string[];
|
|
9
|
-
export declare function scanMcpForLegacyGuardMcp(config: JsonMap | null): string[];
|
|
10
|
-
export type HookConfigScope = "global" | "project";
|
|
11
|
-
export declare function resolveProjectHooksPath(projectDir: string): string;
|
|
12
|
-
export declare function resolveUserHooksPath(explicitPath?: string): string;
|
|
13
|
-
export declare function resolveHooksConfigPath(opts: {
|
|
14
|
-
scope: HookConfigScope;
|
|
15
|
-
projectDir?: string;
|
|
16
|
-
explicitPath?: string;
|
|
17
|
-
}): string;
|
|
18
|
-
export declare function resolveUserMcpConfigPath(explicitPath?: string): string;
|
|
19
|
-
export declare function readJson(pathname: string): Promise<JsonMap | null>;
|
|
20
|
-
export declare function hasConfiguredHook(config: JsonMap | null): boolean;
|
|
21
|
-
export declare function hasConfiguredBeforeMcpHook(config: JsonMap | null): boolean;
|
|
22
|
-
export type UpsertHookConfigOptions = {
|
|
23
|
-
scope: HookConfigScope;
|
|
24
|
-
projectDir?: string;
|
|
25
|
-
explicitPath?: string;
|
|
26
|
-
dryRun?: boolean;
|
|
27
|
-
};
|
|
28
|
-
export declare function upsertHookConfig(opts: UpsertHookConfigOptions): Promise<SetupResult>;
|
|
29
|
-
export declare function hasConfiguredMcpServer(config: JsonMap | null): boolean;
|
|
30
|
-
export declare function upsertMcpConfig(explicitPath?: string, dryRun?: boolean): Promise<SetupResult>;
|
|
31
|
-
export declare function hasAnyPraxisHookEntry(config: JsonMap | null): boolean;
|
|
32
|
-
export declare function readHooksStatusAt(hooksPath: string): Promise<{
|
|
33
|
-
shell: boolean;
|
|
34
|
-
mcp: boolean;
|
|
35
|
-
}>;
|
|
36
|
-
export declare function readGlobalHooksConfigured(): Promise<{
|
|
37
|
-
shell: boolean;
|
|
38
|
-
mcp: boolean;
|
|
39
|
-
}>;
|
|
40
|
-
export declare function readProjectHooksConfigured(projectDir: string): Promise<{
|
|
41
|
-
shell: boolean;
|
|
42
|
-
mcp: boolean;
|
|
43
|
-
}>;
|
|
44
|
-
/** Global ~/.cursor/hooks.json — primary scope for GA setup. */
|
|
45
|
-
export declare function readHookConfigured(_projectDir?: string): Promise<boolean>;
|
|
46
|
-
/** Global ~/.cursor/hooks.json — primary scope for GA setup. */
|
|
47
|
-
export declare function readBeforeMcpHookConfigured(_projectDir?: string): Promise<boolean>;
|
|
48
|
-
export declare function duplicatePraxisHooksWarning(projectDir: string): Promise<string | null>;
|
|
49
|
-
export declare function readMcpConfigured(explicitPath?: string): Promise<boolean>;
|
|
50
|
-
export declare function resolveEnvironmentJsonPath(projectDir: string): string;
|
|
51
|
-
export declare function detectMonorepoGuardInstallCommand(projectDir: string): string | null;
|
|
52
|
-
export declare function detectInstallCommand(projectDir: string): string;
|
|
53
|
-
export declare function hasConfiguredEnvironment(config: JsonMap | null): boolean;
|
|
54
|
-
export declare function upsertEnvironmentConfig(projectDir: string, dryRun?: boolean): Promise<SetupResult>;
|
|
55
|
-
export declare function readEnvironmentConfigured(projectDir: string): Promise<boolean>;
|
|
56
|
-
export {};
|
|
1
|
+
export * from "./cursor-config/index.js";
|
|
57
2
|
//# sourceMappingURL=cursor-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-config.d.ts","sourceRoot":"","sources":["../../src/cli/cursor-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cursor-config.d.ts","sourceRoot":"","sources":["../../src/cli/cursor-config.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
|
|
@@ -1,410 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import os from "node:os";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import process from "node:process";
|
|
5
|
-
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
6
|
-
const HOOK_COMMAND_SHELL = "auditor hook before-shell";
|
|
7
|
-
const HOOK_COMMAND_MCP = "auditor hook before-mcp";
|
|
8
|
-
const MCP_SERVER_KEY = "praxis-guard";
|
|
9
|
-
export function referencesGuardMcp(value) {
|
|
10
|
-
if (typeof value === "string") {
|
|
11
|
-
return value.includes("guard-mcp") || value.includes("before-shell-execution.js");
|
|
12
|
-
}
|
|
13
|
-
if (Array.isArray(value)) {
|
|
14
|
-
return value.some((v) => referencesGuardMcp(v));
|
|
15
|
-
}
|
|
16
|
-
if (value && typeof value === "object") {
|
|
17
|
-
return Object.values(value).some((v) => referencesGuardMcp(v));
|
|
18
|
-
}
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
function isLegacyShellHookCommand(command) {
|
|
22
|
-
if (typeof command !== "string")
|
|
23
|
-
return false;
|
|
24
|
-
if (command === HOOK_COMMAND_SHELL)
|
|
25
|
-
return false;
|
|
26
|
-
return command.includes("guard-mcp") || command.includes("before-shell-execution");
|
|
27
|
-
}
|
|
28
|
-
function isLegacyMcpHookCommand(command) {
|
|
29
|
-
if (typeof command !== "string")
|
|
30
|
-
return false;
|
|
31
|
-
if (command === HOOK_COMMAND_MCP)
|
|
32
|
-
return false;
|
|
33
|
-
return command.includes("guard-mcp") || command.includes("before-mcp");
|
|
34
|
-
}
|
|
35
|
-
function isLegacyPraxisGuardMcpServer(server) {
|
|
36
|
-
if (!server || typeof server !== "object")
|
|
37
|
-
return false;
|
|
38
|
-
const map = server;
|
|
39
|
-
const cmd = String(map.command ?? "");
|
|
40
|
-
const args = map.args;
|
|
41
|
-
const argsStr = Array.isArray(args) ? args.join(" ") : "";
|
|
42
|
-
if (referencesGuardMcp(cmd) || referencesGuardMcp(argsStr))
|
|
43
|
-
return true;
|
|
44
|
-
if (cmd === "pnpm" && argsStr.includes("guard-mcp"))
|
|
45
|
-
return true;
|
|
46
|
-
if (cmd === "node" && argsStr.includes("guard-mcp"))
|
|
47
|
-
return true;
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
export function scanHooksForLegacyGuardMcp(config) {
|
|
51
|
-
const issues = [];
|
|
52
|
-
if (!config?.hooks || typeof config.hooks !== "object")
|
|
53
|
-
return issues;
|
|
54
|
-
const hooks = config.hooks;
|
|
55
|
-
for (const key of ["beforeShellExecution", "beforeMCPExecution"]) {
|
|
56
|
-
const arr = hooks[key];
|
|
57
|
-
if (!Array.isArray(arr))
|
|
58
|
-
continue;
|
|
59
|
-
for (const entry of arr) {
|
|
60
|
-
if (entry && typeof entry === "object" && referencesGuardMcp(entry.command)) {
|
|
61
|
-
issues.push(`hooks.${key} still references guard-mcp`);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return issues;
|
|
66
|
-
}
|
|
67
|
-
export function scanMcpForLegacyGuardMcp(config) {
|
|
68
|
-
const issues = [];
|
|
69
|
-
if (!config?.mcpServers || typeof config.mcpServers !== "object")
|
|
70
|
-
return issues;
|
|
71
|
-
const servers = config.mcpServers;
|
|
72
|
-
for (const [key, server] of Object.entries(servers)) {
|
|
73
|
-
if (isLegacyPraxisGuardMcpServer(server) || referencesGuardMcp(server)) {
|
|
74
|
-
issues.push(`mcpServers.${key} still references guard-mcp`);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return issues;
|
|
78
|
-
}
|
|
79
|
-
export function resolveProjectHooksPath(projectDir) {
|
|
80
|
-
return path.join(projectDir, ".cursor", "hooks.json");
|
|
81
|
-
}
|
|
82
|
-
export function resolveUserHooksPath(explicitPath) {
|
|
83
|
-
if (explicitPath?.trim())
|
|
84
|
-
return explicitPath.trim();
|
|
85
|
-
return path.join(os.homedir(), ".cursor", "hooks.json");
|
|
86
|
-
}
|
|
87
|
-
export function resolveHooksConfigPath(opts) {
|
|
88
|
-
if (opts.explicitPath?.trim())
|
|
89
|
-
return opts.explicitPath.trim();
|
|
90
|
-
if (opts.scope === "global")
|
|
91
|
-
return resolveUserHooksPath();
|
|
92
|
-
return resolveProjectHooksPath(opts.projectDir ?? process.cwd());
|
|
93
|
-
}
|
|
94
|
-
export function resolveUserMcpConfigPath(explicitPath) {
|
|
95
|
-
if (explicitPath?.trim())
|
|
96
|
-
return explicitPath.trim();
|
|
97
|
-
return path.join(os.homedir(), ".cursor", "mcp.json");
|
|
98
|
-
}
|
|
99
|
-
export async function readJson(pathname) {
|
|
100
|
-
try {
|
|
101
|
-
const raw = await readFile(pathname, "utf8");
|
|
102
|
-
const parsed = JSON.parse(raw);
|
|
103
|
-
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
104
|
-
throw new Error("JSON root must be an object");
|
|
105
|
-
}
|
|
106
|
-
return parsed;
|
|
107
|
-
}
|
|
108
|
-
catch (e) {
|
|
109
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
110
|
-
if (e.code === "ENOENT")
|
|
111
|
-
return null;
|
|
112
|
-
throw new Error([
|
|
113
|
-
`Invalid JSON at ${pathname}: ${msg}`,
|
|
114
|
-
"Refusing to overwrite existing file.",
|
|
115
|
-
"Fix the JSON manually or back up the file and re-run setup.",
|
|
116
|
-
].join(" "));
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
async function writeJson(pathname, data) {
|
|
120
|
-
await mkdir(path.dirname(pathname), { recursive: true });
|
|
121
|
-
await writeFile(pathname, `${JSON.stringify(data, null, 2)}\n`, "utf8");
|
|
122
|
-
}
|
|
123
|
-
function cloneJsonMap(existing) {
|
|
124
|
-
if (!existing)
|
|
125
|
-
return {};
|
|
126
|
-
return JSON.parse(JSON.stringify(existing));
|
|
127
|
-
}
|
|
128
|
-
function normalizeHooksConfig(existing) {
|
|
129
|
-
const base = existing ?? { version: 1, hooks: {} };
|
|
130
|
-
if (typeof base.version !== "number")
|
|
131
|
-
base.version = 1;
|
|
132
|
-
if (!base.hooks || typeof base.hooks !== "object" || Array.isArray(base.hooks)) {
|
|
133
|
-
base.hooks = {};
|
|
134
|
-
}
|
|
135
|
-
return base;
|
|
136
|
-
}
|
|
137
|
-
export function hasConfiguredHook(config) {
|
|
138
|
-
if (!config)
|
|
139
|
-
return false;
|
|
140
|
-
const hooks = (config.hooks ?? {});
|
|
141
|
-
const arr = hooks.beforeShellExecution;
|
|
142
|
-
if (!Array.isArray(arr))
|
|
143
|
-
return false;
|
|
144
|
-
return arr.some((entry) => entry &&
|
|
145
|
-
typeof entry === "object" &&
|
|
146
|
-
entry.command === HOOK_COMMAND_SHELL &&
|
|
147
|
-
entry.failClosed === true);
|
|
148
|
-
}
|
|
149
|
-
export function hasConfiguredBeforeMcpHook(config) {
|
|
150
|
-
if (!config)
|
|
151
|
-
return false;
|
|
152
|
-
const hooks = (config.hooks ?? {});
|
|
153
|
-
const arr = hooks.beforeMCPExecution;
|
|
154
|
-
if (!Array.isArray(arr))
|
|
155
|
-
return false;
|
|
156
|
-
return arr.some((entry) => entry &&
|
|
157
|
-
typeof entry === "object" &&
|
|
158
|
-
entry.command === HOOK_COMMAND_MCP &&
|
|
159
|
-
entry.failClosed === true);
|
|
160
|
-
}
|
|
161
|
-
export async function upsertHookConfig(opts) {
|
|
162
|
-
const dryRun = opts.dryRun ?? false;
|
|
163
|
-
const hooksPath = resolveHooksConfigPath(opts);
|
|
164
|
-
const existing = await readJson(hooksPath);
|
|
165
|
-
const beforeJson = JSON.stringify(existing ?? {});
|
|
166
|
-
const config = normalizeHooksConfig(cloneJsonMap(existing));
|
|
167
|
-
const hooks = config.hooks;
|
|
168
|
-
const before = Array.isArray(hooks.beforeShellExecution) ? [...hooks.beforeShellExecution] : [];
|
|
169
|
-
const rewritten = [];
|
|
170
|
-
let found = false;
|
|
171
|
-
for (const item of before) {
|
|
172
|
-
if (!item || typeof item !== "object") {
|
|
173
|
-
rewritten.push(item);
|
|
174
|
-
continue;
|
|
175
|
-
}
|
|
176
|
-
const map = item;
|
|
177
|
-
if (map.command === HOOK_COMMAND_SHELL || isLegacyShellHookCommand(map.command)) {
|
|
178
|
-
if (!found) {
|
|
179
|
-
found = true;
|
|
180
|
-
rewritten.push({ ...map, command: HOOK_COMMAND_SHELL, failClosed: true });
|
|
181
|
-
}
|
|
182
|
-
continue;
|
|
183
|
-
}
|
|
184
|
-
rewritten.push(item);
|
|
185
|
-
}
|
|
186
|
-
if (!found)
|
|
187
|
-
rewritten.push({ command: HOOK_COMMAND_SHELL, failClosed: true });
|
|
188
|
-
hooks.beforeShellExecution = rewritten;
|
|
189
|
-
const beforeMcp = Array.isArray(hooks.beforeMCPExecution) ? [...hooks.beforeMCPExecution] : [];
|
|
190
|
-
const rewrittenMcp = [];
|
|
191
|
-
let foundMcp = false;
|
|
192
|
-
for (const item of beforeMcp) {
|
|
193
|
-
if (!item || typeof item !== "object") {
|
|
194
|
-
rewrittenMcp.push(item);
|
|
195
|
-
continue;
|
|
196
|
-
}
|
|
197
|
-
const map = item;
|
|
198
|
-
if (map.command === HOOK_COMMAND_MCP || isLegacyMcpHookCommand(map.command)) {
|
|
199
|
-
if (!foundMcp) {
|
|
200
|
-
foundMcp = true;
|
|
201
|
-
rewrittenMcp.push({ ...map, command: HOOK_COMMAND_MCP, failClosed: true });
|
|
202
|
-
}
|
|
203
|
-
continue;
|
|
204
|
-
}
|
|
205
|
-
rewrittenMcp.push(item);
|
|
206
|
-
}
|
|
207
|
-
if (!foundMcp)
|
|
208
|
-
rewrittenMcp.push({ command: HOOK_COMMAND_MCP, failClosed: true });
|
|
209
|
-
hooks.beforeMCPExecution = rewrittenMcp;
|
|
210
|
-
const changed = beforeJson !== JSON.stringify(config);
|
|
211
|
-
if (changed && !dryRun) {
|
|
212
|
-
await writeJson(hooksPath, config);
|
|
213
|
-
}
|
|
214
|
-
return {
|
|
215
|
-
path: hooksPath,
|
|
216
|
-
changed,
|
|
217
|
-
message: changed
|
|
218
|
-
? dryRun
|
|
219
|
-
? "would update hooks config"
|
|
220
|
-
: "updated hooks config"
|
|
221
|
-
: "hooks config already up to date",
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
export function hasConfiguredMcpServer(config) {
|
|
225
|
-
if (!config)
|
|
226
|
-
return false;
|
|
227
|
-
const servers = (config.mcpServers ?? {});
|
|
228
|
-
const server = servers[MCP_SERVER_KEY];
|
|
229
|
-
if (!server || typeof server !== "object")
|
|
230
|
-
return false;
|
|
231
|
-
const map = server;
|
|
232
|
-
const args = map.args;
|
|
233
|
-
return map.command === "auditor" && Array.isArray(args) && args.length === 1 && args[0] === "mcp";
|
|
234
|
-
}
|
|
235
|
-
export async function upsertMcpConfig(explicitPath, dryRun = false) {
|
|
236
|
-
const mcpPath = resolveUserMcpConfigPath(explicitPath);
|
|
237
|
-
const existing = await readJson(mcpPath);
|
|
238
|
-
const beforeJson = JSON.stringify(existing ?? {});
|
|
239
|
-
const config = cloneJsonMap(existing);
|
|
240
|
-
if (!config.mcpServers || typeof config.mcpServers !== "object" || Array.isArray(config.mcpServers)) {
|
|
241
|
-
config.mcpServers = {};
|
|
242
|
-
}
|
|
243
|
-
const servers = config.mcpServers;
|
|
244
|
-
for (const [key, server] of Object.entries(servers)) {
|
|
245
|
-
if (key === MCP_SERVER_KEY || isLegacyPraxisGuardMcpServer(server)) {
|
|
246
|
-
const current = server && typeof server === "object" ? server : {};
|
|
247
|
-
servers[key === MCP_SERVER_KEY ? MCP_SERVER_KEY : key] = {
|
|
248
|
-
...current,
|
|
249
|
-
command: "auditor",
|
|
250
|
-
args: ["mcp"],
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
if (!servers[MCP_SERVER_KEY]) {
|
|
255
|
-
servers[MCP_SERVER_KEY] = { command: "auditor", args: ["mcp"] };
|
|
256
|
-
}
|
|
257
|
-
const changed = beforeJson !== JSON.stringify(config);
|
|
258
|
-
if (changed && !dryRun) {
|
|
259
|
-
await writeJson(mcpPath, config);
|
|
260
|
-
}
|
|
261
|
-
return {
|
|
262
|
-
path: mcpPath,
|
|
263
|
-
changed,
|
|
264
|
-
message: changed
|
|
265
|
-
? dryRun
|
|
266
|
-
? "would update MCP config"
|
|
267
|
-
: "updated MCP config"
|
|
268
|
-
: "MCP config already up to date",
|
|
269
|
-
};
|
|
270
|
-
}
|
|
271
|
-
export function hasAnyPraxisHookEntry(config) {
|
|
272
|
-
return hasConfiguredHook(config) || hasConfiguredBeforeMcpHook(config);
|
|
273
|
-
}
|
|
274
|
-
export async function readHooksStatusAt(hooksPath) {
|
|
275
|
-
const config = await readJson(hooksPath).catch(() => null);
|
|
276
|
-
return {
|
|
277
|
-
shell: hasConfiguredHook(config),
|
|
278
|
-
mcp: hasConfiguredBeforeMcpHook(config),
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
export async function readGlobalHooksConfigured() {
|
|
282
|
-
return readHooksStatusAt(resolveUserHooksPath());
|
|
283
|
-
}
|
|
284
|
-
export async function readProjectHooksConfigured(projectDir) {
|
|
285
|
-
return readHooksStatusAt(resolveProjectHooksPath(projectDir));
|
|
286
|
-
}
|
|
287
|
-
/** Global ~/.cursor/hooks.json — primary scope for GA setup. */
|
|
288
|
-
export async function readHookConfigured(_projectDir) {
|
|
289
|
-
const { shell } = await readGlobalHooksConfigured();
|
|
290
|
-
return shell;
|
|
291
|
-
}
|
|
292
|
-
/** Global ~/.cursor/hooks.json — primary scope for GA setup. */
|
|
293
|
-
export async function readBeforeMcpHookConfigured(_projectDir) {
|
|
294
|
-
const { mcp } = await readGlobalHooksConfigured();
|
|
295
|
-
return mcp;
|
|
296
|
-
}
|
|
297
|
-
export async function duplicatePraxisHooksWarning(projectDir) {
|
|
298
|
-
const [globalConfig, projectConfig] = await Promise.all([
|
|
299
|
-
readJson(resolveUserHooksPath()).catch(() => null),
|
|
300
|
-
readJson(resolveProjectHooksPath(projectDir)).catch(() => null),
|
|
301
|
-
]);
|
|
302
|
-
if (hasAnyPraxisHookEntry(globalConfig) && hasAnyPraxisHookEntry(projectConfig)) {
|
|
303
|
-
return "Praxis hooks in both ~/.cursor/hooks.json and project .cursor/hooks.json — prefer global OR project, not both.";
|
|
304
|
-
}
|
|
305
|
-
return null;
|
|
306
|
-
}
|
|
307
|
-
export async function readMcpConfigured(explicitPath) {
|
|
308
|
-
const config = await readJson(resolveUserMcpConfigPath(explicitPath));
|
|
309
|
-
return hasConfiguredMcpServer(config);
|
|
310
|
-
}
|
|
311
|
-
// --- .cursor/environment.json (Cloud Agents) ---
|
|
312
|
-
export function resolveEnvironmentJsonPath(projectDir) {
|
|
313
|
-
return path.join(projectDir, ".cursor", "environment.json");
|
|
314
|
-
}
|
|
315
|
-
function detectPackageManager(projectDir) {
|
|
316
|
-
try {
|
|
317
|
-
const raw = fs.readFileSync(path.join(projectDir, "package.json"), "utf8");
|
|
318
|
-
const pkg = JSON.parse(raw);
|
|
319
|
-
if (typeof pkg.packageManager === "string" && pkg.packageManager.startsWith("pnpm")) {
|
|
320
|
-
return "pnpm";
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
catch {
|
|
324
|
-
// No package.json or invalid — check lockfiles only
|
|
325
|
-
}
|
|
326
|
-
if (!fs.existsSync(path.join(projectDir, "package.json")))
|
|
327
|
-
return null;
|
|
328
|
-
if (fs.existsSync(path.join(projectDir, "pnpm-lock.yaml")))
|
|
329
|
-
return "pnpm";
|
|
330
|
-
if (fs.existsSync(path.join(projectDir, "yarn.lock")))
|
|
331
|
-
return "yarn";
|
|
332
|
-
return "npm";
|
|
333
|
-
}
|
|
334
|
-
export function detectMonorepoGuardInstallCommand(projectDir) {
|
|
335
|
-
const auditorCli = path.join(projectDir, "packages", "auditor-cli", "package.json");
|
|
336
|
-
const auditorPolicy = path.join(projectDir, "packages", "auditor-policy", "package.json");
|
|
337
|
-
if (!fs.existsSync(auditorCli) || !fs.existsSync(auditorPolicy))
|
|
338
|
-
return null;
|
|
339
|
-
const pm = detectPackageManager(projectDir);
|
|
340
|
-
const prefix = pm === "pnpm"
|
|
341
|
-
? "corepack enable && corepack prepare pnpm@10.33.0 --activate && pnpm install --frozen-lockfile && "
|
|
342
|
-
: pm === "yarn"
|
|
343
|
-
? "yarn install --frozen-lockfile && "
|
|
344
|
-
: "";
|
|
345
|
-
return `${prefix}pnpm -C packages/auditor-policy build && pnpm -C packages/auditor-cli build`;
|
|
346
|
-
}
|
|
347
|
-
export function detectInstallCommand(projectDir) {
|
|
348
|
-
const monorepo = detectMonorepoGuardInstallCommand(projectDir);
|
|
349
|
-
if (monorepo)
|
|
350
|
-
return monorepo;
|
|
351
|
-
const pm = detectPackageManager(projectDir);
|
|
352
|
-
switch (pm) {
|
|
353
|
-
case "pnpm":
|
|
354
|
-
return "pnpm install --frozen-lockfile";
|
|
355
|
-
case "yarn":
|
|
356
|
-
return "yarn install --frozen-lockfile";
|
|
357
|
-
case "npm":
|
|
358
|
-
return fs.existsSync(path.join(projectDir, "package-lock.json"))
|
|
359
|
-
? "npm ci"
|
|
360
|
-
: "npm install";
|
|
361
|
-
default:
|
|
362
|
-
return "npm install -g @praxis.guard/auditor-cli";
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
export function hasConfiguredEnvironment(config) {
|
|
366
|
-
return !!config && typeof config.install === "string" && config.install.length > 0;
|
|
367
|
-
}
|
|
368
|
-
export async function upsertEnvironmentConfig(projectDir, dryRun = false) {
|
|
369
|
-
const envPath = resolveEnvironmentJsonPath(projectDir);
|
|
370
|
-
const existing = await readJson(envPath);
|
|
371
|
-
const installCmd = detectInstallCommand(projectDir);
|
|
372
|
-
const existingInstall = existing?.install && typeof existing.install === "string" ? existing.install : "";
|
|
373
|
-
if (existingInstall && !existingInstall.includes("guard-mcp")) {
|
|
374
|
-
return {
|
|
375
|
-
path: envPath,
|
|
376
|
-
changed: false,
|
|
377
|
-
message: "environment.json already has install command",
|
|
378
|
-
};
|
|
379
|
-
}
|
|
380
|
-
if (existingInstall.includes("guard-mcp")) {
|
|
381
|
-
const config = { ...(existing ? cloneJsonMap(existing) : {}), install: installCmd };
|
|
382
|
-
const changed = JSON.stringify(existing ?? {}) !== JSON.stringify(config);
|
|
383
|
-
if (changed && !dryRun)
|
|
384
|
-
await writeJson(envPath, config);
|
|
385
|
-
return {
|
|
386
|
-
path: envPath,
|
|
387
|
-
changed,
|
|
388
|
-
message: changed ? "migrated environment.json install (removed guard-mcp)" : "unchanged",
|
|
389
|
-
};
|
|
390
|
-
}
|
|
391
|
-
const config = { ...(existing ? cloneJsonMap(existing) : {}), install: installCmd };
|
|
392
|
-
const changed = JSON.stringify(existing ?? {}) !== JSON.stringify(config);
|
|
393
|
-
if (changed && !dryRun) {
|
|
394
|
-
await writeJson(envPath, config);
|
|
395
|
-
}
|
|
396
|
-
return {
|
|
397
|
-
path: envPath,
|
|
398
|
-
changed,
|
|
399
|
-
message: changed
|
|
400
|
-
? dryRun
|
|
401
|
-
? "would create environment.json"
|
|
402
|
-
: "created environment.json"
|
|
403
|
-
: "environment.json already up to date",
|
|
404
|
-
};
|
|
405
|
-
}
|
|
406
|
-
export async function readEnvironmentConfigured(projectDir) {
|
|
407
|
-
const config = await readJson(resolveEnvironmentJsonPath(projectDir));
|
|
408
|
-
return hasConfiguredEnvironment(config);
|
|
409
|
-
}
|
|
1
|
+
export * from "./cursor-config/index.js";
|
|
410
2
|
//# sourceMappingURL=cursor-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-config.js","sourceRoot":"","sources":["../../src/cli/cursor-config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cursor-config.js","sourceRoot":"","sources":["../../src/cli/cursor-config.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
|