@sponsio/sdk 0.1.0-alpha.3 → 0.2.0-alpha.4

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 (203) hide show
  1. package/bin/sponsio.cjs +11 -0
  2. package/contracts/benchmark/agentdojo.yaml +551 -0
  3. package/contracts/benchmark/odcv_bench.yaml +393 -0
  4. package/contracts/benchmark/redcode_exec.yaml +488 -0
  5. package/contracts/benchmark/swebench.yaml +176 -0
  6. package/contracts/benchmark/tau2_bench.yaml +984 -0
  7. package/contracts/capability/credentials.yaml +8 -8
  8. package/contracts/capability/database.yaml +6 -6
  9. package/contracts/capability/filesystem-strict.yaml +4 -4
  10. package/contracts/capability/filesystem.yaml +9 -9
  11. package/contracts/capability/host-config-integrity.yaml +285 -0
  12. package/contracts/capability/self-modify.yaml +214 -9
  13. package/contracts/capability/shell.yaml +25 -32
  14. package/contracts/capability/subagent.yaml +5 -5
  15. package/contracts/core/llm_safety.yaml +21 -13
  16. package/contracts/incident/claude-code-secret-bypass.yaml +11 -12
  17. package/contracts/incident/cursor-railway-wipe.yaml +3 -3
  18. package/contracts/incident/mcp-composition.yaml +12 -12
  19. package/contracts/incident/openclaw.yaml +54 -45
  20. package/contracts/incident/subagent-escape.yaml +4 -4
  21. package/contracts/premium/.gitkeep +5 -6
  22. package/dist/cli/check.d.ts +2 -0
  23. package/dist/cli/check.d.ts.map +1 -0
  24. package/dist/cli/check.js +283 -0
  25. package/dist/cli/check.js.map +1 -0
  26. package/dist/cli/cli.d.ts +25 -0
  27. package/dist/cli/cli.d.ts.map +1 -0
  28. package/dist/cli/cli.js +459 -0
  29. package/dist/cli/cli.js.map +1 -0
  30. package/dist/cli/config.d.ts +88 -0
  31. package/dist/cli/config.d.ts.map +1 -0
  32. package/dist/cli/config.js +243 -0
  33. package/dist/cli/config.js.map +1 -0
  34. package/dist/cli/demo.d.ts +12 -0
  35. package/dist/cli/demo.d.ts.map +1 -0
  36. package/dist/cli/demo.js +350 -0
  37. package/dist/cli/demo.js.map +1 -0
  38. package/dist/cli/doctor.d.ts +11 -0
  39. package/dist/cli/doctor.d.ts.map +1 -0
  40. package/dist/cli/doctor.js +201 -0
  41. package/dist/cli/doctor.js.map +1 -0
  42. package/dist/cli/eval.d.ts +2 -0
  43. package/dist/cli/eval.d.ts.map +1 -0
  44. package/dist/cli/eval.js +361 -0
  45. package/dist/cli/eval.js.map +1 -0
  46. package/dist/cli/explain.d.ts +2 -0
  47. package/dist/cli/explain.d.ts.map +1 -0
  48. package/dist/cli/explain.js +266 -0
  49. package/dist/cli/explain.js.map +1 -0
  50. package/dist/cli/export-sessions.d.ts +2 -0
  51. package/dist/cli/export-sessions.d.ts.map +1 -0
  52. package/dist/cli/export-sessions.js +182 -0
  53. package/dist/cli/export-sessions.js.map +1 -0
  54. package/dist/cli/export.d.ts +2 -0
  55. package/dist/cli/export.d.ts.map +1 -0
  56. package/dist/cli/export.js +222 -0
  57. package/dist/cli/export.js.map +1 -0
  58. package/dist/cli/extractors/common.d.ts +27 -0
  59. package/dist/cli/extractors/common.d.ts.map +1 -0
  60. package/dist/cli/extractors/common.js +107 -0
  61. package/dist/cli/extractors/common.js.map +1 -0
  62. package/dist/cli/extractors/generic.d.ts +37 -0
  63. package/dist/cli/extractors/generic.d.ts.map +1 -0
  64. package/dist/cli/extractors/generic.js +185 -0
  65. package/dist/cli/extractors/generic.js.map +1 -0
  66. package/dist/cli/extractors/langchain.d.ts +18 -0
  67. package/dist/cli/extractors/langchain.d.ts.map +1 -0
  68. package/dist/cli/extractors/langchain.js +86 -0
  69. package/dist/cli/extractors/langchain.js.map +1 -0
  70. package/dist/cli/extractors/vercel.d.ts +17 -0
  71. package/dist/cli/extractors/vercel.d.ts.map +1 -0
  72. package/dist/cli/extractors/vercel.js +46 -0
  73. package/dist/cli/extractors/vercel.js.map +1 -0
  74. package/dist/cli/index.d.ts +38 -0
  75. package/dist/cli/index.d.ts.map +1 -0
  76. package/dist/cli/index.js +146 -0
  77. package/dist/cli/index.js.map +1 -0
  78. package/dist/cli/init.d.ts +2 -0
  79. package/dist/cli/init.d.ts.map +1 -0
  80. package/dist/cli/init.js +177 -0
  81. package/dist/cli/init.js.map +1 -0
  82. package/dist/cli/mode.d.ts +2 -0
  83. package/dist/cli/mode.d.ts.map +1 -0
  84. package/dist/cli/mode.js +71 -0
  85. package/dist/cli/mode.js.map +1 -0
  86. package/dist/cli/onboard.d.ts +88 -0
  87. package/dist/cli/onboard.d.ts.map +1 -0
  88. package/dist/cli/onboard.js +758 -0
  89. package/dist/cli/onboard.js.map +1 -0
  90. package/dist/cli/otlp.d.ts +27 -0
  91. package/dist/cli/otlp.d.ts.map +1 -0
  92. package/dist/cli/otlp.js +79 -0
  93. package/dist/cli/otlp.js.map +1 -0
  94. package/dist/cli/package.json +1 -0
  95. package/dist/cli/packs.d.ts +16 -0
  96. package/dist/cli/packs.d.ts.map +1 -0
  97. package/dist/cli/packs.js +184 -0
  98. package/dist/cli/packs.js.map +1 -0
  99. package/dist/cli/patterns.d.ts +16 -0
  100. package/dist/cli/patterns.d.ts.map +1 -0
  101. package/dist/cli/patterns.js +136 -0
  102. package/dist/cli/patterns.js.map +1 -0
  103. package/dist/cli/prompt.d.ts +2 -0
  104. package/dist/cli/prompt.d.ts.map +1 -0
  105. package/dist/cli/prompt.js +54 -0
  106. package/dist/cli/prompt.js.map +1 -0
  107. package/dist/cli/replay.d.ts +2 -0
  108. package/dist/cli/replay.d.ts.map +1 -0
  109. package/dist/cli/replay.js +196 -0
  110. package/dist/cli/replay.js.map +1 -0
  111. package/dist/cli/report.d.ts +57 -0
  112. package/dist/cli/report.d.ts.map +1 -0
  113. package/dist/cli/report.js +298 -0
  114. package/dist/cli/report.js.map +1 -0
  115. package/dist/cli/scan.d.ts +2 -0
  116. package/dist/cli/scan.d.ts.map +1 -0
  117. package/dist/cli/scan.js +172 -0
  118. package/dist/cli/scan.js.map +1 -0
  119. package/dist/cli/skill.d.ts +15 -0
  120. package/dist/cli/skill.d.ts.map +1 -0
  121. package/dist/cli/skill.js +131 -0
  122. package/dist/cli/skill.js.map +1 -0
  123. package/dist/cli/tokens.d.ts +31 -0
  124. package/dist/cli/tokens.d.ts.map +1 -0
  125. package/dist/cli/tokens.js +73 -0
  126. package/dist/cli/tokens.js.map +1 -0
  127. package/dist/cli/types.d.ts +46 -0
  128. package/dist/cli/types.d.ts.map +1 -0
  129. package/dist/cli/types.js +3 -0
  130. package/dist/cli/types.js.map +1 -0
  131. package/dist/cli/validate.d.ts +19 -0
  132. package/dist/cli/validate.d.ts.map +1 -0
  133. package/dist/cli/validate.js +205 -0
  134. package/dist/cli/validate.js.map +1 -0
  135. package/dist/cli/zod.d.ts +36 -0
  136. package/dist/cli/zod.d.ts.map +1 -0
  137. package/dist/cli/zod.js +226 -0
  138. package/dist/cli/zod.js.map +1 -0
  139. package/dist/contract.d.ts +13 -13
  140. package/dist/contract.d.ts.map +1 -1
  141. package/dist/contract.js +21 -21
  142. package/dist/contract.js.map +1 -1
  143. package/dist/core/config-loader.d.ts +1 -1
  144. package/dist/core/config-loader.d.ts.map +1 -1
  145. package/dist/core/config-loader.js +100 -26
  146. package/dist/core/config-loader.js.map +1 -1
  147. package/dist/core/evaluator.d.ts +9 -1
  148. package/dist/core/evaluator.d.ts.map +1 -1
  149. package/dist/core/evaluator.js +189 -13
  150. package/dist/core/evaluator.js.map +1 -1
  151. package/dist/core/formula.d.ts +76 -17
  152. package/dist/core/formula.d.ts.map +1 -1
  153. package/dist/core/formula.js +83 -1
  154. package/dist/core/formula.js.map +1 -1
  155. package/dist/core/grounding.d.ts +50 -3
  156. package/dist/core/grounding.d.ts.map +1 -1
  157. package/dist/core/grounding.js +317 -141
  158. package/dist/core/grounding.js.map +1 -1
  159. package/dist/core/nl-parser.d.ts +1 -1
  160. package/dist/core/nl-parser.d.ts.map +1 -1
  161. package/dist/core/nl-parser.js +76 -4
  162. package/dist/core/nl-parser.js.map +1 -1
  163. package/dist/core/pack-loader.d.ts.map +1 -1
  164. package/dist/core/pack-loader.js +14 -2
  165. package/dist/core/pack-loader.js.map +1 -1
  166. package/dist/core/parser.d.ts.map +1 -1
  167. package/dist/core/parser.js +30 -1
  168. package/dist/core/parser.js.map +1 -1
  169. package/dist/core/pattern-factory.d.ts +4 -4
  170. package/dist/core/pattern-factory.d.ts.map +1 -1
  171. package/dist/core/pattern-factory.js +53 -4
  172. package/dist/core/pattern-factory.js.map +1 -1
  173. package/dist/core/patterns.d.ts +127 -5
  174. package/dist/core/patterns.d.ts.map +1 -1
  175. package/dist/core/patterns.js +267 -3
  176. package/dist/core/patterns.js.map +1 -1
  177. package/dist/core/session-log.d.ts.map +1 -1
  178. package/dist/core/session-log.js +20 -1
  179. package/dist/core/session-log.js.map +1 -1
  180. package/dist/core/spans.d.ts +1 -1
  181. package/dist/core/spans.d.ts.map +1 -1
  182. package/dist/core/spans.js.map +1 -1
  183. package/dist/core/sto.d.ts +30 -66
  184. package/dist/core/sto.d.ts.map +1 -1
  185. package/dist/core/sto.js +39 -100
  186. package/dist/core/sto.js.map +1 -1
  187. package/dist/index.d.ts +83 -33
  188. package/dist/index.d.ts.map +1 -1
  189. package/dist/index.js +194 -142
  190. package/dist/index.js.map +1 -1
  191. package/dist/integrations/openai-agents.d.ts.map +1 -1
  192. package/dist/integrations/openai-agents.js +6 -4
  193. package/dist/integrations/openai-agents.js.map +1 -1
  194. package/dist/integrations/vercel-ai.d.ts.map +1 -1
  195. package/dist/integrations/vercel-ai.js +21 -3
  196. package/dist/integrations/vercel-ai.js.map +1 -1
  197. package/dist/render/tokens.d.ts.map +1 -1
  198. package/dist/render/tokens.js +1 -0
  199. package/dist/render/tokens.js.map +1 -1
  200. package/package.json +35 -7
  201. package/prompts/onboard.md +246 -0
  202. package/prompts/scan.md +123 -0
  203. package/skills/SKILL.md +432 -0
