Conversation
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)
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.
Release contents
Three streams since the last release (
bc4c9c2, #135):CLI (→
cli/v0.10.0)cix watch manage(aliasui) — 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_watchtoggle, confirmed project delete, log tail. Includes theconfig.AddProjectupsert bugfix (a changedauto_watchflag was silently dropped) and aclient.DeleteProjectmethod. 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.cix ws create/add/remove/rename/update/deletewith--jsonparity, irrelevant-flag guards, and reserved-name rejection. MCP surface stays read-only; docs updated (the DELETE cascade description corrected).Server (→
server/v0.12.2)d0cd0c45… → 7b3d7834…(b9982,99f3dc322) (chore(server/cuda): bump pinned llama.cpp digest to 7b3d7834 #141, closes chore(server/cuda): bump pinned llama.cpp digest #136/chore(server/cuda): bump pinned llama.cpp digest #140). Verified before merge on the prod RTX 3090 box: shared-lib layout intact (--version,--list-devices→ CUDA0), trivy HIGH/CRITICAL diff vsv0.12.1-cu128shows no new findings (the fresh Go toolchain also dropsCVE-2026-39822fromcix-server), temporary prod deploy passed health + GPU + semantic-search E2E, then restored.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 bothcli/(11 pkgs) andserver/(42 pkgs)npm ci && npm run buildgreenAfter merge
Tag the merge commit — versions derive from tag names (ldflags), no file bumps needed:
cli/v0.10.0→release-cli.ymlserver/v0.12.2→release-server.yml(pushes:0.12.2,:latest,:0.12.2-cu128,:cu128+ tag prune)Prod (Portainer stack 13) stays pinned to
v0.12.1-cu128until deliberately redeployed tov0.12.2-cu128.🤖 Generated with Claude Code