@praxis.guard/auditor-cli 0.0.45 → 0.0.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +7 -1
  2. package/dist/adapters/claude-code/adapter.d.ts +28 -0
  3. package/dist/adapters/claude-code/adapter.d.ts.map +1 -0
  4. package/dist/adapters/claude-code/adapter.js +141 -0
  5. package/dist/adapters/claude-code/adapter.js.map +1 -0
  6. package/dist/adapters/claude-code/config-detect.d.ts +4 -0
  7. package/dist/adapters/claude-code/config-detect.d.ts.map +1 -0
  8. package/dist/adapters/claude-code/config-detect.js +44 -0
  9. package/dist/adapters/claude-code/config-detect.js.map +1 -0
  10. package/dist/adapters/claude-code/config-io.d.ts +8 -0
  11. package/dist/adapters/claude-code/config-io.d.ts.map +1 -0
  12. package/dist/adapters/claude-code/config-io.js +41 -0
  13. package/dist/adapters/claude-code/config-io.js.map +1 -0
  14. package/dist/adapters/claude-code/index.d.ts +3 -0
  15. package/dist/adapters/claude-code/index.d.ts.map +1 -0
  16. package/dist/adapters/claude-code/index.js +3 -0
  17. package/dist/adapters/claude-code/index.js.map +1 -0
  18. package/dist/adapters/claude-code/paths.d.ts +17 -0
  19. package/dist/adapters/claude-code/paths.d.ts.map +1 -0
  20. package/dist/adapters/claude-code/paths.js +32 -0
  21. package/dist/adapters/claude-code/paths.js.map +1 -0
  22. package/dist/adapters/claude-code.d.ts +1 -33
  23. package/dist/adapters/claude-code.d.ts.map +1 -1
  24. package/dist/adapters/claude-code.js +1 -246
  25. package/dist/adapters/claude-code.js.map +1 -1
  26. package/dist/adapters/codex.d.ts +11 -0
  27. package/dist/adapters/codex.d.ts.map +1 -0
  28. package/dist/adapters/codex.js +52 -0
  29. package/dist/adapters/codex.js.map +1 -0
  30. package/dist/adapters/registry.d.ts.map +1 -1
  31. package/dist/adapters/registry.js +2 -0
  32. package/dist/adapters/registry.js.map +1 -1
  33. package/dist/adapters/select-targets.js +3 -3
  34. package/dist/adapters/select-targets.js.map +1 -1
  35. package/dist/adapters/types.d.ts +9 -2
  36. package/dist/adapters/types.d.ts.map +1 -1
  37. package/dist/bridge/execution-ticket-consume.d.ts +12 -0
  38. package/dist/bridge/execution-ticket-consume.d.ts.map +1 -0
  39. package/dist/bridge/execution-ticket-consume.js +105 -0
  40. package/dist/bridge/execution-ticket-consume.js.map +1 -0
  41. package/dist/bridge/execution-ticket-match.d.ts +4 -0
  42. package/dist/bridge/execution-ticket-match.d.ts.map +1 -0
  43. package/dist/bridge/execution-ticket-match.js +40 -0
  44. package/dist/bridge/execution-ticket-match.js.map +1 -0
  45. package/dist/bridge/execution-ticket-record.d.ts +14 -0
  46. package/dist/bridge/execution-ticket-record.d.ts.map +1 -0
  47. package/dist/bridge/execution-ticket-record.js +51 -0
  48. package/dist/bridge/execution-ticket-record.js.map +1 -0
  49. package/dist/bridge/execution-ticket.d.ts +2 -23
  50. package/dist/bridge/execution-ticket.d.ts.map +1 -1
  51. package/dist/bridge/execution-ticket.js +2 -179
  52. package/dist/bridge/execution-ticket.js.map +1 -1
  53. package/dist/cli/doctor.d.ts.map +1 -1
  54. package/dist/cli/doctor.js +17 -13
  55. package/dist/cli/doctor.js.map +1 -1
  56. package/dist/cli/help.js +4 -4
  57. package/dist/cli/setup-all.d.ts.map +1 -1
  58. package/dist/cli/setup-all.js +6 -2
  59. package/dist/cli/setup-all.js.map +1 -1
  60. package/dist/cli/setup-doctor.d.ts.map +1 -1
  61. package/dist/cli/setup-doctor.js +22 -7
  62. package/dist/cli/setup-doctor.js.map +1 -1
  63. package/dist/cli/setup-mcp.d.ts +1 -0
  64. package/dist/cli/setup-mcp.d.ts.map +1 -1
  65. package/dist/cli/setup-mcp.js +15 -2
  66. package/dist/cli/setup-mcp.js.map +1 -1
  67. package/dist/codex/evaluate-tool-audit.d.ts +29 -0
  68. package/dist/codex/evaluate-tool-audit.d.ts.map +1 -0
  69. package/dist/codex/evaluate-tool-audit.js +58 -0
  70. package/dist/codex/evaluate-tool-audit.js.map +1 -0
  71. package/dist/codex/evaluate-tool-bash.d.ts +3 -0
  72. package/dist/codex/evaluate-tool-bash.d.ts.map +1 -0
  73. package/dist/codex/evaluate-tool-bash.js +50 -0
  74. package/dist/codex/evaluate-tool-bash.js.map +1 -0
  75. package/dist/codex/evaluate-tool-mcp.d.ts +3 -0
  76. package/dist/codex/evaluate-tool-mcp.d.ts.map +1 -0
  77. package/dist/codex/evaluate-tool-mcp.js +55 -0
  78. package/dist/codex/evaluate-tool-mcp.js.map +1 -0
  79. package/dist/codex/evaluate-tool-types.d.ts +27 -0
  80. package/dist/codex/evaluate-tool-types.d.ts.map +1 -0
  81. package/dist/codex/evaluate-tool-types.js +15 -0
  82. package/dist/codex/evaluate-tool-types.js.map +1 -0
  83. package/dist/codex/evaluate-tool.d.ts +3 -26
  84. package/dist/codex/evaluate-tool.d.ts.map +1 -1
  85. package/dist/codex/evaluate-tool.js +3 -167
  86. package/dist/codex/evaluate-tool.js.map +1 -1
  87. package/dist/policy/classify.d.ts +9 -0
  88. package/dist/policy/classify.d.ts.map +1 -0
  89. package/dist/policy/classify.js +97 -0
  90. package/dist/policy/classify.js.map +1 -0
  91. package/dist/policy/index.d.ts +5 -54
  92. package/dist/policy/index.d.ts.map +1 -1
  93. package/dist/policy/index.js +4 -213
  94. package/dist/policy/index.js.map +1 -1
  95. package/dist/policy/load.d.ts +8 -0
  96. package/dist/policy/load.d.ts.map +1 -0
  97. package/dist/policy/load.js +52 -0
  98. package/dist/policy/load.js.map +1 -0
  99. package/dist/policy/paths.d.ts +9 -0
  100. package/dist/policy/paths.d.ts.map +1 -0
  101. package/dist/policy/paths.js +42 -0
  102. package/dist/policy/paths.js.map +1 -0
  103. package/dist/policy/schema.d.ts +35 -0
  104. package/dist/policy/schema.d.ts.map +1 -0
  105. package/dist/policy/schema.js +30 -0
  106. package/dist/policy/schema.js.map +1 -0
  107. package/package.json +1 -1
@@ -0,0 +1,97 @@
1
+ function hasMetacharacters(argv) {
2
+ const bad = [";", "&&", "||", "|", "`", "$(", ">", "<"];
3
+ return argv.some((t) => bad.some((b) => t.includes(b)));
4
+ }
5
+ function hasDangerousFlags(argv, dangerousFlags) {
6
+ const s = new Set(dangerousFlags);
7
+ return argv.some((t) => s.has(t));
8
+ }
9
+ function tryMultiTokenVerb(verbsToTiers, rest, verbIndex, verb1) {
10
+ if (!verb1)
11
+ return verb1;
12
+ const verb2 = rest[verbIndex + 1];
13
+ if (!verb2)
14
+ return verb1;
15
+ const combined = `${verb1} ${verb2}`;
16
+ if (verbsToTiers[combined])
17
+ return combined;
18
+ return verb1;
19
+ }
20
+ export function classifyArgv(policy, argv) {
21
+ const tool = argv[0] ?? null;
22
+ const metacharacters = hasMetacharacters(argv);
23
+ const dangerous_flags = hasDangerousFlags(argv, policy.dangerous_flags);
24
+ if (!tool || !policy.policies[tool]) {
25
+ return {
26
+ classification: { tool, command_path: null, verb: null, tier: "MUTATE", matched: false },
27
+ flags: { metacharacters, dangerous_flags },
28
+ };
29
+ }
30
+ const rest = argv.slice(1);
31
+ const toolTable = policy.policies[tool];
32
+ if (rest.length === 0) {
33
+ const root = toolTable["__root__"];
34
+ const tier = root?.["__default__"];
35
+ if (tier) {
36
+ return {
37
+ classification: { tool, command_path: "__root__", verb: null, tier, matched: true },
38
+ flags: { metacharacters, dangerous_flags },
39
+ };
40
+ }
41
+ }
42
+ if (rest.length > 0 && toolTable["__root__"]) {
43
+ const root = toolTable["__root__"];
44
+ const verb = rest[0] ?? null;
45
+ let tier;
46
+ if (verb) {
47
+ tier = root[verb];
48
+ if (tier === undefined)
49
+ tier = root["*"];
50
+ }
51
+ else {
52
+ tier = root["__default__"];
53
+ }
54
+ if (tier !== undefined) {
55
+ return {
56
+ classification: { tool, command_path: "__root__", verb, tier, matched: true },
57
+ flags: { metacharacters, dangerous_flags },
58
+ };
59
+ }
60
+ }
61
+ const pathKeys = Object.keys(toolTable).sort((a, b) => b.split(" ").length - a.split(" ").length);
62
+ for (const pathKey of pathKeys) {
63
+ const k = pathKey.split(" ");
64
+ const prefix = rest.slice(0, k.length);
65
+ const matches = k.length > 0 && prefix.length === k.length && prefix.every((t, i) => t === k[i]);
66
+ if (!matches)
67
+ continue;
68
+ const verbIndex = k.length;
69
+ const verb1 = rest[verbIndex] ?? null;
70
+ const verbsToTiers = toolTable[pathKey] ?? {};
71
+ const verb = tryMultiTokenVerb(verbsToTiers, rest, verbIndex, verb1);
72
+ let tier;
73
+ if (verb) {
74
+ tier = verbsToTiers[verb];
75
+ if (tier === undefined)
76
+ tier = verbsToTiers["*"];
77
+ }
78
+ else {
79
+ tier = verbsToTiers["__default__"];
80
+ }
81
+ if (tier === undefined) {
82
+ return {
83
+ classification: { tool, command_path: pathKey, verb, tier: "MUTATE", matched: false },
84
+ flags: { metacharacters, dangerous_flags },
85
+ };
86
+ }
87
+ return {
88
+ classification: { tool, command_path: pathKey, verb, tier, matched: true },
89
+ flags: { metacharacters, dangerous_flags },
90
+ };
91
+ }
92
+ return {
93
+ classification: { tool, command_path: rest[0] ?? null, verb: rest[1] ?? null, tier: "MUTATE", matched: false },
94
+ flags: { metacharacters, dangerous_flags },
95
+ };
96
+ }
97
+ //# sourceMappingURL=classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/policy/classify.ts"],"names":[],"mappings":"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"}
@@ -1,55 +1,6 @@
1
- import { z } from "zod";
2
- export declare const TierSchema: z.ZodEnum<{
3
- READ: "READ";
4
- MUTATE: "MUTATE";
5
- DESTRUCTIVE: "DESTRUCTIVE";
6
- }>;
7
- export type Tier = z.infer<typeof TierSchema>;
8
- export declare const PoliciesV1Schema: z.ZodObject<{
9
- tiers: z.ZodArray<z.ZodEnum<{
10
- READ: "READ";
11
- MUTATE: "MUTATE";
12
- DESTRUCTIVE: "DESTRUCTIVE";
13
- }>>;
14
- dangerous_flags: z.ZodArray<z.ZodString>;
15
- policies: z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodEnum<{
16
- READ: "READ";
17
- MUTATE: "MUTATE";
18
- DESTRUCTIVE: "DESTRUCTIVE";
19
- }>>>>;
20
- shell: z.ZodOptional<z.ZodObject<{
21
- prelude_verbs: z.ZodOptional<z.ZodArray<z.ZodString>>;
22
- privilege_verbs: z.ZodOptional<z.ZodArray<z.ZodString>>;
23
- }, z.core.$strip>>;
24
- }, z.core.$strip>;
25
- export type PoliciesV1 = z.infer<typeof PoliciesV1Schema>;
26
- export type Classification = {
27
- tool: string | null;
28
- command_path: string | null;
29
- verb: string | null;
30
- tier: Tier;
31
- matched: boolean;
32
- };
33
- export declare function ensureTiersComplete(tiers: readonly Tier[]): void;
34
- export declare function parsePoliciesV1Json(raw: unknown): PoliciesV1;
35
- export declare function defaultPoliciesV1Path(): string;
36
- /** Effective path when `opts.policyPath` is omitted (env override matches `auditor doctor` / help). */
37
- export declare function resolvedPoliciesV1Path(opts?: {
38
- policyPath?: string;
39
- }): string;
40
- export declare function policiesV1MetaPathFor(policyFilePath: string): string;
41
- export declare function defaultPoliciesMetaPath(): string;
42
- export declare function readPoliciesV1Revision(opts?: {
43
- policyPath?: string;
44
- }): Promise<number | null>;
45
- export declare function loadPoliciesV1(opts?: {
46
- policyPath?: string;
47
- }): Promise<PoliciesV1>;
48
- export declare function classifyArgv(policy: PoliciesV1, argv: readonly string[]): {
49
- classification: Classification;
50
- flags: {
51
- metacharacters: boolean;
52
- dangerous_flags: boolean;
53
- };
54
- };
1
+ export type { Classification, PoliciesV1, Tier } from "./schema.js";
2
+ export { parsePoliciesV1Json } from "./schema.js";
3
+ export { defaultPoliciesMetaPath, defaultPoliciesV1Path, policiesV1MetaPathFor, resolvedPoliciesV1Path, } from "./paths.js";
4
+ export { loadPoliciesV1, readPoliciesV1Revision } from "./load.js";
5
+ export { classifyArgv } from "./classify.js";
55
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,UAAU;;;;EAA4C,CAAC;AACpE,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAE9C,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;iBAU3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,QAOzD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAO5D;AAuBD,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,uGAAuG;AACvG,wBAAgB,sBAAsB,CAAC,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAK7E;AAED,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAsB,sBAAsB,CAAC,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWnG;AA0BD,wBAAsB,cAAc,CAAC,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAUxF;AA0BD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB;IAAE,cAAc,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE;QAAE,cAAc,EAAE,OAAO,CAAC;QAAC,eAAe,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,CAoFlG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
@@ -1,214 +1,5 @@
1
- import { existsSync } from "node:fs";
2
- import { copyFile, mkdir, readFile, rename, writeFile } from "node:fs/promises";
3
- import { fileURLToPath } from "node:url";
4
- import os from "node:os";
5
- import path from "node:path";
6
- import { z } from "zod";
7
- export const TierSchema = z.enum(["READ", "MUTATE", "DESTRUCTIVE"]);
8
- export const PoliciesV1Schema = z.object({
9
- tiers: z.array(TierSchema).nonempty(),
10
- dangerous_flags: z.array(z.string()),
11
- policies: z.record(z.string(), z.record(z.string(), z.record(z.string(), TierSchema))),
12
- shell: z
13
- .object({
14
- prelude_verbs: z.array(z.string()).optional(),
15
- privilege_verbs: z.array(z.string()).optional(),
16
- })
17
- .optional(),
18
- });
19
- export function ensureTiersComplete(tiers) {
20
- const s = new Set(tiers);
21
- for (const required of ["READ", "MUTATE", "DESTRUCTIVE"]) {
22
- if (!s.has(required)) {
23
- throw new Error(`policies.v1.json tiers missing: ${required}`);
24
- }
25
- }
26
- }
27
- export function parsePoliciesV1Json(raw) {
28
- const parsed = PoliciesV1Schema.safeParse(raw);
29
- if (!parsed.success) {
30
- throw new Error(`Invalid policies: ${parsed.error.message}`);
31
- }
32
- ensureTiersComplete(parsed.data.tiers);
33
- return parsed.data;
34
- }
35
- function bundledPoliciesCandidates() {
36
- const here = path.dirname(fileURLToPath(import.meta.url));
37
- return [
38
- path.resolve(here, "../policies.v1.json"),
39
- path.resolve(here, "../../../auditor/policies.v1.json"),
40
- ];
41
- }
42
- function resolveBundledPoliciesPath() {
43
- for (const candidate of bundledPoliciesCandidates()) {
44
- if (existsSync(candidate))
45
- return candidate;
46
- }
47
- throw new Error(`No bundled policies.v1.json found. Tried:\n${bundledPoliciesCandidates().map((p) => ` - ${p}`).join("\n")}`);
48
- }
49
- function defaultPraxisDir() {
50
- return path.join(os.homedir(), ".praxis");
51
- }
52
- export function defaultPoliciesV1Path() {
53
- return path.join(defaultPraxisDir(), "policies.v1.json");
54
- }
55
- /** Effective path when `opts.policyPath` is omitted (env override matches `auditor doctor` / help). */
56
- export function resolvedPoliciesV1Path(opts) {
57
- if (opts?.policyPath?.trim())
58
- return opts.policyPath.trim();
59
- const fromEnv = process.env.PRAXIS_POLICIES_V1_PATH?.trim();
60
- if (fromEnv)
61
- return fromEnv;
62
- return defaultPoliciesV1Path();
63
- }
64
- export function policiesV1MetaPathFor(policyFilePath) {
65
- const dir = path.dirname(policyFilePath);
66
- const base = path.basename(policyFilePath, ".json");
67
- return path.join(dir, `${base}.meta.json`);
68
- }
69
- export function defaultPoliciesMetaPath() {
70
- return policiesV1MetaPathFor(defaultPoliciesV1Path());
71
- }
72
- export async function readPoliciesV1Revision(opts) {
73
- const policyPath = resolvedPoliciesV1Path(opts);
74
- const metaPath = policiesV1MetaPathFor(policyPath);
75
- try {
76
- const raw = await readFile(metaPath, "utf8");
77
- const parsed = JSON.parse(raw);
78
- const r = Number(parsed.revision);
79
- return Number.isFinite(r) ? r : null;
80
- }
81
- catch {
82
- return null;
83
- }
84
- }
85
- async function bootstrapPoliciesIfMissing(policyPath) {
86
- if (existsSync(policyPath))
87
- return;
88
- const bundledPath = resolveBundledPoliciesPath();
89
- const dir = path.dirname(policyPath);
90
- await mkdir(dir, { recursive: true });
91
- const tmpPolicy = `${policyPath}.tmp.${process.pid}`;
92
- await copyFile(bundledPath, tmpPolicy);
93
- await rename(tmpPolicy, policyPath);
94
- const metaPath = policiesV1MetaPathFor(policyPath);
95
- if (!existsSync(metaPath)) {
96
- const bootstrapMeta = {
97
- revision: 0,
98
- syncedAt: new Date().toISOString(),
99
- source: "bundled-bootstrap",
100
- };
101
- const tmpMeta = `${metaPath}.tmp.${process.pid}`;
102
- await writeFile(tmpMeta, `${JSON.stringify(bootstrapMeta, null, 2)}\n`, "utf8");
103
- await rename(tmpMeta, metaPath);
104
- }
105
- }
106
- export async function loadPoliciesV1(opts) {
107
- const policyPath = resolvedPoliciesV1Path(opts);
108
- await bootstrapPoliciesIfMissing(policyPath);
109
- const raw = await readFile(policyPath, "utf8");
110
- try {
111
- return parsePoliciesV1Json(JSON.parse(raw));
112
- }
113
- catch (e) {
114
- const msg = e instanceof Error ? e.message : String(e);
115
- throw new Error(`Invalid policies file at ${policyPath}: ${msg}`);
116
- }
117
- }
118
- function hasMetacharacters(argv) {
119
- const bad = [";", "&&", "||", "|", "`", "$(", ">", "<"];
120
- return argv.some((t) => bad.some((b) => t.includes(b)));
121
- }
122
- function hasDangerousFlags(argv, dangerousFlags) {
123
- const s = new Set(dangerousFlags);
124
- return argv.some((t) => s.has(t));
125
- }
126
- function tryMultiTokenVerb(verbsToTiers, rest, verbIndex, verb1) {
127
- if (!verb1)
128
- return verb1;
129
- const verb2 = rest[verbIndex + 1];
130
- if (!verb2)
131
- return verb1;
132
- const combined = `${verb1} ${verb2}`;
133
- if (verbsToTiers[combined])
134
- return combined;
135
- return verb1;
136
- }
137
- export function classifyArgv(policy, argv) {
138
- const tool = argv[0] ?? null;
139
- const metacharacters = hasMetacharacters(argv);
140
- const dangerous_flags = hasDangerousFlags(argv, policy.dangerous_flags);
141
- if (!tool || !policy.policies[tool]) {
142
- return {
143
- classification: { tool, command_path: null, verb: null, tier: "MUTATE", matched: false },
144
- flags: { metacharacters, dangerous_flags },
145
- };
146
- }
147
- const rest = argv.slice(1);
148
- const toolTable = policy.policies[tool];
149
- if (rest.length === 0) {
150
- const root = toolTable["__root__"];
151
- const tier = root?.["__default__"];
152
- if (tier) {
153
- return {
154
- classification: { tool, command_path: "__root__", verb: null, tier, matched: true },
155
- flags: { metacharacters, dangerous_flags },
156
- };
157
- }
158
- }
159
- if (rest.length > 0 && toolTable["__root__"]) {
160
- const root = toolTable["__root__"];
161
- const verb = rest[0] ?? null;
162
- let tier;
163
- if (verb) {
164
- tier = root[verb];
165
- if (tier === undefined)
166
- tier = root["*"];
167
- }
168
- else {
169
- tier = root["__default__"];
170
- }
171
- if (tier !== undefined) {
172
- return {
173
- classification: { tool, command_path: "__root__", verb, tier, matched: true },
174
- flags: { metacharacters, dangerous_flags },
175
- };
176
- }
177
- }
178
- const pathKeys = Object.keys(toolTable).sort((a, b) => b.split(" ").length - a.split(" ").length);
179
- for (const pathKey of pathKeys) {
180
- const k = pathKey.split(" ");
181
- const prefix = rest.slice(0, k.length);
182
- const matches = k.length > 0 && prefix.length === k.length && prefix.every((t, i) => t === k[i]);
183
- if (!matches)
184
- continue;
185
- const verbIndex = k.length;
186
- const verb1 = rest[verbIndex] ?? null;
187
- const verbsToTiers = toolTable[pathKey] ?? {};
188
- const verb = tryMultiTokenVerb(verbsToTiers, rest, verbIndex, verb1);
189
- let tier;
190
- if (verb) {
191
- tier = verbsToTiers[verb];
192
- if (tier === undefined)
193
- tier = verbsToTiers["*"];
194
- }
195
- else {
196
- tier = verbsToTiers["__default__"];
197
- }
198
- if (tier === undefined) {
199
- return {
200
- classification: { tool, command_path: pathKey, verb, tier: "MUTATE", matched: false },
201
- flags: { metacharacters, dangerous_flags },
202
- };
203
- }
204
- return {
205
- classification: { tool, command_path: pathKey, verb, tier, matched: true },
206
- flags: { metacharacters, dangerous_flags },
207
- };
208
- }
209
- return {
210
- classification: { tool, command_path: rest[0] ?? null, verb: rest[1] ?? null, tier: "MUTATE", matched: false },
211
- flags: { metacharacters, dangerous_flags },
212
- };
213
- }
1
+ export { parsePoliciesV1Json } from "./schema.js";
2
+ export { defaultPoliciesMetaPath, defaultPoliciesV1Path, policiesV1MetaPathFor, resolvedPoliciesV1Path, } from "./paths.js";
3
+ export { loadPoliciesV1, readPoliciesV1Revision } from "./load.js";
4
+ export { classifyArgv } from "./classify.js";
214
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAGpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;IACrC,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IACtF,KAAK,EAAE,CAAC;SACL,MAAM,CAAC;QACN,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC7C,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KAChD,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAYH,MAAM,UAAU,mBAAmB,CAAC,KAAsB;IACxD,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,KAAK,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAU,EAAE,CAAC;QAClE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,yBAAyB;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO;QACL,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,mCAAmC,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B;IACjC,KAAK,MAAM,SAAS,IAAI,yBAAyB,EAAE,EAAE,CAAC;QACpD,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9C,CAAC;IACD,MAAM,IAAI,KAAK,CACb,8CAA8C,yBAAyB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9G,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAC3D,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,sBAAsB,CAAC,IAA8B;IACnE,IAAI,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE,CAAC;IAC5D,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,OAAO,qBAAqB,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,cAAsB;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,qBAAqB,CAAC,qBAAqB,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAA8B;IACzE,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2B,CAAC;QACzD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,UAAkB;IAC1D,IAAI,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO;IAEnC,MAAM,WAAW,GAAG,0BAA0B,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,MAAM,SAAS,GAAG,GAAG,UAAU,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IACrD,MAAM,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACvC,MAAM,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAEpC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,aAAa,GAAG;YACpB,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAClC,MAAM,EAAE,mBAAmB;SAC5B,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,QAAQ,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;QACjD,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChF,MAAM,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAA8B;IACjE,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,0BAA0B,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,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,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,KAAK,GAAG,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAuB;IAChD,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAuB,EAAE,cAAiC;IACnF,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,iBAAiB,CACxB,YAAkC,EAClC,IAAuB,EACvB,SAAiB,EACjB,KAAoB;IAEpB,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,QAAQ,GAAG,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;IACrC,IAAI,YAAY,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,MAAkB,EAClB,IAAuB;IAEvB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC7B,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IAExE,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,cAAc,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;YACxF,KAAK,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE;SAC3C,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,SAAS,GAAyC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAG3E,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,aAAa,CAAC,CAAC;QACnC,IAAI,IAAI,EAAE,CAAC;YACT,OAAO;gBACL,cAAc,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;gBACnF,KAAK,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE;aAC3C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAC7B,IAAI,IAAsB,CAAC;QAC3B,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,IAAI,KAAK,SAAS;gBAAE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO;gBACL,cAAc,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;gBAC7E,KAAK,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE;aAC3C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAClG,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjG,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;QACtC,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,IAAK,EAA2B,CAAC;QACxE,MAAM,IAAI,GAAG,iBAAiB,CAAC,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAErE,IAAI,IAAsB,CAAC;QAC3B,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,IAAI,KAAK,SAAS;gBAAE,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO;gBACL,cAAc,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;gBACrF,KAAK,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE;aAC3C,CAAC;QACJ,CAAC;QAED,OAAO;YACL,cAAc,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;YAC1E,KAAK,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE;SAC3C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,cAAc,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAC9G,KAAK,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE;KAC3C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type PoliciesV1 } from "./schema.js";
2
+ export declare function readPoliciesV1Revision(opts?: {
3
+ policyPath?: string;
4
+ }): Promise<number | null>;
5
+ export declare function loadPoliciesV1(opts?: {
6
+ policyPath?: string;
7
+ }): Promise<PoliciesV1>;
8
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/policy/load.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAGnE,wBAAsB,sBAAsB,CAAC,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWnG;AA0BD,wBAAsB,cAAc,CAAC,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAUxF"}
@@ -0,0 +1,52 @@
1
+ import { existsSync } from "node:fs";
2
+ import { copyFile, mkdir, readFile, rename, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { parsePoliciesV1Json } from "./schema.js";
5
+ import { policiesV1MetaPathFor, resolveBundledPoliciesPath, resolvedPoliciesV1Path } from "./paths.js";
6
+ export async function readPoliciesV1Revision(opts) {
7
+ const policyPath = resolvedPoliciesV1Path(opts);
8
+ const metaPath = policiesV1MetaPathFor(policyPath);
9
+ try {
10
+ const raw = await readFile(metaPath, "utf8");
11
+ const parsed = JSON.parse(raw);
12
+ const r = Number(parsed.revision);
13
+ return Number.isFinite(r) ? r : null;
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ async function bootstrapPoliciesIfMissing(policyPath) {
20
+ if (existsSync(policyPath))
21
+ return;
22
+ const bundledPath = resolveBundledPoliciesPath();
23
+ const dir = path.dirname(policyPath);
24
+ await mkdir(dir, { recursive: true });
25
+ const tmpPolicy = `${policyPath}.tmp.${process.pid}`;
26
+ await copyFile(bundledPath, tmpPolicy);
27
+ await rename(tmpPolicy, policyPath);
28
+ const metaPath = policiesV1MetaPathFor(policyPath);
29
+ if (!existsSync(metaPath)) {
30
+ const bootstrapMeta = {
31
+ revision: 0,
32
+ syncedAt: new Date().toISOString(),
33
+ source: "bundled-bootstrap",
34
+ };
35
+ const tmpMeta = `${metaPath}.tmp.${process.pid}`;
36
+ await writeFile(tmpMeta, `${JSON.stringify(bootstrapMeta, null, 2)}\n`, "utf8");
37
+ await rename(tmpMeta, metaPath);
38
+ }
39
+ }
40
+ export async function loadPoliciesV1(opts) {
41
+ const policyPath = resolvedPoliciesV1Path(opts);
42
+ await bootstrapPoliciesIfMissing(policyPath);
43
+ const raw = await readFile(policyPath, "utf8");
44
+ try {
45
+ return parsePoliciesV1Json(JSON.parse(raw));
46
+ }
47
+ catch (e) {
48
+ const msg = e instanceof Error ? e.message : String(e);
49
+ throw new Error(`Invalid policies file at ${policyPath}: ${msg}`);
50
+ }
51
+ }
52
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/policy/load.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function resolveBundledPoliciesPath(): string;
2
+ export declare function defaultPoliciesV1Path(): string;
3
+ /** Effective path when `opts.policyPath` is omitted (env override matches `auditor doctor` / help). */
4
+ export declare function resolvedPoliciesV1Path(opts?: {
5
+ policyPath?: string;
6
+ }): string;
7
+ export declare function policiesV1MetaPathFor(policyFilePath: string): string;
8
+ export declare function defaultPoliciesMetaPath(): string;
9
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/policy/paths.ts"],"names":[],"mappings":"AAaA,wBAAgB,0BAA0B,IAAI,MAAM,CAOnD;AAMD,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,uGAAuG;AACvG,wBAAgB,sBAAsB,CAAC,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAK7E;AAED,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD"}
@@ -0,0 +1,42 @@
1
+ import { existsSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ function bundledPoliciesCandidates() {
6
+ const here = path.dirname(fileURLToPath(import.meta.url));
7
+ return [
8
+ path.resolve(here, "../policies.v1.json"),
9
+ path.resolve(here, "../../../auditor/policies.v1.json"),
10
+ ];
11
+ }
12
+ export function resolveBundledPoliciesPath() {
13
+ for (const candidate of bundledPoliciesCandidates()) {
14
+ if (existsSync(candidate))
15
+ return candidate;
16
+ }
17
+ throw new Error(`No bundled policies.v1.json found. Tried:\n${bundledPoliciesCandidates().map((p) => ` - ${p}`).join("\n")}`);
18
+ }
19
+ function defaultPraxisDir() {
20
+ return path.join(os.homedir(), ".praxis");
21
+ }
22
+ export function defaultPoliciesV1Path() {
23
+ return path.join(defaultPraxisDir(), "policies.v1.json");
24
+ }
25
+ /** Effective path when `opts.policyPath` is omitted (env override matches `auditor doctor` / help). */
26
+ export function resolvedPoliciesV1Path(opts) {
27
+ if (opts?.policyPath?.trim())
28
+ return opts.policyPath.trim();
29
+ const fromEnv = process.env.PRAXIS_POLICIES_V1_PATH?.trim();
30
+ if (fromEnv)
31
+ return fromEnv;
32
+ return defaultPoliciesV1Path();
33
+ }
34
+ export function policiesV1MetaPathFor(policyFilePath) {
35
+ const dir = path.dirname(policyFilePath);
36
+ const base = path.basename(policyFilePath, ".json");
37
+ return path.join(dir, `${base}.meta.json`);
38
+ }
39
+ export function defaultPoliciesMetaPath() {
40
+ return policiesV1MetaPathFor(defaultPoliciesV1Path());
41
+ }
42
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/policy/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,SAAS,yBAAyB;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO;QACL,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,mCAAmC,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,KAAK,MAAM,SAAS,IAAI,yBAAyB,EAAE,EAAE,CAAC;QACpD,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9C,CAAC;IACD,MAAM,IAAI,KAAK,CACb,8CAA8C,yBAAyB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9G,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAC3D,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,sBAAsB,CAAC,IAA8B;IACnE,IAAI,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE,CAAC;IAC5D,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,OAAO,qBAAqB,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,cAAsB;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,qBAAqB,CAAC,qBAAqB,EAAE,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { z } from "zod";
2
+ export declare const TierSchema: z.ZodEnum<{
3
+ READ: "READ";
4
+ MUTATE: "MUTATE";
5
+ DESTRUCTIVE: "DESTRUCTIVE";
6
+ }>;
7
+ export type Tier = z.infer<typeof TierSchema>;
8
+ export declare const PoliciesV1Schema: z.ZodObject<{
9
+ tiers: z.ZodArray<z.ZodEnum<{
10
+ READ: "READ";
11
+ MUTATE: "MUTATE";
12
+ DESTRUCTIVE: "DESTRUCTIVE";
13
+ }>>;
14
+ dangerous_flags: z.ZodArray<z.ZodString>;
15
+ policies: z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodEnum<{
16
+ READ: "READ";
17
+ MUTATE: "MUTATE";
18
+ DESTRUCTIVE: "DESTRUCTIVE";
19
+ }>>>>;
20
+ shell: z.ZodOptional<z.ZodObject<{
21
+ prelude_verbs: z.ZodOptional<z.ZodArray<z.ZodString>>;
22
+ privilege_verbs: z.ZodOptional<z.ZodArray<z.ZodString>>;
23
+ }, z.core.$strip>>;
24
+ }, z.core.$strip>;
25
+ export type PoliciesV1 = z.infer<typeof PoliciesV1Schema>;
26
+ export type Classification = {
27
+ tool: string | null;
28
+ command_path: string | null;
29
+ verb: string | null;
30
+ tier: Tier;
31
+ matched: boolean;
32
+ };
33
+ export declare function ensureTiersComplete(tiers: readonly Tier[]): void;
34
+ export declare function parsePoliciesV1Json(raw: unknown): PoliciesV1;
35
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/policy/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,UAAU;;;;EAA4C,CAAC;AACpE,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAE9C,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;iBAU3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,QAOzD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAO5D"}
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ export const TierSchema = z.enum(["READ", "MUTATE", "DESTRUCTIVE"]);
3
+ export const PoliciesV1Schema = z.object({
4
+ tiers: z.array(TierSchema).nonempty(),
5
+ dangerous_flags: z.array(z.string()),
6
+ policies: z.record(z.string(), z.record(z.string(), z.record(z.string(), TierSchema))),
7
+ shell: z
8
+ .object({
9
+ prelude_verbs: z.array(z.string()).optional(),
10
+ privilege_verbs: z.array(z.string()).optional(),
11
+ })
12
+ .optional(),
13
+ });
14
+ export function ensureTiersComplete(tiers) {
15
+ const s = new Set(tiers);
16
+ for (const required of ["READ", "MUTATE", "DESTRUCTIVE"]) {
17
+ if (!s.has(required)) {
18
+ throw new Error(`policies.v1.json tiers missing: ${required}`);
19
+ }
20
+ }
21
+ }
22
+ export function parsePoliciesV1Json(raw) {
23
+ const parsed = PoliciesV1Schema.safeParse(raw);
24
+ if (!parsed.success) {
25
+ throw new Error(`Invalid policies: ${parsed.error.message}`);
26
+ }
27
+ ensureTiersComplete(parsed.data.tiers);
28
+ return parsed.data;
29
+ }
30
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/policy/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAGpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;IACrC,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IACtF,KAAK,EAAE,CAAC;SACL,MAAM,CAAC;QACN,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC7C,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KAChD,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAYH,MAAM,UAAU,mBAAmB,CAAC,KAAsB;IACxD,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,KAAK,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAU,EAAE,CAAC;QAClE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxis.guard/auditor-cli",
3
- "version": "0.0.45",
3
+ "version": "0.0.46",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "MIT",