Commit Graph

2 Commits

Author SHA1 Message Date
nullkey ca90ce422f feat(cli): add auth logout and auth list commands
gh / lark / gcloud / stripe all ship a logout command and a way to
enumerate stored credentials on day one. WeKnora's `auth` subtree had
only login + status, leaving no documented purge path for keyring
secrets — a real concern for `--with-token` (sk-…) and JWT flows that
write credentials to OS keychains.

auth logout [--name <ctx>] [--all] [--json]
  Clears keyring + file-fallback secrets (access / refresh / api_key
  slots) for the named context (default: current) or every context
  with --all. Removes the context entry from ~/.config/weknora/config.yaml
  and clears current_context if the removed entry was active.

  Mirrors `gh auth logout` and `lark auth logout`. As gh documents,
  this does NOT revoke server-side — for API keys users must rotate in
  the server UI, JWTs continue to be accepted until expiry.

auth list [--json]
  Renders a compact table (NAME / HOST / USER / MODE) with the active
  context marked `*`. Reads only config.yaml — no network, no keyring
  touch. Mode is inferred from which credential ref is set (api_key
  → "api-key", token → "password"; both → "password" wins).

  Mirrors gh's per-host enumeration (gh auth status iterates accounts)
  and lark `auth list`. For weknora the contexts file already had this
  data — the command is a thin renderer to match user muscle memory.

Deferred to a follow-up release:
  - auth refresh + transparent 401 retry in the SDK (we already persist
    refresh_token at login but never spend it; explicit gap)
  - login --web browser OAuth flow (requires a server-side endpoint)
  - auth token printer (cheap; defer with the rest)

Tests: 24 cli packages green. New: cmd/auth/logout_test.go (current
context, named, --all, no-contexts, unknown-name, no-current-no-flag,
mutex flags) + cmd/auth/list_test.go (human render, empty, JSON
envelope, inferMode edge cases). AGENTS.md command-surface note adds
the four-command auth subtree; screenshot section 4 adds `auth list`
alongside `auth status`.
2026-05-12 13:20:42 +08:00
nullkey 811802485e feat(cli): auth login + auth status commands (PR-4)
First two leaf commands and the auth/ command group, registered under
the root command tree.

auth login:
- Email + password (interactive huh prompter) OR --with-token (read API
  key from stdin) for headless / CI use
- Validates --host (required, must be http/https URL)
- Persists access + refresh tokens (password mode) or api_key (token mode)
  into the secrets store wired in PR-3 — uses Store.Ref to record the
  URI scheme without leaking concrete backend type
- Writes the named context to ~/.config/weknora/config.yaml and sets it
  as current_context
- Typed loginResult payload for --json output (no map[string]any)

auth status:
- Calls client.GetCurrentUser -> /auth/me, prints context / host / user /
  tenant. --json emits a typed statusResult envelope with _meta.context
  and tenant_id populated for agents.
- Service interface narrowed to just GetCurrentUser; tests inject fakes
  by overriding Factory.Client (no runF gymnastics).

cmd/root.go: register \`auth\` parent under the root tree.
2026-05-07 23:19:46 +08:00