From 518e81c03935c0e274069edf9caeac7fd1417756 Mon Sep 17 00:00:00 2001 From: RoyLin Date: Sun, 19 Jul 2026 15:19:04 +0800 Subject: [PATCH 1/3] fix(release): honor Code 6 API boundary --- CHANGELOG.md | 7 ++++++- Cargo.lock | 2 +- core/Cargo.toml | 2 +- core/src/code_intelligence/language_profile.rs | 14 ++++++++++++-- sdk/node/Cargo.lock | 4 ++-- sdk/node/Cargo.toml | 4 ++-- sdk/node/examples/package-lock.json | 14 +++++++------- sdk/node/package-lock.json | 16 ++++++++-------- sdk/node/package.json | 14 +++++++------- sdk/python-bootstrap/README.md | 2 +- sdk/python-bootstrap/pyproject.toml | 2 +- sdk/python-bootstrap/src/a3s_code/_bootstrap.py | 2 +- sdk/python/CHANGELOG.md | 3 ++- sdk/python/Cargo.lock | 4 ++-- sdk/python/Cargo.toml | 4 ++-- sdk/python/README.md | 2 +- sdk/python/pyproject.toml | 2 +- 17 files changed, 57 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 881ffbaa..962f80c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [5.3.6] - 2026-07-19 +## [6.0.0] - 2026-07-19 ### Added @@ -23,6 +23,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 output schemas, annotations, icons, `_meta`, `structuredContent`, decoded images, embedded resources, and bounded content-addressed artifacts. +### Changed + +- Raised the major version because the standard MCP metadata support extends + the public `McpTool` and `CallToolResult` structures with new fields. + ### Fixed - Kept standalone conversational greetings tool-free and prevented them from diff --git a/Cargo.lock b/Cargo.lock index 222bb06c..9aaa7bb7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,7 +15,7 @@ source = "git+https://github.com/A3S-Lab/ACL.git?rev=6e2a6469edc0f4c61b1e588d0ac [[package]] name = "a3s-code-core" -version = "5.3.6" +version = "6.0.0" dependencies = [ "a3s-acl 0.2.1 (git+https://github.com/A3S-Lab/ACL.git?rev=6e2a6469edc0f4c61b1e588d0ace873aaf15ce22)", "a3s-common", diff --git a/core/Cargo.toml b/core/Cargo.toml index 4a936540..0ef69de4 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "a3s-code-core" -version = "5.3.6" +version = "6.0.0" edition = "2021" authors = ["A3S Lab Team"] license = "MIT" diff --git a/core/src/code_intelligence/language_profile.rs b/core/src/code_intelligence/language_profile.rs index 30ec706d..6e766fdf 100644 --- a/core/src/code_intelligence/language_profile.rs +++ b/core/src/code_intelligence/language_profile.rs @@ -424,7 +424,12 @@ mod tests { #[tokio::test] async fn built_in_typescript_uses_nested_classic_sdk() { let workspace = tempfile::tempdir().expect("temporary workspace"); - let package = workspace.path().join("apps/web/node_modules/typescript"); + let package = workspace + .path() + .join("apps") + .join("web") + .join("node_modules") + .join("typescript"); tokio::fs::create_dir_all(package.join("lib")) .await .expect("create TypeScript SDK"); @@ -463,7 +468,12 @@ mod tests { #[tokio::test] async fn built_in_typescript_uses_nested_native_sdk() { let workspace = tempfile::tempdir().expect("temporary workspace"); - let package = workspace.path().join("apps/web/node_modules/typescript"); + let package = workspace + .path() + .join("apps") + .join("web") + .join("node_modules") + .join("typescript"); tokio::fs::create_dir_all(package.join("lib")) .await .expect("create TypeScript SDK"); diff --git a/sdk/node/Cargo.lock b/sdk/node/Cargo.lock index 7274d243..710a4732 100644 --- a/sdk/node/Cargo.lock +++ b/sdk/node/Cargo.lock @@ -15,7 +15,7 @@ source = "git+https://github.com/A3S-Lab/ACL.git?rev=6e2a6469edc0f4c61b1e588d0ac [[package]] name = "a3s-code-core" -version = "5.3.6" +version = "6.0.0" dependencies = [ "a3s-acl 0.2.1 (git+https://github.com/A3S-Lab/ACL.git?rev=6e2a6469edc0f4c61b1e588d0ace873aaf15ce22)", "a3s-common", @@ -76,7 +76,7 @@ dependencies = [ [[package]] name = "a3s-code-node" -version = "5.3.6" +version = "6.0.0" dependencies = [ "a3s-code-core", "anyhow", diff --git a/sdk/node/Cargo.toml b/sdk/node/Cargo.toml index 562e4760..718fbb01 100644 --- a/sdk/node/Cargo.toml +++ b/sdk/node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "a3s-code-node" -version = "5.3.6" +version = "6.0.0" edition = "2021" authors = ["A3S Lab Team"] license = "MIT" @@ -11,7 +11,7 @@ description = "A3S Code Node.js bindings - Native addon via napi-rs" crate-type = ["cdylib"] [dependencies] -a3s-code-core = { version = "5.3.6", path = "../../core", features = ["s3", "serve"] } +a3s-code-core = { version = "6.0.0", path = "../../core", features = ["s3", "serve"] } napi = { version = "2", features = ["async", "napi6", "serde-json"] } napi-derive = "2" tokio = { version = "1.35", features = ["full"] } diff --git a/sdk/node/examples/package-lock.json b/sdk/node/examples/package-lock.json index 4102d4ce..a89ef81c 100644 --- a/sdk/node/examples/package-lock.json +++ b/sdk/node/examples/package-lock.json @@ -18,7 +18,7 @@ }, "..": { "name": "@a3s-lab/code", - "version": "5.3.6", + "version": "6.0.0", "license": "MIT", "devDependencies": { "@napi-rs/cli": "^2", @@ -27,12 +27,12 @@ "typescript": "^5.9.3" }, "optionalDependencies": { - "@a3s-lab/code-darwin-arm64": "5.3.6", - "@a3s-lab/code-linux-arm64-gnu": "5.3.6", - "@a3s-lab/code-linux-arm64-musl": "5.3.6", - "@a3s-lab/code-linux-x64-gnu": "5.3.6", - "@a3s-lab/code-linux-x64-musl": "5.3.6", - "@a3s-lab/code-win32-x64-msvc": "5.3.6" + "@a3s-lab/code-darwin-arm64": "6.0.0", + "@a3s-lab/code-linux-arm64-gnu": "6.0.0", + "@a3s-lab/code-linux-arm64-musl": "6.0.0", + "@a3s-lab/code-linux-x64-gnu": "6.0.0", + "@a3s-lab/code-linux-x64-musl": "6.0.0", + "@a3s-lab/code-win32-x64-msvc": "6.0.0" } }, "node_modules/@a3s-lab/code": { diff --git a/sdk/node/package-lock.json b/sdk/node/package-lock.json index 1619dfbf..58baed73 100644 --- a/sdk/node/package-lock.json +++ b/sdk/node/package-lock.json @@ -1,12 +1,12 @@ { "name": "@a3s-lab/code", - "version": "5.3.6", + "version": "6.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@a3s-lab/code", - "version": "5.3.6", + "version": "6.0.0", "license": "MIT", "devDependencies": { "@napi-rs/cli": "^2", @@ -15,12 +15,12 @@ "typescript": "^5.9.3" }, "optionalDependencies": { - "@a3s-lab/code-darwin-arm64": "5.3.6", - "@a3s-lab/code-linux-arm64-gnu": "5.3.6", - "@a3s-lab/code-linux-arm64-musl": "5.3.6", - "@a3s-lab/code-linux-x64-gnu": "5.3.6", - "@a3s-lab/code-linux-x64-musl": "5.3.6", - "@a3s-lab/code-win32-x64-msvc": "5.3.6" + "@a3s-lab/code-darwin-arm64": "6.0.0", + "@a3s-lab/code-linux-arm64-gnu": "6.0.0", + "@a3s-lab/code-linux-arm64-musl": "6.0.0", + "@a3s-lab/code-linux-x64-gnu": "6.0.0", + "@a3s-lab/code-linux-x64-musl": "6.0.0", + "@a3s-lab/code-win32-x64-msvc": "6.0.0" } }, "node_modules/@a3s-lab/code-darwin-arm64": { diff --git a/sdk/node/package.json b/sdk/node/package.json index d67b210b..d2cdd353 100644 --- a/sdk/node/package.json +++ b/sdk/node/package.json @@ -1,6 +1,6 @@ { "name": "@a3s-lab/code", - "version": "5.3.6", + "version": "6.0.0", "description": "A3S Code - Native Node.js bindings for the coding-agent runtime", "main": "index.js", "types": "index.d.ts", @@ -44,11 +44,11 @@ "test:helpers": "node test-helpers.mjs" }, "optionalDependencies": { - "@a3s-lab/code-darwin-arm64": "5.3.6", - "@a3s-lab/code-linux-x64-gnu": "5.3.6", - "@a3s-lab/code-linux-x64-musl": "5.3.6", - "@a3s-lab/code-linux-arm64-gnu": "5.3.6", - "@a3s-lab/code-linux-arm64-musl": "5.3.6", - "@a3s-lab/code-win32-x64-msvc": "5.3.6" + "@a3s-lab/code-darwin-arm64": "6.0.0", + "@a3s-lab/code-linux-x64-gnu": "6.0.0", + "@a3s-lab/code-linux-x64-musl": "6.0.0", + "@a3s-lab/code-linux-arm64-gnu": "6.0.0", + "@a3s-lab/code-linux-arm64-musl": "6.0.0", + "@a3s-lab/code-win32-x64-msvc": "6.0.0" } } diff --git a/sdk/python-bootstrap/README.md b/sdk/python-bootstrap/README.md index f9ed85ad..34f72a8a 100644 --- a/sdk/python-bootstrap/README.md +++ b/sdk/python-bootstrap/README.md @@ -44,4 +44,4 @@ pip install \ 'https://github.com/A3S-Lab/Code/releases/download/v/a3s_code--cp312-cp312-manylinux_2_28_x86_64.whl' ``` -Replace `` with the release to install, for example `5.3.6`. +Replace `` with the release to install, for example `6.0.0`. diff --git a/sdk/python-bootstrap/pyproject.toml b/sdk/python-bootstrap/pyproject.toml index b44a2aa9..669007dc 100644 --- a/sdk/python-bootstrap/pyproject.toml +++ b/sdk/python-bootstrap/pyproject.toml @@ -7,7 +7,7 @@ name = "a3s-code" # Keep in sync with crates/code core release. The bootstrap loader fetches # the matching native wheel from `https://github.com/A3S-Lab/Code/releases/tag/v` # at import time. -version = "5.3.6" +version = "6.0.0" description = "A3S Code Python SDK — pure-Python bootstrap that fetches the native wheel from GitHub Releases" readme = "README.md" license = {text = "MIT"} diff --git a/sdk/python-bootstrap/src/a3s_code/_bootstrap.py b/sdk/python-bootstrap/src/a3s_code/_bootstrap.py index cb5368e0..fe9ced20 100644 --- a/sdk/python-bootstrap/src/a3s_code/_bootstrap.py +++ b/sdk/python-bootstrap/src/a3s_code/_bootstrap.py @@ -31,7 +31,7 @@ # Version is the bootstrap's own version, which equals the matching native # wheel version on GH Releases. Bumped by the release workflow. -__version__ = "5.3.6" +__version__ = "6.0.0" _DEFAULT_BASE_URL = "https://github.com/A3S-Lab/Code/releases/download" _REQUEST_TIMEOUT_S = 120 diff --git a/sdk/python/CHANGELOG.md b/sdk/python/CHANGELOG.md index 325e7839..36efcbef 100644 --- a/sdk/python/CHANGELOG.md +++ b/sdk/python/CHANGELOG.md @@ -4,13 +4,14 @@ All notable changes to the A3S Code Python SDK will be documented in this file. ## [Unreleased] -## [5.3.6] - 2026-07-19 +## [6.0.0] - 2026-07-19 ### Changed - Updated the bundled Core with expanded TypeScript language profiles, PDF fetching, invariant-safe session forks, typed MCP results and artifacts, delegated permission boundaries, and tool-free standalone greetings. +- Raised the major version with Core's public standard MCP metadata fields. ## [5.3.5] - 2026-07-17 diff --git a/sdk/python/Cargo.lock b/sdk/python/Cargo.lock index 19453cd6..97433bee 100644 --- a/sdk/python/Cargo.lock +++ b/sdk/python/Cargo.lock @@ -15,7 +15,7 @@ source = "git+https://github.com/A3S-Lab/ACL.git?rev=6e2a6469edc0f4c61b1e588d0ac [[package]] name = "a3s-code-core" -version = "5.3.6" +version = "6.0.0" dependencies = [ "a3s-acl 0.2.1 (git+https://github.com/A3S-Lab/ACL.git?rev=6e2a6469edc0f4c61b1e588d0ace873aaf15ce22)", "a3s-common", @@ -76,7 +76,7 @@ dependencies = [ [[package]] name = "a3s-code-py" -version = "5.3.6" +version = "6.0.0" dependencies = [ "a3s-code-core", "anyhow", diff --git a/sdk/python/Cargo.toml b/sdk/python/Cargo.toml index 935fc323..b2989bac 100644 --- a/sdk/python/Cargo.toml +++ b/sdk/python/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "a3s-code-py" -version = "5.3.6" +version = "6.0.0" edition = "2021" authors = ["A3S Lab Team"] license = "MIT" @@ -12,7 +12,7 @@ name = "a3s_code" crate-type = ["cdylib"] [dependencies] -a3s-code-core = { version = "5.3.6", path = "../../core", features = ["s3", "serve"] } +a3s-code-core = { version = "6.0.0", path = "../../core", features = ["s3", "serve"] } pyo3 = { version = "0.23", features = ["multiple-pymethods"] } tokio = { version = "1.35", features = ["full"] } serde_json = "1.0" diff --git a/sdk/python/README.md b/sdk/python/README.md index d1eeaaa5..06355795 100644 --- a/sdk/python/README.md +++ b/sdk/python/README.md @@ -28,7 +28,7 @@ pip install \ 'https://github.com/A3S-Lab/Code/releases/download/v/a3s_code--cp312-cp312-manylinux_2_28_x86_64.whl' ``` -Replace `` with the release to install, for example `5.3.6`. +Replace `` with the release to install, for example `6.0.0`. ## Quick Start diff --git a/sdk/python/pyproject.toml b/sdk/python/pyproject.toml index 309502eb..e38fe5d8 100644 --- a/sdk/python/pyproject.toml +++ b/sdk/python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "a3s-code" -version = "5.3.6" +version = "6.0.0" description = "A3S Code - Native Python bindings for the coding-agent runtime" readme = "README.md" license = {text = "MIT"} From 16f08b7f3fffd40ad2d198d68815eab4954d0754 Mon Sep 17 00:00:00 2001 From: RoyLin Date: Sun, 19 Jul 2026 15:24:39 +0800 Subject: [PATCH 2/3] ci: gate Code changes on SemVer and Windows --- .github/workflows/ci.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ec2da1b..26783d07 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,6 +35,11 @@ jobs: - name: Clippy run: cargo clippy --workspace --lib --bins -- -D warnings + - name: Check public API compatibility with v5.3.5 + run: | + cargo install cargo-semver-checks --version 0.48.0 --locked + bash scripts/check_semver.sh 5.3.5 + - name: Default tests run: cargo test --workspace @@ -75,3 +80,26 @@ jobs: - name: Check Python SDK run: cargo check --manifest-path sdk/python/Cargo.toml + + windows-check: + name: Windows check + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup workspace context + shell: bash + run: bash .github/setup-workspace.sh + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + with: + components: clippy + + - uses: Swatinem/rust-cache@v2 + + - name: Clippy + run: cargo clippy --workspace --lib --bins -- -D warnings + + - name: Library tests + run: cargo test --workspace --lib From 58e28bf47327f82e35cf2deee3e38c0fd7ab953f Mon Sep 17 00:00:00 2001 From: RoyLin Date: Sun, 19 Jul 2026 15:43:02 +0800 Subject: [PATCH 3/3] fix(code-intelligence): build native TypeScript SDK paths --- .../src/code_intelligence/language_profile.rs | 43 +++++++++++++------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/core/src/code_intelligence/language_profile.rs b/core/src/code_intelligence/language_profile.rs index 6e766fdf..8f84b19b 100644 --- a/core/src/code_intelligence/language_profile.rs +++ b/core/src/code_intelligence/language_profile.rs @@ -242,8 +242,7 @@ impl LanguageServerProfile { && marker.kind == ProjectMarkerKind::CargoManifest }) .map(|marker| { - canonical_root - .join(marker.path.as_str()) + join_workspace_path(canonical_root, &marker.path) .to_string_lossy() .replace('\\', "/") }) @@ -305,7 +304,7 @@ impl LanguageServerProfile { if root.is_root() { canonical_root.to_path_buf() } else { - canonical_root.join(root.as_str()) + join_workspace_path(canonical_root, &root) } }) .collect::>(); @@ -332,12 +331,23 @@ impl LanguageServerProfile { fn typescript_package_roots(search_root: &Path) -> [PathBuf; 3] { [ - search_root.join("node_modules/typescript"), - search_root.join(".yarn/sdks/typescript"), - search_root.join(".vscode/pnpify/typescript"), + search_root.join("node_modules").join("typescript"), + search_root.join(".yarn").join("sdks").join("typescript"), + search_root + .join(".vscode") + .join("pnpify") + .join("typescript"), ] } +fn join_workspace_path(root: &Path, path: &WorkspacePath) -> PathBuf { + path.as_str() + .split('/') + .fold(root.to_path_buf(), |joined, component| { + joined.join(component) + }) +} + fn push_unique_path(target: &mut Vec, seen: &mut BTreeSet, path: PathBuf) { if seen.insert(path.clone()) { target.push(path); @@ -433,7 +443,7 @@ mod tests { tokio::fs::create_dir_all(package.join("lib")) .await .expect("create TypeScript SDK"); - tokio::fs::write(package.join("lib/tsserver.js"), "") + tokio::fs::write(package.join("lib").join("tsserver.js"), "") .await .expect("write tsserver entry"); tokio::fs::write(package.join("package.json"), r#"{"version":"5.9.3"}"#) @@ -459,7 +469,7 @@ mod tests { launch.initialization_options, json!({ "tsserver": { - "path": protocol_path(&package.join("lib/tsserver.js")), + "path": protocol_path(&package.join("lib").join("tsserver.js")), }, }) ); @@ -477,7 +487,7 @@ mod tests { tokio::fs::create_dir_all(package.join("lib")) .await .expect("create TypeScript SDK"); - tokio::fs::write(package.join("lib/tsc.js"), "") + tokio::fs::write(package.join("lib").join("tsc.js"), "") .await .expect("write native TypeScript entry"); tokio::fs::write(package.join("package.json"), r#"{"version":"7.0.2"}"#) @@ -498,7 +508,7 @@ mod tests { assert_eq!( launch.command.args, [ - package.join("lib/tsc.js").into_os_string(), + package.join("lib").join("tsc.js").into_os_string(), OsString::from("--lsp"), OsString::from("--stdio"), ] @@ -509,13 +519,18 @@ mod tests { #[tokio::test] async fn workspace_typescript_prefers_package_sdk_over_hoisted_sdk() { let workspace = tempfile::tempdir().expect("temporary workspace"); - let hoisted = workspace.path().join("node_modules/typescript"); - let local = workspace.path().join("packages/ui/node_modules/typescript"); + let hoisted = workspace.path().join("node_modules").join("typescript"); + let local = workspace + .path() + .join("packages") + .join("ui") + .join("node_modules") + .join("typescript"); for package in [&hoisted, &local] { tokio::fs::create_dir_all(package.join("lib")) .await .expect("create TypeScript SDK"); - tokio::fs::write(package.join("lib/tsserver.js"), "") + tokio::fs::write(package.join("lib").join("tsserver.js"), "") .await .expect("write tsserver entry"); tokio::fs::write(package.join("package.json"), r#"{"version":"5.9.3"}"#) @@ -535,7 +550,7 @@ mod tests { assert_eq!( launch.initialization_options["tsserver"]["path"], - protocol_path(&local.join("lib/tsserver.js")) + protocol_path(&local.join("lib").join("tsserver.js")) ); }