Skip to content

feat: support send/reply card 2.0#402

Open
91-enjoy wants to merge 1 commit intolarksuite:mainfrom
91-enjoy:feat/support_send_card_2.0
Open

feat: support send/reply card 2.0#402
91-enjoy wants to merge 1 commit intolarksuite:mainfrom
91-enjoy:feat/support_send_card_2.0

Conversation

@91-enjoy
Copy link
Copy Markdown
Contributor

@91-enjoy 91-enjoy commented Apr 10, 2026

Change-Id: I5e5cdfb37946af52ef7a2a812460e50fa8b09e9c

Summary

im +messages-send and im +messages-reply already support interactive card payloads, but the IM skill currently lacks a concrete Card 2.0 example library and explicit guidance on how agents should study examples before composing
a card.

This PR adds a curated card-examples library under skills/lark-im and updates the send/reply references so Card 2.0 tasks follow a consistent reading path: read the structure docs, read only the necessary component docs, then
pick 1-2 relevant local examples instead of scanning the whole example set.

Changes

  • skills/lark-im/card-examples/*.json:

    • Add 28 interactive Card 2.0 JSON examples covering common IM card scenarios:
      • AI assistant / onboarding / recommendation cards
      • alert and approval flows
      • article, newsletter, and announcement cards
      • daily report, dashboard, and leaderboard cards
      • form, feedback, and service workflow cards
      • greeting, travel, and social-sharing cards
    • Include representative patterns such as multi-locale content, callback/open_url actions, forms and selects, charts/tables, image-heavy layouts, and reusable interactive containers
  • skills/lark-im/references/lark-im-messages-send.md:

    • Add an Interactive Cards section for Card 2.0 usage
    • Document the required reading order for official structure/component docs
    • Require choosing 1-2 relevant examples under ../card-examples before composing the final card, and explicitly forbid reading the whole folder
  • skills/lark-im/references/lark-im-messages-reply.md:

    • Add the same Card 2.0 guidance for reply flows
    • Keep send/reply example-selection rules aligned
  • skills/lark-im/SKILL.md:

    • Mark +messages-send and +messages-reply as mandatory reads before interactive card operations

Test Plan

  • make unit-test
    • Local run is currently blocked because the local toolchain is go1.15, which rejects go 1.23.0 in go.mod
  • jq empty skills/lark-im/card-examples/*.json
  • Manual review confirms the new Card 2.0 guidance is present in both im +messages-send and im +messages-reply
  • Manual review confirms the example library is available under skills/lark-im/card-examples and covers common daily IM card scenarios

Related Issues

  • None

Summary by CodeRabbit

  • Documentation
    • Added a mandatory warning requiring operators to read the send/reply reference guides before performing interactive card send/reply operations.
    • Added “Interactive Cards” guidance to message send/reply docs with a recommended pre-composition workflow and reference links.
  • New Examples
    • Added 28 new interactive Lark/Feishu card templates covering AI, approvals, alerts, notifications, reports, forms, galleries, onboarding, and more.

@github-actions github-actions bot added domain/im PR touches the im domain size/XL Architecture-level or global-impact change labels Apr 10, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 10, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2b578a63-53a0-42ef-a829-50fbed32535e

📥 Commits

Reviewing files that changed from the base of the PR and between 9763c79 and 813c912.

📒 Files selected for processing (31)
  • skills/lark-im/SKILL.md
  • skills/lark-im/card-examples/ai-calendar-creation.json
  • skills/lark-im/card-examples/ai-chat-welcome.json
  • skills/lark-im/card-examples/ai-curated-recommendations.json
  • skills/lark-im/card-examples/ai-image-generation.json
  • skills/lark-im/card-examples/alert-initiation.json
  • skills/lark-im/card-examples/alert-resolved.json
  • skills/lark-im/card-examples/approval-approved.json
  • skills/lark-im/card-examples/approval-reminder.json
  • skills/lark-im/card-examples/article-with-images.json
  • skills/lark-im/card-examples/beta-feature-recruitment.json
  • skills/lark-im/card-examples/bot-tutorial-welcome.json
  • skills/lark-im/card-examples/daily-report-of-codebase.json
  • skills/lark-im/card-examples/daily-work-summary.json
  • skills/lark-im/card-examples/data-report-dashboard.json
  • skills/lark-im/card-examples/deal-won-announcement.json
  • skills/lark-im/card-examples/equipment-pickup-notification.json
  • skills/lark-im/card-examples/equipment-service-feedback.json
  • skills/lark-im/card-examples/event-announcement.json
  • skills/lark-im/card-examples/order-confirmation-approval.json
  • skills/lark-im/card-examples/personal-birthday-greeting.json
  • skills/lark-im/card-examples/product-newsletter.json
  • skills/lark-im/card-examples/project-assistant-form.json
  • skills/lark-im/card-examples/sales-leaderboard.json
  • skills/lark-im/card-examples/smart-locker-launch.json
  • skills/lark-im/card-examples/streaming-service-desk.json
  • skills/lark-im/card-examples/team-birthday-greeting.json
  • skills/lark-im/card-examples/travel-hotel-recommendations.json
  • skills/lark-im/card-examples/workplace-social-share.json
  • skills/lark-im/references/lark-im-messages-reply.md
  • skills/lark-im/references/lark-im-messages-send.md
✅ Files skipped from review due to trivial changes (28)
  • skills/lark-im/SKILL.md
  • skills/lark-im/references/lark-im-messages-send.md
  • skills/lark-im/references/lark-im-messages-reply.md
  • skills/lark-im/card-examples/team-birthday-greeting.json
  • skills/lark-im/card-examples/travel-hotel-recommendations.json
  • skills/lark-im/card-examples/workplace-social-share.json
  • skills/lark-im/card-examples/daily-work-summary.json
  • skills/lark-im/card-examples/alert-initiation.json
  • skills/lark-im/card-examples/equipment-pickup-notification.json
  • skills/lark-im/card-examples/bot-tutorial-welcome.json
  • skills/lark-im/card-examples/alert-resolved.json
  • skills/lark-im/card-examples/deal-won-announcement.json
  • skills/lark-im/card-examples/event-announcement.json
  • skills/lark-im/card-examples/ai-calendar-creation.json
  • skills/lark-im/card-examples/beta-feature-recruitment.json
  • skills/lark-im/card-examples/personal-birthday-greeting.json
  • skills/lark-im/card-examples/ai-image-generation.json
  • skills/lark-im/card-examples/project-assistant-form.json
  • skills/lark-im/card-examples/sales-leaderboard.json
  • skills/lark-im/card-examples/smart-locker-launch.json
  • skills/lark-im/card-examples/streaming-service-desk.json
  • skills/lark-im/card-examples/product-newsletter.json
  • skills/lark-im/card-examples/approval-reminder.json
  • skills/lark-im/card-examples/ai-curated-recommendations.json
  • skills/lark-im/card-examples/equipment-service-feedback.json
  • skills/lark-im/card-examples/daily-report-of-codebase.json
  • skills/lark-im/card-examples/article-with-images.json
  • skills/lark-im/card-examples/order-confirmation-approval.json
🚧 Files skipped from review as they are similar to previous changes (3)
  • skills/lark-im/card-examples/data-report-dashboard.json
  • skills/lark-im/card-examples/approval-approved.json
  • skills/lark-im/card-examples/ai-chat-welcome.json

📝 Walkthrough

Walkthrough

Adds 30+ new Feishu/Lark interactive card JSON examples under skills/lark-im and minor documentation updates: insert a mandatory warning in SKILL.md and add guidance for using Card Schema v2.0 in send/reply reference docs.

Changes

Cohort / File(s) Summary
Core Documentation
skills/lark-im/SKILL.md, skills/lark-im/references/lark-im-messages-send.md, skills/lark-im/references/lark-im-messages-reply.md
Inserted a mandatory warning to read +messages-send and +messages-reply before sending/replying interactive cards; added guidance recommending Card JSON schema v2.0 and an ordered example-selection workflow.
AI Feature Cards
skills/lark-im/card-examples/ai-calendar-creation.json, skills/lark-im/card-examples/ai-chat-welcome.json, skills/lark-im/card-examples/ai-curated-recommendations.json, skills/lark-im/card-examples/ai-image-generation.json
New AI-focused interactive card templates (calendar creation, chat welcome, curated recommendations, image generation) using card schema 2.0 and update_multi: true.
Alerts & Approvals
skills/lark-im/card-examples/alert-initiation.json, skills/lark-im/card-examples/alert-resolved.json, skills/lark-im/card-examples/approval-approved.json, skills/lark-im/card-examples/approval-reminder.json
Added alert and approval card templates with forms, callbacks, localized text, and status placeholders.
Content, Reports & Newsletters
skills/lark-im/card-examples/article-with-images.json, skills/lark-im/card-examples/daily-report-of-codebase.json, skills/lark-im/card-examples/daily-work-summary.json, skills/lark-im/card-examples/data-report-dashboard.json, skills/lark-im/card-examples/product-newsletter.json, skills/lark-im/card-examples/deal-won-announcement.json
Multiple new cards for articles, daily/codebase reports, dashboards, newsletters, and announcements with structured layouts, KPIs, and images.
Event & Social Cards
skills/lark-im/card-examples/event-announcement.json, skills/lark-im/card-examples/workplace-social-share.json, skills/lark-im/card-examples/bot-tutorial-welcome.json
Event announcements, social-share, and bot-tutorial welcome templates with localized text and action buttons.
Equipment, Feedback & Forms
skills/lark-im/card-examples/equipment-pickup-notification.json, skills/lark-im/card-examples/equipment-service-feedback.json, skills/lark-im/card-examples/project-assistant-form.json
Cards for device pickup, service-feedback (form controls), and project assistant form (person/select/input fields, submit actions).
Order, Booking & Travel
skills/lark-im/card-examples/order-confirmation-approval.json, skills/lark-im/card-examples/travel-hotel-recommendations.json, skills/lark-im/card-examples/personal-birthday-greeting.json, skills/lark-im/card-examples/team-birthday-greeting.json
Order confirmation, travel/hotel recommendation rows, and personal/team birthday greeting templates with CTAs and links.
Marketing & Engagement
skills/lark-im/card-examples/beta-feature-recruitment.json, skills/lark-im/card-examples/product-newsletter.json, skills/lark-im/card-examples/article-with-images.json
Promotional/recruitment and newsletter templates with styled interactive containers and CTAs.
Visuals, Leaderboards & Utility
skills/lark-im/card-examples/ai-image-generation.json, skills/lark-im/card-examples/sales-leaderboard.json, skills/lark-im/card-examples/smart-locker-launch.json
Image gallery, sales leaderboard, and smart-locker announcement templates.
Streaming & Advanced Example
skills/lark-im/card-examples/streaming-service-desk.json
New card demonstrating streaming updates (streaming_text element and instructional content).

Estimated Code Review Effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

domain/ccm, size/L

Suggested Reviewers

  • zhouyue-bytedance
  • chanthuang

Poem

🥕 I hopped through JSON fields tonight,
Cards and buttons tucked in tight.
Forms and images, colors bright,
I stitched each payload by moonlight.
Happy hops — the cards take flight! 🐰

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding Card 2.0 support to send/reply operations.
Description check ✅ Passed The description follows the required template with Summary, Changes, Test Plan, and Related Issues sections, providing comprehensive details about the card examples library and updated guidance.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@greptile-apps
Copy link
Copy Markdown

greptile-apps bot commented Apr 10, 2026

Greptile Summary

This PR adds 28 Card 2.0 JSON example templates under skills/lark-im/card-examples/ and updates the +messages-send and +messages-reply reference guides with a structured reading workflow (structure doc → component overview → specific component docs → 1-2 relevant examples) and mandatory-read markers in SKILL.md. The documentation additions are well-structured and the majority of examples are high-quality.

Two copy-paste content errors exist in the example library that agents could learn as correct patterns:

  • order-confirmation-approval.json: the "支付账期" (Payment Term) row's i18n_content carries the "Invoice First, Payment After" translations from the row above it instead of the correct 14-day term text.
  • alert-resolved.json (and alert-initiation.json): the ja_jp header title is \"注文確認待ち\" ("Order Pending Confirmation") — copied from the order-confirmation card rather than being an alert-resolution title.

Confidence Score: 4/5

Safe to merge after fixing two copy-paste i18n content errors in the example library that would teach agents incorrect translation patterns.

Two P1 content errors exist in the example JSON files: wrong i18n translations in order-confirmation-approval.json and a semantically wrong Japanese alert title in alert-resolved.json (and alert-initiation.json). Since these are LLM training examples, incorrect patterns can propagate into agent-generated cards. The documentation changes (SKILL.md, send/reply references) are clean and correct.

skills/lark-im/card-examples/order-confirmation-approval.json (payment term i18n copy-paste), skills/lark-im/card-examples/alert-resolved.json and alert-initiation.json (wrong Japanese title "注文確認待ち")

Important Files Changed

Filename Overview
skills/lark-im/SKILL.md Adds MANDATORY READ warning for +messages-send and +messages-reply before any interactive card operations; wiring is correct and consistent.
skills/lark-im/references/lark-im-messages-send.md Adds well-structured Interactive Cards section with clear reading order (structure → component overview → specific components → 1-2 examples); guidance is clear and actionable.
skills/lark-im/references/lark-im-messages-reply.md Adds identical Card 2.0 guidance to the reply flow; mirrors the send reference correctly with the same reading workflow and example-selection rules.
skills/lark-im/card-examples/order-confirmation-approval.json Contains a copy-paste error where the "支付账期" (Payment Term) row's i18n translations show "Invoice First, Payment After" instead of the correct 14-day payment term text.
skills/lark-im/card-examples/alert-resolved.json Header's ja_jp i18n_content is "注文確認待ち" (Order Pending Confirmation) — a copy-paste from the order-confirmation card rather than an alert-resolution title; same wrong string is in alert-initiation.json.
skills/lark-im/card-examples/alert-initiation.json Has ja_jp locale in header i18n_content ("注文確認待ち") but config.locales only declares en_us; also semantically wrong Japanese title (already flagged in previous review).
skills/lark-im/card-examples/ai-chat-welcome.json Well-structured welcome card with proper multi-locale config (zh_cn, en_us, ja_jp), custom colors, and interactive_container patterns; good reference example.
skills/lark-im/card-examples/project-assistant-form.json Demonstrates form with select_person, select_static, and input components with submit/cancel buttons; solid form pattern example.
skills/lark-im/card-examples/streaming-service-desk.json Shows streaming card content with number_tag and link components; related-question buttons have no behaviors, but these appear intentionally display-only in this context.
skills/lark-im/card-examples/data-report-dashboard.json Good example of bar chart + table components together; represents dashboard pattern clearly with color-coded KPI columns.
skills/lark-im/card-examples/ai-calendar-creation.json body.direction is "horizontal" (likely copy-paste mismatch); action buttons lack behaviors arrays (already flagged in prior review).

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Agent receives card task] --> B{Card type?}
    B -->|Interactive / complex| C[Read SKILL.md mandatory section]
    B -->|Plain text / post| Z[Use --text or --markdown flag]
    C --> D[Read +messages-send or +messages-reply reference]
    D --> E[Read Card 2.0 structure doc]
    E --> F[Read component overview doc]
    F --> G[Read only necessary component detail docs]
    G --> H[Choose 1-2 relevant examples from card-examples/]
    H --> I[Compose card JSON]
    I --> J[Send via --content flag with msg_type interactive]
Loading

Reviews (3): Last reviewed commit: "# This is a combination of 2 commits." | Re-trigger Greptile

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 18

🧹 Nitpick comments (9)
skills/lark-im/card-examples/equipment-pickup-notification.json (1)

157-157: Consider adding a trailing newline.

JSON files should end with a newline for better POSIX compliance and cleaner git diffs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/equipment-pickup-notification.json` at line 157,
The file ends with a closing brace '}' but lacks a trailing newline; open
skills/lark-im/card-examples/equipment-pickup-notification.json and ensure there
is a single newline character after the final '}' (i.e., add a trailing newline
at EOF) to satisfy POSIX/good-git-diff conventions.
skills/lark-im/card-examples/team-birthday-greeting.json (1)

94-94: Consider adding a trailing newline.

JSON files should end with a newline for better POSIX compliance and cleaner git diffs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/team-birthday-greeting.json` at line 94, Add a
trailing newline to the JSON file by ensuring the final closing brace '}' in
team-birthday-greeting.json is followed by a single '\n' character so the file
ends with a newline (POSIX-compliant and cleaner diffs).
skills/lark-im/card-examples/smart-locker-launch.json (1)

115-115: Consider adding a trailing newline.

JSON files should end with a newline for better POSIX compliance and cleaner git diffs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/smart-locker-launch.json` at line 115, The file
ends with a closing brace '}' but lacks a trailing newline; update
skills/lark-im/card-examples/smart-locker-launch.json by adding a single newline
character at EOF so the file ends with '\n' for POSIX compliance and cleaner git
diffs.
skills/lark-im/card-examples/equipment-service-feedback.json (1)

227-227: Consider adding a trailing newline.

JSON files should end with a newline for better POSIX compliance and cleaner git diffs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/equipment-service-feedback.json` at line 227,
The file ends with a closing brace '}' but lacks a trailing newline; open the
JSON file (look for the final '}' in equipment-service-feedback.json) and add a
single newline character at EOF so the file terminates with a trailing newline
for POSIX compliance and cleaner diffs.
skills/lark-im/card-examples/daily-report-of-codebase.json (1)

241-241: Consider adding a trailing newline.

JSON files should end with a newline for better POSIX compliance and cleaner git diffs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/daily-report-of-codebase.json` at line 241, The
JSON file skills/lark-im/card-examples/daily-report-of-codebase.json is missing
a trailing newline; open that file and add a single newline character after the
final closing brace (ensure the file ends with "\n") so it conforms to POSIX
conventions and produces cleaner git diffs.
skills/lark-im/card-examples/ai-chat-welcome.json (1)

21-52: Deduplicate equivalent custom color definitions.

The color entries in Line 21–Line 52 repeat the same RGBA values under different keys. Keeping one set improves maintainability and reduces accidental drift.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/ai-chat-welcome.json` around lines 21 - 52,
Several color entries (color_dtgiw98jw3s, color_7u3svrs1gk, color_aedgx4h5lst,
color_5fjelryhkr7, color_cpi1ty18y07, color_9uxmooevtbs, color_yshuzkazoo,
color_bqm6462lklw) define identical light/dark RGBA values; consolidate them by
keeping one canonical key for each unique RGBA pair (e.g., keep
color_dtgiw98jw3s and color_aedgx4h5lst for the two distinct pairs) and remove
the duplicate keys, and then update all usages/references in the project to
point to the retained canonical keys so behavior is unchanged.
skills/lark-im/card-examples/approval-reminder.json (1)

225-235: Use margin/spacing instead of an empty spacer column.

The empty column in Line 225–Line 235 can be removed to simplify structure without behavior change.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/approval-reminder.json` around lines 225 - 235,
Remove the empty column object (the JSON node with "tag": "column" and
"elements": []) from the card definition and rely on existing margin/spacing
properties (e.g., "horizontal_spacing", "vertical_spacing", "margin") on
neighboring elements to preserve layout; delete that entire empty column block
and, if needed, adjust the surrounding container's
"horizontal_spacing"/"vertical_spacing" or the adjacent column's "margin" to
maintain the intended spacing.
skills/lark-im/card-examples/ai-image-generation.json (1)

277-301: Icon-only action buttons should include visible labels.

Buttons at lines 277, 316, and 355 define empty text.content and rely on hover_tips only. This approach is weak on touch/mobile devices and fails accessibility requirements—hover tooltips are inaccessible to keyboard users and non-existent on touch interfaces. Consider adding descriptive text to the text.content field for each button.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/ai-image-generation.json` around lines 277 -
301, Button definitions using only an icon (e.g., the button with element_id
"a1" and the other icon-only buttons at the next two spots) have empty
text.content and rely on hover_tips, which breaks accessibility on
touch/keyboard devices; update each button's "text.content" from "" to a short
descriptive label (for example "Regenerate" for the refresh action) while
keeping the existing icon and behaviors so the visible label is available to all
users.
skills/lark-im/card-examples/daily-work-summary.json (1)

333-333: Avoid hardcoded day text in reusable template headers.

Line 333 hardcodes 09月11号, which makes this example stale quickly. Prefer a placeholder/date variable or a neutral title.

♻️ Suggested update
- "content": "早上好!请查收09月11号工作总结"
+ "content": "早上好!请查收今日工作总结"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/daily-work-summary.json` at line 333, The
example JSON's "content" value currently hardcodes the date "09月11号" making the
template stale; update the "content" field in this JSON example to use a
placeholder or variable (e.g., {{date}} or {{summary_date}}) or a neutral title
like "工作总结" instead, so the header is reusable and not tied to a specific
hardcoded day.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@skills/lark-im/card-examples/ai-calendar-creation.json`:
- Around line 18-23: The card example's container uses "direction":
"horizontal", causing title, datetime, attendees, and actions to layout in a
single row; update the body.direction value from "horizontal" to "vertical" (in
the JSON key "body.direction" of the ai-calendar-creation example) so the
elements stack correctly for mobile/readability while leaving other
spacing/padding keys unchanged.

In `@skills/lark-im/card-examples/ai-curated-recommendations.json`:
- Line 155: The callback action value contains a stray newline "view_\ndetail"
which breaks dispatch keys; locate the JSON object with the "value" field that
currently equals "view_\ndetail" (in the card example under
ai-curated-recommendations) and replace it with a single-token string
"view_detail" so the callback key is a continuous token.

In `@skills/lark-im/card-examples/ai-image-generation.json`:
- Line 47: The corner_radius field inside the interactive_container object is
set to an empty string; change that value to an explicit "0px" to match the
other interactive_container usages (standardize corner_radius from "" to "0px"
so it is consistent with examples that use values like "6px" or "0px").

In `@skills/lark-im/card-examples/alert-initiation.json`:
- Around line 7-9: The locales array under the "locales" key only lists "en_us"
while there are i18n entries for "ja_jp" later in alert-initiation.json; either
add "ja_jp" to the config.locales array or remove the "ja_jp" i18n entries so
the declared locales match the actual translations (update the "locales" array
to include "ja_jp" if you want to keep the Japanese content, or delete the
"ja_jp" blocks wherever they appear).

In `@skills/lark-im/card-examples/alert-resolved.json`:
- Around line 7-9: The locales list in config.locales only contains "en_us"
while i18n_content includes "ja_jp" entries; make them consistent by either
adding "ja_jp" to the config.locales array or removing the "ja_jp" block from
i18n_content, ensuring config.locales and i18n_content contain the same locale
keys; update any corresponding keys used by the card/examples loader (e.g.,
config.locales and i18n_content) so they remain aligned.

In `@skills/lark-im/card-examples/approval-reminder.json`:
- Line 99: The <person> tag in the JSON string is left unclosed causing
malformed card content; locate the string value containing "<person
id=\"ou_bb1588f4b53177075497b1e3cbc28e99\" show_avatar=\"true\"
show_name=\"true\" style=\"capsule\">" (in the approval-reminder card content)
and close it by appending a matching "</person>" before the closing quote so the
JSON value becomes well-formed and the Feishu card can render.

In `@skills/lark-im/card-examples/beta-feature-recruitment.json`:
- Around line 106-128: The two interactive_container blocks (the button-styled
containers with inner markdown text "立即申请开通" and "查看接入指南") are missing a
behaviors property so they won't respond to clicks; add a behaviors array to
each interactive_container (e.g., a behavior that opens a URL or triggers a
callback) and include the necessary behavior type and parameters (callback or
url) to enable the intended action while preserving existing styling properties
like background_style and corner_radius.

In `@skills/lark-im/card-examples/data-report-dashboard.json`:
- Line 189: The sample table uses mixed identifier prefixes for the same persons
field (e.g., "on_df3900568967b0bdcdaf5abecf918db1" vs. the "ou_..." identifiers
found later); pick one consistent identifier style and replace all occurrences
so the three entries use the identical ID format (e.g., change
"on_df3900568967b0bdcdaf5abecf918db1" to the matching "ou_..." form or vice
versa) in the JSON so readers copying the payload see a single, consistent
identifier for the persons field.

In `@skills/lark-im/card-examples/equipment-service-feedback.json`:
- Around line 56-112: The "options" array in equipment-service-feedback.json has
non-monotonic rating "value" fields that don't match the textual labels; update
the values in the options objects so the scale is consistent (e.g., map "非常满意"
-> "5", "满意" -> "4", "一般" -> "3", "不满意" -> "2", "非常不满意" -> "1") by editing the
"value" properties for each option in the options array to match their
"text.content" labels.

In `@skills/lark-im/card-examples/event-announcement.json`:
- Line 103: The card example embeds tenant-specific user IDs in the person tag
(e.g., id="ou_5d65cb6d532b923098ce65fd7062a165" /
"ou_07ffb5b368e0fee8fc202e207d1cdf67" / "ou_6d4b38884e0e8a517e426de7942dc840");
replace these concrete ou_... values with clear placeholders like
ou_example_user_1, ou_example_user_2, ou_example_user_3 in the <person id="...">
tags inside the content string and add a short inline comment or note in the
card JSON indicating these must be replaced with real tenant IDs before use.

In `@skills/lark-im/card-examples/order-confirmation-approval.json`:
- Around line 388-401: The "立即确认" button and the guidance text "点击前往..." are
missing interactive handlers — add a behaviors object to each element (the
button and the guidance text node) so clicks are handled: for the confirm button
(text "立即确认") add behaviors.onClick to perform the desired action (e.g.,
submit/trigger an approval action or call a webhook/event name) and for the
guidance text (text "点击前往...") add behaviors.onClick.open_link with the billing
center URL; use the exact property name behaviors and attach onClick with the
appropriate action type (open_link with uri or submit/trigger with action name)
to make them clickable.
- Around line 231-235: The i18n translations for the payment-term JSON object
are wrong: the "content" key reads "14 天 (自服务开始时间起)" but the "i18n_content"
object currently contains invoice-sequence text; update the "i18n_content"
entries for this object (the "content" / "i18n_content" pair in the same JSON
block) so en_us and ja_jp reflect the payment-term meaning (e.g. en_us -> "14
days (from service start)" and ja_jp -> "サービス開始日から14日以内" or equivalent accurate
translations).

In `@skills/lark-im/card-examples/personal-birthday-greeting.json`:
- Line 55: The JSON example contains realistic personal identifiers in the
"content" fields (e.g., the string starting with " **周翊 同学生日快乐 (09-13 ♍️)**" and
the similar occurrence later) which must be anonymized; update those "content"
values in the card examples to use neutral placeholders (e.g., "**[Name]
同学生日快乐**" or "**生日快乐,朋友**") and remove or replace the exact date/astrological
sign with a generic token like "[MM-DD]" or omit it so no real personal data
remains; ensure you update both occurrences referenced in the diff so the
examples are non-identifiable while preserving formatting and intent.

In `@skills/lark-im/card-examples/product-newsletter.json`:
- Around line 176-183: The product title and description mismatch: the earlier
markdown content "🎵 **蓝牙音箱**" does not match the subsequent product description
about a modern Japanese ceramic piece; update the paired "content" fields so
they describe the same product—either change the title string "🎵 **蓝牙音箱**" to a
ceramic-appropriate title (e.g., reference 陶瓷/装饰) or rewrite the description to
describe a Bluetooth speaker; locate and modify the two adjacent JSON blocks
with "tag": "markdown" and their "content" keys to keep title and description
consistent.

In `@skills/lark-im/card-examples/project-assistant-form.json`:
- Around line 85-87: The form displays required markers but the select elements
lack enforcement; update each select element (the elements with "tag":
"select_person" and "tag": "select_static", e.g., the instances around the
current blocks) to include a required flag and validation metadata so the
payload cannot submit empty values — add "required": true (and if supported by
the card framework include "validation": {"required": true, "message": "<field>
is required"} or the equivalent) to those select_person/select_static element
objects and ensure their "name" keys remain present so backend/payload
validation can check non-empty values before submit.
- Around line 300-309: The cancel button (name "Button_vghtjecc609") lacks an
action configuration so clicks do nothing; update its JSON to include an action
such as adding "form_action_type": "reset" or "form_action_type": "close"
(matching how the "提交" button uses "form_action_type": "submit"), or
alternatively add a "behaviors" block that performs the desired action (e.g.,
close/hide the modal or reset the form); ensure the new key is added to the same
button object so the cancel button becomes functional.

In `@skills/lark-im/card-examples/streaming-service-desk.json`:
- Line 30: The content string contains a typo "创建卡片实体</link>体接口" in the card
example JSON; locate the content value containing that substring and remove the
extra "体" so it reads "创建卡片实体</link>接口" (update the string where the phrase
appears).

In `@skills/lark-im/card-examples/travel-hotel-recommendations.json`:
- Line 88: Remove the empty <text_tag> placeholders from the price row strings
(the "content" values that currently contain "<text_tag
color='yellow'></text_tag>"); locate the JSON objects in
travel-hotel-recommendations.json where "content" includes an empty <text_tag>
(e.g., the price rows showing "**<font color='red'>700</font>**/晚起 <text_tag
color='yellow'></text_tag> <text_tag color='yellow'>协议价</text_tag>") and delete
only the empty tag(s) so spacing and rendering remain correct while preserving
the non-empty "<text_tag color='yellow'>协议价</text_tag>" element.

