mirror of
https://github.com/cline/cline.git
synced 2026-09-19 02:05:44 +08:00
* chore(vscode): migrate package management & build from npm/node to bun
Fold apps/vscode (+ webview-ui, testing-platform) into the root bun
workspace so the extension consumes the local @cline/* SDK packages via
workspace symlinks instead of pinned published versions, eliminating the
SDK vendoring cycle. Node remains the runtime (extension host, standalone
cline-core, esbuild platform:node, prebuild-install ABI target).
- root: drop "!apps/vscode", add nested members, relocate overrides to
root, add trustedDependencies [better-sqlite3, grpc-tools]
- apps/vscode: @cline/* -> workspace:*, scripts -> bun/bunx,
npm-run-all -> bun --parallel, drop cross-env; keep esbuild + vite;
declare previously-hoisted phantom deps (nice-grpc-common, playwright)
- package-standalone.mjs: npm install -> bun install (isolated dist dir)
- CI: setup-bun + single root bun install --frozen-lockfile, build:sdk
before extension build, better-sqlite3 binary + zero-test guards;
publish workflows intentionally keep setup-node for vsce/ovsx
- docs/comments: curated pass (keep-list vs rewrite-list), add
apps/vscode/docs/bun-migration-notes.md guard doc
- delete npm lockfiles (root bun.lock authoritative)
Deferred to follow-up PRs: test-runner migration to bun test (Phase 4)
and devDep cleanup (Phase 6).
* test(vscode): add bun test foundation for the vitest-native unit suites
Phase 4a of the test-runner migration. Adds a bun test runner that
reaches full parity (582 pass / 0 fail / 50 files) with the existing
vitest SDK-adapter + model-catalog suite, without touching the
@vscode/test-cli integration tests or the webview vitest suite.
- bunfig.toml: [test] preload
- src/test/bun-test-preload.ts: mock.module() shadows `vscode` and
`@cline/core` with their unit-test stubs (bun's onResolve plugin hook
does not intercept host/symlinked specifiers); seeds real @cline/core
export names as undefined to satisfy bun's strict ESM named-import
linking; full vitest->bun:test shim (vi.fn/mocked/spyOn, describe/it/
expect/before*/after*)
- scripts/run-bun-tests.ts: mirrors vitest.config.ts include[] exactly and
runs with --parallel for per-file mock isolation (bun test's single-process
default lets mock.module clobber across files)
- test:bun script
* test(vscode): migrate node-side unit suite from mocha to bun test
Phase 4b of the test-runner migration. The standalone mocha unit runner
(.mocharc spec: __tests__/* + test/services/**) was already broken under
bun (mocha was a phantom dependency — only @types/mocha/ts-node were
declared, npm hoisted mocha transitively). Migrate it to `bun test`.
- codemod 77 files: import { ... } from "mocha" -> "bun:test", renaming
before->beforeAll / after->afterAll at imports and call-sites; chai,
should and sinon kept as libraries (they work under bun test)
- convert sinon.stub() on ESM namespace exports to mock.module()/spyOn
(bun loads real ESM: "ES Modules cannot be stubbed")
- scripts/run-bun-unit-tests.ts: runs the .mocharc spec set with one
isolated `bun test` process per file (Bun.spawn + concurrency pool),
restoring vitest-forks module-registry isolation (bun's single-process
default lets mock.module leak across files)
- scripts/codemod-mocha-{to-bun,this}.ts: one-shot migration tooling
- test:unit now runs the bun unit runner; CI calls bun + a non-zero
pass-count guard instead of `bunx nyc ... mocha`
- tsconfig: add root node_modules/@types to typeRoots so `bun:test`
types resolve under tsc; cast loose os.userInfo mocks in shell.test
Result: unit suite 58 files / 880 pass / 0 fail; vitest set still
582/0. @vscode/test-cli integration tests and webview vitest unchanged.
* chore(vscode): remove dead mocha-runner deps and artifacts
Phase 6 cleanup after the bun test migration. The standalone mocha unit
runner is gone (replaced by scripts/run-bun-unit-tests.ts), so its
config and now-unused devDependencies are removed.
- remove dead files: .mocharc.json, tsconfig.unit-test.json,
src/test/requires.ts, .nycrc.unit.json
- remove unused devDeps: @types/mocha, @types/proxyquire, ts-node,
tsconfig-paths, cross-env, npm-run-all, nyc, proxyquire, husky
(root owns the husky hook; chai/should/sinon stay — used as libs)
- install:all -> single root `bun install` (workspace covers webview-ui)
- drop .mocharc.json / .nycrc*.json from CI paths-filters and
.vscodeignore; add bunfig.toml to the filters
Verified: check-types clean, unit 880/0, vitest 582/0.
* fix(vscode): import bun:test globals in tests that relied on ambient @types/mocha
CI Quality Checks (clean `bun install` without @types/mocha) surfaced
TS2582/TS2304 "Cannot find name 'describe'/'it'/'beforeEach'" in test
files that used the global mocha/jest test functions without importing
them. The Phase 4b codemod only rewrote files that imported from
"mocha"; these used ambient globals, so they were missed (and passed
locally because a stale @types/mocha lingered in node_modules).
Add explicit `bun:test` imports (before->beforeAll, after->afterAll in
TelemetryService.test.ts). chai/sinon stay as libraries.
Verified against a clean tree (no @types/mocha): check-types 0 errors,
unit suite 58 files / 880 pass / 0 fail.
* style(vscode): biome-format migrated test files + codemod scripts
The mocha->bun:test codemod and manual import edits left formatting that
didn't match biome (the CI `format` check, which validates files changed
since main, flagged them). Also narrow setup.ts's bun:test import to the
actually-used beforeEach/afterEach (describe/it only appear in a JSDoc
example), fixing a noUnusedImports lint error.
ci:check-all (check-types + lint + format) now passes locally.
* fix(webview-ui): declare phantom deps + pin React 18 types under bun workspace
Folding webview-ui into the bun workspace changed its install topology
from an isolated npm flat tree to the shared hoisted store, surfacing
two classes of pre-existing latent issues that npm hoisting had masked:
1. Phantom dependencies: src imports `marked`, `unist`, `unist-util-visit`
and `@heroui/theme` directly but never declared them. Declared them
(marked ^15, unist-util-visit ^5, @types/unist ^3, @heroui/theme 2.4.26).
2. React types: @testing-library/react's optional peer pulls @types/react@19
into a resolvable location; tsc mixed it with the toolkit's React 18
types (React 19 dropped Component.refs), breaking 452 JSX usages. Pin
react/react-dom type resolution to webview-ui's React 18 copy via
tsconfig paths.
build:webview (tsc -b && vite build) and ci:check-all now pass.
* fix(vscode): restore @types/mocha for integration build + add bun:test types
The @vscode/test-cli integration runner still uses mocha, and
tsconfig.test.json compiles all src/**/*.test.ts (including bun-migrated
files) to out/. So:
- restore @types/mocha (integration compile needs the mocha ambient types)
- add `bun` to tsconfig.test.json types + root @types to both tsconfig
typeRoots so `bun:test` resolves under tsc for the migrated tests
* fix(vscode): declare glob — phantom dep used by package-standalone.mjs
scripts/package-standalone.mjs imports `glob` but it was never declared
(resolved transitively under npm's flat hoist). Under the bun workspace
store it's unresolvable, failing postcompile-standalone with
ERR_MODULE_NOT_FOUND. Declare glob ^11 (modern named-export API).
compile-standalone now produces dist-standalone/standalone.zip.
* fix(ci): strip ANSI before vitest zero-test guard grep
The vitest summary line colorizes the count ("Tests <ansi>582 passed"),
so the count isn't adjacent to the "Tests" label in raw bytes and the
guard regex failed even though 582 tests passed. Strip ANSI escapes
before matching.
* fix(vscode): declare minimist — phantom dep in testing-platform-orchestrator
scripts/testing-platform-orchestrator.ts imports `minimist` (undeclared,
resolved transitively under npm hoist). Declare it so the testing-platform
integration job runs under the bun workspace store.
* fix(vscode): restore tsconfig-paths for integration runner; tp-orchestrator uses bun
Phase 6 over-removed tsconfig-paths: test-setup.js (loaded by the
@vscode/test-cli mocha integration runner) requires it to resolve @/
aliases in the compiled out/ tree — the extension host test runner failed
with "Cannot find module 'tsconfig-paths'". Restore it. Also switch the
testing-platform spawn from `npx ts-node index.ts` to `bun index.ts`
(bun runs TS natively; avoids the removed ts-node).
* fix(vscode): route tests by bun:test import marker; integration runner stays mocha
The mocha->bun codemod swept up tests that the Node-based @vscode/test-cli
integration runner compiles/runs, which cannot load the `bun:test` builtin
(and some need the real VSCode host). Establish a single source of truth:
a *.test.ts is bun-runner-owned IFF it imports "bun:test".
- run-bun-unit-tests.ts: discover files by the bun:test import marker
(not fixed globs), so every migrated file runs under bun.
- build-tests.js: generate a tsconfig that excludes all bun:test files
from the integration compile (json5-parsed), so out/ never contains
bun:test; gitignore the generated config.
- .vscode-test.mjs: exclude the bun unit dirs from the runner globs.
- revert host-dependent tests (hostbridge/*, extension, terminal,
FileContextTracker host bits) and 3 files with sinon-on-ESM/behavioral
issues (ClineIgnoreController, mentions, TelemetryService) back to
mocha; they run on @vscode/test-cli as before.
Verified: check-types 0 errors; compile-tests 0 bun:test in out/;
bun unit 65 files/962 pass/0 fail; vitest 582/0.
* fix(vscode): declare mocha — phantom dep for @vscode/test-cli integration runner
The @vscode/test-cli extension host loads `mocha` at runtime to run the
integration suite, but only @types/mocha was declared (npm hoisted the
mocha package transitively; bun's store does not expose it). The host
failed with "Cannot find module 'mocha'". Declare mocha ^11.7.4 (matches
@vscode/test-cli's own range).
* fix(vscode): robust Windows protoc-gen-ts_proto plugin resolution under bun
build-proto.mjs hardcoded node_modules/.bin/protoc-gen-ts_proto.cmd for
Windows, but bun's workspace store places/extensions the bin shim
differently (hoist + .cmd/.bunx), so Windows protos failed with
"protoc-gen-ts_proto: The system cannot find the file specified". Probe
the local + root .bin with known shim extensions instead. Also update
the testing-platform usage string (ts-node -> bun).
* fix(vscode): generate node .cmd wrapper for ts-proto plugin on Windows
The previous probe found bun's `.bunx` shim, but protoc cannot exec it
("%1 is not a valid Win32 application"). Instead, on Windows generate a
small .cmd wrapper that runs the resolved protoc-gen-ts_proto JS via
`node`, which protoc can execute regardless of package manager. POSIX
path (direct JS bin) is unchanged.
* fix(vscode): package VSIX with --no-dependencies (bundled) to stop monorepo traversal
Under the bun workspace, @cline/* are workspace:* symlinks pointing to
../../../../sdk/packages/*. vsce, walking the dependency tree, followed
them out of apps/vscode and packaged the whole monorepo (../, ~84MB incl.
root node_modules and .env), which crashed vsce's secret scanner and
failed all e2e jobs.
The extension is fully esbuild-bundled into dist/extension.js, so vsce
should not walk node_modules at all. Add --no-dependencies to every
vsce/ovsx package/publish path (e2e build, marketplace, nightly), and
tighten .vscodeignore to drop nested node_modules and dev-only inputs
(scripts, proto, testing-platform, bunfig, esbuild.mjs, etc.).
Result: VSIX is 39 files / ~7 MB and the secret scan passes.
* docs(vscode): tighten bun/node comments and consolidate into a clinerule
- add .clinerules/bun-and-node.md (eternal-now: bun=tooling, node=runtime,
keep-list, and the bun:test-vs-mocha test routing rule); remove the
apps/vscode/docs/bun-migration-notes.md migration doc and point
.clinerules/general.md at the rule (single-line bullet matching the file).
- fix the hotfix-release note: there is no infra step that regenerates the
lockfile; a CHANGELOG+version bump leaves bun.lock consistent (workspace
versions aren't pinned) and publish runs --frozen-lockfile.
- reframe runner/preload comments to describe the code as-is (drop
"migrated off mocha"/codemod history); add a TODO on the bun-test preload
to migrate suites off the vitest `vi` shim to native bun:test and delete it.
- remove the one-shot mocha->bun codemod scripts.
* fix(debug-harness): pin debugee VSCode version so bundled Playwright can drive it
The harness downloaded "stable" VSCode (currently 1.125 / Electron 42),
which the bundled Playwright cannot drive — `_electron.launch()` hangs
until its 60s timeout (Electron started and a window appeared, but the
launch handshake never completed). Default to a known-good version
(1.103.0, matching the e2e CI matrix) and allow override via
VSCODE_TEST_VERSION.
* fix(webview): render under bun workspace — dedupe React, drop stale codicons link
The webview mounted but crashed before rendering (blank sidebar; e2e
"Login to Cline" never visible) with "Cannot read properties of null
(reading 'useRef')" — the classic two-React-copies / null hook dispatcher.
Under the bun workspace, sibling packages pull react@19 into the shared
store and a transitive webview dep resolved a second React instance into
the vite bundle. Add resolve.dedupe + pin react/react-dom to webview-ui's
own React 18 copy.
Also drop the separate `<link>` to node_modules/@vscode/codicons in the
webview HTML: the webview's index.css already @imports codicons, so the
font is bundled into the build assets. Under bun that node_modules path
is a symlink to the root store (outside the webview localResourceRoots)
and isn't packaged with --no-dependencies, so the link 404'd; the bundle
covers it. Re-scope the .vscodeignore nested-node_modules exclude so it
no longer shadows the codicons re-include.
* fix(debug-harness): disable GPU so the debugee renders in headless/VM envs
On headless/VM GPU stacks the debugee Electron's GPU process crash-loops
("Exiting GPU process during initialization" / CreateCommandBuffer
kTransientFailure), killing the window before Playwright finishes
attaching and tripping the 60s launch timeout. Force software rendering
(--disable-gpu and friends) for a stable harness launch.
* fix(debug-harness): survive launch failures; configurable, longer launch timeout
The harness crashed (whole bun process exited) whenever VSCode launch
failed/timed out: Playwright emits a late unhandled rejection on the dead
CDP transport after we've already handled the launch error, and the
default behavior takes the HTTP server down with it — forcing a full
restart just to retry.
- Add process-level unhandledRejection/uncaughtException guards so stray
async errors are logged and the server keeps serving (retry via `launch`).
- On launch failure, close the orphaned Electron so a retry isn't blocked.
- Make the _electron.launch timeout configurable (--launch-timeout) and
raise the default to 120s for cold launches; document VSCODE_TEST_VERSION.
* fix(ci): address review feedback — vsix --no-dependencies, drop stale coverage path, Windows shell
- ext-vscode-publish-stable.yml: add --no-dependencies to the release-artifact
`vsce package` (Max's catch). Without it, vsce follows the @cline/* workspace
symlinks out of the package and bloats the .vsix with the whole monorepo.
- ext-vscode-test.yml: drop the stale apps/vscode/coverage-unit/lcov.info upload
path (Max's catch). That file was produced by the removed nyc unit-coverage
step (.nycrc.unit.json); nothing generates it now.
- ext-vscode-test-e2e.yml: the better-sqlite3 assert step ran under the Windows
runner's default pwsh and failed to parse the POSIX test. Pin it to `shell: bash`
(Git Bash ships on windows-latest); the non-e2e job already defaults to bash.
---------
Co-authored-by: Cline Agent <cline-agent@users.noreply.github.com>
227 lines
8.5 KiB
JavaScript
Executable File
227 lines
8.5 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
import chalk from "chalk"
|
|
import { execFileSync, execSync } from "child_process"
|
|
import fsSync from "fs"
|
|
import * as fs from "fs/promises"
|
|
import { globby } from "globby"
|
|
import { createRequire } from "module"
|
|
import os from "os"
|
|
import * as path from "path"
|
|
import { rmrf } from "./file-utils.mjs"
|
|
import { main as generateHostBridgeClient } from "./generate-host-bridge-client.mjs"
|
|
import { main as generateProtoBusSetup } from "./generate-protobus-setup.mjs"
|
|
|
|
const require = createRequire(import.meta.url)
|
|
const isWindows = process.platform === "win32"
|
|
const GRPC_TOOLS_PROTOC = path.join(require.resolve("grpc-tools"), "../bin", isWindows ? "protoc.exe" : "protoc")
|
|
// Legacy compatibility: some older/local Windows setups provision protoc into tmp-protoc.
|
|
// Prefer that path when present, but fall back to the grpc-tools bundled binary used by CI/npm installs.
|
|
const LEGACY_WINDOWS_PROTOC = path.resolve("tmp-protoc/bin/protoc.exe")
|
|
const PROTOC = isWindows && fsSync.existsSync(LEGACY_WINDOWS_PROTOC) ? LEGACY_WINDOWS_PROTOC : GRPC_TOOLS_PROTOC
|
|
|
|
if (!fsSync.existsSync(PROTOC)) {
|
|
const windowsHint = isWindows
|
|
? ` Neither ${LEGACY_WINDOWS_PROTOC} nor the grpc-tools bundled protoc at ${GRPC_TOOLS_PROTOC} exists.`
|
|
: ""
|
|
console.error(chalk.red(`protoc not found at ${PROTOC}.${windowsHint}`))
|
|
process.exit(1)
|
|
}
|
|
|
|
const PROTO_DIR = path.resolve("proto")
|
|
const TS_OUT_DIR = path.resolve("src/shared/proto")
|
|
const GRPC_JS_OUT_DIR = path.resolve("src/generated/grpc-js")
|
|
const NICE_JS_OUT_DIR = path.resolve("src/generated/nice-grpc")
|
|
const DESCRIPTOR_OUT_DIR = path.resolve("dist-standalone/proto")
|
|
|
|
// protoc invokes the ts-proto plugin as a child process, so it needs a path it can
|
|
// directly execute. On POSIX the package's JS bin (with its shebang) works. On
|
|
// Windows protoc cannot exec a bare .js or bun's `.bunx` shim ("%1 is not a valid
|
|
// Win32 application"), and the package manager's `.cmd` shim location/name varies
|
|
// (npm vs bun's hoisted store). To be package-manager-agnostic, generate a tiny
|
|
// .cmd wrapper that runs the resolved plugin JS via `node`.
|
|
function resolveTsProtoPlugin() {
|
|
const pluginJs = require.resolve("ts-proto/protoc-gen-ts_proto")
|
|
if (!isWindows) {
|
|
return pluginJs
|
|
}
|
|
const wrapperDir = path.resolve("dist-standalone")
|
|
fsSync.mkdirSync(wrapperDir, { recursive: true })
|
|
const wrapperPath = path.join(wrapperDir, "protoc-gen-ts_proto.cmd")
|
|
// %* forwards protoc's plugin args/stdio to the JS entry run under node.
|
|
fsSync.writeFileSync(wrapperPath, `@echo off\r\nnode "${pluginJs}" %*\r\n`)
|
|
return wrapperPath
|
|
}
|
|
|
|
const TS_PROTO_PLUGIN = resolveTsProtoPlugin()
|
|
|
|
const TS_PROTO_OPTIONS = [
|
|
"env=both",
|
|
"esModuleInterop=true",
|
|
"outputServices=generic-definitions", // output generic ServiceDefinitions
|
|
"outputIndex=true", // output an index file for each package which exports all protos in the package.
|
|
"useOptionals=none", // scalar and message fields are required unless they are marked as optional.
|
|
"useDate=false", // Timestamp fields will not be automatically converted to Date.
|
|
]
|
|
|
|
async function main() {
|
|
await cleanup()
|
|
await compileProtos()
|
|
await generateProtoBusSetup()
|
|
await generateHostBridgeClient()
|
|
}
|
|
async function compileProtos() {
|
|
console.log(chalk.bold.blue("Compiling Protocol Buffers..."))
|
|
|
|
// Check for Apple Silicon compatibility before proceeding
|
|
checkAppleSiliconCompatibility()
|
|
|
|
// Create output directories if they don't exist
|
|
for (const dir of [TS_OUT_DIR, GRPC_JS_OUT_DIR, NICE_JS_OUT_DIR, DESCRIPTOR_OUT_DIR]) {
|
|
await fs.mkdir(dir, { recursive: true })
|
|
}
|
|
|
|
// Process all proto files
|
|
const protoFiles = await globby("**/*.proto", { cwd: PROTO_DIR, realpath: true })
|
|
console.log(chalk.cyan(`Processing ${protoFiles.length} proto files from`), PROTO_DIR)
|
|
|
|
tsProtoc(TS_OUT_DIR, protoFiles, TS_PROTO_OPTIONS)
|
|
// grpc-js is used to generate service impls for the ProtoBus service.
|
|
tsProtoc(GRPC_JS_OUT_DIR, protoFiles, ["outputServices=grpc-js", ...TS_PROTO_OPTIONS])
|
|
// nice-js is used for the Host Bridge client impls because it uses promises.
|
|
tsProtoc(NICE_JS_OUT_DIR, protoFiles, ["outputServices=nice-grpc,useExactTypes=false", ...TS_PROTO_OPTIONS])
|
|
|
|
const descriptorFile = path.join(DESCRIPTOR_OUT_DIR, "descriptor_set.pb")
|
|
const descriptorProtocArgs = [
|
|
`--proto_path=${PROTO_DIR}`,
|
|
`--descriptor_set_out=${descriptorFile}`,
|
|
"--include_imports",
|
|
...protoFiles,
|
|
]
|
|
try {
|
|
log_verbose(chalk.cyan("Generating descriptor set..."))
|
|
log_verbose(`${PROTOC} ${descriptorProtocArgs.join(" ")}`)
|
|
execFileSync(PROTOC, descriptorProtocArgs, { stdio: "inherit" })
|
|
} catch (error) {
|
|
console.error(chalk.red("Error generating descriptor set for proto file:"), error)
|
|
process.exit(1)
|
|
}
|
|
|
|
log_verbose(chalk.green("Protocol Buffer code generation completed successfully."))
|
|
log_verbose(chalk.green(`TypeScript files generated in: ${TS_OUT_DIR}`))
|
|
}
|
|
|
|
function tsProtoc(outDir, protoFiles, protoOptions) {
|
|
const args = [
|
|
`--proto_path=${PROTO_DIR}`,
|
|
`--plugin=protoc-gen-ts_proto=${TS_PROTO_PLUGIN}`,
|
|
`--ts_proto_out=${outDir}`,
|
|
`--ts_proto_opt=${protoOptions.join(",")}`,
|
|
...protoFiles,
|
|
]
|
|
try {
|
|
log_verbose(chalk.cyan(`Generating TypeScript code in ${outDir} for:\n${protoFiles.join("\n")}...`))
|
|
log_verbose(`${PROTOC} ${args.join(" ")}`)
|
|
execFileSync(PROTOC, args, { stdio: "inherit" })
|
|
} catch (error) {
|
|
console.error(chalk.red("Error generating TypeScript for proto files:"), error)
|
|
process.exit(1)
|
|
}
|
|
}
|
|
|
|
async function cleanup() {
|
|
// Clean up existing generated files
|
|
log_verbose(chalk.cyan("Cleaning up existing generated TypeScript files..."))
|
|
await rmrf(TS_OUT_DIR)
|
|
await rmrf("src/generated")
|
|
|
|
// Clean up generated files that were moved.
|
|
await rmrf("src/standalone/services/host-grpc-client.ts")
|
|
await rmrf("src/standalone/server-setup.ts")
|
|
await rmrf("src/hosts/vscode/host-grpc-service-config.ts")
|
|
await rmrf("src/core/controller/grpc-service-config.ts")
|
|
const oldhostbridgefiles = [
|
|
"src/hosts/vscode/workspace/methods.ts",
|
|
"src/hosts/vscode/workspace/index.ts",
|
|
"src/hosts/vscode/diff/methods.ts",
|
|
"src/hosts/vscode/diff/index.ts",
|
|
"src/hosts/vscode/env/methods.ts",
|
|
"src/hosts/vscode/env/index.ts",
|
|
"src/hosts/vscode/window/methods.ts",
|
|
"src/hosts/vscode/window/index.ts",
|
|
"src/hosts/vscode/watch/methods.ts",
|
|
"src/hosts/vscode/watch/index.ts",
|
|
"src/hosts/vscode/uri/methods.ts",
|
|
"src/hosts/vscode/uri/index.ts",
|
|
]
|
|
const oldprotobusfiles = [
|
|
"src/core/controller/account/index.ts",
|
|
"src/core/controller/account/methods.ts",
|
|
"src/core/controller/browser/index.ts",
|
|
"src/core/controller/browser/methods.ts",
|
|
"src/core/controller/checkpoints/index.ts",
|
|
"src/core/controller/checkpoints/methods.ts",
|
|
"src/core/controller/file/index.ts",
|
|
"src/core/controller/file/methods.ts",
|
|
"src/core/controller/mcp/index.ts",
|
|
"src/core/controller/mcp/methods.ts",
|
|
"src/core/controller/models/index.ts",
|
|
"src/core/controller/models/methods.ts",
|
|
"src/core/controller/slash/index.ts",
|
|
"src/core/controller/slash/methods.ts",
|
|
"src/core/controller/state/index.ts",
|
|
"src/core/controller/state/methods.ts",
|
|
"src/core/controller/task/index.ts",
|
|
"src/core/controller/task/methods.ts",
|
|
"src/core/controller/ui/index.ts",
|
|
"src/core/controller/ui/methods.ts",
|
|
"src/core/controller/web/index.ts",
|
|
"src/core/controller/web/methods.ts",
|
|
]
|
|
for (const file of [...oldhostbridgefiles, ...oldprotobusfiles]) {
|
|
await rmrf(file)
|
|
}
|
|
}
|
|
|
|
// Check for Apple Silicon compatibility
|
|
function checkAppleSiliconCompatibility() {
|
|
// Only run check on macOS
|
|
if (process.platform !== "darwin") {
|
|
return
|
|
}
|
|
|
|
// Check if running on Apple Silicon
|
|
const cpuArchitecture = os.arch()
|
|
if (cpuArchitecture === "arm64") {
|
|
try {
|
|
// Check if Rosetta is installed
|
|
const rosettaCheck = execSync('/usr/bin/pgrep oahd || echo "NOT_INSTALLED"').toString().trim()
|
|
|
|
if (rosettaCheck === "NOT_INSTALLED") {
|
|
console.log(chalk.yellow("Detected Apple Silicon (ARM64) architecture."))
|
|
console.log(
|
|
chalk.red("Rosetta 2 is NOT installed. The npm version of protoc is not compatible with Apple Silicon."),
|
|
)
|
|
console.log(chalk.cyan("Please install Rosetta 2 using the following command:"))
|
|
console.log(chalk.cyan(" softwareupdate --install-rosetta --agree-to-license"))
|
|
console.log(chalk.red("Aborting build process."))
|
|
process.exit(1)
|
|
}
|
|
} catch (_error) {
|
|
console.log(chalk.yellow("Could not determine Rosetta installation status. Proceeding anyway."))
|
|
}
|
|
}
|
|
}
|
|
|
|
function log_verbose(s) {
|
|
if (process.argv.includes("-v") || process.argv.includes("--verbose")) {
|
|
console.log(s)
|
|
}
|
|
}
|
|
|
|
// Run the main function
|
|
main().catch((error) => {
|
|
console.error(chalk.red("Error:"), error)
|
|
process.exit(1)
|
|
})
|