Skip to content

Commit 77b63fb

Browse files
committed
chore: prepare v6.11.2 release
1 parent 578eb8e commit 77b63fb

27 files changed

Lines changed: 1308 additions & 268 deletions

.github/workflows/ax-code-ci.yml

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,23 @@ jobs:
8787
--format=table
8888
8989
- name: Build SDK
90-
run: pnpm exec tsc
91-
working-directory: packages/sdk/js
90+
run: pnpm --dir packages/sdk/js run build
91+
92+
- name: Verify generated SDK artifacts are current
93+
shell: bash
94+
run: |
95+
drift="$(git status --porcelain=v1 --untracked-files=all -- \
96+
packages/sdk/openapi.json \
97+
packages/sdk/js/src/gen \
98+
packages/sdk/js/src/v2/gen)"
99+
if [ -n "$drift" ]; then
100+
echo "Generated SDK artifacts are stale. Run: pnpm --dir packages/sdk/js run build"
101+
printf '%s\n' "$drift"
102+
exit 1
103+
fi
104+
105+
- name: Test SDK
106+
run: pnpm --dir packages/sdk/js test
92107

93108
- name: Build Plugin
94109
run: pnpm --dir packages/plugin run build

.github/workflows/desktop-ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ on:
1010
- "pnpm-workspace.yaml"
1111
- "turbo.json"
1212
- "script/check-desktop-boundaries.ts"
13+
- "script/import-specifiers.ts"
1314
- "desktop/**"
1415
- "packages/sdk/**"
1516
- "packages/ax-code/src/server/**"
@@ -26,6 +27,7 @@ on:
2627
- "pnpm-workspace.yaml"
2728
- "turbo.json"
2829
- "script/check-desktop-boundaries.ts"
30+
- "script/import-specifiers.ts"
2931
- "desktop/**"
3032
- "packages/sdk/**"
3133
- "packages/ax-code/src/server/**"

.github/workflows/repo-structure.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ jobs:
6464
- name: Install deps
6565
run: pnpm install --frozen-lockfile
6666

67+
- name: Test repository scripts
68+
run: pnpm run test:scripts
69+
6770
- name: Check repo structure
6871
run: pnpm run check:structure
6972

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ AX Code runs coding agents against your actual repositories through AX Code Desk
1010

