Skip to content

feat: add miaoda app collaborator management - #2191

Open
yxy-bd wants to merge 6 commits into
mainfrom
codex/miaoda-member-permissions
Open

feat: add miaoda app collaborator management#2191
yxy-bd wants to merge 6 commits into
mainfrom
codex/miaoda-member-permissions

Conversation

@yxy-bd

@yxy-bd yxy-bd commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Summary

Add AI-friendly collaborator management commands for Miaoda applications. The new shortcuts let agents list, add, update, and remove collaborators, as well as read and update collaborator permission settings, using structured external IDs and typed errors.

Changes

  • Add apps +member-list, +member-add, +member-update, and +member-remove with user, chat, and department collaborator support.
  • Add apps +member-settings-get and +member-settings-set for the supported sharing and collaborator policy fields.
  • Keep write operations behind the existing high-risk confirmation flow while allowing request inspection through --dry-run.
  • Return agent-oriented projections that omit internal gateway fields, preserve opaque pagination tokens, and fail closed on malformed responses.
  • Normalize collaborator API failures into typed CLI errors, including an actionable feature_not_available error for applications whose collaborators must be managed in the Miaoda console.
  • Update the lark-apps skill guidance and add unit, response-contract, and dry-run E2E coverage.

Test Plan

  • go test ./errs -count=1
  • go test ./shortcuts/apps -count=1
  • go test ./tests/cli_e2e/dryrun -run '^TestAppsMember' -count=1
  • go vet ./errs ./shortcuts/apps ./tests/cli_e2e/dryrun
  • Manual CLI verification covered list pagination, user/chat/department mutations, permission settings, and representative error responses against a test application.

Related Issues

  • None

Summary by CodeRabbit

  • New Features

    • Added commands to list, add, update, and remove application collaborators.
    • Added commands to view and update collaborator permissions.
    • Added pagination, role, identity, and settings validation.
    • Added dry-run support and confirmation safeguards for collaborator changes.
    • Improved output safety and provided clearer guidance for unsupported features.
  • Documentation

    • Updated application guidance with collaborator management workflows, permissions, and examples.
  • Tests

    • Expanded coverage for collaborator commands, validation, request previews, and safety protections.

@CLAassistant

CLAassistant commented Aug 5, 2026

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

@github-actions github-actions Bot added the size/L Large or sensitive change across domains or core paths label Aug 5, 2026
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR adds six apps collaborator-management shortcuts for listing, modifying, removing collaborators, and managing collaboration settings. It adds typed validation, response projection, error handling, command registration, CLI dry-run coverage, and skill documentation.

Changes

Apps collaborator management

Layer / File(s) Summary
Member API contracts and validation
errs/subtypes.go, shortcuts/apps/apps_member_common.go
Adds the feature-unavailable subtype and defines collaborator/settings models, request validation, typed member-ID mapping, response projection, and invalid-response handling.
Collaborator shortcut commands
shortcuts/apps/apps_member.go, shortcuts/apps/shortcuts.go
Adds six commands for collaborator and settings operations, including dry-run support, error guidance, output rendering, and registration.
Projection and validation coverage
shortcuts/apps/apps_member_common_test.go, shortcuts/apps/apps_member_response_test.go
Tests request shapes, enum validation, typed identifiers, response projection, output sanitization, error normalization, and fail-closed behavior.
CLI integration and command guidance
shortcuts/apps/shortcuts_test.go, tests/cli_e2e/dryrun/apps_member_dryrun_test.go, tests/cli_e2e/apps/coverage.md, skills/lark-apps/SKILL.md
Verifies shortcut metadata, CLI dry-run requests, confirmation rules, structured validation errors, coverage status, and command routing guidance.

Estimated code review effort: 4 (Complex) | ~45 minutes

Suggested labels: feature

Suggested reviewers: liangshuo-1

Sequence Diagram(s)

sequenceDiagram
  participant CLI
  participant AppsMemberShortcut
  participant MiaodaAPI
  participant OutputRenderer
  CLI->>AppsMemberShortcut: invoke collaborator or settings command
  AppsMemberShortcut->>MiaodaAPI: send validated request
  MiaodaAPI-->>AppsMemberShortcut: return collaborator or settings response
  AppsMemberShortcut->>OutputRenderer: project and render response
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 37.50% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding Miaoda application collaborator management.
Description check ✅ Passed The description includes all required sections and provides clear scope, changes, testing, and issue information.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/miaoda-member-permissions

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

