chore: import upstream snapshot with attribution
This commit is contained in:
+74
@@ -0,0 +1,74 @@
|
||||
# Distribution: self-contained bundles
|
||||
|
||||
CodeGraph ships a **vendored Node runtime** alongside the app. Because Node 22.5+
|
||||
has a built-in real SQLite (`node:sqlite`, with WAL + FTS5), bundling Node means:
|
||||
|
||||
- **No native build** — `better-sqlite3` is gone, so there are zero native addons
|
||||
to compile or rebuild.
|
||||
- **No wasm fallback** — and therefore no more `database is locked` (issue #238).
|
||||
- **No Node-version dependence** — the app always runs on the bundled Node,
|
||||
whatever the user has (or doesn't have) installed.
|
||||
|
||||
## What's in a bundle
|
||||
|
||||
Built by [`scripts/build-bundle.sh`](scripts/build-bundle.sh) — one archive per
|
||||
platform, identical recipe (only the Node download differs):
|
||||
|
||||
```
|
||||
codegraph-<target>/
|
||||
node | node.exe # official Node runtime for <target>
|
||||
lib/
|
||||
dist/ # compiled app (+ tree-sitter .wasm grammars, schema.sql)
|
||||
node_modules/ # production deps only (pure JS / wasm — portable)
|
||||
bin/
|
||||
codegraph | codegraph.cmd # launcher → runs the bundled Node with the app
|
||||
```
|
||||
|
||||
Targets: `darwin-arm64`, `darwin-x64`, `linux-x64`, `linux-arm64`, `win32-x64`,
|
||||
`win32-arm64`. Unix targets produce `.tar.gz` (shell launcher); Windows produces
|
||||
`.zip` (`node.exe` + a `.cmd` launcher).
|
||||
|
||||
```bash
|
||||
scripts/build-bundle.sh linux-x64 # -> release/codegraph-linux-x64.tar.gz
|
||||
scripts/build-bundle.sh win32-x64 # -> release/codegraph-win32-x64.zip
|
||||
```
|
||||
|
||||
Because dropping better-sqlite3 left **zero native addons**, building a bundle is
|
||||
pure file-packaging — **any** target builds on **any** OS (the whole matrix builds
|
||||
on one Linux runner). Cross-compilation isn't a concern; only *run-testing* a
|
||||
bundle needs the target platform (or emulation, e.g. `docker run --platform
|
||||
linux/amd64`).
|
||||
|
||||
## Install channels (all deliver the same bundle)
|
||||
|
||||
1. **`curl | sh`** ([`install.sh`](install.sh)) — no Node required; ideal for a
|
||||
fresh Linux VPS over SSH. Detects os/arch, pulls the archive from GitHub
|
||||
Releases, symlinks `codegraph` onto PATH. Re-run to upgrade; `--uninstall` to
|
||||
remove.
|
||||
2. **npm** ([`scripts/npm-shim.js`](scripts/npm-shim.js)) — preserves
|
||||
`npm i -g @colbymchenry/codegraph`. The main package is a tiny shim; the
|
||||
bundles ship as per-platform `optionalDependencies`
|
||||
(`@colbymchenry/codegraph-<target>` with `os`/`cpu`), so npm installs only the
|
||||
matching one. The shim — run by the user's Node — execs the bundle, so the
|
||||
real work runs on the bundled Node 24. Works even on old Node. On Windows it
|
||||
invokes the bundled `node.exe` against the app entry directly (not the `.cmd`
|
||||
launcher) — modern Node throws `EINVAL` when asked to spawn a `.cmd`/`.bat`.
|
||||
3. **Windows** ([`install.ps1`](install.ps1)) — `irm … | iex`; same flow as
|
||||
install.sh (detect arch, pull the `.zip` from Releases, add to PATH).
|
||||
4. **Homebrew / Scoop** — TODO (tap + cask pointing at the Release archives).
|
||||
|
||||
## Release pipeline
|
||||
|
||||
[`.github/workflows/release.yml`](.github/workflows/release.yml) — manually
|
||||
triggered. Reads the version from `package.json`, builds every platform bundle on
|
||||
one runner, creates the GitHub Release (notes from `CHANGELOG.md`), and publishes
|
||||
the npm shim + per-platform packages. Requires the `NPM_TOKEN` repo secret.
|
||||
|
||||
Still TODO:
|
||||
- **Code signing** — the main gap for "download & run": macOS Gatekeeper needs a
|
||||
Developer ID + notarization; Windows needs Authenticode. Homebrew softens the
|
||||
macOS case (handles quarantine).
|
||||
- Retire the now-vestigial Node-version gate in `src/bin/codegraph.ts` — the
|
||||
bundle always runs Node 24, and the npm shim does no tree-sitter work.
|
||||
- Re-wire `npm uninstall` cleanup (the agent-config `preuninstall`) through the
|
||||
shim — the generated main package doesn't carry it.
|
||||
Reference in New Issue
Block a user