c87e35b34b
Code-reuse polish (post-implementation review pass): - Extract text.OneLine(maxWidth, s) helper combining preview-row normalization (newline/CR/tab → space) with text.Truncate's UTF-8-safe truncation. Replaces agent/view.go truncate1Line (ASCII '...' + byte-slice CJK-unsafe) and chunk/list.go singleLine. - Lift cmdutil.OpenInput(path) for the '-' = stdin / else os.Open pattern shared across agent create/edit and the api command. Replaces agent/create.go's private openInput. - Strip inline doc-spec parentheticals from source comments — those belong in commit messages and project docs, not in source where they rot. Pre-PR audit fixes: - doc upload: reject `--metadata` paired with `--from-url` as input.invalid_argument up-front (the URL-ingest request type has no metadata field server-side, so the pair would otherwise silently drop). Long help and CHANGELOG updated to call out the asymmetry. - doc upload (file path): map sdk.ErrDuplicateFile sentinel to resource.already_exists. The sentinel arrives with no "HTTP error <n>:" prefix because the SDK short-circuits on file-hash before reading the HTTP status, so the previous WrapHTTP fall-through misclassified it as network.error with a misleading "check base URL reachability" hint. The --from-url branch already handled ErrDuplicateURL this way; this closes the asymmetry. Caught by e2e re-upload of an already-ingested file; regression test added. - README exit-10 enumeration adds `agent delete` and `chunk delete` (these were missing alongside the v0.5 destructive verbs they were meant to gate). Docs sync: - cli/README.md: command tree now includes the chunk subtree; adds agent / chunk lines to the 5-minute quickstart; adds a "Contributing / Reporting issues" section pointing at the repo's SECURITY.md and AGENTS.md; drops third-party CLI parallels from the surface description. - cli/AGENTS.md: "Command surface design SOP" gains the flag-vs-escape-hatch step. "CRUD command flag canon" renamed to the hard-required-flags pattern with the contrast (TTY-prompts-fill) defined inline rather than via opaque shorthand. - cli/CHANGELOG.md: search docs case-sensitivity shift promoted to its own #### Breaking changes subsection. MCP doc_list filter count corrected from 5 to 6. Drops the bogus go.mod yaml.v3 entry (yaml.v3 was already a dependency on main; v0.5 added zero go.mod lines). Replaces internal-Go identifiers (fuzzyTime, NoOptDefVal) with user-language and drops the § section-symbol jargon.
40 lines
1.5 KiB
Go
40 lines
1.5 KiB
Go
// Package mcpcmd holds the `weknora mcp` command tree.
|
|
//
|
|
// MCP (Model Context Protocol; https://spec.modelcontextprotocol.io/) is
|
|
// the JSON-RPC 2.0 wire protocol agentic IDEs use to call external tools.
|
|
// `weknora mcp serve` exposes a curated subset of the CLI's read surface
|
|
// as MCP tools so an IDE-side agent can list / view / search / chat against
|
|
// the user's active WeKnora context without shelling out to the CLI per
|
|
// call.
|
|
//
|
|
// Package name is `mcpcmd` to avoid shadowing `cli/internal/mcp` (the
|
|
// transport-and-handlers implementation). Same naming hygiene as
|
|
// `agentcmd` / `sessioncmd`.
|
|
package mcpcmd
|
|
|
|
import (
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/Tencent/WeKnora/cli/internal/cmdutil"
|
|
)
|
|
|
|
// NewCmd builds the `weknora mcp` parent. Called from cli/cmd/root.go.
|
|
func NewCmd(f *cmdutil.Factory) *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "mcp",
|
|
Short: "Run weknora as a Model Context Protocol server",
|
|
Long: `Exposes weknora's read surface as MCP tools so any
|
|
MCP-compatible client can call them over JSON-RPC.
|
|
|
|
Initial tool surface is read-only and curated: kb_list / kb_view /
|
|
doc_list / doc_view / doc_download / search_chunks / chat / agent_list /
|
|
agent_invoke. Destructive verbs (create / delete / upload) are deliberately
|
|
excluded - the agent should ask the user before mutating; the CLI's
|
|
exit-10 protocol covers that path.`,
|
|
Args: cobra.NoArgs,
|
|
Run: func(c *cobra.Command, _ []string) { _ = c.Help() },
|
|
}
|
|
cmd.AddCommand(NewCmdServe(f))
|
|
return cmd
|
|
}
|