From 2ddc193f648d735379da0453ec632b4f8b4f0a82 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 20 Oct 2025 18:51:35 -0400 Subject: [PATCH 01/13] =?UTF-8?q?=F0=9F=A4=96=20Add=20NPM=20publishing=20w?= =?UTF-8?q?ith=20OIDC=20trusted=20publishing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add GitHub Actions workflow for hybrid NPM publishing - Publishes to 'next' tag on main branch commits - Publishes to 'latest' tag on git tag releases - Uses OIDC trusted publishing (no long-lived tokens) - Includes provenance attestations for supply chain security - Update package.json for NPM publishing - Change package name to @coder/cmux (scoped package) - Add bin field for CLI usage - Add repository and publishConfig fields - Add files array to control what gets published (whitelist approach) Generated with cmux --- .github/workflows/publish-npm.yml | 48 +++++++++++++++++++++++++++++++ package.json | 20 ++++++++++++- 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/publish-npm.yml diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml new file mode 100644 index 000000000..1f63a9ba1 --- /dev/null +++ b/.github/workflows/publish-npm.yml @@ -0,0 +1,48 @@ +name: Publish to NPM + +on: + push: + branches: + - main + tags: + - 'v*' + workflow_dispatch: + +permissions: + contents: read + id-token: write # Required for OIDC trusted publishing + +jobs: + publish: + name: Publish to NPM + runs-on: ${{ github.repository_owner == 'coder' && 'depot-ubuntu-22.04-16' || 'ubuntu-latest' }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required for git describe to find tags + + - uses: ./.github/actions/setup-cmux + + - name: Generate version file + run: ./scripts/generate-version.sh + + - name: Build application + run: make build + + - name: Determine NPM tag + id: npm-tag + run: | + if [[ $GITHUB_REF == refs/tags/* ]]; then + echo "tag=latest" >> $GITHUB_OUTPUT + echo "Publishing as 'latest' tag (stable release)" + else + echo "tag=next" >> $GITHUB_OUTPUT + echo "Publishing as 'next' tag (pre-release from main)" + fi + + - name: Publish to NPM + run: npm publish --tag ${{ steps.npm-tag.outputs.tag }} --provenance + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + diff --git a/package.json b/package.json index 20341bd8f..2b1a40d5f 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,20 @@ { - "name": "cmux", + "name": "@coder/cmux", "version": "0.3.0", "description": "cmux - coder multiplexer", "main": "dist/main.js", + "bin": { + "cmux": "dist/main.js" + }, "license": "AGPL-3.0-only", + "repository": { + "type": "git", + "url": "https://github.com/coder/cmux.git" + }, + "publishConfig": { + "access": "public", + "provenance": true + }, "scripts": { "dev": "make dev", "prebuild:main": "./scripts/generate-version.sh", @@ -124,6 +135,13 @@ "vite-plugin-top-level-await": "^1.6.0", "ws": "^8.18.3" }, + "files": [ + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.wasm", + "README.md", + "LICENSE" + ], "build": { "appId": "com.cmux.app", "productName": "cmux", From cbdacfa67719cb12e296a5d2640e0fd6f0c4643c Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 20 Oct 2025 19:09:43 -0400 Subject: [PATCH 02/13] =?UTF-8?q?=F0=9F=A4=96=20Fix=20npm=20CLI=20bin:=20A?= =?UTF-8?q?dd=20shebang=20and=20default=20to=20server=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add shebang to src/main.ts so it's executable as a CLI - Auto-detect execution context: CLI vs Electron - Default to server mode when run via npm/npx (no Electron deps needed) - Preserve Electron desktop mode when launched as Electron app This makes 'npx @coder/cmux' work out of the box without requiring Electron dependencies or 'server' argument. Generated with cmux --- src/main.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 603e0dced..21f4a39d7 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,8 +1,17 @@ +#!/usr/bin/env node /** * The main CLI entrypoint for cmux. + * + * When run as a CLI (via npm/npx), defaults to server mode. + * When run as an Electron app, runs desktop mode. */ -const isServer = process.argv.length > 2 && process.argv[2] === "server"; +// Check if running as CLI or Electron +const isElectron = process.versions && process.versions.electron !== undefined; + +// CLI usage: run server by default (unless --desktop flag is passed) +// Electron usage: run desktop +const isServer = !isElectron || process.argv.includes("--server"); if (isServer) { // eslint-disable-next-line @typescript-eslint/no-require-imports From e299160545a24f1cc0abe3236bdf9d40c2f28130 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 20 Oct 2025 19:11:45 -0400 Subject: [PATCH 03/13] Move server runtime dependencies to dependencies section - Move cors, express, ws from devDependencies to dependencies - These are required at runtime for server mode to work - Fixes 'cors cannot be found' error when running as npm package --- package.json | 9 +++++---- src/main.ts | 13 +------------ 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 2b1a40d5f..6c24cbf77 100644 --- a/package.json +++ b/package.json @@ -52,11 +52,13 @@ "ai-tokenizer": "^1.0.3", "chalk": "^5.6.2", "cmdk": "^1.0.0", + "cors": "^2.8.5", "crc-32": "^1.2.2", "diff": "^8.0.2", "disposablestack": "^1.1.7", "electron-updater": "^6.6.2", "escape-html": "^1.0.3", + "express": "^5.1.0", "jsonc-parser": "^3.3.1", "lru-cache": "^11.2.2", "markdown-it": "^14.1.0", @@ -78,6 +80,7 @@ "source-map-support": "^0.5.21", "undici": "^7.16.0", "write-file-atomic": "^6.0.0", + "ws": "^8.18.3", "zod": "^4.1.11", "zod-to-json-schema": "^3.24.6" }, @@ -112,7 +115,6 @@ "@vitejs/plugin-react": "^4.0.0", "babel-plugin-react-compiler": "^1.0.0", "concurrently": "^8.2.0", - "cors": "^2.8.5", "dotenv": "^17.2.3", "electron": "^38.2.1", "electron-builder": "^24.6.0", @@ -121,7 +123,6 @@ "eslint": "^9.36.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", - "express": "^5.1.0", "jest": "^30.1.3", "playwright": "^1.56.0", "prettier": "^3.6.2", @@ -132,13 +133,13 @@ "typescript-eslint": "^8.45.0", "vite": "^4.4.0", "vite-plugin-svgr": "^4.5.0", - "vite-plugin-top-level-await": "^1.6.0", - "ws": "^8.18.3" + "vite-plugin-top-level-await": "^1.6.0" }, "files": [ "dist/**/*.js", "dist/**/*.js.map", "dist/**/*.wasm", + "dist/**/*.html", "README.md", "LICENSE" ], diff --git a/src/main.ts b/src/main.ts index 21f4a39d7..b2ef92cf0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,17 +1,6 @@ #!/usr/bin/env node -/** - * The main CLI entrypoint for cmux. - * - * When run as a CLI (via npm/npx), defaults to server mode. - * When run as an Electron app, runs desktop mode. - */ -// Check if running as CLI or Electron -const isElectron = process.versions && process.versions.electron !== undefined; - -// CLI usage: run server by default (unless --desktop flag is passed) -// Electron usage: run desktop -const isServer = !isElectron || process.argv.includes("--server"); +const isServer = process.argv.length > 2 && process.argv[2] === "server"; if (isServer) { // eslint-disable-next-line @typescript-eslint/no-require-imports From 234bb967ba93bfa51122dd93859a5ecbc05bee5f Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 20 Oct 2025 19:19:08 -0400 Subject: [PATCH 04/13] Move UI-only dependencies to devDependencies React, emotion, markdown/mermaid rendering, and other UI packages are only needed for the Electron renderer, not the CLI/server. This reduces npm package install size and dependencies. --- package.json | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 6c24cbf77..cdd3587da 100644 --- a/package.json +++ b/package.json @@ -46,37 +46,18 @@ "dependencies": { "@ai-sdk/anthropic": "^2.0.29", "@ai-sdk/openai": "^2.0.52", - "@emotion/react": "^11.14.0", - "@emotion/styled": "^11.14.1", "ai": "^5.0.72", "ai-tokenizer": "^1.0.3", "chalk": "^5.6.2", - "cmdk": "^1.0.0", "cors": "^2.8.5", "crc-32": "^1.2.2", "diff": "^8.0.2", "disposablestack": "^1.1.7", "electron-updater": "^6.6.2", - "escape-html": "^1.0.3", "express": "^5.1.0", "jsonc-parser": "^3.3.1", "lru-cache": "^11.2.2", - "markdown-it": "^14.1.0", - "mermaid": "^11.12.0", "minimist": "^1.2.8", - "posthog-js": "^1.276.0", - "react": "^18.2.0", - "react-compiler-runtime": "^1.0.0", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", - "react-dom": "^18.2.0", - "react-markdown": "^10.1.0", - "rehype-katex": "^7.0.1", - "rehype-raw": "^7.0.0", - "rehype-sanitize": "^6.0.0", - "remark-gfm": "^4.0.1", - "remark-math": "^6.0.0", - "shiki": "^3.13.0", "source-map-support": "^0.5.21", "undici": "^7.16.0", "write-file-atomic": "^6.0.0", @@ -86,6 +67,8 @@ }, "devDependencies": { "@emotion/babel-plugin": "^11.13.5", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", "@eslint/js": "^9.36.0", "@playwright/test": "^1.56.0", "@storybook/addon-essentials": "^8.6.14", @@ -114,6 +97,7 @@ "@typescript/native-preview": "^7.0.0-dev.20251014.1", "@vitejs/plugin-react": "^4.0.0", "babel-plugin-react-compiler": "^1.0.0", + "cmdk": "^1.0.0", "concurrently": "^8.2.0", "dotenv": "^17.2.3", "electron": "^38.2.1", @@ -123,9 +107,25 @@ "eslint": "^9.36.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", + "escape-html": "^1.0.3", "jest": "^30.1.3", + "markdown-it": "^14.1.0", + "mermaid": "^11.12.0", "playwright": "^1.56.0", + "posthog-js": "^1.276.0", "prettier": "^3.6.2", + "react": "^18.2.0", + "react-compiler-runtime": "^1.0.0", + "react-dnd": "^16.0.1", + "react-dnd-html5-backend": "^16.0.1", + "react-dom": "^18.2.0", + "react-markdown": "^10.1.0", + "rehype-katex": "^7.0.1", + "rehype-raw": "^7.0.0", + "rehype-sanitize": "^6.0.0", + "remark-gfm": "^4.0.1", + "remark-math": "^6.0.0", + "shiki": "^3.13.0", "storybook": "^8.6.14", "ts-jest": "^29.4.4", "tsc-alias": "^1.8.16", From 5541c46d385592508e21c51a79eedfe93a325bbc Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 20 Oct 2025 19:19:54 -0400 Subject: [PATCH 05/13] Include electron in dependencies for full desktop app via npm Users can now install the full Electron desktop app via npm: npm install -g @coder/cmux Running 'cmux' launches the desktop app by default. Running 'cmux server' runs the server mode. Added dist/assets/* and dist/**/*.css to published files for renderer. --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index cdd3587da..89df50be3 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "crc-32": "^1.2.2", "diff": "^8.0.2", "disposablestack": "^1.1.7", + "electron": "^38.2.1", "electron-updater": "^6.6.2", "express": "^5.1.0", "jsonc-parser": "^3.3.1", @@ -100,7 +101,6 @@ "cmdk": "^1.0.0", "concurrently": "^8.2.0", "dotenv": "^17.2.3", - "electron": "^38.2.1", "electron-builder": "^24.6.0", "electron-devtools-installer": "^4.0.0", "electron-mock-ipc": "^0.3.12", @@ -140,6 +140,8 @@ "dist/**/*.js.map", "dist/**/*.wasm", "dist/**/*.html", + "dist/**/*.css", + "dist/assets/**/*", "README.md", "LICENSE" ], From 93d5a999b290860ecb3376f73c7e1d75b426e3ec Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 20 Oct 2025 19:21:01 -0400 Subject: [PATCH 06/13] Update lockfile after dependency reorganization --- bun.lock | 82 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 52 insertions(+), 30 deletions(-) diff --git a/bun.lock b/bun.lock index 80edff981..d72e1a4ec 100644 --- a/bun.lock +++ b/bun.lock @@ -6,43 +6,30 @@ "dependencies": { "@ai-sdk/anthropic": "^2.0.29", "@ai-sdk/openai": "^2.0.52", - "@emotion/react": "^11.14.0", - "@emotion/styled": "^11.14.1", "ai": "^5.0.72", "ai-tokenizer": "^1.0.3", "chalk": "^5.6.2", - "cmdk": "^1.0.0", + "cors": "^2.8.5", "crc-32": "^1.2.2", "diff": "^8.0.2", "disposablestack": "^1.1.7", + "electron": "^38.2.1", "electron-updater": "^6.6.2", - "escape-html": "^1.0.3", + "express": "^5.1.0", "jsonc-parser": "^3.3.1", "lru-cache": "^11.2.2", - "markdown-it": "^14.1.0", - "mermaid": "^11.12.0", "minimist": "^1.2.8", - "posthog-js": "^1.276.0", - "react": "^18.2.0", - "react-compiler-runtime": "^1.0.0", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", - "react-dom": "^18.2.0", - "react-markdown": "^10.1.0", - "rehype-katex": "^7.0.1", - "rehype-raw": "^7.0.0", - "rehype-sanitize": "^6.0.0", - "remark-gfm": "^4.0.1", - "remark-math": "^6.0.0", - "shiki": "^3.13.0", "source-map-support": "^0.5.21", "undici": "^7.16.0", "write-file-atomic": "^6.0.0", + "ws": "^8.18.3", "zod": "^4.1.11", "zod-to-json-schema": "^3.24.6", }, "devDependencies": { "@emotion/babel-plugin": "^11.13.5", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", "@eslint/js": "^9.36.0", "@playwright/test": "^1.56.0", "@storybook/addon-essentials": "^8.6.14", @@ -71,20 +58,34 @@ "@typescript/native-preview": "^7.0.0-dev.20251014.1", "@vitejs/plugin-react": "^4.0.0", "babel-plugin-react-compiler": "^1.0.0", + "cmdk": "^1.0.0", "concurrently": "^8.2.0", - "cors": "^2.8.5", "dotenv": "^17.2.3", - "electron": "^38.2.1", "electron-builder": "^24.6.0", "electron-devtools-installer": "^4.0.0", "electron-mock-ipc": "^0.3.12", + "escape-html": "^1.0.3", "eslint": "^9.36.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", - "express": "^5.1.0", "jest": "^30.1.3", + "markdown-it": "^14.1.0", + "mermaid": "^11.12.0", "playwright": "^1.56.0", + "posthog-js": "^1.276.0", "prettier": "^3.6.2", + "react": "^18.2.0", + "react-compiler-runtime": "^1.0.0", + "react-dnd": "^16.0.1", + "react-dnd-html5-backend": "^16.0.1", + "react-dom": "^18.2.0", + "react-markdown": "^10.1.0", + "rehype-katex": "^7.0.1", + "rehype-raw": "^7.0.0", + "rehype-sanitize": "^6.0.0", + "remark-gfm": "^4.0.1", + "remark-math": "^6.0.0", + "shiki": "^3.13.0", "storybook": "^8.6.14", "ts-jest": "^29.4.4", "tsc-alias": "^1.8.16", @@ -93,7 +94,6 @@ "vite": "^4.4.0", "vite-plugin-svgr": "^4.5.0", "vite-plugin-top-level-await": "^1.6.0", - "ws": "^8.18.3", }, }, }, @@ -2294,7 +2294,7 @@ "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], - "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], "react-markdown": ["react-markdown@10.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "html-url-attributes": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, "peerDependencies": { "@types/react": ">=18", "react": ">=18" } }, "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ=="], @@ -2656,7 +2656,7 @@ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - "uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], + "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], "v8-to-istanbul": ["v8-to-istanbul@9.3.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA=="], @@ -3008,8 +3008,6 @@ "hast-util-to-parse5/property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="], - "hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], - "hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], "htmlparser2/entities": ["entities@1.1.2", "", {}, "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="], @@ -3144,8 +3142,6 @@ "mermaid/stylis": ["stylis@4.3.6", "", {}, "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="], - "mermaid/uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], @@ -3170,7 +3166,7 @@ "pretty-format/@jest/schemas": ["@jest/schemas@30.0.5", "", { "dependencies": { "@sinclair/typebox": "^0.34.0" } }, "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA=="], - "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + "pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], "raw-body/iconv-lite": ["iconv-lite@0.7.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ=="], @@ -3226,6 +3222,8 @@ "vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "vite-plugin-top-level-await/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], + "wait-port/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], "wait-port/commander": ["commander@3.0.2", "", {}, "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow=="], @@ -3490,6 +3488,8 @@ "jest-circus/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "jest-circus/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + "jest-cli/@jest/test-result/@jest/console": ["@jest/console@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "jest-message-util": "30.2.0", "jest-util": "30.2.0", "slash": "^3.0.0" } }, "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ=="], "jest-cli/@jest/types/@jest/schemas": ["@jest/schemas@30.0.5", "", { "dependencies": { "@sinclair/typebox": "^0.34.0" } }, "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA=="], @@ -3558,18 +3558,28 @@ "jest-diff/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "jest-diff/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + "jest-each/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "jest-each/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "jest-each/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "jest-leak-detector/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + "jest-matcher-utils/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "jest-matcher-utils/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "jest-matcher-utils/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + "jest-message-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "jest-message-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "jest-message-util/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + "jest-process-manager/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "jest-process-manager/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -3610,6 +3620,8 @@ "jest-snapshot/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "jest-snapshot/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + "jest-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "jest-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -3748,6 +3760,8 @@ "create-jest/jest-config/babel-jest/babel-preset-jest": ["babel-preset-jest@29.6.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA=="], + "create-jest/jest-config/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + "expect/jest-matcher-utils/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "expect/jest-matcher-utils/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -3866,6 +3880,8 @@ "jest-resolve-dependencies/jest-snapshot/jest-util/ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], + "jest-resolve/jest-validate/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + "jest-validate/@jest/types/@jest/schemas/@sinclair/typebox": ["@sinclair/typebox@0.34.41", "", {}, "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g=="], "jest/@jest/types/@jest/schemas/@sinclair/typebox": ["@sinclair/typebox@0.34.41", "", {}, "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g=="], @@ -3934,6 +3950,8 @@ "@storybook/test-runner/jest/@jest/core/jest-config/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + "@storybook/test-runner/jest/@jest/core/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + "@storybook/test-runner/jest/jest-cli/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "@storybook/test-runner/jest/jest-cli/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -4028,6 +4046,10 @@ "@storybook/test-runner/jest/jest-cli/jest-config/babel-jest/babel-preset-jest": ["babel-preset-jest@29.6.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA=="], + "@storybook/test-runner/jest/jest-cli/jest-config/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "@storybook/test-runner/jest/jest-cli/jest-validate/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + "jest-config/jest-circus/jest-runtime/@jest/transform/babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], "jest-config/jest-circus/jest-snapshot/@jest/transform/babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], From 7466d9e58395f31421bf8bf08af7e828888972fe Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 20 Oct 2025 19:22:39 -0400 Subject: [PATCH 07/13] Add *.tgz to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ba563038b..e08390f72 100644 --- a/.gitignore +++ b/.gitignore @@ -103,3 +103,4 @@ __pycache__ tmpfork .cmux-agent-cli storybook-static/ +*.tgz From 892db01449c0c52fee2feff15f2220c457e6c29e Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 20 Oct 2025 19:24:35 -0400 Subject: [PATCH 08/13] Add bin wrapper to properly launch Electron The bin script now: - Detects if 'server' arg is passed and runs Node directly - Otherwise spawns the electron binary to launch the desktop app This makes 'cmux' launch the Electron app and 'cmux server' run server mode. --- bin/cmux.js | 26 ++++++++++++++++++++++++++ package.json | 3 ++- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100755 bin/cmux.js diff --git a/bin/cmux.js b/bin/cmux.js new file mode 100755 index 000000000..c6828be94 --- /dev/null +++ b/bin/cmux.js @@ -0,0 +1,26 @@ +#!/usr/bin/env node + +const { spawn } = require("child_process"); +const path = require("path"); + +// Check if we're running in server mode +const isServer = process.argv.includes("server"); + +if (isServer) { + // Run server mode directly with Node + require("../dist/main.js"); +} else { + // Launch Electron desktop app + const electron = require("electron"); + const appPath = path.join(__dirname, ".."); + + const child = spawn(electron, [appPath, ...process.argv.slice(2)], { + stdio: "inherit", + windowsHide: false, + }); + + child.on("close", (code) => { + process.exit(code); + }); +} + diff --git a/package.json b/package.json index 89df50be3..5766b686d 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "cmux - coder multiplexer", "main": "dist/main.js", "bin": { - "cmux": "dist/main.js" + "cmux": "bin/cmux.js" }, "license": "AGPL-3.0-only", "repository": { @@ -136,6 +136,7 @@ "vite-plugin-top-level-await": "^1.6.0" }, "files": [ + "bin/cmux.js", "dist/**/*.js", "dist/**/*.js.map", "dist/**/*.wasm", From 6127d379ddcd4462afc4a87fd97bcefcdf611355 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 20 Oct 2025 19:25:29 -0400 Subject: [PATCH 09/13] Simplify: handle Electron spawning in main.ts instead of separate bin wrapper --- bin/cmux.js | 26 -------------------------- package.json | 3 +-- src/main.ts | 24 ++++++++++++++++++++++-- 3 files changed, 23 insertions(+), 30 deletions(-) delete mode 100755 bin/cmux.js diff --git a/bin/cmux.js b/bin/cmux.js deleted file mode 100755 index c6828be94..000000000 --- a/bin/cmux.js +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env node - -const { spawn } = require("child_process"); -const path = require("path"); - -// Check if we're running in server mode -const isServer = process.argv.includes("server"); - -if (isServer) { - // Run server mode directly with Node - require("../dist/main.js"); -} else { - // Launch Electron desktop app - const electron = require("electron"); - const appPath = path.join(__dirname, ".."); - - const child = spawn(electron, [appPath, ...process.argv.slice(2)], { - stdio: "inherit", - windowsHide: false, - }); - - child.on("close", (code) => { - process.exit(code); - }); -} - diff --git a/package.json b/package.json index 5766b686d..89df50be3 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "cmux - coder multiplexer", "main": "dist/main.js", "bin": { - "cmux": "bin/cmux.js" + "cmux": "dist/main.js" }, "license": "AGPL-3.0-only", "repository": { @@ -136,7 +136,6 @@ "vite-plugin-top-level-await": "^1.6.0" }, "files": [ - "bin/cmux.js", "dist/**/*.js", "dist/**/*.js.map", "dist/**/*.wasm", diff --git a/src/main.ts b/src/main.ts index b2ef92cf0..837bb8f1c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,11 +1,31 @@ #!/usr/bin/env node -const isServer = process.argv.length > 2 && process.argv[2] === "server"; +const isServer = process.argv.includes("server"); +const isElectron = process.versions.electron !== undefined; if (isServer) { // eslint-disable-next-line @typescript-eslint/no-require-imports require("./main-server"); -} else { +} else if (isElectron) { + // Already running in Electron, launch desktop // eslint-disable-next-line @typescript-eslint/no-require-imports require("./main-desktop"); +} else { + // Running in Node, need to spawn Electron + // eslint-disable-next-line @typescript-eslint/no-require-imports + const { spawn } = require("child_process"); + // eslint-disable-next-line @typescript-eslint/no-require-imports + const path = require("path"); + + // eslint-disable-next-line @typescript-eslint/no-require-imports + const electron = require("electron"); + const appPath = path.join(__dirname, ".."); + + const child = spawn(electron, [appPath, ...process.argv.slice(2)], { + stdio: "inherit", + }); + + child.on("close", (code) => { + process.exit(code); + }); } From 53636bfee8735ffdac07e0eb8c4c87e854594f33 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 20 Oct 2025 19:26:24 -0400 Subject: [PATCH 10/13] Revert electron spawning logic - will fix later --- src/main.ts | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/src/main.ts b/src/main.ts index 837bb8f1c..b2ef92cf0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,31 +1,11 @@ #!/usr/bin/env node -const isServer = process.argv.includes("server"); -const isElectron = process.versions.electron !== undefined; +const isServer = process.argv.length > 2 && process.argv[2] === "server"; if (isServer) { // eslint-disable-next-line @typescript-eslint/no-require-imports require("./main-server"); -} else if (isElectron) { - // Already running in Electron, launch desktop - // eslint-disable-next-line @typescript-eslint/no-require-imports - require("./main-desktop"); } else { - // Running in Node, need to spawn Electron - // eslint-disable-next-line @typescript-eslint/no-require-imports - const { spawn } = require("child_process"); // eslint-disable-next-line @typescript-eslint/no-require-imports - const path = require("path"); - - // eslint-disable-next-line @typescript-eslint/no-require-imports - const electron = require("electron"); - const appPath = path.join(__dirname, ".."); - - const child = spawn(electron, [appPath, ...process.argv.slice(2)], { - stdio: "inherit", - }); - - child.on("close", (code) => { - process.exit(code); - }); + require("./main-desktop"); } From 3c14fd7a53c3d6d43efa10a5057b7010896310b0 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 20 Oct 2025 19:26:32 -0400 Subject: [PATCH 11/13] Remove provenance from publishConfig Provenance is auto-enabled via --provenance flag in CI workflow. Local manual publishing doesn't support it (needs GitHub Actions OIDC). --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 89df50be3..2dae3b465 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,7 @@ "url": "https://github.com/coder/cmux.git" }, "publishConfig": { - "access": "public", - "provenance": true + "access": "public" }, "scripts": { "dev": "make dev", From f84e2542e20ef7e02fb31b1244ec5b2096cdf612 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 20 Oct 2025 19:29:20 -0400 Subject: [PATCH 12/13] Move electron back to devDependencies and add author electron-builder requires electron to be in devDependencies only. --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 2dae3b465..26092b81e 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "@coder/cmux", "version": "0.3.0", "description": "cmux - coder multiplexer", + "author": "Coder", "main": "dist/main.js", "bin": { "cmux": "dist/main.js" @@ -52,7 +53,6 @@ "crc-32": "^1.2.2", "diff": "^8.0.2", "disposablestack": "^1.1.7", - "electron": "^38.2.1", "electron-updater": "^6.6.2", "express": "^5.1.0", "jsonc-parser": "^3.3.1", @@ -100,6 +100,7 @@ "cmdk": "^1.0.0", "concurrently": "^8.2.0", "dotenv": "^17.2.3", + "electron": "^38.2.1", "electron-builder": "^24.6.0", "electron-devtools-installer": "^4.0.0", "electron-mock-ipc": "^0.3.12", From 00b67baedb43a0b137b470530ce62015ea7ce2cb Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 20 Oct 2025 19:33:01 -0400 Subject: [PATCH 13/13] Remove NPM_TOKEN - OIDC handles auth automatically --- .github/workflows/publish-npm.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index 1f63a9ba1..dbe336e16 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -43,6 +43,4 @@ jobs: - name: Publish to NPM run: npm publish --tag ${{ steps.npm-tag.outputs.tag }} --provenance - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}