@orygn/opa-mcp 0.1.13 → 0.1.15

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 (42) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +3 -2
  3. package/dist/constants.d.ts +1 -1
  4. package/dist/constants.js +1 -1
  5. package/dist/lib/opa-cli.d.ts +9 -0
  6. package/dist/lib/opa-cli.d.ts.map +1 -1
  7. package/dist/lib/opa-cli.js +9 -1
  8. package/dist/lib/opa-cli.js.map +1 -1
  9. package/dist/lib/rego-ast-walker.d.ts.map +1 -1
  10. package/dist/lib/rego-ast-walker.js +15 -0
  11. package/dist/lib/rego-ast-walker.js.map +1 -1
  12. package/dist/server.js +1 -1
  13. package/dist/server.js.map +1 -1
  14. package/dist/tools/authoring/format.d.ts.map +1 -1
  15. package/dist/tools/authoring/format.js +55 -5
  16. package/dist/tools/authoring/format.js.map +1 -1
  17. package/dist/tools/evaluation/index.d.ts.map +1 -1
  18. package/dist/tools/evaluation/index.js +2 -0
  19. package/dist/tools/evaluation/index.js.map +1 -1
  20. package/dist/tools/evaluation/test-multiroot.d.ts +37 -0
  21. package/dist/tools/evaluation/test-multiroot.d.ts.map +1 -0
  22. package/dist/tools/evaluation/test-multiroot.js +454 -0
  23. package/dist/tools/evaluation/test-multiroot.js.map +1 -0
  24. package/dist/tools/evaluation/test.d.ts +1 -1
  25. package/dist/tools/evaluation/test.d.ts.map +1 -1
  26. package/dist/tools/helpers/explain-undefined.d.ts +50 -0
  27. package/dist/tools/helpers/explain-undefined.d.ts.map +1 -0
  28. package/dist/tools/helpers/explain-undefined.js +380 -0
  29. package/dist/tools/helpers/explain-undefined.js.map +1 -0
  30. package/dist/tools/helpers/index.d.ts.map +1 -1
  31. package/dist/tools/helpers/index.js +4 -0
  32. package/dist/tools/helpers/index.js.map +1 -1
  33. package/dist/tools/helpers/playground-share.d.ts +25 -0
  34. package/dist/tools/helpers/playground-share.d.ts.map +1 -0
  35. package/dist/tools/helpers/playground-share.js +117 -0
  36. package/dist/tools/helpers/playground-share.js.map +1 -0
  37. package/dist/tools/index.d.ts +6 -3
  38. package/dist/tools/index.d.ts.map +1 -1
  39. package/dist/tools/index.js.map +1 -1
  40. package/dist/types.d.ts +1 -1
  41. package/dist/types.d.ts.map +1 -1
  42. package/package.json +1 -1
