c64bridge 0.7.4 → 0.8.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 (109) hide show
  1. package/.github/prompts/README.md +14 -4
  2. package/.github/prompts/assembly-routine-session.prompt.md +9 -9
  3. package/.github/prompts/basic-program-session.prompt.md +11 -9
  4. package/.github/prompts/drive-management-session.prompt.md +9 -9
  5. package/.github/prompts/hello-world-session.prompt.md +17 -0
  6. package/.github/prompts/petscii-art-session.prompt.md +9 -9
  7. package/.github/prompts/play-classic-game.prompt.md +9 -9
  8. package/.github/prompts/pr-converge.prompt.md +13 -0
  9. package/.github/prompts/sid-music-session.prompt.md +9 -9
  10. package/AGENTS.md +59 -60
  11. package/README.md +550 -191
  12. package/data/assembly/assembly-spec.md +290 -1
  13. package/data/context/bootstrap.md +26 -2
  14. package/data/context/fast-paths.md +44 -0
  15. package/data/graphics/petscii-style-guide.md +6 -2
  16. package/data/graphics/sprite-charset-best-practices.md +5 -5
  17. package/dist/.tsbuildinfo +1 -1
  18. package/dist/c64Client.js +990 -26
  19. package/dist/config.js +5 -1
  20. package/dist/device.js +680 -57
  21. package/dist/diagnostics.js +371 -0
  22. package/dist/mcp/metadata.js +39 -0
  23. package/dist/mcp-server.js +170 -20
  24. package/dist/platform.js +10 -2
  25. package/dist/prompts/registry.js +166 -309
  26. package/dist/rag/init.js +37 -1
  27. package/dist/rag/knowledgeIndex.js +18 -6
  28. package/dist/rag/rateLimiter.js +2 -2
  29. package/dist/streamCapture.js +135 -0
  30. package/dist/tools/audio.js +3 -1
  31. package/dist/tools/debug.js +470 -0
  32. package/dist/tools/developer.js +10 -4
  33. package/dist/tools/graphics.js +183 -17
  34. package/dist/tools/machineControl.js +11 -5
  35. package/dist/tools/memory.js +19 -10
  36. package/dist/tools/meta/audio.js +240 -1
  37. package/dist/tools/meta/config.js +20 -28
  38. package/dist/tools/meta/configInventory.js +104 -0
  39. package/dist/tools/meta/diagnostics.js +45 -2
  40. package/dist/tools/meta/graphics.js +14 -6
  41. package/dist/tools/meta/index.js +1 -0
  42. package/dist/tools/meta/memory.js +20 -6
  43. package/dist/tools/meta/program.js +473 -0
  44. package/dist/tools/pollValidator.js +4 -2
  45. package/dist/tools/programRunners.js +8 -4
  46. package/dist/tools/registry/config.js +17 -0
  47. package/dist/tools/registry/disk.js +7 -0
  48. package/dist/tools/registry/drive.js +3 -0
  49. package/dist/tools/registry/graphics.js +111 -27
  50. package/dist/tools/registry/index.js +6 -0
  51. package/dist/tools/registry/memory.js +1 -0
  52. package/dist/tools/registry/platform.js +121 -0
  53. package/dist/tools/registry/program.js +26 -8
  54. package/dist/tools/registry/sound.js +96 -0
  55. package/dist/tools/registry/system.js +15 -2
  56. package/dist/tools/storage.js +1 -0
  57. package/dist/tools/streaming.js +1 -0
  58. package/dist/tools/types.js +38 -4
  59. package/dist/tools/vice.js +160 -0
  60. package/dist/vicBitmap.js +317 -0
  61. package/dist/vice/mockServer.js +439 -0
  62. package/dist/vice/process.js +310 -0
  63. package/dist/vice/readiness.js +18 -2
  64. package/dist/vice/viceClient.js +382 -22
  65. package/doc/developer.md +71 -25
  66. package/doc/img/backend-switch/hello-c64u.png +0 -0
  67. package/doc/img/backend-switch/hello-vice-and-c64u.png +0 -0
  68. package/doc/img/backend-switch/hello-vice.png +0 -0
  69. package/doc/img/backend-switch/metadata.json +50 -0
  70. package/doc/plans/vice-backend-switch/plan.md +486 -0
  71. package/doc/plans/vice-backend-switch-2/plan.md +48 -0
  72. package/doc/plans/vice-support/notes.md +1 -0
  73. package/doc/plans/vice-support/plan.md +5 -0
  74. package/doc/plans/vice-support/rollout.md +23 -17
  75. package/doc/reviews/vice-support-review.md +185 -0
  76. package/doc/troubleshooting-mcp.md +35 -6
  77. package/doc/vice/support-matrix.md +54 -0
  78. package/mcp/prompts.json +292 -0
  79. package/mcp/protocol-examples.json +46 -0
  80. package/mcp/resources.json +940 -0
  81. package/mcp/schemas/c64_config.schema.json +350 -0
  82. package/mcp/schemas/c64_debug.schema.json +380 -0
  83. package/mcp/schemas/c64_disk.schema.json +278 -0
  84. package/mcp/schemas/c64_drive.schema.json +120 -0
  85. package/mcp/schemas/c64_extract.schema.json +302 -0
  86. package/mcp/schemas/c64_graphics.schema.json +333 -0
  87. package/mcp/schemas/c64_memory.schema.json +155 -0
  88. package/mcp/schemas/c64_printer.schema.json +218 -0
  89. package/mcp/schemas/c64_program.schema.json +391 -0
  90. package/mcp/schemas/c64_rag.schema.json +67 -0
  91. package/mcp/schemas/c64_select_backend.schema.json +32 -0
  92. package/mcp/schemas/c64_sound.schema.json +644 -0
  93. package/mcp/schemas/c64_stream.schema.json +61 -0
  94. package/mcp/schemas/c64_system.schema.json +227 -0
  95. package/mcp/schemas/c64_vice.schema.json +63 -0
  96. package/mcp/server.json +15 -0
  97. package/mcp/tools.json +4517 -0
  98. package/mcp.json +90 -15
  99. package/package.json +11 -4
  100. package/scripts/capture-backend-switch-screenshots.mjs +276 -0
  101. package/scripts/generate-mcp-interface.ts +289 -0
  102. package/scripts/invoke-bun.mjs +67 -21
  103. package/scripts/mockC64Server.mjs +162 -6
  104. package/scripts/prepare-release.mjs +59 -2
  105. package/scripts/run-coverage.mjs +284 -0
  106. package/scripts/run-tests.mjs +95 -39
  107. package/scripts/run-tests.ts +378 -73
  108. package/scripts/update-readme.ts +147 -13
  109. package/server.json +94 -0
