Skip to content

fix: unify dry-run output contract#1817

Closed
Tantanz20020918 wants to merge 3 commits into
larksuite:mainfrom
Tantanz20020918:fix/dry-run-output-contract
Closed

fix: unify dry-run output contract#1817
Tantanz20020918 wants to merge 3 commits into
larksuite:mainfrom
Tantanz20020918:fix/dry-run-output-contract

Conversation

@Tantanz20020918

@Tantanz20020918 Tantanz20020918 commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator

Summary

Unify --dry-run JSON output under the standard success envelope so agents can reliably parse ok, identity, dry_run, and data.

This fixes dry-run paths that previously emitted raw payloads or banners on stdout, which broke --jq and pipe-based consumers.

Changes

  • Add dry_run support to the success envelope and route raw API, service, and shortcut dry-run JSON output through the shared envelope writer.
  • Preserve human-readable pretty dry-run output while keeping the banner on stderr.
  • Tighten dry-run URL placeholder replacement and metadata identity handling for description-only bot/user-only methods.
  • Update dry-run unit and E2E tests, including a shared DryRunGet helper for envelope-aware assertions.

Test Plan

  • make build
  • harness dev-verify validate script
  • GOCACHE=/private/tmp/lark-cli-go-build go test ./internal/output ./internal/cmdutil ./internal/meta ./cmd ./cmd/api ./cmd/service ./shortcuts/common ./shortcuts/apps ./shortcuts/drive ./shortcuts/sheets ./shortcuts/slides ./shortcuts/task ./internal/qualitygate/rules -count=1
  • GOCACHE=/private/tmp/lark-cli-go-build go test ./tests/cli_e2e/... -run DryRun -count=1

Related Issues

  • None

Summary by CodeRabbit

  • New Features
    • Dry-run output now uses a consistent JSON envelope that includes a dry_run flag and nested request details.
    • Dry-run supports --jq filtering and structured previews for file uploads.
    • Commands can respect identity hints embedded in method descriptions more reliably.
  • Bug Fixes
    • Fixed dry-run URL placeholder substitution to prevent partial/incorrect replacements.
    • Improved parsing so dry-run request previews are correctly read from nested data.api structures.
    • Adjusted dry-run “banner” behavior so it no longer appears in JSON stdout (shown separately when using pretty output).

@Tantanz20020918 Tantanz20020918 added domain/core CLI framework and core libraries size/L Large or sensitive change across domains or core paths bugfix Bug fixes labels Jul 9, 2026
@coderabbitai

coderabbitai Bot commented Jul 9, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e71bacde-aa19-4997-9549-66e0ccedbd26

📥 Commits

Reviewing files that changed from the base of the PR and between 14dcbe7 and 31b9a9e.

📒 Files selected for processing (5)
  • internal/meta/identity.go
  • internal/meta/identity_test.go
  • shortcuts/apps/apps_db_data_import_test.go
  • shortcuts/apps/apps_db_env_recovery_quota_test.go
  • shortcuts/apps/dryrun_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • shortcuts/apps/apps_db_data_import_test.go

📝 Walkthrough

Walkthrough

This PR standardizes dry-run output as a JSON success envelope with dry_run and nested data.api content, updates dry-run rendering and request extraction paths, and migrates unit/e2e tests to the new helpers. It also adds description-based identity overrides in method metadata.

Changes

Dry-run output envelope unification

Layer / File(s) Summary
Envelope and rendering core
internal/output/envelope.go, internal/output/envelope_success.go, internal/output/envelope_success_test.go, internal/cmdutil/dryrun.go, internal/cmdutil/dryrun_test.go
Adds dry_run to the envelope, introduces DryRunOutputOptions and WriteDryRun, changes dry-run URL substitution, and updates rendering tests.
API and service dry-run wiring
cmd/api/api.go, cmd/api/api_test.go, cmd/service/service.go, cmd/service/service_test.go
Passes structured dry-run options through api/service commands and updates their tests to assert JSON envelope output.
Shortcut runner and quality gate
shortcuts/common/runner.go, shortcuts/common/runner_jq_test.go, internal/qualitygate/rules/dryrun.go, internal/qualitygate/rules/dryrun_test.go
Routes shortcut dry-runs through shared rendering and updates dry-run JSON extraction to prefer data.api.
Apps shortcut test helpers and migrations
shortcuts/apps/dryrun_test.go, shortcuts/apps/*_test.go
Adds shared dry-run decoding helpers for apps shortcuts and migrates apps tests to the nested envelope shape.
Drive, sheets, slides, and task shortcut tests
shortcuts/drive/*_test.go, shortcuts/sheets/helpers_test.go, shortcuts/slides/slides_replace_pages_test.go, shortcuts/task/task_upload_attachment_test.go
Adds nested dry-run helpers and migrates drive/sheets/slides/task shortcut tests to read data.api.
CLI e2e helpers
tests/cli_e2e/core.go, tests/cli_e2e/stdin_regression_test.go
Adds DryRunGet/DryRunData and updates stdin regression parsing to read the envelope directly.
Apps/base e2e dry-run assertions
tests/cli_e2e/apps/*, tests/cli_e2e/base/*
Replaces gjson.Get with clie2e.DryRunGet/DryRunData across apps and base dry-run tests.
Drive/other e2e dry-run assertions
tests/cli_e2e/drive/*, tests/cli_e2e/{calendar,docs,event,im,mail,markdown,note,sheets,task,vc,wiki}/*
Replaces gjson.Get with clie2e.DryRunGet/DryRunData across drive and the remaining domain tests.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Description-based identity override

Layer / File(s) Summary
Description-only identity resolution
internal/meta/identity.go, internal/meta/identity_test.go
Adds descriptionOnlyIdentity() and changes identity gating to follow description markers for bot-only and user-only methods.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

  • larksuite/cli#236: Adds the tests/cli_e2e dry-run helper layer that this PR uses throughout the e2e test migration.
  • larksuite/cli#395: Shares the dry-run file-upload plumbing touched by the PrintDryRunWithFile signature changes.
  • larksuite/cli#1489: Aligns on the success-envelope dry-run output contract extended here.

Suggested labels: size/L

Suggested reviewers: liangshuo-1, MaxHuang22, fangshuyu-768

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 30.77% 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 is concise and accurately summarizes the main change: unifying the dry-run output contract.
Description check ✅ Passed The description follows the template and covers summary, changes, test plan, and related issues with enough detail.
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
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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 added domain/ccm PR touches the ccm domain domain/task PR touches the task domain and removed domain/core CLI framework and core libraries labels Jul 9, 2026

@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 (3)
shortcuts/apps/dryrun_test.go (1)

19-34: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Legacy fallback could mask incomplete envelope migration.

The fallback silently accepts the old top-level api shape whenever data.api is empty. Since this PR's entire goal is enforcing the new nested data.api contract, a shortcut that isn't fully wired through cmdutil.WriteDryRun (and still emits the legacy shape) would pass these tests undetected instead of failing loudly.

Consider dropping the legacy fallback (or asserting on the raw envelope shape once) now that migration is complete, so any regression to the old format fails the test.

🤖 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/dryrun_test.go` around lines 19 - 34, The UnmarshalJSON logic
on dryRunAPIEnvelope still falls back to the legacy top-level API field, which
can hide regressions in the new envelope format. Update the
dryRunAPIEnvelope.UnmarshalJSON path so tests only accept the nested data.api
shape (or explicitly assert the raw envelope shape once) and remove the silent
fallback to raw.API; this will make any cmdutil.WriteDryRun regression that
emits the old format fail in dryrun_test.go.
tests/cli_e2e/drive/drive_export_dryrun_test.go (1)

83-104: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider migrating TestDriveExportDryRun_MarkdownFetchAPI to clie2e.DryRunGet for consistency.

This test uses DryRunData + gjson.Get while the other two tests in the same file use clie2e.DryRunGet. Migrating the remaining gjson.Get calls (lines 87–104) to DryRunGet would allow removing the gjson import entirely from this file, matching the pattern in all other migrated files in this PR.

♻️ Proposed refactor for TestDriveExportDryRun_MarkdownFetchAPI
 	require.NoError(t, err)
-	result.Stdout = clie2e.DryRunData(result.Stdout)
 	result.AssertExitCode(t, 0)

 	out := result.Stdout
-	if got := gjson.Get(out, "api.0.method").String(); got != "POST" {
+	if got := clie2e.DryRunGet(out, "api.0.method").String(); got != "POST" {
 		t.Fatalf("method=%q, want POST\nstdout:\n%s", got, out)
 	}
-	if got := gjson.Get(out, "api.0.url").String(); got != "/open-apis/docs_ai/v1/documents/docxMdDryRun/fetch" {
+	if got := clie2e.DryRunGet(out, "api.0.url").String(); got != "/open-apis/docs_ai/v1/documents/docxMdDryRun/fetch" {
 		t.Fatalf("url=%q, want docs_ai fetch\nstdout:\n%s", got, out)
 	}
-	if got := gjson.Get(out, "api.0.body.format").String(); got != "markdown" {
+	if got := clie2e.DryRunGet(out, "api.0.body.format").String(); got != "markdown" {
 		t.Fatalf("body.format=%q, want markdown\nstdout:\n%s", got, out)
 	}
-	if gjson.Get(out, "api.0.body.extra_param").Exists() {
+	if clie2e.DryRunGet(out, "api.0.body.extra_param").Exists() {
 		t.Fatalf("markdown drive export must not enable docs fetch extra_param\nstdout:\n%s", out)
 	}
-	if got := gjson.Get(out, "file_name").String(); got != "my-notes.md" {
+	if got := clie2e.DryRunGet(out, "file_name").String(); got != "my-notes.md" {
 		t.Fatalf("file_name=%q, want my-notes.md\nstdout:\n%s", got, out)
 	}
-	if got := gjson.Get(out, "output_dir").String(); got != "./md-exports" {
+	if got := clie2e.DryRunGet(out, "output_dir").String(); got != "./md-exports" {
 		t.Fatalf("output_dir=%q, want ./md-exports\nstdout:\n%s", got, out)
 	}
🤖 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/drive/drive_export_dryrun_test.go` around lines 83 - 104, The
TestDriveExportDryRun_MarkdownFetchAPI check still parses stdout with DryRunData
plus multiple gjson.Get calls, unlike the other dry-run tests in this file.
Update this test to use clie2e.DryRunGet for the API and output fields,
referencing the existing TestDriveExportDryRun_MarkdownFetchAPI helper pattern
used elsewhere, and then remove the now-unused gjson import so the file matches
the migrated style consistently.
tests/cli_e2e/drive/drive_member_add_dryrun_test.go (1)

307-333: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Inconsistent migration: raw gjson.Get with hardcoded "data." prefix alongside clie2e.DryRunGet.

bodyPath is manually prefixed with "data." and consumed via raw gjson.Get(out, bodyPath+...) (lines 314-333), while adjacent checks in the same test (lines 290-306, 310) already use clie2e.DryRunGet. This works today, but the hardcoded "data." literal won't track future changes to the shared envelope helper the way the rest of the migrated suite does.

♻️ Proposed fix to fully align with clie2e.DryRunGet
-			bodyPath := "data.api.0.body"
+			bodyPath := "api.0.body"
 			if tt.wantBatch {
-				bodyPath = "data.api.0.body.members.0"
+				bodyPath = "api.0.body.members.0"
 				if count := len(clie2e.DryRunGet(out, "api.0.body.members").Array()); count != 2 {
 					t.Fatalf("body.members count = %d, want 2\nstdout:\n%s", count, out)
 				}
 			}
-			if got := gjson.Get(out, bodyPath+".member_id").String(); got != tt.wantMemberID {
+			if got := clie2e.DryRunGet(out, bodyPath+".member_id").String(); got != tt.wantMemberID {
 				t.Fatalf("body.member_id = %q, want %q\nstdout:\n%s", got, tt.wantMemberID, out)
 			}
-			if got := gjson.Get(out, bodyPath+".member_type").String(); got != tt.wantMemberType {
+			if got := clie2e.DryRunGet(out, bodyPath+".member_type").String(); got != tt.wantMemberType {
 				t.Fatalf("body.member_type = %q, want %q\nstdout:\n%s", got, tt.wantMemberType, out)
 			}
-			if got := gjson.Get(out, bodyPath+".perm").String(); got != tt.wantPerm {
+			if got := clie2e.DryRunGet(out, bodyPath+".perm").String(); got != tt.wantPerm {
 				t.Fatalf("body.perm = %q, want %q\nstdout:\n%s", got, tt.wantPerm, out)
 			}
-			if got := gjson.Get(out, bodyPath+".type").String(); got != tt.wantMemberKind {
+			if got := clie2e.DryRunGet(out, bodyPath+".type").String(); got != tt.wantMemberKind {
 				t.Fatalf("body.type = %q, want %q\nstdout:\n%s", got, tt.wantMemberKind, out)
 			}
-			permType := gjson.Get(out, bodyPath+".perm_type")
+			permType := clie2e.DryRunGet(out, bodyPath+".perm_type")
🤖 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/drive/drive_member_add_dryrun_test.go` around lines 307 - 333,
The dry-run assertions in this test still use raw gjson access with a hardcoded
"data." prefix, unlike the surrounding checks that already go through
clie2e.DryRunGet. Update the bodyPath-based assertions in
drive_member_add_dryrun_test.go to read from the clie2e.DryRunGet helper
consistently, using the same helper for the members array and all member fields
so the test follows the shared envelope behavior.
🤖 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 `@internal/meta/identity_test.go`:
- Around line 58-68: Add test coverage in identity_test.go for the new
description parsing in Method.SupportsToken: add a case where Description
contains Identity: `user` only and verify it accepts user and rejects
tenant/bot, and add a true description-only case where AccessTokens is nil or
empty but Description still drives support checks. Update the existing
Method.SupportsToken tests to cover both the new user marker and the fallback
behavior when no tokens are declared, alongside the current bot-only mixed-token
case.

In `@internal/meta/identity.go`:
- Around line 64-66: `RestrictsIdentity()` in `Identity` is missing the
description-only marker check, so description-only bot/user methods are still
treated as unrestricted by the command identity gate. Update
`RestrictsIdentity()` to fold in the same `descriptionOnlyIdentity()` handling
already used by `SupportsToken()` and `Identities()`, returning the restricted
result for those identities as well.

---

Nitpick comments:
In `@shortcuts/apps/dryrun_test.go`:
- Around line 19-34: The UnmarshalJSON logic on dryRunAPIEnvelope still falls
back to the legacy top-level API field, which can hide regressions in the new
envelope format. Update the dryRunAPIEnvelope.UnmarshalJSON path so tests only
accept the nested data.api shape (or explicitly assert the raw envelope shape
once) and remove the silent fallback to raw.API; this will make any
cmdutil.WriteDryRun regression that emits the old format fail in dryrun_test.go.

In `@tests/cli_e2e/drive/drive_export_dryrun_test.go`:
- Around line 83-104: The TestDriveExportDryRun_MarkdownFetchAPI check still
parses stdout with DryRunData plus multiple gjson.Get calls, unlike the other
dry-run tests in this file. Update this test to use clie2e.DryRunGet for the API
and output fields, referencing the existing
TestDriveExportDryRun_MarkdownFetchAPI helper pattern used elsewhere, and then
remove the now-unused gjson import so the file matches the migrated style
consistently.

In `@tests/cli_e2e/drive/drive_member_add_dryrun_test.go`:
- Around line 307-333: The dry-run assertions in this test still use raw gjson
access with a hardcoded "data." prefix, unlike the surrounding checks that
already go through clie2e.DryRunGet. Update the bodyPath-based assertions in
drive_member_add_dryrun_test.go to read from the clie2e.DryRunGet helper
consistently, using the same helper for the members array and all member fields
so the test follows the shared envelope behavior.
🪄 Autofix (Beta)

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

Run ID: e4114d79-6168-4a89-9c9f-e57bcc7ca02e

📥 Commits

Reviewing files that changed from the base of the PR and between 74d8458 and c89576e.

📒 Files selected for processing (97)
  • cmd/api/api.go
  • cmd/api/api_test.go
  • cmd/service/service.go
  • cmd/service/service_test.go
  • internal/cmdutil/dryrun.go
  • internal/cmdutil/dryrun_test.go
  • internal/meta/identity.go
  • internal/meta/identity_test.go
  • internal/output/envelope.go
  • internal/output/envelope_success.go
  • internal/output/envelope_success_test.go
  • internal/qualitygate/rules/dryrun.go
  • internal/qualitygate/rules/dryrun_test.go
  • shortcuts/apps/apps_analytics_test.go
  • shortcuts/apps/apps_db_audit_test.go
  • shortcuts/apps/apps_db_changelog_list_test.go
  • shortcuts/apps/apps_db_data_export_test.go
  • shortcuts/apps/apps_db_data_import_test.go
  • shortcuts/apps/apps_db_env_recovery_quota_test.go
  • shortcuts/apps/apps_db_execute_test.go
  • shortcuts/apps/apps_db_table_get_test.go
  • shortcuts/apps/apps_db_table_list_test.go
  • shortcuts/apps/apps_env_test.go
  • shortcuts/apps/apps_file_delete_test.go
  • shortcuts/apps/apps_file_download_test.go
  • shortcuts/apps/apps_file_get_test.go
  • shortcuts/apps/apps_file_list_test.go
  • shortcuts/apps/apps_file_sign_test.go
  • shortcuts/apps/apps_file_upload_test.go
  • shortcuts/apps/apps_init_test.go
  • shortcuts/apps/apps_logs_test.go
  • shortcuts/apps/apps_metrics_test.go
  • shortcuts/apps/apps_traces_test.go
  • shortcuts/apps/dryrun_test.go
  • shortcuts/apps/git_credential_test.go
  • shortcuts/common/runner.go
  • shortcuts/common/runner_jq_test.go
  • shortcuts/drive/drive_add_comment_test.go
  • shortcuts/drive/drive_member_add_test.go
  • shortcuts/sheets/helpers_test.go
  • shortcuts/slides/slides_replace_pages_test.go
  • shortcuts/task/task_upload_attachment_test.go
  • tests/cli_e2e/apps/apps_access_scope_get_dryrun_test.go
  • tests/cli_e2e/apps/apps_access_scope_set_dryrun_test.go
  • tests/cli_e2e/apps/apps_create_dryrun_test.go
  • tests/cli_e2e/apps/apps_db_env_create_dryrun_test.go
  • tests/cli_e2e/apps/apps_db_execute_dryrun_test.go
  • tests/cli_e2e/apps/apps_db_table_get_dryrun_test.go
  • tests/cli_e2e/apps/apps_db_table_list_dryrun_test.go
  • tests/cli_e2e/apps/apps_env_pull_dryrun_test.go
  • tests/cli_e2e/apps/apps_git_credential_dryrun_test.go
  • tests/cli_e2e/apps/apps_html_publish_dryrun_test.go
  • tests/cli_e2e/apps/apps_list_dryrun_test.go
  • tests/cli_e2e/apps/apps_update_dryrun_test.go
  • tests/cli_e2e/base/base_attachment_dryrun_test.go
  • tests/cli_e2e/base/base_block_dryrun_test.go
  • tests/cli_e2e/base/base_create_dryrun_test.go
  • tests/cli_e2e/base/base_field_dryrun_test.go
  • tests/cli_e2e/base/base_limit_dryrun_test.go
  • tests/cli_e2e/calendar/calendar_update_dryrun_test.go
  • tests/cli_e2e/core.go
  • tests/cli_e2e/doc/docs_dryrun_test.go
  • tests/cli_e2e/docs/docs_update_dryrun_test.go
  • tests/cli_e2e/drive/drive_add_comment_dryrun_test.go
  • tests/cli_e2e/drive/drive_apply_permission_dryrun_test.go
  • tests/cli_e2e/drive/drive_export_dryrun_test.go
  • tests/cli_e2e/drive/drive_import_dryrun_test.go
  • tests/cli_e2e/drive/drive_inspect_dryrun_test.go
  • tests/cli_e2e/drive/drive_member_add_dryrun_test.go
  • tests/cli_e2e/drive/drive_preview_dryrun_test.go
  • tests/cli_e2e/drive/drive_pull_dryrun_test.go
  • tests/cli_e2e/drive/drive_push_dryrun_test.go
  • tests/cli_e2e/drive/drive_search_dryrun_test.go
  • tests/cli_e2e/drive/drive_secure_label_dryrun_test.go
  • tests/cli_e2e/drive/drive_status_dryrun_test.go
  • tests/cli_e2e/drive/drive_sync_dryrun_test.go
  • tests/cli_e2e/drive/drive_upload_dryrun_test.go
  • tests/cli_e2e/event/event_subscribe_dryrun_test.go
  • tests/cli_e2e/im/im_download_resources_dryrun_test.go
  • tests/cli_e2e/mail/mail_draft_send_dryrun_test.go
  • tests/cli_e2e/mail/mail_share_to_chat_dryrun_test.go
  • tests/cli_e2e/mail/mail_triage_dryrun_test.go
  • tests/cli_e2e/markdown/markdown_dryrun_test.go
  • tests/cli_e2e/note/note_dryrun_test.go
  • tests/cli_e2e/sheets/sheets_gridline_dryrun_test.go
  • tests/cli_e2e/sheets/sheets_image_upload_dryrun_test.go
  • tests/cli_e2e/sheets/sheets_sheet_shortcuts_dryrun_test.go
  • tests/cli_e2e/sheets/sheets_table_get_dryrun_test.go
  • tests/cli_e2e/sheets/sheets_table_put_dryrun_test.go
  • tests/cli_e2e/sheets/sheets_workbook_export_dryrun_test.go
  • tests/cli_e2e/sheets/sheets_workbook_import_dryrun_test.go
  • tests/cli_e2e/stdin_regression_test.go
  • tests/cli_e2e/task/task_get_my_tasks_dryrun_test.go
  • tests/cli_e2e/task/task_upload_attachment_dryrun_test.go
  • tests/cli_e2e/vc/vc_meeting_message_send_dryrun_test.go
  • tests/cli_e2e/wiki/wiki_member_add_dryrun_test.go
  • tests/cli_e2e/wiki/wiki_node_create_dryrun_test.go

Comment thread internal/meta/identity_test.go
Comment thread internal/meta/identity.go
@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown

🚀 PR Preview Install Guide

🧰 CLI update

npm i -g https://pkg.pr.new/larksuite/cli/@larksuite/cli@31b9a9e20569b6a7daf1f09aa5f596818e4acc86

🧩 Skill update

npx skills add Tantanz20020918/cli#fix/dry-run-output-contract -y -g

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

Labels

bugfix Bug fixes domain/ccm PR touches the ccm domain domain/task PR touches the task domain 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