🚀 PR Preview Install Guide

🧰 CLI update

npm i -g https://pkg.pr.new/larksuite/cli/@larksuite/cli@5e973905963bc21e5abd1a369b287501f597c25b

🧩 Skill update

npx skills add larksuite/cli#codex/miaoda-member-permissions -y -g

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (6)
tests/cli_e2e/dryrun/apps_member_dryrun_test.go (1)

194-205: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Assert that stdout stays empty on validation failures.

The validation cases check exit code 2 and read the typed envelope from result.Stderr. No assertion covers result.Stdout. If a regression wrote the validation envelope to stdout, these tests would still pass, and stdout would no longer be reserved for program data.

Add require.Empty(t, result.Stdout) to each validation case and to the empty settings-set case at lines 207-210.

♻️ Proposed fix
 			result := runAppsMemberCLI(t, tc.args...)
 			result.AssertExitCode(t, 2)
+			require.Empty(t, result.Stdout, "stdout must stay reserved for program data, stderr:\n%s", result.Stderr)
 			require.Equal(t, "validation", gjson.Get(result.Stderr, "error.type").String(), "stderr:\n%s", result.Stderr)
As per coding guidelines: "Send JSON program data to stdout and progress, warnings, and hints to stderr; never mix the two streams." Based on learnings: "Validate-stage failures must exit with code 2, write the typed JSON validation envelope to result.Stderr, and leave result.Stdout empty so stdout remains reserved for program data."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/cli_e2e/dryrun/apps_member_dryrun_test.go` around lines 194 - 205, Add
require.Empty(t, result.Stdout) to each validation subtest in the apps member
CLI test loop and to the empty settings-set case, while preserving the existing
stderr envelope and exit-code assertions.

Sources: Coding guidelines, Learnings

shortcuts/apps/apps_member_common.go (1)

297-322: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Validate perm inside the request builders for consistency.

buildMemberAddRequest and buildMemberUpdateRequest validate the member identity through buildMemberIdentity, but they copy --perm without checking it against memberRoles. Role validation exists only in validateMemberMutation. The DryRun callbacks discard the builder error (body, _ := ...), so the builders are the last line of defense if Validate is ever skipped or reordered.

Move the role check into a shared helper so both the identity and the role fail closed at the same layer.

♻️ Proposed shared role validation
+func buildMemberRole(rctx *common.RuntimeContext) (string, error) {
+	role := strings.TrimSpace(rctx.Str("perm"))
+	if !memberStringAllowed(role, memberRoles) {
+		return "", appsValidationParamError("--perm", "--perm must be one of: view, edit, full_access").
+			WithHint("choose the collaborator permission explicitly")
+	}
+	return role, nil
+}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@shortcuts/apps/apps_member_common.go` around lines 297 - 322, Update
buildMemberAddRequest and buildMemberUpdateRequest to validate the trimmed perm
value against the existing memberRoles set before constructing or returning
either request. Extract the shared role check into a helper alongside the
request builders, return an error for missing or unsupported roles, and
propagate that error from both builders so DryRun paths cannot bypass
validation.
shortcuts/apps/apps_member_common_test.go (2)

79-98: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for the wrapped validate.ResourceName failure.

requireAppsMemberValidationError checks Subtype, Param, and a non-empty Hint. No test reaches validateMemberAppID lines 205-209, which is the only --app-id branch that attaches a cause with WithCause(err). Current cases stop at the prefix and character checks above it.

Add one case with an app_ value that passes the prefix and character checks but fails validate.ResourceName, then assert the cause is preserved with errors.Is or errors.Unwrap.

As per coding guidelines: "Error-path tests must assert typed metadata through errs.ProblemOf (category, subtype, and param) and verify cause preservation rather than relying only on message substrings."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@shortcuts/apps/apps_member_common_test.go` around lines 79 - 98, Add a test
case for validateMemberAppID using an app_ identifier that passes prefix and
character validation but fails validate.ResourceName, then verify the returned
error’s typed metadata via errs.ProblemOf for category, subtype, and param and
assert the original cause is preserved with errors.Is or errors.Unwrap. Extend
requireAppsMemberValidationError only as needed while retaining its existing
metadata checks.

Source: Coding guidelines


61-66: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated int-flag default parsing in both member test helpers. Both runtime helpers derive an int flag default by comparing flag.Default to the literal string "20". Any int flag added later with a different default silently becomes 0, so a test would exercise a default the shortcut never declares. The shared root cause is the hardcoded string comparison instead of parsing the declared default.

  • shortcuts/apps/apps_member_common_test.go#L61-L66: replace the flag.Default == "20" comparison in newAppsMemberRuntime with strconv.Atoi(flag.Default) and add the strconv import.
  • shortcuts/apps/apps_member_response_test.go#L38-L43: apply the same strconv.Atoi(flag.Default) change in newAppsMemberAPIRuntime and add the strconv import.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@shortcuts/apps/apps_member_common_test.go` around lines 61 - 66, Replace the
hardcoded integer default comparison with strconv.Atoi(flag.Default) in
newAppsMemberRuntime at shortcuts/apps/apps_member_common_test.go:61-66 and add
the strconv import. Apply the same change in newAppsMemberAPIRuntime at
shortcuts/apps/apps_member_response_test.go:38-43, including its strconv import,
so both helpers use each flag’s declared default.
shortcuts/apps/apps_member_response_test.go (2)

116-130: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Name the fail-closed subtests instead of using letters.

t.Run(string(rune('a'+index))) produces subtest names a through g. A failure reports only a letter, so the reader must count table entries to find which malformed record failed. Each case maps to a distinct guard in projectMemberRecord.

♻️ Proposed named cases
-	tests := []memberAPIRecord{
-		{MemberType: "user", Role: "view"},
-		{MemberType: "user", UserOpenID: &user, ChatID: &chat, Role: "view"},
-		{MemberType: "user", ChatID: &chat, Role: "view"},
-		{MemberType: "user", UserOpenID: &internal, Role: "view"},
-		{MemberType: "chat", ChatID: &empty, Role: "view"},
-		{MemberType: "unknown", UserOpenID: &user, Role: "view"},
-		{MemberType: "user", UserOpenID: &user, Role: "owner"},
-	}
-	for index, raw := range tests {
-		t.Run(string(rune('a'+index)), func(t *testing.T) {
+	tests := []struct {
+		name string
+		raw  memberAPIRecord
+	}{
+		{"no-typed-id", memberAPIRecord{MemberType: "user", Role: "view"}},
+		{"two-typed-ids", memberAPIRecord{MemberType: "user", UserOpenID: &user, ChatID: &chat, Role: "view"}},
+		{"type-id-mismatch", memberAPIRecord{MemberType: "user", ChatID: &chat, Role: "view"}},
+		{"internal-numeric-id", memberAPIRecord{MemberType: "user", UserOpenID: &internal, Role: "view"}},
+		{"empty-id", memberAPIRecord{MemberType: "chat", ChatID: &empty, Role: "view"}},
+		{"unknown-member-type", memberAPIRecord{MemberType: "unknown", UserOpenID: &user, Role: "view"}},
+		{"unsupported-role", memberAPIRecord{MemberType: "user", UserOpenID: &user, Role: "owner"}},
+	}
+	for _, tc := range tests {
+		t.Run(tc.name, func(t *testing.T) {

Update the body to use tc.raw.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@shortcuts/apps/apps_member_response_test.go` around lines 116 - 130, Name
each table-driven case with a descriptive field and update the loop to use the
named case’s raw record via tc.raw. Replace the letter-based t.Run name
generation around projectMemberRecord so failures identify the specific
malformed member record and its corresponding validation guard.

322-347: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Call registry.Verify(t) in the settings execute test.

TestAppsMemberListExecuteUsesTypedProjectionWithoutLeakingRawFields and TestAppsMemberMutationExecuteProjectsResponses both call registry.Verify(t). This test omits it. Without Verify, a stub that is never matched, or a request sent to a different URL or method, goes unreported.

♻️ Proposed fix
 			if err := tc.shortcut.Execute(context.Background(), rctx); err != nil {
 				t.Fatalf("%s Execute: %v", tc.shortcut.Command, err)
 			}
+			registry.Verify(t)
 			out := stdout.String()
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@shortcuts/apps/apps_member_response_test.go` around lines 322 - 347, Call
registry.Verify(t) at the end of each subtest in the settings execute test,
after output assertions complete. Update the loop containing the shortcut
Execute invocation so unmatched stubs and incorrect request method or URL are
reported, consistent with the related execute tests.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@shortcuts/apps/apps_member_common.go`:
- Around line 593-635: Consolidate the duplicated six-setting enum definitions
into one package-level memberSettingSpecs table containing each setting’s flag
name, JSON field name, and allowed values. Update
buildMemberSettingsUpdateRequest, validateMemberSettingsResponse, and
validateMemberSettingChanges to derive their field mappings and allowlists from
this table, and update AppsMemberSettingsSet.Flags to derive its flag enums from
the same source. Remove the duplicate allowlist declarations while preserving
current validation and flag behavior.

In `@shortcuts/apps/apps_member_response_test.go`:
- Around line 180-214: Update the stub response in
TestAppsMemberListExecuteNeverLeaksMetaTokenAcrossFormats to include meta_token
and sensitive-internal-token fields with their forbidden values in the member
record (and app data if applicable). Keep the existing cross-format output
assertions so the test verifies projection removes upstream-sensitive fields and
fails if projectMemberRecord is reverted.

---

Nitpick comments:
In `@shortcuts/apps/apps_member_common_test.go`:
- Around line 79-98: Add a test case for validateMemberAppID using an app_
identifier that passes prefix and character validation but fails
validate.ResourceName, then verify the returned error’s typed metadata via
errs.ProblemOf for category, subtype, and param and assert the original cause is
preserved with errors.Is or errors.Unwrap. Extend
requireAppsMemberValidationError only as needed while retaining its existing
metadata checks.
- Around line 61-66: Replace the hardcoded integer default comparison with
strconv.Atoi(flag.Default) in newAppsMemberRuntime at
shortcuts/apps/apps_member_common_test.go:61-66 and add the strconv import.
Apply the same change in newAppsMemberAPIRuntime at
shortcuts/apps/apps_member_response_test.go:38-43, including its strconv import,
so both helpers use each flag’s declared default.

In `@shortcuts/apps/apps_member_common.go`:
- Around line 297-322: Update buildMemberAddRequest and buildMemberUpdateRequest
to validate the trimmed perm value against the existing memberRoles set before
constructing or returning either request. Extract the shared role check into a
helper alongside the request builders, return an error for missing or
unsupported roles, and propagate that error from both builders so DryRun paths
cannot bypass validation.

In `@shortcuts/apps/apps_member_response_test.go`:
- Around line 116-130: Name each table-driven case with a descriptive field and
update the loop to use the named case’s raw record via tc.raw. Replace the
letter-based t.Run name generation around projectMemberRecord so failures
identify the specific malformed member record and its corresponding validation
guard.
- Around line 322-347: Call registry.Verify(t) at the end of each subtest in the
settings execute test, after output assertions complete. Update the loop
containing the shortcut Execute invocation so unmatched stubs and incorrect
request method or URL are reported, consistent with the related execute tests.

In `@tests/cli_e2e/dryrun/apps_member_dryrun_test.go`:
- Around line 194-205: Add require.Empty(t, result.Stdout) to each validation
subtest in the apps member CLI test loop and to the empty settings-set case,
while preserving the existing stderr envelope and exit-code assertions.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: badaec36-8761-4de6-8235-36b5051f5b88

📥 Commits

Reviewing files that changed from the base of the PR and between ebdeda8 and 1f46b44.

📒 Files selected for processing (10)
  • errs/subtypes.go
  • shortcuts/apps/apps_member.go
  • shortcuts/apps/apps_member_common.go
  • shortcuts/apps/apps_member_common_test.go
  • shortcuts/apps/apps_member_response_test.go
  • shortcuts/apps/shortcuts.go
  • shortcuts/apps/shortcuts_test.go
  • skills/lark-apps/SKILL.md
  • tests/cli_e2e/apps/coverage.md
  • tests/cli_e2e/dryrun/apps_member_dryrun_test.go

Comment thread shortcuts/apps/apps_member_common.go
Comment thread shortcuts/apps/apps_member_response_test.go
@codecov

codecov Bot commented Aug 5, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 69.40000% with 153 lines in your changes missing coverage. Please review.
✅ Project coverage is 76.01%. Comparing base (ebdeda8) to head (5e97390).
⚠️ Report is 12 commits behind head on main.

Files with missing lines Patch % Lines
shortcuts/apps/apps_member_common.go 70.74% 55 Missing and 43 partials ⚠️
shortcuts/apps/apps_member.go 65.40% 34 Missing and 21 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2191      +/-   ##
==========================================
+ Coverage   75.85%   76.01%   +0.15%     
==========================================
  Files         958      968      +10     
  Lines      101701   103167    +1466     
==========================================
+ Hits        77150    78422    +1272     
- Misses      18684    18777      +93     
- Partials     5867     5968     +101     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@yxy-bd
yxy-bd force-pushed the codex/miaoda-member-permissions branch from 1f46b44 to cfeb5ed Compare August 5, 2026 05:44
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
shortcuts/apps/apps_member_common.go (1)

423-432: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Derive the invalid-parameter list from memberSettingSpecs.

The loop on Lines 417-422 reads the flag names from memberSettingSpecs. The WithParams call on Lines 425-430 hardcodes the same six flag names. If a spec is added to the table, the new flag becomes usable, but this error omits it from the typed parameter list. An agent reading the error then cannot discover the flag.

Build the parameter slice from the same table.

♻️ Proposed fix
+	params := make([]errs.InvalidParam, 0, len(memberSettingSpecs))
+	for _, spec := range memberSettingSpecs {
+		params = append(params, appsInvalidParam("--"+spec.flag, "not provided"))
+	}
 	return appsValidationError("at least one collaborator setting must be provided").
-		WithParams(
-			appsInvalidParam("--external-access", "not provided"),
-			appsInvalidParam("--external-invite", "not provided"),
-			appsInvalidParam("--link-share", "not provided"),
-			appsInvalidParam("--manage-collaborators-by", "not provided"),
-			appsInvalidParam("--comment-by", "not provided"),
-			appsInvalidParam("--copy-download-by", "not provided"),
-		).
+		WithParams(params...).
 		WithHint("pass at least one setting flag; omitted settings remain unchanged")

Confirm the element type accepted by WithParams before applying this change.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@shortcuts/apps/apps_member_common.go` around lines 423 - 432, Update the
validation error path surrounding memberSettingSpecs so the WithParams argument
is built by iterating over memberSettingSpecs and converting each spec’s flag
name into the accepted invalid-parameter type. Remove the hardcoded six-name
list, confirm the element type expected by WithParams, and preserve the existing
validation message and hint.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@skills/lark-apps/SKILL.md`:
- Line 69: 更新包含 +member-add、+member-update、+member-remove 和 +member-settings-set
的高风险写命令说明,使其明确遵循全局预授权规则:仅在未预授权时要求逐步确认;已预授权流程可跳过该确认,但仍保留 --dry-run 核对要求及真实执行时使用
--yes 的约束。

---

Nitpick comments:
In `@shortcuts/apps/apps_member_common.go`:
- Around line 423-432: Update the validation error path surrounding
memberSettingSpecs so the WithParams argument is built by iterating over
memberSettingSpecs and converting each spec’s flag name into the accepted
invalid-parameter type. Remove the hardcoded six-name list, confirm the element
type expected by WithParams, and preserve the existing validation message and
hint.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 9a652eb3-7f1b-4b27-9a3f-7933d782f080

📥 Commits

Reviewing files that changed from the base of the PR and between ebdeda8 and cfeb5ed.

📒 Files selected for processing (10)
  • errs/subtypes.go
  • shortcuts/apps/apps_member.go
  • shortcuts/apps/apps_member_common.go
  • shortcuts/apps/apps_member_common_test.go
  • shortcuts/apps/apps_member_response_test.go
  • shortcuts/apps/shortcuts.go
  • shortcuts/apps/shortcuts_test.go
  • skills/lark-apps/SKILL.md
  • tests/cli_e2e/apps/coverage.md
  • tests/cli_e2e/dryrun/apps_member_dryrun_test.go
🚧 Files skipped from review as they are similar to previous changes (8)
  • errs/subtypes.go
  • shortcuts/apps/shortcuts.go
  • shortcuts/apps/shortcuts_test.go
  • tests/cli_e2e/dryrun/apps_member_dryrun_test.go
  • shortcuts/apps/apps_member.go
  • tests/cli_e2e/apps/coverage.md
  • shortcuts/apps/apps_member_common_test.go
  • shortcuts/apps/apps_member_response_test.go

Comment thread skills/lark-apps/SKILL.md Outdated
@yxy-bd
yxy-bd force-pushed the codex/miaoda-member-permissions branch from cfeb5ed to a51835d Compare August 5, 2026 06:03
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/L Large or sensitive change across domains or core paths

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants