Migrate entire experts to base16 palette#1607
Closed
computermode wants to merge 392 commits into
Closed
Conversation
`entire trail` derived the repo from origin and the branch from the current checkout, so it only worked inside a clone of the target repo. Add: - persistent `--repo forge/owner/repo` (or a clone URL) on the trail root, honored by show/list/update/delete/watch/finding. Rejected on the local-clone commands (create, checkout, finding apply). - `--branch` on show/watch/finding to select a trail by branch instead of the current checkout. update/delete already had `--branch`. Mutually exclusive with an explicit trail selector. Auth is unchanged: it already keys off the API base URL's .well-known/entire-api.json, independent of any local git repo. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Entire-Checkpoint: 976ac978f60e
The bare forge/owner/repo form accepted parts[0] as the forge without
checking it is a known short forge id, so `--repo github.com/acme/app` (or
gitlab.com/...) slipped through and produced a malformed
/api/v1/trails/<forge>/... path that failed with an opaque server error.
Validate the forge segment against gitremote.IsSupportedForge and fail with a
clear message pointing at a forge id ("gh") or a clone URL.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: fb56d44a31fd
With --repo targeting a repo other than the local clone, the branch-defaulting commands (show, update, delete, watch, finding) fell back to the local checkout's current branch, which could silently resolve the wrong trail when a branch name is shared. Require an explicit --branch or trail selector alongside --repo and fail clearly otherwise. Also restores a //nolint:ireturn directive in agentimport.go that a prior local `mise run lint --fix` pass had stripped (CI lints without --fix). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Entire-Checkpoint: 53294056bf83
The trails-enablement cache is keyed to the local clone's origin. With a --repo override the queried repo differs, so recording enablement (noteTrailCommandEnablement on every authenticated call, plus watch's explicit save) would mis-attribute it to the local repo — and the error path would make a spurious enablement call about the wrong repo. Thread the override into runAuthenticatedTrailAPI and skip the cache writes when it is set. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Entire-Checkpoint: 3ff3830dba23
…nature main added postReviewToTrail, which calls resolveTrailReviewTarget; pass empty --repo/--branch overrides so it keeps targeting the current branch's trail. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Entire-Checkpoint: fe28736fc4d2
…sing; refine session-fallback caveat Addresses review feedback on #1535. Karthik's report (community Discord + karthik-rameshkumar#1): `entire why` on a line whose checkpoint metadata is missing printed "Full context: entire checkpoint explain <id>", but running that command fails identically ("no checkpoint or commit found matching <id>") because the same remote fetch `why` attempts has already failed. The hint pointed at a command that immediately errors. - Resolve metadata-missing during attribution (resolveFileAttribution with fetchOnMiss) and record a MetadataMissingReason that states the cause and the actionable remedy: `git fetch <remote> entire/checkpoints/v1:...`, then re-run `entire checkpoint explain <id>`. Surfaced in the line and file `why` views and in JSON. Also drops the separate post-resolution enrich step, which left the checkpoint map non-deterministic across calls. (Mechanism and tests adapted from Karthik's PR.) - Suppress the bare "Full context: entire checkpoint explain <id>" hint when metadata is missing: it would fail the same way, and the reason line above now gives the fetch-then-explain sequence. - Refine the session-fallback caveat (Soph's review): flag the multi-session fallback whose chosen session has empty FilesTouched (one of several sessions, no path evidence) via `sessionsRead > 1 || len(FilesTouched) > 0`, while still suppressing the single-session empty-paths false positive. Tests for both. Co-authored-by: karthik-rameshkumar <6728802+karthik-rameshkumar@users.noreply.github.com>
# Conflicts: # cmd/entire/cli/review/profile.go # cmd/entire/cli/review_bridge.go # docs/architecture/review-command.md
Entire-Checkpoint: 3f7ff1353636
Entire-Checkpoint: 04c405a0e030
Clone is reachable only via `entire repo clone` now. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Entire-Checkpoint: 20e3f4725476
De-duplicate the entire://<host>/gh/<owner>/<repo> synthesis shared by mirrorRow and repo clone, and build it from entireCloneURLScheme rather than a bare literal. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Entire-Checkpoint: 6121cc05be7e
…idation The verbatim entire:// URL is forwarded to git clone exactly as typed (equivalent to a raw `git clone entire://…`); validateClusterHost only guards the shorthand path where we synthesize the URL ourselves. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Entire-Checkpoint: 6e00001035cc
Add`entire repo clone`
Fix escaping in help text.
Recognize ULID checkpoint IDs alongside legacy hex
Entire-Checkpoint: 1e7aa98c0eec
README: mention tap trust
Encode trail resume session last_active through a pointer-backed JSON shape so unset timestamps are omitted instead of serialized as year 0001. Also remove the unused agentimport.Get helper that blocked the full lint check after merging main. Entire-Checkpoint: c40acde9e205
Entire-Checkpoint: 17545bac9274
…ores Phase 2: pluggable checkpoint stores (registry + topology)
Reframe the tuning command as setup of a repo's runners, under a new `runner` group (hidden during maturation, like `trail`): - `entire trail tune` → `entire runner setup`. - Renamed trail_tune_*.go → runner_*.go and the command type/funcs (newRunnerSetupCmd, runRunnerSetup, runnerSetupOptions, runnerInsecureHTTP). - On re-run in a repo that already has runners (nothing to scaffold), setup now offers to re-tune instead of silently re-emitting: interactive confirm, or --run as an explicit yes; non-interactive without --run prints a hint. First-run behavior (create defaults → tailor) and all flags (--run, --yes, --sources, --limit, --debug-dir, [runner]) are unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Entire-Checkpoint: e9d8c60a8008
Refactor toward the per-checkpoint git-ref store (#1471): isolate the repo-only "build one checkpoint's subtree" machinery from the git-branch store so a second backend can share it instead of duplicating it. - The repo-only entry/subtree builders (writeStandardCheckpointEntries, writeTaskCheckpointEntries, writeSessionToSubdirectory, writeCheckpointSummary, findSessionIndex, reaggregateFromEntries, replaceTranscript, replaceSkillEvents, writeTranscript/writeCompactTranscript, copyMetadataDir, readSummaryFromBlob, readMetadataFromBlob, buildCommitMessage) move from *GitStore to a new *treeWriter; GitStore embeds *treeWriter so call sites resolve via promotion. - GitStore's four write methods route through shared appliers anchored at the checkpoint-dir root; the git-branch store keeps splicing the result under <shard>/<id>/ into the v1 tree, so the committed v1 tree is byte-identical. writeCheckpointSummary now takes the checkpoint-version to stamp. Behavior-preserving: the git-branch checkpoint, strategy, and integration suites are unchanged. Nothing constructs a second backend yet. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Entire-Checkpoint: 99d650653e0c
Entire-Checkpoint: 5ac1e71750f3
feat(trail): --repo and --branch overrides
Entire-Checkpoint: 5823005e35aa
Cursor transcript lines carry only role + message — no per-turn uuid or timestamp — so DeriveCheckpointID collided on an empty UUID and every turn after the first was skipped as a duplicate, with CreatedAt always zero. Key each turn by its line index (the Codex pattern) and fall back to the file modtime for CreatedAt (the Factory/Gemini pattern). Fixtures now match the real on-disk format. Copilot timestamps may be numeric epoch-millis, not only RFC3339 strings. Decoding into a string field made json.Unmarshal fail on numeric values, hitting the defensive skip and importing zero turns for the session. Decode the timestamp as json.RawMessage and parse it with the agent's dual-format parser (exported as copilotcli.ParseTimestamp). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Entire-Checkpoint: 217723121355
TmuxSession.Send may retry Enter when the pane does not visibly react within its 2s window. Vogon treated an empty stdin line as session termination, so on a slow runner a retried Enter could end the session mid-test. Exit only on explicit exit/quit and update the comments that described the pre-rewrite Send semantics. Entire-Checkpoint: ffcdd5a7efd3
waitForInputIngested already holds the settled pane content, so return it instead of re-capturing for the stableAtSend snapshot and the first Enter verification. Saves two tmux subprocess spawns per Send and makes the snapshot exactly the content the stability wait verified. Entire-Checkpoint: 6537ed5b37ba
Print quoted view commands in the available-findings error path so copied handles are shell-safe. Reuse the review handle helpers for manifest naming and handle deduplication so list and detail paths stay consistent. Entire-Checkpoint: 4b50b9a535cc
Require two consecutive stable polls in waitForInputIngested so a single quiet interval mid-paste can't fake stability, and document why it compares raw captures instead of stableContent. Re-print the vogon prompt when ignoring an empty line so manual REPL sessions stay readable. Addresses PR #1599 review feedback. Entire-Checkpoint: 944b219ab908
Droid's prompt pattern matches the always-visible input box, so WaitFor can return mid-turn; the 10s file wait then expires while the Worker is still executing (60-120s turns on CI). Widen the file and rewind-point waits to absorb the Worker runtime. Entire-Checkpoint: 63e9c5af67f1
Prefer timestamp handles in generated review findings commands when session handles may be shared across saved manifests. This keeps advertised view commands usable even after re-reviewing the same source session. Entire-Checkpoint: ed909b22b352
The adjacent comment documents Worker turns of 60-120s on CI but the file wait was capped at 90s, so a slow Worker could outlive the wait even when it succeeds. Droid's 2x timeout multiplier gives these tests a 6-minute budget, so the wider wait fits comfortably. Entire-Checkpoint: 132cc906436e
fix(e2e): droid prompt submission and claude-code subagent flakes
…r verbs
## Suspended-mirror warning
When `entire repo mirror create` re-registers an existing placement that an
admin has suspended, it now prints a warning right after the placement message:
WARNING: this mirror has been suspended by an admin and won't be usable.
It skips the pointless clone-readiness poll (a suspended mirror never becomes
ready) and treats the re-create as a non-fatal success (exit 0). The wizard
surfaces the same state as a per-mirror "suspended" status. Consumes the new
`suspended` field on the CreatedMirror response (server side: entiredb #2328,
deployed).
## Drop sunset collaborator grant/revoke verbs
The server sunset POST/DELETE /mirrors/collaborators (grant/revoke); only the
GET (list) survives. Refresh the vendored OpenAPI spec from the live core and
regenerate the client — which removes the dead GrantMirrorCollaborator /
RevokeMirrorCollaborator operations — then delete the CLI verbs that called them:
- `entire repo mirror collaborators add` (grant) — removed
- `entire repo mirror collaborators remove` (revoke) — removed
- `entire repo mirror collaborators list` — kept (GET still live)
The refresh also picks up three new, currently-unused server operations
(deleteMe, listRepos, lookupRepoBySlug): additive generated code, no CLI
surface yet.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 96479f535945
Refresh docs now pipe the download through `jq .` so core.openapi.json lands multi-line instead of minified. Reformatted the spec in place; content-identical, core.gen.json and generated client unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Entire-Checkpoint: d4905717debc
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Add agent-safe review findings fallback
A suspended mirror can't be used, so `repo mirror create` now fails (exit non-zero) after printing the warning instead of exiting 0 — a script chaining a clone shouldn't treat it as success. One-shot returns a SilentError (the warning is the message); the wizard marks the mirror a failure so the batch exits non-zero too. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Entire-Checkpoint: 01bf244ea5d6
…and-collaborator-cleanup feat(mirror): warn on admin-suspended create; drop sunset collaborator verbs
chore(coreapi): pretty-print vendored openapi spec via jq
Per-checkpoint git-ref checkpoint store (git-refs backend)
A reviewer flagged `fmt.Sprintf("%s%d/%s", basePath, idx, paths.MetadataFileName)`
as looking like a missing slash — it's correct only because basePath carries a
trailing "/". Replace the string-concat path construction with a
checkpointSubtreePath(base, segs...) helper over stdlib path.Join, so paths join
correctly without relying on that invariant.
- Helper uses the `path` package (NEVER path/filepath — git tree paths are always
"/"; filepath.Join would emit "\" on Windows and corrupt tree keys). path.Join
cleans separators, so base may be "" (ref root), "<shard>/<id>/" (v1, trailing
slash), or a clean dir — all join identically.
- Converted every full-path site and routed the directory-prefix intermediates
through the helper as CLEAN dirs (sessionDir, taskDir), updating their
consumers (writeSessionToSubdirectory, writeTranscript, writeCompactTranscript,
replaceTranscript, replaceSkillEvents, copyMetadataDir, writeTaskCheckpoint*).
- The two prefix-scoping deletes that relied on the trailing slash now append it
explicitly: HasPrefix(key, sessionDir+"/") (so "1" doesn't match sibling "10")
and the transcript chunk cleanup. Leading-slash SessionFilePaths values become
"/" + checkpointSubtreePath(...).
No behavior change: committed-tree assertions (checkpoint write/read, tripwire,
update), integration (378), and both canary modes (git-branch 59/59, git-refs
58/59 +1 skip) are unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 973f8248e820
path.Join with no trailing segments cleans a "" base to "." — an invalid git tree key. No current caller hits this (all pass at least one segment), but the helper's contract says it handles the ref root (base=="") safely, so make that true: return "" for the ref root and the cleaned base otherwise. Adds the ref-root-base-only test case to lock the behavior. Addresses Copilot review on #1576. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Entire-Checkpoint: a0d229c313ef
Add Pi review-runner adapter
Build checkpoint subtree paths via path.Join helper (no tree change)
…por/base-16-colors
The experts command (plain output + interactive TUI) was missed by the base16 migration and still carried its own Tailwind-400 hex colors (#fb923c, #22d3ee, #818cf8) and extended 256-color codes (245, 241), so it ignored the user's terminal theme. Route every experts style through cmd/entire/cli/palette: - orange accent (title/agent/bullet/selected/section) -> palette.Accent (magenta) - cyan (label/file) -> palette.Info - indigo (facet) -> palette.Blue - grays 8/241/245 -> palette.Muted, with Faint(true) for the dimmest help tier Update the self-contained TestRenderExpertsWithStylesUsesEntirePalette fixture to the palette constants so the assertion matches the migration. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Entire-Checkpoint: 891898a2f93d
Comment on lines
+34
to
+52
| runs-on: ubuntu-latest | ||
| outputs: | ||
| agents: ${{ steps.set.outputs.agents }} | ||
| steps: | ||
| - id: set | ||
| # Pass the input through env rather than interpolating it into the script: | ||
| # `type: choice` only constrains the UI, so a REST-API dispatch could inject | ||
| # shell metacharacters here otherwise. | ||
| env: | ||
| AGENT_INPUT: ${{ github.event.inputs.agent }} | ||
| run: | | ||
| input="$AGENT_INPUT" | ||
| if [ -n "$input" ]; then | ||
| echo "agents=[\"$input\"]" >> "$GITHUB_OUTPUT" | ||
| else | ||
| echo 'agents=["claude-code","opencode","gemini-cli","factoryai-droid","cursor-cli","copilot-cli","roger-roger","codex"]' >> "$GITHUB_OUTPUT" | ||
| fi | ||
|
|
||
| e2e-checkpoint-store: |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Stacked on #1542. That PR migrated every TUI color to the base16 palette but missed
entire experts(experts_cmd.go+experts_tui.go), which still shipped its own Tailwind-400 hexes and 256-color codes and therefore ignored the user's terminal theme.This closes that gap so
expertsfollows the terminal like the rest of the CLI.How
Routed every experts style through
cmd/entire/cli/palette, matching the mappings the base PR established:#fb923c(orange)palette.Accent(magenta)#22d3ee(cyan)palette.Info#818cf8(indigo)palette.Blue8/241/245(grays)palette.Muted(dimmest help tier getsFaint(true))Updated the self-contained
TestRenderExpertsWithStylesUsesEntirePalettefixture to the palette constants so its assertion matches the migration (it was named for the palette but hardcoded the old hexes).Verification
mise run fmt && mise run lint— clean (0 issues)go build ./...— passesgo test ./cmd/entire/cli -run Experts— passes#rrggbbor 256-color codes remain in the experts files.entire expertsplain output and the interactive TUI — confirm accents/help text stay readable and follow the terminal theme.🤖 Generated with Claude Code
Note
Medium Risk
Large cross-cutting scope (checkpoint metadata, git hooks, Copilot token handling, import pipeline) with mostly additive CI and prompt changes; incorrect hook or session-lifecycle behavior could affect user repos on upgrade.
Overview
This diff is a broad release/housekeeping batch aligned with 0.7.8 in
CHANGELOG.md, not a single UI tweak.Trail automation (
.entire/runners/) rewrites the confidence, drift, risk, security, review, and review-focus prompt templates so evaluators assume the Entire Go CLI (mise gates,*_test.go/integration/e2e, git-mutating surfaces, hooks, checkpoint/redaction paths) instead of generic web-app guidance.CI / E2E (
.github/workflows/) expands checkpoint-backend coverage: PR canary runs againstgit-branchandgit-refs, adds a manuale2e-checkpoint-storeworkflow, routes roger-roger through a dedicated mise task, and tightens Copilot handling (persist-credentials: false,COPILOT_GITHUB_TOKENonly on the copilot leg). E2E Slack notifications now split reliable vs flaky agent failures.Tooling drops the
ireturnlinter from.golangci.yaml(and related path exclusions).Checkpoint API adds
refs-v1,CheckpointVersionon writes, andcompact_transcript_start/ full-compacttranscript.jsonlsemantics in metadata (with tests).Agents & CLI UX include multi-agent
entire import, Windows-native Codex hook wrappers with probe/migration, Copilot lifecycle ignoring subagenttoolu_*session IDs, newentire agent-help(live cobra tree, trails gating), Pi review/model/generate support, shared foreground resume commands, and doc updates (CLAUDE.mdagent-help / non-interactive rules, READMEbrew trust, Codexhooksflag).If the branch was meant to be only
entire experts→ base16 palette, that work is not in this diff snapshot—the changes above dominate.Reviewed by Cursor Bugbot for commit 595199d. Configure here.