Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
62cb82d
fix(trail): list native repo trails by ID
computermode Sep 2, 2026
f203dd0
fix(trail): preserve native repository identity
computermode Sep 2, 2026
52e0f8e
fix(trail): route native trail CRUD by repo ID
computermode Sep 2, 2026
5bfe912
fix checkpoint explain for native repos
computermode Sep 2, 2026
35307e1
Merge main into fix-native-checkpoint-explain
computermode Sep 4, 2026
98c87ef
Require explicit forge for cross-repo explain
computermode Sep 4, 2026
bcf0977
Merge main and preserve explicit native repo identity
computermode Sep 4, 2026
7a15f32
fix(doctor): respect explicit checkpoint remote selection
peyton-alt Sep 9, 2026
d71fd27
test(doctor): cover omitted checkpoint remote setting
peyton-alt Sep 9, 2026
2cff8d7
Merge branch 'main' into fix-native-checkpoint-explain
computermode Sep 9, 2026
aa41e62
fix: preserve selected remote when fetching checkpoint refs
peyton-alt Sep 9, 2026
92baa1d
fix: honor configured checkpoint fetch timeout
peyton-alt Sep 9, 2026
9612ca1
feat(enable): select checkpoint push remote during setup
peyton-alt Sep 10, 2026
82a7711
fix(enable): validate saved checkpoint destination eligibility
peyton-alt Sep 10, 2026
5a23285
fix(doctor): limit fanout warnings to selected checkpoint remote
peyton-alt Sep 10, 2026
4c8a484
fix(explain): name the supported agents for an unusable summary provider
Soph Sep 10, 2026
cefc54d
review: name the explicit checkpoint remote and cover the pinned case
peyton-alt Sep 10, 2026
712c5f3
test: pin the inherited-veto mechanism and share the git transport shim
peyton-alt Sep 11, 2026
54f6f13
fix: vote with the read candidate's push destinations too
peyton-alt Sep 11, 2026
e37982a
fix(testutil): refuse shell-injectable input to the git transport shim
peyton-alt Sep 11, 2026
c3fa758
Revert "share the git transport shim" (keeps the review fixes)
peyton-alt Sep 11, 2026
412e864
fix: include origin's push destinations in the ownership vote
peyton-alt Sep 11, 2026
7734d64
fix: a miss on a vetoed store's target is absence, not a transport fa…
peyton-alt Sep 11, 2026
adc64ce
fix: align the fetch-side ownership vote with the push side
peyton-alt Sep 11, 2026
077c948
fix(enable): address checkpoint destination picker findings
peyton-alt Sep 11, 2026
5569790
fix(doctor): make the summary-provider remedy runnable and layer-correct
Soph Sep 11, 2026
c394f11
fix(doctor): honour the loader's local-layer verdict, isolate the tests
Soph Sep 11, 2026
bfd235b
fix: install the managed plugin bin entry on Windows without a symlink
gtrrz-victor Sep 11, 2026
65f0e29
Compare carry-forward hashes with Equal, not ==
Soph Sep 11, 2026
3edc725
Merge branch 'main' into fix-install-plugin-windows
gtrrz-victor Sep 11, 2026
15f0788
refactor: build-tag the plugin symlink step and trim comments
gtrrz-victor Sep 11, 2026
83fc621
Use Equal for every plumbing.Hash comparison, and guard it
Soph Sep 11, 2026
d62b741
Catch hash comparisons on either side of the operator
Soph Sep 11, 2026
f15fe69
Report each agent's smoke verdict on its own step
gtrrz-victor Sep 11, 2026
3daeaf6
fix: address review findings on the Windows plugin bin entry
gtrrz-victor Sep 11, 2026
346a978
test: cover doctor's bin-entry checks, and unwrap a comment
gtrrz-victor Sep 11, 2026
21c3881
fix: second-pass review findings on the plugin bin entry
gtrrz-victor Sep 11, 2026
0e8e8b3
git-remote-entire: delete the wrong-cluster hint, which cannot fire
Soph Sep 11, 2026
46d6cc1
fix: a local plugin override is a doctor note, not a fault
gtrrz-victor Sep 11, 2026
2fbff44
fix(doctor): suggest a summary provider that is actually installed
Soph Sep 11, 2026
49437e6
Merge branch 'main' into fix-install-plugin-windows
gtrrz-victor Sep 11, 2026
49fa98b
Merge pull request #2377 from entireio/fix-nightly-smoke-test
Soph Sep 11, 2026
9181306
Merge pull request #2372 from entireio/soph/carry-forward-hash-equal-…
Soph Sep 11, 2026
ee488fd
Merge pull request #2359 from entireio/soph/summary-provider-diagnostics
Soph Sep 11, 2026
859c824
fix: read a vetoed store's refs from the push destination, and keep o…
peyton-alt Sep 11, 2026
b07a1c3
fix: resolve push URLs with git's repo-selector variables removed
peyton-alt Sep 11, 2026
cf891fb
refactor(enable): only prompt for the checkpoint remote on first setup
peyton-alt Sep 11, 2026
b6ff029
Merge branch 'main' into feat/enable-checkpoint-push-remote
peyton-alt Sep 11, 2026
bb78b6e
Merge branch 'main' into fix/doctor-explicit-checkpoint-remote
peyton-alt Sep 11, 2026
1cf65cb
Merge pull request #2345 from entireio/feat/enable-checkpoint-push-re…
peyton-alt Sep 11, 2026
00fe636
Merge branch 'main' into fix/doctor-explicit-checkpoint-remote
peyton-alt Sep 11, 2026
63e829f
fix: take the vetoed target from the URLs the vote already resolved
peyton-alt Sep 11, 2026
b377666
fix: close the two residual misroutes the risk rationale names
peyton-alt Sep 11, 2026
072aaf8
Merge pull request #2329 from entireio/fix/doctor-explicit-checkpoint…
peyton-alt Sep 11, 2026
b070c9a
fix: filter the vote's environment exactly when a directory is named
peyton-alt Sep 11, 2026
e8780c3
Merge pull request #2342 from entireio/fix/inherited-checkpoint-ref-f…
peyton-alt Sep 11, 2026
b0bef6b
Accept /et/<project>/<repo> paths in every repo-ref command
computermode Sep 11, 2026
d8840a8
Dispatch path refs on the ref as given, not slash-trimmed
computermode Sep 11, 2026
174dca0
Merge pull request #2387 from entireio/nina/cor-1632-cli-repo-get-rej…
computermode Sep 11, 2026
dbaa7e7
fix(status): pin the aligned ownership vote in the push-disabled test
peyton-alt Sep 11, 2026
2b81156
fix(status): finish updating the ownership-vote comments
peyton-alt Sep 12, 2026
8a43e78
Merge pull request #2389 from entireio/fix/status-fetch-owner-vote-al…
Soph Sep 12, 2026
498296f
Say what --project does, and what a mirror ref does not
Soph Sep 12, 2026
792ddb0
checkpoint: accept case-folded shard directories in ParseRef
KC1706 Sep 13, 2026
5426ab0
remove the summary runner
Soph Sep 14, 2026
f35fe81
Merge pull request #2407 from entireio/soph/disable-auto-summary
Soph Sep 14, 2026
62ca8a5
docs: install Homebrew casks by fully qualified name
Soph Sep 14, 2026
d24f2bd
ci: drop "Nightly" from the install-smoke Slack heading
Soph Sep 14, 2026
4d5305d
e2e: add control-plane suite with device-flow login and repo lifecycl…
gtrrz-victor Sep 14, 2026
4cb7eda
Merge pull request #2396 from entireio/soph/repo-path-ref-followups
Soph Sep 14, 2026
9f422b3
ci: temporarily run e2e-controlplane on its own branch
gtrrz-victor Sep 14, 2026
5fe4aaf
ci: read the GitHub test user from the GH_USERNAME/GH_PASSWORD secrets
gtrrz-victor Sep 14, 2026
69136b4
fix: preserve plugin doctor repair sources and avoid duplicate reports
gtrrz-victor Sep 14, 2026
ab283e2
e2e: keep Playwright's browser cache when redirecting XDG_CACHE_HOME
gtrrz-victor Sep 14, 2026
134e0d1
e2e: answer GitHub's authenticator prompt during the device login
gtrrz-victor Sep 14, 2026
44a61c4
ci: read the GitHub test user from the E2E_GH_* secrets
gtrrz-victor Sep 14, 2026
76950a8
fix(e2e): bound control-plane commands and cleanup
gtrrz-victor Sep 14, 2026
af3a2f1
fix: give the dispatcher the same entry repair as plugin doctor
gtrrz-victor Sep 14, 2026
6596b59
Merge branch 'main' into fix-native-checkpoint-explain
computermode Sep 14, 2026
c7e55bf
fix identity check for native cross-repo explain
computermode Sep 14, 2026
8f12237
e2e(controlplane): revoke the session, tolerate read lag, name stalle…
gtrrz-victor Sep 15, 2026
cb7c463
ci: run e2e-controlplane only on main and manual dispatch
gtrrz-victor Sep 15, 2026
f464755
e2e(controlplane): drop the timeout fixture test
gtrrz-victor Sep 15, 2026
5c160bf
Merge pull request #2247 from entireio/fix-native-checkpoint-explain
Soph Sep 15, 2026
1ffb1d6
e2e(controlplane): drop the TOTP vector test
gtrrz-victor Sep 15, 2026
b9576e2
ci: drop the test filter input from e2e-controlplane
gtrrz-victor Sep 15, 2026
6d0cd3c
e2e(controlplane): accept a padded TOTP setup key
gtrrz-victor Sep 15, 2026
38b616b
e2e(controlplane): register each cleanup before decoding the create o…
gtrrz-victor Sep 15, 2026
da4c0c9
e2e(controlplane): sweep orgs left behind by runs that ended without …
gtrrz-victor Sep 15, 2026
c5ce91b
Merge pull request #2371 from entireio/fix-install-plugin-windows
gtrrz-victor Sep 15, 2026
c77896e
fix: release the pending console read before closing a prompt terminal
gtrrz-victor Sep 15, 2026
1a16ed8
fix(lifecycle): compare committed files through Git's clean filters
Soph Sep 15, 2026
78bc44b
Merge pull request #2409 from entireio/soph/homebrew-install-one-liner
gtrrz-victor Sep 15, 2026
5ef701f
Merge pull request #2403 from KC1706/fix/ulid-shard-case-collision
Soph Sep 15, 2026
f2fe808
fix(lifecycle): withhold non-regular worktree entries from hash-object
Soph Sep 15, 2026
9133bdd
fix: close the prompt terminal even when releasing its pending read f…
gtrrz-victor Sep 15, 2026
5950974
Merge pull request #2482 from entireio/fix/uncommitted-filter-autocrlf
Soph Sep 15, 2026
db42551
Merge pull request #2481 from entireio/fix-windows-double-enter-inter…
gtrrz-victor Sep 15, 2026
a13a26d
Merge pull request #2384 from entireio/soph/drop-dead-wrong-cluster-hint
Soph Sep 15, 2026
627c9f4
e2e(controlplane): address the trail review findings
gtrrz-victor Sep 15, 2026
c21ef7f
Merge pull request #2411 from entireio/feat/e2e-controlplane
gtrrz-victor Sep 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 0 additions & 30 deletions .entire/runners/trail-summary.json

