nullkey
c90f4e895e
refactor(cli): resource-command refactors — --kb resolver, MCP session_ask, session stop (BREAKING)
...
Unify the --kb resolver (accepts name or UUID) across kb/doc/chunk/session/
search/chat/link; `agent create` attaches knowledge bases via --attach-kb
(no longer --kb). Rename the MCP tool agent_invoke → session_ask and drop dead
MCP error codes. Add `session stop` (StopSession), completing the
start / continue-stream / stop triad.
Across these commands, bring the agent contract up to par: --dry-run previews
on mutations (incl. kb pin/unpin, session stop), agent-help blobs on the
read/health surface, accurate destructive-confirmation verbs, and search
has_more truncation signalling so an agent can tell its results were capped.
2026-06-08 20:18:43 +08:00
nullkey
2ce348d020
feat(cli): --format json default + NDJSON event stream + context→profile cascade + help calibration + docs (BREAKING)
...
D1 — --format default flipped to json regardless of TTY:
- v0.6: smart default (text on TTY, json on pipe).
- v0.7: always json; TTY only affects indent (compact in pipe). Enum
values unchanged (text | json | ndjson).
- Typed FormatMode enum replaces untyped string consts.
- --format / --jq promoted to persistent root flags so unknown-
subcommand paths still reach the typed-envelope guard (per-command
registration in v0.6 would have rejected --format on unknown
commands as cobra-prose exit 2).
- WEKNORA_FORMAT env var added; precedence --format > env > default.
Invalid env values silently ignored.
D2 — chat / session ask default to NDJSON event-stream:
- New cli/internal/output/ndjson_stream.go: InitEvent struct +
EmitInit / EmitSDKEvent / WriteNDJSONLine helpers. EmitInit doc
encodes the must-be-first-line invariant agents key on.
- chat / session ask: --format json AND --format ndjson both emit one
JSON event per line (no envelope wrapping). CLI injects exactly one
`init` event at stream head carrying session_id + optional kb_id /
agent_id / profile. Subsequent events pass through verbatim from the
SDK (passthrough discipline per spec §5.1).
- --format text keeps the SSE-style live renderer.
context → profile full cascade:
- Command group: cli/cmd/context/ → cli/cmd/profile/ (git mv;
package contextcmd → profilecmd).
- Global flag --context → --profile. Factory.ContextOverride →
ProfileOverride. WEKNORA_PROFILE env var honored
(--profile flag > env > config.CurrentContext). When --profile or
WEKNORA_PROFILE references a missing profile, the error is
input.invalid_argument with hint "weknora profile list" — not the
destructive local.config_corrupt path (which would have told users
to delete their config file).
- Binding file .weknora/project.yaml field context: → profile:
(no backwards-compat alias; re-run weknora link).
- profile use JSON fields current_context / previous_context →
current_profile / previous_profile.
- weknora link JSON field context → profile.
- CodeLocalContextNotFound → CodeLocalProfileNotFound (typed code
rename).
- Envelope top-level profile field populated via globalProfile (set
by root PersistentPreRunE from Factory.ActiveProfile). chat /
session ask NDJSON init event carries the same profile.
- Rationale: "context" collided with LLM context window / RAG context
/ Go context.Context; mainstream multi-credential CLIs (AWS /
Stripe / OpenAI / Anthropic / lark) all use "profile".
H2/C1' help calibration:
- AgentHelp gains Warnings []string; single SetAgentHelp helper
routes on WEKNORA_AGENT_HELP=1 (emits JSON blob including
warnings) vs human help (appends "AI agents:" block from same
source). Warnings surface as both a structured JSON field and
visible help-text addendum without drift.
- 9 destructive commands carry warnings: kb / doc / agent / session /
chunk delete; profile remove; kb / agent edit; auth logout.
- weknora doc wait dedups ids at entry; SIGINT mid-wait returns
silently (root signal handler maps to exit 130) instead of being
miscategorised as operation.timeout / operation.failed.
A4 — docs:
- cli/AGENTS.md gains four agent-facing sections: Wire contract for
AI agents (stdout / stderr / NDJSON / _notice evolution / SDK
contract boundary); Deliberate deviations + mainstream alignments;
Pre-1.0 breaking policy; Exit-10 anti-patterns. ERROR_REFERENCE
table extended.
- cli/README.md adds Agent quick start under Wire contract.
- cli/CHANGELOG.md v0.7 section: BREAKING entries with migration
notes, Added (WEKNORA_FORMAT / WEKNORA_PROFILE / retry_command /
retry_after_seconds / risk / _notice reserved infra / meta.count /
meta.has_more / doc fetch / doc create / session ask / doc delete
--all / NDJSON init), Changed (docs additions), Deprecated (none —
pre-release one-shot breaking).
Spec: docs/superpowers/specs/2026-05-20-weknora-cli-v0.7-design.md §3 / §4 / §5 / §6 / §11
2026-05-27 10:56:34 +08:00
nullkey
a2e368b1e8
refactor(cli): command-surface rename — session ask / doc fetch / doc create / doc delete --all
...
Three command renames consolidate the v0.7 verb table:
- `weknora agent invoke` → `weknora session ask --agent <id>`.
Server route POST /sessions/{session_id}/agent-qa is session-
anchored, so the verb moves with it. `weknora agent` subtree keeps
CRUD only (list / view / create / edit / delete / status / check).
SDK call (AgentQAStreamWithRequest) preserved verbatim; only the
command surface + flag layout move.
- `weknora doc upload` split into three commands:
- `weknora doc upload <file>` — local file (only).
- `weknora doc fetch <url>` — server-side remote fetch (was
`upload --from-url`). URL-only flags (--title / --file-type /
--tag-id) move with the verb.
- `weknora doc create --text` — direct text knowledge entry via
server CreateManualKnowledge.
- `weknora kb empty <id>` → `weknora doc delete --all --kb=<id>`.
Atomic server ClearKnowledgeBaseContents (no list-then-delete
race). Same exit-10 -y/--yes guard as other destructive verbs;
unified through the extended ConfirmDestructive helper.
Parent commands (agent, kb, doc, chunk, session, auth, profile,
search) lose their explicit Args:NoArgs + Run:cmd.Help so the
unknown-subcommand guard fires correctly — `weknora agent invoke
ag_x q` now emits the typed input.unknown_subcommand envelope with
detail.available[] instead of cobra's free-form exit-2 prose.
Spec: docs/superpowers/specs/2026-05-20-weknora-cli-v0.7-design.md §3.4 / §10.7
2026-05-27 10:56:34 +08:00