---

Nitpick comments:
In `@skills/lark-im/card-examples/ai-chat-welcome.json`:
- Around line 21-52: Several color entries (color_dtgiw98jw3s, color_7u3svrs1gk,
color_aedgx4h5lst, color_5fjelryhkr7, color_cpi1ty18y07, color_9uxmooevtbs,
color_yshuzkazoo, color_bqm6462lklw) define identical light/dark RGBA values;
consolidate them by keeping one canonical key for each unique RGBA pair (e.g.,
keep color_dtgiw98jw3s and color_aedgx4h5lst for the two distinct pairs) and
remove the duplicate keys, and then update all usages/references in the project
to point to the retained canonical keys so behavior is unchanged.

In `@skills/lark-im/card-examples/ai-image-generation.json`:
- Around line 277-301: Button definitions using only an icon (e.g., the button
with element_id "a1" and the other icon-only buttons at the next two spots) have
empty text.content and rely on hover_tips, which breaks accessibility on
touch/keyboard devices; update each button's "text.content" from "" to a short
descriptive label (for example "Regenerate" for the refresh action) while
keeping the existing icon and behaviors so the visible label is available to all
users.

In `@skills/lark-im/card-examples/approval-reminder.json`:
- Around line 225-235: Remove the empty column object (the JSON node with "tag":
"column" and "elements": []) from the card definition and rely on existing
margin/spacing properties (e.g., "horizontal_spacing", "vertical_spacing",
"margin") on neighboring elements to preserve layout; delete that entire empty
column block and, if needed, adjust the surrounding container's
"horizontal_spacing"/"vertical_spacing" or the adjacent column's "margin" to
maintain the intended spacing.