This file was deleted.

54 changes: 54 additions & 0 deletions .github/workflows/e2e-controlplane.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: E2E Control Plane

on:
workflow_dispatch:
push:
branches:
- main

# One shared test account with a three-org quota: never two runs at once, and
# never cancel one mid-flight — a cancelled run skips t.Cleanup and leaks the
# resources it created.
concurrency:
group: e2e-controlplane
cancel-in-progress: false

permissions: {}

jobs:
controlplane:
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: read

steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Setup mise
uses: jdx/mise-action@f10502fc09dadecfefb962fff68ce77213930204 # v4

# The mise task installs Chromium itself; this step adds the OS packages
# Chromium needs, which require root.
- name: Install Playwright driver, Chromium, and system dependencies
run: |
version="$(go list -m -f '{{.Version}}' github.com/mxschmitt/playwright-go)"
go run "github.com/mxschmitt/playwright-go/cmd/playwright@$version" install --with-deps chromium

- name: Run control-plane E2E tests
env:
E2E_GH_USERNAME: ${{ secrets.E2E_GH_USERNAME }}
E2E_GH_PASSWORD: ${{ secrets.E2E_GH_PASSWORD }}
E2E_GH_TOTP_SECRET: ${{ secrets.E2E_GH_TOTP_SECRET }}
run: mise run test:e2e:controlplane

