Skip to content

fix: reduce base shortcut token overhead#1353

Closed
zhouyue-bytedance wants to merge 11 commits into
larksuite:mainfrom
zhouyue-bytedance:github-base-token-improve
Closed

fix: reduce base shortcut token overhead#1353
zhouyue-bytedance wants to merge 11 commits into
larksuite:mainfrom
zhouyue-bytedance:github-base-token-improve

Conversation

@zhouyue-bytedance

@zhouyue-bytedance zhouyue-bytedance commented Jun 9, 2026

Copy link
Copy Markdown
Collaborator

Summary

Reduce token overhead for Lark Base and Drive shortcut flows by improving field/table/record request shaping and documenting lower-token dashboard/import usage patterns.

Changes

  • Add lower-token Base record/table/field handling and related dry-run/unit coverage.
  • Improve Drive import/export shortcut behavior and tests for token-efficient flows.
  • Update Base and Drive skill references, including dashboard use-case guidance.

Test Plan

  • Unit tests pass: LARK_CLI_NO_PROXY= make unit-test
  • Manual local verification confirms the lark-cli <domain> <command> flow works as expected
  • Targeted tests pass: go test ./shortcuts/base ./shortcuts/drive
  • Static checks pass: go vet ./...
  • Formatting check passes: gofmt -l .
  • Dependency check passes: go mod tidy with no go.mod / go.sum diff
  • Lint passes: go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.1.6 run --new-from-rev=refs/remotes/github-upstream/main

Related Issues

  • None

Summary by CodeRabbit

  • New Features

    • Added +field-list-batch to fetch fields for multiple tables and a --compact flag for compact field output.
    • Record search accepts deprecated --query alias for --keyword (mutually exclusive with --keyword).
    • Import workflow now surfaces verification token/output when using --target-token.
  • Bug Fixes / Validation

    • Field-search flags now enforce a required field reference and validate aliasing.
  • Documentation

    • Expanded Base/dashboard/workflow/drive docs with batch guidance, verification steps, and many workflow step references.

@coderabbitai

coderabbitai Bot commented Jun 9, 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

This PR adds a new +field-list-batch command for multi-table field listing, enhances field search with reference fallback, adds record search --query aliasing, improves drive import verification output, and updates documentation with glossaries, batch guidance, and dashboard workflows.

Changes

Base field-list-batch and field search updates

Layer / File(s) Summary
Field-list-batch shortcut with compact mode
shortcuts/base/field_list.go, shortcuts/base/field_list_batch.go, shortcuts/base/field_ops.go, shortcuts/base/shortcuts.go, shortcuts/base/base_dryrun_ops_test.go, shortcuts/base/base_execute_test.go
New BaseFieldListBatch shortcut enables +field-list-batch --table-id (array) with optional --compact and pagination; both field_list and field_list_batch support compact output that projects fields to a subset of keys and normalizes options; dry-run generates one GET .../fields per table, and execute aggregates results into {tables: [...], total: count}.
Field search reference resolution and validation
shortcuts/base/field_search_options.go, shortcuts/base/field_ops.go, shortcuts/base/base_shortcuts_test.go
Field search adds hidden --field-name alias, computes unified reference (preferring --field-id), and validates trimmed reference is non-empty; dry-run and execute use the resolved reference for API calls; tests verify both alias resolution and validation error messages.
Record search --query alias and mutual-exclusion
shortcuts/base/record_search.go, shortcuts/base/record_query.go, shortcuts/base/base_execute_test.go, shortcuts/base/base_shortcuts_test.go
Record search registers hidden deprecated --query flag as fallback for --keyword, implements recordSearchKeyword helper to resolve effective keyword, validates --query and --keyword are mutually exclusive, and updates request/validation logic; tests confirm alias mapping and error handling.
Base test catalog and minor refactoring
shortcuts/base/base_shortcuts_test.go, shortcuts/base/table_ops.go
Shortcut catalog updated to include +field-list-batch; table-ops extracts baseToken variable for code clarity.

Drive import verification output

Layer / File(s) Summary
Target-token verification fields
shortcuts/drive/drive_import.go, shortcuts/drive/drive_import_test.go, skills/lark-drive/references/lark-drive-import.md
When --target-token is provided, drive import output now includes verification_token, verification_url, and verify_hint fields guiding post-import verification; help text updated; tests and docs clarify the verification flow and warn against reusing import task tokens.

