Fix review problem

This commit is contained in:
wxianfeng committed 2026-06-15 20:29:50 +08:00
1 parent 0a8de62041
commit 6480c035fa
13 files changed
+147 -72

No files matched your search

+16 -20
View File
@@ -34,14 +34,13 @@ const (
devAppSecurityConfigTool = "update_app_security_config"
// 机器人能力(op-app MCP 工具,硬编码不走服务发现)。
devAppRobotCreateTool = "create_dingtalk_robot"
devAppRobotSubmitTool = "submit_robot_create_task"
devAppRobotResultTool = "query_robot_create_result"
devAppRobotConfigGetTool = "get_open_dev_app_robot_config"
devAppRobotConfigCreateTool = "create_open_dev_app_robot_config"
devAppRobotConfigUpdateTool = "update_open_dev_app_robot_config"
devAppRobotEnableTool = "enable_open_dev_app_robot"
devAppRobotOfflineTool = "offline_open_dev_app_robot"
devAppRobotCreateTool = "create_dingtalk_robot"
devAppRobotSubmitTool = "submit_robot_create_task"
devAppRobotResultTool = "query_robot_create_result"
devAppRobotConfigGetTool = "get_open_dev_app_robot_config"
devAppRobotConfigSetTool = "set_open_dev_app_robot_config"
devAppRobotEnableTool = "enable_open_dev_app_robot"
devAppRobotOfflineTool = "offline_open_dev_app_robot"
// 版本发布能力(op-app MCP 工具,硬编码不走服务发现)。
devAppVersionCreateTool = "create_open_dev_app_version"
@@ -172,8 +171,7 @@ func newDevAppCommand(runner executor.Runner) *cobra.Command {
newDevAppRobotSubmitCommand(runner),
newDevAppRobotResultCommand(runner),
newDevAppRobotConfigGetCommand(runner),
newDevAppRobotConfigCommand(runner, "config", "为现有应用创建机器人配置", devAppRobotConfigCreateTool),
newDevAppRobotConfigCommand(runner, "update", "更新现有应用机器人配置", devAppRobotConfigUpdateTool),
newDevAppRobotConfigCommand(runner, "config", "创建或更新现有应用机器人配置", devAppRobotConfigSetTool),
newDevAppRobotConfigCommand(runner, "enable", "启用现有应用机器人能力", devAppRobotEnableTool),
newDevAppRobotOfflineCommand(runner),
newDevAppRobotConnectCommand(runner),
@@ -966,8 +964,8 @@ func newDevAppVersionCreateCommand(runner executor.Runner) *cobra.Command {
func newDevAppVersionListCommand(runner executor.Runner) *cobra.Command {
cmd := &cobra.Command{
Use: "list",
Short: "分页查询应用版本列表",
Example: " dws devapp version list --unified-app-id UNIFIED_APP_ID --page 1 --page-size 20 --format json",
Short: "按 cursor 查询应用版本列表",
Example: " dws devapp version list --unified-app-id UNIFIED_APP_ID --page-size 20 --format json\n dws devapp version list --unified-app-id UNIFIED_APP_ID --cursor NEXT_CURSOR --page-size 20 --format json",
Args: cobra.NoArgs,
DisableAutoGenTag: true,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -977,14 +975,14 @@ func newDevAppVersionListCommand(runner executor.Runner) *cobra.Command {
}
params := map[string]any{
"unifiedAppId": appID,
"currentPage": devAppIntFlag(cmd, "page"),
"pageSize": devAppIntFlag(cmd, "page-size"),
}
devAppPutString(params, "cursor", devAppStringFlag(cmd, "cursor"))
return runDevAppTool(runner, cmd, devAppVersionListTool, params)
},
}
addDevAppUnifiedIDFlag(cmd)
cmd.Flags().Int("page", 1, "分页页码,从 1 开始")
cmd.Flags().String("cursor", "", "服务端返回的不透明分页游标;首次查询留空")
cmd.Flags().Int("page-size", 20, "分页大小")
preferLegacyLeaf(cmd)
return cmd
@@ -1022,8 +1020,8 @@ func newDevAppVersionCheckApprovalCommand(runner executor.Runner) *cobra.Command
if err != nil {
return err
}
// 复用 publish 工具的服务端预检模式:dryRun=true 只返回审批要求,不发布。
params["dryRun"] = true
// 复用 publish 工具的服务端预检模式:precheckOnly=true 只返回审批要求,不发布。
params["precheckOnly"] = true
return runDevAppTool(runner, cmd, devAppVersionPublishTool, params)
},
}
@@ -1047,7 +1045,7 @@ func newDevAppVersionPublishCommand(runner executor.Runner) *cobra.Command {
if err != nil {
return err
}
params["dryRun"] = false
params["precheckOnly"] = false
if cmd.Flags().Changed("confirm-sensitive") {
value, _ := cmd.Flags().GetBool("confirm-sensitive")
params["confirmedSensitive"] = value
@@ -1102,12 +1100,10 @@ func devAppVersionLocator(cmd *cobra.Command) (map[string]any, error) {
func addDevAppUnifiedIDFlag(cmd *cobra.Command) {
cmd.Flags().String("unified-app-id", "", "统一应用 ID (必填)")
cmd.Flags().String("app-id", "", "--unified-app-id 的兼容别名")
_ = cmd.Flags().MarkHidden("app-id")
}
func requiredDevAppUnifiedID(cmd *cobra.Command) (string, error) {
appID := devAppFlagOrFallback(cmd, "unified-app-id", "app-id")
appID := devAppStringFlag(cmd, "unified-app-id")
if appID == "" {
return "", apperrors.NewValidation("--unified-app-id is required")
}
+89 -7
View File
@@ -119,6 +119,15 @@ func TestDevAppCommandHasAppAliasAndCoreCommands(t *testing.T) {
t.Fatalf("missing command %q: %v", name, err)
}
}
robotCmd, _, err := root.Find([]string{"robot"})
if err != nil {
t.Fatalf("missing robot command: %v", err)
}
for _, cmd := range robotCmd.Commands() {
if cmd.Name() == "update" {
t.Fatal("robot update command exists, want removed public command")
}
}
}
func TestDevAppRobotCommandsBuildToolParams(t *testing.T) {
@@ -166,7 +175,7 @@ func TestDevAppRobotCommandsBuildToolParams(t *testing.T) {
{
name: "config create with skills and mode",
args: []string{"robot", "config", "--unified-app-id", "u-1", "--name", "小助手", "--brief", "审批助手", "--mode", "2", "--skills", "qa,approval", "--add-scope", "--yes"},
wantTool: "create_open_dev_app_robot_config",
wantTool: "set_open_dev_app_robot_config",
wantParams: map[string]any{
"unifiedAppId": "u-1",
"name": "小助手",
@@ -228,11 +237,11 @@ func TestDevAppVersionCommandsBuildToolParams(t *testing.T) {
},
{
name: "list",
args: []string{"version", "list", "--unified-app-id", "u-1", "--page", "2", "--page-size", "5"},
args: []string{"version", "list", "--unified-app-id", "u-1", "--cursor", "cursor-1", "--page-size", "5"},
wantTool: "list_open_dev_app_versions",
wantParams: map[string]any{
"unifiedAppId": "u-1",
"currentPage": 2,
"cursor": "cursor-1",
"pageSize": 5,
},
},
@@ -243,19 +252,19 @@ func TestDevAppVersionCommandsBuildToolParams(t *testing.T) {
wantParams: map[string]any{"unifiedAppId": "u-1", "versionId": "v-1"},
},
{
name: "check-approval forces dryRun",
name: "check-approval prechecks only",
args: []string{"version", "check-approval", "--unified-app-id", "u-1", "--version-id", "v-1"},
wantTool: "publish_open_dev_app_version",
wantParams: map[string]any{"unifiedAppId": "u-1", "versionId": "v-1", "dryRun": true},
wantParams: map[string]any{"unifiedAppId": "u-1", "versionId": "v-1", "precheckOnly": true},
},
{
name: "publish sets dryRun false and sensitive",
name: "publish disables precheck and sets sensitive",
args: []string{"version", "publish", "--unified-app-id", "u-1", "--version-id", "v-1", "--confirm-sensitive", "--approver", "user-1", "--yes"},
wantTool: "publish_open_dev_app_version",
wantParams: map[string]any{
"unifiedAppId": "u-1",
"versionId": "v-1",
"dryRun": false,
"precheckOnly": false,
"confirmedSensitive": true,
"approverUserId": "user-1",
},
@@ -359,6 +368,79 @@ func TestDevAppEventSubscribeRequiresEventCode(t *testing.T) {
}
}
func TestDevAppScopedCommandsRejectLegacyLocators(t *testing.T) {
cases := []struct {
name string
args []string
}{
{name: "version create", args: []string{"devapp", "version", "create", "--app-id", "u-1", "--version", "1.0.1", "--yes"}},
{name: "version list", args: []string{"devapp", "version", "list", "--app-id", "u-1"}},
{name: "version get", args: []string{"devapp", "version", "get", "--app-id", "u-1", "--version-id", "v-1"}},
{name: "version check approval", args: []string{"devapp", "version", "check-approval", "--app-id", "u-1", "--version-id", "v-1"}},
{name: "version publish", args: []string{"devapp", "version", "publish", "--app-id", "u-1", "--version-id", "v-1", "--yes"}},
{name: "version status", args: []string{"devapp", "version", "status", "--app-id", "u-1", "--version-id", "v-1"}},
{name: "robot get", args: []string{"devapp", "robot", "get", "--app-id", "u-1"}},
{name: "robot config", args: []string{"devapp", "robot", "config", "--app-id", "u-1", "--name", "小助手", "--yes"}},
{name: "robot enable", args: []string{"devapp", "robot", "enable", "--app-id", "u-1", "--name", "小助手", "--yes"}},
{name: "robot offline", args: []string{"devapp", "robot", "offline", "--app-id", "u-1", "--yes"}},
{name: "event list", args: []string{"devapp", "event", "list", "--app-id", "u-1"}},
{name: "event subscribe", args: []string{"devapp", "event", "subscribe", "--app-id", "u-1", "--event-code", "user_add_org", "--yes"}},
{name: "event unsubscribe", args: []string{"devapp", "event", "unsubscribe", "--app-id", "u-1", "--event-code", "user_add_org", "--yes"}},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
runner := &captureRunner{}
root := newDevAppTestRoot(runner)
var out bytes.Buffer
root.SetOut(&out)
root.SetErr(&out)
root.SetArgs(tc.args)
err := root.Execute()
if err == nil {
t.Fatal("Execute() error = nil, want unknown --app-id flag")
}
if !strings.Contains(err.Error(), "unknown flag: --app-id") {
t.Fatalf("error = %q, want unknown --app-id flag", err.Error())
}
if runner.last.Tool != "" {
t.Fatalf("tool = %q, want no invocation", runner.last.Tool)
}
})
}
}
func TestDevAppScopedCommandsRejectAgentAndCustomKeyLocators(t *testing.T) {
for _, flag := range []string{"--agent-id", "--custom-key"} {
for _, args := range [][]string{
{"devapp", "version", "list", flag, "u-1"},
{"devapp", "robot", "get", flag, "u-1"},
{"devapp", "event", "list", flag, "u-1"},
} {
t.Run(strings.Join(args[1:3], " ")+" "+flag, func(t *testing.T) {
runner := &captureRunner{}
root := newDevAppTestRoot(runner)
var out bytes.Buffer
root.SetOut(&out)
root.SetErr(&out)
root.SetArgs(args)
err := root.Execute()
if err == nil {
t.Fatalf("Execute() error = nil, want unknown %s flag", flag)
}
if !strings.Contains(err.Error(), "unknown flag: "+flag) {
t.Fatalf("error = %q, want unknown %s flag", err.Error(), flag)
}
if runner.last.Tool != "" {
t.Fatalf("tool = %q, want no invocation", runner.last.Tool)
}
})
}
}
}
func TestDevAppRobotAndVersionWritesRequireGuard(t *testing.T) {
cases := []struct {
name string