In `@skills/lark-im/card-examples/daily-report-of-codebase.json`:
- Line 241: The JSON file
skills/lark-im/card-examples/daily-report-of-codebase.json is missing a trailing
newline; open that file and add a single newline character after the final
closing brace (ensure the file ends with "\n") so it conforms to POSIX
conventions and produces cleaner git diffs.

In `@skills/lark-im/card-examples/daily-work-summary.json`:
- Line 333: The example JSON's "content" value currently hardcodes the date
"09月11号" making the template stale; update the "content" field in this JSON
example to use a placeholder or variable (e.g., {{date}} or {{summary_date}}) or
a neutral title like "工作总结" instead, so the header is reusable and not tied to a
specific hardcoded day.

In `@skills/lark-im/card-examples/equipment-pickup-notification.json`:
- Line 157: The file ends with a closing brace '}' but lacks a trailing newline;
open skills/lark-im/card-examples/equipment-pickup-notification.json and ensure
there is a single newline character after the final '}' (i.e., add a trailing
newline at EOF) to satisfy POSIX/good-git-diff conventions.

In `@skills/lark-im/card-examples/equipment-service-feedback.json`:
- Line 227: The file ends with a closing brace '}' but lacks a trailing newline;
open the JSON file (look for the final '}' in equipment-service-feedback.json)
and add a single newline character at EOF so the file terminates with a trailing
newline for POSIX compliance and cleaner diffs.

