From 96dd87cc358d738f156958fdbf5984a66175e5c1 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:26:19 +0800 Subject: [PATCH 01/24] release: bump package version to 0.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8a7444d..2aa92cd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jev-mcp", - "version": "0.4.1", + "version": "0.5.0", "private": true, "description": "Unofficial conservative MCP server exposing TypeSafe AI Jev as a secondary probabilistic decision signal.", "type": "module", From ea69cafc23890c0b7db9d0a131155aada3afdcff Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:26:21 +0800 Subject: [PATCH 02/24] release: bump server version to 0.5.0 --- src/core.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core.ts b/src/core.ts index 2652876..296873f 100644 --- a/src/core.ts +++ b/src/core.ts @@ -31,7 +31,7 @@ export type JevResponse = { }; }; -export const VERSION = "0.4.1"; +export const VERSION = "0.5.0"; export const JEV_ADVISORY = { authority: "secondary_advisory", From 670f7ff554031c93eb85ea4aba612c5fc9057630 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:26:24 +0800 Subject: [PATCH 03/24] release: pin Unix installer to v0.5.0 --- scripts/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install.sh b/scripts/install.sh index 35a6e2b..52624d2 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -22,7 +22,7 @@ fi config_home="${JEV_MCP_CONFIG_HOME:-$HOME/.jev-mcp}" runtime="${JEV_MCP_RUNTIME_DIR:-$config_home/runtime}" repo_url="${JEV_MCP_REPO_URL:-https://github.com/Afloat16/jev-mcp.git}" -git_ref="${JEV_MCP_GIT_REF:-main}" +git_ref="${JEV_MCP_GIT_REF:-v0.5.0}" mkdir -p "$config_home" chmod 700 "$config_home" 2>/dev/null || true From f01da1d30d5ca10f09d1dc4ccf59660b5249f067 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:26:26 +0800 Subject: [PATCH 04/24] release: pin Windows installer to v0.5.0 --- scripts/install.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install.ps1 b/scripts/install.ps1 index 9fe5009..76e062f 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -35,7 +35,7 @@ $repoUrl = if ([string]::IsNullOrWhiteSpace($env:JEV_MCP_REPO_URL)) { } $gitRef = if ([string]::IsNullOrWhiteSpace($env:JEV_MCP_GIT_REF)) { - "main" + "v0.5.0" } else { $env:JEV_MCP_GIT_REF } From f4d4080a7a492a98fd80c76794345fba0263003c Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:26:29 +0800 Subject: [PATCH 05/24] release: finalize v0.5.0 changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3be11e..96b97bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,13 @@ All notable project changes are documented here. ## Unreleased +## 0.5.0 — Multi-client one-click installation + - Added cross-platform bootstrap installers that create/update a durable local runtime at `~/.jev-mcp/runtime` instead of relying on npm Git-package execution at every MCP startup. +- Stable bootstrap installs now default to the `v0.5.0` tag; advanced users can + set `JEV_MCP_GIT_REF=main` to follow the development channel. - Added one-command setup for Codex, Claude Code, Kimi Code, ZCode, Cursor, Gemini CLI, Windsurf-compatible config, generic `.agents`, and project-scoped VS Code MCP configuration. From e549828ff779a6b6782fd69f0ee7ef6eb7946641 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:26:31 +0800 Subject: [PATCH 06/24] docs: document stable installer channel --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 1c7bef1..fa3ce5d 100644 --- a/README.md +++ b/README.md @@ -259,8 +259,7 @@ consume provider credits. | API dependency | TypeSafe-hosted System One API | | Stability | pre-1.0; behavior may evolve | -The project follows semantic versioning in spirit, but while it remains below -`1.0.0`, minor releases may refine tool schemas or behavior. Breaking changes +The project follows semantic versioning in spirit. Stable one-click installs are pinned to the current release tag (`v0.5.0`) rather than `main`; users who intentionally want development builds can set `JEV_MCP_GIT_REF=main`. While the project remains below `1.0.0`, minor releases may refine tool schemas or behavior. Breaking changes should be documented in [CHANGELOG.md](CHANGELOG.md) and migration notes. ## Documentation From 3e1e6a1a45622ace2e3d56491b7c00cbb474212a Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:26:34 +0800 Subject: [PATCH 07/24] docs: mark v0.5.0 stable installer --- README.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 3870b91..80b05df 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -223,7 +223,7 @@ npm run inspect | License | MIT | | npm 发布 | 主动禁用 | | 外部依赖 | TypeSafe-hosted System One API | -| 稳定性 | pre-1.0,行为仍可能演进 | +| 稳定性 | pre-1.0;一键安装默认固定到 `v0.5.0` 稳定 tag | ## 文档 From 6d98a30e7fe3770730f5fbd0eca8569f8d0f2e64 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:26:36 +0800 Subject: [PATCH 08/24] docs: add stable and development channels --- docs/INSTALLATION.md | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md index 6019661..ad6caad 100644 --- a/docs/INSTALLATION.md +++ b/docs/INSTALLATION.md @@ -148,7 +148,7 @@ Rerun the installer: curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- codex ``` -The managed runtime is fetched again and checked out to the configured ref. +The managed runtime is fetched again and checked out to the configured ref. By default that ref is the stable `v0.5.0` tag. ## Uninstalling a client integration @@ -194,6 +194,32 @@ The bootstrap recognizes: | `JEV_MCP_CONFIG_HOME` | Override `~/.jev-mcp` | | `JEV_MCP_RUNTIME_DIR` | Override the managed runtime checkout | | `JEV_MCP_REPO_URL` | Override the Git repository URL | -| `JEV_MCP_GIT_REF` | Override the fetched branch/tag/ref | +| `JEV_MCP_GIT_REF` | Override the fetched branch/tag/ref; default is `v0.5.0` | These are primarily useful for testing, forks, and pinned deployments. + + +## Stable vs development channel + +The bootstrap script itself is downloaded from `main`, but the installed +runtime defaults to the stable release tag: + +```text +v0.5.0 +``` + +To intentionally follow the development branch: + +```bash +JEV_MCP_GIT_REF=main curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- codex +``` + +For PowerShell: + +```powershell +$env:JEV_MCP_GIT_REF = "main" +& ([scriptblock]::Create((irm https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.ps1))) -Target codex +``` + +Development-channel users should expect behavior to change before the next +tagged release. From 7fcfe6b3a0fdb12d3e02fece6755f294495d541e Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:26:38 +0800 Subject: [PATCH 09/24] docs: document automatic release process --- docs/RELEASING.md | 85 +++++++++++++++++++++++++++++------------------ 1 file changed, 52 insertions(+), 33 deletions(-) diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 028f0ba..8f25ba8 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -4,50 +4,69 @@ The repository is intentionally `private: true` in `package.json` to prevent accidental npm publication. Releases are GitHub source releases, not npm packages. -## Automated path +## Release model -After Git and GitHub CLI are configured: +Normal releases are now driven by the repository itself: -```bash -./scripts/publish-github.sh jev-mcp public +1. prepare a release PR that updates `package.json`, `src/core.ts`, + `CHANGELOG.md`, and any stable installer defaults; +2. merge only after CI passes; +3. the post-CI auto-release workflow sees an untagged version on `main`; +4. it creates the annotated `vX.Y.Z` tag and GitHub Release assets. + +No maintainer PAT or TypeSafe credential is required by the release workflow. + +The release contains: + +```text +jev-mcp-X.Y.Z.zip +jev-mcp-X.Y.Z.tar.gz +SHA256SUMS.txt ``` -or on PowerShell: +Release notes are extracted from the matching `CHANGELOG.md` section. + +## Manual fallback + +If automatic release is intentionally disabled: -```powershell -./scripts/publish-github.ps1 -RepoName jev-mcp -Visibility public +```bash +git checkout main +git pull +npm ci +npm run check +git tag -a v0.5.0 -m "jev-mcp v0.5.0" +git push origin v0.5.0 ``` -The script checks secrets and the build, creates/pushes the repository if -needed, then pushes the version tag. The tag triggers the GitHub release -workflow, which validates the project again and publishes source archives. +The tag-triggered release workflow validates the tag against +`package.json` and creates the same assets. + +## Stable installer channel -## Manual release path +The public bootstrap script is fetched from `main`, but the installed runtime +must default to the latest stable version tag. For v0.5.0: -1. Update `package.json` and `CHANGELOG.md`. -2. Run `npm run check`. -3. Commit the changes. -4. Create an annotated tag, e.g. `git tag -a v0.4.1 -m "jev-mcp v0.4.1"`. -5. Push `main` and the tag. -6. The GitHub Actions release workflow creates the GitHub Release. +```text +JEV_MCP_GIT_REF default = v0.5.0 +``` -## Manual prerequisites only +Development users can opt into: + +```text +JEV_MCP_GIT_REF=main +``` -Before the automated publishing script can act on your GitHub account, you must -personally complete the account-bound steps: +When cutting the next release, update the default stable ref in both +`scripts/install.sh` and `scripts/install.ps1`. -1. Install GitHub CLI (`gh`) if it is not already installed. -2. Authenticate it with `gh auth login` (do not send access tokens to anyone). -3. Configure your own Git author identity if needed: - `git config --global user.name ...` and `git config --global user.email ...`. -4. Decide which GitHub owner/repository name should receive the project. Pass - `owner/jev-mcp` to the script if publishing under an organization. +## Release checklist -The script handles dependency installation, `package-lock.json`, staging, -secret checks, tests/build, initial commit, repository creation, push, tag, -repository topics/settings, security-scanning enablement where permitted, and -release triggering. +Before merging a version PR: -After publication, adding a branch ruleset that requires CI before merging is -recommended but intentionally left manual because organization policies and -merge preferences vary. +- version in `package.json` matches `src/core.ts`; +- `CHANGELOG.md` contains `## X.Y.Z`; +- Linux and Windows bootstrap smoke tests pass; +- Node 20/22/24 checks pass; +- stable installer default points at `vX.Y.Z`; +- no credential or user-specific path appears in the diff. From 28f9480a8e2264467c4ca659b65aad1f62c831b4 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:27:33 +0800 Subject: [PATCH 10/24] release: sync npm lockfile version to 0.5.0 --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68c8d27..e7cfa83 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jev-mcp", - "version": "0.4.1", + "version": "0.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "jev-mcp", - "version": "0.4.1", + "version": "0.5.0", "license": "MIT", "dependencies": { "@modelcontextprotocol/server": "^2.0.0", From f13dc0ea1560ed5701786ce3a21446b353ae1d7c Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:27:35 +0800 Subject: [PATCH 11/24] ci: auto-release validated versions from main --- .github/workflows/auto-release.yml | 113 +++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 .github/workflows/auto-release.yml diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml new file mode 100644 index 0000000..1c48375 --- /dev/null +++ b/.github/workflows/auto-release.yml @@ -0,0 +1,113 @@ +name: Auto Release + +on: + workflow_run: + workflows: ["CI"] + types: [completed] + +permissions: + contents: write + +jobs: + release: + if: > + github.event.workflow_run.conclusion == 'success' && + github.event.workflow_run.head_branch == 'main' + runs-on: ubuntu-latest + timeout-minutes: 15 + + steps: + - name: Checkout validated main commit + uses: actions/checkout@v7 + with: + ref: ${{ github.event.workflow_run.head_sha }} + fetch-depth: 0 + + - name: Set up Node + uses: actions/setup-node@v7 + with: + node-version: 20.x + cache: npm + + - name: Resolve version + id: version + shell: bash + run: | + set -euo pipefail + version="$(node -p "JSON.parse(require('fs').readFileSync('package.json','utf8')).version")" + tag="v${version}" + echo "version=${version}" >> "$GITHUB_OUTPUT" + echo "tag=${tag}" >> "$GITHUB_OUTPUT" + + - name: Skip existing release + id: existing + env: + GH_TOKEN: ${{ github.token }} + TAG: ${{ steps.version.outputs.tag }} + shell: bash + run: | + set -euo pipefail + if gh release view "$TAG" >/dev/null 2>&1 || git ls-remote --exit-code --tags origin "refs/tags/$TAG" >/dev/null 2>&1; then + echo "exists=true" >> "$GITHUB_OUTPUT" + else + echo "exists=false" >> "$GITHUB_OUTPUT" + fi + + - name: Verify release metadata + if: steps.existing.outputs.exists == 'false' + env: + VERSION: ${{ steps.version.outputs.version }} + shell: bash + run: | + set -euo pipefail + grep -q "^## ${VERSION}\b" CHANGELOG.md + grep -q "export const VERSION = \"${VERSION}\";" src/core.ts + grep -q "JEV_MCP_GIT_REF:-v${VERSION}" scripts/install.sh + grep -q "\"v${VERSION}\"" scripts/install.ps1 + + - name: Install locked dependencies + if: steps.existing.outputs.exists == 'false' + run: npm ci --no-audit --no-fund + + - name: Re-run repository checks + if: steps.existing.outputs.exists == 'false' + run: npm run check + + - name: Create annotated tag + if: steps.existing.outputs.exists == 'false' + env: + TAG: ${{ steps.version.outputs.tag }} + shell: bash + run: | + set -euo pipefail + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git tag -a "$TAG" -m "jev-mcp $TAG" "${{ github.event.workflow_run.head_sha }}" + git push origin "$TAG" + + - name: Build release assets + if: steps.existing.outputs.exists == 'false' + env: + VERSION: ${{ steps.version.outputs.version }} + TAG: ${{ steps.version.outputs.tag }} + shell: bash + run: | + set -euo pipefail + mkdir -p release-assets + git archive --format=zip --prefix="jev-mcp-${VERSION}/" --output="release-assets/jev-mcp-${VERSION}.zip" "$TAG" + git archive --format=tar.gz --prefix="jev-mcp-${VERSION}/" --output="release-assets/jev-mcp-${VERSION}.tar.gz" "$TAG" + sha256sum release-assets/jev-mcp-* > release-assets/SHA256SUMS.txt + awk -v version="$VERSION" ' + $0 ~ "^## " version { found=1; next } + found && /^## / { exit } + found { print } + ' CHANGELOG.md > release-assets/RELEASE_NOTES.md + test -s release-assets/RELEASE_NOTES.md + + - name: Create GitHub Release + if: steps.existing.outputs.exists == 'false' + env: + GH_TOKEN: ${{ github.token }} + TAG: ${{ steps.version.outputs.tag }} + run: | + gh release create "$TAG" release-assets/jev-mcp-*.zip release-assets/jev-mcp-*.tar.gz release-assets/SHA256SUMS.txt --verify-tag --notes-file release-assets/RELEASE_NOTES.md --title "$TAG" From 158a115e8bf5b9bc25e52f176a70578f750b9fe9 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:28:21 +0800 Subject: [PATCH 12/24] ci: make auto-release recover from partial releases --- .github/workflows/auto-release.yml | 36 +++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml index 1c48375..e9dd8cf 100644 --- a/.github/workflows/auto-release.yml +++ b/.github/workflows/auto-release.yml @@ -39,7 +39,7 @@ jobs: echo "version=${version}" >> "$GITHUB_OUTPUT" echo "tag=${tag}" >> "$GITHUB_OUTPUT" - - name: Skip existing release + - name: Inspect existing tag and release id: existing env: GH_TOKEN: ${{ github.token }} @@ -47,14 +47,21 @@ jobs: shell: bash run: | set -euo pipefail - if gh release view "$TAG" >/dev/null 2>&1 || git ls-remote --exit-code --tags origin "refs/tags/$TAG" >/dev/null 2>&1; then - echo "exists=true" >> "$GITHUB_OUTPUT" + + if gh release view "$TAG" >/dev/null 2>&1; then + echo "release_exists=true" >> "$GITHUB_OUTPUT" + else + echo "release_exists=false" >> "$GITHUB_OUTPUT" + fi + + if git ls-remote --exit-code --tags origin "refs/tags/$TAG" >/dev/null 2>&1; then + echo "tag_exists=true" >> "$GITHUB_OUTPUT" else - echo "exists=false" >> "$GITHUB_OUTPUT" + echo "tag_exists=false" >> "$GITHUB_OUTPUT" fi - name: Verify release metadata - if: steps.existing.outputs.exists == 'false' + if: steps.existing.outputs.release_exists == 'false' env: VERSION: ${{ steps.version.outputs.version }} shell: bash @@ -66,15 +73,17 @@ jobs: grep -q "\"v${VERSION}\"" scripts/install.ps1 - name: Install locked dependencies - if: steps.existing.outputs.exists == 'false' + if: steps.existing.outputs.release_exists == 'false' run: npm ci --no-audit --no-fund - name: Re-run repository checks - if: steps.existing.outputs.exists == 'false' + if: steps.existing.outputs.release_exists == 'false' run: npm run check - name: Create annotated tag - if: steps.existing.outputs.exists == 'false' + if: > + steps.existing.outputs.release_exists == 'false' && + steps.existing.outputs.tag_exists == 'false' env: TAG: ${{ steps.version.outputs.tag }} shell: bash @@ -85,8 +94,15 @@ jobs: git tag -a "$TAG" -m "jev-mcp $TAG" "${{ github.event.workflow_run.head_sha }}" git push origin "$TAG" + - name: Fetch release tag + if: steps.existing.outputs.release_exists == 'false' + env: + TAG: ${{ steps.version.outputs.tag }} + shell: bash + run: git fetch --force origin "refs/tags/$TAG:refs/tags/$TAG" + - name: Build release assets - if: steps.existing.outputs.exists == 'false' + if: steps.existing.outputs.release_exists == 'false' env: VERSION: ${{ steps.version.outputs.version }} TAG: ${{ steps.version.outputs.tag }} @@ -105,7 +121,7 @@ jobs: test -s release-assets/RELEASE_NOTES.md - name: Create GitHub Release - if: steps.existing.outputs.exists == 'false' + if: steps.existing.outputs.release_exists == 'false' env: GH_TOKEN: ${{ github.token }} TAG: ${{ steps.version.outputs.tag }} From 3661e2467ab0a7ec475e95e4c6a4d6dd24db49e0 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:29:31 +0800 Subject: [PATCH 13/24] docs: pin stable bootstrap URL to v0.5.0 --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index fa3ce5d..7b16621 100644 --- a/README.md +++ b/README.md @@ -102,34 +102,34 @@ macOS / Linux: ```bash # Codex -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- codex +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- codex # Claude Code -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- claude-code +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- claude-code # Kimi Code -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- kimi +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- kimi # ZCode -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- zcode +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- zcode # Cursor -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- cursor +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- cursor # Gemini CLI -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- gemini +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- gemini ``` Windows PowerShell (replace `codex` with another target as needed): ```powershell -& ([scriptblock]::Create((irm https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.ps1))) -Target codex +& ([scriptblock]::Create((irm https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.ps1))) -Target codex ``` To configure every detected user-level client: ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash ``` The key is stored only in `~/.jev-mcp/.env`; client MCP configs contain no From 699ef784dc9c683199b58cbd7fc36aded3afb445 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:29:33 +0800 Subject: [PATCH 14/24] docs: pin Chinese stable bootstrap URL --- README.zh-CN.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 80b05df..bddf4e1 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -81,34 +81,34 @@ macOS / Linux: ```bash # Codex -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- codex +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- codex # Claude Code -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- claude-code +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- claude-code # Kimi Code -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- kimi +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- kimi # ZCode -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- zcode +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- zcode # Cursor -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- cursor +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- cursor # Gemini CLI -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- gemini +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- gemini ``` Windows PowerShell(把 `codex` 换成其他目标即可): ```powershell -& ([scriptblock]::Create((irm https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.ps1))) -Target codex +& ([scriptblock]::Create((irm https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.ps1))) -Target codex ``` 自动配置检测到的用户级客户端: ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash ``` TypeSafe key 只保存在本机 `~/.jev-mcp/.env`,不会写入各 AI 的 MCP 配置; From a048a6b8ee047a5ffff50f6a545203a2edab87aa Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:29:35 +0800 Subject: [PATCH 15/24] docs: pin quick start to stable release --- docs/QUICKSTART.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/QUICKSTART.md b/docs/QUICKSTART.md index c9f500c..9f22fac 100644 --- a/docs/QUICKSTART.md +++ b/docs/QUICKSTART.md @@ -17,13 +17,13 @@ client configuration. Codex on macOS/Linux: ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- codex +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- codex ``` Codex on Windows PowerShell: ```powershell -& ([scriptblock]::Create((irm https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.ps1))) -Target codex +& ([scriptblock]::Create((irm https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.ps1))) -Target codex ``` Other target IDs: @@ -42,7 +42,7 @@ vscode Configure every detected user-level client on macOS/Linux: ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash ``` The installer creates: From 12758e5f461a72cf53b25a74b8f7911fa259d455 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:29:38 +0800 Subject: [PATCH 16/24] docs: separate stable and development channels --- docs/INSTALLATION.md | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md index ad6caad..2eb3c68 100644 --- a/docs/INSTALLATION.md +++ b/docs/INSTALLATION.md @@ -33,43 +33,43 @@ they are changed. ### Codex ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- codex +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | env JEV_MCP_GIT_REF=main bash -s -- codex ``` ### Claude Code ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- claude-code +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- claude-code ``` ### Kimi Code ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- kimi +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- kimi ``` ### ZCode ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- zcode +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- zcode ``` ### Cursor ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- cursor +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- cursor ``` ### Gemini CLI ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- gemini +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- gemini ``` ### All detected user-level clients ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash ``` The `all` flow intentionally skips the project-scoped VS Code target. Run the @@ -80,7 +80,7 @@ installer with `vscode` from the project that should receive `.vscode/mcp.json`. ### Codex ```powershell -& ([scriptblock]::Create((irm https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.ps1))) -Target codex +& ([scriptblock]::Create((irm https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.ps1))) -Target codex ``` Replace `codex` with `claude-code`, `kimi`, `zcode`, `cursor`, @@ -89,7 +89,7 @@ Replace `codex` with `claude-code`, `kimi`, `zcode`, `cursor`, Configure all detected user-level clients: ```powershell -irm https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.ps1 | iex +irm https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.ps1 | iex ``` ## What the bootstrap does @@ -135,7 +135,7 @@ If you intentionally manage `TYPESAFE_API_KEY` outside jev-mcp, skip local credential creation: ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- codex --skip-key +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- codex --skip-key ``` The MCP process must then inherit `TYPESAFE_API_KEY` from its environment. @@ -145,7 +145,7 @@ The MCP process must then inherit `TYPESAFE_API_KEY` from its environment. Rerun the installer: ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- codex +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- codex ``` The managed runtime is fetched again and checked out to the configured ref. By default that ref is the stable `v0.5.0` tag. @@ -201,8 +201,7 @@ These are primarily useful for testing, forks, and pinned deployments. ## Stable vs development channel -The bootstrap script itself is downloaded from `main`, but the installed -runtime defaults to the stable release tag: +The stable bootstrap script and installed runtime are both pinned to the same release tag: ```text v0.5.0 @@ -211,7 +210,7 @@ v0.5.0 To intentionally follow the development branch: ```bash -JEV_MCP_GIT_REF=main curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- codex +JEV_MCP_GIT_REF=main curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- codex ``` For PowerShell: From a82b1044d7cbc0e136f5b411738d693dc7ac4533 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:29:40 +0800 Subject: [PATCH 17/24] docs: show stable bootstrap URL in CLI help --- src/cli.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index d5010b6..48df4ce 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -35,10 +35,10 @@ Targets: Recommended bootstrap: macOS/Linux: - curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | bash -s -- codex + curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- codex Windows PowerShell: - & ([scriptblock]::Create((irm https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.ps1))) -Target codex + & ([scriptblock]::Create((irm https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.ps1))) -Target codex After bootstrap, the local CLI lives under ~/.jev-mcp/runtime. `.trim()); From 42082ddbe2af43873c11afd783c14ae83879488e Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:29:43 +0800 Subject: [PATCH 18/24] ci: enforce release version consistency --- scripts/check-docs.mjs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/scripts/check-docs.mjs b/scripts/check-docs.mjs index e15595c..fa16dfd 100644 --- a/scripts/check-docs.mjs +++ b/scripts/check-docs.mjs @@ -63,6 +63,27 @@ if (!changelog.includes(`## ${pkg.version}`)) { errors.push(`CHANGELOG.md has no section for package version ${pkg.version}`); } +const core = readFileSync(join(root, "src/core.ts"), "utf8"); +const coreVersion = core.match(/export const VERSION = "([^"]+)";/)?.[1]; +if (coreVersion !== pkg.version) { + errors.push(`src/core.ts VERSION (${coreVersion ?? "missing"}) does not match package.json (${pkg.version})`); +} + +const lock = JSON.parse(readFileSync(join(root, "package-lock.json"), "utf8")); +if (lock.version !== pkg.version || lock.packages?.[""]?.version !== pkg.version) { + errors.push(`package-lock.json version does not match package.json (${pkg.version})`); +} + +const stableTag = `v${pkg.version}`; +const unixInstaller = readFileSync(join(root, "scripts/install.sh"), "utf8"); +const windowsInstaller = readFileSync(join(root, "scripts/install.ps1"), "utf8"); +if (!unixInstaller.includes(`JEV_MCP_GIT_REF:-${stableTag}`)) { + errors.push(`scripts/install.sh default ref is not ${stableTag}`); +} +if (!windowsInstaller.includes(`"${stableTag}"`)) { + errors.push(`scripts/install.ps1 default ref is not ${stableTag}`); +} + for (const required of [ "README.md", "README.zh-CN.md", From fe00c1c281bfce4ea5ba0bb803b963da504cab25 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:30:24 +0800 Subject: [PATCH 19/24] docs: fix stable and development bootstrap examples --- docs/INSTALLATION.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md index 2eb3c68..2473691 100644 --- a/docs/INSTALLATION.md +++ b/docs/INSTALLATION.md @@ -33,7 +33,7 @@ they are changed. ### Codex ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | env JEV_MCP_GIT_REF=main bash -s -- codex +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- codex ``` ### Claude Code @@ -210,7 +210,7 @@ v0.5.0 To intentionally follow the development branch: ```bash -JEV_MCP_GIT_REF=main curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- codex +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | env JEV_MCP_GIT_REF=main bash -s -- codex ``` For PowerShell: From db9cdefdbce543443af15f713fbb3c3bff8e1791 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:30:35 +0800 Subject: [PATCH 20/24] docs: fix stable and development bootstrap examples --- docs/INSTALLATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md index 2473691..3e60b1a 100644 --- a/docs/INSTALLATION.md +++ b/docs/INSTALLATION.md @@ -210,7 +210,7 @@ v0.5.0 To intentionally follow the development branch: ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | env JEV_MCP_GIT_REF=main bash -s -- codex +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- codex ``` For PowerShell: From 9efa0d91705dadbfc3f6ef83e5f1d776f96ee538 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:32:15 +0800 Subject: [PATCH 21/24] release: update Unix setup version --- setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.sh b/setup.sh index 9186316..6ead5f9 100644 --- a/setup.sh +++ b/setup.sh @@ -46,5 +46,5 @@ npm run check npm run doctor echo -echo "jev-mcp v0.4.1 setup complete." +echo "jev-mcp v0.5.0 setup complete." echo "Next: configure your MCP host using config.toml.snippet or the README example, then restart the host." From 5e5faf1e16e4cbed986db010ce7f01cc882deda2 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:32:20 +0800 Subject: [PATCH 22/24] release: update Windows setup version --- setup.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.ps1 b/setup.ps1 index e915c79..095bb4a 100644 --- a/setup.ps1 +++ b/setup.ps1 @@ -42,5 +42,5 @@ if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } Write-Host "" -Write-Host "jev-mcp v0.4.1 setup complete." +Write-Host "jev-mcp v0.5.0 setup complete." Write-Host "Next: configure your MCP host using config.toml.snippet or the README example, then restart the host." From 63393c0f99d1f5a021d37c56769c2daba6531064 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:32:22 +0800 Subject: [PATCH 23/24] docs: correct development channel command --- docs/INSTALLATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md index 3e60b1a..2473691 100644 --- a/docs/INSTALLATION.md +++ b/docs/INSTALLATION.md @@ -210,7 +210,7 @@ v0.5.0 To intentionally follow the development branch: ```bash -curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/v0.5.0/scripts/install.sh | bash -s -- codex +curl -fsSL https://raw.githubusercontent.com/Afloat16/jev-mcp/main/scripts/install.sh | env JEV_MCP_GIT_REF=main bash -s -- codex ``` For PowerShell: From 8ba6bbb7602c5e2a4dff337a1590730fd2cb5c45 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:32:25 +0800 Subject: [PATCH 24/24] ci: enforce release-facing version consistency --- scripts/check-docs.mjs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/scripts/check-docs.mjs b/scripts/check-docs.mjs index fa16dfd..0f23652 100644 --- a/scripts/check-docs.mjs +++ b/scripts/check-docs.mjs @@ -84,6 +84,22 @@ if (!windowsInstaller.includes(`"${stableTag}"`)) { errors.push(`scripts/install.ps1 default ref is not ${stableTag}`); } +const setupSh = readFileSync(join(root, "setup.sh"), "utf8"); +const setupPs = readFileSync(join(root, "setup.ps1"), "utf8"); +if (!setupSh.includes(`v${pkg.version} setup complete`)) { + errors.push(`setup.sh completion version does not match ${pkg.version}`); +} +if (!setupPs.includes(`v${pkg.version} setup complete`)) { + errors.push(`setup.ps1 completion version does not match ${pkg.version}`); +} + +const readme = readFileSync(join(root, "README.md"), "utf8"); +const stableInstallUrl = + `https://raw.githubusercontent.com/Afloat16/jev-mcp/v${pkg.version}/scripts/install.sh`; +if (!readme.includes(stableInstallUrl)) { + errors.push(`README.md does not point stable install at v${pkg.version}`); +} + for (const required of [ "README.md", "README.zh-CN.md",