- name: Upload artifacts
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: e2e-controlplane-artifacts
path: e2e/artifacts/
retention-days: 7
62 changes: 49 additions & 13 deletions .github/workflows/nightly-e2e.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
name: Nightly Install Smoke

# Every other E2E workflow builds the CLI from source. This one installs the
# published nightly the way a user does and runs one smoke test per agent
# against it, on each OS.
# published releases the way a user does: the nightly, with one smoke test per
# agent against it on each OS, and the stable cask, which is install-only.

on:
schedule:
Expand Down Expand Up @@ -70,9 +70,7 @@ jobs:
if: matrix.os == 'macos-latest'
run: |
set -euo pipefail
brew tap entireio/tap
brew trust entireio/tap
brew install --cask entire@nightly
brew install --cask entireio/tap/entire@nightly

# The README's nightly invocation. The installer updates only the stored
# user PATH, which later steps do not re-read, hence GITHUB_PATH.
Expand Down Expand Up @@ -195,11 +193,14 @@ jobs:
# would kill a recovering run and report it as a failure.
#
# In each body: `set +e` because GitHub already runs `shell: bash` with
# -e, which would end the step before its result row is written. The
# `Total: 0` check because a filter matching no test exits 0 with "[no
# tests to run]", which would report every agent as passing. Per-agent
# E2E_ARTIFACT_DIR because the mise task otherwise derives one shared dir
# and later agents overwrite earlier reports.
# -e, which would end the step before its result row is written; the
# closing `exit "$rc"` then reports the agent's own verdict on its own
# step, and the `!cancelled()` gates above are what keep the later agents
# running after it fails. The `Total: 0` check because a filter matching
# no test exits 0 with "[no tests to run]", which would report every
# agent as passing. Per-agent E2E_ARTIFACT_DIR because the mise task
# otherwise derives one shared dir and later agents overwrite earlier
# reports.
#
# E2E_ENTIRE_BIN (job env, set above) is what makes this the *installed*
# nightly: the mise task skips its build when it is set.
Expand All @@ -222,6 +223,7 @@ jobs:
rc=$?
grep -q '^Total: 0 ' "$ARTIFACT_ROOT/$AGENT/report.txt" 2>/dev/null && rc=1
echo "$AGENT $rc" >> e2e/artifacts/results.txt
exit "$rc"

- name: Smoke test opencode
if: ${{ !cancelled() && contains(format(' {0} ', env.AGENTS), ' opencode ') }}
Expand All @@ -240,6 +242,7 @@ jobs:
rc=$?
grep -q '^Total: 0 ' "$ARTIFACT_ROOT/$AGENT/report.txt" 2>/dev/null && rc=1
echo "$AGENT $rc" >> e2e/artifacts/results.txt
exit "$rc"

- name: Smoke test codex
if: ${{ !cancelled() && contains(format(' {0} ', env.AGENTS), ' codex ') }}
Expand All @@ -259,6 +262,7 @@ jobs:
rc=$?
grep -q '^Total: 0 ' "$ARTIFACT_ROOT/$AGENT/report.txt" 2>/dev/null && rc=1
echo "$AGENT $rc" >> e2e/artifacts/results.txt
exit "$rc"

- name: Smoke test cursor-cli
if: ${{ !cancelled() && contains(format(' {0} ', env.AGENTS), ' cursor-cli ') }}
Expand All @@ -277,6 +281,7 @@ jobs:
rc=$?
grep -q '^Total: 0 ' "$ARTIFACT_ROOT/$AGENT/report.txt" 2>/dev/null && rc=1
echo "$AGENT $rc" >> e2e/artifacts/results.txt
exit "$rc"