@@ -0,0 +1,459 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * ``sponsio`` — CLI frontend for ``@sponsio/sdk``.
5
+ *
6
+ * Usage:
7
+ *
8
+ * npx @sponsio/sdk ./src
9
+ * npx @sponsio/sdk "src/**\/*.ts" --out tools.json
10
+ * npx @sponsio/sdk --config sponsio.yaml
11
+ * npx @sponsio/sdk ./src --pretty
12
+ *
13
+ * Writes the OpenAI function-calling JSON inventory to stdout (or to
14
+ * ``--out <file>``) so you can pipe into ``sponsio scan`` on the
15
+ * Python side:
16
+ *
17
+ * npx @sponsio/sdk ./src > tools.json
18
+ * sponsio scan tools.json --out sponsio.yaml
19
+ *
20
+ * When ``--config sponsio.yaml`` is passed, the CLI also reads the
21
+ * ``scan:`` section (for defaults) and ``extractor:`` (for LLM
22
+ * passthrough in the output JSON, so the Python-side scan doesn't
23
+ * need ``--config`` a second time). CLI flags always win over YAML.
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const fs_1 = require("fs");
27
+ const config_1 = require("./config");
28
+ const onboard_1 = require("./onboard");
29
+ const report_1 = require("./report");
30
+ const validate_1 = require("./validate");
31
+ const patterns_1 = require("./patterns");
32
+ const doctor_1 = require("./doctor");
33
+ const packs_1 = require("./packs");
34
+ const skill_1 = require("./skill");
35
+ const mode_1 = require("./mode");
36
+ const init_1 = require("./init");
37
+ const scan_1 = require("./scan");
38
+ const prompt_1 = require("./prompt");
39
+ const explain_1 = require("./explain");
40
+ const replay_1 = require("./replay");
41
+ const check_1 = require("./check");
42
+ const eval_1 = require("./eval");
43
+ const export_1 = require("./export");
44
+ const export_sessions_1 = require("./export-sessions");
45
+ const demo_1 = require("./demo");
46
+ const index_1 = require("./index");
47
+ // Authored as a plain-string array (not a template literal) because
48
+ // the help text contains literal ``${VAR}`` tokens that describe the
49
+ // env-var interpolation syntax. Inside a template literal those
50
+ // would try to evaluate as JS expressions (and ``\$`` escapes are
51
+ // inconsistently handled across TS-target combos). Joining plain
52
+ // strings is dull but unambiguous.
53
+ const HELP = [
54
+ "sponsio — scan TypeScript/JavaScript for agent tool definitions",
55
+ "",
56
+ "USAGE:",
57
+ " sponsio <patterns...> [options]",
58
+ "",
59
+ "ARGUMENTS:",
60
+ ' <patterns...> Files or glob patterns to scan (default: "src/**/*.{ts,tsx,js,jsx}")',
61
+ "",
62
+ "OPTIONS:",
63
+ " -o, --out <file> Write output to <file> instead of stdout",
64
+ " -c, --config <yaml> Read defaults from sponsio.yaml's ``scan:`` section and",
65
+ " embed ``extractor:`` config into the output for Python.",
66
+ " --pretty Pretty-print the emitted JSON",
67
+ " --provenance Include per-tool source-file provenance in output",
68
+ " -h, --help Show this help",
69
+ " -v, --version Show version",
70
+ "",
71
+ "EXAMPLES:",
72
+ " sponsio ./src",
73
+ ' sponsio "src/tools/**/*.ts" --out tools.json',
74
+ " sponsio --config sponsio.yaml --pretty",
75
+ " sponsio ./src --out /tmp/inv.json && sponsio scan /tmp/inv.json -o sponsio.yaml",
76
+ " sponsio onboard .",
77
+ " sponsio init --mode observe",
78
+ " sponsio scan ./src --append",
79
+ " sponsio mode enforce",
80
+ " sponsio check -t trace.json --config sponsio.yaml",
81
+ " sponsio eval traces/ --config sponsio.yaml --json",
82
+ " sponsio explain C1",
83
+ " sponsio prompt onboard",
84
+ " sponsio replay --list",
85
+ " sponsio export run.json --to traces/ --label safe",
86
+ " sponsio export-sessions --to audit.jsonl",
87
+ " sponsio demo --scenario wire",
88
+ " sponsio report --since 24h",
89
+ " sponsio validate ./sponsio.yaml",
90
+ " sponsio patterns",
91
+ " sponsio doctor",
92
+ " sponsio skill install",
93
+ "",
94
+ "SUBCOMMANDS:",
95
+ " onboard [.] Generate sponsio.yaml + print integration snippet",
96
+ " init [target] Skeleton sponsio.yaml (no scan)",
97
+ " scan <patterns…> AST-scan source -> sponsio.yaml with contracts",
98
+ " mode <observe|enforce> Flip the mode line in sponsio.yaml",
99
+ " check -t <trace> … Replay a trace file, report contract pass/fail",
100
+ " eval <traces/> … Replay labelled corpus, report FPR/FNR + diff",
101
+ " explain <Cn|substr> Explain a contract: source, last violation",
102
+ " prompt <onboard|scan|…> Print agent-facing contract-authoring template",
103
+ " replay [session|--list] Pretty-print a session log",
104
+ " export <src> --to <dir> Sponsio-native trace -> OTLP/JSON",
105
+ " export-sessions --to <f> Session log -> OTLP-JSONL",
106
+ " report [--since 24h …] Summarize ~/.sponsio/sessions/ into markdown/json",
107
+ " validate [path] Parse sponsio.yaml + report contract counts (sto contracts flagged as Cloud-only)",
108
+ " patterns [--category …] List deterministic pattern templates available in TS",
109
+ " packs List the built-in pack library (Python-executed)",
110
+ " doctor Env + config health check",
111
+ " demo [--scenario wire] Terminal demo of unsafe agent + Sponsio block",
112
+ " skill install Drop SKILL.md into Cursor/Claude/Codex skill dirs",
113
+ "",
114
+ "CONFIG FILE SHAPE:",
115
+ " # sponsio.yaml",
116
+ " scan:",
117
+ ' patterns: ["src/**/*.ts", "packages/*/src/**/*.ts"]',
118
+ ' ignore: ["**/generated/**"]',
119
+ ' out: "tools.json"',
120
+ " provenance: true",
121
+ " extractor:",
122
+ " provider: openai",
123
+ " model: gpt-4o",
124
+ " api_key: ${OPENAI_API_KEY} # ${VAR} / ${VAR:-default} supported",
125
+ ].join("\n") + "\n";
126
+ function parseArgs(argv) {
127
+ const args = {
128
+ patterns: [],
129
+ pretty: false,
130
+ help: false,
131
+ version: false,
132
+ includeProvenance: false,
133
+ };
134
+ for (let i = 0; i < argv.length; i++) {
135
+ const a = argv[i];
136
+ if (a === "-h" || a === "--help")
137
+ args.help = true;
138
+ else if (a === "-v" || a === "--version")
139
+ args.version = true;
140
+ else if (a === "--pretty")
141
+ args.pretty = true;
142
+ else if (a === "--provenance")
143
+ args.includeProvenance = true;
144
+ else if (a === "-o" || a === "--out") {
145
+ args.out = argv[++i];
146
+ }
147
+ else if (a === "-c" || a === "--config") {
148
+ args.configPath = argv[++i];
149
+ }
150
+ else if (a.startsWith("-")) {
151
+ process.stderr.write(`unknown flag: ${a}\n`);
152
+ process.exit(2);
153
+ }
154
+ else {
155
+ args.patterns.push(a);
156
+ }
157
+ }
158
+ return args;
159
+ }
160
+ async function main() {
161
+ const raw = process.argv.slice(2);
162
+ if (raw[0] === "onboard") {
163
+ try {
164
+ await (0, onboard_1.runOnboardCli)(raw.slice(1));
165
+ }
166
+ catch (err) {
167
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
168
+ process.exit(1);
169
+ }
170
+ return;
171
+ }
172
+ if (raw[0] === "report") {
173
+ try {
174
+ await (0, report_1.runReportCli)(raw.slice(1));
175
+ }
176
+ catch (err) {
177
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
178
+ process.exit(1);
179
+ }
180
+ return;
181
+ }
182
+ if (raw[0] === "validate") {
183
+ try {
184
+ await (0, validate_1.runValidateCli)(raw.slice(1));
185
+ }
186
+ catch (err) {
187
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
188
+ process.exit(1);
189
+ }
190
+ return;
191
+ }
192
+ if (raw[0] === "patterns") {
193
+ try {
194
+ await (0, patterns_1.runPatternsCli)(raw.slice(1));
195
+ }
196
+ catch (err) {
197
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
198
+ process.exit(1);
199
+ }
200
+ return;
201
+ }
202
+ if (raw[0] === "packs") {
203
+ try {
204
+ await (0, packs_1.runPacksCli)(raw.slice(1));
205
+ }
206
+ catch (err) {
207
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
208
+ process.exit(1);
209
+ }
210
+ return;
211
+ }
212
+ if (raw[0] === "doctor") {
213
+ try {
214
+ await (0, doctor_1.runDoctorCli)(raw.slice(1));
215
+ }
216
+ catch (err) {
217
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
218
+ process.exit(1);
219
+ }
220
+ return;
221
+ }
222
+ if (raw[0] === "skill") {
223
+ try {
224
+ await (0, skill_1.runSkillCli)(raw.slice(1));
225
+ }
226
+ catch (err) {
227
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
228
+ process.exit(1);
229
+ }
230
+ return;
231
+ }
232
+ if (raw[0] === "mode") {
233
+ try {
234
+ await (0, mode_1.runModeCli)(raw.slice(1));
235
+ }
236
+ catch (err) {
237
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
238
+ process.exit(1);
239
+ }
240
+ return;
241
+ }
242
+ if (raw[0] === "init") {
243
+ try {
244
+ await (0, init_1.runInitCli)(raw.slice(1));
245
+ }
246
+ catch (err) {
247
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
248
+ process.exit(1);
249
+ }
250
+ return;
251
+ }
252
+ if (raw[0] === "scan") {
253
+ try {
254
+ await (0, scan_1.runScanCli)(raw.slice(1));
255
+ }
256
+ catch (err) {
257
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
258
+ process.exit(1);
259
+ }
260
+ return;
261
+ }
262
+ if (raw[0] === "prompt") {
263
+ try {
264
+ await (0, prompt_1.runPromptCli)(raw.slice(1));
265
+ }
266
+ catch (err) {
267
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
268
+ process.exit(1);
269
+ }
270
+ return;
271
+ }
272
+ if (raw[0] === "explain") {
273
+ try {
274
+ await (0, explain_1.runExplainCli)(raw.slice(1));
275
+ }
276
+ catch (err) {
277
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
278
+ process.exit(1);
279
+ }
280
+ return;
281
+ }
282
+ if (raw[0] === "replay") {
283
+ try {
284
+ await (0, replay_1.runReplayCli)(raw.slice(1));
285
+ }
286
+ catch (err) {
287
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
288
+ process.exit(1);
289
+ }
290
+ return;
291
+ }
292
+ if (raw[0] === "check") {
293
+ try {
294
+ await (0, check_1.runCheckCli)(raw.slice(1));
295
+ }
296
+ catch (err) {
297
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
298
+ process.exit(1);
299
+ }
300
+ return;
301
+ }
302
+ if (raw[0] === "eval") {
303
+ try {
304
+ await (0, eval_1.runEvalCli)(raw.slice(1));
305
+ }
306
+ catch (err) {
307
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
308
+ process.exit(1);
309
+ }
310
+ return;
311
+ }
312
+ if (raw[0] === "export") {
313
+ try {
314
+ await (0, export_1.runExportCli)(raw.slice(1));
315
+ }
316
+ catch (err) {
317
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
318
+ process.exit(1);
319
+ }
320
+ return;
321
+ }
322
+ if (raw[0] === "export-sessions") {
323
+ try {
324
+ await (0, export_sessions_1.runExportSessionsCli)(raw.slice(1));
325
+ }
326
+ catch (err) {
327
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
328
+ process.exit(1);
329
+ }
330
+ return;
331
+ }
332
+ if (raw[0] === "demo") {
333
+ try {
334
+ await (0, demo_1.runDemoCli)(raw.slice(1));
335
+ }
336
+ catch (err) {
337
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : err}\n`);
338
+ process.exit(1);
339
+ }
340
+ return;
341
+ }
342
+ const args = parseArgs(raw);
343
+ if (args.help) {
344
+ process.stdout.write(HELP);
345
+ return;
346
+ }
347
+ if (args.version) {
348
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
349
+ const pkg = require("../package.json");
350
+ process.stdout.write(`${pkg.version}\n`);
351
+ return;
352
+ }
353
+ // ---------------------------------------------------------------
354
+ // Resolve config (if any). Precedence: CLI flag > YAML > default.
355
+ // We load the YAML *first* so CLI flags can overwrite whatever we
356
+ // parsed; the opposite order (CLI then YAML) would silently undo
357
+ // ``--out foo.json`` when the YAML also set ``scan.out``.
358
+ // ---------------------------------------------------------------
359
+ let config;
360
+ if (args.configPath) {
361
+ try {
362
+ config = (0, config_1.loadConfig)(args.configPath);
363
+ }
364
+ catch (err) {
365
+ if (err instanceof config_1.ConfigError) {
366
+ process.stderr.write(`[config] ${err.message}\n`);
367
+ process.exit(2);
368
+ }
369
+ throw err;
370
+ }
371
+ // Warn about unset env-var references. We don't fail on these
372
+ // — shell semantics says a missing var expands to empty, and
373
+ // aborting a pure AST scan because an ``OPENAI_API_KEY`` env
374
+ // isn't exported would be actively unhelpful (the scanner
375
+ // itself doesn't use that key; only the downstream Python
376
+ // extractor does). But a warning means users find out before
377
+ // the Python side yells about ``api_key: ""``.
378
+ if (config.missingEnvVars.length) {
379
+ process.stderr.write(`[config] warning: ${config.missingEnvVars.length} ` +
380
+ `env var(s) referenced in ${config.sourcePath} are unset ` +
381
+ `and have no default, expanded to empty string: ` +
382
+ config.missingEnvVars.join(", ") +
383
+ `\n`);
384
+ }
385
+ }
386
+ // ---------------------------------------------------------------
387
+ // Apply precedence for each knob.
388
+ // ---------------------------------------------------------------
389
+ const effectivePatterns = args.patterns.length > 0
390
+ ? args.patterns
391
+ : config?.scan.patterns && config.scan.patterns.length > 0
392
+ ? config.scan.patterns
393
+ : ["src/**/*.{ts,tsx,js,jsx}"];
394
+ const effectiveOut = args.out ?? config?.scan.out;
395
+ // Provenance is a boolean flag so we can't use ``??`` to mean
396
+ // "CLI not provided" — but since CLI parsing only sets
397
+ // includeProvenance to ``true`` on --provenance (never back to
398
+ // false from a flag), the YAML value only matters when the flag
399
+ // wasn't passed. Keep this explicit so future additions (e.g. a
400
+ // ``--no-provenance`` flag) don't accidentally tangle precedence.
401
+ const effectiveProvenance = args.includeProvenance
402
+ ? true
403
+ : config?.scan.provenance === true;
404
+ // ---------------------------------------------------------------
405
+ // If a bare directory was passed, expand it to a glob. Kept here
406
+ // (not in the config loader) because ``scan.patterns`` in YAML is
407
+ // authored with globs already — only CLI args get the fast-path
408
+ // directory expansion.
409
+ // ---------------------------------------------------------------
410
+ const expanded = await Promise.all(effectivePatterns.map(async (p) => {
411
+ try {
412
+ const stat = await fs_1.promises.stat(p);
413
+ if (stat.isDirectory()) {
414
+ return `${p.replace(/\/$/, "")}/**/*.{ts,tsx,js,jsx}`;
415
+ }
416
+ }
417
+ catch {
418
+ // not a real path — treat as a glob
419
+ }
420
+ return p;
421
+ }));
422
+ const scanOptions = config?.scan.ignore ? { ignore: config.scan.ignore } : {};
423
+ const result = await (0, index_1.scan)(expanded, scanOptions);
424
+ // ---------------------------------------------------------------
425
+ // Build the output payload. The extractor passthrough goes on a
426
+ // ``_extractor`` key with a leading underscore so Python's tool
427
+ // inventory loader (which accepts any top-level dict with a
428
+ // ``tools:`` key) ignores it as metadata rather than trying to
429
+ // interpret it as a tool. The Python ``sponsio scan`` side will
430
+ // read ``_extractor`` in a follow-up PR.
431
+ // ---------------------------------------------------------------
432
+ const basePayload = effectiveProvenance
433
+ ? result
434
+ : { tools: result.tools };
435
+ const payload = { ...basePayload };
436
+ if (config && Object.keys(config.extractor).length > 0) {
437
+ payload._extractor = config.extractor;
438
+ }
439
+ const json = args.pretty
440
+ ? JSON.stringify(payload, null, 2)
441
+ : JSON.stringify(payload);
442
+ if (effectiveOut) {
443
+ await fs_1.promises.writeFile(effectiveOut, json + "\n", "utf8");
444
+ process.stderr.write(`wrote ${result.tools.length} tools to ${effectiveOut}\n`);
445
+ }
446
+ else {
447
+ process.stdout.write(json + "\n");
448
+ }
449
+ if (result.diagnostics.length) {
450
+ for (const d of result.diagnostics) {
451
+ process.stderr.write(`[${d.level}] ${d.filepath}:${d.line} ${d.message}\n`);
452
+ }
453
+ }
454
+ }
455
+ main().catch((err) => {
456
+ process.stderr.write(`${err.stack ?? err.message ?? err}\n`);
457
+ process.exit(1);
458
+ });
459
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * ``sponsio.yaml`` loader for ``@sponsio/sdk``.
3
+ *
4
+ * Parity feature with the Python side's ``sponsio/config.py``. The
5
+ * goal is *semantic* parity — same YAML file works for both
6
+ * scanners, same env-var interpolation rules, same precedence
7
+ * (CLI flag > YAML > built-in default) — not byte-level parity of
8
+ * the parsed dataclasses (the TS scanner only needs a narrow slice
9
+ * of the schema).
10
+ *
11
+ * The three things we read:
12
+ *
13
+ * 1. ``scan:`` — optional section for TS-scanner-specific
14
+ * knobs: patterns, ignore list, output path, provenance
15
+ * inclusion. Lets a repo put all scanner config in one
16
+ * file instead of sprinkling CLI flags across workflows.
17
+ * 2. ``extractor:`` — *passthrough* (not interpreted here).
18
+ * We embed it in the output JSON as ``_extractor`` metadata
19
+ * so a downstream ``sponsio scan tools.json`` picks up the
20
+ * same LLM config without needing ``--config`` a second
21
+ * time. Mirrors the Python ``ExtractorSection``.
22
+ * 3. ``${ENV_VAR}`` / ``${ENV_VAR:-default}`` — interpolated
23
+ * on load with EXACTLY the same regex and semantics as
24
+ * Python (see ``_ENV_VAR_RE`` in ``sponsio/config.py``).
25
+ *
26
+ * Sections we *don't* parse: contracts, agents, judge, defaults.
27
+ * Those are Python-runtime concerns; touching them here would
28
+ * duplicate the Python schema and invite drift.
29
+ */
30
+ /**
31
+ * Parse-time LLM config — passed through to the output JSON for
32
+ * Python-side consumption. All fields optional because partial
33
+ * configs are common (e.g. ``provider`` + ``model`` with the
34
+ * api_key coming from an env var later).
35
+ */
36
+ export interface ExtractorSection {
37
+ provider?: string;
38
+ model?: string;
39
+ api_key?: string;
40
+ base_url?: string;
41
+ }
42
+ /**
43
+ * TS-scanner-specific config knobs. Everything optional; CLI flags
44
+ * still override whatever we find here.
45
+ */
46
+ export interface ScanSection {
47
+ patterns?: string[];
48
+ ignore?: string[];
49
+ out?: string;
50
+ provenance?: boolean;
51
+ }
52
+ export interface SponsioConfig {
53
+ /** Raw extractor section — unvalidated, emitted verbatim so any
54
+ * future field the Python side adds flows through without a
55
+ * TS-side schema change. */
56
+ extractor: ExtractorSection;
57
+ scan: ScanSection;
58
+ /** Env-var references that appeared in the file but were unset
59
+ * AND had no default. The loader keeps going (shell-like
60
+ * semantics: the var expands to empty) but surfaces these for
61
+ * CLI-time warnings — silent empty strings are a classic
62
+ * "api_key: " source of head-scratching. */
63
+ missingEnvVars: string[];
64
+ /** Absolute path the file was loaded from — used in error
65
+ * messages and tests. */
66
+ sourcePath: string;
67
+ }
68
+ export declare class ConfigError extends Error {
69
+ readonly sourcePath?: string | undefined;
70
+ constructor(message: string, sourcePath?: string | undefined);
71
+ }
72
+ /**
73
+ * Load and parse ``sponsio.yaml``.
74
+ *
75
+ * Design notes:
76
+ * * We *don't* validate the full Python schema — only the two
77
+ * sections we care about. Everything else (``contracts``,
78
+ * ``agents``, ``judge``) sails through untouched so a
79
+ * single file can be authoritative for both Python and TS.
80
+ * * Missing file → ``ConfigError`` (not silently-empty config),
81
+ * because the user explicitly passed ``--config <path>`` and
82
+ * typos are the #1 failure mode.
83
+ * * Malformed YAML → ``ConfigError`` with the parser's line/col
84
+ * where available (js-yaml's default YAMLException already
85
+ * includes this in its ``reason`` field).
86
+ */
87
+ export declare function loadConfig(configPath: string): SponsioConfig;
88
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAMH;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B;;iCAE6B;IAC7B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB;;;;iDAI6C;IAC7C,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB;8BAC0B;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAY,SAAQ,KAAK;aACS,UAAU,CAAC,EAAE,MAAM;gBAApD,OAAO,EAAE,MAAM,EAAkB,UAAU,CAAC,EAAE,MAAM,YAAA;CAIjE;AA6CD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CA4D5D"}