aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
2026-06-29docs: TODO - record crashed-create poisons working tree bugDanilo M.1-0/+13
A repo create that dies at the y/N prompt leaves the stanza uncommitted in the working tree; stanza_exists reads the working file, so a re-run skips Phase 1 and times out waiting for a bare repo gitolite was never told to build. Records recovery and fix options. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29docs: document repo create --private in the skillDanilo M.1-0/+7
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29feat: repo create --private - Phase 1 only, never added to cgitDanilo M.4-4/+31
--private makes the gitolite stanza and bare repo but skips the helper call, so the repo is never written to cgitrc and stays off the public cgit index (shows PRIV in repo list). --section is required unless --private. Bash completion offers --private; README and CLAUDE.md document the flag and the local /usr/local/bin install. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24docs: document repo-name completion and the server: output prefixDanilo M.2-1/+9
- README: completion note now covers repo-name completion for desc/delete/add-remote, not just --section; new Notes entry on the server: prefix for helper/sync passthrough. - SKILL.md: gotcha explaining that server:-prefixed lines are remote echo (not errors) and that repo list output is not prefixed. Docs only. (The global ~/.claude copy of the skill got the same gotcha, outside the repo.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24feat: repo-name completion + label helper passthrough outputDanilo M.3-16/+41
- Bash completion now completes repo NAMES for desc/delete/add-remote at the name position, sourced from `gitctl repo list` (first field, header row dropped). One ssh call, only at that position, so a stray Tab never hits the network; the leading -y is handled. - call_helper prefixes every passthrough line from the helper (and the sync script it runs) with "server: " via _server_prefixed, so output like "No changes." reads as remote output instead of interleaved local noise. quiet=True callers (repo list) still get raw stdout to parse. Client-only, no helper redeploy needed. Self-test pins _server_prefixed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24docs: bring CLAUDE.md, README, TODO current after the three featuresDanilo M.3-20/+44
- CLAUDE.md: new hard rule that removal functions are exact inverses of their add counterparts (round-trip self-tests); TRASH_DIR added to the server constants; verified-live list extended with list-repos and a full delete cycle. - README: TRASH_DIR in the server-install constants and its dir note. - TODO: items 1-3 already marked done; cross-cutting work folded in; remaining leftovers listed (repo-name completion, the cosmetic No changes. echo, and the YAGNI gc-trash prune verb). - Removed all pre-existing em dashes from CLAUDE.md and README. Docs only, no code change. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24feat: repo delete - remove repo, move bare repo to trashDanilo M.6-47/+279
gitctl repo delete <name> removes a repo from all three places it lives, the inverse of repo create: - gitolite stanza via remove_stanza (inverse of add_stanza), committed and pushed FIRST so gitolite stops serving the repo before its bytes move. - cgit block via the new delete-repo helper verb (remove_repo_block, inverse of insert_repo_block), backed up and synced. - the bare repo is MOVED to TRASH_DIR (/var/lib/gitolite3/trash, timestamped) with a .trashinfo breadcrumb, not rm, so it is recoverable. A realpath check keeps the move one level under REPO_BASE. Always confirms; the global -y is deliberately not honored (cmd_delete never reads a.yes). Idempotent: a piece already gone is skipped. Partial failure is resumable by re-running, like create. Both inverse functions are pinned by add/insert-then-remove round-trip self-tests plus middle/last/missing cases; trash_repo and do_delete_repo run on temp dirs. Verified live: create then delete round-trips against the real gitolite.conf, bare repo lands in the trash dir intact. Helper changed: redeploy gitctl-helper to the server. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24feat: global -y/--yes flag to skip additive confirmationsDanilo M.5-23/+57
repo create's y/N push confirmation can now be skipped with -y. The flag is global (top-level parser), so it goes before the subcommand: gitctl -y repo create ... . The diff is still printed and an auto-confirmed note shown. -y does NOT bypass SSH key auth (the phase-1 push still needs the password / smartcard touch), so creation is never fully unattended. Hard wall: -y is never honored by a future destructive delete; the flag help, a client comment, and TODO item 1 all record this. Bash completion offers -y at the top level and transparently skips a leading -y when resolving the subcommand. Self-test pins the parse round-trip. Client-only change; the server helper is unchanged, no redeploy needed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24feat: repo list - list all repos, public and privateDanilo M.6-20/+172
New gitctl repo list / helper list-repos verb. Source of truth is the bare repos on disk (REPO_BASE/*.git), not cgitrc, so private repos (absent from cgitrc since cgit auto-discovery is off) show too. Each repo is tagged PUB/PRIV by cgitrc membership, with its section and a 60-char description from the repo's description file. Client renders an aligned table, green public / dim private on a TTY. Adds repo_sections_from() primitive; find_repo_section becomes a thin lookup over it. Self-tests cover the cgitrc parse and a temp-FS scan. Updates README, SKILL.md, bash completion (repo list action), TODO. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23docs: delete-repo moves to a trash dir, not rm; cron-prune laterDanilo M.1-13/+28
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23docs: TODO for delete-repo, list-repos, and create -y flagDanilo M.1-0/+76
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23docs: history squashed and pushed; note keep-it-clean ruleDanilo M.1-7/+8
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23Initial commit: gitctlDanilo M.10-0/+1442
Thin CLI plus a server helper (run as the git user) to manage repos on a personal gitolite3 + cgit server over a command=-restricted SSH key. Includes the client, the helper, bash completion, a Claude Code skill, and docs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>