Files
Enterprise-Knowledge-Base/cli/cmd/agent/view.go
T
nullkey f2e8e3f56c refactor(cli): drop aiclient package; align AGENTS.md with mainstream
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
2026-05-15 12:03:56 +08:00

114 lines
3.5 KiB
Go

package agentcmd
import (
"context"
"fmt"
"io"
"github.com/spf13/cobra"
"github.com/Tencent/WeKnora/cli/internal/cmdutil"
"github.com/Tencent/WeKnora/cli/internal/iostreams"
sdk "github.com/Tencent/WeKnora/client"
)
// agentViewFields enumerates fields surfaced for `--json` discovery on
// `agent view`. Filter applies to the bare Agent object. Config sub-fields
// are intentionally omitted - too granular for naked projection; use
// `--jq '.config'` to reach them.
var agentViewFields = []string{
"id", "name", "description", "avatar",
"is_builtin", "tenant_id", "created_by",
"created_at", "updated_at",
}
// ViewService is the narrow SDK surface this command depends on.
type ViewService interface {
GetAgent(ctx context.Context, agentID string) (*sdk.Agent, error)
}
// NewCmdView builds `weknora agent view <agent-id>`.
func NewCmdView(f *cmdutil.Factory) *cobra.Command {
cmd := &cobra.Command{
Use: "view <agent-id>",
Short: "Show a custom agent's configuration",
Long: `Renders the agent's metadata (id / name / description / created-by /
timestamps) plus a compact config summary (mode, model, allowed tools, KB
scope). Pass --json for the full Agent object including the nested config
struct - or --jq '.config' to extract just the config.`,
Example: ` weknora agent view ag_abc
weknora agent view ag_abc --json | jq '.config.allowed_tools'`,
Args: cobra.ExactArgs(1),
RunE: func(c *cobra.Command, args []string) error {
jopts, err := cmdutil.CheckJSONFlags(c)
if err != nil {
return err
}
cli, err := f.Client()
if err != nil {
return err
}
return runView(c.Context(), jopts, cli, args[0])
},
}
cmdutil.AddJSONFlags(cmd, agentViewFields)
return cmd
}
func runView(ctx context.Context, jopts *cmdutil.JSONOptions, svc ViewService, agentID string) error {
a, err := svc.GetAgent(ctx, agentID)
if err != nil {
return cmdutil.WrapHTTP(err, "fetch agent %s", agentID)
}
if jopts.Enabled() {
return jopts.Emit(iostreams.IO.Out, a)
}
renderAgent(iostreams.IO.Out, a)
return nil
}
// renderAgent prints a single agent in human-readable KV form. Empty
// fields are omitted (mirrors doc view / kb view); the Config block is
// compacted to its agent-mode-defining keys.
func renderAgent(w io.Writer, a *sdk.Agent) {
fmt.Fprintf(w, "ID: %s\n", a.ID)
fmt.Fprintf(w, "Name: %s\n", a.Name)
if a.Description != "" {
fmt.Fprintf(w, "Description: %s\n", a.Description)
}
if a.IsBuiltin {
fmt.Fprintln(w, "Builtin: yes")
}
if a.CreatedBy != "" {
fmt.Fprintf(w, "Created by: %s\n", a.CreatedBy)
}
fmt.Fprintf(w, "Created at: %s\n", a.CreatedAt.Format("2006-01-02 15:04:05"))
fmt.Fprintf(w, "Updated at: %s\n", a.UpdatedAt.Format("2006-01-02 15:04:05"))
if a.Config == nil {
return
}
fmt.Fprintln(w)
fmt.Fprintln(w, "Config:")
if a.Config.AgentMode != "" {
fmt.Fprintf(w, " Mode: %s\n", a.Config.AgentMode)
}
if a.Config.ModelID != "" {
fmt.Fprintf(w, " Model ID: %s\n", a.Config.ModelID)
}
if a.Config.RerankModelID != "" {
fmt.Fprintf(w, " Rerank model ID: %s\n", a.Config.RerankModelID)
}
if a.Config.KBSelectionMode != "" {
fmt.Fprintf(w, " KB selection mode: %s\n", a.Config.KBSelectionMode)
}
if len(a.Config.KnowledgeBases) > 0 {
fmt.Fprintf(w, " Knowledge bases: %v\n", a.Config.KnowledgeBases)
}
if len(a.Config.AllowedTools) > 0 {
fmt.Fprintf(w, " Allowed tools: %v\n", a.Config.AllowedTools)
}
if a.Config.WebSearchEnabled {
fmt.Fprintln(w, " Web search: enabled")
}
}