In `@skills/lark-im/card-examples/smart-locker-launch.json`:
- Line 115: The file ends with a closing brace '}' but lacks a trailing newline;
update skills/lark-im/card-examples/smart-locker-launch.json by adding a single
newline character at EOF so the file ends with '\n' for POSIX compliance and
cleaner git diffs.

In `@skills/lark-im/card-examples/team-birthday-greeting.json`:
- Line 94: Add a trailing newline to the JSON file by ensuring the final closing
brace '}' in team-birthday-greeting.json is followed by a single '\n' character
so the file ends with a newline (POSIX-compliant and cleaner diffs).
🪄 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: 0c39a54b-af72-4a42-8b8b-39d714c0c954

📥 Commits

Reviewing files that changed from the base of the PR and between f59f263 and 4fdb0b7.

📒 Files selected for processing (31)
  • skills/lark-im/SKILL.md
  • skills/lark-im/card-examples/ai-calendar-creation.json
  • skills/lark-im/card-examples/ai-chat-welcome.json
  • skills/lark-im/card-examples/ai-curated-recommendations.json
  • skills/lark-im/card-examples/ai-image-generation.json
  • skills/lark-im/card-examples/alert-initiation.json
  • skills/lark-im/card-examples/alert-resolved.json
  • skills/lark-im/card-examples/approval-approved.json
  • skills/lark-im/card-examples/approval-reminder.json
  • skills/lark-im/card-examples/article-with-images.json
  • skills/lark-im/card-examples/beta-feature-recruitment.json
  • skills/lark-im/card-examples/bot-tutorial-welcome.json
  • skills/lark-im/card-examples/daily-report-of-codebase.json
  • skills/lark-im/card-examples/daily-work-summary.json
  • skills/lark-im/card-examples/data-report-dashboard.json
  • skills/lark-im/card-examples/deal-won-announcement.json
  • skills/lark-im/card-examples/equipment-pickup-notification.json
  • skills/lark-im/card-examples/equipment-service-feedback.json
  • skills/lark-im/card-examples/event-announcement.json
  • skills/lark-im/card-examples/order-confirmation-approval.json
  • skills/lark-im/card-examples/personal-birthday-greeting.json
  • skills/lark-im/card-examples/product-newsletter.json
  • skills/lark-im/card-examples/project-assistant-form.json
  • skills/lark-im/card-examples/sales-leaderboard.json
  • skills/lark-im/card-examples/smart-locker-launch.json
  • skills/lark-im/card-examples/streaming-service-desk.json
  • skills/lark-im/card-examples/team-birthday-greeting.json
  • skills/lark-im/card-examples/travel-hotel-recommendations.json
  • skills/lark-im/card-examples/workplace-social-share.json
  • skills/lark-im/references/lark-im-messages-reply.md
  • skills/lark-im/references/lark-im-messages-send.md