@@ -0,0 +1,380 @@
1
+ {
2
+ "type": "object",
3
+ "description": "Available debugger operations.",
4
+ "oneOf": [
5
+ {
6
+ "type": "object",
7
+ "description": "List all active VICE checkpoints (breakpoints).",
8
+ "properties": {
9
+ "op": {
10
+ "const": "list_checkpoints"
11
+ }
12
+ },
13
+ "required": [
14
+ "op"
15
+ ],
16
+ "additionalProperties": false
17
+ },
18
+ {
19
+ "type": "object",
20
+ "description": "Fetch a single checkpoint by id.",
21
+ "properties": {
22
+ "op": {
23
+ "const": "get_checkpoint"
24
+ },
25
+ "id": {
26
+ "type": "integer",
27
+ "description": "Debugger checkpoint identifier.",
28
+ "minimum": 1
29
+ }
30
+ },
31
+ "required": [
32
+ "op",
33
+ "id"
34
+ ],
35
+ "additionalProperties": false
36
+ },
37
+ {
38
+ "type": "object",
39
+ "description": "Create a new checkpoint (breakpoint) in VICE.",
40
+ "properties": {
41
+ "op": {
42
+ "const": "create_checkpoint"
43
+ },
44
+ "address": {
45
+ "type": "string",
46
+ "description": "Start address (e.g. $0801).",
47
+ "minLength": 1
48
+ },
49
+ "endAddress": {
50
+ "type": [
51
+ "string",
52
+ "null"
53
+ ],
54
+ "description": "Optional end address for range.",
55
+ "minLength": 1
56
+ },
57
+ "stopOnHit": {
58
+ "type": [
59
+ "boolean",
60
+ "null"
61
+ ],
62
+ "description": "Pause execution when hit (default true).",
63
+ "default": true
64
+ },
65
+ "enabled": {
66
+ "type": [
67
+ "boolean",
68
+ "null"
69
+ ],
70
+ "description": "Whether the checkpoint is enabled (default true).",
71
+ "default": true
72
+ },
73
+ "temporary": {
74
+ "type": [
75
+ "boolean",
76
+ "null"
77
+ ],
78
+ "description": "Automatically remove after first hit.",
79
+ "default": false
80
+ },
81
+ "operations": {
82
+ "type": [
83
+ "object",
84
+ "null"
85
+ ],
86
+ "description": "Checkpoint operation filters.",
87
+ "properties": {
88
+ "execute": {
89
+ "type": [
90
+ "boolean",
91
+ "null"
92
+ ],
93
+ "description": "Trigger on execute (default true).",
94
+ "default": true
95
+ },
96
+ "load": {
97
+ "type": [
98
+ "boolean",
99
+ "null"
100
+ ],
101
+ "description": "Trigger on memory load.",
102
+ "default": false
103
+ },
104
+ "store": {
105
+ "type": [
106
+ "boolean",
107
+ "null"
108
+ ],
109
+ "description": "Trigger on memory store.",
110
+ "default": false
111
+ }
112
+ },
113
+ "additionalProperties": false
114
+ },
115
+ "memspace": {
116
+ "type": [
117
+ "integer",
118
+ "null"
119
+ ],
120
+ "description": "VICE memory space (0=CPU, 1=Drive8, etc.).",
121
+ "minimum": 0,
122
+ "maximum": 4
123
+ }
124
+ },
125
+ "required": [
126
+ "op",
127
+ "address"
128
+ ],
129
+ "additionalProperties": false
130
+ },
131
+ {
132
+ "type": "object",
133
+ "description": "Remove a checkpoint by id.",
134
+ "properties": {
135
+ "op": {
136
+ "const": "delete_checkpoint"
137
+ },
138
+ "id": {
139
+ "type": "integer",
140
+ "description": "Debugger checkpoint identifier.",
141
+ "minimum": 1
142
+ }
143
+ },
144
+ "required": [
145
+ "op",
146
+ "id"
147
+ ],
148
+ "additionalProperties": false
149
+ },
150
+ {
151
+ "type": "object",
152
+ "description": "Enable or disable a checkpoint by id.",
153
+ "properties": {
154
+ "op": {
155
+ "const": "toggle_checkpoint"
156
+ },
157
+ "id": {
158
+ "type": "integer",
159
+ "description": "Debugger checkpoint identifier.",
160
+ "minimum": 1
161
+ },
162
+ "enabled": {
163
+ "type": "boolean",
164
+ "description": "Set to true to enable, false to disable."
165
+ }
166
+ },
167
+ "required": [
168
+ "op",
169
+ "id",
170
+ "enabled"
171
+ ],
172
+ "additionalProperties": false
173
+ },
174
+ {
175
+ "type": "object",
176
+ "description": "Attach a conditional expression to a checkpoint.",
177
+ "properties": {
178
+ "op": {
179
+ "const": "set_condition"
180
+ },
181
+ "id": {
182
+ "type": "integer",
183
+ "description": "Debugger checkpoint identifier.",
184
+ "minimum": 1
185
+ },
186
+ "expression": {
187
+ "type": "string",
188
+ "description": "VICE monitor conditional expression.",
189
+ "minLength": 1
190
+ }
191
+ },
192
+ "required": [
193
+ "op",
194
+ "id",
195
+ "expression"
196
+ ],
197
+ "additionalProperties": false
198
+ },
199
+ {
200
+ "type": "object",
201
+ "description": "List available registers (metadata).",
202
+ "properties": {
203
+ "op": {
204
+ "const": "list_registers"
205
+ },
206
+ "memspace": {
207
+ "type": [
208
+ "integer",
209
+ "null"
210
+ ],
211
+ "description": "VICE memory space (0=CPU, 1=Drive8, etc.).",
212
+ "minimum": 0,
213
+ "maximum": 4
214
+ }
215
+ },
216
+ "required": [
217
+ "op"
218
+ ],
219
+ "additionalProperties": false
220
+ },
221
+ {
222
+ "type": "object",
223
+ "description": "Read register values, optionally filtered by name or id.",
224
+ "properties": {
225
+ "op": {
226
+ "const": "get_registers"
227
+ },
228
+ "memspace": {
229
+ "type": [
230
+ "integer",
231
+ "null"
232
+ ],
233
+ "description": "VICE memory space (0=CPU, 1=Drive8, etc.).",
234
+ "minimum": 0,
235
+ "maximum": 4
236
+ },
237
+ "registers": {
238
+ "type": [
239
+ "array",
240
+ "null"
241
+ ],
242
+ "description": "Registers to include.",
243
+ "items": {
244
+ "type": "object",
245
+ "description": "Selects a register by id or name.",
246
+ "properties": {
247
+ "name": {
248
+ "type": [
249
+ "string",
250
+ "null"
251
+ ],
252
+ "description": "Register name (case-insensitive)."
253
+ },
254
+ "id": {
255
+ "type": [
256
+ "integer",
257
+ "null"
258
+ ],
259
+ "description": "Register id.",
260
+ "minimum": 0
261
+ }
262
+ },
263
+ "additionalProperties": false
264
+ }
265
+ }
266
+ },
267
+ "required": [
268
+ "op"
269
+ ],
270
+ "additionalProperties": false
271
+ },
272
+ {
273
+ "type": "object",
274
+ "description": "Write register values.",
275
+ "properties": {
276
+ "op": {
277
+ "const": "set_registers"
278
+ },
279
+ "memspace": {
280
+ "type": [
281
+ "integer",
282
+ "null"
283
+ ],
284
+ "description": "VICE memory space (0=CPU, 1=Drive8, etc.).",
285
+ "minimum": 0,
286
+ "maximum": 4
287
+ },
288
+ "writes": {
289
+ "type": "array",
290
+ "description": "Register writes to apply.",
291
+ "items": {
292
+ "type": "object",
293
+ "description": "Register write descriptor.",
294
+ "properties": {
295
+ "name": {
296
+ "type": [
297
+ "string",
298
+ "null"
299
+ ],
300
+ "description": "Register name (case-insensitive)."
301
+ },
302
+ "id": {
303
+ "type": [
304
+ "integer",
305
+ "null"
306
+ ],
307
+ "description": "Register id.",
308
+ "minimum": 0
309
+ },
310
+ "value": {
311
+ "type": "integer",
312
+ "description": "Value to write.",
313
+ "minimum": 0
314
+ }
315
+ },
316
+ "required": [
317
+ "value"
318
+ ],
319
+ "additionalProperties": false
320
+ },
321
+ "minItems": 1
322
+ }
323
+ },
324
+ "required": [
325
+ "op",
326
+ "writes"
327
+ ],
328
+ "additionalProperties": false
329
+ },
330
+ {
331
+ "type": "object",
332
+ "description": "Single-step CPU execution.",
333
+ "properties": {
334
+ "op": {
335
+ "const": "step"
336
+ },
337
+ "count": {
338
+ "type": [
339
+ "integer",
340
+ "null"
341
+ ],
342
+ "description": "Number of instructions to step.",
343
+ "minimum": 1,
344
+ "default": 1
345
+ },
346
+ "mode": {
347
+ "type": [
348
+ "string",
349
+ "null"
350
+ ],
351
+ "description": "Step mode (into or over).",
352
+ "enum": [
353
+ "into",
354
+ "over"
355
+ ]
356
+ }
357
+ },
358
+ "required": [
359
+ "op"
360
+ ],
361
+ "additionalProperties": false
362
+ },
363
+ {
364
+ "type": "object",
365
+ "description": "Continue execution until the current routine returns.",
366
+ "properties": {
367
+ "op": {
368
+ "const": "step_return"
369
+ }
370
+ },
371
+ "required": [
372
+ "op"
373
+ ],
374
+ "additionalProperties": false
375
+ }
376
+ ],
377
+ "discriminator": {
378
+ "propertyName": "op"
379
+ }
380
+ }
@@ -0,0 +1,278 @@
1
+ {
2
+ "type": "object",
3
+ "description": "Disk operations available via the c64_disk tool.",
4
+ "oneOf": [
5
+ {
6
+ "type": "object",
7
+ "description": "List Ultimate drive slots and their mounted images.",
8
+ "properties": {
9
+ "op": {
10
+ "const": "list_drives"
11
+ }
12
+ },
13
+ "additionalProperties": false,
14
+ "required": [
15
+ "op"
16
+ ]
17
+ },
18
+ {
19
+ "type": "object",
20
+ "description": "Mount a disk image with optional verification and retries.",
21
+ "properties": {
22
+ "drive": {
23
+ "type": "string",
24
+ "description": "Drive identifier (for example drive8).",
25
+ "minLength": 1
26
+ },
27
+ "image": {
28
+ "type": "string",
29
+ "description": "Absolute or Ultimate filesystem path to the disk image.",
30
+ "minLength": 1
31
+ },
32
+ "type": {
33
+ "type": [
34
+ "string",
35
+ "null"
36
+ ],
37
+ "description": "Override detected image type when firmware guesses incorrectly.",
38
+ "enum": [
39
+ "d64",
40
+ "g64",
41
+ "d71",
42
+ "g71",
43
+ "d81"
44
+ ]
45
+ },
46
+ "attachmentMode": {
47
+ "type": [
48
+ "string",
49
+ "null"
50
+ ],
51
+ "description": "Attachment mode controlling how the firmware treats the mounted image.",
52
+ "enum": [
53
+ "readwrite",
54
+ "readonly",
55
+ "unlinked"
56
+ ]
57
+ },
58
+ "driveMode": {
59
+ "type": [
60
+ "string",
61
+ "null"
62
+ ],
63
+ "description": "Drive emulation mode to switch to during verification.",
64
+ "enum": [
65
+ "1541",
66
+ "1571",
67
+ "1581"
68
+ ]
69
+ },
70
+ "verify": {
71
+ "type": "boolean",
72
+ "description": "When true, power on/reset/verify using the reliability workflow.",
73
+ "default": false
74
+ },
75
+ "powerOnIfNeeded": {
76
+ "type": "boolean",
77
+ "description": "Power on the drive automatically before mounting when verify=true.",
78
+ "default": true
79
+ },
80
+ "resetAfterMount": {
81
+ "type": "boolean",
82
+ "description": "Issue a drive reset after mounting when verify=true.",
83
+ "default": true
84
+ },
85
+ "maxRetries": {
86
+ "type": "integer",
87
+ "description": "Maximum number of mount retries when verify=true.",
88
+ "minimum": 0,
89
+ "maximum": 5,
90
+ "default": 2
91
+ },
92
+ "retryDelayMs": {
93
+ "type": "integer",
94
+ "description": "Delay between mount retry attempts when verify=true.",
95
+ "minimum": 0,
96
+ "maximum": 5000,
97
+ "default": 500
98
+ },
99
+ "op": {
100
+ "const": "mount"
101
+ }
102
+ },
103
+ "required": [
104
+ "drive",
105
+ "image",
106
+ "op"
107
+ ],
108
+ "additionalProperties": false
109
+ },
110
+ {
111
+ "type": "object",
112
+ "description": "Remove the mounted image from an Ultimate drive slot.",
113
+ "properties": {
114
+ "drive": {
115
+ "type": "string",
116
+ "description": "Drive identifier such as drive8, drive9, or unit name defined in the Ultimate UI.",
117
+ "minLength": 1
118
+ },
119
+ "op": {
120
+ "const": "unmount"
121
+ }
122
+ },
123
+ "required": [
124
+ "drive",
125
+ "op"
126
+ ],
127
+ "additionalProperties": false
128
+ },
129
+ {
130
+ "type": "object",
131
+ "description": "Inspect metadata for a file on the Ultimate filesystem.",
132
+ "properties": {
133
+ "path": {
134
+ "type": "string",
135
+ "description": "Absolute or Ultimate filesystem path to the disk image to mount or manage.",
136
+ "minLength": 1
137
+ },
138
+ "op": {
139
+ "const": "file_info"
140
+ }
141
+ },
142
+ "required": [
143
+ "path",
144
+ "op"
145
+ ],
146
+ "additionalProperties": false
147
+ },
148
+ {
149
+ "type": "object",
150
+ "description": "Create a blank disk image of the specified format.",
151
+ "properties": {
152
+ "format": {
153
+ "type": "string",
154
+ "description": "Disk image format to create.",
155
+ "enum": [
156
+ "d64",
157
+ "d71",
158
+ "d81",
159
+ "dnp"
160
+ ]
161
+ },
162
+ "path": {
163
+ "type": "string",
164
+ "description": "Destination path on the Ultimate filesystem.",
165
+ "minLength": 1
166
+ },
167
+ "diskname": {
168
+ "type": [
169
+ "string",
170
+ "null"
171
+ ],
172
+ "description": "Optional disk label (1-16 characters, converted to PETSCII).",
173
+ "minLength": 1,
174
+ "maxLength": 16
175
+ },
176
+ "tracks": {
177
+ "type": [
178
+ "integer",
179
+ "null"
180
+ ],
181
+ "description": "Track count (D64 supports 35 or 40; DNP requires explicit tracks).",
182
+ "minimum": 1,
183
+ "maximum": 255
184
+ },
185
+ "op": {
186
+ "const": "create_image"
187
+ }
188
+ },
189
+ "required": [
190
+ "format",
191
+ "path",
192
+ "op"
193
+ ],
194
+ "additionalProperties": false
195
+ },
196
+ {
197
+ "type": "object",
198
+ "description": "Search for a PRG/CRT by name substring and run the first match.",
199
+ "properties": {
200
+ "root": {
201
+ "type": [
202
+ "string",
203
+ "null"
204
+ ],
205
+ "description": "Root path to search",
206
+ "minLength": 1,
207
+ "default": "/"
208
+ },
209
+ "nameContains": {
210
+ "type": "string",
211
+ "description": "Substring to match",
212
+ "minLength": 1
213
+ },
214
+ "extensions": {
215
+ "type": [
216
+ "array",
217
+ "null"
218
+ ],
219
+ "items": {
220
+ "type": "string",
221
+ "description": "File extensions to include (without dot)",
222
+ "minLength": 1
223
+ }
224
+ },
225
+ "caseInsensitive": {
226
+ "type": [
227
+ "boolean",
228
+ "null"
229
+ ],
230
+ "description": "Case-insensitive name match",
231
+ "default": true
232
+ },
233
+ "sort": {
234
+ "type": [
235
+ "string",
236
+ "null"
237
+ ],
238
+ "description": "Sort order for matches",
239
+ "enum": [
240
+ "discovered",
241
+ "alphabetical"
242
+ ],
243
+ "default": "discovered"
244
+ },
245
+ "waitMs": {
246
+ "type": [
247
+ "integer",
248
+ "null"
249
+ ],
250
+ "description": "Delay after firmware run before returning",
251
+ "minimum": 0,
252
+ "default": 0
253
+ },
254
+ "captureCandidates": {
255
+ "type": [
256
+ "integer",
257
+ "null"
258
+ ],
259
+ "description": "Include up to this many candidates in result",
260
+ "minimum": 1,
261
+ "maximum": 100,
262
+ "default": 10
263
+ },
264
+ "op": {
265
+ "const": "find_and_run"
266
+ }
267
+ },
268
+ "required": [
269
+ "nameContains",
270
+ "op"
271
+ ],
272
+ "additionalProperties": false
273
+ }
274
+ ],
275
+ "discriminator": {
276
+ "propertyName": "op"
277
+ }
278
+ }