- name: Smoke test factoryai-droid
if: ${{ !cancelled() && contains(format(' {0} ', env.AGENTS), ' factoryai-droid ') }}
Expand All @@ -297,6 +302,7 @@ jobs:
rc=$?
grep -q '^Total: 0 ' "$ARTIFACT_ROOT/$AGENT/report.txt" 2>/dev/null && rc=1
echo "$AGENT $rc" >> e2e/artifacts/results.txt
exit "$rc"

- name: Smoke test copilot-cli
if: ${{ !cancelled() && contains(format(' {0} ', env.AGENTS), ' copilot-cli ') }}
Expand All @@ -315,6 +321,7 @@ jobs:
rc=$?
grep -q '^Total: 0 ' "$ARTIFACT_ROOT/$AGENT/report.txt" 2>/dev/null && rc=1
echo "$AGENT $rc" >> e2e/artifacts/results.txt
exit "$rc"

- name: Summarize
if: always()
Expand Down Expand Up @@ -353,11 +360,40 @@ jobs:
path: e2e/artifacts/
retention-days: 7

# Install-only: stable predates this checkout, so it gets no E2E (#2394).
stable-install:
runs-on: macos-latest
timeout-minutes: 15
permissions:
contents: read
steps:
- name: Install stable CLI with the documented command
run: |
set -euo pipefail
brew install --cask entireio/tap/entire

- name: Verify the install
run: |
set -euo pipefail
# No `brew tap` ran, so the tap being present proves the auto-tap.
brew tap | grep -qx 'entireio/tap'
# The cask ships both binaries; git-remote-entire backs entire:// clones.
command -v entire
command -v git-remote-entire
version_line=$(entire version | head -1)
echo "$version_line"
case "$version_line" in
*nightly*)
echo "::error::stable cask returned a nightly build: $version_line"
exit 1
;;
esac