Comment on lines +18 to +23
"direction": "horizontal",
"horizontal_spacing": "8px",
"vertical_spacing": "12px",
"horizontal_align": "left",
"vertical_align": "top",
"padding": "20px 20px 20px 20px",
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 | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Inspect body direction and top-level element tags across example cards.
python - <<'PY'
import json, pathlib
root = pathlib.Path("skills/lark-im/card-examples")
for p in sorted(root.glob("*.json")):
    data = json.loads(p.read_text(encoding="utf-8"))
    body = data.get("card", {}).get("body", {})
    direction = body.get("direction")
    tags = [e.get("tag") for e in body.get("elements", [])[:6]]
    print(f"{p.name}: direction={direction}, first_tags={tags}")
PY

Repository: larksuite/cli

Length of output: 3102


Change body.direction to vertical for proper stacked content layout.

This file is the only example using horizontal direction; all 27 other card examples use vertical. With direction set to horizontal, the title, date/time, person list, and action buttons render in a single row and break mobile readability. The content structure requires a vertical stack.

Fix
- "direction": "horizontal",
+ "direction": "vertical",
📝 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
"direction": "horizontal",
"horizontal_spacing": "8px",
"vertical_spacing": "12px",
"horizontal_align": "left",
"vertical_align": "top",
"padding": "20px 20px 20px 20px",
"direction": "vertical",
"horizontal_spacing": "8px",
"vertical_spacing": "12px",
"horizontal_align": "left",
"vertical_align": "top",
"padding": "20px 20px 20px 20px",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/ai-calendar-creation.json` around lines 18 - 23,
The card example's container uses "direction": "horizontal", causing title,
datetime, attendees, and actions to layout in a single row; update the
body.direction value from "horizontal" to "vertical" (in the JSON key
"body.direction" of the ai-calendar-creation example) so the elements stack
correctly for mobile/readability while leaving other spacing/padding keys
unchanged.

"tag": "interactive_container",
"width": "fill",
"height": "auto",
"corner_radius": "",
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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
jq -r '
  .. | objects
  | select(.tag?=="interactive_container")
  | {corner_radius: (.corner_radius // null)}
' skills/lark-im/card-examples/ai-image-generation.json

Repository: larksuite/cli

Length of output: 111


🏁 Script executed:

#!/bin/bash
# First, let's look at the file structure and line 47
echo "=== Checking line 47 context ==="
sed -n '40,55p' skills/lark-im/card-examples/ai-image-generation.json

echo ""
echo "=== Checking total lines ==="
wc -l skills/lark-im/card-examples/ai-image-generation.json

Repository: larksuite/cli

Length of output: 848


🏁 Script executed:

#!/bin/bash
# Let's also check if there's any JSON schema or documentation about corner_radius
echo "=== Searching for schema or validation documentation ==="
find . -type f \( -name "*.md" -o -name "*.schema.json" -o -name "*schema*" \) | head -20

echo ""
echo "=== Searching for corner_radius in documentation ==="
rg -i "corner_radius" --type md -A 2 -B 2

Repository: larksuite/cli

Length of output: 922


🏁 Script executed:

#!/bin/bash
# Check if there are other files with similar JSON structures
echo "=== Checking other card examples ==="
find skills/lark-im/card-examples -name "*.json" -type f | head -10

Repository: larksuite/cli

Length of output: 630


🏁 Script executed:

#!/bin/bash
# Check the schema definition for corner_radius
echo "=== Searching for corner_radius in schema ==="
rg "corner_radius" cmd/schema/ -A 2 -B 2

echo ""
echo "=== Checking schema.go structure ==="
grep -n "interactive_container\|CornerRadius\|corner_radius" cmd/schema/schema.go | head -30

Repository: larksuite/cli

Length of output: 140


🏁 Script executed:

#!/bin/bash
# Check all card examples for corner_radius patterns
echo "=== Checking corner_radius in all card examples ==="
for file in skills/lark-im/card-examples/*.json; do
  echo "File: $(basename $file)"
  jq -r '
    .. | objects
    | select(.tag?=="interactive_container")
    | "\(.corner_radius // "missing")"
  ' "$file" 2>/dev/null | sort | uniq -c | head -5
  echo ""
done

Repository: larksuite/cli

Length of output: 1130


🏁 Script executed:

#!/bin/bash
# Check for validation or linting scripts
echo "=== Checking for validation scripts ==="
find . -name "*format*" -o -name "*validate*" -o -name "*lint*" | grep -E "\.(sh|py|js|go)$" | head -20

echo ""
echo "=== Checking skill-format-check README ==="
cat scripts/skill-format-check/README.md | head -50

Repository: larksuite/cli

Length of output: 1592


🏁 Script executed:

#!/bin/bash
# Compare the two interactive_container objects in ai-image-generation.json more carefully
echo "=== Full context of both interactive_container objects ==="
jq -r '
  .. | objects
  | select(.tag?=="interactive_container")
  | {
      corner_radius: .corner_radius,
      width: .width,
      height: .height,
      elements: [.elements[]? | .tag // .content]
    }
' skills/lark-im/card-examples/ai-image-generation.json

Repository: larksuite/cli

Length of output: 356


Ensure corner_radius uses an explicit value instead of empty string for consistency.

On Line 47, corner_radius is set to "" while the other interactive_container in the same file uses "0px". All other card example files also use explicit values (e.g., 6px, 8px, 12px) or omit the field entirely. Standardize this to "0px".

Suggested fix
-                    "corner_radius": "",
+                    "corner_radius": "0px",
📝 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
"corner_radius": "",
"corner_radius": "0px",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/ai-image-generation.json` at line 47, The
corner_radius field inside the interactive_container object is set to an empty
string; change that value to an explicit "0px" to match the other
interactive_container usages (standardize corner_radius from "" to "0px" so it
is consistent with examples that use values like "6px" or "0px").

Comment on lines +7 to +9
"locales": [
"en_us"
],
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

Locale declaration and i18n entries are inconsistent.

Line 7 declares only en_us, but Line 196 includes ja_jp content. Add ja_jp to config.locales or remove ja_jp text to keep localization behavior deterministic.

Also applies to: 194-197

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/alert-initiation.json` around lines 7 - 9, The
locales array under the "locales" key only lists "en_us" while there are i18n
entries for "ja_jp" later in alert-initiation.json; either add "ja_jp" to the
config.locales array or remove the "ja_jp" i18n entries so the declared locales
match the actual translations (update the "locales" array to include "ja_jp" if
you want to keep the Japanese content, or delete the "ja_jp" blocks wherever
they appear).

Comment on lines +7 to +9
"locales": [
"en_us"
],
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

Locale declaration and i18n entries are inconsistent.

Line 7 declares only en_us, but Line 152 includes ja_jp text. Keep config.locales and i18n_content aligned.

Also applies to: 150-153

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/alert-resolved.json` around lines 7 - 9, The
locales list in config.locales only contains "en_us" while i18n_content includes
"ja_jp" entries; make them consistent by either adding "ja_jp" to the
config.locales array or removing the "ja_jp" block from i18n_content, ensuring
config.locales and i18n_content contain the same locale keys; update any
corresponding keys used by the card/examples loader (e.g., config.locales and
i18n_content) so they remain aligned.

Comment on lines +176 to +183
"content": "🎵 **蓝牙音箱**",
"text_align": "left",
"text_size": "normal"
},
{
"tag": "markdown",
"content": "\n这款现代日式陶瓷以精美造型和艺术装饰风格脱颖而出。设计灵感源自传统与现代的交融,色彩明快、线条流畅,无论用作家居摆件还是实用器皿,都能为空间增添一份时尚雅致。",
"text_align": "left",
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

Product title and description are inconsistent.

Line 176 says “蓝牙音箱”, but Line 182 describes ceramic decor. This should be aligned to avoid confusing readers.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/product-newsletter.json` around lines 176 - 183,
The product title and description mismatch: the earlier markdown content "🎵
**蓝牙音箱**" does not match the subsequent product description about a modern
Japanese ceramic piece; update the paired "content" fields so they describe the
same product—either change the title string "🎵 **蓝牙音箱**" to a
ceramic-appropriate title (e.g., reference 陶瓷/装饰) or rewrite the description to
describe a Bluetooth speaker; locate and modify the two adjacent JSON blocks
with "tag": "markdown" and their "content" keys to keep title and description
consistent.

Comment on lines +85 to +87
"content": "**经办人**<font color='red'>*</font>",
"text_align": "left",
"text_size": "normal",
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 | 🟠 Major

Required fields are marked in UI but not enforced in payload.

Line 85/135 show * as required markers, but Line 105 (select_person) and Line 155 (select_static) do not include validation flags, so submit can pass with empty required selections.

#!/bin/bash
jq -r '
  .card.body.elements[] | select(.tag=="form") | .elements[]
  | select(.tag=="column_set")
  | .columns[].elements[]
  | select(.tag=="select_person" or .tag=="select_static")
  | {tag, name, required: (.required // false)}
' skills/lark-im/card-examples/project-assistant-form.json

Also applies to: 105-113, 135-137, 155-198

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/project-assistant-form.json` around lines 85 -
87, The form displays required markers but the select elements lack enforcement;
update each select element (the elements with "tag": "select_person" and "tag":
"select_static", e.g., the instances around the current blocks) to include a
required flag and validation metadata so the payload cannot submit empty values
— add "required": true (and if supported by the card framework include
"validation": {"required": true, "message": "<field> is required"} or the
equivalent) to those select_person/select_static element objects and ensure
their "name" keys remain present so backend/payload validation can check
non-empty values before submit.

Comment on lines +300 to +309
"tag": "button",
"text": {
"tag": "plain_text",
"content": "取消"
},
"type": "default",
"width": "fill",
"size": "medium",
"name": "Button_vghtjecc609",
"margin": "0px 0px 0px 0px"
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 | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
jq -r '
  .. | objects
  | select(.tag?=="button" and .text.content?=="取消")
  | {name, has_behaviors: has("behaviors"), form_action_type: (.form_action_type // null)}
' skills/lark-im/card-examples/project-assistant-form.json

Repository: larksuite/cli

Length of output: 145


🏁 Script executed:

sed -n '290,320p' skills/lark-im/card-examples/project-assistant-form.json | cat -n

Repository: larksuite/cli

Length of output: 1894


🏁 Script executed:

rg '"tag":\s*"button"' skills/lark-im/card-examples/project-assistant-form.json -A 15 -B 2

Repository: larksuite/cli

Length of output: 2109


🏁 Script executed:

rg '"content":\s*"取消"' skills/lark-im/ -B 10 -A 10

Repository: larksuite/cli

Length of output: 2407


🏁 Script executed:

rg 'form_action_type' skills/lark-im/ -o

Repository: larksuite/cli

Length of output: 414


🏁 Script executed:

rg 'form_action_type.*:' skills/lark-im/ --no-heading

Repository: larksuite/cli

Length of output: 699


🏁 Script executed:

rg '"tag":\s*"button"' skills/lark-im/card-examples/ -A 10 | grep -E '(content|form_action_type|behaviors)' | head -40

Repository: larksuite/cli

Length of output: 4707


取消 button (Button_vghtjecc609) is non-functional due to missing action configuration.

The cancel button at lines 300–309 has neither form_action_type nor behaviors, preventing it from performing any action when clicked. Other buttons in the same file use form_action_type (e.g., the 提交 button uses "form_action_type": "submit") or behaviors. Add appropriate action configuration to make this button functional.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/project-assistant-form.json` around lines 300 -
309, The cancel button (name "Button_vghtjecc609") lacks an action configuration
so clicks do nothing; update its JSON to include an action such as adding
"form_action_type": "reset" or "form_action_type": "close" (matching how the
"提交" button uses "form_action_type": "submit"), or alternatively add a
"behaviors" block that performs the desired action (e.g., close/hide the modal
or reset the form); ensure the new key is added to the same button object so the
cancel button becomes functional.

},
{
"tag": "markdown",
"content": " **一、JSON结构中的相关字段配置**\n1. **streaming_mode字段**<number_tag>1</number_tag><number_tag>2</number_tag>\n<number_tag>4</number_tag><number_tag>5</number_tag>\n - 类型为Boolean,用于开启或关闭流式更新模式 \n - 若要开启卡片的流式更新模式,需将此值设为true \n2. **streaming_config字段**<number_tag>1</number_tag><number_tag>3</number_tag>\n<number_tag>4</number_tag>\n - 类型为Object,用于指定流式更新的频率、步长和更新策略等参数\n - **print_frequency_ms子字段**<number_tag>1</number_tag><number_tag>2</number_tag>\n - 用于设置流式更新频率,即两次流式更新上屏之间的间隔时长,默认为70ms \n - 支持分端配置,若要配置三端统一的流式参数,仅指定default的值即可;若要为三端指定不同的流式参数,则在填写default参数的基础上,可选增加android/ios/pc三端的参数 \n - default(三端通用统一频率)为必填项,单位为毫秒,数据校验规则为20 - 1000;android、ios、pc端频率为可选项,同样需满足20 - 1000的毫秒数据校验规则 \n - **print_step子字段**<number_tag>3</number_tag>\n<number_tag>4</number_tag>\n - 用于设置流式更新步长,即每次流式更新上屏打印的增量字符数,默认为1\n - 支持分端配置,若要配置三端统一的流式参数,仅指定default的值即可;若要为三端指定不同的流式参数,则在填写default参数的基础上,可选增加android/ios/pc三端的参数 \n - default(三端通用统一频率)为必填项,单位为毫秒,数据校验规则为20 - 1000;android、ios、pc端频率为可选项,同样需满足20 - 1000的毫秒数据校验规则 \n - **print_strategy子字段**<number_tag>1</number_tag><number_tag>5</number_tag>\n - 类型为enum,用于设置单个文本或富文本组件内文本的流式更新策略,可选值有fast(快速上屏,为7.20 - 7.22版本的默认策略)和delay(延迟上屏),默认为fast\n\n - fast策略下,调用 [流式更新文本](https://open.larkoffice.com/document/uAjLw4CM/ukTMukTMukTM/cardkit-v1/card-element/content) 接口后,若历史文本尚未流式上屏完毕,未上屏的部分将立即全部上屏,然后立即开始本次内容上屏;delay策略下,调用 [流式更新文本](https://open.larkoffice.com/document/uAjLw4CM/ukTMukTMukTM/cardkit-v1/card-element/content) 接口后,若历史文本尚未流式输出完毕,历史文本中未上屏部分将会继续按打字机效果输出直到全部输出完毕,再开始本次内容上屏。\n\n**二、前提条件**\n1. **创建应用并添加相关权限**<number_tag>1</number_tag>\n\n - 已在 飞书开发者后台创建了一个应用,并为应用添加了机器人能力、开通了以下权限:以应用的身份发消息(im:message:send_as_bot)、获取与发送单聊、群组消息(im:message)、创建与更新卡片(cardkit:card:write) \n\n2. **构建卡片JSON**<number_tag>1</number_tag><number_tag>2</number_tag>\n<number_tag>4</number_tag><number_tag>5</number_tag>\n - 已基于<link icon='file-link-bitable_outlined' url='https://open.larkoffice.com/document/uAjLw4CM/ukzMukzMukzM/feishu-cards/card-json-v2-structure' pc_url='' ios_url='' android_url=''>卡片 JSON 2.0 结构</link>构建了卡片JSON \n - 若要开启卡片的流式更新模式,需将此值设为true \n3. **设置流式更新参数并开启模式**<number_tag>1</number_tag>\n\n - 按需设置了流式更新的频率、步长和策略,并将全局属性streaming_mode设置为true,以开启卡片流式更新模式 \n\n**三、操作步骤** \n\n1. **调用 创建卡片实体**<number_tag>1</number_tag><number_tag>2</number_tag>\n<number_tag>4</number_tag><number_tag>6</number_tag>\n - 通过调用 <link icon='file-link-bitable_outlined' url='https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/cardkit-v1/card/create' pc_url='' ios_url='' android_url=''>创建卡片实体</link>体接口,开启卡片的流式更新模式。同时获取卡片实体的ID,用于发送卡片 。\n - Mac系统和Windows系统都有对应的Curl示例。调用成功将返回卡片实体ID,同时为该卡片开启流式更新模式 。流式更新模式将在距上次开启10分钟后自动关闭,也可随时调用<link icon='file-link-bitable_outlined' url='https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/cardkit-v1/card/settings' pc_url='' ios_url='' android_url=''>更新卡片配置</link>API将streaming_mode字段值设置为false,以终止卡片的流式更新模式 \n2. **发送卡片实体**\n - 参考 <link icon='file-link-bitable_outlined' url='https://open.feishu.cn/document/server-docs/im-v1/message/create' pc_url='' ios_url='' android_url=''>发送消息接口文档</link>,在请求体的content字段中传入卡片实体ID,以发送卡片实体 。\n - 注意事项:\n - 卡片实体仅支持发送一次 \n - 发送卡片实体的应用必须是该卡片实体的创建应用 \n - 发送卡片实体时,content字段中的结构有相应要求,文档中有请求体示例、Mac系统和Windows系统的Curl命令示例以及成功返回的响应示例 \n3. ** (可选)流式更新文本 **\n - 飞书卡片中的普通文本组件和富文本组件支持对文本进行持续、增量的更新,从而实现“打字机”式的文字输出效果,提升终端用户体验 \n - 卡片发送后,可调用 \n <link icon='file-link-bitable_outlined' url='https://open.larkoffice.com/document/uAjLw4CM/ukTMukTMukTM/cardkit-v1/card-element/content' pc_url='' ios_url='' android_url=''>流式更新文本</link>\n 接口,对卡片中的普通文本组件或富文本组件传入全量文本内容 。若旧文本为传入的新文本的前缀子串,新增文本将在旧文本末尾继续以打字机效果输出;若新旧文本前缀不同,全量文本将直接上屏输出,无打字机效果。同样有Mac系统和Windows系统的Curl命令示例 。",
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

Fix typo in instructional markdown content.

Line 30 includes 创建卡片实体</link>体接口 (extra “体”). Please correct the phrase to avoid confusing readers in this reference sample.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/streaming-service-desk.json` at line 30, The
content string contains a typo "创建卡片实体</link>体接口" in the card example JSON;
locate the content value containing that substring and remove the extra "体" so
it reads "创建卡片实体</link>接口" (update the string where the phrase appears).

},
{
"tag": "markdown",
"content": "**<font color='red'>700</font>**/晚起 <text_tag color='yellow'></text_tag> <text_tag color='yellow'>协议价</text_tag>",
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

Remove empty <text_tag> placeholders in price rows.

Line 88 and Line 196 include an empty text_tag, which adds noise and may render awkward spacing.

Suggested cleanup
- "content": "**<font color='red'>700</font>**/晚起 <text_tag color='yellow'></text_tag> <text_tag color='yellow'>协议价</text_tag>",
+ "content": "**<font color='red'>700</font>**/晚起 <text_tag color='yellow'>协议价</text_tag>",

Also applies to: 196-196

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/travel-hotel-recommendations.json` at line 88,
Remove the empty <text_tag> placeholders from the price row strings (the
"content" values that currently contain "<text_tag color='yellow'></text_tag>");
locate the JSON objects in travel-hotel-recommendations.json where "content"
includes an empty <text_tag> (e.g., the price rows showing "**<font
color='red'>700</font>**/晚起 <text_tag color='yellow'></text_tag> <text_tag
color='yellow'>协议价</text_tag>") and delete only the empty tag(s) so spacing and
rendering remain correct while preserving the non-empty "<text_tag
color='yellow'>协议价</text_tag>" element.

@91-enjoy 91-enjoy force-pushed the feat/support_send_card_2.0 branch from 4fdb0b7 to 9763c79 Compare April 10, 2026 10:59
@greptile-apps
Copy link
Copy Markdown

greptile-apps bot commented Apr 10, 2026

Tip:

Greploop — Automatically fix all review issues by running /greploops in Claude Code. It iterates: fix, push, re-review, repeat until 5/5 confidence.

Use the Greptile plugin for Claude Code to query reviews, search comments, and manage custom context directly from your terminal.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (2)
skills/lark-im/card-examples/equipment-service-feedback.json (1)

56-112: ⚠️ Potential issue | 🟠 Major

Make rating value mappings monotonic with sentiment order.

On Line 62, Line 73, Line 84, Line 95, and Line 106, the scale is 1,2,5,3,4, which is inconsistent with the displayed satisfaction order and can distort downstream score aggregation.

📊 Proposed fix (consistent 5→1 satisfaction scale)
                                                 {
                                                     "text": {
                                                         "tag": "plain_text",
                                                         "content": "非常满意"
                                                     },
-                                                    "value": "1",
+                                                    "value": "5",
                                                     "icon": {
                                                         "tag": "standard_icon",
                                                         "token": "sheet-iconsets-star-100_filled"
                                                     }
                                                 },
                                                 {
                                                     "text": {
                                                         "tag": "plain_text",
                                                         "content": "满意"
                                                     },
-                                                    "value": "2",
+                                                    "value": "4",
                                                     "icon": {
                                                         "tag": "standard_icon",
                                                         "token": "sheet-iconsets-star-100_filled"
                                                     }
                                                 },
                                                 {
                                                     "text": {
                                                         "tag": "plain_text",
                                                         "content": "一般"
                                                     },
-                                                    "value": "5",
+                                                    "value": "3",
                                                     "icon": {
                                                         "tag": "standard_icon",
                                                         "token": "sheet-iconsets-star-100_filled"
                                                     }
                                                 },
                                                 {
                                                     "text": {
                                                         "tag": "plain_text",
                                                         "content": "不满意"
                                                     },
-                                                    "value": "3",
+                                                    "value": "2",
                                                     "icon": {
                                                         "tag": "standard_icon",
                                                         "token": "sheet-iconsets-star-100_filled"
                                                     }
                                                 },
                                                 {
                                                     "text": {
                                                         "tag": "plain_text",
                                                         "content": "非常不满意"
                                                     },
-                                                    "value": "4",
+                                                    "value": "1",
                                                     "icon": {
                                                         "tag": "standard_icon",
                                                         "token": "sheet-iconsets-star-100_filled"
                                                     }
                                                 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/equipment-service-feedback.json` around lines 56
- 112, The rating "value" fields in the "options" array are out of order
(currently 1,2,5,3,4) and must be made monotonic with the sentiment text; update
the "value" strings for each option so they follow a consistent 5→1 satisfaction
scale: set "非常满意" -> "5", "满意" -> "4", "一般" -> "3", "不满意" -> "2", and "非常不满意" ->
"1" in the options array so downstream aggregation is correct.
skills/lark-im/card-examples/alert-resolved.json (1)

7-9: ⚠️ Potential issue | 🟡 Minor

Align config.locales and i18n_content locale keys.

Line 7-Line 9 declares only en_us, but Line 150-Line 153 adds ja_jp in header.title.i18n_content. Keep them consistent (either remove ja_jp or fully localize the card and add ja_jp to config.locales).

Proposed minimal fix
                 "i18n_content": {
                     "en_us": "[Resolved] Alert: Process Error - Please Address Promptly",
-                    "ja_jp": "注文確認待ち"
                 }
#!/bin/bash
python - <<'PY'
import json
from pathlib import Path

p = Path("skills/lark-im/card-examples/alert-resolved.json")
data = json.loads(p.read_text(encoding="utf-8"))
locales = set(data.get("card", {}).get("config", {}).get("locales", []))

def walk(node, path="$"):
    if isinstance(node, dict):
        i18n = node.get("i18n_content")
        if isinstance(i18n, dict):
            extra = sorted(set(i18n.keys()) - locales)
            if extra:
                print(f"{path}.i18n_content has locales not in config.locales: {extra}")
        for k, v in node.items():
            walk(v, f"{path}.{k}")
    elif isinstance(node, list):
        for i, v in enumerate(node):
            walk(v, f"{path}[{i}]")

walk(data)
PY

Also applies to: 150-153

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/alert-resolved.json` around lines 7 - 9,
config.locales only lists "en_us" while header.title.i18n_content contains
"ja_jp", causing inconsistent locale keys; update either the card's i18n_content
or the config.locales to match. Locate the JSON fields config.locales (under
"card"."config") and header.title.i18n_content (and any other i18n_content
objects found under "card") and either remove the "ja_jp" entries from
i18n_content or add "ja_jp" to config.locales and ensure all i18n_content keys
are fully localized for each locale you add. Make the change so every locale key
present in any i18n_content exists in config.locales and rerun the provided
validation snippet to confirm no extras remain.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@skills/lark-im/card-examples/data-report-dashboard.json`:
- Around line 188-204: The persons-type column uses placeholder names ("xxx")
which are invalid for Feishu persons; update each "name" array used under the
persons column (the objects containing "name", "duration", "diff") to contain
realistic Feishu user identifiers instead of "xxx" (for example replace "xxx"
with values like "ou_xxxxxxxxxxxxxxxx" or a valid
"user_id"/"open_id"/"union_id"/"lark_id") so the "data_type":"persons" entries
are valid for testing; ensure every occurrence of "name": ["xxx"] in that JSON
is replaced with a realistic Feishu ID string.

---

Duplicate comments:
In `@skills/lark-im/card-examples/alert-resolved.json`:
- Around line 7-9: config.locales only lists "en_us" while
header.title.i18n_content contains "ja_jp", causing inconsistent locale keys;
update either the card's i18n_content or the config.locales to match. Locate the
JSON fields config.locales (under "card"."config") and header.title.i18n_content
(and any other i18n_content objects found under "card") and either remove the
"ja_jp" entries from i18n_content or add "ja_jp" to config.locales and ensure
all i18n_content keys are fully localized for each locale you add. Make the
change so every locale key present in any i18n_content exists in config.locales
and rerun the provided validation snippet to confirm no extras remain.

In `@skills/lark-im/card-examples/equipment-service-feedback.json`:
- Around line 56-112: The rating "value" fields in the "options" array are out
of order (currently 1,2,5,3,4) and must be made monotonic with the sentiment
text; update the "value" strings for each option so they follow a consistent 5→1
satisfaction scale: set "非常满意" -> "5", "满意" -> "4", "一般" -> "3", "不满意" -> "2",
and "非常不满意" -> "1" in the options array so downstream aggregation is correct.
🪄 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: 89e0d4f2-98b6-4fea-9ec5-adb85d6b6bc9

📥 Commits

Reviewing files that changed from the base of the PR and between 4fdb0b7 and 9763c79.

📒 Files selected for processing (31)
  • skills/lark-im/SKILL.md
  • skills/lark-im/card-examples/ai-calendar-creation.json
  • skills/lark-im/card-examples/ai-chat-welcome.json
  • skills/lark-im/card-examples/ai-curated-recommendations.json
  • skills/lark-im/card-examples/ai-image-generation.json
  • skills/lark-im/card-examples/alert-initiation.json
  • skills/lark-im/card-examples/alert-resolved.json
  • skills/lark-im/card-examples/approval-approved.json
  • skills/lark-im/card-examples/approval-reminder.json
  • skills/lark-im/card-examples/article-with-images.json
  • skills/lark-im/card-examples/beta-feature-recruitment.json
  • skills/lark-im/card-examples/bot-tutorial-welcome.json
  • skills/lark-im/card-examples/daily-report-of-codebase.json
  • skills/lark-im/card-examples/daily-work-summary.json
  • skills/lark-im/card-examples/data-report-dashboard.json
  • skills/lark-im/card-examples/deal-won-announcement.json
  • skills/lark-im/card-examples/equipment-pickup-notification.json
  • skills/lark-im/card-examples/equipment-service-feedback.json
  • skills/lark-im/card-examples/event-announcement.json
  • skills/lark-im/card-examples/order-confirmation-approval.json
  • skills/lark-im/card-examples/personal-birthday-greeting.json
  • skills/lark-im/card-examples/product-newsletter.json
  • skills/lark-im/card-examples/project-assistant-form.json
  • skills/lark-im/card-examples/sales-leaderboard.json
  • skills/lark-im/card-examples/smart-locker-launch.json
  • skills/lark-im/card-examples/streaming-service-desk.json
  • skills/lark-im/card-examples/team-birthday-greeting.json
  • skills/lark-im/card-examples/travel-hotel-recommendations.json
  • skills/lark-im/card-examples/workplace-social-share.json
  • skills/lark-im/references/lark-im-messages-reply.md
  • skills/lark-im/references/lark-im-messages-send.md
✅ Files skipped from review due to trivial changes (25)
  • skills/lark-im/SKILL.md
  • skills/lark-im/references/lark-im-messages-reply.md
  • skills/lark-im/references/lark-im-messages-send.md
  • skills/lark-im/card-examples/team-birthday-greeting.json
  • skills/lark-im/card-examples/product-newsletter.json
  • skills/lark-im/card-examples/travel-hotel-recommendations.json
  • skills/lark-im/card-examples/bot-tutorial-welcome.json
  • skills/lark-im/card-examples/ai-calendar-creation.json
  • skills/lark-im/card-examples/project-assistant-form.json
  • skills/lark-im/card-examples/beta-feature-recruitment.json
  • skills/lark-im/card-examples/equipment-pickup-notification.json
  • skills/lark-im/card-examples/deal-won-announcement.json
  • skills/lark-im/card-examples/sales-leaderboard.json
  • skills/lark-im/card-examples/workplace-social-share.json
  • skills/lark-im/card-examples/ai-image-generation.json
  • skills/lark-im/card-examples/ai-curated-recommendations.json
  • skills/lark-im/card-examples/approval-approved.json
  • skills/lark-im/card-examples/daily-report-of-codebase.json
  • skills/lark-im/card-examples/article-with-images.json
  • skills/lark-im/card-examples/event-announcement.json
  • skills/lark-im/card-examples/ai-chat-welcome.json
  • skills/lark-im/card-examples/order-confirmation-approval.json
  • skills/lark-im/card-examples/alert-initiation.json
  • skills/lark-im/card-examples/personal-birthday-greeting.json
  • skills/lark-im/card-examples/daily-work-summary.json
🚧 Files skipped from review as they are similar to previous changes (3)
  • skills/lark-im/card-examples/smart-locker-launch.json
  • skills/lark-im/card-examples/approval-reminder.json
  • skills/lark-im/card-examples/streaming-service-desk.json

Comment on lines +188 to +204
"name": [
"xxx"
],
"duration": "小于1小时",
"diff": "↓12%"
},
{
"name": [
"xxx"
],
"duration": "2 小时",
"diff": "↑5%"
},
{
"name": [
"xxx"
],
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

🧩 Analysis chain

🌐 Web query:

For Feishu/Lark Interactive Card 2.0 table component, what exact value format is required for rows when the column data_type is "persons"?

💡 Result:

For a table column with "data_type": "persons", each row’s cell value must be a Feishu user ID string (single person) or an array of user ID strings (multiple persons). Supported ID types: user_id, open_id, union_id, lark_id. When an ID is invalid, the client shows “unknown user”. [1]

"rows": [
  {
    "assignee": "ou_xxx" 
  },
  {
    "assignee": ["ou_xxx", "ou_yyy"]
  }
]

[1] (mdgrok.com)

Citations:


🏁 Script executed:

# First, let's find and read the specific file
find . -name "data-report-dashboard.json" -type f

Repository: larksuite/cli

Length of output: 114


🏁 Script executed:

# Read the file to understand the full context around lines 188-204
cat -n ./skills/lark-im/card-examples/data-report-dashboard.json | head -220 | tail -50

Repository: larksuite/cli

Length of output: 2486


🏁 Script executed:

# Let's see more of the file to find all columns definition
cat -n ./skills/lark-im/card-examples/data-report-dashboard.json | head -190 | tail -80

Repository: larksuite/cli

Length of output: 3690


Use explicit Feishu user IDs in the persons column.

The "name" column at line 165 is configured with "data_type": "persons". The placeholder values "xxx" at lines 189, 196, and 203 are invalid—persons columns require Feishu user IDs (e.g., user_id, open_id, union_id, or lark_id). Replace with realistic placeholder IDs (e.g., ou_xxxxxxxxxxxxxxxx) to make the example functional for testing.

Suggested edit
                         {
                             "name": [
-                                "xxx"
+                                "ou_xxxxxxxxxxxxxxxx"
                             ],
                             "duration": "小于1小时",
                             "diff": "↓12%"
                         },
                         {
                             "name": [
-                                "xxx"
+                                "ou_yyyyyyyyyyyyyyyy"
                             ],
                             "duration": "2 小时",
                             "diff": "↑5%"
                         },
                         {
                             "name": [
-                                "xxx"
+                                "ou_zzzzzzzzzzzzzzzz"
                             ],
                             "duration": "3 小时",
                             "diff": "↓10%"
                         }
📝 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
"name": [
"xxx"
],
"duration": "小于1小时",
"diff": "↓12%"
},
{
"name": [
"xxx"
],
"duration": "2 小时",
"diff": "↑5%"
},
{
"name": [
"xxx"
],
"name": [
"ou_xxxxxxxxxxxxxxxx"
],
"duration": "小于1小时",
"diff": "↓12%"
},
{
"name": [
"ou_yyyyyyyyyyyyyyyy"
],
"duration": "2 小时",
"diff": "↑5%"
},
{
"name": [
"ou_zzzzzzzzzzzzzzzz"
],
"duration": "3 小时",
"diff": "↓10%"
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/lark-im/card-examples/data-report-dashboard.json` around lines 188 -
204, The persons-type column uses placeholder names ("xxx") which are invalid
for Feishu persons; update each "name" array used under the persons column (the
objects containing "name", "duration", "diff") to contain realistic Feishu user
identifiers instead of "xxx" (for example replace "xxx" with values like
"ou_xxxxxxxxxxxxxxxx" or a valid "user_id"/"open_id"/"union_id"/"lark_id") so
the "data_type":"persons" entries are valid for testing; ensure every occurrence
of "name": ["xxx"] in that JSON is replaced with a realistic Feishu ID string.

# This is the 1st commit message:

feat: support send/reply card 2.0

Change-Id: I5e5cdfb37946af52ef7a2a812460e50fa8b09e9c

# This is the commit message larksuite#2:
@91-enjoy 91-enjoy force-pushed the feat/support_send_card_2.0 branch from 9763c79 to 813c912 Compare April 10, 2026 12:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant