19afd5eed9
v0.2 grounds the CLI's resource commands (kb / doc / chat / query) in a
per-project link file (.weknora/project.yaml) so users don't have to pass
--kb-id on every invocation. Mirrors npm/cargo/git: walk up the cwd tree
to find the project root, override via flag or env when needed.
This commit ships the foundation layer:
- cli/internal/projectlink/ Discover (walk-up, depth=64) / Load / Save
- cmdutil.Factory.ResolveKB 5-level fallback chain:
--kb-id flag → --kb name (ListKnowledgeBases lookup) →
WEKNORA_KB_ID env → walk-up project link → CodeKBIDRequired
- cmdutil.ResolveKBNameToID shared name→id helper used by init / link
/ Factory.ResolveKB (was duplicated 3 ways
in early implementation; reuse review #2)
- cli/cmd/init/ interactive (huh prompt) or flag-driven
first-time setup; refuses to overwrite
without --force
- cli/cmd/link/ non-interactive update; --kb-id and --kb
are mutually exclusive and one is required
Also registers the v0.2 ErrorCode set (all codes for the eight new
commands) and AST-scan identToErrorCode mapping in one place — keeps the
acceptance/contract suite green across the v0.2 commit chain even before
later commits reference each code.
32 lines
975 B
Go
32 lines
975 B
Go
package cmdutil
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
sdk "github.com/Tencent/WeKnora/client"
|
|
)
|
|
|
|
// KBLister is the narrow SDK surface ResolveKBNameToID depends on. The
|
|
// production *sdk.Client satisfies it; tests inject fakes without standing
|
|
// up an HTTP server.
|
|
type KBLister interface {
|
|
ListKnowledgeBases(ctx context.Context) ([]sdk.KnowledgeBase, error)
|
|
}
|
|
|
|
// ResolveKBNameToID looks up a knowledge base by name and returns its ID.
|
|
// Used by `init`, `link`, and `Factory.ResolveKB` — a single lookup so the
|
|
// match policy (currently exact case-sensitive) lives in one place.
|
|
func ResolveKBNameToID(ctx context.Context, lister KBLister, name string) (string, error) {
|
|
kbs, err := lister.ListKnowledgeBases(ctx)
|
|
if err != nil {
|
|
return "", Wrapf(ClassifyHTTPError(err), err, "list knowledge bases")
|
|
}
|
|
for _, kb := range kbs {
|
|
if kb.Name == name {
|
|
return kb.ID, nil
|
|
}
|
|
}
|
|
return "", NewError(CodeKBNotFound, fmt.Sprintf("knowledge base not found: %s", name))
|
|
}
|