c64bridge 0.8.0 → 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.
package/doc/developer.md CHANGED
@@ -119,8 +119,16 @@ Environment knobs: `RAG_EMBEDDINGS_DIR`, `RAG_BUILD_ON_START`, `RAG_REINDEX_INTE
119
119
 
120
120
  - `./build check` — build + test matrix in one pass
121
121
  - `./build changelog` — update CHANGELOG draft
122
- - `./build release --version <version>` — bump version, regenerate manifest, prepend changelog notes
123
- - Published package ships [`dist/`](../dist/), [`doc/`](../doc/), [`data/`](../data/), [`scripts/`](../scripts/), [`generated/`](../generated/), and [`mcp.json`](../mcp.json)
122
+ - `./build release --version <version>` — bump version, refresh [`mcp.json`](../mcp.json) and [`server.json`](../server.json), prepend changelog notes
123
+ - Published package ships [`dist/`](../dist/), [`doc/`](../doc/), [`data/`](../data/), [`scripts/`](../scripts/), [`generated/`](../generated/), [`mcp.json`](../mcp.json), and [`server.json`](../server.json)
124
+
125
+ Tagging a release through the GitHub release UI triggers [`.github/workflows/release.yaml`](../.github/workflows/release.yaml), which publishes the npm package and then publishes the same version to the MCP Registry.
126
+
127
+ - Required GitHub secret: `NPM_TOKEN`
128
+ - No dedicated MCP Registry secret is required for the GitHub-driven flow; the workflow uses `mcp-publisher login github-oidc`
129
+ - The release workflow must grant `id-token: write` so GitHub Actions can mint the short-lived OIDC token used by `mcp-publisher`
130
+ - Keep [`package.json`](../package.json) `mcpName` aligned with [`server.json`](../server.json) `name`
131
+ - The root [`server.json`](../server.json) is the MCP Registry manifest; [`mcp/server.json`](../mcp/server.json) remains generated MCP interface output
124
132
 
125
133
  ## 9. Troubleshooting Cheatsheet
126
134
 
package/mcp/server.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "c64bridge",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "Stdio-based Model Context Protocol (MCP) server that bridges Commodore 64 Ultimate hardware with AI agents.",
5
5
  "transports": [
6
6
  "stdio"
package/mcp.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "c64bridge",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "Stdio-based Model Context Protocol (MCP) server that bridges Commodore 64 Ultimate hardware with AI agents.",
5
5
  "entry": "dist/index.js",
6
6
  "type": "stdio",
@@ -9,11 +9,14 @@
9
9
  "mcp-server",
10
10
  "model context protocol",
11
11
  "openai",
12
- "ultimate64",
13
- "commodore64",
14
- "commodore 64",
12
+ "commodore",
15
13
  "c64",
16
14
  "c64u",
15
+ "commodore64",
16
+ "commodore 64",
17
+ "commodore 64 ultimate",
18
+ "ultimate64",
19
+ "ultimate 64",
17
20
  "sid",
18
21
  "basic",
19
22
  "assembly",
@@ -22,9 +25,7 @@
22
25
  "retrogaming",
23
26
  "vintage computing",
24
27
  "hardware integration",
25
- "c64 development",
26
- "commodore 64 ultimate",
27
- "ultimate 64"
28
+ "c64 development"
28
29
  ],
29
30
  "env": {
30
31
  "LOG_LEVEL": {
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "c64bridge",
3
- "version": "0.8.0",
4
- "description": "Local MCP server for controlling a Commodore 64 via Ultimate 64 REST API",
3
+ "version": "0.8.1",
4
+ "mcpName": "io.github.chrisgleissner/c64bridge",
5
+ "description": "C64 Bridge MCP server for Commodore 64 Ultimate hardware and VICE emulator control",
5
6
  "type": "module",
6
7
  "main": "dist/index.js",
7
8
  "packageManager": "bun@1.3.1",
@@ -79,6 +80,7 @@
79
80
  },
80
81
  "files": [
81
82
  "mcp.json",
83
+ "server.json",
82
84
  "AGENTS.md",
83
85
  "LICENSE",
84
86
  "README.md",
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { execSync } from 'node:child_process';
3
- import { readFile, writeFile } from 'node:fs/promises';
3
+ import { access, readFile, writeFile } from 'node:fs/promises';
4
4
  import path from 'node:path';
5
5
  import process from 'node:process';
6
6
 
@@ -16,6 +16,27 @@ const updateJsonFile = async (relativePath, updater) => {
16
16
  await writeFile(filePath, JSON.stringify(updated, null, 2) + '\n');
17
17
  };
18
18
 
19
+ const fileExists = async (relativePath) => {
20
+ try {
21
+ await access(path.resolve(relativePath));
22
+ return true;
23
+ } catch {
24
+ return false;
25
+ }
26
+ };
27
+
28
+ const getRepositoryMetadata = (repository) => {
29
+ const url = typeof repository === 'string' ? repository : repository?.url;
30
+ if (!url) {
31
+ return undefined;
32
+ }
33
+
34
+ return {
35
+ url,
36
+ source: url.includes('github.com') ? 'github' : undefined,
37
+ };
38
+ };
39
+
19
40
  const normaliseVersion = (value) => value.replace(/^v/, '');
20
41
 
21
42
  const isExactVersion = (value) => /^v?\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(value);
@@ -72,6 +93,42 @@ await updateJsonFile('mcp.json', async (data) => ({
72
93
  version: newVersion,
73
94
  }));
74
95
 
96
+ if (await fileExists('server.json')) {
97
+ await updateJsonFile('server.json', async (data) => {
98
+ const packages = Array.isArray(data.packages) ? [...data.packages] : [];
99
+ const primaryPackage = packages[0] ?? {
100
+ registryType: 'npm',
101
+ transport: {
102
+ type: 'stdio',
103
+ },
104
+ };
105
+
106
+ packages[0] = {
107
+ ...primaryPackage,
108
+ identifier: pkg.name,
109
+ version: newVersion,
110
+ transport: primaryPackage.transport ?? {
111
+ type: 'stdio',
112
+ },
113
+ };
114
+
115
+ const repository = getRepositoryMetadata(pkg.repository);
116
+
117
+ return {
118
+ ...data,
119
+ name: pkg.mcpName ?? data.name,
120
+ version: newVersion,
121
+ repository: repository
122
+ ? {
123
+ ...(data.repository ?? {}),
124
+ ...repository,
125
+ }
126
+ : data.repository,
127
+ packages,
128
+ };
129
+ });
130
+ }
131
+
75
132
  // Manifest generation removed (runtime discovery via MCP stdio)
76
133
 
77
134
  // Update CHANGELOG.md from commits since last tag using Conventional Commits subjects.
@@ -88,4 +145,4 @@ if (skippedVersionBump && hasExistingChangelogEntry) {
88
145
  }
89
146
 
90
147
  console.log(`Release metadata updated to ${newVersion}.`);
91
- console.log('Next steps: commit the changes, open a PR, and tag the merged commit.');
148
+ console.log('Next steps: commit and push the changes, then create the release tag from GitHub once main is ready.');
package/server.json ADDED
@@ -0,0 +1,94 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.chrisgleissner/c64bridge",
4
+ "title": "C64 Bridge",
5
+ "description": "MCP server for Commodore 64 Ultimate hardware and VICE emulator control.",
6
+ "repository": {
7
+ "url": "https://github.com/chrisgleissner/c64bridge",
8
+ "source": "github"
9
+ },
10
+ "websiteUrl": "https://github.com/chrisgleissner/c64bridge",
11
+ "version": "0.8.1",
12
+ "packages": [
13
+ {
14
+ "registryType": "npm",
15
+ "identifier": "c64bridge",
16
+ "version": "0.8.1",
17
+ "transport": {
18
+ "type": "stdio"
19
+ },
20
+ "environmentVariables": [
21
+ {
22
+ "name": "LOG_LEVEL",
23
+ "description": "Logger verbosity.",
24
+ "format": "string",
25
+ "default": "info",
26
+ "choices": [
27
+ "debug",
28
+ "info",
29
+ "warn",
30
+ "error"
31
+ ]
32
+ },
33
+ {
34
+ "name": "C64BRIDGE_CONFIG",
35
+ "description": "Path to the C64 Bridge configuration file.",
36
+ "format": "filepath",
37
+ "default": "~/.c64bridge.json"
38
+ },
39
+ {
40
+ "name": "C64_MODE",
41
+ "description": "Active backend.",
42
+ "format": "string",
43
+ "default": "c64u",
44
+ "choices": [
45
+ "c64u",
46
+ "vice"
47
+ ]
48
+ },
49
+ {
50
+ "name": "C64U_HOST",
51
+ "description": "Ultimate 64 host name or IP address.",
52
+ "format": "string",
53
+ "default": "c64u"
54
+ },
55
+ {
56
+ "name": "C64U_PORT",
57
+ "description": "Ultimate 64 REST port.",
58
+ "format": "number",
59
+ "default": "80"
60
+ },
61
+ {
62
+ "name": "C64U_PASSWORD",
63
+ "description": "Ultimate 64 network password sent as X-Password.",
64
+ "format": "string",
65
+ "isSecret": true
66
+ },
67
+ {
68
+ "name": "VICE_BINARY",
69
+ "description": "VICE emulator binary to launch.",
70
+ "format": "string",
71
+ "default": "x64sc"
72
+ },
73
+ {
74
+ "name": "VICE_VISIBLE",
75
+ "description": "Launch VICE with a visible window when possible.",
76
+ "format": "boolean",
77
+ "default": "true"
78
+ },
79
+ {
80
+ "name": "VICE_WARP",
81
+ "description": "Enable VICE warp mode.",
82
+ "format": "boolean",
83
+ "default": "false"
84
+ },
85
+ {
86
+ "name": "GITHUB_TOKEN",
87
+ "description": "GitHub token for optional RAG discovery against GitHub.",
88
+ "format": "string",
89
+ "isSecret": true
90
+ }
91
+ ]
92
+ }
93
+ ]
94
+ }