Prebuilt standalone binaries are the supported end-user install. Bun is not required.
# Tagged installer (recommended): pin the ref, then run locally.
curl -fsSL https://raw.githubusercontent.com/Yeachan-Heo/gajae-code/v0.15.3/scripts/install.sh -o gjc-install.sh
sh gjc-install.sh
gjc --version
gjc --smoke-testPiping the main branch script executes mutable content:
curl -fsSL https://raw.githubusercontent.com/Yeachan-Heo/gajae-code/main/scripts/install.sh | shWindows (PowerShell), tagged:
Invoke-WebRequest -UseBasicParsing https://raw.githubusercontent.com/Yeachan-Heo/gajae-code/v0.15.3/scripts/install.ps1 -OutFile gjc-install.ps1
powershell -File gjc-install.ps1The installer downloads the current platform's GitHub release asset, verifies HTTP success, non-empty bytes, and published SHA-256 checksums, then runs --version and --smoke-test. A failed download or verification never replaces a working existing gjc. Version discovery uses GitHub only (https://api.github.com and https://github.com/<repo>/releases/download); firewalled or mirrored registries are not used. Offline/source workflows use --source with an existing Bun.
Unix default location: ~/.local/bin/gjc (GJC_INSTALL_DIR overrides).
Windows default location: %LOCALAPPDATA%\gjc\gjc.exe.
Standalone and source builds extract PDF text through the native pdf-inspector backend. The native addon is included with supported platform builds; no JavaScript PDF package, WebAssembly sidecar, or current-working-directory lookup is required. Conversion returns page markers and document metadata. No OCR engine is bundled, so a document with no extracted text reports the page numbers that require OCR rather than treating raw PDF bytes as text. :raw remains an explicit request for the original response.
Published package tarballs include the patched MIT-licensed Markit 0.5.3 converter under vendor/markit-ai for DOCX, PPTX, XLSX, EPUB, and RTF conversion. Its license, upstream package manifest, and deterministic provenance/hash inventory are retained. Direct npm pack and bun pm pack use the checked-in vendor tree, not borrowed or staged node_modules graphs. The release packer retains its canonical archive limits and deterministic-output checks.
Maintainers regenerate the converter with bun packages/coding-agent/scripts/vendor-markit.ts --generate. This fetches only the pinned registry artifact, verifies its SHA-512 integrity, and applies packages/coding-agent/vendor/markit-ai.patch in an owned temporary directory without executing upstream code. bun packages/coding-agent/scripts/vendor-markit.ts --check verifies local inventory and patch hashes without network access; package check and build run this verification. Normal packing does not modify installed dependencies or create ownership receipts requiring recovery.
가재씨 is installed alongside gjc as a launcher alias on package-manager installs. Standalone binaries expose gjc. On Windows, use gjc (or run from Windows Terminal / PowerShell with UTF-8 chcp 65001 if a Hangul alias is needed).
Prebuilt standalone release binaries are published for:
- Linux — x64 and arm64, glibc only (musl/Alpine is not supported; use
--sourcewith existing Bun) - Windows — x64
- macOS — Apple Silicon (arm64) and Intel (x64)
A verified nightly prerelease is published from main at 04:23 UTC and can also be started manually with the nightly-release CI dispatch. Nightly runs execute the complete main verification graph, build every supported native addon and standalone binary, and create a matching GitHub prerelease. They do not rewrite main or consume the [Unreleased] changelog sections.
curl -fsSL https://raw.githubusercontent.com/Yeachan-Heo/gajae-code/main/scripts/install.sh | sh -s -- --channel nightly
gjc --version
gjc --smoke-testWindows: pass -Channel nightly to install.ps1.
Already on GJC? Switch channels without reinstalling: gjc update --channel nightly moves to the latest nightly, and gjc update --channel stable switches a nightly install back to the latest stable (the command detects the channel switch and installs even though stable is semver-lower than the nightly). To make a channel the default for both gjc update and the startup update check, set Settings → Interaction → Update Channel (the startup.updateChannel setting). In the brief window where a nightly shares the stable core version, add --force to move onto it.
Pin an exact release tag (binary assets required):
curl -fsSL https://raw.githubusercontent.com/Yeachan-Heo/gajae-code/main/scripts/install.sh | sh -s -- --ref v0.15.0Bun is required only to build GJC from source. The installer never downloads Bun.
# Requires an existing Bun 1.3.14+ on PATH
curl -fsSL https://raw.githubusercontent.com/Yeachan-Heo/gajae-code/main/scripts/install.sh | sh -s -- --sourceFrom a checkout: bun run install:dev, then bun run dev / bun run dev:link. The setup command installs dependencies, rebuilds the native addon, links the source CLI, and installs bundled defaults. See the repository AGENTS.md for the development workflow.
From a git worktree add checkout, run bun run setup:worktree instead: it installs dependencies and builds the native addon without touching the global gjc link, git hooks, or user defaults of your primary checkout. bun run dev:doctor -- --worktree reports whether the checkout can resolve workspace packages and load the native addon. install:dev is for the primary checkout only.
GJC's shell tool requires a bash-compatible shell on Windows. After a binary install, the PowerShell installer records Git Bash if it finds it. Options:
- Install Git for Windows: https://git-scm.com/download/win
- Use WSL, Cygwin, or MSYS2
Native Windows gjc --tmux needs a tmux-compatible executable on PATH. For GJC-managed session guarantees, use WSL with real tmux. See environment-variables.md.
GJC can generate a Fig/withfig-compatible spec for Microsoft inshellisense:
gjc completion inshellisense --installThe installer writes gjc.js plus a minimal index.js into inshellisense's default local spec directory (~/.fig/autocomplete/build). If that directory already has an unrelated index.js, GJC refuses to clobber it unless --force is explicit; use --dir <path> for a separate GJC-only spec directory.
Interactive startup checks GitHub releases for a newer GJC version in the background by default. This check is notify-only and non-mutating: GJC never installs or replaces itself during launch.
- Standalone binary or former Bun/npm install on a supported platform →
gjc updateinstalls the matching GitHub release binary. Existing standalone binaries are atomically replaced. Package-manager installs migrate to a separate user binary path, even at the same version; shims are neither overwritten nor uninstalled. A target that already passes release-checksum, version, and smoke-test verification is reused without downloading the binary again (unless--forceis set). - Source checkout or
dev:linkexecutable → update, pull, build, and link through that checkout's original workflow.gjc updaterefuses to self-overwrite it. - Unsupported platform or unknown target → rerun the documented platform installer.
Run gjc config set startup.checkUpdate false to disable the launch-time check. Network failures are ignored so they do not block startup.
gjc update resolves stable from GitHub /releases/latest and nightly from the newest published GitHub prerelease. Optional GITHUB_TOKEN / GH_TOKEN raises API rate limits. --check, --force, and channel switch-back semantics are unchanged.
“Installed and verified” confirms the standalone binary, not which executable your current shell will run. A same-version migration changes the installation type, not the version. Use the explicit verified binary path printed by the updater to launch it directly; for the default POSIX location:
"$HOME/.local/bin/gjc" --version
"$HOME/.local/bin/gjc"Check command resolution in the same shell where you ran the update:
type -a gjc
command -v gjc
hash -r # Bash: clear cached command locations
# rehash # zsh equivalent
command -v gjc
gjc --versionA stale Bash command hash can retain the Bun shim even when type -a gjc lists the standalone binary first. Clearing that hash can activate the standalone binary without any PATH edit. Only if resolution still selects another install should you check aliases/functions and ensure the standalone directory precedes the shim directory on PATH. On PowerShell, inspect Get-Command gjc -All and where.exe gjc, and invoke the printed binary path with & 'path/to/gjc.exe'. No shim removal is required.
After a successful macOS binary install or update, GJC may offer:
Install Gajae Code App (experimental, community-built)? [y/N]
The default is No. This optional, third-party app is experimental, separately
licensed, and community-maintained at https://github.com/devswha/gajae-code-app;
it is not an official first-party support offering. The shared installer skips
existing verified app bundles in user-local or system Applications locations.
Only interactive terminals are eligible: CI, pipes, automation, non-macOS hosts,
and gjc update --check never prompt. Set GJC_NO_COMMUNITY_APP=1 to suppress the
offer for unattended or repeated installs.
The fresh-install offer requires Bash job ownership (including macOS /bin/sh);
other shells skip only the optional offer and leave the successful GJC installation intact.
Piped installer input is preserved rather than replaced with /dev/tty.
An accepted offer uses only a canonical published GitHub Release DMG and its
SHA-256 checksum. If no canonical release exists, installation fails closed;
there is no fallback to Actions artifacts, source execution, or raw builds.
GJC verifies the bundle identity, architecture, and pinned Developer ID signature,
copies to a writable Applications location, launches with macOS open, and safely
detaches the image during cleanup. It never implicitly uses sudo, disables Gatekeeper, removes
quarantine, or bypasses licensing or signature checks. App-specific failures are
reported with the community repository URL and do not fail the successful GJC
install or update.
Provider retry budgets live in ~/.gjc/config.yml:
retry:
requestMaxRetries: 4
streamMaxRetries: 100
maxRetries: 3
maxDelayMs: 300000requestMaxRetries applies before a stream is established. streamMaxRetries applies only to replay-safe transient stream failures. Invalid auth, unsupported models/providers, malformed requests, context overflow, user aborts, and permanent quota failures remain fail-fast.