c64bridge 0.8.1 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/.github/prompts/steer.prompt.md +55 -0
  2. package/AGENTS.md +9 -7
  3. package/README.md +192 -154
  4. package/data/embeddings_asm.json +1 -1
  5. package/data/embeddings_basic.json +1 -1
  6. package/data/embeddings_hardware.json +1 -1
  7. package/data/embeddings_mixed.json +1 -1
  8. package/data/embeddings_other.json +1 -1
  9. package/data/graphics/petscii-style-guide.md +4 -4
  10. package/data/graphics/sprite-charset-best-practices.md +9 -9
  11. package/data/vice/vice-binary-monitor-spec.md +938 -0
  12. package/dist/.tsbuildinfo +1 -1
  13. package/dist/c64Client.js +76 -2
  14. package/dist/device.js +129 -13
  15. package/dist/mcp-server.js +1 -1
  16. package/dist/prompts/registry.js +27 -25
  17. package/dist/rag/indexer.js +18 -8
  18. package/dist/rag/knowledgeIndex.js +112 -79
  19. package/dist/rag/resourceUris.js +93 -0
  20. package/dist/sidwaveCompiler.js +1 -1
  21. package/dist/{assemblyConverter.js → tools/assember.js} +10 -1
  22. package/dist/tools/audio.js +11 -11
  23. package/dist/{basicConverter.js → tools/basicTokenizer.js} +1 -1
  24. package/dist/tools/debug.js +159 -6
  25. package/dist/tools/developer.js +13 -13
  26. package/dist/tools/disassembler.js +478 -0
  27. package/dist/tools/graphics.js +10 -10
  28. package/dist/tools/input.js +338 -0
  29. package/dist/tools/machineControl.js +5 -5
  30. package/dist/tools/memory.js +336 -12
  31. package/dist/tools/meta/index.js +1 -1
  32. package/dist/tools/printer.js +11 -12
  33. package/dist/tools/programRunners.js +61 -22
  34. package/dist/tools/rag.js +9 -9
  35. package/dist/tools/registry/batch.js +167 -0
  36. package/dist/tools/registry/config.js +1 -1
  37. package/dist/tools/registry/disk.js +1 -1
  38. package/dist/tools/registry/drive.js +1 -1
  39. package/dist/tools/registry/extract.js +1 -1
  40. package/dist/tools/registry/graphics.js +102 -2
  41. package/dist/tools/registry/index.js +4 -0
  42. package/dist/tools/registry/input.js +2 -0
  43. package/dist/tools/registry/memory.js +62 -2
  44. package/dist/tools/registry/platform.js +1 -1
  45. package/dist/tools/registry/printer.js +1 -1
  46. package/dist/tools/registry/program.js +1 -1
  47. package/dist/tools/registry/rag.js +1 -1
  48. package/dist/tools/registry/sound.js +1 -1
  49. package/dist/tools/registry/stream.js +1 -1
  50. package/dist/tools/registry/system.js +1 -1
  51. package/dist/tools/schema.js +4 -5
  52. package/dist/tools/storage.js +15 -15
  53. package/dist/tools/streaming.js +3 -3
  54. package/dist/tools/symbolRegistry.js +49 -0
  55. package/dist/tools/types.js +56 -4
  56. package/dist/tools/vice.js +2 -5
  57. package/dist/vice/process.js +120 -2
  58. package/dist/vice/readiness.js +35 -0
  59. package/dist/vice/smokeOptions.js +44 -0
  60. package/dist/vice/viceClient.js +5 -1
  61. package/dist/viceRunner.js +2 -0
  62. package/doc/plans/prompts/README.md +7 -7
  63. package/mcp/prompts.json +42 -59
  64. package/mcp/protocol-examples.json +2 -2
  65. package/mcp/resources.json +179 -166
  66. package/mcp/schemas/c64_batch.schema.json +53 -0
  67. package/mcp/schemas/c64_config.schema.json +525 -283
  68. package/mcp/schemas/c64_debug.schema.json +763 -304
  69. package/mcp/schemas/c64_disk.schema.json +499 -243
  70. package/mcp/schemas/c64_drive.schema.json +165 -90
  71. package/mcp/schemas/c64_extract.schema.json +533 -274
  72. package/mcp/schemas/c64_graphics.schema.json +607 -295
  73. package/mcp/schemas/c64_input.schema.json +136 -0
  74. package/mcp/schemas/c64_memory.schema.json +637 -128
  75. package/mcp/schemas/c64_printer.schema.json +393 -196
  76. package/mcp/schemas/c64_program.schema.json +699 -340
  77. package/mcp/schemas/c64_rag.schema.json +100 -54
  78. package/mcp/schemas/c64_select_backend.schema.json +49 -23
  79. package/mcp/schemas/c64_sound.schema.json +1092 -577
  80. package/mcp/schemas/c64_stream.schema.json +89 -47
  81. package/mcp/schemas/c64_system.schema.json +351 -185
  82. package/mcp/schemas/c64_vice.schema.json +85 -47
  83. package/mcp/server.json +1 -1
  84. package/mcp/tools.json +7299 -3346
  85. package/mcp.json +3 -3
  86. package/package.json +17 -14
  87. package/scripts/fetch-external-sources.mjs +1 -2
  88. package/scripts/run-coverage.mjs +33 -1
  89. package/scripts/run-tests.mjs +2 -2
  90. package/scripts/run-tests.ts +275 -52
  91. package/scripts/update-readme.ts +132 -3
  92. package/server.json +2 -2
@@ -1,391 +1,750 @@
1
1
  {
2
2
  "type": "object",
3
- "description": "Program operations available via the c64_program tool.",
4
- "oneOf": [
5
- {
6
- "type": "object",
7
- "description": "Load a PRG from Ultimate storage without executing it.",
8
- "properties": {
9
- "path": {
10
- "type": "string",
11
- "description": "Path to the PRG image. Use an Ultimate-visible filesystem path on c64u, or a host-local filesystem path on VICE.",
12
- "minLength": 1
3
+ "properties": {
4
+ "op": {
5
+ "type": "string",
6
+ "enum": [
7
+ "load_prg",
8
+ "run_prg",
9
+ "run_crt",
10
+ "upload_run_basic",
11
+ "upload_run_asm",
12
+ "batch_run",
13
+ "bundle_run",
14
+ "cross_platform_greeting"
15
+ ],
16
+ "description": "Selects the operation."
17
+ },
18
+ "path": {
19
+ "type": "string",
20
+ "description": "Path to the PRG image. Use an Ultimate-visible filesystem path on c64u, or a host-local filesystem path on VICE.",
21
+ "minLength": 1
22
+ },
23
+ "symbolsFile": {
24
+ "type": [
25
+ "string",
26
+ "null"
27
+ ],
28
+ "description": "Path to a VICE symbol file (.vs) to load alongside the PRG. Symbols are used by the disassemble tool when annotating addresses.",
29
+ "minLength": 1
30
+ },
31
+ "program": {
32
+ "type": "string",
33
+ "description": "Commodore BASIC v2 program source to upload and run.",
34
+ "minLength": 1
35
+ },
36
+ "verify": {
37
+ "type": "boolean",
38
+ "description": "Run post-execution polling to ensure the BASIC program executed without errors.",
39
+ "default": false
40
+ },
41
+ "programs": {
42
+ "type": "array",
43
+ "items": {
44
+ "type": "object",
45
+ "description": "Program to run with assertions",
46
+ "properties": {
47
+ "path": {
48
+ "type": "string",
49
+ "description": "Program path (PRG or CRT)",
50
+ "minLength": 1
51
+ },
52
+ "assertions": {
53
+ "type": [
54
+ "array",
55
+ "null"
56
+ ],
57
+ "items": {
58
+ "type": "object",
59
+ "description": "Assertion to check after run",
60
+ "properties": {
61
+ "type": {
62
+ "type": "string",
63
+ "description": "Assertion type",
64
+ "enum": [
65
+ "screen_contains",
66
+ "memory_equals",
67
+ "sid_silent"
68
+ ]
69
+ },
70
+ "pattern": {
71
+ "type": [
72
+ "string",
73
+ "null"
74
+ ],
75
+ "description": "Pattern for screen_contains",
76
+ "minLength": 1
77
+ },
78
+ "address": {
79
+ "type": [
80
+ "string",
81
+ "null"
82
+ ],
83
+ "description": "Address for memory_equals",
84
+ "minLength": 1
85
+ },
86
+ "expected": {
87
+ "type": [
88
+ "string",
89
+ "null"
90
+ ],
91
+ "description": "Expected value (hex)",
92
+ "minLength": 1
93
+ }
94
+ },
95
+ "required": [
96
+ "type"
97
+ ],
98
+ "additionalProperties": false
99
+ }
100
+ }
13
101
  },
14
- "op": {
15
- "const": "load_prg"
16
- }
102
+ "required": [
103
+ "path"
104
+ ],
105
+ "additionalProperties": false
106
+ }
107
+ },
108
+ "continueOnError": {
109
+ "type": [
110
+ "boolean",
111
+ "null"
112
+ ],
113
+ "description": "Continue running programs after assertion failure",
114
+ "default": false
115
+ },
116
+ "durationMs": {
117
+ "type": [
118
+ "integer",
119
+ "null"
120
+ ],
121
+ "description": "Duration to run each program before assertions",
122
+ "minimum": 1,
123
+ "default": 2000
124
+ },
125
+ "outputPath": {
126
+ "type": [
127
+ "string",
128
+ "null"
129
+ ],
130
+ "description": "Output directory for test results",
131
+ "minLength": 1
132
+ },
133
+ "resetDelayMs": {
134
+ "type": [
135
+ "integer",
136
+ "null"
137
+ ],
138
+ "description": "Delay after reset operations to allow the platform to settle.",
139
+ "minimum": 0,
140
+ "maximum": 1000,
141
+ "default": 100
142
+ },
143
+ "runId": {
144
+ "type": "string",
145
+ "description": "Unique identifier for this run",
146
+ "minLength": 1
147
+ },
148
+ "captureScreen": {
149
+ "type": [
150
+ "boolean",
151
+ "null"
152
+ ],
153
+ "description": "Capture screen content",
154
+ "default": true
155
+ },
156
+ "memoryRanges": {
157
+ "type": [
158
+ "array",
159
+ "null"
160
+ ],
161
+ "items": {
162
+ "type": "object",
163
+ "description": "Memory range to snapshot",
164
+ "properties": {
165
+ "address": {
166
+ "type": "string",
167
+ "description": "Start address",
168
+ "minLength": 1
169
+ },
170
+ "length": {
171
+ "type": "integer",
172
+ "description": "Length in bytes",
173
+ "minimum": 1
174
+ }
175
+ },
176
+ "required": [
177
+ "address",
178
+ "length"
179
+ ],
180
+ "additionalProperties": false
181
+ }
182
+ },
183
+ "captureDebugReg": {
184
+ "type": [
185
+ "boolean",
186
+ "null"
187
+ ],
188
+ "description": "Capture debugreg state",
189
+ "default": true
190
+ },
191
+ "platforms": {
192
+ "type": [
193
+ "array",
194
+ "null"
195
+ ],
196
+ "items": {
197
+ "type": "string",
198
+ "description": "Backends to target in sequence.",
199
+ "minLength": 1,
200
+ "enum": [
201
+ "vice",
202
+ "c64u"
203
+ ]
17
204
  },
205
+ "default": [
206
+ "vice",
207
+ "c64u"
208
+ ]
209
+ },
210
+ "messageTemplate": {
211
+ "type": [
212
+ "string",
213
+ "null"
214
+ ],
215
+ "description": "Greeting template. Use {PLATFORM}/{BACKEND} for uppercase or {platform}/{backend} for lowercase substitution.",
216
+ "minLength": 1,
217
+ "default": "HAVE A GREAT DAY, {PLATFORM}!"
218
+ },
219
+ "captureScreenshot": {
220
+ "type": [
221
+ "boolean",
222
+ "null"
223
+ ],
224
+ "description": "Capture a framebuffer screenshot and save it as a PNG per backend.",
225
+ "default": true
226
+ },
227
+ "restoreActiveBackend": {
228
+ "type": [
229
+ "boolean",
230
+ "null"
231
+ ],
232
+ "description": "Restore the backend that was active before the workflow started.",
233
+ "default": true
234
+ },
235
+ "timeoutMs": {
236
+ "type": [
237
+ "integer",
238
+ "null"
239
+ ],
240
+ "description": "Maximum time to wait for each greeting to appear on screen.",
241
+ "minimum": 100,
242
+ "maximum": 5000,
243
+ "default": 1500
244
+ },
245
+ "pollIntervalMs": {
246
+ "type": [
247
+ "integer",
248
+ "null"
249
+ ],
250
+ "description": "Delay between screen polls while verifying the greeting.",
251
+ "minimum": 50,
252
+ "maximum": 1000,
253
+ "default": 100
254
+ }
255
+ },
256
+ "required": [
257
+ "op"
258
+ ],
259
+ "description": "Program operations available via the c64_program tool.\n\nOperations:\n- load_prg: Load a PRG from Ultimate storage without executing it. Required inputs: path. Optional inputs: symbolsFile.\n- run_prg: Load and execute a PRG from Ultimate-visible storage on c64u or a host-local path on VICE. Required inputs: path. Optional inputs: symbolsFile.\n- run_crt: Mount and run a CRT cartridge image. Required inputs: path.\n- upload_run_basic: Upload Commodore BASIC v2 source and execute it immediately. Required inputs: program. Optional inputs: verify.\n- upload_run_asm: Assemble 6502/6510 source, upload the PRG, and execute it. Required inputs: program. Optional inputs: verify.\n- batch_run: Run multiple PRG/CRT programs with post-run assertions. Required inputs: programs. Optional inputs: continueOnError, durationMs, outputPath, resetDelayMs.\n- bundle_run: Capture screen, memory, and debug registers into an artifact bundle. Required inputs: runId, outputPath. Optional inputs: captureScreen, memoryRanges, captureDebugReg.\n- cross_platform_greeting: Show a platform-customized greeting on one or more configured backends, capture screenshots, and verify the results. Required inputs: none. Optional inputs: platforms, messageTemplate, verify, captureScreenshot, outputPath, restoreActiveBackend, timeoutMs, pollIntervalMs.",
260
+ "additionalProperties": false,
261
+ "x-c64bridge-operations": [
262
+ {
263
+ "op": "load_prg",
264
+ "description": "Load a PRG from Ultimate storage without executing it.",
18
265
  "required": [
19
- "path",
20
- "op"
266
+ "path"
21
267
  ],
22
- "additionalProperties": false
268
+ "optional": [
269
+ "symbolsFile"
270
+ ],
271
+ "inputSchema": {
272
+ "type": "object",
273
+ "description": "Load a PRG from Ultimate storage without executing it.",
274
+ "properties": {
275
+ "path": {
276
+ "type": "string",
277
+ "description": "Path to the PRG image. Use an Ultimate-visible filesystem path on c64u, or a host-local filesystem path on VICE.",
278
+ "minLength": 1
279
+ },
280
+ "symbolsFile": {
281
+ "type": [
282
+ "string",
283
+ "null"
284
+ ],
285
+ "description": "Path to a VICE symbol file (.vs) to load alongside the PRG. Symbols are used by the disassemble tool when annotating addresses.",
286
+ "minLength": 1
287
+ },
288
+ "op": {
289
+ "const": "load_prg"
290
+ }
291
+ },
292
+ "required": [
293
+ "path",
294
+ "op"
295
+ ],
296
+ "additionalProperties": false
297
+ }
23
298
  },
24
299
  {
25
- "type": "object",
300
+ "op": "run_prg",
26
301
  "description": "Load and execute a PRG from Ultimate-visible storage on c64u or a host-local path on VICE.",
27
- "properties": {
28
- "path": {
29
- "type": "string",
30
- "description": "Path to the PRG image. Use an Ultimate-visible filesystem path on c64u, or a host-local filesystem path on VICE.",
31
- "minLength": 1
32
- },
33
- "op": {
34
- "const": "run_prg"
35
- }
36
- },
37
302
  "required": [
38
- "path",
39
- "op"
303
+ "path"
304
+ ],
305
+ "optional": [
306
+ "symbolsFile"
40
307
  ],
41
- "additionalProperties": false
308
+ "inputSchema": {
309
+ "type": "object",
310
+ "description": "Load and execute a PRG from Ultimate-visible storage on c64u or a host-local path on VICE.",
311
+ "properties": {
312
+ "path": {
313
+ "type": "string",
314
+ "description": "Path to the PRG image. Use an Ultimate-visible filesystem path on c64u, or a host-local filesystem path on VICE.",
315
+ "minLength": 1
316
+ },
317
+ "symbolsFile": {
318
+ "type": [
319
+ "string",
320
+ "null"
321
+ ],
322
+ "description": "Path to a VICE symbol file (.vs) to load alongside the PRG. Symbols are used by the disassemble tool when annotating addresses.",
323
+ "minLength": 1
324
+ },
325
+ "op": {
326
+ "const": "run_prg"
327
+ }
328
+ },
329
+ "required": [
330
+ "path",
331
+ "op"
332
+ ],
333
+ "additionalProperties": false
334
+ }
42
335
  },
43
336
  {
44
- "type": "object",
337
+ "op": "run_crt",
45
338
  "description": "Mount and run a CRT cartridge image.",
46
- "properties": {
47
- "path": {
48
- "type": "string",
49
- "description": "Path to the CRT image on Ultimate-visible storage. CRT mounting is only supported on c64u.",
50
- "minLength": 1
51
- },
52
- "op": {
53
- "const": "run_crt"
54
- }
55
- },
56
339
  "required": [
57
- "path",
58
- "op"
340
+ "path"
59
341
  ],
60
- "additionalProperties": false
342
+ "optional": [],
343
+ "inputSchema": {
344
+ "type": "object",
345
+ "description": "Mount and run a CRT cartridge image.",
346
+ "properties": {
347
+ "path": {
348
+ "type": "string",
349
+ "description": "Path to the CRT image on Ultimate-visible storage. CRT mounting is only supported on c64u.",
350
+ "minLength": 1
351
+ },
352
+ "op": {
353
+ "const": "run_crt"
354
+ }
355
+ },
356
+ "required": [
357
+ "path",
358
+ "op"
359
+ ],
360
+ "additionalProperties": false
361
+ }
61
362
  },
62
363
  {
63
- "type": "object",
364
+ "op": "upload_run_basic",
64
365
  "description": "Upload Commodore BASIC v2 source and execute it immediately.",
65
- "properties": {
66
- "program": {
67
- "type": "string",
68
- "description": "Commodore BASIC v2 program source to upload and run.",
69
- "minLength": 1
70
- },
71
- "verify": {
72
- "type": "boolean",
73
- "description": "Run post-execution polling to ensure the BASIC program executed without errors.",
74
- "default": false
75
- },
76
- "op": {
77
- "const": "upload_run_basic"
78
- }
79
- },
80
366
  "required": [
81
- "program",
82
- "op"
367
+ "program"
368
+ ],
369
+ "optional": [
370
+ "verify"
83
371
  ],
84
- "additionalProperties": false
372
+ "inputSchema": {
373
+ "type": "object",
374
+ "description": "Upload Commodore BASIC v2 source and execute it immediately.",
375
+ "properties": {
376
+ "program": {
377
+ "type": "string",
378
+ "description": "Commodore BASIC v2 program source to upload and run.",
379
+ "minLength": 1
380
+ },
381
+ "verify": {
382
+ "type": "boolean",
383
+ "description": "Run post-execution polling to ensure the BASIC program executed without errors.",
384
+ "default": false
385
+ },
386
+ "op": {
387
+ "const": "upload_run_basic"
388
+ }
389
+ },
390
+ "required": [
391
+ "program",
392
+ "op"
393
+ ],
394
+ "additionalProperties": false
395
+ }
85
396
  },
86
397
  {
87
- "type": "object",
398
+ "op": "upload_run_asm",
88
399
  "description": "Assemble 6502/6510 source, upload the PRG, and execute it.",
89
- "properties": {
90
- "program": {
91
- "type": "string",
92
- "description": "Assembly source that will be assembled to a PRG and executed.",
93
- "minLength": 1
94
- },
95
- "verify": {
96
- "type": "boolean",
97
- "description": "Run post-execution polling to confirm the assembly program remained stable.",
98
- "default": false
99
- },
100
- "op": {
101
- "const": "upload_run_asm"
102
- }
103
- },
104
400
  "required": [
105
- "program",
106
- "op"
401
+ "program"
402
+ ],
403
+ "optional": [
404
+ "verify"
107
405
  ],
108
- "additionalProperties": false
406
+ "inputSchema": {
407
+ "type": "object",
408
+ "description": "Assemble 6502/6510 source, upload the PRG, and execute it.",
409
+ "properties": {
410
+ "program": {
411
+ "type": "string",
412
+ "description": "Assembly source that will be assembled to a PRG and executed.",
413
+ "minLength": 1
414
+ },
415
+ "verify": {
416
+ "type": "boolean",
417
+ "description": "Run post-execution polling to confirm the assembly program remained stable.",
418
+ "default": false
419
+ },
420
+ "op": {
421
+ "const": "upload_run_asm"
422
+ }
423
+ },
424
+ "required": [
425
+ "program",
426
+ "op"
427
+ ],
428
+ "additionalProperties": false
429
+ }
109
430
  },
110
431
  {
111
- "type": "object",
432
+ "op": "batch_run",
112
433
  "description": "Run multiple PRG/CRT programs with post-run assertions.",
113
- "properties": {
114
- "programs": {
115
- "type": "array",
116
- "items": {
117
- "type": "object",
118
- "description": "Program to run with assertions",
119
- "properties": {
120
- "path": {
121
- "type": "string",
122
- "description": "Program path (PRG or CRT)",
123
- "minLength": 1
124
- },
125
- "assertions": {
126
- "type": [
127
- "array",
128
- "null"
129
- ],
130
- "items": {
131
- "type": "object",
132
- "description": "Assertion to check after run",
133
- "properties": {
134
- "type": {
135
- "type": "string",
136
- "description": "Assertion type",
137
- "enum": [
138
- "screen_contains",
139
- "memory_equals",
140
- "sid_silent"
141
- ]
142
- },
143
- "pattern": {
144
- "type": [
145
- "string",
146
- "null"
147
- ],
148
- "description": "Pattern for screen_contains",
149
- "minLength": 1
150
- },
151
- "address": {
152
- "type": [
153
- "string",
154
- "null"
155
- ],
156
- "description": "Address for memory_equals",
157
- "minLength": 1
158
- },
159
- "expected": {
160
- "type": [
161
- "string",
162
- "null"
163
- ],
164
- "description": "Expected value (hex)",
165
- "minLength": 1
166
- }
167
- },
168
- "required": [
169
- "type"
434
+ "required": [
435
+ "programs"
436
+ ],
437
+ "optional": [
438
+ "continueOnError",
439
+ "durationMs",
440
+ "outputPath",
441
+ "resetDelayMs"
442
+ ],
443
+ "inputSchema": {
444
+ "type": "object",
445
+ "description": "Run multiple PRG/CRT programs with post-run assertions.",
446
+ "properties": {
447
+ "programs": {
448
+ "type": "array",
449
+ "items": {
450
+ "type": "object",
451
+ "description": "Program to run with assertions",
452
+ "properties": {
453
+ "path": {
454
+ "type": "string",
455
+ "description": "Program path (PRG or CRT)",
456
+ "minLength": 1
457
+ },
458
+ "assertions": {
459
+ "type": [
460
+ "array",
461
+ "null"
170
462
  ],
171
- "additionalProperties": false
463
+ "items": {
464
+ "type": "object",
465
+ "description": "Assertion to check after run",
466
+ "properties": {
467
+ "type": {
468
+ "type": "string",
469
+ "description": "Assertion type",
470
+ "enum": [
471
+ "screen_contains",
472
+ "memory_equals",
473
+ "sid_silent"
474
+ ]
475
+ },
476
+ "pattern": {
477
+ "type": [
478
+ "string",
479
+ "null"
480
+ ],
481
+ "description": "Pattern for screen_contains",
482
+ "minLength": 1
483
+ },
484
+ "address": {
485
+ "type": [
486
+ "string",
487
+ "null"
488
+ ],
489
+ "description": "Address for memory_equals",
490
+ "minLength": 1
491
+ },
492
+ "expected": {
493
+ "type": [
494
+ "string",
495
+ "null"
496
+ ],
497
+ "description": "Expected value (hex)",
498
+ "minLength": 1
499
+ }
500
+ },
501
+ "required": [
502
+ "type"
503
+ ],
504
+ "additionalProperties": false
505
+ }
172
506
  }
173
- }
174
- },
175
- "required": [
176
- "path"
507
+ },
508
+ "required": [
509
+ "path"
510
+ ],
511
+ "additionalProperties": false
512
+ }
513
+ },
514
+ "continueOnError": {
515
+ "type": [
516
+ "boolean",
517
+ "null"
518
+ ],
519
+ "description": "Continue running programs after assertion failure",
520
+ "default": false
521
+ },
522
+ "durationMs": {
523
+ "type": [
524
+ "integer",
525
+ "null"
526
+ ],
527
+ "description": "Duration to run each program before assertions",
528
+ "minimum": 1,
529
+ "default": 2000
530
+ },
531
+ "outputPath": {
532
+ "type": [
533
+ "string",
534
+ "null"
535
+ ],
536
+ "description": "Output directory for test results",
537
+ "minLength": 1
538
+ },
539
+ "resetDelayMs": {
540
+ "type": [
541
+ "integer",
542
+ "null"
177
543
  ],
178
- "additionalProperties": false
544
+ "description": "Delay after reset operations to allow the platform to settle.",
545
+ "minimum": 0,
546
+ "maximum": 1000,
547
+ "default": 100
548
+ },
549
+ "op": {
550
+ "const": "batch_run"
179
551
  }
180
552
  },
181
- "continueOnError": {
182
- "type": [
183
- "boolean",
184
- "null"
185
- ],
186
- "description": "Continue running programs after assertion failure",
187
- "default": false
188
- },
189
- "durationMs": {
190
- "type": [
191
- "integer",
192
- "null"
193
- ],
194
- "description": "Duration to run each program before assertions",
195
- "minimum": 1,
196
- "default": 2000
197
- },
198
- "outputPath": {
199
- "type": [
200
- "string",
201
- "null"
202
- ],
203
- "description": "Output directory for test results",
204
- "minLength": 1
205
- },
206
- "resetDelayMs": {
207
- "type": [
208
- "integer",
209
- "null"
210
- ],
211
- "description": "Delay after reset operations to allow the platform to settle.",
212
- "minimum": 0,
213
- "maximum": 1000,
214
- "default": 100
215
- },
216
- "op": {
217
- "const": "batch_run"
218
- }
219
- },
220
- "required": [
221
- "programs",
222
- "op"
223
- ],
224
- "additionalProperties": false
553
+ "required": [
554
+ "programs",
555
+ "op"
556
+ ],
557
+ "additionalProperties": false
558
+ }
225
559
  },
226
560
  {
227
- "type": "object",
561
+ "op": "bundle_run",
228
562
  "description": "Capture screen, memory, and debug registers into an artifact bundle.",
229
- "properties": {
230
- "runId": {
231
- "type": "string",
232
- "description": "Unique identifier for this run",
233
- "minLength": 1
234
- },
235
- "outputPath": {
236
- "type": "string",
237
- "description": "Output directory for artifacts bundle",
238
- "minLength": 1
239
- },
240
- "captureScreen": {
241
- "type": [
242
- "boolean",
243
- "null"
244
- ],
245
- "description": "Capture screen content",
246
- "default": true
247
- },
248
- "memoryRanges": {
249
- "type": [
250
- "array",
251
- "null"
252
- ],
253
- "items": {
254
- "type": "object",
255
- "description": "Memory range to snapshot",
256
- "properties": {
257
- "address": {
258
- "type": "string",
259
- "description": "Start address",
260
- "minLength": 1
563
+ "required": [
564
+ "runId",
565
+ "outputPath"
566
+ ],
567
+ "optional": [
568
+ "captureScreen",
569
+ "memoryRanges",
570
+ "captureDebugReg"
571
+ ],
572
+ "inputSchema": {
573
+ "type": "object",
574
+ "description": "Capture screen, memory, and debug registers into an artifact bundle.",
575
+ "properties": {
576
+ "runId": {
577
+ "type": "string",
578
+ "description": "Unique identifier for this run",
579
+ "minLength": 1
580
+ },
581
+ "outputPath": {
582
+ "type": "string",
583
+ "description": "Output directory for artifacts bundle",
584
+ "minLength": 1
585
+ },
586
+ "captureScreen": {
587
+ "type": [
588
+ "boolean",
589
+ "null"
590
+ ],
591
+ "description": "Capture screen content",
592
+ "default": true
593
+ },
594
+ "memoryRanges": {
595
+ "type": [
596
+ "array",
597
+ "null"
598
+ ],
599
+ "items": {
600
+ "type": "object",
601
+ "description": "Memory range to snapshot",
602
+ "properties": {
603
+ "address": {
604
+ "type": "string",
605
+ "description": "Start address",
606
+ "minLength": 1
607
+ },
608
+ "length": {
609
+ "type": "integer",
610
+ "description": "Length in bytes",
611
+ "minimum": 1
612
+ }
261
613
  },
262
- "length": {
263
- "type": "integer",
264
- "description": "Length in bytes",
265
- "minimum": 1
266
- }
267
- },
268
- "required": [
269
- "address",
270
- "length"
614
+ "required": [
615
+ "address",
616
+ "length"
617
+ ],
618
+ "additionalProperties": false
619
+ }
620
+ },
621
+ "captureDebugReg": {
622
+ "type": [
623
+ "boolean",
624
+ "null"
271
625
  ],
272
- "additionalProperties": false
626
+ "description": "Capture debugreg state",
627
+ "default": true
628
+ },
629
+ "op": {
630
+ "const": "bundle_run"
273
631
  }
274
632
  },
275
- "captureDebugReg": {
276
- "type": [
277
- "boolean",
278
- "null"
279
- ],
280
- "description": "Capture debugreg state",
281
- "default": true
282
- },
283
- "op": {
284
- "const": "bundle_run"
285
- }
286
- },
287
- "required": [
288
- "runId",
289
- "outputPath",
290
- "op"
291
- ],
292
- "additionalProperties": false
633
+ "required": [
634
+ "runId",
635
+ "outputPath",
636
+ "op"
637
+ ],
638
+ "additionalProperties": false
639
+ }
293
640
  },
294
641
  {
295
- "type": "object",
642
+ "op": "cross_platform_greeting",
296
643
  "description": "Show a platform-customized greeting on one or more configured backends, capture screenshots, and verify the results.",
297
- "properties": {
298
- "platforms": {
299
- "type": [
300
- "array",
301
- "null"
302
- ],
303
- "items": {
304
- "type": "string",
305
- "description": "Backends to target in sequence.",
306
- "minLength": 1,
307
- "enum": [
644
+ "required": [],
645
+ "optional": [
646
+ "platforms",
647
+ "messageTemplate",
648
+ "verify",
649
+ "captureScreenshot",
650
+ "outputPath",
651
+ "restoreActiveBackend",
652
+ "timeoutMs",
653
+ "pollIntervalMs"
654
+ ],
655
+ "inputSchema": {
656
+ "type": "object",
657
+ "description": "Show a platform-customized greeting on one or more configured backends, capture screenshots, and verify the results.",
658
+ "properties": {
659
+ "platforms": {
660
+ "type": [
661
+ "array",
662
+ "null"
663
+ ],
664
+ "items": {
665
+ "type": "string",
666
+ "description": "Backends to target in sequence.",
667
+ "minLength": 1,
668
+ "enum": [
669
+ "vice",
670
+ "c64u"
671
+ ]
672
+ },
673
+ "default": [
308
674
  "vice",
309
675
  "c64u"
310
676
  ]
311
677
  },
312
- "default": [
313
- "vice",
314
- "c64u"
315
- ]
316
- },
317
- "messageTemplate": {
318
- "type": [
319
- "string",
320
- "null"
321
- ],
322
- "description": "Greeting template. Use {PLATFORM}/{BACKEND} for uppercase or {platform}/{backend} for lowercase substitution.",
323
- "minLength": 1,
324
- "default": "HAVE A GREAT DAY, {PLATFORM}!"
325
- },
326
- "verify": {
327
- "type": [
328
- "boolean",
329
- "null"
330
- ],
331
- "description": "Poll the text screen and require the rendered greeting to appear.",
332
- "default": true
333
- },
334
- "captureScreenshot": {
335
- "type": [
336
- "boolean",
337
- "null"
338
- ],
339
- "description": "Capture a framebuffer screenshot and save it as a PNG per backend.",
340
- "default": true
341
- },
342
- "outputPath": {
343
- "type": [
344
- "string",
345
- "null"
346
- ],
347
- "description": "Directory for screenshots and the workflow summary JSON.",
348
- "minLength": 1
349
- },
350
- "restoreActiveBackend": {
351
- "type": [
352
- "boolean",
353
- "null"
354
- ],
355
- "description": "Restore the backend that was active before the workflow started.",
356
- "default": true
357
- },
358
- "timeoutMs": {
359
- "type": [
360
- "integer",
361
- "null"
362
- ],
363
- "description": "Maximum time to wait for each greeting to appear on screen.",
364
- "minimum": 100,
365
- "maximum": 5000,
366
- "default": 1500
367
- },
368
- "pollIntervalMs": {
369
- "type": [
370
- "integer",
371
- "null"
372
- ],
373
- "description": "Delay between screen polls while verifying the greeting.",
374
- "minimum": 50,
375
- "maximum": 1000,
376
- "default": 100
678
+ "messageTemplate": {
679
+ "type": [
680
+ "string",
681
+ "null"
682
+ ],
683
+ "description": "Greeting template. Use {PLATFORM}/{BACKEND} for uppercase or {platform}/{backend} for lowercase substitution.",
684
+ "minLength": 1,
685
+ "default": "HAVE A GREAT DAY, {PLATFORM}!"
686
+ },
687
+ "verify": {
688
+ "type": [
689
+ "boolean",
690
+ "null"
691
+ ],
692
+ "description": "Poll the text screen and require the rendered greeting to appear.",
693
+ "default": true
694
+ },
695
+ "captureScreenshot": {
696
+ "type": [
697
+ "boolean",
698
+ "null"
699
+ ],
700
+ "description": "Capture a framebuffer screenshot and save it as a PNG per backend.",
701
+ "default": true
702
+ },
703
+ "outputPath": {
704
+ "type": [
705
+ "string",
706
+ "null"
707
+ ],
708
+ "description": "Directory for screenshots and the workflow summary JSON.",
709
+ "minLength": 1
710
+ },
711
+ "restoreActiveBackend": {
712
+ "type": [
713
+ "boolean",
714
+ "null"
715
+ ],
716
+ "description": "Restore the backend that was active before the workflow started.",
717
+ "default": true
718
+ },
719
+ "timeoutMs": {
720
+ "type": [
721
+ "integer",
722
+ "null"
723
+ ],
724
+ "description": "Maximum time to wait for each greeting to appear on screen.",
725
+ "minimum": 100,
726
+ "maximum": 5000,
727
+ "default": 1500
728
+ },
729
+ "pollIntervalMs": {
730
+ "type": [
731
+ "integer",
732
+ "null"
733
+ ],
734
+ "description": "Delay between screen polls while verifying the greeting.",
735
+ "minimum": 50,
736
+ "maximum": 1000,
737
+ "default": 100
738
+ },
739
+ "op": {
740
+ "const": "cross_platform_greeting"
741
+ }
377
742
  },
378
- "op": {
379
- "const": "cross_platform_greeting"
380
- }
381
- },
382
- "additionalProperties": false,
383
- "required": [
384
- "op"
385
- ]
743
+ "additionalProperties": false,
744
+ "required": [
745
+ "op"
746
+ ]
747
+ }
386
748
  }
387
- ],
388
- "discriminator": {
389
- "propertyName": "op"
390
- }
749
+ ]
391
750
  }