Entire hooks into your Git workflow to capture AI agent sessions as you work. Sessions are indexed alongside commits, creating a searchable record of how code was written in your repo.
With Entire, you can:
- Understand why code changed β see the full prompt/response transcript and files touched
- Recover instantly β resume from a known-good checkpoint when an agent goes sideways
- Keep Git history clean β agent context lives outside your branch's history
- Onboard faster β show the path from prompt β change β commit
- Maintain traceability β support audit and compliance requirements when needed
- Understand why code changed, not just what β Transcripts, prompts, files touched, token usage, tool calls, and more are captured alongside every commit.
- Resume from any checkpoint β Go back to any previous agent session and pick up exactly where you or a coworker left off.
- Full context preserved and searchable β A versioned record of every AI interaction tied to your git history, with nothing lost.
- Zero context switching β Git-native, two-step setup, works with Claude Code, Codex, Gemini, Pi, and more.
- Why Entire
- Requirements
- Quick Start
- Release Channels
- Typical Workflow
- Key Concepts
- Headless & CI Authentication
- Commands Reference
- Plugins
- Configuration
- Security & Privacy
- Troubleshooting
- Development
- Getting Help
- License
- Git
- macOS, Linux or Windows
- Supported agent installed and authenticated
- Go 1.26+ only if you install with
go install(the packaged installs bundle their own runtime)
Install with Homebrew:
brew tap entireio/tap
brew trust entireio/tap
brew install --cask entire # stable
# brew install --cask entire@nightly # or nightlyOr with the install script:
curl -fsSL https://entire.io/install.sh | bash # stable
# curl -fsSL https://entire.io/install.sh | bash -s -- --channel nightly # or nightlyInstall with Scoop:
scoop bucket add entire https://github.com/entireio/scoop-bucket.git
scoop install entire/entireThe Scoop package was renamed from cli to entire. If your install is still registered as the old cli package, run the migration below. It installs the new package before removing the old one, so the old install is only removed once the new one is in place (scoop reset re-links the shared entire.exe and git-remote-entire.exe shims). Run it where entire is not running β a live entire.exe locks its own shim, so Scoop can't relink or uninstall it mid-run:
cmd.exe /D /C "scoop install entire/entire && scoop uninstall entire/cli && scoop reset entire"If the first step fails with "couldn't find manifest", your bucket clone predates the renamed package β run scoop update to refresh it, then retry the command above. Nothing is removed until the install succeeds, so a failed attempt leaves your existing install working.
go install github.com/entireio/cli/cmd/entire@latest
# The git remote helper that resolves entire:// URLs, needed for `entire repo clone`
# and `git clone entire://β¦`. The packaged installs above bundle it.
go install github.com/entireio/cli/cmd/git-remote-entire@latest
# Add Go binaries to PATH (add to ~/.zshrc or ~/.bashrc if not already configured)
export PATH="$HOME/go/bin:$PATH"Install both, or just entire if you never clone over entire://. Git finds the helper by name on $PATH, which is what go install produces, so nothing else needs configuring.
One difference from a stable release: a go install build leaves experimental commands visible in entire help, the same as a nightly or a local build.
cd your-project && entire enable
# Check status
entire statusAfter the initial setup, use entire agent to add or remove agents, entire configure to update non-agent settings, and entire enable / entire disable to toggle Entire on or off.
Entire currently ships two release channels:
stable: recommended for most users. Stable releases change less often and are the default for Homebrew, Scoop, andinstall.sh.nightly: prerelease builds for users who want the latest changes earlier. Nightlies are published more frequently and may include newer, less-proven changes than stable.
How to use each channel:
- Homebrew (one-time setup):
brew tap entireio/tap && brew trust entireio/tap - Homebrew stable:
brew install --cask entire - Homebrew nightly:
brew install --cask entire@nightly install.shstable:curl -fsSL https://entire.io/install.sh | bashinstall.shnightly:curl -fsSL https://entire.io/install.sh | bash -s -- --channel nightly- Scoop: currently supports
stableonly viascoop install entire/entire
entire enable
On a repo that has not been enabled yet, entire enable runs the initial enable flow: it creates Entire settings, installs git hooks, and prompts you to choose which agent hooks to install. To enable a specific agent non-interactively, use entire enable --agent <name> (for example, entire enable --agent cursor).
After setup:
- Use
entire enableto turn Entire back on if the repo is currently disabled. - Use
entire agentto add or remove agents. - Use
entire configureto update non-agent settings (telemetry, hooks, checkpoint remote, summary provider).
The hooks capture session data as you work. Checkpoints are created when you or the agent make a git commit. Your code commits stay clean, Entire never creates commits on your active branch. Session metadata is stored outside your branch's history, in the checkpoint storage described under Checkpoint Storage.
Just use one of your AI agents as before. Entire runs in the background, tracking your session:
entire status # Check current session status anytime
To restore the latest checkpointed session metadata for a branch:
entire session resume <branch>
Entire checks out the branch, restores the latest checkpointed session metadata (one or more sessions), and prints command(s) to continue.
entire disable
Removes the git hooks. Your code and commit history remain untouched.
A session represents a complete interaction with your AI agent, from start to finish. Each session captures all prompts, responses, files modified, and timestamps.
The session ID is the unique identifier the agent itself provides β Entire never mints its own β so an ID you see in entire session list is the same one the agent uses. The format is the agent's to choose: most supply a UUID (e.g. 019efea2-b46a-7cbc-be01-4c13460f5019), while OpenCode uses ses_-prefixed IDs.
Sessions are stored separately from your code commits, in the repo's checkpoint storage.
A checkpoint is a snapshot within a sessionβa "save point" in your work.
Checkpoints are created when you or the agent make a git commit, and the commit carries an Entire-Checkpoint: <id> trailer linking the two.
Checkpoint IDs are 26-character ULIDs (e.g. 01K9TQ8ZP7X3F5M2WVJ4CNRB6D), which sort by creation time. Checkpoints written by older versions of Entire carry a legacy 12-character hex ID (e.g. a3b2c4d5e6f7); both formats stay readable in the same repo, and you can pass either to any command that takes a checkpoint ID.
Checkpoints live in your repository's own git object store, never in your branch's history. Each checkpoint is its own git ref:
refs/entire/checkpoints/<shard>/<id>
The ref points at a commit whose tree is that checkpoint β metadata.json, the per-session transcript files, and any subagent task records. <shard> is the last two characters of the ID, which keeps the refs evenly distributed.
Because checkpoints are independent refs, they are written, pushed, and fetched independently. There is no shared branch tip for concurrent sessions to contend on, and a reader can fetch exactly the one checkpoint it needs instead of a whole history. A checkpoint written on another machine is fetched on demand the first time you read it.
entire enable sets this up; there is nothing to configure. It is recorded in .entire/settings.json as:
{
"checkpoints": {
"primary": { "type": "git-refs" }
}
}Inspect what a repo has locally with plain git, or through Entire:
git for-each-ref refs/entire/checkpoints # the raw refs
entire checkpoint list # checkpoints on this branch
entire checkpoint explain <id> # one checkpoint in fullYour Branch Checkpoint storage
β β
βΌ β
[Base Commit] β
β β
β ββββ Agent works ββββ β
β β Turn 1 β β
β β Turn 2 β β
β β Turn 3 β β
β βββββββββββββββββββββ β
β β
βΌ βΌ
[Your Commit] ββββββββββββββββββΊ [Checkpoint]
Entire-Checkpoint: <id> (transcript, prompts,
β files touched, tokens)
βΌ
Work in progress is held on a short-lived shadow branch as you go. When you commit, that work is condensed into a permanent checkpoint and linked to your commit by an Entire-Checkpoint trailer.
Entire uses a manual-commit strategy that keeps your git history clean:
- No commits on your branch β Entire never creates commits on the active branch
- Safe on any branch β works on main, master, and feature branches alike
- Metadata stored separately β session data lives in per-checkpoint refs, never in your branch's history
Entire works seamlessly with git worktrees. Each worktree has independent session tracking, so you can run multiple AI sessions in different worktrees without conflicts.
Multiple AI sessions can run on the same commit. If you start a second session while another has uncommitted work, Entire warns you and tracks them separately. Both sessions' checkpoints are preserved, and a commit condenses every session with pending work in that worktree.
By default entire login opens a browser to sign in and stores tokens in the OS keyring (macOS Keychain, Linux Secret Service, Windows Credential Manager). Machines without a usable browser or keyring β headless servers, containers, minimal VMs, CI runners β have two supported paths:
Sign-in itself already handles this: with no interactive terminal, or over SSH, entire login switches to the device-code flow on its own and prints an approval URL you can open on any machine. entire login --device forces that flow explicitly. Only token storage needs an override β use the file-backed store:
ENTIRE_TOKEN_STORE=file entire loginTokens are written with 0600 permissions to tokens.json in your Entire config directory (~/.config/entire by default). Override the location with ENTIRE_TOKEN_STORE_PATH. Set ENTIRE_TOKEN_STORE=file persistently (e.g. in your shell profile) so later commands read from the same store.
Skip login and storage entirely by injecting a token per invocation:
ENTIRE_TOKEN=<login-or-sa-session-JWT> entire ...ENTIRE_TOKEN bypasses stored credentials; the CLI derives the control-plane endpoint from the token itself. Nothing is written to disk. This is the right path for CI pipelines and service accounts.
Seeing
save login/failed to unlock correct collectionerrors fromentire login? That's the OS keyring being unavailable β use one of the two paths above.
Descriptions below are the commands' own summaries. entire help always reflects the installed binary; entire agent-help is the machine-readable version agents read.
| Command | Description |
|---|---|
entire enable |
Enable Entire in current repository |
entire disable |
Disable Entire in current repository |
entire status |
Show Entire status (--json for structured output) |
entire agent |
Manage agent integrations (add, remove, list) |
entire configure |
Update non-agent Entire settings in the current repository |
entire doctor |
Diagnose and fix session issues (trace, logs, bundle, migrate-checkpoints) |
entire clean |
Clean up Entire session data (--all for repo-wide cleanup) |
entire plugin |
Manage Entire plugins (see Plugins) |
| Command | Description |
|---|---|
entire session |
Manage agent sessions (list, info, current, stop, attach, adopt, resume, tokens) |
entire session resume |
Resume a stopped session β interactive picker, or by branch |
entire checkpoint |
Inspect and search checkpoints (list, explain, tokens, search) |
entire checkpoint explain |
Explain a checkpoint, commit, or session |
entire search |
Search checkpoints, commits, and sessions using semantic and keyword matching |
entire activity |
Show your activity overview |
entire recap |
Summarize recent checkpoint activity |
entire dispatch |
Generate a dispatch summarizing recent agent work |
| Command | Description |
|---|---|
entire login |
Log in to Entire (browser by default; --device for the device-code flow) |
entire logout |
Log out of Entire |
entire auth |
Manage authentication (status, contexts, use, token, login, logout) |
| Command | Description |
|---|---|
entire org |
Manage Entire organizations (create, list, get, delete) |
entire project |
Manage Entire projects (create, list, get, delete) |
entire repo |
Manage Entire repositories (create, list, get, delete, clone, mirror, visibility) |
entire grant |
Manage Entire access grants and org membership (org, project, repo) |
entire api |
Make an authenticated request to an Entire API and print the response |
| Command | Description |
|---|---|
entire agent-help |
Machine-readable usage for coding agents (always matches the installed CLI) |
entire labs |
Explore experimental Entire workflows |
entire version |
Show build information |
These are visible in developer and nightly builds and hidden in stable releases, but always runnable in every build. Run entire labs to discover them.
| Command | Description |
|---|---|
entire review |
Run a multi-agent review against a branch |
entire investigate |
Run a multi-agent investigation against the current branch |
entire tokens |
Analyze token usage across sessions and checkpoints |
entire blame |
Show which lines came from Entire checkpoints |
entire why |
Show why a line exists |
entire experts |
Rank agent provenance for code scopes |
entire import |
Import pre-existing agent history into Entire |
entire runner |
Set up and tune trail runners for this repository |
entire blame <file> shows which current file lines came from an Entire checkpoint (--long for the full agent, model, author, and session table), and entire why <file>:<line> jumps from a specific line back to the prompt, session, and checkpoint that created it.
| Flag | Description |
|---|---|
--agent <name> |
Agent to set up hooks for: claude-code, codex, copilot-cli, cursor, factoryai-droid, gemini, opencode, pi (external agents on $PATH also work). Enables non-interactive mode |
--yes, -y |
Accept all defaults without prompting |
--force, -f |
Force reinstall hooks (removes existing Entire hooks first) |
--checkpoint-remote <provider:owner/repo> |
Push checkpoint data to a separate repo (e.g., github:org/checkpoints-repo) |
--skip-push-sessions |
Disable automatic pushing of checkpoint data on git push |
--local |
Write settings to .entire/settings.local.json instead of .entire/settings.json |
--project |
Write settings to .entire/settings.json even if it already exists |
--absolute-git-hook-path |
Embed the full binary path in git hooks (for GUI git clients that don't source shell profiles) |
--import-history |
During first-time setup, import the selected agents' existing session history (last 30 days) without prompting |
--search-skill |
Install the optional Entire search skill for the selected agent(s) |
--agent-help-skill |
Install the Entire agent-help skill (points agents at entire agent-help) for the selected agent(s) |
--telemetry=false |
Disable anonymous usage analytics |
Run in a directory that is not a git repository, entire enable offers to initialize one and (optionally) create a matching GitHub repo via the gh CLI. That path is driven by --init-repo / --no-init-repo, --no-github, --repo-name, --repo-owner, --repo-visibility, --push, --skip-initial-commit, and --initial-commit-message. See entire enable --help for the full list.
Examples:
# First-time setup with a specific agent
entire enable --agent claude-code
# Re-enable a disabled repo
entire enable
# Re-enable and refresh hooks
entire enable --force
# Save settings locally (not committed to git)
entire enable --local
entire enable is primarily for turning Entire on. On an unconfigured repo it will also bootstrap setup. Use entire agent for adding or removing agents, and entire configure for non-agent settings.
Use entire configure to update non-agent settings on a repo that's already set up. Agent installation lives under entire agent.
Typical uses:
- Toggle telemetry
- Reinstall the Entire git hook (
--force,--absolute-git-hook-path) - Update strategy options such as
--checkpoint-remoteor--skip-push-sessions - Pick the provider, model, and timeout for
entire checkpoint explain --generate(--summarize-provider,--summarize-model,--summarize-timeout-seconds)
Examples:
# Show help and the hint pointing to 'entire agent'
entire configure
# Opt out of telemetry
entire configure --telemetry=false
# Reinstall the Entire git hook with an absolute binary path
entire configure --absolute-git-hook-path
# Update strategy options on an existing repo
entire configure --checkpoint-remote github:myorg/checkpoints-private
# Choose who generates summaries
entire configure --summarize-provider claude-codeAdding or removing an agent lives under entire agent:
entire agent add claude-code
entire agent remove claude-codePlugins extend the CLI with new verbs: any executable named entire-<name> on $PATH runs as entire <name>, kubectl-style β stdio passes through, exit codes propagate, no SDK or protocol required.
entire plugin search # search the plugin index
entire plugin browse # browse the index interactively and install
entire plugin install run # install by name (index lookup)
entire plugin install https://github.com/you/entire-x # install from any git host
entire plugin install ./dist/entire-x # link a local build
entire plugin list # list what's installed
entire run # run an installed plugin
entire plugin upgrade --all # update remote-installed plugins
entire plugin doctor # check for broken installs and missing dependencies
entire plugin remove runRemote installs are forge-agnostic: the newest stable semver tag is resolved over the git protocol (prereleases need an explicit --pin), and the platform's release asset is downloaded over HTTPS and verified against the release's checksums.txt. A release that publishes no checksums is refused unless you pass --allow-unverified β installing means making those bytes executable. entire plugin doctor re-checks installed binaries against the digests recorded at install time. Plugins can declare dependencies on other plugins in an entire-plugin.yml; missing ones are installed after a single confirmation.
Discovery uses a git-synced catalog, entireio/plugin-index by default. Organizations can point the CLI at an internal catalog with the ENTIRE_PLUGIN_INDEX_URL environment variable or --index. It is deliberately not settable from a repository's committed settings: an index-listed plugin installs without a prompt, so a checked-out repo must not be able to choose the catalog.
For the full contract β resolution rules, environment filtering, release-asset conventions, and how to author a plugin β see External Commands.
Entire uses two configuration files in the .entire/ directory:
Shared across the team, typically committed to git. This is what entire enable writes for a new repo:
{
"enabled": true,
"checkpoints": {
"primary": { "type": "git-refs" }
}
}Personal overrides, gitignored by default:
{
"enabled": false,
"log_level": "debug"
}| Option | Values | Description |
|---|---|---|
enabled |
true, false |
Enable/disable Entire |
log_level |
debug, info, warn, error |
Logging verbosity |
checkpoints.primary.type |
git-refs |
Checkpoint storage backend β written by entire enable, see Checkpoint Storage |
telemetry |
true, false |
Send anonymous usage statistics to Posthog |
absolute_git_hook_path |
true, false |
Embed the full binary path in git hooks, for GUI git clients that don't source shell profiles |
commit_linking |
always, prompt |
Link commits to sessions automatically, or ask each time (default prompt) |
sign_checkpoint_commits |
true, false |
Sign checkpoint commits (default: on). See checkpoint signing |
strategy_options.push_sessions |
true, false |
Auto-push checkpoint data on git push (default true) |
strategy_options.checkpoint_remote |
{"provider": "github", "repo": "org/repo"} |
Push checkpoint data to a separate repo (see below) |
strategy_options.checkpoint_push_remote |
remote name, e.g. "upstream" |
Pin which single remote carries checkpoint data (see below) |
strategy_options.filtered_fetches |
true, false |
Use --filter=blob:none on checkpoint fetches |
strategy_options.summarize.enabled |
true, false |
Auto-generate AI summaries at commit time |
summary_generation.provider |
e.g. claude-code, codex, gemini |
Which agent generates summaries (defaults to Claude) |
summary_generation.model |
provider-specific model hint | Model hint for summary generation (requires provider) |
summary_timeout_seconds |
seconds | Hard deadline for entire checkpoint explain --generate. Unset or 0 means no deadline |
redaction.* |
nested object | PII redaction, custom secret patterns, scanner engines, and the OpenAI Privacy Filter β documented in docs/security-and-privacy.md |
Each agent stores its hook configuration in its own directory. When you run entire enable, hooks are installed in the appropriate location for each selected agent:
| Agent | Hook Location | Format |
|---|---|---|
| Claude Code | .claude/settings.json |
JSON hooks config |
| Codex | .codex/hooks.json |
JSON hooks config |
| Copilot CLI | .github/hooks/entire.json |
JSON hooks config |
| Cursor | .cursor/hooks.json |
JSON hooks config |
| Factory AI Droid | .factory/settings.json |
JSON hooks config |
| Gemini CLI | .gemini/settings.json |
JSON hooks config |
| OpenCode | .opencode/plugins/entire.ts |
TypeScript plugin |
| Pi | .pi/extensions/entire/index.ts |
TypeScript extension |
You can enable multiple agents at the same time β each agent's hooks are independent. Entire detects which agents are active by checking for installed hooks, not by a setting in settings.json.
By default, checkpoint data rides along with your own pushes β but only to one remote, the elected checkpoint sync remote. Entire picks it in this order:
strategy_options.checkpoint_push_remote, if set. This is fail-closed: if it names a remote that isn't configured, checkpoints don't sync.- A remote captured from your own habits: the first push whose target matches the branch's declared push destination elects that remote, announces it on stderr, and carries the checkpoints. The first capture sticks.
origin- The sole remote, if the repo has exactly one
- The first remote in
.git/configorder
A push to any other remote carries no checkpoint data. entire status shows the current destination, where it came from, and how many checkpoints are unpushed. This matters if you push code to several remotes: checkpoints go to exactly one of them.
If instead you want checkpoint data in a separate repo (e.g., a private repo for a public project), configure checkpoint_remote with a structured provider and repo. A dedicated checkpoint_remote is addressed directly and is exempt from the single-remote election above:
{
"strategy_options": {
"checkpoint_remote": {
"provider": "github",
"repo": "myorg/checkpoints-private"
}
}
}Or via the CLI:
entire enable --checkpoint-remote github:myorg/checkpoints-privateEntire derives the git URL automatically using the same protocol (SSH or HTTPS) as your push remote. It will:
- Fetch existing checkpoint data locally if the remote has it and you don't (one-time)
- Push checkpoint data to the checkpoint repo instead of your default push remote
- Ignore the setting if it looks inherited rather than yours, and fall back to
origin(or, failing that, the remote you are pushing to).checkpoint_remoteis normally committed in.entire/settings.json, so cloning or forking a project inherits it β without this, a contributor's session data would be pushed into the upstream project's checkpoint repo. A setting is treated as yours when it lives in the gitignored.entire/settings.local.json, or when youroriginand every push URL of the remote you are pushing to are owned by the same account or org as the checkpoint repo. Requiring the push destination too covers contributors who cloned the upstream repo and added their own fork, whereoriginbelongs to the upstream project rather than to them; requiring every push URL covers mirror-style remotes that fan out to several repositories - If your checkpoint repo is owned by a different account or org than
origin, configure it in.entire/settings.local.jsonso it is always honored - If the remote is unreachable, warn and continue without blocking your main push
ENTIRE_CHECKPOINT_TOKEN allows you to provide a dedicated token for checkpoint repository operations, without modifying the credentials used for your primary repository.
When this environment variable is set, Entire behaves as follows:
- Injects the token into HTTPS Git operations used for checkpoint fetch and push
- If
checkpoint_remoteis configured:- Prefers an HTTPS URL for the checkpoint remote when a token is present, even if the repositoryβs
originuses SSH
- Prefers an HTTPS URL for the checkpoint remote when a token is present, even if the repositoryβs
- If
checkpoint_remoteis not configured:- Falls back to using the default
originremote
- Falls back to using the default
- If
checkpoint_remoteconfiguration cannot be loaded:- Falls back to
origin - If
originis a valid SSH or HTTPS Git remote, Entire converts it to an HTTPS URL to enable token-based authentication
- Falls back to
When enabled, Entire automatically generates AI summaries for checkpoints at commit time. Summaries capture intent, outcome, learnings, friction points, and open items from the session.
{
"strategy_options": {
"summarize": {
"enabled": true
}
}
}Summaries are also generated on demand, with or without this setting, by entire checkpoint explain --generate.
Which agent writes them. By default Claude Code (claude on your PATH, model sonnet). Set a different one with summary_generation.provider β claude-code, codex, copilot-cli, cursor, gemini, or pi, plus an optional summary_generation.model hint:
entire configure --summarize-provider codexopencode and factoryai-droid cannot generate summaries. Whichever provider you pick must be installed and authenticated.
Requirements:
- The configured provider's CLI installed and authenticated
- Summary generation is non-blocking: failures are logged but don't prevent commits
Local settings override project settings field-by-field. entire status --detailed shows the state of each settings file.
Two exceptions to field-by-field merging:
- The
checkpointsblock is replaced wholesale by the local one, not deep-merged β it selects a backend, so a half-merged block would be meaningless. - A
settings.local.jsonthat is tracked in git is ignored entirely, and Entire tells you togit rm --cachedit..gitignoredoesn't apply to an already-tracked path, so a committed local file would otherwise override project settings for everyone who clones.
- Codex hooks are enabled by default (codex-cli 0.124.0+), so enabling Entire for Codex only installs
.codex/hooks.jsonβ noconfig.tomlis needed and Entire never creates one. If an older Entire version left a.codex/config.tomlbehind and your repo lives inside~/.codex/agents, delete that file to stop Codex's "malformed agent role definition" startup warning. - Entire supports Cursor IDE and Cursor Agent CLI tool. Commands (
doctor,statusetc.) work the same as all other agents. - Entire supports Copilot CLI, but not Copilot in VS Code, in other IDEs, or on github.com.
- Entire supports Pi coding agent (Preview). Pi uses a TypeScript extension instead of a JSON hook config. Subagent capture is not currently available.
Your session transcripts are stored in your git repository, in the per-checkpoint refs described above. If your repository is public, this data is visible to anyone.
Entire automatically redacts detected secrets (API keys, tokens, credentials) from transcripts and metadata before writing a checkpoint, but redaction is best-effort.
The temporary shadow branches used during a session get the same redaction for transcripts and metadata, but their code-file snapshots are raw blobs of your working tree, so a secret hardcoded in your source appears unredacted there. Entire never pushes shadow branches β don't push them manually. See docs/security-and-privacy.md for the full picture, including the configurable scanner layers, opt-in PII redaction, and the OpenAI Privacy Filter pass.
| Issue | Solution |
|---|---|
| "Not a git repository" | Navigate to a Git repository first |
| "Entire is disabled" | Run entire enable |
| A session stuck ACTIVE, or leftover session state | Run entire doctor, then entire clean --force if it persists |
| Anything else | Run entire doctor; entire doctor bundle produces a redacted diagnostic bundle for a bug report |
# Via environment variable
ENTIRE_LOG_LEVEL=debug entire status
# Or via settings.local.json
{
"log_level": "debug"
}
# Clean session data for current commit
entire clean --force
# Clean all orphaned data across the repository
entire clean --all --force
# Disable and re-enable
entire disable && entire enable --force
For screen reader users, enable accessible mode:
export ACCESSIBLE=1
entire enable
This uses simpler text prompts instead of interactive TUI elements.
This project uses mise for task automation and dependency management.
- mise - Install with
curl https://mise.run | sh
# Clone the repository
git clone <repo-url>
cd cli
# Install dependencies (including Go)
mise install
# Trust the mise configuration (required on first setup)
mise trust
# Build the CLI
mise run build
The repo includes a .devcontainer/ configuration that installs the system packages used by local development and CI (git, tmux, gnome-keyring, etc) and then bootstraps the repo's mise toolchain.
Open the folder in a Dev Container, or start it from the devcontainer CLI as follows:
devcontainer up --workspace-folder .
devcontainer exec --workspace-folder . bash -lc '.devcontainer/run-with-keyring.sh'The container's postCreateCommand runs .devcontainer/post-create.sh, which does mise trust --yes && mise install, so Go, golangci-lint, gotestsum, shellcheck, and the canary E2E helper binaries are ready after creation. Use .devcontainer/run-with-keyring.sh <command> for commands that touch the Linux keyring, including mise run test:ci.
If ENTIRE_DEVCONTAINER_KEYRING_PASSWORD is set in the environment, .devcontainer/run-with-keyring.sh uses that value to unlock the keyring non-interactively. If it is unset, the script generates a random password for the session automatically.
# Run tests
mise run test
# Run integration tests
mise run test:integration
# Run all tests: unit + integration under -race, then the E2E canary
mise run test:ci
# Lint the code
mise run lint
# Format the code
mise run fmt
If you're working on the CLI login flow against a locally running Entire API, use the smoke script. It defaults to http://localhost:8787 for both the data API and the login server, and passes the hidden --insecure-http-auth flag that a plain-HTTP login server requires:
./scripts/local-device-auth-smoke.shOverride either endpoint with ENTIRE_API_BASE_URL and ENTIRE_LOGIN_SERVER:
ENTIRE_LOGIN_SERVER=http://localhost:8180 ./scripts/local-device-auth-smoke.shThe script starts a login, opens the approval URL, waits for the CLI to finish, and then verifies a matching context was written to contexts.json.
To drive the flow by hand, or to run the focused integration coverage:
# Login against a local server (--device forces the device-code flow)
go run ./cmd/entire login --server http://localhost:8787 --insecure-http-auth --device
# Focused integration coverage for login
go test -tags=integration ./cmd/entire/cli/integration_test -run TestLoginentire --help # General help
entire <command> --help # Command-specific help
- GitHub Issues: Report bugs or request features at https://github.com/entireio/cli/issues
- Contributing: See CONTRIBUTING.md for guidelines
MIT License - see LICENSE for details.