Skip to content

fix: unify dry-run output contract#1870

Merged
liangshuo-1 merged 5 commits into
mainfrom
fix/dry-run-output-contract-v2
Jul 14, 2026
Merged

fix: unify dry-run output contract#1870
liangshuo-1 merged 5 commits into
mainfrom
fix/dry-run-output-contract-v2

Conversation

@liangshuo-1

@liangshuo-1 liangshuo-1 commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator

Summary

Continues #1817 (rebased onto latest main; the original branch lives on a fork and could not be updated directly). Unifies all dry-run output under the standard success envelope, with review fixes on top.

BREAKING: dry-run JSON stdout is now the standard envelope — migrate .api.data.api; data.appId/data.as/data.userOpenId → top-level identity and data.context.{app_id,user_open_id}.

Changes

  • Route api / service / shortcut dry-run output through one envelope writer (ok/identity/dry_run/data); JSON stdout is clean, pretty keeps the banner on stderr plus a # dry-run: request not sent marker on stdout
  • Transcribe the HTTP method verbatim in previews (HEAD/OPTIONS were reported as GET); reject an empty method with a typed error
  • Unify data shape across all three paths: {api, context?, description?}; identity is reported only at the envelope top level
  • Fix dry-run URL placeholder replacement (full-token match; :as no longer corrupts :assignee_id)
  • Drop description-marker identity parsing: stale prose must not override corrected accessTokens (it would block legal user calls on images.create)
  • Migrate dry-run tests that grew on main meanwhile (wiki export, list comments, slash commands, sheets history, docs fetch, mail, vc) to the envelope accessors
  • AGENTS.md: add typed-data / faithful-transcription / contract-test conventions

Test Plan

  • Unit tests pass (all affected packages)
  • go test ./tests/cli_e2e/... -run DryRun — all domains green
  • Manual verification: json/pretty/jq output, stdout/stderr separation, shortcut and raw-api paths

Related Issues

Summary by CodeRabbit

  • New Features

    • Standardized --dry-run output in a structured success envelope with ok, identity, dry_run, and request details under data.
    • Added support for jq filtering of dry-run responses.
    • Dry-run output now includes request context when configured and preserves the specified HTTP method.
  • Bug Fixes

    • Empty HTTP methods are rejected with a clear validation error.
    • Improved URL placeholder matching and escaping.
    • Quality checks now recognize both supported dry-run response formats.
  • Tests

    • Expanded validation for JSON envelopes, file uploads, jq filtering, request context, and method transcription.

Tantanz20020918 and others added 5 commits July 14, 2026 02:55
- transcribe HTTP method verbatim in previews (HEAD/OPTIONS were
  reported as GET); reject an empty method in api with a typed error
- unify the dry-run data payload across api/service/shortcut paths:
  {api, context?: {app_id, user_open_id}}; drop data.as — the envelope
  top-level identity is the single identity source
- mark pretty dry-run stdout with '# dry-run: request not sent' so logs
  that drop stderr still show it was a preview
- extract the shared preview builder, collapse PrintDryRunWithFile's
  loose params into FileUploadMeta, and fail loudly on nil previews
- revert description-marker identity parsing: stale prose must not
  override corrected accessTokens (blocks legal user calls on
  images.create); identity gating keys off accessTokens only
- pin the new contracts with tests: verbatim method, three-way context
  parity, nil-preview error, empty-context omission, marker line
…st conventions

- typed struct at the boundary over map[string]interface{} threading;
  distinct types where values could swap silently (internal/meta.Token)
- transcribe input verbatim in previews/transformations; reject
  unhonorable flag combinations with typed errors instead of silently
  substituting behavior
- contract tests must fail when the implementation is reverted
main gained raw-format dry-run readers while the PR was in flight
(wiki drive export #1802, drive list comments #1845, slash commands,
sheets history, docs fetch, mail draft-send/triage, vc meeting events).
Migrate them to the envelope accessors (clie2e.DryRunGet / data-wrapped
decoders) and drop the now-redundant DryRunData extractions in files
unified on DryRunGet.
@github-actions github-actions Bot added 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 labels Jul 13, 2026
@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Dry-run output is standardized into a success envelope with nested data.api, context, dry_run, and jq support. API and service commands use shared output options, while quality-gate and CLI tests are updated to parse the new shape and validate structured fields.

