f2e8e3f56c
Survey of 10 mainstream CLIs (gh, lark, stripe, vercel, supabase, aws, azure, gcloud, openai/codex, github-copilot-cli) showed env-gated per-command --help blurbs are a Stripe-only pattern; gh uses env detect for telemetry only, and lark relies on installed agent Skills + MCP. Our cmd/mcp/serve already covers the dominant 2025/26 path, so internal/aiclient/ (136 LOC + 38 callsites) is net maintenance burden without precedent. - Drop internal/aiclient/ entirely (annotations + detect + tests) - Remove 38 SetAgentHelp callsites + agentAwareHelpFunc / SetHelpFunc wiring in cmd/root.go - Migrate 4 command-level rules to standard Long help (visible to all, not env-gated): doc upload mode mutex, kb edit at-least-one, kb pin idempotent, search chunks channel mutex - Rewrite AGENTS.md as a developer guide (gh-style 6 H2 / 167 lines): audience preamble + Build / Architecture / Command Structure / Testing / Code Style / Error Handling. Drops sections absent in surveyed projects (Commit & PR Conventions, Who Uses This CLI) - Clean 14 internal doc refs (ADR-N, spec §X, v0.X) in source comments and docs that pointed at docs/superpowers/ — that directory is local-only / uncommitted, so refs are dead for outside readers - Drop forward-looking "once v0.2 ships" from README
5.8 KiB
5.8 KiB
Changelog — weknora CLI
All notable changes to the weknora CLI (the binary under cli/ in this
repository) will be documented in this file.
The format follows Keep a Changelog and the CLI follows Semantic Versioning independently of the WeKnora server / frontend release cadence.
CLI history before v0.3 is recorded in the project root CHANGELOG.md under the release that introduced the CLI.
[Unreleased]
v0.4 — output contract hardening and mainstream alignment
Breaking changes
- Dropped the JSON envelope.
stdoutnow emits bare typed data ({...}or[...]); errors are written tostderrascode: msgwith an actionablehint:line. Pipelines using--json | jqno longer have to filter out an envelope wrapper. - Dropped
--dry-run. Destructive writes still require-y/--yes; non-TTY callers that omit-yexit with code 10 andinput.confirmation_requiredso an agent must surface the prompt to a human before retrying. - Dropped the per-command AI footer that rendered when
CLAUDECODEorCURSOR_AGENTwas set. The same machine-readable guidance now lives in the standard--help(visible to all callers) and inmcp serve's tool descriptions.
Added
weknora mcp serve— curated read-only stdio MCP server exposing 9 tools (kb_list,kb_view,doc_list,doc_view,doc_download,search_chunks,chat,agent_list,agent_invoke). Destructive verbs are intentionally excluded.weknora agent list/agent view/agent invoke— manage and call WeKnora's server-side Custom Agent resources.weknora auth token— print the active credential tostdoutfor scripting (raw secret by default;--jsonemits{token, mode, context}).weknora doc upload --from-url— ingest a remote URL.--json=fields,...field projection and--jq <expr>filtering on every command that emits JSON.--limitand--all-pageson list / search commands for bounded output and explicit pagination control.- Per-resource filter flags:
kb list --pinned,doc list --status,session list --since.
Changed
- Go toolchain bumped from 1.24 to 1.26.
auth login --with-tokenvalidates the supplied key against/auth/mebefore persisting, and prints an advisory if the keyring is unavailable and credentials fall back to a 0600 file under$XDG_CONFIG_HOME/weknora/secrets/.- AGENTS.md rewritten as a developer guide (~170 lines, 6 H2 sections).
v0.3 — extended management surface and a session subtree
Added
context add/context list/context remove— first-class CRUD over connection targets (previously implicit viaauth login --name). Removing the current context requires explicit-y(exit-10 protocol) because subsequent commands have no default target.auth refresh— exchanges the stored refresh token for a new access + refresh pair (OAuth refresh-token grant). Transparent 401 → refresh → retry is also wired into the SDK transport with singleflight de-dup, so most callers never need to invoke this explicitly.kb edit— partial-update edit with only-sent-fields semantics (*stringoptions so unset fields stay unset in the PUT body).kb pin/kb unpin— idempotent pin/unpin toggle; no-op when already in the target state (emits_meta.warnings, no server call).kb empty— bulk-delete documents while preserving the KB record and its config. High-risk-write; exit-10 confirmation in non-TTY /--jsonpaths.doc view <id>— show one document's metadata (title, file name, type, size, parse status, embedding model, processed-at, error message). Counterpart tokb viewandsession view.doc download— stream a knowledge file to disk (-O FILE/-O -for stdout) with--clobbercontrolling overwrite. Rejects server-supplied path-like filenames; partial writes on error are cleaned up.doc upload --recursive --glob '*.md'— walk a directory and upload every match. Per-fileOK/FAILprogress lines on the human path; aggregateduploaded[]/failed[]envelope on--json. Exit code typed to the first failure's class on partial failure.search chunks/search kb/search docs/search sessions— verb-noun subtree (ghsearch code/repos/issues/…shape).search chunksis hybrid (vector + keyword) retrieval; the other three are client-side substring filters useful for discovering identifiers. All four take--limit N/-L N(1..1000) to cap returned rows.session list/session view/session delete— chat session management.api --input FILE/api --input -— body source for raw HTTP passthrough (file or stdin); mutually exclusive with--data.unlink— remove the cwd's.weknora/project.yamlso subsequent commands stop auto-resolving--kbfrom it. Walks up from cwd so a user in a subdirectory can unlink without cd-ing to the project root (mirrorsvercel unlink/netlify unlink).- Completion smoke test guards against cobra bumps silently breaking bash / zsh / fish / powershell completion.
SDK additions (Go client at client/, strictly additive)
OpenKnowledgeFile(ctx, id) (filename, body io.ReadCloser, err)— new primitive returning the body as a stream plus the server-suggested Content-Disposition filename.DownloadKnowledgeFileis now a thin wrapper (signature unchanged, gained partial-file-on-error cleanup).WithTransport(http.RoundTripper) ClientOption— lets the CLI install the 401-retry transport.PathAuthLogin/PathAuthRefreshconstants — so HTTP middleware doesn't re-hardcode the literals.IsPinned boolfield onKnowledgeBase(server already returned it; SDK just hadn't modeled it).