Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
57 changes: 41 additions & 16 deletions core/src/code_intelligence/language_profile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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('\\', "/")
})
Expand Down Expand Up @@ -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::<Vec<_>>();
Expand All @@ -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<PathBuf>, seen: &mut BTreeSet<PathBuf>, path: PathBuf) {
if seen.insert(path.clone()) {
target.push(path);
Expand Down Expand Up @@ -424,11 +434,16 @@ 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");
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"}"#)
Expand All @@ -454,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")),
},
})
);
Expand All @@ -463,11 +478,16 @@ 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");
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"}"#)
Expand All @@ -488,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"),
]
Expand All @@ -499,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"}"#)
Expand All @@ -525,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"))
);
}

Expand Down
4 changes: 2 additions & 2 deletions sdk/node/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions sdk/node/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand All @@ -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"] }
Expand Down
14 changes: 7 additions & 7 deletions sdk/node/examples/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 8 additions & 8 deletions sdk/node/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 7 additions & 7 deletions sdk/node/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down Expand Up @@ -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"
}
}
2 changes: 1 addition & 1 deletion sdk/python-bootstrap/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,4 @@ pip install \
'https://github.com/A3S-Lab/Code/releases/download/v<VERSION>/a3s_code-<VERSION>-cp312-cp312-manylinux_2_28_x86_64.whl'
```

Replace `<VERSION>` with the release to install, for example `5.3.6`.
Replace `<VERSION>` with the release to install, for example `6.0.0`.
2 changes: 1 addition & 1 deletion sdk/python-bootstrap/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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<version>`
# 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"}
Expand Down
2 changes: 1 addition & 1 deletion sdk/python-bootstrap/src/a3s_code/_bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion sdk/python/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions sdk/python/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading