mirror of
https://github.com/Tencent/WeKnora.git
synced 2026-08-30 16:53:21 +08:00
77b9b6a465
Make the agent-facing contract uniform across the whole surface: - cobra parse errors (unknown flag, arg-count) emit the JSON envelope by default, not bare prose — via a single DefaultFormatMode shared by the early resolver and ResolveDefault. - a malformed --jq is input.invalid_argument (exit 5), not internal.error. - destructive-confirmation messages name the real operation (edit/remove, not a hardcoded "delete"). - `doc wait` emits one envelope (Silent failure, no contradictory stderr); completed marshals as [] not null. - WEKNORA_AGENT_HELP covers every leaf command, enforced by a coverage drift guard; a sibling guard enforces --dry-run on every mutation. - `search docs`/`search chunks` resolve --kb through the same flag→env→project-link chain as `doc list`/`chat` (no longer a hard --kb requirement); a linked dir or WEKNORA_KB_ID now works without --kb, and an unresolved KB is local.kb_id_required (exit 1). The destructive `doc delete --all` keeps its explicit-only rule. - exit-code and batch/wait ok-semantics documented in the shared skill, README, and AGENTS.md.
46 lines
1.3 KiB
Go
46 lines
1.3 KiB
Go
package cmd
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"sort"
|
|
"testing"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/Tencent/WeKnora/cli/internal/cmdutil"
|
|
)
|
|
|
|
// TestEveryLeafCommandHasAgentHelp enforces the agent-first contract: every
|
|
// leaf (runnable, no subcommands) command must emit a structured AgentHelp JSON
|
|
// blob under WEKNORA_AGENT_HELP=1, so an agent never has to scrape human prose.
|
|
// Drift guard in the spirit of the K6/K7 skill-parity tests: a new leaf command
|
|
// added without SetAgentHelp fails CI here.
|
|
//
|
|
// Exemptions: cobra's generated `completion`/`help` subtrees carry no
|
|
// domain semantics worth a machine blob.
|
|
func TestEveryLeafCommandHasAgentHelp(t *testing.T) {
|
|
t.Setenv("WEKNORA_AGENT_HELP", "1")
|
|
root := NewRootCmd(cmdutil.New())
|
|
|
|
var missing []string
|
|
eachLeafCommand(root, func(c *cobra.Command) {
|
|
// Invoke the leaf's help func with the agent env set and require JSON.
|
|
var buf bytes.Buffer
|
|
c.SetOut(&buf)
|
|
c.Help()
|
|
var ah struct {
|
|
UsedFor string `json:"used_for"`
|
|
}
|
|
if err := json.Unmarshal(buf.Bytes(), &ah); err != nil || ah.UsedFor == "" {
|
|
missing = append(missing, c.CommandPath())
|
|
}
|
|
})
|
|
|
|
sort.Strings(missing)
|
|
if len(missing) > 0 {
|
|
t.Errorf("leaf commands missing agent-help JSON (register cmdutil.SetAgentHelp):\n %v\n(%d commands)",
|
|
missing, len(missing))
|
|
}
|
|
}
|