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
114 lines
3.5 KiB
Go
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")
|
|
}
|
|
}
|