notify-slack:
runs-on: ubuntu-latest
permissions: {}
needs: [smoke]
if: ${{ always() && needs.smoke.result == 'failure' && github.event_name == 'schedule' }}
needs: [smoke, stable-install]
if: ${{ always() && (needs.smoke.result == 'failure' || needs['stable-install'].result == 'failure') && github.event_name == 'schedule' }}
steps:
- name: Notify Slack of nightly smoke failure
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
Expand All @@ -374,7 +410,7 @@ jobs:
"type": "section",
"text": {
"type": "mrkdwn",
"text": ":red_circle: *Nightly install smoke failed* — the published nightly CLI did not pass the checkpoint smoke test on at least one OS.\n\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View run details>"
"text": ":red_circle: *Install smoke failed* — a published CLI did not install or run cleanly on at least one channel/OS.\n\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View run details>"
}
}
]
Expand Down
30 changes: 27 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,9 @@ the commands are always runnable in every build.
through `strategy.ResolveCallerSession`, not "which state file moved last" —
see [Resolving the calling session](#resolving-the-calling-session).
- `checkpoint` (aliases: `cp`, `checkpoints`): `list`, `explain`, `tokens`, `search`.
`explain` also takes `--repo <owner/name>`, the drill-down for a cross-repo
`search` hit: it reads the checkpoint from that repo's entire-api cell over
`explain` also takes a forge-qualified `--repo` (`gh/<owner>/<name>` or
`et/<project>/<name>`), the drill-down for a cross-repo `search` hit: it
reads the checkpoint from that repo's entire-api cell over
HTTP (`/repos/{repo_id}/checkpoints/{id}` plus `.../transcript/raw`) rather
than fetching git objects, so a foreign checkpoint never enters this repo's
object store, ref namespace, or `tokens profile`. It needs a full checkpoint
Expand Down Expand Up @@ -106,11 +107,25 @@ the commands are always runnable in every build.
Requiring the prefix is a **namesquatting** guard, not tidiness: without it,
whichever namespace the CLI defaulted to could shadow the other, and
`TestCloneRefAlwaysRequiresItsForgePrefix` pins that no forge-less pair
resolves in either parser or in the command. It holds only for *intent* —
resolves in either parser, in `repo clone`, or in `resolveRepoRef` — the last
being the surface every other repo-ref command shares. It holds only for
*intent* —
lookups are already unambiguous because native rows are stored prefixed in the
same `full_name` index (`et/<project>/<repo>`), which is why the bare-pair
`--repo` filters on `search`/`experts`/`explain` cannot cross namespaces
either.
The native `/et/<project>/<repo>` path is **not** clone-only: it is the
`path` the API returns, and `resolveRepoRef` accepts it for every command
that takes a repo ref — `get`, `delete`, the `visibility` and `protection`
subtrees, and `grant repo add`/`list`/`remove` (COR-1632). The other two
clone shapes are not: a `/gh/` mirror ref is refused there (the by-name
lookup resolves a project and then a repo inside it, and a mirror is in no
project — so a mirror is addressed by ULID), and an `entire://` URL is not
parsed at all. `--project` serves the **bare-name** spelling alone, because
the control plane has no by-name repo route that is not project-scoped; the
path form is checked against it for agreement, and a ULID warns that it is
ignored rather than validating, which would cost a `GetRepo` on every command
but `repo get`.
Native names are validated client-side against the server's own rules
(`nativeProjectRe`/`nativeRepoRe`, mirroring `normalizeName` in entiredb
`core/resource/project_name.go`); those bounds are server parity only and buy
Expand Down Expand Up @@ -434,6 +449,8 @@ out, err := cmd.CombinedOutput()

`interactive.UnderTest()` returns true when `testing.Testing()` or `ENTIRE_TEST_TTY` is set — use it where code needs to skip a real-terminal operation even if `CanPromptInteractively()` returns true (e.g., opening `interactive.OpenPromptTTY()` directly inside a prompt reader).

A prompt that runs Bubble Tea on a separately opened terminal (plugin confirmations, the login key prompt) must open it with `interactive.OpenPromptTTY()` and release it with `PromptTTY.Close()`, never `tea.OpenTTY()` plus a bare `Close`. Bubble Tea only gets a cancellable console reader for `os.Stdin`; on any other handle its reader loop leaves a read pending after the answer, and Go's `os.File.Close` on Windows waits for that read, which a console completes only on a keypress — the user had to press Enter twice. `PromptTTY.Close` cancels the pending read first (`CancelIoEx`, `tty_release_windows.go`); the reader then sees `io.EOF`, so the close must come after the form has returned.

### Linting and Formatting

```bash
Expand Down Expand Up @@ -1316,6 +1333,13 @@ comments at each site say which case applies:
Those operations (`setupEntireDirectory`, `removeEntireDirectory`, the one
`MkdirAll` of an agent's session dir in `resume.go`) legitimately use plain
`os` calls.
- **`Root.Link` takes two root-relative names, and `Root.Symlink` with an
absolute target is unusable on Windows.** `Root.Link(absPath, name)` is a
path escape everywhere. `Root.Symlink(absPath, name)` on Windows (Go 1.27)
writes the reparse target without the `\??\` prefix, so the link is created
but every follow fails with `ERROR_INVALID_NAME` — the 0-byte
`bin\entire-graph.exe` bug. See `plugin_store_windows.go` and
`materializeManagedEntry`.

**Deliberately not rooted**, with the reason:

Expand Down
24 changes: 17 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,12 @@ With Entire, you can:
Install with Homebrew:

```bash
brew tap entireio/tap
brew trust entireio/tap
brew install --cask entire # stable
# brew install --cask entire@nightly # or nightly
brew install --cask entireio/tap/entire # stable
# brew install --cask entireio/tap/entire@nightly # or nightly
```

Use the fully-qualified cask name (`entireio/tap/entire`, not `entire`). Homebrew 6 requires third-party taps to be trusted before it will evaluate them, and a fully-qualified name taps and trusts just that one cask, so no separate `brew tap` / `brew trust` step is needed. Requires Homebrew 6.0.10 or newer.

Or with the install script:

```bash
Expand Down Expand Up @@ -137,9 +137,8 @@ Entire currently ships two release channels:

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`
- Homebrew stable: `brew install --cask entireio/tap/entire`
- Homebrew nightly: `brew install --cask entireio/tap/entire@nightly`
- `install.sh` stable: `curl -fsSL https://entire.io/install.sh | bash`
- `install.sh` nightly: `curl -fsSL https://entire.io/install.sh | bash -s -- --channel nightly`
- `install.ps1` stable (uses Scoop when available): `irm https://entire.io/install.ps1 | iex`
Expand Down Expand Up @@ -384,6 +383,7 @@ These are visible in developer and nightly builds and hidden in stable releases,
| `--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`) |
| `--checkpoint-push-remote <name>` | Select an existing Git remote for checkpoints; always saves to this clone's `.entire/settings.local.json`, even with `--project` |
| `--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 |
Expand Down Expand Up @@ -551,6 +551,16 @@ By default, checkpoint data rides along with your own pushes — but only to **o

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.

When a repository has several remotes that could receive checkpoints, interactive first-time `entire enable` asks which one to use, after agent selection and before any hooks or settings are written. Re-running `entire enable` in an enabled repository does not ask again. Choosing a remote saves `strategy_options.checkpoint_push_remote` in `.entire/settings.local.json`, so teammates do not inherit a remote name specific to your clone; keeping the current destination writes nothing.

To select a remote without the picker:

```bash
entire enable --yes --checkpoint-push-remote fork
```

The remote must already exist, and this is also how to change the destination later or repair a saved selection that names a missing remote. An explicit flag pins the named remote, even if it is currently selected automatically. `--yes` alone does not change the checkpoint destination. The command confirms the destination when you chose one or when the saved one is unusable; otherwise it ends at `Ready.` Selecting a destination does not re-enable disabled checkpoint pushing, upload existing checkpoints immediately, or move or delete checkpoint history from other remotes.

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:

```json
Expand Down
2 changes: 1 addition & 1 deletion cmd/entire/cli/api_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ func NewAuthenticatedEntireAPICellClient(ctx context.Context, insecureHTTP bool,
// repository and returns its repo_id for repo-addressed trail reads. It is a
// package seam so tests can substitute a client pointed at a stub server.
var newTrailAPIClient = func(ctx context.Context, insecureHTTP bool, forge, owner, repo string) (*api.Client, string, error) {
placement, err := resolveTrailRepoCellPlacement(ctx, forge, owner, repo)
placement, err := resolveForgeRepoCellPlacement(ctx, forge, owner, repo)
if err != nil {
return nil, "", err
}
Expand Down
Loading
Loading