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
@@ -397,9 +397,9 @@ export const audioModule = defineToolModule({
397
397
  domain: "audio",
398
398
  summary: "SID composition, playback, and audio analysis workflows.",
399
399
  resources: [
400
- "c64://specs/sid",
401
- "c64://specs/sidwave",
402
- "c64://docs/sid/file-structure",
400
+ "c64://sound/sid/spec",
401
+ "c64://sound/sidwave/spec",
402
+ "c64://sound/sid/file-format",
403
403
  ],
404
404
  prompts: ["sid-music"],
405
405
  defaultTags: ["sid", "audio"],
@@ -411,7 +411,7 @@ export const audioModule = defineToolModule({
411
411
  tools: [
412
412
  {
413
413
  name: "sid_volume",
414
- description: "Set the SID master volume register at $D418. See c64://specs/sid.",
414
+ description: "Set the SID master volume register at $D418. See c64://sound/sid/spec.",
415
415
  summary: "Clamps the requested volume and writes it to the SID master volume register.",
416
416
  inputSchema: sidVolumeArgsSchema.jsonSchema,
417
417
  tags: ["sid", "control"],
@@ -496,7 +496,7 @@ export const audioModule = defineToolModule({
496
496
  },
497
497
  {
498
498
  name: "sid_note_on",
499
- description: "Trigger a SID voice with configurable waveform, pulse width, and ADSR envelope. See c64://specs/sid.",
499
+ description: "Trigger a SID voice with configurable waveform, pulse width, and ADSR envelope. See c64://sound/sid/spec.",
500
500
  summary: "Resolves note or frequency, clamps parameters, and writes the SID voice registers.",
501
501
  inputSchema: sidNoteOnArgsSchema.jsonSchema,
502
502
  tags: ["sid", "control", "music", "pal-ntsc"],
@@ -700,7 +700,7 @@ export const audioModule = defineToolModule({
700
700
  description: "Play a SID file stored on the Ultimate filesystem via the firmware player.",
701
701
  summary: "Instructs the SID player to load the given file and optional song number.",
702
702
  inputSchema: sidplayFileArgsSchema.jsonSchema,
703
- relatedResources: ["c64://specs/sid"],
703
+ relatedResources: ["c64://sound/sid/spec"],
704
704
  tags: ["sid", "playback"],
705
705
  prerequisites: ["drives_list"],
706
706
  examples: [
@@ -740,7 +740,7 @@ export const audioModule = defineToolModule({
740
740
  description: "Play a MOD tracker module stored on the Ultimate filesystem.",
741
741
  summary: "Sends the module to the Ultimate SID player and starts playback.",
742
742
  inputSchema: modplayFileArgsSchema.jsonSchema,
743
- relatedResources: ["c64://specs/sid"],
743
+ relatedResources: ["c64://sound/sid/spec"],
744
744
  tags: ["sid", "playback"],
745
745
  prerequisites: ["drives_list"],
746
746
  examples: [
@@ -780,7 +780,7 @@ export const audioModule = defineToolModule({
780
780
  summary: "Builds a note timeline from semitone offsets and triggers SID playback asynchronously.",
781
781
  lifecycle: "fire-and-forget",
782
782
  inputSchema: musicGenerateArgsSchema.jsonSchema,
783
- relatedResources: ["c64://specs/sid"],
783
+ relatedResources: ["c64://sound/sid/spec"],
784
784
  relatedPrompts: ["sid-music"],
785
785
  tags: ["sid", "music", "generator", "pal-ntsc"],
786
786
  prerequisites: ["sid_volume"],
@@ -862,7 +862,7 @@ export const audioModule = defineToolModule({
862
862
  description: "Compile a SIDWAVE composition to PRG or SID and optionally play it immediately.",
863
863
  summary: "Parses SIDWAVE/CPG input, compiles to a PRG, and plays via PRG or SID attachment.",
864
864
  inputSchema: musicCompileArgsSchema.jsonSchema,
865
- relatedResources: ["c64://specs/sid", "c64://specs/sidwave", "c64://docs/sid/file-structure"],
865
+ relatedResources: ["c64://sound/sid/spec", "c64://sound/sidwave/spec", "c64://sound/sid/file-format"],
866
866
  relatedPrompts: ["sid-music"],
867
867
  tags: ["sid", "music", "compiler"],
868
868
  prerequisites: [],
@@ -945,7 +945,7 @@ export const audioModule = defineToolModule({
945
945
  description: "Record audio from the default input device and analyze SID playback characteristics.",
946
946
  summary: "Captures PCM data, extracts notes, tempo, and deviation metrics for SID verification workflows.",
947
947
  inputSchema: recordAndAnalyzeArgsSchema.jsonSchema,
948
- relatedResources: ["c64://specs/sid", "c64://docs/sid/file-structure"],
948
+ relatedResources: ["c64://sound/sid/spec", "c64://sound/sid/file-format"],
949
949
  relatedPrompts: ["sid-music"],
950
950
  tags: ["sid", "analysis"],
951
951
  prerequisites: [],
@@ -985,7 +985,7 @@ export const audioModule = defineToolModule({
985
985
  description: "Automatically analyze SID playback when the user requests verification feedback.",
986
986
  summary: "Detects verification intent in natural language, records a short clip, and returns musical feedback.",
987
987
  inputSchema: analyzeAudioArgsSchema.jsonSchema,
988
- relatedResources: ["c64://specs/sid", "c64://docs/sid/file-structure"],
988
+ relatedResources: ["c64://sound/sid/spec", "c64://sound/sid/file-format"],
989
989
  relatedPrompts: ["sid-music"],
990
990
  tags: ["sid", "analysis"],
991
991
  prerequisites: [],
@@ -6,7 +6,7 @@ Licensed under the GNU General Public License v2.0 or later.
6
6
  See <https://www.gnu.org/licenses/> for details.
7
7
  */
8
8
  import { Buffer } from "node:buffer";
9
- import { asciiToPetscii, encodeStringWithNames } from "./petscii.js";
9
+ import { asciiToPetscii, encodeStringWithNames } from "../petscii.js";
10
10
  const DEFAULT_START_ADDRESS = 0x0801;
11
11
  const REM_TOKEN = 0x8f;
12
12
  const TOKEN_TABLE = buildTokenTable();
@@ -57,6 +57,7 @@ const createCheckpointArgsSchema = objectSchema({
57
57
  stopOnHit: optionalSchema(booleanSchema({ description: "Pause execution when hit (default true).", default: true })),
58
58
  enabled: optionalSchema(booleanSchema({ description: "Whether the checkpoint is enabled (default true).", default: true })),
59
59
  temporary: optionalSchema(booleanSchema({ description: "Automatically remove after first hit.", default: false })),
60
+ label: optionalSchema(stringSchema({ description: "Optional human-readable label stored in-process.", maxLength: 64 })),
60
61
  operations: optionalSchema(objectSchema({
61
62
  description: "Checkpoint operation filters.",
62
63
  properties: {
@@ -147,6 +148,42 @@ const stepReturnArgsSchema = objectSchema({
147
148
  required: ["op"],
148
149
  additionalProperties: false,
149
150
  });
151
+ const getMonitorStateArgsSchema = objectSchema({
152
+ description: "Read CPU registers and return the current monitor state.",
153
+ properties: {
154
+ op: literalSchema("get_monitor_state"),
155
+ memspace: memspaceSchema,
156
+ },
157
+ required: ["op"],
158
+ additionalProperties: false,
159
+ });
160
+ const waitForStateArgsSchema = objectSchema({
161
+ description: "Poll CPU registers until PC equals expectedPC or timeout elapses.",
162
+ properties: {
163
+ op: literalSchema("wait_for_state"),
164
+ expectedPC: optionalSchema(stringSchema({ description: "Target PC address to wait for (e.g. $0810).", minLength: 1 })),
165
+ timeoutMs: optionalSchema(numberSchema({ description: "Maximum wait time in milliseconds.", integer: true, minimum: 1, maximum: 60000, default: 5000 })),
166
+ pollMs: optionalSchema(numberSchema({ description: "Poll interval in milliseconds.", integer: true, minimum: 10, maximum: 1000, default: 100 })),
167
+ },
168
+ required: ["op"],
169
+ additionalProperties: false,
170
+ });
171
+ const nuclearResetArgsSchema = objectSchema({
172
+ description: "Kill and restart the VICE process (managed instances only).",
173
+ properties: {
174
+ op: literalSchema("nuclear_reset"),
175
+ },
176
+ required: ["op"],
177
+ additionalProperties: false,
178
+ });
179
+ const continueExecutionArgsSchema = objectSchema({
180
+ description: "Exit the Binary Monitor and resume CPU execution (BM 0xAA Exit).",
181
+ properties: {
182
+ op: literalSchema("continue_execution"),
183
+ },
184
+ required: ["op"],
185
+ additionalProperties: false,
186
+ });
150
187
  const debugOperationSchemas = [
151
188
  listCheckpointsArgsSchema,
152
189
  getCheckpointArgsSchema,
@@ -159,14 +196,19 @@ const debugOperationSchemas = [
159
196
  setRegistersArgsSchema,
160
197
  stepArgsSchema,
161
198
  stepReturnArgsSchema,
199
+ getMonitorStateArgsSchema,
200
+ waitForStateArgsSchema,
201
+ nuclearResetArgsSchema,
202
+ continueExecutionArgsSchema,
162
203
  ];
204
+ const checkpointLabels = new Map();
163
205
  const debugOperationHandlers = {
164
206
  list_checkpoints: async (_args, ctx) => {
165
207
  try {
166
208
  listCheckpointsArgsSchema.parse(_args);
167
209
  ctx.logger.info("Listing VICE checkpoints");
168
210
  const checkpoints = await ctx.client.viceCheckpointList();
169
- return jsonResult({ checkpoints: checkpoints.map(formatCheckpoint) }, { success: true, count: checkpoints.length });
211
+ return jsonResult({ checkpoints: checkpoints.map((cp) => formatCheckpoint(cp, checkpointLabels.get(cp.id))) }, { success: true, count: checkpoints.length });
170
212
  }
171
213
  catch (error) {
172
214
  return handleToolError(error);
@@ -176,7 +218,7 @@ const debugOperationHandlers = {
176
218
  try {
177
219
  const parsed = getCheckpointArgsSchema.parse(args);
178
220
  const checkpoint = await ctx.client.viceCheckpointGet(parsed.id);
179
- return jsonResult({ checkpoint: formatCheckpoint(checkpoint) }, { success: true });
221
+ return jsonResult({ checkpoint: formatCheckpoint(checkpoint, checkpointLabels.get(checkpoint.id)) }, { success: true });
180
222
  }
181
223
  catch (error) {
182
224
  return handleToolError(error);
@@ -201,8 +243,11 @@ const debugOperationHandlers = {
201
243
  },
202
244
  memspace: normaliseMemspace(parsed.memspace),
203
245
  });
204
- ctx.logger.info("Created VICE checkpoint", { id: created.id, start: formatAddress(created.start) });
205
- return jsonResult({ checkpoint: formatCheckpoint(created) }, { success: true, id: created.id });
246
+ if (parsed.label) {
247
+ checkpointLabels.set(created.id, parsed.label);
248
+ }
249
+ ctx.logger.info("Created VICE checkpoint", { id: created.id, start: formatAddress(created.start), label: parsed.label });
250
+ return jsonResult({ checkpoint: formatCheckpoint(created, checkpointLabels.get(created.id)) }, { success: true, id: created.id });
206
251
  }
207
252
  catch (error) {
208
253
  return handleToolError(error);
@@ -212,6 +257,7 @@ const debugOperationHandlers = {
212
257
  try {
213
258
  const parsed = deleteCheckpointArgsSchema.parse(args);
214
259
  await ctx.client.viceCheckpointDelete(parsed.id);
260
+ checkpointLabels.delete(parsed.id);
215
261
  ctx.logger.info("Deleted VICE checkpoint", { id: parsed.id });
216
262
  return textResult(`Deleted checkpoint ${parsed.id}.`, { success: true, id: parsed.id });
217
263
  }
@@ -345,12 +391,93 @@ const debugOperationHandlers = {
345
391
  return handleToolError(error);
346
392
  }
347
393
  },
394
+ get_monitor_state: async (args, ctx) => {
395
+ try {
396
+ const parsed = getMonitorStateArgsSchema.parse(args);
397
+ const memspace = normaliseMemspace(parsed.memspace);
398
+ const [metadata, values] = await Promise.all([
399
+ ctx.client.viceRegistersAvailable(memspace),
400
+ ctx.client.viceRegistersGet(memspace),
401
+ ]);
402
+ const metadataById = new Map(metadata.map((m) => [m.id, m]));
403
+ const registers = values.map((v) => {
404
+ const meta = metadataById.get(v.id);
405
+ return { id: v.id, name: meta?.name, bits: meta?.bits, size: v.size, value: v.value };
406
+ });
407
+ const pc = registers.find((r) => r.name?.toUpperCase() === "PC");
408
+ ctx.logger.info("Read monitor state", { memspace, pc: pc ? formatAddress(pc.value) : "unknown" });
409
+ return jsonResult({ memspace, registers, pc: pc ? formatAddress(pc.value) : undefined }, { success: true, memspace, count: registers.length });
410
+ }
411
+ catch (error) {
412
+ return handleToolError(error);
413
+ }
414
+ },
415
+ wait_for_state: async (args, ctx) => {
416
+ try {
417
+ const parsed = waitForStateArgsSchema.parse(args);
418
+ const timeoutMs = parsed.timeoutMs ?? 5000;
419
+ const pollMs = parsed.pollMs ?? 100;
420
+ const targetPC = parsed.expectedPC ? parseAddress(parsed.expectedPC, "expectedPC") : undefined;
421
+ const metadata = await ctx.client.viceRegistersAvailable(0);
422
+ const metadataById = new Map(metadata.map((m) => [m.id, m]));
423
+ const pcId = metadata.find((m) => m.name.toUpperCase() === "PC")?.id;
424
+ const deadline = Date.now() + timeoutMs;
425
+ let values = [];
426
+ let currentPC;
427
+ while (Date.now() < deadline) {
428
+ values = await ctx.client.viceRegistersGet(0);
429
+ currentPC = pcId !== undefined ? values.find((v) => v.id === pcId)?.value : undefined;
430
+ if (targetPC === undefined || currentPC === targetPC) {
431
+ break;
432
+ }
433
+ await new Promise((res) => setTimeout(res, pollMs));
434
+ }
435
+ const matched = targetPC === undefined || currentPC === targetPC;
436
+ const regs = values.map((v) => {
437
+ const meta = metadataById.get(v.id);
438
+ return { id: v.id, name: meta?.name, bits: meta?.bits, size: v.size, value: v.value };
439
+ });
440
+ ctx.logger.info("wait_for_state settled", { matched, pc: currentPC !== undefined ? formatAddress(currentPC) : "unknown" });
441
+ return jsonResult({
442
+ matched,
443
+ timedOut: !matched,
444
+ pc: currentPC !== undefined ? formatAddress(currentPC) : undefined,
445
+ registers: regs,
446
+ }, { success: true, matched });
447
+ }
448
+ catch (error) {
449
+ return handleToolError(error);
450
+ }
451
+ },
452
+ nuclear_reset: async (args, ctx) => {
453
+ try {
454
+ nuclearResetArgsSchema.parse(args);
455
+ ctx.logger.info("Performing nuclear reset of VICE process");
456
+ await ctx.client.viceNuclearReset();
457
+ checkpointLabels.clear();
458
+ return textResult("VICE process stopped and restarted.", { success: true });
459
+ }
460
+ catch (error) {
461
+ return handleToolError(error);
462
+ }
463
+ },
464
+ continue_execution: async (args, ctx) => {
465
+ try {
466
+ continueExecutionArgsSchema.parse(args);
467
+ await ctx.client.viceExitMonitor();
468
+ ctx.logger.info("Exited Binary Monitor — CPU resumed");
469
+ return textResult("Execution resumed.", { success: true });
470
+ }
471
+ catch (error) {
472
+ return handleToolError(error);
473
+ }
474
+ },
348
475
  };
349
476
  const debugOperationDispatcher = createOperationDispatcher("c64_debug", debugOperationHandlers);
350
477
  export const debugModuleGroup = defineToolModule({
351
478
  domain: "debug",
352
479
  summary: "VICE Binary Monitor debugger operations (breakpoints, registers, stepping).",
353
- resources: ["c64://specs/assembly", "c64://specs/memory-map"],
480
+ resources: ["c64://assembly/6510-spec", "c64://memory/map"],
354
481
  prompts: ["assembly-program", "memory-debug"],
355
482
  defaultTags: ["debug", "vice"],
356
483
  workflowHints: [
@@ -384,6 +511,31 @@ export const debugModuleGroup = defineToolModule({
384
511
  description: "Read CPU registers from memspace 0 (default).",
385
512
  arguments: { op: "get_registers" },
386
513
  },
514
+ {
515
+ name: "Create labelled breakpoint",
516
+ description: "Set a breakpoint at $0810 with a descriptive label.",
517
+ arguments: { op: "create_checkpoint", address: "$0810", label: "entry_point" },
518
+ },
519
+ {
520
+ name: "Get monitor state",
521
+ description: "Read current CPU state including all registers and PC.",
522
+ arguments: { op: "get_monitor_state" },
523
+ },
524
+ {
525
+ name: "Wait for PC",
526
+ description: "Poll until PC reaches $0810 or 5 s elapses.",
527
+ arguments: { op: "wait_for_state", expectedPC: "$0810", timeoutMs: 5000 },
528
+ },
529
+ {
530
+ name: "Nuclear reset",
531
+ description: "Kill and restart the VICE process, clearing all state.",
532
+ arguments: { op: "nuclear_reset" },
533
+ },
534
+ {
535
+ name: "Continue execution",
536
+ description: "Exit the BM monitor and let the CPU run freely.",
537
+ arguments: { op: "continue_execution" },
538
+ },
387
539
  ],
388
540
  execute: debugOperationDispatcher,
389
541
  },
@@ -395,9 +547,10 @@ function handleToolError(error) {
395
547
  }
396
548
  return unknownErrorResult(error);
397
549
  }
398
- function formatCheckpoint(checkpoint) {
550
+ function formatCheckpoint(checkpoint, label) {
399
551
  return {
400
552
  id: checkpoint.id,
553
+ ...(label ? { label } : {}),
401
554
  start: formatAddress(checkpoint.start),
402
555
  end: formatAddress(checkpoint.end),
403
556
  enabled: checkpoint.enabled,
@@ -123,8 +123,8 @@ export const developerModule = defineToolModule({
123
123
  domain: "developer",
124
124
  summary: "Configuration management, diagnostics, and helper utilities for advanced workflows.",
125
125
  resources: [
126
- "c64://context/bootstrap",
127
- "c64://docs/index",
126
+ "c64://guide/bootstrap",
127
+ "c64://guide/index",
128
128
  ],
129
129
  prompts: ["memory-debug"],
130
130
  defaultTags: ["developer", "config", "debug"],
@@ -138,7 +138,7 @@ export const developerModule = defineToolModule({
138
138
  description: "List configuration categories available on the Ultimate firmware.",
139
139
  summary: "Fetches the configuration tree and returns firmware-reported categories.",
140
140
  inputSchema: noArgsSchema.jsonSchema,
141
- relatedResources: ["c64://context/bootstrap"],
141
+ relatedResources: ["c64://guide/bootstrap"],
142
142
  tags: ["config", "list"],
143
143
  examples: [
144
144
  { name: "List configs", description: "Enumerate configuration categories", arguments: {} },
@@ -173,7 +173,7 @@ export const developerModule = defineToolModule({
173
173
  description: "Read a configuration category or specific item.",
174
174
  summary: "Returns firmware configuration data for the selected category (and item).",
175
175
  inputSchema: configGetArgsSchema.jsonSchema,
176
- relatedResources: ["c64://context/bootstrap"],
176
+ relatedResources: ["c64://guide/bootstrap"],
177
177
  tags: ["config", "read"],
178
178
  examples: [
179
179
  { name: "Get audio config", description: "Read audio category", arguments: { category: "Audio" } },
@@ -210,7 +210,7 @@ export const developerModule = defineToolModule({
210
210
  description: "Set a configuration value within a category.",
211
211
  summary: "Writes a primitive value to a specific configuration item via firmware APIs.",
212
212
  inputSchema: configSetArgsSchema.jsonSchema,
213
- relatedResources: ["c64://context/bootstrap"],
213
+ relatedResources: ["c64://guide/bootstrap"],
214
214
  tags: ["config", "write"],
215
215
  examples: [
216
216
  { name: "Set volume", description: "Adjust audio volume", arguments: { category: "Audio", item: "Volume", value: 75 } },
@@ -254,7 +254,7 @@ export const developerModule = defineToolModule({
254
254
  description: "Apply multiple configuration changes in a single request.",
255
255
  summary: "Sends a nested object of category/item values to the firmware batch endpoint.",
256
256
  inputSchema: configBatchSchema.jsonSchema,
257
- relatedResources: ["c64://context/bootstrap"],
257
+ relatedResources: ["c64://guide/bootstrap"],
258
258
  tags: ["config", "write"],
259
259
  examples: [
260
260
  { name: "Batch update", description: "Update multiple settings", arguments: { Audio: { Volume: 80, DACMode: "stereo" } } },
@@ -298,7 +298,7 @@ export const developerModule = defineToolModule({
298
298
  description: "Load configuration settings from flash storage.",
299
299
  summary: "Restores the firmware configuration by reading the persisted flash snapshot.",
300
300
  inputSchema: noArgsSchema.jsonSchema,
301
- relatedResources: ["c64://context/bootstrap"],
301
+ relatedResources: ["c64://guide/bootstrap"],
302
302
  tags: ["config", "flash"],
303
303
  examples: [
304
304
  { name: "Load from flash", description: "Restore saved configuration", arguments: {} },
@@ -334,7 +334,7 @@ export const developerModule = defineToolModule({
334
334
  description: "Persist current configuration settings to flash storage.",
335
335
  summary: "Saves the active configuration snapshot so it survives power cycles.",
336
336
  inputSchema: noArgsSchema.jsonSchema,
337
- relatedResources: ["c64://context/bootstrap"],
337
+ relatedResources: ["c64://guide/bootstrap"],
338
338
  tags: ["config", "flash"],
339
339
  examples: [
340
340
  { name: "Save to flash", description: "Persist current config", arguments: {} },
@@ -370,7 +370,7 @@ export const developerModule = defineToolModule({
370
370
  description: "Reset configuration categories to their factory defaults.",
371
371
  summary: "Instructs the firmware to discard overrides and restore default configuration values.",
372
372
  inputSchema: noArgsSchema.jsonSchema,
373
- relatedResources: ["c64://context/bootstrap"],
373
+ relatedResources: ["c64://guide/bootstrap"],
374
374
  tags: ["config", "reset"],
375
375
  examples: [
376
376
  { name: "Reset config", description: "Restore factory defaults", arguments: {} },
@@ -407,7 +407,7 @@ export const developerModule = defineToolModule({
407
407
  summary: "Calls the firmware version endpoint (Ultimate) or returns emulator info (VICE).",
408
408
  supportedPlatforms: ["c64u", "vice"],
409
409
  inputSchema: noArgsSchema.jsonSchema,
410
- relatedResources: ["c64://context/bootstrap"],
410
+ relatedResources: ["c64://guide/bootstrap"],
411
411
  tags: ["diagnostics", "version"],
412
412
  examples: [
413
413
  { name: "Get version", description: "Check firmware version", arguments: {} },
@@ -439,7 +439,7 @@ export const developerModule = defineToolModule({
439
439
  summary: "Returns the diagnostics payload reported by the firmware (Ultimate) or emulator (VICE).",
440
440
  supportedPlatforms: ["c64u", "vice"],
441
441
  inputSchema: noArgsSchema.jsonSchema,
442
- relatedResources: ["c64://context/bootstrap"],
442
+ relatedResources: ["c64://guide/bootstrap"],
443
443
  tags: ["diagnostics", "info"],
444
444
  examples: [
445
445
  { name: "Get hardware info", description: "Query hardware status", arguments: {} },
@@ -470,7 +470,7 @@ export const developerModule = defineToolModule({
470
470
  description: "Read the Ultimate debug register ($D7FF).",
471
471
  summary: "Returns the current hex value stored in the debug register.",
472
472
  inputSchema: noArgsSchema.jsonSchema,
473
- relatedResources: ["c64://context/bootstrap"],
473
+ relatedResources: ["c64://guide/bootstrap"],
474
474
  tags: ["debug"],
475
475
  examples: [
476
476
  { name: "Read debug register", description: "Check $D7FF value", arguments: {} },
@@ -509,7 +509,7 @@ export const developerModule = defineToolModule({
509
509
  description: "Write a value into the Ultimate debug register ($D7FF).",
510
510
  summary: "Validates the hex input and forwards it to the firmware.",
511
511
  inputSchema: debugWriteArgsSchema.jsonSchema,
512
- relatedResources: ["c64://context/bootstrap"],
512
+ relatedResources: ["c64://guide/bootstrap"],
513
513
  tags: ["debug"],
514
514
  examples: [
515
515
  { name: "Write debug register", description: "Set $D7FF to $42", arguments: { value: "42" } },