@praxis.guard/auditor-cli 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -0
- package/dist/audit/jsonl.d.ts +7 -0
- package/dist/audit/jsonl.d.ts.map +1 -0
- package/dist/audit/jsonl.js +16 -0
- package/dist/audit/jsonl.js.map +1 -0
- package/dist/bridge/shell-approval-bridge.d.ts +28 -0
- package/dist/bridge/shell-approval-bridge.d.ts.map +1 -0
- package/dist/bridge/shell-approval-bridge.js +63 -0
- package/dist/bridge/shell-approval-bridge.js.map +1 -0
- package/dist/cli/callable-fetch.d.ts +8 -0
- package/dist/cli/callable-fetch.d.ts.map +1 -0
- package/dist/cli/callable-fetch.js +30 -0
- package/dist/cli/callable-fetch.js.map +1 -0
- package/dist/cli/credentials.d.ts +10 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +53 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/cursor-config.d.ts +16 -0
- package/dist/cli/cursor-config.d.ts.map +1 -0
- package/dist/cli/cursor-config.js +153 -0
- package/dist/cli/cursor-config.js.map +1 -0
- package/dist/cli/doctor.d.ts +2 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +83 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/firebase-targets.d.ts +7 -0
- package/dist/cli/firebase-targets.d.ts.map +1 -0
- package/dist/cli/firebase-targets.js +49 -0
- package/dist/cli/firebase-targets.js.map +1 -0
- package/dist/cli/function-url.d.ts +8 -0
- package/dist/cli/function-url.d.ts.map +1 -0
- package/dist/cli/function-url.js +20 -0
- package/dist/cli/function-url.js.map +1 -0
- package/dist/cli/http-fetch.d.ts +7 -0
- package/dist/cli/http-fetch.d.ts.map +1 -0
- package/dist/cli/http-fetch.js +21 -0
- package/dist/cli/http-fetch.js.map +1 -0
- package/dist/cli/install-id.d.ts +6 -0
- package/dist/cli/install-id.d.ts.map +1 -0
- package/dist/cli/install-id.js +30 -0
- package/dist/cli/install-id.js.map +1 -0
- package/dist/cli/login.d.ts +2 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +76 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/logout.d.ts +2 -0
- package/dist/cli/logout.d.ts.map +1 -0
- package/dist/cli/logout.js +51 -0
- package/dist/cli/logout.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +158 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/policies-callable-url.d.ts +24 -0
- package/dist/cli/policies-callable-url.d.ts.map +1 -0
- package/dist/cli/policies-callable-url.js +66 -0
- package/dist/cli/policies-callable-url.js.map +1 -0
- package/dist/cli/policies-meta.d.ts +6 -0
- package/dist/cli/policies-meta.d.ts.map +1 -0
- package/dist/cli/policies-meta.js +18 -0
- package/dist/cli/policies-meta.js.map +1 -0
- package/dist/cli/policies-sync.d.ts +2 -0
- package/dist/cli/policies-sync.d.ts.map +1 -0
- package/dist/cli/policies-sync.js +40 -0
- package/dist/cli/policies-sync.js.map +1 -0
- package/dist/cli/setup-all.d.ts +9 -0
- package/dist/cli/setup-all.d.ts.map +1 -0
- package/dist/cli/setup-all.js +43 -0
- package/dist/cli/setup-all.js.map +1 -0
- package/dist/cli/setup-doctor.d.ts +8 -0
- package/dist/cli/setup-doctor.d.ts.map +1 -0
- package/dist/cli/setup-doctor.js +42 -0
- package/dist/cli/setup-doctor.js.map +1 -0
- package/dist/cli/setup-hook.d.ts +8 -0
- package/dist/cli/setup-hook.d.ts.map +1 -0
- package/dist/cli/setup-hook.js +30 -0
- package/dist/cli/setup-hook.js.map +1 -0
- package/dist/cli/setup-mcp.d.ts +8 -0
- package/dist/cli/setup-mcp.d.ts.map +1 -0
- package/dist/cli/setup-mcp.js +30 -0
- package/dist/cli/setup-mcp.js.map +1 -0
- package/dist/cli/touch-last-seen.d.ts +6 -0
- package/dist/cli/touch-last-seen.d.ts.map +1 -0
- package/dist/cli/touch-last-seen.js +46 -0
- package/dist/cli/touch-last-seen.js.map +1 -0
- package/dist/cli/version.d.ts +2 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +19 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/cli/whoami.d.ts +2 -0
- package/dist/cli/whoami.d.ts.map +1 -0
- package/dist/cli/whoami.js +36 -0
- package/dist/cli/whoami.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +19 -0
- package/dist/cli.js.map +1 -0
- package/dist/hooks/run-before-shell.d.ts +16 -0
- package/dist/hooks/run-before-shell.d.ts.map +1 -0
- package/dist/hooks/run-before-shell.js +132 -0
- package/dist/hooks/run-before-shell.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +252 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/policies.v1.json +502 -0
- package/dist/policy/index.d.ts +47 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +170 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/shell/evaluate.d.ts +37 -0
- package/dist/shell/evaluate.d.ts.map +1 -0
- package/dist/shell/evaluate.js +81 -0
- package/dist/shell/evaluate.js.map +1 -0
- package/dist/shell/governed-tools.d.ts +3 -0
- package/dist/shell/governed-tools.d.ts.map +1 -0
- package/dist/shell/governed-tools.js +3 -0
- package/dist/shell/governed-tools.js.map +1 -0
- package/dist/shell/parse.d.ts +2 -0
- package/dist/shell/parse.d.ts.map +1 -0
- package/dist/shell/parse.js +7 -0
- package/dist/shell/parse.js.map +1 -0
- package/dist/telemetry/guard-events.d.ts +9 -0
- package/dist/telemetry/guard-events.d.ts.map +1 -0
- package/dist/telemetry/guard-events.js +86 -0
- package/dist/telemetry/guard-events.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
export async function readPoliciesMetaFile(metaPath) {
|
|
3
|
+
try {
|
|
4
|
+
const raw = await readFile(metaPath, "utf8");
|
|
5
|
+
const j = JSON.parse(raw);
|
|
6
|
+
if (typeof j.revision !== "number" || !Number.isFinite(j.revision)) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
return {
|
|
10
|
+
revision: j.revision,
|
|
11
|
+
syncedAt: typeof j.syncedAt === "string" ? j.syncedAt : undefined,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=policies-meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policies-meta.js","sourceRoot":"","sources":["../../src/cli/policies-meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAO5C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IACzD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA+C,CAAC;QACxE,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SAClE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policies-sync.d.ts","sourceRoot":"","sources":["../../src/cli/policies-sync.ts"],"names":[],"mappings":"AA8BA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA6BrD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { writeFile, rename } from "node:fs/promises";
|
|
2
|
+
import process from "node:process";
|
|
3
|
+
import { defaultPoliciesMetaPath, defaultPoliciesV1Path, parsePoliciesV1Json, } from "../policy/index.js";
|
|
4
|
+
import { fetchJson } from "./http-fetch.js";
|
|
5
|
+
import { resolveGuardToken } from "./credentials.js";
|
|
6
|
+
import { getInstallId } from "./install-id.js";
|
|
7
|
+
import { functionsHttpUrl } from "./policies-callable-url.js";
|
|
8
|
+
function policiesCallableBearer() {
|
|
9
|
+
const token = resolveGuardToken();
|
|
10
|
+
if (token)
|
|
11
|
+
return token;
|
|
12
|
+
const idToken = process.env.PRAXIS_FIREBASE_ID_TOKEN?.trim();
|
|
13
|
+
if (idToken)
|
|
14
|
+
return idToken;
|
|
15
|
+
throw new Error("Not authenticated. Run `auditor login`, or set PRAXIS_GUARD_TOKEN / PRAXIS_FIREBASE_ID_TOKEN.");
|
|
16
|
+
}
|
|
17
|
+
export async function runPoliciesSync() {
|
|
18
|
+
const bearer = policiesCallableBearer();
|
|
19
|
+
const url = functionsHttpUrl("policiesGetHttp");
|
|
20
|
+
const result = await fetchJson({
|
|
21
|
+
url,
|
|
22
|
+
bearerToken: bearer,
|
|
23
|
+
method: "POST",
|
|
24
|
+
body: { installId: getInstallId() },
|
|
25
|
+
});
|
|
26
|
+
const policies = parsePoliciesV1Json(result.policies);
|
|
27
|
+
const policyPath = process.env.PRAXIS_POLICIES_V1_PATH?.trim() || defaultPoliciesV1Path();
|
|
28
|
+
const metaPath = process.env.PRAXIS_POLICIES_META_PATH?.trim() || defaultPoliciesMetaPath();
|
|
29
|
+
const tmp = `${policyPath}.tmp.${process.pid}`;
|
|
30
|
+
const body = `${JSON.stringify(policies, null, 2)}\n`;
|
|
31
|
+
await writeFile(tmp, body, "utf8");
|
|
32
|
+
await rename(tmp, policyPath);
|
|
33
|
+
const meta = {
|
|
34
|
+
revision: result.revision,
|
|
35
|
+
syncedAt: new Date().toISOString(),
|
|
36
|
+
};
|
|
37
|
+
await writeFile(metaPath, `${JSON.stringify(meta, null, 2)}\n`, "utf8");
|
|
38
|
+
process.stdout.write(`Synced policies revision ${result.revision} to:\n ${policyPath}\n ${metaPath}\n`);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=policies-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policies-sync.js","sourceRoot":"","sources":["../../src/cli/policies-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAQ9D,SAAS,sBAAsB;IAC7B,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;IAClC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE,CAAC;IAC7D,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;IAExC,MAAM,GAAG,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAoB;QAChD,GAAG;QACH,WAAW,EAAE,MAAM;QACnB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE;KACpC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE,IAAI,qBAAqB,EAAE,CAAC;IAC1F,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,IAAI,uBAAuB,EAAE,CAAC;IAE5F,MAAM,GAAG,GAAG,GAAG,UAAU,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IACtD,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAE9B,MAAM,IAAI,GAAG;QACX,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACnC,CAAC;IACF,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAExE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,4BAA4B,MAAM,CAAC,QAAQ,WAAW,UAAU,OAAO,QAAQ,IAAI,CACpF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type AllOptions = {
|
|
2
|
+
projectDir: string;
|
|
3
|
+
userConfigPath?: string;
|
|
4
|
+
dryRun: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function parseSetupAllOptions(args: string[]): AllOptions;
|
|
7
|
+
export declare function runSetupAll(args: string[]): Promise<void>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=setup-all.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-all.d.ts","sourceRoot":"","sources":["../../src/cli/setup-all.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA6B/D;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAU/D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { upsertHookConfig, upsertMcpConfig } from "./cursor-config.js";
|
|
3
|
+
export function parseSetupAllOptions(args) {
|
|
4
|
+
let projectDir = process.cwd();
|
|
5
|
+
let userConfigPath;
|
|
6
|
+
let dryRun = false;
|
|
7
|
+
for (let i = 0; i < args.length; i++) {
|
|
8
|
+
const arg = args[i];
|
|
9
|
+
if (arg === "--dry-run") {
|
|
10
|
+
dryRun = true;
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
if (arg === "--project") {
|
|
14
|
+
const value = args[i + 1];
|
|
15
|
+
if (!value)
|
|
16
|
+
throw new Error("Missing value for --project");
|
|
17
|
+
projectDir = value;
|
|
18
|
+
i++;
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (arg === "--user-config") {
|
|
22
|
+
const value = args[i + 1];
|
|
23
|
+
if (!value)
|
|
24
|
+
throw new Error("Missing value for --user-config");
|
|
25
|
+
userConfigPath = value;
|
|
26
|
+
i++;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
throw new Error(`Unknown setup all option: ${arg}`);
|
|
30
|
+
}
|
|
31
|
+
return { projectDir, userConfigPath, dryRun };
|
|
32
|
+
}
|
|
33
|
+
export async function runSetupAll(args) {
|
|
34
|
+
const opts = parseSetupAllOptions(args);
|
|
35
|
+
const hook = await upsertHookConfig(opts.projectDir, opts.dryRun);
|
|
36
|
+
const mcp = await upsertMcpConfig(opts.userConfigPath, opts.dryRun);
|
|
37
|
+
process.stdout.write("setup all:\n");
|
|
38
|
+
process.stdout.write(` hook: ${hook.message}\n`);
|
|
39
|
+
process.stdout.write(` path: ${hook.path}\n`);
|
|
40
|
+
process.stdout.write(` mcp: ${mcp.message}\n`);
|
|
41
|
+
process.stdout.write(` path: ${mcp.path}\n`);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=setup-all.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-all.js","sourceRoot":"","sources":["../../src/cli/setup-all.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAQvE,MAAM,UAAU,oBAAoB,CAAC,IAAc;IACjD,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,cAAkC,CAAC;IACvC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC3D,UAAU,GAAG,KAAK,CAAC;YACnB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAC/D,cAAc,GAAG,KAAK,CAAC;YACvB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAEpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type SetupDoctorOptions = {
|
|
2
|
+
projectDir: string;
|
|
3
|
+
userConfigPath?: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function parseSetupDoctorOptions(args: string[]): SetupDoctorOptions;
|
|
6
|
+
export declare function runSetupDoctor(args: string[]): Promise<void>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=setup-doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-doctor.d.ts","sourceRoot":"","sources":["../../src/cli/setup-doctor.ts"],"names":[],"mappings":"AASA,KAAK,kBAAkB,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAwB1E;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBlE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { readHookConfigured, readMcpConfigured, resolveProjectHooksPath, resolveUserMcpConfigPath, } from "./cursor-config.js";
|
|
3
|
+
export function parseSetupDoctorOptions(args) {
|
|
4
|
+
let projectDir = process.cwd();
|
|
5
|
+
let userConfigPath;
|
|
6
|
+
for (let i = 0; i < args.length; i++) {
|
|
7
|
+
const arg = args[i];
|
|
8
|
+
if (arg === "--project") {
|
|
9
|
+
const value = args[i + 1];
|
|
10
|
+
if (!value)
|
|
11
|
+
throw new Error("Missing value for --project");
|
|
12
|
+
projectDir = value;
|
|
13
|
+
i++;
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (arg === "--user-config") {
|
|
17
|
+
const value = args[i + 1];
|
|
18
|
+
if (!value)
|
|
19
|
+
throw new Error("Missing value for --user-config");
|
|
20
|
+
userConfigPath = value;
|
|
21
|
+
i++;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
throw new Error(`Unknown setup doctor option: ${arg}`);
|
|
25
|
+
}
|
|
26
|
+
return { projectDir, userConfigPath };
|
|
27
|
+
}
|
|
28
|
+
export async function runSetupDoctor(args) {
|
|
29
|
+
const opts = parseSetupDoctorOptions(args);
|
|
30
|
+
const hookPath = resolveProjectHooksPath(opts.projectDir);
|
|
31
|
+
const mcpPath = resolveUserMcpConfigPath(opts.userConfigPath);
|
|
32
|
+
const hookConfigured = await readHookConfigured(opts.projectDir).catch(() => false);
|
|
33
|
+
const mcpConfigured = await readMcpConfigured(opts.userConfigPath).catch(() => false);
|
|
34
|
+
process.stdout.write("setup doctor:\n");
|
|
35
|
+
process.stdout.write(` hook: ${hookConfigured ? "configured" : "missing"} (${hookPath})\n`);
|
|
36
|
+
process.stdout.write(` mcp: ${mcpConfigured ? "configured" : "missing"} (${mcpPath})\n`);
|
|
37
|
+
if (!hookConfigured || !mcpConfigured) {
|
|
38
|
+
process.stdout.write(" suggestion: run `auditor setup all`\n");
|
|
39
|
+
process.exitCode = 1;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=setup-doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-doctor.js","sourceRoot":"","sources":["../../src/cli/setup-doctor.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAO5B,MAAM,UAAU,uBAAuB,CAAC,IAAc;IACpD,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,cAAkC,CAAC;IAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC3D,UAAU,GAAG,KAAK,CAAC;YACnB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAC/D,cAAc,GAAG,KAAK,CAAC;YACvB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,MAAM,IAAI,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,wBAAwB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAE9D,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACpF,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IAEtF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,WAAW,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,KAAK,CACvE,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,KAAK,CACpE,CAAC;IAEF,IAAI,CAAC,cAAc,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type HookOptions = {
|
|
2
|
+
projectDir: string;
|
|
3
|
+
dryRun: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare function parseSetupHookOptions(args: string[]): HookOptions;
|
|
6
|
+
export declare function runSetupHook(args: string[]): Promise<void>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=setup-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-hook.d.ts","sourceRoot":"","sources":["../../src/cli/setup-hook.ts"],"names":[],"mappings":"AAIA,KAAK,WAAW,GAAG;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAqBjE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { upsertHookConfig } from "./cursor-config.js";
|
|
3
|
+
export function parseSetupHookOptions(args) {
|
|
4
|
+
let projectDir = process.cwd();
|
|
5
|
+
let dryRun = false;
|
|
6
|
+
for (let i = 0; i < args.length; i++) {
|
|
7
|
+
const arg = args[i];
|
|
8
|
+
if (arg === "--dry-run") {
|
|
9
|
+
dryRun = true;
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
if (arg === "--project") {
|
|
13
|
+
const value = args[i + 1];
|
|
14
|
+
if (!value)
|
|
15
|
+
throw new Error("Missing value for --project");
|
|
16
|
+
projectDir = value;
|
|
17
|
+
i++;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
throw new Error(`Unknown setup hook option: ${arg}`);
|
|
21
|
+
}
|
|
22
|
+
return { projectDir, dryRun };
|
|
23
|
+
}
|
|
24
|
+
export async function runSetupHook(args) {
|
|
25
|
+
const opts = parseSetupHookOptions(args);
|
|
26
|
+
const result = await upsertHookConfig(opts.projectDir, opts.dryRun);
|
|
27
|
+
process.stdout.write(`setup hook: ${result.message}\n`);
|
|
28
|
+
process.stdout.write(`path: ${result.path}\n`);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=setup-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-hook.js","sourceRoot":"","sources":["../../src/cli/setup-hook.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAOtD,MAAM,UAAU,qBAAqB,CAAC,IAAc;IAClD,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC3D,UAAU,GAAG,KAAK,CAAC;YACnB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type McpOptions = {
|
|
2
|
+
userConfigPath?: string;
|
|
3
|
+
dryRun: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare function parseSetupMcpOptions(args: string[]): McpOptions;
|
|
6
|
+
export declare function runSetupMcp(args: string[]): Promise<void>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=setup-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-mcp.d.ts","sourceRoot":"","sources":["../../src/cli/setup-mcp.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAqB/D;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { upsertMcpConfig } from "./cursor-config.js";
|
|
3
|
+
export function parseSetupMcpOptions(args) {
|
|
4
|
+
let userConfigPath;
|
|
5
|
+
let dryRun = false;
|
|
6
|
+
for (let i = 0; i < args.length; i++) {
|
|
7
|
+
const arg = args[i];
|
|
8
|
+
if (arg === "--dry-run") {
|
|
9
|
+
dryRun = true;
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
if (arg === "--user-config") {
|
|
13
|
+
const value = args[i + 1];
|
|
14
|
+
if (!value)
|
|
15
|
+
throw new Error("Missing value for --user-config");
|
|
16
|
+
userConfigPath = value;
|
|
17
|
+
i++;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
throw new Error(`Unknown setup mcp option: ${arg}`);
|
|
21
|
+
}
|
|
22
|
+
return { userConfigPath, dryRun };
|
|
23
|
+
}
|
|
24
|
+
export async function runSetupMcp(args) {
|
|
25
|
+
const opts = parseSetupMcpOptions(args);
|
|
26
|
+
const result = await upsertMcpConfig(opts.userConfigPath, opts.dryRun);
|
|
27
|
+
process.stdout.write(`setup mcp: ${result.message}\n`);
|
|
28
|
+
process.stdout.write(`path: ${result.path}\n`);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=setup-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-mcp.js","sourceRoot":"","sources":["../../src/cli/setup-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAOrD,MAAM,UAAU,oBAAoB,CAAC,IAAc;IACjD,IAAI,cAAkC,CAAC;IACvC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAC/D,cAAc,GAAG,KAAK,CAAC;YACvB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"touch-last-seen.d.ts","sourceRoot":"","sources":["../../src/cli/touch-last-seen.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAkCnD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { resolveGuardToken } from "./credentials.js";
|
|
2
|
+
import { getInstallId } from "./install-id.js";
|
|
3
|
+
import { prodFunctionUrl } from "./function-url.js";
|
|
4
|
+
const CLI_VERSION = "0.0.1";
|
|
5
|
+
let lastTouchMs = 0;
|
|
6
|
+
const MIN_TOUCH_INTERVAL_MS = 30_000;
|
|
7
|
+
/**
|
|
8
|
+
* Best-effort fire-and-forget heartbeat to keep `lastSeenAt` fresh.
|
|
9
|
+
* Debounced: skips if called again within 30s.
|
|
10
|
+
*/
|
|
11
|
+
export async function touchLastSeen() {
|
|
12
|
+
const now = Date.now();
|
|
13
|
+
if (now - lastTouchMs < MIN_TOUCH_INTERVAL_MS)
|
|
14
|
+
return;
|
|
15
|
+
lastTouchMs = now;
|
|
16
|
+
const heartbeatUrl = process.env.PRAXIS_GUARD_HEARTBEAT_URL || prodFunctionUrl("guardHeartbeat");
|
|
17
|
+
const token = resolveGuardToken();
|
|
18
|
+
if (!token)
|
|
19
|
+
return;
|
|
20
|
+
const payload = {
|
|
21
|
+
installId: getInstallId(),
|
|
22
|
+
kind: "auditor-cli",
|
|
23
|
+
version: CLI_VERSION,
|
|
24
|
+
status: "active",
|
|
25
|
+
client: {
|
|
26
|
+
os: process.platform,
|
|
27
|
+
arch: process.arch,
|
|
28
|
+
node: process.version,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
try {
|
|
32
|
+
await fetch(heartbeatUrl, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: {
|
|
35
|
+
Authorization: `Bearer ${token}`,
|
|
36
|
+
"Content-Type": "application/json",
|
|
37
|
+
},
|
|
38
|
+
body: JSON.stringify(payload),
|
|
39
|
+
signal: AbortSignal.timeout(3000),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// best-effort — never fails the caller
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=touch-last-seen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"touch-last-seen.js","sourceRoot":"","sources":["../../src/cli/touch-last-seen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,GAAG,OAAO,CAAC;AAE5B,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAErC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,GAAG,GAAG,WAAW,GAAG,qBAAqB;QAAE,OAAO;IACtD,WAAW,GAAG,GAAG,CAAC;IAElB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,eAAe,CAAC,gBAAgB,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;IAClC,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,MAAM,OAAO,GAAG;QACd,SAAS,EAAE,YAAY,EAAE;QACzB,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,WAAW;QACpB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE;YACN,EAAE,EAAE,OAAO,CAAC,QAAQ;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,OAAO;SACtB;KACF,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,YAAY,EAAE;YACxB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/cli/version.ts"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,IAAI,IAAI,CAajC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import process from "node:process";
|
|
6
|
+
export function runVersion() {
|
|
7
|
+
const pkgPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../package.json");
|
|
8
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
9
|
+
const version = pkg.version ?? "0.0.0";
|
|
10
|
+
let sha = "";
|
|
11
|
+
try {
|
|
12
|
+
sha = execSync("git rev-parse --short HEAD", { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// Not a git checkout or git unavailable
|
|
16
|
+
}
|
|
17
|
+
process.stdout.write(sha ? `auditor ${version} (${sha})\n` : `auditor ${version}\n`);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/cli/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;IACjG,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAyB,CAAC;IAC9E,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAEvC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,QAAQ,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjH,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,OAAO,IAAI,CAAC,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/cli/whoami.ts"],"names":[],"mappings":"AAaA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAgC/C"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { fetchJson } from "./http-fetch.js";
|
|
3
|
+
import { credentialsPath, resolveGuardToken } from "./credentials.js";
|
|
4
|
+
import { getInstallId } from "./install-id.js";
|
|
5
|
+
import { functionsHttpUrl } from "./policies-callable-url.js";
|
|
6
|
+
export async function runWhoami() {
|
|
7
|
+
const token = resolveGuardToken() || process.env.PRAXIS_FIREBASE_ID_TOKEN?.trim();
|
|
8
|
+
if (!token) {
|
|
9
|
+
process.stderr.write("Not authenticated. Run `auditor login` or set PRAXIS_GUARD_TOKEN or PRAXIS_FIREBASE_ID_TOKEN.\n");
|
|
10
|
+
process.exitCode = 1;
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const tokenSource = process.env.PRAXIS_GUARD_TOKEN?.trim()
|
|
14
|
+
? "env:PRAXIS_GUARD_TOKEN"
|
|
15
|
+
: process.env.PRAXIS_FIREBASE_ID_TOKEN?.trim()
|
|
16
|
+
? "env:PRAXIS_FIREBASE_ID_TOKEN"
|
|
17
|
+
: `file:${credentialsPath()}`;
|
|
18
|
+
try {
|
|
19
|
+
const installId = getInstallId();
|
|
20
|
+
const me = await fetchJson({
|
|
21
|
+
url: functionsHttpUrl("guardWhoAmIHttp"),
|
|
22
|
+
bearerToken: token,
|
|
23
|
+
});
|
|
24
|
+
process.stdout.write(`uid: ${me.uid}\n`);
|
|
25
|
+
process.stdout.write(`email: ${me.email ?? "(none)"}\n`);
|
|
26
|
+
process.stdout.write(`displayName: ${me.displayName ?? "(none)"}\n`);
|
|
27
|
+
process.stdout.write(`installId: ${installId}\n`);
|
|
28
|
+
process.stdout.write(`tokenSource: ${tokenSource}\n`);
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
32
|
+
process.stderr.write(`whoami failed: ${msg}\n`);
|
|
33
|
+
process.exitCode = 1;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/cli/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAuB,MAAM,4BAA4B,CAAC;AAQnF,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,KAAK,GAAG,iBAAiB,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE,CAAC;IAClF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iGAAiG,CAClG,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE;QACxD,CAAC,CAAC,wBAAwB;QAC1B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE;YAC5C,CAAC,CAAC,8BAA8B;YAChC,CAAC,CAAC,QAAQ,eAAe,EAAE,EAAE,CAAC;IAElC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,MAAM,SAAS,CAAe;YACvC,GAAG,EAAE,gBAAgB,CAAC,iBAAiB,CAAC;YACxC,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,KAAK,IAAI,QAAQ,IAAI,CAAC,CAAC;QAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,WAAW,IAAI,QAAQ,IAAI,CAAC,CAAC;QACrE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,SAAS,IAAI,CAAC,CAAC;QACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,WAAW,IAAI,CAAC,CAAC;IACxD,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,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;QAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import process from "node:process";
|
|
3
|
+
import { runCli } from "./cli/main.js";
|
|
4
|
+
import { failClosedHookErrorResponse } from "./hooks/run-before-shell.js";
|
|
5
|
+
const argv = process.argv.slice(2);
|
|
6
|
+
const isBeforeShellHook = argv[0] === "hook" && argv[1] === "before-shell";
|
|
7
|
+
if (isBeforeShellHook) {
|
|
8
|
+
void runCli(argv).catch((err) => {
|
|
9
|
+
process.stdout.write(JSON.stringify(failClosedHookErrorResponse(err), null, 2));
|
|
10
|
+
process.exit(0);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
void runCli(argv).catch((err) => {
|
|
15
|
+
console.error(err);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAE1E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,iBAAiB,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC;AAE3E,IAAI,iBAAiB,EAAE,CAAC;IACtB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,2BAA2B,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;KAAM,CAAC;IACN,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC9B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type BeforeShellExecutionPayload = {
|
|
2
|
+
command: string;
|
|
3
|
+
cwd?: string;
|
|
4
|
+
sandbox?: boolean;
|
|
5
|
+
};
|
|
6
|
+
export type BeforeShellExecutionResponse = {
|
|
7
|
+
permission: "allow" | "deny" | "ask";
|
|
8
|
+
user_message?: string;
|
|
9
|
+
agent_message?: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Cursor `beforeShellExecution` contract: read one JSON object from stdin, write one JSON object to stdout.
|
|
13
|
+
*/
|
|
14
|
+
export declare function runBeforeShellHookFromStdin(): Promise<void>;
|
|
15
|
+
export declare function failClosedHookErrorResponse(err: unknown): BeforeShellExecutionResponse;
|
|
16
|
+
//# sourceMappingURL=run-before-shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-before-shell.d.ts","sourceRoot":"","sources":["../../src/hooks/run-before-shell.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AA+BF;;GAEG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC,CA8FjE;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,4BAA4B,CAMtF"}
|