Skip to content

release: develop → main (watch manage TUI, workspace CLI verbs, llama b9982)#146

Merged
dvcdsys merged 10 commits into
mainfrom
develop
Jul 13, 2026
Merged

release: develop → main (watch manage TUI, workspace CLI verbs, llama b9982)#146
dvcdsys merged 10 commits into
mainfrom
develop

Conversation

@dvcdsys

@dvcdsys dvcdsys commented Jul 13, 2026

Copy link
Copy Markdown
Owner

Release contents

Three streams since the last release (bc4c9c2, #135):

CLI (→ cli/v0.10.0)

  • cix watch manage (alias ui) — interactive full-screen watcher manager (feat(cli): interactive watcher manager TUI (cix watch manage) #139): stop/restart/start per watcher, start-all-auto, stop-all, auto_watch toggle, confirmed project delete, log tail. Includes the config.AddProject upsert bugfix (a changed auto_watch flag was silently dropped) and a client.DeleteProject method. Post-review hardening: network-bound actions run off the TUI event loop behind a single-flight busy gate, enrichment polling is single-flight, log tail reads are bounded to the last 64 KiB.
  • Workspace management verbs (feat(cli): workspace management verbs + docs (MCP stays read-only) #145) — cix ws create/add/remove/rename/update/delete with --json parity, irrelevant-flag guards, and reserved-name rejection. MCP surface stays read-only; docs updated (the DELETE cascade description corrected).

Server (→ server/v0.12.2)

Open dependabot PRs (#137, #142, #143, #144) are deliberately not included — next cycle.

Validation (on cd98010)

  • go build / go vet / go test -count=1 ./... green in both cli/ (11 pkgs) and server/ (42 pkgs)
  • Dashboard npm ci && npm run build green

After merge

Tag the merge commit — versions derive from tag names (ldflags), no file bumps needed:

  • cli/v0.10.0release-cli.yml
  • server/v0.12.2release-server.yml (pushes :0.12.2, :latest, :0.12.2-cu128, :cu128 + tag prune)

Prod (Portainer stack 13) stays pinned to v0.12.1-cu128 until deliberately redeployed to v0.12.2-cu128.

🤖 Generated with Claude Code

dvcdsys and others added 10 commits July 10, 2026 16:10
Managing watchers was fragmented: `cix watch list` printed a static
snapshot and stopping one meant re-typing its path in a separate
command. There was no restart at all, and no single place to see every
watcher and act on individual ones.

Add `cix watch manage` (alias `ui`) — a bubbletea TUI mirroring
internal/config/tui. Rows union the local known-project list
(~/.cix/config.yaml `projects:`) with the running daemons, so listing,
stopping and toggling need no server; the server is only a preflight on
start plus an optional last-indexed enrichment. The list is windowed so
long project lists stay navigable on short terminals.

Keys: s stop · r restart · S start · a/space toggle auto_watch ·
A start all auto_watch · x stop all · d delete project (confirmed) ·
l/enter tail log · g refresh · ? help.

Daemon actions run synchronously inside Update (they are local and
microsecond); only the network last-indexed load is a tea.Cmd, and it
only returns a message, so a tick can never race an in-flight action.

Also:

- client: add DeleteProject, mapping 404 to ErrProjectGone so deleting
  an already-deleted project is an idempotent success. Delete stops the
  watcher first, so a reindex cannot re-create the project between the
  server delete and the local cleanup; a non-404 server error aborts
  before local state is touched.
- watchtui: GuardedStart (server reachable + project registered) is now
  shared by `cix watch` and the TUI — runWatchDaemon reuses it instead
  of duplicating the preflight.
- config: fix AddProject silently dropping an auto_watch update. It
  assigned to a range-loop copy and then saved the unchanged config, so
  the flag never changed for an already-registered project. This also
  makes `cix init -w=...` persist on re-run. auto_watch was previously
  inert — nothing read it — and `A` now acts on it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Review follow-ups on the watcher manager:

- start / restart / start-all-auto / delete now run as background
  tea.Cmds behind a single-flight busy gate. They preflight (or delete
  on) the server, and the HTTP client timeout is 600s — running them
  inside Update froze rendering and input for the whole wait when the
  server was slow or unreachable. Local actions (stop, stop-all,
  auto_watch toggle) stay synchronous.
- StartAllAuto probes /health once per batch instead of once per
  pending project; the server-down worst case was one connect timeout
  multiplied by every auto_watch project.
- The last-indexed enrichment is single-flight: the 2s tick no longer
  stacks another hung ListProjects call behind a stalled server.
- readTail seeks to the last 64 KiB of the watcher log instead of
  reading the whole file (logs are append-only and never rotated), and
  drops the partial line at the cut.

Verified with go test -race, plus a pty run of the real binary: first
frame, help overlay, delete-confirm cancel path, clean quit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat(cli): interactive watcher manager TUI (`cix watch manage`)
Upstream ghcr.io/ggml-org/llama.cpp:server-cuda moved past the pinned
digest. New pin is llama.cpp build 9982 (99f3dc322).

Verified on the prod RTX 3090 box before commit:
- image builds; /app/llama-server resolves all shared libs (--version OK)
- trivy HIGH/CRITICAL diff vs v0.12.1-cu128: no new findings; the
  cix-server binary is now clean (fresh Go toolchain dropped
  CVE-2026-39822); the cloudflared/ngrok findings are pre-existing and
  identical in both images
- deployed to the cix stack and exercised end-to-end (health + GPU
  offload + embedding smoke), then restored

Closes #140. Closes #136 (superseded by the same bump).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chore(server/cuda): bump pinned llama.cpp digest to 7b3d7834
…e/delete)

Add mutation verbs to `cix ws`, calling the server's existing endpoints
(POST/PATCH/DELETE /workspaces and POST/DELETE /workspaces/{id}/projects).
The CLI was previously read-only (list/describe/repos/search); workspace
management was dashboard-only.

client: CreateWorkspace, UpdateWorkspace, DeleteWorkspace,
LinkProjectToWorkspace, UnlinkProjectFromWorkspace.

cmd: name-first grammar gains create / add(link) / remove(unlink) / rename /
update / delete. `create` is a reserved leading keyword (like `list`).
- add/remove resolve a project identifier (absolute path / host_path /
  16-hex path_hash) to its indexed path_hash; a local project resolves via
  the re-derived hash because the server stores its host_path as the
  namespaced identity key `local:{machine_id}:{path}`, not the bare path.
- add/remove are best-effort over several projects, defaulting to the cwd,
  and return a non-zero exit on any failure.
- delete prompts on a TTY and refuses on a pipe without --yes.
- SilenceUsage/SilenceErrors on the ws command so errors read as one line.

12 new tests; verified end-to-end against a live server (create → add →
dup(409) → unknown → list → describe → rename → update → remove → delete).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Close the doc/skill gaps for `cix ws` management, which was previously
undocumented (dashboard-only). MCP is intentionally left read-only — no new
tools; docs just clarify that management lives in the CLI/dashboard.

- CLI_REFERENCE + skills/cix (and its plugin copy): add a Workspaces "Manage"
  block (create/add/remove/rename/update/delete).
- workspaces.md + WORKSPACES.md: document the CLI link-existing flow, kept
  clearly distinct from the dashboard clone-new (`git-repos`) flow.
- cix-workspace skill: prerequisite note on creating/populating a workspace.
- COWORK_MCP + cowork cix-workspace skill: clarify the cix_* MCP tools are
  read-only and management is done via the CLI or dashboard.

Canonical skills mirrored into plugins/cix via sync-skills.sh (--check clean);
plugin bats suite green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…; test rename/update

Address PR review feedback on the workspace management verbs:

- add/remove/delete now honour --json (structured stdout instead of the
  human ✓ lines), so all verbs are consistent for agent consumption.
- guardVerbFlags rejects a management flag set for a verb it doesn't apply
  to (e.g. `cix ws create foo --name bar`) instead of silently ignoring it.
- create refuses `list`/`create` as names — they'd be unaddressable by the
  name-first grammar — and quotes the workspace name in its hint.
- resolveProjectHash comment corrected: tier 3 matches on the re-derived
  path_hash, not host_path, and there is no ~ expansion.
- new tests cover rename, update's clear-on-empty --description and
  no-flags error (the cmd.Flags().Changed semantics), the flag guard, the
  reserved-name reject, and --json for add/delete.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The REST table claimed `DELETE /workspaces/{id}` "cascades to repos +
clones", contradicting the rest of the doc. Service.Delete only removes the
`workspaces` row; the ON DELETE CASCADE on `workspace_projects` clears
membership rows only — projects, their `git_repos` peers, and on-disk clones
are untouched.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat(cli): workspace management verbs + docs (MCP stays read-only)
@dvcdsys
dvcdsys merged commit eb117f6 into main Jul 13, 2026
19 of 20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

chore(server/cuda): bump pinned llama.cpp digest

1 participant