fix: align devapp member security app id flag

This commit is contained in:
quanming committed 2026-06-17 09:53:31 +08:00
1 parent 2610c8ce87
commit 6447bdd45f
9 files changed
+147 -72

No files matched your search

+27 -10
View File
@@ -583,11 +583,11 @@ func newDevAppMemberListCommand(runner executor.Runner) *cobra.Command {
cmd := &cobra.Command{
Use: "list",
Short: "查询开放平台应用成员",
Example: " dws devapp member list --app-id <unifiedAppId>",
Example: " dws devapp member list --unified-app-id <unifiedAppId>",
Args: cobra.NoArgs,
DisableAutoGenTag: true,
RunE: func(cmd *cobra.Command, args []string) error {
appID, err := requiredDevAppID(cmd)
appID, err := requiredDevAppUnifiedIDWithLegacyAppID(cmd)
if err != nil {
return err
}
@@ -596,7 +596,7 @@ func newDevAppMemberListCommand(runner executor.Runner) *cobra.Command {
})
},
}
cmd.Flags().String("app-id", "", "开放平台统一应用 ID (必填)")
addDevAppUnifiedIDFlagWithLegacyAppID(cmd)
preferLegacyLeaf(cmd)
return cmd
}
@@ -605,7 +605,7 @@ func newDevAppMemberAddCommand(runner executor.Runner) *cobra.Command {
cmd := &cobra.Command{
Use: "add",
Short: "添加开放平台应用成员",
Example: " dws devapp member add --app-id <unifiedAppId> --users userId1,userId2 --member-type DEVELOPER --dry-run",
Example: " dws devapp member add --unified-app-id <unifiedAppId> --users userId1,userId2 --member-type DEVELOPER --dry-run",
Args: cobra.NoArgs,
DisableAutoGenTag: true,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -621,7 +621,7 @@ func newDevAppMemberRemoveCommand(runner executor.Runner) *cobra.Command {
cmd := &cobra.Command{
Use: "remove",
Short: "移除开放平台应用成员",
Example: " dws devapp member remove --app-id <unifiedAppId> --users userId1,userId2 --member-type DEVELOPER --dry-run",
Example: " dws devapp member remove --unified-app-id <unifiedAppId> --users userId1,userId2 --member-type DEVELOPER --dry-run",
Args: cobra.NoArgs,
DisableAutoGenTag: true,
RunE: func(cmd *cobra.Command, args []string) error {
@@ -637,7 +637,7 @@ func newDevAppSecurityConfigCommand(runner executor.Runner) *cobra.Command {
cmd := &cobra.Command{
Use: "config",
Short: "更新开放平台应用安全配置",
Example: " dws devapp security config --app-id <unifiedAppId> " +
Example: " dws devapp security config --unified-app-id <unifiedAppId> " +
"--ip-whitelist 192.0.2.10 --redirect-url https://callback.example.invalid/callback --sso-url https://sso.example.invalid/sso --dry-run",
Args: cobra.NoArgs,
DisableAutoGenTag: true,
@@ -645,7 +645,7 @@ func newDevAppSecurityConfigCommand(runner executor.Runner) *cobra.Command {
if err := devAppRequireWriteGuard(cmd, "security config"); err != nil {
return err
}
appID, err := requiredDevAppID(cmd)
appID, err := requiredDevAppUnifiedIDWithLegacyAppID(cmd)
if err != nil {
return err
}
@@ -666,7 +666,7 @@ func newDevAppSecurityConfigCommand(runner executor.Runner) *cobra.Command {
return runDevAppTool(runner, cmd, devAppSecurityConfigTool, params)
},
}
cmd.Flags().String("app-id", "", "开放平台统一应用 ID (必填)")
addDevAppUnifiedIDFlagWithLegacyAppID(cmd)
cmd.Flags().String("ip-whitelist", "", "出口 IP 白名单,多个用逗号或分号分隔")
cmd.Flags().String("redirect-url", "", "登录重定向 URL,多个用逗号或分号分隔")
cmd.Flags().String("sso-url", "", "端内免登地址,多个用逗号或分号分隔")
@@ -1115,6 +1115,12 @@ func addDevAppUnifiedIDFlag(cmd *cobra.Command) {
cmd.Flags().String("unified-app-id", "", "统一应用 ID (必填)")
}
func addDevAppUnifiedIDFlagWithLegacyAppID(cmd *cobra.Command) {
addDevAppUnifiedIDFlag(cmd)
cmd.Flags().String("app-id", "", "--unified-app-id 的兼容别名")
_ = cmd.Flags().MarkHidden("app-id")
}
func requiredDevAppUnifiedID(cmd *cobra.Command) (string, error) {
appID := devAppStringFlag(cmd, "unified-app-id")
if appID == "" {
@@ -1123,6 +1129,17 @@ func requiredDevAppUnifiedID(cmd *cobra.Command) (string, error) {
return appID, nil
}
func requiredDevAppUnifiedIDWithLegacyAppID(cmd *cobra.Command) (string, error) {
appID := devAppStringFlag(cmd, "unified-app-id")
if appID == "" {
appID = devAppStringFlag(cmd, "app-id")
}
if appID == "" {
return "", apperrors.NewValidation("--unified-app-id is required")
}
return appID, nil
}
// ---------------------------------------------------------------------------
// 事件订阅能力
// ---------------------------------------------------------------------------
@@ -1189,7 +1206,7 @@ func devAppEventCodes(cmd *cobra.Command) []string {
}
func registerDevAppMemberMutationFlags(cmd *cobra.Command) {
cmd.Flags().String("app-id", "", "开放平台统一应用 ID (必填)")
addDevAppUnifiedIDFlagWithLegacyAppID(cmd)
cmd.Flags().String("users", "", "成员 userId 列表,多个用逗号分隔 (必填)")
cmd.Flags().String("member-type", "", "成员类型,如 DEVELOPER (必填)")
}
@@ -1198,7 +1215,7 @@ func runDevAppMemberMutation(runner executor.Runner, cmd *cobra.Command, tool, o
if err := devAppRequireWriteGuard(cmd, operation); err != nil {
return err
}
appID, err := requiredDevAppID(cmd)
appID, err := requiredDevAppUnifiedIDWithLegacyAppID(cmd)
if err != nil {
return err
}
+68 -10
View File
@@ -45,7 +45,7 @@ func TestDevAppMemberCommandsBuildToolParams(t *testing.T) {
{
name: "list",
cmd: "list",
args: []string{"--app-id", "app-001"},
args: []string{"--unified-app-id", "app-001"},
wantTool: "list_dev_app_members",
wantParams: map[string]any{
"unifiedAppId": "app-001",
@@ -54,7 +54,7 @@ func TestDevAppMemberCommandsBuildToolParams(t *testing.T) {
{
name: "add multiple users",
cmd: "add",
args: []string{"--app-id", "app-001", "--users", "userId1,userId2,userId3,userId4", "--member-type", "DEVELOPER", "--yes"},
args: []string{"--unified-app-id", "app-001", "--users", "userId1,userId2,userId3,userId4", "--member-type", "DEVELOPER", "--yes"},
wantTool: "add_dev_app_members",
wantParams: map[string]any{
"unifiedAppId": "app-001",
@@ -65,7 +65,7 @@ func TestDevAppMemberCommandsBuildToolParams(t *testing.T) {
{
name: "remove trims users",
cmd: "remove",
args: []string{"--app-id", "app-001", "--users", " userId1 , userId2 ", "--member-type", "DEVELOPER", "--yes"},
args: []string{"--unified-app-id", "app-001", "--users", " userId1 , userId2 ", "--member-type", "DEVELOPER", "--yes"},
wantTool: "remove_dev_app_members",
wantParams: map[string]any{
"unifiedAppId": "app-001",
@@ -101,6 +101,43 @@ func TestDevAppMemberCommandsBuildToolParams(t *testing.T) {
}
}
func TestDevAppMemberCommandsAcceptLegacyAppIDAlias(t *testing.T) {
runner := &captureRunner{}
root := newDevAppTestRoot(runner)
var out bytes.Buffer
root.SetOut(&out)
root.SetErr(&out)
root.SetArgs([]string{"devapp", "member", "list", "--app-id", "app-001"})
if err := root.Execute(); err != nil {
t.Fatalf("Execute() error = %v\noutput:\n%s", err, out.String())
}
want := map[string]any{"unifiedAppId": "app-001"}
if !reflect.DeepEqual(runner.last.Params, want) {
t.Fatalf("Params = %#v, want %#v", runner.last.Params, want)
}
}
func TestDevAppMemberListHelpUsesUnifiedAppID(t *testing.T) {
root := newDevAppTestRoot(&captureRunner{})
var out bytes.Buffer
root.SetOut(&out)
root.SetErr(&out)
root.SetArgs([]string{"devapp", "member", "list", "--help"})
if err := root.Execute(); err != nil {
t.Fatalf("Execute() error = %v\noutput:\n%s", err, out.String())
}
help := out.String()
if !strings.Contains(help, "--unified-app-id") {
t.Fatalf("help missing --unified-app-id:\n%s", help)
}
if strings.Contains(help, "--app-id") {
t.Fatalf("help should hide legacy --app-id:\n%s", help)
}
}
func TestDevAppCommandHasAppAliasAndCoreCommands(t *testing.T) {
root := newDevAppCommand(&captureRunner{})
if root.Name() != "devapp" {
@@ -903,10 +940,10 @@ func TestDevAppMemberCommandsValidateRequiredFlags(t *testing.T) {
args []string
wantErr string
}{
{name: "list requires app", cmd: "list", args: nil, wantErr: "--app-id is required"},
{name: "add requires users", cmd: "add", args: []string{"--app-id", "app-001", "--member-type", "DEVELOPER", "--dry-run"}, wantErr: "--users is required"},
{name: "add rejects empty users", cmd: "add", args: []string{"--app-id", "app-001", "--users", " , ", "--member-type", "DEVELOPER", "--dry-run"}, wantErr: "--users must contain at least one userId"},
{name: "remove requires member type", cmd: "remove", args: []string{"--app-id", "app-001", "--users", "userId1", "--dry-run"}, wantErr: "--member-type is required"},
{name: "list requires app", cmd: "list", args: nil, wantErr: "--unified-app-id is required"},
{name: "add requires users", cmd: "add", args: []string{"--unified-app-id", "app-001", "--member-type", "DEVELOPER", "--dry-run"}, wantErr: "--users is required"},
{name: "add rejects empty users", cmd: "add", args: []string{"--unified-app-id", "app-001", "--users", " , ", "--member-type", "DEVELOPER", "--dry-run"}, wantErr: "--users must contain at least one userId"},
{name: "remove requires member type", cmd: "remove", args: []string{"--unified-app-id", "app-001", "--users", "userId1", "--dry-run"}, wantErr: "--member-type is required"},
}
for _, tc := range cases {
@@ -940,7 +977,7 @@ func TestDevAppSecurityConfigBuildsOnlyProvidedLists(t *testing.T) {
root.SetErr(&out)
root.SetArgs([]string{
"devapp", "security", "config",
"--app-id", "app-001",
"--unified-app-id", "app-001",
"--ip-whitelist", "192.0.2.10,192.0.2.11",
"--redirect-url", "https://callback.example.invalid/callback",
"--sso-url", "https://sso.example.invalid/sso",
@@ -974,7 +1011,7 @@ func TestDevAppSecurityConfigOmitsAbsentOptionalLists(t *testing.T) {
var out bytes.Buffer
root.SetOut(&out)
root.SetErr(&out)
root.SetArgs([]string{"devapp", "security", "config", "--app-id", "app-001", "--redirect-url", "https://callback.example.invalid/callback", "--dry-run"})
root.SetArgs([]string{"devapp", "security", "config", "--unified-app-id", "app-001", "--redirect-url", "https://callback.example.invalid/callback", "--dry-run"})
if err := root.Execute(); err != nil {
t.Fatalf("Execute() error = %v\noutput:\n%s", err, out.String())
@@ -995,7 +1032,7 @@ func TestDevAppSecurityConfigRequiresAtLeastOneConfig(t *testing.T) {
var out bytes.Buffer
root.SetOut(&out)
root.SetErr(&out)
root.SetArgs([]string{"devapp", "security", "config", "--app-id", "app-001", "--dry-run"})
root.SetArgs([]string{"devapp", "security", "config", "--unified-app-id", "app-001", "--dry-run"})
err := root.Execute()
if err == nil {
@@ -1009,6 +1046,27 @@ func TestDevAppSecurityConfigRequiresAtLeastOneConfig(t *testing.T) {
}
}
func TestDevAppSecurityConfigAcceptsLegacyAppIDAlias(t *testing.T) {
runner := &captureRunner{}
root := newDevAppTestRoot(runner)
var out bytes.Buffer
root.SetOut(&out)
root.SetErr(&out)
root.SetArgs([]string{"devapp", "security", "config", "--app-id", "app-001", "--redirect-url", "https://callback.example.invalid/callback", "--dry-run"})
if err := root.Execute(); err != nil {
t.Fatalf("Execute() error = %v\noutput:\n%s", err, out.String())
}
want := map[string]any{
"unifiedAppId": "app-001",
"redirectUrls": []string{"https://callback.example.invalid/callback"},
}
if !reflect.DeepEqual(runner.last.Params, want) {
t.Fatalf("Params = %#v, want %#v", runner.last.Params, want)
}
}
func TestDevAppMemberAndSecurityRequireWriteGuard(t *testing.T) {
cases := []struct {
name string
@@ -3,7 +3,7 @@
## 成员查询
```bash
dws devapp member list --app-id UNIFIED_APP_ID --format json
dws devapp member list --unified-app-id UNIFIED_APP_ID --format json
```
MCP tool: `list_dev_app_members`
@@ -11,8 +11,8 @@ MCP tool: `list_dev_app_members`
## 添加成员
```bash
dws devapp member add --app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --dry-run --format json
dws devapp member add --app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --yes --format json
dws devapp member add --unified-app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --dry-run --format json
dws devapp member add --unified-app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --yes --format json
```
MCP tool: `add_dev_app_members`
@@ -20,30 +20,30 @@ MCP tool: `add_dev_app_members`
## 移除成员
```bash
dws devapp member remove --app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --dry-run --format json
dws devapp member remove --app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --yes --format json
dws devapp member remove --unified-app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --dry-run --format json
dws devapp member remove --unified-app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --yes --format json
```
MCP tool: `remove_dev_app_members`
| CLI | MCP | 说明 |
|-----|-----|------|
| `--app-id` | `unifiedAppId` | 统一应用 ID(必填) |
| `--unified-app-id` | `unifiedAppId` | 统一应用 ID(必填) |
| `--users` | `memberUserIds` | userId 列表,逗号分隔(必填) |
| `--member-type` | `memberType` | 成员类型,如 `DEVELOPER`(必填) |
## 安全配置
```bash
dws devapp security config --app-id UNIFIED_APP_ID --ip-whitelist 192.0.2.10 --dry-run --format json
dws devapp security config --app-id UNIFIED_APP_ID --redirect-url https://callback.example.invalid/callback --sso-url https://sso.example.invalid/sso --yes --format json
dws devapp security config --unified-app-id UNIFIED_APP_ID --ip-whitelist 192.0.2.10 --dry-run --format json
dws devapp security config --unified-app-id UNIFIED_APP_ID --redirect-url https://callback.example.invalid/callback --sso-url https://sso.example.invalid/sso --yes --format json
```
MCP tool: `update_dev_app_security_config`
| CLI | MCP | 说明 |
|-----|-----|------|
| `--app-id` | `unifiedAppId` | 统一应用 ID(必填) |
| `--unified-app-id` | `unifiedAppId` | 统一应用 ID(必填) |
| `--ip-whitelist` | `ipWhitelist` | 出口 IP 白名单,逗号/分号分隔 |
| `--redirect-url` | `redirectUrls` | 登录重定向 URL,逗号/分号分隔 |
| `--sso-url` | `ssoUrls` | 端内免登 URL,逗号/分号分隔 |
@@ -31,14 +31,14 @@
→ 确认后加 --yes
7. 添加开发成员(按需)
dws devapp member add --app-id <unifiedAppId> --users <userId> --member-type DEVELOPER --dry-run --format json
dws devapp member add --unified-app-id <unifiedAppId> --users <userId> --member-type DEVELOPER --dry-run --format json
→ 确认后加 --yes
8. 验证成员
dws devapp member list --app-id <unifiedAppId> --format json
dws devapp member list --unified-app-id <unifiedAppId> --format json
9. 配置安全设置(按需)
dws devapp security config --app-id <unifiedAppId> --ip-whitelist <IP> --redirect-url <URL> --dry-run --format json
dws devapp security config --unified-app-id <unifiedAppId> --ip-whitelist <IP> --redirect-url <URL> --dry-run --format json
→ 确认后加 --yes
```
@@ -108,28 +108,28 @@
```text
1. 查看当前成员
dws devapp member list --app-id <unifiedAppId> --format json
dws devapp member list --unified-app-id <unifiedAppId> --format json
2. 添加成员
dws devapp member add --app-id <unifiedAppId> --users <userId1,userId2> --member-type DEVELOPER --dry-run --format json
dws devapp member add --unified-app-id <unifiedAppId> --users <userId1,userId2> --member-type DEVELOPER --dry-run --format json
→ 确认后加 --yes
3. 验证
dws devapp member list --app-id <unifiedAppId> --format json
dws devapp member list --unified-app-id <unifiedAppId> --format json
4. 移除成员
dws devapp member remove --app-id <unifiedAppId> --users <userId> --member-type DEVELOPER --dry-run --format json
dws devapp member remove --unified-app-id <unifiedAppId> --users <userId> --member-type DEVELOPER --dry-run --format json
→ 确认后加 --yes
5. 验证
dws devapp member list --app-id <unifiedAppId> --format json
dws devapp member list --unified-app-id <unifiedAppId> --format json
```
## 安全配置
```text
1. 配置 IP 白名单 / 重定向 URL / 免登 URL
dws devapp security config --app-id <unifiedAppId> \
dws devapp security config --unified-app-id <unifiedAppId> \
--ip-whitelist 192.0.2.10,192.0.2.11 \
--redirect-url https://callback.example.invalid/callback \
--sso-url https://sso.example.invalid/sso \
+4 -4
View File
@@ -163,9 +163,9 @@ MCP tool: `remove_dev_app_permissions`。`--permissions` 接收一个或多个 `
### 成员管理
```bash
dws devapp member list --app-id UNIFIED_APP_ID --format json
dws devapp member add --app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --dry-run --format json
dws devapp member remove --app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --dry-run --format json
dws devapp member list --unified-app-id UNIFIED_APP_ID --format json
dws devapp member add --unified-app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --dry-run --format json
dws devapp member remove --unified-app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --dry-run --format json
```
MCP tools: `list_dev_app_members` / `add_dev_app_members` / `remove_dev_app_members`
@@ -173,7 +173,7 @@ MCP tools: `list_dev_app_members` / `add_dev_app_members` / `remove_dev_app_memb
### 安全配置
```bash
dws devapp security config --app-id UNIFIED_APP_ID --ip-whitelist 192.0.2.10 --redirect-url https://callback.example.invalid/callback --dry-run --format json
dws devapp security config --unified-app-id UNIFIED_APP_ID --ip-whitelist 192.0.2.10 --redirect-url https://callback.example.invalid/callback --dry-run --format json
```
MCP tool: `update_dev_app_security_config`
@@ -3,7 +3,7 @@
## 成员查询
```bash
dws devapp member list --app-id UNIFIED_APP_ID --format json
dws devapp member list --unified-app-id UNIFIED_APP_ID --format json
```
MCP tool: `list_dev_app_members`
@@ -11,8 +11,8 @@ MCP tool: `list_dev_app_members`
## 添加成员
```bash
dws devapp member add --app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --dry-run --format json
dws devapp member add --app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --yes --format json
dws devapp member add --unified-app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --dry-run --format json
dws devapp member add --unified-app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --yes --format json
```
MCP tool: `add_dev_app_members`
@@ -20,30 +20,30 @@ MCP tool: `add_dev_app_members`
## 移除成员
```bash
dws devapp member remove --app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --dry-run --format json
dws devapp member remove --app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --yes --format json
dws devapp member remove --unified-app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --dry-run --format json
dws devapp member remove --unified-app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --yes --format json
```
MCP tool: `remove_dev_app_members`
| CLI | MCP | 说明 |
|-----|-----|------|
| `--app-id` | `unifiedAppId` | 统一应用 ID(必填) |
| `--unified-app-id` | `unifiedAppId` | 统一应用 ID(必填) |
| `--users` | `memberUserIds` | userId 列表,逗号分隔(必填) |
| `--member-type` | `memberType` | 成员类型,如 `DEVELOPER`(必填) |
## 安全配置
```bash
dws devapp security config --app-id UNIFIED_APP_ID --ip-whitelist 192.0.2.10 --dry-run --format json
dws devapp security config --app-id UNIFIED_APP_ID --redirect-url https://callback.example.invalid/callback --sso-url https://sso.example.invalid/sso --yes --format json
dws devapp security config --unified-app-id UNIFIED_APP_ID --ip-whitelist 192.0.2.10 --dry-run --format json
dws devapp security config --unified-app-id UNIFIED_APP_ID --redirect-url https://callback.example.invalid/callback --sso-url https://sso.example.invalid/sso --yes --format json
```
MCP tool: `update_dev_app_security_config`
| CLI | MCP | 说明 |
|-----|-----|------|
| `--app-id` | `unifiedAppId` | 统一应用 ID(必填) |
| `--unified-app-id` | `unifiedAppId` | 统一应用 ID(必填) |
| `--ip-whitelist` | `ipWhitelist` | 出口 IP 白名单,逗号/分号分隔 |
| `--redirect-url` | `redirectUrls` | 登录重定向 URL,逗号/分号分隔 |
| `--sso-url` | `ssoUrls` | 端内免登 URL,逗号/分号分隔 |
@@ -31,14 +31,14 @@
→ 确认后加 --yes
7. 添加开发成员(按需)
dws devapp member add --app-id <unifiedAppId> --users <userId> --member-type DEVELOPER --dry-run --format json
dws devapp member add --unified-app-id <unifiedAppId> --users <userId> --member-type DEVELOPER --dry-run --format json
→ 确认后加 --yes
8. 验证成员
dws devapp member list --app-id <unifiedAppId> --format json
dws devapp member list --unified-app-id <unifiedAppId> --format json
9. 配置安全设置(按需)
dws devapp security config --app-id <unifiedAppId> --ip-whitelist <IP> --redirect-url <URL> --dry-run --format json
dws devapp security config --unified-app-id <unifiedAppId> --ip-whitelist <IP> --redirect-url <URL> --dry-run --format json
→ 确认后加 --yes
```
@@ -108,28 +108,28 @@
```text
1. 查看当前成员
dws devapp member list --app-id <unifiedAppId> --format json
dws devapp member list --unified-app-id <unifiedAppId> --format json
2. 添加成员
dws devapp member add --app-id <unifiedAppId> --users <userId1,userId2> --member-type DEVELOPER --dry-run --format json
dws devapp member add --unified-app-id <unifiedAppId> --users <userId1,userId2> --member-type DEVELOPER --dry-run --format json
→ 确认后加 --yes
3. 验证
dws devapp member list --app-id <unifiedAppId> --format json
dws devapp member list --unified-app-id <unifiedAppId> --format json
4. 移除成员
dws devapp member remove --app-id <unifiedAppId> --users <userId> --member-type DEVELOPER --dry-run --format json
dws devapp member remove --unified-app-id <unifiedAppId> --users <userId> --member-type DEVELOPER --dry-run --format json
→ 确认后加 --yes
5. 验证
dws devapp member list --app-id <unifiedAppId> --format json
dws devapp member list --unified-app-id <unifiedAppId> --format json
```
## 安全配置
```text
1. 配置 IP 白名单 / 重定向 URL / 免登 URL
dws devapp security config --app-id <unifiedAppId> \
dws devapp security config --unified-app-id <unifiedAppId> \
--ip-whitelist 192.0.2.10,192.0.2.11 \
--redirect-url https://callback.example.invalid/callback \
--sso-url https://sso.example.invalid/sso \
+8 -8
View File
@@ -897,29 +897,29 @@ Agent 安装 dws skill 后,仅依据 skill 提供的参考文档,将自然
**devapp_devapp_member_list_001**
- Prompt: 查看开放平台应用 UNIFIED_APP_ID 的成员
- Expected: `dws devapp member list --app-id UNIFIED_APP_ID --format json`
- Flags: `--app-id` = `UNIFIED_APP_ID`
- Expected: `dws devapp member list --unified-app-id UNIFIED_APP_ID --format json`
- Flags: `--unified-app-id` = `UNIFIED_APP_ID`
#### `dws devapp member add`
**devapp_devapp_member_add_001**
- Prompt: 给开放平台应用 UNIFIED_APP_ID 添加开发者成员 userId1,userId2,先预览
- Expected: `dws devapp member add --app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --dry-run --format json`
- Flags: `--app-id` = `UNIFIED_APP_ID`, `--users` = `userId1,userId2`, `--member-type` = `DEVELOPER`
- Expected: `dws devapp member add --unified-app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --dry-run --format json`
- Flags: `--unified-app-id` = `UNIFIED_APP_ID`, `--users` = `userId1,userId2`, `--member-type` = `DEVELOPER`
#### `dws devapp member remove`
**devapp_devapp_member_remove_001**
- Prompt: 已确认,从开放平台应用 UNIFIED_APP_ID 移除开发者成员 userId1
- Expected: `dws devapp member remove --app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --yes --format json`
- Flags: `--app-id` = `UNIFIED_APP_ID`, `--users` = `userId1`, `--member-type` = `DEVELOPER`, `--yes`
- Expected: `dws devapp member remove --unified-app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --yes --format json`
- Flags: `--unified-app-id` = `UNIFIED_APP_ID`, `--users` = `userId1`, `--member-type` = `DEVELOPER`, `--yes`
#### `dws devapp security config`
**devapp_devapp_security_config_001**
- Prompt: 给开放平台应用 UNIFIED_APP_ID 配置 IP 白名单 192.0.2.10,先预览
- Expected: `dws devapp security config --app-id UNIFIED_APP_ID --ip-whitelist 192.0.2.10 --dry-run --format json`
- Flags: `--app-id` = `UNIFIED_APP_ID`, `--ip-whitelist` = `192.0.2.10`
- Expected: `dws devapp security config --unified-app-id UNIFIED_APP_ID --ip-whitelist 192.0.2.10 --dry-run --format json`
- Flags: `--unified-app-id` = `UNIFIED_APP_ID`, `--ip-whitelist` = `192.0.2.10`
#### `dws devapp permission list`
+4 -4
View File
@@ -1194,7 +1194,7 @@
**devapp_devapp_member_list_001** ✅ PASS
- Prompt: 查看开放平台应用 UNIFIED_APP_ID 的成员
- Expected: `dws devapp member list --app-id UNIFIED_APP_ID --format json`
- Expected: `dws devapp member list --unified-app-id UNIFIED_APP_ID --format json`
- Skill Reference: references/products/devapp.md
- Command path: PASS (devapp member list)
- Flags: PASS (1 flags validated)
@@ -1202,7 +1202,7 @@
**devapp_devapp_member_add_001** ✅ PASS
- Prompt: 给开放平台应用 UNIFIED_APP_ID 添加开发者成员 userId1,userId2,先预览
- Expected: `dws devapp member add --app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --dry-run --format json`
- Expected: `dws devapp member add --unified-app-id UNIFIED_APP_ID --users userId1,userId2 --member-type DEVELOPER --dry-run --format json`
- Skill Reference: references/products/devapp.md
- Command path: PASS (devapp member add)
- Flags: PASS (3 flags validated)
@@ -1210,7 +1210,7 @@
**devapp_devapp_member_remove_001** ✅ PASS
- Prompt: 已确认,从开放平台应用 UNIFIED_APP_ID 移除开发者成员 userId1
- Expected: `dws devapp member remove --app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --yes --format json`
- Expected: `dws devapp member remove --unified-app-id UNIFIED_APP_ID --users userId1 --member-type DEVELOPER --yes --format json`
- Skill Reference: references/products/devapp.md
- Command path: PASS (devapp member remove)
- Flags: PASS (4 flags validated)
@@ -1218,7 +1218,7 @@
**devapp_devapp_security_config_001** ✅ PASS
- Prompt: 给开放平台应用 UNIFIED_APP_ID 配置 IP 白名单 192.0.2.10,先预览
- Expected: `dws devapp security config --app-id UNIFIED_APP_ID --ip-whitelist 192.0.2.10 --dry-run --format json`
- Expected: `dws devapp security config --unified-app-id UNIFIED_APP_ID --ip-whitelist 192.0.2.10 --dry-run --format json`
- Skill Reference: references/products/devapp.md
- Command path: PASS (devapp security config)
- Flags: PASS (2 flags validated)