From 96661d2783f35c91a4dc8c13f831729902e7a09f Mon Sep 17 00:00:00 2001 From: naudachu Date: Sat, 18 Jul 2026 15:22:10 +0500 Subject: [PATCH] refactor: rename login skill to auth `/tea:login` could not be invoked as `/login` because Claude Code reserves that name as a built-in command. Renaming the skill to `auth` frees the short form: `/tea:auth` and `/auth` both resolve. Updates all references in the guard hook, README, plugin manifests, and the use skill. Co-Authored-By: Claude Opus 4.8 (1M context) --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- .gitignore | 2 ++ README.md | 10 +++++----- hooks/tea-guard.sh | 10 +++++----- skills/{login => auth}/SKILL.md | 6 +++--- skills/use/SKILL.md | 10 +++++----- 7 files changed, 22 insertions(+), 20 deletions(-) rename skills/{login => auth}/SKILL.md (90%) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 55577f4..52bf7ed 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -7,7 +7,7 @@ { "name": "tea", "source": "./", - "description": "Gitea CLI (tea) reference plus a mandatory-login guard. Ships /tea:login, /tea:use, and a PreToolUse hook that blocks any tea command that would touch Gitea without --login." + "description": "Gitea CLI (tea) reference plus a mandatory-login guard. Ships /tea:auth, /tea:use, and a PreToolUse hook that blocks any tea command that would touch Gitea without --login." } ] } diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 4fc842c..3e59661 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "tea", - "description": "Gitea CLI (tea) reference plus a mandatory-login guard. Ships /tea:login (pin a login) and /tea:use (command reference), and a PreToolUse hook that blocks any tea command that would touch Gitea without --login.", + "description": "Gitea CLI (tea) reference plus a mandatory-login guard. Ships /tea:auth (pin a login) and /tea:use (command reference), and a PreToolUse hook that blocks any tea command that would touch Gitea without --login.", "version": "1.0.0", "author": { "name": "naudachu" diff --git a/.gitignore b/.gitignore index 35fc8cd..8dc35e6 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .docs/ .claude/ tmp/ +__pycache__/ +*.pyc diff --git a/README.md b/README.md index ffda5f5..6756a7c 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A Claude Code plugin that gives Claude a reference for the `tea` CLI and enforce | Piece | What it does | |---|---| -| `/tea:login` skill | Prompts you to pick a Gitea login and pins it to the project | +| `/tea:auth` skill | Prompts you to pick a Gitea login and pins it to the project | | `/tea:use` skill | Tea CLI reference — loads command docs on demand | | `tea-guard` hook | PreToolUse hook that blocks or rewrites every `tea` invocation | @@ -39,16 +39,16 @@ This is a Claude Code plugin — install it through the plugin marketplace, not /plugin install tea@tea ``` -The skills (`/tea:login`, `/tea:use`) and the `tea-guard` hook load immediately. Use `/plugin` to enable, disable, or update it later. +The skills (`/tea:auth`, `/tea:use`) and the `tea-guard` hook load immediately. Use `/plugin` to enable, disable, or update it later. > The marketplace registration is written to `extraKnownMarketplaces` and the plugin to `enabledPlugins` in your settings automatically — you don't edit those by hand. There is **no** top-level `"plugins"` settings key; if you've added one from older instructions, remove it. ## First use -Run `/tea:login` once per project. Claude will list your available Gitea logins and ask you to pick one. The choice is written to `.claude/settings.local.json` and takes effect immediately — no restart needed. +Run `/tea:auth` once per project. Claude will list your available Gitea logins and ask you to pick one. The choice is written to `.claude/settings.local.json` and takes effect immediately — no restart needed. ``` -/tea:login +/tea:auth ``` After that, use `/tea:use` to look up commands, or just ask Claude to do something with Gitea and it will load the reference automatically. @@ -76,7 +76,7 @@ hooks/ hooks.json registers the PreToolUse hook tea-guard.sh the guard (Python 3, no deps) skills/ - login/SKILL.md /tea:login skill + auth/SKILL.md /tea:auth skill use/SKILL.md /tea:use skill use/references/tea/ tea CLI reference docs ``` diff --git a/hooks/tea-guard.sh b/hooks/tea-guard.sh index c6a1d86..1943383 100755 --- a/hooks/tea-guard.sh +++ b/hooks/tea-guard.sh @@ -20,7 +20,7 @@ Rules: - no --login / -l ................................. BLOCK - --login or --login "$OTHER_VAR" ....... BLOCK (Claude may not pick) - --login "$GITEA_LOGIN", pin found ............... REWRITE to the pin, allow - - --login "$GITEA_LOGIN", no pin .................. BLOCK (run /tea:login) + - --login "$GITEA_LOGIN", no pin .................. BLOCK (run /tea:auth) Output protocol: exit 0 + JSON {hookSpecificOutput:{updatedInput,...}} to rewrite; exit 2 + stderr to block. @@ -92,7 +92,7 @@ def main(): if not re.search(r'(^|[;&|(]|\s)tea(\s|$)', cmd): allow_passthrough() - # Whitelist: login enumeration + meta. No identity is used; /tea:login + # Whitelist: login enumeration + meta. No identity is used; /tea:auth # needs `tea logins list` while no pin exists yet. if re.search(r'tea\s+(logins\s+(list|ls)|--version|-v|--help|help)(\s|$)', cmd): allow_passthrough() @@ -102,7 +102,7 @@ def main(): if not m: block('every `tea` command must include --login "$GITEA_LOGIN" ' '(the guard substitutes the operator-pinned login). ' - 'Run /tea:login if no login is pinned.') + 'Run /tea:auth if no login is pinned.') raw_val = m.group(3) inner = raw_val @@ -114,13 +114,13 @@ def main(): if inner not in PLACEHOLDERS: block('do not name the login yourself (got `%s`). Write exactly ' '--login "$GITEA_LOGIN"; the guard replaces it with the login ' - 'the operator pinned via /tea:login. This prevents acting under ' + 'the operator pinned via /tea:auth. This prevents acting under ' 'the wrong identity.' % raw_val) start = os.environ.get("CLAUDE_PROJECT_DIR") or payload.get("cwd") or os.getcwd() pin, src = find_pin(start) if not pin: - block('no login is pinned. Run /tea:login to choose one (writes ' + block('no login is pinned. Run /tea:auth to choose one (writes ' '.claude/settings.local.json env.GITEA_LOGIN). The guard reads ' 'the file at call time, so it takes effect with no restart.') diff --git a/skills/login/SKILL.md b/skills/auth/SKILL.md similarity index 90% rename from skills/login/SKILL.md rename to skills/auth/SKILL.md index a208b25..c861057 100644 --- a/skills/login/SKILL.md +++ b/skills/auth/SKILL.md @@ -1,9 +1,9 @@ --- -name: login -description: Pin the Gitea login used by the tea CLI in this project. Run when the tea-guard hook reports no login is pinned, or when the user types /tea:login. Enumerates available logins, makes the OPERATOR pick one, and persists it to .claude/settings.local.json. The pin takes effect immediately — no restart. +name: auth +description: Pin the Gitea login used by the tea CLI in this project. Run when the tea-guard hook reports no login is pinned, or when the user types /tea:auth. Enumerates available logins, makes the OPERATOR pick one, and persists it to .claude/settings.local.json. The pin takes effect immediately — no restart. --- -# /tea:login — pin the project Gitea login +# /tea:auth — pin the project Gitea login Goal: have the **operator** select exactly one `tea` login for this project and persist it to `.claude/settings.local.json` under `env.GITEA_LOGIN`. The diff --git a/skills/use/SKILL.md b/skills/use/SKILL.md index 38c727f..d3883f9 100644 --- a/skills/use/SKILL.md +++ b/skills/use/SKILL.md @@ -1,6 +1,6 @@ --- name: use -description: Reference docs for the `tea` CLI — Gitea's command-line client. Load when the user asks about Gitea repos, issues, pulls, releases, actions, or other Gitea entities, to look up the right `tea` command and flags. Always write the login as the literal placeholder --login "$GITEA_LOGIN" — the tea-guard hook substitutes the operator-pinned login; set it with /tea:login. +description: Reference docs for the `tea` CLI — Gitea's command-line client. Load when the user asks about Gitea repos, issues, pulls, releases, actions, or other Gitea entities, to look up the right `tea` command and flags. Always write the login as the literal placeholder --login "$GITEA_LOGIN" — the tea-guard hook substitutes the operator-pinned login; set it with /tea:auth. --- # /tea:use — tea CLI reference @@ -22,8 +22,8 @@ The **`tea-guard`** PreToolUse hook enforces this and resolves it: `.claude/settings.local.json` (`env.GITEA_LOGIN`) **at call time** and rewrites the command to use that literal before it runs. - `--login ` or any other variable → blocked. You may not choose the - login; only the operator does (via `/tea:login`). -- no login pinned → blocked with a pointer to run `/tea:login`. + login; only the operator does (via `/tea:auth`). +- no login pinned → blocked with a pointer to run `/tea:auth`. Why: without an explicit login `tea` silently falls back to the machine's default (possibly the user's personal account), and a login *you* pick may be @@ -43,7 +43,7 @@ The pin takes effect immediately — no restart. Only `tea logins list` and `tea` auto-detects owner/repo from `$PWD` inside a git repo; otherwise pass `--repo owner/repo` (or `-r`). Login is **not** auto-detected — it is pinned -per-project by the operator (see `/tea:login`) and injected by the guard. +per-project by the operator (see `/tea:auth`) and injected by the guard. Config lives in `$XDG_CONFIG_HOME/tea`. ## Index @@ -112,4 +112,4 @@ are still fine via entity commands. Always the placeholder, never a login name. - If a `tea` command is blocked by `tea-guard`: either you forgot `--login "$GITEA_LOGIN"`, you wrote a literal login name instead of the placeholder (not allowed — let the guard substitute), or no login is pinned - (run `/tea:login`). + (run `/tea:auth`).