qwen-code/scripts
易良 b455bad5e5
refactor(cli): keep acp-integration off serve internals (#8084) (#9144)
* refactor(cli): keep acp-integration off serve internals (#8084)

The dependency direction set in #8084 regressed: native Live Voice
(a5c637b749) added four acp-integration imports of serve/live modules,
because nothing in the repo enforces the boundary the issue defines.

Ownership, measured by consumer rather than by directory:

- capture-screen-context, live-task-tools, live-speak-to-user and
  live-backend-instructions each have exactly one production consumer,
  acp-integration/session/Session.ts, and import nothing from serve/.
  They move to acp-integration/live/ with their tests.
- conversations/session-source is shared by acpAgent and four serve
  modules, has no imports, and takes its reader as a parameter, so it
  moves to runtime/live-session-source.ts alongside the other neutral
  contracts. Renamed because every symbol in it is Live-specific.

Adds a no-restricted-imports rule for acp-integration/** so the next
feature spanning both surfaces gets a lint error pointing at runtime/,
rather than silently reopening the criterion.

No behavior change: moves, import rewrites, and the lint block.

* fix(cli): harden the acp/serve boundary guard (round 2)

- Flag the bare '../serve' directory specifier, which resolves to the
  serve/ barrel and skipped the trailing-segment group patterns (also
  added to the utils/ guard for symmetry).
- Extend the same boundary to runtime/, the layer the rule directs
  authors to, so the #8084 coupling cannot reform one hop away.
- Cover dynamic imports: no-restricted-imports never visits
  ImportExpression, so a no-restricted-syntax selector now enforces the
  boundary for await import('../serve/...') too. The acp-integration
  block moves after the general TS block (flat config lets the last
  matching block win per rule) and restates its no-restricted-syntax
  selectors so the override drops nothing.
- Document that CI lint is the enforcement point; no fixture test pins
  the block.

Verified: synthetic fixtures for all three violation shapes are
rejected; full npm run lint passes with no live violations.

* test(cli): pin serve boundary lint rules

* test(cli): close serve boundary lint gaps

* fix(lint): close serve-boundary entrances and harden the guard

- reject computed dynamic-import sources (concatenation, new URL) and
  type-level imports fail-closed; rounds 2-5 each demonstrated a new
  per-spelling regex entrance, so non-literal forms are blocked outright
  (R4-1)
- rewrite the boundary patterns without nested quantifiers; the previous
  shape backtracked exponentially (~4x per two ../ segments, lint-time
  ReDoS) (R5-2)
- build the three guarded override blocks no-restricted-syntax arrays from
  one shared helper so flat config last-wins cannot silently drop selectors
  (R5-3)
- pin the bare-directory barrel specifier in fixtures (R5-4) and add a
  string-throw probe pinning the restated selectors in the overrides (R5-5)
- replace the **/serve* static globs with enumerated relative depths so
  third-party serve-named packages are never flagged (R5-7)

* fix(lint): correct TSImportType selector path and computed-template handling

- read the type-import specifier at argument.literal.value: @typescript-eslint
  wraps it in a TSLiteralType, so argument.value was dead code and the old
  fail-closed TSImportType selector over-matched every type-level import
  (37 errors in files this PR never touches) (round-6 Critical)
- reject computed template literals (templates containing expressions)
  fail-closed; pure-literal templates stay covered by the quasis pattern
  selectors — the old blanket TemplateLiteral exemption contradicted the
  fail-closed comment above it (round-6 Critical)
- give the fail-closed selectors a distinct message: computed sources
  cannot be checked against the boundary, which is not the same policy as
  importing serve/ (round-6 suggestion)
- pin the depth-enumeration loop beyond depth 1 with a depth-2 fixture,
  pin the fixed type-import selector with a negative typeof-import control,
  and pin the computed-template fail-closed path (round-6 suggestion)

* fix(lint): close the remaining round-6 serve-boundary entrances

Complements the previous commit (which fixed the TSImportType selector
path and computed-template fail-closed) with the R4-1 entrances it left
open, each pinned by a fixture:

- percent-encoded segments (`../%73erve/index.js`): Node percent-decodes
  segments when mapping the resolved URL to the filesystem, so raw-text
  patterns cannot see through them — any `%` in a guarded-tree specifier
  is now rejected with a dedicated message.
- static traversal twins: the pattern regexes now run over static
  ImportDeclaration/ExportNamedDeclaration/ExportAllDeclaration sources
  too, closing `import './../serve/x'`, `import '../runtime/../serve/x'`,
  and `import '..//serve/x'`, whose dynamic twins were already blocked.
- leading literal segment: a traversal-anywhere pattern catches
  `import('foo/../../../serve/x')` past the dot-slash anchor.
- vitest module-loading calls (vi.mock/doMock/importActual/importMock)
  resolve and load the real module, so they get the same patterns plus
  fail-closed coverage for computed arguments.

* fix(lint): cover vitest serve-boundary calls

* fix(lint): close the round-7 serve-boundary entrance classes

R4-1 round-7 interim hardening (the durable specifier-resolving custom
rule remains tracked separately):

- case-variant spellings (../Serve/...): every pattern, percent and
  quasis attribute regex now carries the i flag, covering the dynamic,
  static, vi.*/vitest.* and TSImportType arms.
- ?query/#fragment suffixes: rejected alongside % in all eight
  specifier shapes (bundlers/Node strip them when resolving, so
  '../serve?x' reaches the same module as '../serve').
- percent-encoded pure-template vitest calls: added the missing
  arguments.0.quasis.0.value.cooked twin to the reject list.
- root-absolute and file: literal specifiers: fail-closed rejected in
  every literal shape (guarded trees sweep verified clean of both).
- createRequire: its source modules ('module'/'node:module') are
  flagged in guarded trees, since the alias escapes the
  callee-name="require" arm and Node >=22 require(esm) loads serve/.

Each entrance class is pinned by a fixture case (18/18 green through
the real ESLint API); the three guarded trees lint clean with the new
arms.

* refactor(lint): resolve the serve boundary by resolution, not text (#8084)

R4-1 round-8 decision (maintainer-approved option a): replace the
spelling-by-spelling regex/glob matrix with a local resolution-based
ESLint rule (eslint-rules/no-serve-boundary-cross.js).

Eight review rounds each demonstrated a new spelling escaping the text
matrix (data: URLs, percent-encoding, traversal through a leading literal
segment, baseUrl bare specifiers, createRequire/getBuiltinModule,
TSImportType, aliased vitest loaders, Worker/fork), because every spelling
is just another way to NAME the same target. The new rule resolves each
import-like specifier against the importing file and reports anything
landing inside packages/cli/src/serve/:

- relative specifiers resolved against the importing file
- baseUrl bare specifiers resolved against packages/cli (tsconfig baseUrl
  makes `src/serve/...` reachable — the round-8 entrance text never saw)
- file: URLs resolved to concrete paths (case-insensitive, whitespace-trimmed
  scheme detection, since the URL parser normalizes both)
- vitest loaders matched alias-proof (v.mock / destructured importActual);
  only specifiers resolving INTO serve/ report
- child_process.fork checked; spawn deliberately not (first arg is an
  executable, not a module)
- fail-closed on statically-unresolvable sources: computed sources, data:
  URLs, traversal-bearing bare specifiers, node:module imports,
  process.getBuiltinModule
- case-insensitive path comparison (Serve/ loads serve/ on
  case-insensitive filesystems)

Fixture suite reworked to resolution semantics: several round-4..7 fixture
depths corrected to spellings that genuinely resolve into src/serve (the
old depths resolved to packages/cli/serve, outside src/serve, and were
only caught by text matching); new pins for every round-8 entrance and for
the Codex self-review Criticals (aliased loaders, uppercase/whitespace URL
schemes, spawn not an import source). 26/26 pass; guarded trees and the
full cli src lint clean (zero false positives).

Removed: relativeServeImportPatterns, restrictedServeImports,
serveDynamicImportPatterns, serveGuardSyntaxRules and the per-spelling
selector/percent/absolute/createRequire special cases.

* fix(lint): drop the dead serveGuardSyntaxRules helper

The resolution-rule commit removed the mechanism but left the
serveGuardSyntaxRules helper behind — unused (no-unused-vars) and
referencing the already-deleted restrictedServeDynamicImports (no-undef),
which failed CI's repo-wide eslint. The guarded trees inherit
restrictedRequire + restrictedStringThrow from the general TS block, so
nothing is lost.

* fix(lint): close serve boundary resolver gaps

* fix(lint): address serve boundary review suggestions

- R9-2: move the new-URL-with-import.meta check into the NewExpression
  visitor with the real MemberExpression base shape; the CallExpression
  placement was unreachable and standalone new URL(...) reported nothing
- R9-3: report module-builtin entrances via the moduleBuiltin messageId
  instead of the self-contradicting failClosed remediation text
- R9-4: match the destructured fork(...) spelling, not just
  child_process.fork(...)
- R9-5/R8-2: fixture pins for re-exports, Worker, fork, require,
  vi.doMock and vi.importMock entrances
- R9-7: pin the false branch of static-template concatenation (pure
  template literals resolving outside serve stay allowed)
- R10-3: filter the third-party serve-named package pin by ruleId so a
  failClosed false positive also turns it red
- R13-2: pin resolution detections on the serveBoundary messageId so
  inside-detection degrading to blanket fail-closed cannot ship green

* fix(lint): close round-11 serve boundary gaps

Critical fixes:
- '#name' package-imports specifiers sailed through: stripUrlSuffixes
  splits on '#' before the fail-closed check saw it, so the branch was
  dead code and '#s' classified outside. Check '#' before suffix
  stripping (fixture pins both entrances).
- scheme detection used JS trim(), which keeps non-whitespace C0
  controls — '\x01data:…' slipped past while Node's URL parser strips
  C0-or-space at the edges and loaded it. Detect schemes on the
  WHATWG-normalized form (fixtures added).
- eval("(0,eval)"/globalThis.eval spellings included) and new Function
  can embed import('…') the rule cannot resolve — fail closed like
  computed sources; no-eval/no-new-func are not enabled in the shared
  config and the guarded trees contain no such calls.
- backslashes normalize to '/' under Node's URL-based ESM resolution
  (file: URLs are special), so '..\\serve\\x.js' loaded serve/ on
  posix while the rule saw a bare specifier. Normalize backslashes
  before classification (fixture added).

Hardening + pins:
- fork/Worker arms match object-agnostically (namespace/default-import
  spellings no longer evade); Worker skips new URL(spec, import.meta.url)
  arguments so the URL arm owns them (no more fail-closed false positive
  on the canonical construct, no double report on serve targets).
- new TSImportEqualsDeclaration visitor: import x = require('../serve/…')
  emits a working createRequire shim under tsc NodeNext.
- isProcessObject accepts computed properties (globalThis['process']) and
  the Reflect.apply arm accepts computed getBuiltinModule; the three
  getBuiltinModule arms collapse into one via a shared property matcher.
- vitest loader names lifted into a module-level constant; corrected two
  stale comments (fail-closed branches; R5-5 probe description).
- fixtures: root-absolute/file: inside verdicts (repoRoot, messageId),
  fork member arm, template cooked values, bare vitest loaders, dynamic
  bare-'module' entrances, outside-serve negatives for URL/Worker/fork/
  require. Suite 44/44.

* fix(cli): restore live session source import

* fix(lint): clear the two lint errors breaking CI on the boundary rule

Follow-up to the round-11 batch, which landed without running the
repo lint:
- the C0-edge-strip regex legitimately contains control-character
  ranges (it mirrors the WHATWG URL parser), so disable
  no-control-regex on that line with a rationale comment instead of
  rewriting the range.
- drop the unused UTILS_FIXTURE constant from the boundary tests
  (no fixture lints a utils/ file).

eslint clean on both files, boundary suite 44/44, prettier clean.

* fix(lint): close bounded serve boundary gaps

* fix(lint): complete the round-12 boundary escape closures

Extends the previous commit (which canonicalized the serve/baseUrl
comparison sides, added staticMemberPropertyName, and closed the
Function-call and Worker-eval-option shapes) with the remaining
round-12 review surface — every demonstrated spelling probed before
and after:

- Callee identity is now shape-tolerant end to end: rightmost-segment
  object matching (nested member objects like globalThis.vi / x.cp no
  longer evade the object-agnostic arms), renamed loader bindings
  resolved from the import declarations (fork-as-f, Worker-as-W),
  Reflect.apply/construct unwrapped for guarded targets (fork included),
  Function.prototype.call/apply/bind indirection handled (.call unwraps
  with shifted args; .apply/.bind fail closed), and the
  SequenceExpression unwrap applied uniformly instead of eval-only.
- The string-code execution class fails closed beyond Function/eval
  direct calls: .constructor property chains (({}).constructor.constructor,
  (function(){}).constructor, AsyncFunction variants), eval.call/apply,
  and the node:vm surface (runInThisContext / runInNewContext /
  runInContext / compileFunction / new vm.Script, scoped to vm imports).
- The Worker eval option fails closed unless eval is statically false
  (a dynamic option or non-object second argument is unverifiable), and
  the URL arm's import.meta base restriction reports failClosed on the
  construct.
- Fixtures pin each class: shape variants, renamed bindings, Reflect
  indirection, call/apply/bind, the string-code family (incl. messageId-
  specific failClosed pins for the eval:true Worker and non-url
  import.meta bases), bare-directory/baseUrl query-suffix spellings, and
  outside-serve allow pins for the export/import-equals arms.
- expectServeBoundaryError now filters on the rule id (all three
  messageIds contain 'serve'); the divergent substring negative pins
  move to expectNoBoundaryHits.

Suite 52/52; guarded trees lint clean (no false positives from the new
arms); eslint + prettier clean.

* fix(lint): close the round-12 reviewer escape classes (#8084)

Ten Criticals plus five hardenings from the round-12 review, every
class probe-verified before and after:

- R12-1: Worker eval-option analysis now matches runtime object-literal
  semantics — the LAST eval key wins (duplicates included), an options
  object without eval defaults to false (specifier path, no
  over-block), and a spread after the last literal eval is
  unverifiable — fail closed.
- R12-2: sequence unwrapping is now a uniform invariant — recursive on
  callees in both visitors and applied to object expressions
  (rightmostObjectName/isProcessObject), closing (0, require).call,
  (0, (0, require)), (0, process).getBuiltinModule, (0, vm).* and
  new (0, vm).Script.
- R12-3: call/apply/bind indirection is complete — Function/constructor
  forward code (unconditional fail-closed), chained indirection
  (x.call.call) fails closed instead of falling through, and vm exec
  names plus the fork/vitest alias sets resolve.
- R12-4: Reflect.apply/construct target lists mirror the direct-call
  arms — Function (incl. member spellings), the vm exec/Script surface,
  and the vitest loaders (member and identifier targets).
- R12-5: alias sets populate in a pre-pass over the module body — ESM
  imports are hoisted, so use-before-import now resolves like the
  import-first direction.
- R12-6: renamed destructured vitest imports resolve through a new
  vitestLoaderAliases set.
- R12-7: a named guarded global (process/globalThis/global) carrying an
  opaque computed key fails closed (process-family keeps the dedicated
  moduleBuiltin message); object-agnostic arms keep their documented
  residue.
- R12-8: .constructor fails closed on variable bodies and expression
  templates; statically non-string literals keep the pass-through.
- R12-9: inline lazy vm imports ((await import('node:vm')).*) count as
  vm objects in the exec and Script arms.
- R12-11/12/13: checkSource skips statically non-specifier arguments
  (no unactionable advice for env objects), the URL arm owns
  new URL(spec, import.meta.url) on every entrance (no over-block, one
  report on the serve form), and the module builtin reports
  moduleBuiltin on every entrance.

Test hardening: R12-10 normalizes the repoRoot pin to forward slashes
(Windows merge-gate determinism), R12-14 pins the four mutation
survivors, R12-15 pre-cleans and catch-cleans the baseUrl symlink
links. Suite 65/65; guarded trees lint clean.

* fix(lint): repair corrupted files from the git-API blob upload

The previous commit (552bc7c8f) was pushed via the GitHub git API with
`-f content=@file` blob payloads that GitHub stored corrupted (9-byte
binary blobs), breaking the eslint config load (SyntaxError) and the CI
Test gate. Re-upload both files with JSON --input payloads whose blob
SHAs match the local git objects byte-for-byte (8270a0d2 / 5a0ebaa2).
No content change beyond restoring the intended files; suite 65/65.

* fix(lint): close the round-13 serve-boundary escape classes (#8084)

- re-normalize backslashes AFTER percent-decoding so %5c/%5C cannot
  reintroduce a traversal the pre-decode normalization missed
- on realpath ENOENT canonicalize the deepest existing ancestor and
  re-append the missing tail, so symlinked-ancestor checkouts fail
  closed instead of open
- Worker eval-option scan: treat an unresolvable computed key like a
  spread (unknown), fail closed on a non-computed __proto__ prototype
  unless it is statically null, and resolve quoted string-literal keys
- carry the opaque-key fail-closed check through composed callees:
  one hop below .call/.apply/.bind, as a Reflect target, and on the
  getBuiltinModule object side, with the process-family message

Pins all four classes with executed fixtures plus negative controls;
the guarded trees stay lint-clean.

* fix(lint): close the round-13 binding-hop and callee-opacity escapes (#8084)

* refactor(cli): simplify ACP serve boundary guard

* fix(lint): close the round-21 contract pins and bare-barrel escape (#8084)

* fix(lint): close dynamic-import and js-file holes in the acp/serve guard (#8084)

* fix(lint): make acp/serve dynamic-import guard case-insensitive

The no-restricted-syntax selector for dynamic import() of serve/ was case-sensitive, so a macOS case-variant specifier (`../Serve/...`) would resolve to the daemon barrel without tripping the guard. Add the /i flag and cover case-variant plus computed-specifier behavior.

---------

Co-authored-by: yiliang114 <yiliang114@users.noreply.github.com>
2026-08-22 12:39:08 +00:00
..
installation fix(install): avoid Get-FileHash for Windows checksums (#9112) 2026-08-14 01:12:08 +00:00
lib feat(core): support QWEN_HOME env var to customize config directory (#2953) 2026-05-09 15:51:52 +08:00
tests refactor(cli): keep acp-integration off serve internals (#8084) (#9144) 2026-08-22 12:39:08 +00:00
acp-http-smoke.mjs feat(daemon): merge daemon-mode feature batch into main (#4490) 2026-06-12 00:34:49 +08:00
audit-runtime-critical.js ci: keep the critical-audit gate honest when npm cannot answer (#7743) 2026-07-26 06:59:13 +00:00
benchmark-api-latency.mjs feat(cli): add API preconnect to reduce first-call latency (#3318) 2026-04-27 06:54:55 +08:00
build-hosted-installation-assets.js fix(installer): auto-detect SYSTEM account and default PATH scope to machine (#4903) 2026-06-10 21:02:10 +08:00
build-standalone-release.js fix(packaging): bundle clipboard addon in standalone builds (#6708) 2026-07-11 15:18:24 +00:00
build.js fix(devx): fail with actionable message when unit-test build prerequisites are missing (#9149) (#9171) 2026-08-18 13:19:09 +00:00
build_package.js fix(build): clean stale outputs before tsc --build to prevent TS5055 (#4453) 2026-05-23 23:06:31 +08:00
build_sandbox.js fix(sandbox): fall back to 'latest' tag when image name has no colon (#2962) 2026-04-18 09:07:05 +08:00
build_vscode_companion.js Sync upstream Gemini-CLI v0.8.2 (#838) 2025-10-23 09:27:04 +08:00
check-build-status.js fix(review): report what the transcripts prove; build the roster in one call (#7033) 2026-07-18 00:43:57 +00:00
check-desktop-isolation.js feat(desktop): package Web Shell as a release-ready desktop app (#8132) 2026-08-02 08:20:16 +00:00
check-i18n.ts fix(cli): localize approval mode UI labels (#6592) 2026-07-11 00:07:03 +00:00
check-lockfile.js Sync upstream Gemini-CLI v0.8.2 (#838) 2025-10-23 09:27:04 +08:00
check-serve-fast-path-bundle.js feat(ci): fail the startup bundle check when the CLI entry is hoisted into a chunk (#8203) 2026-07-31 08:57:57 +00:00
check-voice-guard-sync.js feat(voice): support trusted private ASR base URLs (#8350) 2026-08-06 14:04:57 +00:00
clean-package-build-artifacts.js feat(channels): GitHub polling adapter with notification-as-wakeup architecture (#7632) 2026-07-25 09:31:50 +00:00
clean.js feat(desktop): Add desktop app package with Qwen ACP SDK integration (#3778) 2026-06-11 21:57:20 +08:00
cli-entry.js fix(cli): preserve Qwen Review startup version in footers (#8431) 2026-08-04 14:58:56 +00:00
copy_bundle_assets.js refactor(cli): consolidate shared helpers ahead of the legacy audit skill (#9345) 2026-08-19 14:53:44 +00:00
copy_files.js refactor(core): move review skill incident narratives to DESIGN.md (#8499) 2026-08-04 12:41:18 +00:00
create-standalone-package.js feat(review): say so when the bundle is older than the review it runs (#8390) 2026-08-07 03:21:26 +00:00
create_alias.sh fix: ambiguous literals (#461) 2025-08-27 15:23:21 +08:00
daemon-dev.js fix(scripts): allow multiple dev:daemon instances by probing Vite port (#7212) 2026-07-19 12:49:47 +00:00
desktop-openwork-sync.ts feat(acp): support desktop qwen integration (#4728) 2026-06-09 19:09:44 +08:00
dev.js fix(review): report what the transcripts prove; build the roster in one call (#7033) 2026-07-18 00:43:57 +00:00
esbuild-shims.js perf(cli): code-split lowlight to cut startup V8 parse cost (#4070) 2026-05-15 17:26:18 +08:00
generate-changelog.js feat(release): user-facing bilingual digest for release notes (#9216) 2026-08-17 00:12:04 +00:00
generate-git-commit-info.js # 🚀 Sync Gemini CLI v0.2.1 - Major Feature Update (#483) 2025-09-01 14:48:55 +08:00
generate-release-notes.js feat(release): user-facing bilingual digest for release notes (#9216) 2026-08-17 00:12:04 +00:00
generate-settings-schema.ts revert: remove local PR verification gate (#7031) 2026-07-16 11:24:38 +00:00
get-release-version.js fix(ci): force-push release branch so retries replace failed attempts (#9076) (#9082) 2026-08-16 16:33:14 +00:00
lint.js fix(ci): cache downloaded linters on ECS runners (#9001) 2026-08-13 05:13:23 +00:00
local_telemetry.js Merge tag 'v0.3.0' into chore/sync-gemini-cli-v0.3.0 2025-09-11 16:26:56 +08:00
measure-flicker.mjs fix(cli): bound SubAgent display by visual height to prevent flicker (#3721) 2026-04-29 22:34:55 +08:00
pre-commit.js Sync upstream Gemini-CLI v0.8.2 (#838) 2025-10-23 09:27:04 +08:00
prepare-package.js chore(deps): bump sharp to ^0.35.0 to resolve GHSA-f88m-g3jw-g9cj (#8952) 2026-08-13 06:56:10 +00:00
prepare.js feat(web-shell): git status chip, visual working-tree diff, and sidebar git status (#7054) 2026-07-18 10:06:07 +00:00
release-script-utils.js feat(installer): add standalone hosted install and uninstall flow (#3828) 2026-05-21 11:57:10 +08:00
review-audit-layers.mts feat(review): cover modeled-system defect layers in the reverse audit (#8956) 2026-08-12 18:15:11 +00:00
run-java-daemon-sdk-e2e.ts ci: reduce SDK Java runner queueing (#8441) 2026-08-03 16:21:05 +00:00
sandbox_command.js fix(scripts): avoid shell injection in sandbox command detection (#6108) 2026-07-01 16:20:40 +08:00
sdk-node-exporter-stub.js chore(deps): Clear high-severity CVE baseline and harden the security gate (#9584) 2026-08-21 07:43:32 +00:00
sign-release.sh feat(cli): add standalone auto-update support (#4629) 2026-06-04 22:53:12 +08:00
start.js fix(review): report what the transcripts prove; build the roster in one call (#7033) 2026-07-18 00:43:57 +00:00
sync-computer-use-schemas.ts feat(computer-use): configurable screenshot max dimension (setting + env) (#5122) 2026-06-15 15:25:27 +08:00
telemetry.js feat(core): support QWEN_HOME env var to customize config directory (#2953) 2026-05-09 15:51:52 +08:00
telemetry_gcp.js fix(mcp): update OAuth client names and improve MCP commands 2026-02-08 10:46:48 +08:00
telemetry_utils.js feat(core): support QWEN_HOME env var to customize config directory (#2953) 2026-05-09 15:51:52 +08:00
test-rewind-e2e.sh fix(test): update rewind E2E Test 1 assertion after isRealUserTurn fix (#3622) 2026-04-26 06:49:42 +08:00
test-windows-paths.js chore: consistently import node modules with prefix (#3013) 2025-08-25 20:11:27 +00:00
unused-keys-only-in-locales.json feat: add /diff command and git diff statistics utility (#3491) 2026-05-10 11:15:59 +08:00
upload-aliyun-oss-assets.js fix(release): move constants above entry point to avoid TDZ error (#4398) 2026-05-23 22:21:33 +08:00
verify-capture.mjs fix(ci): avoid verify capture color conflict (#8236) 2026-07-31 14:15:40 +00:00
verify-installation-release.js feat(installer): verify release assets + switch public docs to standalone entrypoint (#3855) 2026-06-04 17:23:04 +08:00
version.js fix(release): pin channel-base dep to exact version during release bump (#7953) 2026-07-28 16:58:28 +00:00
vitest-global-setup.js fix(devx): fail with actionable message when unit-test build prerequisites are missing (#9149) (#9171) 2026-08-18 13:19:09 +00:00
workspaces.js feat(desktop): Add desktop app package with Qwen ACP SDK integration (#3778) 2026-06-11 21:57:20 +08:00