Skip to content

Migrate entire experts to base16 palette#1607

Closed
computermode wants to merge 392 commits into
jakub-nespor/base-16-colorsfrom
jakub-nespor/base16-experts
Closed

Migrate entire experts to base16 palette#1607
computermode wants to merge 392 commits into
jakub-nespor/base-16-colorsfrom
jakub-nespor/base16-experts

Conversation

@computermode

@computermode computermode commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

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 experts follows 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:

Old value Role New
#fb923c (orange) title, agent, bullet, selected, section palette.Accent (magenta)
#22d3ee (cyan) label, file palette.Info
#818cf8 (indigo) facet palette.Blue
8 / 241 / 245 (grays) muted, sepBar, help palette.Muted (dimmest help tier gets Faint(true))

Updated the self-contained TestRenderExpertsWithStylesUsesEntirePalette fixture 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 ./... — passes
  • go test ./cmd/entire/cli -run Experts — passes
  • Grep confirms no #rrggbb or 256-color codes remain in the experts files.
  • Visual smoke test recommended (dark + light): entire experts plain 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 against git-branch and git-refs, adds a manual e2e-checkpoint-store workflow, routes roger-roger through a dedicated mise task, and tightens Copilot handling (persist-credentials: false, COPILOT_GITHUB_TOKEN only on the copilot leg). E2E Slack notifications now split reliable vs flaky agent failures.

Tooling drops the ireturn linter from .golangci.yaml (and related path exclusions).

Checkpoint API adds refs-v1, CheckpointVersion on writes, and compact_transcript_start / full-compact transcript.jsonl semantics in metadata (with tests).

Agents & CLI UX include multi-agent entire import, Windows-native Codex hook wrappers with probe/migration, Copilot lifecycle ignoring subagent toolu_* session IDs, new entire agent-help (live cobra tree, trails gating), Pi review/model/generate support, shared foreground resume commands, and doc updates (CLAUDE.md agent-help / non-interactive rules, README brew trust, Codex hooks flag).

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.

toothbrush and others added 30 commits June 29, 2026 12:39
`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
Recognize ULID checkpoint IDs alongside legacy hex
Entire-Checkpoint: 1e7aa98c0eec
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
pfleidi and others added 23 commits July 1, 2026 16:10
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>
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
Build checkpoint subtree paths via path.Join helper (no tree change)
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
Copilot AI review requested due to automatic review settings July 2, 2026 18:03
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:

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.

@computermode computermode deleted the jakub-nespor/base16-experts branch July 2, 2026 18:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

9 participants