Documentation updates

Layer / File(s) Summary
Base SKILL and batching guidance
skills/lark-base/SKILL.md, skills/lark-base/references/dashboard-block-data-config.md
SKILL.md adds terminology glossary (Base/table/field/record/view/form/workflow/dashboard/chart) and disambiguates block, introduces batch-execution section recommending +field-list-batch for multi-table field pulls, reorganizes write-precondition guidance with dedicated subsections, and updates dashboard reference list; dashboard data-config reference documents batch field-retrieval strategy.
Dashboard workflows and constraints
skills/lark-base/references/lark-base-dashboard-usecase.md, skills/lark-base/references/lark-base-dashboard.md
New dashboard use-case guide provides workflows for creation, component management, layout arrangement, and state queries; includes FAQs on constraints and concurrency; dashboard module guide adds hard rules for not_found/title-update scenarios and execution-point ordering.
Minor field and workflow clarifications
skills/lark-base/references/lark-base-field-json.md, skills/lark-base/references/lark-base-workflow-guide.md
Auto-number field update note clarifies +field-update default behavior; workflow guide adds reading-rhythm hint for efficient schema navigation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • larksuite/cli#328: Adds the original +record-search shortcut that is now enhanced with the --query alias and mutual-exclusion validation in this PR.
  • larksuite/cli#1228: Overlaps with record-search request-body construction and validation changes around keyword and --json handling.
  • larksuite/cli#374: Documentation updates to skills/lark-base/SKILL.md related to routing and guidance similar to this PR.

Suggested reviewers

  • kongenpei
  • zgz2048

🐰 A batch of fields in sight,
Aliases shining oh so bright,
Drive tokens verified with care,
Dashboard docs now everywhere—
Multi-table joy takes flight! ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 6.25% 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 'fix: reduce base shortcut token overhead' clearly summarizes the primary change—optimizing token usage in Base shortcut flows—and is specific and concise.
Description check ✅ Passed The PR description includes all required sections: Summary (motivation and scope), Changes (main modifications listed), Test Plan (with checkboxes and verification steps), and Related Issues. Most test checks are marked complete.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 and usage tips.

@github-actions github-actions Bot added domain/base PR touches the base domain domain/ccm PR touches the ccm domain size/L Large or sensitive change across domains or core paths labels Jun 9, 2026
@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown

🚀 PR Preview Install Guide

🧰 CLI update

npm i -g https://pkg.pr.new/larksuite/cli/@larksuite/cli@6fb3d8da998f7f8f4f9c3cfe8176f20b26f1309a

🧩 Skill update

npx skills add zhouyue-bytedance/cli#github-base-token-improve -y -g

@codecov

codecov Bot commented Jun 9, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 90.47619% with 12 lines in your changes missing coverage. Please review.
✅ Project coverage is 72.03%. Comparing base (7229baa) to head (6fb3d8d).
⚠️ Report is 13 commits behind head on main.

Files with missing lines Patch % Lines
shortcuts/base/field_ops.go 83.07% 6 Missing and 5 partials ⚠️
shortcuts/base/table_ops.go 0.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1353      +/-   ##
==========================================
+ Coverage   71.58%   72.03%   +0.44%     
==========================================
  Files         689      700      +11     
  Lines       65521    66395     +874     
==========================================
+ Hits        46901    47825     +924     
+ Misses      14972    14857     -115     
- Partials     3648     3713      +65     

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

@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 (1)
shortcuts/base/base_execute_test.go (1)

858-887: ⚡ Quick win

Assert the top-level multi-table total to lock output contract.

The new multi-table test checks table payload content but doesn’t verify the aggregate total, so regressions in that field can slip through unnoticed.

Suggested test assertion
 		got := stdout.String()
-		if !strings.Contains(got, `"tables"`) || !strings.Contains(got, `"table_id": "tbl_a"`) || !strings.Contains(got, `"table_id": "tbl_b"`) || !strings.Contains(got, `"options": [`) || !strings.Contains(got, `"Todo"`) || strings.Contains(got, `"style"`) || strings.Contains(got, `"color"`) {
+		if !strings.Contains(got, `"tables"`) || !strings.Contains(got, `"table_id": "tbl_a"`) || !strings.Contains(got, `"table_id": "tbl_b"`) || !strings.Contains(got, `"total": 2`) || !strings.Contains(got, `"options": [`) || !strings.Contains(got, `"Todo"`) || strings.Contains(got, `"style"`) || strings.Contains(got, `"color"`) {
 			t.Fatalf("stdout=%s", got)
 		}
🤖 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/base/base_execute_test.go` around lines 858 - 887, The test "list
multiple tables" doesn't assert the aggregate/top-level total in the multi-table
response; update the test (within the t.Run block that calls runShortcut with
BaseFieldList and stdout) to verify the top-level "total" equals the expected
combined count (e.g., 2) by either parsing stdout as JSON and asserting total ==
2 or checking stdout contains the string `"total": 2`; reference the variables
reg.Register, runShortcut, BaseFieldList and stdout to locate and modify the
assertion.
🤖 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/base/field_ops.go`:
- Around line 262-268: The fieldSearchOptionsRef function returns a field
reference that may contain leading/trailing whitespace because only the
emptiness check trims it; update the function to trim the resolved value before
returning (i.e., call strings.TrimSpace on the final fieldRef obtained from
runtime.Str("field-id") or runtime.Str("field-name")) so the returned string is
normalized and safe to use when building the /fields/{ref}/options request path.
- Around line 164-173: The helper fieldListTableRefs forwards raw values from
runtime.StrArray("table-id") which can include duplicates and space-padded
entries; update fieldListTableRefs to normalize each ref by trimming whitespace,
ignore empty strings, and deduplicate while preserving order (use a seen map)
before returning; if the array is empty fall back to baseTableID() (also
normalize that value) so all returned refs are normalized and unique.

---

Nitpick comments:
In `@shortcuts/base/base_execute_test.go`:
- Around line 858-887: The test "list multiple tables" doesn't assert the
aggregate/top-level total in the multi-table response; update the test (within
the t.Run block that calls runShortcut with BaseFieldList and stdout) to verify
the top-level "total" equals the expected combined count (e.g., 2) by either
parsing stdout as JSON and asserting total == 2 or checking stdout contains the
string `"total": 2`; reference the variables reg.Register, runShortcut,
BaseFieldList and stdout to locate and modify the assertion.
🪄 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: 8f9e64d6-0892-4b8c-bbba-1026e01dcfb2

📥 Commits

Reviewing files that changed from the base of the PR and between 7229baa and 092388e.

📒 Files selected for processing (23)
  • shortcuts/base/base_dryrun_ops_test.go
  • shortcuts/base/base_execute_test.go
  • shortcuts/base/base_shortcuts_test.go
  • shortcuts/base/field_list.go
  • shortcuts/base/field_ops.go
  • shortcuts/base/field_search_options.go
  • shortcuts/base/record_delete.go
  • shortcuts/base/record_get.go
  • shortcuts/base/record_list.go
  • shortcuts/base/record_ops.go
  • shortcuts/base/record_query.go
  • shortcuts/base/record_search.go
  • shortcuts/base/record_share_link_create.go
  • shortcuts/base/table_ops.go
  • shortcuts/drive/drive_export_common.go
  • shortcuts/drive/drive_export_test.go
  • shortcuts/drive/drive_import.go
  • shortcuts/drive/drive_import_test.go
  • skills/lark-base/SKILL.md
  • skills/lark-base/references/dashboard-block-data-config.md
  • skills/lark-base/references/lark-base-dashboard-usecase.md
  • skills/lark-base/references/lark-base-dashboard.md
  • skills/lark-drive/references/lark-drive-import.md

Comment thread shortcuts/base/field_ops.go Outdated
Comment on lines +164 to +173
func fieldListTableRefs(runtime *common.RuntimeContext) []string {
refs := runtime.StrArray("table-id")
if len(refs) == 0 {
ref := baseTableID(runtime)
if ref != "" {
refs = []string{ref}
}
}
return refs
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Normalize and deduplicate --table-id refs before issuing requests.

Line 165 currently forwards raw array values, so repeated/space-padded refs can generate duplicate or malformed field-list calls and inflate token usage.

Suggested fix
 func fieldListTableRefs(runtime *common.RuntimeContext) []string {
-	refs := runtime.StrArray("table-id")
-	if len(refs) == 0 {
-		ref := baseTableID(runtime)
-		if ref != "" {
-			refs = []string{ref}
-		}
-	}
-	return refs
+	raw := runtime.StrArray("table-id")
+	refs := make([]string, 0, len(raw))
+	seen := make(map[string]struct{}, len(raw))
+	for _, ref := range raw {
+		ref = strings.TrimSpace(ref)
+		if ref == "" {
+			continue
+		}
+		if _, ok := seen[ref]; ok {
+			continue
+		}
+		seen[ref] = struct{}{}
+		refs = append(refs, ref)
+	}
+	if len(refs) == 0 {
+		ref := strings.TrimSpace(baseTableID(runtime))
+		if ref != "" {
+			refs = []string{ref}
+		}
+	}
+	return refs
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
func fieldListTableRefs(runtime *common.RuntimeContext) []string {
refs := runtime.StrArray("table-id")
if len(refs) == 0 {
ref := baseTableID(runtime)
if ref != "" {
refs = []string{ref}
}
}
return refs
}
func fieldListTableRefs(runtime *common.RuntimeContext) []string {
raw := runtime.StrArray("table-id")
refs := make([]string, 0, len(raw))
seen := make(map[string]struct{}, len(raw))
for _, ref := range raw {
ref = strings.TrimSpace(ref)
if ref == "" {
continue
}
if _, ok := seen[ref]; ok {
continue
}
seen[ref] = struct{}{}
refs = append(refs, ref)
}
if len(refs) == 0 {
ref := strings.TrimSpace(baseTableID(runtime))
if ref != "" {
refs = []string{ref}
}
}
return refs
}
🤖 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/base/field_ops.go` around lines 164 - 173, The helper
fieldListTableRefs forwards raw values from runtime.StrArray("table-id") which
can include duplicates and space-padded entries; update fieldListTableRefs to
normalize each ref by trimming whitespace, ignore empty strings, and deduplicate
while preserving order (use a seen map) before returning; if the array is empty
fall back to baseTableID() (also normalize that value) so all returned refs are
normalized and unique.

Comment thread shortcuts/base/field_ops.go
Comment thread shortcuts/base/record_list.go Outdated
recordFilterFlag(),
{Name: recordFilterAliasFlag, Hidden: true, Input: []string{common.File}},
recordSortFlag(),
{Name: recordSortAliasFlag, Hidden: true, Input: []string{common.File}},

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

这是什么参数?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

模型会把 sort-json参数误写成sort,为了减少失败重试轮次,认为sort也作为合法参数

{Name: "record-id", Type: "string_array", Desc: "record ID (repeatable)"},
{Name: "record-ids", Type: "string_array", Hidden: true},
{Name: "field-id", Type: "string_array", Desc: "field ID or name to project; repeat to keep only needed columns"},
{Name: "field-names", Type: "string_array", Hidden: true},

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

为什么是string_array?这个 flag 直觉上是输入 --field-names '["field1", ...]' 而不是 --field-names field1

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

此 mr 引入的所有 -ids -names 都有这个问题,其他的 flag 不重复评论

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

field-names等价于field-id,模型会把field-id误写为field-names


硬规则:

- 删除并用 `+dashboard-get` 复核 `not_found` 后,用户只回复“确认/好的/收到”视为结束,不要再次创建或保留同名/正式版仪表盘。

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

用户只回复“确认/好的/收到”视为结束 这个约束的作用是什么?看起来非常反常

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

你说的对,这个应该是针对评测集过拟合了。

硬规则:

- 删除并用 `+dashboard-get` 复核 `not_found` 后,用户只回复“确认/好的/收到”视为结束,不要再次创建或保留同名/正式版仪表盘。
- 用户只说“更新标题”但未给新标题时,可基于原名生成一次新标题;先用 `+dashboard-list` 避开已存在名称,遇同名冲突换名更新,不要创建新仪表盘。

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

与上一行一样,这个变更非常反常,建议撤销

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

OK

Comment thread shortcuts/base/field_ops.go Outdated
if !runtime.Bool("full") {
fields = compactFields(fields)
}
results = append(results, map[string]interface{}{

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

这一个 shortcut 在不同输入的情况下,返回的数据结构不一致,ai 容易误处理返回值

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

因为多个场景,都会需要base下所有表的schema,现在做法得每个表 field-list,轮次比较多。所以提供一个批量接口。在field-list接口加批量不合适的话,新加一个接口?

- revert field-list multi-table change; add dedicated +field-list-batch shortcut
- make compact field output opt-in via --compact, default stays full (avoid breaking change)
- compact output now keeps style
- SKILL.md: drop 执行节奏/导出导入快路径 sections, restore Dashboard/Workflow/Role wording, sink new guidance into dashboard/workflow references
- SKILL.md: add glossary (base-block vs dashboard-block disambiguation), batch-execution and help-first rules
- field-json: note auto_number rule updates apply to existing records by default
@zhouyue-bytedance
zhouyue-bytedance force-pushed the github-base-token-improve branch from 6fb3d8d to 3a8e86d Compare June 10, 2026 09:18
…rt 改造

Change-Id: Ie7fc9ff22509ec4b69b04f3c3b6c58cfbeb2ca88
Comment thread skills/lark-base/SKILL.md
示例——一次取多个视图的配置:

```bash
for v in vewAAA vewBBB vewCCC; do

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

发现用这个 script 反而 token 数比使用 field-list-batch 更省。并且调用风格更统一,ai 可以凭直觉重复


默认值 / 约束:
- `style.rules` 是规则数组,数量 `1..9`
- `+field-update` 修改编号规则时,**默认会把新规则应用到已有记录**

@zgz2048 zgz2048 Jun 10, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

建议加到 AutoNumber 字段的描述下,修改自动编号规则时,会自动更新所有已有单元格

Change-Id: Iaacc2ff5211e34f121aed46f01b0646ea7ed71b1
@github-actions github-actions Bot added size/XL Architecture-level or global-impact change and removed size/L Large or sensitive change across domains or core paths labels Jun 10, 2026
yballul-bytedance and others added 6 commits June 11, 2026 15:23
- slim lark-base SKILL.md 6105->4719 tokens: drop 保留Reference chapter, condense caveat sections, sink write rules into cell-value.md; make help-first rule conditional for trivial commands
- split formula-field-guide.md (9744->7243 tokens): move 37 rare functions to formula-functions-extended.md, move examples/requirement-translation to formula-examples.md; compress table padding
- suggest: add containment signal so namespace-dropping guesses (+block-list -> +base-block-list) get did-you-mean hints
- workflow docs: state that "add OR modify with same condition" is a single ChangeRecordTrigger workflow at guide/schema/leaf levels
- batch-execution note: scripts should print counts/ids/failures only, not full payloads
…e-bytedance/cli into github-base-token-improve

# Conflicts:
#	skills/lark-base/SKILL.md
#	skills/lark-base/references/lark-base-workflow-guide.md
…cuts

Evidence-driven from 3 eval rounds of actual agent flag guesses:

- projection aliases --field-names/--fields on record-list/search/get;
  --record-ids on record-get; --query on field-search-options;
  --filter/--sort on record-list/search (canonical+alias rejects with
  "use only one")
- plural aliases accept repeated values, JSON arrays and comma-separated
  ids (comma split guarded by id prefix to protect names with commas)
- cross-source dedupe: same value via canonical flag and alias is sent
  once; in-source duplicates still rejected downstream
- misuse hints: record-list --json and data-query --table-id now return
  actionable errors; dashboard-block-get-data accepts --dashboard-id
- SKILL.md: reorder 批量执行 before 善用 help, conditional help wording
Eval traces show comma-joined values on --field-names/--fields/--record-ids
are exclusively lists (mostly field names), so the fld/rec prefix guard
blocked every real usage and a trailing comma broke id lists too. Rule is
now: singular flags stay literal (escape hatch for names containing a
comma), plural aliases treat ASCII comma as separator; fullwidth "," is
never split.
@zhouyue-bytedance

Copy link
Copy Markdown
Collaborator Author

Superseded by a new PR from the same branch — recreating so pkg.pr.new regenerates the install command against the current head (the old pinned commit 6fb3d8d was orphaned by a force-push).

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

Labels

domain/base PR touches the base domain domain/ccm PR touches the ccm domain size/XL Architecture-level or global-impact change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants