Files
Shiny 340dd241c9 feat: 实现完整的本地配置管理与CLI重构
本次重构实现了标准化的本地配置系统,替换原有的硬编码环境变量读取逻辑:
1. 新增跨平台的原子化配置文件读写,支持Unix和Windows系统
2. 新增init命令用于安全初始化和更新本地凭据
3. 替换原有错误提示文案为更友好的中文提示
4. 更新文档说明新的配置流程和安全规范
5. 新增完整的配置相关测试用例
6. 添加必要的依赖包支持
2026-08-01 02:39:49 +08:00

63 lines
1.7 KiB
Go

package command
import (
"encoding/json"
"errors"
"fmt"
"io"
"os"
"strings"
runtimeConfig "code.zhecent.com/open/shop-crm-agent/internal/config"
"github.com/spf13/cobra"
"golang.org/x/term"
)
type initializeConfigFunc func(token string) (string, error)
type readTokenFunc func(input io.Reader, output io.Writer) (string, error)
type initResult struct {
Initialized bool `json:"initialized"`
EnvFile string `json:"envFile"`
}
func newInitCmd() *cobra.Command {
return newInitCommand(runtimeConfig.Initialize, readTokenFromTerminal)
}
func newInitCommand(initialize initializeConfigFunc, readToken readTokenFunc) *cobra.Command {
return &cobra.Command{
Use: "init",
Short: "初始化本地 CRM Agent 凭证",
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
token, err := readToken(cmd.InOrStdin(), cmd.ErrOrStderr())
if err != nil {
return err
}
envFile, err := initialize(token)
if err != nil {
return err
}
return json.NewEncoder(cmd.OutOrStdout()).Encode(initResult{Initialized: true, EnvFile: envFile})
},
}
}
func readTokenFromTerminal(input io.Reader, output io.Writer) (string, error) {
inputFile, ok := input.(*os.File)
if !ok || !term.IsTerminal(int(inputFile.Fd())) {
return "", errors.New("shop-crm-agent init 必须在交互式终端运行")
}
if _, err := fmt.Fprint(output, "请输入 Shop 管理后台创建后仅显示一次的 CRM Agent Token: "); err != nil {
return "", err
}
value, err := term.ReadPassword(int(inputFile.Fd()))
_, _ = fmt.Fprintln(output)
if err != nil {
return "", fmt.Errorf("读取 CRM Agent Token 失败: %w", err)
}
return strings.TrimSpace(string(value)), nil
}