@orygn/opa-mcp 0.0.0 → 0.1.0
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/CHANGELOG.md +99 -0
- package/LICENSE +21 -0
- package/README.md +622 -2
- package/dist/config.d.ts +58 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +72 -0
- package/dist/config.js.map +1 -0
- package/dist/lib/errors.d.ts +18 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +25 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/logger.d.ts +10 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +57 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/opa-cli.d.ts +226 -0
- package/dist/lib/opa-cli.d.ts.map +1 -0
- package/dist/lib/opa-cli.js +283 -0
- package/dist/lib/opa-cli.js.map +1 -0
- package/dist/lib/opa-client.d.ts +47 -0
- package/dist/lib/opa-client.d.ts.map +1 -0
- package/dist/lib/opa-client.js +101 -0
- package/dist/lib/opa-client.js.map +1 -0
- package/dist/lib/output.d.ts +17 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +21 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/regal-cli.d.ts +65 -0
- package/dist/lib/regal-cli.d.ts.map +1 -0
- package/dist/lib/regal-cli.js +99 -0
- package/dist/lib/regal-cli.js.map +1 -0
- package/dist/lib/security.d.ts +16 -0
- package/dist/lib/security.d.ts.map +1 -0
- package/dist/lib/security.js +64 -0
- package/dist/lib/security.js.map +1 -0
- package/dist/lib/subprocess.d.ts +26 -0
- package/dist/lib/subprocess.d.ts.map +1 -0
- package/dist/lib/subprocess.js +72 -0
- package/dist/lib/subprocess.js.map +1 -0
- package/dist/lib/tool-helpers.d.ts +46 -0
- package/dist/lib/tool-helpers.d.ts.map +1 -0
- package/dist/lib/tool-helpers.js +73 -0
- package/dist/lib/tool-helpers.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +147 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/index.d.ts +12 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +107 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/patterns.d.ts +9 -0
- package/dist/resources/patterns.d.ts.map +1 -0
- package/dist/resources/patterns.js +375 -0
- package/dist/resources/patterns.js.map +1 -0
- package/dist/resources/style-guide.d.ts +6 -0
- package/dist/resources/style-guide.d.ts.map +1 -0
- package/dist/resources/style-guide.js +187 -0
- package/dist/resources/style-guide.js.map +1 -0
- package/dist/server.d.ts +22 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +82 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/authoring/capabilities.d.ts +11 -0
- package/dist/tools/authoring/capabilities.d.ts.map +1 -0
- package/dist/tools/authoring/capabilities.js +57 -0
- package/dist/tools/authoring/capabilities.js.map +1 -0
- package/dist/tools/authoring/check.d.ts +18 -0
- package/dist/tools/authoring/check.d.ts.map +1 -0
- package/dist/tools/authoring/check.js +71 -0
- package/dist/tools/authoring/check.js.map +1 -0
- package/dist/tools/authoring/deps.d.ts +8 -0
- package/dist/tools/authoring/deps.d.ts.map +1 -0
- package/dist/tools/authoring/deps.js +51 -0
- package/dist/tools/authoring/deps.js.map +1 -0
- package/dist/tools/authoring/format.d.ts +8 -0
- package/dist/tools/authoring/format.d.ts.map +1 -0
- package/dist/tools/authoring/format.js +44 -0
- package/dist/tools/authoring/format.js.map +1 -0
- package/dist/tools/authoring/index.d.ts +11 -0
- package/dist/tools/authoring/index.d.ts.map +1 -0
- package/dist/tools/authoring/index.js +17 -0
- package/dist/tools/authoring/index.js.map +1 -0
- package/dist/tools/authoring/inspect.d.ts +10 -0
- package/dist/tools/authoring/inspect.d.ts.map +1 -0
- package/dist/tools/authoring/inspect.js +47 -0
- package/dist/tools/authoring/inspect.js.map +1 -0
- package/dist/tools/authoring/lint.d.ts +18 -0
- package/dist/tools/authoring/lint.d.ts.map +1 -0
- package/dist/tools/authoring/lint.js +84 -0
- package/dist/tools/authoring/lint.js.map +1 -0
- package/dist/tools/authoring/parse.d.ts +7 -0
- package/dist/tools/authoring/parse.d.ts.map +1 -0
- package/dist/tools/authoring/parse.js +43 -0
- package/dist/tools/authoring/parse.js.map +1 -0
- package/dist/tools/bundles/build.d.ts +8 -0
- package/dist/tools/bundles/build.d.ts.map +1 -0
- package/dist/tools/bundles/build.js +87 -0
- package/dist/tools/bundles/build.js.map +1 -0
- package/dist/tools/bundles/index.d.ts +10 -0
- package/dist/tools/bundles/index.d.ts.map +1 -0
- package/dist/tools/bundles/index.js +7 -0
- package/dist/tools/bundles/index.js.map +1 -0
- package/dist/tools/bundles/sign.d.ts +8 -0
- package/dist/tools/bundles/sign.d.ts.map +1 -0
- package/dist/tools/bundles/sign.js +47 -0
- package/dist/tools/bundles/sign.js.map +1 -0
- package/dist/tools/evaluation/_shared.d.ts +55 -0
- package/dist/tools/evaluation/_shared.d.ts.map +1 -0
- package/dist/tools/evaluation/_shared.js +102 -0
- package/dist/tools/evaluation/_shared.js.map +1 -0
- package/dist/tools/evaluation/bench.d.ts +9 -0
- package/dist/tools/evaluation/bench.d.ts.map +1 -0
- package/dist/tools/evaluation/bench.js +76 -0
- package/dist/tools/evaluation/bench.js.map +1 -0
- package/dist/tools/evaluation/compile.d.ts +11 -0
- package/dist/tools/evaluation/compile.d.ts.map +1 -0
- package/dist/tools/evaluation/compile.js +19 -0
- package/dist/tools/evaluation/compile.js.map +1 -0
- package/dist/tools/evaluation/eval.d.ts +10 -0
- package/dist/tools/evaluation/eval.d.ts.map +1 -0
- package/dist/tools/evaluation/eval.js +35 -0
- package/dist/tools/evaluation/eval.js.map +1 -0
- package/dist/tools/evaluation/index.d.ts +11 -0
- package/dist/tools/evaluation/index.d.ts.map +1 -0
- package/dist/tools/evaluation/index.js +11 -0
- package/dist/tools/evaluation/index.js.map +1 -0
- package/dist/tools/evaluation/test.d.ts +28 -0
- package/dist/tools/evaluation/test.d.ts.map +1 -0
- package/dist/tools/evaluation/test.js +74 -0
- package/dist/tools/evaluation/test.js.map +1 -0
- package/dist/tools/helpers/describe-policy.d.ts +26 -0
- package/dist/tools/helpers/describe-policy.d.ts.map +1 -0
- package/dist/tools/helpers/describe-policy.js +76 -0
- package/dist/tools/helpers/describe-policy.js.map +1 -0
- package/dist/tools/helpers/explain-decision.d.ts +41 -0
- package/dist/tools/helpers/explain-decision.d.ts.map +1 -0
- package/dist/tools/helpers/explain-decision.js +75 -0
- package/dist/tools/helpers/explain-decision.js.map +1 -0
- package/dist/tools/helpers/generate-test-skeleton.d.ts +8 -0
- package/dist/tools/helpers/generate-test-skeleton.d.ts.map +1 -0
- package/dist/tools/helpers/generate-test-skeleton.js +93 -0
- package/dist/tools/helpers/generate-test-skeleton.js.map +1 -0
- package/dist/tools/helpers/index.d.ts +12 -0
- package/dist/tools/helpers/index.d.ts.map +1 -0
- package/dist/tools/helpers/index.js +11 -0
- package/dist/tools/helpers/index.js.map +1 -0
- package/dist/tools/helpers/suggest-fix.d.ts +15 -0
- package/dist/tools/helpers/suggest-fix.d.ts.map +1 -0
- package/dist/tools/helpers/suggest-fix.js +119 -0
- package/dist/tools/helpers/suggest-fix.js.map +1 -0
- package/dist/tools/index.d.ts +31 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +13 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/server-management/_shared.d.ts +9 -0
- package/dist/tools/server-management/_shared.d.ts.map +1 -0
- package/dist/tools/server-management/_shared.js +41 -0
- package/dist/tools/server-management/_shared.js.map +1 -0
- package/dist/tools/server-management/data.d.ts +4 -0
- package/dist/tools/server-management/data.d.ts.map +1 -0
- package/dist/tools/server-management/data.js +90 -0
- package/dist/tools/server-management/data.js.map +1 -0
- package/dist/tools/server-management/decisions.d.ts +4 -0
- package/dist/tools/server-management/decisions.d.ts.map +1 -0
- package/dist/tools/server-management/decisions.js +87 -0
- package/dist/tools/server-management/decisions.js.map +1 -0
- package/dist/tools/server-management/index.d.ts +11 -0
- package/dist/tools/server-management/index.d.ts.map +1 -0
- package/dist/tools/server-management/index.js +11 -0
- package/dist/tools/server-management/index.js.map +1 -0
- package/dist/tools/server-management/policies.d.ts +4 -0
- package/dist/tools/server-management/policies.d.ts.map +1 -0
- package/dist/tools/server-management/policies.js +94 -0
- package/dist/tools/server-management/policies.js.map +1 -0
- package/dist/tools/server-management/status.d.ts +4 -0
- package/dist/tools/server-management/status.d.ts.map +1 -0
- package/dist/tools/server-management/status.js +82 -0
- package/dist/tools/server-management/status.js.map +1 -0
- package/dist/types.d.ts +24 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +82 -4
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { registerRegoCapabilities } from './capabilities.js';
|
|
2
|
+
import { registerRegoCheck } from './check.js';
|
|
3
|
+
import { registerRegoDeps } from './deps.js';
|
|
4
|
+
import { registerRegoFormat } from './format.js';
|
|
5
|
+
import { registerRegoInspect } from './inspect.js';
|
|
6
|
+
import { registerRegoLint } from './lint.js';
|
|
7
|
+
import { registerRegoParseAst } from './parse.js';
|
|
8
|
+
export function registerAuthoringTools(server, config) {
|
|
9
|
+
registerRegoFormat(server, config);
|
|
10
|
+
registerRegoCheck(server, config);
|
|
11
|
+
registerRegoLint(server, config);
|
|
12
|
+
registerRegoParseAst(server, config);
|
|
13
|
+
registerRegoInspect(server, config);
|
|
14
|
+
registerRegoCapabilities(server, config);
|
|
15
|
+
registerRegoDeps(server, config);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/authoring/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAc;IACtE,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Config } from '../../config.js';
|
|
3
|
+
export interface RegoInspectOutput {
|
|
4
|
+
manifest?: unknown;
|
|
5
|
+
namespaces?: Record<string, unknown>;
|
|
6
|
+
annotations?: unknown;
|
|
7
|
+
signatures?: unknown;
|
|
8
|
+
}
|
|
9
|
+
export declare function registerRegoInspect(server: McpServer, config: Config): void;
|
|
10
|
+
//# sourceMappingURL=inspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../src/tools/authoring/inspect.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAiB9C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA0C3E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rego_inspect` — inspect a bundle, directory, or single Rego file
|
|
3
|
+
* via `opa inspect`. Returns the manifest (if present), namespaces,
|
|
4
|
+
* and rule annotations as JSON.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { OpaCli } from '../../lib/opa-cli.js';
|
|
8
|
+
import { err, ok } from '../../lib/errors.js';
|
|
9
|
+
import { mapSubprocessFailure, tryParseJson, validatePaths, withToolEnvelope, } from '../../lib/tool-helpers.js';
|
|
10
|
+
const RegoInspectInput = {
|
|
11
|
+
target: z
|
|
12
|
+
.string()
|
|
13
|
+
.min(1)
|
|
14
|
+
.describe('Path to a bundle archive (`*.tar.gz`), directory, or single Rego file.'),
|
|
15
|
+
};
|
|
16
|
+
export function registerRegoInspect(server, config) {
|
|
17
|
+
const opa = new OpaCli(config);
|
|
18
|
+
server.registerTool('rego_inspect', {
|
|
19
|
+
title: 'Inspect bundle or policy',
|
|
20
|
+
description: 'Inspect an OPA bundle, policy directory, or single Rego file with `opa inspect`. Returns manifest data, namespaces, rule annotations, and (if signed) signature metadata.',
|
|
21
|
+
inputSchema: RegoInspectInput,
|
|
22
|
+
}, async ({ target }) => {
|
|
23
|
+
return withToolEnvelope(config, async () => {
|
|
24
|
+
const validation = validatePaths([target], config, { mustExist: true });
|
|
25
|
+
if (!validation.ok)
|
|
26
|
+
return validation.error;
|
|
27
|
+
const [resolved] = validation.resolved;
|
|
28
|
+
const result = await opa.inspect({ target: resolved });
|
|
29
|
+
const subprocessFailure = mapSubprocessFailure(result, 'opa');
|
|
30
|
+
if (subprocessFailure)
|
|
31
|
+
return subprocessFailure;
|
|
32
|
+
if (result.exitCode !== 0) {
|
|
33
|
+
return err('INVALID_BUNDLE', 'opa inspect rejected the target — it is not a valid bundle, directory, or Rego file.', {
|
|
34
|
+
details: { stderr: result.stderr.trim(), stdout: result.stdout.trim() },
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const parsed = tryParseJson(result.stdout);
|
|
38
|
+
if (parsed === undefined) {
|
|
39
|
+
return err('UNKNOWN_ERROR', 'opa inspect produced no parseable JSON output.', {
|
|
40
|
+
details: { stdout: result.stdout.trim() },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return ok(parsed);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/tools/authoring/inspect.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,gBAAgB,GAAG;IACvB,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,wEAAwE,CAAC;CACtF,CAAC;AASF,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAc;IACnE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EACT,2KAA2K;QAC7K,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,OAAO,gBAAgB,CAAoB,MAAM,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,UAAU,CAAC,EAAE;gBAAE,OAAO,UAAU,CAAC,KAAK,CAAC;YAC5C,MAAM,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC;YAEvC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAS,EAAE,CAAC,CAAC;YAExD,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,iBAAiB;gBAAE,OAAO,iBAAiB,CAAC;YAEhD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,GAAG,CACR,gBAAgB,EAChB,sFAAsF,EACtF;oBACE,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;iBACxE,CACF,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,YAAY,CAAoB,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,GAAG,CAAC,eAAe,EAAE,gDAAgD,EAAE;oBAC5E,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;iBAC1C,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,CAAoB,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Config } from '../../config.js';
|
|
3
|
+
interface LintViolation {
|
|
4
|
+
title?: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
category?: string;
|
|
7
|
+
level?: string;
|
|
8
|
+
location?: unknown;
|
|
9
|
+
related_resources?: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface RegoLintOutput {
|
|
12
|
+
violations: LintViolation[];
|
|
13
|
+
notices?: unknown[];
|
|
14
|
+
summary?: unknown;
|
|
15
|
+
}
|
|
16
|
+
export declare function registerRegoLint(server: McpServer, config: Config): void;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=lint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../../src/tools/authoring/lint.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAoC9C,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA6DxE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rego_lint` — lint Rego with the optional `regal` binary.
|
|
3
|
+
*
|
|
4
|
+
* The only authoring tool that requires Regal. Returns
|
|
5
|
+
* `REGAL_NOT_FOUND` with an install hint if the binary is missing.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { RegalCli } from '../../lib/regal-cli.js';
|
|
9
|
+
import { err, ok } from '../../lib/errors.js';
|
|
10
|
+
import { mapSubprocessFailure, tryParseJson, validatePaths, withToolEnvelope, } from '../../lib/tool-helpers.js';
|
|
11
|
+
const RegoLintInput = {
|
|
12
|
+
source: z.string().optional().describe('Inline Rego source. Mutually exclusive with `paths`.'),
|
|
13
|
+
paths: z
|
|
14
|
+
.array(z.string())
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Filesystem paths to lint. Each path must be inside an allowed root (OPA_MCP_ALLOWED_PATHS).'),
|
|
17
|
+
configFile: z
|
|
18
|
+
.string()
|
|
19
|
+
.optional()
|
|
20
|
+
.describe('Path to a Regal config file (defaults to .regal/config.yaml lookup).'),
|
|
21
|
+
disable: z.array(z.string()).optional().describe('Disable specific named rules.'),
|
|
22
|
+
enable: z.array(z.string()).optional().describe('Enable specific named rules.'),
|
|
23
|
+
disableCategory: z
|
|
24
|
+
.array(z.string())
|
|
25
|
+
.optional()
|
|
26
|
+
.describe('Disable entire rule categories (e.g. style, idiomatic, bugs).'),
|
|
27
|
+
enableCategory: z.array(z.string()).optional().describe('Enable entire rule categories.'),
|
|
28
|
+
failLevel: z
|
|
29
|
+
.enum(['error', 'warning'])
|
|
30
|
+
.optional()
|
|
31
|
+
.describe('Severity at which Regal returns a non-zero exit. Default: `error`.'),
|
|
32
|
+
ignoreFiles: z.array(z.string()).optional().describe('Glob patterns to skip.'),
|
|
33
|
+
};
|
|
34
|
+
export function registerRegoLint(server, config) {
|
|
35
|
+
const regal = new RegalCli(config);
|
|
36
|
+
server.registerTool('rego_lint', {
|
|
37
|
+
title: 'Lint Rego',
|
|
38
|
+
description: 'Lint Rego source with the Regal linter. Returns categorized violations (style, bugs, idiomatic, performance) with file/line locations. Requires `regal` on PATH or `REGAL_BINARY` set; returns REGAL_NOT_FOUND otherwise. When called with inline `source` rather than `paths`, expect location-bound rules such as `directory-package-mismatch` to fire as artifacts of the randomized temp-file path. Prefer `paths` for canonical signal; for inline workflows, ignore or `disable` those rules.',
|
|
39
|
+
inputSchema: RegoLintInput,
|
|
40
|
+
}, async (input) => {
|
|
41
|
+
return withToolEnvelope(config, async () => {
|
|
42
|
+
const { source, paths } = input;
|
|
43
|
+
if (!source && !paths?.length) {
|
|
44
|
+
return err('INVALID_INPUT', 'rego_lint requires either `source` or at least one entry in `paths`.');
|
|
45
|
+
}
|
|
46
|
+
if (source && paths?.length) {
|
|
47
|
+
return err('INVALID_INPUT', 'rego_lint does not accept both `source` and `paths`.');
|
|
48
|
+
}
|
|
49
|
+
let resolvedPaths;
|
|
50
|
+
if (paths?.length) {
|
|
51
|
+
const validation = validatePaths(paths, config, { mustExist: true });
|
|
52
|
+
if (!validation.ok)
|
|
53
|
+
return validation.error;
|
|
54
|
+
resolvedPaths = validation.resolved;
|
|
55
|
+
}
|
|
56
|
+
const result = await regal.lint({
|
|
57
|
+
source,
|
|
58
|
+
paths: resolvedPaths,
|
|
59
|
+
configFile: input.configFile,
|
|
60
|
+
disable: input.disable,
|
|
61
|
+
enable: input.enable,
|
|
62
|
+
disableCategory: input.disableCategory,
|
|
63
|
+
enableCategory: input.enableCategory,
|
|
64
|
+
failLevel: input.failLevel,
|
|
65
|
+
ignoreFiles: input.ignoreFiles,
|
|
66
|
+
});
|
|
67
|
+
const subprocessFailure = mapSubprocessFailure(result, 'regal');
|
|
68
|
+
if (subprocessFailure)
|
|
69
|
+
return subprocessFailure;
|
|
70
|
+
const parsed = tryParseJson(result.stdout);
|
|
71
|
+
if (!parsed) {
|
|
72
|
+
return err('UNKNOWN_ERROR', 'regal lint produced no parseable JSON output.', {
|
|
73
|
+
details: { stderr: result.stderr.trim(), exitCode: result.exitCode },
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return ok({
|
|
77
|
+
violations: parsed.violations ?? [],
|
|
78
|
+
notices: parsed.notices,
|
|
79
|
+
summary: parsed.summary,
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../../src/tools/authoring/lint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Config } from '../../config.js';
|
|
3
|
+
export interface RegoParseAstOutput {
|
|
4
|
+
ast: unknown;
|
|
5
|
+
}
|
|
6
|
+
export declare function registerRegoParseAst(server: McpServer, config: Config): void;
|
|
7
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/tools/authoring/parse.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAS9C,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,OAAO,CAAC;CACd;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmC5E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rego_parse_ast` — parse Rego source to a JSON AST.
|
|
3
|
+
*
|
|
4
|
+
* Wraps `opa parse --format=json`. Useful for tools that want to walk
|
|
5
|
+
* the structure of a policy programmatically (rule discovery, ref
|
|
6
|
+
* extraction, etc.) without re-implementing the parser.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { OpaCli } from '../../lib/opa-cli.js';
|
|
10
|
+
import { err, ok } from '../../lib/errors.js';
|
|
11
|
+
import { mapSubprocessFailure, tryParseJson, withToolEnvelope } from '../../lib/tool-helpers.js';
|
|
12
|
+
const RegoParseAstInput = {
|
|
13
|
+
source: z.string().min(1).describe('Rego source code to parse.'),
|
|
14
|
+
};
|
|
15
|
+
export function registerRegoParseAst(server, config) {
|
|
16
|
+
const opa = new OpaCli(config);
|
|
17
|
+
server.registerTool('rego_parse_ast', {
|
|
18
|
+
title: 'Parse Rego to AST',
|
|
19
|
+
description: 'Parse Rego source to a JSON AST using `opa parse`. Returns the AST as a tree of nodes (package, imports, rules, expressions, terms). Use this when you need to introspect policy structure programmatically.',
|
|
20
|
+
inputSchema: RegoParseAstInput,
|
|
21
|
+
}, async ({ source }) => {
|
|
22
|
+
return withToolEnvelope(config, async () => {
|
|
23
|
+
const result = await opa.parse({ source });
|
|
24
|
+
const subprocessFailure = mapSubprocessFailure(result, 'opa');
|
|
25
|
+
if (subprocessFailure)
|
|
26
|
+
return subprocessFailure;
|
|
27
|
+
if (result.exitCode !== 0) {
|
|
28
|
+
const parsed = tryParseJson(result.stdout);
|
|
29
|
+
return err('INVALID_REGO', 'opa parse rejected the source.', {
|
|
30
|
+
details: parsed ?? { stderr: result.stderr.trim() },
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const ast = tryParseJson(result.stdout);
|
|
34
|
+
if (ast === undefined) {
|
|
35
|
+
return err('UNKNOWN_ERROR', 'opa parse produced no parseable JSON on stdout.', {
|
|
36
|
+
details: { stdout: result.stdout.trim() },
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return ok({ ast });
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/tools/authoring/parse.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEjG,MAAM,iBAAiB,GAAG;IACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;CACjE,CAAC;AAMF,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAc;IACpE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,8MAA8M;QAChN,WAAW,EAAE,iBAAiB;KAC/B,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,OAAO,gBAAgB,CAAqB,MAAM,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAE3C,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,iBAAiB;gBAAE,OAAO,iBAAiB,CAAC;YAEhD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,YAAY,CAAyB,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnE,OAAO,GAAG,CAAC,cAAc,EAAE,gCAAgC,EAAE;oBAC3D,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;iBACpD,CAAC,CAAC;YACL,CAAC;YAED,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,OAAO,GAAG,CAAC,eAAe,EAAE,iDAAiD,EAAE;oBAC7E,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;iBAC1C,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,CAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Config } from '../../config.js';
|
|
3
|
+
export interface OpaBundleBuildOutput {
|
|
4
|
+
output: string;
|
|
5
|
+
bytes: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function registerOpaBundleBuild(server: McpServer, config: Config): void;
|
|
8
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/tools/bundles/build.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAiC9C,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA2D9E"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `opa_bundle_build` — build a deployable bundle from policy + data
|
|
3
|
+
* paths via `opa build`.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { OpaCli } from '../../lib/opa-cli.js';
|
|
7
|
+
import { err, ok } from '../../lib/errors.js';
|
|
8
|
+
import { mapSubprocessFailure, validatePaths, withToolEnvelope } from '../../lib/tool-helpers.js';
|
|
9
|
+
const OpaBundleBuildInput = {
|
|
10
|
+
paths: z
|
|
11
|
+
.array(z.string())
|
|
12
|
+
.min(1)
|
|
13
|
+
.describe('Policy / data paths to include. Each must be in an allowed root.'),
|
|
14
|
+
output: z
|
|
15
|
+
.string()
|
|
16
|
+
.min(1)
|
|
17
|
+
.describe('Output bundle path (typically `*.tar.gz`). Must be in an allowed root.'),
|
|
18
|
+
optimize: z
|
|
19
|
+
.union([z.literal(0), z.literal(1), z.literal(2)])
|
|
20
|
+
.optional()
|
|
21
|
+
.describe('Optimization level (0 = none, 2 = aggressive).'),
|
|
22
|
+
revision: z.string().optional().describe('Bundle revision string written to the manifest.'),
|
|
23
|
+
target: z
|
|
24
|
+
.enum(['rego', 'wasm'])
|
|
25
|
+
.optional()
|
|
26
|
+
.describe('Build target (default `rego`; `wasm` compiles to WebAssembly).'),
|
|
27
|
+
entrypoints: z
|
|
28
|
+
.array(z.string())
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('Entrypoint refs (required when `target=wasm` or `optimize > 0`).'),
|
|
31
|
+
signingKey: z.string().optional().describe('Path to a signing key for inline signing.'),
|
|
32
|
+
signingAlg: z.string().optional().describe('Signing algorithm (e.g. RS256).'),
|
|
33
|
+
claimsFile: z.string().optional().describe('Path to a claims file for inline signing.'),
|
|
34
|
+
capabilities: z.string().optional().describe('Path to a capabilities JSON file.'),
|
|
35
|
+
};
|
|
36
|
+
export function registerOpaBundleBuild(server, config) {
|
|
37
|
+
const opa = new OpaCli(config);
|
|
38
|
+
server.registerTool('opa_bundle_build', {
|
|
39
|
+
title: 'Build OPA bundle',
|
|
40
|
+
description: 'Build a deployable bundle from policy / data paths using `opa build`. Output is a `.tar.gz` archive with optional inline signing. Supports optimization, custom revision strings, and the WASM target.',
|
|
41
|
+
inputSchema: OpaBundleBuildInput,
|
|
42
|
+
}, async (input) => {
|
|
43
|
+
return withToolEnvelope(config, async () => {
|
|
44
|
+
const inputPaths = [...input.paths, input.output];
|
|
45
|
+
const validation = validatePaths(inputPaths, config);
|
|
46
|
+
if (!validation.ok)
|
|
47
|
+
return validation.error;
|
|
48
|
+
const sourcePaths = validation.resolved.slice(0, input.paths.length);
|
|
49
|
+
const outputPath = validation.resolved[input.paths.length];
|
|
50
|
+
// Validate auxiliary files separately (they may live elsewhere).
|
|
51
|
+
for (const auxPath of [input.signingKey, input.claimsFile, input.capabilities]) {
|
|
52
|
+
if (auxPath) {
|
|
53
|
+
const auxValidation = validatePaths([auxPath], config, { mustExist: true });
|
|
54
|
+
if (!auxValidation.ok)
|
|
55
|
+
return auxValidation.error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const result = await opa.build({
|
|
59
|
+
paths: sourcePaths,
|
|
60
|
+
output: outputPath,
|
|
61
|
+
optimize: input.optimize,
|
|
62
|
+
revision: input.revision,
|
|
63
|
+
target: input.target,
|
|
64
|
+
entrypoints: input.entrypoints,
|
|
65
|
+
signingKey: input.signingKey,
|
|
66
|
+
signingAlg: input.signingAlg,
|
|
67
|
+
claimsFile: input.claimsFile,
|
|
68
|
+
capabilities: input.capabilities,
|
|
69
|
+
});
|
|
70
|
+
const subprocessFailure = mapSubprocessFailure(result, 'opa');
|
|
71
|
+
if (subprocessFailure)
|
|
72
|
+
return subprocessFailure;
|
|
73
|
+
if (result.exitCode !== 0) {
|
|
74
|
+
return err('INVALID_REGO', 'opa build failed.', {
|
|
75
|
+
details: { stderr: result.stderr.trim(), stdout: result.stdout.trim() },
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const { stat } = await import('node:fs/promises');
|
|
79
|
+
const fileStat = await stat(outputPath);
|
|
80
|
+
return ok({
|
|
81
|
+
output: outputPath,
|
|
82
|
+
bytes: fileStat.size,
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/tools/bundles/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Category C — Bundle operations.
|
|
3
|
+
*
|
|
4
|
+
* Wraps `opa build` and `opa sign` for packaging and signing
|
|
5
|
+
* deployable bundles.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import type { Config } from '../../config.js';
|
|
9
|
+
export declare function registerBundleTools(server: McpServer, config: Config): void;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/bundles/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAI9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAG3E"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { registerOpaBundleBuild } from './build.js';
|
|
2
|
+
import { registerOpaBundleSign } from './sign.js';
|
|
3
|
+
export function registerBundleTools(server, config) {
|
|
4
|
+
registerOpaBundleBuild(server, config);
|
|
5
|
+
registerOpaBundleSign(server, config);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/bundles/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAc;IACnE,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Config } from '../../config.js';
|
|
3
|
+
export interface OpaBundleSignOutput {
|
|
4
|
+
signed: boolean;
|
|
5
|
+
signaturesPath?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function registerOpaBundleSign(server: McpServer, config: Config): void;
|
|
8
|
+
//# sourceMappingURL=sign.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../../src/tools/bundles/sign.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAe9C,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAuC7E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `opa_bundle_sign` — sign an existing bundle directory or archive
|
|
3
|
+
* via `opa sign`.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { OpaCli } from '../../lib/opa-cli.js';
|
|
7
|
+
import { err, ok } from '../../lib/errors.js';
|
|
8
|
+
import { mapSubprocessFailure, validatePaths, withToolEnvelope } from '../../lib/tool-helpers.js';
|
|
9
|
+
const OpaBundleSignInput = {
|
|
10
|
+
bundle: z
|
|
11
|
+
.string()
|
|
12
|
+
.min(1)
|
|
13
|
+
.describe('Path to a bundle directory or archive. Must be in an allowed root.'),
|
|
14
|
+
signingKey: z.string().min(1).describe('Path to the signing key.'),
|
|
15
|
+
signingAlg: z.string().optional().describe('Signing algorithm (e.g. RS256). Default: RS256.'),
|
|
16
|
+
claimsFile: z.string().optional().describe('Path to extra claims to include in the signature.'),
|
|
17
|
+
};
|
|
18
|
+
export function registerOpaBundleSign(server, config) {
|
|
19
|
+
const opa = new OpaCli(config);
|
|
20
|
+
server.registerTool('opa_bundle_sign', {
|
|
21
|
+
title: 'Sign OPA bundle',
|
|
22
|
+
description: 'Sign an OPA bundle with a private key using `opa sign`. Writes a `.signatures.json` next to the bundle directory, or updates the archive in place.',
|
|
23
|
+
inputSchema: OpaBundleSignInput,
|
|
24
|
+
}, async (input) => {
|
|
25
|
+
return withToolEnvelope(config, async () => {
|
|
26
|
+
const validation = validatePaths([input.bundle, input.signingKey, ...(input.claimsFile ? [input.claimsFile] : [])], config, { mustExist: true });
|
|
27
|
+
if (!validation.ok)
|
|
28
|
+
return validation.error;
|
|
29
|
+
const result = await opa.sign({
|
|
30
|
+
bundle: validation.resolved[0],
|
|
31
|
+
signingKey: validation.resolved[1],
|
|
32
|
+
signingAlg: input.signingAlg,
|
|
33
|
+
claimsFile: input.claimsFile ? validation.resolved[2] : undefined,
|
|
34
|
+
});
|
|
35
|
+
const subprocessFailure = mapSubprocessFailure(result, 'opa');
|
|
36
|
+
if (subprocessFailure)
|
|
37
|
+
return subprocessFailure;
|
|
38
|
+
if (result.exitCode !== 0) {
|
|
39
|
+
return err('INVALID_BUNDLE', 'opa sign failed.', {
|
|
40
|
+
details: { stderr: result.stderr.trim() },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return ok({ signed: true });
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=sign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.js","sourceRoot":"","sources":["../../../src/tools/bundles/sign.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElG,MAAM,kBAAkB,GAAG;IACzB,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,oEAAoE,CAAC;IACjF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAClE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;IAC7F,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;CAChG,CAAC;AAOF,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAc;IACrE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,oJAAoJ;QACtJ,WAAW,EAAE,kBAAkB;KAChC,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,OAAO,gBAAgB,CAAsB,MAAM,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,UAAU,GAAG,aAAa,CAC9B,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EACjF,MAAM,EACN,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,EAAE;gBAAE,OAAO,UAAU,CAAC,KAAK,CAAC;YAE5C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC;gBAC5B,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAE;gBAC/B,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAE;gBACnC,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;aAClE,CAAC,CAAC;YAEH,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,iBAAiB;gBAAE,OAAO,iBAAiB,CAAC;YAEhD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,EAAE;oBAC/C,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;iBAC1C,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,CAAsB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for the evaluation tool category.
|
|
3
|
+
*
|
|
4
|
+
* `rego_eval` and its three trace/profile/coverage variants all share
|
|
5
|
+
* the same input/output shape and error handling — only the OPA flags
|
|
6
|
+
* differ. The shared `runEval` helper takes the resolved EvalInput and
|
|
7
|
+
* returns an envelope; each tool's handler is a thin adapter that
|
|
8
|
+
* preps inputs and forwards.
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import type { Config } from '../../config.js';
|
|
12
|
+
import type { OpaCli } from '../../lib/opa-cli.js';
|
|
13
|
+
import type { ToolEnvelope } from '../../types.js';
|
|
14
|
+
/** Common input fields shared across rego_eval and its variants. */
|
|
15
|
+
export declare const SharedEvalInput: {
|
|
16
|
+
query: z.ZodString;
|
|
17
|
+
source: z.ZodOptional<z.ZodString>;
|
|
18
|
+
paths: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
19
|
+
input: z.ZodOptional<z.ZodUnknown>;
|
|
20
|
+
inputPath: z.ZodOptional<z.ZodString>;
|
|
21
|
+
unknowns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
22
|
+
partial: z.ZodOptional<z.ZodBoolean>;
|
|
23
|
+
strictBuiltinErrors: z.ZodOptional<z.ZodBoolean>;
|
|
24
|
+
};
|
|
25
|
+
export interface RegoEvalOutput {
|
|
26
|
+
result?: unknown[];
|
|
27
|
+
errors?: unknown[];
|
|
28
|
+
metrics?: Record<string, unknown>;
|
|
29
|
+
explanation?: unknown[];
|
|
30
|
+
profile?: unknown[];
|
|
31
|
+
coverage?: unknown;
|
|
32
|
+
}
|
|
33
|
+
interface EvalArgs {
|
|
34
|
+
query: string;
|
|
35
|
+
source?: string;
|
|
36
|
+
paths?: string[];
|
|
37
|
+
input?: unknown;
|
|
38
|
+
inputPath?: string;
|
|
39
|
+
unknowns?: string[];
|
|
40
|
+
partial?: boolean;
|
|
41
|
+
strictBuiltinErrors?: boolean;
|
|
42
|
+
}
|
|
43
|
+
interface EvalFlags {
|
|
44
|
+
explain?: 'full' | 'notes' | 'fails' | 'debug';
|
|
45
|
+
profile?: boolean;
|
|
46
|
+
coverage?: boolean;
|
|
47
|
+
metrics?: boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Validate inputs (paths, input/inputPath conflict), call `opa eval`,
|
|
51
|
+
* and return the structured envelope.
|
|
52
|
+
*/
|
|
53
|
+
export declare function runEval(opa: OpaCli, config: Config, args: EvalArgs, flags: EvalFlags): Promise<ToolEnvelope<RegoEvalOutput>>;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=_shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/tools/evaluation/_shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,oEAAoE;AACpE,eAAO,MAAM,eAAe;;;;;;;;;CAwB3B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,UAAU,SAAS;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CA2DvC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for the evaluation tool category.
|
|
3
|
+
*
|
|
4
|
+
* `rego_eval` and its three trace/profile/coverage variants all share
|
|
5
|
+
* the same input/output shape and error handling — only the OPA flags
|
|
6
|
+
* differ. The shared `runEval` helper takes the resolved EvalInput and
|
|
7
|
+
* returns an envelope; each tool's handler is a thin adapter that
|
|
8
|
+
* preps inputs and forwards.
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import { err, ok } from '../../lib/errors.js';
|
|
12
|
+
import { mapSubprocessFailure, tryParseJson, validatePaths } from '../../lib/tool-helpers.js';
|
|
13
|
+
/** Common input fields shared across rego_eval and its variants. */
|
|
14
|
+
export const SharedEvalInput = {
|
|
15
|
+
query: z.string().min(1).describe('Rego query to evaluate, e.g. "data.example.allow".'),
|
|
16
|
+
source: z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Inline Rego policy source. Mutually exclusive with `paths`.'),
|
|
20
|
+
paths: z
|
|
21
|
+
.array(z.string())
|
|
22
|
+
.optional()
|
|
23
|
+
.describe('Policy / data file or directory paths. Each must be inside an allowed root.'),
|
|
24
|
+
input: z.unknown().optional().describe('Inline input document.'),
|
|
25
|
+
inputPath: z
|
|
26
|
+
.string()
|
|
27
|
+
.optional()
|
|
28
|
+
.describe('Path to a JSON input file. Mutually exclusive with `input`.'),
|
|
29
|
+
unknowns: z
|
|
30
|
+
.array(z.string())
|
|
31
|
+
.optional()
|
|
32
|
+
.describe('Refs to treat as unknown during partial evaluation.'),
|
|
33
|
+
partial: z.boolean().optional().describe('Run partial evaluation rather than full evaluation.'),
|
|
34
|
+
strictBuiltinErrors: z
|
|
35
|
+
.boolean()
|
|
36
|
+
.optional()
|
|
37
|
+
.describe('Treat builtin errors as fatal instead of returning undefined.'),
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Validate inputs (paths, input/inputPath conflict), call `opa eval`,
|
|
41
|
+
* and return the structured envelope.
|
|
42
|
+
*/
|
|
43
|
+
export async function runEval(opa, config, args, flags) {
|
|
44
|
+
if (!args.source && !args.paths?.length) {
|
|
45
|
+
return err('INVALID_INPUT', 'rego_eval requires either `source` or at least one entry in `paths`.');
|
|
46
|
+
}
|
|
47
|
+
if (args.input !== undefined && args.inputPath) {
|
|
48
|
+
return err('INVALID_INPUT', 'rego_eval accepts either `input` or `inputPath`, not both.');
|
|
49
|
+
}
|
|
50
|
+
const evalInput = { query: args.query };
|
|
51
|
+
if (args.source !== undefined)
|
|
52
|
+
evalInput.source = args.source;
|
|
53
|
+
if (args.paths?.length) {
|
|
54
|
+
const validation = validatePaths(args.paths, config, { mustExist: true });
|
|
55
|
+
if (!validation.ok)
|
|
56
|
+
return validation.error;
|
|
57
|
+
evalInput.paths = validation.resolved;
|
|
58
|
+
}
|
|
59
|
+
if (args.input !== undefined) {
|
|
60
|
+
evalInput.input = args.input;
|
|
61
|
+
}
|
|
62
|
+
else if (args.inputPath) {
|
|
63
|
+
const inputPathValidation = validatePaths([args.inputPath], config, { mustExist: true });
|
|
64
|
+
if (!inputPathValidation.ok)
|
|
65
|
+
return inputPathValidation.error;
|
|
66
|
+
evalInput.inputPath = inputPathValidation.resolved[0];
|
|
67
|
+
}
|
|
68
|
+
if (args.partial)
|
|
69
|
+
evalInput.partial = true;
|
|
70
|
+
if (args.unknowns?.length)
|
|
71
|
+
evalInput.unknowns = args.unknowns;
|
|
72
|
+
if (args.strictBuiltinErrors)
|
|
73
|
+
evalInput.strictBuiltinErrors = true;
|
|
74
|
+
if (flags.explain)
|
|
75
|
+
evalInput.explain = flags.explain;
|
|
76
|
+
if (flags.profile)
|
|
77
|
+
evalInput.profile = true;
|
|
78
|
+
if (flags.coverage)
|
|
79
|
+
evalInput.coverage = true;
|
|
80
|
+
if (flags.metrics)
|
|
81
|
+
evalInput.metrics = true;
|
|
82
|
+
const result = await opa.eval(evalInput);
|
|
83
|
+
const subprocessFailure = mapSubprocessFailure(result, 'opa');
|
|
84
|
+
if (subprocessFailure)
|
|
85
|
+
return subprocessFailure;
|
|
86
|
+
// `opa eval` returns exit code 0 even when the query produces no
|
|
87
|
+
// results or partial results. A non-zero exit means a hard error
|
|
88
|
+
// (parse, type, runtime). Output JSON is on stdout.
|
|
89
|
+
const parsed = tryParseJson(result.stdout);
|
|
90
|
+
if (result.exitCode !== 0) {
|
|
91
|
+
return err('EVAL_ERROR', 'opa eval exited with an error.', {
|
|
92
|
+
details: parsed ?? { stderr: result.stderr.trim(), stdout: result.stdout.trim() },
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
if (parsed === undefined) {
|
|
96
|
+
return err('UNKNOWN_ERROR', 'opa eval produced no parseable JSON output.', {
|
|
97
|
+
details: { stdout: result.stdout.trim() },
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return ok(parsed);
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=_shared.js.map
|