1111
Built by [DEFAI Digital](https://github.com/defai-digital).
1212

13-
[![Release v6.11.1](https://img.shields.io/badge/Release-v6.11.1-2F6FED)](https://github.com/defai-digital/ax-code/releases/tag/v6.11.1)
13+
[![Release v6.11.2](https://img.shields.io/badge/Release-v6.11.2-2F6FED)](https://github.com/defai-digital/ax-code/releases/tag/v6.11.2)
1414
[![macOS Apple Silicon](https://img.shields.io/badge/macOS-Apple%20Silicon-000000?logo=apple&logoColor=white)](https://github.com/defai-digital/ax-code/releases)
1515
[![Windows x64](https://img.shields.io/badge/Windows-x64-0078D4?logo=windows&logoColor=white)](https://github.com/defai-digital/ax-code/releases)
1616
[![Windows ARM64 CLI](https://img.shields.io/badge/Windows%20ARM64-CLI-0078D4?logo=windows&logoColor=white)](https://github.com/defai-digital/ax-code/releases)

desktop/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
44

55
## [Unreleased]
66

7+
## [6.11.2] - 2026-07-12
8+
9+
### Fixed
10+
11+
- Release: increases CI test capacity and strengthens SDK generation, repository policy, and Desktop-boundary verification.
12+
713
## [6.11.1] - 2026-07-12
814

915
### Fixed

desktop/docs/PROJECT_BOUNDARIES.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ be fixed.
2525
and the server-side AX Code lifecycle adapter. Do not import SDK `dist/`
2626
internals.
2727

28-
The enforced subset of these rules runs from the monorepo root with
29-
`pnpm run check:desktop-boundaries`. The legacy direct checker remains at
30-
`desktop/scripts/check-boundary-imports.mjs` for local Desktop-only checks.
31-
When a new cross-package entrypoint is genuinely needed, add it to the checker
32-
with a short reason in the change description.
28+
The authoritative checker for these rules runs from the monorepo root with
29+
`pnpm run check:desktop-boundaries` and fails on violations. The historical
30+
`desktop/scripts/check-boundary-imports.mjs` entrypoint delegates to that same
31+
checker, so local and CI policy cannot drift. When a new cross-package
32+
entrypoint is genuinely needed, add it to the checker with a short reason in
33+
the change description.
3334

3435
## Stability guidance
3536

desktop/packages/electron/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@ax-code/electron",
3-
"version": "6.11.1",
3+
"version": "6.11.2",
44
"private": true,
55
"description": "AX Code — Electron desktop shell",
66
"author": "DEFAI Private Limited",

desktop/packages/ui/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@openchamber/ui",
3-
"version": "6.11.1",
3+
"version": "6.11.2",
44
"private": true,
55
"type": "module",
66
"main": "src/main.tsx",

desktop/packages/web/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ax-code-desktop",
3-
"version": "6.11.1",
3+
"version": "6.11.2",
44
"description": "AX Code local web runtime.",
55
"private": false,
66
"license": "Apache-2.0",
Lines changed: 13 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -1,132 +1,17 @@
1-
import { fileURLToPath } from "node:url"
2-
import { readdirSync, readFileSync } from "node:fs"
1+
import { spawnSync } from "node:child_process"
32
import path from "node:path"
3+
import { fileURLToPath } from "node:url"
44

5-
const __dirname = path.dirname(fileURLToPath(import.meta.url))
6-
const ROOT = path.resolve(__dirname, "..")
7-
8-
const targetFiles = ["packages/web/src", "packages/web/server", "packages/electron/src"]
9-
10-
const disallowedPatterns = [/\.\.\/ui\/src\b/, /\.\.\/desktop\/src\b/]
11-
12-
const allowedOpenChamberUiImports = [
13-
/^@openchamber\/ui$/,
14-
/^@openchamber\/ui\/main$/,
15-
/^@openchamber\/ui\/index\.css$/,
16-
/^@openchamber\/ui\/styles\/fonts$/,
17-
/^@openchamber\/ui\/terminalApi$/,
18-
/^@openchamber\/ui\/api\/(endpoints|gitApiHttp|types)$/,
19-
/^@openchamber\/ui\/apps\/renderElectronMiniChatApp$/,
20-
]
21-
22-
const importSpecifiers = [
23-
/(?:import|export)\s+(?:type\s+)?(?:[^'"]*?\s+from\s+)?['"]([^'"]+)['"]/g,
24-
/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
25-
/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
26-
]
27-
28-
const packageDependencyRules = [
29-
{
30-
packageJsonPath: "packages/ui/package.json",
31-
dependencyNames: ["electron", "electron-updater", "express", "http-proxy-middleware", "node-pty", "simple-git"],
32-
reason: "server or desktop-shell dependency declared by UI package",
33-
},
34-
]
35-
36-
function collectFiles(baseDir, extensions) {
37-
const entries = readdirSync(baseDir, { withFileTypes: true })
38-
const files = []
39-
40-
for (const entry of entries) {
41-
const fullPath = path.join(baseDir, entry.name)
42-
if (entry.isDirectory()) {
43-
if (entry.name === "dist" || entry.name === "node_modules" || entry.name.startsWith(".")) {
44-
continue
45-
}
46-
files.push(...collectFiles(fullPath, extensions))
47-
continue
48-
}
49-
if (!extensions.includes(path.extname(entry.name))) {
50-
continue
51-
}
52-
files.push(fullPath)
53-
}
54-
55-
return files
56-
}
57-
58-
const violations = []
59-
60-
function addViolation(file, lineNumber, lineText, reason) {
61-
violations.push({
62-
file,
63-
lineNumber,
64-
lineText: lineText.trim(),
65-
reason,
66-
})
67-
}
68-
69-
function isAllowedOpenChamberUiImport(specifier) {
70-
return allowedOpenChamberUiImports.some((pattern) => pattern.test(specifier))
71-
}
72-
73-
function dependencyLineNumber(content, dependencyName) {
74-
const lines = content.split(/\r?\n/)
75-
const needle = `"${dependencyName}"`
76-
const index = lines.findIndex((line) => line.includes(needle))
77-
return index === -1 ? 1 : index + 1
78-
}
79-
80-
for (const filePath of targetFiles) {
81-
const absolute = path.join(ROOT, filePath)
82-
const files = collectFiles(absolute, [".ts", ".tsx", ".js", ".jsx"])
83-
for (const file of files) {
84-
const content = readFileSync(file, "utf8")
85-
const lines = content.split(/\r?\n/)
86-
lines.forEach((line, index) => {
87-
if (disallowedPatterns.some((pattern) => pattern.test(line))) {
88-
addViolation(file, index + 1, line, "sibling-package source import")
89-
}
90-
91-
for (const pattern of importSpecifiers) {
92-
pattern.lastIndex = 0
93-
let match
94-
while ((match = pattern.exec(line)) !== null) {
95-
const specifier = match[1]
96-
if (specifier.startsWith("@openchamber/ui/") && !isAllowedOpenChamberUiImport(specifier)) {
97-
addViolation(file, index + 1, line, `private @openchamber/ui import: ${specifier}`)
98-
}
99-
}
100-
}
101-
})
102-
}
103-
}
104-
105-
for (const rule of packageDependencyRules) {
106-
const file = path.join(ROOT, rule.packageJsonPath)
107-
const content = readFileSync(file, "utf8")
108-
const manifest = JSON.parse(content)
109-
const dependencyBlocks = [
110-
manifest.dependencies ?? {},
111-
manifest.devDependencies ?? {},
112-
manifest.peerDependencies ?? {},
113-
manifest.optionalDependencies ?? {},
114-
]
115-
116-
for (const dependencyName of rule.dependencyNames) {
117-
if (dependencyBlocks.some((block) => Object.hasOwn(block, dependencyName))) {
118-
addViolation(file, dependencyLineNumber(content, dependencyName), `"${dependencyName}"`, rule.reason)
119-
}
120-
}
121-
}
5+
const desktopRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..")
6+
const repositoryRoot = path.resolve(desktopRoot, "..")
7+
const checker = path.join(repositoryRoot, "script/check-desktop-boundaries.ts")
1228

123-
if (violations.length > 0) {
124-
console.error("Boundary import check failed.")
125-
for (const item of violations) {
126-
const relative = path.relative(ROOT, item.file)
127-
console.error(`- ${relative}:${item.lineNumber}: ${item.reason}: ${item.lineText}`)
128-
}
129-
process.exit(1)
130-
}
9+
// Keep the historical Desktop-local entrypoint, but delegate policy to the
10+
// repository checker so the two commands cannot drift apart.
11+
const result = spawnSync(process.execPath, ["--import", "tsx", checker, ...process.argv.slice(2)], {
12+
cwd: repositoryRoot,
13+
stdio: "inherit",
14+
})
13115

132-
console.log("Boundary import check passed.")
16+
if (result.error) throw result.error
17+
process.exitCode = result.status ?? 1

0 commit comments

Comments
 (0)