@@ -0,0 +1,380 @@
1
+ /**
2
+ * `rego_explain_undefined` -- determine why a Rego query produces no
3
+ * value by combining a plain eval, a full-trace eval, and per-condition
4
+ * AST analysis.
5
+ *
6
+ * Three information sources are fused:
7
+ * 1. Plain `opa eval` -- determines whether the result is defined at all.
8
+ * 2. `opa eval --explain=full` -- captures which rule bodies OPA entered
9
+ * and which expressions failed at runtime.
10
+ * 3. `opa parse --json-include locations,-comments` -- supplies
11
+ * base64-encoded expression text and row numbers for conditions that
12
+ * OPA's indexer eliminated before entering the rule body (the most
13
+ * common case for equality checks on `input.*`).
14
+ *
15
+ * For rules that appear in the trace (OPA entered them), the blocking
16
+ * condition is identified by matching Fail-event rows against body-
17
+ * expression rows from the AST. For rules that do not appear in the trace
18
+ * (indexed out), each body expression is evaluated as a standalone query
19
+ * to determine which one is not satisfied.
20
+ */
21
+ import { readFile } from 'node:fs/promises';
22
+ import { z } from 'zod';
23
+ import { err, ok } from '../../lib/errors.js';
24
+ import { OpaCli } from '../../lib/opa-cli.js';
25
+ import { mapSubprocessFailure, sanitizeInlinePath, tryParseJson, validatePaths, withToolEnvelope, } from '../../lib/tool-helpers.js';
26
+ // ─── Input schema ───────────────────────────────────────────────────────────
27
+ const RegoExplainUndefinedInput = {
28
+ query: z
29
+ .string()
30
+ .min(1)
31
+ .describe('Fully-qualified rule reference to explain, e.g. "data.authz.allow". ' +
32
+ 'Must match the path you would pass to rego_eval.'),
33
+ source: z
34
+ .string()
35
+ .optional()
36
+ .describe('Inline Rego source to analyse. Mutually exclusive with paths.'),
37
+ paths: z
38
+ .array(z.string())
39
+ .optional()
40
+ .describe('Policy .rego file paths to load. Mutually exclusive with source.'),
41
+ input: z.unknown().optional().describe('Input document (JSON value) for the query.'),
42
+ inputPath: z.string().optional().describe('Path to an input JSON file.'),
43
+ };
44
+ // ─── Pure helpers ────────────────────────────────────────────────────────────
45
+ function decodeBase64Text(b64) {
46
+ if (!b64)
47
+ return undefined;
48
+ try {
49
+ return Buffer.from(b64, 'base64').toString('utf8');
50
+ }
51
+ catch {
52
+ return undefined;
53
+ }
54
+ }
55
+ function extractPackagePath(ast) {
56
+ return (ast.package?.path ?? []).map((p) => String(p.value ?? '')).join('.');
57
+ }
58
+ function extractRuleHeadName(head) {
59
+ if (!head)
60
+ return undefined;
61
+ if (head.name)
62
+ return head.name;
63
+ if (Array.isArray(head.ref) && head.ref.length > 0) {
64
+ const v = head.ref[0].value;
65
+ return typeof v === 'string' ? v : '';
66
+ }
67
+ return undefined;
68
+ }
69
+ function queryToPackageAndRule(query) {
70
+ const parts = query.split('.');
71
+ if (parts.length < 2)
72
+ return null;
73
+ return {
74
+ ruleName: parts[parts.length - 1],
75
+ packagePath: parts.slice(0, -1).join('.'),
76
+ };
77
+ }
78
+ function ruleAppearsInTrace(ruleName, ruleRow, trace) {
79
+ return trace.some((ev) => {
80
+ if (ev.Op?.toLowerCase() !== 'enter')
81
+ return false;
82
+ if (!ev.Node)
83
+ return false;
84
+ if (extractRuleHeadName(ev.Node.head) !== ruleName)
85
+ return false;
86
+ // When we have source row information, use it to disambiguate incremental rules.
87
+ if (ruleRow !== undefined && ev.Node.location?.row !== undefined) {
88
+ return ev.Node.location.row === ruleRow;
89
+ }
90
+ return true;
91
+ });
92
+ }
93
+ function findBlockingRowFromTrace(rule, trace) {
94
+ const ruleName = extractRuleHeadName(rule.head);
95
+ const ruleRow = rule.location?.row;
96
+ const bodyRows = new Set((rule.body ?? []).map((e) => e.location?.row).filter((r) => r !== undefined));
97
+ if (bodyRows.size === 0)
98
+ return undefined;
99
+ // Locate the Enter event for this specific rule definition.
100
+ const enterIdx = trace.findIndex((ev) => {
101
+ if (ev.Op?.toLowerCase() !== 'enter')
102
+ return false;
103
+ if (extractRuleHeadName(ev.Node?.head) !== ruleName)
104
+ return false;
105
+ if (ruleRow !== undefined && ev.Node?.location?.row !== undefined) {
106
+ return ev.Node.location.row === ruleRow;
107
+ }
108
+ return true;
109
+ });
110
+ if (enterIdx < 0)
111
+ return undefined;
112
+ // Find the first Fail event after the Enter that falls on a body expression row.
113
+ for (let i = enterIdx + 1; i < trace.length; i++) {
114
+ const ev = trace[i];
115
+ // Stop when we enter or exit the same-named rule at a different row (sibling).
116
+ if ((ev.Op?.toLowerCase() === 'enter' || ev.Op?.toLowerCase() === 'exit') &&
117
+ extractRuleHeadName(ev.Node?.head) === ruleName &&
118
+ ruleRow !== undefined &&
119
+ ev.Node?.location?.row !== ruleRow) {
120
+ break;
121
+ }
122
+ if (ev.Op?.toLowerCase() === 'fail' && ev.Location?.row !== undefined) {
123
+ if (bodyRows.has(ev.Location.row))
124
+ return ev.Location.row;
125
+ }
126
+ }
127
+ return undefined;
128
+ }
129
+ async function evalConditionStandalone(exprText, evalBase, opa, signal) {
130
+ const result = await opa.eval({
131
+ query: exprText,
132
+ source: evalBase.source,
133
+ paths: evalBase.paths,
134
+ input: evalBase.input,
135
+ inputPath: evalBase.inputPath,
136
+ }, signal);
137
+ if (result.exitCode === null || result.exitCode !== 0) {
138
+ const firstLine = (result.stderr.trim() || result.stdout.trim()).split('\n')[0] ?? 'unknown error';
139
+ return { result: 'unevaluable', note: `Standalone eval failed: ${firstLine}` };
140
+ }
141
+ const parsed = tryParseJson(result.stdout);
142
+ return (parsed?.result?.length ?? 0) > 0 ? { result: 'true' } : { result: 'false' };
143
+ }
144
+ function buildSummary(query, rules, defaultValue) {
145
+ const lines = [];
146
+ if (rules.length === 0) {
147
+ lines.push(`${query} is undefined: no matching rules found in the analysed source.`);
148
+ }
149
+ else {
150
+ const count = rules.length;
151
+ lines.push(`${query} is undefined. ${count} rule definition${count !== 1 ? 's' : ''} analysed:`);
152
+ for (const r of rules) {
153
+ const loc = r.location.row > 0 ? ` (row ${r.location.row})` : '';
154
+ const bc = r.blockingCondition;
155
+ if (bc) {
156
+ const how = r.source === 'trace' ? 'trace' : 'standalone eval';
157
+ lines.push(` Rule ${r.ruleIndex}${loc}: blocked by condition ${bc.index + 1} -- ` +
158
+ `\`${bc.text}\` (row ${bc.row}) is not satisfied [via ${how}].`);
159
+ }
160
+ else if (r.conditions.length === 0) {
161
+ lines.push(` Rule ${r.ruleIndex}${loc}: no analysable body conditions.`);
162
+ }
163
+ else {
164
+ const unevalCount = r.conditions.filter((c) => c.result === 'unevaluable').length;
165
+ lines.push(` Rule ${r.ruleIndex}${loc}: blocking condition could not be determined ` +
166
+ `(${unevalCount} unevaluable expression${unevalCount !== 1 ? 's' : ''}).`);
167
+ }
168
+ }
169
+ }
170
+ if (defaultValue !== undefined) {
171
+ lines.push(`Default value: ${JSON.stringify(defaultValue)}.`);
172
+ }
173
+ return lines.join('\n');
174
+ }
175
+ // ─── Tool registration ──────────────────────────────────────────────────────
176
+ export function registerRegoExplainUndefined(server, config) {
177
+ const opa = new OpaCli(config);
178
+ server.registerTool('rego_explain_undefined', {
179
+ title: 'Explain why a Rego query is undefined',
180
+ description: 'Diagnose why a fully-qualified Rego query (e.g. "data.authz.allow") produces no ' +
181
+ 'value. Combines a plain eval, a full-trace eval, and per-condition AST analysis to ' +
182
+ 'identify the exact body expression blocking each rule. Handles both runtime failures ' +
183
+ '(trace-based) and indexer elimination (standalone condition eval). Returns a structured ' +
184
+ 'breakdown of which conditions blocked each rule plus a human-readable summary.',
185
+ inputSchema: RegoExplainUndefinedInput,
186
+ annotations: {
187
+ readOnlyHint: true,
188
+ destructiveHint: false,
189
+ idempotentHint: true,
190
+ openWorldHint: false,
191
+ },
192
+ }, async (args, { signal }) => {
193
+ return withToolEnvelope(config, async () => {
194
+ // ── Path validation ───────────────────────────────────────────────
195
+ let resolvedPaths = [];
196
+ if (args.paths?.length) {
197
+ const pv = validatePaths(args.paths, config, { mustExist: true });
198
+ if (!pv.ok)
199
+ return pv.error;
200
+ resolvedPaths = pv.resolved;
201
+ }
202
+ if (args.inputPath) {
203
+ const iv = validatePaths([args.inputPath], config, { mustExist: true });
204
+ if (!iv.ok)
205
+ return iv.error;
206
+ }
207
+ const evalBase = {
208
+ query: args.query,
209
+ source: args.source,
210
+ paths: resolvedPaths.length > 0 ? resolvedPaths : undefined,
211
+ input: args.input,
212
+ inputPath: args.inputPath,
213
+ };
214
+ // ── Step 1: plain eval ────────────────────────────────────────────
215
+ const plainResult = await opa.eval(evalBase, signal);
216
+ const spawnErr = mapSubprocessFailure(plainResult, 'opa');
217
+ if (spawnErr)
218
+ return spawnErr;
219
+ if (plainResult.exitCode !== 0) {
220
+ const detail = tryParseJson(plainResult.stderr) ??
221
+ tryParseJson(plainResult.stdout) ??
222
+ plainResult.stderr;
223
+ return err('EVAL_ERROR', 'OPA evaluation failed.', {
224
+ details: { opaOutput: detail },
225
+ hint: 'Check for syntax errors or undefined references in the query or policy.',
226
+ });
227
+ }
228
+ const plainJson = tryParseJson(plainResult.stdout);
229
+ const isDefined = (plainJson?.result?.length ?? 0) > 0;
230
+ if (isDefined) {
231
+ const value = plainJson.result[0]?.expressions?.[0]?.value;
232
+ return ok({
233
+ queryResult: 'defined',
234
+ value,
235
+ summary: `${args.query} is defined with value: ${JSON.stringify(value)}.`,
236
+ rulesFound: 0,
237
+ rules: [],
238
+ });
239
+ }
240
+ // ── Step 2: eval with --explain=full ──────────────────────────────
241
+ const traceResult = await opa.eval({ ...evalBase, explain: 'full' }, signal);
242
+ const traceSpawnErr = mapSubprocessFailure(traceResult, 'opa');
243
+ if (traceSpawnErr)
244
+ return traceSpawnErr;
245
+ const traceJson = tryParseJson(traceResult.stdout);
246
+ const trace = traceJson?.explanation ?? [];
247
+ // ── Step 3: parse AST(s) ──────────────────────────────────────────
248
+ const asts = [];
249
+ if (args.source) {
250
+ const pr = await opa.parse({ source: args.source, includeLocations: true }, signal);
251
+ if (pr.exitCode === 0) {
252
+ const ast = tryParseJson(pr.stdout);
253
+ if (ast)
254
+ asts.push(ast);
255
+ }
256
+ }
257
+ else if (resolvedPaths.length > 0) {
258
+ const regoFiles = resolvedPaths.filter((p) => p.endsWith('.rego'));
259
+ for (const filePath of regoFiles) {
260
+ try {
261
+ const src = await readFile(filePath, 'utf8');
262
+ const pr = await opa.parse({ source: src, includeLocations: true }, signal);
263
+ if (pr.exitCode === 0) {
264
+ const ast = tryParseJson(pr.stdout);
265
+ if (ast)
266
+ asts.push(ast);
267
+ }
268
+ }
269
+ catch {
270
+ // Unreadable file; still usable for eval
271
+ }
272
+ }
273
+ }
274
+ // ── Step 4: find matching rules ───────────────────────────────────
275
+ const queryParsed = queryToPackageAndRule(args.query);
276
+ const matchedRules = [];
277
+ for (const ast of asts) {
278
+ const pkgPath = extractPackagePath(ast);
279
+ if (queryParsed && pkgPath !== queryParsed.packagePath)
280
+ continue;
281
+ for (const rule of ast.rules ?? []) {
282
+ const name = extractRuleHeadName(rule.head);
283
+ if (!queryParsed || name === queryParsed.ruleName) {
284
+ matchedRules.push(rule);
285
+ }
286
+ }
287
+ }
288
+ // ── Step 5: analyse each rule ─────────────────────────────────────
289
+ let defaultValue;
290
+ const rules = [];
291
+ for (let ruleIndex = 0; ruleIndex < matchedRules.length; ruleIndex++) {
292
+ const rule = matchedRules[ruleIndex];
293
+ const location = {
294
+ file: sanitizeInlinePath(rule.location?.file ?? ''),
295
+ row: rule.location?.row ?? 0,
296
+ col: rule.location?.col ?? 0,
297
+ };
298
+ if (rule.default) {
299
+ defaultValue = rule.head?.value?.value;
300
+ rules.push({
301
+ ruleIndex,
302
+ isDefault: true,
303
+ location,
304
+ conditions: [],
305
+ blockingCondition: null,
306
+ source: 'trace',
307
+ });
308
+ continue;
309
+ }
310
+ const ruleName = extractRuleHeadName(rule.head) ?? '';
311
+ const bodyExprs = rule.body ?? [];
312
+ const conditions = bodyExprs.map((expr, i) => ({
313
+ index: i,
314
+ text: decodeBase64Text(expr.location?.text) ?? '<expression>',
315
+ row: expr.location?.row ?? 0,
316
+ col: expr.location?.col ?? 0,
317
+ result: 'unevaluable',
318
+ }));
319
+ const inTrace = ruleAppearsInTrace(ruleName, rule.location?.row, trace);
320
+ if (inTrace) {
321
+ // Trace-based: find first Fail event that hits a body row.
322
+ const blockingRow = findBlockingRowFromTrace(rule, trace);
323
+ let seenBlocking = false;
324
+ for (const cond of conditions) {
325
+ if (!seenBlocking && blockingRow !== undefined && cond.row === blockingRow) {
326
+ cond.result = 'false';
327
+ seenBlocking = true;
328
+ }
329
+ else if (!seenBlocking && cond.row > 0 && blockingRow !== undefined) {
330
+ // Conditions before the blocking one successfully passed.
331
+ cond.result = 'true';
332
+ }
333
+ }
334
+ const blockingCondition = conditions.find((c) => c.result === 'false') ?? null;
335
+ rules.push({
336
+ ruleIndex,
337
+ isDefault: false,
338
+ location,
339
+ conditions,
340
+ blockingCondition,
341
+ source: 'trace',
342
+ });
343
+ }
344
+ else {
345
+ // Standalone eval: OPA's indexer eliminated this rule before
346
+ // entering its body. Evaluate each condition independently.
347
+ for (const cond of conditions) {
348
+ if (cond.text === '<expression>') {
349
+ cond.note = 'No location text available; cannot evaluate standalone.';
350
+ continue;
351
+ }
352
+ const evalOut = await evalConditionStandalone(cond.text, evalBase, opa, signal);
353
+ cond.result = evalOut.result;
354
+ if (evalOut.note)
355
+ cond.note = evalOut.note;
356
+ }
357
+ const blockingCondition = conditions.find((c) => c.result !== 'true') ?? null;
358
+ rules.push({
359
+ ruleIndex,
360
+ isDefault: false,
361
+ location,
362
+ conditions,
363
+ blockingCondition,
364
+ source: 'standalone-eval',
365
+ });
366
+ }
367
+ }
368
+ const nonDefaultRules = rules.filter((r) => !r.isDefault);
369
+ const summary = buildSummary(args.query, nonDefaultRules, defaultValue);
370
+ return ok({
371
+ queryResult: 'undefined',
372
+ summary,
373
+ rulesFound: nonDefaultRules.length,
374
+ defaultValue,
375
+ rules,
376
+ });
377
+ });
378
+ });
379
+ }
380
+ //# sourceMappingURL=explain-undefined.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain-undefined.js","sourceRoot":"","sources":["../../../src/tools/helpers/explain-undefined.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/helpers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAa9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAY3E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/helpers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAe9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAc3E"}
@@ -1,6 +1,7 @@
1
1
  import { registerRegoCoverageGaps } from './coverage-gaps.js';
2
2
  import { registerRegoDescribePolicy } from './describe-policy.js';
3
3
  import { registerRegoExplainDecision } from './explain-decision.js';
4
+ import { registerRegoExplainUndefined } from './explain-undefined.js';
4
5
  import { registerRegoFix } from './fix.js';
5
6
  import { registerRegoFormatWrite } from './format-write.js';
6
7
  import { registerRegoGenerateTestSkeleton } from './generate-test-skeleton.js';
@@ -8,9 +9,11 @@ import { registerRegoInferInputSchema } from './infer-input-schema.js';
8
9
  import { registerRegoPolicyDiff } from './policy-diff.js';
9
10
  import { registerRegoSecurityAudit } from './security-audit.js';
10
11
  import { registerRegoSuggestFix } from './suggest-fix.js';
12
+ import { registerRegoPlaygroundShare } from './playground-share.js';
11
13
  import { registerRegoVerify } from './verify.js';
12
14
  export function registerHelperTools(server, config) {
13
15
  registerRegoExplainDecision(server, config);
16
+ registerRegoExplainUndefined(server, config);
14
17
  registerRegoGenerateTestSkeleton(server, config);
15
18
  registerRegoDescribePolicy(server, config);
16
19
  registerRegoSuggestFix(server, config);
@@ -21,5 +24,6 @@ export function registerHelperTools(server, config) {
21
24
  registerRegoFormatWrite(server, config);
22
25
  registerRegoPolicyDiff(server, config);
23
26
  registerRegoVerify(server, config);
27
+ registerRegoPlaygroundShare(server, config);
24
28
  }
25
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/helpers/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAc;IACnE,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,gCAAgC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,4BAA4B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/helpers/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAc;IACnE,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,4BAA4B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,gCAAgC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,4BAA4B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `rego_playground_share` -- publish a Rego policy as a public GitHub Gist
3
+ * and return a shareable URL.
4
+ *
5
+ * Why Gist and not the OPA playground? Every endpoint on
6
+ * play.openpolicyagent.org requires a GitHub OAuth session cookie -- there is
7
+ * no public API key path. Gists are a natural substitute: they render Rego
8
+ * with syntax highlighting, are forkable, and the raw URL is directly loadable
9
+ * by OPA or Conftest.
10
+ *
11
+ * Requires a GitHub personal access token with the `gist` scope, supplied via
12
+ * the GITHUB_TOKEN environment variable.
13
+ */
14
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
15
+ import type { Config } from '../../config.js';
16
+ export interface RegoPlaygroundShareOutput {
17
+ /** URL to the Gist page on github.com -- the primary shareable link. */
18
+ gistUrl: string;
19
+ /** Direct raw URL to the policy.rego file inside the Gist. */
20
+ rawPolicyUrl: string;
21
+ /** GitHub Gist ID. */
22
+ id: string;
23
+ }
24
+ export declare function registerRegoPlaygroundShare(server: McpServer, _config: Config): void;
25
+ //# sourceMappingURL=playground-share.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playground-share.d.ts","sourceRoot":"","sources":["../../../src/tools/helpers/playground-share.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAiC9C,MAAM,WAAW,yBAAyB;IACxC,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ;AAsBD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA2GpF"}
@@ -0,0 +1,117 @@
1
+ import { z } from 'zod';
2
+ import { err, ok } from '../../lib/errors.js';
3
+ import { withToolEnvelope } from '../../lib/tool-helpers.js';
4
+ // ─── Input schema ─────────────────────────────────────────────────────────────
5
+ const RegoPlaygroundShareInput = {
6
+ policy: z.string().min(1).describe('Rego source code to share (the contents of a .rego file).'),
7
+ query: z
8
+ .string()
9
+ .optional()
10
+ .describe('Default query to evaluate against the policy, e.g. "data.authz.allow". ' +
11
+ 'Stored in metadata.json alongside the policy file.'),
12
+ input: z
13
+ .string()
14
+ .optional()
15
+ .describe('Input document as a JSON string. Stored in metadata.json alongside the policy file.'),
16
+ data: z
17
+ .string()
18
+ .optional()
19
+ .describe('Data document as a JSON string. Stored in metadata.json alongside the policy file.'),
20
+ description: z
21
+ .string()
22
+ .optional()
23
+ .describe('Short description for the Gist (shown on github.com/gists).'),
24
+ };
25
+ // ─── Tool registration ────────────────────────────────────────────────────────
26
+ export function registerRegoPlaygroundShare(server, _config) {
27
+ server.registerTool('rego_playground_share', {
28
+ title: 'Share Rego policy as a GitHub Gist',
29
+ description: 'Share a Rego policy with teammates or create a reproducible example by publishing it ' +
30
+ 'as a public GitHub Gist. Returns { gistUrl, rawPolicyUrl, id }: the gistUrl renders ' +
31
+ 'the policy with syntax highlighting on github.com; the rawPolicyUrl can be passed ' +
32
+ 'directly to OPA (`opa eval -d <rawPolicyUrl> <query>`) or used as a data source in ' +
33
+ 'Conftest. When query, input, or data are supplied, a metadata.json file is bundled ' +
34
+ 'into the Gist so recipients have the full evaluation context to reproduce results. ' +
35
+ 'Each call creates a new Gist -- use the returned id to reference it later. ' +
36
+ 'Requires GITHUB_TOKEN in the environment (GitHub personal access token with the ' +
37
+ '"gist" scope); returns GITHUB_TOKEN_MISSING with setup instructions if unset.',
38
+ inputSchema: RegoPlaygroundShareInput,
39
+ annotations: {
40
+ readOnlyHint: false,
41
+ destructiveHint: false,
42
+ idempotentHint: false,
43
+ openWorldHint: true,
44
+ },
45
+ }, async ({ policy, query, input, data, description }, { signal }) => {
46
+ return withToolEnvelope(_config, async () => {
47
+ // ── Token check ────────────────────────────────────────────────────
48
+ const token = process.env['GITHUB_TOKEN'];
49
+ if (!token) {
50
+ return err('GITHUB_TOKEN_MISSING', 'GITHUB_TOKEN environment variable is not set. ' +
51
+ 'A GitHub personal access token with the "gist" scope is required to create Gists.', {
52
+ hint: 'Create a token at https://github.com/settings/tokens (select "gist" scope), ' +
53
+ 'then set GITHUB_TOKEN in your shell or in the "env" block of your MCP client config.',
54
+ });
55
+ }
56
+ // ── Build Gist files ───────────────────────────────────────────────
57
+ const files = {
58
+ 'policy.rego': { content: policy },
59
+ };
60
+ // Attach supplementary context as a second file only when at least
61
+ // one optional field was provided -- keeps single-file Gists clean.
62
+ const metadata = {};
63
+ if (query !== undefined)
64
+ metadata['query'] = query;
65
+ if (input !== undefined)
66
+ metadata['input'] = input;
67
+ if (data !== undefined)
68
+ metadata['data'] = data;
69
+ if (Object.keys(metadata).length > 0) {
70
+ files['metadata.json'] = { content: JSON.stringify(metadata, null, 2) };
71
+ }
72
+ const body = {
73
+ description: description ?? 'OPA Rego policy',
74
+ public: true,
75
+ files,
76
+ };
77
+ // ── POST to GitHub Gist API ────────────────────────────────────────
78
+ let response;
79
+ try {
80
+ response = await fetch('https://api.github.com/gists', {
81
+ method: 'POST',
82
+ headers: {
83
+ Authorization: `Bearer ${token}`,
84
+ Accept: 'application/vnd.github+json',
85
+ 'Content-Type': 'application/json',
86
+ 'X-GitHub-Api-Version': '2022-11-28',
87
+ },
88
+ body: JSON.stringify(body),
89
+ signal,
90
+ });
91
+ }
92
+ catch (e) {
93
+ const message = e instanceof Error ? e.message : String(e);
94
+ return err('UNKNOWN_ERROR', `GitHub Gist API request failed: ${message}`);
95
+ }
96
+ if (!response.ok) {
97
+ const text = await response.text().catch(() => '');
98
+ return err('GIST_CREATE_FAILED', `GitHub Gist creation failed with HTTP ${response.status.toString()}.`, { details: { status: response.status, body: text } });
99
+ }
100
+ // ── Parse response ─────────────────────────────────────────────────
101
+ let gist;
102
+ try {
103
+ gist = (await response.json());
104
+ }
105
+ catch {
106
+ return err('GIST_CREATE_FAILED', 'GitHub returned an unparseable response body.');
107
+ }
108
+ const rawPolicyUrl = gist.files['policy.rego']?.raw_url ?? '';
109
+ return ok({
110
+ gistUrl: gist.html_url,
111
+ rawPolicyUrl,
112
+ id: gist.id,
113
+ });
114
+ });
115
+ });
116
+ }
117
+ //# sourceMappingURL=playground-share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playground-share.js","sourceRoot":"","sources":["../../../src/tools/helpers/playground-share.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  * here in order; ordering doesn't affect behavior but keeps the
6
6
  * declaration site tidy.
7
7
  *
8
- * Tools (49 total):
8
+ * Tools (52 total):
9
9
  * Category A -- Authoring: rego_format, rego_check,
10
10
  * rego_check_schema, rego_lint,
11
11
  * rego_parse_ast, rego_inspect,
@@ -14,7 +14,8 @@
14
14
  * Category B -- Evaluation: rego_eval, rego_eval_with_explain,
15
15
  * rego_eval_with_profile,
16
16
  * rego_eval_with_coverage, rego_test,
17
- * rego_bench, rego_compile_query
17
+ * rego_test_multiroot, rego_bench,
18
+ * rego_compile_query
18
19
  * Category C -- Bundles: opa_bundle_build, opa_bundle_sign,
19
20
  * opa_bundle_verify, opa_exec
20
21
  * Category D -- Server mgmt: opa_list_policies, opa_get_policy,
@@ -24,6 +25,7 @@
24
25
  * opa_query_decision, opa_compile_query,
25
26
  * opa_health, opa_status, opa_config
26
27
  * Category E -- Helpers: rego_explain_decision,
28
+ * rego_explain_undefined,
27
29
  * rego_generate_test_skeleton,
28
30
  * rego_describe_policy,
29
31
  * rego_suggest_fix,
@@ -31,7 +33,8 @@
31
33
  * rego_security_audit,
32
34
  * rego_infer_input_schema,
33
35
  * rego_fix, rego_format_write,
34
- * rego_policy_diff, rego_verify
36
+ * rego_policy_diff, rego_verify,
37
+ * rego_playground_share
35
38
  * Category F -- Conftest: conftest_test, conftest_verify,
36
39
  * conftest_pull, conftest_push
37
40
  * Category G -- Meta: mcp_server_info
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAS3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQrE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAS3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQrE"}