Changes

Dry-run rendering and command integration

Layer / File(s) Summary
Core preview and envelope rendering
internal/cmdutil/dryrun.go, internal/output/*
Dry-run previews now preserve methods verbatim, escape URL placeholders, serialize typed context, and render through a standardized success envelope.
API and service wiring
cmd/api/*, cmd/service/*
API and service commands pass structured dry-run output options, support file previews through the new interface, and reject empty HTTP methods.
Quality-gate and shortcut consumers
internal/qualitygate/*, shortcuts/*
Dry-run parsing supports both top-level and nested API arrays, while shortcut tests decode the new data wrapper.
E2E helpers and assertions
tests/cli_e2e/core.go, tests/cli_e2e/**/*_dryrun_test.go
Shared helpers expose nested dry-run data, and CLI E2E tests use typed field extraction instead of direct raw JSON lookups or substring checks.

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

Possibly related PRs

Suggested labels: feature

Suggested reviewers: evandance, maxhuang22, qingniaotonghua, raistlin042, fangshuyu-768

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 37.14% 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 required template and covers summary, changes, test plan, and related issues.
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 docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/dry-run-output-contract-v2

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.

@codecov

codecov Bot commented Jul 13, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 97.11538% with 3 lines in your changes missing coverage. Please review.
✅ Project coverage is 74.66%. Comparing base (4e44e51) to head (636ab93).

Files with missing lines Patch % Lines
internal/cmdutil/dryrun.go 94.54% 3 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1870      +/-   ##
==========================================
+ Coverage   74.60%   74.66%   +0.06%     
==========================================
  Files         877      877              
  Lines       91720    91731      +11     
==========================================
+ Hits        68426    68494      +68     
+ Misses      17981    17926      -55     
+ Partials     5313     5311       -2     

☔ 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.

@github-actions

Copy link
Copy Markdown

🚀 PR Preview Install Guide

🧰 CLI update

npm i -g https://pkg.pr.new/larksuite/cli/@larksuite/cli@636ab9391d60d3e7bac2c7cdf3baac303fdac6ed

🧩 Skill update

npx skills add larksuite/cli#fix/dry-run-output-contract-v2 -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/drive/drive_member_add_dryrun_test.go (1)

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

Inconsistent migration: mixes clie2e.DryRunGet with raw gjson.Get + manual "data." prefix.

Lines 290-310 correctly use the new clie2e.DryRunGet helper, but bodyPath is built with a hardcoded "data." prefix and the subsequent member_id/member_type/perm/type/perm_type assertions (Lines 314-331) fall back to raw gjson.Get. It's functionally equivalent today, but this is the only file in the migration that didn't fully adopt the shared helper, leaving a stale gjson import and a path-construction pattern that will silently drift if DryRunGet's prefixing logic ever changes.

♻️ Proposed fix to use `clie2e.DryRunGet` consistently
-			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,
Update the assertions in the dry-run test around bodyPath to use
clie2e.DryRunGet for all member_id, member_type, perm, type, and perm_type
lookups. Remove the hardcoded "data." prefix from bodyPath, preserve the
batch/non-batch paths and existing expectations, and remove the now-unused gjson
import.
tests/cli_e2e/sheets/sheets_gridline_dryrun_test.go (1)

47-53: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Align DryRunData usage with other dry-run tests for consistency.

The nil check and in-place mutation of result.Stdout is unnecessary—require.NoError on line 50 will fail the test before result is accessed on line 51 if err != nil. Other tests in this PR (e.g., sheets_table_put_dryrun_test.go line 40) use the cleaner pattern of assigning after the error/exit-code checks.

♻️ Suggested refactor
 		DefaultAs: "user",
 	})
-	if result != nil {
-		result.Stdout = clie2e.DryRunData(result.Stdout)
-	}
 	require.NoError(t, err)
 	result.AssertExitCode(t, 0)
 
-	out := result.Stdout
+	out := clie2e.DryRunData(result.Stdout)
🤖 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/sheets/sheets_gridline_dryrun_test.go` around lines 47 - 53, In
the test flow around result.AssertExitCode, remove the nil check and in-place
mutation of result.Stdout. First require no error and assert the exit code, then
assign the output variable from DryRunData(result.Stdout), matching the pattern
used by the other dry-run tests.
shortcuts/apps/apps_file_upload_test.go (1)

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

Silently ignored json.Unmarshal errors in dry-run tests cause confusing panics. All three sites discard the unmarshal error with _ = json.Unmarshal(...), so a decode failure produces an index-out-of-range panic on the subsequent env.API[0] access instead of a clear test failure. Other tests in this PR (apps_traces_test.go, apps_env_test.go) properly check the error with t.Fatalf.

  • shortcuts/apps/apps_file_upload_test.go#L80-L80: replace _ = json.Unmarshal(...) with an if err := ...; err != nil { t.Fatalf(...) } guard.
  • shortcuts/apps/apps_db_changelog_list_test.go#L41-L41: same fix.
  • shortcuts/apps/apps_file_sign_test.go#L26-L26: same fix.
🤖 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_file_upload_test.go` at line 80, Replace each discarded
json.Unmarshal error with an if err guard that calls t.Fatalf with the decode
error in shortcuts/apps/apps_file_upload_test.go:80-80,
shortcuts/apps/apps_db_changelog_list_test.go:41-41, and
shortcuts/apps/apps_file_sign_test.go:26-26. Apply the checks at the existing
dry-run response parsing sites before accessing env.API.
shortcuts/sheets/helpers_test.go (1)

255-262: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Fallback to legacy top-level api key is likely dead code under the new envelope contract.

dryRunAPIEntries prefers dryRun["data"]["api"] but falls back to a top-level dryRun["api"]. Per the unified contract, dry-run stdout always nests api under data now, so the fallback branch should never trigger in practice and mainly obscures that the migration is complete. Consider removing the fallback once confirmed no callers still emit the old shape.

🤖 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/sheets/helpers_test.go` around lines 255 - 262, Update
dryRunAPIEntries to rely exclusively on the unified envelope contract by
returning entries only from dryRun["data"]["api"]. Remove the legacy top-level
dryRun["api"] fallback while preserving the existing success and failure
behavior for missing or incorrectly typed nested data.
shortcuts/common/runner_jq_test.go (1)

255-269: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Decode the envelope into a typed projection.

The untyped map and unchecked assertions can panic on a contract regression. Use a small envelope struct with pointer booleans/context fields so required fields are asserted explicitly.

As per coding guidelines, “Parse map[string]interface{} into typed structs at system boundaries.”

🤖 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/common/runner_jq_test.go` around lines 255 - 269, The dry-run
response validation in the test uses untyped maps and unchecked assertions that
can panic on malformed output. Replace the map-based decoding around env, data,
api, and call with a small typed envelope projection, using pointer booleans and
context fields to distinguish missing values; explicitly assert all required
fields before accessing nested data, while preserving the existing validation
expectations.

Source: Coding guidelines

shortcuts/apps/apps_db_env_recovery_quota_test.go (1)

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

Add len(env.API) guard to the other subtests for consistency.

TestAppsDBQuotaGet_DryRunOmitsEnvWhenUnset correctly checks len(env.API) != 1 before accessing env.API[0], but TestAppsDBEnvDiff_DryRunBody (line 35), TestAppsDBEnvMigrate_DryRunBody (line 90), and TestAppsDBRecoveryDiff_DryRunNormalizesTarget (line 175) access env.API[0] without a length check. If the unmarshal fails silently (the error is discarded with _ =), those tests will panic with an index-out-of-range instead of producing a useful failure message.

♻️ Add length guards to the remaining subtests

Apply the same pattern used at lines 320-322 to the other three subtests:

 var env dryRunAPIEnvelope
 _ = json.Unmarshal([]byte(stdout.String()), &env)
+if len(env.API) != 1 {
+	t.Fatalf("dry-run API calls = %d, want 1; stdout=%s", len(env.API), stdout.String())
+}
 a := env.API[0]
🤖 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_db_env_recovery_quota_test.go` around lines 318 - 322,
Add len(env.API) validation before every env.API[0] access in
TestAppsDBEnvDiff_DryRunBody, TestAppsDBEnvMigrate_DryRunBody, and
TestAppsDBRecoveryDiff_DryRunNormalizesTarget, matching the existing guard in
TestAppsDBQuotaGet_DryRunOmitsEnvWhenUnset. Preserve the same failure message
style, including the API count and captured stdout, so malformed or empty
unmarshaled responses fail clearly instead of panicking.
🤖 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 `@cmd/api/api_test.go`:
- Around line 1049-1065: Update TestApiCmd_DryRunWithFile to replace each
unchecked assertion for data, api, call, and body/file with checked assertions
using ok and t.Fatalf, matching the diagnostic pattern in TestApiCmd_DryRun;
retain the existing validation and failure messages for valid structure and file
values.
- Around line 185-199: Update TestApiCmd_EmptyMethodRejected to validate the
typed error returned by cmd.Execute: extract problem metadata with
errs.ProblemOf and assert the expected category and subtype, then use errors.As
to verify the parameter metadata identifies the HTTP method. Remove the
strings.Contains message assertion while preserving the existing nil-error
check.

---

Nitpick comments:
In `@shortcuts/apps/apps_db_env_recovery_quota_test.go`:
- Around line 318-322: Add len(env.API) validation before every env.API[0]
access in TestAppsDBEnvDiff_DryRunBody, TestAppsDBEnvMigrate_DryRunBody, and
TestAppsDBRecoveryDiff_DryRunNormalizesTarget, matching the existing guard in
TestAppsDBQuotaGet_DryRunOmitsEnvWhenUnset. Preserve the same failure message
style, including the API count and captured stdout, so malformed or empty
unmarshaled responses fail clearly instead of panicking.

In `@shortcuts/apps/apps_file_upload_test.go`:
- Line 80: Replace each discarded json.Unmarshal error with an if err guard that
calls t.Fatalf with the decode error in
shortcuts/apps/apps_file_upload_test.go:80-80,
shortcuts/apps/apps_db_changelog_list_test.go:41-41, and
shortcuts/apps/apps_file_sign_test.go:26-26. Apply the checks at the existing
dry-run response parsing sites before accessing env.API.

In `@shortcuts/common/runner_jq_test.go`:
- Around line 255-269: The dry-run response validation in the test uses untyped
maps and unchecked assertions that can panic on malformed output. Replace the
map-based decoding around env, data, api, and call with a small typed envelope
projection, using pointer booleans and context fields to distinguish missing
values; explicitly assert all required fields before accessing nested data,
while preserving the existing validation expectations.

In `@shortcuts/sheets/helpers_test.go`:
- Around line 255-262: Update dryRunAPIEntries to rely exclusively on the
unified envelope contract by returning entries only from dryRun["data"]["api"].
Remove the legacy top-level dryRun["api"] fallback while preserving the existing
success and failure behavior for missing or incorrectly typed nested data.

In `@tests/cli_e2e/drive/drive_member_add_dryrun_test.go`:
- Around line 307-333: Update the assertions in the dry-run test around bodyPath
to use clie2e.DryRunGet for all member_id, member_type, perm, type, and
perm_type lookups. Remove the hardcoded "data." prefix from bodyPath, preserve
the batch/non-batch paths and existing expectations, and remove the now-unused
gjson import.

In `@tests/cli_e2e/sheets/sheets_gridline_dryrun_test.go`:
- Around line 47-53: In the test flow around result.AssertExitCode, remove the
nil check and in-place mutation of result.Stdout. First require no error and
assert the exit code, then assign the output variable from
DryRunData(result.Stdout), matching the pattern used by the other dry-run tests.
🪄 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: 18ee93d7-fa8a-4764-a4fe-494a9fa9af36

📥 Commits

Reviewing files that changed from the base of the PR and between 4e44e51 and 636ab93.

📒 Files selected for processing (102)
  • AGENTS.md
  • 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/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/application/slash_command_delete_test.go
  • shortcuts/application/slash_command_update_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/sheets/lark_sheet_history_test.go
  • shortcuts/slides/slides_replace_pages_test.go
  • shortcuts/task/task_upload_attachment_test.go
  • tests/cli_e2e/application/slash_command_dryrun_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/docs/docs_fetch_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_list_comments_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_events_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 cmd/api/api_test.go
Comment thread cmd/api/api_test.go
@liangshuo-1
liangshuo-1 merged commit 37d490a into main Jul 14, 2026
40 checks passed
@liangshuo-1
liangshuo-1 deleted the fix/dry-run-output-contract-v2 branch July 14, 2026 02:54
@liangshuo-1 liangshuo-1 mentioned this pull request Jul 15, 2026
3 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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