{"owner":"larksuite","repo":"cli","hasSkills":true,"totalSkillsCount":527,"totalTokensCount":1148598,"categories":["root-instruction","anthropic-skill","subagent-persona","cursor-rule"],"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md","internal/qualitygate/skillscan/testdata/skills/lark-demo/SKILL.md","isolated-skills/lark-suite/SKILL.md","scripts/skill-format-check/tests/bad-skill-no-frontmatter/SKILL.md","scripts/skill-format-check/tests/bad-skill-unclosed-frontmatter/SKILL.md","scripts/skill-format-check/tests/bad-skill/SKILL.md","scripts/skill-format-check/tests/good-skill-complex/SKILL.md","scripts/skill-format-check/tests/good-skill-minimal/SKILL.md","scripts/skill-format-check/tests/good-skill/SKILL.md","skills/lark-approval/SKILL.md","skills/lark-approval/references/lark-approval-approvals-get.md","skills/lark-approval/references/lark-approval-approvals-search.md","skills/lark-approval/references/lark-approval-initiate.md","skills/lark-approval/references/lark-approval-instance-form-control-parameters.md","skills/lark-approval/references/lark-approval-instance-value-sourcing.md","skills/lark-approval/references/lark-approval-instances-cancel.md","skills/lark-approval/references/lark-approval-instances-cc.md","skills/lark-approval/references/lark-approval-instances-get.md","skills/lark-approval/references/lark-approval-instances-initiated.md","skills/lark-approval/references/lark-approval-tasks-add-sign.md","skills/lark-approval/references/lark-approval-tasks-approve.md","skills/lark-approval/references/lark-approval-tasks-query.md","skills/lark-approval/references/lark-approval-tasks-reject.md","skills/lark-approval/references/lark-approval-tasks-remind.md","skills/lark-approval/references/lark-approval-tasks-rollback.md","skills/lark-approval/references/lark-approval-tasks-transfer.md","skills/lark-apps/SKILL.md","skills/lark-apps/creative-design/agents/fork-verifier-agent.md","skills/lark-apps/creative-design/agents/vision-probe-agent.md","skills/lark-apps/creative-design/creative-design.md","skills/lark-apps/creative-design/references/aily.md","skills/lark-apps/creative-design/references/animated-video.md","skills/lark-apps/creative-design/references/charts.md","skills/lark-apps/creative-design/references/claude.md","skills/lark-apps/creative-design/references/codex.md","skills/lark-apps/creative-design/references/data-report.md","skills/lark-apps/creative-design/references/frontend-design.md","skills/lark-apps/creative-design/references/hi-fi-design.md","skills/lark-apps/creative-design/references/interactive-prototype.md","skills/lark-apps/creative-design/references/make-a-deck.md","skills/lark-apps/creative-design/references/visual-exposure.md","skills/lark-apps/creative-design/references/wireframe.md","skills/lark-apps/references/lark-apps-access-scope-get.md","skills/lark-apps/references/lark-apps-access-scope-set.md","skills/lark-apps/references/lark-apps-automation.md","skills/lark-apps/references/lark-apps-cache.md","skills/lark-apps/references/lark-apps-cloud-dev.md","skills/lark-apps/references/lark-apps-create.md","skills/lark-apps/references/lark-apps-db-execute.md","skills/lark-apps/references/lark-apps-db.md","skills/lark-apps/references/lark-apps-env-pull.md","skills/lark-apps/references/lark-apps-env.md","skills/lark-apps/references/lark-apps-export.md","skills/lark-apps/references/lark-apps-file.md","skills/lark-apps/references/lark-apps-get.md","skills/lark-apps/references/lark-apps-git-credential.md","skills/lark-apps/references/lark-apps-html-publish.md","skills/lark-apps/references/lark-apps-init.md","skills/lark-apps/references/lark-apps-list.md","skills/lark-apps/references/lark-apps-local-dev.md","skills/lark-apps/references/lark-apps-observability.md","skills/lark-apps/references/lark-apps-openapi-key.md","skills/lark-apps/references/lark-apps-plugin-install.md","skills/lark-apps/references/lark-apps-plugin-list.md","skills/lark-apps/references/lark-apps-plugin-uninstall.md","skills/lark-apps/references/lark-apps-release-create.md","skills/lark-apps/references/lark-apps-release-get.md","skills/lark-apps/references/lark-apps-release-list.md","skills/lark-apps/references/lark-apps-role.md","skills/lark-apps/references/lark-apps-session-messages-list.md","skills/lark-apps/references/lark-apps-update.md","skills/lark-apps/references/lark-apps-user-id-convert.md","skills/lark-attendance/SKILL.md","skills/lark-base/SKILL.md","skills/lark-base/references/lark-base-advanced-permission-and-role.md","skills/lark-base/references/lark-base-app-block-data-config.md","skills/lark-base/references/lark-base-app.md","skills/lark-base/references/lark-base-dashboard-block-config.md","skills/lark-base/references/lark-base-dashboard-block-get-data.md","skills/lark-base/references/lark-base-dashboard.md","skills/lark-base/references/lark-base-data-query.md","skills/lark-base/references/lark-base-field-create.md","skills/lark-base/references/lark-base-field-extension.md","skills/lark-base/references/lark-base-field-formula.md","skills/lark-base/references/lark-base-field-lookup.md","skills/lark-base/references/lark-base-field-schema.md","skills/lark-base/references/lark-base-field-update.md","skills/lark-base/references/lark-base-filter-condition.md","skills/lark-base/references/lark-base-form-detail.md","skills/lark-base/references/lark-base-form-questions-create.md","skills/lark-base/references/lark-base-form-questions-update.md","skills/lark-base/references/lark-base-form-submit.md","skills/lark-base/references/lark-base-record-history-list.md","skills/lark-base/references/lark-base-record-query-and-analysis-sop.md","skills/lark-base/references/lark-base-role-config.md","skills/lark-base/references/lark-base-template-center.md","skills/lark-base/references/lark-base-view-set-filter.md","skills/lark-base/references/lark-base-view.md","skills/lark-base/references/lark-base-workflow-schema.md","skills/lark-base/references/lark-base-workflow.md","skills/lark-calendar/SKILL.md","skills/lark-calendar/references/lark-calendar-create.md","skills/lark-calendar/references/lark-calendar-join-event.md","skills/lark-calendar/references/lark-calendar-list-attendees.md","skills/lark-calendar/references/lark-calendar-meeting-relation.md","skills/lark-calendar/references/lark-calendar-meeting.md","skills/lark-calendar/references/lark-calendar-recurring.md","skills/lark-calendar/references/lark-calendar-room-find.md","skills/lark-calendar/references/lark-calendar-rsvp.md","skills/lark-calendar/references/lark-calendar-schedule-clear-time.md","skills/lark-calendar/references/lark-calendar-schedule-fuzzy-time.md","skills/lark-calendar/references/lark-calendar-schedule-meeting.md","skills/lark-calendar/references/lark-calendar-suggestion.md","skills/lark-calendar/references/lark-calendar-transfer.md","skills/lark-calendar/references/lark-calendar-update.md","skills/lark-contact/SKILL.md","skills/lark-contact/references/lark-contact-get-user.md","skills/lark-contact/references/lark-contact-search-bot.md","skills/lark-contact/references/lark-contact-search-user.md","skills/lark-doc/SKILL.md","skills/lark-doc/references/genres/business-analysis.md","skills/lark-doc/references/genres/data-report.md","skills/lark-doc/references/genres/email.md","skills/lark-doc/references/genres/execution-plan.md","skills/lark-doc/references/genres/formal-doc.md","skills/lark-doc/references/genres/meeting-minutes.md","skills/lark-doc/references/genres/memo-brief.md","skills/lark-doc/references/genres/official-redhead.md","skills/lark-doc/references/genres/prd.md","skills/lark-doc/references/genres/proposal.md","skills/lark-doc/references/genres/research-report.md","skills/lark-doc/references/genres/retrospective.md","skills/lark-doc/references/genres/route-consumer.md","skills/lark-doc/references/genres/route-creative.md","skills/lark-doc/references/genres/route-knowledge.md","skills/lark-doc/references/genres/route-marketing.md","skills/lark-doc/references/genres/route-media.md","skills/lark-doc/references/genres/route-opinion.md","skills/lark-doc/references/genres/route-personal-brand.md","skills/lark-doc/references/genres/route-platform.md","skills/lark-doc/references/genres/route-report.md","skills/lark-doc/references/genres/route-workplace.md","skills/lark-doc/references/genres/sop-tutorial.md","skills/lark-doc/references/genres/technical-doc.md","skills/lark-doc/references/genres/wechat.md","skills/lark-doc/references/genres/weekly-report.md","skills/lark-doc/references/genres/white-paper.md","skills/lark-doc/references/genres/xiaohongshu.md","skills/lark-doc/references/lark-doc-create-workflow.md","skills/lark-doc/references/lark-doc-create.md","skills/lark-doc/references/lark-doc-fetch.md","skills/lark-doc/references/lark-doc-history.md","skills/lark-doc/references/lark-doc-md.md","skills/lark-doc/references/lark-doc-media-download.md","skills/lark-doc/references/lark-doc-media-insert.md","skills/lark-doc/references/lark-doc-media-preview.md","skills/lark-doc/references/lark-doc-mindnote.md","skills/lark-doc/references/lark-doc-resource-cover.md","skills/lark-doc/references/lark-doc-script.md","skills/lark-doc/references/lark-doc-update.md","skills/lark-doc/references/lark-doc-whiteboard.md","skills/lark-doc/references/lark-doc-xml-extended-blocks.md","skills/lark-doc/references/lark-doc-xml.md","skills/lark-drive/SKILL.md","skills/lark-drive/references/lark-drive-add-comment.md","skills/lark-drive/references/lark-drive-add-reply.md","skills/lark-drive/references/lark-drive-apply-permission.md","skills/lark-drive/references/lark-drive-batch-query-comments.md","skills/lark-drive/references/lark-drive-comment-content.md","skills/lark-drive/references/lark-drive-comment-location.md","skills/lark-drive/references/lark-drive-copy.md","skills/lark-drive/references/lark-drive-cover.md","skills/lark-drive/references/lark-drive-create-folder.md","skills/lark-drive/references/lark-drive-create-shortcut.md","skills/lark-drive/references/lark-drive-delete-reply.md","skills/lark-drive/references/lark-drive-delete.md","skills/lark-drive/references/lark-drive-download.md","skills/lark-drive/references/lark-drive-export-download.md","skills/lark-drive/references/lark-drive-export.md","skills/lark-drive/references/lark-drive-files-list.md","skills/lark-drive/references/lark-drive-import.md","skills/lark-drive/references/lark-drive-inspect.md","skills/lark-drive/references/lark-drive-list-comments.md","skills/lark-drive/references/lark-drive-list-replies.md","skills/lark-drive/references/lark-drive-member-add.md","skills/lark-drive/references/lark-drive-member-list.md","skills/lark-drive/references/lark-drive-member-remove.md","skills/lark-drive/references/lark-drive-move.md","skills/lark-drive/references/lark-drive-permission-get-setting.md","skills/lark-drive/references/lark-drive-permission-guide.md","skills/lark-drive/references/lark-drive-preview.md","skills/lark-drive/references/lark-drive-pull.md","skills/lark-drive/references/lark-drive-push.md","skills/lark-drive/references/lark-drive-react-reply.md","skills/lark-drive/references/lark-drive-reactions.md","skills/lark-drive/references/lark-drive-resolve-comment.md","skills/lark-drive/references/lark-drive-restore-comment.md","skills/lark-drive/references/lark-drive-search.md","skills/lark-drive/references/lark-drive-secure-label.md","skills/lark-drive/references/lark-drive-status.md","skills/lark-drive/references/lark-drive-task-result.md","skills/lark-drive/references/lark-drive-update-reply.md","skills/lark-drive/references/lark-drive-update-title.md","skills/lark-drive/references/lark-drive-upload.md","skills/lark-drive/references/lark-drive-version-delete.md","skills/lark-drive/references/lark-drive-version-get.md","skills/lark-drive/references/lark-drive-version-history.md","skills/lark-drive/references/lark-drive-version-revert.md","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-analysis.md","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-discovery.md","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-execution.md","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-planning.md","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-rollback.md","skills/lark-drive/references/lark-drive-workflow-knowledge-organize.md","skills/lark-drive/references/lark-drive-workflow-permission-governance-commands.md","skills/lark-drive/references/lark-drive-workflow-permission-governance-outputs.md","skills/lark-drive/references/lark-drive-workflow-permission-governance.md","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-execute.md","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-recall.md","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-resolve-verify.md","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-review-plan.md","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-setup.md","skills/lark-drive/references/lark-drive-workflow-topic-move-collector.md","skills/lark-drive/references/lark-drive-workflow.md","skills/lark-event/SKILL.md","skills/lark-event/references/lark-event-application.md","skills/lark-event/references/lark-event-approval.md","skills/lark-event/references/lark-event-im.md","skills/lark-event/references/lark-event-minutes.md","skills/lark-event/references/lark-event-task.md","skills/lark-event/references/lark-event-vc.md","skills/lark-event/references/lark-event-whiteboard.md","skills/lark-im/SKILL.md","skills/lark-im/references/card/card-2.0-schema.md","skills/lark-im/references/card/components/button.md","skills/lark-im/references/card/components/chart.md","skills/lark-im/references/card/components/checker.md","skills/lark-im/references/card/components/collapsible_panel.md","skills/lark-im/references/card/components/column_set.md","skills/lark-im/references/card/components/date_picker.md","skills/lark-im/references/card/components/div.md","skills/lark-im/references/card/components/form.md","skills/lark-im/references/card/components/header.md","skills/lark-im/references/card/components/hr.md","skills/lark-im/references/card/components/img.md","skills/lark-im/references/card/components/img_combination.md","skills/lark-im/references/card/components/input.md","skills/lark-im/references/card/components/interactive_container.md","skills/lark-im/references/card/components/markdown.md","skills/lark-im/references/card/components/multi_select_person.md","skills/lark-im/references/card/components/multi_select_static.md","skills/lark-im/references/card/components/overflow.md","skills/lark-im/references/card/components/person.md","skills/lark-im/references/card/components/person_list.md","skills/lark-im/references/card/components/picker_datetime.md","skills/lark-im/references/card/components/picker_time.md","skills/lark-im/references/card/components/recycling_container.md","skills/lark-im/references/card/components/select_img.md","skills/lark-im/references/card/components/select_person.md","skills/lark-im/references/card/components/select_static.md","skills/lark-im/references/card/components/table.md","skills/lark-im/references/card/lark-im-card-create.md","skills/lark-im/references/card/lark-im-card-style.md","skills/lark-im/references/card/resource/colors.md","skills/lark-im/references/card/resource/icons.md","skills/lark-im/references/lark-im-card-action-reply.md","skills/lark-im/references/lark-im-chat-create.md","skills/lark-im/references/lark-im-chat-identity.md","skills/lark-im/references/lark-im-chat-list.md","skills/lark-im/references/lark-im-chat-members-list.md","skills/lark-im/references/lark-im-chat-messages-list.md","skills/lark-im/references/lark-im-chat-search.md","skills/lark-im/references/lark-im-chat-update.md","skills/lark-im/references/lark-im-feed-group-list-item.md","skills/lark-im/references/lark-im-feed-group-list.md","skills/lark-im/references/lark-im-feed-group-query-item.md","skills/lark-im/references/lark-im-feed-groups.md","skills/lark-im/references/lark-im-feed-shortcut-create.md","skills/lark-im/references/lark-im-feed-shortcut-list.md","skills/lark-im/references/lark-im-feed-shortcut-remove.md","skills/lark-im/references/lark-im-flag-cancel.md","skills/lark-im/references/lark-im-flag-create.md","skills/lark-im/references/lark-im-flag-list.md","skills/lark-im/references/lark-im-message-enrichment.md","skills/lark-im/references/lark-im-message-read-status.md","skills/lark-im/references/lark-im-messages-edit.md","skills/lark-im/references/lark-im-messages-mget.md","skills/lark-im/references/lark-im-messages-reply.md","skills/lark-im/references/lark-im-messages-resources-download.md","skills/lark-im/references/lark-im-messages-search.md","skills/lark-im/references/lark-im-messages-send.md","skills/lark-im/references/lark-im-reactions.md","skills/lark-im/references/lark-im-threads-messages-list.md","skills/lark-mail/SKILL.md","skills/lark-mail/references/lark-mail-calendar-invite.md","skills/lark-mail/references/lark-mail-decline-receipt.md","skills/lark-mail/references/lark-mail-draft-create.md","skills/lark-mail/references/lark-mail-draft-edit.md","skills/lark-mail/references/lark-mail-forward.md","skills/lark-mail/references/lark-mail-html.md","skills/lark-mail/references/lark-mail-lint-html.md","skills/lark-mail/references/lark-mail-message-modify.md","skills/lark-mail/references/lark-mail-message-trash.md","skills/lark-mail/references/lark-mail-message.md","skills/lark-mail/references/lark-mail-messages.md","skills/lark-mail/references/lark-mail-recall.md","skills/lark-mail/references/lark-mail-recipient-search.md","skills/lark-mail/references/lark-mail-reply-all.md","skills/lark-mail/references/lark-mail-reply.md","skills/lark-mail/references/lark-mail-rules.md","skills/lark-mail/references/lark-mail-send-as.md","skills/lark-mail/references/lark-mail-send-receipt.md","skills/lark-mail/references/lark-mail-send-status.md","skills/lark-mail/references/lark-mail-send.md","skills/lark-mail/references/lark-mail-share-to-chat.md","skills/lark-mail/references/lark-mail-signature.md","skills/lark-mail/references/lark-mail-template-create.md","skills/lark-mail/references/lark-mail-template-update.md","skills/lark-mail/references/lark-mail-template.md","skills/lark-mail/references/lark-mail-thread-modify.md","skills/lark-mail/references/lark-mail-thread-trash.md","skills/lark-mail/references/lark-mail-thread.md","skills/lark-mail/references/lark-mail-triage.md","skills/lark-mail/references/lark-mail-watch.md","skills/lark-markdown/SKILL.md","skills/lark-markdown/references/lark-markdown-create.md","skills/lark-markdown/references/lark-markdown-diff.md","skills/lark-markdown/references/lark-markdown-fetch.md","skills/lark-markdown/references/lark-markdown-overwrite.md","skills/lark-markdown/references/lark-markdown-patch.md","skills/lark-meeting/SKILL.md","skills/lark-meeting/references/lark-minutes-apply-permission.md","skills/lark-meeting/references/lark-minutes-detail.md","skills/lark-meeting/references/lark-minutes-download.md","skills/lark-meeting/references/lark-minutes-search.md","skills/lark-meeting/references/lark-minutes-speaker-replace.md","skills/lark-meeting/references/lark-minutes-summary.md","skills/lark-meeting/references/lark-minutes-todo.md","skills/lark-meeting/references/lark-minutes-update.md","skills/lark-meeting/references/lark-minutes-upload.md","skills/lark-meeting/references/lark-note-detail.md","skills/lark-meeting/references/lark-note-transcript.md","skills/lark-meeting/references/lark-vc-agent-meeting-end.md","skills/lark-meeting/references/lark-vc-agent-meeting-invite.md","skills/lark-meeting/references/lark-vc-agent-meeting-join.md","skills/lark-meeting/references/lark-vc-agent-meeting-leave.md","skills/lark-meeting/references/lark-vc-detail.md","skills/lark-meeting/references/lark-vc-meeting-countdown.md","skills/lark-meeting/references/lark-vc-meeting-events.md","skills/lark-meeting/references/lark-vc-meeting-list-active.md","skills/lark-meeting/references/lark-vc-meeting-message-send.md","skills/lark-meeting/references/lark-vc-meeting-screenshot.md","skills/lark-meeting/references/lark-vc-recording.md","skills/lark-meeting/references/lark-vc-search.md","skills/lark-meeting/scenes/create-and-edit-minutes.md","skills/lark-meeting/scenes/live-meeting-attend.md","skills/lark-meeting/scenes/live-meeting-interact.md","skills/lark-meeting/scenes/query-meeting-and-artifacts.md","skills/lark-meeting/scenes/query-minutes-and-artifacts.md","skills/lark-meeting/scenes/query-note-and-artifacts.md","skills/lark-minutes/SKILL.md","skills/lark-note/SKILL.md","skills/lark-okr/SKILL.md","skills/lark-okr/references/lark-okr-alignments.md","skills/lark-okr/references/lark-okr-batch-create.md","skills/lark-okr/references/lark-okr-comment-create.md","skills/lark-okr/references/lark-okr-comment-delete.md","skills/lark-okr/references/lark-okr-comment-detail.md","skills/lark-okr/references/lark-okr-comment-get.md","skills/lark-okr/references/lark-okr-comment-list.md","skills/lark-okr/references/lark-okr-comment-patch.md","skills/lark-okr/references/lark-okr-comment-solve-reopen.md","skills/lark-okr/references/lark-okr-contentblock.md","skills/lark-okr/references/lark-okr-create.md","skills/lark-okr/references/lark-okr-cycle-detail.md","skills/lark-okr/references/lark-okr-cycle-list.md","skills/lark-okr/references/lark-okr-entities.md","skills/lark-okr/references/lark-okr-image-upload.md","skills/lark-okr/references/lark-okr-indicator-update.md","skills/lark-okr/references/lark-okr-indicators.md","skills/lark-okr/references/lark-okr-patch.md","skills/lark-okr/references/lark-okr-progress-create.md","skills/lark-okr/references/lark-okr-progress-delete.md","skills/lark-okr/references/lark-okr-progress-get.md","skills/lark-okr/references/lark-okr-progress-list.md","skills/lark-okr/references/lark-okr-progress-update.md","skills/lark-okr/references/lark-okr-reorder.md","skills/lark-okr/references/lark-okr-weight.md","skills/lark-openapi-explorer/SKILL.md","skills/lark-shared/SKILL.md","skills/lark-shared/references/lark-shared-config-init.md","skills/lark-shared/references/lark-shared-high-risk-approval.md","skills/lark-shared/references/lark-shared-identity-and-permissions.md","skills/lark-shared/references/lark-shared-output-contract.md","skills/lark-shared/references/lark-shared-update-notice.md","skills/lark-shared/references/lark-wiki-token-routing.md","skills/lark-sheets/SKILL.md","skills/lark-sheets/references/lark-sheets-batch-update.md","skills/lark-sheets/references/lark-sheets-changeset.md","skills/lark-sheets/references/lark-sheets-chart.md","skills/lark-sheets/references/lark-sheets-conditional-format.md","skills/lark-sheets/references/lark-sheets-filter-view.md","skills/lark-sheets/references/lark-sheets-filter.md","skills/lark-sheets/references/lark-sheets-float-image.md","skills/lark-sheets/references/lark-sheets-formula-translation.md","skills/lark-sheets/references/lark-sheets-formula-verify.md","skills/lark-sheets/references/lark-sheets-history.md","skills/lark-sheets/references/lark-sheets-pivot-table.md","skills/lark-sheets/references/lark-sheets-range-operations.md","skills/lark-sheets/references/lark-sheets-read-data.md","skills/lark-sheets/references/lark-sheets-search-replace.md","skills/lark-sheets/references/lark-sheets-sheet-structure.md","skills/lark-sheets/references/lark-sheets-sparkline.md","skills/lark-sheets/references/lark-sheets-styles-put.md","skills/lark-sheets/references/lark-sheets-visual-standards.md","skills/lark-sheets/references/lark-sheets-workbook.md","skills/lark-sheets/references/lark-sheets-write-cells.md","skills/lark-skill-maker/SKILL.md","skills/lark-slides/SKILL.md","skills/lark-slides/references/asset-planning.md","skills/lark-slides/references/cli/lark-slides-add-slide.md","skills/lark-slides/references/cli/lark-slides-create.md","skills/lark-slides/references/cli/lark-slides-delete-slide.md","skills/lark-slides/references/cli/lark-slides-history.md","skills/lark-slides/references/cli/lark-slides-media-upload.md","skills/lark-slides/references/cli/lark-slides-replace-slide.md","skills/lark-slides/references/cli/lark-slides-screenshot.md","skills/lark-slides/references/cli/lark-slides-update-slide.md","skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md","skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md","skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md","skills/lark-slides/references/iconpark-index.json","skills/lark-slides/references/iconpark.md","skills/lark-slides/references/lark-slides-add-slide.md","skills/lark-slides/references/lark-slides-create.md","skills/lark-slides/references/lark-slides-delete-slide.md","skills/lark-slides/references/lark-slides-edit-workflows.md","skills/lark-slides/references/lark-slides-history.md","skills/lark-slides/references/lark-slides-media-upload.md","skills/lark-slides/references/lark-slides-pptx-template-workflows.md","skills/lark-slides/references/lark-slides-replace-slide.md","skills/lark-slides/references/lark-slides-screenshot.md","skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md","skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md","skills/lark-slides/references/lark-slides-xml-presentations-get.md","skills/lark-slides/references/planning-layer.md","skills/lark-slides/references/troubleshooting.md","skills/lark-slides/references/validation-checklist.md","skills/lark-slides/references/visual-planning.md","skills/lark-slides/references/workflow/error-handling.md","skills/lark-slides/references/workflow/slides-editing.md","skills/lark-slides/references/workflow/template-editing.md","skills/lark-slides/references/workflow/validation-xml.md","skills/lark-slides/references/xml-schema-quick-ref.md","skills/lark-slides/references/xml/iconpark-index.json","skills/lark-slides/references/xml/iconpark.md","skills/lark-slides/references/xml/xml-schema-quick-ref.md","skills/lark-task/SKILL.md","skills/lark-task/references/lark-task-assign.md","skills/lark-task/references/lark-task-comment.md","skills/lark-task/references/lark-task-complete.md","skills/lark-task/references/lark-task-create.md","skills/lark-task/references/lark-task-followers.md","skills/lark-task/references/lark-task-get-my-tasks.md","skills/lark-task/references/lark-task-get-related-tasks.md","skills/lark-task/references/lark-task-reminder.md","skills/lark-task/references/lark-task-reopen.md","skills/lark-task/references/lark-task-search.md","skills/lark-task/references/lark-task-sections.md","skills/lark-task/references/lark-task-set-ancestor.md","skills/lark-task/references/lark-task-tasklist-create.md","skills/lark-task/references/lark-task-tasklist-members.md","skills/lark-task/references/lark-task-tasklist-search.md","skills/lark-task/references/lark-task-tasklist-task-add.md","skills/lark-task/references/lark-task-update.md","skills/lark-task/references/lark-task-upload-attachment.md","skills/lark-vc-agent/SKILL.md","skills/lark-vc/SKILL.md","skills/lark-whiteboard/SKILL.md","skills/lark-whiteboard/elements/connectors.md","skills/lark-whiteboard/elements/content.md","skills/lark-whiteboard/elements/image.md","skills/lark-whiteboard/elements/layout.md","skills/lark-whiteboard/elements/schema.md","skills/lark-whiteboard/elements/style.md","skills/lark-whiteboard/elements/typography.md","skills/lark-whiteboard/references/lark-whiteboard-export.md","skills/lark-whiteboard/references/lark-whiteboard-update.md","skills/lark-whiteboard/references/lark-whiteboard-workflow.md","skills/lark-whiteboard/routes/dsl.md","skills/lark-whiteboard/routes/mermaid.md","skills/lark-whiteboard/routes/svg-edit.md","skills/lark-whiteboard/routes/svg.md","skills/lark-whiteboard/scenes/architecture.md","skills/lark-whiteboard/scenes/bar-chart.md","skills/lark-whiteboard/scenes/comparison.md","skills/lark-whiteboard/scenes/fishbone.md","skills/lark-whiteboard/scenes/flowchart.md","skills/lark-whiteboard/scenes/flywheel.md","skills/lark-whiteboard/scenes/funnel.md","skills/lark-whiteboard/scenes/line-chart.md","skills/lark-whiteboard/scenes/mention.md","skills/lark-whiteboard/scenes/mermaid.md","skills/lark-whiteboard/scenes/milestone.md","skills/lark-whiteboard/scenes/organization.md","skills/lark-whiteboard/scenes/photo-showcase.md","skills/lark-whiteboard/scenes/pyramid.md","skills/lark-whiteboard/scenes/swimlane.md","skills/lark-whiteboard/scenes/treemap.md","skills/lark-wiki/SKILL.md","skills/lark-wiki/references/lark-wiki-delete-space.md","skills/lark-wiki/references/lark-wiki-member-add.md","skills/lark-wiki/references/lark-wiki-member-list.md","skills/lark-wiki/references/lark-wiki-member-remove.md","skills/lark-wiki/references/lark-wiki-move-to-drive.md","skills/lark-wiki/references/lark-wiki-move.md","skills/lark-wiki/references/lark-wiki-node-copy.md","skills/lark-wiki/references/lark-wiki-node-create.md","skills/lark-wiki/references/lark-wiki-node-delete.md","skills/lark-wiki/references/lark-wiki-node-get.md","skills/lark-wiki/references/lark-wiki-node-list.md","skills/lark-wiki/references/lark-wiki-space-create.md","skills/lark-wiki/references/lark-wiki-space-list.md","skills/lark-workflow-meeting-summary/SKILL.md","skills/lark-workflow-standup-report/SKILL.md","tests/cli_e2e/cli-e2e-testcase-writer/SKILL.md",".cursorrules (ankra-cli.mdc)"],"skills":{"AGENTS.md":"# AGENTS.md\n\n## Purpose\n\n`lark-cli` is the official Lark/Feishu CLI for humans and AI agents. Optimize\nfor predictable machine-readable behavior without making the human CLI worse.\n\nKeep each PR focused on one goal: CLI UX, reliability, simpler explicit code,\nor a useful gate. Done means the correct implementation surface, preserved\ncontracts unless a break was requested, and reported checks.\n\nPublic behavior, tests, lint, and CI define current contracts. Existing code is\nevidence, but a legacy exception is not precedent; `Proposal` documents are\ndirection only. Do not mix unrelated cleanup, hand-edit generated files, weaken\ngates, or broaden allowlists to make CI pass.\n\n## Implementation Discipline\n\nUse this sequence for product behavior or enforcement changes:\n\n1. Establish the current contract and owner before choosing a solution. Trace the\n   flow from the command or shortcut through runtime and internal owners to wire\n   output; inspect affected callers and tests, then choose the surface below.\n2. Apply YAGNI to scope. Implement the behavior required now; do not add\n   speculative modes, configuration, compatibility paths, extension points, or\n   scaffolding.\n3. Reuse the project's existing machinery before creating a parallel path.\n   Prefer the owning generic, runtime, or internal surface, then the Go standard\n   library or an existing dependency, while preserving the contracts below.\n4. Fix the root cause at the narrowest cohesive boundary shared by affected\n   callers. Keep command and domain policy at the caller unless there is a real\n   cross-command invariant for an internal owner to enforce.\n5. Ship the smallest complete change: implementation, a revert-failing regression\n   test for behavior or enforcement, and required contract or guidance updates.\n\nOptimize for minimum owned complexity, not minimum diff or line count. A correct\nroot-cause fix may touch the owner, callers, tests, and docs; a one-line workaround\nat the wrong layer is not simpler. Prefer deletion and boring explicit code, and\navoid one-use abstractions or new dependencies for straightforward behavior.\n\nYAGNI never overrides explicit requirements or output, error, path, security,\ncompatibility, and data-safety contracts. If a deliberately limited solution has\na real ceiling, document the ceiling and the concrete condition for expanding it\nat the decision point.\n\n## Build\n\nRun `make build` for the canonical local build; it writes `./lark-cli` with\nversion metadata and the committed Catalog Snapshot embedded from\n`internal/registry/catalog/manifest.json` plus\n`internal/registry/catalog/services/*.json`. Build and test targets consume this\ntracked snapshot without a metadata fetch or Python prerequisite.\n`make live-skills-test` additionally requires working `npx` and network access.\n\n## Choose the Correct Surface\n\n| Need | Implement in | Rule |\n|------|--------------|------|\n| Agent/human-friendly workflow, composition, or smart defaults | `shortcuts/<domain>/` via `common.Shortcut` | Must add UX or workflow value beyond exposing one endpoint. |\n| One-to-one supported OpenAPI method | Committed Catalog Snapshot under `internal/registry/catalog/manifest.json` plus `services/*.json`, and generic `cmd/service/` machinery | Verify it with `schema`. Update the manifest and matching service snapshot together; do not add a shortcut merely to expose a missing catalog method. |\n| Arbitrary OpenAPI endpoint | Generic `cmd/api/` machinery | Keep it endpoint-agnostic. |\n| Auth, config, profile, update, or CLI lifecycle | `cmd/<area>/` plus the owning shared/internal package | Keep new Cobra code as wiring when a lower owner exists. |\n| EventKey, payload shape, or domain projection | `events/<domain>/` | Shared event mechanics stay in `internal/event/`; CLI assembly stays in `cmd/event/`. |\n| Command-independent mechanism or cross-command invariant | Owning `internal/<area>/` package | Keep UX/domain policy at the caller; use a cohesive owner, not a generic utils package. Test the owner and affected caller contracts. |\n| Public plugin or host integration | `extension/` | Exported symbols are compatibility commitments; orchestration stays internal. |\n| Per-command decision guidance: when, avoid, prerequisites, tips, or examples | `affordance/<domain>.md` | Enrich `--help` and `schema` without restating command descriptions, flags, or field schemas. |\n| Domain routing, concepts, safety, or cross-command agent workflow | `skills/<name>/SKILL.md` and `references/` | Keep always-needed decisions in `SKILL.md`, conditional HOW in references, and link commands from affordance. |\n\nDo not duplicate one command surface inside another. Register new shortcuts in\nthe domain's `Shortcuts()`; declare risk, identities/scopes, flags, and dry-run.\n\n## Source Layout\n\n| Path | What it does |\n|------|-------------|\n| `cmd/root.go` | Entry point, command registration, strict mode pruning |\n| `cmd/profile/` | Multi-profile management (add/list/use/rename/remove) |\n| `cmd/config/` | Config init, show, strict-mode |\n| `cmd/service/` | Auto-registers API commands from `internal/registry/catalog/manifest.json` and `internal/registry/catalog/services/*.json` |\n| `shortcuts/common/runner.go` | Shortcut execution pipeline, Flag.Input (@file/stdin) resolution |\n| `shortcuts/` | Domain-specific shortcut implementations |\n| `internal/cmdutil/factory.go` | Factory pattern — identity resolution, credential, config |\n| `internal/cmdutil/factory_default.go` | Production factory wiring |\n| `internal/credential/` | Credential provider chain (extension → default) |\n| `extension/credential/` | Plugin-facing credential interfaces and env provider |\n| `internal/client/client.go` | APIClient: DoSDKRequest, DoStream |\n| `internal/core/config.go` | Multi-profile config loading/saving |\n| `internal/vfs/` | Filesystem abstraction (use `vfs.*` instead of `os.*`) |\n| `internal/validate/path.go` | Path safety validation |\n\n## Hard Contracts\n\nRead the [JSON output contract](README.md#json-output-contract) before changing\nwire output. Read the [source guard guide](lint/README.md) and `.golangci.yml`\nbefore changing or waiving enforcement.\n\n- Command/flag semantics, help/schema metadata, output placement and shapes,\n  errors, exit codes, risk/identity, and exported APIs are compatibility contracts.\n  When forwarding or echoing accepted input, preserve it verbatim unless its\n  contract defines normalization; never silently substitute another behavior.\n- Success data goes to stdout; typed failure envelopes, progress, warnings, and\n  hints go to stderr. Predicate/self-contained results and partial failures are\n  documented exceptions whose complete result remains on stdout.\n- Keep new or touched Cobra code as wiring. Lark/Feishu API calls in shortcuts go\n  through `*common.RuntimeContext`; direct HTTP is only for non-gateway protocols\n  such as presigned storage and requires a precise `//nolint:forbidigo` reason.\n- Keep user/workspace FileIO invocation-scoped: use `runtime.FileIO()`,\n  `runtime.ValidatePath()`, and `runtime.ResolveSavePath()` so portable commands do\n  not assume a local host or process working directory.\n- Shortcuts do not use `internal/vfs` for user/workspace files. A narrow\n  `//nolint:depguard` waiver is allowed only for CLI-owned state or explicitly\n  CLI-managed host configuration; explain that ownership boundary. Other internal\n  filesystem code uses `internal/vfs` and validates paths.\n- If FileIO lacks a host-local tree operation, prefer an owning `internal/` package\n  or optional capability. Direct `os` calls require a stated local-only boundary,\n  validated and bounded paths, and a precise `//nolint:forbidigo` reason.\n- Do not hardcode resolver-owned hosts. At new API boundaries, or when changed\n  behavior consumes fields from a loose map, project that shape into a typed\n  struct before downstream use. Extend published interfaces through optional\n  interfaces rather than breaking external implementations.\n- Source guards enforce raw HTTP/os/vfs, resolver-host, and migrated-error\n  constructs; other semantics rely on tests and review. Every exemption must be\n  narrow, local, and explain why the safe path does not apply.\n\n## Structured Errors\n\nBefore changing a command failure, taxonomy, or error wire field, read the\n[error contract](errs/ERROR_CONTRACT.md); it owns constructor selection, wrapping,\nextension fields, stability, and CI guards.\n\n- Command-facing failures use typed `errs.*` unless the error contract defines\n  an output-control exception. Never return a final plain `fmt.Errorf` /\n  `errors.New` or ad hoc envelope; pass typed errors through and preserve causes.\n- Lark API failures use a domain typed wrapper, `runtime.CallAPITyped`, or\n  `runtime.DoAPIJSONTyped`; raw callers use `runtime.ClassifyAPIResponse` or\n  `errclass.BuildAPIError`.\n- `param` names only failing user input; recovery belongs in `hint`. Populate\n  `missing_scopes`, `log_id`, and similar fields only from known runtime evidence.\n- Error tests assert typed metadata and cause preservation, not message text alone.\n\n## Affordance and Skills\n\nBefore editing command guidance, read the [affordance guide](affordance/README.md).\nFor plugin distributions, read [Ship skills and command guidance](extension/platform/README.md#ship-skills-and-command-guidance).\n\n- Go metadata/schema owns WHAT; affordance owns command-level WHEN; `SKILL.md`\n  owns domain routing, concepts, safety, and cross-command workflows; `references/`\n  owns detailed or conditional HOW.\n- Do not duplicate canonical descriptions, schemas, or generic error taxonomy.\n  Keep workflow-specific recovery in a skill when it changes agent behavior;\n  affordance examples remain runnable, current, and safe.\n- Skill frontmatter `description` is a concise WHAT/WHEN/NOT routing trigger. Keep\n  always-needed decisions in `SKILL.md`; move conditional detail to `references/`.\n- Skill names and reference paths are public pointers. Every path reachable from\n  shipped docs must ship. Before referencing a new content directory, update\n  `content_embed.go` and add an embedded-FS reachability test; `assets/` and\n  `scripts/` stay source-only unless the distribution contract changes.\n\n## Tests\n\n- Every behavior change needs a nearby test that fails if the implementation is\n  reverted; assert fields, requests, typed errors, or side effects directly.\n- Command/shortcut tests needing a Factory use `cmdutil.TestFactory(t, config)`;\n  isolate config with\n  `t.Setenv(\"LARKSUITE_CLI_CONFIG_DIR\", t.TempDir())`.\n- Tests must not depend on developer profiles, keychains, home directories,\n  execution order, or real credentials unless explicitly live.\n- Live E2E flows are self-contained: create, use, and clean up even after failure.\n\n| Shortcut change | Dry-run E2E | Live E2E |\n|-----------------|:-----------:|:--------:|\n| New shortcut | Required | Required |\n| Flags or request params | Required | Required if behavior changes |\n| Bug fix | Required | Required when risk reaches the API boundary |\n| Internal refactor, no behavior change | Not needed | Not needed |\n\nDry-run tests use placeholder credentials and assert method, URL, params, and\nbody without a real API call. Confirm contracts with `--help` and `schema` first.\nIf no deterministic, cleanable live flow exists, do not leak tenant state or add\na flaky test; document the blocker, fixture conditions, and substitute evidence.\n\n## Validation\n\nRun the narrowest useful check while iterating, then broaden with risk:\n\n| Change | Checks |\n|--------|--------|\n| Go package | `go test ./path/to/package/...`, then the pre-PR Go checks below |\n| Broad/cross-cutting | `make test` |\n| Committed command/help/schema surface | `make quality-gate` |\n| Skills | `node scripts/skill-format-check/index.js`, then `make quality-gate` after committing the change |\n| Affordance | Add/update `internal/affordance/*_source_test.go`; run `go test ./internal/affordance ./cmd/service ./internal/schema` |\n| Make-covered scripts/workflows | `make script-test` |\n| Public plugin SDK | `make examples-build` plus relevant `tests/plugin_e2e` |\n| Auth sidecar | `make sidecar-test` |\n| Skills sync behavior | `make live-skills-test` |\n| Dependencies | `go mod tidy` plus the CI `go-licenses` check |\n\n`make quality-gate` and diff-scoped linters compare the base with `HEAD`; they\nignore staged, unstaged, and untracked changes, so run them after committing.\nSome skill-quality signals are warnings; frontmatter has the separate hard check\nabove. The gate does not validate affordance examples or references in this file:\nrun the focused source test and verify changed paths/symbols directly.\n\n`make test` currently leaves root binaries `audit-observer` and `readonly-policy`; do not stage them.\n\nBefore a Go PR, run `make unit-test`, `make vet`, and `make fmt-check`;\n`go mod tidy` must leave module files unchanged. Set\n`QUALITY_GATE_CHANGED_FROM` to the PR base before diff-scoped checks. Pinned\n`go run module@version` commands need module access unless cached.\n\n```bash\ngo mod tidy\ngit diff --exit-code -- go.mod go.sum\ngo run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.1.6 run --new-from-rev=\"$QUALITY_GATE_CHANGED_FROM\"\ngo run -C lint . --changed-from \"$QUALITY_GATE_CHANGED_FROM\" ..\ngo test -C lint ./... -count=1\ngo run github.com/google/go-licenses/v2@v2.0.1 check ./... --disallowed_types=forbidden,restricted,reciprocal,unknown\n```\n\nCI is authoritative; state exactly which relevant checks were not run.\n\n## Maintaining This File\n\nAdd a root rule only when it is repository-specific, non-obvious, actionable,\nand prevents a recurring failure or high-impact contract breach. Prefer code,\ntests, or CI for mechanizable constraints; keep only rationale and safe exceptions\nhere. Update named references in the same PR, and delete or move stale, obvious,\nredundant, task-local, or fully enforced rules. Each edit should reduce ambiguity,\nnot only add text.\n\n## Commit and PR\n\nUse English Conventional Commits/PR titles, complete the PR template, and never\ncommit secrets, tokens, internal endpoints, or sensitive test data.\n","internal/qualitygate/skillscan/testdata/skills/lark-demo/SKILL.md":"---\nname: lark-demo\ndescription: Demo skill\n---\n\n```bash\n# comment\nlark-cli docs +fetch --api-version v2 --doc A3Ijdemo\nlark-cli im messages list \\\n  --container-id oc_xxx \\\n  --page-size 20\nnpx other-tool\n```\n","isolated-skills/lark-suite/SKILL.md":"---\nname: lark-suite\nversion: 0.1.0\ndescription: 飞书/Lark 聚合能力入口：管理飞书/Lark 产品能力（<!-- LARK_SUITE_KEYS -->等）。当 doubao.com 及其子域名承载飞书资源时也使用本入口，不要回退到 WebFetch。当用户需求涉及上述飞书业务域时使用。\nmetadata:\n  requires:\n    bins:\n      - lark-cli\n---\n\n# Lark Suite\n\n你是飞书/Lark 能力的聚合路由层。你的职责是先判断用户要使用哪个 `lark-*` 子能力，再读取并遵循对应子能力的说明。\n\n`lark-suite` 不直接承载具体 API 操作步骤。除非对应子能力已被读取，否则不要仅根据本文件拼命令、猜参数或执行复杂操作。\n\n所有子能力统一收纳在当前 skill 的 `references/` 目录。选择 `lark-foo` 后，直接读取 `references/lark-foo/GUIDE.md`；不要再次调用 `Skill(lark-foo)`，也不要使用 Find/Glob 遍历或探测整个 references 目录。\n\n## 使用流程\n\n1. 根据用户意图从下方路由表选择一个或多个子能力；即使用户尚未提供链接、ID 或具体工作表，也先选择能力，再由子能力询问缺失信息。\n2. 直接读取 `references/<skill-name>/GUIDE.md` 加载所选子能力，不要把收纳后的子能力当作独立 skill 再次调用。\n3. 仅使用本文件列出的路由与对应子能力入口，不要遍历或探测其他技能目录。\n4. 如果目标能力未列出，返回无法路由的明确提示。\n5. 仅读取当前已选子能力明确要求的前置文件。\n6. 按目标子能力的说明执行；认证、租户、身份、权限和通用排障优先遵循 `lark-shared`。\n\n多步任务可以组合多个子能力，但每一步都应由具体子能力驱动。例如“查联系人并发消息”先用 `lark-contact` 解析身份，再用 `lark-im` 发消息。\n\n## 能力路由\n\n根据用户意图从以下条目选择对应子能力；如果一个任务涉及多个能力，按实际操作顺序逐步读取并使用对应子能力。\n\n<!-- LARK_SUITE_ROUTES -->\n","scripts/skill-format-check/tests/bad-skill-no-frontmatter/SKILL.md":"# No Frontmatter Skill\n\nThis skill completely lacks a YAML frontmatter.\n","scripts/skill-format-check/tests/bad-skill-unclosed-frontmatter/SKILL.md":"---\nname: bad-skill-unclosed\nversion: 1.0.0\ndescription: \"This skill has an unclosed frontmatter block.\"\nmetadata: {}\n\n# Unclosed Frontmatter Skill\n\nThis frontmatter does not have a closing `---` block.","scripts/skill-format-check/tests/bad-skill/SKILL.md":"---\nversion: 1.0.0\nmetadata: {}\n---\n\n# Bad Skill\n\nThis skill is missing required fields like name and description.\n","scripts/skill-format-check/tests/good-skill-complex/SKILL.md":"---\nname: good-skill-complex\nversion: 2.5.1-beta\ndescription: >\n  A very complex description\n  that spans multiple lines\n  and contains weird chars: !@#$%^&*()\nmetadata:\n  requires:\n    bins: [\"lark-cli\", \"node\"]\n  cliHelp: \"lark-cli something --help\"\n  customField: \"customValue\"\n---\n\n# Complex Skill\n\nThis skill has a complex frontmatter block.\n","scripts/skill-format-check/tests/good-skill-minimal/SKILL.md":"---\nname: good-skill-minimal\nversion: 0.1.0\ndescription: Minimal valid description\nmetadata: {}\n---\n\n# Minimal Skill\n\nThis has the bare minimum required fields.\n","scripts/skill-format-check/tests/good-skill/SKILL.md":"---\nname: good-skill\nversion: 1.0.0\ndescription: \"This is a properly formatted skill.\"\nmetadata:\n  requires:\n    bins: [\"lark-cli\"]\n---\n\n# Good Skill\n\nThis skill follows all the formatting rules.\n","skills/lark-approval/SKILL.md":"---\nname: lark-approval\nversion: 1.2.0\ndescription: \"飞书审批：查询和处理审批待办/已办/实例，搜索可发起审批定义、查看定义详情并发起原生审批实例。当用户要处理审批任务、查看审批实例、搜索或发起审批时使用。审批待办不是飞书任务；非审批类待办走 lark-task。不负责创建审批定义；三方审批定义不走原生提单。\"\nmetadata:\n  requires:\n    bins: [\"lark-cli\"]\n  cliHelp: \"lark-cli approval --help\"\n---\n\n\n**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md)，其中包含认证、权限处理**\n\n所有命令默认 `--as user`（审批是人的动作）。调用前先按需读取 references 下对应的文件，查参数结构，不要猜字段；**references 是第一信息源**，只有在 reference 未覆盖的原生 / 高级场景下，才额外用 `lark-cli ... --help`、`lark-cli schema` 等方式补充确认字段。\n\n## 路由优先级（先判断是不是审批，再选命令）\n\n审批待办不是飞书任务。**只要用户的核心对象是审批单据 / 审批待办 / 审批实例，就优先使用 `lark-approval`，不要让渡给 `lark-task`。**\n\n### 明确归 `lark-approval` 的高优先级语义\n\n出现以下任一语义时，优先走 `lark-approval`：\n\n- 审批待办 / 审批单据 / 审批实例 / 审批意见 / 审批定义\n- 同意 / 拒绝 / 转交 / 退回 / 撤回 / 催办 / 加签 / 抄送\n- 待办列表 / 待办单据 / 已发起审批 / 已办审批 / 审批详情 / 同意可编辑\n\n**判定规则：** 只要最终动作是对审批单据做同意、拒绝、转交、退回、撤回、催办、加签、抄送、查详情、查已发起/已办/待办，就归 `lark-approval`。只有当用户处理的是**非审批类任务/待办**时，才走 [`lark-task`](../lark-task/SKILL.md)。\n\n## 选哪个命令\n\n| 想做什么 | 命令 | 按需读取 reference                                                                  |\n|---|---|---------------------------------------------------------------------------------|\n| 搜可发起定义 | `approvals search` | [`lark-approval-approvals-search.md`](references/lark-approval-approvals-search.md) |\n| 看审批定义详情/提单前确认表单与流程 | `approvals get` | [`lark-approval-approvals-get.md`](references/lark-approval-approvals-get.md)   |\n| 发起原生审批实例/提交请假审批/提交报销审批/创建审批实例 | `instances create` | [`lark-approval-initiate.md`](references/lark-approval-initiate.md)             |\n| 查/搜待办、已办 | `tasks query`（`topic`：1待办 2已办 17未读 18已读） | [`lark-approval-tasks-query.md`](references/lark-approval-tasks-query.md)       |\n| 看表单/进度/当前节点 | `instances get` | [`lark-approval-instances-get.md`](references/lark-approval-instances-get.md)   |\n| 同意审批 | `tasks approve` | [`lark-approval-tasks-approve.md`](references/lark-approval-tasks-approve.md)   |\n| 拒绝审批 | `tasks reject` | [`lark-approval-tasks-reject.md`](references/lark-approval-tasks-reject.md)     |\n| 转交审批 | `tasks transfer` | [`lark-approval-tasks-transfer.md`](references/lark-approval-tasks-transfer.md) |\n| 加签审批 | `tasks add_sign` | [`lark-approval-tasks-add-sign.md`](references/lark-approval-tasks-add-sign.md) |\n| 退回审批 | `tasks rollback` | [`lark-approval-tasks-rollback.md`](references/lark-approval-tasks-rollback.md) |\n| 催办审批 | `tasks remind` | [`lark-approval-tasks-remind.md`](references/lark-approval-tasks-remind.md)     |\n| 撤回已发起审批 | `instances cancel` | [`lark-approval-instances-cancel.md`](references/lark-approval-instances-cancel.md) |\n| 给审批实例追加抄送 | `instances cc` | [`lark-approval-instances-cc.md`](references/lark-approval-instances-cc.md)     |\n| 按定义/关键词查已发起审批 | `instances initiated` | [`lark-approval-instances-initiated.md`](references/lark-approval-instances-initiated.md) |\n\n处理链：\n\n- 发起审批：`approvals search` -> `approvals get` -> `instances create`\n- 处理审批：`tasks query` 拿 `instance_code` + `task_id`（操作必须成对带上）→ 只有用户明确需要查看详情、当前节点、表单内容、或流程进度时，再 `instances get` → 执行操作\n\n## 执行原则（减少误路由、误重试和无效消耗）\n\n### 1) 先拿最小必要信息，再执行\n\n- 目标只是处理待办时，优先 `tasks query` 获取 `instance_code` + `task_id`\n- **只有**用户明确要看详情、当前节点、表单内容、流程进度时，才调用 `instances get`\n- 用户已经明确给出 `instance_code` / `task_id` 时，不要先查列表再过滤\n\n### 2) 已知对象时直达动作\n\n- 已拿到 `instance_code` + `task_id` 后，优先直接执行 `tasks approve/reject/transfer/add_sign/rollback/remind`\n- 同一轮里如果已有足够的新鲜查询结果，不要重复 `tasks query`\n- 不要默认走 `list -> filter -> detail -> write` 全链路；对象已明确时应压缩步骤\n\n### 3) 错误码驱动，而不是盲目重试\n\n- 写操作失败后，先看错误码和报错语义，再决定是否补查或结束\n- **除非错误明确提示可恢复或需要补充参数，否则不要重复刷同一个写操作**\n- 同一个失败原因不要连续多次重试，避免 token 和耗时失控，最多重试1次\n\n## 写操作失败处理：1395001 决策树\n\n当拒绝 / 转交 / 退回 / 撤回 / 同意等写操作返回 `1395001`（任务状态异常 / 写前置校验失败）时，按下面规则处理：\n\n1. **先停止盲目重试**，不要连续重复提交相同写操作，最多重试1次\n2. 优先从以下角度解释：\n   - 任务可能已被他人处理\n   - 单据状态已变化，当前动作已不再允许\n   - 当前用户已不具备该任务的操作资格\n   - 当前节点或单据状态不支持该操作\n3. 如需确认，只补 **一次** 状态查询（`tasks query` 或 `instances get`），不要陷入 query/write 循环\n4. 最终给用户明确结论和下一步建议，而不是继续无意义重试\n\n**特别注意：** 对拒绝 / 转交 / 撤回场景更要严格执行上述规则；这些场景最容易因状态切换而失败。\n\n```bash\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user\nlark-cli approval approvals get --params '{\"approval_code\":\"<code>\"}' --as user\nlark-cli approval instances create --data '{\"approval_code\":\"<code>\",\"form\":\"[...]\"}' --yes --as user\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\nlark-cli approval tasks approve --data '{\"instance_code\":\"<ic>\",\"task_id\":\"<tid>\",\"comment\":\"同意\"}' --as user\n```\n\n## 不在本 skill 范围\n\n创建审批定义（走飞书客户端或审批管理后台）；三方定义发起（返回 `create_link`，引导用户通过链接发起）；非审批类待办 → [`lark-task`](../lark-task/SKILL.md)\n","skills/lark-approval/references/lark-approval-approvals-get.md":"\n# approval approvals get\n\n获取单个审批定义详情（用户级只读操作）。适合在发起审批实例前，先确认审批名称、表单控件结构、选项值范围以及流程节点信息。\n\n需要的 scopes: [\"approval:approval:read\"]\n\n## 命令\n\n```bash\n# 按 approval_code 查询审批定义详情\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user\n\n# 表格格式输出，便于快速浏览顶层字段\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{...}'` | 是 | 查询参数，使用 JSON 传入 |\n| `approval_code` | 是 | 审批定义 Code；通常来自 `approval approvals search` 的结果 |\n| `locale` | 否 | 返回语言，例如 `zh-CN`、`en-US`、`ja-JP` |\n| `--as user` | 否 | 建议显式指定用户身份；审批定义详情通常按当前用户可见范围读取 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 常见输入来源\n\n如果你已经有 `approval_code`，可直接查询：\n\n```bash\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user\n```\n\n如果你还没有 `approval_code`，先搜索可发起审批定义：\n\n```bash\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user\n```\n\n## 输出重点字段\n\n返回结果中，优先关注以下字段：\n\n| 字段 | 说明 |\n|------|------|\n| `approval_code` | 审批定义 Code |\n| `approval_name` | 审批定义名称；确认是不是用户想发起的那张单 |\n| `form` | 表单定义快照；用于识别控件 `id`、`type`、选项值范围、明细子控件结构 |\n| `node_list` | 流程节点列表；用于识别节点 key、是否需要补充审批人、是否允许多人 |\n\n## form 的使用重点\n\n`form` 最重要的作用是帮助 agent **识别怎么组装 `instances.create.data.form`**，而不是直接把它原样提交出去。\n\n重点看：\n\n| 字段 / 结构 | 说明 |\n|------|------|\n| `form[].id` | 控件 ID；后续创建实例时必须使用 |\n| `form[].type` | 控件类型，例如 `input`、`date`、`radio`、`checkbox`、`fieldList` |\n| `form[].value` / 选项定义 | 用来识别可选值范围、默认值或选项值 |\n| 明细 / 子控件结构 | 用于识别 `fieldList`、控件组等复杂控件的子字段结构 |\n\n**注意：`approvals.get.form` 不是 `instances.create` 可直接复用的 payload 模板。** 它是“定义快照”，主要用于识别字段结构与选项值范围。\n\n## node_list 的使用重点\n\n`node_list` 主要用于后续决定是否要补 `node_approver_list` / `node_cc_list`。\n\n重点看：\n\n| 字段 | 说明 |\n|------|------|\n| `node_list[].custom_node_id` | 自定义节点标识；后续补节点参数时优先作为 key |\n| `node_list[].node_id` | 节点 ID；若没有 `custom_node_id`，通常退回用它做 key |\n| `node_list[].need_approver` | 是否要求发起人补充审批人 |\n| `node_list[].approver_chosen_multi` | 是否允许为该节点选择多个审批人 |\n\n## 使用建议\n\n- **这是发起原生审批实例前的必要只读步骤。** 推荐固定走：`approvals search` -> `approvals get` -> `instances create`。\n- **如果用户已经明确给了 `approval_code`，直接用这个命令。** 不必再走 `approvals search`。\n- **先确认 `approval_name`。** 避免把相似名称的审批定义搞混。\n- **先用 `form` 识别控件结构，再组装创建 payload。** 不要在未看详情时猜控件 `id`、`type` 或选项值。\n- **先用 `node_list` 看是否需要补审批人。** 若某节点 `need_approver=true`，创建实例时通常要补 `node_approver_list`。\n- **`node_list` 的 key 优先取 `custom_node_id`。** 若不存在，再使用 `node_id`。\n- **`approver_chosen_multi=false` 时，一个节点通常只能补一个审批人。**\n\n## 输出与后续操作\n\n读取定义详情后，常见下一步：\n\n```bash\n# 发起原生审批实例\nlark-cli approval instances create --data '{\"approval_code\":\"<APPROVAL_CODE>\",\"form\":\"[...]\"}' --as user --yes\n```\n\n如果需要进一步理解控件取值与节点参数，优先参考：\n\n- `lark-approval-instance-form-control-parameters.md`\n- `lark-approval-instance-value-sourcing.md`\n- `lark-approval-initiate.md`\n\n## 结果整理方式\n\n**将结果整理为“审批定义概览 + 表单结构摘要 + 节点要求摘要”。**\n\n建议输出成下面这种结构：\n\n```text\n审批定义：请假申请\napproval_code: 7C468A54-8745-2245-9675-08B7C63E7A85\n\n表单控件摘要：\n- leave_type: radio，可选值 [annual_leave, sick_leave]\n- reason: textarea\n- start_end: dateInterval\n\n节点要求摘要：\n- manager_node：need_approver=true，approver_chosen_multi=false\n- hr_node：need_approver=false\n```\n","skills/lark-approval/references/lark-approval-approvals-search.md":"\n# approval approvals search\n\n搜索**当前用户可发起**的审批定义（launchable approvals）。只读操作，不会创建审批实例。\n\n需要的 scopes: [\"approval:approval:read\"]\n\n## 命令\n\n```bash\n# 按关键词搜索可发起审批定义\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user\n\n# 使用 page_token 翻页\nlark-cli approval approvals search --data '{\"keyword\":\"请假\", \"page_token\":\"example_page_token\"}' --as user\n\n# 表格格式输出，便于快速浏览候选定义\nlark-cli approval approvals search --data '{\"keyword\":\"出差\"}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 查询参数，使用 JSON 传入 |\n| `keyword` | 是 | 搜索关键词，例如 `请假`、`报销`、`出差`、`采购` |\n| `locale` | 否 | 返回语言，例如 `zh-CN`、`en-US`、`ja-JP` |\n| `page_size` | 否 | 分页大小 |\n| `page_token` | 否 | 翻页标记；首次请求不填，后续使用上一次返回的 `page_token` |\n| `--as user` | 否 | 建议显式指定用户身份；“可发起审批定义”是面向当前用户的查询 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 这个命令解决什么问题\n\n当用户只有自然语言意图，还没有 `approval_code` 时，先用它把“可发起的审批定义候选项”找出来。\n\n典型场景：\n\n- “帮我找一下请假审批”\n- “有哪些可以发起的报销单？”\n- “先搜一下出差审批，再帮我提单”\n\n## 输出重点字段\n\n返回结果里，优先关注以下字段：\n\n| 字段 | 说明 |\n|------|------|\n| `approval_code` | 审批定义 Code；后续 `approvals get` 和 `instances create` 都要用它 |\n| `approval_name` | 审批定义名称；给用户做候选选择时最关键 |\n| `is_external` | 是否为三方审批定义；`true` 表示不能走原生 `instances.create` |\n| `create_link` | 三方审批定义的发起链接；`is_external=true` 时优先返回给用户 |\n\n## 使用规则\n\n- **这是发起审批工作流的第一步。** 标准顺序是：`approvals search` -> `approvals get` -> `instances create`。\n- **搜索结果为空时，不要猜。** 直接告诉用户当前关键词下没有可发起定义，并建议用户换关键词。\n- **命中多个结果时，不要替用户拍板。** 先把候选定义列出来，让用户选择目标审批定义。\n- **`is_external=true` 时不要调用 `approval instances create`。** 这类定义属于三方审批，优先返回 `create_link` 并说明需要通过链接发起。\n- **只有 `is_external=false` 的原生定义，才继续 `approvals get`。**\n- **如果用户已经明确给出 `approval_code`，不要再 search。** 直接执行 `approval approvals get`。\n\n## 结果整理方式\n\n**将结果整理为候选清单，优先展示“名称 + approval_code + 是否三方定义 + 下一步建议”。**\n\n建议输出成下面这种结构：\n\n```text\n找到 3 个可发起审批定义：\n\n1. 请假申请\n   - approval_code: 7C468A54-8745-2245-9675-08B7C63E7A85\n   - is_external: false\n   - next: 可继续读取 definitions 详情（approvals get）\n\n2. 差旅报销\n   - approval_code: 99887766-xxxx\n   - is_external: true\n   - next: 返回 create_link，引导用户通过链接发起\n```\n\n## 常见后续操作\n\n### 1）用户选中了某个定义，继续查看详情\n\n```bash\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user\n```\n\n### 2）确认是原生定义后，再准备发起审批实例\n\n```bash\nlark-cli approval instances create --data '{\"approval_code\":\"<APPROVAL_CODE>\",\"form\":\"[...]\"}' --as user --yes\n```\n\n### 3）确认是三方定义时，直接返回链接\n\n当 `is_external=true` 时，优先向用户返回 `create_link`，说明该审批需在三方系统或跳转页面中发起，而不是通过原生 `instances.create`。\n","skills/lark-approval/references/lark-approval-initiate.md":"# 审批提单工作流\n\n## 执行摘要\n\n- **原生审批提单如果用户未明确给出 `approval_code`，必须固定走 `approvals search` -> `approvals get` -> `instances create`** 不要跳过 `get` 直接拼请求。\n- **原生审批提单如果用户明确给出 `approval_code`，固定走 `approvals get` -> `instances create`** 不要跳过 `get` 直接拼请求。\n- **`is_external=true` 的定义是三方定义。** 这类定义不要调用 `instances create`，应优先使用 `create_link`。\n- **所有人员类参数默认使用 `open_id`。** 若用户给的是姓名、邮箱或其他身份，先用 [`../../lark-contact/SKILL.md`](../../lark-contact/SKILL.md) 解析。\n- **先读控件参数 reference 和值来源 reference，再读本文里的创建参数规则。** 提单前必须先阅读 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 和 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md)。\n- **`approvals.get.form` 不是创建 payload 的原样模板。** 它主要用于识别控件 `id`、`type`、选项值范围和明细子控件结构；真正的 `instances create --data.form` 中，控件 `value` 结构以 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 为准。\n- **节点参数只从 `node_list` 和本文里的节点参数规则里取。** 节点 key 必须来自定义详情返回的节点标识；审批人/抄送人列表传用户 ID 时，不要混用姓名或其他身份标识。\n- **看到 `need_approver=true` 就说明该节点需要发起人补充审批人。** 如果 `approver_chosen_multi=false`，该节点只允许一个 `open_id`。\n- **创建实例前先确认。** `approval instances create` 是写操作，执行前，让用户确认最终定义、表单值和节点参数；真正执行时显式传 `--yes`。\n\n## 适用场景\n\n- “帮我提交一个请假审批”\n- “帮我发起报销审批”\n- “我想提一个出差审批”\n- “先搜可发起的审批，再帮我提单”\n\n## 严禁行为\n\n- **严禁在未先阅读本文中的创建参数规则、[`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 和 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md) 的情况下直接提单。**\n- **严禁跳过 `approvals.get`。** 未拿到 `form` 和 `node_list` 前，不得调用 `instances create`。\n- **严禁把姓名直接写进 `node_approver_list`、`node_cc_list` 或表单人员控件。** 必须先转成 `open_id`。\n- **严禁对三方定义调用 `instances create`。**\n- **严禁对 API 不支持的控件硬提单。** 如果目标定义包含创建实例 API 不支持的控件，应明确告诉用户该定义不能仅通过 API 完整发起。\n- **严禁把 `approvals.get.form` 当成可直接提交的原样模板。**\n- **严禁在未得到用户确认前直接执行真实提单。**\n\n## 工作流\n\n### 1. 搜索可发起审批定义\n\n先搜索定义：\n\n```bash\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}'\n```\n\n处理规则：\n\n- 若结果为空，告诉用户当前关键词下没有可发起定义。\n- 若命中多个定义，必须把候选项列给用户选择，不要自行猜测。\n- 若目标定义 `is_external=true`，优先返回 `create_link`，说明这是三方定义，不能走原生 `instances create`。\n- 只有 `is_external=false` 的原生定义才继续下一步。\n\n### 2. 获取审批定义详情\n\n拿到 `approval_code` 后，读取定义详情：\n\n```bash\nlark-cli approval approvals get \\\n  --params '{\"approval_code\":\"7C468A54-8745-2245-9675-08B7C63E7A85\"}'\n```\n\n重点关注返回：\n\n- `approval_name`: 当前发起的是哪个审批定义。\n- `form`: 表单定义快照，用于识别控件 `id`、`type`、选项值范围以及明细子控件结构；不是创建实例时可直接原样提交的 payload 模板。\n- `node_list`: 流程节点信息，是后续 `node_approver_list` / `node_cc_list` 的唯一可靠来源。\n\n### 3. 创建请求参数速查\n\n输入参数如下：\n\n| 参数 | 必填 | 说明 |\n|---|---|---|\n| `--data '{...}'` | 是 | 请求体，使用 JSON 传入 |\n| `approval_code` | 是 | 审批定义 Code；必须先通过 `approvals search` / `approvals get` 确认 |\n| `form` | 否 | 表单值，**JSON 数组字符串**，不是普通对象；API 层非必填，但审批定义存在必填控件或用户需要提交表单值时必须传 |\n| `node_approver_list` | 否 | 节点审批人列表；仅在定义要求补充审批人时传 |\n| `node_cc_list` | 否 | 节点抄送人列表；仅在用户明确需要补充节点抄送人时传 |\n| `uuid` | 否 | 幂等标识；重复重试同一请求时建议显式传入 |\n| `--as user` | 否 | 建议显式指定用户身份；审批发起通常应使用用户身份 |\n| `--yes` | 是 | 写操作确认；真实执行时必须显式传入 |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n### 4. 组装 `form`\n\n`instances create --data.form` 是可选字段；传入时必须是一个 JSON 数组字符串。无表单或无需填写表单值的审批可省略 `form`，但只要审批定义包含需要提交的控件，就必须按控件结构组装后传入。组装原则：\n\n- 先用 `approvals.get.form` 识别有哪些控件、每个控件的 `id` / `type` / 可选值范围，再按本文中的创建参数规则与 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 重新组装创建 payload。\n- 提交时必须至少保证每个控件的 `id`、`type` 与 `value` 符合当前接口要求；不要假设定义快照里出现的其他字段都能直接照搬。\n- 如果用户提供的是人员信息，优先转换成 `open_id` 后再写入对应控件。\n- 单选/多选控件提交的是选项 `value`，该值可从 `approvals.get.form` 的选项定义中取得。\n- `contact`、`department`、`fieldList`、`dateInterval`、`amount`、`telephone`、`document` 等控件的 `value` 结构各不相同，必须按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 单独组装，不要套用文本控件的写法。\n- 值本身从哪里拿，优先按 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md) 处理；不要把“知道结构”误当成“已经拿到可提交值”。\n- 若 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 标明某控件不支持通过创建实例 API 提交，则不要硬猜绕过；应明确告诉用户该定义当前无法仅通过 API 提单。\n- 若遇到当前 skill 未明确覆盖的复杂控件，不要硬猜；先依据 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 判断支持性与传值结构，再向用户确认。\n\n## API 不支持的控件\n\n根据 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md)，创建审批实例 API 不支持的控件至少包括：\n\n- `text`\n- `mutableGroup`\n- `account`\n- `serialNumber`\n- `tripGroup`\n- `apaascorehrOnboardingGroup`\n- `apaascorehrRegularateGroup`\n- `remedyGroupV2`\n- `apaascorehrJobAdjustGroup`\n- `apaascorehrOffboardingGroup`\n\n如果目标审批定义包含上述控件，不要继续硬拼 `form`；应直接告诉用户该定义不能仅通过当前 API 完整提单。\n\n## 高频控件速查\n\n优先按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 组装，下面只保留最常用、最容易出错的格式：\n\n- `input` / `textarea`: `value` 是字符串\n- `date`: `value` 是 RFC3339 时间字符串\n- `dateInterval`: `value` 是对象，包含 `start` / `end` / `interval`\n- `radio` / `radioV2`: `value` 是单个选项值，取定义详情里的 `option.value`；关联外部选项时传 `options.id`\n- `checkbox` / `checkboxV2`: `value` 是选项值数组\n- `number`: `value` 是数字\n- `amount`: `value` 是数字，还要带 `currency`\n- `formula`: `value` 必须与定义中的公式结果匹配，否则会报错\n- `contact`: 只推荐写 `open_ids`，由人员信息先转换成 `open_id`\n- `connect`: `value` 是关联审批实例 `instance_code` 数组，当前默认要求用户直接提供 `instance_code`\n- `document`: `value` 是对象，至少含 `token` 和 `type=docx`\n- `attachmentV2` / `image` / `imageV2`: `value` 是 file code 数组，当前默认要求用户直接提供\n- `fieldList`: `value` 是二维数组，子项继续按各自控件类型组装\n- `department`: `value` 是对象数组，元素字段名为 `open_id`，其值填写部门的 `open_department_id`\n- `telephone`: `value` 是对象，包含 `countryCode` 和 `nationalNumber`\n- `address`: `value` 是对象数组，至少包含地理库 `id`，可选 `detailAddress`；当前默认要求用户直接提供该 `id`\n\n## 特殊控件组\n\n[`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 还明确给出了若干特殊控件组的提单格式，至少包括：\n\n- `leaveGroupV2`\n- `workGroup`\n- `outGroup`\n- `shiftGroup`\n\n这类控件组不是简单文本控件，通常内部还嵌套 `radioV2`、`date`、`fieldList`、`image`、`contact` 等子控件。遇到这些控件组时：\n\n- 先从 `approvals.get.form` 找到控件组及其子控件 ID\n- 再严格按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 的示例组装 `value`\n- 不要把控件组整体当成普通字符串或扁平对象提交\n\n### 5. 组装节点参数\n\n从 `node_list` 推导节点参数：\n\n- 若某节点 `need_approver=true`，则必须在 `node_approver_list` 中补该节点的审批人。\n- `key` 优先取 `custom_node_id`；若不存在，再用 `node_id`。\n- `value` 是审批人 `open_id` 列表。\n- 若 `approver_chosen_multi=false`，该节点只允许一个审批人 `open_id`。\n- `node_cc_list` 仅在用户明确需要补充节点抄送人时才填写；其 `key/value` 规则与 `node_approver_list` 相同。\n\n### 6. 创建审批实例\n\n创建命令使用 `approval instances create`，需要的 scopes: [\"approval:instance:write\"]\n\n确认最终表单值和节点参数后再执行：\n\n```bash\nlark-cli approval instances create \\\n  --data '{\n    \"approval_code\":\"7C468A54-8745-2245-9675-08B7C63E7A85\",\n    \"form\":\"[{\\\"id\\\":\\\"widget1\\\",\\\"type\\\":\\\"input\\\",\\\"value\\\":\\\"请假半天\\\"}]\",\n    \"node_approver_list\":[\n      {\n        \"key\":\"manager_node_id\",\n        \"value\":[\"ou_xxx\"]\n      }\n    ]\n  }' \\\n  --as user \\\n  --yes\n```\n\n执行规则：\n\n- 执行前先向用户确认：目标审批定义、核心表单值、节点审批人/抄送人。\n- 若需要幂等，可补 `uuid`。\n- 成功后回报 `instance_code` 与 `instance_link`。\n\n## 组装时优先依据的资料\n\n优先级固定如下：\n\n1. 本文中的创建请求参数、节点参数和返回结果说明：决定 `instances create` 要传哪些字段、怎么执行、成功后回什么。\n2. [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md)：决定每种控件的 `value` 结构与支持范围。\n3. [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md)：决定每类值应该从哪里拿，以及当前哪些值必须由用户直接提供。\n4. `approvals.get.form`：提供当前审批定义里实际有哪些控件、控件 `id`、控件 `type`、选项值范围、明细子控件结构。\n5. `approvals.get.node_list`：提供节点 key 与是否需要补充审批人/抄送人的线索。\n\n不要反过来把 `approvals.get.form` 当成第一优先级，更不要把它当成可直接提交的 JSON 模板。\n\n## 最小判断表\n\n| 你手上有什么 | 下一步 |\n|---|---|\n| 只有口语需求，比如“帮我提个请假审批” | 先 `approvals.search` |\n| 已经拿到 `approval_code` | 直接 `approvals.get` |\n| 已拿到 `form` / `node_list`，且用户已给出表单值和审批人 | 组装 `instances create` |\n| `is_external=true` | 返回 `create_link`，不要调 `instances create` |\n\n## 返回结果\n\n完成创建后，至少向用户返回：\n\n- `approval_name`\n- `instance_code`\n- `instance_link`\n\n建议整理为下面这种结构：\n\n```text\n审批已创建成功：\n\n- approval_name: 请假申请\n- instance_code: 19EAC829-F1CB-527F-BE2A-1330422E60C0\n- instance_link: https://...\n```\n","skills/lark-approval/references/lark-approval-instance-form-control-parameters.md":"# 审批实例表单控件参数\n\n> 说明：本文尽量保留上游参数文档的原始结构与示例，用于回答“控件 `value` 长什么样”。\n> 当前 `lark-cli` 的推荐取值口径以 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md) 为准；如果两份文档在“值从哪里拿”上存在差异，以后者为准。\n\n在调用创建审批实例接口时需要使用表单控件参数，你可以通过本文了解审批实例内各表单控件的参数说明。\n\n## 准备工作\n\n审批实例的表单控件参数依据审批定义表单来配置，例如，审批定义的表单设计包括了 **单行文本** 和 **日期区间** 控件，则审批实例的表单控件参数就需要为 **单行文本** 和 **日期区间** 控件进行赋值。因此，在操作审批实例表单的控件参数前，应先通过审批定义详情确认表单控件结构。\n\n## 审批实例 API 不支持的控件\n\n创建审批实例 API 未完全支持所有的审批表单控件，不支持的控件如下表所示。如果你必须使用 API 不支持的控件，则不能仅通过当前 API 完成提单。\n\n**控件/控件组** | **Type**                    |\n| ---------- | --------------------------- |\n| 说明         | text                        |\n| 引用多维表格     | mutableGroup                |\n| 收款账户       | account                     |\n| 流水号        | serialNumber                |\n| 出差控件组      | tripGroup                   |\n| 录用控件组      | apaascorehrOnboardingGroup  |\n| 转正控件组      | apaascorehrRegularateGroup  |\n| 补卡控件组      | remedyGroupV2               |\n| 调岗控件组      | apaascorehrJobAdjustGroup   |\n| 离职控件组      | apaascorehrOffboardingGroup\n\n## 通用参数\n\n审批实例的表单控件均包含的参数如下表所示。\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nid | string | 是 | 控件的 ID，需要与审批定义中的控件 ID 保持一致。\ntype | string | 是 | 控件类型。各控件类型取值参见下文 **不同控件的参数** 章节。\nvalue | 不同控件的类型不同 | 是 | 控件的取值。不同控件 value 数据类型也不同，例如单行文本控件的 value 为字符串、联系人的 value 为数组。详情参见下文 **不同控件的参数** 章节。\n\n## 不同控件的参数\n\n本章节提供不同控件的 type 参数值、JSON 示例以及非通用参数说明。\n\n### 单行文本\n\n控件 type 为 input，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"input\",\n    \"value\": \"data\" // string 类型\n}\n```\n\n### 多行文本\n\n控件 type 为 textarea，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"textarea\",\n    \"value\": \"data\" // string 类型\n}\n```\n\n### 日期\n\n控件 type 为 date，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"date\",\n    \"value\": \"2019-10-01T08:12:01+08:00\" // 需满足 RFC3339 格式的 string 类型\n}\n```\n\n### 日期区间\n\n控件 type 为 dateInterval，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"dateInterval\",\n    \"value\": {\n         \"start\":\"2019-10-01T08:12:01+08:00\",\n         \"end\":\"2019-10-02T08:12:01+08:00\",\n         \"interval\": 1.0\n     }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nstart | string | 是 | 开始时间，需满足 RFC3339 格式。\nend | string | 是 | 结束时间，需满足 RFC3339 格式。\ninterval | float | 是 | 时长（天）。\n\n### 单选\n\n控件 type 为 radio/radioV2，JSON 数据示例：\n\n```json\n{                                     \n    \"id\": \"widget1\",\n    \"type\": \"radioV2\",\n    \"value\": \"k2b8mkx0-h71x5gl1234-1\" // string 类型\n}\n```\n\n其中， value 表示选项值，取值范围需要参考相应审批定义中 **单选** 控件 option 的 value 参数。你可以通过审批定义详情返回的 `form` 参数，获取单选控件 option 的 value 取值。如果控件关联了外部选项，则 value 需要传入外部选项的 `options.id`。\n\n### 多选\n\n控件 type 为 checkbox/checkboxV2，JSON数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"checkboxV2\",\n    \"value\": [\"k2b8mkx0-h71x5gl4321-1\"] // string 类型的数组\n}\n```\n其中， value 表示选项值，取值范围需要参考相应审批定义中 **多选** 控件 option 的 value 参数。你可以通过审批定义详情返回的 `form` 参数，获取多选控件 option 的 value 取值。如果控件关联了外部选项，则 value 需要传入外部选项的 `options.id`。\n\n### 数字\n\n控件 type 为 number，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"number\",\n    \"value\": 1234.5678 // float 类型\n}\n```\n\n### 金额\n\n控件 type 为 amount，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"amount\",\n    \"value\": 1234.5678, // float 类型\n    \"currency\":\"USD\"\n}\n```\n\n其中，currency 表示货币种类，取值范围需要参考相应审批定义中 **金额** 控件的 value 参数。你可以通过审批定义详情返回的 `form` 参数，获取金额控件可设置的货币种类。\n\n### 计算公式\n\n控件 type 为 formula，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"formula\",\n    \"value\": 1234.5678 // 该值由审批定义内配置的公式计算出取值，若不匹配则返回报错。\n}\n```\n\n### 联系人\n\n控件 type 为 contact，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"contact\",\n    \"value\": [\"f8ca557e\"], // string 类型的数组\n    \"open_ids\": [\"ou_12345\"] // string 类型的数组\n}\n```\n其中，value 包含的是用户 `user_id`；open_ids 包含的是用户 `open_id`。\n\n### 关联审批\n\n控件 type 为 connect，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"connect\",\n    \"value\": [\"19EAC829-F1CB-527F-BE2A-1330422E60C0\"] // string 类型的数组\n}\n```\n其中，value 包含的是被关联的审批实例 Code，你可以通过审批实例详情能力根据实例 Code 获取实例详情。\n\n### 文档控件\n\n控件 type 为 document，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"document\",\n    \"value\": {\n           \"token\":\"TLLKdcpDro9ijQxA33ycNMabcef\",\n           \"type\":\"docx\",\n    }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\ntoken | string | 是 | 文档的 document_id。\ntype | string | 是 | 文档类型，支持 `docx`。\n\n### 附件\n\n控件 type 为 attachmentV2，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"attachmentV2\",\n    \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"] // string 类型的数组\n}\n```\n其中，value 包含的是上传文件后返回的文件 code。\n\n### 图片\n\n控件 type 为 image/imageV2，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"image\",\n    \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"] // string 类型的数组\n}\n```\n\n其中，value 包含的是上传文件后返回的文件 code。\n\n### 明细/表格\n\n控件 type 为 fieldList，JSON 格式示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"fieldList\",\n    \"value\": [\n         [   \n            {\n                \"id\": \"widget1\",\n                \"type\": \"checkbox\",\n                \"value\": [\"jxpsebqp-0\"]\n            }\n         ]\n     ]\n}\n```\n\n其中 value 是二维数组，根据审批定义内 **明细/表格** 控件所包含的控件，依次设置控件 JSON 值。\n\n### 部门\n\n控件 type 为 department，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"department\",\n    \"value\":[ \n        {\n            \"open_id\": \"od-xxx\"\n        }\n    ]\n}\n```\n\n其中 value 为对象数组，通过 open_id 设置部门的 open_department_id。\n\n### 电话\n\n控件 type 为 telephone，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"telephone\",\n    \"value\": {\n        \"countryCode\":\"+86\",\n        \"nationalNumber\":\"13122222222\"\n    }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\ncountryCode | string | 是 | 区号。\nnationalNumber | string | 是 | 电话号。\n\n### 地址\n控件 type 为 address，JSON 数据示例：\n\n```json\n{\n\t\"id\": \"widget1\",\n\t\"type\": \"address\",\n\t\"value\": [{\n\t\t\"id\": \"290557\",\n\t\t\"detailAddress\": \"详细的地址\"\n\t}]\n}\n```\n\nvalue 参数为 []object 类型，参数说明如下：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nvalue | []object | 是 | 非出差控件组场景地址控件仅支持单个地址，传入多个时默认只取第一个\n└ id | string | 是 | 区域ID, 可通过审批的地理库接口获取\n└ detailAddress | string | 否 | 详细的地址，若表单配置中未开启填写详细地址，则会忽略该参数，即使传入也不会生效\n\n### 换班控件组\n\n控件 type 为 shiftGroup，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"shiftGroup\",\n    \"value\": {\n         \"shiftTime\": \"2019-10-01T08:12:01+08:00\",\n         \"returnTime\": \"2019-10-02T08:12:01+08:00\",\n         \"reason\": \"ask for leave\"\n     }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nshiftTime | string | 是 | 换班时间，需满足 RFC3339 格式。\nreturnTime | string | 是 | 对调日期，需满足 RFC3339 格式。\nreason | string | 是 | 换班原因。\n\n### 请假控件组\n\n**请假控件组请求示例**\n```json\n{\n    \"id\": \"widgetLeaveGroupV2\",\n    \"type\": \"leaveGroupV2\",\n    \"value\": [\n      {\n        \"id\": \"widgetLeaveGroupType\",\n        \"type\": \"radioV2\",\n        \"value\": \"7488925543484620819\"\n      },\n      {\n        \"id\": \"widgetLeaveGroupStartTime\",\n        \"type\": \"date\",\n        \"value\": \"2025-08-25T11:30:00+08:00\"\n      },\n      {\n        \"id\": \"widgetLeaveGroupEndTime\",\n        \"type\": \"date\",\n        \"value\": \"2025-08-26T11:35:00+08:00\"\n      },\n      {\n        \"id\": \"widgetLeaveGroupReason\",\n        \"type\": \"textarea\",\n        \"value\": \"123123\"\n      },\n      {\n        \"id\": \"widgetLeaveCertification\",\n        \"type\": \"image\",\n        \"value\": [\n          \"B69F8E26-0EAA-4A92-9B80-DA613CD36136\"\n        ]\n      },\n      {\n        \"id\":\"widgetLeaveCertification\",\n        \"type\":\"image\",\n        \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]\n      },\n      {                                     \n        \"id\": \"widgetLeaveGroupFeedingArrivingLate\",\n        \"type\": \"radioV2\",\n        \"value\": \"30\"\n      },\n      {                                     \n        \"id\": \"widgetLeaveGroupFeedingOffLeaveEarly\",\n        \"type\": \"radioV2\",\n        \"value\": \"30\"\n      }        \n    ]\n}\n```\n\n**请假控件组包含参数说明：**\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nid | string | 是 | 控件组ID，固定为widgetLeaveGroupV2\ntype | string | 是 | 控件组类型，固定为leaveGroupV2\nvalue | object[] | 是 | 控件组的值，值为多个子控件值的列表\n\nvalue中包含的子控件值说明:\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nwidgetLeaveGroupType | radioV2 | ```<br>{<br>\"id\": \"widgetLeaveGroupType\",<br>\"type\": \"radioV2\",<br>\"value\": \"7488925543484620819\"<br>}<br>``` | 假期类型，具体格式可参考单选控件，选项由假勤接口获取，提单时必须包含该控件\nwidgetLeaveGroupStartTime | date | ```<br>{<br>\"id\": \"widgetLeaveGroupStartTime\",<br>\"type\": \"date\",<br>\"value\": \"2019-10-01T08:12:01+08:00\", // 需满足 RFC3339 格式的 string 类型<br>}    <br>``` | 请假开始时间，具体格式可参考日期控件，会根据假期类型自动取整,其中半天假小于12点则认为是上午，小时假则以半小时为粒度向前取整, 提单时必须包含该控件\nwidgetLeaveGroupEndTime | date | ```<br>{<br>\"id\": \"widgetLeaveGroupEndTime\",<br>\"type\": \"date\",<br>\"value\": \"2019-10-01T08:12:01+08:00\", // 需满足 RFC3339 格式的 string 类型<br>}<br>``` | 请假结束时间，具体格式可参考日期控件，会根据假期类型自动取整，其中半天假小于12点则认为是上午，小时假则以半小时为粒度向后取整\nwidgetLeaveGroupReason | textarea | ```<br>{<br>\"id\": \"widgetLeaveGroupReason\",<br>\"type\": \"textarea\",<br>\"value\": \"123123\"<br>}<br>``` | 请假事由，具体格式可参考多行文本控件，哺乳假无需填写，其他情况则根据控件组配置中该控件是否可见以及必填判断\nwidgetLeaveCertification | image | ```<br>{<br>\"id\":\"widgetLeaveCertification\",<br>\"type\":\"image\",<br>\"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]<br>}<br>``` | 请假证明，具体格式可参考图片控件，如果所选假期类型配置要求补充证明则必须传递该值，缺失会报错\nwidgetLeaveGroupFeedingArrivingLate | radioV2 | ```<br>{                                     <br>\"id\": \"widgetLeaveGroupFeedingArrivingLate\",<br>\"type\": \"radioV2\",<br>\"value\": \"30\"<br>}<br>``` | 上班晚到的分钟数，具体格式可参考单选控件，仅哺乳假需要填写，取值范围是0-120分钟，粒度是15分钟，选项从审批定义中该控件的option中获取\nwidgetLeaveGroupFeedingOffLeaveEarly | radioV2 | ```<br>{                                     <br>\"id\": \"widgetLeaveGroupFeedingOffLeaveEarly\",<br>\"type\": \"radioV2\",<br>\"value\": \"30\"<br>}   <br>``` | 下班早走的分钟数，具体格式可参考单选控件，仅哺乳假需要填写，取值范围是0-120分钟，粒度是15分钟，选项即是分钟对应的字符串\n\n**特殊的参数校验报错信息**\nmessage                                            | 说明                           |\n| -------------------------------------------------- | ---------------------------- |\n| leave type id parse error                          | 请假类型不是int64                  |\n| group value is invalid                             | 当前控件组的值无效，请校验是否为空或者校验类型是否为数组 |\n| start time format is not RFC3339                   | 开始时间日期格式非*RFC3339格式*         |\n| end time format is not RFC3339                     | 结束时间日期格式非*RFC3339格式*         |\n| start time is after end time                       | 开始时间晚于结束时间                   |\n| user not in gray                                   | 申请用户不在假勤灰度内                  |\n| leave type not found                               | 请假类型不存在                      |\n| reason is required                                 | 请假原因未填写                      |\n| leave quote should be bigger than 0                | 请假时长需要大于0                    |\n| leave is conflict                                  | 所选时间内已有请假记录，请选择其他时间          |\n| balance is not enough                              | 当前假期类型下假期余额不足                |\n| certification is required                          | 需要上传请假证明                     |\n| arriving late is required                          | 哺乳假需要填写上班晚到时长                |\n| arriving late value is not in the optional items   | 晚到时间不在可选范围内                  |\n| leaving early is required                          | 哺乳假需要填写下班提前时长                |\n| leaving early value is not in the optional items   | 下班提前时间不在可选范围内                |\n| feeding rest daily is 0                            | 哺乳假每日休息时长为0，请重新选择            |\n| the operation is prohibited by the workforce rules | 当前账户已在假勤侧封账，无法提交\n\n### 加班控件组\n\n**加班控件组请求示例**\n```json\n{\n  \"id\": \"widgetWorkGroup\",\n  \"type\": \"workGroup\",\n  \"value\":[\n    {\n      \"id\":\"widgetWorkGroupOvertimeWorkers\",\n      \"type\":\"contact\",\n      \"value\": [\"f8ca557e\"],\n      \"open_ids\": [\"ou_12345\"]\n    },\n    {\n      \"id\": \"widgetWorkGroupType\",\n      \"type\": \"radioV2\",\n      \"value\": \"7259635026038505475\"\n    },\n    {\n      \"id\":\"widgetWorkGroupTimeRangeFieldList\",\n      \"type\":\"fieldList\",\n      \"value\":[\n        [\n          {\n            \"id\":\"widgetWorkGroupStartTime\",\n            \"type\":\"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n          },\n          {\n            \"id\":\"widgetWorkGroupEndTime\",\n            \"type\":\"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n          }\n        ]\n      ]\n    },\n    {\n      \"id\": \"widgetWorkGroupReason\",\n      \"type\": \"textarea\",\n      \"value\": \"111\"\n    }\n  ]\n}\n\n```\n\n**加班控件组参数说明：**\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nid | string | 是 | 控件组ID，固定为widgetWorkGroup\ntype | string | 是 | 控件组类型，固定为workGroup\nvalue | object[] | 是 | 控件组的值，值为多个子控件值的列表\n\nvalue中包含的子控件值说明:\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nwidgetWorkGroupOvertimeWorkers | contact | ```<br>{<br>\"id\":\"widgetWorkGroupOvertimeWorkers\",<br>\"type\":\"contact\",<br>\"value\": [\"f8ca557e\"], <br>\"open_ids\": [\"ou_12345\"]<br>}<br>``` | 加班人员列表，具体格式可参考联系人控件，如果定义中配置「允许代多人提交」则该字段必填，如果是提交人给自己提交需填写提交人的ID\nwidgetWorkGroupType | radioV2 | ```<br>{<br>\"id\": \"widgetWorkGroupType\",<br>\"type\": \"radioV2\",<br>\"value\": \"7259635026038505475\" // 对应的类型选项ID<br>}<br>``` | 加班类型，具体格式可参考单选控件，如果定义中关闭「关联加班规则」则需要填写该字段\nwidgetWorkGroupTimeRangeFieldList | fieldList | ```<br>{<br>\"id\":\"widgetWorkGroupTimeRangeFieldList\",<br>\"type\":\"fieldList\",<br>\"value\":[<br>[<br>{<br>\"id\":\"widgetWorkGroupStartTime\",<br>\"type\":\"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>},<br>{<br>\"id\":\"widgetWorkGroupEndTime\",<br>\"type\":\"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>}<br>]<br>]<br>}<br>``` | 加班时段，具体格式可参考明细控件，如果定义中打开「允许提交多个加班时段」则可以传多个，最多支持30个，否则只会取第一个，单次加班时长不可超过两天\nwidgetWorkGroupReason | textarea | ```<br>{<br>\"id\": \"widgetWorkGroupReason\",<br>\"type\": \"textarea\",<br>\"value\": \"111\"<br>}<br>``` | 加班事由，如果定义中配置了「加班事由」必填，则必须填写该字段\n\n**特殊的参数校验报错信息**\nmessage                                                                            | 说明                           |\n| ---------------------------------------------------------------------------------- | ---------------------------- |\n| the time range list has more than 30 items                                         | 加班时段数量超过30                   |\n| group value is invalid                                                             | 当前控件组的值无效，请校验是否为空或者校验类型是否为数组 |\n| overtime type is required                                                          | 未关联加班规则时，加班类型必填              |\n| work time range is required                                                        | 至少需要一个加班时段                   |\n| start time is after end time                                                       | 开始时间晚于结束时间                   |\n| start time or end time of range is required                                        | 加班时间段的开始时间和结束时间必填            |\n| overtime duration is over 2 days                                                   | 单次加班时长不可超过两天                 |\n| overtime date time zone not support                                                | 加班时段的日期时区信息无法识别              |\n| {date} can not apply overtime                                                      | 所选时间不可申请加班                   |\n| {date} already apply overtime                                                      | 所选时间已经有加班记录                  |\n| {date} no need approval                                                            | 所选日期加班无需申请                   |\n| apply reason is required                                                           | 定义中设置了加班事由为必填，不可为空           |\n| {users} user follow different overtime rules, cannot be submitted in the same form | 所选加班人不在同一个考勤组内，无法同时提交加班      |\n| invalid overtime work application                                                  | 没有有效的加班申请，请重新选择加班日期          |\n| the overtime duration cannot be 0                                                  | 加班时长不能是0                     |\n| the number of apply workers cannot exceed 50                                       | 单次申请加班人数量不可大于50              |\n| apply worker is required                                                           | 必须有加班人，配置置可代多人提交时必须指定加班人     |\n| resigned worker can not apply                                                      | 离职人员不可申请加班                   |\n| overtime duration is over limit                                                    | 加班时长超过限制\n\n### 外出控件组\n\n**外出控件组请求体示例**\n```json\n{\n    \"id\": \"widgetOutGroup\",\n    \"type\": \"outGroup\",\n    \"value\":[\n        {\n            \"id\": \"widgetOutGroupType\",\n            \"type\": \"radioV2\",\n            \"value\":  \"me15yqrf-gmjgbml2vhp-0\"      \n        },\n        {\n            \"id\": \"widgetOutGroupStartTime\",\n            \"type\": \"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n        },\n        {\n            \"id\": \"widgetOutGroupEndTime\",\n            \"type\": \"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n        },\n        {\n            \"id\": \"widgetOutGroupReason\",\n            \"type\": \"textarea\",\n            \"value\":\"123213\"\n        },\n        {\n            \"id\":\"widgetOutGroupImage\",\n            \"type\":\"image\",\n            \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]\n        }                    \n    ]   \n}\n\n```\n\n**外出控件参数说明**\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nid | string | 是 | 控件组ID，固定为widgetOutGroup\ntype | string | 是 | 控件组Type，固定为outGroup\nvalue | object[] | 是 | 控件组的值，值为多个子控件值的列表\n\nvalue中包含的子控件值说明:\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nwidgetOutGroupType | radioV2 | ```<br>{<br>\"id\": \"widgetOutGroupType\",<br>\"type\": \"radioV2\",<br>\"value\":  \"me15yqrf-gmjgbml2vhp-0\"      <br>}<br>``` | 外出类型，具体格式可参考单选控件，如果配置了「外出类型」则必填，外出时长单位会选取所选外出类型关联的单位，如果没有配置「外出类型」，则该字段无需填写，计算外出时长时会选取「外出时长」配置的单位\nwidgetOutGroupStartTime | date | ```<br>{<br>\"id\": \"widgetOutGroupStartTime\",<br>\"type\": \"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>}<br>``` | 外出开始时间，具体格式可参考日期控件，如果外出时长单位是半天假，则小于12点则认为是上午，否则认为是下午；如果单位是小时，则会按半小时的粒度向前取整\nwidgetOutGroupEndTime | date | ```<br>{<br>\"id\": \"widgetOutGroupEndTime\",<br>\"type\": \"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>}<br>``` | 外出结束时间，具体格式可参考日期控件，如果外出时长单位是半天假，则小于12点则认为是上午，否则认为是下午；如果单位是小时，则会按半小时的粒度向后取整\nwidgetOutGroupReason | textarea | ```<br>{<br>\"id\": \"widgetOutGroupReason\",<br>\"type\": \"textarea\",<br>\"value\":\"123213\"<br>}<br>``` | 外出事由，具体格式可参考多行文本控件，如果定义中「外出事由」必填，则必须填写该控件，如果定义配置无需填写，则无需填写该控件\nwidgetOutGroupImage | image | ```<br>{<br>\"id\":\"widgetOutGroupImage\",<br>\"type\":\"image\",<br>\"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]<br>}   <br>``` | 外出证明，具体格式可参考图片控件，如果定义中「外出拍照」必填，则必须填写该控件，如果定义配置无需填写，则无需填写该控件\n\n**特殊的参数校验报错信息**\n\nmessage                                               | 说明                           |\n| ----------------------------------------------------- | ---------------------------- |\n| group value is invalid                                | 当前控件组的值无效，请校验是否为空或者校验类型是否为数组 |\n| start time format is not RFC3339                      | 开始时间日期格式非*RFC3339格式*         |\n| end time format is not RFC3339                        | 结束时间日期格式非*RFC3339格式*         |\n| start time and end time must be in the same time zone | 开始时间与结束时间必须是同一时区             |\n| out type is required                                  | 如果定义中设定了「外出类型」，则外出类型必填       |\n| out start time is required                            | 外出开始时间必填                     |\n| out end time is required                              | 外出结束时间必填                     |\n| out duration must be greater than 0                   | 外出间隔不能为0，请检查起止时间并重新选择        |\n| out reason is empty                                   | 如果定义中勾选「外出事由」同时设定必填，则该字段必填   |\n| photo is required                                     | 如果定义中勾选「外出拍照」同时设定必填，则该字段必填   |\n| out time is conflict                                  | 外出时间有冲突，请确认是否已在该时段申请外出\n","skills/lark-approval/references/lark-approval-instance-value-sourcing.md":"# 审批提单值来源\n\n## 目的\n\n本文用于回答一个固定问题：在调用 `approval instances create` 发起原生审批实例时，**每个要填写的值从哪里拿**。\n\n阅读顺序固定如下：\n\n1. [`lark-approval-initiate.md`](./lark-approval-initiate.md) 中的创建请求参数、节点参数和返回结果说明\n2. `approval approvals get` 返回的 `form` / `node_list`\n3. [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md)\n4. 本文\n\n## 总原则\n\n- `lark-approval-initiate.md` 决定创建请求字段名、字段层级、节点参数结构。\n- `approvals.get.form` 决定控件 `id`、`type`、选项值范围、子控件结构。\n- `approvals.get.node_list` 决定节点 key、是否必须补审批人、是否允许多人。\n- [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 决定各控件 `value` 的最终结构。\n- 除非本文明确允许，否则不要猜值来源，不要把展示文案直接当成可提交值。\n\n## 默认来源\n\n- 审批定义、`approval_code`、`is_external`、`create_link` 等基础信息，默认从 `approval approvals search` 获取。\n- 控件 `id`、`type`、选项值、子控件结构，默认从 `approval approvals get.form` 获取。\n- 节点 key、`need_approver`、`approver_chosen_multi` 等节点信息，默认从 `approval approvals get.node_list` 获取。\n- 本文只补充 **这些默认来源之外** 的取值规则，以及当前必须由用户直接提供的值。\n\n## 控件值来源规则\n\n### 联系人 `contact`\n\n- 只推荐写 `open_ids`。\n- 不再推荐双写 `value(user_id)` + `open_ids`，避免复杂度继续上升。\n- 如果用户给的是姓名、邮箱或账号，先用 `lark-contact` 解析成 `open_id`。\n\n### 部门 `department`\n\n- 最优先：用户直接提供 `open_department_id`。\n- 若用户说“我的部门”或“张三的部门”，先用 `lark-contact` 查询对应人员信息，再取其所属部门里的 `open_department_id`。\n- 如果查到该人员只有一个部门，可直接使用。\n- 如果查到多个部门，不自动猜，必须让用户明确选一个，或直接输入 `open_department_id`。\n- 如果仍无法确定，则明确告知当前不支持自动决定部门值。\n\n### 附件 `attachmentV2`\n\n- 当前 `lark-approval` 不负责上传文件。\n- 用户必须直接提供 file code。\n- 如果用户无法提供 file code，应明确告知当前无法仅通过 `lark-approval` 完成该控件提单。\n\n### 图片 `image` / `imageV2`\n\n- 当前 `lark-approval` 不负责上传图片。\n- 用户必须直接提供 file code。\n- 如果用户无法提供 file code，应明确告知当前无法仅通过 `lark-approval` 完成该控件提单。\n\n### 文档 `document`\n\n- 用户可直接提供 `token` / `document_id`。\n- 如果用户给的是飞书文档链接，应先尝试从链接中提取 token。\n- 若链接提取失败，再要求用户手动输入 token。\n\n### 关联审批 `connect`\n\n- 用户直接提供目标审批实例的 `instance_code`。\n- 当前不默认做“搜索关联实例再反查 code”的自动流程。\n\n### 地址 `address`\n\n- 用户直接提供地理库 `id`。\n- 若用户无法提供该 `id`，当前不支持自动取值。\n\n## 特殊控件组\n\n以下控件组的结构仍按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 组装：\n\n- `leaveGroupV2`\n- `workGroup`\n- `outGroup`\n- `shiftGroup`\n\n补充规则：\n\n- 控件组自身和子控件的 `id` / `type` 从 `approval approvals get.form` 中识别。\n- 组内单选/多选或业务枚举值，优先从 `approval approvals get.form` 返回的选项结构中取。\n- 不要把控件组整体当成普通字符串或扁平对象提交。\n\n## 不支持自动准备的值\n\n以下值当前不建议由 `lark-approval` 自动准备：\n\n- 文件上传后的 file code\n- 图片上传后的 file code\n- 地址控件的地理库 `id`\n- 无法唯一确定的部门 `open_department_id`\n\n遇到这类值时，应明确告诉用户需要提供什么，而不是继续猜测。\n\n## 最小决策表\n\n| 场景 | 处理 |\n|---|---|\n| 用户说“找张三当审批人” | 用 `lark-contact` 解析张三，取 `open_id` |\n| 用户说“我的部门” | 先查当前用户部门；若多个部门，让用户选 |\n| 用户给了文档链接 | 先尝试提取 token |\n| 用户要填图片/附件 | 要求直接提供 file code |\n| 用户要填关联审批 | 要求直接提供 `instance_code` |\n| 用户要填地址 | 要求直接提供地理库 `id` |\n","skills/lark-approval/references/lark-approval-instances-cancel.md":"\n# approval instances cancel\n\n撤回一个已发起的审批实例（用户级写操作）。通常先通过 `instances initiated`、`tasks query` 或 `instances get` 确认目标审批实例，拿到 `instance_code` 后再执行撤回。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要撤回该审批实例且目标实例无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:instance:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval instances cancel \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' \\\n  --as user \\\n  --dry-run\n\n# 撤回一个审批实例\nlark-cli approval instances cancel \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体\nlark-cli approval instances cancel \\\n  --data @./cancel-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `instances initiated`、`tasks query` 或 `instances get` 获取 |\n| `--as user` | 否 | 建议显式指定用户身份；审批实例撤回通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n如果你要找“我发起的审批实例”，可先查询已发起列表：\n\n```bash\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n```\n\n如果你已经在任务列表中定位到某个审批，也可以从任务里拿到实例 Code：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `instances[].instance_code` | 审批实例 Code；撤回时必须提供 |\n| `tasks[].instance_code` | 审批任务关联的审批实例 Code；也可作为撤回输入 |\n| `tasks[].instance_status` | 审批实例状态；可用于判断是否仍处于可撤回阶段 |\n\n如需先确认审批表单、当前节点、流转状态，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **撤回的是审批实例，不是单个任务**：`instances cancel` 只需要 `instance_code`，不需要 `task_id`。\n- **优先确认实例是否仍可撤回**：已经通过、已拒绝、已撤销或已终止的实例通常不适合继续撤回。\n- **优先从 `instances initiated` 获取目标实例**：因为撤回通常针对“我发起的审批”，这个入口最直接。\n- **也可从 `tasks query` 反查 `instance_code`**：当你是从某个待办/已办上下文进入时，这样更方便。\n- **先 `--dry-run` 再执行**：尤其在实例来源不明确、用户只给了标题关键字，或一次要核对多个实例时，先预览更安全。\n","skills/lark-approval/references/lark-approval-instances-cc.md":"\n# approval instances cc\n\n给一个审批实例追加抄送人（用户级写操作）。通常先通过 `instances initiated`、`tasks query` 或 `instances get` 确认目标审批实例，拿到 `instance_code` 后，再提供抄送人的用户 ID 执行抄送。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要抄送该审批实例且目标实例、抄送对象都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:instance:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"ou_xxx\"],\"comment\":\"抄送给项目 owner 了解进展\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --dry-run\n\n# 按 open_id 抄送一个人\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"ou_xxx\"],\"comment\":\"抄送给你知悉\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 一次抄送多个人\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"ou_xxx\",\"ou_yyy\"],\"comment\":\"请相关同学同步关注\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 按 user_id 抄送\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"123456789\"],\"comment\":\"抄送给财务负责人\"}' \\\n  --params '{\"user_id_type\":\"user_id\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体\nlark-cli approval instances cc \\\n  --data @./cc-body.json \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `instances initiated`、`tasks query` 或 `instances get` 获取 |\n| `cc_user_ids` | 是 | 抄送人的用户 ID 数组；需要和 `user_id_type` 保持一致 |\n| `comment` | 否 | 抄送留言，例如 `抄送给你知悉`、`请同步关注该审批进展` |\n| `--params '{\"user_id_type\":\"...\"}'` | 否 | 查询参数 JSON；用于声明 `cc_user_ids` 内用户 ID 的类型 |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id`；未显式指定时要特别确认抄送人的 ID 类型 |\n| `--as user` | 否 | 建议显式指定用户身份；审批实例抄送通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n如果你要找“我发起的审批实例”，可先查询已发起列表：\n\n```bash\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n```\n\n如果你已经在任务列表中定位到某个审批，也可以从任务里拿到实例 Code：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `instances[].instance_code` | 审批实例 Code；抄送时必须提供 |\n| `tasks[].instance_code` | 审批任务关联的审批实例 Code；也可作为抄送输入 |\n| `tasks[].title` | 任务标题，可用于确认是否是要操作的那个审批 |\n| `tasks[].instance_status` | 审批实例状态；可用于判断当前审批是否仍处于进行中 |\n\n如果你手里只有姓名或邮箱，建议先通过联系人能力解析出正确的用户 ID，再执行抄送。\n\n如需先确认审批表单、当前节点、流转状态，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **抄送的是审批实例，不是单个任务**：`instances cc` 只需要 `instance_code`，不需要 `task_id`。\n- **`cc_user_ids` 与 `user_id_type` 必须匹配**：例如传 open_id 就把 `user_id_type` 设为 `open_id`；不要混用。\n- **`cc_user_ids` 是数组**：即使只抄送一个人，也要按数组形式传入。\n- **优先显式传 `user_id_type`**：这样 agent 更容易判断参数含义，也能减少 ID 类型不匹配带来的失败。\n- **优先从 `instances initiated` 获取目标实例**：因为抄送常见于“我发起的审批”场景，这个入口最直接。\n- **也可从 `tasks query` 反查 `instance_code`**：当你是从某个审批上下文进入时，这样更方便。\n- **`comment` 建议简洁明确**：例如 `抄送给你知悉`、`请同步关注审批进展`。避免过长或模糊描述。\n- **先 `--dry-run` 再执行**：尤其在抄送对象较多、抄送人来源不明确，或需要让用户先核对实例标题时，先预览更安全。\n","skills/lark-approval/references/lark-approval-instances-get.md":"\n# approval instances get\n\n获取单个审批实例详情（用户级只读操作）。适合在执行 approve / reject / transfer / rollback / cancel / cc / remind 之前，先查看审批表单、当前节点、任务列表、审批动态和整体状态。\n\n需要的 scopes: [\"approval:instance:read\"]\n\n## 命令\n\n```bash\n# 按实例 Code 查询详情\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n\n# 表格格式输出，便于快速浏览顶层字段\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{...}'` | 是 | 查询参数，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code |\n| `locale` | 否 | 返回语言，例如 `zh-CN`、`en-US`、`ja-JP` |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id` |\n| `--as user` | 否 | 建议显式指定用户身份；审批实例详情查询通常应使用用户身份 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 常见输入来源\n\n如果你已经有实例 Code，可直接查询：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n如果你还没有实例 Code，可先从以下命令获取：\n\n```bash\n# 查询我发起的审批实例\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n\n# 或从任务列表里拿到关联实例 Code\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n## 输出重点字段\n\n返回结果中常见字段：\n\n| 字段 | 说明 |\n|------|------|\n| `instance_code` | 审批实例 Code |\n| `serial_number` | 审批单编号 |\n| `definition_code` | 审批定义 Code |\n| `definition_name` | 审批名称 |\n| `user_id` | 发起审批的用户 ID |\n| `department_id` | 发起人所在部门 ID |\n| `status` | 审批实例状态，见下方“status 枚举” |\n| `reverted` | 单据是否已被撤销 |\n| `start_time` | 审批创建时间 |\n| `end_time` | 审批完成时间，未完成时通常为 `0` |\n| `form` | 表单数据，JSON 字符串 |\n| `current_nodes` | 当前审批节点列表 |\n| `tasks` | 审批任务列表 |\n| `operation_records` | 审批动态，例如通过、拒绝、转交、加签、回退、撤回、抄送 |\n| `comments` | 评论列表 |\n\n## status 枚举\n\n| 值 | 含义 |\n|----|------|\n| `PENDING` | 审批中 |\n| `APPROVED` | 已通过 |\n| `REJECTED` | 已拒绝 |\n| `CANCELED` | 已撤回 |\n| `DELETED` | 已删除 |\n\n## current_nodes 重点字段\n\n`current_nodes` 常用于判断审批流当前卡在哪一层：\n\n| 字段 | 说明                                       |\n|------|------------------------------------------|\n| `current_nodes[].node_id` | 当前审批节点 ID                                |\n| `current_nodes[].node_name` | 当前审批节点名称                                 |\n| `current_nodes[].type` | 审批方式：`AND` 会签、`OR` 或签、`SEQUENTIAL` 依次审批等 |\n| `current_nodes[].approvers[].task_id` | 当前审批人关联任务 ID                             |\n| `current_nodes[].approvers[].user_id` | 当前审批人用户 ID                               |\n\n## tasks 重点字段\n\n`tasks` 常用于把实例和具体审批任务关联起来：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].id` | 审批任务 ID |\n| `tasks[].node_id` | 任务所属节点 ID |\n| `tasks[].node_name` | 任务所属节点名称 |\n| `tasks[].user_id` | 审批人用户 ID |\n| `tasks[].status` | 任务状态：`PENDING`、`APPROVED`、`REJECTED`、`TRANSFERRED`、`DONE` |\n| `tasks[].start_time` | 任务开始时间 |\n| `tasks[].end_time` | 任务完成时间 |\n\n## operation_records 重点字段\n\n`operation_records` 常用于审计审批过程：\n\n| 字段 | 说明 |\n|------|------|\n| `operation_records[].type` | 事件类型，如 `PASS`、`REJECT`、`TRANSFER`、`ROLLBACK`、`CANCEL`、`CC` |\n| `operation_records[].create_time` | 事件发生时间 |\n| `operation_records[].user_id` | 触发该事件的用户 ID |\n| `operation_records[].task_id` | 关联任务 ID |\n| `operation_records[].node_id` | 关联节点 ID |\n| `operation_records[].comment` | 理由 / 备注 |\n| `operation_records[].cc_user_ids` | 被抄送人列表（抄送事件时） |\n\n## 使用建议\n\n- **这是最适合做“详情确认”的只读命令**：当你已经拿到 `instance_code`，需要确认表单、当前节点、任务状态、审批动态时，优先使用它。\n- **在执行写操作前先看详情**：例如做 `tasks rollback` 前确认可退回节点，做 `instances cancel` 前确认实例状态，做 `tasks remind` 前确认当前任务是否仍待处理。\n- **`form` 是 JSON 字符串**：调用方通常还需要再解析一层，才能拿到表单字段值。\n- **`current_nodes` 和 `tasks` 可以联动看**：前者看“当前卡在哪个节点”，后者看“每个任务目前由谁处理、状态如何”。\n- **`operation_records` 适合做时间线回溯**：例如排查谁转交过、谁加签过、什么时候撤回或抄送过。\n- **优先显式传 `locale` 和 `user_id_type`**：这样 agent 更容易理解返回文本和 ID 语义，减少歧义。\n\n## 输出与后续操作\n\n读取详情后，常见下一步：\n\n```bash\n# 同意审批任务\nlark-cli approval tasks approve --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\"}' --as user --yes\n\n# 撤回审批实例\nlark-cli approval instances cancel --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --yes\n\n# 催办审批任务\nlark-cli approval tasks remind --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID>\"]}' --as user --yes\n```\n","skills/lark-approval/references/lark-approval-instances-initiated.md":"\n# approval instances initiated\n\n查询当前用户已发起的审批实例列表（用户级只读操作）。适合在需要查看“我发起了哪些审批”、筛选某类审批定义、获取 `instance_code` 供后续 `instances get` / `instances cancel` / `instances cc` 等命令使用时调用。\n\n需要的 scopes: [\"approval:instance:read\"]\n\n## 命令\n\n```bash\n# 查询我发起的审批列表\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n\n# 只看某个审批定义下我发起的实例\nlark-cli approval instances initiated --params '{\"definition_code\":\"<DEFINITION_CODE>\",\"page_size\":20}' --as user\n\n# 按关键词搜索我发起的实例\nlark-cli approval instances initiated --params '{\"keyword\":\"测试\",\"page_size\":10}' --as user\n\n# 按发起时间范围筛选（秒级时间戳）\nlark-cli approval instances initiated --params '{\"start_timestamp\":\"<START_SECONDS>\",\"end_timestamp\":\"<END_SECONDS>\",\"page_size\":20}' --as user\n\n# 使用 page_token 翻页\nlark-cli approval instances initiated --params '{\"page_size\":20,\"page_token\":\"example_page_token\"}' --as user\n\n# 表格格式输出，便于快速浏览\nlark-cli approval instances initiated --params '{\"page_size\":20}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{...}'` | 否 | 查询参数，使用 JSON 传入；不传时使用默认分页与筛选 |\n| `definition_code` | 否 | 审批定义 Code，用于只查看某个审批定义下我发起的实例 |\n| `keyword` | 否 | 搜索关键词；非空时走搜索链路，空或仅空格时保持普通列表链路 |\n| `start_timestamp` | 否 | 按发起时间筛选，时间范围开始值，秒级时间戳 |\n| `end_timestamp` | 否 | 按发起时间筛选，时间范围结束值，秒级时间戳 |\n| `locale` | 否 | 返回语言：`zh-CN`、`en-US`、`ja-JP` |\n| `page_size` | 否 | 分页大小 |\n| `page_token` | 否 | 翻页标记；首次请求不填，后续使用上一次返回的 `page_token` |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id` |\n| `--as user` | 否 | 建议显式指定用户身份；已发起审批列表查询通常应使用用户身份 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 输出重点字段\n\n返回结果中常见字段：\n\n| 字段 | 说明 |\n|------|------|\n| `count` | 列表计数，只在第一页返回；大于等于 100 个实例时返回 `99` |\n| `has_more` | 是否还有更多数据 |\n| `page_token` | 下一页翻页 Token |\n| `instances[].instance_code` | 审批实例 Code；后续查询详情或执行撤回 / 抄送时通常需要 |\n| `instances[].definition_code` | 审批定义 Code |\n| `instances[].definition_name` | 审批定义名称 |\n| `instances[].definition_group_id` | 审批定义分组 ID |\n| `instances[].definition_group_name` | 审批定义分组名称 |\n| `instances[].initiator` | 发起人 ID |\n| `instances[].initiator_name` | 发起人姓名 |\n| `instances[].instance_status` | 审批实例状态，见下方“instance_status 枚举” |\n| `instances[].instance_external_id` | 第三方审批实例 ID（仅第三方审批实例存在） |\n| `instances[].link` | 三方审批跳转链接 |\n| `instances[].summaries` | 摘要字段列表 |\n\n## instance_status 枚举\n\n| 值 | 含义 |\n|----|------|\n| `0` | 无流程状态，不展示对应标签 |\n| `1` | 流程实例流转中 |\n| `2` | 已通过 |\n| `3` | 已拒绝 |\n| `4` | 已撤销 |\n| `5` | 已终止 |\n\n## 常见使用场景\n\n### 1) 找到我要操作的审批实例\n\n```bash\nlark-cli approval instances initiated --params '{\"page_size\":20}' --format table --as user\n```\n\n拿到 `instances[].instance_code` 后，可继续：\n\n```bash\n# 查看审批实例详情\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n\n# 撤回审批实例\nlark-cli approval instances cancel --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --yes\n```\n\n### 2) 只看某类审批\n\n```bash\nlark-cli approval instances initiated \\\n  --params '{\"definition_code\":\"<DEFINITION_CODE>\",\"page_size\":20}' \\\n  --as user\n```\n\n\n## 使用建议\n\n- **这是定位“我发起的审批实例”的首选命令**：如果你的目标是撤回、抄送、查看某个已发起审批，优先从这里拿 `instance_code`。\n- **优先用 `definition_code` 缩小范围**：当你已知审批定义时，先筛掉无关实例，可显著提升可读性。\n- **需要搜索时传入 `keyword`**：搜索排序和普通列表排序不同，按搜索服务结果为准。\n- **按时间排查时使用 `start_timestamp` / `end_timestamp`**：这两个值都是秒级时间戳，用于按发起时间缩小结果范围。\n- **结果很多时优先 `--format table`**：适合人工快速浏览。\n- **`count` 只在第一页返回**：做分页处理时不要假设后续页还会带总数。\n- **`instance_status` 可直接判断下一步**：例如状态为 `1` 时通常可继续查看详情或考虑撤回，状态为 `4` 表示已经撤销，无需重复撤回。\n- **摘要字段 `summaries` 很适合做列表预览**：当审批标题不够明确时，可结合摘要值帮助识别目标实例。\n\n## 输出与后续操作\n\n拿到列表后，常见下一步：\n\n```bash\n# 查看单个审批实例详情\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n\n# 撤回审批实例\nlark-cli approval instances cancel --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --yes\n\n# 给审批实例追加抄送人\nlark-cli approval instances cc --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"<USER_ID>\"]}' --params '{\"user_id_type\":\"open_id\"}' --as user --yes\n```\n","skills/lark-approval/references/lark-approval-tasks-add-sign.md":"\n# approval tasks add_sign\n\n给一个审批任务加签（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，确认目标任务后，再提供被加签人的用户 ID、加签方式等参数执行加签。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要对该审批任务加签且目标任务、加签对象、加签方式都无误，再带 `--yes` 运行。用户已明确要求立即执行且列清本轮的加签、转交对象时，该确认覆盖这两个已明确的动作，不要逐条重复询问；不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 先选择加签类型\n\n`add_sign_type` 会影响当前用户的审批任务是否继续可操作，不能只按示例顺序或任意选择：\n\n| 用户意图 | `add_sign_type` | 处理方式 |\n|----------|-----------------|----------|\n| 明确说前加签 / “先让某人审核，我再审” | `1` | 前加签，并按用户要求选择 `approval_method` |\n| 明确说后加签 / “我处理完，再让某人审核” | `2` | 后加签，并按用户要求选择 `approval_method` |\n| “拉进来一起审” / “共同审核” / “一并确认” | `3` | 并加签；不传 `approval_method` |\n| 同一请求要求先加签、再转交当前用户这一环 | `3` | **必须并加签**；加签成功后再转交当前任务 |\n\n前加签或后加签可能推动当前用户的 task 流转，使原 `task_id` 不再支持后续转交。因此，“先加签，再把我这一环转交给其他人”不能使用前加签或后加签；先以 `add_sign_type: 3` 并加签，确认 `tasks add_sign` 成功后，再使用同一组 `instance_code` + `task_id` 执行 `tasks transfer`。\n\n只有在上下文完全无法判断是哪种加签方式、且不同选择会改变审批流程时，才向用户二次询问。用户已经说“一起审”或已经要求“加签后转交当前环节”时，信息足够，不要再询问加签类型。\n\n## 再选择 approval_method\n\n只有前加签、后加签需要 `approval_method`；并加签不传。先遵循用户明确指定的审批方式；用户未指定时，按人数和语义选择：\n\n| 加签人数与语义 | `approval_method` | 处理方式 |\n|----------------|-------------------|----------|\n| 只有 1 名加签人 | `1` | 使用或签；单人时或签、会签的实际效果相同，不再询问 |\n| 多人，明确“任一人审批即可” / “一人通过即可” | `1` | 或签；任一加签人完成审批即可 |\n| 多人，明确“所有人都要审批” / “全部确认” | `2` | 会签；所有加签人都必须完成审批 |\n| 多人，明确“依次审批” / “先 A 后 B” | `3` | 依次审批；每个人按 `add_sign_user_ids` 的数组顺序逐一审批 |\n| 多人，无法从上下文推断 | 不预设 | 询问用户选择或签、会签或依次审批，并说明三者效果 |\n\n依次审批必须保留用户给出的人员顺序。如果已经确定要依次审批，但上下文无法判断先后顺序，先询问人员顺序，再构造 `add_sign_user_ids`；不要自行排序。\n\n## 命令\n\n```bash\n# 先预览并加签请求，不实际执行\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":3,\"add_sign_user_ids\":[\"ou_xxx\"],\"comment\":\"请项目 owner 一起审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --dry-run\n\n# 单人前加签：未指定方式时使用或签\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":1,\"add_sign_user_ids\":[\"ou_xxx\"],\"approval_method\":1,\"comment\":\"请先补充审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 多人后加签：所有人都需要审批，使用会签\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":2,\"add_sign_user_ids\":[\"ou_xxx\",\"ou_yyy\"],\"approval_method\":2,\"comment\":\"当前审批完成后请两位都完成审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 多人前加签：按数组中的人员顺序依次审批\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":1,\"add_sign_user_ids\":[\"ou_first\",\"ou_second\"],\"approval_method\":3,\"comment\":\"请先由第一位审核，再由第二位审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 同一请求要求先加签、再转交：必须并加签；两条命令按顺序执行\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":3,\"add_sign_user_ids\":[\"ou_reviewer\"],\"comment\":\"请一起审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 仅在上面的 add_sign 成功后，转交同一当前任务\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"ou_transferee\",\"comment\":\"出差期间请代为处理\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment 或较多加签人\nlark-cli approval tasks add_sign \\\n  --data @./add-sign-body.json \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `add_sign_type` | 是 | 加签类型：`1` 前加签、`2` 后加签、`3` 并加签 |\n| `add_sign_user_ids` | 是 | 被加签人 ID 数组；需要和 `user_id_type` 保持一致 |\n| `approval_method` | 否 | 审批方式：`1` 或签、`2` 会签、`3` 依次审批；**仅在前加签、后加签时需要填写**。单人未指定时使用 `1`；多人无法从语义推断时先询问用户 |\n| `comment` | 否 | 审批意见或加签说明，例如 `前加签给财务复核`、`请项目 owner 一并确认` |\n| `--params '{\"user_id_type\":\"...\"}'` | 否 | 查询参数 JSON；用于声明 `add_sign_user_ids` 内用户 ID 的类型 |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id`；未显式指定时要特别确认被加签人的 ID 类型 |\n| `--as user` | 否 | 建议显式指定用户身份；审批加签通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 枚举说明\n\n### add_sign_type\n\n| 值 | 含义 | 对当前任务的影响 |\n|----|------|------------------|\n| `1` | 前加签 | 在当前审批前插入审批人，可能推动当前用户的 task 流转 |\n| `2` | 后加签 | 在当前审批后追加审批人，可能推动当前用户的 task 流转 |\n| `3` | 并加签 | 增加并行审批人；需要随后转交当前环节时使用 |\n\n### approval_method\n\n仅适用于前加签、后加签；并加签不传。\n\n| 值 | 含义 | 完成条件 |\n|----|------|----------|\n| `1` | 或签 | 任一加签人完成审批即可 |\n| `2` | 会签 | 所有加签人都必须完成审批 |\n| `3` | 依次审批 | 所有加签人按 `add_sign_user_ids` 数组顺序逐一审批 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / transfer / rollback / add_sign 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n| `tasks[].support_api_operate` | 是否支持通过 API 处理该任务；加签前建议先检查 |\n\n如果你手里只有姓名或邮箱，建议先通过联系人能力解析出正确的用户 ID，再执行加签。\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行加签操作。\n- **`add_sign_user_ids` 与 `user_id_type` 必须匹配**：例如传 open_id 就把 `user_id_type` 设为 `open_id`；不要混用。\n- **优先显式传 `user_id_type`**：这样 agent 更容易判断参数含义，也能减少 ID 类型不匹配带来的失败。\n- **`add_sign_type` 要和业务意图一致**：前加签是在当前审批前插入审批人，后加签是在当前审批后追加审批人，并加签则是增加并行审批人。\n- **加签后还要转交当前环节时必须并加签**：使用 `add_sign_type: 3`，等待加签成功后再用同一组任务参数转交；不要用前加签或后加签导致当前 task 提前流转。\n- **无法推断类型时才询问**：如果用户没有说明先后或并行关系，且后续动作也不能帮助判断，再请用户选择；不要对“一起审”或“加签后转交”重复提问。\n- **前加签 / 后加签要补 `approval_method`**：单人未指定时使用或签；多人优先按语义选择，无法推断时询问用户，不要静默默认。\n- **依次审批保留人员顺序**：按用户指定的先后顺序构造 `add_sign_user_ids`；顺序不明确时先询问，不要自行排序。\n- **优先从 `tasks query` 的待办列表拿任务参数**：尤其是 `topic=1` 的待办审批，最适合作为 add_sign 的输入来源。\n- **先检查是否支持 API 操作**：如果 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 执行处理动作，加签前应谨慎验证。\n- **`comment` 建议写明加签原因**：例如 `增加财务复核`、`增加项目 owner 并行确认`，方便相关人员理解上下文。\n- **先 `--dry-run` 再执行**：尤其在多人加签、跨部门加签或加签对象来源不明确时，先预览更安全。\n","skills/lark-approval/references/lark-approval-tasks-approve.md":"\n# approval tasks approve\n\n同意一个审批任务（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，必要时再用 `instances get` 查看详情，然后再执行同意。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确同意审批且目标任务无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks approve \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"同意\"}' \\\n  --as user \\\n  --dry-run\n\n# 同意审批任务，并附带审批意见\nlark-cli approval tasks approve \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"同意\"}' \\\n  --as user \\\n  --yes\n\n# 需要回填表单时，传入 form（按当前命令定义，form 为字符串化 JSON）\nlark-cli approval tasks approve \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"同意并补充信息\",\"form\":\"[{\\\"id\\\":\\\"user_name\\\",\\\"type\\\":\\\"input\\\",\\\"value\\\":\\\"Alice\\\"}]\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment / form\nlark-cli approval tasks approve \\\n  --data @./approve-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `comment` | 否 | 审批意见，例如 `同意`、`已确认` |\n| `form` | 否 | 表单数据；按当前命令定义，字段类型为 `string`，通常传字符串化 JSON；仅在审批动作需要同时回填表单时使用 |\n| `--as user` | 否 | 建议显式指定用户身份；审批同意通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的两个字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行同意操作。\n- **优先从 `tasks query` 的待办列表拿参数**：尤其是 `topic=1` 的待办审批，最适合作为 approve 的输入来源。\n- **先检查是否支持 API 操作**：如果上一步 `tasks query` 返回的 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 同意/拒绝。\n- **`comment` 建议简洁明确**：例如 `同意`、`同意，信息已核对`。没有审批意见要求时可省略。\n- **`form` 只在确有需要时传**：大多数简单同意场景只传 `instance_code`、`task_id`、可选 `comment` 即可。\n- **先 `--dry-run` 再执行**：尤其在批量处理、表单回填或任务来源不明确时，先预览更安全。\n","skills/lark-approval/references/lark-approval-tasks-query.md":"\n# approval tasks query\n\n查询当前用户的审批任务列表，可用于查看待办、已办、知会等分组。只读操作，不会修改审批状态。\n\n需要的 scopes: [\"approval:task:read\"]\n\n## 命令\n\n```bash\n# 查询待办审批\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n\n# 查询已办审批\nlark-cli approval tasks query --params '{\"topic\":\"2\"}' --as user\n\n# 按关键词搜索任务列表\nlark-cli approval tasks query --params '{\"topic\":\"1\",\"keyword\":\"测试\",\"page_size\":10}' --as user\n\n# 按任务时间范围筛选（秒级时间戳）\nlark-cli approval tasks query --params '{\"topic\":\"1\",\"start_timestamp\":\"<START_SECONDS>\",\"end_timestamp\":\"<END_SECONDS>\"}' --as user\n\n# 使用 page_token 翻页\nlark-cli approval tasks query --params '{\"topic\":\"1\",\"page_token\":\"example_page_token\"}' --as user\n\n# 表格格式输出，便于快速浏览\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --format table --as user\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{\"topic\":\"...\"}'` | 是 | 查询参数，使用 JSON 传入 |\n| `topic` | 是 | 任务分组主题，见下方“topic 枚举” |\n| `definition_code` | 否 | 审批定义 Code，用于仅查询某个审批定义下的任务 |\n| `keyword` | 否 | 搜索关键词；非空时走搜索链路，空或仅空格时保持普通列表链路 |\n| `start_timestamp` | 否 | 按任务时间筛选，时间范围开始值，秒级时间戳 |\n| `end_timestamp` | 否 | 按任务时间筛选，时间范围结束值，秒级时间戳 |\n| `locale` | 否 | 返回语言：`zh-CN`、`en-US`、`ja-JP` |\n| `page_size` | 否 | 分页大小 |\n| `page_token` | 否 | 翻页标记；首次请求不填，后续使用上一次返回的 `page_token` |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id` |\n| `--as user` | 否 | 建议显式指定用户身份；审批任务查询通常应使用用户身份 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## topic 枚举\n\n| 值 | 含义 |\n|----|------|\n| `1` | 待办审批 |\n| `2` | 已办审批 |\n| `17` | 未读知会 |\n| `18` | 已读知会 |\n\n## 输出重点字段\n\n返回结果中常见字段：\n\n| 字段 | 说明 |\n|------|------|\n| `count` | 列表计数，只在第一页返回；当任务数大于等于 100 时返回 `99` |\n| `has_more` | 是否还有更多数据 |\n| `page_token` | 下一页翻页 Token |\n| `tasks[].task_id` | 任务 ID，全局唯一 |\n| `tasks[].instance_code` | 审批实例 Code；后续执行 approve / reject / rollback 等操作时通常需要与 `task_id` 成对使用 |\n| `tasks[].title` | 任务标题 |\n| `tasks[].status` | 任务状态：`1` 待办、`2` 已办、`17` 未读、`18` 已读、`33` 处理中、`34` 撤回 |\n| `tasks[].topic` | 任务所属分组主题 |\n| `tasks[].instance_status` | 审批实例状态：`0` 无状态、`1` 流转中、`2` 已通过、`3` 已拒绝、`4` 已撤销、`5` 已终止 |\n| `tasks[].definition_code` | 审批定义 Code |\n| `tasks[].definition_name` | 审批定义名称 |\n| `tasks[].initiator` | 发起人 ID |\n| `tasks[].initiator_name` | 发起人姓名 |\n| `tasks[].summaries` | 表单摘要字段列表 |\n| `tasks[].support_api_operate` | 是否支持通过 API 同意或拒绝该任务 |\n| `tasks[].user_id` | 任务所属用户 ID |\n| `tasks[].instance_external_id` | 三方审批实例 ID，仅第三方审批实例存在 |\n| `tasks[].task_external_id` | 三方审批任务 ID，仅第三方审批任务存在 |\n| `tasks[].link` | 三方审批跳转链接 |\n\n## 使用建议\n\n- 常见处理链：先用 `tasks query` 拿到 `task_id` 和 `instance_code`，若用户需要查看详情、当前节点、表单内容、流程进度等内容，则调用 `instances get` 查看详情，最后执行 `tasks approve` / `tasks reject` / `tasks transfer` / `tasks add_sign` / `tasks rollback`。\n- 如果你只想看“已发起的审批实例”，使用 `instances initiated`；`tasks query` 更适合围绕“任务分组”来拉取列表。\n- 需要搜索任务标题、摘要或相关内容时传入 `keyword`；搜索排序和普通列表排序不同，按搜索服务结果为准。\n- 按时间排查任务时使用 `start_timestamp` / `end_timestamp` 缩小范围；这两个值都是秒级时间戳。\n- 需要继续翻页时，直接把上一次返回的 `page_token` 放回 `--params`。\n- 当结果量较大时，优先使用 `--format table` 提升可读性。\n","skills/lark-approval/references/lark-approval-tasks-reject.md":"\n# approval tasks reject\n\n拒绝一个审批任务（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，必要时再用 `instances get` 查看详情，然后再执行拒绝。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要拒绝该审批且目标任务无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks reject \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"拒绝\"}' \\\n  --as user \\\n  --dry-run\n\n# 拒绝审批任务，并附带审批意见\nlark-cli approval tasks reject \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"拒绝，信息不完整\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment\nlark-cli approval tasks reject \\\n  --data @./reject-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `comment` | 否 | 审批意见，例如 `拒绝`、`拒绝，信息不完整` |\n| `--as user` | 否 | 建议显式指定用户身份；审批拒绝通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的两个字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行拒绝操作。\n- **优先从 `tasks query` 的待办列表拿参数**：尤其是 `topic=1` 的待办审批，最适合作为 reject 的输入来源。\n- **先检查是否支持 API 操作**：如果上一步 `tasks query` 返回的 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 同意/拒绝。\n- **`comment` 建议写清拒绝原因**：例如 `拒绝，缺少合同附件`、`拒绝，预算字段填写不完整`。这有助于发起人理解原因并补充材料。\n- **先 `--dry-run` 再执行**：尤其在批量处理或任务来源不明确时，先预览更安全。\n","skills/lark-approval/references/lark-approval-tasks-remind.md":"\n# approval tasks remind\n\n对审批实例中的指定任务发起催办（用户级写操作）。通常先通过 `tasks query` 找到待办任务，拿到 `instance_code` 和要催办的 `task_ids`，必要时再用 `instances get` 查看详情，然后执行催办。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要催办该审批且目标实例、目标任务都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:instance:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks remind \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID>\"],\"comment\":\"请尽快处理\"}' \\\n  --as user \\\n  --dry-run\n\n# 催办单个审批任务\nlark-cli approval tasks remind \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID>\"],\"comment\":\"请尽快审批该单据\"}' \\\n  --as user \\\n  --yes\n\n# 同一实例下催办多个任务\nlark-cli approval tasks remind \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID_1>\",\"<TASK_ID_2>\"],\"comment\":\"请相关审批人尽快处理\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment 或多个 task_ids\nlark-cli approval tasks remind \\\n  --data @./remind-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances get` 获取 |\n| `task_ids` | 是 | 被催办的任务 ID 数组；应与 `instance_code` 属于同一审批实例 |\n| `comment` | 否 | 催办说明，例如 `请尽快处理`、`该单据较急，请优先审批` |\n| `--as user` | 否 | 建议显式指定用户身份；审批催办通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；催办时必须提供 |\n| `tasks[].task_id` | 审批任务 ID；放入 `task_ids` 数组中 |\n| `tasks[].title` | 任务标题，可用于确认催办对象是否正确 |\n| `tasks[].status` | 任务状态；一般优先催办仍处于待处理状态的任务 |\n\n如需进一步确认当前审批流、节点和人员信息，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_ids` 要对应同一个审批实例**：不要把不同实例下的任务 ID 混在同一次催办请求中。\n- **`task_ids` 是数组**：即使只催办一个任务，也要按数组形式传入。\n- **优先从 `tasks query` 的待办列表拿参数**：尤其是 `topic=1` 的待办审批，最适合作为 remind 的输入来源。\n- **催办前先确认任务仍需处理**：已经审批完成、已撤回或已终止的任务一般不适合继续催办。\n- **`comment` 建议简洁且明确**：例如 `该单据较急，请优先审批`、`请今天内处理`。避免过长或模糊描述。\n- **先 `--dry-run` 再执行**：尤其在一次催办多个任务、任务来源不明确或需让用户复核催办对象时，先预览更安全。\n","skills/lark-approval/references/lark-approval-tasks-rollback.md":"\n# approval tasks rollback\n\n将一个审批任务退回到指定节点（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，再结合实例详情确认可退回的目标节点 `node_ids`，最后执行退回。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要退回该审批且目标任务、退回节点都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"<NODE_ID>\"],\"comment\":\"退回补充材料\"}' \\\n  --as user \\\n  --dry-run\n\n# 退回到单个节点\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"<NODE_ID>\"],\"comment\":\"请补充附件后重新提交\"}' \\\n  --as user \\\n  --yes\n\n# 退回到发起节点（发起节点 ID 为 START）\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"START\"],\"comment\":\"退回发起人补充材料\"}' \\\n  --as user \\\n  --yes\n\n# 传多个候选节点 ID（以实际审批定义支持情况为准）\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"<NODE_ID_1>\",\"<NODE_ID_2>\"],\"comment\":\"退回上一处理节点\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment 或较多 node_ids\nlark-cli approval tasks rollback \\\n  --data @./rollback-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `node_ids` | 是 | 退回目标节点 ID 数组；发起节点 ID 为 `START`；执行前应先确认这些节点确实可作为退回目标 |\n| `comment` | 否 | 审批意见或退回说明，例如 `请补充附件后重新提交`、`预算说明不完整，请补充` |\n| `--as user` | 否 | 建议显式指定用户身份；审批退回通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / transfer / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n| `tasks[].support_api_operate` | 是否支持通过 API 处理该任务；退回前建议先检查 |\n\n如需确认流程节点、当前进度和可退回位置，可先查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行退回操作。\n- **`node_ids` 是必填项**：退回并不是“自动退回上一步”，而是要明确给出目标节点 ID 数组；退回发起节点时传 `START`。\n- **先确认节点是否可退回**：不同审批定义支持的退回目标可能不同；在不确定时，先通过 `instances get` 或业务侧流程信息核实。\n- **优先从 `tasks query` 的待办列表拿任务参数**：尤其是 `topic=1` 的待办审批，最适合作为 rollback 的输入来源。\n- **先检查是否支持 API 操作**：如果 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 执行处理动作，退回前应谨慎验证。\n- **`comment` 建议写清退回原因**：例如 `附件缺失，请补齐后重新提交`、`费用说明不完整，请补充明细`，方便发起人或上一步处理人理解原因。\n- **先 `--dry-run` 再执行**：尤其在节点来源不明确、审批链路复杂或批量处理时，先预览更安全。\n","skills/lark-approval/references/lark-approval-tasks-transfer.md":"\n# approval tasks transfer\n\n转交一个审批任务给其他用户处理（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，确认目标任务后，再提供被转交人的用户 ID 执行转交。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要转交该审批且目标任务、转交对象都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"ou_xxx\",\"comment\":\"请你继续处理\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --dry-run\n\n# 按 open_id 转交审批任务\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"ou_xxx\",\"comment\":\"转交给你处理\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 按 user_id 转交审批任务\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"123456789\",\"comment\":\"请补充审核\"}' \\\n  --params '{\"user_id_type\":\"user_id\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment\nlark-cli approval tasks transfer \\\n  --data @./transfer-body.json \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `transfer_user_id` | 是 | 被转交人的用户 ID；需要和 `user_id_type` 保持一致 |\n| `comment` | 否 | 审批意见或转交说明，例如 `转交给你处理`、`请继续审核该单据` |\n| `--params '{\"user_id_type\":\"...\"}'` | 否 | 查询参数 JSON；用于声明 `transfer_user_id` 的 ID 类型 |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id`；未显式指定时要特别确认 `transfer_user_id` 的真实类型 |\n| `--as user` | 否 | 建议显式指定用户身份；审批转交通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / transfer / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n| `tasks[].support_api_operate` | 是否支持通过 API 处理该任务；转交前建议先检查 |\n\n如果你手里只有姓名或邮箱，建议先通过联系人能力解析出正确的用户 ID，再执行转交。\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行转交操作。\n- **`transfer_user_id` 与 `user_id_type` 必须匹配**：例如传 open_id 就把 `user_id_type` 设为 `open_id`；不要混用。\n- **优先显式传 `user_id_type`**：这样 agent 更容易判断参数含义，也能减少 ID 类型不匹配带来的失败。\n- **优先从 `tasks query` 的待办列表拿任务参数**：尤其是 `topic=1` 的待办审批，最适合作为 transfer 的输入来源。\n- **先检查是否支持 API 操作**：如果 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 执行同意/拒绝等处理动作，转交前也应谨慎验证。\n- **`comment` 建议写明转交原因**：例如 `你更熟悉该项目，请继续处理`、`转交给预算 owner 审核`，方便接收人理解上下文。\n- **先 `--dry-run` 再执行**：尤其在跨部门转交、批量处理或转交对象来源不明确时，先预览更安全。\n","skills/lark-apps/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2FSKILL.md -->","skills/lark-apps/creative-design/agents/fork-verifier-agent.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Fcreative-design%2Fagents%2Ffork-verifier-agent.md -->","skills/lark-apps/creative-design/agents/vision-probe-agent.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Fcreative-design%2Fagents%2Fvision-probe-agent.md -->","skills/lark-apps/creative-design/creative-design.md":"---\nname: creative-design\ndescription: 以自包含 HTML 创建精致的设计产物：UI mockup、可交互原型、线框图（wireframe）、落地页、仪表盘、应用屏幕、移动 App、幻灯片 deck（即 PPT / PowerPoint 演示文稿）、动画视频（motion graphics、产品演示 Demo 动画、数据动画）、可视化报告 / 信息图（infographic）/ 视觉长图与视觉探索。只要用户要求为界面、产品屏幕、用户流程、内容版式、视觉产物或 pitch/deck 概念进行 design、mock up、prototype、wireframe、可视化、动画/动效、探索或制作 PPT/deck——即便他们没有说\"设计\"二字——就使用本 skill。Harness 无关：适用于 Aily、Claude Code、Codex Agent 及类似的具备文件能力的 agent。\n---\n\n## 目录结构与运行环境\n本 skill 附带以下资源，路径均相对于本文件所在目录：\n\n- `references/<name>.md` — 媒介专属技能 prompt（如 `frontend-design.md`、`hi-fi-design.md`、`charts.md` 等；见文末「Skills 元信息」的完整列表）。与下方 harness 工具映射表同在 `references/` 目录。\n- `starter-components/` — 现成的 HTML/JS/JSX 脚手架（`design-canvas.jsx`、`deck-stage.js`、`ios-frame.jsx`、`android-frame.jsx`、`tweaks-panel.jsx`、`macos-window.jsx`、`browser-window.jsx`、`animations.jsx`）。见下文「Starter Components」。\n- `references/<harness>.md` — **harness 专属工具映射表**（`claude.md`、`codex.md`、`aily.md`）。本文行文使用的是 harness 无关的 web 工具名——`ask_user_question`、`copy_starter_component`、`invoke_skill(\"X\")`、`generate_image`、`search_images`、展示文件等——**动手前先读取与你当前运行环境对应的 `references/<harness>.md`，把这些名字映射成你 harness 里的真实工具**。例如在 Claude Code 里 `ask_user_question` → `AskUserQuestion`、`copy_starter_component` → `Bash cp <本 skill 所在目录>/starter-components/<file> .`、`invoke_skill(\"X\")` → `Read references/<file>.md`。\n- `assets/index.html` — React + Babel 的 HTML 起步模板（锁定版本 script 标签 + `#root` 挂载点），见下文「React + Babel」。\n\n## 工作流\n1. 理解用户需求。对全新或含糊的工作，提出澄清性问题。弄清输出物、精细度（fidelity）、选项数量、约束条件，以及涉及的 UI kit 与品牌。\n2. 探索所提供的资源。附件、文档链接、网页 URL 都要在动手前解析完（见「输入资料解析」）。\n3. 列出 todo 清单。\n4. 为本次任务创建独立的任务目录——多个任务会在同一个根目录下执行，直接写根目录会互相覆盖、文件串台；每个任务目录是一个**独立的妙搭应用仓库**——新任务先用 `+create` 建应用、再 `+init --app-id <app_id> --dir <任务目录>` 初始化仓库（会自动 clone 并切到 `sprint/default`，命令见「发布」前提），独立发布互不影响。把资源复制进任务目录，在其中创建交付物。用图片素材提升美观度与丰富度、或需要有依据的内容时，按「图像素材与外部信息」补充。\n5. （如有）自检React + Babel路径是否正确；ReactDOM.createRoot 是否参数正确，对应元素是否存在\n6. 收尾：提交你的改动。\n7. 发布：把产物发布到妙搭拿到可访问链接（见下方「发布」）。写完不发布，用户拿不到线上链接。\n8. 极其简短地总结——只讲注意事项与后续步骤，并给出发布后的可访问链接。\n\n鼓励你并发调用文件探索工具以提升效率。\n\n## 提问\n默认基于用户给的信息、项目上下文和合理假设直接开始，不为收集偏好而打断。只有当一个决策同时满足两条，使用可用的 向用户提问的 工具向用户提问：① 用户没说、且从 prompt / PRD / 截图 / 代码库 / 品牌资料也推不出；② 猜错要推倒重来（承重决策，下游都建在它上面）。两条只要有一条不成立——能合理推断，或猜错只是局部返工——就直接做。\n\n承重、推不出就必须先问的：交付媒介 / 格式（报告 vs deck vs 看板）；视觉 / 美学方向（从零起的项目、且资料里推不出一个有把握不返工的方向时）；大体量交付（整套 deck、多页产物）的受众 / 目的与核心范围。\n局部、给默认直接做的：变体数量与探索维度、界面文案、占位与示例内容、单屏 / 单组件的处理与密度——给合理默认（变体默认摆 2-3 个有清晰差异的方案），让用户在产出上重定向，不为它们提问。\n\n例如：\n\n- \"做一份关于 X 的报告／材料\"但没说格式 → 媒介推不出且承重，先确认交付格式（幻灯片 vs. 视觉报告 vs. 仪表盘），再问格式相关的问题。\n- 为附带的 PRD 做一套 deck → PRD 能推出受众 / 场景就直接做；只有受众、篇幅推不出且影响全局时才问。\n- 用这份 PRD 为 Eng All Hands 做一套 10 分钟的 deck → 无需提问；信息已足够。\n- 把这张截图变成交互原型 → 只有当图片无法说明预期行为时才提问。\n- 做 6 页关于黄油历史的幻灯片 → 媒介、页数已定，直接开工；风格能从主题推断就定，推不出再问。\n- 为我的外卖 app 的 onboarding 做一套原型 → 按常见 onboarding 流程直接做；只问会阻塞产出的承重问题。\n\n当交付格式本身不明确时——用户只说了一个成果（\"一份报告\"\"材料\"\"一份摘要\"）却没说媒介——先解决格式，再讨论任何与格式相关的细节。\n\n问出好问题至关重要。技巧：\n\n- 通常一轮聚焦提问就够；把承重的未知一次问齐，不要挤牙膏式多轮打断。\n- 只问推不出的；能从 PRD、截图、代码库、品牌资产、现有页面和用户原话推断的，先推断，并在产出里说明你的假设。\n\n## 输入资料解析\n用户给的附件、文档链接和 URL 是设计的输入，必须在动手前解析完——数据看板、报告和基于文档的 deck 全都建立在源资料之上，跳过这一步产出的内容只能靠编造。按输入形态处理：\n\n- **数据文件（csv / json / xlsx）**——先看结构（列名、字段类型、行数）和样本行，再决定信息层级与图表选型；指标一律用脚本从源数据计算，不要目测。\n- **压缩包（zip）**——先解压到临时目录，逐个查看内容物，再按各自类型处理。\n- **文档（docx / pdf / 论文 / 需求文档）**——用当前 harness 的文档解析能力读取**全文**（映射见 `references/<harness>.md`；Aily 原生支持解析 Word / PDF 等二进制文件），不要只读开头就动手。\n- **飞书云文档 / 多维表格链接**——用 `lark-cli` 读取内容（云文档 / 多维表格相关命令，不确定用法先查 `--help`）；`lark-cli` 不可用时向用户说明并请其导出或粘贴，不要凭标题猜内容。\n- **网页 URL**——用 `web_fetch` 抓取全文后再产出；抓取失败就告知用户，不要凭 URL 和常识编写。\n\n## 如何开展设计工作\n动手前先读取 **`./references/frontend-design.md`** 确立视觉方向——它教你如何果断做出有意图、不落模板俗套的美学抉择：有品牌或既有 UI 时对齐现有视觉语言，从零起步时据主题 / 材料立一个契合的方向。当媒介专属 skill 内的指令与通用设计规则冲突时，以媒介 skill 内的指令为准——这是规则内容的优先级，不改变「该加载 / 调用哪些 skill」。\n\n当用户请你做高保真 UI mockup、界面设计或带多方案的视觉探索时，开始之前先读取 **`./references/hi-fi-design.md`**——它涵盖了设计流程、获取设计上下文、提问以及呈现多个方案。\n\n一次设计探索的输出是单个 HTML 文档。根据你所探索的内容选择呈现格式：\n\n- **静态视觉 / 设计稿 / 多方案探索**（颜色、字体、单个元素、整屏 UI、流程关键帧）→ 通过 `starter-components/design-canvas.jsx` starter component 把各方案铺陈在画布上。除非用户明确要求可点击 / 可交互，否则不要把设计稿升级成点击原型。\n- **用户明确要求可交互的流程或产品 demo** → 将整个产品做成高保真可点击原型，并把关键选项以 Tweak 形式暴露出来。可交互原型禁止使用 `starter-components/design-canvas.jsx`、`<DCArtboard>` 或画布外壳包裹；它应该作为真实应用界面直接运行。\n\n这两者可以组合，但只限静态设计探索。已经做好的**可交互原型**如果用户接着想探索多个方向，用页内开关、路由、Tabs、Tweak 或模式切换承载变体；不要把交互原型放进 design-canvas 画布，也不要用 `<DCArtboard>` 并排包裹。\n\n当用户要求新版本或改动时，把它们作为 TWEAKS 加到原件上；拥有一个可切换不同版本开关的主文件，优于拥有多个文件。\n\n## 默认美学指令\n如果用户没给参考或艺术方向：能从主题、材料或场景推断出一个有把握、不会返工的视觉方向，就主动确定，并在设计中体现假设；如果推不出、又是从零起的项目，先用 `ask_user_question` 问清偏好的调性、受众、颜色、字体、情绪等再动手——不要在推不出方向时硬选，slop 就是这么来的。\n\n定下视觉方向后（无论是推断还是问来的），创建设计时遵循以下指引：\n\n- **字体与排版。** 选择与主题、媒介和场景匹配的少量字体，并通过字号、字重、字宽、行长、语义断行、数字样式和文字位置建立清晰层级与视觉节奏；不依赖增加字体数量制造变化。\n- **背景与色彩体系。** 确定主色调，并建立与主题协调的中性基底、主题色和必要的章节／语义色。背景不局限于纯黑、纯白或单一色调，可以根据内容属性、页面角色和叙事节点使用不同色调、主题色底、局部色域、图片或图形背景。\n- **色彩一致性。** 一致性来自共享色板、字体、栅格、图形语言和明确的颜色关系，不要求所有页面使用相同背景。颜色变化应帮助识别章节、信息层级和重点，避免无语义地逐页随机换色。\n- **强调色。** 使用数量克制、关系协调的强调色，并根据背景、信息层级和色彩语义调整明度与彩度。图表、状态和章节色需要清楚可区分，但应属于同一视觉体系。\n- **中性色。** 黑、白、灰可以带有与主题协调的细微色相，避免把纯黑白或低饱和配色作为所有专业场景的默认答案。\n- **视觉复杂度。** 视觉丰富度应服务内容。不要添加无信息价值的装饰，也不要把\"克制\"理解为单调、大量留白、缺少图片图表或所有页面使用同一种构图。\n\n关键：如果已给出其他美学指令（如参考图、品牌体系、设计规范或媒介专属 skill），或项目中已有文件，则完全忽略默认美学。\n\n## 图像素材与外部信息\n图片素材能显著提升产物的美观度与丰富度——不要默认只用纯 CSS/SVG 撑起全部视觉。为氛围、质感和视觉节奏而配图是正当用途，不需要等到\"内容必须有图\"才配图。选择工具的判断规则很简单：**需要真实图片就搜索，需要丰富美观的图片就生成**。当前 harness 若提供以下能力（映射见 `references/<harness>.md`；没有对应工具就跳过，用内联 SVG / CSS 图形兜底），在合适的位置主动使用：\n\n- **`generate_image`（AI 图片生成）**——美化、氛围类配图一律走生成：hero 图、插画、照片质感背景、章节题图、空状态插图、信息图（infographic）、产品/场景示意图等任何能让页面更好看的位置，用文生图直接生成；有品牌参考图或用户素材时用图生图对齐既有视觉语言；多屏 / 多页需要风格统一、角色连贯的插画体系时用组图一次生成整个序列；对已有图片做局部调整用图片编辑。生成 prompt 里写清风格、构图、配色与光线，让产出与已确立的视觉方向一致，而不是各自为政。\n- **`search_images`（图片搜索）**——需要真实图片时走搜索：真实存在的实物、产品、地点、人物、logo、截图等生成会失真或造假的素材，以及确立视觉方向时按关键词找参考图（同类产品界面、风格 moodboard）。直接引用搜索结果时注意来源与版权。\n- **`web_search` / `web_fetch`（联网搜索）**——内容需要真实事实、数据、案例或时效性信息时先搜再写，不要编造（见「内容准则」：涉及新增事实、数据时要有依据）。调研型产出（行业研究、政策梳理、竞争格局类 deck / 报告）要先做多轮搜索，把事实、数字与来源收集齐并标注出处，再进入设计。\n- **视频素材**——需要嵌入公开视频（培训短片、案例视频等）时，用联网搜索找到可公开访问的视频页面或可嵌入链接，以 `<iframe>` / `<video>` 嵌入并注明来源；不要下载搬运版权内容，也绝不虚构视频 URL——找不到合适的就如实告知用户并留占位。\n\n约束：\n\n- 配图要属于同一视觉体系——风格、色调、光线与已确立的视觉方向一致，宁可少而统一，不要多而杂乱；逐张风格漂移比没有图更伤美观度。\n- 用户已提供图片 / 品牌素材时优先使用，不要擅自用生成图替换。\n- 搜索到 / 生成的图片先落到本地，再用 `lark-cli apps +file-upload --app-id <app_id> --file <local_path> --as user` 上传，代码中引用返回的**远端 URL**——不要提交 git、不要引用本地路径、不要 base64 内联，也不要直接热链搜索结果页的原始 URL（可能防盗链或失效）。上传需要 `app_id`，任务尚未初始化时先按「发布」前提完成 `+create` / `+init` 两步。\n\n## 输出创建准则\n- **文件输出路径**：会话根目录下会并存多个任务。**每个任务先创建自己的独立目录**（语义化命名，如 `sales-dashboard/`）——它就是一个独立的妙搭应用仓库，独立初始化、独立发布。所有交付物写进本任务目录，主 HTML 入口是该目录下的 `index.html`。不要把文件写到任务目录之外的共用根目录，也不要改动其他任务的目录；用户要迭代某个已有任务时，进入该任务的目录继续改，不要另起新目录。\n- 对文件做重大修订时，先复制再编辑，以保留旧版本（如 index.html、index v2.html 等）。\n- 始终避免写大文件（>1000 行）。而应把代码拆成若干更小的 JSX 文件，最后在主文件里 import 进来。这让文件更易管理和编辑。\n- 对于视频和其他带时间轴的内容，让播放位置可持久化；每次变化时存入 localStorage，加载时再从 localStorage 读回。这样用户刷新页面时不会丢失当前位置，而刷新在迭代设计中很常见。（使用 `starter-components/deck-stage.js` 的 deck 不需要这么做——宿主会把幻灯片位置保存在 URL 中。）\n- 在既有 UI 上做增补时，先理解该 UI 的视觉语汇并遵循它。对齐文案风格、配色、语气、hover/click 状态、动画风格、阴影＋卡片＋布局模式、密度等。把你观察到的东西\"出声想一想\"会有帮助。\n- 写规范的 HTML，让编辑器能直接编辑：显式闭合每个非空（non-void）元素（写 `<p>…</p>`，绝不依赖隐式闭合），每个属性值都用双引号，且不要自闭合非空元素（写 `<div></div>`，而非 `<div/>`）。这有助于直接编辑功能正常工作。\n- 绝不使用 `scrollIntoView`——它可能搞乱 web app。如有需要，改用其他 DOM 滚动方法。\n- **颜色使用：** 有品牌色时优先沿用品牌体系；没有品牌或既有配色时，根据主题、受众、内容语义和视觉方向推导协调色板。避免随意加入彼此无关的颜色，不要默认退回纯黑白。对于数据图表和信息图，颜色应承担区分、强调或表达语义的作用，并保证足够对比。\n- **Emoji：** 不要在生成的代码中使用 emoji 字符——不作图标、不作装饰、不放进数据里。例外：仅当用户的品牌资产明确包含 emoji 时。\n- **图标：** 系统图标规则仅适用于需要界面图标体系的 UI 或交互原型。在这类产物中，使用手写内联 SVG（`<svg viewBox=\"0 0 24 24\">`）建立语义贴切、风格连贯的图标语言。\n- **字体加载：** 需要 Google Fonts / web 字体时，一律从自托管镜像 `https://miaoda.feishu.cn/fonts/css2` 加载，不要直连 `fonts.googleapis.com` / `fonts.gstatic.com`——这两个 Google CDN 在部分地区慢、甚至连不上，会导致字体加载失败、页面回退到系统字体。镜像是 Google Fonts `css2` 端点的直接替代：查询语法完全一致（`?family=Inter:wght@400;600&display=swap`，多字族就重复多个 `family=` 参数），只需把域名换成镜像；它返回的 `@font-face` 会把字体文件也指向自托管 CDN，CSS 与字体文件两跳都不经过 Google，字库与字重同 Google Fonts。照常用 `<link rel=\"stylesheet\" href=\"https://miaoda.feishu.cn/fonts/css2?family=…&display=swap\">` 引入即可。\n\n## 内容准则\n\n**内容取舍。** 不添加与用户目标无关或没有依据的内容。在用户明确的范围内，可以重组、解释和补足完成叙事所需的信息；涉及新增事实、数据或任务范围时，再向用户确认或明确为示例。内容不足以独立成页时，应合并、重构或请求材料，不用放大元素和增加留白勉强撑页。\n\n**数据保真。** 用户给了源数据（附件、文档、表格）时，产物中的每个图表数字、指标和结论都必须从源数据实际计算得出（写脚本统计，见「输入资料解析」），并能追溯回源数据——不目测、不凑整、不编造。做数据报表/看板前读 `references/data-report.md`，其中的数据准则同样适用。\n\n**硬性规格是约束，不是建议。** 用户给定的页数/张数范围、画幅比例、结构大纲、预算上限、必须包含的表格或模块，逐条对照满足，交付前自查一遍；幻灯片的页数规划方法见 `references/make-a-deck.md`。\n\n**使用恰当的尺度：** 对于 1920x1080 的幻灯片，文字绝不应小于 24px；理想情况下要大得多。打印文档最小 12pt。移动端 mockup 的点击目标绝不应小于 44px。\n\n**避免 AI slop 套路：** 包括但不限于滥用渐变背景、emoji（见上面的 Emoji 规则）、圆角＋左边框强调色的容器、被用滥的字体族（Inter、Roboto、Arial、Fraunces）。\n\n**CSS**：`text-wrap: pretty`、CSS grid 以及其他高级 CSS 效果都是你的好帮手！\n\n**强烈倾向用带 `gap` 的 flex/grid，而非 inline 流。** 对任何一行或一组兄弟元素（按钮、chips、图标、卡片、导航项、工具栏），用 `display: flex` 或 `display: grid` 配合 `gap:` 来做间距——而不是用靠源码空白或逐元素 margin 分隔的裸 inline/inline-block 兄弟元素。flex/grid 的间距是显式的，能干净地经受直接操作类编辑（拖拽重排、删除、复制）；而 inline 流依赖空白文本节点，在 DOM 编辑下很脆弱。把 inline 流留给句子中偶尔夹带 `<a>`/`<strong>`/`<em>` 的文字段落——不要用它来排布 UI 元素。\n\n## 保留评论锚点\n某些源元素带有 `data-comment-anchor=\"…\"` 属性。它把用户的评审评论钉在该元素上。编辑时，把该属性保留在你输出中语义等价的那个元素上——如果你重构了结构就随元素一起移动它，在文本／样式编辑中保留它，仅当你彻底删除该元素时才丢弃它。绝不发明新值，也不要把它复制到其他元素上。\n\n## 为幻灯片和屏幕打标签以提供评论上下文\n在代表幻灯片和高层级屏幕的元素上加 `[data-screen-label]` 属性；这样你就能分辨用户的评论是针对哪一张幻灯片或哪一屏。\n当用户说\"slide 5\"或\"index 5\"时，他们指的是第 5 张幻灯片（标签\"05\"），而绝非数组下标 `[4]`——人类不按 0 起始计数。\n\n## React + Babel（浏览器内 JSX）\n当用浏览器内 JSX 编写 React 原型（无构建步骤——Babel 在运行时转译）时，你必须使用下面这些锁定版本的确切 script 标签。不要使用未锁定版本（例如 react@18）。要用 React + Babel 时，可直接从本 skill 的 `assets/index.html` 拷贝 HTML 模板起步（`cp <本 skill 所在目录>/assets/index.html <任务目录>/index.html`）——它已带好这三个 script 标签和 `#root` 挂载点，不必手写。\n\n```html\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/react@18.3.1/umd/react.development.js\" crossorigin=\"anonymous\"></script>\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/react-dom@18.3.1/umd/react-dom.development.js\" crossorigin=\"anonymous\"></script>\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/@babel/standalone@7.29.0/babel.min.js\" crossorigin=\"anonymous\"></script>\n```\n\n发布前需要对以上 script 路径进行自检，确保它们路径与上述代码完全一致\n\n### 脚本导入\n用 script 标签导入你写的任何辅助脚本或组件脚本。`.jsx` 文件必须用 `<script type=\"text/babel\" src=\"xxx.jsx\"></script>`——它们含 JSX 语法，需要 Babel 转译；省略 type 属性会让浏览器把 JSX 当作纯 JS 解析，从而抛出语法错误。纯 `.js` 文件可以用普通的 `<script src=\"xxx.js\"></script>`。避免在脚本导入上使用 `type=\"module\"`——它可能会出问题。\n\n**加载顺序**：`@babel/standalone` 用异步 XHR 拉取外部 `<script type=\"text/babel\" src=\"...\">` 文件，但保证按 DOM 顺序执行——靠前的脚本总在靠后的脚本之前运行。然而，内联脚本（无 `src`）会立即就绪，而外部脚本必须等待网络响应。如果一个内联脚本排在前面，它会立即执行，其副作用（例如 React 的 `useEffect`）可能在任何后面的外部脚本加载之前就触发。把外部脚本放在依赖它们的内联脚本之前。\n\n### 跨文件作用域\n每个 `<script type=\"text/babel\">` 在转译后都有自己独立的作用域。要在文件间共享组件，在组件文件末尾把它们导出到 `window`：\n\n```js\n// 在 components.jsx 末尾：\nObject.assign(window, {\n  Terminal, Line, Spacer,\n  Gray, Blue, Green, Bold,\n  // ... 所有需要共享的组件\n});\n```\n\n### 样式对象命名\n定义全局作用域的样式对象时，给它们起具体的名字。如果你导入了 1 个以上带 `styles` 对象的组件，就会出问题。你必须基于组件名给每个 styles 对象起唯一的名字，比如 `const terminalStyles = { ... }`；或者用内联样式。绝不要写 `const styles = { ... }`。\n\n### 动画\n对于视频风格的 HTML 产物，调用 `animated-video` skill 并从 `starter-components/animations.jsx` starter component 起步——不要自己实现时间轴引擎。对于简单的交互原型过渡，CSS transitions 或纯 React state 就够了。\n\n### 原型\n- 克制住加\"标题\"屏的冲动；让你的原型在视口中居中，或做成响应式尺寸（填满视口并留合理边距）。\n\n## Starter Components（起始组件）\n现成的 HTML/JS/JSX 脚手架（scaffold）就放在本文件旁边的 `starter-components/` 目录里——需要设备外框（device frame）、幻灯片外壳（deck shell）、画布（canvas）或动画时间轴（animation timeline）时，直接用它们，不要手搓。使用方式：把文件拷进当前任务目录（在任务目录下执行 `cp <本 skill 所在目录>/starter-components/<file> .`——注意 cwd 不会是 skill 目录，要用 skill 目录的实际路径），或读过之后照着改；每个文件顶部都带有自己的用法说明。\n\n- `design-canvas.jsx` — 可平移／缩放的画布，artboard 可重排、可全屏聚焦。\n- `deck-stage.js` — 幻灯片 deck 外壳。用于任何幻灯片演示（见「Skills 元信息」中的 Make a deck）。\n- `ios-frame.jsx` / `android-frame.jsx` — 带状态栏和键盘的设备边框。\n- `tweaks-panel.jsx` — 浮动的 Tweaks 面板＋表单控件（`useTweaks`、滑块、开关、单选、颜色 chips 等）。\n- `macos-window.jsx` / `browser-window.jsx` — 桌面窗口外壳（chrome）。\n- `animations.jsx` — 基于时间轴的动画引擎（Stage + Sprite + scrubber + Easing）。\n\n## Tweaks\n用户可以从工具栏开关 **Tweaks**——一个存在于原型内部的页内控件面板（颜色、字体、间距、文案、布局变体）。不要自己实现它：用 `kind: \"tweaks-panel.jsx\"` 调用 `copy_starter_component` 并阅读复制出来的文件——它接好了宿主协议，并给你 `useTweaks()` 以及现成的控件。这个面板的标题按界面语言来定——英文叫\"Tweaks\"，中文叫\"风格\"。把它保持小巧，Tweaks 关闭时完全隐藏，并且即使用户没要求，也默认加上几个有品味的 tweak。你写在面板里的标签和选项是用户会读到的内容，而非配置——用与 app 其余部分相同的语言书写。\n\n**闭环。** 每个 tweak 都需要一个生产者（面板控件）和一个消费者（对该值作出反应的内容）。只存在于 `<TweaksPanel>` 和 `TWEAK_DEFAULTS` 里的值不会改变设计中的任何东西——用户看到控件有反应，但原型纹丝不动。\n\n## 发布\n设计产物写完并提交后，需要发布到妙搭（lark-apps）才能拿到可访问链接。本 skill 产出的是创意模式（html）应用，发布走本地开发链路：改动 git commit 后推到工作分支 `sprint/default`，再用 `lark-cli apps` 命令发起部署并轮询结果。\n\n**前提**：每个任务目录是一个独立的妙搭 html 应用仓库，独立发布、互不影响；发布序列的所有命令都在**当前任务目录**内执行。任务目录还不是应用仓库（没有 `.spark/meta.json`）时，先完成两步初始化：\n\n```bash\n# 1. 创建应用，记下返回的 app_id（app_ 开头）\nlark-cli apps +create --name \"<应用名>\" --app-type html --as user\n\n# 2. 初始化到任务目录：会自动 clone 远端仓库并 checkout 工作分支 sprint/default，\n#    无需 git init / git checkout（--dir 不传默认 ./<app-id>；\n#    --source-path 可把已写好的产物一并并入，但源码目录不存在时会被静默跳过，用后核对文件确实进了仓库）\nlark-cli apps +init --app-id <app_id> --dir <任务目录> --as user\n```\n\n初始化后在任务目录内创建 / 修改产物（创意模式是 buildless，源码即产物，`index.html` 放仓库根目录），然后走下方发布序列。\n\n`app_id`（`app_` 开头）从任务目录的 `.spark/meta.json` 读取，或来自 `+create` 的返回 / 用户给出——`cli_` 开头的是飞书应用 ID，绝不能传给 `apps +*` 命令。资源型文件（图片、字体、音视频）不要提交 git、不要引用本地路径、也不要 base64 内联；先 `lark-cli apps +file-upload --app-id <app_id> --file <local_path> --as user` 上传拿远端 URL 再在代码里引用（见「图像素材与外部信息」）。\n\n发布序列：\n\n```bash\n# 1. 提交并推到工作分支 sprint/default\n#    遇非 fast-forward：先 git pull --rebase origin sprint/default 解决冲突再推，绝不 force-push\ngit add . && git commit -m \"feat: ...\" && git push origin sprint/default\n\n# 2. 发起部署（记下返回的 release_id），然后轮询状态直到 finished / failed：\n#    publishing → 继续轮询；finished → 输出含可分享的 online_url，直接返回给用户；failed → 按输出中的 error_logs 报告失败原因\nlark-cli apps +release-create --app-id <app_id> --as user\nlark-cli apps +release-get --app-id <app_id> --release-id <release_id> --as user\n```\n\n要点：\n\n- 所有 git 命令必须在**任务仓库根目录**下执行（每条命令先 `cd <任务目录>`，或用 `git -C <任务目录>`）——`git add .` 作用于当前 cwd，在多任务共用的上级根目录里执行会把其他任务的文件也 stage 进来。\n- 推送和部署的分支必须是 `sprint/default`：推到其他分支，`+release-create` 会失败。\n- `+release-create` 部署的是远端 `sprint/default` 上**已 push** 的代码，不是本地工作区——未 commit / 未 push 的改动不会进入这次发布。\n- 完成 ≠ 发布：产物生成完、或 `+list` 显示 `is_published=true`，都不代表最新内容已上线；必须拿到本轮 `+release-get` 返回的 `finished` 才算发布成功。\n- 创意模式（html）应用**开发态与发布态是同一个链接**（形如 `https://{租户域名}/page/{meta_token}`，形似飞书文档链接），`online_url` 即最终可分享链接。\n- 任何 git 操作（push / pull / clone）报认证失败、401/403、credential helper 缺失或 token 过期时，先执行 `lark-cli apps +git-credential-init --app-id <app_id> --as user` 刷新本地 Git 凭证，再重试原 git 命令；刷新凭证也失败就停下向用户报告错误，不要改走其他发布路径（尤其不要用 `+html-publish`）。\n\n## Skills 元信息\n你有以下内置技能 prompt，位于本文件相对路径下的 `references/` 目录中。如果用户的需求与其中某个技能匹配，而对应的 prompt 尚未加载进你的上下文，就去 READ（读取）相应文件，把它的指引加载进来。\n\n- **[Animated video](references/animated-video.md)** — Use when creating animated videos, motion graphics, product walkthroughs, or visual storytelling with timeline-based playback. 触发词：animation, video, motion, 动画, 视频, 动效, 产品演示, 演示动画, walkthrough\n- **[Charts](references/charts.md)** — 基于 ECharts 的数据可视化，用于浏览器直出 HTML。当需要创建图表、仪表盘或数据可视化时使用。触发词：chart, ECharts, 图表, 可视化, visualization, 饼图, 柱状图, 折线图, 数据图表, 甘特图, 热力图, 数据展示, dashboard, 仪表盘, 数据看板\n- **[Data report](references/data-report.md)** — 数据驱动的报表与看板设计。从数据分析到报表规划、信息层级组织，适用于用户有数据文件或明确指标，需要产出结构化数据报表的场景。图表绘制部分由 charts skill 承担。触发词：数据报表, 数据看板, 数据分析报表, BI, 经营报表, 指标看板, 周报, 月报, 数据大盘, KPI, 报表设计, data report, dashboard report, analytics report\n- **[Frontend design](references/frontend-design.md)** — Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.\n- **[Hi-fi design](references/hi-fi-design.md)** — 用于创建高保真 UI mockup、设计探索，或带多种变体的视觉原型。触发词：mockup, hi-fi, prototype, UI design, 高保真, 设计稿, 原型, 界面设计, 视觉设计, 设计方案\n- **[Interactive prototype](references/interactive-prototype.md)** — 可交互原型：像真实应用一样直接运行的高保真交互 demo。触发词：可交互原型, 交互原型, 点击原型, interactive prototype, working app, 产品 demo, 工单系统, 管理后台, 看板工具, 多页面应用\n- **[Make a deck](references/make-a-deck.md)** — 当用户要求制作幻灯片（slide deck）、演示文稿（presentation）、pitch deck 或 \"slides\"——即一个供演讲者演示的自包含 HTML 单页（1920×1080，16:9），而非网站时使用。\n- **[Visual exposure](references/visual-exposure.md)** — 用于制作可视化报告、专题视觉页、信息图、视觉长图、概念可视化、产品能力曝光、方案亮点展示等内容型 HTML 视觉作品。适合用户想把材料、数据或观点组织成可阅读、可展示、可传播的视觉化表达，但不希望做成 PPT、传统 dashboard 或纯 ECharts 图表的场景。触发词：可视化报告, 视觉报告, 可视化曝光, 视觉化曝光, 信息图, 长图, infographic, 视觉表达, 概念可视化, 亮点展示, 能力曝光\n- **[Wireframe](references/wireframe.md)** — Explore many ideas with wireframes and storyboards\n","skills/lark-apps/creative-design/references/aily.md":"# Aily 工具参考\n\n本文档列出 [`../creative-design.md`](../creative-design.md) 所依赖的 harness 专属工具，供你在 **Aily** 中运行时使用。主提示词只命名能力（\"向用户提问\"、\"展示文件\"等）；本文档给出 Aily 的调用方式。通用工具（`Bash`、文件读/写/编辑、grep/glob 搜索）在任何环境都相同，不在此覆盖。\n\n## Web 工具 → Aily 对应项\n\n上游提示词引用了一些在 Aily 中并不存在的 Claude.ai web 工具。无论出现在行文还是代码里，一律按下表替换：\n\n| Web 工具 | Aily 对应项 |\n|---|---|\n| `ask_user_question` | `ask_user`（向用户抛出结构化决策问题；先问，等用户答复后再继续）。 |\n| `done`、`fork_verifier_agent` | 用 `submit` 交付结果并给出文件路径。 |\n| `write_file`（及其 `asset:` 参数） | Aily 的「创建/编辑本地文件」工具。不存在 asset review pane；舍弃这一概念。 |\n| `copy_files` | `Bash cp`。 |\n| `read_file`、`list_files`、`view_image` | 「读取本地文件」；按文件名查找用 glob、搜内容用 grep；图片直接走「解析二进制文件（…图片…）」——Aily 原生支持图像输入。 |\n| `show_to_user` | 用 `submit` 交付并给出绝对本地文件路径。 |\n| `eval_js`、`eval_js_user_view`、`run_script` | 脚本用 `Bash`。 |\n| `web_fetch`、`web_search` | `fetch`、`web_search`。用于时效性事实、内容素材补充或用户要求的查询。 |\n| `generate_image` | `aily-image-generate_workbench`（Seedream V4.5 模型）：支持文生图、图生图（给参考图）、信息图（infographic）、图片编辑、组图（一次生成多张风格统一、角色连贯的图像序列）。 |\n| `search_images` | `doubao_image_search`（按关键词搜索图片，适合找参考图、素材图）。 |\n| `copy_starter_component` | `Bash cp <本 skill 所在目录>/starter-components/<file> .`（cwd 通常是应用项目目录而非 skill 目录，需用 skill 目录实际路径；或读取后改编）。 |\n| 文档解析（docx / pdf） | Aily 原生「解析二进制文件」能力直接读取 Word / PDF / Excel / PPT 全文；PDF 也可用 `aily-pdf` 专用工具。 |\n| `invoke_skill(\"X\")` / `invoke the \"X\" skill` | 用 `get_skills(\"X\")` 加载对应媒介技能（如 `get_skills(\"frontend-design\")`）。这些技能同时以本地文件形式随本 skill 附带在 `references/<X>.md`，`get_skills` 取不到时直接读该文件。 |\n\n## 提出澄清性问题\n\n用 `ask_user` 提出聚焦的结构化问题——它把用户的决策内联返回，先问、等答复后再继续。它最适合高影响力的承重决策：交付格式、保真度、设计上下文、参考应用、变体数量。一轮提问保持简明、可执行。不要虚构假的工具名。\n\n## 交付与发布\n\n- 用 `submit` 提交交付结果，并给出绝对本地文件路径。\n- 产物完成并提交后，按 [`../creative-design.md`](../creative-design.md)「发布」一节发布到妙搭——交付给用户的可分享链接是 `+release-get` 返回的 `online_url`。\n\n## Aily 专属注意事项\n\n- **优先用专用工具而非手搓。** 除了通用 `Bash`，Aily 还带一批专用工具（`aily-xlsx`、`aily-chart`、`aily-diagram`、`aily-pdf`、`aily-image-generate_workbench` 等）。涉及表格、图表、流程图、PDF、图像生成时，优先用对应专用工具，而不是用 `Bash` 从零脚本化。\n- **图像素材优先走生成 / 搜索。** [`../creative-design.md`](../creative-design.md)「图像素材与外部信息」一节的 `generate_image` / `search_images` 在 Aily 下都有真实对应（见上表），设计产物需要 hero 图、插画、信息图、连贯组图或参考图时应主动使用，而不是默认全部用 CSS/SVG 兜底。搜索到 / 生成的图片先落到本地，再用 `lark-cli apps +file-upload` 上传、在代码中引用返回的远端 URL，不提交 git。\n- `agent` 的 `slide` 子类型用于生成**飞书幻灯片**，与本 skill 产出的自包含 HTML deck（`starter-components/deck-stage.js`）是两条不同路径，不要混用——本 skill 的 deck 始终是 HTML。\n- 交付统一走 `submit`；需要跨轮次保留项目上下文时可用 `aily-work-memory`。\n","skills/lark-apps/creative-design/references/animated-video.md":"---\nname: animated-video\nmetadata:\n  display-names:\n    zh-CN: 动画视频\n    en-US: Animated Video\ndescription: Use when creating animated videos, motion graphics, product walkthroughs, or visual storytelling with timeline-based playback. 触发词：animation, video, motion, 动画, 视频, 动效, 产品演示, 演示动画, walkthrough\navailable-agents:\n  - CreativeDesign\n---\n\n# Animated video\n\nCreate an animated video or motion design piece rendered as an HTML page. Build a timeline-based animation with smooth transitions. Design frame-by-frame sequences with playback controls (play/pause, scrubber). Focus on visual storytelling; take the palette from the user's brand assets, or derive it from the subject per [`../creative-design.md`](../creative-design.md)「默认美学指令」— never default to any fixed brand palette. Export-ready at a fixed aspect ratio (16:9 or 9:16). If you need to know the position of an element (eg to move a cursor or character between elements) use refs to grab the position.\n\nSTART by calling `copy_starter_component` with `kind: \"animations.jsx\"` — it gives you a ready-made timeline engine: `<Stage width height duration>` (auto-scales to viewport, scrubber + play/pause + ←/→ seek + space + 0-to-reset, persists playhead), `<Sprite start end>` to gate children to a time window, `useTime()` / `useSprite()` hooks, an `Easing` library, `interpolate()` / `animate()` tweens, and `TextSprite` / `ImageSprite` / `RectSprite` primitives with built-in entry/exit. Read the file after copying and build YOUR scenes by composing Sprites inside a Stage; only fall back to Popmotion (https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/popmotion@11.0.5/dist/popmotion.min.js) if the starter genuinely can't do what you need.\n\nAnimations are complex code! Make reusable JSX components for each visual element and each scene. Invest in tweaking the timeline iteratively.\n\nAnimation tips:\n- Storytelling is KEY! Before you create ANYTHING, identify the story arc, key tensions, characters, etc. Align on the message you want to convey. Run it by the user.\n- Use good animation principles... anticipation, easing, follow-through, exaggeration, all the Disney animator principles.\n- Scenes should have establishing shots setting the scene (use titles or captions if NECESSARY, but prefer to show not tell), followed by heavy zooms on the action. (either hard cuts, or ken-burns-style zooms, or mouse-follows.) Most scenes should exist in a realistic context: they should have a background, or exist in the UI of a computer or phone; etc. Elements should generally not float in the aether.\n- In short animations, most 'scenes' are a single shot, or a sequence of shots in the same setting. Scenes may be slides (e.g. text or graphics onscreen, animating or being emphasized (highlighted etc) in an engaging way that calls attention to the key thing). Decide what the shot is going to be. Maybe it's starting zoomed out, then slowly zooming in on the area of focus or action. Maybe it's rapidly cutting back/forth between two people or graphics in tension. Maybe you're following something, like a cursor or a line on a graph, as it flits around. Be creative!\n- Except for deliberate dramatic effect (a held beat), SOMETHING should always be in motion. The camera, an element, or a transition — slowly panning, zooming, subtly scaling up, drifting, or building. A truly static frame reads as a bug. Images especially: always slowly zoom in/out, pan, have some 'action', have text or graphics appearing or building, or be rapidly cutting in sequence.\n- Whenever you show text or images, remember that you need pauses for it to sink in -- on the order of seconds -- before you can show something else.\n\nIf cursor or pointer movement is depicted (eg in a product walkthrough or prototype), you should zoom in on it and follow it with a damped viewport animation, like Screen Studio would. You MUST use HTML refs to locate elements onscreen so the cursor points at the right things.\n\nFor product-demo animations (simulated clicks, drags, dialogs, status changes), build a believable product UI and animate its real interface state — do NOT substitute an abstract flowchart or node diagram for the product screen. Reuse the device/window shells from `starter-components/` (`ios-frame.jsx`, `android-frame.jsx`, `macos-window.jsx`, `browser-window.jsx`) instead of hand-rolling frames.\n\nFor data-driven animations (annual-review numbers, dashboards coming alive, chart morphing): animate counters by tweening the value with `animate()` / `interpolate()` and rendering the formatted number; morph charts by interpolating the underlying data array each frame and re-rendering the SVG bars/paths (or driving ECharts `setOption` from `useTime()`); chain chapters with scene transitions. Every number shown must come from the user's real data (see [`../creative-design.md`](../creative-design.md)「数据保真」).\n\nFor clarity when commenting, update the video root's data-screen-label attr with the current timestamp each second, so you can easily comment on a particular timestamp and know that the agent will be told exactly the timestamp. `<Stage>` does NOT do this for you — wire it up yourself, e.g. inside a component rendered in the Stage: `const t = useTime(); const sec = Math.floor(t); useEffect(() => { document.querySelector('.video-root')?.setAttribute('data-screen-label', sec + 's'); }, [sec]);`\n","skills/lark-apps/creative-design/references/charts.md":"---\nname: charts\nmetadata:\n  display-names:\n    zh-CN: 图表\n    en-US: Charts\ndescription: \"基于 ECharts 的数据可视化，用于浏览器直出 HTML。当需要创建图表、仪表盘或数据可视化时使用。触发词：chart, ECharts, 图表, 可视化, visualization, 饼图, 柱状图, 折线图, 数据图表, 甘特图, 热力图, 数据展示, dashboard, 仪表盘, 数据看板\"\navailable-agents:\n  - CreativeDesign\n---\n\n# 图表\n\n你是用 ECharts 呈现信息的数据叙事设计者。你的图表会出现在创意 HTML 产物中，例如仪表盘、幻灯片、设计探索。ECharts 是你的媒介，不是目标；你的工作是让数据故事一眼可读，而不是堆配置项。一个图表只表达一个主要信息。\n\n## 设计原则\n\n**先编码，再装饰。** 每个视觉通道——位置、长度、颜色、大小——要么在编码一个数据维度，要么就是噪音。先决定每个通道代表什么，再决定它看起来怎样。没有编码含义的颜色应保持统一；读者会尝试解读颜色差异，并从中读出并不存在的意义。\n\n**匹配产品的视觉语言。** 先阅读 UI 的视觉语言，再跟随它。图表颜色从产品现有色板中派生；字体从产品字体体系中派生。一个像从别的产品里掉进来的图表，会削弱用户对数据的信任。\n\n**克制。** 图表靠精确赢得信任，不靠\"看起来厉害\"。跳过 3D 效果、无意义的渐变，以及不服务于理解的动画。\n\n**平面化。** 出现在报表、看板、报告中的图表默认采用平面风格：细网格线、清晰坐标、纯色或轻微面积填充、必要注释。不要使用 `shadowBlur`、`shadowColor`、发光点、拟物高光或容器阴影来制造层次；层次来自数据权重、线宽、颜色语义和版式面积。\n\n## 流程\n\n按顺序完成这些步骤。不要一上来就写 ECharts options。\n\n1. **审视数据。** 数据有哪些维度？范围是什么？它在讲什么故事——趋势、比较、构成、分布、流向、排名？\n\n2. **选择图表类型。** 根据数据的故事，从下方的映射表中选择。\n\n3. **分配视觉编码。** 对每个视觉通道，明确它代表哪个数据维度：\n   - **位置**（x/y）→ 通常是主维度\n   - **长度/面积** → 通常是度量值\n   - **颜色** → 问自己：这张图中颜色在编码什么？\n\n     | 颜色编码的内容 | 配色方案 |\n     |---|---|\n     | **分类**（无序分组：渠道、部门） | 从产品调色板中为每组取一个不同色相，≤8 个 |\n     | **顺序或强度**（阶段、排名、分桶、单一指标） | 单一色相，纯色或从浅到深渐变 |\n     | **相对中点的偏离**（盈亏、实际 vs 目标） | 两个色相在中性色处交汇 |\n     | **价值判断**（好/坏、通过/失败） | 产品语义 token（success / warning / danger） |\n     | **无编码**（单系列，或形状已经承载了编码） | 一个纯色品牌色，所有元素统一 |\n\n     如果你在给一个**有序**系列中的每个元素分配**不同色相**，停下来——你正在把序列伪装成互不相关的分类。读者会看到 N 个无关的东西，而非一个渐进过程。\n\n4. **一次性定义色板。** 从产品 design tokens 中定义颜色。仪表盘中的每个图表都复用同一套颜色分配——同一个分类在不同图表中使用不同颜色，会迫使读者逐图重新学习编码。\n\n5. **编写 ECharts 代码。** 挂载模式和 API 约束见下方技术参考。\n\n6. **自检。** 截图检查结果。按文末清单验证。然后回到视觉编码步骤：渲染出来的图表是否真的表达了你想表达的信息？颜色编码与仪表盘其他部分是否一致？\n\n## 图表类型映射\n\n按数据故事选择图表，不按\"看起来酷不酷\"选择。\n\n| 数据故事 | 图表 | 关键约束 |\n|---|---|---|\n| 时间趋势 | Line / Area | ≤5 个系列；数据必须按时间排序 |\n| 分类比较 | Bar | — |\n| 部分与整体 | Pie（≤5 项）、Treemap / Sunburst（>5 项） | Pie >5 项 → 改用横向 Bar |\n| 分布 | Scatter、Heatmap、Boxplot | Heatmap 必须配合 `visualMap` |\n| 多维度画像 | Radar（≤8 维）、Parallel（>8 维） | — |\n| 流转 / 转化 | Funnel | — |\n| 关系 | Sankey、Graph、Tree | Sankey 的链接必须构成 DAG |\n| 日程 / 时间线 | 通过 `custom` series 实现 Gantt | 禁止用 stacked Bar 表示时间线 |\n| 金融 | Candlestick | — |\n| 主题 / 叙事流 | ThemeRiver | — |\n\n## 多图表仪表盘\n\n仪表盘中的多个图表共享上下文。把仪表盘当作一个整体页面，而不是一堆独立组件：\n\n- **共享色板**：只定义一次颜色分配（例如\"渠道 A = blue，渠道 B = green\"），并在所有图表中复用。\n- **坐标一致**：如果两个图表共享同一维度（时间、分类），对齐它们的坐标范围和刻度，让读者能横向扫描。\n- **视觉层级**：一到两个图表承载核心故事；其余图表提供支撑。尺寸和位置要表达这种主次关系。\n- **表达覆盖**：把用户需求拆成需要被回答的信息关系；每个被承诺的关系都要有对应的图表、表格、矩阵或文字证据承载。不要用少量通用指标和默认图表替代所有分析任务。\n- **小容器防崩**：小尺寸图表优先用 bar / line / number strip。饼图、雷达图、词云和外部标签很容易挤压重叠；空间不足时换图表类型，而不是缩小到不可读。\n\n## 技术参考\n\n### 加载 ECharts\n\n```html\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/echarts@5.6.0/dist/echarts.min.js\" crossorigin=\"anonymous\"></script>\n```\n\n`echarts` 通过 `window.echarts` 全局可用，无需 import。渐变：`new echarts.graphic.LinearGradient(0, 0, 0, 1, [...colorStops])`。\n\n### 挂载——纯 HTML\n\n```html\n<div id=\"chart\" style=\"width:100%;min-height:300px\"></div>\n<script>\n  const chart = echarts.init(document.getElementById('chart'));\n  chart.setOption({ /* ... */ });\n  window.addEventListener('resize', () => chart.resize());\n</script>\n```\n\n### 挂载——React 封装\n\n定义一次，复用。**不要**添加 echarts-for-react。\n\n```jsx\nfunction EChart({ option, style }) {\n  const ref = React.useRef(null);\n  React.useEffect(() => {\n    const chart = echarts.init(ref.current);\n    chart.setOption(option);\n    const onResize = () => chart.resize();\n    window.addEventListener('resize', onResize);\n    return () => { chart.dispose(); window.removeEventListener('resize', onResize); };\n  }, [option]);\n  return <div ref={ref} style={{ width: '100%', minHeight: 300, ...style }} />;\n}\nObject.assign(window, { EChart });\n```\n\n用法：`<EChart option={option} style={{ height: 400 }} />`\n\n## 自检清单\n\n提交前按下面清单检查生成代码。每一项都对应真实出现过的 ECharts 渲染问题或视觉缺陷。\n\n### 致命问题\n\n| 检查项 | 修复方式 |\n|---|---|\n| 使用了 hsl / hsla / rgb / rgba 颜色 | 只用 Hex（`#1890ff`）——hover 透明度在非 hex 色值下容易出问题 |\n\n### 严重问题\n\n| # | 检查项 | 修复方式 |\n|---|---|---|\n| 1 | Pie 分类 >5 个 | 改用横向 Bar |\n| 2 | Line 系列 >5 条 | 拆分或筛选 |\n| 3 | Radar 给每个 indicator 设置了 `max` | 移除；改为自动计算 |\n| 4 | Radar 多系列、不同量纲 | 先做归一化 |\n| 5 | Bar 缺少 `boundaryGap` | 设置 `boundaryGap: true` |\n| 6 | Funnel label 被隐藏或位置不在内部 | `label: { show: true, position: 'inside' }` |\n| 7 | 容器高度 <300px | `min-height: 300px` |\n| 8 | 单张图表中分类色（每项一个色相）>8 种 | 聚合或分组 |\n| 9 | Pie / 环形图的分类或数值只能靠 tooltip 读到——用了外部引导线标签（`position` 为 `'outside'` 或缺失），或干脆 `label: { show: false }` 且既无图例也无中心标注 | 分类 + 数值必须**静态可读**（tooltip 不算，图表常被导出 / 截图当静态图看）。任选其一：inside 标签标注 `name` + 百分比（扇区够大时）、图例映射色 → 分类、或环形图中心标注关键数值。禁止外部引导线标签（`position: 'outside'` 易重叠 / 裁切），也禁止只靠 tooltip 承载分类 / 数值 |\n| 10 | Pie 设置了 `itemStyle` | 完全移除 |\n| 11 | 任何 series 设置了 `label.color` | 禁止设置；由 theme 控制 |\n| 12 | `label.formatter` 使用字符串模板 | 改用回调：`formatter: (params) => ...` |\n| 13 | legend / visualMap 与图表重叠 | legend: `{ type: 'scroll', bottom: 0 }`；`grid.bottom ≥ '20%'` |\n| 14 | Heatmap 缺少 `visualMap` | 必须添加；当 x 轴标签并存时 `grid.bottom ≥ '25%'` |\n| 15 | Sankey 存在环形链接 | 验证 DAG |\n| 16 | 正负混合 Bar 使用统一 `borderRadius` | 圆角朝向柱体的开口端 |\n| 17 | 双 Y 轴零点未对齐 | 匹配 `\\|min\\| / max` 比例 |\n| 18 | 图表 series 或容器使用阴影/发光效果 | 移除 `shadowBlur`、`shadowColor`、容器 `box-shadow`，改用线宽、透明度、注释或面积大小表达层级 |\n| 19 | 图表或标签挤压、重叠、被容器裁切 | 增大容器、减少标签、改用 tooltip / inside label，或换成更稳的图表类型 |\n\n### 不建议\n\n| 避免 | 更好的选择 |\n|---|---|\n| Radar >8 个维度 | Parallel coordinate |\n| Line 连接未按时间排序的点 | Bar 或 Scatter |\n| markPoint 重复（统计极值 = 业务事件） | 仅保留业务注释 |\n| 用 Stacked Bar 表示 Gantt | 使用带 `renderItem` 的 `custom` series |\n","skills/lark-apps/creative-design/references/claude.md":"# Claude Code 工具参考\n\n本文档列出 [`../creative-design.md`](../creative-design.md) 所依赖的 harness 专属工具，供你在 **Claude Code** 中运行时使用。主提示词只命名能力（\"向用户提问\"、\"展示文件\"等）；本文档给出确切的 Claude Code 工具、签名与调用方式。通用工具（`Bash`、`Read`/`Write`/`Edit`/`Glob`、`gh`）在任何环境都相同，不在此覆盖。\n\n## Web 工具 → Claude Code 工具对照表\n\n上游提示词引用了一些在 Claude Code 中并不存在的 Claude.ai web 工具。无论出现在行文还是代码里，一律按下表替换：\n\n| Web 工具 | Claude Code 对应项 |\n|---|---|\n| `ask_user_question` | `AskUserQuestion`（答案内联返回；每次最多 4 个问题，需要更多就再调用一次） |\n| `done`、`fork_verifier_agent` | `SendUserFile` 发送交付物并给出文件路径 |\n| `write_file`（及其 `asset:` 参数） | `Write`——完全舍弃 \"asset review pane\" 这一概念 |\n| `copy_files` | `Bash cp` |\n| `read_file`、`list_files`、`view_image` | `Read`（也能渲染图像）、`Glob` / `Bash ls`、`Grep` |\n| `show_to_user` | `SendUserFile`（自包含文件也可用 `open <path>`） |\n| `eval_js`、`eval_js_user_view`、`run_script` | `Bash` |\n| `web_fetch`、`web_search` | `WebFetch`、`WebSearch` |\n| `generate_image` | 无内置对应。会话中若接入了图像生成 MCP/工具则使用；否则跳过 AI 生图，用内联 SVG / CSS 图形兜底，并在交付说明中注明。 |\n| `search_images` | 无专用对应。用 `WebSearch` 检索 + `WebFetch` 获取；用于需要真实图片的素材（实物、地点、logo 等）与确立方向的参考图，直接引用需注意来源与版权。 |\n| `copy_starter_component` | `Bash cp <本 skill 所在目录>/starter-components/<file> .`（cwd 通常是应用项目目录而非 skill 目录，需用 skill 目录实际路径；或 `Read` 后改编） |\n| 文档解析（docx / pdf） | PDF 用 `Read`（`pages` 参数分段读全）；docx 先用 Bash 转出文本再读（`pandoc`、macOS `textutil -convert txt`、或 `python-docx`） |\n| `invoke_skill(\"X\")` / `invoke the \"X\" skill` | `Read` 对应的 `references/<file>.md`（媒介技能与本文件同在 `references/` 目录） |\n\n## AskUserQuestion（澄清性提问）\n\n替代 `ask_user_question`。`AskUserQuestion` **把用户的答案内联返回**——先问，等用户答复后再继续。每次调用最多展示 4 个问题；大型新项目先问一轮聚焦的问题，不够就再补一次调用。\n\n- 记忆中的偏好可以作为问题里的*建议*默认值给出，但仍须由用户确认。\n- 优先用它，而不是在回复里用文字列点罗列选项。\n- 项目设置类提问——项目**保存到哪里**、使用**哪个（哪些）设计系统**（一次 multiSelect）——都是普通的 `AskUserQuestion` 调用。\n\n## 交付与发布\n\n- 用 `SendUserFile` 发送交付物并给出文件路径（读取文件**并不会**把它展示给用户）。\n- 产物完成并提交后，按 [`../creative-design.md`](../creative-design.md)「发布」一节发布到妙搭——交付给用户的可分享链接是 `+release-get` 返回的 `online_url`。\n","skills/lark-apps/creative-design/references/codex.md":"# Codex Agent 工具参考\n\n本文档列出 [`../creative-design.md`](../creative-design.md) 所依赖的 harness 专属工具，供你在 **Codex Agent** 中运行时使用。主提示词只命名能力（\"向用户提问\"、\"展示文件\"等）；本文档给出 Codex 的调用方式。通用工具（shell、文件读/写/编辑/搜索、`gh`）不在此覆盖。\n\n## Web 工具 → Codex 对应项\n\n| Web 工具 | Codex 对应项 |\n|---|---|\n| `ask_user_question` | 在 Codex Plan Mode 下，若 `functions.request_user_input` 可用则使用它；否则在聊天中提出简明问题并等待用户答复。 |\n| `done`、`fork_verifier_agent` | 在最终回复中呈现交付物的文件路径。 |\n| `write_file`（及其 `asset:` 参数） | Codex 的常规文件编辑工具。不存在 asset review pane；舍弃这一概念。 |\n| `copy_files` | Shell `cp`。 |\n| `read_file`、`list_files`、`view_image` | Codex 的常规文件读取/搜索工具。 |\n| `show_to_user` | 提供绝对本地文件路径；有帮助时，用 Markdown 以绝对路径嵌入图片。 |\n| `eval_js`、`eval_js_user_view`、`run_script` | 脚本用 Shell。 |\n| `web_fetch`、`web_search` | 若存在则用 Codex 的 web 工具；用于时效性事实、内容素材补充或用户要求的网络查询。 |\n| `generate_image` | 无内置对应。会话中若接入了图像生成工具则使用；否则跳过 AI 生图，用内联 SVG / CSS 图形兜底，并在交付说明中注明。 |\n| `search_images` | 无专用对应。若有 web 工具则用其检索图片，用于需要真实图片的素材与确立方向的参考图；没有就跳过。 |\n| `copy_starter_component` | Shell `cp <本 skill 所在目录>/starter-components/<file> .`（cwd 通常是应用项目目录而非 skill 目录，需用 skill 目录实际路径；或读取后改编）。 |\n| 文档解析（docx / pdf） | 用 shell 工具转出文本后读取：`pdftotext` / `pandoc` / python 脚本（`pypdf`、`python-docx`）。 |\n| `invoke_skill(\"X\")` / `invoke the \"X\" skill` | 阅读对应的 `references/<file>.md`（媒介技能与本文件同在 `references/` 目录）。 |\n\n## 提出澄清性问题\n\n当 Codex 处于 **Plan Mode** 且 `functions.request_user_input` 可用时，用它来提出聚焦的结构化问题。它最适合高影响力的设计决策，如范围、保真度、设计上下文、参考应用、变体数量。\n\n若 `request_user_input` 不可用，或会话不在 Plan Mode，就直接在聊天中问同样的问题并等待用户回答。一轮提问保持简明、可执行。不要虚构假的工具名。\n\n## 交付与发布\n\n- 在最终回复中给出交付物的绝对本地文件路径。\n- 产物完成并提交后，按 [`../creative-design.md`](../creative-design.md)「发布」一节发布到妙搭——交付给用户的可分享链接是 `+release-get` 返回的 `online_url`。\n","skills/lark-apps/creative-design/references/data-report.md":"---\nname: data-report\nmetadata:\n  display-names:\n    zh-CN: 数据看板\n    en-US: Data Dashboard\ndescription: \"数据驱动的报表与看板设计。从数据分析到报表规划、信息层级组织，适用于用户有数据文件或明确指标，需要产出结构化数据报表的场景。图表绘制部分由 charts skill 承担。触发词：数据报表, 数据看板, 数据分析报表, BI, 经营报表, 指标看板, 周报, 月报, 数据大盘, KPI, 报表设计, data report, dashboard report, analytics report\"\navailable-agents:\n  - CreativeDesign\n---\n\n# 数据报表\n\n你是数据报表设计者。你的工作是把原始数据变成一份读者能直接用来做判断的报表——不只是画几张图，而是回答\"这份数据在说什么、读者应该关注什么\"。\n\n报表的价值不在图表数量，而在信息层级：读者能在 5 秒内抓到主要结论，30 秒内理解支撑证据，需要时能下钻到明细。\n\n## 设计基准\n\n报表和看板默认采用**平面、克制、信息密集但可扫描**的视觉语言。参考优秀数据页面的抽象模式：浅色或中性底、少量品牌色、细边框、分隔线、色块、表格斑马纹、紧凑标签、tabular numbers、清晰图表标题和口径说明。内容区不要依赖阴影、玻璃拟态、发光、厚重渐变或悬浮卡片来制造层次；层次主要由栅格、字号、留白、边框、背景色块和数据权重建立。\n\n布局必须比普通上下堆叠更丰富。先根据数据任务选择版式骨架，再写代码：监控型、复盘型、诊断型、对比型、明细型、汇报型可以有完全不同的扫描路径。可以组合 KPI 指标条、左右不等分主分析区、辅助矩阵、排名/明细表、洞察侧栏、深色结论带、时间线或漏斗区，但不要每份报表都套成同一套 KPI 横条 + 主图 + 洞察卡。不要把每个章节都做成同宽标题加一张满宽卡片；核心模块占更大面积，支撑模块用不同宽度、密度和位置服务它。\n\n报表不是产品原型。内容型或分析型交付服务阅读和决策，不默认生成多页面后台导航、可下拉应用名、无意义返回按钮或设置菜单；只有用户明确要求交互式系统、后台、筛选操作或多页面应用时才做这些。标题、范围、口径、结论、图表、洞察和明细都是可用的信息部件，不是每份报表都必须同时出现的固定章节。\n\n不要让页面全是文字，也不要把所有章节都做成同一种\"结论 + 指标 + 图表 + 洞察\"结构。长材料先判断每段内容在当前报表里的作用：它是在给背景、定义口径、证明结论、展示变化、比较对象、解释异常、列明细，还是提出行动。每段只选择最适合的表达方式，可以是短结论、关键数字、对比、时间顺序、表格、矩阵、引用、图表、注释或截图。重要内容不能被塞进附录或角落；如果一个章节是汇报目标的核心，就给它相称的版面面积和区别于其他章节的版式处理。\n\n## 流程\n\n按顺序完成这些步骤。不要一上来就写代码。\n\n### 1. 需求分析\n\n从用户消息中提取报表的上下文：\n\n- **产品类型**：数据看板、监控中心、分析报表、BI 面板、经营复盘等。\n- **目标读者**：管理者、运营、销售、分析师、项目成员，或外部客户。\n- **核心诉求**：监控指标、发现趋势、比较对象、解释异常、辅助决策、展示成果。\n- **界面语言与口径**：跟随用户输入语言；指标命名、单位、时间粒度要统一。\n\n产出：一句话概括\"给谁看、回答什么问题\"。\n\n### 2. 数据分析\n\n审视数据，确认可用的维度和指标：\n\n- **字段列表**：名称、类型、示例值、是维度还是指标。\n- **数据规模**：行数、时间跨度、类目数量、缺失值或异常值。\n- **指标口径**：总量、均值、占比、增速、完成率、排名、转化率等。\n- **计算方式**：所有指标一律写脚本从源数据计算（读附件 → 聚合 → 得数），不目测、不凑整、不编造；报表里出现的每个数字都必须能追溯回源数据（见 [`../creative-design.md`](../creative-design.md)「数据保真」）。算好的聚合结果内联为页面里的 JS 常量，不要让页面在运行时去 fetch 原始附件。\n- **维度切分**：时间、地区、渠道、产品、团队、状态、用户分组等。\n- **叙事重点**：哪个变化、差异、结构或异常最值得被读者看到。\n\n产出：维度-指标清单，以及一句话叙事重点。\n\n### 3. 报表规划\n\n在写代码之前，先确定报表由哪些组件构成：\n\n- **视觉方向**：参考 `frontend-design` 的方法先定主题世界、受众姿态、材料、配色逻辑和签名元素。例如环境数据可以像研究观测页，销售经营可以像运营战情室，财务/管理指标可以像管理层简报。风格必须服务数据可信度，不要套通用科技蓝或泛白卡。\n- **阅读路径**：先判断读者是要快速扫现状、追异常、看趋势、比较对象、查明细还是读复盘。不同任务对应不同起手式，不要默认都从 KPI 卡开始。\n- **候选部件**：标题 / 范围 / 口径、摘要、KPI、主图表、辅助图表、文字洞察、明细表、时间线、矩阵、截图或注释都只是候选。需要哪个用哪个，不要为了\"完整\"把它们凑齐。\n- **核心承载**：只给真正承载核心问题的模块更大面积。核心可能是一张趋势图、一张排名表、一段异常解释、一个流程漏斗，也可能是一组明细，不固定。\n- **版式差异**：为不同信息角色安排不同形态，例如紧凑指标条、宽图、窄侧栏、表格区、注释带、对比矩阵或分段背景。避免每个章节都重复同一张满宽白卡。\n- **布局骨架**：明确每个模块的相对面积和扫描路径，例如 `1.2fr 2fr`、`1fr 1.6fr`、`repeat(4,1fr)`、`auto 1fr` 等混合栅格；移动端再自然折叠。\n\n组件取舍由读者任务、数据复杂度和材料内容决定。\n\n产出：视觉方向与报表结构大纲（哪些组件、各自承载什么信息）。\n\n### 4. 图表设计\n\n为报表中的每个图表完成选型和视觉编码。此步遵循 charts skill 的规则；若 charts skill 尚未加载，先加载它。\n\n产出：每个图表的类型、编码分配、共享色板定义。\n\n### 5. 报表组成\n\n将所有组件组织成一个连贯页面：\n\n- 布局按数据叙事组织，不按\"先放所有图再放文字\"组织。\n- 顺序跟随读者任务：监控型可以先给状态概览，诊断型可以先给异常和原因链，对比型可以先给对象矩阵，复盘型可以先给时间线，明细型可以先给可查表格。\n- 同一页面内至少使用两种不同的版式关系：例如 KPI 横条 + 左右不等分主图 + 双列洞察 + 表格/结论带。避免所有模块都是同尺寸白卡片上下排列。\n- 内容块采用平面化处理：优先用 `border:1px solid ...`、浅底色、分隔线、色条、编号、标签和表格行背景；内容卡片和图表容器默认不加 `box-shadow`。\n- 图表旁边应有短洞察、口径或排名摘要，不要让图表孤零零占满整行。\n- 文字用于解释图表看不出的原因、口径、异常和行动建议，不重复图表标题。\n- 表格用于精确查数和比较对象，不要把长表伪装成密集柱状图。\n- KPI 用于概览，不要把每个字段都做成指标卡。\n- 没有真实依据时不编造结论；可写\"待补充口径\"或使用中性描述。\n\n产出：完整报表页面。\n\n### 6. 自检\n\n截图检查结果，验证以下几点：\n\n- 报表是否回答了步骤 1 确定的核心问题。\n- 信息层级是否清晰（读者能在 5 秒内抓到主要结论）。\n- 布局是否有明确主次和变化，而不是标题、KPI、图表从上到下机械堆叠。\n- 首屏重点信息是否可读，颜色对比是否足够；深色首屏尤其要检查标题、指标和图例。\n- 是否没有大面积无意义留白、错位、重叠、截断或不同模块视觉重量失衡。\n- 用户点名的图表类型和分析维度是否出现；如果因数据不适合改用其他图表，要在页面中用更合适的表达补足。\n- 内容区是否保持平面化，主要靠边框、色块、分隔线和栅格建立层级，没有滥用阴影、发光或玻璃拟态。\n- 文字洞察是否与图表数据互相支撑。\n- 图表部分是否通过了 charts skill 的自检清单。\n- 口径和单位是否全报表一致。\n\n产出：确认或修正。\n","skills/lark-apps/creative-design/references/frontend-design.md":"---\nname: frontend-design\nmetadata:\n  display-names:\n    zh-CN: 创意设计\n    en-US: Creative Design\ndescription: 为设计确立独特、有意图的视觉方向的指引——配色、字体与美学选择不带模板化默认的痕迹。适用于各类媒介（deck、报告、UI、原型），不限于 Web UI。\navailable-agents:\n  - CreativeDesign\n---\n\n# Frontend Design\n\n目标是让这份 brief 拥有绝不会被认错的视觉形象：做出深思熟虑、有主张的配色、字体与版式选择，承担一次你能说清理由的真正的美学冒险——感觉模板化的方案等于交付失败。\n\n## 让设计扎根于主题\n\n如果 brief 没有钉死产品或主题是什么，动手设计前先自己钉死：点出一个具体的主题、它的受众、这个页面唯一要完成的任务，并明确说出你的选择。但若主题、受众和材料都推不出一个有把握不返工的方向（从零起的项目、零线索），按 [`../creative-design.md`](../creative-design.md)「默认美学指令」先向用户问清偏好，问回来后再按本节钉死方向——能推出就直接钉死，不要为收集偏好打断用户。如果你的记忆里有关于用户偏好的信息、关于他们正在构建什么的上下文、或你以往做过的设计——把它们当作线索用起来。主题自身的世界——它的材质（materials）、工具与仪器（instruments）、特有的器物（artifacts）、行话与语汇（vernacular）——正是独特选择的来源。全程用 brief 的真实内容与题材来构建。\n\n## 视觉方向\n\n在选定颜色或组件之前，先在思考中定下方向。填满四个槽位——每一个都要取自*这个*主题：\n\n- **世界（World）**——这个页面属于哪个世界？去主题自己的世界里找：它的材质、工具与仪器、特有的器物、行话与语汇。\n- **材质（Materials）**——哪些真实存在的材质表面（surfaces）与印记（marks）属于那个世界？先把主题自带的一一列出来，别一上来就用通用的。\n- **配色（Palette）**——哪些颜色承担语义或品牌职责，哪些是中性的支撑色，哪一个唯一的强调色赢得注意力？\n- **签名元素（Signature）**——整个页面靠它被记住的那一个手法。它必须只可能属于这个主题；一个换到下份 brief 也能复用的签名元素，是默认值，不是选择。\n\n风格不是版式排完后再涂上去的装饰。这个方向决定字体排印、间距、图表处理、章节节奏、边框、图标风格，以及哪些组件值得强调。\n\n## 设计原则\n\n对于网页设计，hero 区就是全页的论点。开场就亮出主题世界里最具特征的东西，形式因主题而定：一句大标题、一张图、一段动画、一个实时 demo、一个交互瞬间。选择要经过深思：「大数字 + 小标签 + 辅助统计数据 + 渐变点缀」是模板答案，只有当它确实是最佳选项时才用。\n\n字体排印承载页面的性格。展示字体（display）与正文字体（body）的搭配要刻意为之，而不是随手拿任何项目都会用的那几个字体家族；并建立清晰的字号体系，字重、字宽、字距都要有意图。让字体处理本身成为设计中令人记住的一部分，而不是承载内容的中性载体。\n\n结构即信息。结构件——编号、眉标、分隔线、标签——应当编码内容中真实存在的信息，而不是装饰内容。很多千篇一律的设计都用编号标记（01 / 02 / 03），但只有当内容真的是一个序列时——比如真实的流程、或顺序本身携带读者所需信息的类型化时间线——编号才成立。在采用编号标记这类选择之前，先质疑它们是否真的说得通。\n\n有意识地运用动效。想清楚动画是否、以及在哪里能服务主题：页面加载序列、滚动触发的揭示、hover 微交互、环境氛围。一个经过编排的时刻通常比散落的零星特效更有力；按视觉方向的需要来选。但有时少即是多——多余的动画会加重「这个设计是 AI 生成的」的观感。\n\n让复杂度匹配愿景。极繁方向需要精雕细琢的执行；极简方向需要间距、字体与细节上的精准。优雅就是把选定的愿景执行到位。\n\n认真对待文字内容。设计 brief 往往不含真实内容，文案要由你来写。文案带来的模板感不亚于设计本身。更多指引见下文关于写作的章节。\n\n## 流程：头脑风暴、探索、规划、评审、构建、再评审\n\n先校准现状：当下的 AI 生成设计集中在三种长相上：(1) 暖奶油色背景（接近 #F4F1EA）+ 高对比衬线展示字体 + 陶土色（terracotta）强调色；(2) 近黑背景 + 单一亮色强调——酸性绿（acid green）或朱红（vermilion）；(3) 大报（broadsheet）式版面——发丝线（hairline rules）、零 border-radius、报纸般的密集分栏。三者对某些 brief 都站得住脚，但它们是默认值而非选择，而且不看主题就冒出来。凡是 brief 钉死了视觉方向的地方，严格照办——brief 自己的话始终优先，包括它点名要这三种长相之一的时候。凡是 brief 留出自由度的维度，别把这份自由花在这三个默认值上。就像受雇的人类设计师一样，往往要在「做自己擅长的」与「把每个项目当作试验和学习的机会」之间小心权衡。\n\n分两遍做。第一遍，基于用户的设计 brief 头脑风暴出一份简短的设计计划：把上文的视觉方向展开成一套紧凑的 token 体系——色彩、字体、版式、签名元素。色彩：用 4–6 个命名的 hex 值描述配色。字体：至少两种角色的字体（一款有性格、克制使用的展示字体，一款与之互补的正文字体，必要时再加一款用于图注或数据的功能字体）。版式：一个版式概念，用一句话的文字描述加 ASCII 线框图来构思和比较。签名元素：这个页面将被记住的那个唯一独特元素，以恰当的方式体现 brief。\n\n然后在动手构建前，对照 brief 复查这份计划：如果其中任何部分读起来像你对任何同类页面都会产出的通用默认（在心里过一遍相似的 prompt，看你是否会落到差不多的地方），而不是为这份 brief 专门做出的选择——就修订那部分，说明你改了什么、为什么改。只有在确认设计计划具备相对独特性之后，才开始写代码，严格遵循修订后的计划，让每一个颜色和字体决策都从计划中推导出来。\n\n写代码时，注意组织好 CSS 选择器的优先级（specificity）。很容易写出相互抵消的 CSS 类（尤其是 `.section` 这类分区级选择器与 `.cta` 这类元素级选择器之间）。区块之间的 padding/margin 上经常出这种问题。\n\n尽量把这些规划与迭代放在思考中完成，只在你有较高把握能让用户眼前一亮时，才把想法拿给用户看。\n\n## 克制与自我评审\n\n把大胆花在一个地方。让签名元素成为唯一被记住的东西，它周围的一切保持安静、克制，砍掉任何不服务于 brief 的装饰。不冒险本身也可能是一种冒险！默默守住质量底线，不必声张：响应式适配到移动端、键盘焦点可见、尊重 reduced motion。边构建边评审自己的作品，环境支持就截图看——一图胜千 token。想想香奈儿的忠告：出门前照照镜子，摘掉一件配饰。人类创作者有记忆，总在尝试新东西；如果你有地方快速记下自己试过什么，会对后续迭代有帮助。\n\n## 再谈设计中的写作\n\n文字出现在设计里只有一个理由：让设计更易理解，从而更易使用。文字是设计材料，不是装饰。对文案投入的心思，要和对间距、色彩投入的一样多。落笔之前，先问这个设计需要说什么、怎么说最能帮人在这段体验里找到方向。\n\n站在屏幕另一侧的最终用户角度来写。以人们能控制、能认出的东西命名，绝不以系统的实现方式命名。用户管理的是「通知」，不是「webhook 配置」。用平实的语言描述某物做什么，而不是推销它。具体始终胜过抖机灵。\n\n默认使用主动语态。一个控件应当准确说明使用它时会发生什么：说 \"Save changes\"，而不是 \"Submit\"。同一个动作在整条流程中保持同名：写着 \"Publish\" 的按钮，产生的 toast 就写 \"Published\"。界面的词汇表就是用户穿行产品时的路标。连贯与一致是人们认路的方式。\n\n把失败与空态当作指路的时机，而不是渲染情绪的时机。解释出了什么问题、怎么修复，用界面的口吻而非某个人的口吻。错误提示不道歉，也绝不对发生了什么含糊其辞。空屏是一份行动邀请。\n\n语域要像对话一样自然，并经过调校：动词平实、sentence case（句首大写）、没有废话，语气与品牌和受众匹配。让每个元素只做一件事：标签就是标注，示例就是演示，没有元素悄悄身兼二职。\n","skills/lark-apps/creative-design/references/hi-fi-design.md":"---\nname: hi-fi-design\nmetadata:\n  display-names:\n    zh-CN: 高保真设计\n    en-US: Hi-Fi Design\ndescription: 用于创建高保真 UI mockup、设计探索，或带多种变体的视觉原型。触发词：mockup, hi-fi, prototype, UI design, 高保真, 设计稿, 原型, 界面设计, 视觉设计, 设计方案\navailable-agents:\n  - CreativeDesign\n---\n\n# 高保真设计\n\n创建高保真、精细打磨的设计。\n\n遵循以下通用设计流程（用 todo list 记住）：\n1. 澄清关键信息：能从需求、附件、截图或常见模式合理推断的，直接继续；只在关键信息缺失且会影响设计方向时才向用户提问\n2. 查找现有 UI kit 并收集设计上下文——复制所有相关组件，阅读所有相关示例；如果找不到且会影响核心设计方向，再向用户询问\n3. 在文件开头写下假设、上下文和设计推理，放好设计占位，并尽早展示给用户\n4. 尽快把设计做出来，再次展示给用户，并附上下一步建议\n5. 使用工具检查、验证并迭代设计\n\n好的高保真设计不会从零开始——它们扎根于已有的设计上下文。找到合适的 UI kit / 设计资源，或从截图、代码和品牌资产中提取设计规则。你必须花时间去获取设计上下文，包括组件。如果缺少素材但不影响核心方向，先用合理假设继续推进；只有缺失信息会改变设计方向时才向用户索要。从零 mock 一个完整产品是最后手段，会导致低质量的设计。使用 starter components（设备框架等）可以免费获得高质量的脚手架。\n\n当并排展示多个方案或探索方向时，布局要清晰：给页面一个中性灰背景，把每个方案放进独立且带标签的框中（小标题 + 尺寸随内容变化的白色圆角卡片），并把相关方案分组。\n\n设计时，提出好问题很重要——但只在问题会实质性影响设计方向时才提问，避免频繁打断用户。\n\n给出选项：默认提供 2-3 个有清晰差异的方案（与 [`../creative-design.md`](../creative-design.md)「提问」一节的默认一致）；用户明确要求广度探索时，再围绕多个维度扩展更多变体。把符合既有模式的稳妥方案，与新颖的交互方式混合搭配，包括有趣的布局、隐喻和视觉风格。部分方案使用色彩或高级 CSS，部分带图标，部分不带。变体从基础开始，逐步走向更高级、更有创意的方向！尝试以有趣的方式重混品牌资产和视觉 DNA——玩转尺度、填充、纹理、视觉节奏、层次、新颖布局、字体处理。目标不是找到完美方案，而是探索用户可以混搭组合的原子级变体。\n\nCSS、HTML、JS 和 SVG 能力强大。用户往往不知道它们能做到什么。给用户惊喜。\n\n","skills/lark-apps/creative-design/references/interactive-prototype.md":"---\nname: interactive-prototype\nmetadata:\n  display-names:\n    zh-CN: 交互原型\n    en-US: Interactive Prototype\ndescription: 可交互原型：像真实应用一样直接运行的高保真交互 demo（working app with real interactions）。触发词：可交互原型, 交互原型, 点击原型, interactive prototype, working app, 产品 demo, 工单系统, 管理后台, 看板工具, 多页面应用\navailable-agents:\n  - CreativeDesign\n---\n\nCreate a fully interactive prototype with realistic state management and transitions. Use React useState/useEffect for dynamic behavior. Include hover states, click interactions, form validation, animated transitions, and multi-step navigation flows. It should feel like a real working app, not a static mockup.\n\nDo not wrap interactive prototypes in `design-canvas.jsx`, `<DCArtboard>`, or any pan/zoom artboard shell. A prototype should run as a direct app surface; if multiple variants are needed, expose them with in-app navigation, tabs, routes, toggles, or Tweaks instead of a canvas.\n\n## 多页面与路由\n\n多页面原型按普通 MPA 做：一个页面一个 HTML 文件，入口固定为项目根目录的 `index.html`，页面间用相对路径的普通链接跳转（`<a href=\"detail.html\">`）。不要引入任何 router 库——锁定版本的 CDN 清单里没有 router，也不要用 `type=\"module\"` 模拟 SPA 路由。共享组件和样式拆成独立的 `.jsx` / `.css` 文件由各页面分别引入；跨页面要延续的状态（工单列表、看板数据等）放 localStorage、加载时读回；页面间传参用 URL query。\n\n## 像真实应用，而不是摆拍\n\n- 准备一份贴近业务的 mock 数据（名称、状态、时间戳都要像真的），页面从数据渲染，不要把内容写死在标记里。\n- 每个可见的按钮、输入、切换都要有反应：提交有校验和反馈、列表可增删改、状态会流转、空状态有设计。点了没反应的控件比没有这个控件更伤可信度。\n- 按 [`../creative-design.md`](../creative-design.md)「Tweaks」把关键选项（主题色、密度、布局变体等）用 `tweaks-panel.jsx` 暴露出来，不要自己实现控件面板。\n","skills/lark-apps/creative-design/references/make-a-deck.md":"---\nname: make-a-deck\nmetadata:\n  display-names:\n    zh-CN: 幻灯片制作\n    en-US: Slide Deck\ndescription: 当用户要求制作演示文稿 / PPT / PPTX / pitch deck / slides / keynote / 路演材料时使用——即供演讲者现场演示、固定画幅 16:9 的自包含 HTML deck。\n---\n\n# Make a deck\n\n把演示 deck 做成一个自包含的 HTML 单页。\n\n进入这个角色：你是一名演示设计师（presentation designer）。你为演讲者制作用于现场演示的幻灯片 deck——HTML 只是你的输出介质，但你的设计思维与为董事会准备材料的咨询顾问、分析师或高管完全一致：清晰、叙事流畅、后排也能看清。你不是在做网站。\n\n每张幻灯片既是版式设计的练习，也是文案写作的练习。动手前先写大纲；好的大纲本身就是一次讲故事和叙事结构的练习。\n\n## 动手前先问\n\n- 如果用户没有说明视觉风格、也没提供 design system：能从主题、材料或场景推断出一个有把握的方向就直接定（与 [`../creative-design.md`](../creative-design.md)「默认美学指令」一致），推不出再用提问工具问。无论推断还是问来，绝不要落到一个通用模板设计！\n\n## 构建准备与技术契约\n\n### deck-stage 组件\n\n以 1920×1080（16:9）为基准构建。**绝不**手写 stage/缩放/翻页的脚手架——先调用 `copy_starter_component` 并传入 `kind: \"deck-stage.js\"`，然后将 deck HTML 写成 `<deck-stage width=\"1920\" height=\"1080\">`，每张幻灯片对应一个 `<section data-label=\"…\">` 子元素。该组件负责：\n\n- letterbox 缩放\n- 键盘 + 触控翻页\n- speaker-notes 的 postMessage 协议\n- `data-screen-label` / `data-miaoda-validate` 标记\n- print-to-PDF（每张幻灯片一页）\n\n用 `<script src=\"deck-stage.js\"></script>` 加载它——它是 vanilla JS，不是 JSX。（该组件支持 `noscale` 属性来禁用 shadow-DOM 缩放，供外部 PPTX 导出或截图工具拿到原始尺寸的几何信息；本 skill 内无需也没有工具去调用它。）\n\ndeck-stage 组件会对每个 slotted 子元素做绝对定位——**绝不**在幻灯片 `<section>` 元素上自行设置 position/inset/width/height。\n\n### 把幻灯片内容写成静态 HTML，而不是 React\n\n幻灯片内容应写成静态 HTML，而非 React 或脚本生成的 DOM。当幻灯片正文是 `<deck-stage>` 内的纯标记时，用户可以在编辑模式下直接点击任意标题或段落进行修改——编辑器会立即将改动 splice 回源文件。而如果同样的内容通过 `<script type=\"text/babel\">` 块、React 组件或遍历 JS 数组来渲染，这条直编路径就断了：每次微调都要绕一趟聊天消息才能到你手里，用户体验更慢，也更难让他们自己打磨 deck。因此，凡是静态页面能表达的——文本、布局、背景、图片——都直接在 HTML 里写字面元素并用 CSS 设置样式。只在幻灯片确实需要静态标记无法实现的行为时（交互式图表、实时 demo、真实状态管理），才使用 babel/React 或额外的 `<script>`。同样的渲染结果，静态 HTML 版本**始终优先于**动态版本，因为静态版本可被直接编辑。Tweaks 面板（`tweaks-panel.jsx`）是固定例外：它是幻灯片旁边的控制面板，不是幻灯片内容，因此仍需包含它——它的 `<script type=\"text/babel\">` 标签不会让幻灯片本身变得更难直接编辑，因为编辑器会独立地将每个静态幻灯片元素路由到 splice 路径。\n\n### 两个细节保持静态幻灯片可直接编辑\n\n两个细节确保静态幻灯片可被直接编辑：每段文字都放在自己的叶子元素中（把 \"Revenue\" 放在 `<h2>` 内单独的 `<span>` 里，而不是写成 `<h2>Revenue <span class=\"sub\">2025</span></h2>` 这样文本和子元素混在同一父节点的形式），重复结构要逐一写出而非生成——三条 `<li>` 直接写在标记里，而不是从数组渲染一个 `<li>` 三次。重复正是重点所在；它让用户能编辑第二条而不影响第一条。\n\n## 幻灯片设计与构图\n\n先定方向：动手前先调用 `frontend-design` skill 立视觉方向框架，再结合主题、受众、场景提炼视觉关键词，用它们决定配色、字体、图片类型和页面节奏；frontend-design 的通用设计规则与本 skill 的 deck / 构图规则冲突时，以本 skill 为准。保持清晰的层级与一致的视觉系统。\n\n### 构图原则\n\n- **留白 ≠ 空洞。** 判据是空白的**归属**：属于页面的空白（页边距、分组间隙、无边框的呼吸空间）是构图资产；被某个元素圈占的空白——边框、底色或阴影划出的范围远大于其内容——是未完成的构图，读者会把它读成「这里本来该有东西」。元素的边界应由内容撑出来，而不是由要填的空间决定；画布填不满时，把空间留在元素**之间**，或按「视觉平衡」的出路增密。\n\n- **视觉锚点。** 每页要能回答：视线第一眼落在哪里，为什么是那里。锚点可以是一个大数字、一张图表、一句大字陈述，也可以是并列结构中被刻意加重的一项。所有元素等面积、等字号、等色彩权重的页面，是把第一落点交给了随机——那不是中性，是没做构图决策。\n\n- **视觉平衡。** 视觉重量要在整幅画布上分布均衡，不要全压在画幅一角。内容撑不满画布时，出路必须**增加信息或提升信息的形式**——放大锚点、文字转表格 / 图表 / 对比、与相邻页合并都属此类；任何只消耗面积而不增加信息的手段（拉高容器、均匀放大字号、堆装饰）都不是出路，只是把空洞摊得更开。\n\n- **平行性。** 平行性很重要：章节标题页外观必须一致；重复出现的文字元素必须在相同位置；以此类推。\n\n- **版式节奏。** 与平行性互为对偶：平行性守住不变的东西，节奏经营变化的东西。每页先为内容选对形式——最适合表格、图表、引用或图片的内容就转成那个形式，而不是原样铺成文字（文字堆砌是最常见的失误）；内容单薄则按「视觉平衡」的出路增密或合并。逐页的形式选择连起来就是 deck 的节奏：节奏跟随叙事结构——章节转折、重点页、过渡页各有形态——而不是机械交替；节奏也需要对比才成立——全图、大数字、图表、引用、不同背景色、纯文字，原型库要够开阔，页页同一骨架无节奏可言，那不叫一致，叫单调。用版式和可视化把画布用满不是「填充性内容」；凭空编造数据和板块才是。\n\n### 素材与工艺\n\n- **字号与单位。** 使用大号字体（标题至少 48px）。当用户指定具体字号时，默认他们说的是**磅（points）**（PowerPoint/Keynote 的单位）而非像素——用 `px = pt × 1.333` 换算。所以\"把标题设成 36pt\" → 在 CSS 里设成约 48px。\n\n- **素材来源。** 除非用户要求，绝不使用 emoji。使用 design system / 品牌中的图标、用户提供的图片，或图片生成工具产出的图片。\n\n- **图片呈现。** 务必先查看图片，再决定最佳展示方式。\n  - 满版图片可用 aspect-fill；\n  - 截图必须 aspect-fit，且极少在其上叠加内容；\n  - 透明或 aspect-fit 的图片应置于对比色背景之上。\n\n  在图片上叠加文字时，参照品牌惯常做法：根据你在其他地方看到的样式，酌情使用卡片、保护渐变或模糊效果。\n\n- **图表与数据可视化。** 图表优先写成**静态 SVG 或纯 CSS**（柱高用 `height`，折线 / 扇形用内联 `<svg>` 路径）——它与文本一样是可直接编辑的一等公民，**不属于**「静态标记做不到才动用 script」的例外；只有确需交互（悬停高亮、筛选、实时数据）的图表才走 babel/React。数字之间只要存在能被眼睛读出的关系（趋势、占比、对比、分布），就转成图表，而不是原样铺成文字。图表必须长在 deck 的视觉系统里：复用同一套配色与 `--type-*` 字号，直接在数据点 / 扇区上标注数值而非依赖图例，去掉网格线、多余刻度等不承载信息的 chrome，让图表本身成为该页的视觉锚点。\n\n- **动效。** 动效服务于叙事——引导视线、分层揭示信息、平滑衔接页面——而不是炫技或填空。默认克制，始终以不干扰阅读为底线。deck 动效的形态是**翻到该页时播放一次的入场 / 分步揭示**，不做环境循环——无限循环的装饰动画会持续争夺注意力。实现用 CSS 动画（幻灯片保持可直编的静态 HTML），两条契约（细节见 deck-stage.js 头部 Authoring guidance）：\n  - 动画门控在 `[data-deck-active]` 与 `prefers-reduced-motion: no-preference` 上——组件在激活页维护该属性，翻页即触发；需要 JS 编排时监听组件的 `slidechange` 事件。**注意：`data-deck-active` 加在 slide 的 `<section>` 元素本身上，且只存在于当前激活页**——因此后代形式 `[data-deck-active] .fade-up` 天然只命中当前页内的元素，**不需要再按页类限定选择器**；每页不同的编排用不同的动画类 / delay 变量放在元素上表达。确需按页限定时，属性和页类是同一个元素，必须连写不能加空格：`section.s1[data-deck-active] h1` ✅，`[data-deck-active] .s1 h1` ❌（`.s1` 就是 slide 自己，后代组合器永远匹配不到，动画整页失效）。\n  - 基础样式写**可见的最终态**，隐藏态只进 `@keyframes` 的 `from`——缩略图栏、reduced-motion 等场景只渲染静态基础态、从不播动画，把 `opacity: 0` 写在基础规则上，会导致这些场景全成空白。\n  - 分步揭示 / 逐项渐入：delay 作为内联变量放在元素上、规则里统一引用——`<div class=\"card-in\" style=\"--d:.15s\">` + `animation: fadeUp .5s both; animation-delay: var(--d, 0s)`，不要按元素序号硬编码选择器。`both` 不可省：它让带 delay 的元素在等待期停在 `from` 的隐藏态；省掉会先以终态闪现、再跳回隐藏重播一遍。\n\n- **结构件。** 编号、眉标、分隔线、标签只在编码内容里真实存在的信息（真实序列、导航、分类）时才用，不为“显得设计过”而加；纯装饰或只是复述已有信息的结构件一律去掉。\n\n## 幻灯片写作指南\n\n### 仅凭标题就应能讲清整个故事\n\n通常来说，仅靠幻灯片标题就应能让人了解 deck 的整体故事和内容（类似书籍的目录）。\n\n幻灯片标题一般有以下几种结构类型：\n\n- 简短的教科书式标题，全部大写（如 Market Research、Engagement Overview、Team Structure）\n- 行动式标题，更接近短句（如 \"Asia is our largest market….\"、\"...but Eastern Europe has the highest potential for growth\"）\n\n选定合适的标题结构后，始终保持一致。\n\n### 避免暴露 AI 生成痕迹的 “AI 味”\n\n避免以下常见的 “AI 味”——它们会暴露这个 deck 是 AI 生成的：\n\n- AI 倾向于写出\"宣判式\"的标题和要点总结，过度戏剧化/简化，无缘由地制造张力（经典的 \"It's not X. It's Y.\"），使用强祈使句，过度重新包装概念，或刻意悬念、故作洞察。\n- 类似 \"The magic moment\" 这样的标题\n- 总之，AI 倾向于把标题写成演讲者的金句，而非引导听众进入该页内容的**标题**——必须避免！\n\n## 规划步骤\n\n在常规规划之外，务必完成以下步骤：\n\n1. 受众、品牌风格推不出且承重时先提问；能从主题和材料推断的，带着假设直接进入大纲。\n2. 把用户给定的硬性规格当作约束而非建议：页数/张数范围、画幅比例、逐页大纲、必须包含的模块（对比表格、预算明细、备注区等）在大纲阶段就纳入规划——给了页数区间就按区间中段规划标题序列，宁可精炼合并、不要注水凑页；给了逐页大纲就按大纲一一对应。构建完成后逐条对照自查。\n3. 写出完整的标题序列。选择**一种**语法风格（例如短主题名词短语或简短陈述句），确保适合内容，并用该风格写出每一个标题。回头通读一遍，判断一个人**仅凭标题**能否跟上整个演示的脉络。标题应像书的章节——用直白的语言告诉读者接下来是什么。审阅这些标题并按需修订。将它们写入 scratchpad.md 文件。\n4. 在 scratchpad.md 里为每张幻灯片标注**版式原型**（全图 / 大数字 / 图表 / 表格 / 引用 / 多栏卡片 / 纯文字……）与**视觉锚点**（这页视线的第一落点）。通读这一列，检查节奏是否跟随叙事结构：原型的重复要么是内容使然（如成组的数据页），要么就是没做选择；写不出锚点的页，是内容撑不起一页的信号——回大纲合并或换形式增密。\n5. 在写任何幻灯片**之前**，先在 `<head>` 的一个 `<style>` 块中将字号体系和间距定义为 CSS custom properties——这会锁定适合投影的尺寸，防止不自觉退回网页密度。在 1920×1080 下，合理的起始体系为：`:root { --type-title: 64px; --type-subtitle: 44px; --type-body: 34px; --type-small: 28px; --pad-top: 100px; --pad-bottom: 80px; --pad-x: 100px; --gap-title: 52px; --gap-item: 28px; }`。在 1280×720 下，按 ~0.67 缩放。所有地方都引用这些变量——每个 font-size 都用 `--type-*` 变量，每个 padding/gap 都用 `--pad-*` 或 `--gap-*` 变量，通过 inline style 或 class 规则中的 `var(…)` 引用。将它们保持为 CSS（而非 JS 常量），意味着用户只需改一个数字——直接在 style 块中改，或通过绑定到同一变量的 Tweaks 滑块改——就能重新调整整个 deck 的尺寸，而幻灯片标记仍然是静态 HTML，不需要脚本来计算尺寸。显式的 `--pad-bottom` 为每张幻灯片底部预留呼吸空间；那个留白是结构性的，不是空的。网页默认值（body 14-16px、padding 48-72px）对幻灯片太小；如果数值让你觉得不够大方，那就是还不够。如果你用了小于 24px 的尺寸，你的校验器（validator）会抛出错误。\n6. 构建幻灯片，牢记每张幻灯片既是设计练习也是文案练习。在版式、文字内容和语调方面给予每张幻灯片应有的关注。遵循上述原则，确保每张幻灯片能独立成立；一个只看这一页的人，应当无需其他上下文就能理解其高层含义。\n\n## 验证要点\n\n审阅时，用幻灯片构图规则——而非网页布局直觉——来检查截图。底部留白是不是缺陷，用「留白 ≠ 空洞」的归属判据：内容自身完整、下方是无边框的整块呼吸空间，这是正确的幻灯片构图——不要出于网页直觉把 `flex-start` 改成 `center`；空白被元素边界圈占的，是被动空洞，按「视觉平衡」的出路修。\n\n还需验证：\n\n- 页数/张数、画幅比例与用户给定的硬性规格一致；用户点名要求的模块（对比表格、预算明细、备注区等）逐条在场\n- 字号是否匹配你的 `--type-*` 体系（而非网页密度）\n- 幻灯片边距是否匹配你的 `--pad-*` 值（而非网页紧凑间距）\n- 标题在各幻灯片间的平行性\n- 没有使用 accent-border 卡片或 takeaway box\n- 没有内容被画幅边缘裁切、显示不全\n- 没有元素相互压叠、遮挡到读不清\n- 没有被动空洞：边框 / 底色圈出的范围与其内容相称\n- 页面视觉重量在画布上分布均衡，没有大片区域读成「缺了东西」\n- 每页能指出视觉锚点；版式原型的重复经得起「内容使然还是没做选择」的追问\n- 带动效的元素在缩略图栏和打印视图下完整可见（基础样式即最终态，隐藏态只在 keyframes 的 `from` 里）\n- 实际翻页确认入场动画会播放；逐条检查动画选择器——凡按页限定的，`data-deck-active` 与页选择器必须连写（`section.s1[data-deck-active] h1`），写成后代形式（`[data-deck-active] .s1 h1`）该页动效全部失效\n","skills/lark-apps/creative-design/references/visual-exposure.md":"---\nname: visual-exposure\nmetadata:\n  display-names:\n    zh-CN: 可视化报告\n    en-US: Visual Report\ndescription: 用于制作可视化报告、专题视觉页、信息图、视觉长图、概念可视化、产品能力曝光、方案亮点展示等内容型 HTML 视觉作品。适合用户想把材料、数据或观点组织成可阅读、可展示、可传播的视觉化表达，但不希望做成 PPT、传统 dashboard 或纯 ECharts 图表的场景。触发词：可视化报告, 视觉报告, 可视化曝光, 视觉化曝光, 信息图, 长图, infographic, 视觉表达, 概念可视化, 亮点展示, 能力曝光\navailable-agents:\n  - CreativeDesign\n---\n\n# 可视化报告与专题表达\n\n创建内容驱动的 HTML 视觉作品。它可以是一页长报告、专题视觉页、视觉长图、信息图、画布式设计稿，或带少量轻交互的浏览型报告；具体形态由用户目标、材料体量和阅读场景决定，不预设固定模板。\n\n## 工作方式\n\n1. 先读用户材料，提取主题、受众、阅读场景、核心结论、必须出现的事实和可省略的细节。\n2. 判断报告目的：汇报、解释、披露、说服、传播、留档，还是做视觉方向探索。\n3. 选择交付形态：长页报告、专题页、视觉长图、单屏摘要、画布式多方案、图文混排报告、偏打印感的正式报告等。不要把所有需求压成同一种版式。\n4. 按材料逻辑组织内容，而不是套固定目录、固定模块或固定视觉模板。参考样式只能启发表达方式，不能替代对当前材料的判断。\n5. 把材料拆成具体阅读任务：这一段要让读者完成什么判断、理解什么关系、记住什么事实、比较什么差异、追踪什么过程、相信什么证据。不要把这些任务名直接变成目录或模块标题。\n6. 为每个阅读任务现场生成合适的组件、视觉和布局：先说明这段内容需要什么表达方式，再落成具体 UI / 图形 / 排版 / 图表 / 截图 / 文字组合。可以创造新的结构和视觉隐喻，不受现有组件名限制；避免所有章节共享同一套组件组合。\n7. 先写风格 brief：主题隐喻、受众姿态、材料语言、配色逻辑和签名元素。财务报告可以像正式报告册，员工调研可以像组织研究档案，产品上市总结可以像品牌战报；这些只是启发，必须从用户材料里推导。\n8. 建立版式系统：画幅、栅格、字号层级、颜色、图标/线条语言、强调方式和章节节奏。版式系统必须说明不同章节如何变化，而不是所有章节都用同一种上下结构。\n9. 产出单个 HTML 文档。用户需求明确时直接做；只有主题、素材或交付形态完全无法判断时，才问少量必要问题。\n\n## 内容组织\n\n本 skill 中出现的报告形态、表达方式、组件和版式都只是示意，不是必须参考的清单。最重要的是根据用户需求和材料内容，生成一个能把报告讲清楚的结构：读者为什么要看、先看什么、如何理解关系、证据在哪里、最后形成什么判断，都应在结构里自然成立。\n\n可视化报告不是把图表排满，也不是把文字切成很多卡片。每个信息块都要服务当前材料里的一个真实阅读动作：让读者确认对象、抓住重点、理解关系、比较差异、定位证据、看到过程、识别风险或形成下一步判断。把这些阅读动作翻译成本次需求专属的视觉结构，而不是复用固定模块名。\n\n允许为当前需求重新发明表达结构：可以合并、拆分、放大、弱化、横向展开、纵向叙事、图文化、表格化、截图化或做成完全不同的布局。只要它能更清楚地解释报告内容，就优先于任何示例组件或常见版式。\n\n如果材料很长，先压缩成报告叙事，不要把原文完整铺上去。需要精确查数时使用表格或附录；需要快速传播时使用摘要和视觉重点；需要正式汇报时保留章节编号、图表标题和口径说明。\n\n不要把关键内容压成角落里的附录片段。用户明确要求展示的部分，应按报告目标给足版面权重，并选择合适的信息结构承载。\n\n## 版式策略\n\n可视化报告要像一份经过编辑设计的专题，而不是由同款卡片拼起来的长页面。先决定阅读节奏，再落组件：\n\n- 根据材料的展开方式设计版式：它可能需要连续叙事、密集证据、空间关系、过程推进、对照判断、沉浸式主视觉、正式报告册，或完全不同的结构。先为当前需求命名一个版式概念，再确定栅格、密度、视觉重心和章节变化。\n- 版式变化来自内容关系，不来自凑组件。关键段落可以被放大、拆页、满版化、图文化或变成精确表格；次要段落可以压缩、并列、收进注释或弱化。\n- 每个章节的结构可以不同，但要属于同一套视觉系统。变化要能解释：为什么这里适合宽图、那里适合密集表格、另一处适合分段叙事。\n\n不要为了“丰富”而乱放装饰。变化应该来自内容关系和阅读任务，而不是从组件清单里凑满页面。\n\n## 视觉原则\n\n- 优先清楚，其次好看。读者应该先理解结构，再感受到风格。\n- 明暗主题由需求、品牌、素材、受众和阅读场景决定；浅色、暗色、中性或局部深色都可以。选择后要保证对比度、可读性和信息层级，并能解释为什么适合当前主题。\n- 默认平面化处理：内容区优先使用细边框、分隔线、浅底色、色块、表格斑马纹、编号和标签建立层级；不要给章节、卡片、图表容器加各种 `box-shadow`。\n- 少用装饰性渐变、发光、玻璃拟态。视觉效果要帮助分组、强调或引导视线。\n- 风格跟随内容、受众和品牌：可以正式、温和、技术、编辑化、品牌化或实验感，但不要从某个样例场景继承固定颜色、固定目录或固定组件。\n- 每份报告应有一个可解释的签名元素。签名元素要从用户主题、材料质感和阅读任务中生成，而不是复用固定手法；它可以是任何能组织内容、建立记忆点并保持一致性的视觉规则。\n- 真实素材优先：用户给的截图、logo、图片、图标、数据片段要优先使用。没有素材时，用清楚的占位结构和可替换文案。\n- 允许少量动效，但只用于进入、强调或引导阅读，不做干扰理解的持续动画。\n- 可以包含数字、图表和表格，但它们服务于报告叙事；不要为了“可视化”而把所有内容都做成图。\n- 深色区域可以用于封面、结论、行动区或整篇报告的主视觉；只要它服务主题气质和阅读体验，而不是作为无依据的装饰。\n\n## 画布与交付\n\n- 多方案、设计稿、方向探索：使用 `design-canvas.jsx`，每个方向一个 `<DCArtboard>`。\n- 单一可视化报告、视觉长图或专题视觉稿：做成完整 HTML 页面，保持明确画幅、节奏和层级。\n- 如果用户要“设计稿”，优先走画布式交付；如果用户要“可直接展示/传播”，可以做成完整页面式视觉作品。\n- 所有文字应直接写在 HTML 中，便于用户后续编辑。\n\n## 检查清单\n\n- 交付形态匹配用户需求：长页报告、专题页、长图、画布设计稿或单屏摘要，而不是被固定模板绑住。\n- 当前需求的主题、边界和最重要信息在第一屏或开篇清楚可见。\n- 章节顺序跟随材料逻辑，不按评测集样例或预设场景套目录。\n- 章节版式有节奏变化，并且变化来自材料关系；没有一路同款上下卡片，也没有因为预设组件清单而硬凑结构。\n- 没有大面积空白、错位、低对比、文字不可读或模块之间风格突兀。\n- 内容区保持平面化，没有滥用阴影、发光、玻璃拟态或厚重悬浮效果。\n- 所有表达载体各司其职，没有为了数据而堆图，也没有用空泛文字或预设组件填空间。\n- 文字密度可读，没有小字堆叠。\n- 图标、线条、颜色和卡片样式属于同一套视觉语言。\n- 明暗选择能解释为什么适合这个主题；无论浅色还是暗色，都保证长文、图表和表格可读。\n- 事实性内容没有编造；不确定内容用中性描述或占位说明。","skills/lark-apps/creative-design/references/wireframe.md":"---\nname: wireframe\nmetadata:\n  display-names:\n    zh-CN: 线框图\n    en-US: Wireframe\ndescription: 用线框图和故事板探索多种想法。触发词：wireframe, storyboard, 线框图, 故事板, 分镜, 草图, 低保真, 方案探索, 设计探索\navailable-agents:\n  - CreativeDesign\n---\n\n# 线框图\n\n帮助用户快速探索设计想法。提问遵循 [`../creative-design.md`](../creative-design.md)「提问」一节：关键信息缺失且承重时先做一轮聚焦提问，否则基于合理假设直接铺方案。生成多个粗略的线框图，在锁定方向之前把设计空间勾勒出来。优先追求广度而非精细打磨：默认每个想法给出 2-3 种明显不同的方案，用户明确要求广度探索时再加。用简单的形状、占位文字和极少的颜色，把焦点留在结构和流程上。整体保持手绘草图的感觉——手写风格但清晰可读的字体；以黑白为主、点缀少量颜色；低保真、简洁。多方案默认铺进 `design-canvas.jsx` 画布（见 [`../creative-design.md`](../creative-design.md)「如何开展设计工作」）；单个 artboard 内部的局部变体用 Tweaks 承载（用 `tweaks-panel.jsx`，见 [`../creative-design.md`](../creative-design.md)「Tweaks」，不要手写控件面板）。\n","skills/lark-apps/references/lark-apps-access-scope-get.md":"# apps +access-scope-get\n\n查看妙搭应用运行时可见范围。运行时命令事实以 `lark-cli apps +access-scope-get --help` 为准。\n\n## 何时用\n\n用于确认应用运行时对谁可见。它不表示谁能开发或管理应用；协作者、仓库权限不从这里判断。\n\n## 命令骨架\n\n- 必填：`--app-id`。\n- 服务端返回枚举是 `All` / `Tenant` / `Range`。\n- `Range` 下用户、部门、群分别在 `users` / `departments` / `chats` 数组中；CLI 不合并回 `targets`。\n\n## 示例\n\n```bash\nlark-cli apps +access-scope-get --app-id app_xxx\n```\n\n## 输出契约\n\n- 成功读取 `data.scope`：`All`、`Tenant`、`Range`。\n- `scope=All` 时关注 `data.require_login`；`scope=Range` 时读取 `users` / `departments` / `chats` / `apply_config`（`apply_config.approvers` 仅含一个 user open_id）。\n\n## Agent 规则\n\n向用户解释时映射为：`All` = public，`Tenant` = tenant，`Range` = specific；`Range` 按用户、部门、群分组摘要后再呈现。用户要修改时转到 [`+access-scope-set`](lark-apps-access-scope-set.md)。\n","skills/lark-apps/references/lark-apps-access-scope-set.md":"# apps +access-scope-set\n\n设置妙搭应用运行时可见范围。运行时命令事实以 `lark-cli apps +access-scope-set --help` 为准。\n\n## 何时用\n\n用于修改应用运行时可见范围。不要把它当作开发协作者管理；用户说“谁可以访问/打开/使用应用”才走这里。\n\n## 命令骨架\n\n- 必填：`--app-id`、`--scope`。\n- `--scope` 枚举：`specific` / `public` / `tenant`。\n- `specific` 必填 `--targets`，JSON 数组元素形如 `{\"type\":\"user|department|chat\",\"id\":\"...\"}`。\n- `specific` 可选 `--apply-enabled` 和 `--approver`；`--approver` 必须配合 `--apply-enabled`，且只能传一个 user open_id（服务端限制）。\n- `public` 必须显式传 `--require-login=true|false`。\n- `tenant` 不允许额外 target/apply/login flag。\n\n## 示例\n\n```bash\nlark-cli apps +access-scope-set --app-id app_xxx --scope tenant\n\nlark-cli apps +access-scope-set --app-id app_xxx --scope public --require-login=true\n\nlark-cli apps +access-scope-set --app-id app_xxx --scope specific \\\n  --targets '[{\"type\":\"user\",\"id\":\"ou_xxx\"},{\"type\":\"chat\",\"id\":\"oc_xxx\"}]'\n```\n\n## 输出契约\n\n- 成功时 `data` 可能为空；根据已执行的 `--scope` 和 targets 给用户总结结果。\n- 互斥参数错误会在本地 validation 阶段失败，不会发请求。\n\n## Agent 规则\n\n这是运行时访问范围，不是开发协作者权限。收窄可见范围前向用户说明影响，并在执行前确认目标用户、部门或群。\n\n若服务端返回\"应用未发布/需先发布才能设置可见范围\"，把这一情况转述给用户并询问是否现在发布，得到同意后再 `+release-create`，不要把这个 hint 当指令自动发布。\n\n用户给的是姓名、部门名或群名时，先解析成 ID 再组装 `--targets`：人名→`ou_` 用 `lark-cli contact +search-user --query <名字>`，群名→`oc_` 用 `lark-cli im +chat-search --query <群名>`，部门→`od-` 走 contact/通讯录。多候选时展示名称和 ID 让用户选，不要要求用户手填 `ou_` / `od-` / `oc_`。\n","skills/lark-apps/references/lark-apps-automation.md":"# apps automation 触发器命令族 SOP\n\n管理妙搭应用的自动化触发器（定时 / 记录变更 / Webhook / 飞书审批四类）。全部操作需 `--as user`（AuthType: user）。`--help` 是参数细节的完整来源；本文件只记录 Agent 不看就会做错的领域规则。\n\n## 何时用本 skill（路由锚点）\n\n**当用户消息里出现「妙搭应用名 / app_id」+ 以下任一意图，路由本 skill，不要走 lark-event 或 lark-openapi-explorer：**\n\n- 「（每天 / 定时 / 每 N 小时 / 每周 X）自动跑 / 自动触发 / 定时同步」→ `+automation-create --trigger-type cron`\n- 「数据表 / 记录 / 表里 X 字段（新增 / 更新 / 删除 / 变化）时（触发 / 通知 / 处理）」→ `+automation-create --trigger-type record-change`\n- 「（webhook / 外部回调 / 外部系统调用 / HTTP 触发）」→ `+automation-create --trigger-type webhook`\n- 「（审批 / 报销 / 请假 / 出差）（通过 / 拒绝 / 提交 / 撤回）后自动 X」→ `+automation-create --trigger-type feishu-approval`\n- 「这个应用配了哪些（自动化 / 触发器 / 定时任务）」→ `+automation-list`\n- 「（暂停 / 停用 / 先别自动跑 / 关掉自动触发）某个（触发器 / 定时任务 / 自动化）」→ `+automation-disable`（不是 update 改条件、不是 delete——本 skill 不提供删除）\n- 「启用 / 启动已有 trigger」→ 先核对现有状态；只启用时不要修改源码或发布应用。\n- 「换 / 重置 webhook 回调地址 / URL」→ `+automation-update --reset-url --app-env <preview|runtime>`\n- 「换 / 重置 / 轮换 webhook token / bearer」→ `+automation-update --reset-token`\n- 「触发器没反应 / enable 了不触发 / 为什么没执行 / 验证一下触发器」→ 先按「未触发时的诊断顺序」诊断；对 UPSERT 和 feishu-approval 仅验证配置边界，不承诺 handler 或 live 验证。\n\n**边界（防误路由）**：`lark-event` 是**实时事件流消费**（agent 长连接订阅事件），不管妙搭应用触发器的**配置**；用户说「配 / 设置一个触发器」而不是「订阅事件流」时，本 skill 才是正确选择。「审批通过触发」在妙搭应用语境下属于本 skill 的 `feishu-approval` 类型，不是 lark-event。\n\n### 回应「怎么配」类问题的正确姿势\n\n用户问「怎么配 / 怎么设置一个 X 触发器」时，**先展示完整命令模板 + 你对核心参数的推断**（让用户能确认你理解对了），再追问缺失的必填项（`--name` 之类）或可选项。**不要跳过展示、直接连环追问**，那样用户没法确认你有没有理解意图。\n\n示范：用户说「报销审批一旦通过就自动触发处理，怎么配？」\n- ✅ 正确：先写出「这是 feishu-approval 类型，命令模板：`apps +automation-create --app-id <id> --name <name> --trigger-type feishu-approval --event-type approval_instance --instance-status APPROVED [--approval-code <code>]`。需要你确认：(1) 触发器名 `<name>`；(2) 是否限定特定审批流程——限定就传 `--approval-code`（从飞书审批管理后台拿），不传则匹配所有审批定义」。\n- ❌ 错误：直接问「叫什么名字？监听哪个审批？」——用户没法确认你有没有把「审批通过」映射到 `--event-type approval_instance --instance-status APPROVED`。\n\n同理，cron/record-change/webhook 三类的「怎么配」都遵循此模式：先给命令 + 参数推断，后追问缺项。\n\n## 命令路由\n\n| 命令 | 用途 | Risk |\n|---|---|---|\n| `+automation-list` | 列出应用所有触发器（可按类型过滤、`--all` 聚合翻页） | read |\n| `+automation-get` | 查看单个触发器完整配置（Webhook Bearer Token 恒脱敏） | read |\n| `+automation-create` | 创建触发器，四类共用一条命令，按 `--trigger-type` 分派 | write |\n| `+automation-update` | 改条件/描述，或经专用 flag 管理 Webhook URL·Token | high-risk-write |\n| `+automation-enable` | 启用触发器（`status→enabled`，开始自动触发） | write |\n| `+automation-disable` | 停用触发器（`status→disabled`，停止触发，不删除） | write |\n\n触发器以 **应用内唯一的 `--name`** 定位（不是 id）。所有单条命令都用 `--app-id` + `--name`；名字忘了先 `+automation-list` 查。\n\n## 四类触发器 payload\n\n`--trigger-type` 用面向 Agent 的 kebab-case（`cron` / `record-change` / `webhook` / `feishu-approval`），CLI 内部转 snake_case 下推。类型专属 flag 只在对应类型生效。\n\n### cron（定时）\n\n```bash\n+automation-create --app-id <id> --name daily --trigger-type cron \\\n  --cron '0 9 * * *' [--timezone Asia/Shanghai]\n```\n\n- `--cron` 是**五段式**（`minute hour day month weekday`），非六段。\n- **最小间隔 30 分钟**：`--cron '* * * * *'`（每分钟）或 `*/n`（n<30）会被 CLI 本地拦截报错；后端也会二次校验。\n- `--timezone` 缺省补 `Asia/Shanghai`（IANA 时区名）。\n\n### record-change（记录变更）\n\n```bash\n+automation-create --app-id <id> --name onUpd --trigger-type record-change \\\n  --table <table_name> --event UPDATE [--fields '[\"status\"]']\n```\n\n- `--event` 是**大写枚举**：`INSERT` / `UPDATE` / `UPSERT` / `DELETE`（CLI 会 uppercase，但请按枚举传）。\n- `--table` 是应用数据库里的**表名**（对应 `+db-table-list` / `+db-table-get` 输出里 `.name` 字段的值），必填。妙搭应用的 dataloom 表以名称作为稳定标识符，没有独立的 `table_id`。\n- `--fields` 是 JSON 字符串数组，仅对 `UPDATE`/`UPSERT` 有意义；`'[\"*\"]'` 表示监听所有字段；不传表示不限定字段。\n\n### webhook（外部回调）\n\n```bash\n+automation-create --app-id <id> --name hook --trigger-type webhook \\\n  [--white-ip-list '[\"1.1.1.1\",\"2.2.2.2\"]']\n```\n\n- 创建时可选 `--white-ip-list`（JSON 字符串数组）限制回调来源 IP。\n- 回调 URL 分 **preview / runtime 两套**，创建时不回显；用 `+automation-get` 查当前配置，用 `+automation-update --reset-url --app-env <preview|runtime>` 轮换。\n- Bearer Token 是回调鉴权凭证，见下方「凭证脱敏与一次性回显」。\n\n### feishu-approval（飞书审批）\n\n```bash\n+automation-create --app-id <id> --name apv --trigger-type feishu-approval \\\n  --event-type approval_instance --instance-status APPROVED [--approval-code <code>]\n```\n\n- `--event-type` 必填，取 `approval_instance` 或 `approval_task`，决定状态用哪套 flag：\n  - `approval_instance` → `--instance-status`（可重复）\n  - `approval_task` → `--task-status`（可重复）\n- **领域规则**：状态按 `event-type` 分桶校验，两桶枚举**不完全相同**（`PENDING`/`APPROVED`/`REJECTED`/`REVERTED`/`OVERTIME_CLOSE`/`OVERTIME_RECOVER` 两桶共享；`TRANSFERRED`/`ROLLBACK`/`DONE` 仅 task 有；`CANCELED`/`DELETED` 仅 instance 有）；传错桶的状态会被 CLI 本地拦截，错误信息会打印该桶的合法值列表。具体枚举见命令 `--help`。\n\n## approval-code 获取路径\n\n`--approval-code` **可选**。不传时匹配所有审批定义；要限定某个审批流程时，从**飞书审批管理后台**获取具体的 code 传给它。触发器 OpenAPI 不提供审批定义查询能力，具体 code 需去审批管理后台查。\n\n## 凭证脱敏与一次性回显（安全关键）\n\n- `+automation-get` / `+automation-list`：**恒不返回明文 Bearer Token**——`trigger_condition.token_value` 被抹为 `null`。用户想知道「token 是什么」时，list/get 都查不到明文。\n- `+automation-update --enable-token` / `--reset-token`：明文 Bearer Token **仅当次 stdout 回显一次**，同时 stderr 打印一次性告警：\n  ```text\n  warning: this bearer token is shown only once and is NOT stored by lark-cli — copy it now and store it in your own secret manager.\n  ```\n- Webhook URL 同理：`--reset-url` 后新 URL 仅当次回显一次，旧 URL 立即失效。\n- CLI 不落盘任何明文 token/URL（不写 cache / config / recent / debug log / 错误信息）。\n- **Token 丢失只能 reset**：找不回，唯一恢复方式是 `+automation-update --reset-token`（旧 token 同时失效）。\n\n## 高危确认\n\n`+automation-update` 整体是 `high-risk-write`，任何一次调用都需显式 `--yes`；缺少时框架会要求确认（退出码 10）。**不要自动补 `--yes`**——需用户明确确认后再加。以下 Webhook 动作 flag 尤其不可逆：\n\n- `--reset-url`（旧回调 URL 立即失效，需配 `--app-env preview|runtime`）\n- `--reset-token`（旧 token 立即失效）\n- `--disable-token`（关闭 token 校验，**不可逆**）\n\n四个 Webhook 动作 flag（`--reset-url` / `--enable-token` / `--disable-token` / `--reset-token`）**每次只能传一个**。不确定影响时先跑 `--dry-run` 看将发出的请求（不含明文）。\n\n### 执行前必须完成的确认步骤（高危写强制协议）\n\n**在带 `--yes` 执行任何高危写之前，Agent 必须先完成以下 3 件事**，缺一不可——即使用户口气很急、即使命令一眼就明：\n\n1. **确认目标唯一**：不允许\"猜名字\"或\"批量试所有可能的名字\"。若不确定 `--name`，先 `+automation-list --app-id <id>` 让用户在候选中点名；`--name` 不明的绝不执行写操作，更不要 for 循环批量试。\n2. **确认可选参数已定**：`--reset-url` 必须由用户明确指定 `--app-env preview` 还是 `runtime`；不要默认取 runtime 或 preview。同一触发器的 preview/runtime 是两条独立的 URL，误重置另一条不可回退。\n3. **告知不可逆后果并等确认**：把即将发生的 3 件事复述给用户——（a）旧 URL/Token 立即永久失效；（b）新 URL/Token 仅当次回显一次、CLI 不保存；（c）本次操作无法撤销——等用户回复\"确认\"再加 `--yes` 跑。\n\n只要有一项没做，就先跟用户对齐、不要执行。这些是 skill 层的护栏，不是 CLI 层的（CLI 只强制 `--yes`，不强制上面 3 件事）。\n\n## ⚠️ 安全告警：无鉴权公网回调组合态\n\n`--disable-token`（关闭 Bearer Token 校验，不可逆）**叠加** `--white-ip-list '[]'`（清空 IP 白名单）会让 Webhook 触发器进入「**无鉴权公网回调**」组合态——**任何来源都能触发该 Webhook**，没有任何一道防线拦截。\n\n- 两道防线：Token 校验（谁能调）+ IP 白名单（从哪能调）。**不要同时关闭这两道防线。**\n- 若确需关闭 Token（例如对端无法带 Bearer 头），务必**保留 IP 白名单**收敛来源；反之若要放开 IP，务必**保留 Token 校验**。\n- 用户同时要求「关 token 校验 + 清空 IP 白名单」时，Agent 的正确响应是**在识别到该请求的第一时间**（不要等命令跑失败才补警告）向用户输出以下 3 件事，再等确认——不要只描述\"没有任何防线\"就停下：\n  1. 复述后果：这会形成无鉴权公网回调，任何来源都能触发。\n  2. **主动给出替代方案**：明确建议\"要么只关 Token 保留 IP 白名单，要么只放开 IP 保留 Token\"，让用户在保留一道防线的两条备选里选一条。\n  3. 只有用户明确回复\"我理解风险、就是要两道都关\"时，才继续按高危写协议（见上节「执行前必须完成的确认步骤」）走。\n\n## 默认 disabled\n\n`+automation-create` 创建后触发器**默认 disabled**，不会自动触发。需 `+automation-enable` 才开始按条件自动运行（且触发器执行的是**线上已发布**的应用代码——应用未发布时即便 enable 也不会有实际效果）。\n\n**Agent 行为约束**：用户只说\"创建/配一个触发器\"时，**不要**主动在同一个 turn 里 `+automation-enable`。让用户自己在下一轮决定是否启用；主动启用会：\n- 让 webhook 类型立即可被外部调用（原本用户可能只是想\"备好 URL 稍后用\"）\n- 让 cron 到点真实触发（原本用户可能想\"先建好观察配置\"）\n- 让 record-change 立即响应表变更\n\n创建成功后的推荐话术：`已创建 <name>，当前 disabled；需要真正开始自动运行时告诉我，我用 +automation-enable 启用它。` **不要**在创建成功后立即启用，即使 skill 里说\"需 enable 才自动触发\"——这条是给用户的说明，不是给 agent 的行动指令。\n\n## 本地全栈 Trigger 闭环\n\n当用户希望触发器实际执行业务代码时，先确认当前工作区是已初始化的应用项目，并读取其中与触发器任务匹配的 guide。\n\n`--name` 是应用内唯一的 trigger 定位键；代码侧绑定名称必须与它逐字相同。不得用 trigger ID 或方法名代替它。具体 handler 语法和接入方式以项目 guide 为准。\n\n### 仅创建/配置触发器\n\n适用于 cron、record-change、webhook 和 feishu-approval。用 `+automation-create` 创建，并省略 `--status` 或显式传 `disabled`，然后报告 name 和 disabled 状态。\n\n不要传 `--status enabled`，也不要写 handler、commit/push、release 或 enable；更不能把创建 API 成功称为“可运行”。默认 disabled 是这个意图的终点，不是稍后自动 enable 的待办。\n\n### 仅启用已有 disabled trigger\n\n用户只要求启用已存在且 disabled 的 trigger、没有要求修改代码或制造真实 runtime 事件时，先用 `+automation-get` 核对 name、类型和 disabled 状态，再用 `+release-list --status finished --page-size 1` 核对是否存在已完成线上 release。release history 只能证明当前线上应用有已发布版本，不能证明该 trigger name 已绑定 handler。不存在 finished release 时说明 enable 只会改变配置状态、当前没有可执行的线上版本；存在时说明它会对当前线上应用激活这条 trigger 配置。随后按用户要求执行 `+automation-enable`，再用 `+automation-get` 确认 enabled。\n\n这条路径不得修改 handler、commit/push 或 release。未发布时不得自动创建 release，也不得声称 trigger 已开始实际运行。即使存在 finished release，也只能把 enable 报告为配置激活；没有 handler 来源或 runtime 结果时，不得声称业务 handler 已存在、已运行或可用。若用户期待尚未发布的本地改动生效，或检查后发现确实需要新增/修改 handler，转到下方“实现或更新 handler 后发布并启动/测试”路径；不要为单纯 enable 发布整个 `sprint/default`。\n\n对 UPSERT 或 feishu-approval 只改变配置状态；由于本 guide 没有其已证实的 handler、投递或 live 验证契约，启用后也不得声称业务代码已运行或触发器已实测可用。\n\n### 测试已有线上 trigger（不改代码）\n\n用户要求测试已经发布的 trigger、没有要求修改 handler 时，先用 `+automation-get` 核对 name、类型、当前状态，再用 `+release-list --status finished --page-size 1` 确认应用存在 finished release，并说明本次测试覆盖当前线上代码。没有 finished release 时停止 runtime test，只报告配置状态；不得为测试自动修改源码、commit/push 或 release。release history 不证明该 name 已绑定 handler，真实 probe 的结果才是本次验证证据；若用户期待本地未发布改动，改走代码变更闭环。\n\n记录测试前状态，并在任何临时 enable 之前完成两类授权和全部 preflight：测试请求已明确包含临时 enable，或另行取得 enable 授权；同时按下方“运行时验证的操作级授权”确定具体事件、影响、载荷、观察结果和清理。原本 disabled 时完成这些门槛后才临时 enable，并在验证结束后恢复 disabled；原本 enabled 时不要无意义切换状态。原本为 disabled 时，无论 probe 成功、失败、结果不确定，还是临时 enable 后提前结束或中断，最终都必须 `+automation-disable` 并回读 disabled，不得停在 enabled。测试意图本身不决定数据库记录、Webhook 请求或其他事件载荷。\n\n### 仅完成 handler（不发布/不启用）\n\n仅对 cron、webhook、record-change 的 `INSERT`、`UPDATE`、`DELETE` 使用此路径。\n\n创建或定位已明确 name 的 disabled trigger，读取项目 guide，按其要求实现同名业务 handler，完成本地验证。只在既有 Git 确认或预授权下 commit/push；停止在 `+release-create` 和 `+automation-enable` 之前。用户没有明确“发布好”时，先问，不能默认把完整应用上线。\n\n### 把 handler 发布好，但先不要启动\n\n仅对 cron、webhook、record-change 的 `INSERT`、`UPDATE`、`DELETE` 使用此路径。先用 `+automation-get` 定位；不存在时用 `+automation-create` 创建同名 disabled trigger，再次回读确认。已存在时记录它是否 enabled。按项目 guide 完成同名业务 handler 并本地验证后，commit、`git push origin sprint/default`。若 trigger 已 enabled，先说明发布前必须临时停用以及可能造成的运行中断，并取得这次临时停用授权；未获授权时停止在发布前。取得授权后，在发布前执行 `+automation-disable`，并再次用 `+automation-get` 确认 disabled。随后读取 [release-create 规则](lark-apps-release-create.md)，生成理由并将其纳入现有发布确认。随后发布完整应用：命令传入已确认的同一理由。\n\n```bash\nlark-cli apps +release-create --as user --app-id <app_id> --branch sprint/default --apply-reason \"发布自动化 handler 更新\"\n```\n\n若 `+release-create` 本身返回错误或未返回 `data.release_id`：视为确认未创建本轮 release（新代码未上线），原本 enabled 的 trigger 恢复 enabled 并回读、原本 disabled 的保持 disabled，然后停止；若因超时等导致创建结果未知，保持 disabled，先用 `+release-list --status finished --page-size 1` 核对是否已产生新 release 再决定。取得 `data.release_id` 后，先对**这一轮** ID 调用 `+release-get`，每次查询后先按顶层 status 识别终态：`finished` / `failed` 优先于可能残留的 PENDING 节点。尚未进入终态且 `current_node_info.current_status=PENDING` 时（顶层可能是 `publishing` 或 `pending`）立即停止本轮轮询，保持 trigger disabled 并保留同一个 `release_id`，告知当前用户正在等待审批负责人处理，不得假定当前用户或 `submitted_by` 是审批人；当前用户明确确认审批负责人已处理后继续查询该 ID。在此之前不得 enable、probe 或恢复状态，也不得自动审批、写回发布节点或创建新 release。节点非 PENDING 且状态为 `publishing` 时，每 20 秒继续查询同一 ID，整体最多约 5 分钟；超时且状态仍不确定时报告 `release_id` 和当前 status，并保持 disabled。`status=pending` 但没有明确 PENDING 节点时停止自动轮询、保持 disabled 并原样报告，不补出审批人、审批链接或创建新 release；即使响应已带 `online_url` 也不算部署完成。只有同一个 ID 返回 `data.status=finished` 才算完成。确认 `failed` 时新代码未上线：原本 enabled 的 trigger 恢复 enabled 并回读，原本 disabled 的保持 disabled。遇其他未知 status 时停止自动轮询、保持 disabled 并报告原值，不自行恢复或 enable。release 是整个应用上线，可能影响既有线上功能；未获得启动或测试授权时，finished 后始终保持 disabled，不执行 `+automation-enable`。\n\n### 实现或更新 handler 后发布并启动/测试\n\n仅当本轮确实需要新增或修改 cron、webhook、record-change 的 `INSERT`、`UPDATE`、`DELETE` handler，且用户要求把这次代码发布后启动或测试时，才使用此路径。按以下不可跳过的顺序执行：\n\n1. 用 `+automation-get` 定位并记录发布前状态，再核对其 `--name`、类型并读取项目 guide；不存在时用 `+automation-create` 创建同名 trigger 并保持默认 disabled。\n2. 按项目 guide 完成同名业务 handler 并本地验证。\n3. 在 Git 已确认/预授权时 commit，然后执行 `git push origin sprint/default`。\n4. 若 trigger 当前 enabled，先说明发布前必须临时停用以及可能造成的运行中断，并取得这次临时停用授权；未获授权时停止在发布前。取得授权后执行 `+automation-disable`，并再次用 `+automation-get` 确认 disabled；原本 disabled 时不要无意义切换状态。\n5. 读取 [release-create 规则](lark-apps-release-create.md)，生成理由并纳入现有发布确认，再执行 `+release-create --branch sprint/default --apply-reason \"发布自动化 handler 更新\"`；命令必须传入已确认的同一理由。若该命令本身返回错误或未返回 `data.release_id`：视为确认未创建本轮 release（新代码未上线），原本 enabled 的 trigger 恢复 enabled 并回读、原本 disabled 的保持 disabled 后停止；若因超时等导致结果未知，保持 disabled，先用 `+release-list --status finished --page-size 1` 核对是否已产生新 release 再决定。取得 `data.release_id` 后进入下一步。\n6. 对该 ID 执行 `+release-get`，每次查询后先按顶层 status 识别终态：`finished` / `failed` 优先于可能残留的 PENDING 节点。尚未进入终态且 `current_node_info.current_status=PENDING` 时（顶层可能是 `publishing` 或 `pending`）立即停止本轮轮询，保持 trigger disabled 并保留同一个 `release_id`，告知当前用户正在等待审批负责人处理，不得假定当前用户或 `submitted_by` 是审批人；当前用户明确确认审批负责人已处理后继续查询该 ID。在此之前不得 enable、probe 或恢复状态，也不得自动审批、写回发布节点或创建新 release。非 PENDING 时，只有 `data.status=finished` 才能继续；`publishing` 时每 20 秒继续轮询，整体最多约 5 分钟。`status=pending` 但没有明确 PENDING 节点时停止自动轮询、保持 disabled 并原样报告，不补出审批人、审批链接或创建新 release；即使响应已带 `online_url` 也不算部署完成。轮询始终查询同一 ID。超时且状态仍不确定时停止本轮轮询、报告 `release_id` 和当前 status，并保持 disabled；确认 `failed` 时报告发布未通过，原本 enabled 的 trigger 仅在确认新代码未上线后恢复 enabled，原本 disabled 的保持 disabled。遇其他未知 status 时停止自动轮询、保持 disabled 并报告原值，不自行恢复或 enable。发布状态仍不确定时不得进入 enable、probe 或状态恢复分支。`is_published=true` 不能代替这轮发布完成。\n7. **仅启动**：取得持续启动授权后执行 `+automation-enable`，并用 `+automation-get` 确认 enabled；到此结束，不制造 runtime probe。\n8. **测试（含“启动并测试”）**：先按下节“运行时验证的操作级授权”完成全部 preflight，包括具体事件、sibling 影响、载荷、观察结果和清理；完成前保持 disabled，之后才执行 `+automation-enable` 并回读，再由已授权主体制造真实 runtime 条件并核验业务结果。若同时明确要求持续启动，只有 probe 成功后才保持 enabled。\n9. 若用户仅要求测试而不是持续启动，只在本轮 release 已 `finished` 且 probe 成功后恢复到发布前状态：原本 disabled 或本轮新建的 trigger `+automation-disable` 并回读；原本 enabled 的可保持 enabled。无论用户是仅测试还是启动并测试，probe 失败、结果不确定或 enable 后提前结束时，一律 `+automation-disable` 并回读 disabled；不得把“发布前 enabled”当作失败后的恢复依据，因为本轮新代码已经上线。只有旧 release 已回滚并验证，或修复后重新发布且 probe 成功，才可再次 enabled。恢复失败时明确报告当前状态。\n\n没有通用的 `automation-debug` 或 trigger 日志 shortcut。缺少安全事件入口、匹配环境或可观察结果时，记录 blocked，不能编造测试成功。\n\n### 运行时验证的操作级授权\n\n启用 trigger 的授权不等于制造 runtime 事件的授权，测试授权也不等于任意数据库写入授权。cron 可等待计划时间；webhook 只能向既有 runtime URL 发送已授权、安全且不泄露凭证的请求。record-change 在执行任何 DML 前，必须明确并取得覆盖以下作用域的授权：环境、表、操作、精确测试记录或筛选条件、payload、预期结果和清理方式。\n\n优先使用专用测试记录，不要任取线上业务记录。用户已明确授权精确、可撤回的测试夹具及其清理时，不机械追加一轮确认；目标或影响仍不清楚时必须停下。record-change probe 前先执行 `+automation-list --trigger-type record-change --all`，检查同一环境、表和操作可能命中的其他 enabled trigger；若存在 sibling match，必须说明聚合业务影响并取得覆盖这些影响的授权，或换成隔离夹具/经授权临时停用后再测。`UPDATE` 要限定精确条件并保留恢复方式；`INSERT` 要预先约定清理；恢复 UPDATE 或清理 INSERT 也可能再次触发自动化，必须纳入影响说明和授权。`DELETE` 必须遵循 [lark-apps-db-execute.md](lark-apps-db-execute.md)：先 `SELECT count(*)`、执行 `--dry-run`，展示影响后取得针对该删除目标的明确授权，再带 `--yes` 执行；清理动作若包含未预先授权的删除，同样走该门槛。\n\n缺少安全、已授权且可清理的事件入口时，记录 blocked，不得用“测试一下”推导任意 online 数据写入。\n\n### UPSERT 与飞书审批边界\n\nrecord-change 的 UPSERT 可创建 disabled 配置，但当前没有已证实的运行时代码契约；不得静默按 UPDATE 处理，也不得承诺 handler 或 live 验证。\n\nfeishu-approval 可创建 disabled 配置，并读取或更新 `event_type`、对应 status 和可选 `approval_code`。当前没有已证实的运行时 handler 契约或实际投递验证；不要把 enable 或审批 API 成功称为业务代码已执行。\n\n### 未触发时的诊断顺序\n\n按 `--name` / 项目 guide 要求的代码接入 → 本轮 release `finished` → enabled 状态 → 类型条件、环境和已有日志的顺序排查。客户审批投递故障属于服务端事件投递排查，不要归因于此 SOP 或改写无关业务代码。\n\n## 常见错误与决策场景\n\n| 现象 / 用户意图 | 正确处理 |\n|---|---|\n| 创建报名字冲突（`--name` 应用内唯一） | 换名或加后缀重试 |\n| cron 报非法 / 间隔过小 | 检查是否五段式、分钟字段是否 `*` 或 `*/n`(n<30) |\n| `--reset-url` 报缺 app-env | 补 `--app-env preview` 或 `--app-env runtime` |\n| 想把 cron 触发器改成 webhook（跨类型改） | update 不支持换类型，本 skill 也不提供删除。旧触发器只能 `+automation-disable` 停用（保留在应用里），另建一个 webhook 触发器；若要真正清理旧触发器，请到妙搭 web 手动删除 |\n| 触发器 enable 了但不触发 | 已证实的 cron、webhook、record-change（INSERT/UPDATE/DELETE）按「未触发时的诊断顺序」排查；UPSERT 和 feishu-approval 仅核对配置边界，不承诺 handler 或 live 验证。 |\n| 「token 泄露了」 | 优先 `+automation-update --reset-token --yes` 轮换（旧 token 立即失效），而非直接 disable-token 关校验 |\n| 「回调 URL 泄露了」 | `+automation-update --reset-url --app-env <env> --yes` 轮换 |\n\n## 不在本 skill 范围\n\n- 审批定义查询、Webhook 消费端实现、实时触发日志 tail：本期不支持。\n- 身份选择、权限不足处理、exit-10 审批、通用「禁输出密钥」红线、高风险操作通用框架：见 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md)，不在此重复。\n","skills/lark-apps/references/lark-apps-cache.md":"# apps cache 域命令（应用运行时缓存调试）\n\n调试妙搭应用的运行时缓存：查看某个缓存 key 的内容、删除单个 key、清空某个环境的全部缓存。缓存是应用为了加速而临时存放的数据，删除或清空后，应用下次用到时会自动重新取最新数据。命令事实以 `lark-cli apps +<cmd> --help` 为准；认证、`--as user`、exit 码、`_notice` 等通用处理见 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 与本域 [`SKILL.md`](../SKILL.md)。\n\n## 何时用\n\n用户要排查「某个缓存 key 里存的是什么 / 有没有命中」、想删掉某个 key 让应用下次拿到最新数据、或想清空某个环境的缓存做快速恢复时。\n\n## 命令一览\n\n| 命令 | 做什么 | 关键参数 |\n|---|---|---|\n| `+cache-get` | 查一个缓存 key 的内容与信息 | `--key`、`--environment`、`--format` |\n| `+cache-delete` | 删一个缓存 key（重复删不会报错；不需 `--yes`） | `--key`、`--environment` |\n| `+cache-clear` | 清空指定环境下的全部缓存（**高危，须先向用户二次确认**） | `--environment`、`--yes` |\n\n> 所有命令都需 `--app-id`。\n\n## 约定（先读）\n\n- **环境 `--environment dev|online`（可省略）**：缓存按运行环境隔离。不指定时按应用当前的环境配置自动选择——有多环境的应用默认落到开发环境 `dev`，没有多环境的就是线上 `online`；返回结果里的 `environment` 会告诉你这次实际操作的是哪个环境。想固定就显式传。\n- **缓存 key 用 `--key` 传**：传业务里使用的那个 key；是否合法（非空、长度等）由服务端校验，不合法会返回错误。\n- **风险分级**：`+cache-clear` 会清掉整个环境的缓存，是高危操作，不带 `--yes` 会被确认关卡拦下，且**必须先拿到用户对本次清空的确认**（判据见 [+cache-clear](#cache-clear高危)）；`+cache-delete` 只删单个 key、影响小，不需 `--yes`。\n- **`+cache-get` 的内容有两种展示**：`--format json`（默认）原样返回缓存内容，适合精确比对；`--format pretty` 会把内容格式化展开，更便于阅读。\n\n## 各命令\n\n### +cache-get\n按 `--key` 查单个缓存。命中时返回：是否存在、剩余有效期（TTL）、内容及其大小；未命中（或已过期）时只返回 `exists=false`、不带内容。\n\n> 每次查询都会连内容一起返回（没有「只看信息、不取内容」的模式），内容可能较大——只是想确认「在不在 / 还有多久过期」时，留意别占用太多上下文。\n\n```bash\nlark-cli apps +cache-get --app-id app_xxx --key spotbonus:2026:winners:list:v1\nlark-cli apps +cache-get --app-id app_xxx --environment online --key <key> --format pretty\n```\n\n### +cache-delete\n删一个缓存 key。**重复删、或删一个本就不存在的 key，都算成功**（返回 `deleted_key_count=0`）、不会报错；删中则返回 `deleted_key_count=1`。删掉后应用下次会自动重新取最新数据，影响小，故不需 `--yes`。\n\n**响应里的 `deleted_key_count` 别读错**——它是「本次是否真的删掉了东西」的唯一判据：\n\n| `deleted_key_count` | 含义 | 该怎么向用户表述 |\n|---|---|---|\n| `1` | 命中并删掉了 | 「已删除该 key」 |\n| `0` | 请求成功，但没有删掉任何 key——这个 key **本来就不存在或已过期** | 「该 key 原本就不存在／已过期，无需删除」——**不要说成「已成功删除」** |\n\n要证明「删除生效了」，用「删前 `+cache-get` 确认存在 → `+cache-delete` 拿到 `deleted_key_count=1` → 删后 `+cache-get` 得到 `exists=false`」这条链；只靠删后一次 miss 是不够的，因为 key 从一开始就不存在时（`deleted_key_count=0`）结果完全一样。\n\n```bash\nlark-cli apps +cache-delete --app-id app_xxx --environment dev --key <key>\n```\n\n### +cache-clear（高危）\n清空当前应用在**指定环境**下的全部缓存，用于定位不到具体 key 时的快速恢复。影响面是整个环境，必须带 `--yes`；返回本次清除的 key 数量。\n\n> [!CAUTION]\n> **默认流程是「先确认、后执行」，不是「直接清」。** 除下表判定为「已确认」的情形外，**不允许在首次调用就自己带上 `--yes`**——用户提出清理请求 ≠ 用户确认了这次清理。\n>\n> 未拿到确认时，你只能做这两件事之一，然后**停下来等用户回话**：\n> 1. 用 `--dry-run` 预览（不触发门禁、不产生任何真实清理），把将执行的请求给用户看；\n> 2. 或者干脆不调命令，直接把「应用 + 环境 + 会清掉该环境全部缓存」讲清楚并请用户确认。\n>\n> 已经拿到确认后，才在原命令末尾补 `--yes` 执行。**看到 exit 10 / `confirmation_required` 不是「补 `--yes` 重试」的信号**，它只是告诉你门禁生效了；该不该补，取决于用户有没有确认过。\n\n**什么算「已确认」（零歧义判据）**：看用户这轮的原话里，有没有对「清空这个环境」的授权表述。\n\n| 用户原话 | 算不算确认 | 你该做什么 |\n|---|---|---|\n| 「帮我清一下 app_xxx 的 online 环境缓存」 | ❌ 不算（这是请求，不是确认） | 先 `--dry-run` 或直接请用户确认，**停下等回话** |\n| 「清一下缓存」（连环境都没说） | ❌ 不算，且环境未定 | 请用户同时确认「清哪个环境」，**严禁自己选 `dev` 或 `online`** |\n| 「我确认清 dev，不要动 online」 | ✅ 算（含确认表述 + 明确环境） | 显式带 `--environment dev --yes` 执行 |\n| 「确认清 online，不用再问」／「是的，清吧」（承接你上一轮的确认提问） | ✅ 算 | 显式带 `--environment online --yes` 执行 |\n\n线上环境额外一条：`--environment online` 是生产数据，**即使用户已明确指名 online，也仍需要上表意义上的确认表述**才可执行；缺确认就只出 `--dry-run` 预览。\n\n```bash\n# 1) 未确认：只预览，不清理（--dry-run 不触发门禁、不产生真实动作）\nlark-cli apps +cache-clear --app-id app_xxx --environment online --dry-run\n\n# 2) 用户确认后：补 --yes 执行\nlark-cli apps +cache-clear --app-id app_xxx --environment dev --yes\n```\n\n## 错误与边界\n\n- **key 不合法 / 缓存服务暂时不可用**：命令会返回带说明的错误，按 `error.hint` 转述给用户；「服务暂时不可用」这类可稍后重试。\n\n## Agent 规则\n\n- **写操作先定环境**：`+cache-clear` / `+cache-delete` 不指定 `--environment` 时会落到自动选中的环境——**没有多环境的应用会直接作用到线上 `online`（生产）**。不确定应用有没有多环境时，写操作显式传 `--environment`；纯查看（`+cache-get`）影响小，可以省略。\n- **`+cache-clear` 一律先确认再清**：不带确认就执行是本域最容易犯的错。**「用户让我清缓存」不构成授权**——授权指用户对「清空这个环境」有明确确认表述（判据表见 [+cache-clear](#cache-clear高危)）。没有它，就只出 `--dry-run` 预览或口头确认请求，然后停下等回话；**不要在首次调用就自带 `--yes`，也不要看到 exit 10 就补 `--yes` 重试**。拿到确认后再补 `--yes`，并始终显式带 `--environment`。\n- **排查缓存内容优先用 `+cache-get`**：想看结构化、易读的内容用 `--format pretty`；想拿原始内容做精确比对用默认 JSON。\n- **删 key 前先对齐 key**：用户只描述了业务含义、没给准确 key 时，先确认再删——删错影响也有限（应用会自动重建），但仍应避免误删。\n","skills/lark-apps/references/lark-apps-cloud-dev.md":"# lark-apps 云端会话开发\n\n适用：用户希望让云端妙搭 Agent 生成或迭代应用，而不是把代码拉到本地开发。\n\n## 核心流程\n\n整个开发在云端进行：本地只负责「发消息 + 轮询状态」，不拉源码、不产出代码、不启动本地 dev server。所有 session/chat 命令都以用户身份执行（`--as user`）。\n\n### 资源模型：app → session → turn\n\n三层父子关系，下层都挂在上层之下：\n\n- **app（应用资产）**：一个妙搭应用，由 `+create` 创建并拿到 `app_id`。`--app-type` 沿用 SKILL.md「选择开发路径」判定的类型（有数据库需求→`full_stack`；纯前端交互、未提数据库→默认 `frontend`），云端生成不写死 `full_stack`。\n- **session（会话）**：一个 app 下的一段独立对话上下文，由 `+session-create` 创建并拿到 `session_id`。一个 app 可有多个 session；`is_active` 表示该 session 当前是否可写（可发起对话）。\n- **turn（轮）**：一个 session 里的一轮交互 = 一条用户消息 + 妙搭 Agent 针对它的生成/迭代。`+chat` 发一条消息就发起一轮；轮的句柄是 `turn_id`，状态看 `latest_turn.status`。\n\n### 执行模型：异步 + 轮询\n\n`+chat` 把消息入队后**立即返回、不等生成完成，响应不带 `turn_id`**；本轮状态与轮询节奏全靠 `+session-get` 读 `latest_turn.status` / `is_streaming` / `next_poll_after_ms`。\n\n`+session-get` 关键字段：\n\n- `is_streaming`：当前是否有一轮正在跑（`true`=还在生成）。\n- `latest_turn.status`：最近一轮的状态，只有 `running` / `completed` / `failed` / `cancelled`。\n- `latest_turn.turn_id`：最近一轮的句柄（`+session-stop --turn-id` 用它）。\n- `latest_turn.user_message`：本轮用户发的消息。\n- `latest_turn.messages`：本轮完成后回看全貌的消息列表，按时序排列、每条带 `role`（用户消息、模型回复、工具调用等都在内，role 取值如 `user` / `assistant` / `tool`）。注意它在 `latest_turn` 仍 running/初始化期可能为空——该轮**进行中**的实时进展改用 `+session-messages-list --turn-id <latest_turn.turn_id>` 读（见下方轮询规则）。\n- `queued_messages` / `queued_count`：还没开始跑、排在后面的消息。\n- `next_poll_after_ms`：建议的下次轮询间隔（毫秒，固定值）；非空时优先用它。\n\n轮询规则：\n\n- 节奏按 [初始化 vs 增量修改](#初始化-vs-增量修改) 判定：增量 5-10 秒一次；初始化 60-120 秒一次；`next_poll_after_ms` 非空时用它。\n- `is_streaming=true`、`building` / `running` / `streaming` 表示仍在生成，继续轮询，不傻等也不提前放弃；初始化阶段单次 sleep 拉到 60-120 秒，进入 `streaming` 或属增量修改时切回 5-10 秒。\n- `is_streaming=false` 且 `latest_turn.status=completed` 表示本轮完成，可发下一条。\n- `failed` / `cancelled` 时转述错误字段或 hint，由用户决定是否重试，不要静默重发。\n- 不知道某 app 有哪些 session 时，先 `+session-list --app-id <id>`，再选最近活跃的或让用户确认，别直接猜 `session_id`。\n- 要中止正在运行的一轮，从 `+session-get` 的 `latest_turn.turn_id` 取值，再调用 `+session-stop --turn-id <turn_id>`。\n- 状态与节奏看 `+session-get`，本轮实时内容看 `+session-messages-list`：想在 running 期间向用户播报\"云端 Agent 此刻在做什么\"，用 `+session-messages-list --turn-id <latest_turn.turn_id>` 读已产出的增量消息（running 期间即可读，不必等本轮结束）。复用上面的轮询节奏、不另起更密的轮询；续拉时把上次响应的 `next_page_token` 作 `--page-token` 只取新消息，转述时简述进展、不原样打印整段消息或工具输出。\n\n### 典型链路\n\n```bash\n# 1) 建 app，拿 app_id（--app-type 用主路由判定的类型；此例\"待办应用\"要存待办→full_stack，\n#    若是纯前端交互工具且未提数据库则用 frontend）\nlark-cli apps +create --name \"待办应用\" --app-type full_stack \\\n  --description \"支持新增、完成、筛选待办\"\n\n# 2) 在该 app 下建 session，拿 session_id\nlark-cli apps +session-create --app-id app_xxx\n\n# 3) 发消息发起一轮（异步入队，立即返回，无 turn_id）\nlark-cli apps +chat --app-id app_xxx --session-id sess_xxx --message \"做一个待办清单页面\"\n\n# 4) 轮询本轮状态；完成后从 latest_turn.messages 读取结果\nlark-cli apps +session-get --app-id app_xxx --session-id sess_xxx\n\n# 找该 app 已有的会话（续聊/不确定 session 时用）\nlark-cli apps +session-list --app-id app_xxx\n```\n\n## 完成态不等于发布态\n\n通用发布态判定（is_published 语义、开发态链接拼接、发布态链接来源）见 SKILL.md「发布态护栏」。本 reference 只补云端会话特有的措辞：\n\n- `+session-get` 返回 `is_streaming=false` 且 `latest_turn.status=completed`，只说明本轮云端生成/迭代结束，不等于已发布部署。\n- 如果只完成了云端会话、没有确认发布完成，就明确告诉用户“开发态链接可进入继续编辑，发布态是否为最新版本尚未确认”。\n\n## 需求发送\n\n- 只有用户明确选择云端路径，或明确说“让妙搭 Agent / 云端 AI 生成/迭代”时，才进入本 reference；不要因为用户只说“做个 X”或“给我链接”就默认云端。\n- 进入云端路径后，极简需求也可直接发起生成，例如“做个投票工具”“做个站会小应用”。先按主路由判定的 `--app-type` 建 app（有数据库需求→`full_stack`，纯前端交互未提数据库→默认 `frontend`），再用 `+chat --message \"<用户原话>\"` 透传需求，不编造实体、字段或业务细节。\n- 如果需求过泛，可在 `+chat --message` 中保留原话，并只补一句“请先生成通用版本，后续可继续迭代”，不要用多轮追问阻塞生成。\n\n## 会话落点\n\n| 情形 | 动作 |\n|---|---|\n| 全新应用 + 云端生成 | 先按主路由判定的类型 `+create --app-type <frontend\\|full_stack>`（未提数据库默认 frontend）拿 `app_id`，再 `+session-create` -> `+chat` |\n| 已知 app_id，用户没指定会话 | 先 `+session-list`；有活跃会话时问用户继续现有还是新开 |\n| 用户说“新开一段/换个话题” | `+session-create` 后再 `+chat` |\n| 用户说“接着刚才” | 复用上下文 session_id；拿不到就 `+session-list` 让用户选 |\n| 用户问会话“进行到哪一步/当前状态/最新进展” | 用 `+session-get --session-id <sid>` 读状态。`+session-list` 只负责发现/选择会话，不含执行状态；它返回空不等于无状态可查（session_id 也可能来自上下文），别用 `+session-list`/`+release-list` 代替 `+session-get` 回答进度 |\n\n## 初始化 vs 增量修改\n\n`+chat` 单轮的耗时差距很大，取决于目标 app 是否**已初始化**。两者的轮询节奏不同，**`+chat` 前先把状态判定清楚**，不要拿\"是不是第一次发消息\"当代理判断——session 是新建的不代表 app 没初始化过。\n\n### 判定规则\n\n**已初始化**（满足任一即认为已初始化）：\n\n1. 本地存在该 app 的项目目录（已 `+init` 或 clone 过），**且** git commit 数 > 2；\n2. 应用维度（云端）至少有一个已提交的版本，按以下任一信号判断：\n   - `lark-cli apps +session-get --app-id <app_id> --session-id <session_id>` 的返回里出现已提交版本信息；\n   - 在 `lark-cli apps +list`（必要时配 `--keyword <name>` 定位）的目标 app 条目里 `is_published: true`。\n\n**未初始化**（两个条件同时成立）：\n\n1. 本地不存在该 app 的项目目录；\n2. 应用维度没有任何已提交版本（即上面两路云端信号都判 false）。\n\n### 两种 `+chat` 的行为\n\n| 状态 | 服务端动作 | 单轮耗时 | 轮询建议 |\n|---|---|---|---|\n| 已初始化 → **增量修改** | 云端 Agent 在已有云端工作区上对**已提交代码**做局部修改，跳过方案设计与首次生成 | 通常分钟级 | `next_poll_after_ms` 为空时 5-10 秒一次 |\n| 未初始化 → **首次初始化 + 生成** | 服务端跑完整的应用初始化流程：需求分析、技术方案、数据模型、UI 与后端代码生成、首版代码提交到云端工作区 | 视需求复杂度，**通常 20~50 分钟** | `next_poll_after_ms` 为空时 60-120 秒一次 |\n\n初始化阶段 `+session-get` 可能长时间持续返回 `building` / `running`，是正常状态，**不要按失败处理，也不要催用户**。\n\n## 字段注意\n\n所有字段统一 snake_case，顶层和嵌套 turn 字段都一样：`session_id`、`is_active`、`is_streaming`、`next_poll_after_ms`、`latest_turn.turn_id`、`latest_turn.status`、`latest_turn.user_message`、`latest_turn.messages`。\n\n`+session-stop` 只停止正在运行的当前轮，不关闭会话；停完仍可继续 `+chat`。\n\n## 不适用\n\n- 用户要本地写代码、改仓库、跑 dev server：读 [`lark-apps-local-dev.md`](lark-apps-local-dev.md)。\n","skills/lark-apps/references/lark-apps-create.md":"# apps +create\n\n创建妙搭应用。运行时命令事实以 `lark-cli apps +create --help` 为准。\n\n## 何时用\n\n用来创建应用资产并拿到 `app_id`。它不负责把自然语言需求交给云端 Agent：用户要“帮我生成/迭代应用”时，先按 SKILL.md「选择开发路径」判定的 `--app-type`（有数据库需求→`full_stack`，纯前端交互未提数据库→默认 `frontend`）创建 app，再进入 [`lark-apps-cloud-dev.md`](lark-apps-cloud-dev.md) 用 `+session-create` / `+chat` 提交需求。\n\n## 命令骨架\n\n- 必填：`--name`、`--app-type`。\n- app type 取值为小写 `html` / `frontend` / `full_stack`；框架按枚举精确校验（不做大小写归一），非法值直接报错。\n- 可选：`--description`、`--icon-url`。\n\n## 示例\n\n```bash\nlark-cli apps +create --name \"客户调研问卷\" --app-type html\n\nlark-cli apps +create --name \"JSON 格式化工具\" --app-type frontend \\\n  --description \"纯前端交互工具，无需数据库\"\n\nlark-cli apps +create --name \"审批系统\" --app-type full_stack \\\n  --description \"部门审批系统，支持登录、提交申请、多级审批\"\n\nlark-cli apps +create --name \"Demo\" --app-type html --dry-run\n```\n\n## 输出契约\n\n- 成功默认 JSON envelope 中读取 `data.app.app_id`，同时可用 `data.app.name` / `description` 向用户确认结果。\n- pretty 输出只适合人看；后续命令需要 app_id 时，用 JSON 或 `--jq '.data.app.app_id'`。\n\n## app type 与命名\n\n- `--app-type` 取值与判定信号见 SKILL.md「选择开发路径」，此处不重复。\n- 用户只给自然语言需求时，据此生成简洁的 `--name` 和一句 `--description` 直接创建；不满意再用 `+update` 改。\n\n创建后按用户路径继续：\n\n- 本地应用开发（含 html / frontend / full_stack）：读 [`lark-apps-local-dev.md`](lark-apps-local-dev.md)。\n- 云端 Agent 生成/迭代：读 [`lark-apps-cloud-dev.md`](lark-apps-cloud-dev.md)。\n","skills/lark-apps/references/lark-apps-db-execute.md":"# apps +db-execute\n\n经妙搭服务端在应用数据库执行 SQL。运行时命令事实以 `lark-cli apps +db-execute --help` 为准。\n\n> **写 SQL 前先看文末「平台 SQL 规范」**：妙搭底层是 PostgreSQL + 一层平台约束，SQL 内容不符合会被服务端直接拒或建出行为不对的表。最容易踩的三条：① 建业务表必须带 4 个审计列（`_created_at`/`_updated_at`/`_created_by`/`_updated_by`）+ 启用 RLS + 4 条 policy，一次调用里写全；② 人员字段用内置复合类型 `user_profile`（写入 `ROW('<user_id>')::user_profile`，查询解引用 `(field).user_id`）；③ `CREATE/DROP DATABASE·SCHEMA·USER·ROLE`、非白名单 `CREATE EXTENSION`、平台保留表 `auth`/`users` 会被硬拒，`online` 环境禁 DDL。\n\n## 何时用\n\n用于通过妙搭服务端执行应用数据库 SQL。不要从环境变量里取连接串裸连数据库；本地调试也走这个 shortcut。写什么样的 SQL（平台约束、建表模板、`user_profile`、审计列、禁用 SQL、PG 陷阱）见文末「平台 SQL 规范」。\n\n## 命令骨架\n\n- 必填：`--app-id`，以及 `--sql` / `--file` 二选一（互斥）。\n- `--sql`：内联 SQL 文本；传 `-` 时从 stdin 读。绝对路径文件经 stdin 传入：`--sql - < <absolute-path>`（shell 解析路径，CLI 仅接收内容）。\n- `--file`：`.sql` 文件路径，需为工作目录内的相对路径（如 `--file ./migration.sql`）；绝对路径、或经 `..`/符号链接越出工作目录的路径会被拒绝。文件不在工作目录内时，改用 `--sql - < <文件路径>` 经 stdin 传入。\n- `--environment` 枚举：`dev` / `online`，**不传则由服务端按应用是否开启多环境自动选择（多环境→`dev`，未开启多环境→`online`）**；要固定环境就显式传 `--environment dev|online`。**未开启多环境的应用显式传 `--environment dev` 会报错（无 dev 分支）——这类应用不传 `--environment`（走 `online`）或显式 `--environment online`**。旧名 `--env` 已**移除**：传入会报 validation 错（提示改用 `--environment`），一律用 `--environment`。\n- risk 是 `high-risk-write`（SQL 可含 DML/DDL）：任何执行都需 `--yes`，否则返回 `confirmation_required` / exit 10。`--dry-run` 预览不需要 `--yes`。\n- **不会自动为你包事务，事务边界需自己在 SQL 里控制**：多语句默认逐条独立提交，中间某条失败时前序语句已生效、不会回滚；若需要「要么全部成功、要么全部回滚」的原子性，请在 SQL 内显式写 `BEGIN … COMMIT`（详见下「Agent 规则」）。\n\n## 示例\n\n```bash\nlark-cli apps +db-execute --app-id app_xxx --environment dev --sql \"select * from orders limit 5\" --yes\nlark-cli apps +db-execute --app-id app_xxx --environment dev --file ./migration.sql --dry-run\n# 绝对路径文件 / cwd 不固定：经 stdin 传入\nlark-cli apps +db-execute --app-id app_xxx --environment dev --sql - --yes < /Users/.../migrations/0001_init.sql\n```\n\n## 输出契约\n\n- 成功默认 JSON 的 `data` 按 SQL 类型自适应（不透传后端原始串）：\n  - 单 SELECT → `data` 是行数组 `[{...}]`（空 → `[]`），直接 `-q '.data[].col'` 取字段。\n  - 单 DML → `data = {command, rows_affected}`（如 `{\"command\":\"INSERT\",\"rows_affected\":1}`）。\n  - 单 DDL → `data = {command}`（如 `{\"command\":\"CREATE_TABLE\"}`）。\n  - 多语句 → `data` 是元素数组：SELECT 为 `{command:\"SELECT\", rows:[...]}`，DML 为 `{command, rows_affected}`，DDL 为 `{command}`。\n- pretty 会按 SELECT/DML/DDL 自适应渲染；多语句会逐条显示 Statement 摘要。\n- 失败返回 typed `error`（`type:\"api\"`、`subtype:\"server_error\"`、`code`、`message`、`hint`）：失败位置在 `message` 的「(at statement N of M)」；前序是否落地 / 是否整批回滚写在 `hint`——事务内失败「Transaction rolled back; no changes persisted.」；非事务多语句前序已落地「Earlier statements were committed and not rolled back; fix statement N and re-run the remaining statements.」；首句即失败（无前序落地）「No statements were applied; fix the SQL and re-run.」。据此决定整段重跑还是只跑剩余语句。\n\n## Agent 规则\n\n- 该命令为 high-risk-write，执行一律需 `--yes`；无 `--yes` 会返回 `confirmation_required` / exit 10。\n  - **只读查询、以及不删除/不丢失既有数据且可撤回的语句**：已授权时可直接带 `--yes` 执行。\n  - **会删除或丢失既有数据、或难以撤回的语句**：先 `--dry-run` 预览（无需 `--yes`），向用户确认后再带 `--yes` 执行；不要在用户不知情时自动补 `--yes`。\n- 多语句失败时，失败前的语句可能已经 commit 落地。不要整批重跑；按错误 message/hint 修失败语句，并从剩余语句继续。\n- 如果需要原子性，让用户在 SQL 内显式写 `BEGIN` / `COMMIT`，不要假设 CLI 会包事务。\n- 不要把数据库连接串从 env 中取出来裸连。\n\n---\n\n# 平台 SQL 规范\n\n上面讲命令怎么调，这里讲**该写出什么样的 SQL**：妙搭底层是 PostgreSQL + 一层平台约束（RLS、审计列、`user_profile` 复合类型、禁用 SQL 白名单），不符合会被服务端直接拒或建出行为不对的表。看表 / 看结构用 [`+db-table-list`/`+db-table-get`](lark-apps-db.md)，别手写系统表查询模拟。\n\n## 平台禁用 SQL（硬拒绝）\n\n以下命中会被服务端拒，`error`（`type:\"api\"`）的 message/hint 会说明原因——先按 hint 修再重试，不要反复重试同一句。\n\n| 类别 | 禁止 |\n|---|---|\n| 数据库级 | `CREATE / DROP / ALTER DATABASE` |\n| Schema 级 | `CREATE / DROP SCHEMA` |\n| 用户 / 角色级 | `CREATE / DROP USER`、`CREATE / DROP / ALTER ROLE` |\n| Owner 切换 | `REASSIGN OWNED` / `DROP OWNED` |\n\n## 建表规范（CREATE TABLE）\n\n新建业务表必须：4 个审计列 + 启用 RLS + 4 条默认 policy，**放在同一次 `+db-execute` 调用里**（RLS / policy / COMMENT / INDEX 一起）。裸表名，不写 `public.` 或 schema 前缀。\n\n```sql\nCREATE TABLE IF NOT EXISTS <table> (\n  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n  -- ... 业务列 ...\n  name varchar(100) NOT NULL,\n  _created_at TIMESTAMP(3) WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  _created_by user_profile DEFAULT (\n    CASE\n      WHEN current_setting('app.user_id', TRUE) = '' THEN NULL\n      ELSE concat('(', current_setting('app.user_id', TRUE), ')')::user_profile\n    END\n  ),\n  _updated_at TIMESTAMP(3) WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  _updated_by user_profile DEFAULT (\n    CASE\n      WHEN current_setting('app.user_id', TRUE) = '' THEN NULL\n      ELSE concat('(', current_setting('app.user_id', TRUE), ')')::user_profile\n    END\n  )\n);\n\nALTER TABLE <table> ENABLE ROW LEVEL SECURITY;\n\nCREATE POLICY service_role_bypass_policy ON <table>\n  TO service_role USING (true);\n\nCREATE POLICY \"修改全部数据\" ON <table>\n  AS PERMISSIVE FOR ALL TO authenticated USING (true);\n\nCREATE POLICY \"查看全部数据\" ON <table>\n  AS PERMISSIVE FOR SELECT TO authenticated, anon USING (true);\n\nCREATE POLICY \"修改本人数据\" ON <table>\n  AS PERMISSIVE FOR ALL TO authenticated USING (\n    (current_setting('app.user_id'::text) = ANY (ARRAY[]::text[]))\n    AND (current_setting('app.user_id'::text) = ((_created_by).user_id)::text)\n  );\n```\n\n建表流程：先 `+db-table-list` / `+db-table-get` 确认表不存在或看现有结构 → 生成 DDL → 向用户展示影响并取得授权 → `+db-execute ... --yes` 执行。\n\n## 审计列\n\n- 平台自动维护的四列固定叫 `_created_at` / `_updated_at` / `_created_by` / `_updated_by`（**下划线开头**）。查询 / 排序 / 过滤一律用这些名字，别写 `created_at`。\n- `_created_at` / `_updated_at` 在 INSERT 时可省略（有默认值）；需要业务归属时显式写 `_created_by` / `_updated_by`。\n- UPDATE 业务字段时建议同步 `_updated_at = CURRENT_TIMESTAMP` 和 `_updated_by`。\n\n## `user_profile` 复合类型\n\n平台内置类型 `(user_id varchar, name varchar, email varchar, avatar text, status integer)`，无需创建。**业务 SQL 只允许访问 `(field).user_id`**，不要依赖 `name` / `email` / `avatar` / `status`（可能为空或过期）。\n\n```sql\n-- 写入 / 更新：用 ROW()::user_profile，更新时替换整个字段，不改单个属性\nINSERT INTO teacher (teacher_profile, class_id)\nVALUES (ROW('<user_id>')::user_profile, gen_random_uuid());\n\nUPDATE teacher SET teacher_profile = ROW('<user_id>')::user_profile\nWHERE (teacher_profile).user_id = '<old_user_id>';\n\n-- 查询 / 过滤：解引用取 user_id；raw SQL 返回给前端前必须解引用，别直接返回复合类型\nSELECT (teacher_profile).user_id AS teacher_profile, class_id FROM teacher;\n\n-- 索引 / 唯一性：表达式列用三重括号；表达式唯一性用 CREATE UNIQUE INDEX，\n-- 不能用 ALTER TABLE ADD CONSTRAINT UNIQUE（不支持表达式列）\nCREATE INDEX idx_teacher_user_id ON teacher (((teacher_profile).user_id));\nCREATE UNIQUE INDEX uk_teacher_user_id ON teacher (((teacher_profile).user_id));\n```\n\n## DDL 规则\n\n| 场景 | 做法 |\n|---|---|\n| 加列 | `ALTER TABLE <t> ADD COLUMN IF NOT EXISTS <col> <type>`，相关 `COMMENT ON` 同次执行 |\n| 加索引 | `CREATE INDEX IF NOT EXISTS idx_<t>_<cols> ON <t>(...)` |\n| JSONB 类型声明 | 必须 `COMMENT ON COLUMN <t>.<col> IS '@type { ... }'` 声明 TypeScript 类型，和 CREATE / ALTER 同次调用 |\n| 加 NOT NULL 列 | 必须带 `DEFAULT` 让存量行自动填：`ADD COLUMN <col> <type> NOT NULL DEFAULT <值>` |\n| 删表 / 删列 | 有业务数据默认禁止；必须用户明确授权后才执行，并说明数据丢失风险 |\n| 强约束 | `UNIQUE` / `FOREIGN KEY` / `NOT NULL` 默认谨慎，不确定不加 |\n\n**多环境库加约束前先查 online 存量**：`dev` 干净不代表 `online` 干净，约束发布到 online 会撞线上存量数据而失败。发布前一律先用 `--environment online` 查清楚，按约束类型分三种：\n\n- **加唯一约束（`UNIQUE` / 唯一索引）**：线上不能有重复值。先查重复，有则先清理再加：\n\n  ```bash\n  lark-cli apps +db-execute --app-id app_xxx --environment online --sql \\\n    \"SELECT <cols>, count(*) FROM t GROUP BY <cols> HAVING count(*) > 1\" --yes\n  ```\n\n- **已有列改 `NOT NULL`（收紧约束）**：线上该列不能有 NULL。先查 NULL 行数，有就先回填（`UPDATE t SET <col> = <默认值> WHERE <col> IS NULL`）再加约束：\n\n  ```bash\n  lark-cli apps +db-execute --app-id app_xxx --environment online --sql \\\n    \"SELECT count(*) FROM t WHERE <col> IS NULL\" --yes\n  ```\n\n- **新加 `NOT NULL` 字段**：必须带 `DEFAULT`，且要求线上该表**无存量数据**，否则发布报错。线上已有数据时别直接加，改走三步安全变更：先 `ADD COLUMN <col> <type>`（可空）→ 回填 `UPDATE t SET <col> = <值>` → 再 `ALTER COLUMN <col> SET NOT NULL`。先查线上行数判断走哪条：\n\n  ```bash\n  lark-cli apps +db-execute --app-id app_xxx --environment online --sql \\\n    \"SELECT count(*) FROM t\" --yes\n  ```\n\n## SELECT 规则\n\n| 规则 | 要求                                                               |\n|---|------------------------------------------------------------------|\n| 行数 | 结果集有硬上限（平台限制 1000 行），超限**报错而非静默截断**；大表必须显式 `LIMIT`、聚合或游标分页       |\n| 分页 | 大表优先游标分页 `WHERE id > <last_id> ORDER BY id LIMIT n`，避免大 `OFFSET` |\n| user_profile | 返回给前端前解引用：`(owner).user_id AS owner`                             |\n| 统计 | 总数用 `count(*)`、分组用 `GROUP BY`，别把全量拉到 agent 侧再统计                  |\n| 慢查询 | 用 `EXPLAIN (ANALYZE, BUFFERS)`；大表 Seq Scan 考虑加索引                 |\n\n## DML 规则\n\n**INSERT**\n- UUID 主键省略，交给 `DEFAULT gen_random_uuid()`；外键 UUID 用子查询取父表 id，不手写。\n- NOT NULL 且无默认值的列必须给值；批量 INSERT 每行列数一致。\n- 需要幂等用 `ON CONFLICT ... DO NOTHING / DO UPDATE`。\n- 标量子查询必须保证单行，非唯一条件加 `ORDER BY ... LIMIT 1`。\n\n**UPDATE**\n- **必须有明确 `WHERE`，禁止无条件 UPDATE**。\n- 用户说「修改 / 更新 / 改一下」数据时用 UPDATE，**禁止 DELETE + INSERT** 模式。\n- 更新 `user_profile` / 复合类型时替换整个字段。\n- 批量更新前影响范围不明确，先 `SELECT count(*)` 给用户确认。\n\n**DELETE / TRUNCATE**（属会丢数据的高影响操作，按上面「Agent 规则」的确认流程走）\n- 已有表 / 已有数据默认禁止；先 `SELECT count(*)` 展示命中行数、取得用户明确授权，再带 `--yes` 执行。\n- `TRUNCATE` 影响整表，视同高风险删除。\n\n```sql\nUPDATE task\nSET status = 'done', _updated_at = CURRENT_TIMESTAMP, _updated_by = ROW('<user_id>')::user_profile\nWHERE id = (SELECT id FROM task WHERE title = '梳理需求' ORDER BY _created_at DESC LIMIT 1);\n```\n\n## 常见 PostgreSQL 陷阱\n\n| 陷阱 | 正确做法 |\n|---|---|\n| 表名带 schema 前缀 | 业务表一律裸表名 `FROM orders`，别写 `public.orders` |\n| 保留字作标识符 | 避免 `user` / `order` / `desc` / `offset` / `references` 等 |\n| 内联 COMMENT | 禁止 `col TEXT COMMENT 'xx'`，用独立 `COMMENT ON COLUMN` |\n| 手写系统表查结构 | 常规结构查询用 `+db-table-list` / `+db-table-get`，别手写 `information_schema` / `pg_indexes` 模拟 |\n| 空数组类型不明 | 写 `ARRAY[]::text[]` 或 `'{}'::text[]` |\n| `ROUND` 报错 | 用 `ROUND(num::numeric, n)` 或 `ROUND(num::double precision)` |\n| `DISTINCT` + 窗口函数 | 分两层查询，先 DISTINCT 再窗口函数 |\n| MySQL 方言 | 不用 `SHOW TABLES` / `DESCRIBE` / 内联 `COMMENT`；用 `+db-table-*` 和 `COMMENT ON` |\n| 多语句以为自动回滚 | `A; B; C` 不自动包事务，B 失败时 A 已提交；要原子性显式 `BEGIN; ... COMMIT;`（见上「命令骨架」「Agent 规则」） |\n\n## 数据类型与设计\n\n| 项目 | 规则 |\n|---|---|\n| 主键 | 默认 `id uuid PRIMARY KEY DEFAULT gen_random_uuid()` |\n| 命名 | 表名单数、全小写、snake_case、无冗余后缀 |\n| 枚举 / 状态 | 用 `varchar(255)`，值用小写英文 + 下划线 |\n| JSONB | 必须 `COMMENT ON COLUMN ... IS '@type { ... }'` 声明类型 |\n| 附件 / 图片 | URL 用 `TEXT`，命名 `xxx_url` |\n| 约束 | `UNIQUE` / `FOREIGN KEY` / `NOT NULL` 默认谨慎，新增 NOT NULL 列优先带 `DEFAULT` |\n","skills/lark-apps/references/lark-apps-db.md":"# apps db 域命令\n\n管理妙搭应用数据库：看表与结构、初始化与发布多环境、数据搬运、变更治理、时间点恢复、用量。逐条跑 SQL（SELECT/DML/DDL）走 [`+db-execute`](lark-apps-db-execute.md)（单独一篇）。运行时命令事实以 `lark-cli apps +<cmd> --help` 为准；认证、`--as user`、exit 码、`_notice` 等通用处理见 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 与本域 [`SKILL.md`](../SKILL.md)。\n\n## 何时用\n\n用户要看应用里有哪些表 / 某张表的结构、把单库应用拆成 dev/online 多环境、把数据导进导出表、查谁在什么时候改了表结构或表数据、开关行级审计、把开发环境的库结构发布到线上、把库恢复到过去某个时间点、或看数据库用量时。逐条执行 SQL 走 [`+db-execute`](lark-apps-db-execute.md)；文件存储（上传/下载文件）走 [`lark-apps-file.md`](lark-apps-file.md)。**建表 / 改表 / 写 SQL 的平台内容规范**（审计列、RLS、`user_profile`、禁用 SQL、PG 陷阱）见 [`lark-apps-db-execute.md`](lark-apps-db-execute.md) 的「平台 SQL 规范」。\n\n## 命令一览\n\n| 命令 | 做什么 | 关键参数 |\n|---|---|---|\n| `+db-table-list` | 列出某环境的数据表 | `--environment`、`--page-size`/`--page-token` |\n| `+db-table-get` | 看单张表的结构（字段/索引/约束/DDL） | `--table`、`--environment`、`--format` |\n| `+db-env-create` | 把单库应用初始化为 dev/online 多环境（高危） | `--environment`、`--sync-data`、`--yes` |\n| `+db-data-export` | 把一张表的数据导出到本地文件 | `--table`、`--output`、`--limit`、`--environment` |\n| `+db-data-import` | 把本地 csv/json 文件导进一张表（高危） | `--file`、`--table`、`--environment`、`--yes` |\n| `+db-sync-create` | 预览或创建 Base 到应用数据库的同步任务（高危） | `--config`、`--preview`、`--output`、`--environment`、`--yes` |\n| `+db-sync-list` | 列出 Base 同步任务 | `--mode`、`--status`、`--table`、`--page-size`/`--page-token`、`--environment` |\n| `+db-sync-get` | 查看同步任务配置、状态、统计和 warnings | `--task-id` |\n| `+db-sync-enable` | 启用 streaming 同步任务 | `--task-id` |\n| `+db-sync-disable` | 停用 streaming 同步任务 | `--task-id` |\n| `+db-sync-update` | 修改 streaming 同步任务映射配置（高危） | `--task-id`、`--config`、`--yes` |\n| `+db-sync-delete` | 删除 streaming 同步任务，保留目标数据（高危） | `--task-id`、`--yes` |\n| `+db-changelog-list` | 查表结构变更（DDL）历史 | `--table`、`--change-id`、`--since`/`--until`、`--environment` |\n| `+db-audit-status` | 看哪些表开了行级审计、保留期 | `--table`、`--environment` |\n| `+db-audit-enable` | 给某表开启行级变更审计 | `--table`、`--retention`、`--environment` |\n| `+db-audit-disable` | 关闭某表的行级审计 | `--table`、`--environment` |\n| `+db-audit-list` | 列出表的行级变更事件（增删改追溯） | `--table`（可重复）、`--since`/`--until`、`--environment` |\n| `+db-env-diff` | 预览开发环境待发布到线上的结构变更 | `--app-id` |\n| `+db-env-migrate` | 把开发环境的结构变更发布到线上（高危） | `--app-id`、`--yes` |\n| `+db-recovery-diff` | 预览把库恢复到某时间点会带来的变更 | `--target` |\n| `+db-recovery-apply` | 把库恢复到某个时间点、覆盖当前数据（高危） | `--target`、`--yes` |\n| `+db-quota-get` | 查数据库存储用量 | `--environment` |\n\n## 约定（先读）\n\n- **环境 `--environment dev|online`（可省略）**：看表、看结构、数据导入导出、变更追溯、审计、配额都按环境区分。省略 `--environment` 时 CLI 不带该参数、由服务端按应用形态自动选分支——多环境应用走 `dev`、未开多环境的走 `online`；要固定环境就显式传。唯一会报错的组合：对未开多环境的应用显式传 `--environment dev`（无 `dev` 分支）。写操作建议先在 `dev` 验（仅多环境应用有 `dev`）。旧名 `--env` 已**移除**：传入会报 validation 错（提示改用 `--environment`），一律用 `--environment`。`+db-env-diff`/`+db-env-migrate` 是「dev→online 发布」语义，**没有** `--environment`。\n- **本地文件 / `--output` 用工作目录内相对路径**：导入 `--file ./orders.csv`、导出 `--output ./out.csv`；绝对路径、或经 `..`/符号链接越出工作目录的 `--output` 会被拒（validation / exit 2）。路径在别处先 `cd` 过去或改成相对路径。\n- **高危操作必须带 `--yes`**：`+db-env-create`、`+db-data-import`、`+db-env-migrate`、`+db-recovery-apply`、`+db-sync-create`、`+db-sync-update`、`+db-sync-delete` 缺省会被确认关卡拦下；动手前先用对应的预览命令或 `--dry-run` 看清影响。`+db-sync-create --preview` 只解析/校验配置、不落库，免确认、不需 `--yes`；真正建任务（不带 `--preview`）才需要 `--yes`。\n- **Base 同步不是整库任务**：`+db-sync-create` 一次只处理一张 Base 表到一张目标表。用户说“整库”“客户、订单、回款三张表都同步”时，先明确告诉用户会拆成三套独立配置、三次 preview、用户确认后三次 create；不要暗示一个同步任务能覆盖整个 Base。\n- **batch 任务不能重新启用**：用户说“批量任务重新启用”“operation-not-allowed”时，先给结论：batch/import 是一次性任务，不能 enable。不要先陷入授权排障而漏掉这个结论；授权缺失时也要说明授权完成后应 `+db-sync-get` 查状态/结果，持续同步要新建 streaming。\n- **时间参数按口语自然传**（`--since`/`--until`/`--target`），格式见末尾。\n\n## 各命令\n\n### 表与结构\n\n**`+db-table-list`**：列出某环境的数据表。分页 `--page-size`（默认 20）/ `--page-token`（上一页 cursor）。每项给表名、描述、估算行数、大小、列数；要完整列定义 / 索引 / 约束用 `+db-table-get`。只知道业务对象名时，先用它定位可能的表名。\n\n```bash\nlark-cli apps +db-table-list --app-id app_xxx\nlark-cli apps +db-table-list --app-id app_xxx --environment dev --page-size 50\n```\n\n**`+db-table-get`**：看单张表的结构。默认 JSON 给结构化的字段 / 索引 / 约束 / 估算行数 / 大小；`--format pretty` 直接输出建表 DDL 文本（给用户看建表语句或做迁移参照时用）。\n\n```bash\nlark-cli apps +db-table-get --app-id app_xxx --table orders\nlark-cli apps +db-table-get --app-id app_xxx --table orders --environment dev --format pretty\n```\n\n### 多环境数据库（初始化 + 发布）\n\n**`+db-env-create`（高危）**：把存量单库应用初始化为 dev/online 两套库，不可逆，必须带 `--yes`。`--environment` 目前只支持 `dev`（默认 `dev`）；`--sync-data` 把现有 online 数据复制到新环境（不传则不复制）。注意：`+create --app-type full_stack` 新建的应用通常已自带多环境，重复初始化会返回冲突错误（应用已是多环境）——按 `error.hint` 转述状态即可，别重复初始化。\n\n```bash\nlark-cli apps +db-env-create --app-id app_xxx --environment dev --dry-run\nlark-cli apps +db-env-create --app-id app_xxx --environment dev --sync-data --yes\n```\n\n**`+db-env-diff`**：预览开发环境里待发布到线上的表结构变更，不落地。发布前先看这个。无待发布变更时明确返回「无变更」。\n\n**`+db-env-migrate`（高危）**：把开发环境的结构变更正式发布到线上，不可逆，必须带 `--yes`，返回实际发布的变更条数。发布是异步的，命令会等到完成再返回结果。\n\n> 预览与发布同一端点，故 `+db-env-diff` 也需 `spark:app:write` scope（不是纯只读权限）。\n\n**发布审批拦截**：若应用的发布配置了审批，`+db-env-migrate` 会被服务端拒绝（`feature_not_available`，exit 1）。这**不是**参数问题：换 flag、重试都不会成功，也不要去跑 `+db-env-create`。改走应用发布：先向用户确认发布理由，再执行 `lark-cli apps +release-create --app-id <app_id> --apply-reason \"<已向用户确认的发布理由>\"`；也可以让用户在页面上发布。只有真发布被拦，`+db-env-diff` 预览照常可用。\n\n```bash\nlark-cli apps +db-env-diff --app-id app_xxx\nlark-cli apps +db-env-migrate --app-id app_xxx --yes\n```\n\n### 数据导入导出\n\n**`+db-data-export`**：把一张表导出到本地文件。导出格式**只由 `--output` 的扩展名决定**——`.csv` / `.json` / `.sql`，缺省按 `<表名>.csv` 落在当前目录。注意：全局 `--format json|pretty` 只控制**命令自身输出**（成功摘要 / 错误信封）的渲染，**不影响导出文件的格式**；`--output` 后缀必须是 `.csv/.json/.sql` 之一，否则报 validation 错误（exit 2），且不支持导出到 stdout。两道体量约束：\n\n- `--limit`（1..5000，默认 5000）是**行数上限守卫**：表的行数超过它会被整体拒掉（不是「只导前 N 行」）；\n- 导出产物 >1 MB 也会被拒。\n\n超大表别硬导：先用 `+db-execute` 加 `WHERE` / `LIMIT` 缩小范围、分批导。\n\n```bash\nlark-cli apps +db-data-export --app-id app_xxx --table orders --output ./orders.csv\nlark-cli apps +db-data-export --app-id app_xxx --table orders --output ./orders.json --environment dev\n```\n\n**`+db-data-import`（高危）**：把本地 csv/json 文件的数据导进表。文件需是 `.csv`/`.json`、≤1 MB，必须带 `--yes`。目标表缺省取文件名去掉**最后一个**扩展名（如 `orders.csv`→`orders`，`orders.2026.csv`→`orders.2026`）；文件名带点号时建议显式传 `--table` 以免落到意外的表名。\n\n```bash\nlark-cli apps +db-data-import --app-id app_xxx --table orders --file ./orders.csv --environment dev --yes\n```\n\n**导入/导出限额**：体积 ≤ **1 MB**、行数 ≤ **5000**，导入导出都一样，超限会被拒。超限就分批——导入拆成 ≤1 MB / ≤5000 行的多个文件，导出用 `WHERE` / `LIMIT` 缩小范围。\n\n### Base 数据同步\n\nBase 数据同步走 `+db-sync-*`，和本地文件导入不同：`+db-data-import` 只处理本地 `.csv/.json` 文件；Base 链接、Base 表、字段映射、持续同步任务都走 `+db-sync-create` / `+db-sync-update`。\n\n**任务类型**：\n- `mode=batch`：一次性任务。`schema_only=true` 只建目标表；`schema_only=false` 建表或写入已有表并导入当前 Base 数据。完成后不能 enable/disable/update/delete。\n- `mode=streaming`：持续同步任务。首次同步后持续处理 Base 变化，可 enable/disable/update/delete。\n\n**环境（重要）**：`+db-sync-*` 命令省略 `--environment` 时默认落 **online**（不同于 `+db-table-*`/`+db-audit-*` 等「多环境自动选 dev、单环境选 online」的规则——db-sync 家族不走自动选分支）。**多环境应用建表**（`target.table.action=create`）**必须显式 `--environment dev`**：不填或填 `online` 会被 online 分支的 DDL 禁令拒（`k_dl_4000001：forbid ddl/dcl operation in online env`），因为 online 分支产品上不允许直接建表，建表要落到 dev 分支。共享库 / 单环境应用只有 online、在 online 建表正常成功（不会报 `k_dl_4000001`），省略 `--environment` 或填 `online` 均可。\n\n**配置格式**：只通过 `--config` 传完整 JSON，支持内联 JSON、`@file`、`-` stdin。配置 key 使用复数：`field_maps`、`option_mappings`、`syncable_source_fields`。不要写单数 `field_map` / `option_mapping`，CLI 会直接报 validation 错。正式 create 时 `field_maps` **可省略或传空数组**：服务端会使用与 preview 相同的逻辑自动匹配字段并直接创建任务；若显式传了映射，则至少要有一项未写成 `\"enabled\": false`，写了却全部关闭会被 CLI 拒绝。`+db-sync-update` 仍要求至少一个启用的 `field_maps`，因为 update 的语义是修改既有映射。`target.table.action` 只能是 `create` 或 `use_existing`：建表时 `pg_field` 需要完整字段定义；写已有表时通常只需目标列名。`source.base_url`（源 Base 表完整 URL）在 `+db-sync-create` 必填、由服务端强制；`+db-sync-update` 可选——省略时服务端复用原任务的源 URL，仅在换源 / 替换成另一张 Base 表时才需要传新的 `base_url`。`source.table.name` 是要同步的 Base 表名。`base_url` 形如 `https://.../base/<token>?table=<tableId>`：`token` 定位 Base，`table=` 参数（tableId）定位表。填了 `source.table.name` 就以 name 为准——服务端用 `token + name` 反查 tableId（覆盖 url 里的 `table=` 参数）；不填才用 url 的 `table=` 参数定位。所以用户自然语言里说「同步 xxx 表」「把 xxx 表同步过去」时，一定要把「xxx」填进 `source.table.name`，不要只给 `base_url`——尤其当 `base_url` 不带 `table=` 参数（指向不带具体表的 Base）时，漏了 name 服务端无从定位表。\n\n**不知道要同步哪张表**：若 `base_url` 只有域名+token、不带 `?table=` 参数，又不确定表名，别硬猜。先用 `lark-cli base +table-list --base-token <token>` 列出该 Base 的所有表（`<token>` 就是 `base_url` 里 `/base/` 后面那段），把表名给用户选定，再填进 `source.table.name`（或改用带 `?table=<table_id>` 的完整 URL）。`+db-sync-create` 会在本地就拦下「`base_url` 无 `?table=` 且 `source.table.name` 空」的配置（提交前即报 validation 错，不送到服务端）。\n\n**单数 key 恢复**：如果用户说配置里 `field_map` 是单数、`option_mapping` 是单数、或字段映射可能不生效，不要把原配置直接提交。先找到用户这份同步配置，做这三步：\n\n1. 只把已知 key 改成复数：`field_map` -> `field_maps`，`option_mapping` -> `option_mappings`；不要发明 `fieldMappings` / `mapping` 之类字段名。\n2. 检查 `field_maps` 是数组，且至少有一项 `enabled` 缺省或为 `true`。如果全是 `\"enabled\": false`，先让用户确认要启用哪几项，再继续。\n3. 修好后先重新 preview，或复用最近一次 preview `--output` 产出的 `data.config`，再继续 create / update。\n\n```bash\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @sync.json --preview --output ./resolved-sync.json\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @resolved-sync.json --yes\n```\n\n如果本地找不到配置文件，不要只停在“请提供文件”。先说明恢复来源：让用户贴失败时传入的 JSON，或查找最近 preview 的 `--output` 文件；如果是已有任务的修改，先用 `+db-sync-get` 取回当前任务配置，再基于它修正后 update：\n\n```bash\nlark-cli apps +db-sync-get --app-id app_xxx --task-id streaming_123 -q '.data | {mode, source, target, field_maps}' > sync.json\nlark-cli apps +db-sync-update --app-id app_xxx --task-id streaming_123 --environment dev --config @sync.json --yes\n```\n\n**推荐流程（最佳实践，不是强制）**：优先先 preview，再让用户确认映射，最后用 preview 输出的完整 config 正式创建；这样最稳，也避免手写复杂 `field_maps`。若用户明确要求直接执行、不需要 preview，也可以在 create config 中省略 `field_maps`（或传空数组），由服务端自动匹配并直接创建任务；CLI 不应为了拿 mapping 强制用户先 preview。\n\n```bash\nlark-cli apps +db-sync-create \\\n  --app-id app_xxx \\\n  --environment dev \\\n  --config - \\\n  --preview \\\n  --output ./resolved-sync.json <<'JSON'\n{\n  \"mode\": \"streaming\",\n  \"source\": {\n    \"type\": \"base\",\n    \"base_url\": \"https://example.feishu.cn/base/xxx\",\n    \"table\": {\"name\": \"客户\"}\n  },\n  \"target\": {\n    \"type\": \"postgresql\",\n    \"table\": {\"name\": \"customers\", \"action\": \"use_existing\"}\n  }\n}\nJSON\n```\n\npreview 返回 `data.config`、`syncable_source_fields` 和 `summary`。`--output` 只把 `data.config` 写入文件，文件可直接作为正式输入：\n\n```bash\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @resolved-sync.json --yes\nlark-cli apps +db-sync-get --app-id app_xxx --task-id streaming_123\n```\n\n**多表 Base**：本命令一次只处理一张表。用户要同步整个 Base 时，先把计划说清楚：不是一个“整库同步任务”，而是按表拆成 N 个单表任务。每张表各有一份配置文件、一次 `+db-sync-create --preview`、一次用户确认后的 `+db-sync-create --yes`，并记录各自 `task_id`。\n\n```bash\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @customers-sync.json --preview --output ./customers-resolved.json\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @orders-sync.json --preview --output ./orders-resolved.json\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @payments-sync.json --preview --output ./payments-resolved.json\n```\n\n配置也必须是单表粒度：每份 JSON 只有一个 `source.table` 和一个 `target.table`，字段名保持 `field_maps`、`option_mappings`、`syncable_source_fields` 这些复数 key。\n\n**修改 streaming 映射**：先用 get 导出当前配置，编辑 `field_maps` 后 update。update 是高危操作，必须经用户确认再加 `--yes`。\n\n`+db-sync-get` 返回的 `source` **不含 `base_url`**（只有 token / tableId，服务端没有 domain 拼不出完整 URL），这是正常的。原表 update 直接省略 `base_url` 即可；只有要换成另一张 Base 表时，才在 config 里显式补一个新的 `base_url`。不要为了\"补全\" `base_url` 而编造 domain 或拼接 URL——拿不到就省略，让服务端复用原任务的源 URL。\n\n`+db-sync-update` 也遵循 db-sync 家族「省略 `--environment` 落 online」的规则，所以改 dev 上的任务必须显式带该任务所在环境的 `--environment`（多环境应用的 streaming 任务通常在 `dev`），否则会错落 online、找不到任务或改错分支。\n\n```bash\nlark-cli apps +db-sync-get --app-id app_xxx --task-id streaming_123 -q '.data | {mode, source, target, field_maps}' > sync.json\nlark-cli apps +db-sync-update --app-id app_xxx --task-id streaming_123 --environment dev --config @sync.json --yes\n```\n\n**列表与生命周期**：\n\n```bash\nlark-cli apps +db-sync-list --app-id app_xxx --mode streaming --table customers\nlark-cli apps +db-sync-disable --app-id app_xxx --task-id streaming_123\nlark-cli apps +db-sync-enable --app-id app_xxx --task-id streaming_123\nlark-cli apps +db-sync-delete --app-id app_xxx --task-id streaming_123 --yes\n```\n\n`+db-sync-enable`、`+db-sync-disable`、`+db-sync-update`、`+db-sync-delete` 只适用于 `streaming_...` task。对 `batch_...` 执行这些操作会返回 failed-precondition。\n\n**batch 任务 operation-not-allowed 恢复**：用户说“批量任务重新启用”“导入历史订单表的任务重新 enable”“系统说操作不允许”时，先给生命周期结论：batch / import 类任务是一次性任务，完成或失败后不能重新启用，也不要反复调用 `+db-sync-enable`。下一步改为查状态和结果：\n\n```bash\nlark-cli apps +db-sync-get --app-id app_xxx --task-id batch_123\n```\n\n把 `status`、`result`、`warnings` 和目标表写入情况告诉用户。若用户要的是后续持续同步，不是“重启这个 batch”，应新建 `mode=streaming` 任务：先 `+db-sync-create --preview` 给用户确认映射和影响，再带 `--yes` 创建；不要强行 enable 已完成的 batch 任务。若此时 CLI 还缺授权，仍要先解释这个生命周期边界，再提示授权完成后用 `+db-sync-get` 查结果。\n\n**失败恢复**：看到 `warnings` 不要直接说同步成功。按 warning 或 error 的 `hint` 继续排查，恢复路径按任务 mode 分支：\n\n- **streaming 任务**：常见路径是 `+log-list --keyword <target_table>` / `+log-get` 查日志，然后用 `+db-execute` 修目标表结构，或用 `+db-sync-update`（带该任务所在环境的 `--environment`）修字段映射，最后对同一 `task_id` 再 `+db-sync-get` 复查。\n- **batch 任务**：batch 是一次性任务、**不能 update**（见上文生命周期）。修完目标表结构（`+db-execute`）后不要 update 原 batch，而是重新 `+db-sync-create --preview` 建新任务；只想看这个 batch 的结果就直接 `+db-sync-get`。\n\n若此时 CLI 还缺授权、查不到 warning 详情，也不要只给泛化的字段核对建议：先说明被授权卡住，再把对应 mode 的固定命令链作为授权完成后的下一步明确交代给用户。\n\n**online 禁 DDL（`k_dl_4000001`）恢复**：`+db-sync-create` 建表报 `k_dl_4000001：forbid ddl/dcl operation in online env` 时，这必然是多环境应用（共享库在 online 建表不会报此码）。online 分支**本就不允许**直接建表，这是多环境应用的产品设计、不是可绕过的限制。改用 `--environment dev` 重跑 `+db-sync-create`，把表建到 dev 分支；不要试图「在 online 想办法重试建表」，没有这个选项。\n\n**缺 Base 表记录 ID 映射列（`400002477`）恢复**：streaming 自动同步要求目标表有一个映射给「Base 表记录 ID」的 **text + 单值 + unique** 列。用 `action=use_existing` 写已有表时，若该表没有这样的列，会报 `400002477`（Field mapping must include 'Base 表记录 ID'）。先用 `+db-execute` 给表加一个，如 `ALTER TABLE <表> ADD COLUMN base_record_id varchar UNIQUE`，再把它映射给「Base 表记录 ID」、重跑 `+db-sync-create --preview`。注意这是**加列**、不是建表，不需要审计列 / RLS 那套建表规范。\n\n### 变更追溯与审计\n\n**`+db-changelog-list`**：查表结构变更（DDL）历史——谁、什么时候、改了哪张表、做了什么。可按 `--table` 过滤、按 `--change-id` 精确定位某条、用 `--since`/`--until` 圈时间区间，分页 `--page-size`/`--page-token`。\n\n```bash\nlark-cli apps +db-changelog-list --app-id app_xxx --table orders --since 7d\n```\n\n**`+db-audit-status`**：看审计开关状态。给 `--table` 看单表，不给则列出所有已配置的表（开没开、保留期）。\n\n**`+db-audit-enable` / `+db-audit-disable`**：开 / 关某张表的行级变更审计。`--retention` 设保留期，取值 `7d`/`30d`/`180d`/`360d`/`forever`（默认 `7d`）。不要对已经开启审计的表重复 enable——不确定就先用 `+db-audit-status` 查。\n\n```bash\nlark-cli apps +db-audit-enable --app-id app_xxx --table orders --retention 30d\nlark-cli apps +db-audit-disable --app-id app_xxx --table orders\n```\n\n**`+db-audit-list`**：列出表的行级变更事件（INSERT/UPDATE/DELETE 的前后值与操作人）。`--table` 必填、可重复传多张表；`--since`/`--until` 圈时间。\n- **多表查询**：会先帮用户把不存在、或没开审计的表过滤掉再查，被过滤的表及原因列在结果的 `skipped` 里——据此告诉用户哪些表没纳入及为什么。\n- **单表查询**：不预过滤，表不存在 / 未开审计会直接报错（按 `error.hint` 转述给用户，引导先 `+db-audit-enable`）。\n\n```bash\nlark-cli apps +db-audit-list --app-id app_xxx --table orders --since 24h\nlark-cli apps +db-audit-list --app-id app_xxx --table orders --table users\n```\n\n### 时间点恢复（PITR）\n\n**`+db-recovery-diff`**：预览把库恢复到 `--target` 时间点会带来哪些变更（受影响的表、行数、预计耗时），不落地。同样需 `spark:app:write` scope。\n\n**`+db-recovery-apply`（高危）**：把库恢复到某个时间点，**会覆盖当前数据**，不可逆，必须带 `--yes`。\n\n- 可恢复窗口最长 **7 天**，且不早于**最近一次 `+db-env-migrate`**；超出窗口的目标会被拒。\n- 目标时间点与当前库一致时返回 `no_changes`（空操作），不算失败。\n- 动手前务必先 `+db-recovery-diff` 给用户确认。\n\n```bash\nlark-cli apps +db-recovery-diff --app-id app_xxx --target 2h\nlark-cli apps +db-recovery-apply --app-id app_xxx --target 2026-04-15T10:00:00Z --yes\n```\n\n### 配额\n\n**`+db-quota-get`**：查数据库存储用量（已用量、表数、视图数；配额接入后还会给总配额与使用率）。\n\n```bash\nlark-cli apps +db-quota-get --app-id app_xxx --environment dev\n```\n\n## 时间格式（`--since` / `--until` / `--target`）\n\n按用户口语自然传入即可，支持：\n- 相对时间 `7d` / `2h` / `30s`（从现在往前推）\n- 日期 `2026-04-15`\n- 日期时间 `2026-04-15T10:00:00`\n- 带时区的 ISO 8601 `2026-04-15T10:00:00Z` / `2026-04-15T10:00:00+08:00`\n\n> **时区**：不带时区的 `日期` / `日期时间` 按**运行机器的本地时区**解析（再归一化到 UTC）。CI（UTC）与本地（如 UTC+8）跑同一条命令，时间边界会差几小时；要精确锁定时区时显式写 ISO 8601 带偏移（如 `...+08:00` / `...Z`）。`--target`（PITR 恢复）尤其建议带时区，避免恢复到非预期时间点。\n\n## Agent 规则\n\n- 用户说「本地 / 开发库 / 调试库」优先 `--environment dev`，线上排查用 `--environment online`；数据面写操作（导入 / 审计开关）建议先在 `dev` 验再动 `online`。**注意省略 `--environment` 时写操作会落到服务端选中的分支——单环境应用即 `online`（生产）**：不确定应用是否多环境时，写操作显式传 `--environment`；显式 `dev` 在单环境应用上会安全报错（无 dev 分支），正好当「是否多环境」的探针用。\n- 看表用 `+db-table-list`，看结构用 `+db-table-get`（要建表语句加 `--format pretty`）；`+db-env-create` 仅用于存量单库拆多环境，新建的 full_stack 应用一般不需要。\n- 高危命令（`+db-env-create`、`+db-data-import`、`+db-env-migrate`、`+db-recovery-apply`、`+db-sync-create`、`+db-sync-update`、`+db-sync-delete`）动手前先看清影响再带 `--yes`：发布 / 恢复先跑对应预览 `+db-env-diff` / `+db-recovery-diff`，Base 同步先跑 `+db-sync-create --preview`，导入无预览命令、可先 `--dry-run` 看请求或先在 `--environment dev` 验；不要静默追加 `--yes`，遇 confirmation_required（exit 10）按 lark-shared 协议向用户确认不可逆风险后再补 `--yes` 重试。\n- 导入 / 导出的本地路径用工作目录内相对路径；超大表导出会被行数 / 体积上限拒，改用 `+db-execute` 分批。\n- Base 同步优先走 preview → 用户确认 → create，这是最稳的最佳实践、不是强制。用户明确要求直接 create 时，可省略 `field_maps`（或传空数组）让服务端自动匹配并创建；不要为了拿 mapping 强制用户先 preview。显式写映射时使用 `field_maps` / `option_mappings` 复数 key。\n- 修复 Base 同步配置时，只把 `field_map` / `option_mapping` 改成 `field_maps` / `option_mappings`。若显式给了 `field_maps`，检查至少一个映射启用；全是 `\"enabled\": false` 时先让用户确认要启用哪项。create 也可删掉/置空 `field_maps` 交给服务端自动匹配，但 update 仍必须提供启用的映射。\n- `+db-sync-update` 省略 `source.base_url` 是合法的（服务端复用原任务源 URL）；`+db-sync-get` 不返回 `base_url` 属正常，不要因此编造 domain / 拼接 URL 去\"补全\"，只有换源 / 替换表时才传新的 `base_url`。`+db-sync-create` 的 `base_url` 必填，缺失由服务端报错。用户说「同步 xxx 表」时把「xxx」填进 `source.table.name`——填了 name 就以 name 为准（服务端用 `base_url` 的 token + name 反查 tableId，覆盖 url 的 `table=` 参数），不填才用 url 的 `table=` 参数定位；别只给 `base_url`。\n- batch 同步任务不能重新 enable。遇到 operation-not-allowed 先 `+db-sync-get` 查状态和结果；要持续同步就新建 streaming 任务，走 preview -> 用户确认 -> create。\n- `+db-sync-*` 省略 `--environment` 默认落 online。多环境应用建表（`action=create`）必须显式 `--environment dev`；省略或填 `online` 会撞 `k_dl_4000001`（online 禁 DDL）——那是多环境应用的产品设计，把表建到 dev 分支即可，不要在 online 重试建表。共享库应用在 online 建表正常，不受此限。\n- `+db-audit-list` 多表查询时，把结果里 `skipped` 的表（不存在 / 未开审计）连同原因一并向用户说明，不要让用户以为这些表「没有变更」。\n- 恢复是覆盖式且不可逆：`+db-recovery-apply` 前必须先 `+db-recovery-diff`，并明确告知用户会覆盖当前数据。\n","skills/lark-apps/references/lark-apps-env-pull.md":"# apps +env-pull\n\n> **前置条件：** 先阅读 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md)（认证 / 全局参数 / 安全）。\n\n把妙搭应用 dev 启动期环境变量拉取到本地项目根的 `.env.local`。身份固定 `--as user`；scope `spark:app:read`。`--app-id` 必填，目标项目根默认当前工作目录（`--project-path` 可指定）。\n\n这个命令是 dev-only 的本地恢复工具：内部固定 `POST env_vars`，body 为 `env=dev`。它没有 `--env` flag，也不管理线上环境变量。\n\n## 何时别用（核心反模式）\n\n**通常不需要手动跑**——脚手架的 `npm run dev` 在起本地开发时会自动后台拉取（非阻塞）。手动再跑会重复做同样的事，并用服务端返回值覆盖 `.env.local` 里的同名 key；本地无关行和注释会保留。\n\n只在这些兜底场景用：\n\n- 不通过 `npm run dev` 启动（直接跑 `node` / IDE debug）。\n- `.env.local` 被改坏 / 删除，想重新同步。\n\n## 行为\n\n- **合并、不清空**：写入 `.env.local` 时保留你手写的内容与注释——命中的 key 替换值，新 key 追加，不整体覆盖。\n- **安全护栏**：返回的 envelope **不会回显任何 env key / value**（防止 token / 数据库凭据泄漏到日志或 CI 输出）。要看实际值请直接读 `.env.local`。\n\n## 示例\n\n```bash\nlark-cli apps +env-pull --app-id <app_id>\n```\n\n## 失败处理\n\n`missing_scope`（没拿到 `spark:app:read`）时，按 lark-shared 引导 `lark-cli auth login --domain apps`。其余失败优先转述 `error.hint` / `error.message`。\n\n## 参考\n\n- [lark-apps](../SKILL.md) — 妙搭应用全部命令 + 心智模型\n- [lark-apps-local-dev](lark-apps-local-dev.md) — 本地应用开发端到端流程\n- [lark-shared](../../lark-shared/SKILL.md) — 认证和全局参数\n","skills/lark-apps/references/lark-apps-env.md":"# apps env\n\n> **前置条件：** 先阅读 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md)（认证 / 全局参数 / 安全）。\n\n管理妙搭应用环境变量。查看用 `+env-list`，设置用 `+env-set`，删除用 `+env-delete`。没有单变量 get 命令；要确认某个 key 是否存在，使用 list 后用 `--jq` 过滤。\n\n环境 flag 使用 `--environment`；不要使用旧的 `--env`，也不要使用短选项。\n\n## 查看\n\n`+env-list` 默认查 dev，且默认不返回 value。只有显式传 `--include-values` 后，响应中才可能出现变量值；不要在公开日志里展示带值输出。\n\n接口契约：list 使用 `POST env_vars`，body 固定包含 `env` 和 CLI 场景 `scene=2`；set 使用 `POST create_or_update_env_var`；delete 使用 `POST delete_env_vars`。`--include-values` 只控制 CLI 输出是否展示 value，不作为服务端查询参数发送。\n\n```bash\nlark-cli apps +env-list --app-id <app_id>\nlark-cli apps +env-list --app-id <app_id> --environment online\nlark-cli apps +env-list --app-id <app_id> --include-values --jq '.data.items[] | select(.key == \"FOO\")'\n```\n\n## 设置\n\ndev 环境设置不需要 `--yes`。设置 online 环境需要人类确认并显式传 `--yes`；如果用户在同一轮已经明确说“确认/直接执行”，视为已确认，直接带 `--yes`，不要再次追问。`--dry-run` 可用于预览请求且不需要 `--yes`。变量值支持直接传 `<value>`，也支持 `@file` 或 stdin 输入。\n\n回复中只说明 app/env/key 和执行结果；不要回显真实 value。需要举例时使用 `<value>`、`@file` 或 stdin。\n\n```bash\nlark-cli apps +env-set --app-id <app_id> --key FOO --value <value>\nlark-cli apps +env-set --app-id <app_id> --key FOO --value @./secret.txt\nlark-cli apps +env-set --app-id <app_id> --environment online --key FOO --value <value> --dry-run\nlark-cli apps +env-set --app-id <app_id> --environment online --key FOO --value <value> --yes\n```\n\n## 删除\n\n`+env-delete` 是 high-risk-write。尊重 exit 10 confirmation protocol：先让用户确认 app/env/key 和删除后果，再传 `--yes`。不要自动补 `--yes`。如果只是认证失败后让用户重登，重登完成不等于删除确认；继续删除前仍需确认。\n\n```bash\nlark-cli apps +env-delete --app-id <app_id> --key FOO --dry-run\nlark-cli apps +env-delete --app-id <app_id> --key FOO --yes\nlark-cli apps +env-delete --app-id <app_id> --environment online --key FOO --yes\n```\n\n## 反模式\n\n- 不要把 `+env-pull` 当成环境变量管理命令；它只是刷新本地 `.env.local` 的兜底工具。\n- 不要为了看一个变量臆造名为 env-get 的 apps shortcut；用 `+env-list --include-values` 加 `--jq`。\n- 不要把真实 secret 写进示例或对话输出；需要示例时使用 `<value>`、`@file` 或 stdin。\n","skills/lark-apps/references/lark-apps-export.md":"# apps +export\n\n`+export` 把妙搭应用的源码打成 zip 下载到本地。运行时命令事实以 `lark-cli apps +export --help` 为准。\n\n## 何时用\n\n只要一份源码快照的场景：读代码、审计、归档、做静态分析、把源码喂给别的工具。用户丢来一个妙搭应用链接要你「看看 / 分析 / 总结」时也用它：导出后解压读源码，页面文案和数据通常就在 HTML / 组件里。\n\n**跨应用是它相对 `+init` 的核心价值**：创意应用的分享链接（`/page/<token>`）指向别人的应用，你对那个仓库没有权限，`git clone` 走不通；`+export` 只要求你对该应用有下载权限。\n\n## 不要用它的时候\n\n要继续开发就用 `+init`，不要用 `+export` 再手动 `git init`。两者产出不同：\n\n| | `+export` | `+init` |\n|---|---|---|\n| 产出 | 一个 zip | 完整 git 工作区 |\n| Git 凭证 | 不配 | 配好，可 push |\n| 本地环境变量 | 不拉 | 拉 `.env.local` |\n| 前提 | 对应用有下载权限 | 对**仓库**有权限 |\n\n用 `+export` 拿到的目录没有 git 历史、没有远端、没有凭证，改完发不回去。\n\n## 导出的是「最后一次提交」，不是沙箱当前状态\n\n服务端对远端仓库跑 `git archive`，从不读沙箱文件系统。用户在沙箱里改了文件但没提交或发布，**那些改动不在归档里**。\n\n这是设计如此，不是缺陷。若导出结果看起来\"少了刚写的代码\"，先确认改动是否已提交，而不是重试导出。\n\n## 命令骨架\n\n- `--app-id` 与 `--meta-token` **恰传其一**：前者是自己的应用，后者是分享链接里的 token。\n  两者作为独立字段走 `POST /apps/export` 的请求体（`app_id` / `meta_token`），服务端按传入的\n  字段区分，不再共用 path 段——调用方只有 token、没有 app_id 时也不用在路径里凑一个占位值。\n  - 两者都只收**裸标识符**。拿到的是整条链接（`.../app/<app_id>` 或 `.../page/<token>`）时，\n    只传最后一段——整条 URL 传进来会被本地拦下并提示，不会变成一个看起来像\"应用不存在\"的 404。\n- `--output` 可选，相对当前目录；省略时用服务端给的文件名（通常是 `<app_id>.zip`）。\n\n## 示例\n\n```bash\nlark-cli apps +export --app-id app_xxx --output ./src.zip\nlark-cli apps +export --app-id app_xxx                      # 存成 ./app_xxx.zip\nlark-cli apps +export --meta-token <share-token>            # 别人分享给你的应用\nlark-cli apps +export --app-id app_xxx --dry-run\n```\n\n## 输出契约\n\n- 成功时 stdout 是 JSON envelope，含 `output`（落盘的绝对路径）与 `size_bytes`；传了 `--app-id` 时还会回显 `app_id`。\n- 归档以流式写盘，不会整包驻留内存，大仓库也安全。\n- 失败时不会留下半个文件。\n\n## 错误处理\n\n| 情况 | 怎么办 |\n|---|---|\n| 应用尚未发布（`code 40901 app not published`） | 该应用是产物托管形态（如静态 HTML 应用），导出的是「最新已发布产物」，而它还没有成功发布过版本，此刻没有可导的东西。**先发布应用再重试**——不是 app_id 写错，重试也没用 |\n| 权限不足（HTTP 403，或 HTTP 200 + `code 40300`；两者都表现为 `permission_denied`） | 你需要该应用的下载权限。**持有分享 token、能打开页面都不等于有下载权限**。重试和换参数都没用，向用户说明需找应用所有者授权 |\n| 应用不存在（404） | 用 `+list --keyword <name>` 核对 app_id |\n| 归档过大（413） | 超出导出体积上限，改用 `+git-credential-init` + 原生 git clone |\n| 参数报错 | `--app-id` 与 `--meta-token` 只能给一个，且必须给一个；两者都要裸标识符（不是整条链接） |\n","skills/lark-apps/references/lark-apps-file.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-file.md -->","skills/lark-apps/references/lark-apps-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-get.md -->","skills/lark-apps/references/lark-apps-git-credential.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-git-credential.md -->","skills/lark-apps/references/lark-apps-html-publish.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-html-publish.md -->","skills/lark-apps/references/lark-apps-init.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-init.md -->","skills/lark-apps/references/lark-apps-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-list.md -->","skills/lark-apps/references/lark-apps-local-dev.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-local-dev.md -->","skills/lark-apps/references/lark-apps-observability.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-observability.md -->","skills/lark-apps/references/lark-apps-openapi-key.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-openapi-key.md -->","skills/lark-apps/references/lark-apps-plugin-install.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-plugin-install.md -->","skills/lark-apps/references/lark-apps-plugin-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-plugin-list.md -->","skills/lark-apps/references/lark-apps-plugin-uninstall.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-plugin-uninstall.md -->","skills/lark-apps/references/lark-apps-release-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-release-create.md -->","skills/lark-apps/references/lark-apps-release-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-release-get.md -->","skills/lark-apps/references/lark-apps-release-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-release-list.md -->","skills/lark-apps/references/lark-apps-role.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-role.md -->","skills/lark-apps/references/lark-apps-session-messages-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-session-messages-list.md -->","skills/lark-apps/references/lark-apps-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-update.md -->","skills/lark-apps/references/lark-apps-user-id-convert.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-user-id-convert.md -->","skills/lark-attendance/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-attendance%2FSKILL.md -->","skills/lark-base/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2FSKILL.md -->","skills/lark-base/references/lark-base-advanced-permission-and-role.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-advanced-permission-and-role.md -->","skills/lark-base/references/lark-base-app-block-data-config.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-app-block-data-config.md -->","skills/lark-base/references/lark-base-app.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-app.md -->","skills/lark-base/references/lark-base-dashboard-block-config.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-dashboard-block-config.md -->","skills/lark-base/references/lark-base-dashboard-block-get-data.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-dashboard-block-get-data.md -->","skills/lark-base/references/lark-base-dashboard.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-dashboard.md -->","skills/lark-base/references/lark-base-data-query.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-data-query.md -->","skills/lark-base/references/lark-base-field-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-create.md -->","skills/lark-base/references/lark-base-field-extension.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-extension.md -->","skills/lark-base/references/lark-base-field-formula.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-formula.md -->","skills/lark-base/references/lark-base-field-lookup.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-lookup.md -->","skills/lark-base/references/lark-base-field-schema.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-schema.md -->","skills/lark-base/references/lark-base-field-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-update.md -->","skills/lark-base/references/lark-base-filter-condition.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-filter-condition.md -->","skills/lark-base/references/lark-base-form-detail.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-form-detail.md -->","skills/lark-base/references/lark-base-form-questions-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-form-questions-create.md -->","skills/lark-base/references/lark-base-form-questions-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-form-questions-update.md -->","skills/lark-base/references/lark-base-form-submit.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-form-submit.md -->","skills/lark-base/references/lark-base-record-history-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-record-history-list.md -->","skills/lark-base/references/lark-base-record-query-and-analysis-sop.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-record-query-and-analysis-sop.md -->","skills/lark-base/references/lark-base-role-config.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-role-config.md -->","skills/lark-base/references/lark-base-template-center.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-template-center.md -->","skills/lark-base/references/lark-base-view-set-filter.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-view-set-filter.md -->","skills/lark-base/references/lark-base-view.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-view.md -->","skills/lark-base/references/lark-base-workflow-schema.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-workflow-schema.md -->","skills/lark-base/references/lark-base-workflow.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-workflow.md -->","skills/lark-calendar/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2FSKILL.md -->","skills/lark-calendar/references/lark-calendar-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-create.md -->","skills/lark-calendar/references/lark-calendar-join-event.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-join-event.md -->","skills/lark-calendar/references/lark-calendar-list-attendees.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-list-attendees.md -->","skills/lark-calendar/references/lark-calendar-meeting-relation.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-meeting-relation.md -->","skills/lark-calendar/references/lark-calendar-meeting.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-meeting.md -->","skills/lark-calendar/references/lark-calendar-recurring.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-recurring.md -->","skills/lark-calendar/references/lark-calendar-room-find.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-room-find.md -->","skills/lark-calendar/references/lark-calendar-rsvp.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-rsvp.md -->","skills/lark-calendar/references/lark-calendar-schedule-clear-time.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-schedule-clear-time.md -->","skills/lark-calendar/references/lark-calendar-schedule-fuzzy-time.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-schedule-fuzzy-time.md -->","skills/lark-calendar/references/lark-calendar-schedule-meeting.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-schedule-meeting.md -->","skills/lark-calendar/references/lark-calendar-suggestion.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-suggestion.md -->","skills/lark-calendar/references/lark-calendar-transfer.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-transfer.md -->","skills/lark-calendar/references/lark-calendar-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-update.md -->","skills/lark-contact/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-contact%2FSKILL.md -->","skills/lark-contact/references/lark-contact-get-user.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-contact%2Freferences%2Flark-contact-get-user.md -->","skills/lark-contact/references/lark-contact-search-bot.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-contact%2Freferences%2Flark-contact-search-bot.md -->","skills/lark-contact/references/lark-contact-search-user.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-contact%2Freferences%2Flark-contact-search-user.md -->","skills/lark-doc/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2FSKILL.md -->","skills/lark-doc/references/genres/business-analysis.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fbusiness-analysis.md -->","skills/lark-doc/references/genres/data-report.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fdata-report.md -->","skills/lark-doc/references/genres/email.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Femail.md -->","skills/lark-doc/references/genres/execution-plan.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fexecution-plan.md -->","skills/lark-doc/references/genres/formal-doc.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fformal-doc.md -->","skills/lark-doc/references/genres/meeting-minutes.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fmeeting-minutes.md -->","skills/lark-doc/references/genres/memo-brief.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fmemo-brief.md -->","skills/lark-doc/references/genres/official-redhead.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fofficial-redhead.md -->","skills/lark-doc/references/genres/prd.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fprd.md -->","skills/lark-doc/references/genres/proposal.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fproposal.md -->","skills/lark-doc/references/genres/research-report.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fresearch-report.md -->","skills/lark-doc/references/genres/retrospective.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fretrospective.md -->","skills/lark-doc/references/genres/route-consumer.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-consumer.md -->","skills/lark-doc/references/genres/route-creative.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-creative.md -->","skills/lark-doc/references/genres/route-knowledge.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-knowledge.md -->","skills/lark-doc/references/genres/route-marketing.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-marketing.md -->","skills/lark-doc/references/genres/route-media.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-media.md -->","skills/lark-doc/references/genres/route-opinion.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-opinion.md -->","skills/lark-doc/references/genres/route-personal-brand.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-personal-brand.md -->","skills/lark-doc/references/genres/route-platform.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-platform.md -->","skills/lark-doc/references/genres/route-report.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-report.md -->","skills/lark-doc/references/genres/route-workplace.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-workplace.md -->","skills/lark-doc/references/genres/sop-tutorial.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fsop-tutorial.md -->","skills/lark-doc/references/genres/technical-doc.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Ftechnical-doc.md -->","skills/lark-doc/references/genres/wechat.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fwechat.md -->","skills/lark-doc/references/genres/weekly-report.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fweekly-report.md -->","skills/lark-doc/references/genres/white-paper.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fwhite-paper.md -->","skills/lark-doc/references/genres/xiaohongshu.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fxiaohongshu.md -->","skills/lark-doc/references/lark-doc-create-workflow.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-create-workflow.md -->","skills/lark-doc/references/lark-doc-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-create.md -->","skills/lark-doc/references/lark-doc-fetch.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-fetch.md -->","skills/lark-doc/references/lark-doc-history.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-history.md -->","skills/lark-doc/references/lark-doc-md.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-md.md -->","skills/lark-doc/references/lark-doc-media-download.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-media-download.md -->","skills/lark-doc/references/lark-doc-media-insert.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-media-insert.md -->","skills/lark-doc/references/lark-doc-media-preview.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-media-preview.md -->","skills/lark-doc/references/lark-doc-mindnote.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-mindnote.md -->","skills/lark-doc/references/lark-doc-resource-cover.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-resource-cover.md -->","skills/lark-doc/references/lark-doc-script.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-script.md -->","skills/lark-doc/references/lark-doc-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-update.md -->","skills/lark-doc/references/lark-doc-whiteboard.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-whiteboard.md -->","skills/lark-doc/references/lark-doc-xml-extended-blocks.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-xml-extended-blocks.md -->","skills/lark-doc/references/lark-doc-xml.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-xml.md -->","skills/lark-drive/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2FSKILL.md -->","skills/lark-drive/references/lark-drive-add-comment.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-add-comment.md -->","skills/lark-drive/references/lark-drive-add-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-add-reply.md -->","skills/lark-drive/references/lark-drive-apply-permission.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-apply-permission.md -->","skills/lark-drive/references/lark-drive-batch-query-comments.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-batch-query-comments.md -->","skills/lark-drive/references/lark-drive-comment-content.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-comment-content.md -->","skills/lark-drive/references/lark-drive-comment-location.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-comment-location.md -->","skills/lark-drive/references/lark-drive-copy.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-copy.md -->","skills/lark-drive/references/lark-drive-cover.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-cover.md -->","skills/lark-drive/references/lark-drive-create-folder.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-create-folder.md -->","skills/lark-drive/references/lark-drive-create-shortcut.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-create-shortcut.md -->","skills/lark-drive/references/lark-drive-delete-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-delete-reply.md -->","skills/lark-drive/references/lark-drive-delete.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-delete.md -->","skills/lark-drive/references/lark-drive-download.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-download.md -->","skills/lark-drive/references/lark-drive-export-download.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-export-download.md -->","skills/lark-drive/references/lark-drive-export.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-export.md -->","skills/lark-drive/references/lark-drive-files-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-files-list.md -->","skills/lark-drive/references/lark-drive-import.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-import.md -->","skills/lark-drive/references/lark-drive-inspect.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-inspect.md -->","skills/lark-drive/references/lark-drive-list-comments.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-list-comments.md -->","skills/lark-drive/references/lark-drive-list-replies.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-list-replies.md -->","skills/lark-drive/references/lark-drive-member-add.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-member-add.md -->","skills/lark-drive/references/lark-drive-member-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-member-list.md -->","skills/lark-drive/references/lark-drive-member-remove.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-member-remove.md -->","skills/lark-drive/references/lark-drive-move.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-move.md -->","skills/lark-drive/references/lark-drive-permission-get-setting.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-permission-get-setting.md -->","skills/lark-drive/references/lark-drive-permission-guide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-permission-guide.md -->","skills/lark-drive/references/lark-drive-preview.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-preview.md -->","skills/lark-drive/references/lark-drive-pull.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-pull.md -->","skills/lark-drive/references/lark-drive-push.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-push.md -->","skills/lark-drive/references/lark-drive-react-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-react-reply.md -->","skills/lark-drive/references/lark-drive-reactions.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-reactions.md -->","skills/lark-drive/references/lark-drive-resolve-comment.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-resolve-comment.md -->","skills/lark-drive/references/lark-drive-restore-comment.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-restore-comment.md -->","skills/lark-drive/references/lark-drive-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-search.md -->","skills/lark-drive/references/lark-drive-secure-label.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-secure-label.md -->","skills/lark-drive/references/lark-drive-status.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-status.md -->","skills/lark-drive/references/lark-drive-task-result.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-task-result.md -->","skills/lark-drive/references/lark-drive-update-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-update-reply.md -->","skills/lark-drive/references/lark-drive-update-title.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-update-title.md -->","skills/lark-drive/references/lark-drive-upload.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-upload.md -->","skills/lark-drive/references/lark-drive-version-delete.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-version-delete.md -->","skills/lark-drive/references/lark-drive-version-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-version-get.md -->","skills/lark-drive/references/lark-drive-version-history.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-version-history.md -->","skills/lark-drive/references/lark-drive-version-revert.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-version-revert.md -->","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-analysis.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-analysis.md -->","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-discovery.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-discovery.md -->","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-execution.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-execution.md -->","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-planning.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-planning.md -->","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-rollback.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-rollback.md -->","skills/lark-drive/references/lark-drive-workflow-knowledge-organize.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize.md -->","skills/lark-drive/references/lark-drive-workflow-permission-governance-commands.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-permission-governance-commands.md -->","skills/lark-drive/references/lark-drive-workflow-permission-governance-outputs.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-permission-governance-outputs.md -->","skills/lark-drive/references/lark-drive-workflow-permission-governance.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-permission-governance.md -->","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-execute.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-execute.md -->","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-recall.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-recall.md -->","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-resolve-verify.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-resolve-verify.md -->","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-review-plan.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-review-plan.md -->","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-setup.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-setup.md -->","skills/lark-drive/references/lark-drive-workflow-topic-move-collector.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector.md -->","skills/lark-drive/references/lark-drive-workflow.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow.md -->","skills/lark-event/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2FSKILL.md -->","skills/lark-event/references/lark-event-application.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-application.md -->","skills/lark-event/references/lark-event-approval.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-approval.md -->","skills/lark-event/references/lark-event-im.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-im.md -->","skills/lark-event/references/lark-event-minutes.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-minutes.md -->","skills/lark-event/references/lark-event-task.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-task.md -->","skills/lark-event/references/lark-event-vc.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-vc.md -->","skills/lark-event/references/lark-event-whiteboard.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-whiteboard.md -->","skills/lark-im/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2FSKILL.md -->","skills/lark-im/references/card/card-2.0-schema.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcard-2.0-schema.md -->","skills/lark-im/references/card/components/button.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fbutton.md -->","skills/lark-im/references/card/components/chart.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fchart.md -->","skills/lark-im/references/card/components/checker.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fchecker.md -->","skills/lark-im/references/card/components/collapsible_panel.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fcollapsible_panel.md -->","skills/lark-im/references/card/components/column_set.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fcolumn_set.md -->","skills/lark-im/references/card/components/date_picker.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fdate_picker.md -->","skills/lark-im/references/card/components/div.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fdiv.md -->","skills/lark-im/references/card/components/form.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fform.md -->","skills/lark-im/references/card/components/header.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fheader.md -->","skills/lark-im/references/card/components/hr.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fhr.md -->","skills/lark-im/references/card/components/img.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fimg.md -->","skills/lark-im/references/card/components/img_combination.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fimg_combination.md -->","skills/lark-im/references/card/components/input.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Finput.md -->","skills/lark-im/references/card/components/interactive_container.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Finteractive_container.md -->","skills/lark-im/references/card/components/markdown.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fmarkdown.md -->","skills/lark-im/references/card/components/multi_select_person.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fmulti_select_person.md -->","skills/lark-im/references/card/components/multi_select_static.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fmulti_select_static.md -->","skills/lark-im/references/card/components/overflow.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Foverflow.md -->","skills/lark-im/references/card/components/person.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fperson.md -->","skills/lark-im/references/card/components/person_list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fperson_list.md -->","skills/lark-im/references/card/components/picker_datetime.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fpicker_datetime.md -->","skills/lark-im/references/card/components/picker_time.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fpicker_time.md -->","skills/lark-im/references/card/components/recycling_container.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Frecycling_container.md -->","skills/lark-im/references/card/components/select_img.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fselect_img.md -->","skills/lark-im/references/card/components/select_person.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fselect_person.md -->","skills/lark-im/references/card/components/select_static.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fselect_static.md -->","skills/lark-im/references/card/components/table.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Ftable.md -->","skills/lark-im/references/card/lark-im-card-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Flark-im-card-create.md -->","skills/lark-im/references/card/lark-im-card-style.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Flark-im-card-style.md -->","skills/lark-im/references/card/resource/colors.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fresource%2Fcolors.md -->","skills/lark-im/references/card/resource/icons.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fresource%2Ficons.md -->","skills/lark-im/references/lark-im-card-action-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-card-action-reply.md -->","skills/lark-im/references/lark-im-chat-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-create.md -->","skills/lark-im/references/lark-im-chat-identity.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-identity.md -->","skills/lark-im/references/lark-im-chat-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-list.md -->","skills/lark-im/references/lark-im-chat-members-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-members-list.md -->","skills/lark-im/references/lark-im-chat-messages-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-messages-list.md -->","skills/lark-im/references/lark-im-chat-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-search.md -->","skills/lark-im/references/lark-im-chat-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-update.md -->","skills/lark-im/references/lark-im-feed-group-list-item.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-group-list-item.md -->","skills/lark-im/references/lark-im-feed-group-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-group-list.md -->","skills/lark-im/references/lark-im-feed-group-query-item.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-group-query-item.md -->","skills/lark-im/references/lark-im-feed-groups.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-groups.md -->","skills/lark-im/references/lark-im-feed-shortcut-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-shortcut-create.md -->","skills/lark-im/references/lark-im-feed-shortcut-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-shortcut-list.md -->","skills/lark-im/references/lark-im-feed-shortcut-remove.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-shortcut-remove.md -->","skills/lark-im/references/lark-im-flag-cancel.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-flag-cancel.md -->","skills/lark-im/references/lark-im-flag-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-flag-create.md -->","skills/lark-im/references/lark-im-flag-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-flag-list.md -->","skills/lark-im/references/lark-im-message-enrichment.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-message-enrichment.md -->","skills/lark-im/references/lark-im-message-read-status.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-message-read-status.md -->","skills/lark-im/references/lark-im-messages-edit.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-edit.md -->","skills/lark-im/references/lark-im-messages-mget.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-mget.md -->","skills/lark-im/references/lark-im-messages-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-reply.md -->","skills/lark-im/references/lark-im-messages-resources-download.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-resources-download.md -->","skills/lark-im/references/lark-im-messages-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-search.md -->","skills/lark-im/references/lark-im-messages-send.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-send.md -->","skills/lark-im/references/lark-im-reactions.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-reactions.md -->","skills/lark-im/references/lark-im-threads-messages-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-threads-messages-list.md -->","skills/lark-mail/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2FSKILL.md -->","skills/lark-mail/references/lark-mail-calendar-invite.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-calendar-invite.md -->","skills/lark-mail/references/lark-mail-decline-receipt.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-decline-receipt.md -->","skills/lark-mail/references/lark-mail-draft-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-draft-create.md -->","skills/lark-mail/references/lark-mail-draft-edit.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-draft-edit.md -->","skills/lark-mail/references/lark-mail-forward.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-forward.md -->","skills/lark-mail/references/lark-mail-html.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-html.md -->","skills/lark-mail/references/lark-mail-lint-html.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-lint-html.md -->","skills/lark-mail/references/lark-mail-message-modify.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-message-modify.md -->","skills/lark-mail/references/lark-mail-message-trash.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-message-trash.md -->","skills/lark-mail/references/lark-mail-message.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-message.md -->","skills/lark-mail/references/lark-mail-messages.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-messages.md -->","skills/lark-mail/references/lark-mail-recall.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-recall.md -->","skills/lark-mail/references/lark-mail-recipient-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-recipient-search.md -->","skills/lark-mail/references/lark-mail-reply-all.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-reply-all.md -->","skills/lark-mail/references/lark-mail-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-reply.md -->","skills/lark-mail/references/lark-mail-rules.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-rules.md -->","skills/lark-mail/references/lark-mail-send-as.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-send-as.md -->","skills/lark-mail/references/lark-mail-send-receipt.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-send-receipt.md -->","skills/lark-mail/references/lark-mail-send-status.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-send-status.md -->","skills/lark-mail/references/lark-mail-send.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-send.md -->","skills/lark-mail/references/lark-mail-share-to-chat.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-share-to-chat.md -->","skills/lark-mail/references/lark-mail-signature.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-signature.md -->","skills/lark-mail/references/lark-mail-template-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-template-create.md -->","skills/lark-mail/references/lark-mail-template-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-template-update.md -->","skills/lark-mail/references/lark-mail-template.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-template.md -->","skills/lark-mail/references/lark-mail-thread-modify.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-thread-modify.md -->","skills/lark-mail/references/lark-mail-thread-trash.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-thread-trash.md -->","skills/lark-mail/references/lark-mail-thread.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-thread.md -->","skills/lark-mail/references/lark-mail-triage.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-triage.md -->","skills/lark-mail/references/lark-mail-watch.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-watch.md -->","skills/lark-markdown/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2FSKILL.md -->","skills/lark-markdown/references/lark-markdown-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-create.md -->","skills/lark-markdown/references/lark-markdown-diff.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-diff.md -->","skills/lark-markdown/references/lark-markdown-fetch.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-fetch.md -->","skills/lark-markdown/references/lark-markdown-overwrite.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-overwrite.md -->","skills/lark-markdown/references/lark-markdown-patch.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-patch.md -->","skills/lark-meeting/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2FSKILL.md -->","skills/lark-meeting/references/lark-minutes-apply-permission.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-apply-permission.md -->","skills/lark-meeting/references/lark-minutes-detail.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-detail.md -->","skills/lark-meeting/references/lark-minutes-download.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-download.md -->","skills/lark-meeting/references/lark-minutes-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-search.md -->","skills/lark-meeting/references/lark-minutes-speaker-replace.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-speaker-replace.md -->","skills/lark-meeting/references/lark-minutes-summary.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-summary.md -->","skills/lark-meeting/references/lark-minutes-todo.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-todo.md -->","skills/lark-meeting/references/lark-minutes-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-update.md -->","skills/lark-meeting/references/lark-minutes-upload.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-upload.md -->","skills/lark-meeting/references/lark-note-detail.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-note-detail.md -->","skills/lark-meeting/references/lark-note-transcript.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-note-transcript.md -->","skills/lark-meeting/references/lark-vc-agent-meeting-end.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-agent-meeting-end.md -->","skills/lark-meeting/references/lark-vc-agent-meeting-invite.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-agent-meeting-invite.md -->","skills/lark-meeting/references/lark-vc-agent-meeting-join.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-agent-meeting-join.md -->","skills/lark-meeting/references/lark-vc-agent-meeting-leave.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-agent-meeting-leave.md -->","skills/lark-meeting/references/lark-vc-detail.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-detail.md -->","skills/lark-meeting/references/lark-vc-meeting-countdown.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-countdown.md -->","skills/lark-meeting/references/lark-vc-meeting-events.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-events.md -->","skills/lark-meeting/references/lark-vc-meeting-list-active.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-list-active.md -->","skills/lark-meeting/references/lark-vc-meeting-message-send.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-message-send.md -->","skills/lark-meeting/references/lark-vc-meeting-screenshot.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-screenshot.md -->","skills/lark-meeting/references/lark-vc-recording.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-recording.md -->","skills/lark-meeting/references/lark-vc-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-search.md -->","skills/lark-meeting/scenes/create-and-edit-minutes.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Fcreate-and-edit-minutes.md -->","skills/lark-meeting/scenes/live-meeting-attend.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Flive-meeting-attend.md -->","skills/lark-meeting/scenes/live-meeting-interact.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Flive-meeting-interact.md -->","skills/lark-meeting/scenes/query-meeting-and-artifacts.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Fquery-meeting-and-artifacts.md -->","skills/lark-meeting/scenes/query-minutes-and-artifacts.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Fquery-minutes-and-artifacts.md -->","skills/lark-meeting/scenes/query-note-and-artifacts.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Fquery-note-and-artifacts.md -->","skills/lark-minutes/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-minutes%2FSKILL.md -->","skills/lark-note/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-note%2FSKILL.md -->","skills/lark-okr/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2FSKILL.md -->","skills/lark-okr/references/lark-okr-alignments.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-alignments.md -->","skills/lark-okr/references/lark-okr-batch-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-batch-create.md -->","skills/lark-okr/references/lark-okr-comment-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-create.md -->","skills/lark-okr/references/lark-okr-comment-delete.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-delete.md -->","skills/lark-okr/references/lark-okr-comment-detail.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-detail.md -->","skills/lark-okr/references/lark-okr-comment-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-get.md -->","skills/lark-okr/references/lark-okr-comment-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-list.md -->","skills/lark-okr/references/lark-okr-comment-patch.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-patch.md -->","skills/lark-okr/references/lark-okr-comment-solve-reopen.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-solve-reopen.md -->","skills/lark-okr/references/lark-okr-contentblock.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-contentblock.md -->","skills/lark-okr/references/lark-okr-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-create.md -->","skills/lark-okr/references/lark-okr-cycle-detail.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-cycle-detail.md -->","skills/lark-okr/references/lark-okr-cycle-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-cycle-list.md -->","skills/lark-okr/references/lark-okr-entities.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-entities.md -->","skills/lark-okr/references/lark-okr-image-upload.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-image-upload.md -->","skills/lark-okr/references/lark-okr-indicator-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-indicator-update.md -->","skills/lark-okr/references/lark-okr-indicators.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-indicators.md -->","skills/lark-okr/references/lark-okr-patch.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-patch.md -->","skills/lark-okr/references/lark-okr-progress-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-create.md -->","skills/lark-okr/references/lark-okr-progress-delete.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-delete.md -->","skills/lark-okr/references/lark-okr-progress-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-get.md -->","skills/lark-okr/references/lark-okr-progress-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-list.md -->","skills/lark-okr/references/lark-okr-progress-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-update.md -->","skills/lark-okr/references/lark-okr-reorder.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-reorder.md -->","skills/lark-okr/references/lark-okr-weight.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-weight.md -->","skills/lark-openapi-explorer/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-openapi-explorer%2FSKILL.md -->","skills/lark-shared/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2FSKILL.md -->","skills/lark-shared/references/lark-shared-config-init.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-config-init.md -->","skills/lark-shared/references/lark-shared-high-risk-approval.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-high-risk-approval.md -->","skills/lark-shared/references/lark-shared-identity-and-permissions.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-identity-and-permissions.md -->","skills/lark-shared/references/lark-shared-output-contract.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-output-contract.md -->","skills/lark-shared/references/lark-shared-update-notice.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-update-notice.md -->","skills/lark-shared/references/lark-wiki-token-routing.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-wiki-token-routing.md -->","skills/lark-sheets/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2FSKILL.md -->","skills/lark-sheets/references/lark-sheets-batch-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-batch-update.md -->","skills/lark-sheets/references/lark-sheets-changeset.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-changeset.md -->","skills/lark-sheets/references/lark-sheets-chart.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-chart.md -->","skills/lark-sheets/references/lark-sheets-conditional-format.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-conditional-format.md -->","skills/lark-sheets/references/lark-sheets-filter-view.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-filter-view.md -->","skills/lark-sheets/references/lark-sheets-filter.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-filter.md -->","skills/lark-sheets/references/lark-sheets-float-image.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-float-image.md -->","skills/lark-sheets/references/lark-sheets-formula-translation.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-formula-translation.md -->","skills/lark-sheets/references/lark-sheets-formula-verify.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-formula-verify.md -->","skills/lark-sheets/references/lark-sheets-history.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-history.md -->","skills/lark-sheets/references/lark-sheets-pivot-table.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-pivot-table.md -->","skills/lark-sheets/references/lark-sheets-range-operations.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-range-operations.md -->","skills/lark-sheets/references/lark-sheets-read-data.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-read-data.md -->","skills/lark-sheets/references/lark-sheets-search-replace.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-search-replace.md -->","skills/lark-sheets/references/lark-sheets-sheet-structure.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-sheet-structure.md -->","skills/lark-sheets/references/lark-sheets-sparkline.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-sparkline.md -->","skills/lark-sheets/references/lark-sheets-styles-put.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-styles-put.md -->","skills/lark-sheets/references/lark-sheets-visual-standards.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-visual-standards.md -->","skills/lark-sheets/references/lark-sheets-workbook.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-workbook.md -->","skills/lark-sheets/references/lark-sheets-write-cells.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-write-cells.md -->","skills/lark-skill-maker/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-skill-maker%2FSKILL.md -->","skills/lark-slides/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2FSKILL.md -->","skills/lark-slides/references/asset-planning.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fasset-planning.md -->","skills/lark-slides/references/cli/lark-slides-add-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-add-slide.md -->","skills/lark-slides/references/cli/lark-slides-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-create.md -->","skills/lark-slides/references/cli/lark-slides-delete-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-delete-slide.md -->","skills/lark-slides/references/cli/lark-slides-history.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-history.md -->","skills/lark-slides/references/cli/lark-slides-media-upload.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-media-upload.md -->","skills/lark-slides/references/cli/lark-slides-replace-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-replace-slide.md -->","skills/lark-slides/references/cli/lark-slides-screenshot.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-screenshot.md -->","skills/lark-slides/references/cli/lark-slides-update-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-update-slide.md -->","skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-xml-presentation-slide-get.md -->","skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-xml-presentation-slide-replace.md -->","skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-xml-presentations-get.md -->","skills/lark-slides/references/iconpark-index.json":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Ficonpark-index.json -->","skills/lark-slides/references/iconpark.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Ficonpark.md -->","skills/lark-slides/references/lark-slides-add-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-add-slide.md -->","skills/lark-slides/references/lark-slides-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-create.md -->","skills/lark-slides/references/lark-slides-delete-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-delete-slide.md -->","skills/lark-slides/references/lark-slides-edit-workflows.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-edit-workflows.md -->","skills/lark-slides/references/lark-slides-history.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-history.md -->","skills/lark-slides/references/lark-slides-media-upload.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-media-upload.md -->","skills/lark-slides/references/lark-slides-pptx-template-workflows.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-pptx-template-workflows.md -->","skills/lark-slides/references/lark-slides-replace-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-replace-slide.md -->","skills/lark-slides/references/lark-slides-screenshot.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-screenshot.md -->","skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-xml-presentation-slide-get.md -->","skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-xml-presentation-slide-replace.md -->","skills/lark-slides/references/lark-slides-xml-presentations-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-xml-presentations-get.md -->","skills/lark-slides/references/planning-layer.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fplanning-layer.md -->","skills/lark-slides/references/troubleshooting.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Ftroubleshooting.md -->","skills/lark-slides/references/validation-checklist.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fvalidation-checklist.md -->","skills/lark-slides/references/visual-planning.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fvisual-planning.md -->","skills/lark-slides/references/workflow/error-handling.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fworkflow%2Ferror-handling.md -->","skills/lark-slides/references/workflow/slides-editing.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fworkflow%2Fslides-editing.md -->","skills/lark-slides/references/workflow/template-editing.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fworkflow%2Ftemplate-editing.md -->","skills/lark-slides/references/workflow/validation-xml.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fworkflow%2Fvalidation-xml.md -->","skills/lark-slides/references/xml-schema-quick-ref.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fxml-schema-quick-ref.md -->","skills/lark-slides/references/xml/iconpark-index.json":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fxml%2Ficonpark-index.json -->","skills/lark-slides/references/xml/iconpark.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fxml%2Ficonpark.md -->","skills/lark-slides/references/xml/xml-schema-quick-ref.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fxml%2Fxml-schema-quick-ref.md -->","skills/lark-task/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2FSKILL.md -->","skills/lark-task/references/lark-task-assign.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-assign.md -->","skills/lark-task/references/lark-task-comment.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-comment.md -->","skills/lark-task/references/lark-task-complete.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-complete.md -->","skills/lark-task/references/lark-task-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-create.md -->","skills/lark-task/references/lark-task-followers.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-followers.md -->","skills/lark-task/references/lark-task-get-my-tasks.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-get-my-tasks.md -->","skills/lark-task/references/lark-task-get-related-tasks.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-get-related-tasks.md -->","skills/lark-task/references/lark-task-reminder.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-reminder.md -->","skills/lark-task/references/lark-task-reopen.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-reopen.md -->","skills/lark-task/references/lark-task-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-search.md -->","skills/lark-task/references/lark-task-sections.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-sections.md -->","skills/lark-task/references/lark-task-set-ancestor.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-set-ancestor.md -->","skills/lark-task/references/lark-task-tasklist-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-tasklist-create.md -->","skills/lark-task/references/lark-task-tasklist-members.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-tasklist-members.md -->","skills/lark-task/references/lark-task-tasklist-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-tasklist-search.md -->","skills/lark-task/references/lark-task-tasklist-task-add.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-tasklist-task-add.md -->","skills/lark-task/references/lark-task-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-update.md -->","skills/lark-task/references/lark-task-upload-attachment.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-upload-attachment.md -->","skills/lark-vc-agent/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-vc-agent%2FSKILL.md -->","skills/lark-vc/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-vc%2FSKILL.md -->","skills/lark-whiteboard/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2FSKILL.md -->","skills/lark-whiteboard/elements/connectors.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fconnectors.md -->","skills/lark-whiteboard/elements/content.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fcontent.md -->","skills/lark-whiteboard/elements/image.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fimage.md -->","skills/lark-whiteboard/elements/layout.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Flayout.md -->","skills/lark-whiteboard/elements/schema.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fschema.md -->","skills/lark-whiteboard/elements/style.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fstyle.md -->","skills/lark-whiteboard/elements/typography.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Ftypography.md -->","skills/lark-whiteboard/references/lark-whiteboard-export.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Freferences%2Flark-whiteboard-export.md -->","skills/lark-whiteboard/references/lark-whiteboard-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Freferences%2Flark-whiteboard-update.md -->","skills/lark-whiteboard/references/lark-whiteboard-workflow.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Freferences%2Flark-whiteboard-workflow.md -->","skills/lark-whiteboard/routes/dsl.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Froutes%2Fdsl.md -->","skills/lark-whiteboard/routes/mermaid.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Froutes%2Fmermaid.md -->","skills/lark-whiteboard/routes/svg-edit.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Froutes%2Fsvg-edit.md -->","skills/lark-whiteboard/routes/svg.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Froutes%2Fsvg.md -->","skills/lark-whiteboard/scenes/architecture.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Farchitecture.md -->","skills/lark-whiteboard/scenes/bar-chart.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fbar-chart.md -->","skills/lark-whiteboard/scenes/comparison.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fcomparison.md -->","skills/lark-whiteboard/scenes/fishbone.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Ffishbone.md -->","skills/lark-whiteboard/scenes/flowchart.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fflowchart.md -->","skills/lark-whiteboard/scenes/flywheel.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fflywheel.md -->","skills/lark-whiteboard/scenes/funnel.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Ffunnel.md -->","skills/lark-whiteboard/scenes/line-chart.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fline-chart.md -->","skills/lark-whiteboard/scenes/mention.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fmention.md -->","skills/lark-whiteboard/scenes/mermaid.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fmermaid.md -->","skills/lark-whiteboard/scenes/milestone.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fmilestone.md -->","skills/lark-whiteboard/scenes/organization.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Forganization.md -->","skills/lark-whiteboard/scenes/photo-showcase.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fphoto-showcase.md -->","skills/lark-whiteboard/scenes/pyramid.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fpyramid.md -->","skills/lark-whiteboard/scenes/swimlane.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fswimlane.md -->","skills/lark-whiteboard/scenes/treemap.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Ftreemap.md -->","skills/lark-wiki/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2FSKILL.md -->","skills/lark-wiki/references/lark-wiki-delete-space.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-delete-space.md -->","skills/lark-wiki/references/lark-wiki-member-add.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-member-add.md -->","skills/lark-wiki/references/lark-wiki-member-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-member-list.md -->","skills/lark-wiki/references/lark-wiki-member-remove.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-member-remove.md -->","skills/lark-wiki/references/lark-wiki-move-to-drive.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-move-to-drive.md -->","skills/lark-wiki/references/lark-wiki-move.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-move.md -->","skills/lark-wiki/references/lark-wiki-node-copy.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-copy.md -->","skills/lark-wiki/references/lark-wiki-node-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-create.md -->","skills/lark-wiki/references/lark-wiki-node-delete.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-delete.md -->","skills/lark-wiki/references/lark-wiki-node-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-get.md -->","skills/lark-wiki/references/lark-wiki-node-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-list.md -->","skills/lark-wiki/references/lark-wiki-space-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-space-create.md -->","skills/lark-wiki/references/lark-wiki-space-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-space-list.md -->","skills/lark-workflow-meeting-summary/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-workflow-meeting-summary%2FSKILL.md -->","skills/lark-workflow-standup-report/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-workflow-standup-report%2FSKILL.md -->","tests/cli_e2e/cli-e2e-testcase-writer/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=tests%2Fcli_e2e%2Fcli-e2e-testcase-writer%2FSKILL.md -->",".cursorrules (ankra-cli.mdc)":"---\ndescription: \"Ankra CLI rules and best practices for managing Kubernetes clusters via the Ankra platform\"\nglobs: **/*.sh, **/*.yaml, **/*.yml, Makefile, **/Makefile, **/*.md\nalwaysApply: false\n---\n# Ankra CLI Best Practices\n\nAnkra is a Kubernetes cluster management platform. Its CLI (`ankra`) lets you manage organisations, clusters, add-ons, stacks, Helm releases, credentials, and tokens from the terminal.\n\n## Authentication & Configuration\n\n- Authenticate first: `ankra login`\n- Default config lives at `~/.ankra.yaml`; override with `--config <path>`\n- Override the API base URL with `--base-url` or `ANKRA_BASE_URL`\n- Supply an API token via `--token` or `ANKRA_API_TOKEN` (prefer env var in CI)\n- Logout cleanly: `ankra logout`\n\n```yaml\n# ~/.ankra.yaml example\nbase_url: https://api.ankra.io\ntoken: ${ANKRA_API_TOKEN}\n```\n\n## Organisation Management\n\n```bash\nankra org list                          # List accessible organisations\nankra org switch <org-name>             # Switch active organisation\nankra org create <name>                 # Create a new organisation\nankra org invite <email>                # Invite a user to the current org\nankra org members                       # List members of the current org\n```\n\n## Cluster Lifecycle\n\n```bash\nankra cluster list                      # List all clusters in the org\nankra cluster select <name>             # Set the active cluster context\nankra cluster info                      # Show details about the active cluster\nankra cluster provision                 # Provision a new cluster\nankra cluster deprovision               # Deprovision (destroy) the active cluster\nankra cluster reconcile                 # Reconcile cluster to desired state\nankra delete cluster <name>             # Delete a named cluster\n```\n\n- Always run `ankra cluster info` before destructive operations\n- Use `ankra cluster reconcile` after config changes before assuming state is correct\n\n## Add-ons\n\n```bash\nankra cluster addons list               # List installed add-ons\nankra cluster addons available          # List available (installable) add-ons\nankra cluster addons settings <addon>   # Show current settings for an add-on\nankra cluster addons update <addon>     # Update add-on configuration\nankra cluster addons uninstall <addon>  # Uninstall an add-on\n```\n\n## Stacks (Application Stacks)\n\n```bash\nankra cluster stacks list               # List stacks in the cluster\nankra cluster stacks create <name>      # Create a new stack\nankra cluster stacks delete <name>      # Delete a stack\nankra cluster stacks rename <old> <new> # Rename a stack\nankra cluster stacks clone <src> <dst>  # Clone a stack\nankra cluster stacks history <name>     # View stack change history\n```\n\n- Prefer `clone` over `create` when replicating an existing working stack\n- Check `history` before rolling back to understand what changed\n\n## Manifests & Operations\n\n```bash\nankra cluster manifests list            # List deployed manifests\nankra cluster operations list           # List in-progress or recent operations\nankra cluster operations cancel <id>    # Cancel a running operation\n```\n\n## Cluster Agent\n\n```bash\nankra cluster agent status              # Check agent health\nankra cluster agent token               # Retrieve agent bootstrap token\nankra cluster agent upgrade             # Upgrade the in-cluster agent\n```\n\n- Run `agent status` if cluster commands seem unresponsive\n- Rotate the agent token periodically for security\n\n## Helm\n\n```bash\nankra cluster helm releases             # List Helm releases in the cluster\nankra cluster helm uninstall <release>  # Uninstall a Helm release\nankra helm registries                   # List configured Helm registries\nankra helm credentials                  # List Helm registry credentials\n```\n\n## Hetzner Cloud Clusters\n\n```bash\nankra cluster hetzner create            # Create a Hetzner-backed cluster\nankra cluster hetzner scale             # Scale the cluster node count\nankra cluster hetzner upgrade           # Upgrade Kubernetes version\nankra cluster hetzner workers           # Manage worker node groups\nankra cluster hetzner node-group        # Node group management\n```\n\n## Charts\n\n```bash\nankra charts list                       # List available charts\nankra charts search <term>              # Search charts\nankra charts info <chart>               # Detailed chart information\n```\n\n## Credentials\n\n```bash\nankra credentials list                              # List stored credentials\nankra credentials get <name>                        # Retrieve a credential\nankra credentials validate <name>                   # Validate a credential\nankra credentials delete <name>                     # Delete a credential\nankra credentials hetzner --name <n> --token <t>   # Store Hetzner API token\nankra credentials ovh ...                           # Store OVH credentials\nankra credentials upcloud ...                       # Store UpCloud credentials\n```\n\n- Never commit credentials to source control; use `ANKRA_API_TOKEN` env var\n- Validate credentials immediately after creation: `ankra credentials validate <name>`\n\n## Tokens (API Tokens)\n\n```bash\nankra tokens list                       # List API tokens\nankra tokens create --name <name>       # Create a new API token\nankra tokens revoke <id>                # Revoke a token (keeps record)\nankra tokens delete <id>                # Permanently delete a token\n```\n\n## AI Troubleshooting\n\n```bash\nankra chat                              # Start AI-powered troubleshooting session\n```\n\nUse `ankra chat` when facing ambiguous errors — it provides contextual guidance.\n\n## Global Flags\n\n| Flag | Env Var | Description |\n|------|---------|-------------|\n| `--base-url <url>` | `ANKRA_BASE_URL` | Override API base URL |\n| `--token <token>` | `ANKRA_API_TOKEN` | API authentication token |\n| `--config <path>` | — | Path to config file (default `~/.ankra.yaml`) |\n\n## Scripting & Automation Tips\n\n- Export `ANKRA_API_TOKEN` in CI pipelines; never hard-code tokens\n- Use `--token` for one-off scripts where env var injection is not possible\n- Chain `ankra cluster select` before cluster-scoped commands in scripts\n- Pipe output through `jq` for structured processing where JSON output is available\n- Use `ankra cluster operations list` in CI to poll for async operation completion\n- Add `set -euo pipefail` to shell scripts using the Ankra CLI\n\n## Common Workflows\n\n### Provision and configure a new Hetzner cluster\n\n```bash\nankra login\nankra org switch my-org\nankra cluster hetzner create\nankra cluster select my-new-cluster\nankra cluster agent status\nankra cluster addons available\nankra cluster addons update some-addon\nankra cluster reconcile\n```\n\n### Deploy a stack from a chart\n\n```bash\nankra cluster select my-cluster\nankra charts search my-app\nankra charts info my-app\nankra cluster stacks create my-stack\nankra cluster manifests list\n```\n\n### Rotate credentials safely\n\n```bash\nankra tokens create --name ci-token-new\n# Update CI secret with new token\nankra tokens revoke <old-token-id>\nankra credentials validate my-cloud-cred\n```\n"},"files":{"AGENTS.md":"# AGENTS.md\n\n## Purpose\n\n`lark-cli` is the official Lark/Feishu CLI for humans and AI agents. Optimize\nfor predictable machine-readable behavior without making the human CLI worse.\n\nKeep each PR focused on one goal: CLI UX, reliability, simpler explicit code,\nor a useful gate. Done means the correct implementation surface, preserved\ncontracts unless a break was requested, and reported checks.\n\nPublic behavior, tests, lint, and CI define current contracts. Existing code is\nevidence, but a legacy exception is not precedent; `Proposal` documents are\ndirection only. Do not mix unrelated cleanup, hand-edit generated files, weaken\ngates, or broaden allowlists to make CI pass.\n\n## Implementation Discipline\n\nUse this sequence for product behavior or enforcement changes:\n\n1. Establish the current contract and owner before choosing a solution. Trace the\n   flow from the command or shortcut through runtime and internal owners to wire\n   output; inspect affected callers and tests, then choose the surface below.\n2. Apply YAGNI to scope. Implement the behavior required now; do not add\n   speculative modes, configuration, compatibility paths, extension points, or\n   scaffolding.\n3. Reuse the project's existing machinery before creating a parallel path.\n   Prefer the owning generic, runtime, or internal surface, then the Go standard\n   library or an existing dependency, while preserving the contracts below.\n4. Fix the root cause at the narrowest cohesive boundary shared by affected\n   callers. Keep command and domain policy at the caller unless there is a real\n   cross-command invariant for an internal owner to enforce.\n5. Ship the smallest complete change: implementation, a revert-failing regression\n   test for behavior or enforcement, and required contract or guidance updates.\n\nOptimize for minimum owned complexity, not minimum diff or line count. A correct\nroot-cause fix may touch the owner, callers, tests, and docs; a one-line workaround\nat the wrong layer is not simpler. Prefer deletion and boring explicit code, and\navoid one-use abstractions or new dependencies for straightforward behavior.\n\nYAGNI never overrides explicit requirements or output, error, path, security,\ncompatibility, and data-safety contracts. If a deliberately limited solution has\na real ceiling, document the ceiling and the concrete condition for expanding it\nat the decision point.\n\n## Build\n\nRun `make build` for the canonical local build; it writes `./lark-cli` with\nversion metadata and the committed Catalog Snapshot embedded from\n`internal/registry/catalog/manifest.json` plus\n`internal/registry/catalog/services/*.json`. Build and test targets consume this\ntracked snapshot without a metadata fetch or Python prerequisite.\n`make live-skills-test` additionally requires working `npx` and network access.\n\n## Choose the Correct Surface\n\n| Need | Implement in | Rule |\n|------|--------------|------|\n| Agent/human-friendly workflow, composition, or smart defaults | `shortcuts/<domain>/` via `common.Shortcut` | Must add UX or workflow value beyond exposing one endpoint. |\n| One-to-one supported OpenAPI method | Committed Catalog Snapshot under `internal/registry/catalog/manifest.json` plus `services/*.json`, and generic `cmd/service/` machinery | Verify it with `schema`. Update the manifest and matching service snapshot together; do not add a shortcut merely to expose a missing catalog method. |\n| Arbitrary OpenAPI endpoint | Generic `cmd/api/` machinery | Keep it endpoint-agnostic. |\n| Auth, config, profile, update, or CLI lifecycle | `cmd/<area>/` plus the owning shared/internal package | Keep new Cobra code as wiring when a lower owner exists. |\n| EventKey, payload shape, or domain projection | `events/<domain>/` | Shared event mechanics stay in `internal/event/`; CLI assembly stays in `cmd/event/`. |\n| Command-independent mechanism or cross-command invariant | Owning `internal/<area>/` package | Keep UX/domain policy at the caller; use a cohesive owner, not a generic utils package. Test the owner and affected caller contracts. |\n| Public plugin or host integration | `extension/` | Exported symbols are compatibility commitments; orchestration stays internal. |\n| Per-command decision guidance: when, avoid, prerequisites, tips, or examples | `affordance/<domain>.md` | Enrich `--help` and `schema` without restating command descriptions, flags, or field schemas. |\n| Domain routing, concepts, safety, or cross-command agent workflow | `skills/<name>/SKILL.md` and `references/` | Keep always-needed decisions in `SKILL.md`, conditional HOW in references, and link commands from affordance. |\n\nDo not duplicate one command surface inside another. Register new shortcuts in\nthe domain's `Shortcuts()`; declare risk, identities/scopes, flags, and dry-run.\n\n## Source Layout\n\n| Path | What it does |\n|------|-------------|\n| `cmd/root.go` | Entry point, command registration, strict mode pruning |\n| `cmd/profile/` | Multi-profile management (add/list/use/rename/remove) |\n| `cmd/config/` | Config init, show, strict-mode |\n| `cmd/service/` | Auto-registers API commands from `internal/registry/catalog/manifest.json` and `internal/registry/catalog/services/*.json` |\n| `shortcuts/common/runner.go` | Shortcut execution pipeline, Flag.Input (@file/stdin) resolution |\n| `shortcuts/` | Domain-specific shortcut implementations |\n| `internal/cmdutil/factory.go` | Factory pattern — identity resolution, credential, config |\n| `internal/cmdutil/factory_default.go` | Production factory wiring |\n| `internal/credential/` | Credential provider chain (extension → default) |\n| `extension/credential/` | Plugin-facing credential interfaces and env provider |\n| `internal/client/client.go` | APIClient: DoSDKRequest, DoStream |\n| `internal/core/config.go` | Multi-profile config loading/saving |\n| `internal/vfs/` | Filesystem abstraction (use `vfs.*` instead of `os.*`) |\n| `internal/validate/path.go` | Path safety validation |\n\n## Hard Contracts\n\nRead the [JSON output contract](README.md#json-output-contract) before changing\nwire output. Read the [source guard guide](lint/README.md) and `.golangci.yml`\nbefore changing or waiving enforcement.\n\n- Command/flag semantics, help/schema metadata, output placement and shapes,\n  errors, exit codes, risk/identity, and exported APIs are compatibility contracts.\n  When forwarding or echoing accepted input, preserve it verbatim unless its\n  contract defines normalization; never silently substitute another behavior.\n- Success data goes to stdout; typed failure envelopes, progress, warnings, and\n  hints go to stderr. Predicate/self-contained results and partial failures are\n  documented exceptions whose complete result remains on stdout.\n- Keep new or touched Cobra code as wiring. Lark/Feishu API calls in shortcuts go\n  through `*common.RuntimeContext`; direct HTTP is only for non-gateway protocols\n  such as presigned storage and requires a precise `//nolint:forbidigo` reason.\n- Keep user/workspace FileIO invocation-scoped: use `runtime.FileIO()`,\n  `runtime.ValidatePath()`, and `runtime.ResolveSavePath()` so portable commands do\n  not assume a local host or process working directory.\n- Shortcuts do not use `internal/vfs` for user/workspace files. A narrow\n  `//nolint:depguard` waiver is allowed only for CLI-owned state or explicitly\n  CLI-managed host configuration; explain that ownership boundary. Other internal\n  filesystem code uses `internal/vfs` and validates paths.\n- If FileIO lacks a host-local tree operation, prefer an owning `internal/` package\n  or optional capability. Direct `os` calls require a stated local-only boundary,\n  validated and bounded paths, and a precise `//nolint:forbidigo` reason.\n- Do not hardcode resolver-owned hosts. At new API boundaries, or when changed\n  behavior consumes fields from a loose map, project that shape into a typed\n  struct before downstream use. Extend published interfaces through optional\n  interfaces rather than breaking external implementations.\n- Source guards enforce raw HTTP/os/vfs, resolver-host, and migrated-error\n  constructs; other semantics rely on tests and review. Every exemption must be\n  narrow, local, and explain why the safe path does not apply.\n\n## Structured Errors\n\nBefore changing a command failure, taxonomy, or error wire field, read the\n[error contract](errs/ERROR_CONTRACT.md); it owns constructor selection, wrapping,\nextension fields, stability, and CI guards.\n\n- Command-facing failures use typed `errs.*` unless the error contract defines\n  an output-control exception. Never return a final plain `fmt.Errorf` /\n  `errors.New` or ad hoc envelope; pass typed errors through and preserve causes.\n- Lark API failures use a domain typed wrapper, `runtime.CallAPITyped`, or\n  `runtime.DoAPIJSONTyped`; raw callers use `runtime.ClassifyAPIResponse` or\n  `errclass.BuildAPIError`.\n- `param` names only failing user input; recovery belongs in `hint`. Populate\n  `missing_scopes`, `log_id`, and similar fields only from known runtime evidence.\n- Error tests assert typed metadata and cause preservation, not message text alone.\n\n## Affordance and Skills\n\nBefore editing command guidance, read the [affordance guide](affordance/README.md).\nFor plugin distributions, read [Ship skills and command guidance](extension/platform/README.md#ship-skills-and-command-guidance).\n\n- Go metadata/schema owns WHAT; affordance owns command-level WHEN; `SKILL.md`\n  owns domain routing, concepts, safety, and cross-command workflows; `references/`\n  owns detailed or conditional HOW.\n- Do not duplicate canonical descriptions, schemas, or generic error taxonomy.\n  Keep workflow-specific recovery in a skill when it changes agent behavior;\n  affordance examples remain runnable, current, and safe.\n- Skill frontmatter `description` is a concise WHAT/WHEN/NOT routing trigger. Keep\n  always-needed decisions in `SKILL.md`; move conditional detail to `references/`.\n- Skill names and reference paths are public pointers. Every path reachable from\n  shipped docs must ship. Before referencing a new content directory, update\n  `content_embed.go` and add an embedded-FS reachability test; `assets/` and\n  `scripts/` stay source-only unless the distribution contract changes.\n\n## Tests\n\n- Every behavior change needs a nearby test that fails if the implementation is\n  reverted; assert fields, requests, typed errors, or side effects directly.\n- Command/shortcut tests needing a Factory use `cmdutil.TestFactory(t, config)`;\n  isolate config with\n  `t.Setenv(\"LARKSUITE_CLI_CONFIG_DIR\", t.TempDir())`.\n- Tests must not depend on developer profiles, keychains, home directories,\n  execution order, or real credentials unless explicitly live.\n- Live E2E flows are self-contained: create, use, and clean up even after failure.\n\n| Shortcut change | Dry-run E2E | Live E2E |\n|-----------------|:-----------:|:--------:|\n| New shortcut | Required | Required |\n| Flags or request params | Required | Required if behavior changes |\n| Bug fix | Required | Required when risk reaches the API boundary |\n| Internal refactor, no behavior change | Not needed | Not needed |\n\nDry-run tests use placeholder credentials and assert method, URL, params, and\nbody without a real API call. Confirm contracts with `--help` and `schema` first.\nIf no deterministic, cleanable live flow exists, do not leak tenant state or add\na flaky test; document the blocker, fixture conditions, and substitute evidence.\n\n## Validation\n\nRun the narrowest useful check while iterating, then broaden with risk:\n\n| Change | Checks |\n|--------|--------|\n| Go package | `go test ./path/to/package/...`, then the pre-PR Go checks below |\n| Broad/cross-cutting | `make test` |\n| Committed command/help/schema surface | `make quality-gate` |\n| Skills | `node scripts/skill-format-check/index.js`, then `make quality-gate` after committing the change |\n| Affordance | Add/update `internal/affordance/*_source_test.go`; run `go test ./internal/affordance ./cmd/service ./internal/schema` |\n| Make-covered scripts/workflows | `make script-test` |\n| Public plugin SDK | `make examples-build` plus relevant `tests/plugin_e2e` |\n| Auth sidecar | `make sidecar-test` |\n| Skills sync behavior | `make live-skills-test` |\n| Dependencies | `go mod tidy` plus the CI `go-licenses` check |\n\n`make quality-gate` and diff-scoped linters compare the base with `HEAD`; they\nignore staged, unstaged, and untracked changes, so run them after committing.\nSome skill-quality signals are warnings; frontmatter has the separate hard check\nabove. The gate does not validate affordance examples or references in this file:\nrun the focused source test and verify changed paths/symbols directly.\n\n`make test` currently leaves root binaries `audit-observer` and `readonly-policy`; do not stage them.\n\nBefore a Go PR, run `make unit-test`, `make vet`, and `make fmt-check`;\n`go mod tidy` must leave module files unchanged. Set\n`QUALITY_GATE_CHANGED_FROM` to the PR base before diff-scoped checks. Pinned\n`go run module@version` commands need module access unless cached.\n\n```bash\ngo mod tidy\ngit diff --exit-code -- go.mod go.sum\ngo run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.1.6 run --new-from-rev=\"$QUALITY_GATE_CHANGED_FROM\"\ngo run -C lint . --changed-from \"$QUALITY_GATE_CHANGED_FROM\" ..\ngo test -C lint ./... -count=1\ngo run github.com/google/go-licenses/v2@v2.0.1 check ./... --disallowed_types=forbidden,restricted,reciprocal,unknown\n```\n\nCI is authoritative; state exactly which relevant checks were not run.\n\n## Maintaining This File\n\nAdd a root rule only when it is repository-specific, non-obvious, actionable,\nand prevents a recurring failure or high-impact contract breach. Prefer code,\ntests, or CI for mechanizable constraints; keep only rationale and safe exceptions\nhere. Update named references in the same PR, and delete or move stale, obvious,\nredundant, task-local, or fully enforced rules. Each edit should reduce ambiguity,\nnot only add text.\n\n## Commit and PR\n\nUse English Conventional Commits/PR titles, complete the PR template, and never\ncommit secrets, tokens, internal endpoints, or sensitive test data.\n","internal/qualitygate/skillscan/testdata/skills/lark-demo/SKILL.md":"---\nname: lark-demo\ndescription: Demo skill\n---\n\n```bash\n# comment\nlark-cli docs +fetch --api-version v2 --doc A3Ijdemo\nlark-cli im messages list \\\n  --container-id oc_xxx \\\n  --page-size 20\nnpx other-tool\n```\n","isolated-skills/lark-suite/SKILL.md":"---\nname: lark-suite\nversion: 0.1.0\ndescription: 飞书/Lark 聚合能力入口：管理飞书/Lark 产品能力（<!-- LARK_SUITE_KEYS -->等）。当 doubao.com 及其子域名承载飞书资源时也使用本入口，不要回退到 WebFetch。当用户需求涉及上述飞书业务域时使用。\nmetadata:\n  requires:\n    bins:\n      - lark-cli\n---\n\n# Lark Suite\n\n你是飞书/Lark 能力的聚合路由层。你的职责是先判断用户要使用哪个 `lark-*` 子能力，再读取并遵循对应子能力的说明。\n\n`lark-suite` 不直接承载具体 API 操作步骤。除非对应子能力已被读取，否则不要仅根据本文件拼命令、猜参数或执行复杂操作。\n\n所有子能力统一收纳在当前 skill 的 `references/` 目录。选择 `lark-foo` 后，直接读取 `references/lark-foo/GUIDE.md`；不要再次调用 `Skill(lark-foo)`，也不要使用 Find/Glob 遍历或探测整个 references 目录。\n\n## 使用流程\n\n1. 根据用户意图从下方路由表选择一个或多个子能力；即使用户尚未提供链接、ID 或具体工作表，也先选择能力，再由子能力询问缺失信息。\n2. 直接读取 `references/<skill-name>/GUIDE.md` 加载所选子能力，不要把收纳后的子能力当作独立 skill 再次调用。\n3. 仅使用本文件列出的路由与对应子能力入口，不要遍历或探测其他技能目录。\n4. 如果目标能力未列出，返回无法路由的明确提示。\n5. 仅读取当前已选子能力明确要求的前置文件。\n6. 按目标子能力的说明执行；认证、租户、身份、权限和通用排障优先遵循 `lark-shared`。\n\n多步任务可以组合多个子能力，但每一步都应由具体子能力驱动。例如“查联系人并发消息”先用 `lark-contact` 解析身份，再用 `lark-im` 发消息。\n\n## 能力路由\n\n根据用户意图从以下条目选择对应子能力；如果一个任务涉及多个能力，按实际操作顺序逐步读取并使用对应子能力。\n\n<!-- LARK_SUITE_ROUTES -->\n","scripts/skill-format-check/tests/bad-skill-no-frontmatter/SKILL.md":"# No Frontmatter Skill\n\nThis skill completely lacks a YAML frontmatter.\n","scripts/skill-format-check/tests/bad-skill-unclosed-frontmatter/SKILL.md":"---\nname: bad-skill-unclosed\nversion: 1.0.0\ndescription: \"This skill has an unclosed frontmatter block.\"\nmetadata: {}\n\n# Unclosed Frontmatter Skill\n\nThis frontmatter does not have a closing `---` block.","scripts/skill-format-check/tests/bad-skill/SKILL.md":"---\nversion: 1.0.0\nmetadata: {}\n---\n\n# Bad Skill\n\nThis skill is missing required fields like name and description.\n","scripts/skill-format-check/tests/good-skill-complex/SKILL.md":"---\nname: good-skill-complex\nversion: 2.5.1-beta\ndescription: >\n  A very complex description\n  that spans multiple lines\n  and contains weird chars: !@#$%^&*()\nmetadata:\n  requires:\n    bins: [\"lark-cli\", \"node\"]\n  cliHelp: \"lark-cli something --help\"\n  customField: \"customValue\"\n---\n\n# Complex Skill\n\nThis skill has a complex frontmatter block.\n","scripts/skill-format-check/tests/good-skill-minimal/SKILL.md":"---\nname: good-skill-minimal\nversion: 0.1.0\ndescription: Minimal valid description\nmetadata: {}\n---\n\n# Minimal Skill\n\nThis has the bare minimum required fields.\n","scripts/skill-format-check/tests/good-skill/SKILL.md":"---\nname: good-skill\nversion: 1.0.0\ndescription: \"This is a properly formatted skill.\"\nmetadata:\n  requires:\n    bins: [\"lark-cli\"]\n---\n\n# Good Skill\n\nThis skill follows all the formatting rules.\n","skills/lark-approval/SKILL.md":"---\nname: lark-approval\nversion: 1.2.0\ndescription: \"飞书审批：查询和处理审批待办/已办/实例，搜索可发起审批定义、查看定义详情并发起原生审批实例。当用户要处理审批任务、查看审批实例、搜索或发起审批时使用。审批待办不是飞书任务；非审批类待办走 lark-task。不负责创建审批定义；三方审批定义不走原生提单。\"\nmetadata:\n  requires:\n    bins: [\"lark-cli\"]\n  cliHelp: \"lark-cli approval --help\"\n---\n\n\n**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md)，其中包含认证、权限处理**\n\n所有命令默认 `--as user`（审批是人的动作）。调用前先按需读取 references 下对应的文件，查参数结构，不要猜字段；**references 是第一信息源**，只有在 reference 未覆盖的原生 / 高级场景下，才额外用 `lark-cli ... --help`、`lark-cli schema` 等方式补充确认字段。\n\n## 路由优先级（先判断是不是审批，再选命令）\n\n审批待办不是飞书任务。**只要用户的核心对象是审批单据 / 审批待办 / 审批实例，就优先使用 `lark-approval`，不要让渡给 `lark-task`。**\n\n### 明确归 `lark-approval` 的高优先级语义\n\n出现以下任一语义时，优先走 `lark-approval`：\n\n- 审批待办 / 审批单据 / 审批实例 / 审批意见 / 审批定义\n- 同意 / 拒绝 / 转交 / 退回 / 撤回 / 催办 / 加签 / 抄送\n- 待办列表 / 待办单据 / 已发起审批 / 已办审批 / 审批详情 / 同意可编辑\n\n**判定规则：** 只要最终动作是对审批单据做同意、拒绝、转交、退回、撤回、催办、加签、抄送、查详情、查已发起/已办/待办，就归 `lark-approval`。只有当用户处理的是**非审批类任务/待办**时，才走 [`lark-task`](../lark-task/SKILL.md)。\n\n## 选哪个命令\n\n| 想做什么 | 命令 | 按需读取 reference                                                                  |\n|---|---|---------------------------------------------------------------------------------|\n| 搜可发起定义 | `approvals search` | [`lark-approval-approvals-search.md`](references/lark-approval-approvals-search.md) |\n| 看审批定义详情/提单前确认表单与流程 | `approvals get` | [`lark-approval-approvals-get.md`](references/lark-approval-approvals-get.md)   |\n| 发起原生审批实例/提交请假审批/提交报销审批/创建审批实例 | `instances create` | [`lark-approval-initiate.md`](references/lark-approval-initiate.md)             |\n| 查/搜待办、已办 | `tasks query`（`topic`：1待办 2已办 17未读 18已读） | [`lark-approval-tasks-query.md`](references/lark-approval-tasks-query.md)       |\n| 看表单/进度/当前节点 | `instances get` | [`lark-approval-instances-get.md`](references/lark-approval-instances-get.md)   |\n| 同意审批 | `tasks approve` | [`lark-approval-tasks-approve.md`](references/lark-approval-tasks-approve.md)   |\n| 拒绝审批 | `tasks reject` | [`lark-approval-tasks-reject.md`](references/lark-approval-tasks-reject.md)     |\n| 转交审批 | `tasks transfer` | [`lark-approval-tasks-transfer.md`](references/lark-approval-tasks-transfer.md) |\n| 加签审批 | `tasks add_sign` | [`lark-approval-tasks-add-sign.md`](references/lark-approval-tasks-add-sign.md) |\n| 退回审批 | `tasks rollback` | [`lark-approval-tasks-rollback.md`](references/lark-approval-tasks-rollback.md) |\n| 催办审批 | `tasks remind` | [`lark-approval-tasks-remind.md`](references/lark-approval-tasks-remind.md)     |\n| 撤回已发起审批 | `instances cancel` | [`lark-approval-instances-cancel.md`](references/lark-approval-instances-cancel.md) |\n| 给审批实例追加抄送 | `instances cc` | [`lark-approval-instances-cc.md`](references/lark-approval-instances-cc.md)     |\n| 按定义/关键词查已发起审批 | `instances initiated` | [`lark-approval-instances-initiated.md`](references/lark-approval-instances-initiated.md) |\n\n处理链：\n\n- 发起审批：`approvals search` -> `approvals get` -> `instances create`\n- 处理审批：`tasks query` 拿 `instance_code` + `task_id`（操作必须成对带上）→ 只有用户明确需要查看详情、当前节点、表单内容、或流程进度时，再 `instances get` → 执行操作\n\n## 执行原则（减少误路由、误重试和无效消耗）\n\n### 1) 先拿最小必要信息，再执行\n\n- 目标只是处理待办时，优先 `tasks query` 获取 `instance_code` + `task_id`\n- **只有**用户明确要看详情、当前节点、表单内容、流程进度时，才调用 `instances get`\n- 用户已经明确给出 `instance_code` / `task_id` 时，不要先查列表再过滤\n\n### 2) 已知对象时直达动作\n\n- 已拿到 `instance_code` + `task_id` 后，优先直接执行 `tasks approve/reject/transfer/add_sign/rollback/remind`\n- 同一轮里如果已有足够的新鲜查询结果，不要重复 `tasks query`\n- 不要默认走 `list -> filter -> detail -> write` 全链路；对象已明确时应压缩步骤\n\n### 3) 错误码驱动，而不是盲目重试\n\n- 写操作失败后，先看错误码和报错语义，再决定是否补查或结束\n- **除非错误明确提示可恢复或需要补充参数，否则不要重复刷同一个写操作**\n- 同一个失败原因不要连续多次重试，避免 token 和耗时失控，最多重试1次\n\n## 写操作失败处理：1395001 决策树\n\n当拒绝 / 转交 / 退回 / 撤回 / 同意等写操作返回 `1395001`（任务状态异常 / 写前置校验失败）时，按下面规则处理：\n\n1. **先停止盲目重试**，不要连续重复提交相同写操作，最多重试1次\n2. 优先从以下角度解释：\n   - 任务可能已被他人处理\n   - 单据状态已变化，当前动作已不再允许\n   - 当前用户已不具备该任务的操作资格\n   - 当前节点或单据状态不支持该操作\n3. 如需确认，只补 **一次** 状态查询（`tasks query` 或 `instances get`），不要陷入 query/write 循环\n4. 最终给用户明确结论和下一步建议，而不是继续无意义重试\n\n**特别注意：** 对拒绝 / 转交 / 撤回场景更要严格执行上述规则；这些场景最容易因状态切换而失败。\n\n```bash\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user\nlark-cli approval approvals get --params '{\"approval_code\":\"<code>\"}' --as user\nlark-cli approval instances create --data '{\"approval_code\":\"<code>\",\"form\":\"[...]\"}' --yes --as user\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\nlark-cli approval tasks approve --data '{\"instance_code\":\"<ic>\",\"task_id\":\"<tid>\",\"comment\":\"同意\"}' --as user\n```\n\n## 不在本 skill 范围\n\n创建审批定义（走飞书客户端或审批管理后台）；三方定义发起（返回 `create_link`，引导用户通过链接发起）；非审批类待办 → [`lark-task`](../lark-task/SKILL.md)\n","skills/lark-approval/references/lark-approval-approvals-get.md":"\n# approval approvals get\n\n获取单个审批定义详情（用户级只读操作）。适合在发起审批实例前，先确认审批名称、表单控件结构、选项值范围以及流程节点信息。\n\n需要的 scopes: [\"approval:approval:read\"]\n\n## 命令\n\n```bash\n# 按 approval_code 查询审批定义详情\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user\n\n# 表格格式输出，便于快速浏览顶层字段\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{...}'` | 是 | 查询参数，使用 JSON 传入 |\n| `approval_code` | 是 | 审批定义 Code；通常来自 `approval approvals search` 的结果 |\n| `locale` | 否 | 返回语言，例如 `zh-CN`、`en-US`、`ja-JP` |\n| `--as user` | 否 | 建议显式指定用户身份；审批定义详情通常按当前用户可见范围读取 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 常见输入来源\n\n如果你已经有 `approval_code`，可直接查询：\n\n```bash\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user\n```\n\n如果你还没有 `approval_code`，先搜索可发起审批定义：\n\n```bash\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user\n```\n\n## 输出重点字段\n\n返回结果中，优先关注以下字段：\n\n| 字段 | 说明 |\n|------|------|\n| `approval_code` | 审批定义 Code |\n| `approval_name` | 审批定义名称；确认是不是用户想发起的那张单 |\n| `form` | 表单定义快照；用于识别控件 `id`、`type`、选项值范围、明细子控件结构 |\n| `node_list` | 流程节点列表；用于识别节点 key、是否需要补充审批人、是否允许多人 |\n\n## form 的使用重点\n\n`form` 最重要的作用是帮助 agent **识别怎么组装 `instances.create.data.form`**，而不是直接把它原样提交出去。\n\n重点看：\n\n| 字段 / 结构 | 说明 |\n|------|------|\n| `form[].id` | 控件 ID；后续创建实例时必须使用 |\n| `form[].type` | 控件类型，例如 `input`、`date`、`radio`、`checkbox`、`fieldList` |\n| `form[].value` / 选项定义 | 用来识别可选值范围、默认值或选项值 |\n| 明细 / 子控件结构 | 用于识别 `fieldList`、控件组等复杂控件的子字段结构 |\n\n**注意：`approvals.get.form` 不是 `instances.create` 可直接复用的 payload 模板。** 它是“定义快照”，主要用于识别字段结构与选项值范围。\n\n## node_list 的使用重点\n\n`node_list` 主要用于后续决定是否要补 `node_approver_list` / `node_cc_list`。\n\n重点看：\n\n| 字段 | 说明 |\n|------|------|\n| `node_list[].custom_node_id` | 自定义节点标识；后续补节点参数时优先作为 key |\n| `node_list[].node_id` | 节点 ID；若没有 `custom_node_id`，通常退回用它做 key |\n| `node_list[].need_approver` | 是否要求发起人补充审批人 |\n| `node_list[].approver_chosen_multi` | 是否允许为该节点选择多个审批人 |\n\n## 使用建议\n\n- **这是发起原生审批实例前的必要只读步骤。** 推荐固定走：`approvals search` -> `approvals get` -> `instances create`。\n- **如果用户已经明确给了 `approval_code`，直接用这个命令。** 不必再走 `approvals search`。\n- **先确认 `approval_name`。** 避免把相似名称的审批定义搞混。\n- **先用 `form` 识别控件结构，再组装创建 payload。** 不要在未看详情时猜控件 `id`、`type` 或选项值。\n- **先用 `node_list` 看是否需要补审批人。** 若某节点 `need_approver=true`，创建实例时通常要补 `node_approver_list`。\n- **`node_list` 的 key 优先取 `custom_node_id`。** 若不存在，再使用 `node_id`。\n- **`approver_chosen_multi=false` 时，一个节点通常只能补一个审批人。**\n\n## 输出与后续操作\n\n读取定义详情后，常见下一步：\n\n```bash\n# 发起原生审批实例\nlark-cli approval instances create --data '{\"approval_code\":\"<APPROVAL_CODE>\",\"form\":\"[...]\"}' --as user --yes\n```\n\n如果需要进一步理解控件取值与节点参数，优先参考：\n\n- `lark-approval-instance-form-control-parameters.md`\n- `lark-approval-instance-value-sourcing.md`\n- `lark-approval-initiate.md`\n\n## 结果整理方式\n\n**将结果整理为“审批定义概览 + 表单结构摘要 + 节点要求摘要”。**\n\n建议输出成下面这种结构：\n\n```text\n审批定义：请假申请\napproval_code: 7C468A54-8745-2245-9675-08B7C63E7A85\n\n表单控件摘要：\n- leave_type: radio，可选值 [annual_leave, sick_leave]\n- reason: textarea\n- start_end: dateInterval\n\n节点要求摘要：\n- manager_node：need_approver=true，approver_chosen_multi=false\n- hr_node：need_approver=false\n```\n","skills/lark-approval/references/lark-approval-approvals-search.md":"\n# approval approvals search\n\n搜索**当前用户可发起**的审批定义（launchable approvals）。只读操作，不会创建审批实例。\n\n需要的 scopes: [\"approval:approval:read\"]\n\n## 命令\n\n```bash\n# 按关键词搜索可发起审批定义\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user\n\n# 使用 page_token 翻页\nlark-cli approval approvals search --data '{\"keyword\":\"请假\", \"page_token\":\"example_page_token\"}' --as user\n\n# 表格格式输出，便于快速浏览候选定义\nlark-cli approval approvals search --data '{\"keyword\":\"出差\"}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 查询参数，使用 JSON 传入 |\n| `keyword` | 是 | 搜索关键词，例如 `请假`、`报销`、`出差`、`采购` |\n| `locale` | 否 | 返回语言，例如 `zh-CN`、`en-US`、`ja-JP` |\n| `page_size` | 否 | 分页大小 |\n| `page_token` | 否 | 翻页标记；首次请求不填，后续使用上一次返回的 `page_token` |\n| `--as user` | 否 | 建议显式指定用户身份；“可发起审批定义”是面向当前用户的查询 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 这个命令解决什么问题\n\n当用户只有自然语言意图，还没有 `approval_code` 时，先用它把“可发起的审批定义候选项”找出来。\n\n典型场景：\n\n- “帮我找一下请假审批”\n- “有哪些可以发起的报销单？”\n- “先搜一下出差审批，再帮我提单”\n\n## 输出重点字段\n\n返回结果里，优先关注以下字段：\n\n| 字段 | 说明 |\n|------|------|\n| `approval_code` | 审批定义 Code；后续 `approvals get` 和 `instances create` 都要用它 |\n| `approval_name` | 审批定义名称；给用户做候选选择时最关键 |\n| `is_external` | 是否为三方审批定义；`true` 表示不能走原生 `instances.create` |\n| `create_link` | 三方审批定义的发起链接；`is_external=true` 时优先返回给用户 |\n\n## 使用规则\n\n- **这是发起审批工作流的第一步。** 标准顺序是：`approvals search` -> `approvals get` -> `instances create`。\n- **搜索结果为空时，不要猜。** 直接告诉用户当前关键词下没有可发起定义，并建议用户换关键词。\n- **命中多个结果时，不要替用户拍板。** 先把候选定义列出来，让用户选择目标审批定义。\n- **`is_external=true` 时不要调用 `approval instances create`。** 这类定义属于三方审批，优先返回 `create_link` 并说明需要通过链接发起。\n- **只有 `is_external=false` 的原生定义，才继续 `approvals get`。**\n- **如果用户已经明确给出 `approval_code`，不要再 search。** 直接执行 `approval approvals get`。\n\n## 结果整理方式\n\n**将结果整理为候选清单，优先展示“名称 + approval_code + 是否三方定义 + 下一步建议”。**\n\n建议输出成下面这种结构：\n\n```text\n找到 3 个可发起审批定义：\n\n1. 请假申请\n   - approval_code: 7C468A54-8745-2245-9675-08B7C63E7A85\n   - is_external: false\n   - next: 可继续读取 definitions 详情（approvals get）\n\n2. 差旅报销\n   - approval_code: 99887766-xxxx\n   - is_external: true\n   - next: 返回 create_link，引导用户通过链接发起\n```\n\n## 常见后续操作\n\n### 1）用户选中了某个定义，继续查看详情\n\n```bash\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user\n```\n\n### 2）确认是原生定义后，再准备发起审批实例\n\n```bash\nlark-cli approval instances create --data '{\"approval_code\":\"<APPROVAL_CODE>\",\"form\":\"[...]\"}' --as user --yes\n```\n\n### 3）确认是三方定义时，直接返回链接\n\n当 `is_external=true` 时，优先向用户返回 `create_link`，说明该审批需在三方系统或跳转页面中发起，而不是通过原生 `instances.create`。\n","skills/lark-approval/references/lark-approval-initiate.md":"# 审批提单工作流\n\n## 执行摘要\n\n- **原生审批提单如果用户未明确给出 `approval_code`，必须固定走 `approvals search` -> `approvals get` -> `instances create`** 不要跳过 `get` 直接拼请求。\n- **原生审批提单如果用户明确给出 `approval_code`，固定走 `approvals get` -> `instances create`** 不要跳过 `get` 直接拼请求。\n- **`is_external=true` 的定义是三方定义。** 这类定义不要调用 `instances create`，应优先使用 `create_link`。\n- **所有人员类参数默认使用 `open_id`。** 若用户给的是姓名、邮箱或其他身份，先用 [`../../lark-contact/SKILL.md`](../../lark-contact/SKILL.md) 解析。\n- **先读控件参数 reference 和值来源 reference，再读本文里的创建参数规则。** 提单前必须先阅读 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 和 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md)。\n- **`approvals.get.form` 不是创建 payload 的原样模板。** 它主要用于识别控件 `id`、`type`、选项值范围和明细子控件结构；真正的 `instances create --data.form` 中，控件 `value` 结构以 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 为准。\n- **节点参数只从 `node_list` 和本文里的节点参数规则里取。** 节点 key 必须来自定义详情返回的节点标识；审批人/抄送人列表传用户 ID 时，不要混用姓名或其他身份标识。\n- **看到 `need_approver=true` 就说明该节点需要发起人补充审批人。** 如果 `approver_chosen_multi=false`，该节点只允许一个 `open_id`。\n- **创建实例前先确认。** `approval instances create` 是写操作，执行前，让用户确认最终定义、表单值和节点参数；真正执行时显式传 `--yes`。\n\n## 适用场景\n\n- “帮我提交一个请假审批”\n- “帮我发起报销审批”\n- “我想提一个出差审批”\n- “先搜可发起的审批，再帮我提单”\n\n## 严禁行为\n\n- **严禁在未先阅读本文中的创建参数规则、[`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 和 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md) 的情况下直接提单。**\n- **严禁跳过 `approvals.get`。** 未拿到 `form` 和 `node_list` 前，不得调用 `instances create`。\n- **严禁把姓名直接写进 `node_approver_list`、`node_cc_list` 或表单人员控件。** 必须先转成 `open_id`。\n- **严禁对三方定义调用 `instances create`。**\n- **严禁对 API 不支持的控件硬提单。** 如果目标定义包含创建实例 API 不支持的控件，应明确告诉用户该定义不能仅通过 API 完整发起。\n- **严禁把 `approvals.get.form` 当成可直接提交的原样模板。**\n- **严禁在未得到用户确认前直接执行真实提单。**\n\n## 工作流\n\n### 1. 搜索可发起审批定义\n\n先搜索定义：\n\n```bash\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}'\n```\n\n处理规则：\n\n- 若结果为空，告诉用户当前关键词下没有可发起定义。\n- 若命中多个定义，必须把候选项列给用户选择，不要自行猜测。\n- 若目标定义 `is_external=true`，优先返回 `create_link`，说明这是三方定义，不能走原生 `instances create`。\n- 只有 `is_external=false` 的原生定义才继续下一步。\n\n### 2. 获取审批定义详情\n\n拿到 `approval_code` 后，读取定义详情：\n\n```bash\nlark-cli approval approvals get \\\n  --params '{\"approval_code\":\"7C468A54-8745-2245-9675-08B7C63E7A85\"}'\n```\n\n重点关注返回：\n\n- `approval_name`: 当前发起的是哪个审批定义。\n- `form`: 表单定义快照，用于识别控件 `id`、`type`、选项值范围以及明细子控件结构；不是创建实例时可直接原样提交的 payload 模板。\n- `node_list`: 流程节点信息，是后续 `node_approver_list` / `node_cc_list` 的唯一可靠来源。\n\n### 3. 创建请求参数速查\n\n输入参数如下：\n\n| 参数 | 必填 | 说明 |\n|---|---|---|\n| `--data '{...}'` | 是 | 请求体，使用 JSON 传入 |\n| `approval_code` | 是 | 审批定义 Code；必须先通过 `approvals search` / `approvals get` 确认 |\n| `form` | 否 | 表单值，**JSON 数组字符串**，不是普通对象；API 层非必填，但审批定义存在必填控件或用户需要提交表单值时必须传 |\n| `node_approver_list` | 否 | 节点审批人列表；仅在定义要求补充审批人时传 |\n| `node_cc_list` | 否 | 节点抄送人列表；仅在用户明确需要补充节点抄送人时传 |\n| `uuid` | 否 | 幂等标识；重复重试同一请求时建议显式传入 |\n| `--as user` | 否 | 建议显式指定用户身份；审批发起通常应使用用户身份 |\n| `--yes` | 是 | 写操作确认；真实执行时必须显式传入 |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n### 4. 组装 `form`\n\n`instances create --data.form` 是可选字段；传入时必须是一个 JSON 数组字符串。无表单或无需填写表单值的审批可省略 `form`，但只要审批定义包含需要提交的控件，就必须按控件结构组装后传入。组装原则：\n\n- 先用 `approvals.get.form` 识别有哪些控件、每个控件的 `id` / `type` / 可选值范围，再按本文中的创建参数规则与 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 重新组装创建 payload。\n- 提交时必须至少保证每个控件的 `id`、`type` 与 `value` 符合当前接口要求；不要假设定义快照里出现的其他字段都能直接照搬。\n- 如果用户提供的是人员信息，优先转换成 `open_id` 后再写入对应控件。\n- 单选/多选控件提交的是选项 `value`，该值可从 `approvals.get.form` 的选项定义中取得。\n- `contact`、`department`、`fieldList`、`dateInterval`、`amount`、`telephone`、`document` 等控件的 `value` 结构各不相同，必须按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 单独组装，不要套用文本控件的写法。\n- 值本身从哪里拿，优先按 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md) 处理；不要把“知道结构”误当成“已经拿到可提交值”。\n- 若 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 标明某控件不支持通过创建实例 API 提交，则不要硬猜绕过；应明确告诉用户该定义当前无法仅通过 API 提单。\n- 若遇到当前 skill 未明确覆盖的复杂控件，不要硬猜；先依据 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 判断支持性与传值结构，再向用户确认。\n\n## API 不支持的控件\n\n根据 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md)，创建审批实例 API 不支持的控件至少包括：\n\n- `text`\n- `mutableGroup`\n- `account`\n- `serialNumber`\n- `tripGroup`\n- `apaascorehrOnboardingGroup`\n- `apaascorehrRegularateGroup`\n- `remedyGroupV2`\n- `apaascorehrJobAdjustGroup`\n- `apaascorehrOffboardingGroup`\n\n如果目标审批定义包含上述控件，不要继续硬拼 `form`；应直接告诉用户该定义不能仅通过当前 API 完整提单。\n\n## 高频控件速查\n\n优先按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 组装，下面只保留最常用、最容易出错的格式：\n\n- `input` / `textarea`: `value` 是字符串\n- `date`: `value` 是 RFC3339 时间字符串\n- `dateInterval`: `value` 是对象，包含 `start` / `end` / `interval`\n- `radio` / `radioV2`: `value` 是单个选项值，取定义详情里的 `option.value`；关联外部选项时传 `options.id`\n- `checkbox` / `checkboxV2`: `value` 是选项值数组\n- `number`: `value` 是数字\n- `amount`: `value` 是数字，还要带 `currency`\n- `formula`: `value` 必须与定义中的公式结果匹配，否则会报错\n- `contact`: 只推荐写 `open_ids`，由人员信息先转换成 `open_id`\n- `connect`: `value` 是关联审批实例 `instance_code` 数组，当前默认要求用户直接提供 `instance_code`\n- `document`: `value` 是对象，至少含 `token` 和 `type=docx`\n- `attachmentV2` / `image` / `imageV2`: `value` 是 file code 数组，当前默认要求用户直接提供\n- `fieldList`: `value` 是二维数组，子项继续按各自控件类型组装\n- `department`: `value` 是对象数组，元素字段名为 `open_id`，其值填写部门的 `open_department_id`\n- `telephone`: `value` 是对象，包含 `countryCode` 和 `nationalNumber`\n- `address`: `value` 是对象数组，至少包含地理库 `id`，可选 `detailAddress`；当前默认要求用户直接提供该 `id`\n\n## 特殊控件组\n\n[`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 还明确给出了若干特殊控件组的提单格式，至少包括：\n\n- `leaveGroupV2`\n- `workGroup`\n- `outGroup`\n- `shiftGroup`\n\n这类控件组不是简单文本控件，通常内部还嵌套 `radioV2`、`date`、`fieldList`、`image`、`contact` 等子控件。遇到这些控件组时：\n\n- 先从 `approvals.get.form` 找到控件组及其子控件 ID\n- 再严格按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 的示例组装 `value`\n- 不要把控件组整体当成普通字符串或扁平对象提交\n\n### 5. 组装节点参数\n\n从 `node_list` 推导节点参数：\n\n- 若某节点 `need_approver=true`，则必须在 `node_approver_list` 中补该节点的审批人。\n- `key` 优先取 `custom_node_id`；若不存在，再用 `node_id`。\n- `value` 是审批人 `open_id` 列表。\n- 若 `approver_chosen_multi=false`，该节点只允许一个审批人 `open_id`。\n- `node_cc_list` 仅在用户明确需要补充节点抄送人时才填写；其 `key/value` 规则与 `node_approver_list` 相同。\n\n### 6. 创建审批实例\n\n创建命令使用 `approval instances create`，需要的 scopes: [\"approval:instance:write\"]\n\n确认最终表单值和节点参数后再执行：\n\n```bash\nlark-cli approval instances create \\\n  --data '{\n    \"approval_code\":\"7C468A54-8745-2245-9675-08B7C63E7A85\",\n    \"form\":\"[{\\\"id\\\":\\\"widget1\\\",\\\"type\\\":\\\"input\\\",\\\"value\\\":\\\"请假半天\\\"}]\",\n    \"node_approver_list\":[\n      {\n        \"key\":\"manager_node_id\",\n        \"value\":[\"ou_xxx\"]\n      }\n    ]\n  }' \\\n  --as user \\\n  --yes\n```\n\n执行规则：\n\n- 执行前先向用户确认：目标审批定义、核心表单值、节点审批人/抄送人。\n- 若需要幂等，可补 `uuid`。\n- 成功后回报 `instance_code` 与 `instance_link`。\n\n## 组装时优先依据的资料\n\n优先级固定如下：\n\n1. 本文中的创建请求参数、节点参数和返回结果说明：决定 `instances create` 要传哪些字段、怎么执行、成功后回什么。\n2. [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md)：决定每种控件的 `value` 结构与支持范围。\n3. [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md)：决定每类值应该从哪里拿，以及当前哪些值必须由用户直接提供。\n4. `approvals.get.form`：提供当前审批定义里实际有哪些控件、控件 `id`、控件 `type`、选项值范围、明细子控件结构。\n5. `approvals.get.node_list`：提供节点 key 与是否需要补充审批人/抄送人的线索。\n\n不要反过来把 `approvals.get.form` 当成第一优先级，更不要把它当成可直接提交的 JSON 模板。\n\n## 最小判断表\n\n| 你手上有什么 | 下一步 |\n|---|---|\n| 只有口语需求，比如“帮我提个请假审批” | 先 `approvals.search` |\n| 已经拿到 `approval_code` | 直接 `approvals.get` |\n| 已拿到 `form` / `node_list`，且用户已给出表单值和审批人 | 组装 `instances create` |\n| `is_external=true` | 返回 `create_link`，不要调 `instances create` |\n\n## 返回结果\n\n完成创建后，至少向用户返回：\n\n- `approval_name`\n- `instance_code`\n- `instance_link`\n\n建议整理为下面这种结构：\n\n```text\n审批已创建成功：\n\n- approval_name: 请假申请\n- instance_code: 19EAC829-F1CB-527F-BE2A-1330422E60C0\n- instance_link: https://...\n```\n","skills/lark-approval/references/lark-approval-instance-form-control-parameters.md":"# 审批实例表单控件参数\n\n> 说明：本文尽量保留上游参数文档的原始结构与示例，用于回答“控件 `value` 长什么样”。\n> 当前 `lark-cli` 的推荐取值口径以 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md) 为准；如果两份文档在“值从哪里拿”上存在差异，以后者为准。\n\n在调用创建审批实例接口时需要使用表单控件参数，你可以通过本文了解审批实例内各表单控件的参数说明。\n\n## 准备工作\n\n审批实例的表单控件参数依据审批定义表单来配置，例如，审批定义的表单设计包括了 **单行文本** 和 **日期区间** 控件，则审批实例的表单控件参数就需要为 **单行文本** 和 **日期区间** 控件进行赋值。因此，在操作审批实例表单的控件参数前，应先通过审批定义详情确认表单控件结构。\n\n## 审批实例 API 不支持的控件\n\n创建审批实例 API 未完全支持所有的审批表单控件，不支持的控件如下表所示。如果你必须使用 API 不支持的控件，则不能仅通过当前 API 完成提单。\n\n**控件/控件组** | **Type**                    |\n| ---------- | --------------------------- |\n| 说明         | text                        |\n| 引用多维表格     | mutableGroup                |\n| 收款账户       | account                     |\n| 流水号        | serialNumber                |\n| 出差控件组      | tripGroup                   |\n| 录用控件组      | apaascorehrOnboardingGroup  |\n| 转正控件组      | apaascorehrRegularateGroup  |\n| 补卡控件组      | remedyGroupV2               |\n| 调岗控件组      | apaascorehrJobAdjustGroup   |\n| 离职控件组      | apaascorehrOffboardingGroup\n\n## 通用参数\n\n审批实例的表单控件均包含的参数如下表所示。\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nid | string | 是 | 控件的 ID，需要与审批定义中的控件 ID 保持一致。\ntype | string | 是 | 控件类型。各控件类型取值参见下文 **不同控件的参数** 章节。\nvalue | 不同控件的类型不同 | 是 | 控件的取值。不同控件 value 数据类型也不同，例如单行文本控件的 value 为字符串、联系人的 value 为数组。详情参见下文 **不同控件的参数** 章节。\n\n## 不同控件的参数\n\n本章节提供不同控件的 type 参数值、JSON 示例以及非通用参数说明。\n\n### 单行文本\n\n控件 type 为 input，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"input\",\n    \"value\": \"data\" // string 类型\n}\n```\n\n### 多行文本\n\n控件 type 为 textarea，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"textarea\",\n    \"value\": \"data\" // string 类型\n}\n```\n\n### 日期\n\n控件 type 为 date，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"date\",\n    \"value\": \"2019-10-01T08:12:01+08:00\" // 需满足 RFC3339 格式的 string 类型\n}\n```\n\n### 日期区间\n\n控件 type 为 dateInterval，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"dateInterval\",\n    \"value\": {\n         \"start\":\"2019-10-01T08:12:01+08:00\",\n         \"end\":\"2019-10-02T08:12:01+08:00\",\n         \"interval\": 1.0\n     }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nstart | string | 是 | 开始时间，需满足 RFC3339 格式。\nend | string | 是 | 结束时间，需满足 RFC3339 格式。\ninterval | float | 是 | 时长（天）。\n\n### 单选\n\n控件 type 为 radio/radioV2，JSON 数据示例：\n\n```json\n{                                     \n    \"id\": \"widget1\",\n    \"type\": \"radioV2\",\n    \"value\": \"k2b8mkx0-h71x5gl1234-1\" // string 类型\n}\n```\n\n其中， value 表示选项值，取值范围需要参考相应审批定义中 **单选** 控件 option 的 value 参数。你可以通过审批定义详情返回的 `form` 参数，获取单选控件 option 的 value 取值。如果控件关联了外部选项，则 value 需要传入外部选项的 `options.id`。\n\n### 多选\n\n控件 type 为 checkbox/checkboxV2，JSON数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"checkboxV2\",\n    \"value\": [\"k2b8mkx0-h71x5gl4321-1\"] // string 类型的数组\n}\n```\n其中， value 表示选项值，取值范围需要参考相应审批定义中 **多选** 控件 option 的 value 参数。你可以通过审批定义详情返回的 `form` 参数，获取多选控件 option 的 value 取值。如果控件关联了外部选项，则 value 需要传入外部选项的 `options.id`。\n\n### 数字\n\n控件 type 为 number，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"number\",\n    \"value\": 1234.5678 // float 类型\n}\n```\n\n### 金额\n\n控件 type 为 amount，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"amount\",\n    \"value\": 1234.5678, // float 类型\n    \"currency\":\"USD\"\n}\n```\n\n其中，currency 表示货币种类，取值范围需要参考相应审批定义中 **金额** 控件的 value 参数。你可以通过审批定义详情返回的 `form` 参数，获取金额控件可设置的货币种类。\n\n### 计算公式\n\n控件 type 为 formula，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"formula\",\n    \"value\": 1234.5678 // 该值由审批定义内配置的公式计算出取值，若不匹配则返回报错。\n}\n```\n\n### 联系人\n\n控件 type 为 contact，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"contact\",\n    \"value\": [\"f8ca557e\"], // string 类型的数组\n    \"open_ids\": [\"ou_12345\"] // string 类型的数组\n}\n```\n其中，value 包含的是用户 `user_id`；open_ids 包含的是用户 `open_id`。\n\n### 关联审批\n\n控件 type 为 connect，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"connect\",\n    \"value\": [\"19EAC829-F1CB-527F-BE2A-1330422E60C0\"] // string 类型的数组\n}\n```\n其中，value 包含的是被关联的审批实例 Code，你可以通过审批实例详情能力根据实例 Code 获取实例详情。\n\n### 文档控件\n\n控件 type 为 document，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"document\",\n    \"value\": {\n           \"token\":\"TLLKdcpDro9ijQxA33ycNMabcef\",\n           \"type\":\"docx\",\n    }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\ntoken | string | 是 | 文档的 document_id。\ntype | string | 是 | 文档类型，支持 `docx`。\n\n### 附件\n\n控件 type 为 attachmentV2，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"attachmentV2\",\n    \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"] // string 类型的数组\n}\n```\n其中，value 包含的是上传文件后返回的文件 code。\n\n### 图片\n\n控件 type 为 image/imageV2，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"image\",\n    \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"] // string 类型的数组\n}\n```\n\n其中，value 包含的是上传文件后返回的文件 code。\n\n### 明细/表格\n\n控件 type 为 fieldList，JSON 格式示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"fieldList\",\n    \"value\": [\n         [   \n            {\n                \"id\": \"widget1\",\n                \"type\": \"checkbox\",\n                \"value\": [\"jxpsebqp-0\"]\n            }\n         ]\n     ]\n}\n```\n\n其中 value 是二维数组，根据审批定义内 **明细/表格** 控件所包含的控件，依次设置控件 JSON 值。\n\n### 部门\n\n控件 type 为 department，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"department\",\n    \"value\":[ \n        {\n            \"open_id\": \"od-xxx\"\n        }\n    ]\n}\n```\n\n其中 value 为对象数组，通过 open_id 设置部门的 open_department_id。\n\n### 电话\n\n控件 type 为 telephone，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"telephone\",\n    \"value\": {\n        \"countryCode\":\"+86\",\n        \"nationalNumber\":\"13122222222\"\n    }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\ncountryCode | string | 是 | 区号。\nnationalNumber | string | 是 | 电话号。\n\n### 地址\n控件 type 为 address，JSON 数据示例：\n\n```json\n{\n\t\"id\": \"widget1\",\n\t\"type\": \"address\",\n\t\"value\": [{\n\t\t\"id\": \"290557\",\n\t\t\"detailAddress\": \"详细的地址\"\n\t}]\n}\n```\n\nvalue 参数为 []object 类型，参数说明如下：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nvalue | []object | 是 | 非出差控件组场景地址控件仅支持单个地址，传入多个时默认只取第一个\n└ id | string | 是 | 区域ID, 可通过审批的地理库接口获取\n└ detailAddress | string | 否 | 详细的地址，若表单配置中未开启填写详细地址，则会忽略该参数，即使传入也不会生效\n\n### 换班控件组\n\n控件 type 为 shiftGroup，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"shiftGroup\",\n    \"value\": {\n         \"shiftTime\": \"2019-10-01T08:12:01+08:00\",\n         \"returnTime\": \"2019-10-02T08:12:01+08:00\",\n         \"reason\": \"ask for leave\"\n     }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nshiftTime | string | 是 | 换班时间，需满足 RFC3339 格式。\nreturnTime | string | 是 | 对调日期，需满足 RFC3339 格式。\nreason | string | 是 | 换班原因。\n\n### 请假控件组\n\n**请假控件组请求示例**\n```json\n{\n    \"id\": \"widgetLeaveGroupV2\",\n    \"type\": \"leaveGroupV2\",\n    \"value\": [\n      {\n        \"id\": \"widgetLeaveGroupType\",\n        \"type\": \"radioV2\",\n        \"value\": \"7488925543484620819\"\n      },\n      {\n        \"id\": \"widgetLeaveGroupStartTime\",\n        \"type\": \"date\",\n        \"value\": \"2025-08-25T11:30:00+08:00\"\n      },\n      {\n        \"id\": \"widgetLeaveGroupEndTime\",\n        \"type\": \"date\",\n        \"value\": \"2025-08-26T11:35:00+08:00\"\n      },\n      {\n        \"id\": \"widgetLeaveGroupReason\",\n        \"type\": \"textarea\",\n        \"value\": \"123123\"\n      },\n      {\n        \"id\": \"widgetLeaveCertification\",\n        \"type\": \"image\",\n        \"value\": [\n          \"B69F8E26-0EAA-4A92-9B80-DA613CD36136\"\n        ]\n      },\n      {\n        \"id\":\"widgetLeaveCertification\",\n        \"type\":\"image\",\n        \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]\n      },\n      {                                     \n        \"id\": \"widgetLeaveGroupFeedingArrivingLate\",\n        \"type\": \"radioV2\",\n        \"value\": \"30\"\n      },\n      {                                     \n        \"id\": \"widgetLeaveGroupFeedingOffLeaveEarly\",\n        \"type\": \"radioV2\",\n        \"value\": \"30\"\n      }        \n    ]\n}\n```\n\n**请假控件组包含参数说明：**\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nid | string | 是 | 控件组ID，固定为widgetLeaveGroupV2\ntype | string | 是 | 控件组类型，固定为leaveGroupV2\nvalue | object[] | 是 | 控件组的值，值为多个子控件值的列表\n\nvalue中包含的子控件值说明:\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nwidgetLeaveGroupType | radioV2 | ```<br>{<br>\"id\": \"widgetLeaveGroupType\",<br>\"type\": \"radioV2\",<br>\"value\": \"7488925543484620819\"<br>}<br>``` | 假期类型，具体格式可参考单选控件，选项由假勤接口获取，提单时必须包含该控件\nwidgetLeaveGroupStartTime | date | ```<br>{<br>\"id\": \"widgetLeaveGroupStartTime\",<br>\"type\": \"date\",<br>\"value\": \"2019-10-01T08:12:01+08:00\", // 需满足 RFC3339 格式的 string 类型<br>}    <br>``` | 请假开始时间，具体格式可参考日期控件，会根据假期类型自动取整,其中半天假小于12点则认为是上午，小时假则以半小时为粒度向前取整, 提单时必须包含该控件\nwidgetLeaveGroupEndTime | date | ```<br>{<br>\"id\": \"widgetLeaveGroupEndTime\",<br>\"type\": \"date\",<br>\"value\": \"2019-10-01T08:12:01+08:00\", // 需满足 RFC3339 格式的 string 类型<br>}<br>``` | 请假结束时间，具体格式可参考日期控件，会根据假期类型自动取整，其中半天假小于12点则认为是上午，小时假则以半小时为粒度向后取整\nwidgetLeaveGroupReason | textarea | ```<br>{<br>\"id\": \"widgetLeaveGroupReason\",<br>\"type\": \"textarea\",<br>\"value\": \"123123\"<br>}<br>``` | 请假事由，具体格式可参考多行文本控件，哺乳假无需填写，其他情况则根据控件组配置中该控件是否可见以及必填判断\nwidgetLeaveCertification | image | ```<br>{<br>\"id\":\"widgetLeaveCertification\",<br>\"type\":\"image\",<br>\"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]<br>}<br>``` | 请假证明，具体格式可参考图片控件，如果所选假期类型配置要求补充证明则必须传递该值，缺失会报错\nwidgetLeaveGroupFeedingArrivingLate | radioV2 | ```<br>{                                     <br>\"id\": \"widgetLeaveGroupFeedingArrivingLate\",<br>\"type\": \"radioV2\",<br>\"value\": \"30\"<br>}<br>``` | 上班晚到的分钟数，具体格式可参考单选控件，仅哺乳假需要填写，取值范围是0-120分钟，粒度是15分钟，选项从审批定义中该控件的option中获取\nwidgetLeaveGroupFeedingOffLeaveEarly | radioV2 | ```<br>{                                     <br>\"id\": \"widgetLeaveGroupFeedingOffLeaveEarly\",<br>\"type\": \"radioV2\",<br>\"value\": \"30\"<br>}   <br>``` | 下班早走的分钟数，具体格式可参考单选控件，仅哺乳假需要填写，取值范围是0-120分钟，粒度是15分钟，选项即是分钟对应的字符串\n\n**特殊的参数校验报错信息**\nmessage                                            | 说明                           |\n| -------------------------------------------------- | ---------------------------- |\n| leave type id parse error                          | 请假类型不是int64                  |\n| group value is invalid                             | 当前控件组的值无效，请校验是否为空或者校验类型是否为数组 |\n| start time format is not RFC3339                   | 开始时间日期格式非*RFC3339格式*         |\n| end time format is not RFC3339                     | 结束时间日期格式非*RFC3339格式*         |\n| start time is after end time                       | 开始时间晚于结束时间                   |\n| user not in gray                                   | 申请用户不在假勤灰度内                  |\n| leave type not found                               | 请假类型不存在                      |\n| reason is required                                 | 请假原因未填写                      |\n| leave quote should be bigger than 0                | 请假时长需要大于0                    |\n| leave is conflict                                  | 所选时间内已有请假记录，请选择其他时间          |\n| balance is not enough                              | 当前假期类型下假期余额不足                |\n| certification is required                          | 需要上传请假证明                     |\n| arriving late is required                          | 哺乳假需要填写上班晚到时长                |\n| arriving late value is not in the optional items   | 晚到时间不在可选范围内                  |\n| leaving early is required                          | 哺乳假需要填写下班提前时长                |\n| leaving early value is not in the optional items   | 下班提前时间不在可选范围内                |\n| feeding rest daily is 0                            | 哺乳假每日休息时长为0，请重新选择            |\n| the operation is prohibited by the workforce rules | 当前账户已在假勤侧封账，无法提交\n\n### 加班控件组\n\n**加班控件组请求示例**\n```json\n{\n  \"id\": \"widgetWorkGroup\",\n  \"type\": \"workGroup\",\n  \"value\":[\n    {\n      \"id\":\"widgetWorkGroupOvertimeWorkers\",\n      \"type\":\"contact\",\n      \"value\": [\"f8ca557e\"],\n      \"open_ids\": [\"ou_12345\"]\n    },\n    {\n      \"id\": \"widgetWorkGroupType\",\n      \"type\": \"radioV2\",\n      \"value\": \"7259635026038505475\"\n    },\n    {\n      \"id\":\"widgetWorkGroupTimeRangeFieldList\",\n      \"type\":\"fieldList\",\n      \"value\":[\n        [\n          {\n            \"id\":\"widgetWorkGroupStartTime\",\n            \"type\":\"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n          },\n          {\n            \"id\":\"widgetWorkGroupEndTime\",\n            \"type\":\"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n          }\n        ]\n      ]\n    },\n    {\n      \"id\": \"widgetWorkGroupReason\",\n      \"type\": \"textarea\",\n      \"value\": \"111\"\n    }\n  ]\n}\n\n```\n\n**加班控件组参数说明：**\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nid | string | 是 | 控件组ID，固定为widgetWorkGroup\ntype | string | 是 | 控件组类型，固定为workGroup\nvalue | object[] | 是 | 控件组的值，值为多个子控件值的列表\n\nvalue中包含的子控件值说明:\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nwidgetWorkGroupOvertimeWorkers | contact | ```<br>{<br>\"id\":\"widgetWorkGroupOvertimeWorkers\",<br>\"type\":\"contact\",<br>\"value\": [\"f8ca557e\"], <br>\"open_ids\": [\"ou_12345\"]<br>}<br>``` | 加班人员列表，具体格式可参考联系人控件，如果定义中配置「允许代多人提交」则该字段必填，如果是提交人给自己提交需填写提交人的ID\nwidgetWorkGroupType | radioV2 | ```<br>{<br>\"id\": \"widgetWorkGroupType\",<br>\"type\": \"radioV2\",<br>\"value\": \"7259635026038505475\" // 对应的类型选项ID<br>}<br>``` | 加班类型，具体格式可参考单选控件，如果定义中关闭「关联加班规则」则需要填写该字段\nwidgetWorkGroupTimeRangeFieldList | fieldList | ```<br>{<br>\"id\":\"widgetWorkGroupTimeRangeFieldList\",<br>\"type\":\"fieldList\",<br>\"value\":[<br>[<br>{<br>\"id\":\"widgetWorkGroupStartTime\",<br>\"type\":\"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>},<br>{<br>\"id\":\"widgetWorkGroupEndTime\",<br>\"type\":\"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>}<br>]<br>]<br>}<br>``` | 加班时段，具体格式可参考明细控件，如果定义中打开「允许提交多个加班时段」则可以传多个，最多支持30个，否则只会取第一个，单次加班时长不可超过两天\nwidgetWorkGroupReason | textarea | ```<br>{<br>\"id\": \"widgetWorkGroupReason\",<br>\"type\": \"textarea\",<br>\"value\": \"111\"<br>}<br>``` | 加班事由，如果定义中配置了「加班事由」必填，则必须填写该字段\n\n**特殊的参数校验报错信息**\nmessage                                                                            | 说明                           |\n| ---------------------------------------------------------------------------------- | ---------------------------- |\n| the time range list has more than 30 items                                         | 加班时段数量超过30                   |\n| group value is invalid                                                             | 当前控件组的值无效，请校验是否为空或者校验类型是否为数组 |\n| overtime type is required                                                          | 未关联加班规则时，加班类型必填              |\n| work time range is required                                                        | 至少需要一个加班时段                   |\n| start time is after end time                                                       | 开始时间晚于结束时间                   |\n| start time or end time of range is required                                        | 加班时间段的开始时间和结束时间必填            |\n| overtime duration is over 2 days                                                   | 单次加班时长不可超过两天                 |\n| overtime date time zone not support                                                | 加班时段的日期时区信息无法识别              |\n| {date} can not apply overtime                                                      | 所选时间不可申请加班                   |\n| {date} already apply overtime                                                      | 所选时间已经有加班记录                  |\n| {date} no need approval                                                            | 所选日期加班无需申请                   |\n| apply reason is required                                                           | 定义中设置了加班事由为必填，不可为空           |\n| {users} user follow different overtime rules, cannot be submitted in the same form | 所选加班人不在同一个考勤组内，无法同时提交加班      |\n| invalid overtime work application                                                  | 没有有效的加班申请，请重新选择加班日期          |\n| the overtime duration cannot be 0                                                  | 加班时长不能是0                     |\n| the number of apply workers cannot exceed 50                                       | 单次申请加班人数量不可大于50              |\n| apply worker is required                                                           | 必须有加班人，配置置可代多人提交时必须指定加班人     |\n| resigned worker can not apply                                                      | 离职人员不可申请加班                   |\n| overtime duration is over limit                                                    | 加班时长超过限制\n\n### 外出控件组\n\n**外出控件组请求体示例**\n```json\n{\n    \"id\": \"widgetOutGroup\",\n    \"type\": \"outGroup\",\n    \"value\":[\n        {\n            \"id\": \"widgetOutGroupType\",\n            \"type\": \"radioV2\",\n            \"value\":  \"me15yqrf-gmjgbml2vhp-0\"      \n        },\n        {\n            \"id\": \"widgetOutGroupStartTime\",\n            \"type\": \"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n        },\n        {\n            \"id\": \"widgetOutGroupEndTime\",\n            \"type\": \"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n        },\n        {\n            \"id\": \"widgetOutGroupReason\",\n            \"type\": \"textarea\",\n            \"value\":\"123213\"\n        },\n        {\n            \"id\":\"widgetOutGroupImage\",\n            \"type\":\"image\",\n            \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]\n        }                    \n    ]   \n}\n\n```\n\n**外出控件参数说明**\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nid | string | 是 | 控件组ID，固定为widgetOutGroup\ntype | string | 是 | 控件组Type，固定为outGroup\nvalue | object[] | 是 | 控件组的值，值为多个子控件值的列表\n\nvalue中包含的子控件值说明:\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nwidgetOutGroupType | radioV2 | ```<br>{<br>\"id\": \"widgetOutGroupType\",<br>\"type\": \"radioV2\",<br>\"value\":  \"me15yqrf-gmjgbml2vhp-0\"      <br>}<br>``` | 外出类型，具体格式可参考单选控件，如果配置了「外出类型」则必填，外出时长单位会选取所选外出类型关联的单位，如果没有配置「外出类型」，则该字段无需填写，计算外出时长时会选取「外出时长」配置的单位\nwidgetOutGroupStartTime | date | ```<br>{<br>\"id\": \"widgetOutGroupStartTime\",<br>\"type\": \"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>}<br>``` | 外出开始时间，具体格式可参考日期控件，如果外出时长单位是半天假，则小于12点则认为是上午，否则认为是下午；如果单位是小时，则会按半小时的粒度向前取整\nwidgetOutGroupEndTime | date | ```<br>{<br>\"id\": \"widgetOutGroupEndTime\",<br>\"type\": \"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>}<br>``` | 外出结束时间，具体格式可参考日期控件，如果外出时长单位是半天假，则小于12点则认为是上午，否则认为是下午；如果单位是小时，则会按半小时的粒度向后取整\nwidgetOutGroupReason | textarea | ```<br>{<br>\"id\": \"widgetOutGroupReason\",<br>\"type\": \"textarea\",<br>\"value\":\"123213\"<br>}<br>``` | 外出事由，具体格式可参考多行文本控件，如果定义中「外出事由」必填，则必须填写该控件，如果定义配置无需填写，则无需填写该控件\nwidgetOutGroupImage | image | ```<br>{<br>\"id\":\"widgetOutGroupImage\",<br>\"type\":\"image\",<br>\"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]<br>}   <br>``` | 外出证明，具体格式可参考图片控件，如果定义中「外出拍照」必填，则必须填写该控件，如果定义配置无需填写，则无需填写该控件\n\n**特殊的参数校验报错信息**\n\nmessage                                               | 说明                           |\n| ----------------------------------------------------- | ---------------------------- |\n| group value is invalid                                | 当前控件组的值无效，请校验是否为空或者校验类型是否为数组 |\n| start time format is not RFC3339                      | 开始时间日期格式非*RFC3339格式*         |\n| end time format is not RFC3339                        | 结束时间日期格式非*RFC3339格式*         |\n| start time and end time must be in the same time zone | 开始时间与结束时间必须是同一时区             |\n| out type is required                                  | 如果定义中设定了「外出类型」，则外出类型必填       |\n| out start time is required                            | 外出开始时间必填                     |\n| out end time is required                              | 外出结束时间必填                     |\n| out duration must be greater than 0                   | 外出间隔不能为0，请检查起止时间并重新选择        |\n| out reason is empty                                   | 如果定义中勾选「外出事由」同时设定必填，则该字段必填   |\n| photo is required                                     | 如果定义中勾选「外出拍照」同时设定必填，则该字段必填   |\n| out time is conflict                                  | 外出时间有冲突，请确认是否已在该时段申请外出\n","skills/lark-approval/references/lark-approval-instance-value-sourcing.md":"# 审批提单值来源\n\n## 目的\n\n本文用于回答一个固定问题：在调用 `approval instances create` 发起原生审批实例时，**每个要填写的值从哪里拿**。\n\n阅读顺序固定如下：\n\n1. [`lark-approval-initiate.md`](./lark-approval-initiate.md) 中的创建请求参数、节点参数和返回结果说明\n2. `approval approvals get` 返回的 `form` / `node_list`\n3. [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md)\n4. 本文\n\n## 总原则\n\n- `lark-approval-initiate.md` 决定创建请求字段名、字段层级、节点参数结构。\n- `approvals.get.form` 决定控件 `id`、`type`、选项值范围、子控件结构。\n- `approvals.get.node_list` 决定节点 key、是否必须补审批人、是否允许多人。\n- [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 决定各控件 `value` 的最终结构。\n- 除非本文明确允许，否则不要猜值来源，不要把展示文案直接当成可提交值。\n\n## 默认来源\n\n- 审批定义、`approval_code`、`is_external`、`create_link` 等基础信息，默认从 `approval approvals search` 获取。\n- 控件 `id`、`type`、选项值、子控件结构，默认从 `approval approvals get.form` 获取。\n- 节点 key、`need_approver`、`approver_chosen_multi` 等节点信息，默认从 `approval approvals get.node_list` 获取。\n- 本文只补充 **这些默认来源之外** 的取值规则，以及当前必须由用户直接提供的值。\n\n## 控件值来源规则\n\n### 联系人 `contact`\n\n- 只推荐写 `open_ids`。\n- 不再推荐双写 `value(user_id)` + `open_ids`，避免复杂度继续上升。\n- 如果用户给的是姓名、邮箱或账号，先用 `lark-contact` 解析成 `open_id`。\n\n### 部门 `department`\n\n- 最优先：用户直接提供 `open_department_id`。\n- 若用户说“我的部门”或“张三的部门”，先用 `lark-contact` 查询对应人员信息，再取其所属部门里的 `open_department_id`。\n- 如果查到该人员只有一个部门，可直接使用。\n- 如果查到多个部门，不自动猜，必须让用户明确选一个，或直接输入 `open_department_id`。\n- 如果仍无法确定，则明确告知当前不支持自动决定部门值。\n\n### 附件 `attachmentV2`\n\n- 当前 `lark-approval` 不负责上传文件。\n- 用户必须直接提供 file code。\n- 如果用户无法提供 file code，应明确告知当前无法仅通过 `lark-approval` 完成该控件提单。\n\n### 图片 `image` / `imageV2`\n\n- 当前 `lark-approval` 不负责上传图片。\n- 用户必须直接提供 file code。\n- 如果用户无法提供 file code，应明确告知当前无法仅通过 `lark-approval` 完成该控件提单。\n\n### 文档 `document`\n\n- 用户可直接提供 `token` / `document_id`。\n- 如果用户给的是飞书文档链接，应先尝试从链接中提取 token。\n- 若链接提取失败，再要求用户手动输入 token。\n\n### 关联审批 `connect`\n\n- 用户直接提供目标审批实例的 `instance_code`。\n- 当前不默认做“搜索关联实例再反查 code”的自动流程。\n\n### 地址 `address`\n\n- 用户直接提供地理库 `id`。\n- 若用户无法提供该 `id`，当前不支持自动取值。\n\n## 特殊控件组\n\n以下控件组的结构仍按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 组装：\n\n- `leaveGroupV2`\n- `workGroup`\n- `outGroup`\n- `shiftGroup`\n\n补充规则：\n\n- 控件组自身和子控件的 `id` / `type` 从 `approval approvals get.form` 中识别。\n- 组内单选/多选或业务枚举值，优先从 `approval approvals get.form` 返回的选项结构中取。\n- 不要把控件组整体当成普通字符串或扁平对象提交。\n\n## 不支持自动准备的值\n\n以下值当前不建议由 `lark-approval` 自动准备：\n\n- 文件上传后的 file code\n- 图片上传后的 file code\n- 地址控件的地理库 `id`\n- 无法唯一确定的部门 `open_department_id`\n\n遇到这类值时，应明确告诉用户需要提供什么，而不是继续猜测。\n\n## 最小决策表\n\n| 场景 | 处理 |\n|---|---|\n| 用户说“找张三当审批人” | 用 `lark-contact` 解析张三，取 `open_id` |\n| 用户说“我的部门” | 先查当前用户部门；若多个部门，让用户选 |\n| 用户给了文档链接 | 先尝试提取 token |\n| 用户要填图片/附件 | 要求直接提供 file code |\n| 用户要填关联审批 | 要求直接提供 `instance_code` |\n| 用户要填地址 | 要求直接提供地理库 `id` |\n","skills/lark-approval/references/lark-approval-instances-cancel.md":"\n# approval instances cancel\n\n撤回一个已发起的审批实例（用户级写操作）。通常先通过 `instances initiated`、`tasks query` 或 `instances get` 确认目标审批实例，拿到 `instance_code` 后再执行撤回。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要撤回该审批实例且目标实例无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:instance:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval instances cancel \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' \\\n  --as user \\\n  --dry-run\n\n# 撤回一个审批实例\nlark-cli approval instances cancel \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体\nlark-cli approval instances cancel \\\n  --data @./cancel-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `instances initiated`、`tasks query` 或 `instances get` 获取 |\n| `--as user` | 否 | 建议显式指定用户身份；审批实例撤回通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n如果你要找“我发起的审批实例”，可先查询已发起列表：\n\n```bash\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n```\n\n如果你已经在任务列表中定位到某个审批，也可以从任务里拿到实例 Code：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `instances[].instance_code` | 审批实例 Code；撤回时必须提供 |\n| `tasks[].instance_code` | 审批任务关联的审批实例 Code；也可作为撤回输入 |\n| `tasks[].instance_status` | 审批实例状态；可用于判断是否仍处于可撤回阶段 |\n\n如需先确认审批表单、当前节点、流转状态，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **撤回的是审批实例，不是单个任务**：`instances cancel` 只需要 `instance_code`，不需要 `task_id`。\n- **优先确认实例是否仍可撤回**：已经通过、已拒绝、已撤销或已终止的实例通常不适合继续撤回。\n- **优先从 `instances initiated` 获取目标实例**：因为撤回通常针对“我发起的审批”，这个入口最直接。\n- **也可从 `tasks query` 反查 `instance_code`**：当你是从某个待办/已办上下文进入时，这样更方便。\n- **先 `--dry-run` 再执行**：尤其在实例来源不明确、用户只给了标题关键字，或一次要核对多个实例时，先预览更安全。\n","skills/lark-approval/references/lark-approval-instances-cc.md":"\n# approval instances cc\n\n给一个审批实例追加抄送人（用户级写操作）。通常先通过 `instances initiated`、`tasks query` 或 `instances get` 确认目标审批实例，拿到 `instance_code` 后，再提供抄送人的用户 ID 执行抄送。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要抄送该审批实例且目标实例、抄送对象都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:instance:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"ou_xxx\"],\"comment\":\"抄送给项目 owner 了解进展\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --dry-run\n\n# 按 open_id 抄送一个人\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"ou_xxx\"],\"comment\":\"抄送给你知悉\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 一次抄送多个人\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"ou_xxx\",\"ou_yyy\"],\"comment\":\"请相关同学同步关注\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 按 user_id 抄送\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"123456789\"],\"comment\":\"抄送给财务负责人\"}' \\\n  --params '{\"user_id_type\":\"user_id\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体\nlark-cli approval instances cc \\\n  --data @./cc-body.json \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `instances initiated`、`tasks query` 或 `instances get` 获取 |\n| `cc_user_ids` | 是 | 抄送人的用户 ID 数组；需要和 `user_id_type` 保持一致 |\n| `comment` | 否 | 抄送留言，例如 `抄送给你知悉`、`请同步关注该审批进展` |\n| `--params '{\"user_id_type\":\"...\"}'` | 否 | 查询参数 JSON；用于声明 `cc_user_ids` 内用户 ID 的类型 |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id`；未显式指定时要特别确认抄送人的 ID 类型 |\n| `--as user` | 否 | 建议显式指定用户身份；审批实例抄送通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n如果你要找“我发起的审批实例”，可先查询已发起列表：\n\n```bash\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n```\n\n如果你已经在任务列表中定位到某个审批，也可以从任务里拿到实例 Code：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `instances[].instance_code` | 审批实例 Code；抄送时必须提供 |\n| `tasks[].instance_code` | 审批任务关联的审批实例 Code；也可作为抄送输入 |\n| `tasks[].title` | 任务标题，可用于确认是否是要操作的那个审批 |\n| `tasks[].instance_status` | 审批实例状态；可用于判断当前审批是否仍处于进行中 |\n\n如果你手里只有姓名或邮箱，建议先通过联系人能力解析出正确的用户 ID，再执行抄送。\n\n如需先确认审批表单、当前节点、流转状态，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **抄送的是审批实例，不是单个任务**：`instances cc` 只需要 `instance_code`，不需要 `task_id`。\n- **`cc_user_ids` 与 `user_id_type` 必须匹配**：例如传 open_id 就把 `user_id_type` 设为 `open_id`；不要混用。\n- **`cc_user_ids` 是数组**：即使只抄送一个人，也要按数组形式传入。\n- **优先显式传 `user_id_type`**：这样 agent 更容易判断参数含义，也能减少 ID 类型不匹配带来的失败。\n- **优先从 `instances initiated` 获取目标实例**：因为抄送常见于“我发起的审批”场景，这个入口最直接。\n- **也可从 `tasks query` 反查 `instance_code`**：当你是从某个审批上下文进入时，这样更方便。\n- **`comment` 建议简洁明确**：例如 `抄送给你知悉`、`请同步关注审批进展`。避免过长或模糊描述。\n- **先 `--dry-run` 再执行**：尤其在抄送对象较多、抄送人来源不明确，或需要让用户先核对实例标题时，先预览更安全。\n","skills/lark-approval/references/lark-approval-instances-get.md":"\n# approval instances get\n\n获取单个审批实例详情（用户级只读操作）。适合在执行 approve / reject / transfer / rollback / cancel / cc / remind 之前，先查看审批表单、当前节点、任务列表、审批动态和整体状态。\n\n需要的 scopes: [\"approval:instance:read\"]\n\n## 命令\n\n```bash\n# 按实例 Code 查询详情\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n\n# 表格格式输出，便于快速浏览顶层字段\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{...}'` | 是 | 查询参数，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code |\n| `locale` | 否 | 返回语言，例如 `zh-CN`、`en-US`、`ja-JP` |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id` |\n| `--as user` | 否 | 建议显式指定用户身份；审批实例详情查询通常应使用用户身份 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 常见输入来源\n\n如果你已经有实例 Code，可直接查询：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n如果你还没有实例 Code，可先从以下命令获取：\n\n```bash\n# 查询我发起的审批实例\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n\n# 或从任务列表里拿到关联实例 Code\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n## 输出重点字段\n\n返回结果中常见字段：\n\n| 字段 | 说明 |\n|------|------|\n| `instance_code` | 审批实例 Code |\n| `serial_number` | 审批单编号 |\n| `definition_code` | 审批定义 Code |\n| `definition_name` | 审批名称 |\n| `user_id` | 发起审批的用户 ID |\n| `department_id` | 发起人所在部门 ID |\n| `status` | 审批实例状态，见下方“status 枚举” |\n| `reverted` | 单据是否已被撤销 |\n| `start_time` | 审批创建时间 |\n| `end_time` | 审批完成时间，未完成时通常为 `0` |\n| `form` | 表单数据，JSON 字符串 |\n| `current_nodes` | 当前审批节点列表 |\n| `tasks` | 审批任务列表 |\n| `operation_records` | 审批动态，例如通过、拒绝、转交、加签、回退、撤回、抄送 |\n| `comments` | 评论列表 |\n\n## status 枚举\n\n| 值 | 含义 |\n|----|------|\n| `PENDING` | 审批中 |\n| `APPROVED` | 已通过 |\n| `REJECTED` | 已拒绝 |\n| `CANCELED` | 已撤回 |\n| `DELETED` | 已删除 |\n\n## current_nodes 重点字段\n\n`current_nodes` 常用于判断审批流当前卡在哪一层：\n\n| 字段 | 说明                                       |\n|------|------------------------------------------|\n| `current_nodes[].node_id` | 当前审批节点 ID                                |\n| `current_nodes[].node_name` | 当前审批节点名称                                 |\n| `current_nodes[].type` | 审批方式：`AND` 会签、`OR` 或签、`SEQUENTIAL` 依次审批等 |\n| `current_nodes[].approvers[].task_id` | 当前审批人关联任务 ID                             |\n| `current_nodes[].approvers[].user_id` | 当前审批人用户 ID                               |\n\n## tasks 重点字段\n\n`tasks` 常用于把实例和具体审批任务关联起来：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].id` | 审批任务 ID |\n| `tasks[].node_id` | 任务所属节点 ID |\n| `tasks[].node_name` | 任务所属节点名称 |\n| `tasks[].user_id` | 审批人用户 ID |\n| `tasks[].status` | 任务状态：`PENDING`、`APPROVED`、`REJECTED`、`TRANSFERRED`、`DONE` |\n| `tasks[].start_time` | 任务开始时间 |\n| `tasks[].end_time` | 任务完成时间 |\n\n## operation_records 重点字段\n\n`operation_records` 常用于审计审批过程：\n\n| 字段 | 说明 |\n|------|------|\n| `operation_records[].type` | 事件类型，如 `PASS`、`REJECT`、`TRANSFER`、`ROLLBACK`、`CANCEL`、`CC` |\n| `operation_records[].create_time` | 事件发生时间 |\n| `operation_records[].user_id` | 触发该事件的用户 ID |\n| `operation_records[].task_id` | 关联任务 ID |\n| `operation_records[].node_id` | 关联节点 ID |\n| `operation_records[].comment` | 理由 / 备注 |\n| `operation_records[].cc_user_ids` | 被抄送人列表（抄送事件时） |\n\n## 使用建议\n\n- **这是最适合做“详情确认”的只读命令**：当你已经拿到 `instance_code`，需要确认表单、当前节点、任务状态、审批动态时，优先使用它。\n- **在执行写操作前先看详情**：例如做 `tasks rollback` 前确认可退回节点，做 `instances cancel` 前确认实例状态，做 `tasks remind` 前确认当前任务是否仍待处理。\n- **`form` 是 JSON 字符串**：调用方通常还需要再解析一层，才能拿到表单字段值。\n- **`current_nodes` 和 `tasks` 可以联动看**：前者看“当前卡在哪个节点”，后者看“每个任务目前由谁处理、状态如何”。\n- **`operation_records` 适合做时间线回溯**：例如排查谁转交过、谁加签过、什么时候撤回或抄送过。\n- **优先显式传 `locale` 和 `user_id_type`**：这样 agent 更容易理解返回文本和 ID 语义，减少歧义。\n\n## 输出与后续操作\n\n读取详情后，常见下一步：\n\n```bash\n# 同意审批任务\nlark-cli approval tasks approve --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\"}' --as user --yes\n\n# 撤回审批实例\nlark-cli approval instances cancel --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --yes\n\n# 催办审批任务\nlark-cli approval tasks remind --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID>\"]}' --as user --yes\n```\n","skills/lark-approval/references/lark-approval-instances-initiated.md":"\n# approval instances initiated\n\n查询当前用户已发起的审批实例列表（用户级只读操作）。适合在需要查看“我发起了哪些审批”、筛选某类审批定义、获取 `instance_code` 供后续 `instances get` / `instances cancel` / `instances cc` 等命令使用时调用。\n\n需要的 scopes: [\"approval:instance:read\"]\n\n## 命令\n\n```bash\n# 查询我发起的审批列表\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n\n# 只看某个审批定义下我发起的实例\nlark-cli approval instances initiated --params '{\"definition_code\":\"<DEFINITION_CODE>\",\"page_size\":20}' --as user\n\n# 按关键词搜索我发起的实例\nlark-cli approval instances initiated --params '{\"keyword\":\"测试\",\"page_size\":10}' --as user\n\n# 按发起时间范围筛选（秒级时间戳）\nlark-cli approval instances initiated --params '{\"start_timestamp\":\"<START_SECONDS>\",\"end_timestamp\":\"<END_SECONDS>\",\"page_size\":20}' --as user\n\n# 使用 page_token 翻页\nlark-cli approval instances initiated --params '{\"page_size\":20,\"page_token\":\"example_page_token\"}' --as user\n\n# 表格格式输出，便于快速浏览\nlark-cli approval instances initiated --params '{\"page_size\":20}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{...}'` | 否 | 查询参数，使用 JSON 传入；不传时使用默认分页与筛选 |\n| `definition_code` | 否 | 审批定义 Code，用于只查看某个审批定义下我发起的实例 |\n| `keyword` | 否 | 搜索关键词；非空时走搜索链路，空或仅空格时保持普通列表链路 |\n| `start_timestamp` | 否 | 按发起时间筛选，时间范围开始值，秒级时间戳 |\n| `end_timestamp` | 否 | 按发起时间筛选，时间范围结束值，秒级时间戳 |\n| `locale` | 否 | 返回语言：`zh-CN`、`en-US`、`ja-JP` |\n| `page_size` | 否 | 分页大小 |\n| `page_token` | 否 | 翻页标记；首次请求不填，后续使用上一次返回的 `page_token` |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id` |\n| `--as user` | 否 | 建议显式指定用户身份；已发起审批列表查询通常应使用用户身份 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 输出重点字段\n\n返回结果中常见字段：\n\n| 字段 | 说明 |\n|------|------|\n| `count` | 列表计数，只在第一页返回；大于等于 100 个实例时返回 `99` |\n| `has_more` | 是否还有更多数据 |\n| `page_token` | 下一页翻页 Token |\n| `instances[].instance_code` | 审批实例 Code；后续查询详情或执行撤回 / 抄送时通常需要 |\n| `instances[].definition_code` | 审批定义 Code |\n| `instances[].definition_name` | 审批定义名称 |\n| `instances[].definition_group_id` | 审批定义分组 ID |\n| `instances[].definition_group_name` | 审批定义分组名称 |\n| `instances[].initiator` | 发起人 ID |\n| `instances[].initiator_name` | 发起人姓名 |\n| `instances[].instance_status` | 审批实例状态，见下方“instance_status 枚举” |\n| `instances[].instance_external_id` | 第三方审批实例 ID（仅第三方审批实例存在） |\n| `instances[].link` | 三方审批跳转链接 |\n| `instances[].summaries` | 摘要字段列表 |\n\n## instance_status 枚举\n\n| 值 | 含义 |\n|----|------|\n| `0` | 无流程状态，不展示对应标签 |\n| `1` | 流程实例流转中 |\n| `2` | 已通过 |\n| `3` | 已拒绝 |\n| `4` | 已撤销 |\n| `5` | 已终止 |\n\n## 常见使用场景\n\n### 1) 找到我要操作的审批实例\n\n```bash\nlark-cli approval instances initiated --params '{\"page_size\":20}' --format table --as user\n```\n\n拿到 `instances[].instance_code` 后，可继续：\n\n```bash\n# 查看审批实例详情\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n\n# 撤回审批实例\nlark-cli approval instances cancel --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --yes\n```\n\n### 2) 只看某类审批\n\n```bash\nlark-cli approval instances initiated \\\n  --params '{\"definition_code\":\"<DEFINITION_CODE>\",\"page_size\":20}' \\\n  --as user\n```\n\n\n## 使用建议\n\n- **这是定位“我发起的审批实例”的首选命令**：如果你的目标是撤回、抄送、查看某个已发起审批，优先从这里拿 `instance_code`。\n- **优先用 `definition_code` 缩小范围**：当你已知审批定义时，先筛掉无关实例，可显著提升可读性。\n- **需要搜索时传入 `keyword`**：搜索排序和普通列表排序不同，按搜索服务结果为准。\n- **按时间排查时使用 `start_timestamp` / `end_timestamp`**：这两个值都是秒级时间戳，用于按发起时间缩小结果范围。\n- **结果很多时优先 `--format table`**：适合人工快速浏览。\n- **`count` 只在第一页返回**：做分页处理时不要假设后续页还会带总数。\n- **`instance_status` 可直接判断下一步**：例如状态为 `1` 时通常可继续查看详情或考虑撤回，状态为 `4` 表示已经撤销，无需重复撤回。\n- **摘要字段 `summaries` 很适合做列表预览**：当审批标题不够明确时，可结合摘要值帮助识别目标实例。\n\n## 输出与后续操作\n\n拿到列表后，常见下一步：\n\n```bash\n# 查看单个审批实例详情\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n\n# 撤回审批实例\nlark-cli approval instances cancel --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --yes\n\n# 给审批实例追加抄送人\nlark-cli approval instances cc --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"<USER_ID>\"]}' --params '{\"user_id_type\":\"open_id\"}' --as user --yes\n```\n","skills/lark-approval/references/lark-approval-tasks-add-sign.md":"\n# approval tasks add_sign\n\n给一个审批任务加签（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，确认目标任务后，再提供被加签人的用户 ID、加签方式等参数执行加签。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要对该审批任务加签且目标任务、加签对象、加签方式都无误，再带 `--yes` 运行。用户已明确要求立即执行且列清本轮的加签、转交对象时，该确认覆盖这两个已明确的动作，不要逐条重复询问；不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 先选择加签类型\n\n`add_sign_type` 会影响当前用户的审批任务是否继续可操作，不能只按示例顺序或任意选择：\n\n| 用户意图 | `add_sign_type` | 处理方式 |\n|----------|-----------------|----------|\n| 明确说前加签 / “先让某人审核，我再审” | `1` | 前加签，并按用户要求选择 `approval_method` |\n| 明确说后加签 / “我处理完，再让某人审核” | `2` | 后加签，并按用户要求选择 `approval_method` |\n| “拉进来一起审” / “共同审核” / “一并确认” | `3` | 并加签；不传 `approval_method` |\n| 同一请求要求先加签、再转交当前用户这一环 | `3` | **必须并加签**；加签成功后再转交当前任务 |\n\n前加签或后加签可能推动当前用户的 task 流转，使原 `task_id` 不再支持后续转交。因此，“先加签，再把我这一环转交给其他人”不能使用前加签或后加签；先以 `add_sign_type: 3` 并加签，确认 `tasks add_sign` 成功后，再使用同一组 `instance_code` + `task_id` 执行 `tasks transfer`。\n\n只有在上下文完全无法判断是哪种加签方式、且不同选择会改变审批流程时，才向用户二次询问。用户已经说“一起审”或已经要求“加签后转交当前环节”时，信息足够，不要再询问加签类型。\n\n## 再选择 approval_method\n\n只有前加签、后加签需要 `approval_method`；并加签不传。先遵循用户明确指定的审批方式；用户未指定时，按人数和语义选择：\n\n| 加签人数与语义 | `approval_method` | 处理方式 |\n|----------------|-------------------|----------|\n| 只有 1 名加签人 | `1` | 使用或签；单人时或签、会签的实际效果相同，不再询问 |\n| 多人，明确“任一人审批即可” / “一人通过即可” | `1` | 或签；任一加签人完成审批即可 |\n| 多人，明确“所有人都要审批” / “全部确认” | `2` | 会签；所有加签人都必须完成审批 |\n| 多人，明确“依次审批” / “先 A 后 B” | `3` | 依次审批；每个人按 `add_sign_user_ids` 的数组顺序逐一审批 |\n| 多人，无法从上下文推断 | 不预设 | 询问用户选择或签、会签或依次审批，并说明三者效果 |\n\n依次审批必须保留用户给出的人员顺序。如果已经确定要依次审批，但上下文无法判断先后顺序，先询问人员顺序，再构造 `add_sign_user_ids`；不要自行排序。\n\n## 命令\n\n```bash\n# 先预览并加签请求，不实际执行\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":3,\"add_sign_user_ids\":[\"ou_xxx\"],\"comment\":\"请项目 owner 一起审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --dry-run\n\n# 单人前加签：未指定方式时使用或签\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":1,\"add_sign_user_ids\":[\"ou_xxx\"],\"approval_method\":1,\"comment\":\"请先补充审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 多人后加签：所有人都需要审批，使用会签\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":2,\"add_sign_user_ids\":[\"ou_xxx\",\"ou_yyy\"],\"approval_method\":2,\"comment\":\"当前审批完成后请两位都完成审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 多人前加签：按数组中的人员顺序依次审批\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":1,\"add_sign_user_ids\":[\"ou_first\",\"ou_second\"],\"approval_method\":3,\"comment\":\"请先由第一位审核，再由第二位审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 同一请求要求先加签、再转交：必须并加签；两条命令按顺序执行\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":3,\"add_sign_user_ids\":[\"ou_reviewer\"],\"comment\":\"请一起审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 仅在上面的 add_sign 成功后，转交同一当前任务\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"ou_transferee\",\"comment\":\"出差期间请代为处理\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment 或较多加签人\nlark-cli approval tasks add_sign \\\n  --data @./add-sign-body.json \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `add_sign_type` | 是 | 加签类型：`1` 前加签、`2` 后加签、`3` 并加签 |\n| `add_sign_user_ids` | 是 | 被加签人 ID 数组；需要和 `user_id_type` 保持一致 |\n| `approval_method` | 否 | 审批方式：`1` 或签、`2` 会签、`3` 依次审批；**仅在前加签、后加签时需要填写**。单人未指定时使用 `1`；多人无法从语义推断时先询问用户 |\n| `comment` | 否 | 审批意见或加签说明，例如 `前加签给财务复核`、`请项目 owner 一并确认` |\n| `--params '{\"user_id_type\":\"...\"}'` | 否 | 查询参数 JSON；用于声明 `add_sign_user_ids` 内用户 ID 的类型 |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id`；未显式指定时要特别确认被加签人的 ID 类型 |\n| `--as user` | 否 | 建议显式指定用户身份；审批加签通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 枚举说明\n\n### add_sign_type\n\n| 值 | 含义 | 对当前任务的影响 |\n|----|------|------------------|\n| `1` | 前加签 | 在当前审批前插入审批人，可能推动当前用户的 task 流转 |\n| `2` | 后加签 | 在当前审批后追加审批人，可能推动当前用户的 task 流转 |\n| `3` | 并加签 | 增加并行审批人；需要随后转交当前环节时使用 |\n\n### approval_method\n\n仅适用于前加签、后加签；并加签不传。\n\n| 值 | 含义 | 完成条件 |\n|----|------|----------|\n| `1` | 或签 | 任一加签人完成审批即可 |\n| `2` | 会签 | 所有加签人都必须完成审批 |\n| `3` | 依次审批 | 所有加签人按 `add_sign_user_ids` 数组顺序逐一审批 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / transfer / rollback / add_sign 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n| `tasks[].support_api_operate` | 是否支持通过 API 处理该任务；加签前建议先检查 |\n\n如果你手里只有姓名或邮箱，建议先通过联系人能力解析出正确的用户 ID，再执行加签。\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行加签操作。\n- **`add_sign_user_ids` 与 `user_id_type` 必须匹配**：例如传 open_id 就把 `user_id_type` 设为 `open_id`；不要混用。\n- **优先显式传 `user_id_type`**：这样 agent 更容易判断参数含义，也能减少 ID 类型不匹配带来的失败。\n- **`add_sign_type` 要和业务意图一致**：前加签是在当前审批前插入审批人，后加签是在当前审批后追加审批人，并加签则是增加并行审批人。\n- **加签后还要转交当前环节时必须并加签**：使用 `add_sign_type: 3`，等待加签成功后再用同一组任务参数转交；不要用前加签或后加签导致当前 task 提前流转。\n- **无法推断类型时才询问**：如果用户没有说明先后或并行关系，且后续动作也不能帮助判断，再请用户选择；不要对“一起审”或“加签后转交”重复提问。\n- **前加签 / 后加签要补 `approval_method`**：单人未指定时使用或签；多人优先按语义选择，无法推断时询问用户，不要静默默认。\n- **依次审批保留人员顺序**：按用户指定的先后顺序构造 `add_sign_user_ids`；顺序不明确时先询问，不要自行排序。\n- **优先从 `tasks query` 的待办列表拿任务参数**：尤其是 `topic=1` 的待办审批，最适合作为 add_sign 的输入来源。\n- **先检查是否支持 API 操作**：如果 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 执行处理动作，加签前应谨慎验证。\n- **`comment` 建议写明加签原因**：例如 `增加财务复核`、`增加项目 owner 并行确认`，方便相关人员理解上下文。\n- **先 `--dry-run` 再执行**：尤其在多人加签、跨部门加签或加签对象来源不明确时，先预览更安全。\n","skills/lark-approval/references/lark-approval-tasks-approve.md":"\n# approval tasks approve\n\n同意一个审批任务（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，必要时再用 `instances get` 查看详情，然后再执行同意。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确同意审批且目标任务无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks approve \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"同意\"}' \\\n  --as user \\\n  --dry-run\n\n# 同意审批任务，并附带审批意见\nlark-cli approval tasks approve \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"同意\"}' \\\n  --as user \\\n  --yes\n\n# 需要回填表单时，传入 form（按当前命令定义，form 为字符串化 JSON）\nlark-cli approval tasks approve \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"同意并补充信息\",\"form\":\"[{\\\"id\\\":\\\"user_name\\\",\\\"type\\\":\\\"input\\\",\\\"value\\\":\\\"Alice\\\"}]\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment / form\nlark-cli approval tasks approve \\\n  --data @./approve-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `comment` | 否 | 审批意见，例如 `同意`、`已确认` |\n| `form` | 否 | 表单数据；按当前命令定义，字段类型为 `string`，通常传字符串化 JSON；仅在审批动作需要同时回填表单时使用 |\n| `--as user` | 否 | 建议显式指定用户身份；审批同意通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的两个字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行同意操作。\n- **优先从 `tasks query` 的待办列表拿参数**：尤其是 `topic=1` 的待办审批，最适合作为 approve 的输入来源。\n- **先检查是否支持 API 操作**：如果上一步 `tasks query` 返回的 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 同意/拒绝。\n- **`comment` 建议简洁明确**：例如 `同意`、`同意，信息已核对`。没有审批意见要求时可省略。\n- **`form` 只在确有需要时传**：大多数简单同意场景只传 `instance_code`、`task_id`、可选 `comment` 即可。\n- **先 `--dry-run` 再执行**：尤其在批量处理、表单回填或任务来源不明确时，先预览更安全。\n","skills/lark-approval/references/lark-approval-tasks-query.md":"\n# approval tasks query\n\n查询当前用户的审批任务列表，可用于查看待办、已办、知会等分组。只读操作，不会修改审批状态。\n\n需要的 scopes: [\"approval:task:read\"]\n\n## 命令\n\n```bash\n# 查询待办审批\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n\n# 查询已办审批\nlark-cli approval tasks query --params '{\"topic\":\"2\"}' --as user\n\n# 按关键词搜索任务列表\nlark-cli approval tasks query --params '{\"topic\":\"1\",\"keyword\":\"测试\",\"page_size\":10}' --as user\n\n# 按任务时间范围筛选（秒级时间戳）\nlark-cli approval tasks query --params '{\"topic\":\"1\",\"start_timestamp\":\"<START_SECONDS>\",\"end_timestamp\":\"<END_SECONDS>\"}' --as user\n\n# 使用 page_token 翻页\nlark-cli approval tasks query --params '{\"topic\":\"1\",\"page_token\":\"example_page_token\"}' --as user\n\n# 表格格式输出，便于快速浏览\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --format table --as user\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{\"topic\":\"...\"}'` | 是 | 查询参数，使用 JSON 传入 |\n| `topic` | 是 | 任务分组主题，见下方“topic 枚举” |\n| `definition_code` | 否 | 审批定义 Code，用于仅查询某个审批定义下的任务 |\n| `keyword` | 否 | 搜索关键词；非空时走搜索链路，空或仅空格时保持普通列表链路 |\n| `start_timestamp` | 否 | 按任务时间筛选，时间范围开始值，秒级时间戳 |\n| `end_timestamp` | 否 | 按任务时间筛选，时间范围结束值，秒级时间戳 |\n| `locale` | 否 | 返回语言：`zh-CN`、`en-US`、`ja-JP` |\n| `page_size` | 否 | 分页大小 |\n| `page_token` | 否 | 翻页标记；首次请求不填，后续使用上一次返回的 `page_token` |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id` |\n| `--as user` | 否 | 建议显式指定用户身份；审批任务查询通常应使用用户身份 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## topic 枚举\n\n| 值 | 含义 |\n|----|------|\n| `1` | 待办审批 |\n| `2` | 已办审批 |\n| `17` | 未读知会 |\n| `18` | 已读知会 |\n\n## 输出重点字段\n\n返回结果中常见字段：\n\n| 字段 | 说明 |\n|------|------|\n| `count` | 列表计数，只在第一页返回；当任务数大于等于 100 时返回 `99` |\n| `has_more` | 是否还有更多数据 |\n| `page_token` | 下一页翻页 Token |\n| `tasks[].task_id` | 任务 ID，全局唯一 |\n| `tasks[].instance_code` | 审批实例 Code；后续执行 approve / reject / rollback 等操作时通常需要与 `task_id` 成对使用 |\n| `tasks[].title` | 任务标题 |\n| `tasks[].status` | 任务状态：`1` 待办、`2` 已办、`17` 未读、`18` 已读、`33` 处理中、`34` 撤回 |\n| `tasks[].topic` | 任务所属分组主题 |\n| `tasks[].instance_status` | 审批实例状态：`0` 无状态、`1` 流转中、`2` 已通过、`3` 已拒绝、`4` 已撤销、`5` 已终止 |\n| `tasks[].definition_code` | 审批定义 Code |\n| `tasks[].definition_name` | 审批定义名称 |\n| `tasks[].initiator` | 发起人 ID |\n| `tasks[].initiator_name` | 发起人姓名 |\n| `tasks[].summaries` | 表单摘要字段列表 |\n| `tasks[].support_api_operate` | 是否支持通过 API 同意或拒绝该任务 |\n| `tasks[].user_id` | 任务所属用户 ID |\n| `tasks[].instance_external_id` | 三方审批实例 ID，仅第三方审批实例存在 |\n| `tasks[].task_external_id` | 三方审批任务 ID，仅第三方审批任务存在 |\n| `tasks[].link` | 三方审批跳转链接 |\n\n## 使用建议\n\n- 常见处理链：先用 `tasks query` 拿到 `task_id` 和 `instance_code`，若用户需要查看详情、当前节点、表单内容、流程进度等内容，则调用 `instances get` 查看详情，最后执行 `tasks approve` / `tasks reject` / `tasks transfer` / `tasks add_sign` / `tasks rollback`。\n- 如果你只想看“已发起的审批实例”，使用 `instances initiated`；`tasks query` 更适合围绕“任务分组”来拉取列表。\n- 需要搜索任务标题、摘要或相关内容时传入 `keyword`；搜索排序和普通列表排序不同，按搜索服务结果为准。\n- 按时间排查任务时使用 `start_timestamp` / `end_timestamp` 缩小范围；这两个值都是秒级时间戳。\n- 需要继续翻页时，直接把上一次返回的 `page_token` 放回 `--params`。\n- 当结果量较大时，优先使用 `--format table` 提升可读性。\n","skills/lark-approval/references/lark-approval-tasks-reject.md":"\n# approval tasks reject\n\n拒绝一个审批任务（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，必要时再用 `instances get` 查看详情，然后再执行拒绝。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要拒绝该审批且目标任务无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks reject \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"拒绝\"}' \\\n  --as user \\\n  --dry-run\n\n# 拒绝审批任务，并附带审批意见\nlark-cli approval tasks reject \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"拒绝，信息不完整\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment\nlark-cli approval tasks reject \\\n  --data @./reject-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `comment` | 否 | 审批意见，例如 `拒绝`、`拒绝，信息不完整` |\n| `--as user` | 否 | 建议显式指定用户身份；审批拒绝通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的两个字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行拒绝操作。\n- **优先从 `tasks query` 的待办列表拿参数**：尤其是 `topic=1` 的待办审批，最适合作为 reject 的输入来源。\n- **先检查是否支持 API 操作**：如果上一步 `tasks query` 返回的 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 同意/拒绝。\n- **`comment` 建议写清拒绝原因**：例如 `拒绝，缺少合同附件`、`拒绝，预算字段填写不完整`。这有助于发起人理解原因并补充材料。\n- **先 `--dry-run` 再执行**：尤其在批量处理或任务来源不明确时，先预览更安全。\n","skills/lark-approval/references/lark-approval-tasks-remind.md":"\n# approval tasks remind\n\n对审批实例中的指定任务发起催办（用户级写操作）。通常先通过 `tasks query` 找到待办任务，拿到 `instance_code` 和要催办的 `task_ids`，必要时再用 `instances get` 查看详情，然后执行催办。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要催办该审批且目标实例、目标任务都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:instance:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks remind \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID>\"],\"comment\":\"请尽快处理\"}' \\\n  --as user \\\n  --dry-run\n\n# 催办单个审批任务\nlark-cli approval tasks remind \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID>\"],\"comment\":\"请尽快审批该单据\"}' \\\n  --as user \\\n  --yes\n\n# 同一实例下催办多个任务\nlark-cli approval tasks remind \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID_1>\",\"<TASK_ID_2>\"],\"comment\":\"请相关审批人尽快处理\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment 或多个 task_ids\nlark-cli approval tasks remind \\\n  --data @./remind-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances get` 获取 |\n| `task_ids` | 是 | 被催办的任务 ID 数组；应与 `instance_code` 属于同一审批实例 |\n| `comment` | 否 | 催办说明，例如 `请尽快处理`、`该单据较急，请优先审批` |\n| `--as user` | 否 | 建议显式指定用户身份；审批催办通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；催办时必须提供 |\n| `tasks[].task_id` | 审批任务 ID；放入 `task_ids` 数组中 |\n| `tasks[].title` | 任务标题，可用于确认催办对象是否正确 |\n| `tasks[].status` | 任务状态；一般优先催办仍处于待处理状态的任务 |\n\n如需进一步确认当前审批流、节点和人员信息，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_ids` 要对应同一个审批实例**：不要把不同实例下的任务 ID 混在同一次催办请求中。\n- **`task_ids` 是数组**：即使只催办一个任务，也要按数组形式传入。\n- **优先从 `tasks query` 的待办列表拿参数**：尤其是 `topic=1` 的待办审批，最适合作为 remind 的输入来源。\n- **催办前先确认任务仍需处理**：已经审批完成、已撤回或已终止的任务一般不适合继续催办。\n- **`comment` 建议简洁且明确**：例如 `该单据较急，请优先审批`、`请今天内处理`。避免过长或模糊描述。\n- **先 `--dry-run` 再执行**：尤其在一次催办多个任务、任务来源不明确或需让用户复核催办对象时，先预览更安全。\n","skills/lark-approval/references/lark-approval-tasks-rollback.md":"\n# approval tasks rollback\n\n将一个审批任务退回到指定节点（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，再结合实例详情确认可退回的目标节点 `node_ids`，最后执行退回。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要退回该审批且目标任务、退回节点都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"<NODE_ID>\"],\"comment\":\"退回补充材料\"}' \\\n  --as user \\\n  --dry-run\n\n# 退回到单个节点\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"<NODE_ID>\"],\"comment\":\"请补充附件后重新提交\"}' \\\n  --as user \\\n  --yes\n\n# 退回到发起节点（发起节点 ID 为 START）\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"START\"],\"comment\":\"退回发起人补充材料\"}' \\\n  --as user \\\n  --yes\n\n# 传多个候选节点 ID（以实际审批定义支持情况为准）\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"<NODE_ID_1>\",\"<NODE_ID_2>\"],\"comment\":\"退回上一处理节点\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment 或较多 node_ids\nlark-cli approval tasks rollback \\\n  --data @./rollback-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `node_ids` | 是 | 退回目标节点 ID 数组；发起节点 ID 为 `START`；执行前应先确认这些节点确实可作为退回目标 |\n| `comment` | 否 | 审批意见或退回说明，例如 `请补充附件后重新提交`、`预算说明不完整，请补充` |\n| `--as user` | 否 | 建议显式指定用户身份；审批退回通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / transfer / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n| `tasks[].support_api_operate` | 是否支持通过 API 处理该任务；退回前建议先检查 |\n\n如需确认流程节点、当前进度和可退回位置，可先查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行退回操作。\n- **`node_ids` 是必填项**：退回并不是“自动退回上一步”，而是要明确给出目标节点 ID 数组；退回发起节点时传 `START`。\n- **先确认节点是否可退回**：不同审批定义支持的退回目标可能不同；在不确定时，先通过 `instances get` 或业务侧流程信息核实。\n- **优先从 `tasks query` 的待办列表拿任务参数**：尤其是 `topic=1` 的待办审批，最适合作为 rollback 的输入来源。\n- **先检查是否支持 API 操作**：如果 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 执行处理动作，退回前应谨慎验证。\n- **`comment` 建议写清退回原因**：例如 `附件缺失，请补齐后重新提交`、`费用说明不完整，请补充明细`，方便发起人或上一步处理人理解原因。\n- **先 `--dry-run` 再执行**：尤其在节点来源不明确、审批链路复杂或批量处理时，先预览更安全。\n","skills/lark-approval/references/lark-approval-tasks-transfer.md":"\n# approval tasks transfer\n\n转交一个审批任务给其他用户处理（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，确认目标任务后，再提供被转交人的用户 ID 执行转交。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要转交该审批且目标任务、转交对象都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"ou_xxx\",\"comment\":\"请你继续处理\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --dry-run\n\n# 按 open_id 转交审批任务\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"ou_xxx\",\"comment\":\"转交给你处理\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 按 user_id 转交审批任务\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"123456789\",\"comment\":\"请补充审核\"}' \\\n  --params '{\"user_id_type\":\"user_id\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment\nlark-cli approval tasks transfer \\\n  --data @./transfer-body.json \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `transfer_user_id` | 是 | 被转交人的用户 ID；需要和 `user_id_type` 保持一致 |\n| `comment` | 否 | 审批意见或转交说明，例如 `转交给你处理`、`请继续审核该单据` |\n| `--params '{\"user_id_type\":\"...\"}'` | 否 | 查询参数 JSON；用于声明 `transfer_user_id` 的 ID 类型 |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id`；未显式指定时要特别确认 `transfer_user_id` 的真实类型 |\n| `--as user` | 否 | 建议显式指定用户身份；审批转交通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / transfer / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n| `tasks[].support_api_operate` | 是否支持通过 API 处理该任务；转交前建议先检查 |\n\n如果你手里只有姓名或邮箱，建议先通过联系人能力解析出正确的用户 ID，再执行转交。\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行转交操作。\n- **`transfer_user_id` 与 `user_id_type` 必须匹配**：例如传 open_id 就把 `user_id_type` 设为 `open_id`；不要混用。\n- **优先显式传 `user_id_type`**：这样 agent 更容易判断参数含义，也能减少 ID 类型不匹配带来的失败。\n- **优先从 `tasks query` 的待办列表拿任务参数**：尤其是 `topic=1` 的待办审批，最适合作为 transfer 的输入来源。\n- **先检查是否支持 API 操作**：如果 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 执行同意/拒绝等处理动作，转交前也应谨慎验证。\n- **`comment` 建议写明转交原因**：例如 `你更熟悉该项目，请继续处理`、`转交给预算 owner 审核`，方便接收人理解上下文。\n- **先 `--dry-run` 再执行**：尤其在跨部门转交、批量处理或转交对象来源不明确时，先预览更安全。\n","skills/lark-apps/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2FSKILL.md -->","skills/lark-apps/creative-design/agents/fork-verifier-agent.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Fcreative-design%2Fagents%2Ffork-verifier-agent.md -->","skills/lark-apps/creative-design/agents/vision-probe-agent.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Fcreative-design%2Fagents%2Fvision-probe-agent.md -->","skills/lark-apps/creative-design/creative-design.md":"---\nname: creative-design\ndescription: 以自包含 HTML 创建精致的设计产物：UI mockup、可交互原型、线框图（wireframe）、落地页、仪表盘、应用屏幕、移动 App、幻灯片 deck（即 PPT / PowerPoint 演示文稿）、动画视频（motion graphics、产品演示 Demo 动画、数据动画）、可视化报告 / 信息图（infographic）/ 视觉长图与视觉探索。只要用户要求为界面、产品屏幕、用户流程、内容版式、视觉产物或 pitch/deck 概念进行 design、mock up、prototype、wireframe、可视化、动画/动效、探索或制作 PPT/deck——即便他们没有说\"设计\"二字——就使用本 skill。Harness 无关：适用于 Aily、Claude Code、Codex Agent 及类似的具备文件能力的 agent。\n---\n\n## 目录结构与运行环境\n本 skill 附带以下资源，路径均相对于本文件所在目录：\n\n- `references/<name>.md` — 媒介专属技能 prompt（如 `frontend-design.md`、`hi-fi-design.md`、`charts.md` 等；见文末「Skills 元信息」的完整列表）。与下方 harness 工具映射表同在 `references/` 目录。\n- `starter-components/` — 现成的 HTML/JS/JSX 脚手架（`design-canvas.jsx`、`deck-stage.js`、`ios-frame.jsx`、`android-frame.jsx`、`tweaks-panel.jsx`、`macos-window.jsx`、`browser-window.jsx`、`animations.jsx`）。见下文「Starter Components」。\n- `references/<harness>.md` — **harness 专属工具映射表**（`claude.md`、`codex.md`、`aily.md`）。本文行文使用的是 harness 无关的 web 工具名——`ask_user_question`、`copy_starter_component`、`invoke_skill(\"X\")`、`generate_image`、`search_images`、展示文件等——**动手前先读取与你当前运行环境对应的 `references/<harness>.md`，把这些名字映射成你 harness 里的真实工具**。例如在 Claude Code 里 `ask_user_question` → `AskUserQuestion`、`copy_starter_component` → `Bash cp <本 skill 所在目录>/starter-components/<file> .`、`invoke_skill(\"X\")` → `Read references/<file>.md`。\n- `assets/index.html` — React + Babel 的 HTML 起步模板（锁定版本 script 标签 + `#root` 挂载点），见下文「React + Babel」。\n\n## 工作流\n1. 理解用户需求。对全新或含糊的工作，提出澄清性问题。弄清输出物、精细度（fidelity）、选项数量、约束条件，以及涉及的 UI kit 与品牌。\n2. 探索所提供的资源。附件、文档链接、网页 URL 都要在动手前解析完（见「输入资料解析」）。\n3. 列出 todo 清单。\n4. 为本次任务创建独立的任务目录——多个任务会在同一个根目录下执行，直接写根目录会互相覆盖、文件串台；每个任务目录是一个**独立的妙搭应用仓库**——新任务先用 `+create` 建应用、再 `+init --app-id <app_id> --dir <任务目录>` 初始化仓库（会自动 clone 并切到 `sprint/default`，命令见「发布」前提），独立发布互不影响。把资源复制进任务目录，在其中创建交付物。用图片素材提升美观度与丰富度、或需要有依据的内容时，按「图像素材与外部信息」补充。\n5. （如有）自检React + Babel路径是否正确；ReactDOM.createRoot 是否参数正确，对应元素是否存在\n6. 收尾：提交你的改动。\n7. 发布：把产物发布到妙搭拿到可访问链接（见下方「发布」）。写完不发布，用户拿不到线上链接。\n8. 极其简短地总结——只讲注意事项与后续步骤，并给出发布后的可访问链接。\n\n鼓励你并发调用文件探索工具以提升效率。\n\n## 提问\n默认基于用户给的信息、项目上下文和合理假设直接开始，不为收集偏好而打断。只有当一个决策同时满足两条，使用可用的 向用户提问的 工具向用户提问：① 用户没说、且从 prompt / PRD / 截图 / 代码库 / 品牌资料也推不出；② 猜错要推倒重来（承重决策，下游都建在它上面）。两条只要有一条不成立——能合理推断，或猜错只是局部返工——就直接做。\n\n承重、推不出就必须先问的：交付媒介 / 格式（报告 vs deck vs 看板）；视觉 / 美学方向（从零起的项目、且资料里推不出一个有把握不返工的方向时）；大体量交付（整套 deck、多页产物）的受众 / 目的与核心范围。\n局部、给默认直接做的：变体数量与探索维度、界面文案、占位与示例内容、单屏 / 单组件的处理与密度——给合理默认（变体默认摆 2-3 个有清晰差异的方案），让用户在产出上重定向，不为它们提问。\n\n例如：\n\n- \"做一份关于 X 的报告／材料\"但没说格式 → 媒介推不出且承重，先确认交付格式（幻灯片 vs. 视觉报告 vs. 仪表盘），再问格式相关的问题。\n- 为附带的 PRD 做一套 deck → PRD 能推出受众 / 场景就直接做；只有受众、篇幅推不出且影响全局时才问。\n- 用这份 PRD 为 Eng All Hands 做一套 10 分钟的 deck → 无需提问；信息已足够。\n- 把这张截图变成交互原型 → 只有当图片无法说明预期行为时才提问。\n- 做 6 页关于黄油历史的幻灯片 → 媒介、页数已定，直接开工；风格能从主题推断就定，推不出再问。\n- 为我的外卖 app 的 onboarding 做一套原型 → 按常见 onboarding 流程直接做；只问会阻塞产出的承重问题。\n\n当交付格式本身不明确时——用户只说了一个成果（\"一份报告\"\"材料\"\"一份摘要\"）却没说媒介——先解决格式，再讨论任何与格式相关的细节。\n\n问出好问题至关重要。技巧：\n\n- 通常一轮聚焦提问就够；把承重的未知一次问齐，不要挤牙膏式多轮打断。\n- 只问推不出的；能从 PRD、截图、代码库、品牌资产、现有页面和用户原话推断的，先推断，并在产出里说明你的假设。\n\n## 输入资料解析\n用户给的附件、文档链接和 URL 是设计的输入，必须在动手前解析完——数据看板、报告和基于文档的 deck 全都建立在源资料之上，跳过这一步产出的内容只能靠编造。按输入形态处理：\n\n- **数据文件（csv / json / xlsx）**——先看结构（列名、字段类型、行数）和样本行，再决定信息层级与图表选型；指标一律用脚本从源数据计算，不要目测。\n- **压缩包（zip）**——先解压到临时目录，逐个查看内容物，再按各自类型处理。\n- **文档（docx / pdf / 论文 / 需求文档）**——用当前 harness 的文档解析能力读取**全文**（映射见 `references/<harness>.md`；Aily 原生支持解析 Word / PDF 等二进制文件），不要只读开头就动手。\n- **飞书云文档 / 多维表格链接**——用 `lark-cli` 读取内容（云文档 / 多维表格相关命令，不确定用法先查 `--help`）；`lark-cli` 不可用时向用户说明并请其导出或粘贴，不要凭标题猜内容。\n- **网页 URL**——用 `web_fetch` 抓取全文后再产出；抓取失败就告知用户，不要凭 URL 和常识编写。\n\n## 如何开展设计工作\n动手前先读取 **`./references/frontend-design.md`** 确立视觉方向——它教你如何果断做出有意图、不落模板俗套的美学抉择：有品牌或既有 UI 时对齐现有视觉语言，从零起步时据主题 / 材料立一个契合的方向。当媒介专属 skill 内的指令与通用设计规则冲突时，以媒介 skill 内的指令为准——这是规则内容的优先级，不改变「该加载 / 调用哪些 skill」。\n\n当用户请你做高保真 UI mockup、界面设计或带多方案的视觉探索时，开始之前先读取 **`./references/hi-fi-design.md`**——它涵盖了设计流程、获取设计上下文、提问以及呈现多个方案。\n\n一次设计探索的输出是单个 HTML 文档。根据你所探索的内容选择呈现格式：\n\n- **静态视觉 / 设计稿 / 多方案探索**（颜色、字体、单个元素、整屏 UI、流程关键帧）→ 通过 `starter-components/design-canvas.jsx` starter component 把各方案铺陈在画布上。除非用户明确要求可点击 / 可交互，否则不要把设计稿升级成点击原型。\n- **用户明确要求可交互的流程或产品 demo** → 将整个产品做成高保真可点击原型，并把关键选项以 Tweak 形式暴露出来。可交互原型禁止使用 `starter-components/design-canvas.jsx`、`<DCArtboard>` 或画布外壳包裹；它应该作为真实应用界面直接运行。\n\n这两者可以组合，但只限静态设计探索。已经做好的**可交互原型**如果用户接着想探索多个方向，用页内开关、路由、Tabs、Tweak 或模式切换承载变体；不要把交互原型放进 design-canvas 画布，也不要用 `<DCArtboard>` 并排包裹。\n\n当用户要求新版本或改动时，把它们作为 TWEAKS 加到原件上；拥有一个可切换不同版本开关的主文件，优于拥有多个文件。\n\n## 默认美学指令\n如果用户没给参考或艺术方向：能从主题、材料或场景推断出一个有把握、不会返工的视觉方向，就主动确定，并在设计中体现假设；如果推不出、又是从零起的项目，先用 `ask_user_question` 问清偏好的调性、受众、颜色、字体、情绪等再动手——不要在推不出方向时硬选，slop 就是这么来的。\n\n定下视觉方向后（无论是推断还是问来的），创建设计时遵循以下指引：\n\n- **字体与排版。** 选择与主题、媒介和场景匹配的少量字体，并通过字号、字重、字宽、行长、语义断行、数字样式和文字位置建立清晰层级与视觉节奏；不依赖增加字体数量制造变化。\n- **背景与色彩体系。** 确定主色调，并建立与主题协调的中性基底、主题色和必要的章节／语义色。背景不局限于纯黑、纯白或单一色调，可以根据内容属性、页面角色和叙事节点使用不同色调、主题色底、局部色域、图片或图形背景。\n- **色彩一致性。** 一致性来自共享色板、字体、栅格、图形语言和明确的颜色关系，不要求所有页面使用相同背景。颜色变化应帮助识别章节、信息层级和重点，避免无语义地逐页随机换色。\n- **强调色。** 使用数量克制、关系协调的强调色，并根据背景、信息层级和色彩语义调整明度与彩度。图表、状态和章节色需要清楚可区分，但应属于同一视觉体系。\n- **中性色。** 黑、白、灰可以带有与主题协调的细微色相，避免把纯黑白或低饱和配色作为所有专业场景的默认答案。\n- **视觉复杂度。** 视觉丰富度应服务内容。不要添加无信息价值的装饰，也不要把\"克制\"理解为单调、大量留白、缺少图片图表或所有页面使用同一种构图。\n\n关键：如果已给出其他美学指令（如参考图、品牌体系、设计规范或媒介专属 skill），或项目中已有文件，则完全忽略默认美学。\n\n## 图像素材与外部信息\n图片素材能显著提升产物的美观度与丰富度——不要默认只用纯 CSS/SVG 撑起全部视觉。为氛围、质感和视觉节奏而配图是正当用途，不需要等到\"内容必须有图\"才配图。选择工具的判断规则很简单：**需要真实图片就搜索，需要丰富美观的图片就生成**。当前 harness 若提供以下能力（映射见 `references/<harness>.md`；没有对应工具就跳过，用内联 SVG / CSS 图形兜底），在合适的位置主动使用：\n\n- **`generate_image`（AI 图片生成）**——美化、氛围类配图一律走生成：hero 图、插画、照片质感背景、章节题图、空状态插图、信息图（infographic）、产品/场景示意图等任何能让页面更好看的位置，用文生图直接生成；有品牌参考图或用户素材时用图生图对齐既有视觉语言；多屏 / 多页需要风格统一、角色连贯的插画体系时用组图一次生成整个序列；对已有图片做局部调整用图片编辑。生成 prompt 里写清风格、构图、配色与光线，让产出与已确立的视觉方向一致，而不是各自为政。\n- **`search_images`（图片搜索）**——需要真实图片时走搜索：真实存在的实物、产品、地点、人物、logo、截图等生成会失真或造假的素材，以及确立视觉方向时按关键词找参考图（同类产品界面、风格 moodboard）。直接引用搜索结果时注意来源与版权。\n- **`web_search` / `web_fetch`（联网搜索）**——内容需要真实事实、数据、案例或时效性信息时先搜再写，不要编造（见「内容准则」：涉及新增事实、数据时要有依据）。调研型产出（行业研究、政策梳理、竞争格局类 deck / 报告）要先做多轮搜索，把事实、数字与来源收集齐并标注出处，再进入设计。\n- **视频素材**——需要嵌入公开视频（培训短片、案例视频等）时，用联网搜索找到可公开访问的视频页面或可嵌入链接，以 `<iframe>` / `<video>` 嵌入并注明来源；不要下载搬运版权内容，也绝不虚构视频 URL——找不到合适的就如实告知用户并留占位。\n\n约束：\n\n- 配图要属于同一视觉体系——风格、色调、光线与已确立的视觉方向一致，宁可少而统一，不要多而杂乱；逐张风格漂移比没有图更伤美观度。\n- 用户已提供图片 / 品牌素材时优先使用，不要擅自用生成图替换。\n- 搜索到 / 生成的图片先落到本地，再用 `lark-cli apps +file-upload --app-id <app_id> --file <local_path> --as user` 上传，代码中引用返回的**远端 URL**——不要提交 git、不要引用本地路径、不要 base64 内联，也不要直接热链搜索结果页的原始 URL（可能防盗链或失效）。上传需要 `app_id`，任务尚未初始化时先按「发布」前提完成 `+create` / `+init` 两步。\n\n## 输出创建准则\n- **文件输出路径**：会话根目录下会并存多个任务。**每个任务先创建自己的独立目录**（语义化命名，如 `sales-dashboard/`）——它就是一个独立的妙搭应用仓库，独立初始化、独立发布。所有交付物写进本任务目录，主 HTML 入口是该目录下的 `index.html`。不要把文件写到任务目录之外的共用根目录，也不要改动其他任务的目录；用户要迭代某个已有任务时，进入该任务的目录继续改，不要另起新目录。\n- 对文件做重大修订时，先复制再编辑，以保留旧版本（如 index.html、index v2.html 等）。\n- 始终避免写大文件（>1000 行）。而应把代码拆成若干更小的 JSX 文件，最后在主文件里 import 进来。这让文件更易管理和编辑。\n- 对于视频和其他带时间轴的内容，让播放位置可持久化；每次变化时存入 localStorage，加载时再从 localStorage 读回。这样用户刷新页面时不会丢失当前位置，而刷新在迭代设计中很常见。（使用 `starter-components/deck-stage.js` 的 deck 不需要这么做——宿主会把幻灯片位置保存在 URL 中。）\n- 在既有 UI 上做增补时，先理解该 UI 的视觉语汇并遵循它。对齐文案风格、配色、语气、hover/click 状态、动画风格、阴影＋卡片＋布局模式、密度等。把你观察到的东西\"出声想一想\"会有帮助。\n- 写规范的 HTML，让编辑器能直接编辑：显式闭合每个非空（non-void）元素（写 `<p>…</p>`，绝不依赖隐式闭合），每个属性值都用双引号，且不要自闭合非空元素（写 `<div></div>`，而非 `<div/>`）。这有助于直接编辑功能正常工作。\n- 绝不使用 `scrollIntoView`——它可能搞乱 web app。如有需要，改用其他 DOM 滚动方法。\n- **颜色使用：** 有品牌色时优先沿用品牌体系；没有品牌或既有配色时，根据主题、受众、内容语义和视觉方向推导协调色板。避免随意加入彼此无关的颜色，不要默认退回纯黑白。对于数据图表和信息图，颜色应承担区分、强调或表达语义的作用，并保证足够对比。\n- **Emoji：** 不要在生成的代码中使用 emoji 字符——不作图标、不作装饰、不放进数据里。例外：仅当用户的品牌资产明确包含 emoji 时。\n- **图标：** 系统图标规则仅适用于需要界面图标体系的 UI 或交互原型。在这类产物中，使用手写内联 SVG（`<svg viewBox=\"0 0 24 24\">`）建立语义贴切、风格连贯的图标语言。\n- **字体加载：** 需要 Google Fonts / web 字体时，一律从自托管镜像 `https://miaoda.feishu.cn/fonts/css2` 加载，不要直连 `fonts.googleapis.com` / `fonts.gstatic.com`——这两个 Google CDN 在部分地区慢、甚至连不上，会导致字体加载失败、页面回退到系统字体。镜像是 Google Fonts `css2` 端点的直接替代：查询语法完全一致（`?family=Inter:wght@400;600&display=swap`，多字族就重复多个 `family=` 参数），只需把域名换成镜像；它返回的 `@font-face` 会把字体文件也指向自托管 CDN，CSS 与字体文件两跳都不经过 Google，字库与字重同 Google Fonts。照常用 `<link rel=\"stylesheet\" href=\"https://miaoda.feishu.cn/fonts/css2?family=…&display=swap\">` 引入即可。\n\n## 内容准则\n\n**内容取舍。** 不添加与用户目标无关或没有依据的内容。在用户明确的范围内，可以重组、解释和补足完成叙事所需的信息；涉及新增事实、数据或任务范围时，再向用户确认或明确为示例。内容不足以独立成页时，应合并、重构或请求材料，不用放大元素和增加留白勉强撑页。\n\n**数据保真。** 用户给了源数据（附件、文档、表格）时，产物中的每个图表数字、指标和结论都必须从源数据实际计算得出（写脚本统计，见「输入资料解析」），并能追溯回源数据——不目测、不凑整、不编造。做数据报表/看板前读 `references/data-report.md`，其中的数据准则同样适用。\n\n**硬性规格是约束，不是建议。** 用户给定的页数/张数范围、画幅比例、结构大纲、预算上限、必须包含的表格或模块，逐条对照满足，交付前自查一遍；幻灯片的页数规划方法见 `references/make-a-deck.md`。\n\n**使用恰当的尺度：** 对于 1920x1080 的幻灯片，文字绝不应小于 24px；理想情况下要大得多。打印文档最小 12pt。移动端 mockup 的点击目标绝不应小于 44px。\n\n**避免 AI slop 套路：** 包括但不限于滥用渐变背景、emoji（见上面的 Emoji 规则）、圆角＋左边框强调色的容器、被用滥的字体族（Inter、Roboto、Arial、Fraunces）。\n\n**CSS**：`text-wrap: pretty`、CSS grid 以及其他高级 CSS 效果都是你的好帮手！\n\n**强烈倾向用带 `gap` 的 flex/grid，而非 inline 流。** 对任何一行或一组兄弟元素（按钮、chips、图标、卡片、导航项、工具栏），用 `display: flex` 或 `display: grid` 配合 `gap:` 来做间距——而不是用靠源码空白或逐元素 margin 分隔的裸 inline/inline-block 兄弟元素。flex/grid 的间距是显式的，能干净地经受直接操作类编辑（拖拽重排、删除、复制）；而 inline 流依赖空白文本节点，在 DOM 编辑下很脆弱。把 inline 流留给句子中偶尔夹带 `<a>`/`<strong>`/`<em>` 的文字段落——不要用它来排布 UI 元素。\n\n## 保留评论锚点\n某些源元素带有 `data-comment-anchor=\"…\"` 属性。它把用户的评审评论钉在该元素上。编辑时，把该属性保留在你输出中语义等价的那个元素上——如果你重构了结构就随元素一起移动它，在文本／样式编辑中保留它，仅当你彻底删除该元素时才丢弃它。绝不发明新值，也不要把它复制到其他元素上。\n\n## 为幻灯片和屏幕打标签以提供评论上下文\n在代表幻灯片和高层级屏幕的元素上加 `[data-screen-label]` 属性；这样你就能分辨用户的评论是针对哪一张幻灯片或哪一屏。\n当用户说\"slide 5\"或\"index 5\"时，他们指的是第 5 张幻灯片（标签\"05\"），而绝非数组下标 `[4]`——人类不按 0 起始计数。\n\n## React + Babel（浏览器内 JSX）\n当用浏览器内 JSX 编写 React 原型（无构建步骤——Babel 在运行时转译）时，你必须使用下面这些锁定版本的确切 script 标签。不要使用未锁定版本（例如 react@18）。要用 React + Babel 时，可直接从本 skill 的 `assets/index.html` 拷贝 HTML 模板起步（`cp <本 skill 所在目录>/assets/index.html <任务目录>/index.html`）——它已带好这三个 script 标签和 `#root` 挂载点，不必手写。\n\n```html\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/react@18.3.1/umd/react.development.js\" crossorigin=\"anonymous\"></script>\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/react-dom@18.3.1/umd/react-dom.development.js\" crossorigin=\"anonymous\"></script>\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/@babel/standalone@7.29.0/babel.min.js\" crossorigin=\"anonymous\"></script>\n```\n\n发布前需要对以上 script 路径进行自检，确保它们路径与上述代码完全一致\n\n### 脚本导入\n用 script 标签导入你写的任何辅助脚本或组件脚本。`.jsx` 文件必须用 `<script type=\"text/babel\" src=\"xxx.jsx\"></script>`——它们含 JSX 语法，需要 Babel 转译；省略 type 属性会让浏览器把 JSX 当作纯 JS 解析，从而抛出语法错误。纯 `.js` 文件可以用普通的 `<script src=\"xxx.js\"></script>`。避免在脚本导入上使用 `type=\"module\"`——它可能会出问题。\n\n**加载顺序**：`@babel/standalone` 用异步 XHR 拉取外部 `<script type=\"text/babel\" src=\"...\">` 文件，但保证按 DOM 顺序执行——靠前的脚本总在靠后的脚本之前运行。然而，内联脚本（无 `src`）会立即就绪，而外部脚本必须等待网络响应。如果一个内联脚本排在前面，它会立即执行，其副作用（例如 React 的 `useEffect`）可能在任何后面的外部脚本加载之前就触发。把外部脚本放在依赖它们的内联脚本之前。\n\n### 跨文件作用域\n每个 `<script type=\"text/babel\">` 在转译后都有自己独立的作用域。要在文件间共享组件，在组件文件末尾把它们导出到 `window`：\n\n```js\n// 在 components.jsx 末尾：\nObject.assign(window, {\n  Terminal, Line, Spacer,\n  Gray, Blue, Green, Bold,\n  // ... 所有需要共享的组件\n});\n```\n\n### 样式对象命名\n定义全局作用域的样式对象时，给它们起具体的名字。如果你导入了 1 个以上带 `styles` 对象的组件，就会出问题。你必须基于组件名给每个 styles 对象起唯一的名字，比如 `const terminalStyles = { ... }`；或者用内联样式。绝不要写 `const styles = { ... }`。\n\n### 动画\n对于视频风格的 HTML 产物，调用 `animated-video` skill 并从 `starter-components/animations.jsx` starter component 起步——不要自己实现时间轴引擎。对于简单的交互原型过渡，CSS transitions 或纯 React state 就够了。\n\n### 原型\n- 克制住加\"标题\"屏的冲动；让你的原型在视口中居中，或做成响应式尺寸（填满视口并留合理边距）。\n\n## Starter Components（起始组件）\n现成的 HTML/JS/JSX 脚手架（scaffold）就放在本文件旁边的 `starter-components/` 目录里——需要设备外框（device frame）、幻灯片外壳（deck shell）、画布（canvas）或动画时间轴（animation timeline）时，直接用它们，不要手搓。使用方式：把文件拷进当前任务目录（在任务目录下执行 `cp <本 skill 所在目录>/starter-components/<file> .`——注意 cwd 不会是 skill 目录，要用 skill 目录的实际路径），或读过之后照着改；每个文件顶部都带有自己的用法说明。\n\n- `design-canvas.jsx` — 可平移／缩放的画布，artboard 可重排、可全屏聚焦。\n- `deck-stage.js` — 幻灯片 deck 外壳。用于任何幻灯片演示（见「Skills 元信息」中的 Make a deck）。\n- `ios-frame.jsx` / `android-frame.jsx` — 带状态栏和键盘的设备边框。\n- `tweaks-panel.jsx` — 浮动的 Tweaks 面板＋表单控件（`useTweaks`、滑块、开关、单选、颜色 chips 等）。\n- `macos-window.jsx` / `browser-window.jsx` — 桌面窗口外壳（chrome）。\n- `animations.jsx` — 基于时间轴的动画引擎（Stage + Sprite + scrubber + Easing）。\n\n## Tweaks\n用户可以从工具栏开关 **Tweaks**——一个存在于原型内部的页内控件面板（颜色、字体、间距、文案、布局变体）。不要自己实现它：用 `kind: \"tweaks-panel.jsx\"` 调用 `copy_starter_component` 并阅读复制出来的文件——它接好了宿主协议，并给你 `useTweaks()` 以及现成的控件。这个面板的标题按界面语言来定——英文叫\"Tweaks\"，中文叫\"风格\"。把它保持小巧，Tweaks 关闭时完全隐藏，并且即使用户没要求，也默认加上几个有品味的 tweak。你写在面板里的标签和选项是用户会读到的内容，而非配置——用与 app 其余部分相同的语言书写。\n\n**闭环。** 每个 tweak 都需要一个生产者（面板控件）和一个消费者（对该值作出反应的内容）。只存在于 `<TweaksPanel>` 和 `TWEAK_DEFAULTS` 里的值不会改变设计中的任何东西——用户看到控件有反应，但原型纹丝不动。\n\n## 发布\n设计产物写完并提交后，需要发布到妙搭（lark-apps）才能拿到可访问链接。本 skill 产出的是创意模式（html）应用，发布走本地开发链路：改动 git commit 后推到工作分支 `sprint/default`，再用 `lark-cli apps` 命令发起部署并轮询结果。\n\n**前提**：每个任务目录是一个独立的妙搭 html 应用仓库，独立发布、互不影响；发布序列的所有命令都在**当前任务目录**内执行。任务目录还不是应用仓库（没有 `.spark/meta.json`）时，先完成两步初始化：\n\n```bash\n# 1. 创建应用，记下返回的 app_id（app_ 开头）\nlark-cli apps +create --name \"<应用名>\" --app-type html --as user\n\n# 2. 初始化到任务目录：会自动 clone 远端仓库并 checkout 工作分支 sprint/default，\n#    无需 git init / git checkout（--dir 不传默认 ./<app-id>；\n#    --source-path 可把已写好的产物一并并入，但源码目录不存在时会被静默跳过，用后核对文件确实进了仓库）\nlark-cli apps +init --app-id <app_id> --dir <任务目录> --as user\n```\n\n初始化后在任务目录内创建 / 修改产物（创意模式是 buildless，源码即产物，`index.html` 放仓库根目录），然后走下方发布序列。\n\n`app_id`（`app_` 开头）从任务目录的 `.spark/meta.json` 读取，或来自 `+create` 的返回 / 用户给出——`cli_` 开头的是飞书应用 ID，绝不能传给 `apps +*` 命令。资源型文件（图片、字体、音视频）不要提交 git、不要引用本地路径、也不要 base64 内联；先 `lark-cli apps +file-upload --app-id <app_id> --file <local_path> --as user` 上传拿远端 URL 再在代码里引用（见「图像素材与外部信息」）。\n\n发布序列：\n\n```bash\n# 1. 提交并推到工作分支 sprint/default\n#    遇非 fast-forward：先 git pull --rebase origin sprint/default 解决冲突再推，绝不 force-push\ngit add . && git commit -m \"feat: ...\" && git push origin sprint/default\n\n# 2. 发起部署（记下返回的 release_id），然后轮询状态直到 finished / failed：\n#    publishing → 继续轮询；finished → 输出含可分享的 online_url，直接返回给用户；failed → 按输出中的 error_logs 报告失败原因\nlark-cli apps +release-create --app-id <app_id> --as user\nlark-cli apps +release-get --app-id <app_id> --release-id <release_id> --as user\n```\n\n要点：\n\n- 所有 git 命令必须在**任务仓库根目录**下执行（每条命令先 `cd <任务目录>`，或用 `git -C <任务目录>`）——`git add .` 作用于当前 cwd，在多任务共用的上级根目录里执行会把其他任务的文件也 stage 进来。\n- 推送和部署的分支必须是 `sprint/default`：推到其他分支，`+release-create` 会失败。\n- `+release-create` 部署的是远端 `sprint/default` 上**已 push** 的代码，不是本地工作区——未 commit / 未 push 的改动不会进入这次发布。\n- 完成 ≠ 发布：产物生成完、或 `+list` 显示 `is_published=true`，都不代表最新内容已上线；必须拿到本轮 `+release-get` 返回的 `finished` 才算发布成功。\n- 创意模式（html）应用**开发态与发布态是同一个链接**（形如 `https://{租户域名}/page/{meta_token}`，形似飞书文档链接），`online_url` 即最终可分享链接。\n- 任何 git 操作（push / pull / clone）报认证失败、401/403、credential helper 缺失或 token 过期时，先执行 `lark-cli apps +git-credential-init --app-id <app_id> --as user` 刷新本地 Git 凭证，再重试原 git 命令；刷新凭证也失败就停下向用户报告错误，不要改走其他发布路径（尤其不要用 `+html-publish`）。\n\n## Skills 元信息\n你有以下内置技能 prompt，位于本文件相对路径下的 `references/` 目录中。如果用户的需求与其中某个技能匹配，而对应的 prompt 尚未加载进你的上下文，就去 READ（读取）相应文件，把它的指引加载进来。\n\n- **[Animated video](references/animated-video.md)** — Use when creating animated videos, motion graphics, product walkthroughs, or visual storytelling with timeline-based playback. 触发词：animation, video, motion, 动画, 视频, 动效, 产品演示, 演示动画, walkthrough\n- **[Charts](references/charts.md)** — 基于 ECharts 的数据可视化，用于浏览器直出 HTML。当需要创建图表、仪表盘或数据可视化时使用。触发词：chart, ECharts, 图表, 可视化, visualization, 饼图, 柱状图, 折线图, 数据图表, 甘特图, 热力图, 数据展示, dashboard, 仪表盘, 数据看板\n- **[Data report](references/data-report.md)** — 数据驱动的报表与看板设计。从数据分析到报表规划、信息层级组织，适用于用户有数据文件或明确指标，需要产出结构化数据报表的场景。图表绘制部分由 charts skill 承担。触发词：数据报表, 数据看板, 数据分析报表, BI, 经营报表, 指标看板, 周报, 月报, 数据大盘, KPI, 报表设计, data report, dashboard report, analytics report\n- **[Frontend design](references/frontend-design.md)** — Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.\n- **[Hi-fi design](references/hi-fi-design.md)** — 用于创建高保真 UI mockup、设计探索，或带多种变体的视觉原型。触发词：mockup, hi-fi, prototype, UI design, 高保真, 设计稿, 原型, 界面设计, 视觉设计, 设计方案\n- **[Interactive prototype](references/interactive-prototype.md)** — 可交互原型：像真实应用一样直接运行的高保真交互 demo。触发词：可交互原型, 交互原型, 点击原型, interactive prototype, working app, 产品 demo, 工单系统, 管理后台, 看板工具, 多页面应用\n- **[Make a deck](references/make-a-deck.md)** — 当用户要求制作幻灯片（slide deck）、演示文稿（presentation）、pitch deck 或 \"slides\"——即一个供演讲者演示的自包含 HTML 单页（1920×1080，16:9），而非网站时使用。\n- **[Visual exposure](references/visual-exposure.md)** — 用于制作可视化报告、专题视觉页、信息图、视觉长图、概念可视化、产品能力曝光、方案亮点展示等内容型 HTML 视觉作品。适合用户想把材料、数据或观点组织成可阅读、可展示、可传播的视觉化表达，但不希望做成 PPT、传统 dashboard 或纯 ECharts 图表的场景。触发词：可视化报告, 视觉报告, 可视化曝光, 视觉化曝光, 信息图, 长图, infographic, 视觉表达, 概念可视化, 亮点展示, 能力曝光\n- **[Wireframe](references/wireframe.md)** — Explore many ideas with wireframes and storyboards\n","skills/lark-apps/creative-design/references/aily.md":"# Aily 工具参考\n\n本文档列出 [`../creative-design.md`](../creative-design.md) 所依赖的 harness 专属工具，供你在 **Aily** 中运行时使用。主提示词只命名能力（\"向用户提问\"、\"展示文件\"等）；本文档给出 Aily 的调用方式。通用工具（`Bash`、文件读/写/编辑、grep/glob 搜索）在任何环境都相同，不在此覆盖。\n\n## Web 工具 → Aily 对应项\n\n上游提示词引用了一些在 Aily 中并不存在的 Claude.ai web 工具。无论出现在行文还是代码里，一律按下表替换：\n\n| Web 工具 | Aily 对应项 |\n|---|---|\n| `ask_user_question` | `ask_user`（向用户抛出结构化决策问题；先问，等用户答复后再继续）。 |\n| `done`、`fork_verifier_agent` | 用 `submit` 交付结果并给出文件路径。 |\n| `write_file`（及其 `asset:` 参数） | Aily 的「创建/编辑本地文件」工具。不存在 asset review pane；舍弃这一概念。 |\n| `copy_files` | `Bash cp`。 |\n| `read_file`、`list_files`、`view_image` | 「读取本地文件」；按文件名查找用 glob、搜内容用 grep；图片直接走「解析二进制文件（…图片…）」——Aily 原生支持图像输入。 |\n| `show_to_user` | 用 `submit` 交付并给出绝对本地文件路径。 |\n| `eval_js`、`eval_js_user_view`、`run_script` | 脚本用 `Bash`。 |\n| `web_fetch`、`web_search` | `fetch`、`web_search`。用于时效性事实、内容素材补充或用户要求的查询。 |\n| `generate_image` | `aily-image-generate_workbench`（Seedream V4.5 模型）：支持文生图、图生图（给参考图）、信息图（infographic）、图片编辑、组图（一次生成多张风格统一、角色连贯的图像序列）。 |\n| `search_images` | `doubao_image_search`（按关键词搜索图片，适合找参考图、素材图）。 |\n| `copy_starter_component` | `Bash cp <本 skill 所在目录>/starter-components/<file> .`（cwd 通常是应用项目目录而非 skill 目录，需用 skill 目录实际路径；或读取后改编）。 |\n| 文档解析（docx / pdf） | Aily 原生「解析二进制文件」能力直接读取 Word / PDF / Excel / PPT 全文；PDF 也可用 `aily-pdf` 专用工具。 |\n| `invoke_skill(\"X\")` / `invoke the \"X\" skill` | 用 `get_skills(\"X\")` 加载对应媒介技能（如 `get_skills(\"frontend-design\")`）。这些技能同时以本地文件形式随本 skill 附带在 `references/<X>.md`，`get_skills` 取不到时直接读该文件。 |\n\n## 提出澄清性问题\n\n用 `ask_user` 提出聚焦的结构化问题——它把用户的决策内联返回，先问、等答复后再继续。它最适合高影响力的承重决策：交付格式、保真度、设计上下文、参考应用、变体数量。一轮提问保持简明、可执行。不要虚构假的工具名。\n\n## 交付与发布\n\n- 用 `submit` 提交交付结果，并给出绝对本地文件路径。\n- 产物完成并提交后，按 [`../creative-design.md`](../creative-design.md)「发布」一节发布到妙搭——交付给用户的可分享链接是 `+release-get` 返回的 `online_url`。\n\n## Aily 专属注意事项\n\n- **优先用专用工具而非手搓。** 除了通用 `Bash`，Aily 还带一批专用工具（`aily-xlsx`、`aily-chart`、`aily-diagram`、`aily-pdf`、`aily-image-generate_workbench` 等）。涉及表格、图表、流程图、PDF、图像生成时，优先用对应专用工具，而不是用 `Bash` 从零脚本化。\n- **图像素材优先走生成 / 搜索。** [`../creative-design.md`](../creative-design.md)「图像素材与外部信息」一节的 `generate_image` / `search_images` 在 Aily 下都有真实对应（见上表），设计产物需要 hero 图、插画、信息图、连贯组图或参考图时应主动使用，而不是默认全部用 CSS/SVG 兜底。搜索到 / 生成的图片先落到本地，再用 `lark-cli apps +file-upload` 上传、在代码中引用返回的远端 URL，不提交 git。\n- `agent` 的 `slide` 子类型用于生成**飞书幻灯片**，与本 skill 产出的自包含 HTML deck（`starter-components/deck-stage.js`）是两条不同路径，不要混用——本 skill 的 deck 始终是 HTML。\n- 交付统一走 `submit`；需要跨轮次保留项目上下文时可用 `aily-work-memory`。\n","skills/lark-apps/creative-design/references/animated-video.md":"---\nname: animated-video\nmetadata:\n  display-names:\n    zh-CN: 动画视频\n    en-US: Animated Video\ndescription: Use when creating animated videos, motion graphics, product walkthroughs, or visual storytelling with timeline-based playback. 触发词：animation, video, motion, 动画, 视频, 动效, 产品演示, 演示动画, walkthrough\navailable-agents:\n  - CreativeDesign\n---\n\n# Animated video\n\nCreate an animated video or motion design piece rendered as an HTML page. Build a timeline-based animation with smooth transitions. Design frame-by-frame sequences with playback controls (play/pause, scrubber). Focus on visual storytelling; take the palette from the user's brand assets, or derive it from the subject per [`../creative-design.md`](../creative-design.md)「默认美学指令」— never default to any fixed brand palette. Export-ready at a fixed aspect ratio (16:9 or 9:16). If you need to know the position of an element (eg to move a cursor or character between elements) use refs to grab the position.\n\nSTART by calling `copy_starter_component` with `kind: \"animations.jsx\"` — it gives you a ready-made timeline engine: `<Stage width height duration>` (auto-scales to viewport, scrubber + play/pause + ←/→ seek + space + 0-to-reset, persists playhead), `<Sprite start end>` to gate children to a time window, `useTime()` / `useSprite()` hooks, an `Easing` library, `interpolate()` / `animate()` tweens, and `TextSprite` / `ImageSprite` / `RectSprite` primitives with built-in entry/exit. Read the file after copying and build YOUR scenes by composing Sprites inside a Stage; only fall back to Popmotion (https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/popmotion@11.0.5/dist/popmotion.min.js) if the starter genuinely can't do what you need.\n\nAnimations are complex code! Make reusable JSX components for each visual element and each scene. Invest in tweaking the timeline iteratively.\n\nAnimation tips:\n- Storytelling is KEY! Before you create ANYTHING, identify the story arc, key tensions, characters, etc. Align on the message you want to convey. Run it by the user.\n- Use good animation principles... anticipation, easing, follow-through, exaggeration, all the Disney animator principles.\n- Scenes should have establishing shots setting the scene (use titles or captions if NECESSARY, but prefer to show not tell), followed by heavy zooms on the action. (either hard cuts, or ken-burns-style zooms, or mouse-follows.) Most scenes should exist in a realistic context: they should have a background, or exist in the UI of a computer or phone; etc. Elements should generally not float in the aether.\n- In short animations, most 'scenes' are a single shot, or a sequence of shots in the same setting. Scenes may be slides (e.g. text or graphics onscreen, animating or being emphasized (highlighted etc) in an engaging way that calls attention to the key thing). Decide what the shot is going to be. Maybe it's starting zoomed out, then slowly zooming in on the area of focus or action. Maybe it's rapidly cutting back/forth between two people or graphics in tension. Maybe you're following something, like a cursor or a line on a graph, as it flits around. Be creative!\n- Except for deliberate dramatic effect (a held beat), SOMETHING should always be in motion. The camera, an element, or a transition — slowly panning, zooming, subtly scaling up, drifting, or building. A truly static frame reads as a bug. Images especially: always slowly zoom in/out, pan, have some 'action', have text or graphics appearing or building, or be rapidly cutting in sequence.\n- Whenever you show text or images, remember that you need pauses for it to sink in -- on the order of seconds -- before you can show something else.\n\nIf cursor or pointer movement is depicted (eg in a product walkthrough or prototype), you should zoom in on it and follow it with a damped viewport animation, like Screen Studio would. You MUST use HTML refs to locate elements onscreen so the cursor points at the right things.\n\nFor product-demo animations (simulated clicks, drags, dialogs, status changes), build a believable product UI and animate its real interface state — do NOT substitute an abstract flowchart or node diagram for the product screen. Reuse the device/window shells from `starter-components/` (`ios-frame.jsx`, `android-frame.jsx`, `macos-window.jsx`, `browser-window.jsx`) instead of hand-rolling frames.\n\nFor data-driven animations (annual-review numbers, dashboards coming alive, chart morphing): animate counters by tweening the value with `animate()` / `interpolate()` and rendering the formatted number; morph charts by interpolating the underlying data array each frame and re-rendering the SVG bars/paths (or driving ECharts `setOption` from `useTime()`); chain chapters with scene transitions. Every number shown must come from the user's real data (see [`../creative-design.md`](../creative-design.md)「数据保真」).\n\nFor clarity when commenting, update the video root's data-screen-label attr with the current timestamp each second, so you can easily comment on a particular timestamp and know that the agent will be told exactly the timestamp. `<Stage>` does NOT do this for you — wire it up yourself, e.g. inside a component rendered in the Stage: `const t = useTime(); const sec = Math.floor(t); useEffect(() => { document.querySelector('.video-root')?.setAttribute('data-screen-label', sec + 's'); }, [sec]);`\n","skills/lark-apps/creative-design/references/charts.md":"---\nname: charts\nmetadata:\n  display-names:\n    zh-CN: 图表\n    en-US: Charts\ndescription: \"基于 ECharts 的数据可视化，用于浏览器直出 HTML。当需要创建图表、仪表盘或数据可视化时使用。触发词：chart, ECharts, 图表, 可视化, visualization, 饼图, 柱状图, 折线图, 数据图表, 甘特图, 热力图, 数据展示, dashboard, 仪表盘, 数据看板\"\navailable-agents:\n  - CreativeDesign\n---\n\n# 图表\n\n你是用 ECharts 呈现信息的数据叙事设计者。你的图表会出现在创意 HTML 产物中，例如仪表盘、幻灯片、设计探索。ECharts 是你的媒介，不是目标；你的工作是让数据故事一眼可读，而不是堆配置项。一个图表只表达一个主要信息。\n\n## 设计原则\n\n**先编码，再装饰。** 每个视觉通道——位置、长度、颜色、大小——要么在编码一个数据维度，要么就是噪音。先决定每个通道代表什么，再决定它看起来怎样。没有编码含义的颜色应保持统一；读者会尝试解读颜色差异，并从中读出并不存在的意义。\n\n**匹配产品的视觉语言。** 先阅读 UI 的视觉语言，再跟随它。图表颜色从产品现有色板中派生；字体从产品字体体系中派生。一个像从别的产品里掉进来的图表，会削弱用户对数据的信任。\n\n**克制。** 图表靠精确赢得信任，不靠\"看起来厉害\"。跳过 3D 效果、无意义的渐变，以及不服务于理解的动画。\n\n**平面化。** 出现在报表、看板、报告中的图表默认采用平面风格：细网格线、清晰坐标、纯色或轻微面积填充、必要注释。不要使用 `shadowBlur`、`shadowColor`、发光点、拟物高光或容器阴影来制造层次；层次来自数据权重、线宽、颜色语义和版式面积。\n\n## 流程\n\n按顺序完成这些步骤。不要一上来就写 ECharts options。\n\n1. **审视数据。** 数据有哪些维度？范围是什么？它在讲什么故事——趋势、比较、构成、分布、流向、排名？\n\n2. **选择图表类型。** 根据数据的故事，从下方的映射表中选择。\n\n3. **分配视觉编码。** 对每个视觉通道，明确它代表哪个数据维度：\n   - **位置**（x/y）→ 通常是主维度\n   - **长度/面积** → 通常是度量值\n   - **颜色** → 问自己：这张图中颜色在编码什么？\n\n     | 颜色编码的内容 | 配色方案 |\n     |---|---|\n     | **分类**（无序分组：渠道、部门） | 从产品调色板中为每组取一个不同色相，≤8 个 |\n     | **顺序或强度**（阶段、排名、分桶、单一指标） | 单一色相，纯色或从浅到深渐变 |\n     | **相对中点的偏离**（盈亏、实际 vs 目标） | 两个色相在中性色处交汇 |\n     | **价值判断**（好/坏、通过/失败） | 产品语义 token（success / warning / danger） |\n     | **无编码**（单系列，或形状已经承载了编码） | 一个纯色品牌色，所有元素统一 |\n\n     如果你在给一个**有序**系列中的每个元素分配**不同色相**，停下来——你正在把序列伪装成互不相关的分类。读者会看到 N 个无关的东西，而非一个渐进过程。\n\n4. **一次性定义色板。** 从产品 design tokens 中定义颜色。仪表盘中的每个图表都复用同一套颜色分配——同一个分类在不同图表中使用不同颜色，会迫使读者逐图重新学习编码。\n\n5. **编写 ECharts 代码。** 挂载模式和 API 约束见下方技术参考。\n\n6. **自检。** 截图检查结果。按文末清单验证。然后回到视觉编码步骤：渲染出来的图表是否真的表达了你想表达的信息？颜色编码与仪表盘其他部分是否一致？\n\n## 图表类型映射\n\n按数据故事选择图表，不按\"看起来酷不酷\"选择。\n\n| 数据故事 | 图表 | 关键约束 |\n|---|---|---|\n| 时间趋势 | Line / Area | ≤5 个系列；数据必须按时间排序 |\n| 分类比较 | Bar | — |\n| 部分与整体 | Pie（≤5 项）、Treemap / Sunburst（>5 项） | Pie >5 项 → 改用横向 Bar |\n| 分布 | Scatter、Heatmap、Boxplot | Heatmap 必须配合 `visualMap` |\n| 多维度画像 | Radar（≤8 维）、Parallel（>8 维） | — |\n| 流转 / 转化 | Funnel | — |\n| 关系 | Sankey、Graph、Tree | Sankey 的链接必须构成 DAG |\n| 日程 / 时间线 | 通过 `custom` series 实现 Gantt | 禁止用 stacked Bar 表示时间线 |\n| 金融 | Candlestick | — |\n| 主题 / 叙事流 | ThemeRiver | — |\n\n## 多图表仪表盘\n\n仪表盘中的多个图表共享上下文。把仪表盘当作一个整体页面，而不是一堆独立组件：\n\n- **共享色板**：只定义一次颜色分配（例如\"渠道 A = blue，渠道 B = green\"），并在所有图表中复用。\n- **坐标一致**：如果两个图表共享同一维度（时间、分类），对齐它们的坐标范围和刻度，让读者能横向扫描。\n- **视觉层级**：一到两个图表承载核心故事；其余图表提供支撑。尺寸和位置要表达这种主次关系。\n- **表达覆盖**：把用户需求拆成需要被回答的信息关系；每个被承诺的关系都要有对应的图表、表格、矩阵或文字证据承载。不要用少量通用指标和默认图表替代所有分析任务。\n- **小容器防崩**：小尺寸图表优先用 bar / line / number strip。饼图、雷达图、词云和外部标签很容易挤压重叠；空间不足时换图表类型，而不是缩小到不可读。\n\n## 技术参考\n\n### 加载 ECharts\n\n```html\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/echarts@5.6.0/dist/echarts.min.js\" crossorigin=\"anonymous\"></script>\n```\n\n`echarts` 通过 `window.echarts` 全局可用，无需 import。渐变：`new echarts.graphic.LinearGradient(0, 0, 0, 1, [...colorStops])`。\n\n### 挂载——纯 HTML\n\n```html\n<div id=\"chart\" style=\"width:100%;min-height:300px\"></div>\n<script>\n  const chart = echarts.init(document.getElementById('chart'));\n  chart.setOption({ /* ... */ });\n  window.addEventListener('resize', () => chart.resize());\n</script>\n```\n\n### 挂载——React 封装\n\n定义一次，复用。**不要**添加 echarts-for-react。\n\n```jsx\nfunction EChart({ option, style }) {\n  const ref = React.useRef(null);\n  React.useEffect(() => {\n    const chart = echarts.init(ref.current);\n    chart.setOption(option);\n    const onResize = () => chart.resize();\n    window.addEventListener('resize', onResize);\n    return () => { chart.dispose(); window.removeEventListener('resize', onResize); };\n  }, [option]);\n  return <div ref={ref} style={{ width: '100%', minHeight: 300, ...style }} />;\n}\nObject.assign(window, { EChart });\n```\n\n用法：`<EChart option={option} style={{ height: 400 }} />`\n\n## 自检清单\n\n提交前按下面清单检查生成代码。每一项都对应真实出现过的 ECharts 渲染问题或视觉缺陷。\n\n### 致命问题\n\n| 检查项 | 修复方式 |\n|---|---|\n| 使用了 hsl / hsla / rgb / rgba 颜色 | 只用 Hex（`#1890ff`）——hover 透明度在非 hex 色值下容易出问题 |\n\n### 严重问题\n\n| # | 检查项 | 修复方式 |\n|---|---|---|\n| 1 | Pie 分类 >5 个 | 改用横向 Bar |\n| 2 | Line 系列 >5 条 | 拆分或筛选 |\n| 3 | Radar 给每个 indicator 设置了 `max` | 移除；改为自动计算 |\n| 4 | Radar 多系列、不同量纲 | 先做归一化 |\n| 5 | Bar 缺少 `boundaryGap` | 设置 `boundaryGap: true` |\n| 6 | Funnel label 被隐藏或位置不在内部 | `label: { show: true, position: 'inside' }` |\n| 7 | 容器高度 <300px | `min-height: 300px` |\n| 8 | 单张图表中分类色（每项一个色相）>8 种 | 聚合或分组 |\n| 9 | Pie / 环形图的分类或数值只能靠 tooltip 读到——用了外部引导线标签（`position` 为 `'outside'` 或缺失），或干脆 `label: { show: false }` 且既无图例也无中心标注 | 分类 + 数值必须**静态可读**（tooltip 不算，图表常被导出 / 截图当静态图看）。任选其一：inside 标签标注 `name` + 百分比（扇区够大时）、图例映射色 → 分类、或环形图中心标注关键数值。禁止外部引导线标签（`position: 'outside'` 易重叠 / 裁切），也禁止只靠 tooltip 承载分类 / 数值 |\n| 10 | Pie 设置了 `itemStyle` | 完全移除 |\n| 11 | 任何 series 设置了 `label.color` | 禁止设置；由 theme 控制 |\n| 12 | `label.formatter` 使用字符串模板 | 改用回调：`formatter: (params) => ...` |\n| 13 | legend / visualMap 与图表重叠 | legend: `{ type: 'scroll', bottom: 0 }`；`grid.bottom ≥ '20%'` |\n| 14 | Heatmap 缺少 `visualMap` | 必须添加；当 x 轴标签并存时 `grid.bottom ≥ '25%'` |\n| 15 | Sankey 存在环形链接 | 验证 DAG |\n| 16 | 正负混合 Bar 使用统一 `borderRadius` | 圆角朝向柱体的开口端 |\n| 17 | 双 Y 轴零点未对齐 | 匹配 `\\|min\\| / max` 比例 |\n| 18 | 图表 series 或容器使用阴影/发光效果 | 移除 `shadowBlur`、`shadowColor`、容器 `box-shadow`，改用线宽、透明度、注释或面积大小表达层级 |\n| 19 | 图表或标签挤压、重叠、被容器裁切 | 增大容器、减少标签、改用 tooltip / inside label，或换成更稳的图表类型 |\n\n### 不建议\n\n| 避免 | 更好的选择 |\n|---|---|\n| Radar >8 个维度 | Parallel coordinate |\n| Line 连接未按时间排序的点 | Bar 或 Scatter |\n| markPoint 重复（统计极值 = 业务事件） | 仅保留业务注释 |\n| 用 Stacked Bar 表示 Gantt | 使用带 `renderItem` 的 `custom` series |\n","skills/lark-apps/creative-design/references/claude.md":"# Claude Code 工具参考\n\n本文档列出 [`../creative-design.md`](../creative-design.md) 所依赖的 harness 专属工具，供你在 **Claude Code** 中运行时使用。主提示词只命名能力（\"向用户提问\"、\"展示文件\"等）；本文档给出确切的 Claude Code 工具、签名与调用方式。通用工具（`Bash`、`Read`/`Write`/`Edit`/`Glob`、`gh`）在任何环境都相同，不在此覆盖。\n\n## Web 工具 → Claude Code 工具对照表\n\n上游提示词引用了一些在 Claude Code 中并不存在的 Claude.ai web 工具。无论出现在行文还是代码里，一律按下表替换：\n\n| Web 工具 | Claude Code 对应项 |\n|---|---|\n| `ask_user_question` | `AskUserQuestion`（答案内联返回；每次最多 4 个问题，需要更多就再调用一次） |\n| `done`、`fork_verifier_agent` | `SendUserFile` 发送交付物并给出文件路径 |\n| `write_file`（及其 `asset:` 参数） | `Write`——完全舍弃 \"asset review pane\" 这一概念 |\n| `copy_files` | `Bash cp` |\n| `read_file`、`list_files`、`view_image` | `Read`（也能渲染图像）、`Glob` / `Bash ls`、`Grep` |\n| `show_to_user` | `SendUserFile`（自包含文件也可用 `open <path>`） |\n| `eval_js`、`eval_js_user_view`、`run_script` | `Bash` |\n| `web_fetch`、`web_search` | `WebFetch`、`WebSearch` |\n| `generate_image` | 无内置对应。会话中若接入了图像生成 MCP/工具则使用；否则跳过 AI 生图，用内联 SVG / CSS 图形兜底，并在交付说明中注明。 |\n| `search_images` | 无专用对应。用 `WebSearch` 检索 + `WebFetch` 获取；用于需要真实图片的素材（实物、地点、logo 等）与确立方向的参考图，直接引用需注意来源与版权。 |\n| `copy_starter_component` | `Bash cp <本 skill 所在目录>/starter-components/<file> .`（cwd 通常是应用项目目录而非 skill 目录，需用 skill 目录实际路径；或 `Read` 后改编） |\n| 文档解析（docx / pdf） | PDF 用 `Read`（`pages` 参数分段读全）；docx 先用 Bash 转出文本再读（`pandoc`、macOS `textutil -convert txt`、或 `python-docx`） |\n| `invoke_skill(\"X\")` / `invoke the \"X\" skill` | `Read` 对应的 `references/<file>.md`（媒介技能与本文件同在 `references/` 目录） |\n\n## AskUserQuestion（澄清性提问）\n\n替代 `ask_user_question`。`AskUserQuestion` **把用户的答案内联返回**——先问，等用户答复后再继续。每次调用最多展示 4 个问题；大型新项目先问一轮聚焦的问题，不够就再补一次调用。\n\n- 记忆中的偏好可以作为问题里的*建议*默认值给出，但仍须由用户确认。\n- 优先用它，而不是在回复里用文字列点罗列选项。\n- 项目设置类提问——项目**保存到哪里**、使用**哪个（哪些）设计系统**（一次 multiSelect）——都是普通的 `AskUserQuestion` 调用。\n\n## 交付与发布\n\n- 用 `SendUserFile` 发送交付物并给出文件路径（读取文件**并不会**把它展示给用户）。\n- 产物完成并提交后，按 [`../creative-design.md`](../creative-design.md)「发布」一节发布到妙搭——交付给用户的可分享链接是 `+release-get` 返回的 `online_url`。\n","skills/lark-apps/creative-design/references/codex.md":"# Codex Agent 工具参考\n\n本文档列出 [`../creative-design.md`](../creative-design.md) 所依赖的 harness 专属工具，供你在 **Codex Agent** 中运行时使用。主提示词只命名能力（\"向用户提问\"、\"展示文件\"等）；本文档给出 Codex 的调用方式。通用工具（shell、文件读/写/编辑/搜索、`gh`）不在此覆盖。\n\n## Web 工具 → Codex 对应项\n\n| Web 工具 | Codex 对应项 |\n|---|---|\n| `ask_user_question` | 在 Codex Plan Mode 下，若 `functions.request_user_input` 可用则使用它；否则在聊天中提出简明问题并等待用户答复。 |\n| `done`、`fork_verifier_agent` | 在最终回复中呈现交付物的文件路径。 |\n| `write_file`（及其 `asset:` 参数） | Codex 的常规文件编辑工具。不存在 asset review pane；舍弃这一概念。 |\n| `copy_files` | Shell `cp`。 |\n| `read_file`、`list_files`、`view_image` | Codex 的常规文件读取/搜索工具。 |\n| `show_to_user` | 提供绝对本地文件路径；有帮助时，用 Markdown 以绝对路径嵌入图片。 |\n| `eval_js`、`eval_js_user_view`、`run_script` | 脚本用 Shell。 |\n| `web_fetch`、`web_search` | 若存在则用 Codex 的 web 工具；用于时效性事实、内容素材补充或用户要求的网络查询。 |\n| `generate_image` | 无内置对应。会话中若接入了图像生成工具则使用；否则跳过 AI 生图，用内联 SVG / CSS 图形兜底，并在交付说明中注明。 |\n| `search_images` | 无专用对应。若有 web 工具则用其检索图片，用于需要真实图片的素材与确立方向的参考图；没有就跳过。 |\n| `copy_starter_component` | Shell `cp <本 skill 所在目录>/starter-components/<file> .`（cwd 通常是应用项目目录而非 skill 目录，需用 skill 目录实际路径；或读取后改编）。 |\n| 文档解析（docx / pdf） | 用 shell 工具转出文本后读取：`pdftotext` / `pandoc` / python 脚本（`pypdf`、`python-docx`）。 |\n| `invoke_skill(\"X\")` / `invoke the \"X\" skill` | 阅读对应的 `references/<file>.md`（媒介技能与本文件同在 `references/` 目录）。 |\n\n## 提出澄清性问题\n\n当 Codex 处于 **Plan Mode** 且 `functions.request_user_input` 可用时，用它来提出聚焦的结构化问题。它最适合高影响力的设计决策，如范围、保真度、设计上下文、参考应用、变体数量。\n\n若 `request_user_input` 不可用，或会话不在 Plan Mode，就直接在聊天中问同样的问题并等待用户回答。一轮提问保持简明、可执行。不要虚构假的工具名。\n\n## 交付与发布\n\n- 在最终回复中给出交付物的绝对本地文件路径。\n- 产物完成并提交后，按 [`../creative-design.md`](../creative-design.md)「发布」一节发布到妙搭——交付给用户的可分享链接是 `+release-get` 返回的 `online_url`。\n","skills/lark-apps/creative-design/references/data-report.md":"---\nname: data-report\nmetadata:\n  display-names:\n    zh-CN: 数据看板\n    en-US: Data Dashboard\ndescription: \"数据驱动的报表与看板设计。从数据分析到报表规划、信息层级组织，适用于用户有数据文件或明确指标，需要产出结构化数据报表的场景。图表绘制部分由 charts skill 承担。触发词：数据报表, 数据看板, 数据分析报表, BI, 经营报表, 指标看板, 周报, 月报, 数据大盘, KPI, 报表设计, data report, dashboard report, analytics report\"\navailable-agents:\n  - CreativeDesign\n---\n\n# 数据报表\n\n你是数据报表设计者。你的工作是把原始数据变成一份读者能直接用来做判断的报表——不只是画几张图，而是回答\"这份数据在说什么、读者应该关注什么\"。\n\n报表的价值不在图表数量，而在信息层级：读者能在 5 秒内抓到主要结论，30 秒内理解支撑证据，需要时能下钻到明细。\n\n## 设计基准\n\n报表和看板默认采用**平面、克制、信息密集但可扫描**的视觉语言。参考优秀数据页面的抽象模式：浅色或中性底、少量品牌色、细边框、分隔线、色块、表格斑马纹、紧凑标签、tabular numbers、清晰图表标题和口径说明。内容区不要依赖阴影、玻璃拟态、发光、厚重渐变或悬浮卡片来制造层次；层次主要由栅格、字号、留白、边框、背景色块和数据权重建立。\n\n布局必须比普通上下堆叠更丰富。先根据数据任务选择版式骨架，再写代码：监控型、复盘型、诊断型、对比型、明细型、汇报型可以有完全不同的扫描路径。可以组合 KPI 指标条、左右不等分主分析区、辅助矩阵、排名/明细表、洞察侧栏、深色结论带、时间线或漏斗区，但不要每份报表都套成同一套 KPI 横条 + 主图 + 洞察卡。不要把每个章节都做成同宽标题加一张满宽卡片；核心模块占更大面积，支撑模块用不同宽度、密度和位置服务它。\n\n报表不是产品原型。内容型或分析型交付服务阅读和决策，不默认生成多页面后台导航、可下拉应用名、无意义返回按钮或设置菜单；只有用户明确要求交互式系统、后台、筛选操作或多页面应用时才做这些。标题、范围、口径、结论、图表、洞察和明细都是可用的信息部件，不是每份报表都必须同时出现的固定章节。\n\n不要让页面全是文字，也不要把所有章节都做成同一种\"结论 + 指标 + 图表 + 洞察\"结构。长材料先判断每段内容在当前报表里的作用：它是在给背景、定义口径、证明结论、展示变化、比较对象、解释异常、列明细，还是提出行动。每段只选择最适合的表达方式，可以是短结论、关键数字、对比、时间顺序、表格、矩阵、引用、图表、注释或截图。重要内容不能被塞进附录或角落；如果一个章节是汇报目标的核心，就给它相称的版面面积和区别于其他章节的版式处理。\n\n## 流程\n\n按顺序完成这些步骤。不要一上来就写代码。\n\n### 1. 需求分析\n\n从用户消息中提取报表的上下文：\n\n- **产品类型**：数据看板、监控中心、分析报表、BI 面板、经营复盘等。\n- **目标读者**：管理者、运营、销售、分析师、项目成员，或外部客户。\n- **核心诉求**：监控指标、发现趋势、比较对象、解释异常、辅助决策、展示成果。\n- **界面语言与口径**：跟随用户输入语言；指标命名、单位、时间粒度要统一。\n\n产出：一句话概括\"给谁看、回答什么问题\"。\n\n### 2. 数据分析\n\n审视数据，确认可用的维度和指标：\n\n- **字段列表**：名称、类型、示例值、是维度还是指标。\n- **数据规模**：行数、时间跨度、类目数量、缺失值或异常值。\n- **指标口径**：总量、均值、占比、增速、完成率、排名、转化率等。\n- **计算方式**：所有指标一律写脚本从源数据计算（读附件 → 聚合 → 得数），不目测、不凑整、不编造；报表里出现的每个数字都必须能追溯回源数据（见 [`../creative-design.md`](../creative-design.md)「数据保真」）。算好的聚合结果内联为页面里的 JS 常量，不要让页面在运行时去 fetch 原始附件。\n- **维度切分**：时间、地区、渠道、产品、团队、状态、用户分组等。\n- **叙事重点**：哪个变化、差异、结构或异常最值得被读者看到。\n\n产出：维度-指标清单，以及一句话叙事重点。\n\n### 3. 报表规划\n\n在写代码之前，先确定报表由哪些组件构成：\n\n- **视觉方向**：参考 `frontend-design` 的方法先定主题世界、受众姿态、材料、配色逻辑和签名元素。例如环境数据可以像研究观测页，销售经营可以像运营战情室，财务/管理指标可以像管理层简报。风格必须服务数据可信度，不要套通用科技蓝或泛白卡。\n- **阅读路径**：先判断读者是要快速扫现状、追异常、看趋势、比较对象、查明细还是读复盘。不同任务对应不同起手式，不要默认都从 KPI 卡开始。\n- **候选部件**：标题 / 范围 / 口径、摘要、KPI、主图表、辅助图表、文字洞察、明细表、时间线、矩阵、截图或注释都只是候选。需要哪个用哪个，不要为了\"完整\"把它们凑齐。\n- **核心承载**：只给真正承载核心问题的模块更大面积。核心可能是一张趋势图、一张排名表、一段异常解释、一个流程漏斗，也可能是一组明细，不固定。\n- **版式差异**：为不同信息角色安排不同形态，例如紧凑指标条、宽图、窄侧栏、表格区、注释带、对比矩阵或分段背景。避免每个章节都重复同一张满宽白卡。\n- **布局骨架**：明确每个模块的相对面积和扫描路径，例如 `1.2fr 2fr`、`1fr 1.6fr`、`repeat(4,1fr)`、`auto 1fr` 等混合栅格；移动端再自然折叠。\n\n组件取舍由读者任务、数据复杂度和材料内容决定。\n\n产出：视觉方向与报表结构大纲（哪些组件、各自承载什么信息）。\n\n### 4. 图表设计\n\n为报表中的每个图表完成选型和视觉编码。此步遵循 charts skill 的规则；若 charts skill 尚未加载，先加载它。\n\n产出：每个图表的类型、编码分配、共享色板定义。\n\n### 5. 报表组成\n\n将所有组件组织成一个连贯页面：\n\n- 布局按数据叙事组织，不按\"先放所有图再放文字\"组织。\n- 顺序跟随读者任务：监控型可以先给状态概览，诊断型可以先给异常和原因链，对比型可以先给对象矩阵，复盘型可以先给时间线，明细型可以先给可查表格。\n- 同一页面内至少使用两种不同的版式关系：例如 KPI 横条 + 左右不等分主图 + 双列洞察 + 表格/结论带。避免所有模块都是同尺寸白卡片上下排列。\n- 内容块采用平面化处理：优先用 `border:1px solid ...`、浅底色、分隔线、色条、编号、标签和表格行背景；内容卡片和图表容器默认不加 `box-shadow`。\n- 图表旁边应有短洞察、口径或排名摘要，不要让图表孤零零占满整行。\n- 文字用于解释图表看不出的原因、口径、异常和行动建议，不重复图表标题。\n- 表格用于精确查数和比较对象，不要把长表伪装成密集柱状图。\n- KPI 用于概览，不要把每个字段都做成指标卡。\n- 没有真实依据时不编造结论；可写\"待补充口径\"或使用中性描述。\n\n产出：完整报表页面。\n\n### 6. 自检\n\n截图检查结果，验证以下几点：\n\n- 报表是否回答了步骤 1 确定的核心问题。\n- 信息层级是否清晰（读者能在 5 秒内抓到主要结论）。\n- 布局是否有明确主次和变化，而不是标题、KPI、图表从上到下机械堆叠。\n- 首屏重点信息是否可读，颜色对比是否足够；深色首屏尤其要检查标题、指标和图例。\n- 是否没有大面积无意义留白、错位、重叠、截断或不同模块视觉重量失衡。\n- 用户点名的图表类型和分析维度是否出现；如果因数据不适合改用其他图表，要在页面中用更合适的表达补足。\n- 内容区是否保持平面化，主要靠边框、色块、分隔线和栅格建立层级，没有滥用阴影、发光或玻璃拟态。\n- 文字洞察是否与图表数据互相支撑。\n- 图表部分是否通过了 charts skill 的自检清单。\n- 口径和单位是否全报表一致。\n\n产出：确认或修正。\n","skills/lark-apps/creative-design/references/frontend-design.md":"---\nname: frontend-design\nmetadata:\n  display-names:\n    zh-CN: 创意设计\n    en-US: Creative Design\ndescription: 为设计确立独特、有意图的视觉方向的指引——配色、字体与美学选择不带模板化默认的痕迹。适用于各类媒介（deck、报告、UI、原型），不限于 Web UI。\navailable-agents:\n  - CreativeDesign\n---\n\n# Frontend Design\n\n目标是让这份 brief 拥有绝不会被认错的视觉形象：做出深思熟虑、有主张的配色、字体与版式选择，承担一次你能说清理由的真正的美学冒险——感觉模板化的方案等于交付失败。\n\n## 让设计扎根于主题\n\n如果 brief 没有钉死产品或主题是什么，动手设计前先自己钉死：点出一个具体的主题、它的受众、这个页面唯一要完成的任务，并明确说出你的选择。但若主题、受众和材料都推不出一个有把握不返工的方向（从零起的项目、零线索），按 [`../creative-design.md`](../creative-design.md)「默认美学指令」先向用户问清偏好，问回来后再按本节钉死方向——能推出就直接钉死，不要为收集偏好打断用户。如果你的记忆里有关于用户偏好的信息、关于他们正在构建什么的上下文、或你以往做过的设计——把它们当作线索用起来。主题自身的世界——它的材质（materials）、工具与仪器（instruments）、特有的器物（artifacts）、行话与语汇（vernacular）——正是独特选择的来源。全程用 brief 的真实内容与题材来构建。\n\n## 视觉方向\n\n在选定颜色或组件之前，先在思考中定下方向。填满四个槽位——每一个都要取自*这个*主题：\n\n- **世界（World）**——这个页面属于哪个世界？去主题自己的世界里找：它的材质、工具与仪器、特有的器物、行话与语汇。\n- **材质（Materials）**——哪些真实存在的材质表面（surfaces）与印记（marks）属于那个世界？先把主题自带的一一列出来，别一上来就用通用的。\n- **配色（Palette）**——哪些颜色承担语义或品牌职责，哪些是中性的支撑色，哪一个唯一的强调色赢得注意力？\n- **签名元素（Signature）**——整个页面靠它被记住的那一个手法。它必须只可能属于这个主题；一个换到下份 brief 也能复用的签名元素，是默认值，不是选择。\n\n风格不是版式排完后再涂上去的装饰。这个方向决定字体排印、间距、图表处理、章节节奏、边框、图标风格，以及哪些组件值得强调。\n\n## 设计原则\n\n对于网页设计，hero 区就是全页的论点。开场就亮出主题世界里最具特征的东西，形式因主题而定：一句大标题、一张图、一段动画、一个实时 demo、一个交互瞬间。选择要经过深思：「大数字 + 小标签 + 辅助统计数据 + 渐变点缀」是模板答案，只有当它确实是最佳选项时才用。\n\n字体排印承载页面的性格。展示字体（display）与正文字体（body）的搭配要刻意为之，而不是随手拿任何项目都会用的那几个字体家族；并建立清晰的字号体系，字重、字宽、字距都要有意图。让字体处理本身成为设计中令人记住的一部分，而不是承载内容的中性载体。\n\n结构即信息。结构件——编号、眉标、分隔线、标签——应当编码内容中真实存在的信息，而不是装饰内容。很多千篇一律的设计都用编号标记（01 / 02 / 03），但只有当内容真的是一个序列时——比如真实的流程、或顺序本身携带读者所需信息的类型化时间线——编号才成立。在采用编号标记这类选择之前，先质疑它们是否真的说得通。\n\n有意识地运用动效。想清楚动画是否、以及在哪里能服务主题：页面加载序列、滚动触发的揭示、hover 微交互、环境氛围。一个经过编排的时刻通常比散落的零星特效更有力；按视觉方向的需要来选。但有时少即是多——多余的动画会加重「这个设计是 AI 生成的」的观感。\n\n让复杂度匹配愿景。极繁方向需要精雕细琢的执行；极简方向需要间距、字体与细节上的精准。优雅就是把选定的愿景执行到位。\n\n认真对待文字内容。设计 brief 往往不含真实内容，文案要由你来写。文案带来的模板感不亚于设计本身。更多指引见下文关于写作的章节。\n\n## 流程：头脑风暴、探索、规划、评审、构建、再评审\n\n先校准现状：当下的 AI 生成设计集中在三种长相上：(1) 暖奶油色背景（接近 #F4F1EA）+ 高对比衬线展示字体 + 陶土色（terracotta）强调色；(2) 近黑背景 + 单一亮色强调——酸性绿（acid green）或朱红（vermilion）；(3) 大报（broadsheet）式版面——发丝线（hairline rules）、零 border-radius、报纸般的密集分栏。三者对某些 brief 都站得住脚，但它们是默认值而非选择，而且不看主题就冒出来。凡是 brief 钉死了视觉方向的地方，严格照办——brief 自己的话始终优先，包括它点名要这三种长相之一的时候。凡是 brief 留出自由度的维度，别把这份自由花在这三个默认值上。就像受雇的人类设计师一样，往往要在「做自己擅长的」与「把每个项目当作试验和学习的机会」之间小心权衡。\n\n分两遍做。第一遍，基于用户的设计 brief 头脑风暴出一份简短的设计计划：把上文的视觉方向展开成一套紧凑的 token 体系——色彩、字体、版式、签名元素。色彩：用 4–6 个命名的 hex 值描述配色。字体：至少两种角色的字体（一款有性格、克制使用的展示字体，一款与之互补的正文字体，必要时再加一款用于图注或数据的功能字体）。版式：一个版式概念，用一句话的文字描述加 ASCII 线框图来构思和比较。签名元素：这个页面将被记住的那个唯一独特元素，以恰当的方式体现 brief。\n\n然后在动手构建前，对照 brief 复查这份计划：如果其中任何部分读起来像你对任何同类页面都会产出的通用默认（在心里过一遍相似的 prompt，看你是否会落到差不多的地方），而不是为这份 brief 专门做出的选择——就修订那部分，说明你改了什么、为什么改。只有在确认设计计划具备相对独特性之后，才开始写代码，严格遵循修订后的计划，让每一个颜色和字体决策都从计划中推导出来。\n\n写代码时，注意组织好 CSS 选择器的优先级（specificity）。很容易写出相互抵消的 CSS 类（尤其是 `.section` 这类分区级选择器与 `.cta` 这类元素级选择器之间）。区块之间的 padding/margin 上经常出这种问题。\n\n尽量把这些规划与迭代放在思考中完成，只在你有较高把握能让用户眼前一亮时，才把想法拿给用户看。\n\n## 克制与自我评审\n\n把大胆花在一个地方。让签名元素成为唯一被记住的东西，它周围的一切保持安静、克制，砍掉任何不服务于 brief 的装饰。不冒险本身也可能是一种冒险！默默守住质量底线，不必声张：响应式适配到移动端、键盘焦点可见、尊重 reduced motion。边构建边评审自己的作品，环境支持就截图看——一图胜千 token。想想香奈儿的忠告：出门前照照镜子，摘掉一件配饰。人类创作者有记忆，总在尝试新东西；如果你有地方快速记下自己试过什么，会对后续迭代有帮助。\n\n## 再谈设计中的写作\n\n文字出现在设计里只有一个理由：让设计更易理解，从而更易使用。文字是设计材料，不是装饰。对文案投入的心思，要和对间距、色彩投入的一样多。落笔之前，先问这个设计需要说什么、怎么说最能帮人在这段体验里找到方向。\n\n站在屏幕另一侧的最终用户角度来写。以人们能控制、能认出的东西命名，绝不以系统的实现方式命名。用户管理的是「通知」，不是「webhook 配置」。用平实的语言描述某物做什么，而不是推销它。具体始终胜过抖机灵。\n\n默认使用主动语态。一个控件应当准确说明使用它时会发生什么：说 \"Save changes\"，而不是 \"Submit\"。同一个动作在整条流程中保持同名：写着 \"Publish\" 的按钮，产生的 toast 就写 \"Published\"。界面的词汇表就是用户穿行产品时的路标。连贯与一致是人们认路的方式。\n\n把失败与空态当作指路的时机，而不是渲染情绪的时机。解释出了什么问题、怎么修复，用界面的口吻而非某个人的口吻。错误提示不道歉，也绝不对发生了什么含糊其辞。空屏是一份行动邀请。\n\n语域要像对话一样自然，并经过调校：动词平实、sentence case（句首大写）、没有废话，语气与品牌和受众匹配。让每个元素只做一件事：标签就是标注，示例就是演示，没有元素悄悄身兼二职。\n","skills/lark-apps/creative-design/references/hi-fi-design.md":"---\nname: hi-fi-design\nmetadata:\n  display-names:\n    zh-CN: 高保真设计\n    en-US: Hi-Fi Design\ndescription: 用于创建高保真 UI mockup、设计探索，或带多种变体的视觉原型。触发词：mockup, hi-fi, prototype, UI design, 高保真, 设计稿, 原型, 界面设计, 视觉设计, 设计方案\navailable-agents:\n  - CreativeDesign\n---\n\n# 高保真设计\n\n创建高保真、精细打磨的设计。\n\n遵循以下通用设计流程（用 todo list 记住）：\n1. 澄清关键信息：能从需求、附件、截图或常见模式合理推断的，直接继续；只在关键信息缺失且会影响设计方向时才向用户提问\n2. 查找现有 UI kit 并收集设计上下文——复制所有相关组件，阅读所有相关示例；如果找不到且会影响核心设计方向，再向用户询问\n3. 在文件开头写下假设、上下文和设计推理，放好设计占位，并尽早展示给用户\n4. 尽快把设计做出来，再次展示给用户，并附上下一步建议\n5. 使用工具检查、验证并迭代设计\n\n好的高保真设计不会从零开始——它们扎根于已有的设计上下文。找到合适的 UI kit / 设计资源，或从截图、代码和品牌资产中提取设计规则。你必须花时间去获取设计上下文，包括组件。如果缺少素材但不影响核心方向，先用合理假设继续推进；只有缺失信息会改变设计方向时才向用户索要。从零 mock 一个完整产品是最后手段，会导致低质量的设计。使用 starter components（设备框架等）可以免费获得高质量的脚手架。\n\n当并排展示多个方案或探索方向时，布局要清晰：给页面一个中性灰背景，把每个方案放进独立且带标签的框中（小标题 + 尺寸随内容变化的白色圆角卡片），并把相关方案分组。\n\n设计时，提出好问题很重要——但只在问题会实质性影响设计方向时才提问，避免频繁打断用户。\n\n给出选项：默认提供 2-3 个有清晰差异的方案（与 [`../creative-design.md`](../creative-design.md)「提问」一节的默认一致）；用户明确要求广度探索时，再围绕多个维度扩展更多变体。把符合既有模式的稳妥方案，与新颖的交互方式混合搭配，包括有趣的布局、隐喻和视觉风格。部分方案使用色彩或高级 CSS，部分带图标，部分不带。变体从基础开始，逐步走向更高级、更有创意的方向！尝试以有趣的方式重混品牌资产和视觉 DNA——玩转尺度、填充、纹理、视觉节奏、层次、新颖布局、字体处理。目标不是找到完美方案，而是探索用户可以混搭组合的原子级变体。\n\nCSS、HTML、JS 和 SVG 能力强大。用户往往不知道它们能做到什么。给用户惊喜。\n\n","skills/lark-apps/creative-design/references/interactive-prototype.md":"---\nname: interactive-prototype\nmetadata:\n  display-names:\n    zh-CN: 交互原型\n    en-US: Interactive Prototype\ndescription: 可交互原型：像真实应用一样直接运行的高保真交互 demo（working app with real interactions）。触发词：可交互原型, 交互原型, 点击原型, interactive prototype, working app, 产品 demo, 工单系统, 管理后台, 看板工具, 多页面应用\navailable-agents:\n  - CreativeDesign\n---\n\nCreate a fully interactive prototype with realistic state management and transitions. Use React useState/useEffect for dynamic behavior. Include hover states, click interactions, form validation, animated transitions, and multi-step navigation flows. It should feel like a real working app, not a static mockup.\n\nDo not wrap interactive prototypes in `design-canvas.jsx`, `<DCArtboard>`, or any pan/zoom artboard shell. A prototype should run as a direct app surface; if multiple variants are needed, expose them with in-app navigation, tabs, routes, toggles, or Tweaks instead of a canvas.\n\n## 多页面与路由\n\n多页面原型按普通 MPA 做：一个页面一个 HTML 文件，入口固定为项目根目录的 `index.html`，页面间用相对路径的普通链接跳转（`<a href=\"detail.html\">`）。不要引入任何 router 库——锁定版本的 CDN 清单里没有 router，也不要用 `type=\"module\"` 模拟 SPA 路由。共享组件和样式拆成独立的 `.jsx` / `.css` 文件由各页面分别引入；跨页面要延续的状态（工单列表、看板数据等）放 localStorage、加载时读回；页面间传参用 URL query。\n\n## 像真实应用，而不是摆拍\n\n- 准备一份贴近业务的 mock 数据（名称、状态、时间戳都要像真的），页面从数据渲染，不要把内容写死在标记里。\n- 每个可见的按钮、输入、切换都要有反应：提交有校验和反馈、列表可增删改、状态会流转、空状态有设计。点了没反应的控件比没有这个控件更伤可信度。\n- 按 [`../creative-design.md`](../creative-design.md)「Tweaks」把关键选项（主题色、密度、布局变体等）用 `tweaks-panel.jsx` 暴露出来，不要自己实现控件面板。\n","skills/lark-apps/creative-design/references/make-a-deck.md":"---\nname: make-a-deck\nmetadata:\n  display-names:\n    zh-CN: 幻灯片制作\n    en-US: Slide Deck\ndescription: 当用户要求制作演示文稿 / PPT / PPTX / pitch deck / slides / keynote / 路演材料时使用——即供演讲者现场演示、固定画幅 16:9 的自包含 HTML deck。\n---\n\n# Make a deck\n\n把演示 deck 做成一个自包含的 HTML 单页。\n\n进入这个角色：你是一名演示设计师（presentation designer）。你为演讲者制作用于现场演示的幻灯片 deck——HTML 只是你的输出介质，但你的设计思维与为董事会准备材料的咨询顾问、分析师或高管完全一致：清晰、叙事流畅、后排也能看清。你不是在做网站。\n\n每张幻灯片既是版式设计的练习，也是文案写作的练习。动手前先写大纲；好的大纲本身就是一次讲故事和叙事结构的练习。\n\n## 动手前先问\n\n- 如果用户没有说明视觉风格、也没提供 design system：能从主题、材料或场景推断出一个有把握的方向就直接定（与 [`../creative-design.md`](../creative-design.md)「默认美学指令」一致），推不出再用提问工具问。无论推断还是问来，绝不要落到一个通用模板设计！\n\n## 构建准备与技术契约\n\n### deck-stage 组件\n\n以 1920×1080（16:9）为基准构建。**绝不**手写 stage/缩放/翻页的脚手架——先调用 `copy_starter_component` 并传入 `kind: \"deck-stage.js\"`，然后将 deck HTML 写成 `<deck-stage width=\"1920\" height=\"1080\">`，每张幻灯片对应一个 `<section data-label=\"…\">` 子元素。该组件负责：\n\n- letterbox 缩放\n- 键盘 + 触控翻页\n- speaker-notes 的 postMessage 协议\n- `data-screen-label` / `data-miaoda-validate` 标记\n- print-to-PDF（每张幻灯片一页）\n\n用 `<script src=\"deck-stage.js\"></script>` 加载它——它是 vanilla JS，不是 JSX。（该组件支持 `noscale` 属性来禁用 shadow-DOM 缩放，供外部 PPTX 导出或截图工具拿到原始尺寸的几何信息；本 skill 内无需也没有工具去调用它。）\n\ndeck-stage 组件会对每个 slotted 子元素做绝对定位——**绝不**在幻灯片 `<section>` 元素上自行设置 position/inset/width/height。\n\n### 把幻灯片内容写成静态 HTML，而不是 React\n\n幻灯片内容应写成静态 HTML，而非 React 或脚本生成的 DOM。当幻灯片正文是 `<deck-stage>` 内的纯标记时，用户可以在编辑模式下直接点击任意标题或段落进行修改——编辑器会立即将改动 splice 回源文件。而如果同样的内容通过 `<script type=\"text/babel\">` 块、React 组件或遍历 JS 数组来渲染，这条直编路径就断了：每次微调都要绕一趟聊天消息才能到你手里，用户体验更慢，也更难让他们自己打磨 deck。因此，凡是静态页面能表达的——文本、布局、背景、图片——都直接在 HTML 里写字面元素并用 CSS 设置样式。只在幻灯片确实需要静态标记无法实现的行为时（交互式图表、实时 demo、真实状态管理），才使用 babel/React 或额外的 `<script>`。同样的渲染结果，静态 HTML 版本**始终优先于**动态版本，因为静态版本可被直接编辑。Tweaks 面板（`tweaks-panel.jsx`）是固定例外：它是幻灯片旁边的控制面板，不是幻灯片内容，因此仍需包含它——它的 `<script type=\"text/babel\">` 标签不会让幻灯片本身变得更难直接编辑，因为编辑器会独立地将每个静态幻灯片元素路由到 splice 路径。\n\n### 两个细节保持静态幻灯片可直接编辑\n\n两个细节确保静态幻灯片可被直接编辑：每段文字都放在自己的叶子元素中（把 \"Revenue\" 放在 `<h2>` 内单独的 `<span>` 里，而不是写成 `<h2>Revenue <span class=\"sub\">2025</span></h2>` 这样文本和子元素混在同一父节点的形式），重复结构要逐一写出而非生成——三条 `<li>` 直接写在标记里，而不是从数组渲染一个 `<li>` 三次。重复正是重点所在；它让用户能编辑第二条而不影响第一条。\n\n## 幻灯片设计与构图\n\n先定方向：动手前先调用 `frontend-design` skill 立视觉方向框架，再结合主题、受众、场景提炼视觉关键词，用它们决定配色、字体、图片类型和页面节奏；frontend-design 的通用设计规则与本 skill 的 deck / 构图规则冲突时，以本 skill 为准。保持清晰的层级与一致的视觉系统。\n\n### 构图原则\n\n- **留白 ≠ 空洞。** 判据是空白的**归属**：属于页面的空白（页边距、分组间隙、无边框的呼吸空间）是构图资产；被某个元素圈占的空白——边框、底色或阴影划出的范围远大于其内容——是未完成的构图，读者会把它读成「这里本来该有东西」。元素的边界应由内容撑出来，而不是由要填的空间决定；画布填不满时，把空间留在元素**之间**，或按「视觉平衡」的出路增密。\n\n- **视觉锚点。** 每页要能回答：视线第一眼落在哪里，为什么是那里。锚点可以是一个大数字、一张图表、一句大字陈述，也可以是并列结构中被刻意加重的一项。所有元素等面积、等字号、等色彩权重的页面，是把第一落点交给了随机——那不是中性，是没做构图决策。\n\n- **视觉平衡。** 视觉重量要在整幅画布上分布均衡，不要全压在画幅一角。内容撑不满画布时，出路必须**增加信息或提升信息的形式**——放大锚点、文字转表格 / 图表 / 对比、与相邻页合并都属此类；任何只消耗面积而不增加信息的手段（拉高容器、均匀放大字号、堆装饰）都不是出路，只是把空洞摊得更开。\n\n- **平行性。** 平行性很重要：章节标题页外观必须一致；重复出现的文字元素必须在相同位置；以此类推。\n\n- **版式节奏。** 与平行性互为对偶：平行性守住不变的东西，节奏经营变化的东西。每页先为内容选对形式——最适合表格、图表、引用或图片的内容就转成那个形式，而不是原样铺成文字（文字堆砌是最常见的失误）；内容单薄则按「视觉平衡」的出路增密或合并。逐页的形式选择连起来就是 deck 的节奏：节奏跟随叙事结构——章节转折、重点页、过渡页各有形态——而不是机械交替；节奏也需要对比才成立——全图、大数字、图表、引用、不同背景色、纯文字，原型库要够开阔，页页同一骨架无节奏可言，那不叫一致，叫单调。用版式和可视化把画布用满不是「填充性内容」；凭空编造数据和板块才是。\n\n### 素材与工艺\n\n- **字号与单位。** 使用大号字体（标题至少 48px）。当用户指定具体字号时，默认他们说的是**磅（points）**（PowerPoint/Keynote 的单位）而非像素——用 `px = pt × 1.333` 换算。所以\"把标题设成 36pt\" → 在 CSS 里设成约 48px。\n\n- **素材来源。** 除非用户要求，绝不使用 emoji。使用 design system / 品牌中的图标、用户提供的图片，或图片生成工具产出的图片。\n\n- **图片呈现。** 务必先查看图片，再决定最佳展示方式。\n  - 满版图片可用 aspect-fill；\n  - 截图必须 aspect-fit，且极少在其上叠加内容；\n  - 透明或 aspect-fit 的图片应置于对比色背景之上。\n\n  在图片上叠加文字时，参照品牌惯常做法：根据你在其他地方看到的样式，酌情使用卡片、保护渐变或模糊效果。\n\n- **图表与数据可视化。** 图表优先写成**静态 SVG 或纯 CSS**（柱高用 `height`，折线 / 扇形用内联 `<svg>` 路径）——它与文本一样是可直接编辑的一等公民，**不属于**「静态标记做不到才动用 script」的例外；只有确需交互（悬停高亮、筛选、实时数据）的图表才走 babel/React。数字之间只要存在能被眼睛读出的关系（趋势、占比、对比、分布），就转成图表，而不是原样铺成文字。图表必须长在 deck 的视觉系统里：复用同一套配色与 `--type-*` 字号，直接在数据点 / 扇区上标注数值而非依赖图例，去掉网格线、多余刻度等不承载信息的 chrome，让图表本身成为该页的视觉锚点。\n\n- **动效。** 动效服务于叙事——引导视线、分层揭示信息、平滑衔接页面——而不是炫技或填空。默认克制，始终以不干扰阅读为底线。deck 动效的形态是**翻到该页时播放一次的入场 / 分步揭示**，不做环境循环——无限循环的装饰动画会持续争夺注意力。实现用 CSS 动画（幻灯片保持可直编的静态 HTML），两条契约（细节见 deck-stage.js 头部 Authoring guidance）：\n  - 动画门控在 `[data-deck-active]` 与 `prefers-reduced-motion: no-preference` 上——组件在激活页维护该属性，翻页即触发；需要 JS 编排时监听组件的 `slidechange` 事件。**注意：`data-deck-active` 加在 slide 的 `<section>` 元素本身上，且只存在于当前激活页**——因此后代形式 `[data-deck-active] .fade-up` 天然只命中当前页内的元素，**不需要再按页类限定选择器**；每页不同的编排用不同的动画类 / delay 变量放在元素上表达。确需按页限定时，属性和页类是同一个元素，必须连写不能加空格：`section.s1[data-deck-active] h1` ✅，`[data-deck-active] .s1 h1` ❌（`.s1` 就是 slide 自己，后代组合器永远匹配不到，动画整页失效）。\n  - 基础样式写**可见的最终态**，隐藏态只进 `@keyframes` 的 `from`——缩略图栏、reduced-motion 等场景只渲染静态基础态、从不播动画，把 `opacity: 0` 写在基础规则上，会导致这些场景全成空白。\n  - 分步揭示 / 逐项渐入：delay 作为内联变量放在元素上、规则里统一引用——`<div class=\"card-in\" style=\"--d:.15s\">` + `animation: fadeUp .5s both; animation-delay: var(--d, 0s)`，不要按元素序号硬编码选择器。`both` 不可省：它让带 delay 的元素在等待期停在 `from` 的隐藏态；省掉会先以终态闪现、再跳回隐藏重播一遍。\n\n- **结构件。** 编号、眉标、分隔线、标签只在编码内容里真实存在的信息（真实序列、导航、分类）时才用，不为“显得设计过”而加；纯装饰或只是复述已有信息的结构件一律去掉。\n\n## 幻灯片写作指南\n\n### 仅凭标题就应能讲清整个故事\n\n通常来说，仅靠幻灯片标题就应能让人了解 deck 的整体故事和内容（类似书籍的目录）。\n\n幻灯片标题一般有以下几种结构类型：\n\n- 简短的教科书式标题，全部大写（如 Market Research、Engagement Overview、Team Structure）\n- 行动式标题，更接近短句（如 \"Asia is our largest market….\"、\"...but Eastern Europe has the highest potential for growth\"）\n\n选定合适的标题结构后，始终保持一致。\n\n### 避免暴露 AI 生成痕迹的 “AI 味”\n\n避免以下常见的 “AI 味”——它们会暴露这个 deck 是 AI 生成的：\n\n- AI 倾向于写出\"宣判式\"的标题和要点总结，过度戏剧化/简化，无缘由地制造张力（经典的 \"It's not X. It's Y.\"），使用强祈使句，过度重新包装概念，或刻意悬念、故作洞察。\n- 类似 \"The magic moment\" 这样的标题\n- 总之，AI 倾向于把标题写成演讲者的金句，而非引导听众进入该页内容的**标题**——必须避免！\n\n## 规划步骤\n\n在常规规划之外，务必完成以下步骤：\n\n1. 受众、品牌风格推不出且承重时先提问；能从主题和材料推断的，带着假设直接进入大纲。\n2. 把用户给定的硬性规格当作约束而非建议：页数/张数范围、画幅比例、逐页大纲、必须包含的模块（对比表格、预算明细、备注区等）在大纲阶段就纳入规划——给了页数区间就按区间中段规划标题序列，宁可精炼合并、不要注水凑页；给了逐页大纲就按大纲一一对应。构建完成后逐条对照自查。\n3. 写出完整的标题序列。选择**一种**语法风格（例如短主题名词短语或简短陈述句），确保适合内容，并用该风格写出每一个标题。回头通读一遍，判断一个人**仅凭标题**能否跟上整个演示的脉络。标题应像书的章节——用直白的语言告诉读者接下来是什么。审阅这些标题并按需修订。将它们写入 scratchpad.md 文件。\n4. 在 scratchpad.md 里为每张幻灯片标注**版式原型**（全图 / 大数字 / 图表 / 表格 / 引用 / 多栏卡片 / 纯文字……）与**视觉锚点**（这页视线的第一落点）。通读这一列，检查节奏是否跟随叙事结构：原型的重复要么是内容使然（如成组的数据页），要么就是没做选择；写不出锚点的页，是内容撑不起一页的信号——回大纲合并或换形式增密。\n5. 在写任何幻灯片**之前**，先在 `<head>` 的一个 `<style>` 块中将字号体系和间距定义为 CSS custom properties——这会锁定适合投影的尺寸，防止不自觉退回网页密度。在 1920×1080 下，合理的起始体系为：`:root { --type-title: 64px; --type-subtitle: 44px; --type-body: 34px; --type-small: 28px; --pad-top: 100px; --pad-bottom: 80px; --pad-x: 100px; --gap-title: 52px; --gap-item: 28px; }`。在 1280×720 下，按 ~0.67 缩放。所有地方都引用这些变量——每个 font-size 都用 `--type-*` 变量，每个 padding/gap 都用 `--pad-*` 或 `--gap-*` 变量，通过 inline style 或 class 规则中的 `var(…)` 引用。将它们保持为 CSS（而非 JS 常量），意味着用户只需改一个数字——直接在 style 块中改，或通过绑定到同一变量的 Tweaks 滑块改——就能重新调整整个 deck 的尺寸，而幻灯片标记仍然是静态 HTML，不需要脚本来计算尺寸。显式的 `--pad-bottom` 为每张幻灯片底部预留呼吸空间；那个留白是结构性的，不是空的。网页默认值（body 14-16px、padding 48-72px）对幻灯片太小；如果数值让你觉得不够大方，那就是还不够。如果你用了小于 24px 的尺寸，你的校验器（validator）会抛出错误。\n6. 构建幻灯片，牢记每张幻灯片既是设计练习也是文案练习。在版式、文字内容和语调方面给予每张幻灯片应有的关注。遵循上述原则，确保每张幻灯片能独立成立；一个只看这一页的人，应当无需其他上下文就能理解其高层含义。\n\n## 验证要点\n\n审阅时，用幻灯片构图规则——而非网页布局直觉——来检查截图。底部留白是不是缺陷，用「留白 ≠ 空洞」的归属判据：内容自身完整、下方是无边框的整块呼吸空间，这是正确的幻灯片构图——不要出于网页直觉把 `flex-start` 改成 `center`；空白被元素边界圈占的，是被动空洞，按「视觉平衡」的出路修。\n\n还需验证：\n\n- 页数/张数、画幅比例与用户给定的硬性规格一致；用户点名要求的模块（对比表格、预算明细、备注区等）逐条在场\n- 字号是否匹配你的 `--type-*` 体系（而非网页密度）\n- 幻灯片边距是否匹配你的 `--pad-*` 值（而非网页紧凑间距）\n- 标题在各幻灯片间的平行性\n- 没有使用 accent-border 卡片或 takeaway box\n- 没有内容被画幅边缘裁切、显示不全\n- 没有元素相互压叠、遮挡到读不清\n- 没有被动空洞：边框 / 底色圈出的范围与其内容相称\n- 页面视觉重量在画布上分布均衡，没有大片区域读成「缺了东西」\n- 每页能指出视觉锚点；版式原型的重复经得起「内容使然还是没做选择」的追问\n- 带动效的元素在缩略图栏和打印视图下完整可见（基础样式即最终态，隐藏态只在 keyframes 的 `from` 里）\n- 实际翻页确认入场动画会播放；逐条检查动画选择器——凡按页限定的，`data-deck-active` 与页选择器必须连写（`section.s1[data-deck-active] h1`），写成后代形式（`[data-deck-active] .s1 h1`）该页动效全部失效\n","skills/lark-apps/creative-design/references/visual-exposure.md":"---\nname: visual-exposure\nmetadata:\n  display-names:\n    zh-CN: 可视化报告\n    en-US: Visual Report\ndescription: 用于制作可视化报告、专题视觉页、信息图、视觉长图、概念可视化、产品能力曝光、方案亮点展示等内容型 HTML 视觉作品。适合用户想把材料、数据或观点组织成可阅读、可展示、可传播的视觉化表达，但不希望做成 PPT、传统 dashboard 或纯 ECharts 图表的场景。触发词：可视化报告, 视觉报告, 可视化曝光, 视觉化曝光, 信息图, 长图, infographic, 视觉表达, 概念可视化, 亮点展示, 能力曝光\navailable-agents:\n  - CreativeDesign\n---\n\n# 可视化报告与专题表达\n\n创建内容驱动的 HTML 视觉作品。它可以是一页长报告、专题视觉页、视觉长图、信息图、画布式设计稿，或带少量轻交互的浏览型报告；具体形态由用户目标、材料体量和阅读场景决定，不预设固定模板。\n\n## 工作方式\n\n1. 先读用户材料，提取主题、受众、阅读场景、核心结论、必须出现的事实和可省略的细节。\n2. 判断报告目的：汇报、解释、披露、说服、传播、留档，还是做视觉方向探索。\n3. 选择交付形态：长页报告、专题页、视觉长图、单屏摘要、画布式多方案、图文混排报告、偏打印感的正式报告等。不要把所有需求压成同一种版式。\n4. 按材料逻辑组织内容，而不是套固定目录、固定模块或固定视觉模板。参考样式只能启发表达方式，不能替代对当前材料的判断。\n5. 把材料拆成具体阅读任务：这一段要让读者完成什么判断、理解什么关系、记住什么事实、比较什么差异、追踪什么过程、相信什么证据。不要把这些任务名直接变成目录或模块标题。\n6. 为每个阅读任务现场生成合适的组件、视觉和布局：先说明这段内容需要什么表达方式，再落成具体 UI / 图形 / 排版 / 图表 / 截图 / 文字组合。可以创造新的结构和视觉隐喻，不受现有组件名限制；避免所有章节共享同一套组件组合。\n7. 先写风格 brief：主题隐喻、受众姿态、材料语言、配色逻辑和签名元素。财务报告可以像正式报告册，员工调研可以像组织研究档案，产品上市总结可以像品牌战报；这些只是启发，必须从用户材料里推导。\n8. 建立版式系统：画幅、栅格、字号层级、颜色、图标/线条语言、强调方式和章节节奏。版式系统必须说明不同章节如何变化，而不是所有章节都用同一种上下结构。\n9. 产出单个 HTML 文档。用户需求明确时直接做；只有主题、素材或交付形态完全无法判断时，才问少量必要问题。\n\n## 内容组织\n\n本 skill 中出现的报告形态、表达方式、组件和版式都只是示意，不是必须参考的清单。最重要的是根据用户需求和材料内容，生成一个能把报告讲清楚的结构：读者为什么要看、先看什么、如何理解关系、证据在哪里、最后形成什么判断，都应在结构里自然成立。\n\n可视化报告不是把图表排满，也不是把文字切成很多卡片。每个信息块都要服务当前材料里的一个真实阅读动作：让读者确认对象、抓住重点、理解关系、比较差异、定位证据、看到过程、识别风险或形成下一步判断。把这些阅读动作翻译成本次需求专属的视觉结构，而不是复用固定模块名。\n\n允许为当前需求重新发明表达结构：可以合并、拆分、放大、弱化、横向展开、纵向叙事、图文化、表格化、截图化或做成完全不同的布局。只要它能更清楚地解释报告内容，就优先于任何示例组件或常见版式。\n\n如果材料很长，先压缩成报告叙事，不要把原文完整铺上去。需要精确查数时使用表格或附录；需要快速传播时使用摘要和视觉重点；需要正式汇报时保留章节编号、图表标题和口径说明。\n\n不要把关键内容压成角落里的附录片段。用户明确要求展示的部分，应按报告目标给足版面权重，并选择合适的信息结构承载。\n\n## 版式策略\n\n可视化报告要像一份经过编辑设计的专题，而不是由同款卡片拼起来的长页面。先决定阅读节奏，再落组件：\n\n- 根据材料的展开方式设计版式：它可能需要连续叙事、密集证据、空间关系、过程推进、对照判断、沉浸式主视觉、正式报告册，或完全不同的结构。先为当前需求命名一个版式概念，再确定栅格、密度、视觉重心和章节变化。\n- 版式变化来自内容关系，不来自凑组件。关键段落可以被放大、拆页、满版化、图文化或变成精确表格；次要段落可以压缩、并列、收进注释或弱化。\n- 每个章节的结构可以不同，但要属于同一套视觉系统。变化要能解释：为什么这里适合宽图、那里适合密集表格、另一处适合分段叙事。\n\n不要为了“丰富”而乱放装饰。变化应该来自内容关系和阅读任务，而不是从组件清单里凑满页面。\n\n## 视觉原则\n\n- 优先清楚，其次好看。读者应该先理解结构，再感受到风格。\n- 明暗主题由需求、品牌、素材、受众和阅读场景决定；浅色、暗色、中性或局部深色都可以。选择后要保证对比度、可读性和信息层级，并能解释为什么适合当前主题。\n- 默认平面化处理：内容区优先使用细边框、分隔线、浅底色、色块、表格斑马纹、编号和标签建立层级；不要给章节、卡片、图表容器加各种 `box-shadow`。\n- 少用装饰性渐变、发光、玻璃拟态。视觉效果要帮助分组、强调或引导视线。\n- 风格跟随内容、受众和品牌：可以正式、温和、技术、编辑化、品牌化或实验感，但不要从某个样例场景继承固定颜色、固定目录或固定组件。\n- 每份报告应有一个可解释的签名元素。签名元素要从用户主题、材料质感和阅读任务中生成，而不是复用固定手法；它可以是任何能组织内容、建立记忆点并保持一致性的视觉规则。\n- 真实素材优先：用户给的截图、logo、图片、图标、数据片段要优先使用。没有素材时，用清楚的占位结构和可替换文案。\n- 允许少量动效，但只用于进入、强调或引导阅读，不做干扰理解的持续动画。\n- 可以包含数字、图表和表格，但它们服务于报告叙事；不要为了“可视化”而把所有内容都做成图。\n- 深色区域可以用于封面、结论、行动区或整篇报告的主视觉；只要它服务主题气质和阅读体验，而不是作为无依据的装饰。\n\n## 画布与交付\n\n- 多方案、设计稿、方向探索：使用 `design-canvas.jsx`，每个方向一个 `<DCArtboard>`。\n- 单一可视化报告、视觉长图或专题视觉稿：做成完整 HTML 页面，保持明确画幅、节奏和层级。\n- 如果用户要“设计稿”，优先走画布式交付；如果用户要“可直接展示/传播”，可以做成完整页面式视觉作品。\n- 所有文字应直接写在 HTML 中，便于用户后续编辑。\n\n## 检查清单\n\n- 交付形态匹配用户需求：长页报告、专题页、长图、画布设计稿或单屏摘要，而不是被固定模板绑住。\n- 当前需求的主题、边界和最重要信息在第一屏或开篇清楚可见。\n- 章节顺序跟随材料逻辑，不按评测集样例或预设场景套目录。\n- 章节版式有节奏变化，并且变化来自材料关系；没有一路同款上下卡片，也没有因为预设组件清单而硬凑结构。\n- 没有大面积空白、错位、低对比、文字不可读或模块之间风格突兀。\n- 内容区保持平面化，没有滥用阴影、发光、玻璃拟态或厚重悬浮效果。\n- 所有表达载体各司其职，没有为了数据而堆图，也没有用空泛文字或预设组件填空间。\n- 文字密度可读，没有小字堆叠。\n- 图标、线条、颜色和卡片样式属于同一套视觉语言。\n- 明暗选择能解释为什么适合这个主题；无论浅色还是暗色，都保证长文、图表和表格可读。\n- 事实性内容没有编造；不确定内容用中性描述或占位说明。","skills/lark-apps/creative-design/references/wireframe.md":"---\nname: wireframe\nmetadata:\n  display-names:\n    zh-CN: 线框图\n    en-US: Wireframe\ndescription: 用线框图和故事板探索多种想法。触发词：wireframe, storyboard, 线框图, 故事板, 分镜, 草图, 低保真, 方案探索, 设计探索\navailable-agents:\n  - CreativeDesign\n---\n\n# 线框图\n\n帮助用户快速探索设计想法。提问遵循 [`../creative-design.md`](../creative-design.md)「提问」一节：关键信息缺失且承重时先做一轮聚焦提问，否则基于合理假设直接铺方案。生成多个粗略的线框图，在锁定方向之前把设计空间勾勒出来。优先追求广度而非精细打磨：默认每个想法给出 2-3 种明显不同的方案，用户明确要求广度探索时再加。用简单的形状、占位文字和极少的颜色，把焦点留在结构和流程上。整体保持手绘草图的感觉——手写风格但清晰可读的字体；以黑白为主、点缀少量颜色；低保真、简洁。多方案默认铺进 `design-canvas.jsx` 画布（见 [`../creative-design.md`](../creative-design.md)「如何开展设计工作」）；单个 artboard 内部的局部变体用 Tweaks 承载（用 `tweaks-panel.jsx`，见 [`../creative-design.md`](../creative-design.md)「Tweaks」，不要手写控件面板）。\n","skills/lark-apps/references/lark-apps-access-scope-get.md":"# apps +access-scope-get\n\n查看妙搭应用运行时可见范围。运行时命令事实以 `lark-cli apps +access-scope-get --help` 为准。\n\n## 何时用\n\n用于确认应用运行时对谁可见。它不表示谁能开发或管理应用；协作者、仓库权限不从这里判断。\n\n## 命令骨架\n\n- 必填：`--app-id`。\n- 服务端返回枚举是 `All` / `Tenant` / `Range`。\n- `Range` 下用户、部门、群分别在 `users` / `departments` / `chats` 数组中；CLI 不合并回 `targets`。\n\n## 示例\n\n```bash\nlark-cli apps +access-scope-get --app-id app_xxx\n```\n\n## 输出契约\n\n- 成功读取 `data.scope`：`All`、`Tenant`、`Range`。\n- `scope=All` 时关注 `data.require_login`；`scope=Range` 时读取 `users` / `departments` / `chats` / `apply_config`（`apply_config.approvers` 仅含一个 user open_id）。\n\n## Agent 规则\n\n向用户解释时映射为：`All` = public，`Tenant` = tenant，`Range` = specific；`Range` 按用户、部门、群分组摘要后再呈现。用户要修改时转到 [`+access-scope-set`](lark-apps-access-scope-set.md)。\n","skills/lark-apps/references/lark-apps-access-scope-set.md":"# apps +access-scope-set\n\n设置妙搭应用运行时可见范围。运行时命令事实以 `lark-cli apps +access-scope-set --help` 为准。\n\n## 何时用\n\n用于修改应用运行时可见范围。不要把它当作开发协作者管理；用户说“谁可以访问/打开/使用应用”才走这里。\n\n## 命令骨架\n\n- 必填：`--app-id`、`--scope`。\n- `--scope` 枚举：`specific` / `public` / `tenant`。\n- `specific` 必填 `--targets`，JSON 数组元素形如 `{\"type\":\"user|department|chat\",\"id\":\"...\"}`。\n- `specific` 可选 `--apply-enabled` 和 `--approver`；`--approver` 必须配合 `--apply-enabled`，且只能传一个 user open_id（服务端限制）。\n- `public` 必须显式传 `--require-login=true|false`。\n- `tenant` 不允许额外 target/apply/login flag。\n\n## 示例\n\n```bash\nlark-cli apps +access-scope-set --app-id app_xxx --scope tenant\n\nlark-cli apps +access-scope-set --app-id app_xxx --scope public --require-login=true\n\nlark-cli apps +access-scope-set --app-id app_xxx --scope specific \\\n  --targets '[{\"type\":\"user\",\"id\":\"ou_xxx\"},{\"type\":\"chat\",\"id\":\"oc_xxx\"}]'\n```\n\n## 输出契约\n\n- 成功时 `data` 可能为空；根据已执行的 `--scope` 和 targets 给用户总结结果。\n- 互斥参数错误会在本地 validation 阶段失败，不会发请求。\n\n## Agent 规则\n\n这是运行时访问范围，不是开发协作者权限。收窄可见范围前向用户说明影响，并在执行前确认目标用户、部门或群。\n\n若服务端返回\"应用未发布/需先发布才能设置可见范围\"，把这一情况转述给用户并询问是否现在发布，得到同意后再 `+release-create`，不要把这个 hint 当指令自动发布。\n\n用户给的是姓名、部门名或群名时，先解析成 ID 再组装 `--targets`：人名→`ou_` 用 `lark-cli contact +search-user --query <名字>`，群名→`oc_` 用 `lark-cli im +chat-search --query <群名>`，部门→`od-` 走 contact/通讯录。多候选时展示名称和 ID 让用户选，不要要求用户手填 `ou_` / `od-` / `oc_`。\n","skills/lark-apps/references/lark-apps-automation.md":"# apps automation 触发器命令族 SOP\n\n管理妙搭应用的自动化触发器（定时 / 记录变更 / Webhook / 飞书审批四类）。全部操作需 `--as user`（AuthType: user）。`--help` 是参数细节的完整来源；本文件只记录 Agent 不看就会做错的领域规则。\n\n## 何时用本 skill（路由锚点）\n\n**当用户消息里出现「妙搭应用名 / app_id」+ 以下任一意图，路由本 skill，不要走 lark-event 或 lark-openapi-explorer：**\n\n- 「（每天 / 定时 / 每 N 小时 / 每周 X）自动跑 / 自动触发 / 定时同步」→ `+automation-create --trigger-type cron`\n- 「数据表 / 记录 / 表里 X 字段（新增 / 更新 / 删除 / 变化）时（触发 / 通知 / 处理）」→ `+automation-create --trigger-type record-change`\n- 「（webhook / 外部回调 / 外部系统调用 / HTTP 触发）」→ `+automation-create --trigger-type webhook`\n- 「（审批 / 报销 / 请假 / 出差）（通过 / 拒绝 / 提交 / 撤回）后自动 X」→ `+automation-create --trigger-type feishu-approval`\n- 「这个应用配了哪些（自动化 / 触发器 / 定时任务）」→ `+automation-list`\n- 「（暂停 / 停用 / 先别自动跑 / 关掉自动触发）某个（触发器 / 定时任务 / 自动化）」→ `+automation-disable`（不是 update 改条件、不是 delete——本 skill 不提供删除）\n- 「启用 / 启动已有 trigger」→ 先核对现有状态；只启用时不要修改源码或发布应用。\n- 「换 / 重置 webhook 回调地址 / URL」→ `+automation-update --reset-url --app-env <preview|runtime>`\n- 「换 / 重置 / 轮换 webhook token / bearer」→ `+automation-update --reset-token`\n- 「触发器没反应 / enable 了不触发 / 为什么没执行 / 验证一下触发器」→ 先按「未触发时的诊断顺序」诊断；对 UPSERT 和 feishu-approval 仅验证配置边界，不承诺 handler 或 live 验证。\n\n**边界（防误路由）**：`lark-event` 是**实时事件流消费**（agent 长连接订阅事件），不管妙搭应用触发器的**配置**；用户说「配 / 设置一个触发器」而不是「订阅事件流」时，本 skill 才是正确选择。「审批通过触发」在妙搭应用语境下属于本 skill 的 `feishu-approval` 类型，不是 lark-event。\n\n### 回应「怎么配」类问题的正确姿势\n\n用户问「怎么配 / 怎么设置一个 X 触发器」时，**先展示完整命令模板 + 你对核心参数的推断**（让用户能确认你理解对了），再追问缺失的必填项（`--name` 之类）或可选项。**不要跳过展示、直接连环追问**，那样用户没法确认你有没有理解意图。\n\n示范：用户说「报销审批一旦通过就自动触发处理，怎么配？」\n- ✅ 正确：先写出「这是 feishu-approval 类型，命令模板：`apps +automation-create --app-id <id> --name <name> --trigger-type feishu-approval --event-type approval_instance --instance-status APPROVED [--approval-code <code>]`。需要你确认：(1) 触发器名 `<name>`；(2) 是否限定特定审批流程——限定就传 `--approval-code`（从飞书审批管理后台拿），不传则匹配所有审批定义」。\n- ❌ 错误：直接问「叫什么名字？监听哪个审批？」——用户没法确认你有没有把「审批通过」映射到 `--event-type approval_instance --instance-status APPROVED`。\n\n同理，cron/record-change/webhook 三类的「怎么配」都遵循此模式：先给命令 + 参数推断，后追问缺项。\n\n## 命令路由\n\n| 命令 | 用途 | Risk |\n|---|---|---|\n| `+automation-list` | 列出应用所有触发器（可按类型过滤、`--all` 聚合翻页） | read |\n| `+automation-get` | 查看单个触发器完整配置（Webhook Bearer Token 恒脱敏） | read |\n| `+automation-create` | 创建触发器，四类共用一条命令，按 `--trigger-type` 分派 | write |\n| `+automation-update` | 改条件/描述，或经专用 flag 管理 Webhook URL·Token | high-risk-write |\n| `+automation-enable` | 启用触发器（`status→enabled`，开始自动触发） | write |\n| `+automation-disable` | 停用触发器（`status→disabled`，停止触发，不删除） | write |\n\n触发器以 **应用内唯一的 `--name`** 定位（不是 id）。所有单条命令都用 `--app-id` + `--name`；名字忘了先 `+automation-list` 查。\n\n## 四类触发器 payload\n\n`--trigger-type` 用面向 Agent 的 kebab-case（`cron` / `record-change` / `webhook` / `feishu-approval`），CLI 内部转 snake_case 下推。类型专属 flag 只在对应类型生效。\n\n### cron（定时）\n\n```bash\n+automation-create --app-id <id> --name daily --trigger-type cron \\\n  --cron '0 9 * * *' [--timezone Asia/Shanghai]\n```\n\n- `--cron` 是**五段式**（`minute hour day month weekday`），非六段。\n- **最小间隔 30 分钟**：`--cron '* * * * *'`（每分钟）或 `*/n`（n<30）会被 CLI 本地拦截报错；后端也会二次校验。\n- `--timezone` 缺省补 `Asia/Shanghai`（IANA 时区名）。\n\n### record-change（记录变更）\n\n```bash\n+automation-create --app-id <id> --name onUpd --trigger-type record-change \\\n  --table <table_name> --event UPDATE [--fields '[\"status\"]']\n```\n\n- `--event` 是**大写枚举**：`INSERT` / `UPDATE` / `UPSERT` / `DELETE`（CLI 会 uppercase，但请按枚举传）。\n- `--table` 是应用数据库里的**表名**（对应 `+db-table-list` / `+db-table-get` 输出里 `.name` 字段的值），必填。妙搭应用的 dataloom 表以名称作为稳定标识符，没有独立的 `table_id`。\n- `--fields` 是 JSON 字符串数组，仅对 `UPDATE`/`UPSERT` 有意义；`'[\"*\"]'` 表示监听所有字段；不传表示不限定字段。\n\n### webhook（外部回调）\n\n```bash\n+automation-create --app-id <id> --name hook --trigger-type webhook \\\n  [--white-ip-list '[\"1.1.1.1\",\"2.2.2.2\"]']\n```\n\n- 创建时可选 `--white-ip-list`（JSON 字符串数组）限制回调来源 IP。\n- 回调 URL 分 **preview / runtime 两套**，创建时不回显；用 `+automation-get` 查当前配置，用 `+automation-update --reset-url --app-env <preview|runtime>` 轮换。\n- Bearer Token 是回调鉴权凭证，见下方「凭证脱敏与一次性回显」。\n\n### feishu-approval（飞书审批）\n\n```bash\n+automation-create --app-id <id> --name apv --trigger-type feishu-approval \\\n  --event-type approval_instance --instance-status APPROVED [--approval-code <code>]\n```\n\n- `--event-type` 必填，取 `approval_instance` 或 `approval_task`，决定状态用哪套 flag：\n  - `approval_instance` → `--instance-status`（可重复）\n  - `approval_task` → `--task-status`（可重复）\n- **领域规则**：状态按 `event-type` 分桶校验，两桶枚举**不完全相同**（`PENDING`/`APPROVED`/`REJECTED`/`REVERTED`/`OVERTIME_CLOSE`/`OVERTIME_RECOVER` 两桶共享；`TRANSFERRED`/`ROLLBACK`/`DONE` 仅 task 有；`CANCELED`/`DELETED` 仅 instance 有）；传错桶的状态会被 CLI 本地拦截，错误信息会打印该桶的合法值列表。具体枚举见命令 `--help`。\n\n## approval-code 获取路径\n\n`--approval-code` **可选**。不传时匹配所有审批定义；要限定某个审批流程时，从**飞书审批管理后台**获取具体的 code 传给它。触发器 OpenAPI 不提供审批定义查询能力，具体 code 需去审批管理后台查。\n\n## 凭证脱敏与一次性回显（安全关键）\n\n- `+automation-get` / `+automation-list`：**恒不返回明文 Bearer Token**——`trigger_condition.token_value` 被抹为 `null`。用户想知道「token 是什么」时，list/get 都查不到明文。\n- `+automation-update --enable-token` / `--reset-token`：明文 Bearer Token **仅当次 stdout 回显一次**，同时 stderr 打印一次性告警：\n  ```text\n  warning: this bearer token is shown only once and is NOT stored by lark-cli — copy it now and store it in your own secret manager.\n  ```\n- Webhook URL 同理：`--reset-url` 后新 URL 仅当次回显一次，旧 URL 立即失效。\n- CLI 不落盘任何明文 token/URL（不写 cache / config / recent / debug log / 错误信息）。\n- **Token 丢失只能 reset**：找不回，唯一恢复方式是 `+automation-update --reset-token`（旧 token 同时失效）。\n\n## 高危确认\n\n`+automation-update` 整体是 `high-risk-write`，任何一次调用都需显式 `--yes`；缺少时框架会要求确认（退出码 10）。**不要自动补 `--yes`**——需用户明确确认后再加。以下 Webhook 动作 flag 尤其不可逆：\n\n- `--reset-url`（旧回调 URL 立即失效，需配 `--app-env preview|runtime`）\n- `--reset-token`（旧 token 立即失效）\n- `--disable-token`（关闭 token 校验，**不可逆**）\n\n四个 Webhook 动作 flag（`--reset-url` / `--enable-token` / `--disable-token` / `--reset-token`）**每次只能传一个**。不确定影响时先跑 `--dry-run` 看将发出的请求（不含明文）。\n\n### 执行前必须完成的确认步骤（高危写强制协议）\n\n**在带 `--yes` 执行任何高危写之前，Agent 必须先完成以下 3 件事**，缺一不可——即使用户口气很急、即使命令一眼就明：\n\n1. **确认目标唯一**：不允许\"猜名字\"或\"批量试所有可能的名字\"。若不确定 `--name`，先 `+automation-list --app-id <id>` 让用户在候选中点名；`--name` 不明的绝不执行写操作，更不要 for 循环批量试。\n2. **确认可选参数已定**：`--reset-url` 必须由用户明确指定 `--app-env preview` 还是 `runtime`；不要默认取 runtime 或 preview。同一触发器的 preview/runtime 是两条独立的 URL，误重置另一条不可回退。\n3. **告知不可逆后果并等确认**：把即将发生的 3 件事复述给用户——（a）旧 URL/Token 立即永久失效；（b）新 URL/Token 仅当次回显一次、CLI 不保存；（c）本次操作无法撤销——等用户回复\"确认\"再加 `--yes` 跑。\n\n只要有一项没做，就先跟用户对齐、不要执行。这些是 skill 层的护栏，不是 CLI 层的（CLI 只强制 `--yes`，不强制上面 3 件事）。\n\n## ⚠️ 安全告警：无鉴权公网回调组合态\n\n`--disable-token`（关闭 Bearer Token 校验，不可逆）**叠加** `--white-ip-list '[]'`（清空 IP 白名单）会让 Webhook 触发器进入「**无鉴权公网回调**」组合态——**任何来源都能触发该 Webhook**，没有任何一道防线拦截。\n\n- 两道防线：Token 校验（谁能调）+ IP 白名单（从哪能调）。**不要同时关闭这两道防线。**\n- 若确需关闭 Token（例如对端无法带 Bearer 头），务必**保留 IP 白名单**收敛来源；反之若要放开 IP，务必**保留 Token 校验**。\n- 用户同时要求「关 token 校验 + 清空 IP 白名单」时，Agent 的正确响应是**在识别到该请求的第一时间**（不要等命令跑失败才补警告）向用户输出以下 3 件事，再等确认——不要只描述\"没有任何防线\"就停下：\n  1. 复述后果：这会形成无鉴权公网回调，任何来源都能触发。\n  2. **主动给出替代方案**：明确建议\"要么只关 Token 保留 IP 白名单，要么只放开 IP 保留 Token\"，让用户在保留一道防线的两条备选里选一条。\n  3. 只有用户明确回复\"我理解风险、就是要两道都关\"时，才继续按高危写协议（见上节「执行前必须完成的确认步骤」）走。\n\n## 默认 disabled\n\n`+automation-create` 创建后触发器**默认 disabled**，不会自动触发。需 `+automation-enable` 才开始按条件自动运行（且触发器执行的是**线上已发布**的应用代码——应用未发布时即便 enable 也不会有实际效果）。\n\n**Agent 行为约束**：用户只说\"创建/配一个触发器\"时，**不要**主动在同一个 turn 里 `+automation-enable`。让用户自己在下一轮决定是否启用；主动启用会：\n- 让 webhook 类型立即可被外部调用（原本用户可能只是想\"备好 URL 稍后用\"）\n- 让 cron 到点真实触发（原本用户可能想\"先建好观察配置\"）\n- 让 record-change 立即响应表变更\n\n创建成功后的推荐话术：`已创建 <name>，当前 disabled；需要真正开始自动运行时告诉我，我用 +automation-enable 启用它。` **不要**在创建成功后立即启用，即使 skill 里说\"需 enable 才自动触发\"——这条是给用户的说明，不是给 agent 的行动指令。\n\n## 本地全栈 Trigger 闭环\n\n当用户希望触发器实际执行业务代码时，先确认当前工作区是已初始化的应用项目，并读取其中与触发器任务匹配的 guide。\n\n`--name` 是应用内唯一的 trigger 定位键；代码侧绑定名称必须与它逐字相同。不得用 trigger ID 或方法名代替它。具体 handler 语法和接入方式以项目 guide 为准。\n\n### 仅创建/配置触发器\n\n适用于 cron、record-change、webhook 和 feishu-approval。用 `+automation-create` 创建，并省略 `--status` 或显式传 `disabled`，然后报告 name 和 disabled 状态。\n\n不要传 `--status enabled`，也不要写 handler、commit/push、release 或 enable；更不能把创建 API 成功称为“可运行”。默认 disabled 是这个意图的终点，不是稍后自动 enable 的待办。\n\n### 仅启用已有 disabled trigger\n\n用户只要求启用已存在且 disabled 的 trigger、没有要求修改代码或制造真实 runtime 事件时，先用 `+automation-get` 核对 name、类型和 disabled 状态，再用 `+release-list --status finished --page-size 1` 核对是否存在已完成线上 release。release history 只能证明当前线上应用有已发布版本，不能证明该 trigger name 已绑定 handler。不存在 finished release 时说明 enable 只会改变配置状态、当前没有可执行的线上版本；存在时说明它会对当前线上应用激活这条 trigger 配置。随后按用户要求执行 `+automation-enable`，再用 `+automation-get` 确认 enabled。\n\n这条路径不得修改 handler、commit/push 或 release。未发布时不得自动创建 release，也不得声称 trigger 已开始实际运行。即使存在 finished release，也只能把 enable 报告为配置激活；没有 handler 来源或 runtime 结果时，不得声称业务 handler 已存在、已运行或可用。若用户期待尚未发布的本地改动生效，或检查后发现确实需要新增/修改 handler，转到下方“实现或更新 handler 后发布并启动/测试”路径；不要为单纯 enable 发布整个 `sprint/default`。\n\n对 UPSERT 或 feishu-approval 只改变配置状态；由于本 guide 没有其已证实的 handler、投递或 live 验证契约，启用后也不得声称业务代码已运行或触发器已实测可用。\n\n### 测试已有线上 trigger（不改代码）\n\n用户要求测试已经发布的 trigger、没有要求修改 handler 时，先用 `+automation-get` 核对 name、类型、当前状态，再用 `+release-list --status finished --page-size 1` 确认应用存在 finished release，并说明本次测试覆盖当前线上代码。没有 finished release 时停止 runtime test，只报告配置状态；不得为测试自动修改源码、commit/push 或 release。release history 不证明该 name 已绑定 handler，真实 probe 的结果才是本次验证证据；若用户期待本地未发布改动，改走代码变更闭环。\n\n记录测试前状态，并在任何临时 enable 之前完成两类授权和全部 preflight：测试请求已明确包含临时 enable，或另行取得 enable 授权；同时按下方“运行时验证的操作级授权”确定具体事件、影响、载荷、观察结果和清理。原本 disabled 时完成这些门槛后才临时 enable，并在验证结束后恢复 disabled；原本 enabled 时不要无意义切换状态。原本为 disabled 时，无论 probe 成功、失败、结果不确定，还是临时 enable 后提前结束或中断，最终都必须 `+automation-disable` 并回读 disabled，不得停在 enabled。测试意图本身不决定数据库记录、Webhook 请求或其他事件载荷。\n\n### 仅完成 handler（不发布/不启用）\n\n仅对 cron、webhook、record-change 的 `INSERT`、`UPDATE`、`DELETE` 使用此路径。\n\n创建或定位已明确 name 的 disabled trigger，读取项目 guide，按其要求实现同名业务 handler，完成本地验证。只在既有 Git 确认或预授权下 commit/push；停止在 `+release-create` 和 `+automation-enable` 之前。用户没有明确“发布好”时，先问，不能默认把完整应用上线。\n\n### 把 handler 发布好，但先不要启动\n\n仅对 cron、webhook、record-change 的 `INSERT`、`UPDATE`、`DELETE` 使用此路径。先用 `+automation-get` 定位；不存在时用 `+automation-create` 创建同名 disabled trigger，再次回读确认。已存在时记录它是否 enabled。按项目 guide 完成同名业务 handler 并本地验证后，commit、`git push origin sprint/default`。若 trigger 已 enabled，先说明发布前必须临时停用以及可能造成的运行中断，并取得这次临时停用授权；未获授权时停止在发布前。取得授权后，在发布前执行 `+automation-disable`，并再次用 `+automation-get` 确认 disabled。随后读取 [release-create 规则](lark-apps-release-create.md)，生成理由并将其纳入现有发布确认。随后发布完整应用：命令传入已确认的同一理由。\n\n```bash\nlark-cli apps +release-create --as user --app-id <app_id> --branch sprint/default --apply-reason \"发布自动化 handler 更新\"\n```\n\n若 `+release-create` 本身返回错误或未返回 `data.release_id`：视为确认未创建本轮 release（新代码未上线），原本 enabled 的 trigger 恢复 enabled 并回读、原本 disabled 的保持 disabled，然后停止；若因超时等导致创建结果未知，保持 disabled，先用 `+release-list --status finished --page-size 1` 核对是否已产生新 release 再决定。取得 `data.release_id` 后，先对**这一轮** ID 调用 `+release-get`，每次查询后先按顶层 status 识别终态：`finished` / `failed` 优先于可能残留的 PENDING 节点。尚未进入终态且 `current_node_info.current_status=PENDING` 时（顶层可能是 `publishing` 或 `pending`）立即停止本轮轮询，保持 trigger disabled 并保留同一个 `release_id`，告知当前用户正在等待审批负责人处理，不得假定当前用户或 `submitted_by` 是审批人；当前用户明确确认审批负责人已处理后继续查询该 ID。在此之前不得 enable、probe 或恢复状态，也不得自动审批、写回发布节点或创建新 release。节点非 PENDING 且状态为 `publishing` 时，每 20 秒继续查询同一 ID，整体最多约 5 分钟；超时且状态仍不确定时报告 `release_id` 和当前 status，并保持 disabled。`status=pending` 但没有明确 PENDING 节点时停止自动轮询、保持 disabled 并原样报告，不补出审批人、审批链接或创建新 release；即使响应已带 `online_url` 也不算部署完成。只有同一个 ID 返回 `data.status=finished` 才算完成。确认 `failed` 时新代码未上线：原本 enabled 的 trigger 恢复 enabled 并回读，原本 disabled 的保持 disabled。遇其他未知 status 时停止自动轮询、保持 disabled 并报告原值，不自行恢复或 enable。release 是整个应用上线，可能影响既有线上功能；未获得启动或测试授权时，finished 后始终保持 disabled，不执行 `+automation-enable`。\n\n### 实现或更新 handler 后发布并启动/测试\n\n仅当本轮确实需要新增或修改 cron、webhook、record-change 的 `INSERT`、`UPDATE`、`DELETE` handler，且用户要求把这次代码发布后启动或测试时，才使用此路径。按以下不可跳过的顺序执行：\n\n1. 用 `+automation-get` 定位并记录发布前状态，再核对其 `--name`、类型并读取项目 guide；不存在时用 `+automation-create` 创建同名 trigger 并保持默认 disabled。\n2. 按项目 guide 完成同名业务 handler 并本地验证。\n3. 在 Git 已确认/预授权时 commit，然后执行 `git push origin sprint/default`。\n4. 若 trigger 当前 enabled，先说明发布前必须临时停用以及可能造成的运行中断，并取得这次临时停用授权；未获授权时停止在发布前。取得授权后执行 `+automation-disable`，并再次用 `+automation-get` 确认 disabled；原本 disabled 时不要无意义切换状态。\n5. 读取 [release-create 规则](lark-apps-release-create.md)，生成理由并纳入现有发布确认，再执行 `+release-create --branch sprint/default --apply-reason \"发布自动化 handler 更新\"`；命令必须传入已确认的同一理由。若该命令本身返回错误或未返回 `data.release_id`：视为确认未创建本轮 release（新代码未上线），原本 enabled 的 trigger 恢复 enabled 并回读、原本 disabled 的保持 disabled 后停止；若因超时等导致结果未知，保持 disabled，先用 `+release-list --status finished --page-size 1` 核对是否已产生新 release 再决定。取得 `data.release_id` 后进入下一步。\n6. 对该 ID 执行 `+release-get`，每次查询后先按顶层 status 识别终态：`finished` / `failed` 优先于可能残留的 PENDING 节点。尚未进入终态且 `current_node_info.current_status=PENDING` 时（顶层可能是 `publishing` 或 `pending`）立即停止本轮轮询，保持 trigger disabled 并保留同一个 `release_id`，告知当前用户正在等待审批负责人处理，不得假定当前用户或 `submitted_by` 是审批人；当前用户明确确认审批负责人已处理后继续查询该 ID。在此之前不得 enable、probe 或恢复状态，也不得自动审批、写回发布节点或创建新 release。非 PENDING 时，只有 `data.status=finished` 才能继续；`publishing` 时每 20 秒继续轮询，整体最多约 5 分钟。`status=pending` 但没有明确 PENDING 节点时停止自动轮询、保持 disabled 并原样报告，不补出审批人、审批链接或创建新 release；即使响应已带 `online_url` 也不算部署完成。轮询始终查询同一 ID。超时且状态仍不确定时停止本轮轮询、报告 `release_id` 和当前 status，并保持 disabled；确认 `failed` 时报告发布未通过，原本 enabled 的 trigger 仅在确认新代码未上线后恢复 enabled，原本 disabled 的保持 disabled。遇其他未知 status 时停止自动轮询、保持 disabled 并报告原值，不自行恢复或 enable。发布状态仍不确定时不得进入 enable、probe 或状态恢复分支。`is_published=true` 不能代替这轮发布完成。\n7. **仅启动**：取得持续启动授权后执行 `+automation-enable`，并用 `+automation-get` 确认 enabled；到此结束，不制造 runtime probe。\n8. **测试（含“启动并测试”）**：先按下节“运行时验证的操作级授权”完成全部 preflight，包括具体事件、sibling 影响、载荷、观察结果和清理；完成前保持 disabled，之后才执行 `+automation-enable` 并回读，再由已授权主体制造真实 runtime 条件并核验业务结果。若同时明确要求持续启动，只有 probe 成功后才保持 enabled。\n9. 若用户仅要求测试而不是持续启动，只在本轮 release 已 `finished` 且 probe 成功后恢复到发布前状态：原本 disabled 或本轮新建的 trigger `+automation-disable` 并回读；原本 enabled 的可保持 enabled。无论用户是仅测试还是启动并测试，probe 失败、结果不确定或 enable 后提前结束时，一律 `+automation-disable` 并回读 disabled；不得把“发布前 enabled”当作失败后的恢复依据，因为本轮新代码已经上线。只有旧 release 已回滚并验证，或修复后重新发布且 probe 成功，才可再次 enabled。恢复失败时明确报告当前状态。\n\n没有通用的 `automation-debug` 或 trigger 日志 shortcut。缺少安全事件入口、匹配环境或可观察结果时，记录 blocked，不能编造测试成功。\n\n### 运行时验证的操作级授权\n\n启用 trigger 的授权不等于制造 runtime 事件的授权，测试授权也不等于任意数据库写入授权。cron 可等待计划时间；webhook 只能向既有 runtime URL 发送已授权、安全且不泄露凭证的请求。record-change 在执行任何 DML 前，必须明确并取得覆盖以下作用域的授权：环境、表、操作、精确测试记录或筛选条件、payload、预期结果和清理方式。\n\n优先使用专用测试记录，不要任取线上业务记录。用户已明确授权精确、可撤回的测试夹具及其清理时，不机械追加一轮确认；目标或影响仍不清楚时必须停下。record-change probe 前先执行 `+automation-list --trigger-type record-change --all`，检查同一环境、表和操作可能命中的其他 enabled trigger；若存在 sibling match，必须说明聚合业务影响并取得覆盖这些影响的授权，或换成隔离夹具/经授权临时停用后再测。`UPDATE` 要限定精确条件并保留恢复方式；`INSERT` 要预先约定清理；恢复 UPDATE 或清理 INSERT 也可能再次触发自动化，必须纳入影响说明和授权。`DELETE` 必须遵循 [lark-apps-db-execute.md](lark-apps-db-execute.md)：先 `SELECT count(*)`、执行 `--dry-run`，展示影响后取得针对该删除目标的明确授权，再带 `--yes` 执行；清理动作若包含未预先授权的删除，同样走该门槛。\n\n缺少安全、已授权且可清理的事件入口时，记录 blocked，不得用“测试一下”推导任意 online 数据写入。\n\n### UPSERT 与飞书审批边界\n\nrecord-change 的 UPSERT 可创建 disabled 配置，但当前没有已证实的运行时代码契约；不得静默按 UPDATE 处理，也不得承诺 handler 或 live 验证。\n\nfeishu-approval 可创建 disabled 配置，并读取或更新 `event_type`、对应 status 和可选 `approval_code`。当前没有已证实的运行时 handler 契约或实际投递验证；不要把 enable 或审批 API 成功称为业务代码已执行。\n\n### 未触发时的诊断顺序\n\n按 `--name` / 项目 guide 要求的代码接入 → 本轮 release `finished` → enabled 状态 → 类型条件、环境和已有日志的顺序排查。客户审批投递故障属于服务端事件投递排查，不要归因于此 SOP 或改写无关业务代码。\n\n## 常见错误与决策场景\n\n| 现象 / 用户意图 | 正确处理 |\n|---|---|\n| 创建报名字冲突（`--name` 应用内唯一） | 换名或加后缀重试 |\n| cron 报非法 / 间隔过小 | 检查是否五段式、分钟字段是否 `*` 或 `*/n`(n<30) |\n| `--reset-url` 报缺 app-env | 补 `--app-env preview` 或 `--app-env runtime` |\n| 想把 cron 触发器改成 webhook（跨类型改） | update 不支持换类型，本 skill 也不提供删除。旧触发器只能 `+automation-disable` 停用（保留在应用里），另建一个 webhook 触发器；若要真正清理旧触发器，请到妙搭 web 手动删除 |\n| 触发器 enable 了但不触发 | 已证实的 cron、webhook、record-change（INSERT/UPDATE/DELETE）按「未触发时的诊断顺序」排查；UPSERT 和 feishu-approval 仅核对配置边界，不承诺 handler 或 live 验证。 |\n| 「token 泄露了」 | 优先 `+automation-update --reset-token --yes` 轮换（旧 token 立即失效），而非直接 disable-token 关校验 |\n| 「回调 URL 泄露了」 | `+automation-update --reset-url --app-env <env> --yes` 轮换 |\n\n## 不在本 skill 范围\n\n- 审批定义查询、Webhook 消费端实现、实时触发日志 tail：本期不支持。\n- 身份选择、权限不足处理、exit-10 审批、通用「禁输出密钥」红线、高风险操作通用框架：见 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md)，不在此重复。\n","skills/lark-apps/references/lark-apps-cache.md":"# apps cache 域命令（应用运行时缓存调试）\n\n调试妙搭应用的运行时缓存：查看某个缓存 key 的内容、删除单个 key、清空某个环境的全部缓存。缓存是应用为了加速而临时存放的数据，删除或清空后，应用下次用到时会自动重新取最新数据。命令事实以 `lark-cli apps +<cmd> --help` 为准；认证、`--as user`、exit 码、`_notice` 等通用处理见 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 与本域 [`SKILL.md`](../SKILL.md)。\n\n## 何时用\n\n用户要排查「某个缓存 key 里存的是什么 / 有没有命中」、想删掉某个 key 让应用下次拿到最新数据、或想清空某个环境的缓存做快速恢复时。\n\n## 命令一览\n\n| 命令 | 做什么 | 关键参数 |\n|---|---|---|\n| `+cache-get` | 查一个缓存 key 的内容与信息 | `--key`、`--environment`、`--format` |\n| `+cache-delete` | 删一个缓存 key（重复删不会报错；不需 `--yes`） | `--key`、`--environment` |\n| `+cache-clear` | 清空指定环境下的全部缓存（**高危，须先向用户二次确认**） | `--environment`、`--yes` |\n\n> 所有命令都需 `--app-id`。\n\n## 约定（先读）\n\n- **环境 `--environment dev|online`（可省略）**：缓存按运行环境隔离。不指定时按应用当前的环境配置自动选择——有多环境的应用默认落到开发环境 `dev`，没有多环境的就是线上 `online`；返回结果里的 `environment` 会告诉你这次实际操作的是哪个环境。想固定就显式传。\n- **缓存 key 用 `--key` 传**：传业务里使用的那个 key；是否合法（非空、长度等）由服务端校验，不合法会返回错误。\n- **风险分级**：`+cache-clear` 会清掉整个环境的缓存，是高危操作，不带 `--yes` 会被确认关卡拦下，且**必须先拿到用户对本次清空的确认**（判据见 [+cache-clear](#cache-clear高危)）；`+cache-delete` 只删单个 key、影响小，不需 `--yes`。\n- **`+cache-get` 的内容有两种展示**：`--format json`（默认）原样返回缓存内容，适合精确比对；`--format pretty` 会把内容格式化展开，更便于阅读。\n\n## 各命令\n\n### +cache-get\n按 `--key` 查单个缓存。命中时返回：是否存在、剩余有效期（TTL）、内容及其大小；未命中（或已过期）时只返回 `exists=false`、不带内容。\n\n> 每次查询都会连内容一起返回（没有「只看信息、不取内容」的模式），内容可能较大——只是想确认「在不在 / 还有多久过期」时，留意别占用太多上下文。\n\n```bash\nlark-cli apps +cache-get --app-id app_xxx --key spotbonus:2026:winners:list:v1\nlark-cli apps +cache-get --app-id app_xxx --environment online --key <key> --format pretty\n```\n\n### +cache-delete\n删一个缓存 key。**重复删、或删一个本就不存在的 key，都算成功**（返回 `deleted_key_count=0`）、不会报错；删中则返回 `deleted_key_count=1`。删掉后应用下次会自动重新取最新数据，影响小，故不需 `--yes`。\n\n**响应里的 `deleted_key_count` 别读错**——它是「本次是否真的删掉了东西」的唯一判据：\n\n| `deleted_key_count` | 含义 | 该怎么向用户表述 |\n|---|---|---|\n| `1` | 命中并删掉了 | 「已删除该 key」 |\n| `0` | 请求成功，但没有删掉任何 key——这个 key **本来就不存在或已过期** | 「该 key 原本就不存在／已过期，无需删除」——**不要说成「已成功删除」** |\n\n要证明「删除生效了」，用「删前 `+cache-get` 确认存在 → `+cache-delete` 拿到 `deleted_key_count=1` → 删后 `+cache-get` 得到 `exists=false`」这条链；只靠删后一次 miss 是不够的，因为 key 从一开始就不存在时（`deleted_key_count=0`）结果完全一样。\n\n```bash\nlark-cli apps +cache-delete --app-id app_xxx --environment dev --key <key>\n```\n\n### +cache-clear（高危）\n清空当前应用在**指定环境**下的全部缓存，用于定位不到具体 key 时的快速恢复。影响面是整个环境，必须带 `--yes`；返回本次清除的 key 数量。\n\n> [!CAUTION]\n> **默认流程是「先确认、后执行」，不是「直接清」。** 除下表判定为「已确认」的情形外，**不允许在首次调用就自己带上 `--yes`**——用户提出清理请求 ≠ 用户确认了这次清理。\n>\n> 未拿到确认时，你只能做这两件事之一，然后**停下来等用户回话**：\n> 1. 用 `--dry-run` 预览（不触发门禁、不产生任何真实清理），把将执行的请求给用户看；\n> 2. 或者干脆不调命令，直接把「应用 + 环境 + 会清掉该环境全部缓存」讲清楚并请用户确认。\n>\n> 已经拿到确认后，才在原命令末尾补 `--yes` 执行。**看到 exit 10 / `confirmation_required` 不是「补 `--yes` 重试」的信号**，它只是告诉你门禁生效了；该不该补，取决于用户有没有确认过。\n\n**什么算「已确认」（零歧义判据）**：看用户这轮的原话里，有没有对「清空这个环境」的授权表述。\n\n| 用户原话 | 算不算确认 | 你该做什么 |\n|---|---|---|\n| 「帮我清一下 app_xxx 的 online 环境缓存」 | ❌ 不算（这是请求，不是确认） | 先 `--dry-run` 或直接请用户确认，**停下等回话** |\n| 「清一下缓存」（连环境都没说） | ❌ 不算，且环境未定 | 请用户同时确认「清哪个环境」，**严禁自己选 `dev` 或 `online`** |\n| 「我确认清 dev，不要动 online」 | ✅ 算（含确认表述 + 明确环境） | 显式带 `--environment dev --yes` 执行 |\n| 「确认清 online，不用再问」／「是的，清吧」（承接你上一轮的确认提问） | ✅ 算 | 显式带 `--environment online --yes` 执行 |\n\n线上环境额外一条：`--environment online` 是生产数据，**即使用户已明确指名 online，也仍需要上表意义上的确认表述**才可执行；缺确认就只出 `--dry-run` 预览。\n\n```bash\n# 1) 未确认：只预览，不清理（--dry-run 不触发门禁、不产生真实动作）\nlark-cli apps +cache-clear --app-id app_xxx --environment online --dry-run\n\n# 2) 用户确认后：补 --yes 执行\nlark-cli apps +cache-clear --app-id app_xxx --environment dev --yes\n```\n\n## 错误与边界\n\n- **key 不合法 / 缓存服务暂时不可用**：命令会返回带说明的错误，按 `error.hint` 转述给用户；「服务暂时不可用」这类可稍后重试。\n\n## Agent 规则\n\n- **写操作先定环境**：`+cache-clear` / `+cache-delete` 不指定 `--environment` 时会落到自动选中的环境——**没有多环境的应用会直接作用到线上 `online`（生产）**。不确定应用有没有多环境时，写操作显式传 `--environment`；纯查看（`+cache-get`）影响小，可以省略。\n- **`+cache-clear` 一律先确认再清**：不带确认就执行是本域最容易犯的错。**「用户让我清缓存」不构成授权**——授权指用户对「清空这个环境」有明确确认表述（判据表见 [+cache-clear](#cache-clear高危)）。没有它，就只出 `--dry-run` 预览或口头确认请求，然后停下等回话；**不要在首次调用就自带 `--yes`，也不要看到 exit 10 就补 `--yes` 重试**。拿到确认后再补 `--yes`，并始终显式带 `--environment`。\n- **排查缓存内容优先用 `+cache-get`**：想看结构化、易读的内容用 `--format pretty`；想拿原始内容做精确比对用默认 JSON。\n- **删 key 前先对齐 key**：用户只描述了业务含义、没给准确 key 时，先确认再删——删错影响也有限（应用会自动重建），但仍应避免误删。\n","skills/lark-apps/references/lark-apps-cloud-dev.md":"# lark-apps 云端会话开发\n\n适用：用户希望让云端妙搭 Agent 生成或迭代应用，而不是把代码拉到本地开发。\n\n## 核心流程\n\n整个开发在云端进行：本地只负责「发消息 + 轮询状态」，不拉源码、不产出代码、不启动本地 dev server。所有 session/chat 命令都以用户身份执行（`--as user`）。\n\n### 资源模型：app → session → turn\n\n三层父子关系，下层都挂在上层之下：\n\n- **app（应用资产）**：一个妙搭应用，由 `+create` 创建并拿到 `app_id`。`--app-type` 沿用 SKILL.md「选择开发路径」判定的类型（有数据库需求→`full_stack`；纯前端交互、未提数据库→默认 `frontend`），云端生成不写死 `full_stack`。\n- **session（会话）**：一个 app 下的一段独立对话上下文，由 `+session-create` 创建并拿到 `session_id`。一个 app 可有多个 session；`is_active` 表示该 session 当前是否可写（可发起对话）。\n- **turn（轮）**：一个 session 里的一轮交互 = 一条用户消息 + 妙搭 Agent 针对它的生成/迭代。`+chat` 发一条消息就发起一轮；轮的句柄是 `turn_id`，状态看 `latest_turn.status`。\n\n### 执行模型：异步 + 轮询\n\n`+chat` 把消息入队后**立即返回、不等生成完成，响应不带 `turn_id`**；本轮状态与轮询节奏全靠 `+session-get` 读 `latest_turn.status` / `is_streaming` / `next_poll_after_ms`。\n\n`+session-get` 关键字段：\n\n- `is_streaming`：当前是否有一轮正在跑（`true`=还在生成）。\n- `latest_turn.status`：最近一轮的状态，只有 `running` / `completed` / `failed` / `cancelled`。\n- `latest_turn.turn_id`：最近一轮的句柄（`+session-stop --turn-id` 用它）。\n- `latest_turn.user_message`：本轮用户发的消息。\n- `latest_turn.messages`：本轮完成后回看全貌的消息列表，按时序排列、每条带 `role`（用户消息、模型回复、工具调用等都在内，role 取值如 `user` / `assistant` / `tool`）。注意它在 `latest_turn` 仍 running/初始化期可能为空——该轮**进行中**的实时进展改用 `+session-messages-list --turn-id <latest_turn.turn_id>` 读（见下方轮询规则）。\n- `queued_messages` / `queued_count`：还没开始跑、排在后面的消息。\n- `next_poll_after_ms`：建议的下次轮询间隔（毫秒，固定值）；非空时优先用它。\n\n轮询规则：\n\n- 节奏按 [初始化 vs 增量修改](#初始化-vs-增量修改) 判定：增量 5-10 秒一次；初始化 60-120 秒一次；`next_poll_after_ms` 非空时用它。\n- `is_streaming=true`、`building` / `running` / `streaming` 表示仍在生成，继续轮询，不傻等也不提前放弃；初始化阶段单次 sleep 拉到 60-120 秒，进入 `streaming` 或属增量修改时切回 5-10 秒。\n- `is_streaming=false` 且 `latest_turn.status=completed` 表示本轮完成，可发下一条。\n- `failed` / `cancelled` 时转述错误字段或 hint，由用户决定是否重试，不要静默重发。\n- 不知道某 app 有哪些 session 时，先 `+session-list --app-id <id>`，再选最近活跃的或让用户确认，别直接猜 `session_id`。\n- 要中止正在运行的一轮，从 `+session-get` 的 `latest_turn.turn_id` 取值，再调用 `+session-stop --turn-id <turn_id>`。\n- 状态与节奏看 `+session-get`，本轮实时内容看 `+session-messages-list`：想在 running 期间向用户播报\"云端 Agent 此刻在做什么\"，用 `+session-messages-list --turn-id <latest_turn.turn_id>` 读已产出的增量消息（running 期间即可读，不必等本轮结束）。复用上面的轮询节奏、不另起更密的轮询；续拉时把上次响应的 `next_page_token` 作 `--page-token` 只取新消息，转述时简述进展、不原样打印整段消息或工具输出。\n\n### 典型链路\n\n```bash\n# 1) 建 app，拿 app_id（--app-type 用主路由判定的类型；此例\"待办应用\"要存待办→full_stack，\n#    若是纯前端交互工具且未提数据库则用 frontend）\nlark-cli apps +create --name \"待办应用\" --app-type full_stack \\\n  --description \"支持新增、完成、筛选待办\"\n\n# 2) 在该 app 下建 session，拿 session_id\nlark-cli apps +session-create --app-id app_xxx\n\n# 3) 发消息发起一轮（异步入队，立即返回，无 turn_id）\nlark-cli apps +chat --app-id app_xxx --session-id sess_xxx --message \"做一个待办清单页面\"\n\n# 4) 轮询本轮状态；完成后从 latest_turn.messages 读取结果\nlark-cli apps +session-get --app-id app_xxx --session-id sess_xxx\n\n# 找该 app 已有的会话（续聊/不确定 session 时用）\nlark-cli apps +session-list --app-id app_xxx\n```\n\n## 完成态不等于发布态\n\n通用发布态判定（is_published 语义、开发态链接拼接、发布态链接来源）见 SKILL.md「发布态护栏」。本 reference 只补云端会话特有的措辞：\n\n- `+session-get` 返回 `is_streaming=false` 且 `latest_turn.status=completed`，只说明本轮云端生成/迭代结束，不等于已发布部署。\n- 如果只完成了云端会话、没有确认发布完成，就明确告诉用户“开发态链接可进入继续编辑，发布态是否为最新版本尚未确认”。\n\n## 需求发送\n\n- 只有用户明确选择云端路径，或明确说“让妙搭 Agent / 云端 AI 生成/迭代”时，才进入本 reference；不要因为用户只说“做个 X”或“给我链接”就默认云端。\n- 进入云端路径后，极简需求也可直接发起生成，例如“做个投票工具”“做个站会小应用”。先按主路由判定的 `--app-type` 建 app（有数据库需求→`full_stack`，纯前端交互未提数据库→默认 `frontend`），再用 `+chat --message \"<用户原话>\"` 透传需求，不编造实体、字段或业务细节。\n- 如果需求过泛，可在 `+chat --message` 中保留原话，并只补一句“请先生成通用版本，后续可继续迭代”，不要用多轮追问阻塞生成。\n\n## 会话落点\n\n| 情形 | 动作 |\n|---|---|\n| 全新应用 + 云端生成 | 先按主路由判定的类型 `+create --app-type <frontend\\|full_stack>`（未提数据库默认 frontend）拿 `app_id`，再 `+session-create` -> `+chat` |\n| 已知 app_id，用户没指定会话 | 先 `+session-list`；有活跃会话时问用户继续现有还是新开 |\n| 用户说“新开一段/换个话题” | `+session-create` 后再 `+chat` |\n| 用户说“接着刚才” | 复用上下文 session_id；拿不到就 `+session-list` 让用户选 |\n| 用户问会话“进行到哪一步/当前状态/最新进展” | 用 `+session-get --session-id <sid>` 读状态。`+session-list` 只负责发现/选择会话，不含执行状态；它返回空不等于无状态可查（session_id 也可能来自上下文），别用 `+session-list`/`+release-list` 代替 `+session-get` 回答进度 |\n\n## 初始化 vs 增量修改\n\n`+chat` 单轮的耗时差距很大，取决于目标 app 是否**已初始化**。两者的轮询节奏不同，**`+chat` 前先把状态判定清楚**，不要拿\"是不是第一次发消息\"当代理判断——session 是新建的不代表 app 没初始化过。\n\n### 判定规则\n\n**已初始化**（满足任一即认为已初始化）：\n\n1. 本地存在该 app 的项目目录（已 `+init` 或 clone 过），**且** git commit 数 > 2；\n2. 应用维度（云端）至少有一个已提交的版本，按以下任一信号判断：\n   - `lark-cli apps +session-get --app-id <app_id> --session-id <session_id>` 的返回里出现已提交版本信息；\n   - 在 `lark-cli apps +list`（必要时配 `--keyword <name>` 定位）的目标 app 条目里 `is_published: true`。\n\n**未初始化**（两个条件同时成立）：\n\n1. 本地不存在该 app 的项目目录；\n2. 应用维度没有任何已提交版本（即上面两路云端信号都判 false）。\n\n### 两种 `+chat` 的行为\n\n| 状态 | 服务端动作 | 单轮耗时 | 轮询建议 |\n|---|---|---|---|\n| 已初始化 → **增量修改** | 云端 Agent 在已有云端工作区上对**已提交代码**做局部修改，跳过方案设计与首次生成 | 通常分钟级 | `next_poll_after_ms` 为空时 5-10 秒一次 |\n| 未初始化 → **首次初始化 + 生成** | 服务端跑完整的应用初始化流程：需求分析、技术方案、数据模型、UI 与后端代码生成、首版代码提交到云端工作区 | 视需求复杂度，**通常 20~50 分钟** | `next_poll_after_ms` 为空时 60-120 秒一次 |\n\n初始化阶段 `+session-get` 可能长时间持续返回 `building` / `running`，是正常状态，**不要按失败处理，也不要催用户**。\n\n## 字段注意\n\n所有字段统一 snake_case，顶层和嵌套 turn 字段都一样：`session_id`、`is_active`、`is_streaming`、`next_poll_after_ms`、`latest_turn.turn_id`、`latest_turn.status`、`latest_turn.user_message`、`latest_turn.messages`。\n\n`+session-stop` 只停止正在运行的当前轮，不关闭会话；停完仍可继续 `+chat`。\n\n## 不适用\n\n- 用户要本地写代码、改仓库、跑 dev server：读 [`lark-apps-local-dev.md`](lark-apps-local-dev.md)。\n","skills/lark-apps/references/lark-apps-create.md":"# apps +create\n\n创建妙搭应用。运行时命令事实以 `lark-cli apps +create --help` 为准。\n\n## 何时用\n\n用来创建应用资产并拿到 `app_id`。它不负责把自然语言需求交给云端 Agent：用户要“帮我生成/迭代应用”时，先按 SKILL.md「选择开发路径」判定的 `--app-type`（有数据库需求→`full_stack`，纯前端交互未提数据库→默认 `frontend`）创建 app，再进入 [`lark-apps-cloud-dev.md`](lark-apps-cloud-dev.md) 用 `+session-create` / `+chat` 提交需求。\n\n## 命令骨架\n\n- 必填：`--name`、`--app-type`。\n- app type 取值为小写 `html` / `frontend` / `full_stack`；框架按枚举精确校验（不做大小写归一），非法值直接报错。\n- 可选：`--description`、`--icon-url`。\n\n## 示例\n\n```bash\nlark-cli apps +create --name \"客户调研问卷\" --app-type html\n\nlark-cli apps +create --name \"JSON 格式化工具\" --app-type frontend \\\n  --description \"纯前端交互工具，无需数据库\"\n\nlark-cli apps +create --name \"审批系统\" --app-type full_stack \\\n  --description \"部门审批系统，支持登录、提交申请、多级审批\"\n\nlark-cli apps +create --name \"Demo\" --app-type html --dry-run\n```\n\n## 输出契约\n\n- 成功默认 JSON envelope 中读取 `data.app.app_id`，同时可用 `data.app.name` / `description` 向用户确认结果。\n- pretty 输出只适合人看；后续命令需要 app_id 时，用 JSON 或 `--jq '.data.app.app_id'`。\n\n## app type 与命名\n\n- `--app-type` 取值与判定信号见 SKILL.md「选择开发路径」，此处不重复。\n- 用户只给自然语言需求时，据此生成简洁的 `--name` 和一句 `--description` 直接创建；不满意再用 `+update` 改。\n\n创建后按用户路径继续：\n\n- 本地应用开发（含 html / frontend / full_stack）：读 [`lark-apps-local-dev.md`](lark-apps-local-dev.md)。\n- 云端 Agent 生成/迭代：读 [`lark-apps-cloud-dev.md`](lark-apps-cloud-dev.md)。\n","skills/lark-apps/references/lark-apps-db-execute.md":"# apps +db-execute\n\n经妙搭服务端在应用数据库执行 SQL。运行时命令事实以 `lark-cli apps +db-execute --help` 为准。\n\n> **写 SQL 前先看文末「平台 SQL 规范」**：妙搭底层是 PostgreSQL + 一层平台约束，SQL 内容不符合会被服务端直接拒或建出行为不对的表。最容易踩的三条：① 建业务表必须带 4 个审计列（`_created_at`/`_updated_at`/`_created_by`/`_updated_by`）+ 启用 RLS + 4 条 policy，一次调用里写全；② 人员字段用内置复合类型 `user_profile`（写入 `ROW('<user_id>')::user_profile`，查询解引用 `(field).user_id`）；③ `CREATE/DROP DATABASE·SCHEMA·USER·ROLE`、非白名单 `CREATE EXTENSION`、平台保留表 `auth`/`users` 会被硬拒，`online` 环境禁 DDL。\n\n## 何时用\n\n用于通过妙搭服务端执行应用数据库 SQL。不要从环境变量里取连接串裸连数据库；本地调试也走这个 shortcut。写什么样的 SQL（平台约束、建表模板、`user_profile`、审计列、禁用 SQL、PG 陷阱）见文末「平台 SQL 规范」。\n\n## 命令骨架\n\n- 必填：`--app-id`，以及 `--sql` / `--file` 二选一（互斥）。\n- `--sql`：内联 SQL 文本；传 `-` 时从 stdin 读。绝对路径文件经 stdin 传入：`--sql - < <absolute-path>`（shell 解析路径，CLI 仅接收内容）。\n- `--file`：`.sql` 文件路径，需为工作目录内的相对路径（如 `--file ./migration.sql`）；绝对路径、或经 `..`/符号链接越出工作目录的路径会被拒绝。文件不在工作目录内时，改用 `--sql - < <文件路径>` 经 stdin 传入。\n- `--environment` 枚举：`dev` / `online`，**不传则由服务端按应用是否开启多环境自动选择（多环境→`dev`，未开启多环境→`online`）**；要固定环境就显式传 `--environment dev|online`。**未开启多环境的应用显式传 `--environment dev` 会报错（无 dev 分支）——这类应用不传 `--environment`（走 `online`）或显式 `--environment online`**。旧名 `--env` 已**移除**：传入会报 validation 错（提示改用 `--environment`），一律用 `--environment`。\n- risk 是 `high-risk-write`（SQL 可含 DML/DDL）：任何执行都需 `--yes`，否则返回 `confirmation_required` / exit 10。`--dry-run` 预览不需要 `--yes`。\n- **不会自动为你包事务，事务边界需自己在 SQL 里控制**：多语句默认逐条独立提交，中间某条失败时前序语句已生效、不会回滚；若需要「要么全部成功、要么全部回滚」的原子性，请在 SQL 内显式写 `BEGIN … COMMIT`（详见下「Agent 规则」）。\n\n## 示例\n\n```bash\nlark-cli apps +db-execute --app-id app_xxx --environment dev --sql \"select * from orders limit 5\" --yes\nlark-cli apps +db-execute --app-id app_xxx --environment dev --file ./migration.sql --dry-run\n# 绝对路径文件 / cwd 不固定：经 stdin 传入\nlark-cli apps +db-execute --app-id app_xxx --environment dev --sql - --yes < /Users/.../migrations/0001_init.sql\n```\n\n## 输出契约\n\n- 成功默认 JSON 的 `data` 按 SQL 类型自适应（不透传后端原始串）：\n  - 单 SELECT → `data` 是行数组 `[{...}]`（空 → `[]`），直接 `-q '.data[].col'` 取字段。\n  - 单 DML → `data = {command, rows_affected}`（如 `{\"command\":\"INSERT\",\"rows_affected\":1}`）。\n  - 单 DDL → `data = {command}`（如 `{\"command\":\"CREATE_TABLE\"}`）。\n  - 多语句 → `data` 是元素数组：SELECT 为 `{command:\"SELECT\", rows:[...]}`，DML 为 `{command, rows_affected}`，DDL 为 `{command}`。\n- pretty 会按 SELECT/DML/DDL 自适应渲染；多语句会逐条显示 Statement 摘要。\n- 失败返回 typed `error`（`type:\"api\"`、`subtype:\"server_error\"`、`code`、`message`、`hint`）：失败位置在 `message` 的「(at statement N of M)」；前序是否落地 / 是否整批回滚写在 `hint`——事务内失败「Transaction rolled back; no changes persisted.」；非事务多语句前序已落地「Earlier statements were committed and not rolled back; fix statement N and re-run the remaining statements.」；首句即失败（无前序落地）「No statements were applied; fix the SQL and re-run.」。据此决定整段重跑还是只跑剩余语句。\n\n## Agent 规则\n\n- 该命令为 high-risk-write，执行一律需 `--yes`；无 `--yes` 会返回 `confirmation_required` / exit 10。\n  - **只读查询、以及不删除/不丢失既有数据且可撤回的语句**：已授权时可直接带 `--yes` 执行。\n  - **会删除或丢失既有数据、或难以撤回的语句**：先 `--dry-run` 预览（无需 `--yes`），向用户确认后再带 `--yes` 执行；不要在用户不知情时自动补 `--yes`。\n- 多语句失败时，失败前的语句可能已经 commit 落地。不要整批重跑；按错误 message/hint 修失败语句，并从剩余语句继续。\n- 如果需要原子性，让用户在 SQL 内显式写 `BEGIN` / `COMMIT`，不要假设 CLI 会包事务。\n- 不要把数据库连接串从 env 中取出来裸连。\n\n---\n\n# 平台 SQL 规范\n\n上面讲命令怎么调，这里讲**该写出什么样的 SQL**：妙搭底层是 PostgreSQL + 一层平台约束（RLS、审计列、`user_profile` 复合类型、禁用 SQL 白名单），不符合会被服务端直接拒或建出行为不对的表。看表 / 看结构用 [`+db-table-list`/`+db-table-get`](lark-apps-db.md)，别手写系统表查询模拟。\n\n## 平台禁用 SQL（硬拒绝）\n\n以下命中会被服务端拒，`error`（`type:\"api\"`）的 message/hint 会说明原因——先按 hint 修再重试，不要反复重试同一句。\n\n| 类别 | 禁止 |\n|---|---|\n| 数据库级 | `CREATE / DROP / ALTER DATABASE` |\n| Schema 级 | `CREATE / DROP SCHEMA` |\n| 用户 / 角色级 | `CREATE / DROP USER`、`CREATE / DROP / ALTER ROLE` |\n| Owner 切换 | `REASSIGN OWNED` / `DROP OWNED` |\n\n## 建表规范（CREATE TABLE）\n\n新建业务表必须：4 个审计列 + 启用 RLS + 4 条默认 policy，**放在同一次 `+db-execute` 调用里**（RLS / policy / COMMENT / INDEX 一起）。裸表名，不写 `public.` 或 schema 前缀。\n\n```sql\nCREATE TABLE IF NOT EXISTS <table> (\n  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n  -- ... 业务列 ...\n  name varchar(100) NOT NULL,\n  _created_at TIMESTAMP(3) WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  _created_by user_profile DEFAULT (\n    CASE\n      WHEN current_setting('app.user_id', TRUE) = '' THEN NULL\n      ELSE concat('(', current_setting('app.user_id', TRUE), ')')::user_profile\n    END\n  ),\n  _updated_at TIMESTAMP(3) WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  _updated_by user_profile DEFAULT (\n    CASE\n      WHEN current_setting('app.user_id', TRUE) = '' THEN NULL\n      ELSE concat('(', current_setting('app.user_id', TRUE), ')')::user_profile\n    END\n  )\n);\n\nALTER TABLE <table> ENABLE ROW LEVEL SECURITY;\n\nCREATE POLICY service_role_bypass_policy ON <table>\n  TO service_role USING (true);\n\nCREATE POLICY \"修改全部数据\" ON <table>\n  AS PERMISSIVE FOR ALL TO authenticated USING (true);\n\nCREATE POLICY \"查看全部数据\" ON <table>\n  AS PERMISSIVE FOR SELECT TO authenticated, anon USING (true);\n\nCREATE POLICY \"修改本人数据\" ON <table>\n  AS PERMISSIVE FOR ALL TO authenticated USING (\n    (current_setting('app.user_id'::text) = ANY (ARRAY[]::text[]))\n    AND (current_setting('app.user_id'::text) = ((_created_by).user_id)::text)\n  );\n```\n\n建表流程：先 `+db-table-list` / `+db-table-get` 确认表不存在或看现有结构 → 生成 DDL → 向用户展示影响并取得授权 → `+db-execute ... --yes` 执行。\n\n## 审计列\n\n- 平台自动维护的四列固定叫 `_created_at` / `_updated_at` / `_created_by` / `_updated_by`（**下划线开头**）。查询 / 排序 / 过滤一律用这些名字，别写 `created_at`。\n- `_created_at` / `_updated_at` 在 INSERT 时可省略（有默认值）；需要业务归属时显式写 `_created_by` / `_updated_by`。\n- UPDATE 业务字段时建议同步 `_updated_at = CURRENT_TIMESTAMP` 和 `_updated_by`。\n\n## `user_profile` 复合类型\n\n平台内置类型 `(user_id varchar, name varchar, email varchar, avatar text, status integer)`，无需创建。**业务 SQL 只允许访问 `(field).user_id`**，不要依赖 `name` / `email` / `avatar` / `status`（可能为空或过期）。\n\n```sql\n-- 写入 / 更新：用 ROW()::user_profile，更新时替换整个字段，不改单个属性\nINSERT INTO teacher (teacher_profile, class_id)\nVALUES (ROW('<user_id>')::user_profile, gen_random_uuid());\n\nUPDATE teacher SET teacher_profile = ROW('<user_id>')::user_profile\nWHERE (teacher_profile).user_id = '<old_user_id>';\n\n-- 查询 / 过滤：解引用取 user_id；raw SQL 返回给前端前必须解引用，别直接返回复合类型\nSELECT (teacher_profile).user_id AS teacher_profile, class_id FROM teacher;\n\n-- 索引 / 唯一性：表达式列用三重括号；表达式唯一性用 CREATE UNIQUE INDEX，\n-- 不能用 ALTER TABLE ADD CONSTRAINT UNIQUE（不支持表达式列）\nCREATE INDEX idx_teacher_user_id ON teacher (((teacher_profile).user_id));\nCREATE UNIQUE INDEX uk_teacher_user_id ON teacher (((teacher_profile).user_id));\n```\n\n## DDL 规则\n\n| 场景 | 做法 |\n|---|---|\n| 加列 | `ALTER TABLE <t> ADD COLUMN IF NOT EXISTS <col> <type>`，相关 `COMMENT ON` 同次执行 |\n| 加索引 | `CREATE INDEX IF NOT EXISTS idx_<t>_<cols> ON <t>(...)` |\n| JSONB 类型声明 | 必须 `COMMENT ON COLUMN <t>.<col> IS '@type { ... }'` 声明 TypeScript 类型，和 CREATE / ALTER 同次调用 |\n| 加 NOT NULL 列 | 必须带 `DEFAULT` 让存量行自动填：`ADD COLUMN <col> <type> NOT NULL DEFAULT <值>` |\n| 删表 / 删列 | 有业务数据默认禁止；必须用户明确授权后才执行，并说明数据丢失风险 |\n| 强约束 | `UNIQUE` / `FOREIGN KEY` / `NOT NULL` 默认谨慎，不确定不加 |\n\n**多环境库加约束前先查 online 存量**：`dev` 干净不代表 `online` 干净，约束发布到 online 会撞线上存量数据而失败。发布前一律先用 `--environment online` 查清楚，按约束类型分三种：\n\n- **加唯一约束（`UNIQUE` / 唯一索引）**：线上不能有重复值。先查重复，有则先清理再加：\n\n  ```bash\n  lark-cli apps +db-execute --app-id app_xxx --environment online --sql \\\n    \"SELECT <cols>, count(*) FROM t GROUP BY <cols> HAVING count(*) > 1\" --yes\n  ```\n\n- **已有列改 `NOT NULL`（收紧约束）**：线上该列不能有 NULL。先查 NULL 行数，有就先回填（`UPDATE t SET <col> = <默认值> WHERE <col> IS NULL`）再加约束：\n\n  ```bash\n  lark-cli apps +db-execute --app-id app_xxx --environment online --sql \\\n    \"SELECT count(*) FROM t WHERE <col> IS NULL\" --yes\n  ```\n\n- **新加 `NOT NULL` 字段**：必须带 `DEFAULT`，且要求线上该表**无存量数据**，否则发布报错。线上已有数据时别直接加，改走三步安全变更：先 `ADD COLUMN <col> <type>`（可空）→ 回填 `UPDATE t SET <col> = <值>` → 再 `ALTER COLUMN <col> SET NOT NULL`。先查线上行数判断走哪条：\n\n  ```bash\n  lark-cli apps +db-execute --app-id app_xxx --environment online --sql \\\n    \"SELECT count(*) FROM t\" --yes\n  ```\n\n## SELECT 规则\n\n| 规则 | 要求                                                               |\n|---|------------------------------------------------------------------|\n| 行数 | 结果集有硬上限（平台限制 1000 行），超限**报错而非静默截断**；大表必须显式 `LIMIT`、聚合或游标分页       |\n| 分页 | 大表优先游标分页 `WHERE id > <last_id> ORDER BY id LIMIT n`，避免大 `OFFSET` |\n| user_profile | 返回给前端前解引用：`(owner).user_id AS owner`                             |\n| 统计 | 总数用 `count(*)`、分组用 `GROUP BY`，别把全量拉到 agent 侧再统计                  |\n| 慢查询 | 用 `EXPLAIN (ANALYZE, BUFFERS)`；大表 Seq Scan 考虑加索引                 |\n\n## DML 规则\n\n**INSERT**\n- UUID 主键省略，交给 `DEFAULT gen_random_uuid()`；外键 UUID 用子查询取父表 id，不手写。\n- NOT NULL 且无默认值的列必须给值；批量 INSERT 每行列数一致。\n- 需要幂等用 `ON CONFLICT ... DO NOTHING / DO UPDATE`。\n- 标量子查询必须保证单行，非唯一条件加 `ORDER BY ... LIMIT 1`。\n\n**UPDATE**\n- **必须有明确 `WHERE`，禁止无条件 UPDATE**。\n- 用户说「修改 / 更新 / 改一下」数据时用 UPDATE，**禁止 DELETE + INSERT** 模式。\n- 更新 `user_profile` / 复合类型时替换整个字段。\n- 批量更新前影响范围不明确，先 `SELECT count(*)` 给用户确认。\n\n**DELETE / TRUNCATE**（属会丢数据的高影响操作，按上面「Agent 规则」的确认流程走）\n- 已有表 / 已有数据默认禁止；先 `SELECT count(*)` 展示命中行数、取得用户明确授权，再带 `--yes` 执行。\n- `TRUNCATE` 影响整表，视同高风险删除。\n\n```sql\nUPDATE task\nSET status = 'done', _updated_at = CURRENT_TIMESTAMP, _updated_by = ROW('<user_id>')::user_profile\nWHERE id = (SELECT id FROM task WHERE title = '梳理需求' ORDER BY _created_at DESC LIMIT 1);\n```\n\n## 常见 PostgreSQL 陷阱\n\n| 陷阱 | 正确做法 |\n|---|---|\n| 表名带 schema 前缀 | 业务表一律裸表名 `FROM orders`，别写 `public.orders` |\n| 保留字作标识符 | 避免 `user` / `order` / `desc` / `offset` / `references` 等 |\n| 内联 COMMENT | 禁止 `col TEXT COMMENT 'xx'`，用独立 `COMMENT ON COLUMN` |\n| 手写系统表查结构 | 常规结构查询用 `+db-table-list` / `+db-table-get`，别手写 `information_schema` / `pg_indexes` 模拟 |\n| 空数组类型不明 | 写 `ARRAY[]::text[]` 或 `'{}'::text[]` |\n| `ROUND` 报错 | 用 `ROUND(num::numeric, n)` 或 `ROUND(num::double precision)` |\n| `DISTINCT` + 窗口函数 | 分两层查询，先 DISTINCT 再窗口函数 |\n| MySQL 方言 | 不用 `SHOW TABLES` / `DESCRIBE` / 内联 `COMMENT`；用 `+db-table-*` 和 `COMMENT ON` |\n| 多语句以为自动回滚 | `A; B; C` 不自动包事务，B 失败时 A 已提交；要原子性显式 `BEGIN; ... COMMIT;`（见上「命令骨架」「Agent 规则」） |\n\n## 数据类型与设计\n\n| 项目 | 规则 |\n|---|---|\n| 主键 | 默认 `id uuid PRIMARY KEY DEFAULT gen_random_uuid()` |\n| 命名 | 表名单数、全小写、snake_case、无冗余后缀 |\n| 枚举 / 状态 | 用 `varchar(255)`，值用小写英文 + 下划线 |\n| JSONB | 必须 `COMMENT ON COLUMN ... IS '@type { ... }'` 声明类型 |\n| 附件 / 图片 | URL 用 `TEXT`，命名 `xxx_url` |\n| 约束 | `UNIQUE` / `FOREIGN KEY` / `NOT NULL` 默认谨慎，新增 NOT NULL 列优先带 `DEFAULT` |\n","skills/lark-apps/references/lark-apps-db.md":"# apps db 域命令\n\n管理妙搭应用数据库：看表与结构、初始化与发布多环境、数据搬运、变更治理、时间点恢复、用量。逐条跑 SQL（SELECT/DML/DDL）走 [`+db-execute`](lark-apps-db-execute.md)（单独一篇）。运行时命令事实以 `lark-cli apps +<cmd> --help` 为准；认证、`--as user`、exit 码、`_notice` 等通用处理见 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 与本域 [`SKILL.md`](../SKILL.md)。\n\n## 何时用\n\n用户要看应用里有哪些表 / 某张表的结构、把单库应用拆成 dev/online 多环境、把数据导进导出表、查谁在什么时候改了表结构或表数据、开关行级审计、把开发环境的库结构发布到线上、把库恢复到过去某个时间点、或看数据库用量时。逐条执行 SQL 走 [`+db-execute`](lark-apps-db-execute.md)；文件存储（上传/下载文件）走 [`lark-apps-file.md`](lark-apps-file.md)。**建表 / 改表 / 写 SQL 的平台内容规范**（审计列、RLS、`user_profile`、禁用 SQL、PG 陷阱）见 [`lark-apps-db-execute.md`](lark-apps-db-execute.md) 的「平台 SQL 规范」。\n\n## 命令一览\n\n| 命令 | 做什么 | 关键参数 |\n|---|---|---|\n| `+db-table-list` | 列出某环境的数据表 | `--environment`、`--page-size`/`--page-token` |\n| `+db-table-get` | 看单张表的结构（字段/索引/约束/DDL） | `--table`、`--environment`、`--format` |\n| `+db-env-create` | 把单库应用初始化为 dev/online 多环境（高危） | `--environment`、`--sync-data`、`--yes` |\n| `+db-data-export` | 把一张表的数据导出到本地文件 | `--table`、`--output`、`--limit`、`--environment` |\n| `+db-data-import` | 把本地 csv/json 文件导进一张表（高危） | `--file`、`--table`、`--environment`、`--yes` |\n| `+db-sync-create` | 预览或创建 Base 到应用数据库的同步任务（高危） | `--config`、`--preview`、`--output`、`--environment`、`--yes` |\n| `+db-sync-list` | 列出 Base 同步任务 | `--mode`、`--status`、`--table`、`--page-size`/`--page-token`、`--environment` |\n| `+db-sync-get` | 查看同步任务配置、状态、统计和 warnings | `--task-id` |\n| `+db-sync-enable` | 启用 streaming 同步任务 | `--task-id` |\n| `+db-sync-disable` | 停用 streaming 同步任务 | `--task-id` |\n| `+db-sync-update` | 修改 streaming 同步任务映射配置（高危） | `--task-id`、`--config`、`--yes` |\n| `+db-sync-delete` | 删除 streaming 同步任务，保留目标数据（高危） | `--task-id`、`--yes` |\n| `+db-changelog-list` | 查表结构变更（DDL）历史 | `--table`、`--change-id`、`--since`/`--until`、`--environment` |\n| `+db-audit-status` | 看哪些表开了行级审计、保留期 | `--table`、`--environment` |\n| `+db-audit-enable` | 给某表开启行级变更审计 | `--table`、`--retention`、`--environment` |\n| `+db-audit-disable` | 关闭某表的行级审计 | `--table`、`--environment` |\n| `+db-audit-list` | 列出表的行级变更事件（增删改追溯） | `--table`（可重复）、`--since`/`--until`、`--environment` |\n| `+db-env-diff` | 预览开发环境待发布到线上的结构变更 | `--app-id` |\n| `+db-env-migrate` | 把开发环境的结构变更发布到线上（高危） | `--app-id`、`--yes` |\n| `+db-recovery-diff` | 预览把库恢复到某时间点会带来的变更 | `--target` |\n| `+db-recovery-apply` | 把库恢复到某个时间点、覆盖当前数据（高危） | `--target`、`--yes` |\n| `+db-quota-get` | 查数据库存储用量 | `--environment` |\n\n## 约定（先读）\n\n- **环境 `--environment dev|online`（可省略）**：看表、看结构、数据导入导出、变更追溯、审计、配额都按环境区分。省略 `--environment` 时 CLI 不带该参数、由服务端按应用形态自动选分支——多环境应用走 `dev`、未开多环境的走 `online`；要固定环境就显式传。唯一会报错的组合：对未开多环境的应用显式传 `--environment dev`（无 `dev` 分支）。写操作建议先在 `dev` 验（仅多环境应用有 `dev`）。旧名 `--env` 已**移除**：传入会报 validation 错（提示改用 `--environment`），一律用 `--environment`。`+db-env-diff`/`+db-env-migrate` 是「dev→online 发布」语义，**没有** `--environment`。\n- **本地文件 / `--output` 用工作目录内相对路径**：导入 `--file ./orders.csv`、导出 `--output ./out.csv`；绝对路径、或经 `..`/符号链接越出工作目录的 `--output` 会被拒（validation / exit 2）。路径在别处先 `cd` 过去或改成相对路径。\n- **高危操作必须带 `--yes`**：`+db-env-create`、`+db-data-import`、`+db-env-migrate`、`+db-recovery-apply`、`+db-sync-create`、`+db-sync-update`、`+db-sync-delete` 缺省会被确认关卡拦下；动手前先用对应的预览命令或 `--dry-run` 看清影响。`+db-sync-create --preview` 只解析/校验配置、不落库，免确认、不需 `--yes`；真正建任务（不带 `--preview`）才需要 `--yes`。\n- **Base 同步不是整库任务**：`+db-sync-create` 一次只处理一张 Base 表到一张目标表。用户说“整库”“客户、订单、回款三张表都同步”时，先明确告诉用户会拆成三套独立配置、三次 preview、用户确认后三次 create；不要暗示一个同步任务能覆盖整个 Base。\n- **batch 任务不能重新启用**：用户说“批量任务重新启用”“operation-not-allowed”时，先给结论：batch/import 是一次性任务，不能 enable。不要先陷入授权排障而漏掉这个结论；授权缺失时也要说明授权完成后应 `+db-sync-get` 查状态/结果，持续同步要新建 streaming。\n- **时间参数按口语自然传**（`--since`/`--until`/`--target`），格式见末尾。\n\n## 各命令\n\n### 表与结构\n\n**`+db-table-list`**：列出某环境的数据表。分页 `--page-size`（默认 20）/ `--page-token`（上一页 cursor）。每项给表名、描述、估算行数、大小、列数；要完整列定义 / 索引 / 约束用 `+db-table-get`。只知道业务对象名时，先用它定位可能的表名。\n\n```bash\nlark-cli apps +db-table-list --app-id app_xxx\nlark-cli apps +db-table-list --app-id app_xxx --environment dev --page-size 50\n```\n\n**`+db-table-get`**：看单张表的结构。默认 JSON 给结构化的字段 / 索引 / 约束 / 估算行数 / 大小；`--format pretty` 直接输出建表 DDL 文本（给用户看建表语句或做迁移参照时用）。\n\n```bash\nlark-cli apps +db-table-get --app-id app_xxx --table orders\nlark-cli apps +db-table-get --app-id app_xxx --table orders --environment dev --format pretty\n```\n\n### 多环境数据库（初始化 + 发布）\n\n**`+db-env-create`（高危）**：把存量单库应用初始化为 dev/online 两套库，不可逆，必须带 `--yes`。`--environment` 目前只支持 `dev`（默认 `dev`）；`--sync-data` 把现有 online 数据复制到新环境（不传则不复制）。注意：`+create --app-type full_stack` 新建的应用通常已自带多环境，重复初始化会返回冲突错误（应用已是多环境）——按 `error.hint` 转述状态即可，别重复初始化。\n\n```bash\nlark-cli apps +db-env-create --app-id app_xxx --environment dev --dry-run\nlark-cli apps +db-env-create --app-id app_xxx --environment dev --sync-data --yes\n```\n\n**`+db-env-diff`**：预览开发环境里待发布到线上的表结构变更，不落地。发布前先看这个。无待发布变更时明确返回「无变更」。\n\n**`+db-env-migrate`（高危）**：把开发环境的结构变更正式发布到线上，不可逆，必须带 `--yes`，返回实际发布的变更条数。发布是异步的，命令会等到完成再返回结果。\n\n> 预览与发布同一端点，故 `+db-env-diff` 也需 `spark:app:write` scope（不是纯只读权限）。\n\n**发布审批拦截**：若应用的发布配置了审批，`+db-env-migrate` 会被服务端拒绝（`feature_not_available`，exit 1）。这**不是**参数问题：换 flag、重试都不会成功，也不要去跑 `+db-env-create`。改走应用发布：先向用户确认发布理由，再执行 `lark-cli apps +release-create --app-id <app_id> --apply-reason \"<已向用户确认的发布理由>\"`；也可以让用户在页面上发布。只有真发布被拦，`+db-env-diff` 预览照常可用。\n\n```bash\nlark-cli apps +db-env-diff --app-id app_xxx\nlark-cli apps +db-env-migrate --app-id app_xxx --yes\n```\n\n### 数据导入导出\n\n**`+db-data-export`**：把一张表导出到本地文件。导出格式**只由 `--output` 的扩展名决定**——`.csv` / `.json` / `.sql`，缺省按 `<表名>.csv` 落在当前目录。注意：全局 `--format json|pretty` 只控制**命令自身输出**（成功摘要 / 错误信封）的渲染，**不影响导出文件的格式**；`--output` 后缀必须是 `.csv/.json/.sql` 之一，否则报 validation 错误（exit 2），且不支持导出到 stdout。两道体量约束：\n\n- `--limit`（1..5000，默认 5000）是**行数上限守卫**：表的行数超过它会被整体拒掉（不是「只导前 N 行」）；\n- 导出产物 >1 MB 也会被拒。\n\n超大表别硬导：先用 `+db-execute` 加 `WHERE` / `LIMIT` 缩小范围、分批导。\n\n```bash\nlark-cli apps +db-data-export --app-id app_xxx --table orders --output ./orders.csv\nlark-cli apps +db-data-export --app-id app_xxx --table orders --output ./orders.json --environment dev\n```\n\n**`+db-data-import`（高危）**：把本地 csv/json 文件的数据导进表。文件需是 `.csv`/`.json`、≤1 MB，必须带 `--yes`。目标表缺省取文件名去掉**最后一个**扩展名（如 `orders.csv`→`orders`，`orders.2026.csv`→`orders.2026`）；文件名带点号时建议显式传 `--table` 以免落到意外的表名。\n\n```bash\nlark-cli apps +db-data-import --app-id app_xxx --table orders --file ./orders.csv --environment dev --yes\n```\n\n**导入/导出限额**：体积 ≤ **1 MB**、行数 ≤ **5000**，导入导出都一样，超限会被拒。超限就分批——导入拆成 ≤1 MB / ≤5000 行的多个文件，导出用 `WHERE` / `LIMIT` 缩小范围。\n\n### Base 数据同步\n\nBase 数据同步走 `+db-sync-*`，和本地文件导入不同：`+db-data-import` 只处理本地 `.csv/.json` 文件；Base 链接、Base 表、字段映射、持续同步任务都走 `+db-sync-create` / `+db-sync-update`。\n\n**任务类型**：\n- `mode=batch`：一次性任务。`schema_only=true` 只建目标表；`schema_only=false` 建表或写入已有表并导入当前 Base 数据。完成后不能 enable/disable/update/delete。\n- `mode=streaming`：持续同步任务。首次同步后持续处理 Base 变化，可 enable/disable/update/delete。\n\n**环境（重要）**：`+db-sync-*` 命令省略 `--environment` 时默认落 **online**（不同于 `+db-table-*`/`+db-audit-*` 等「多环境自动选 dev、单环境选 online」的规则——db-sync 家族不走自动选分支）。**多环境应用建表**（`target.table.action=create`）**必须显式 `--environment dev`**：不填或填 `online` 会被 online 分支的 DDL 禁令拒（`k_dl_4000001：forbid ddl/dcl operation in online env`），因为 online 分支产品上不允许直接建表，建表要落到 dev 分支。共享库 / 单环境应用只有 online、在 online 建表正常成功（不会报 `k_dl_4000001`），省略 `--environment` 或填 `online` 均可。\n\n**配置格式**：只通过 `--config` 传完整 JSON，支持内联 JSON、`@file`、`-` stdin。配置 key 使用复数：`field_maps`、`option_mappings`、`syncable_source_fields`。不要写单数 `field_map` / `option_mapping`，CLI 会直接报 validation 错。正式 create 时 `field_maps` **可省略或传空数组**：服务端会使用与 preview 相同的逻辑自动匹配字段并直接创建任务；若显式传了映射，则至少要有一项未写成 `\"enabled\": false`，写了却全部关闭会被 CLI 拒绝。`+db-sync-update` 仍要求至少一个启用的 `field_maps`，因为 update 的语义是修改既有映射。`target.table.action` 只能是 `create` 或 `use_existing`：建表时 `pg_field` 需要完整字段定义；写已有表时通常只需目标列名。`source.base_url`（源 Base 表完整 URL）在 `+db-sync-create` 必填、由服务端强制；`+db-sync-update` 可选——省略时服务端复用原任务的源 URL，仅在换源 / 替换成另一张 Base 表时才需要传新的 `base_url`。`source.table.name` 是要同步的 Base 表名。`base_url` 形如 `https://.../base/<token>?table=<tableId>`：`token` 定位 Base，`table=` 参数（tableId）定位表。填了 `source.table.name` 就以 name 为准——服务端用 `token + name` 反查 tableId（覆盖 url 里的 `table=` 参数）；不填才用 url 的 `table=` 参数定位。所以用户自然语言里说「同步 xxx 表」「把 xxx 表同步过去」时，一定要把「xxx」填进 `source.table.name`，不要只给 `base_url`——尤其当 `base_url` 不带 `table=` 参数（指向不带具体表的 Base）时，漏了 name 服务端无从定位表。\n\n**不知道要同步哪张表**：若 `base_url` 只有域名+token、不带 `?table=` 参数，又不确定表名，别硬猜。先用 `lark-cli base +table-list --base-token <token>` 列出该 Base 的所有表（`<token>` 就是 `base_url` 里 `/base/` 后面那段），把表名给用户选定，再填进 `source.table.name`（或改用带 `?table=<table_id>` 的完整 URL）。`+db-sync-create` 会在本地就拦下「`base_url` 无 `?table=` 且 `source.table.name` 空」的配置（提交前即报 validation 错，不送到服务端）。\n\n**单数 key 恢复**：如果用户说配置里 `field_map` 是单数、`option_mapping` 是单数、或字段映射可能不生效，不要把原配置直接提交。先找到用户这份同步配置，做这三步：\n\n1. 只把已知 key 改成复数：`field_map` -> `field_maps`，`option_mapping` -> `option_mappings`；不要发明 `fieldMappings` / `mapping` 之类字段名。\n2. 检查 `field_maps` 是数组，且至少有一项 `enabled` 缺省或为 `true`。如果全是 `\"enabled\": false`，先让用户确认要启用哪几项，再继续。\n3. 修好后先重新 preview，或复用最近一次 preview `--output` 产出的 `data.config`，再继续 create / update。\n\n```bash\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @sync.json --preview --output ./resolved-sync.json\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @resolved-sync.json --yes\n```\n\n如果本地找不到配置文件，不要只停在“请提供文件”。先说明恢复来源：让用户贴失败时传入的 JSON，或查找最近 preview 的 `--output` 文件；如果是已有任务的修改，先用 `+db-sync-get` 取回当前任务配置，再基于它修正后 update：\n\n```bash\nlark-cli apps +db-sync-get --app-id app_xxx --task-id streaming_123 -q '.data | {mode, source, target, field_maps}' > sync.json\nlark-cli apps +db-sync-update --app-id app_xxx --task-id streaming_123 --environment dev --config @sync.json --yes\n```\n\n**推荐流程（最佳实践，不是强制）**：优先先 preview，再让用户确认映射，最后用 preview 输出的完整 config 正式创建；这样最稳，也避免手写复杂 `field_maps`。若用户明确要求直接执行、不需要 preview，也可以在 create config 中省略 `field_maps`（或传空数组），由服务端自动匹配并直接创建任务；CLI 不应为了拿 mapping 强制用户先 preview。\n\n```bash\nlark-cli apps +db-sync-create \\\n  --app-id app_xxx \\\n  --environment dev \\\n  --config - \\\n  --preview \\\n  --output ./resolved-sync.json <<'JSON'\n{\n  \"mode\": \"streaming\",\n  \"source\": {\n    \"type\": \"base\",\n    \"base_url\": \"https://example.feishu.cn/base/xxx\",\n    \"table\": {\"name\": \"客户\"}\n  },\n  \"target\": {\n    \"type\": \"postgresql\",\n    \"table\": {\"name\": \"customers\", \"action\": \"use_existing\"}\n  }\n}\nJSON\n```\n\npreview 返回 `data.config`、`syncable_source_fields` 和 `summary`。`--output` 只把 `data.config` 写入文件，文件可直接作为正式输入：\n\n```bash\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @resolved-sync.json --yes\nlark-cli apps +db-sync-get --app-id app_xxx --task-id streaming_123\n```\n\n**多表 Base**：本命令一次只处理一张表。用户要同步整个 Base 时，先把计划说清楚：不是一个“整库同步任务”，而是按表拆成 N 个单表任务。每张表各有一份配置文件、一次 `+db-sync-create --preview`、一次用户确认后的 `+db-sync-create --yes`，并记录各自 `task_id`。\n\n```bash\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @customers-sync.json --preview --output ./customers-resolved.json\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @orders-sync.json --preview --output ./orders-resolved.json\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @payments-sync.json --preview --output ./payments-resolved.json\n```\n\n配置也必须是单表粒度：每份 JSON 只有一个 `source.table` 和一个 `target.table`，字段名保持 `field_maps`、`option_mappings`、`syncable_source_fields` 这些复数 key。\n\n**修改 streaming 映射**：先用 get 导出当前配置，编辑 `field_maps` 后 update。update 是高危操作，必须经用户确认再加 `--yes`。\n\n`+db-sync-get` 返回的 `source` **不含 `base_url`**（只有 token / tableId，服务端没有 domain 拼不出完整 URL），这是正常的。原表 update 直接省略 `base_url` 即可；只有要换成另一张 Base 表时，才在 config 里显式补一个新的 `base_url`。不要为了\"补全\" `base_url` 而编造 domain 或拼接 URL——拿不到就省略，让服务端复用原任务的源 URL。\n\n`+db-sync-update` 也遵循 db-sync 家族「省略 `--environment` 落 online」的规则，所以改 dev 上的任务必须显式带该任务所在环境的 `--environment`（多环境应用的 streaming 任务通常在 `dev`），否则会错落 online、找不到任务或改错分支。\n\n```bash\nlark-cli apps +db-sync-get --app-id app_xxx --task-id streaming_123 -q '.data | {mode, source, target, field_maps}' > sync.json\nlark-cli apps +db-sync-update --app-id app_xxx --task-id streaming_123 --environment dev --config @sync.json --yes\n```\n\n**列表与生命周期**：\n\n```bash\nlark-cli apps +db-sync-list --app-id app_xxx --mode streaming --table customers\nlark-cli apps +db-sync-disable --app-id app_xxx --task-id streaming_123\nlark-cli apps +db-sync-enable --app-id app_xxx --task-id streaming_123\nlark-cli apps +db-sync-delete --app-id app_xxx --task-id streaming_123 --yes\n```\n\n`+db-sync-enable`、`+db-sync-disable`、`+db-sync-update`、`+db-sync-delete` 只适用于 `streaming_...` task。对 `batch_...` 执行这些操作会返回 failed-precondition。\n\n**batch 任务 operation-not-allowed 恢复**：用户说“批量任务重新启用”“导入历史订单表的任务重新 enable”“系统说操作不允许”时，先给生命周期结论：batch / import 类任务是一次性任务，完成或失败后不能重新启用，也不要反复调用 `+db-sync-enable`。下一步改为查状态和结果：\n\n```bash\nlark-cli apps +db-sync-get --app-id app_xxx --task-id batch_123\n```\n\n把 `status`、`result`、`warnings` 和目标表写入情况告诉用户。若用户要的是后续持续同步，不是“重启这个 batch”，应新建 `mode=streaming` 任务：先 `+db-sync-create --preview` 给用户确认映射和影响，再带 `--yes` 创建；不要强行 enable 已完成的 batch 任务。若此时 CLI 还缺授权，仍要先解释这个生命周期边界，再提示授权完成后用 `+db-sync-get` 查结果。\n\n**失败恢复**：看到 `warnings` 不要直接说同步成功。按 warning 或 error 的 `hint` 继续排查，恢复路径按任务 mode 分支：\n\n- **streaming 任务**：常见路径是 `+log-list --keyword <target_table>` / `+log-get` 查日志，然后用 `+db-execute` 修目标表结构，或用 `+db-sync-update`（带该任务所在环境的 `--environment`）修字段映射，最后对同一 `task_id` 再 `+db-sync-get` 复查。\n- **batch 任务**：batch 是一次性任务、**不能 update**（见上文生命周期）。修完目标表结构（`+db-execute`）后不要 update 原 batch，而是重新 `+db-sync-create --preview` 建新任务；只想看这个 batch 的结果就直接 `+db-sync-get`。\n\n若此时 CLI 还缺授权、查不到 warning 详情，也不要只给泛化的字段核对建议：先说明被授权卡住，再把对应 mode 的固定命令链作为授权完成后的下一步明确交代给用户。\n\n**online 禁 DDL（`k_dl_4000001`）恢复**：`+db-sync-create` 建表报 `k_dl_4000001：forbid ddl/dcl operation in online env` 时，这必然是多环境应用（共享库在 online 建表不会报此码）。online 分支**本就不允许**直接建表，这是多环境应用的产品设计、不是可绕过的限制。改用 `--environment dev` 重跑 `+db-sync-create`，把表建到 dev 分支；不要试图「在 online 想办法重试建表」，没有这个选项。\n\n**缺 Base 表记录 ID 映射列（`400002477`）恢复**：streaming 自动同步要求目标表有一个映射给「Base 表记录 ID」的 **text + 单值 + unique** 列。用 `action=use_existing` 写已有表时，若该表没有这样的列，会报 `400002477`（Field mapping must include 'Base 表记录 ID'）。先用 `+db-execute` 给表加一个，如 `ALTER TABLE <表> ADD COLUMN base_record_id varchar UNIQUE`，再把它映射给「Base 表记录 ID」、重跑 `+db-sync-create --preview`。注意这是**加列**、不是建表，不需要审计列 / RLS 那套建表规范。\n\n### 变更追溯与审计\n\n**`+db-changelog-list`**：查表结构变更（DDL）历史——谁、什么时候、改了哪张表、做了什么。可按 `--table` 过滤、按 `--change-id` 精确定位某条、用 `--since`/`--until` 圈时间区间，分页 `--page-size`/`--page-token`。\n\n```bash\nlark-cli apps +db-changelog-list --app-id app_xxx --table orders --since 7d\n```\n\n**`+db-audit-status`**：看审计开关状态。给 `--table` 看单表，不给则列出所有已配置的表（开没开、保留期）。\n\n**`+db-audit-enable` / `+db-audit-disable`**：开 / 关某张表的行级变更审计。`--retention` 设保留期，取值 `7d`/`30d`/`180d`/`360d`/`forever`（默认 `7d`）。不要对已经开启审计的表重复 enable——不确定就先用 `+db-audit-status` 查。\n\n```bash\nlark-cli apps +db-audit-enable --app-id app_xxx --table orders --retention 30d\nlark-cli apps +db-audit-disable --app-id app_xxx --table orders\n```\n\n**`+db-audit-list`**：列出表的行级变更事件（INSERT/UPDATE/DELETE 的前后值与操作人）。`--table` 必填、可重复传多张表；`--since`/`--until` 圈时间。\n- **多表查询**：会先帮用户把不存在、或没开审计的表过滤掉再查，被过滤的表及原因列在结果的 `skipped` 里——据此告诉用户哪些表没纳入及为什么。\n- **单表查询**：不预过滤，表不存在 / 未开审计会直接报错（按 `error.hint` 转述给用户，引导先 `+db-audit-enable`）。\n\n```bash\nlark-cli apps +db-audit-list --app-id app_xxx --table orders --since 24h\nlark-cli apps +db-audit-list --app-id app_xxx --table orders --table users\n```\n\n### 时间点恢复（PITR）\n\n**`+db-recovery-diff`**：预览把库恢复到 `--target` 时间点会带来哪些变更（受影响的表、行数、预计耗时），不落地。同样需 `spark:app:write` scope。\n\n**`+db-recovery-apply`（高危）**：把库恢复到某个时间点，**会覆盖当前数据**，不可逆，必须带 `--yes`。\n\n- 可恢复窗口最长 **7 天**，且不早于**最近一次 `+db-env-migrate`**；超出窗口的目标会被拒。\n- 目标时间点与当前库一致时返回 `no_changes`（空操作），不算失败。\n- 动手前务必先 `+db-recovery-diff` 给用户确认。\n\n```bash\nlark-cli apps +db-recovery-diff --app-id app_xxx --target 2h\nlark-cli apps +db-recovery-apply --app-id app_xxx --target 2026-04-15T10:00:00Z --yes\n```\n\n### 配额\n\n**`+db-quota-get`**：查数据库存储用量（已用量、表数、视图数；配额接入后还会给总配额与使用率）。\n\n```bash\nlark-cli apps +db-quota-get --app-id app_xxx --environment dev\n```\n\n## 时间格式（`--since` / `--until` / `--target`）\n\n按用户口语自然传入即可，支持：\n- 相对时间 `7d` / `2h` / `30s`（从现在往前推）\n- 日期 `2026-04-15`\n- 日期时间 `2026-04-15T10:00:00`\n- 带时区的 ISO 8601 `2026-04-15T10:00:00Z` / `2026-04-15T10:00:00+08:00`\n\n> **时区**：不带时区的 `日期` / `日期时间` 按**运行机器的本地时区**解析（再归一化到 UTC）。CI（UTC）与本地（如 UTC+8）跑同一条命令，时间边界会差几小时；要精确锁定时区时显式写 ISO 8601 带偏移（如 `...+08:00` / `...Z`）。`--target`（PITR 恢复）尤其建议带时区，避免恢复到非预期时间点。\n\n## Agent 规则\n\n- 用户说「本地 / 开发库 / 调试库」优先 `--environment dev`，线上排查用 `--environment online`；数据面写操作（导入 / 审计开关）建议先在 `dev` 验再动 `online`。**注意省略 `--environment` 时写操作会落到服务端选中的分支——单环境应用即 `online`（生产）**：不确定应用是否多环境时，写操作显式传 `--environment`；显式 `dev` 在单环境应用上会安全报错（无 dev 分支），正好当「是否多环境」的探针用。\n- 看表用 `+db-table-list`，看结构用 `+db-table-get`（要建表语句加 `--format pretty`）；`+db-env-create` 仅用于存量单库拆多环境，新建的 full_stack 应用一般不需要。\n- 高危命令（`+db-env-create`、`+db-data-import`、`+db-env-migrate`、`+db-recovery-apply`、`+db-sync-create`、`+db-sync-update`、`+db-sync-delete`）动手前先看清影响再带 `--yes`：发布 / 恢复先跑对应预览 `+db-env-diff` / `+db-recovery-diff`，Base 同步先跑 `+db-sync-create --preview`，导入无预览命令、可先 `--dry-run` 看请求或先在 `--environment dev` 验；不要静默追加 `--yes`，遇 confirmation_required（exit 10）按 lark-shared 协议向用户确认不可逆风险后再补 `--yes` 重试。\n- 导入 / 导出的本地路径用工作目录内相对路径；超大表导出会被行数 / 体积上限拒，改用 `+db-execute` 分批。\n- Base 同步优先走 preview → 用户确认 → create，这是最稳的最佳实践、不是强制。用户明确要求直接 create 时，可省略 `field_maps`（或传空数组）让服务端自动匹配并创建；不要为了拿 mapping 强制用户先 preview。显式写映射时使用 `field_maps` / `option_mappings` 复数 key。\n- 修复 Base 同步配置时，只把 `field_map` / `option_mapping` 改成 `field_maps` / `option_mappings`。若显式给了 `field_maps`，检查至少一个映射启用；全是 `\"enabled\": false` 时先让用户确认要启用哪项。create 也可删掉/置空 `field_maps` 交给服务端自动匹配，但 update 仍必须提供启用的映射。\n- `+db-sync-update` 省略 `source.base_url` 是合法的（服务端复用原任务源 URL）；`+db-sync-get` 不返回 `base_url` 属正常，不要因此编造 domain / 拼接 URL 去\"补全\"，只有换源 / 替换表时才传新的 `base_url`。`+db-sync-create` 的 `base_url` 必填，缺失由服务端报错。用户说「同步 xxx 表」时把「xxx」填进 `source.table.name`——填了 name 就以 name 为准（服务端用 `base_url` 的 token + name 反查 tableId，覆盖 url 的 `table=` 参数），不填才用 url 的 `table=` 参数定位；别只给 `base_url`。\n- batch 同步任务不能重新 enable。遇到 operation-not-allowed 先 `+db-sync-get` 查状态和结果；要持续同步就新建 streaming 任务，走 preview -> 用户确认 -> create。\n- `+db-sync-*` 省略 `--environment` 默认落 online。多环境应用建表（`action=create`）必须显式 `--environment dev`；省略或填 `online` 会撞 `k_dl_4000001`（online 禁 DDL）——那是多环境应用的产品设计，把表建到 dev 分支即可，不要在 online 重试建表。共享库应用在 online 建表正常，不受此限。\n- `+db-audit-list` 多表查询时，把结果里 `skipped` 的表（不存在 / 未开审计）连同原因一并向用户说明，不要让用户以为这些表「没有变更」。\n- 恢复是覆盖式且不可逆：`+db-recovery-apply` 前必须先 `+db-recovery-diff`，并明确告知用户会覆盖当前数据。\n","skills/lark-apps/references/lark-apps-env-pull.md":"# apps +env-pull\n\n> **前置条件：** 先阅读 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md)（认证 / 全局参数 / 安全）。\n\n把妙搭应用 dev 启动期环境变量拉取到本地项目根的 `.env.local`。身份固定 `--as user`；scope `spark:app:read`。`--app-id` 必填，目标项目根默认当前工作目录（`--project-path` 可指定）。\n\n这个命令是 dev-only 的本地恢复工具：内部固定 `POST env_vars`，body 为 `env=dev`。它没有 `--env` flag，也不管理线上环境变量。\n\n## 何时别用（核心反模式）\n\n**通常不需要手动跑**——脚手架的 `npm run dev` 在起本地开发时会自动后台拉取（非阻塞）。手动再跑会重复做同样的事，并用服务端返回值覆盖 `.env.local` 里的同名 key；本地无关行和注释会保留。\n\n只在这些兜底场景用：\n\n- 不通过 `npm run dev` 启动（直接跑 `node` / IDE debug）。\n- `.env.local` 被改坏 / 删除，想重新同步。\n\n## 行为\n\n- **合并、不清空**：写入 `.env.local` 时保留你手写的内容与注释——命中的 key 替换值，新 key 追加，不整体覆盖。\n- **安全护栏**：返回的 envelope **不会回显任何 env key / value**（防止 token / 数据库凭据泄漏到日志或 CI 输出）。要看实际值请直接读 `.env.local`。\n\n## 示例\n\n```bash\nlark-cli apps +env-pull --app-id <app_id>\n```\n\n## 失败处理\n\n`missing_scope`（没拿到 `spark:app:read`）时，按 lark-shared 引导 `lark-cli auth login --domain apps`。其余失败优先转述 `error.hint` / `error.message`。\n\n## 参考\n\n- [lark-apps](../SKILL.md) — 妙搭应用全部命令 + 心智模型\n- [lark-apps-local-dev](lark-apps-local-dev.md) — 本地应用开发端到端流程\n- [lark-shared](../../lark-shared/SKILL.md) — 认证和全局参数\n","skills/lark-apps/references/lark-apps-env.md":"# apps env\n\n> **前置条件：** 先阅读 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md)（认证 / 全局参数 / 安全）。\n\n管理妙搭应用环境变量。查看用 `+env-list`，设置用 `+env-set`，删除用 `+env-delete`。没有单变量 get 命令；要确认某个 key 是否存在，使用 list 后用 `--jq` 过滤。\n\n环境 flag 使用 `--environment`；不要使用旧的 `--env`，也不要使用短选项。\n\n## 查看\n\n`+env-list` 默认查 dev，且默认不返回 value。只有显式传 `--include-values` 后，响应中才可能出现变量值；不要在公开日志里展示带值输出。\n\n接口契约：list 使用 `POST env_vars`，body 固定包含 `env` 和 CLI 场景 `scene=2`；set 使用 `POST create_or_update_env_var`；delete 使用 `POST delete_env_vars`。`--include-values` 只控制 CLI 输出是否展示 value，不作为服务端查询参数发送。\n\n```bash\nlark-cli apps +env-list --app-id <app_id>\nlark-cli apps +env-list --app-id <app_id> --environment online\nlark-cli apps +env-list --app-id <app_id> --include-values --jq '.data.items[] | select(.key == \"FOO\")'\n```\n\n## 设置\n\ndev 环境设置不需要 `--yes`。设置 online 环境需要人类确认并显式传 `--yes`；如果用户在同一轮已经明确说“确认/直接执行”，视为已确认，直接带 `--yes`，不要再次追问。`--dry-run` 可用于预览请求且不需要 `--yes`。变量值支持直接传 `<value>`，也支持 `@file` 或 stdin 输入。\n\n回复中只说明 app/env/key 和执行结果；不要回显真实 value。需要举例时使用 `<value>`、`@file` 或 stdin。\n\n```bash\nlark-cli apps +env-set --app-id <app_id> --key FOO --value <value>\nlark-cli apps +env-set --app-id <app_id> --key FOO --value @./secret.txt\nlark-cli apps +env-set --app-id <app_id> --environment online --key FOO --value <value> --dry-run\nlark-cli apps +env-set --app-id <app_id> --environment online --key FOO --value <value> --yes\n```\n\n## 删除\n\n`+env-delete` 是 high-risk-write。尊重 exit 10 confirmation protocol：先让用户确认 app/env/key 和删除后果，再传 `--yes`。不要自动补 `--yes`。如果只是认证失败后让用户重登，重登完成不等于删除确认；继续删除前仍需确认。\n\n```bash\nlark-cli apps +env-delete --app-id <app_id> --key FOO --dry-run\nlark-cli apps +env-delete --app-id <app_id> --key FOO --yes\nlark-cli apps +env-delete --app-id <app_id> --environment online --key FOO --yes\n```\n\n## 反模式\n\n- 不要把 `+env-pull` 当成环境变量管理命令；它只是刷新本地 `.env.local` 的兜底工具。\n- 不要为了看一个变量臆造名为 env-get 的 apps shortcut；用 `+env-list --include-values` 加 `--jq`。\n- 不要把真实 secret 写进示例或对话输出；需要示例时使用 `<value>`、`@file` 或 stdin。\n","skills/lark-apps/references/lark-apps-export.md":"# apps +export\n\n`+export` 把妙搭应用的源码打成 zip 下载到本地。运行时命令事实以 `lark-cli apps +export --help` 为准。\n\n## 何时用\n\n只要一份源码快照的场景：读代码、审计、归档、做静态分析、把源码喂给别的工具。用户丢来一个妙搭应用链接要你「看看 / 分析 / 总结」时也用它：导出后解压读源码，页面文案和数据通常就在 HTML / 组件里。\n\n**跨应用是它相对 `+init` 的核心价值**：创意应用的分享链接（`/page/<token>`）指向别人的应用，你对那个仓库没有权限，`git clone` 走不通；`+export` 只要求你对该应用有下载权限。\n\n## 不要用它的时候\n\n要继续开发就用 `+init`，不要用 `+export` 再手动 `git init`。两者产出不同：\n\n| | `+export` | `+init` |\n|---|---|---|\n| 产出 | 一个 zip | 完整 git 工作区 |\n| Git 凭证 | 不配 | 配好，可 push |\n| 本地环境变量 | 不拉 | 拉 `.env.local` |\n| 前提 | 对应用有下载权限 | 对**仓库**有权限 |\n\n用 `+export` 拿到的目录没有 git 历史、没有远端、没有凭证，改完发不回去。\n\n## 导出的是「最后一次提交」，不是沙箱当前状态\n\n服务端对远端仓库跑 `git archive`，从不读沙箱文件系统。用户在沙箱里改了文件但没提交或发布，**那些改动不在归档里**。\n\n这是设计如此，不是缺陷。若导出结果看起来\"少了刚写的代码\"，先确认改动是否已提交，而不是重试导出。\n\n## 命令骨架\n\n- `--app-id` 与 `--meta-token` **恰传其一**：前者是自己的应用，后者是分享链接里的 token。\n  两者作为独立字段走 `POST /apps/export` 的请求体（`app_id` / `meta_token`），服务端按传入的\n  字段区分，不再共用 path 段——调用方只有 token、没有 app_id 时也不用在路径里凑一个占位值。\n  - 两者都只收**裸标识符**。拿到的是整条链接（`.../app/<app_id>` 或 `.../page/<token>`）时，\n    只传最后一段——整条 URL 传进来会被本地拦下并提示，不会变成一个看起来像\"应用不存在\"的 404。\n- `--output` 可选，相对当前目录；省略时用服务端给的文件名（通常是 `<app_id>.zip`）。\n\n## 示例\n\n```bash\nlark-cli apps +export --app-id app_xxx --output ./src.zip\nlark-cli apps +export --app-id app_xxx                      # 存成 ./app_xxx.zip\nlark-cli apps +export --meta-token <share-token>            # 别人分享给你的应用\nlark-cli apps +export --app-id app_xxx --dry-run\n```\n\n## 输出契约\n\n- 成功时 stdout 是 JSON envelope，含 `output`（落盘的绝对路径）与 `size_bytes`；传了 `--app-id` 时还会回显 `app_id`。\n- 归档以流式写盘，不会整包驻留内存，大仓库也安全。\n- 失败时不会留下半个文件。\n\n## 错误处理\n\n| 情况 | 怎么办 |\n|---|---|\n| 应用尚未发布（`code 40901 app not published`） | 该应用是产物托管形态（如静态 HTML 应用），导出的是「最新已发布产物」，而它还没有成功发布过版本，此刻没有可导的东西。**先发布应用再重试**——不是 app_id 写错，重试也没用 |\n| 权限不足（HTTP 403，或 HTTP 200 + `code 40300`；两者都表现为 `permission_denied`） | 你需要该应用的下载权限。**持有分享 token、能打开页面都不等于有下载权限**。重试和换参数都没用，向用户说明需找应用所有者授权 |\n| 应用不存在（404） | 用 `+list --keyword <name>` 核对 app_id |\n| 归档过大（413） | 超出导出体积上限，改用 `+git-credential-init` + 原生 git clone |\n| 参数报错 | `--app-id` 与 `--meta-token` 只能给一个，且必须给一个；两者都要裸标识符（不是整条链接） |\n","skills/lark-apps/references/lark-apps-file.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-file.md -->","skills/lark-apps/references/lark-apps-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-get.md -->","skills/lark-apps/references/lark-apps-git-credential.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-git-credential.md -->","skills/lark-apps/references/lark-apps-html-publish.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-html-publish.md -->","skills/lark-apps/references/lark-apps-init.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-init.md -->","skills/lark-apps/references/lark-apps-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-list.md -->","skills/lark-apps/references/lark-apps-local-dev.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-local-dev.md -->","skills/lark-apps/references/lark-apps-observability.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-observability.md -->","skills/lark-apps/references/lark-apps-openapi-key.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-openapi-key.md -->","skills/lark-apps/references/lark-apps-plugin-install.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-plugin-install.md -->","skills/lark-apps/references/lark-apps-plugin-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-plugin-list.md -->","skills/lark-apps/references/lark-apps-plugin-uninstall.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-plugin-uninstall.md -->","skills/lark-apps/references/lark-apps-release-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-release-create.md -->","skills/lark-apps/references/lark-apps-release-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-release-get.md -->","skills/lark-apps/references/lark-apps-release-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-release-list.md -->","skills/lark-apps/references/lark-apps-role.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-role.md -->","skills/lark-apps/references/lark-apps-session-messages-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-session-messages-list.md -->","skills/lark-apps/references/lark-apps-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-update.md -->","skills/lark-apps/references/lark-apps-user-id-convert.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-user-id-convert.md -->","skills/lark-attendance/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-attendance%2FSKILL.md -->","skills/lark-base/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2FSKILL.md -->","skills/lark-base/references/lark-base-advanced-permission-and-role.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-advanced-permission-and-role.md -->","skills/lark-base/references/lark-base-app-block-data-config.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-app-block-data-config.md -->","skills/lark-base/references/lark-base-app.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-app.md -->","skills/lark-base/references/lark-base-dashboard-block-config.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-dashboard-block-config.md -->","skills/lark-base/references/lark-base-dashboard-block-get-data.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-dashboard-block-get-data.md -->","skills/lark-base/references/lark-base-dashboard.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-dashboard.md -->","skills/lark-base/references/lark-base-data-query.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-data-query.md -->","skills/lark-base/references/lark-base-field-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-create.md -->","skills/lark-base/references/lark-base-field-extension.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-extension.md -->","skills/lark-base/references/lark-base-field-formula.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-formula.md -->","skills/lark-base/references/lark-base-field-lookup.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-lookup.md -->","skills/lark-base/references/lark-base-field-schema.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-schema.md -->","skills/lark-base/references/lark-base-field-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-update.md -->","skills/lark-base/references/lark-base-filter-condition.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-filter-condition.md -->","skills/lark-base/references/lark-base-form-detail.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-form-detail.md -->","skills/lark-base/references/lark-base-form-questions-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-form-questions-create.md -->","skills/lark-base/references/lark-base-form-questions-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-form-questions-update.md -->","skills/lark-base/references/lark-base-form-submit.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-form-submit.md -->","skills/lark-base/references/lark-base-record-history-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-record-history-list.md -->","skills/lark-base/references/lark-base-record-query-and-analysis-sop.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-record-query-and-analysis-sop.md -->","skills/lark-base/references/lark-base-role-config.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-role-config.md -->","skills/lark-base/references/lark-base-template-center.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-template-center.md -->","skills/lark-base/references/lark-base-view-set-filter.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-view-set-filter.md -->","skills/lark-base/references/lark-base-view.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-view.md -->","skills/lark-base/references/lark-base-workflow-schema.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-workflow-schema.md -->","skills/lark-base/references/lark-base-workflow.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-workflow.md -->","skills/lark-calendar/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2FSKILL.md -->","skills/lark-calendar/references/lark-calendar-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-create.md -->","skills/lark-calendar/references/lark-calendar-join-event.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-join-event.md -->","skills/lark-calendar/references/lark-calendar-list-attendees.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-list-attendees.md -->","skills/lark-calendar/references/lark-calendar-meeting-relation.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-meeting-relation.md -->","skills/lark-calendar/references/lark-calendar-meeting.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-meeting.md -->","skills/lark-calendar/references/lark-calendar-recurring.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-recurring.md -->","skills/lark-calendar/references/lark-calendar-room-find.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-room-find.md -->","skills/lark-calendar/references/lark-calendar-rsvp.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-rsvp.md -->","skills/lark-calendar/references/lark-calendar-schedule-clear-time.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-schedule-clear-time.md -->","skills/lark-calendar/references/lark-calendar-schedule-fuzzy-time.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-schedule-fuzzy-time.md -->","skills/lark-calendar/references/lark-calendar-schedule-meeting.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-schedule-meeting.md -->","skills/lark-calendar/references/lark-calendar-suggestion.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-suggestion.md -->","skills/lark-calendar/references/lark-calendar-transfer.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-transfer.md -->","skills/lark-calendar/references/lark-calendar-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-update.md -->","skills/lark-contact/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-contact%2FSKILL.md -->","skills/lark-contact/references/lark-contact-get-user.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-contact%2Freferences%2Flark-contact-get-user.md -->","skills/lark-contact/references/lark-contact-search-bot.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-contact%2Freferences%2Flark-contact-search-bot.md -->","skills/lark-contact/references/lark-contact-search-user.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-contact%2Freferences%2Flark-contact-search-user.md -->","skills/lark-doc/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2FSKILL.md -->","skills/lark-doc/references/genres/business-analysis.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fbusiness-analysis.md -->","skills/lark-doc/references/genres/data-report.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fdata-report.md -->","skills/lark-doc/references/genres/email.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Femail.md -->","skills/lark-doc/references/genres/execution-plan.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fexecution-plan.md -->","skills/lark-doc/references/genres/formal-doc.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fformal-doc.md -->","skills/lark-doc/references/genres/meeting-minutes.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fmeeting-minutes.md -->","skills/lark-doc/references/genres/memo-brief.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fmemo-brief.md -->","skills/lark-doc/references/genres/official-redhead.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fofficial-redhead.md -->","skills/lark-doc/references/genres/prd.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fprd.md -->","skills/lark-doc/references/genres/proposal.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fproposal.md -->","skills/lark-doc/references/genres/research-report.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fresearch-report.md -->","skills/lark-doc/references/genres/retrospective.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fretrospective.md -->","skills/lark-doc/references/genres/route-consumer.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-consumer.md -->","skills/lark-doc/references/genres/route-creative.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-creative.md -->","skills/lark-doc/references/genres/route-knowledge.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-knowledge.md -->","skills/lark-doc/references/genres/route-marketing.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-marketing.md -->","skills/lark-doc/references/genres/route-media.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-media.md -->","skills/lark-doc/references/genres/route-opinion.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-opinion.md -->","skills/lark-doc/references/genres/route-personal-brand.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-personal-brand.md -->","skills/lark-doc/references/genres/route-platform.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-platform.md -->","skills/lark-doc/references/genres/route-report.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-report.md -->","skills/lark-doc/references/genres/route-workplace.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-workplace.md -->","skills/lark-doc/references/genres/sop-tutorial.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fsop-tutorial.md -->","skills/lark-doc/references/genres/technical-doc.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Ftechnical-doc.md -->","skills/lark-doc/references/genres/wechat.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fwechat.md -->","skills/lark-doc/references/genres/weekly-report.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fweekly-report.md -->","skills/lark-doc/references/genres/white-paper.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fwhite-paper.md -->","skills/lark-doc/references/genres/xiaohongshu.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fxiaohongshu.md -->","skills/lark-doc/references/lark-doc-create-workflow.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-create-workflow.md -->","skills/lark-doc/references/lark-doc-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-create.md -->","skills/lark-doc/references/lark-doc-fetch.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-fetch.md -->","skills/lark-doc/references/lark-doc-history.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-history.md -->","skills/lark-doc/references/lark-doc-md.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-md.md -->","skills/lark-doc/references/lark-doc-media-download.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-media-download.md -->","skills/lark-doc/references/lark-doc-media-insert.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-media-insert.md -->","skills/lark-doc/references/lark-doc-media-preview.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-media-preview.md -->","skills/lark-doc/references/lark-doc-mindnote.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-mindnote.md -->","skills/lark-doc/references/lark-doc-resource-cover.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-resource-cover.md -->","skills/lark-doc/references/lark-doc-script.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-script.md -->","skills/lark-doc/references/lark-doc-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-update.md -->","skills/lark-doc/references/lark-doc-whiteboard.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-whiteboard.md -->","skills/lark-doc/references/lark-doc-xml-extended-blocks.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-xml-extended-blocks.md -->","skills/lark-doc/references/lark-doc-xml.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-xml.md -->","skills/lark-drive/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2FSKILL.md -->","skills/lark-drive/references/lark-drive-add-comment.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-add-comment.md -->","skills/lark-drive/references/lark-drive-add-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-add-reply.md -->","skills/lark-drive/references/lark-drive-apply-permission.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-apply-permission.md -->","skills/lark-drive/references/lark-drive-batch-query-comments.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-batch-query-comments.md -->","skills/lark-drive/references/lark-drive-comment-content.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-comment-content.md -->","skills/lark-drive/references/lark-drive-comment-location.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-comment-location.md -->","skills/lark-drive/references/lark-drive-copy.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-copy.md -->","skills/lark-drive/references/lark-drive-cover.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-cover.md -->","skills/lark-drive/references/lark-drive-create-folder.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-create-folder.md -->","skills/lark-drive/references/lark-drive-create-shortcut.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-create-shortcut.md -->","skills/lark-drive/references/lark-drive-delete-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-delete-reply.md -->","skills/lark-drive/references/lark-drive-delete.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-delete.md -->","skills/lark-drive/references/lark-drive-download.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-download.md -->","skills/lark-drive/references/lark-drive-export-download.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-export-download.md -->","skills/lark-drive/references/lark-drive-export.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-export.md -->","skills/lark-drive/references/lark-drive-files-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-files-list.md -->","skills/lark-drive/references/lark-drive-import.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-import.md -->","skills/lark-drive/references/lark-drive-inspect.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-inspect.md -->","skills/lark-drive/references/lark-drive-list-comments.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-list-comments.md -->","skills/lark-drive/references/lark-drive-list-replies.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-list-replies.md -->","skills/lark-drive/references/lark-drive-member-add.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-member-add.md -->","skills/lark-drive/references/lark-drive-member-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-member-list.md -->","skills/lark-drive/references/lark-drive-member-remove.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-member-remove.md -->","skills/lark-drive/references/lark-drive-move.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-move.md -->","skills/lark-drive/references/lark-drive-permission-get-setting.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-permission-get-setting.md -->","skills/lark-drive/references/lark-drive-permission-guide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-permission-guide.md -->","skills/lark-drive/references/lark-drive-preview.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-preview.md -->","skills/lark-drive/references/lark-drive-pull.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-pull.md -->","skills/lark-drive/references/lark-drive-push.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-push.md -->","skills/lark-drive/references/lark-drive-react-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-react-reply.md -->","skills/lark-drive/references/lark-drive-reactions.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-reactions.md -->","skills/lark-drive/references/lark-drive-resolve-comment.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-resolve-comment.md -->","skills/lark-drive/references/lark-drive-restore-comment.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-restore-comment.md -->","skills/lark-drive/references/lark-drive-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-search.md -->","skills/lark-drive/references/lark-drive-secure-label.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-secure-label.md -->","skills/lark-drive/references/lark-drive-status.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-status.md -->","skills/lark-drive/references/lark-drive-task-result.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-task-result.md -->","skills/lark-drive/references/lark-drive-update-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-update-reply.md -->","skills/lark-drive/references/lark-drive-update-title.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-update-title.md -->","skills/lark-drive/references/lark-drive-upload.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-upload.md -->","skills/lark-drive/references/lark-drive-version-delete.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-version-delete.md -->","skills/lark-drive/references/lark-drive-version-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-version-get.md -->","skills/lark-drive/references/lark-drive-version-history.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-version-history.md -->","skills/lark-drive/references/lark-drive-version-revert.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-version-revert.md -->","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-analysis.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-analysis.md -->","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-discovery.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-discovery.md -->","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-execution.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-execution.md -->","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-planning.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-planning.md -->","skills/lark-drive/references/lark-drive-workflow-knowledge-organize-rollback.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-rollback.md -->","skills/lark-drive/references/lark-drive-workflow-knowledge-organize.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize.md -->","skills/lark-drive/references/lark-drive-workflow-permission-governance-commands.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-permission-governance-commands.md -->","skills/lark-drive/references/lark-drive-workflow-permission-governance-outputs.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-permission-governance-outputs.md -->","skills/lark-drive/references/lark-drive-workflow-permission-governance.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-permission-governance.md -->","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-execute.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-execute.md -->","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-recall.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-recall.md -->","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-resolve-verify.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-resolve-verify.md -->","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-review-plan.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-review-plan.md -->","skills/lark-drive/references/lark-drive-workflow-topic-move-collector-setup.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-setup.md -->","skills/lark-drive/references/lark-drive-workflow-topic-move-collector.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector.md -->","skills/lark-drive/references/lark-drive-workflow.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow.md -->","skills/lark-event/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2FSKILL.md -->","skills/lark-event/references/lark-event-application.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-application.md -->","skills/lark-event/references/lark-event-approval.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-approval.md -->","skills/lark-event/references/lark-event-im.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-im.md -->","skills/lark-event/references/lark-event-minutes.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-minutes.md -->","skills/lark-event/references/lark-event-task.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-task.md -->","skills/lark-event/references/lark-event-vc.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-vc.md -->","skills/lark-event/references/lark-event-whiteboard.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-whiteboard.md -->","skills/lark-im/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2FSKILL.md -->","skills/lark-im/references/card/card-2.0-schema.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcard-2.0-schema.md -->","skills/lark-im/references/card/components/button.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fbutton.md -->","skills/lark-im/references/card/components/chart.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fchart.md -->","skills/lark-im/references/card/components/checker.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fchecker.md -->","skills/lark-im/references/card/components/collapsible_panel.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fcollapsible_panel.md -->","skills/lark-im/references/card/components/column_set.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fcolumn_set.md -->","skills/lark-im/references/card/components/date_picker.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fdate_picker.md -->","skills/lark-im/references/card/components/div.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fdiv.md -->","skills/lark-im/references/card/components/form.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fform.md -->","skills/lark-im/references/card/components/header.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fheader.md -->","skills/lark-im/references/card/components/hr.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fhr.md -->","skills/lark-im/references/card/components/img.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fimg.md -->","skills/lark-im/references/card/components/img_combination.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fimg_combination.md -->","skills/lark-im/references/card/components/input.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Finput.md -->","skills/lark-im/references/card/components/interactive_container.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Finteractive_container.md -->","skills/lark-im/references/card/components/markdown.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fmarkdown.md -->","skills/lark-im/references/card/components/multi_select_person.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fmulti_select_person.md -->","skills/lark-im/references/card/components/multi_select_static.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fmulti_select_static.md -->","skills/lark-im/references/card/components/overflow.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Foverflow.md -->","skills/lark-im/references/card/components/person.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fperson.md -->","skills/lark-im/references/card/components/person_list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fperson_list.md -->","skills/lark-im/references/card/components/picker_datetime.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fpicker_datetime.md -->","skills/lark-im/references/card/components/picker_time.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fpicker_time.md -->","skills/lark-im/references/card/components/recycling_container.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Frecycling_container.md -->","skills/lark-im/references/card/components/select_img.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fselect_img.md -->","skills/lark-im/references/card/components/select_person.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fselect_person.md -->","skills/lark-im/references/card/components/select_static.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fselect_static.md -->","skills/lark-im/references/card/components/table.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Ftable.md -->","skills/lark-im/references/card/lark-im-card-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Flark-im-card-create.md -->","skills/lark-im/references/card/lark-im-card-style.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Flark-im-card-style.md -->","skills/lark-im/references/card/resource/colors.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fresource%2Fcolors.md -->","skills/lark-im/references/card/resource/icons.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fresource%2Ficons.md -->","skills/lark-im/references/lark-im-card-action-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-card-action-reply.md -->","skills/lark-im/references/lark-im-chat-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-create.md -->","skills/lark-im/references/lark-im-chat-identity.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-identity.md -->","skills/lark-im/references/lark-im-chat-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-list.md -->","skills/lark-im/references/lark-im-chat-members-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-members-list.md -->","skills/lark-im/references/lark-im-chat-messages-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-messages-list.md -->","skills/lark-im/references/lark-im-chat-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-search.md -->","skills/lark-im/references/lark-im-chat-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-update.md -->","skills/lark-im/references/lark-im-feed-group-list-item.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-group-list-item.md -->","skills/lark-im/references/lark-im-feed-group-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-group-list.md -->","skills/lark-im/references/lark-im-feed-group-query-item.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-group-query-item.md -->","skills/lark-im/references/lark-im-feed-groups.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-groups.md -->","skills/lark-im/references/lark-im-feed-shortcut-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-shortcut-create.md -->","skills/lark-im/references/lark-im-feed-shortcut-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-shortcut-list.md -->","skills/lark-im/references/lark-im-feed-shortcut-remove.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-shortcut-remove.md -->","skills/lark-im/references/lark-im-flag-cancel.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-flag-cancel.md -->","skills/lark-im/references/lark-im-flag-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-flag-create.md -->","skills/lark-im/references/lark-im-flag-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-flag-list.md -->","skills/lark-im/references/lark-im-message-enrichment.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-message-enrichment.md -->","skills/lark-im/references/lark-im-message-read-status.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-message-read-status.md -->","skills/lark-im/references/lark-im-messages-edit.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-edit.md -->","skills/lark-im/references/lark-im-messages-mget.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-mget.md -->","skills/lark-im/references/lark-im-messages-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-reply.md -->","skills/lark-im/references/lark-im-messages-resources-download.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-resources-download.md -->","skills/lark-im/references/lark-im-messages-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-search.md -->","skills/lark-im/references/lark-im-messages-send.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-send.md -->","skills/lark-im/references/lark-im-reactions.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-reactions.md -->","skills/lark-im/references/lark-im-threads-messages-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-threads-messages-list.md -->","skills/lark-mail/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2FSKILL.md -->","skills/lark-mail/references/lark-mail-calendar-invite.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-calendar-invite.md -->","skills/lark-mail/references/lark-mail-decline-receipt.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-decline-receipt.md -->","skills/lark-mail/references/lark-mail-draft-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-draft-create.md -->","skills/lark-mail/references/lark-mail-draft-edit.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-draft-edit.md -->","skills/lark-mail/references/lark-mail-forward.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-forward.md -->","skills/lark-mail/references/lark-mail-html.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-html.md -->","skills/lark-mail/references/lark-mail-lint-html.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-lint-html.md -->","skills/lark-mail/references/lark-mail-message-modify.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-message-modify.md -->","skills/lark-mail/references/lark-mail-message-trash.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-message-trash.md -->","skills/lark-mail/references/lark-mail-message.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-message.md -->","skills/lark-mail/references/lark-mail-messages.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-messages.md -->","skills/lark-mail/references/lark-mail-recall.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-recall.md -->","skills/lark-mail/references/lark-mail-recipient-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-recipient-search.md -->","skills/lark-mail/references/lark-mail-reply-all.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-reply-all.md -->","skills/lark-mail/references/lark-mail-reply.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-reply.md -->","skills/lark-mail/references/lark-mail-rules.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-rules.md -->","skills/lark-mail/references/lark-mail-send-as.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-send-as.md -->","skills/lark-mail/references/lark-mail-send-receipt.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-send-receipt.md -->","skills/lark-mail/references/lark-mail-send-status.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-send-status.md -->","skills/lark-mail/references/lark-mail-send.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-send.md -->","skills/lark-mail/references/lark-mail-share-to-chat.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-share-to-chat.md -->","skills/lark-mail/references/lark-mail-signature.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-signature.md -->","skills/lark-mail/references/lark-mail-template-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-template-create.md -->","skills/lark-mail/references/lark-mail-template-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-template-update.md -->","skills/lark-mail/references/lark-mail-template.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-template.md -->","skills/lark-mail/references/lark-mail-thread-modify.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-thread-modify.md -->","skills/lark-mail/references/lark-mail-thread-trash.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-thread-trash.md -->","skills/lark-mail/references/lark-mail-thread.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-thread.md -->","skills/lark-mail/references/lark-mail-triage.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-triage.md -->","skills/lark-mail/references/lark-mail-watch.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-watch.md -->","skills/lark-markdown/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2FSKILL.md -->","skills/lark-markdown/references/lark-markdown-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-create.md -->","skills/lark-markdown/references/lark-markdown-diff.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-diff.md -->","skills/lark-markdown/references/lark-markdown-fetch.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-fetch.md -->","skills/lark-markdown/references/lark-markdown-overwrite.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-overwrite.md -->","skills/lark-markdown/references/lark-markdown-patch.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-patch.md -->","skills/lark-meeting/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2FSKILL.md -->","skills/lark-meeting/references/lark-minutes-apply-permission.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-apply-permission.md -->","skills/lark-meeting/references/lark-minutes-detail.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-detail.md -->","skills/lark-meeting/references/lark-minutes-download.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-download.md -->","skills/lark-meeting/references/lark-minutes-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-search.md -->","skills/lark-meeting/references/lark-minutes-speaker-replace.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-speaker-replace.md -->","skills/lark-meeting/references/lark-minutes-summary.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-summary.md -->","skills/lark-meeting/references/lark-minutes-todo.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-todo.md -->","skills/lark-meeting/references/lark-minutes-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-update.md -->","skills/lark-meeting/references/lark-minutes-upload.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-upload.md -->","skills/lark-meeting/references/lark-note-detail.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-note-detail.md -->","skills/lark-meeting/references/lark-note-transcript.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-note-transcript.md -->","skills/lark-meeting/references/lark-vc-agent-meeting-end.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-agent-meeting-end.md -->","skills/lark-meeting/references/lark-vc-agent-meeting-invite.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-agent-meeting-invite.md -->","skills/lark-meeting/references/lark-vc-agent-meeting-join.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-agent-meeting-join.md -->","skills/lark-meeting/references/lark-vc-agent-meeting-leave.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-agent-meeting-leave.md -->","skills/lark-meeting/references/lark-vc-detail.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-detail.md -->","skills/lark-meeting/references/lark-vc-meeting-countdown.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-countdown.md -->","skills/lark-meeting/references/lark-vc-meeting-events.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-events.md -->","skills/lark-meeting/references/lark-vc-meeting-list-active.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-list-active.md -->","skills/lark-meeting/references/lark-vc-meeting-message-send.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-message-send.md -->","skills/lark-meeting/references/lark-vc-meeting-screenshot.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-screenshot.md -->","skills/lark-meeting/references/lark-vc-recording.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-recording.md -->","skills/lark-meeting/references/lark-vc-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-search.md -->","skills/lark-meeting/scenes/create-and-edit-minutes.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Fcreate-and-edit-minutes.md -->","skills/lark-meeting/scenes/live-meeting-attend.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Flive-meeting-attend.md -->","skills/lark-meeting/scenes/live-meeting-interact.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Flive-meeting-interact.md -->","skills/lark-meeting/scenes/query-meeting-and-artifacts.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Fquery-meeting-and-artifacts.md -->","skills/lark-meeting/scenes/query-minutes-and-artifacts.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Fquery-minutes-and-artifacts.md -->","skills/lark-meeting/scenes/query-note-and-artifacts.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Fquery-note-and-artifacts.md -->","skills/lark-minutes/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-minutes%2FSKILL.md -->","skills/lark-note/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-note%2FSKILL.md -->","skills/lark-okr/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2FSKILL.md -->","skills/lark-okr/references/lark-okr-alignments.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-alignments.md -->","skills/lark-okr/references/lark-okr-batch-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-batch-create.md -->","skills/lark-okr/references/lark-okr-comment-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-create.md -->","skills/lark-okr/references/lark-okr-comment-delete.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-delete.md -->","skills/lark-okr/references/lark-okr-comment-detail.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-detail.md -->","skills/lark-okr/references/lark-okr-comment-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-get.md -->","skills/lark-okr/references/lark-okr-comment-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-list.md -->","skills/lark-okr/references/lark-okr-comment-patch.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-patch.md -->","skills/lark-okr/references/lark-okr-comment-solve-reopen.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-solve-reopen.md -->","skills/lark-okr/references/lark-okr-contentblock.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-contentblock.md -->","skills/lark-okr/references/lark-okr-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-create.md -->","skills/lark-okr/references/lark-okr-cycle-detail.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-cycle-detail.md -->","skills/lark-okr/references/lark-okr-cycle-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-cycle-list.md -->","skills/lark-okr/references/lark-okr-entities.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-entities.md -->","skills/lark-okr/references/lark-okr-image-upload.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-image-upload.md -->","skills/lark-okr/references/lark-okr-indicator-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-indicator-update.md -->","skills/lark-okr/references/lark-okr-indicators.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-indicators.md -->","skills/lark-okr/references/lark-okr-patch.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-patch.md -->","skills/lark-okr/references/lark-okr-progress-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-create.md -->","skills/lark-okr/references/lark-okr-progress-delete.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-delete.md -->","skills/lark-okr/references/lark-okr-progress-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-get.md -->","skills/lark-okr/references/lark-okr-progress-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-list.md -->","skills/lark-okr/references/lark-okr-progress-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-update.md -->","skills/lark-okr/references/lark-okr-reorder.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-reorder.md -->","skills/lark-okr/references/lark-okr-weight.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-weight.md -->","skills/lark-openapi-explorer/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-openapi-explorer%2FSKILL.md -->","skills/lark-shared/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2FSKILL.md -->","skills/lark-shared/references/lark-shared-config-init.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-config-init.md -->","skills/lark-shared/references/lark-shared-high-risk-approval.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-high-risk-approval.md -->","skills/lark-shared/references/lark-shared-identity-and-permissions.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-identity-and-permissions.md -->","skills/lark-shared/references/lark-shared-output-contract.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-output-contract.md -->","skills/lark-shared/references/lark-shared-update-notice.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-update-notice.md -->","skills/lark-shared/references/lark-wiki-token-routing.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-wiki-token-routing.md -->","skills/lark-sheets/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2FSKILL.md -->","skills/lark-sheets/references/lark-sheets-batch-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-batch-update.md -->","skills/lark-sheets/references/lark-sheets-changeset.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-changeset.md -->","skills/lark-sheets/references/lark-sheets-chart.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-chart.md -->","skills/lark-sheets/references/lark-sheets-conditional-format.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-conditional-format.md -->","skills/lark-sheets/references/lark-sheets-filter-view.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-filter-view.md -->","skills/lark-sheets/references/lark-sheets-filter.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-filter.md -->","skills/lark-sheets/references/lark-sheets-float-image.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-float-image.md -->","skills/lark-sheets/references/lark-sheets-formula-translation.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-formula-translation.md -->","skills/lark-sheets/references/lark-sheets-formula-verify.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-formula-verify.md -->","skills/lark-sheets/references/lark-sheets-history.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-history.md -->","skills/lark-sheets/references/lark-sheets-pivot-table.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-pivot-table.md -->","skills/lark-sheets/references/lark-sheets-range-operations.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-range-operations.md -->","skills/lark-sheets/references/lark-sheets-read-data.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-read-data.md -->","skills/lark-sheets/references/lark-sheets-search-replace.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-search-replace.md -->","skills/lark-sheets/references/lark-sheets-sheet-structure.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-sheet-structure.md -->","skills/lark-sheets/references/lark-sheets-sparkline.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-sparkline.md -->","skills/lark-sheets/references/lark-sheets-styles-put.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-styles-put.md -->","skills/lark-sheets/references/lark-sheets-visual-standards.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-visual-standards.md -->","skills/lark-sheets/references/lark-sheets-workbook.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-workbook.md -->","skills/lark-sheets/references/lark-sheets-write-cells.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-write-cells.md -->","skills/lark-skill-maker/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-skill-maker%2FSKILL.md -->","skills/lark-slides/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2FSKILL.md -->","skills/lark-slides/references/asset-planning.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fasset-planning.md -->","skills/lark-slides/references/cli/lark-slides-add-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-add-slide.md -->","skills/lark-slides/references/cli/lark-slides-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-create.md -->","skills/lark-slides/references/cli/lark-slides-delete-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-delete-slide.md -->","skills/lark-slides/references/cli/lark-slides-history.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-history.md -->","skills/lark-slides/references/cli/lark-slides-media-upload.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-media-upload.md -->","skills/lark-slides/references/cli/lark-slides-replace-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-replace-slide.md -->","skills/lark-slides/references/cli/lark-slides-screenshot.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-screenshot.md -->","skills/lark-slides/references/cli/lark-slides-update-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-update-slide.md -->","skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-xml-presentation-slide-get.md -->","skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-xml-presentation-slide-replace.md -->","skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-xml-presentations-get.md -->","skills/lark-slides/references/iconpark-index.json":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Ficonpark-index.json -->","skills/lark-slides/references/iconpark.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Ficonpark.md -->","skills/lark-slides/references/lark-slides-add-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-add-slide.md -->","skills/lark-slides/references/lark-slides-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-create.md -->","skills/lark-slides/references/lark-slides-delete-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-delete-slide.md -->","skills/lark-slides/references/lark-slides-edit-workflows.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-edit-workflows.md -->","skills/lark-slides/references/lark-slides-history.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-history.md -->","skills/lark-slides/references/lark-slides-media-upload.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-media-upload.md -->","skills/lark-slides/references/lark-slides-pptx-template-workflows.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-pptx-template-workflows.md -->","skills/lark-slides/references/lark-slides-replace-slide.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-replace-slide.md -->","skills/lark-slides/references/lark-slides-screenshot.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-screenshot.md -->","skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-xml-presentation-slide-get.md -->","skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-xml-presentation-slide-replace.md -->","skills/lark-slides/references/lark-slides-xml-presentations-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-xml-presentations-get.md -->","skills/lark-slides/references/planning-layer.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fplanning-layer.md -->","skills/lark-slides/references/troubleshooting.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Ftroubleshooting.md -->","skills/lark-slides/references/validation-checklist.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fvalidation-checklist.md -->","skills/lark-slides/references/visual-planning.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fvisual-planning.md -->","skills/lark-slides/references/workflow/error-handling.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fworkflow%2Ferror-handling.md -->","skills/lark-slides/references/workflow/slides-editing.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fworkflow%2Fslides-editing.md -->","skills/lark-slides/references/workflow/template-editing.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fworkflow%2Ftemplate-editing.md -->","skills/lark-slides/references/workflow/validation-xml.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fworkflow%2Fvalidation-xml.md -->","skills/lark-slides/references/xml-schema-quick-ref.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fxml-schema-quick-ref.md -->","skills/lark-slides/references/xml/iconpark-index.json":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fxml%2Ficonpark-index.json -->","skills/lark-slides/references/xml/iconpark.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fxml%2Ficonpark.md -->","skills/lark-slides/references/xml/xml-schema-quick-ref.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fxml%2Fxml-schema-quick-ref.md -->","skills/lark-task/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2FSKILL.md -->","skills/lark-task/references/lark-task-assign.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-assign.md -->","skills/lark-task/references/lark-task-comment.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-comment.md -->","skills/lark-task/references/lark-task-complete.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-complete.md -->","skills/lark-task/references/lark-task-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-create.md -->","skills/lark-task/references/lark-task-followers.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-followers.md -->","skills/lark-task/references/lark-task-get-my-tasks.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-get-my-tasks.md -->","skills/lark-task/references/lark-task-get-related-tasks.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-get-related-tasks.md -->","skills/lark-task/references/lark-task-reminder.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-reminder.md -->","skills/lark-task/references/lark-task-reopen.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-reopen.md -->","skills/lark-task/references/lark-task-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-search.md -->","skills/lark-task/references/lark-task-sections.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-sections.md -->","skills/lark-task/references/lark-task-set-ancestor.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-set-ancestor.md -->","skills/lark-task/references/lark-task-tasklist-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-tasklist-create.md -->","skills/lark-task/references/lark-task-tasklist-members.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-tasklist-members.md -->","skills/lark-task/references/lark-task-tasklist-search.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-tasklist-search.md -->","skills/lark-task/references/lark-task-tasklist-task-add.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-tasklist-task-add.md -->","skills/lark-task/references/lark-task-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-update.md -->","skills/lark-task/references/lark-task-upload-attachment.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-upload-attachment.md -->","skills/lark-vc-agent/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-vc-agent%2FSKILL.md -->","skills/lark-vc/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-vc%2FSKILL.md -->","skills/lark-whiteboard/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2FSKILL.md -->","skills/lark-whiteboard/elements/connectors.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fconnectors.md -->","skills/lark-whiteboard/elements/content.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fcontent.md -->","skills/lark-whiteboard/elements/image.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fimage.md -->","skills/lark-whiteboard/elements/layout.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Flayout.md -->","skills/lark-whiteboard/elements/schema.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fschema.md -->","skills/lark-whiteboard/elements/style.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fstyle.md -->","skills/lark-whiteboard/elements/typography.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Ftypography.md -->","skills/lark-whiteboard/references/lark-whiteboard-export.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Freferences%2Flark-whiteboard-export.md -->","skills/lark-whiteboard/references/lark-whiteboard-update.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Freferences%2Flark-whiteboard-update.md -->","skills/lark-whiteboard/references/lark-whiteboard-workflow.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Freferences%2Flark-whiteboard-workflow.md -->","skills/lark-whiteboard/routes/dsl.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Froutes%2Fdsl.md -->","skills/lark-whiteboard/routes/mermaid.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Froutes%2Fmermaid.md -->","skills/lark-whiteboard/routes/svg-edit.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Froutes%2Fsvg-edit.md -->","skills/lark-whiteboard/routes/svg.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Froutes%2Fsvg.md -->","skills/lark-whiteboard/scenes/architecture.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Farchitecture.md -->","skills/lark-whiteboard/scenes/bar-chart.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fbar-chart.md -->","skills/lark-whiteboard/scenes/comparison.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fcomparison.md -->","skills/lark-whiteboard/scenes/fishbone.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Ffishbone.md -->","skills/lark-whiteboard/scenes/flowchart.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fflowchart.md -->","skills/lark-whiteboard/scenes/flywheel.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fflywheel.md -->","skills/lark-whiteboard/scenes/funnel.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Ffunnel.md -->","skills/lark-whiteboard/scenes/line-chart.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fline-chart.md -->","skills/lark-whiteboard/scenes/mention.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fmention.md -->","skills/lark-whiteboard/scenes/mermaid.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fmermaid.md -->","skills/lark-whiteboard/scenes/milestone.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fmilestone.md -->","skills/lark-whiteboard/scenes/organization.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Forganization.md -->","skills/lark-whiteboard/scenes/photo-showcase.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fphoto-showcase.md -->","skills/lark-whiteboard/scenes/pyramid.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fpyramid.md -->","skills/lark-whiteboard/scenes/swimlane.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fswimlane.md -->","skills/lark-whiteboard/scenes/treemap.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Ftreemap.md -->","skills/lark-wiki/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2FSKILL.md -->","skills/lark-wiki/references/lark-wiki-delete-space.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-delete-space.md -->","skills/lark-wiki/references/lark-wiki-member-add.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-member-add.md -->","skills/lark-wiki/references/lark-wiki-member-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-member-list.md -->","skills/lark-wiki/references/lark-wiki-member-remove.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-member-remove.md -->","skills/lark-wiki/references/lark-wiki-move-to-drive.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-move-to-drive.md -->","skills/lark-wiki/references/lark-wiki-move.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-move.md -->","skills/lark-wiki/references/lark-wiki-node-copy.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-copy.md -->","skills/lark-wiki/references/lark-wiki-node-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-create.md -->","skills/lark-wiki/references/lark-wiki-node-delete.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-delete.md -->","skills/lark-wiki/references/lark-wiki-node-get.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-get.md -->","skills/lark-wiki/references/lark-wiki-node-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-list.md -->","skills/lark-wiki/references/lark-wiki-space-create.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-space-create.md -->","skills/lark-wiki/references/lark-wiki-space-list.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-space-list.md -->","skills/lark-workflow-meeting-summary/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-workflow-meeting-summary%2FSKILL.md -->","skills/lark-workflow-standup-report/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-workflow-standup-report%2FSKILL.md -->","tests/cli_e2e/cli-e2e-testcase-writer/SKILL.md":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=tests%2Fcli_e2e%2Fcli-e2e-testcase-writer%2FSKILL.md -->",".cursorrules (ankra-cli.mdc)":"---\ndescription: \"Ankra CLI rules and best practices for managing Kubernetes clusters via the Ankra platform\"\nglobs: **/*.sh, **/*.yaml, **/*.yml, Makefile, **/Makefile, **/*.md\nalwaysApply: false\n---\n# Ankra CLI Best Practices\n\nAnkra is a Kubernetes cluster management platform. Its CLI (`ankra`) lets you manage organisations, clusters, add-ons, stacks, Helm releases, credentials, and tokens from the terminal.\n\n## Authentication & Configuration\n\n- Authenticate first: `ankra login`\n- Default config lives at `~/.ankra.yaml`; override with `--config <path>`\n- Override the API base URL with `--base-url` or `ANKRA_BASE_URL`\n- Supply an API token via `--token` or `ANKRA_API_TOKEN` (prefer env var in CI)\n- Logout cleanly: `ankra logout`\n\n```yaml\n# ~/.ankra.yaml example\nbase_url: https://api.ankra.io\ntoken: ${ANKRA_API_TOKEN}\n```\n\n## Organisation Management\n\n```bash\nankra org list                          # List accessible organisations\nankra org switch <org-name>             # Switch active organisation\nankra org create <name>                 # Create a new organisation\nankra org invite <email>                # Invite a user to the current org\nankra org members                       # List members of the current org\n```\n\n## Cluster Lifecycle\n\n```bash\nankra cluster list                      # List all clusters in the org\nankra cluster select <name>             # Set the active cluster context\nankra cluster info                      # Show details about the active cluster\nankra cluster provision                 # Provision a new cluster\nankra cluster deprovision               # Deprovision (destroy) the active cluster\nankra cluster reconcile                 # Reconcile cluster to desired state\nankra delete cluster <name>             # Delete a named cluster\n```\n\n- Always run `ankra cluster info` before destructive operations\n- Use `ankra cluster reconcile` after config changes before assuming state is correct\n\n## Add-ons\n\n```bash\nankra cluster addons list               # List installed add-ons\nankra cluster addons available          # List available (installable) add-ons\nankra cluster addons settings <addon>   # Show current settings for an add-on\nankra cluster addons update <addon>     # Update add-on configuration\nankra cluster addons uninstall <addon>  # Uninstall an add-on\n```\n\n## Stacks (Application Stacks)\n\n```bash\nankra cluster stacks list               # List stacks in the cluster\nankra cluster stacks create <name>      # Create a new stack\nankra cluster stacks delete <name>      # Delete a stack\nankra cluster stacks rename <old> <new> # Rename a stack\nankra cluster stacks clone <src> <dst>  # Clone a stack\nankra cluster stacks history <name>     # View stack change history\n```\n\n- Prefer `clone` over `create` when replicating an existing working stack\n- Check `history` before rolling back to understand what changed\n\n## Manifests & Operations\n\n```bash\nankra cluster manifests list            # List deployed manifests\nankra cluster operations list           # List in-progress or recent operations\nankra cluster operations cancel <id>    # Cancel a running operation\n```\n\n## Cluster Agent\n\n```bash\nankra cluster agent status              # Check agent health\nankra cluster agent token               # Retrieve agent bootstrap token\nankra cluster agent upgrade             # Upgrade the in-cluster agent\n```\n\n- Run `agent status` if cluster commands seem unresponsive\n- Rotate the agent token periodically for security\n\n## Helm\n\n```bash\nankra cluster helm releases             # List Helm releases in the cluster\nankra cluster helm uninstall <release>  # Uninstall a Helm release\nankra helm registries                   # List configured Helm registries\nankra helm credentials                  # List Helm registry credentials\n```\n\n## Hetzner Cloud Clusters\n\n```bash\nankra cluster hetzner create            # Create a Hetzner-backed cluster\nankra cluster hetzner scale             # Scale the cluster node count\nankra cluster hetzner upgrade           # Upgrade Kubernetes version\nankra cluster hetzner workers           # Manage worker node groups\nankra cluster hetzner node-group        # Node group management\n```\n\n## Charts\n\n```bash\nankra charts list                       # List available charts\nankra charts search <term>              # Search charts\nankra charts info <chart>               # Detailed chart information\n```\n\n## Credentials\n\n```bash\nankra credentials list                              # List stored credentials\nankra credentials get <name>                        # Retrieve a credential\nankra credentials validate <name>                   # Validate a credential\nankra credentials delete <name>                     # Delete a credential\nankra credentials hetzner --name <n> --token <t>   # Store Hetzner API token\nankra credentials ovh ...                           # Store OVH credentials\nankra credentials upcloud ...                       # Store UpCloud credentials\n```\n\n- Never commit credentials to source control; use `ANKRA_API_TOKEN` env var\n- Validate credentials immediately after creation: `ankra credentials validate <name>`\n\n## Tokens (API Tokens)\n\n```bash\nankra tokens list                       # List API tokens\nankra tokens create --name <name>       # Create a new API token\nankra tokens revoke <id>                # Revoke a token (keeps record)\nankra tokens delete <id>                # Permanently delete a token\n```\n\n## AI Troubleshooting\n\n```bash\nankra chat                              # Start AI-powered troubleshooting session\n```\n\nUse `ankra chat` when facing ambiguous errors — it provides contextual guidance.\n\n## Global Flags\n\n| Flag | Env Var | Description |\n|------|---------|-------------|\n| `--base-url <url>` | `ANKRA_BASE_URL` | Override API base URL |\n| `--token <token>` | `ANKRA_API_TOKEN` | API authentication token |\n| `--config <path>` | — | Path to config file (default `~/.ankra.yaml`) |\n\n## Scripting & Automation Tips\n\n- Export `ANKRA_API_TOKEN` in CI pipelines; never hard-code tokens\n- Use `--token` for one-off scripts where env var injection is not possible\n- Chain `ankra cluster select` before cluster-scoped commands in scripts\n- Pipe output through `jq` for structured processing where JSON output is available\n- Use `ankra cluster operations list` in CI to poll for async operation completion\n- Add `set -euo pipefail` to shell scripts using the Ankra CLI\n\n## Common Workflows\n\n### Provision and configure a new Hetzner cluster\n\n```bash\nankra login\nankra org switch my-org\nankra cluster hetzner create\nankra cluster select my-new-cluster\nankra cluster agent status\nankra cluster addons available\nankra cluster addons update some-addon\nankra cluster reconcile\n```\n\n### Deploy a stack from a chart\n\n```bash\nankra cluster select my-cluster\nankra charts search my-app\nankra charts info my-app\nankra cluster stacks create my-stack\nankra cluster manifests list\n```\n\n### Rotate credentials safely\n\n```bash\nankra tokens create --name ci-token-new\n# Update CI secret with new token\nankra tokens revoke <old-token-id>\nankra credentials validate my-cloud-cred\n```\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# AGENTS.md\n\n## Purpose\n\n`lark-cli` is the official Lark/Feishu CLI for humans and AI agents. Optimize\nfor predictable machine-readable behavior without making the human CLI worse.\n\nKeep each PR focused on one goal: CLI UX, reliability, simpler explicit code,\nor a useful gate. Done means the correct implementation surface, preserved\ncontracts unless a break was requested, and reported checks.\n\nPublic behavior, tests, lint, and CI define current contracts. Existing code is\nevidence, but a legacy exception is not precedent; `Proposal` documents are\ndirection only. Do not mix unrelated cleanup, hand-edit generated files, weaken\ngates, or broaden allowlists to make CI pass.\n\n## Implementation Discipline\n\nUse this sequence for product behavior or enforcement changes:\n\n1. Establish the current contract and owner before choosing a solution. Trace the\n   flow from the command or shortcut through runtime and internal owners to wire\n   output; inspect affected callers and tests, then choose the surface below.\n2. Apply YAGNI to scope. Implement the behavior required now; do not add\n   speculative modes, configuration, compatibility paths, extension points, or\n   scaffolding.\n3. Reuse the project's existing machinery before creating a parallel path.\n   Prefer the owning generic, runtime, or internal surface, then the Go standard\n   library or an existing dependency, while preserving the contracts below.\n4. Fix the root cause at the narrowest cohesive boundary shared by affected\n   callers. Keep command and domain policy at the caller unless there is a real\n   cross-command invariant for an internal owner to enforce.\n5. Ship the smallest complete change: implementation, a revert-failing regression\n   test for behavior or enforcement, and required contract or guidance updates.\n\nOptimize for minimum owned complexity, not minimum diff or line count. A correct\nroot-cause fix may touch the owner, callers, tests, and docs; a one-line workaround\nat the wrong layer is not simpler. Prefer deletion and boring explicit code, and\navoid one-use abstractions or new dependencies for straightforward behavior.\n\nYAGNI never overrides explicit requirements or output, error, path, security,\ncompatibility, and data-safety contracts. If a deliberately limited solution has\na real ceiling, document the ceiling and the concrete condition for expanding it\nat the decision point.\n\n## Build\n\nRun `make build` for the canonical local build; it writes `./lark-cli` with\nversion metadata and the committed Catalog Snapshot embedded from\n`internal/registry/catalog/manifest.json` plus\n`internal/registry/catalog/services/*.json`. Build and test targets consume this\ntracked snapshot without a metadata fetch or Python prerequisite.\n`make live-skills-test` additionally requires working `npx` and network access.\n\n## Choose the Correct Surface\n\n| Need | Implement in | Rule |\n|------|--------------|------|\n| Agent/human-friendly workflow, composition, or smart defaults | `shortcuts/<domain>/` via `common.Shortcut` | Must add UX or workflow value beyond exposing one endpoint. |\n| One-to-one supported OpenAPI method | Committed Catalog Snapshot under `internal/registry/catalog/manifest.json` plus `services/*.json`, and generic `cmd/service/` machinery | Verify it with `schema`. Update the manifest and matching service snapshot together; do not add a shortcut merely to expose a missing catalog method. |\n| Arbitrary OpenAPI endpoint | Generic `cmd/api/` machinery | Keep it endpoint-agnostic. |\n| Auth, config, profile, update, or CLI lifecycle | `cmd/<area>/` plus the owning shared/internal package | Keep new Cobra code as wiring when a lower owner exists. |\n| EventKey, payload shape, or domain projection | `events/<domain>/` | Shared event mechanics stay in `internal/event/`; CLI assembly stays in `cmd/event/`. |\n| Command-independent mechanism or cross-command invariant | Owning `internal/<area>/` package | Keep UX/domain policy at the caller; use a cohesive owner, not a generic utils package. Test the owner and affected caller contracts. |\n| Public plugin or host integration | `extension/` | Exported symbols are compatibility commitments; orchestration stays internal. |\n| Per-command decision guidance: when, avoid, prerequisites, tips, or examples | `affordance/<domain>.md` | Enrich `--help` and `schema` without restating command descriptions, flags, or field schemas. |\n| Domain routing, concepts, safety, or cross-command agent workflow | `skills/<name>/SKILL.md` and `references/` | Keep always-needed decisions in `SKILL.md`, conditional HOW in references, and link commands from affordance. |\n\nDo not duplicate one command surface inside another. Register new shortcuts in\nthe domain's `Shortcuts()`; declare risk, identities/scopes, flags, and dry-run.\n\n## Source Layout\n\n| Path | What it does |\n|------|-------------|\n| `cmd/root.go` | Entry point, command registration, strict mode pruning |\n| `cmd/profile/` | Multi-profile management (add/list/use/rename/remove) |\n| `cmd/config/` | Config init, show, strict-mode |\n| `cmd/service/` | Auto-registers API commands from `internal/registry/catalog/manifest.json` and `internal/registry/catalog/services/*.json` |\n| `shortcuts/common/runner.go` | Shortcut execution pipeline, Flag.Input (@file/stdin) resolution |\n| `shortcuts/` | Domain-specific shortcut implementations |\n| `internal/cmdutil/factory.go` | Factory pattern — identity resolution, credential, config |\n| `internal/cmdutil/factory_default.go` | Production factory wiring |\n| `internal/credential/` | Credential provider chain (extension → default) |\n| `extension/credential/` | Plugin-facing credential interfaces and env provider |\n| `internal/client/client.go` | APIClient: DoSDKRequest, DoStream |\n| `internal/core/config.go` | Multi-profile config loading/saving |\n| `internal/vfs/` | Filesystem abstraction (use `vfs.*` instead of `os.*`) |\n| `internal/validate/path.go` | Path safety validation |\n\n## Hard Contracts\n\nRead the [JSON output contract](README.md#json-output-contract) before changing\nwire output. Read the [source guard guide](lint/README.md) and `.golangci.yml`\nbefore changing or waiving enforcement.\n\n- Command/flag semantics, help/schema metadata, output placement and shapes,\n  errors, exit codes, risk/identity, and exported APIs are compatibility contracts.\n  When forwarding or echoing accepted input, preserve it verbatim unless its\n  contract defines normalization; never silently substitute another behavior.\n- Success data goes to stdout; typed failure envelopes, progress, warnings, and\n  hints go to stderr. Predicate/self-contained results and partial failures are\n  documented exceptions whose complete result remains on stdout.\n- Keep new or touched Cobra code as wiring. Lark/Feishu API calls in shortcuts go\n  through `*common.RuntimeContext`; direct HTTP is only for non-gateway protocols\n  such as presigned storage and requires a precise `//nolint:forbidigo` reason.\n- Keep user/workspace FileIO invocation-scoped: use `runtime.FileIO()`,\n  `runtime.ValidatePath()`, and `runtime.ResolveSavePath()` so portable commands do\n  not assume a local host or process working directory.\n- Shortcuts do not use `internal/vfs` for user/workspace files. A narrow\n  `//nolint:depguard` waiver is allowed only for CLI-owned state or explicitly\n  CLI-managed host configuration; explain that ownership boundary. Other internal\n  filesystem code uses `internal/vfs` and validates paths.\n- If FileIO lacks a host-local tree operation, prefer an owning `internal/` package\n  or optional capability. Direct `os` calls require a stated local-only boundary,\n  validated and bounded paths, and a precise `//nolint:forbidigo` reason.\n- Do not hardcode resolver-owned hosts. At new API boundaries, or when changed\n  behavior consumes fields from a loose map, project that shape into a typed\n  struct before downstream use. Extend published interfaces through optional\n  interfaces rather than breaking external implementations.\n- Source guards enforce raw HTTP/os/vfs, resolver-host, and migrated-error\n  constructs; other semantics rely on tests and review. Every exemption must be\n  narrow, local, and explain why the safe path does not apply.\n\n## Structured Errors\n\nBefore changing a command failure, taxonomy, or error wire field, read the\n[error contract](errs/ERROR_CONTRACT.md); it owns constructor selection, wrapping,\nextension fields, stability, and CI guards.\n\n- Command-facing failures use typed `errs.*` unless the error contract defines\n  an output-control exception. Never return a final plain `fmt.Errorf` /\n  `errors.New` or ad hoc envelope; pass typed errors through and preserve causes.\n- Lark API failures use a domain typed wrapper, `runtime.CallAPITyped`, or\n  `runtime.DoAPIJSONTyped`; raw callers use `runtime.ClassifyAPIResponse` or\n  `errclass.BuildAPIError`.\n- `param` names only failing user input; recovery belongs in `hint`. Populate\n  `missing_scopes`, `log_id`, and similar fields only from known runtime evidence.\n- Error tests assert typed metadata and cause preservation, not message text alone.\n\n## Affordance and Skills\n\nBefore editing command guidance, read the [affordance guide](affordance/README.md).\nFor plugin distributions, read [Ship skills and command guidance](extension/platform/README.md#ship-skills-and-command-guidance).\n\n- Go metadata/schema owns WHAT; affordance owns command-level WHEN; `SKILL.md`\n  owns domain routing, concepts, safety, and cross-command workflows; `references/`\n  owns detailed or conditional HOW.\n- Do not duplicate canonical descriptions, schemas, or generic error taxonomy.\n  Keep workflow-specific recovery in a skill when it changes agent behavior;\n  affordance examples remain runnable, current, and safe.\n- Skill frontmatter `description` is a concise WHAT/WHEN/NOT routing trigger. Keep\n  always-needed decisions in `SKILL.md`; move conditional detail to `references/`.\n- Skill names and reference paths are public pointers. Every path reachable from\n  shipped docs must ship. Before referencing a new content directory, update\n  `content_embed.go` and add an embedded-FS reachability test; `assets/` and\n  `scripts/` stay source-only unless the distribution contract changes.\n\n## Tests\n\n- Every behavior change needs a nearby test that fails if the implementation is\n  reverted; assert fields, requests, typed errors, or side effects directly.\n- Command/shortcut tests needing a Factory use `cmdutil.TestFactory(t, config)`;\n  isolate config with\n  `t.Setenv(\"LARKSUITE_CLI_CONFIG_DIR\", t.TempDir())`.\n- Tests must not depend on developer profiles, keychains, home directories,\n  execution order, or real credentials unless explicitly live.\n- Live E2E flows are self-contained: create, use, and clean up even after failure.\n\n| Shortcut change | Dry-run E2E | Live E2E |\n|-----------------|:-----------:|:--------:|\n| New shortcut | Required | Required |\n| Flags or request params | Required | Required if behavior changes |\n| Bug fix | Required | Required when risk reaches the API boundary |\n| Internal refactor, no behavior change | Not needed | Not needed |\n\nDry-run tests use placeholder credentials and assert method, URL, params, and\nbody without a real API call. Confirm contracts with `--help` and `schema` first.\nIf no deterministic, cleanable live flow exists, do not leak tenant state or add\na flaky test; document the blocker, fixture conditions, and substitute evidence.\n\n## Validation\n\nRun the narrowest useful check while iterating, then broaden with risk:\n\n| Change | Checks |\n|--------|--------|\n| Go package | `go test ./path/to/package/...`, then the pre-PR Go checks below |\n| Broad/cross-cutting | `make test` |\n| Committed command/help/schema surface | `make quality-gate` |\n| Skills | `node scripts/skill-format-check/index.js`, then `make quality-gate` after committing the change |\n| Affordance | Add/update `internal/affordance/*_source_test.go`; run `go test ./internal/affordance ./cmd/service ./internal/schema` |\n| Make-covered scripts/workflows | `make script-test` |\n| Public plugin SDK | `make examples-build` plus relevant `tests/plugin_e2e` |\n| Auth sidecar | `make sidecar-test` |\n| Skills sync behavior | `make live-skills-test` |\n| Dependencies | `go mod tidy` plus the CI `go-licenses` check |\n\n`make quality-gate` and diff-scoped linters compare the base with `HEAD`; they\nignore staged, unstaged, and untracked changes, so run them after committing.\nSome skill-quality signals are warnings; frontmatter has the separate hard check\nabove. The gate does not validate affordance examples or references in this file:\nrun the focused source test and verify changed paths/symbols directly.\n\n`make test` currently leaves root binaries `audit-observer` and `readonly-policy`; do not stage them.\n\nBefore a Go PR, run `make unit-test`, `make vet`, and `make fmt-check`;\n`go mod tidy` must leave module files unchanged. Set\n`QUALITY_GATE_CHANGED_FROM` to the PR base before diff-scoped checks. Pinned\n`go run module@version` commands need module access unless cached.\n\n```bash\ngo mod tidy\ngit diff --exit-code -- go.mod go.sum\ngo run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.1.6 run --new-from-rev=\"$QUALITY_GATE_CHANGED_FROM\"\ngo run -C lint . --changed-from \"$QUALITY_GATE_CHANGED_FROM\" ..\ngo test -C lint ./... -count=1\ngo run github.com/google/go-licenses/v2@v2.0.1 check ./... --disallowed_types=forbidden,restricted,reciprocal,unknown\n```\n\nCI is authoritative; state exactly which relevant checks were not run.\n\n## Maintaining This File\n\nAdd a root rule only when it is repository-specific, non-obvious, actionable,\nand prevents a recurring failure or high-impact contract breach. Prefer code,\ntests, or CI for mechanizable constraints; keep only rationale and safe exceptions\nhere. Update named references in the same PR, and delete or move stale, obvious,\nredundant, task-local, or fully enforced rules. Each edit should reduce ambiguity,\nnot only add text.\n\n## Commit and PR\n\nUse English Conventional Commits/PR titles, complete the PR template, and never\ncommit secrets, tokens, internal endpoints, or sensitive test data.\n","isInternal":false,"tokens":3136,"sizeBytes":14128},{"name":"SKILL.md","path":"internal/qualitygate/skillscan/testdata/skills/lark-demo/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/internal/qualitygate/skillscan/testdata/skills/lark-demo/SKILL.md","title":"lark-demo","category":"anthropic-skill","format":"markdown","content":"---\nname: lark-demo\ndescription: Demo skill\n---\n\n```bash\n# comment\nlark-cli docs +fetch --api-version v2 --doc A3Ijdemo\nlark-cli im messages list \\\n  --container-id oc_xxx \\\n  --page-size 20\nnpx other-tool\n```\n","frontmatter":{"name":"lark-demo","description":"Demo skill"},"isInternal":false,"tokens":67,"sizeBytes":210},{"name":"SKILL.md","path":"isolated-skills/lark-suite/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/isolated-skills/lark-suite/SKILL.md","title":"lark-suite","category":"anthropic-skill","format":"markdown","content":"---\nname: lark-suite\nversion: 0.1.0\ndescription: 飞书/Lark 聚合能力入口：管理飞书/Lark 产品能力（<!-- LARK_SUITE_KEYS -->等）。当 doubao.com 及其子域名承载飞书资源时也使用本入口，不要回退到 WebFetch。当用户需求涉及上述飞书业务域时使用。\nmetadata:\n  requires:\n    bins:\n      - lark-cli\n---\n\n# Lark Suite\n\n你是飞书/Lark 能力的聚合路由层。你的职责是先判断用户要使用哪个 `lark-*` 子能力，再读取并遵循对应子能力的说明。\n\n`lark-suite` 不直接承载具体 API 操作步骤。除非对应子能力已被读取，否则不要仅根据本文件拼命令、猜参数或执行复杂操作。\n\n所有子能力统一收纳在当前 skill 的 `references/` 目录。选择 `lark-foo` 后，直接读取 `references/lark-foo/GUIDE.md`；不要再次调用 `Skill(lark-foo)`，也不要使用 Find/Glob 遍历或探测整个 references 目录。\n\n## 使用流程\n\n1. 根据用户意图从下方路由表选择一个或多个子能力；即使用户尚未提供链接、ID 或具体工作表，也先选择能力，再由子能力询问缺失信息。\n2. 直接读取 `references/<skill-name>/GUIDE.md` 加载所选子能力，不要把收纳后的子能力当作独立 skill 再次调用。\n3. 仅使用本文件列出的路由与对应子能力入口，不要遍历或探测其他技能目录。\n4. 如果目标能力未列出，返回无法路由的明确提示。\n5. 仅读取当前已选子能力明确要求的前置文件。\n6. 按目标子能力的说明执行；认证、租户、身份、权限和通用排障优先遵循 `lark-shared`。\n\n多步任务可以组合多个子能力，但每一步都应由具体子能力驱动。例如“查联系人并发消息”先用 `lark-contact` 解析身份，再用 `lark-im` 发消息。\n\n## 能力路由\n\n根据用户意图从以下条目选择对应子能力；如果一个任务涉及多个能力，按实际操作顺序逐步读取并使用对应子能力。\n\n<!-- LARK_SUITE_ROUTES -->\n","frontmatter":{"name":"lark-suite","version":"0.1.0","description":"飞书/Lark 聚合能力入口：管理飞书/Lark 产品能力（<!-- LARK_SUITE_KEYS -->等）。当 doubao.com 及其子域名承载飞书资源时也使用本入口，不要回退到 WebFetch。当用户需求涉及上述飞书业务域时使用。","metadata":{"requires":{"bins":["lark-cli"]}}},"isInternal":false,"tokens":690,"sizeBytes":2040},{"name":"SKILL.md","path":"scripts/skill-format-check/tests/bad-skill-no-frontmatter/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/scripts/skill-format-check/tests/bad-skill-no-frontmatter/SKILL.md","title":"bad-skill-no-frontmatter","category":"anthropic-skill","format":"markdown","content":"# No Frontmatter Skill\n\nThis skill completely lacks a YAML frontmatter.\n","isInternal":false,"tokens":15,"sizeBytes":72},{"name":"SKILL.md","path":"scripts/skill-format-check/tests/bad-skill-unclosed-frontmatter/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/scripts/skill-format-check/tests/bad-skill-unclosed-frontmatter/SKILL.md","title":"bad-skill-unclosed-frontmatter","category":"anthropic-skill","format":"markdown","content":"---\nname: bad-skill-unclosed\nversion: 1.0.0\ndescription: \"This skill has an unclosed frontmatter block.\"\nmetadata: {}\n\n# Unclosed Frontmatter Skill\n\nThis frontmatter does not have a closing `---` block.","isInternal":false,"tokens":55,"sizeBytes":202},{"name":"SKILL.md","path":"scripts/skill-format-check/tests/bad-skill/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/scripts/skill-format-check/tests/bad-skill/SKILL.md","title":"bad-skill","category":"anthropic-skill","format":"markdown","content":"---\nversion: 1.0.0\nmetadata: {}\n---\n\n# Bad Skill\n\nThis skill is missing required fields like name and description.\n","frontmatter":{"version":"1.0.0","metadata":{}},"isInternal":false,"tokens":29,"sizeBytes":115},{"name":"SKILL.md","path":"scripts/skill-format-check/tests/good-skill-complex/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/scripts/skill-format-check/tests/good-skill-complex/SKILL.md","title":"good-skill-complex","category":"anthropic-skill","format":"markdown","content":"---\nname: good-skill-complex\nversion: 2.5.1-beta\ndescription: >\n  A very complex description\n  that spans multiple lines\n  and contains weird chars: !@#$%^&*()\nmetadata:\n  requires:\n    bins: [\"lark-cli\", \"node\"]\n  cliHelp: \"lark-cli something --help\"\n  customField: \"customValue\"\n---\n\n# Complex Skill\n\nThis skill has a complex frontmatter block.\n","frontmatter":{"name":"good-skill-complex","version":"2.5.1-beta","description":"A very complex description that spans multiple lines and contains weird chars: !@#$%^&*()\n","metadata":{"requires":{"bins":["lark-cli","node"]},"cliHelp":"lark-cli something --help","customField":"customValue"}},"isInternal":false,"tokens":97,"sizeBytes":347},{"name":"SKILL.md","path":"scripts/skill-format-check/tests/good-skill-minimal/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/scripts/skill-format-check/tests/good-skill-minimal/SKILL.md","title":"good-skill-minimal","category":"anthropic-skill","format":"markdown","content":"---\nname: good-skill-minimal\nversion: 0.1.0\ndescription: Minimal valid description\nmetadata: {}\n---\n\n# Minimal Skill\n\nThis has the bare minimum required fields.\n","frontmatter":{"name":"good-skill-minimal","version":"0.1.0","description":"Minimal valid description","metadata":{}},"isInternal":false,"tokens":40,"sizeBytes":161},{"name":"SKILL.md","path":"scripts/skill-format-check/tests/good-skill/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/scripts/skill-format-check/tests/good-skill/SKILL.md","title":"good-skill","category":"anthropic-skill","format":"markdown","content":"---\nname: good-skill\nversion: 1.0.0\ndescription: \"This is a properly formatted skill.\"\nmetadata:\n  requires:\n    bins: [\"lark-cli\"]\n---\n\n# Good Skill\n\nThis skill follows all the formatting rules.\n","frontmatter":{"name":"good-skill","version":"1.0.0","description":"This is a properly formatted skill.","metadata":{"requires":{"bins":["lark-cli"]}}},"isInternal":false,"tokens":52,"sizeBytes":196},{"name":"lark-approval-approvals-get.md","path":"skills/lark-approval/references/lark-approval-approvals-get.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-approvals-get.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"\n# approval approvals get\n\n获取单个审批定义详情（用户级只读操作）。适合在发起审批实例前，先确认审批名称、表单控件结构、选项值范围以及流程节点信息。\n\n需要的 scopes: [\"approval:approval:read\"]\n\n## 命令\n\n```bash\n# 按 approval_code 查询审批定义详情\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user\n\n# 表格格式输出，便于快速浏览顶层字段\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{...}'` | 是 | 查询参数，使用 JSON 传入 |\n| `approval_code` | 是 | 审批定义 Code；通常来自 `approval approvals search` 的结果 |\n| `locale` | 否 | 返回语言，例如 `zh-CN`、`en-US`、`ja-JP` |\n| `--as user` | 否 | 建议显式指定用户身份；审批定义详情通常按当前用户可见范围读取 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 常见输入来源\n\n如果你已经有 `approval_code`，可直接查询：\n\n```bash\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user\n```\n\n如果你还没有 `approval_code`，先搜索可发起审批定义：\n\n```bash\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user\n```\n\n## 输出重点字段\n\n返回结果中，优先关注以下字段：\n\n| 字段 | 说明 |\n|------|------|\n| `approval_code` | 审批定义 Code |\n| `approval_name` | 审批定义名称；确认是不是用户想发起的那张单 |\n| `form` | 表单定义快照；用于识别控件 `id`、`type`、选项值范围、明细子控件结构 |\n| `node_list` | 流程节点列表；用于识别节点 key、是否需要补充审批人、是否允许多人 |\n\n## form 的使用重点\n\n`form` 最重要的作用是帮助 agent **识别怎么组装 `instances.create.data.form`**，而不是直接把它原样提交出去。\n\n重点看：\n\n| 字段 / 结构 | 说明 |\n|------|------|\n| `form[].id` | 控件 ID；后续创建实例时必须使用 |\n| `form[].type` | 控件类型，例如 `input`、`date`、`radio`、`checkbox`、`fieldList` |\n| `form[].value` / 选项定义 | 用来识别可选值范围、默认值或选项值 |\n| 明细 / 子控件结构 | 用于识别 `fieldList`、控件组等复杂控件的子字段结构 |\n\n**注意：`approvals.get.form` 不是 `instances.create` 可直接复用的 payload 模板。** 它是“定义快照”，主要用于识别字段结构与选项值范围。\n\n## node_list 的使用重点\n\n`node_list` 主要用于后续决定是否要补 `node_approver_list` / `node_cc_list`。\n\n重点看：\n\n| 字段 | 说明 |\n|------|------|\n| `node_list[].custom_node_id` | 自定义节点标识；后续补节点参数时优先作为 key |\n| `node_list[].node_id` | 节点 ID；若没有 `custom_node_id`，通常退回用它做 key |\n| `node_list[].need_approver` | 是否要求发起人补充审批人 |\n| `node_list[].approver_chosen_multi` | 是否允许为该节点选择多个审批人 |\n\n## 使用建议\n\n- **这是发起原生审批实例前的必要只读步骤。** 推荐固定走：`approvals search` -> `approvals get` -> `instances create`。\n- **如果用户已经明确给了 `approval_code`，直接用这个命令。** 不必再走 `approvals search`。\n- **先确认 `approval_name`。** 避免把相似名称的审批定义搞混。\n- **先用 `form` 识别控件结构，再组装创建 payload。** 不要在未看详情时猜控件 `id`、`type` 或选项值。\n- **先用 `node_list` 看是否需要补审批人。** 若某节点 `need_approver=true`，创建实例时通常要补 `node_approver_list`。\n- **`node_list` 的 key 优先取 `custom_node_id`。** 若不存在，再使用 `node_id`。\n- **`approver_chosen_multi=false` 时，一个节点通常只能补一个审批人。**\n\n## 输出与后续操作\n\n读取定义详情后，常见下一步：\n\n```bash\n# 发起原生审批实例\nlark-cli approval instances create --data '{\"approval_code\":\"<APPROVAL_CODE>\",\"form\":\"[...]\"}' --as user --yes\n```\n\n如果需要进一步理解控件取值与节点参数，优先参考：\n\n- `lark-approval-instance-form-control-parameters.md`\n- `lark-approval-instance-value-sourcing.md`\n- `lark-approval-initiate.md`\n\n## 结果整理方式\n\n**将结果整理为“审批定义概览 + 表单结构摘要 + 节点要求摘要”。**\n\n建议输出成下面这种结构：\n\n```text\n审批定义：请假申请\napproval_code: 7C468A54-8745-2245-9675-08B7C63E7A85\n\n表单控件摘要：\n- leave_type: radio，可选值 [annual_leave, sick_leave]\n- reason: textarea\n- start_end: dateInterval\n\n节点要求摘要：\n- manager_node：need_approver=true，approver_chosen_multi=false\n- hr_node：need_approver=false\n```\n","isInternal":false,"tokens":1667,"sizeBytes":5067},{"name":"lark-approval-approvals-search.md","path":"skills/lark-approval/references/lark-approval-approvals-search.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-approvals-search.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"\n# approval approvals search\n\n搜索**当前用户可发起**的审批定义（launchable approvals）。只读操作，不会创建审批实例。\n\n需要的 scopes: [\"approval:approval:read\"]\n\n## 命令\n\n```bash\n# 按关键词搜索可发起审批定义\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user\n\n# 使用 page_token 翻页\nlark-cli approval approvals search --data '{\"keyword\":\"请假\", \"page_token\":\"example_page_token\"}' --as user\n\n# 表格格式输出，便于快速浏览候选定义\nlark-cli approval approvals search --data '{\"keyword\":\"出差\"}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 查询参数，使用 JSON 传入 |\n| `keyword` | 是 | 搜索关键词，例如 `请假`、`报销`、`出差`、`采购` |\n| `locale` | 否 | 返回语言，例如 `zh-CN`、`en-US`、`ja-JP` |\n| `page_size` | 否 | 分页大小 |\n| `page_token` | 否 | 翻页标记；首次请求不填，后续使用上一次返回的 `page_token` |\n| `--as user` | 否 | 建议显式指定用户身份；“可发起审批定义”是面向当前用户的查询 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 这个命令解决什么问题\n\n当用户只有自然语言意图，还没有 `approval_code` 时，先用它把“可发起的审批定义候选项”找出来。\n\n典型场景：\n\n- “帮我找一下请假审批”\n- “有哪些可以发起的报销单？”\n- “先搜一下出差审批，再帮我提单”\n\n## 输出重点字段\n\n返回结果里，优先关注以下字段：\n\n| 字段 | 说明 |\n|------|------|\n| `approval_code` | 审批定义 Code；后续 `approvals get` 和 `instances create` 都要用它 |\n| `approval_name` | 审批定义名称；给用户做候选选择时最关键 |\n| `is_external` | 是否为三方审批定义；`true` 表示不能走原生 `instances.create` |\n| `create_link` | 三方审批定义的发起链接；`is_external=true` 时优先返回给用户 |\n\n## 使用规则\n\n- **这是发起审批工作流的第一步。** 标准顺序是：`approvals search` -> `approvals get` -> `instances create`。\n- **搜索结果为空时，不要猜。** 直接告诉用户当前关键词下没有可发起定义，并建议用户换关键词。\n- **命中多个结果时，不要替用户拍板。** 先把候选定义列出来，让用户选择目标审批定义。\n- **`is_external=true` 时不要调用 `approval instances create`。** 这类定义属于三方审批，优先返回 `create_link` 并说明需要通过链接发起。\n- **只有 `is_external=false` 的原生定义，才继续 `approvals get`。**\n- **如果用户已经明确给出 `approval_code`，不要再 search。** 直接执行 `approval approvals get`。\n\n## 结果整理方式\n\n**将结果整理为候选清单，优先展示“名称 + approval_code + 是否三方定义 + 下一步建议”。**\n\n建议输出成下面这种结构：\n\n```text\n找到 3 个可发起审批定义：\n\n1. 请假申请\n   - approval_code: 7C468A54-8745-2245-9675-08B7C63E7A85\n   - is_external: false\n   - next: 可继续读取 definitions 详情（approvals get）\n\n2. 差旅报销\n   - approval_code: 99887766-xxxx\n   - is_external: true\n   - next: 返回 create_link，引导用户通过链接发起\n```\n\n## 常见后续操作\n\n### 1）用户选中了某个定义，继续查看详情\n\n```bash\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user\n```\n\n### 2）确认是原生定义后，再准备发起审批实例\n\n```bash\nlark-cli approval instances create --data '{\"approval_code\":\"<APPROVAL_CODE>\",\"form\":\"[...]\"}' --as user --yes\n```\n\n### 3）确认是三方定义时，直接返回链接\n\n当 `is_external=true` 时，优先向用户返回 `create_link`，说明该审批需在三方系统或跳转页面中发起，而不是通过原生 `instances.create`。\n","isInternal":false,"tokens":1341,"sizeBytes":4123},{"name":"lark-approval-initiate.md","path":"skills/lark-approval/references/lark-approval-initiate.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-initiate.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# 审批提单工作流\n\n## 执行摘要\n\n- **原生审批提单如果用户未明确给出 `approval_code`，必须固定走 `approvals search` -> `approvals get` -> `instances create`** 不要跳过 `get` 直接拼请求。\n- **原生审批提单如果用户明确给出 `approval_code`，固定走 `approvals get` -> `instances create`** 不要跳过 `get` 直接拼请求。\n- **`is_external=true` 的定义是三方定义。** 这类定义不要调用 `instances create`，应优先使用 `create_link`。\n- **所有人员类参数默认使用 `open_id`。** 若用户给的是姓名、邮箱或其他身份，先用 [`../../lark-contact/SKILL.md`](../../lark-contact/SKILL.md) 解析。\n- **先读控件参数 reference 和值来源 reference，再读本文里的创建参数规则。** 提单前必须先阅读 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 和 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md)。\n- **`approvals.get.form` 不是创建 payload 的原样模板。** 它主要用于识别控件 `id`、`type`、选项值范围和明细子控件结构；真正的 `instances create --data.form` 中，控件 `value` 结构以 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 为准。\n- **节点参数只从 `node_list` 和本文里的节点参数规则里取。** 节点 key 必须来自定义详情返回的节点标识；审批人/抄送人列表传用户 ID 时，不要混用姓名或其他身份标识。\n- **看到 `need_approver=true` 就说明该节点需要发起人补充审批人。** 如果 `approver_chosen_multi=false`，该节点只允许一个 `open_id`。\n- **创建实例前先确认。** `approval instances create` 是写操作，执行前，让用户确认最终定义、表单值和节点参数；真正执行时显式传 `--yes`。\n\n## 适用场景\n\n- “帮我提交一个请假审批”\n- “帮我发起报销审批”\n- “我想提一个出差审批”\n- “先搜可发起的审批，再帮我提单”\n\n## 严禁行为\n\n- **严禁在未先阅读本文中的创建参数规则、[`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 和 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md) 的情况下直接提单。**\n- **严禁跳过 `approvals.get`。** 未拿到 `form` 和 `node_list` 前，不得调用 `instances create`。\n- **严禁把姓名直接写进 `node_approver_list`、`node_cc_list` 或表单人员控件。** 必须先转成 `open_id`。\n- **严禁对三方定义调用 `instances create`。**\n- **严禁对 API 不支持的控件硬提单。** 如果目标定义包含创建实例 API 不支持的控件，应明确告诉用户该定义不能仅通过 API 完整发起。\n- **严禁把 `approvals.get.form` 当成可直接提交的原样模板。**\n- **严禁在未得到用户确认前直接执行真实提单。**\n\n## 工作流\n\n### 1. 搜索可发起审批定义\n\n先搜索定义：\n\n```bash\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}'\n```\n\n处理规则：\n\n- 若结果为空，告诉用户当前关键词下没有可发起定义。\n- 若命中多个定义，必须把候选项列给用户选择，不要自行猜测。\n- 若目标定义 `is_external=true`，优先返回 `create_link`，说明这是三方定义，不能走原生 `instances create`。\n- 只有 `is_external=false` 的原生定义才继续下一步。\n\n### 2. 获取审批定义详情\n\n拿到 `approval_code` 后，读取定义详情：\n\n```bash\nlark-cli approval approvals get \\\n  --params '{\"approval_code\":\"7C468A54-8745-2245-9675-08B7C63E7A85\"}'\n```\n\n重点关注返回：\n\n- `approval_name`: 当前发起的是哪个审批定义。\n- `form`: 表单定义快照，用于识别控件 `id`、`type`、选项值范围以及明细子控件结构；不是创建实例时可直接原样提交的 payload 模板。\n- `node_list`: 流程节点信息，是后续 `node_approver_list` / `node_cc_list` 的唯一可靠来源。\n\n### 3. 创建请求参数速查\n\n输入参数如下：\n\n| 参数 | 必填 | 说明 |\n|---|---|---|\n| `--data '{...}'` | 是 | 请求体，使用 JSON 传入 |\n| `approval_code` | 是 | 审批定义 Code；必须先通过 `approvals search` / `approvals get` 确认 |\n| `form` | 否 | 表单值，**JSON 数组字符串**，不是普通对象；API 层非必填，但审批定义存在必填控件或用户需要提交表单值时必须传 |\n| `node_approver_list` | 否 | 节点审批人列表；仅在定义要求补充审批人时传 |\n| `node_cc_list` | 否 | 节点抄送人列表；仅在用户明确需要补充节点抄送人时传 |\n| `uuid` | 否 | 幂等标识；重复重试同一请求时建议显式传入 |\n| `--as user` | 否 | 建议显式指定用户身份；审批发起通常应使用用户身份 |\n| `--yes` | 是 | 写操作确认；真实执行时必须显式传入 |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n### 4. 组装 `form`\n\n`instances create --data.form` 是可选字段；传入时必须是一个 JSON 数组字符串。无表单或无需填写表单值的审批可省略 `form`，但只要审批定义包含需要提交的控件，就必须按控件结构组装后传入。组装原则：\n\n- 先用 `approvals.get.form` 识别有哪些控件、每个控件的 `id` / `type` / 可选值范围，再按本文中的创建参数规则与 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 重新组装创建 payload。\n- 提交时必须至少保证每个控件的 `id`、`type` 与 `value` 符合当前接口要求；不要假设定义快照里出现的其他字段都能直接照搬。\n- 如果用户提供的是人员信息，优先转换成 `open_id` 后再写入对应控件。\n- 单选/多选控件提交的是选项 `value`，该值可从 `approvals.get.form` 的选项定义中取得。\n- `contact`、`department`、`fieldList`、`dateInterval`、`amount`、`telephone`、`document` 等控件的 `value` 结构各不相同，必须按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 单独组装，不要套用文本控件的写法。\n- 值本身从哪里拿，优先按 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md) 处理；不要把“知道结构”误当成“已经拿到可提交值”。\n- 若 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 标明某控件不支持通过创建实例 API 提交，则不要硬猜绕过；应明确告诉用户该定义当前无法仅通过 API 提单。\n- 若遇到当前 skill 未明确覆盖的复杂控件，不要硬猜；先依据 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 判断支持性与传值结构，再向用户确认。\n\n## API 不支持的控件\n\n根据 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md)，创建审批实例 API 不支持的控件至少包括：\n\n- `text`\n- `mutableGroup`\n- `account`\n- `serialNumber`\n- `tripGroup`\n- `apaascorehrOnboardingGroup`\n- `apaascorehrRegularateGroup`\n- `remedyGroupV2`\n- `apaascorehrJobAdjustGroup`\n- `apaascorehrOffboardingGroup`\n\n如果目标审批定义包含上述控件，不要继续硬拼 `form`；应直接告诉用户该定义不能仅通过当前 API 完整提单。\n\n## 高频控件速查\n\n优先按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 组装，下面只保留最常用、最容易出错的格式：\n\n- `input` / `textarea`: `value` 是字符串\n- `date`: `value` 是 RFC3339 时间字符串\n- `dateInterval`: `value` 是对象，包含 `start` / `end` / `interval`\n- `radio` / `radioV2`: `value` 是单个选项值，取定义详情里的 `option.value`；关联外部选项时传 `options.id`\n- `checkbox` / `checkboxV2`: `value` 是选项值数组\n- `number`: `value` 是数字\n- `amount`: `value` 是数字，还要带 `currency`\n- `formula`: `value` 必须与定义中的公式结果匹配，否则会报错\n- `contact`: 只推荐写 `open_ids`，由人员信息先转换成 `open_id`\n- `connect`: `value` 是关联审批实例 `instance_code` 数组，当前默认要求用户直接提供 `instance_code`\n- `document`: `value` 是对象，至少含 `token` 和 `type=docx`\n- `attachmentV2` / `image` / `imageV2`: `value` 是 file code 数组，当前默认要求用户直接提供\n- `fieldList`: `value` 是二维数组，子项继续按各自控件类型组装\n- `department`: `value` 是对象数组，元素字段名为 `open_id`，其值填写部门的 `open_department_id`\n- `telephone`: `value` 是对象，包含 `countryCode` 和 `nationalNumber`\n- `address`: `value` 是对象数组，至少包含地理库 `id`，可选 `detailAddress`；当前默认要求用户直接提供该 `id`\n\n## 特殊控件组\n\n[`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 还明确给出了若干特殊控件组的提单格式，至少包括：\n\n- `leaveGroupV2`\n- `workGroup`\n- `outGroup`\n- `shiftGroup`\n\n这类控件组不是简单文本控件，通常内部还嵌套 `radioV2`、`date`、`fieldList`、`image`、`contact` 等子控件。遇到这些控件组时：\n\n- 先从 `approvals.get.form` 找到控件组及其子控件 ID\n- 再严格按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 的示例组装 `value`\n- 不要把控件组整体当成普通字符串或扁平对象提交\n\n### 5. 组装节点参数\n\n从 `node_list` 推导节点参数：\n\n- 若某节点 `need_approver=true`，则必须在 `node_approver_list` 中补该节点的审批人。\n- `key` 优先取 `custom_node_id`；若不存在，再用 `node_id`。\n- `value` 是审批人 `open_id` 列表。\n- 若 `approver_chosen_multi=false`，该节点只允许一个审批人 `open_id`。\n- `node_cc_list` 仅在用户明确需要补充节点抄送人时才填写；其 `key/value` 规则与 `node_approver_list` 相同。\n\n### 6. 创建审批实例\n\n创建命令使用 `approval instances create`，需要的 scopes: [\"approval:instance:write\"]\n\n确认最终表单值和节点参数后再执行：\n\n```bash\nlark-cli approval instances create \\\n  --data '{\n    \"approval_code\":\"7C468A54-8745-2245-9675-08B7C63E7A85\",\n    \"form\":\"[{\\\"id\\\":\\\"widget1\\\",\\\"type\\\":\\\"input\\\",\\\"value\\\":\\\"请假半天\\\"}]\",\n    \"node_approver_list\":[\n      {\n        \"key\":\"manager_node_id\",\n        \"value\":[\"ou_xxx\"]\n      }\n    ]\n  }' \\\n  --as user \\\n  --yes\n```\n\n执行规则：\n\n- 执行前先向用户确认：目标审批定义、核心表单值、节点审批人/抄送人。\n- 若需要幂等，可补 `uuid`。\n- 成功后回报 `instance_code` 与 `instance_link`。\n\n## 组装时优先依据的资料\n\n优先级固定如下：\n\n1. 本文中的创建请求参数、节点参数和返回结果说明：决定 `instances create` 要传哪些字段、怎么执行、成功后回什么。\n2. [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md)：决定每种控件的 `value` 结构与支持范围。\n3. [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md)：决定每类值应该从哪里拿，以及当前哪些值必须由用户直接提供。\n4. `approvals.get.form`：提供当前审批定义里实际有哪些控件、控件 `id`、控件 `type`、选项值范围、明细子控件结构。\n5. `approvals.get.node_list`：提供节点 key 与是否需要补充审批人/抄送人的线索。\n\n不要反过来把 `approvals.get.form` 当成第一优先级，更不要把它当成可直接提交的 JSON 模板。\n\n## 最小判断表\n\n| 你手上有什么 | 下一步 |\n|---|---|\n| 只有口语需求，比如“帮我提个请假审批” | 先 `approvals.search` |\n| 已经拿到 `approval_code` | 直接 `approvals.get` |\n| 已拿到 `form` / `node_list`，且用户已给出表单值和审批人 | 组装 `instances create` |\n| `is_external=true` | 返回 `create_link`，不要调 `instances create` |\n\n## 返回结果\n\n完成创建后，至少向用户返回：\n\n- `approval_name`\n- `instance_code`\n- `instance_link`\n\n建议整理为下面这种结构：\n\n```text\n审批已创建成功：\n\n- approval_name: 请假申请\n- instance_code: 19EAC829-F1CB-527F-BE2A-1330422E60C0\n- instance_link: https://...\n```\n","isInternal":false,"tokens":4130,"sizeBytes":12675},{"name":"lark-approval-instance-form-control-parameters.md","path":"skills/lark-approval/references/lark-approval-instance-form-control-parameters.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-instance-form-control-parameters.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# 审批实例表单控件参数\n\n> 说明：本文尽量保留上游参数文档的原始结构与示例，用于回答“控件 `value` 长什么样”。\n> 当前 `lark-cli` 的推荐取值口径以 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md) 为准；如果两份文档在“值从哪里拿”上存在差异，以后者为准。\n\n在调用创建审批实例接口时需要使用表单控件参数，你可以通过本文了解审批实例内各表单控件的参数说明。\n\n## 准备工作\n\n审批实例的表单控件参数依据审批定义表单来配置，例如，审批定义的表单设计包括了 **单行文本** 和 **日期区间** 控件，则审批实例的表单控件参数就需要为 **单行文本** 和 **日期区间** 控件进行赋值。因此，在操作审批实例表单的控件参数前，应先通过审批定义详情确认表单控件结构。\n\n## 审批实例 API 不支持的控件\n\n创建审批实例 API 未完全支持所有的审批表单控件，不支持的控件如下表所示。如果你必须使用 API 不支持的控件，则不能仅通过当前 API 完成提单。\n\n**控件/控件组** | **Type**                    |\n| ---------- | --------------------------- |\n| 说明         | text                        |\n| 引用多维表格     | mutableGroup                |\n| 收款账户       | account                     |\n| 流水号        | serialNumber                |\n| 出差控件组      | tripGroup                   |\n| 录用控件组      | apaascorehrOnboardingGroup  |\n| 转正控件组      | apaascorehrRegularateGroup  |\n| 补卡控件组      | remedyGroupV2               |\n| 调岗控件组      | apaascorehrJobAdjustGroup   |\n| 离职控件组      | apaascorehrOffboardingGroup\n\n## 通用参数\n\n审批实例的表单控件均包含的参数如下表所示。\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nid | string | 是 | 控件的 ID，需要与审批定义中的控件 ID 保持一致。\ntype | string | 是 | 控件类型。各控件类型取值参见下文 **不同控件的参数** 章节。\nvalue | 不同控件的类型不同 | 是 | 控件的取值。不同控件 value 数据类型也不同，例如单行文本控件的 value 为字符串、联系人的 value 为数组。详情参见下文 **不同控件的参数** 章节。\n\n## 不同控件的参数\n\n本章节提供不同控件的 type 参数值、JSON 示例以及非通用参数说明。\n\n### 单行文本\n\n控件 type 为 input，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"input\",\n    \"value\": \"data\" // string 类型\n}\n```\n\n### 多行文本\n\n控件 type 为 textarea，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"textarea\",\n    \"value\": \"data\" // string 类型\n}\n```\n\n### 日期\n\n控件 type 为 date，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"date\",\n    \"value\": \"2019-10-01T08:12:01+08:00\" // 需满足 RFC3339 格式的 string 类型\n}\n```\n\n### 日期区间\n\n控件 type 为 dateInterval，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"dateInterval\",\n    \"value\": {\n         \"start\":\"2019-10-01T08:12:01+08:00\",\n         \"end\":\"2019-10-02T08:12:01+08:00\",\n         \"interval\": 1.0\n     }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nstart | string | 是 | 开始时间，需满足 RFC3339 格式。\nend | string | 是 | 结束时间，需满足 RFC3339 格式。\ninterval | float | 是 | 时长（天）。\n\n### 单选\n\n控件 type 为 radio/radioV2，JSON 数据示例：\n\n```json\n{                                     \n    \"id\": \"widget1\",\n    \"type\": \"radioV2\",\n    \"value\": \"k2b8mkx0-h71x5gl1234-1\" // string 类型\n}\n```\n\n其中， value 表示选项值，取值范围需要参考相应审批定义中 **单选** 控件 option 的 value 参数。你可以通过审批定义详情返回的 `form` 参数，获取单选控件 option 的 value 取值。如果控件关联了外部选项，则 value 需要传入外部选项的 `options.id`。\n\n### 多选\n\n控件 type 为 checkbox/checkboxV2，JSON数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"checkboxV2\",\n    \"value\": [\"k2b8mkx0-h71x5gl4321-1\"] // string 类型的数组\n}\n```\n其中， value 表示选项值，取值范围需要参考相应审批定义中 **多选** 控件 option 的 value 参数。你可以通过审批定义详情返回的 `form` 参数，获取多选控件 option 的 value 取值。如果控件关联了外部选项，则 value 需要传入外部选项的 `options.id`。\n\n### 数字\n\n控件 type 为 number，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"number\",\n    \"value\": 1234.5678 // float 类型\n}\n```\n\n### 金额\n\n控件 type 为 amount，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"amount\",\n    \"value\": 1234.5678, // float 类型\n    \"currency\":\"USD\"\n}\n```\n\n其中，currency 表示货币种类，取值范围需要参考相应审批定义中 **金额** 控件的 value 参数。你可以通过审批定义详情返回的 `form` 参数，获取金额控件可设置的货币种类。\n\n### 计算公式\n\n控件 type 为 formula，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"formula\",\n    \"value\": 1234.5678 // 该值由审批定义内配置的公式计算出取值，若不匹配则返回报错。\n}\n```\n\n### 联系人\n\n控件 type 为 contact，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"contact\",\n    \"value\": [\"f8ca557e\"], // string 类型的数组\n    \"open_ids\": [\"ou_12345\"] // string 类型的数组\n}\n```\n其中，value 包含的是用户 `user_id`；open_ids 包含的是用户 `open_id`。\n\n### 关联审批\n\n控件 type 为 connect，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"connect\",\n    \"value\": [\"19EAC829-F1CB-527F-BE2A-1330422E60C0\"] // string 类型的数组\n}\n```\n其中，value 包含的是被关联的审批实例 Code，你可以通过审批实例详情能力根据实例 Code 获取实例详情。\n\n### 文档控件\n\n控件 type 为 document，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"document\",\n    \"value\": {\n           \"token\":\"TLLKdcpDro9ijQxA33ycNMabcef\",\n           \"type\":\"docx\",\n    }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\ntoken | string | 是 | 文档的 document_id。\ntype | string | 是 | 文档类型，支持 `docx`。\n\n### 附件\n\n控件 type 为 attachmentV2，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"attachmentV2\",\n    \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"] // string 类型的数组\n}\n```\n其中，value 包含的是上传文件后返回的文件 code。\n\n### 图片\n\n控件 type 为 image/imageV2，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"image\",\n    \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"] // string 类型的数组\n}\n```\n\n其中，value 包含的是上传文件后返回的文件 code。\n\n### 明细/表格\n\n控件 type 为 fieldList，JSON 格式示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"fieldList\",\n    \"value\": [\n         [   \n            {\n                \"id\": \"widget1\",\n                \"type\": \"checkbox\",\n                \"value\": [\"jxpsebqp-0\"]\n            }\n         ]\n     ]\n}\n```\n\n其中 value 是二维数组，根据审批定义内 **明细/表格** 控件所包含的控件，依次设置控件 JSON 值。\n\n### 部门\n\n控件 type 为 department，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"department\",\n    \"value\":[ \n        {\n            \"open_id\": \"od-xxx\"\n        }\n    ]\n}\n```\n\n其中 value 为对象数组，通过 open_id 设置部门的 open_department_id。\n\n### 电话\n\n控件 type 为 telephone，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"telephone\",\n    \"value\": {\n        \"countryCode\":\"+86\",\n        \"nationalNumber\":\"13122222222\"\n    }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\ncountryCode | string | 是 | 区号。\nnationalNumber | string | 是 | 电话号。\n\n### 地址\n控件 type 为 address，JSON 数据示例：\n\n```json\n{\n\t\"id\": \"widget1\",\n\t\"type\": \"address\",\n\t\"value\": [{\n\t\t\"id\": \"290557\",\n\t\t\"detailAddress\": \"详细的地址\"\n\t}]\n}\n```\n\nvalue 参数为 []object 类型，参数说明如下：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nvalue | []object | 是 | 非出差控件组场景地址控件仅支持单个地址，传入多个时默认只取第一个\n└ id | string | 是 | 区域ID, 可通过审批的地理库接口获取\n└ detailAddress | string | 否 | 详细的地址，若表单配置中未开启填写详细地址，则会忽略该参数，即使传入也不会生效\n\n### 换班控件组\n\n控件 type 为 shiftGroup，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"shiftGroup\",\n    \"value\": {\n         \"shiftTime\": \"2019-10-01T08:12:01+08:00\",\n         \"returnTime\": \"2019-10-02T08:12:01+08:00\",\n         \"reason\": \"ask for leave\"\n     }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nshiftTime | string | 是 | 换班时间，需满足 RFC3339 格式。\nreturnTime | string | 是 | 对调日期，需满足 RFC3339 格式。\nreason | string | 是 | 换班原因。\n\n### 请假控件组\n\n**请假控件组请求示例**\n```json\n{\n    \"id\": \"widgetLeaveGroupV2\",\n    \"type\": \"leaveGroupV2\",\n    \"value\": [\n      {\n        \"id\": \"widgetLeaveGroupType\",\n        \"type\": \"radioV2\",\n        \"value\": \"7488925543484620819\"\n      },\n      {\n        \"id\": \"widgetLeaveGroupStartTime\",\n        \"type\": \"date\",\n        \"value\": \"2025-08-25T11:30:00+08:00\"\n      },\n      {\n        \"id\": \"widgetLeaveGroupEndTime\",\n        \"type\": \"date\",\n        \"value\": \"2025-08-26T11:35:00+08:00\"\n      },\n      {\n        \"id\": \"widgetLeaveGroupReason\",\n        \"type\": \"textarea\",\n        \"value\": \"123123\"\n      },\n      {\n        \"id\": \"widgetLeaveCertification\",\n        \"type\": \"image\",\n        \"value\": [\n          \"B69F8E26-0EAA-4A92-9B80-DA613CD36136\"\n        ]\n      },\n      {\n        \"id\":\"widgetLeaveCertification\",\n        \"type\":\"image\",\n        \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]\n      },\n      {                                     \n        \"id\": \"widgetLeaveGroupFeedingArrivingLate\",\n        \"type\": \"radioV2\",\n        \"value\": \"30\"\n      },\n      {                                     \n        \"id\": \"widgetLeaveGroupFeedingOffLeaveEarly\",\n        \"type\": \"radioV2\",\n        \"value\": \"30\"\n      }        \n    ]\n}\n```\n\n**请假控件组包含参数说明：**\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nid | string | 是 | 控件组ID，固定为widgetLeaveGroupV2\ntype | string | 是 | 控件组类型，固定为leaveGroupV2\nvalue | object[] | 是 | 控件组的值，值为多个子控件值的列表\n\nvalue中包含的子控件值说明:\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nwidgetLeaveGroupType | radioV2 | ```<br>{<br>\"id\": \"widgetLeaveGroupType\",<br>\"type\": \"radioV2\",<br>\"value\": \"7488925543484620819\"<br>}<br>``` | 假期类型，具体格式可参考单选控件，选项由假勤接口获取，提单时必须包含该控件\nwidgetLeaveGroupStartTime | date | ```<br>{<br>\"id\": \"widgetLeaveGroupStartTime\",<br>\"type\": \"date\",<br>\"value\": \"2019-10-01T08:12:01+08:00\", // 需满足 RFC3339 格式的 string 类型<br>}    <br>``` | 请假开始时间，具体格式可参考日期控件，会根据假期类型自动取整,其中半天假小于12点则认为是上午，小时假则以半小时为粒度向前取整, 提单时必须包含该控件\nwidgetLeaveGroupEndTime | date | ```<br>{<br>\"id\": \"widgetLeaveGroupEndTime\",<br>\"type\": \"date\",<br>\"value\": \"2019-10-01T08:12:01+08:00\", // 需满足 RFC3339 格式的 string 类型<br>}<br>``` | 请假结束时间，具体格式可参考日期控件，会根据假期类型自动取整，其中半天假小于12点则认为是上午，小时假则以半小时为粒度向后取整\nwidgetLeaveGroupReason | textarea | ```<br>{<br>\"id\": \"widgetLeaveGroupReason\",<br>\"type\": \"textarea\",<br>\"value\": \"123123\"<br>}<br>``` | 请假事由，具体格式可参考多行文本控件，哺乳假无需填写，其他情况则根据控件组配置中该控件是否可见以及必填判断\nwidgetLeaveCertification | image | ```<br>{<br>\"id\":\"widgetLeaveCertification\",<br>\"type\":\"image\",<br>\"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]<br>}<br>``` | 请假证明，具体格式可参考图片控件，如果所选假期类型配置要求补充证明则必须传递该值，缺失会报错\nwidgetLeaveGroupFeedingArrivingLate | radioV2 | ```<br>{                                     <br>\"id\": \"widgetLeaveGroupFeedingArrivingLate\",<br>\"type\": \"radioV2\",<br>\"value\": \"30\"<br>}<br>``` | 上班晚到的分钟数，具体格式可参考单选控件，仅哺乳假需要填写，取值范围是0-120分钟，粒度是15分钟，选项从审批定义中该控件的option中获取\nwidgetLeaveGroupFeedingOffLeaveEarly | radioV2 | ```<br>{                                     <br>\"id\": \"widgetLeaveGroupFeedingOffLeaveEarly\",<br>\"type\": \"radioV2\",<br>\"value\": \"30\"<br>}   <br>``` | 下班早走的分钟数，具体格式可参考单选控件，仅哺乳假需要填写，取值范围是0-120分钟，粒度是15分钟，选项即是分钟对应的字符串\n\n**特殊的参数校验报错信息**\nmessage                                            | 说明                           |\n| -------------------------------------------------- | ---------------------------- |\n| leave type id parse error                          | 请假类型不是int64                  |\n| group value is invalid                             | 当前控件组的值无效，请校验是否为空或者校验类型是否为数组 |\n| start time format is not RFC3339                   | 开始时间日期格式非*RFC3339格式*         |\n| end time format is not RFC3339                     | 结束时间日期格式非*RFC3339格式*         |\n| start time is after end time                       | 开始时间晚于结束时间                   |\n| user not in gray                                   | 申请用户不在假勤灰度内                  |\n| leave type not found                               | 请假类型不存在                      |\n| reason is required                                 | 请假原因未填写                      |\n| leave quote should be bigger than 0                | 请假时长需要大于0                    |\n| leave is conflict                                  | 所选时间内已有请假记录，请选择其他时间          |\n| balance is not enough                              | 当前假期类型下假期余额不足                |\n| certification is required                          | 需要上传请假证明                     |\n| arriving late is required                          | 哺乳假需要填写上班晚到时长                |\n| arriving late value is not in the optional items   | 晚到时间不在可选范围内                  |\n| leaving early is required                          | 哺乳假需要填写下班提前时长                |\n| leaving early value is not in the optional items   | 下班提前时间不在可选范围内                |\n| feeding rest daily is 0                            | 哺乳假每日休息时长为0，请重新选择            |\n| the operation is prohibited by the workforce rules | 当前账户已在假勤侧封账，无法提交\n\n### 加班控件组\n\n**加班控件组请求示例**\n```json\n{\n  \"id\": \"widgetWorkGroup\",\n  \"type\": \"workGroup\",\n  \"value\":[\n    {\n      \"id\":\"widgetWorkGroupOvertimeWorkers\",\n      \"type\":\"contact\",\n      \"value\": [\"f8ca557e\"],\n      \"open_ids\": [\"ou_12345\"]\n    },\n    {\n      \"id\": \"widgetWorkGroupType\",\n      \"type\": \"radioV2\",\n      \"value\": \"7259635026038505475\"\n    },\n    {\n      \"id\":\"widgetWorkGroupTimeRangeFieldList\",\n      \"type\":\"fieldList\",\n      \"value\":[\n        [\n          {\n            \"id\":\"widgetWorkGroupStartTime\",\n            \"type\":\"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n          },\n          {\n            \"id\":\"widgetWorkGroupEndTime\",\n            \"type\":\"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n          }\n        ]\n      ]\n    },\n    {\n      \"id\": \"widgetWorkGroupReason\",\n      \"type\": \"textarea\",\n      \"value\": \"111\"\n    }\n  ]\n}\n\n```\n\n**加班控件组参数说明：**\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nid | string | 是 | 控件组ID，固定为widgetWorkGroup\ntype | string | 是 | 控件组类型，固定为workGroup\nvalue | object[] | 是 | 控件组的值，值为多个子控件值的列表\n\nvalue中包含的子控件值说明:\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nwidgetWorkGroupOvertimeWorkers | contact | ```<br>{<br>\"id\":\"widgetWorkGroupOvertimeWorkers\",<br>\"type\":\"contact\",<br>\"value\": [\"f8ca557e\"], <br>\"open_ids\": [\"ou_12345\"]<br>}<br>``` | 加班人员列表，具体格式可参考联系人控件，如果定义中配置「允许代多人提交」则该字段必填，如果是提交人给自己提交需填写提交人的ID\nwidgetWorkGroupType | radioV2 | ```<br>{<br>\"id\": \"widgetWorkGroupType\",<br>\"type\": \"radioV2\",<br>\"value\": \"7259635026038505475\" // 对应的类型选项ID<br>}<br>``` | 加班类型，具体格式可参考单选控件，如果定义中关闭「关联加班规则」则需要填写该字段\nwidgetWorkGroupTimeRangeFieldList | fieldList | ```<br>{<br>\"id\":\"widgetWorkGroupTimeRangeFieldList\",<br>\"type\":\"fieldList\",<br>\"value\":[<br>[<br>{<br>\"id\":\"widgetWorkGroupStartTime\",<br>\"type\":\"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>},<br>{<br>\"id\":\"widgetWorkGroupEndTime\",<br>\"type\":\"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>}<br>]<br>]<br>}<br>``` | 加班时段，具体格式可参考明细控件，如果定义中打开「允许提交多个加班时段」则可以传多个，最多支持30个，否则只会取第一个，单次加班时长不可超过两天\nwidgetWorkGroupReason | textarea | ```<br>{<br>\"id\": \"widgetWorkGroupReason\",<br>\"type\": \"textarea\",<br>\"value\": \"111\"<br>}<br>``` | 加班事由，如果定义中配置了「加班事由」必填，则必须填写该字段\n\n**特殊的参数校验报错信息**\nmessage                                                                            | 说明                           |\n| ---------------------------------------------------------------------------------- | ---------------------------- |\n| the time range list has more than 30 items                                         | 加班时段数量超过30                   |\n| group value is invalid                                                             | 当前控件组的值无效，请校验是否为空或者校验类型是否为数组 |\n| overtime type is required                                                          | 未关联加班规则时，加班类型必填              |\n| work time range is required                                                        | 至少需要一个加班时段                   |\n| start time is after end time                                                       | 开始时间晚于结束时间                   |\n| start time or end time of range is required                                        | 加班时间段的开始时间和结束时间必填            |\n| overtime duration is over 2 days                                                   | 单次加班时长不可超过两天                 |\n| overtime date time zone not support                                                | 加班时段的日期时区信息无法识别              |\n| {date} can not apply overtime                                                      | 所选时间不可申请加班                   |\n| {date} already apply overtime                                                      | 所选时间已经有加班记录                  |\n| {date} no need approval                                                            | 所选日期加班无需申请                   |\n| apply reason is required                                                           | 定义中设置了加班事由为必填，不可为空           |\n| {users} user follow different overtime rules, cannot be submitted in the same form | 所选加班人不在同一个考勤组内，无法同时提交加班      |\n| invalid overtime work application                                                  | 没有有效的加班申请，请重新选择加班日期          |\n| the overtime duration cannot be 0                                                  | 加班时长不能是0                     |\n| the number of apply workers cannot exceed 50                                       | 单次申请加班人数量不可大于50              |\n| apply worker is required                                                           | 必须有加班人，配置置可代多人提交时必须指定加班人     |\n| resigned worker can not apply                                                      | 离职人员不可申请加班                   |\n| overtime duration is over limit                                                    | 加班时长超过限制\n\n### 外出控件组\n\n**外出控件组请求体示例**\n```json\n{\n    \"id\": \"widgetOutGroup\",\n    \"type\": \"outGroup\",\n    \"value\":[\n        {\n            \"id\": \"widgetOutGroupType\",\n            \"type\": \"radioV2\",\n            \"value\":  \"me15yqrf-gmjgbml2vhp-0\"      \n        },\n        {\n            \"id\": \"widgetOutGroupStartTime\",\n            \"type\": \"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n        },\n        {\n            \"id\": \"widgetOutGroupEndTime\",\n            \"type\": \"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n        },\n        {\n            \"id\": \"widgetOutGroupReason\",\n            \"type\": \"textarea\",\n            \"value\":\"123213\"\n        },\n        {\n            \"id\":\"widgetOutGroupImage\",\n            \"type\":\"image\",\n            \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]\n        }                    \n    ]   \n}\n\n```\n\n**外出控件参数说明**\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nid | string | 是 | 控件组ID，固定为widgetOutGroup\ntype | string | 是 | 控件组Type，固定为outGroup\nvalue | object[] | 是 | 控件组的值，值为多个子控件值的列表\n\nvalue中包含的子控件值说明:\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nwidgetOutGroupType | radioV2 | ```<br>{<br>\"id\": \"widgetOutGroupType\",<br>\"type\": \"radioV2\",<br>\"value\":  \"me15yqrf-gmjgbml2vhp-0\"      <br>}<br>``` | 外出类型，具体格式可参考单选控件，如果配置了「外出类型」则必填，外出时长单位会选取所选外出类型关联的单位，如果没有配置「外出类型」，则该字段无需填写，计算外出时长时会选取「外出时长」配置的单位\nwidgetOutGroupStartTime | date | ```<br>{<br>\"id\": \"widgetOutGroupStartTime\",<br>\"type\": \"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>}<br>``` | 外出开始时间，具体格式可参考日期控件，如果外出时长单位是半天假，则小于12点则认为是上午，否则认为是下午；如果单位是小时，则会按半小时的粒度向前取整\nwidgetOutGroupEndTime | date | ```<br>{<br>\"id\": \"widgetOutGroupEndTime\",<br>\"type\": \"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>}<br>``` | 外出结束时间，具体格式可参考日期控件，如果外出时长单位是半天假，则小于12点则认为是上午，否则认为是下午；如果单位是小时，则会按半小时的粒度向后取整\nwidgetOutGroupReason | textarea | ```<br>{<br>\"id\": \"widgetOutGroupReason\",<br>\"type\": \"textarea\",<br>\"value\":\"123213\"<br>}<br>``` | 外出事由，具体格式可参考多行文本控件，如果定义中「外出事由」必填，则必须填写该控件，如果定义配置无需填写，则无需填写该控件\nwidgetOutGroupImage | image | ```<br>{<br>\"id\":\"widgetOutGroupImage\",<br>\"type\":\"image\",<br>\"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]<br>}   <br>``` | 外出证明，具体格式可参考图片控件，如果定义中「外出拍照」必填，则必须填写该控件，如果定义配置无需填写，则无需填写该控件\n\n**特殊的参数校验报错信息**\n\nmessage                                               | 说明                           |\n| ----------------------------------------------------- | ---------------------------- |\n| group value is invalid                                | 当前控件组的值无效，请校验是否为空或者校验类型是否为数组 |\n| start time format is not RFC3339                      | 开始时间日期格式非*RFC3339格式*         |\n| end time format is not RFC3339                        | 结束时间日期格式非*RFC3339格式*         |\n| start time and end time must be in the same time zone | 开始时间与结束时间必须是同一时区             |\n| out type is required                                  | 如果定义中设定了「外出类型」，则外出类型必填       |\n| out start time is required                            | 外出开始时间必填                     |\n| out end time is required                              | 外出结束时间必填                     |\n| out duration must be greater than 0                   | 外出间隔不能为0，请检查起止时间并重新选择        |\n| out reason is empty                                   | 如果定义中勾选「外出事由」同时设定必填，则该字段必填   |\n| photo is required                                     | 如果定义中勾选「外出拍照」同时设定必填，则该字段必填   |\n| out time is conflict                                  | 外出时间有冲突，请确认是否已在该时段申请外出\n","isInternal":false,"tokens":7696,"sizeBytes":26155},{"name":"lark-approval-instance-value-sourcing.md","path":"skills/lark-approval/references/lark-approval-instance-value-sourcing.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-instance-value-sourcing.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# 审批提单值来源\n\n## 目的\n\n本文用于回答一个固定问题：在调用 `approval instances create` 发起原生审批实例时，**每个要填写的值从哪里拿**。\n\n阅读顺序固定如下：\n\n1. [`lark-approval-initiate.md`](./lark-approval-initiate.md) 中的创建请求参数、节点参数和返回结果说明\n2. `approval approvals get` 返回的 `form` / `node_list`\n3. [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md)\n4. 本文\n\n## 总原则\n\n- `lark-approval-initiate.md` 决定创建请求字段名、字段层级、节点参数结构。\n- `approvals.get.form` 决定控件 `id`、`type`、选项值范围、子控件结构。\n- `approvals.get.node_list` 决定节点 key、是否必须补审批人、是否允许多人。\n- [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 决定各控件 `value` 的最终结构。\n- 除非本文明确允许，否则不要猜值来源，不要把展示文案直接当成可提交值。\n\n## 默认来源\n\n- 审批定义、`approval_code`、`is_external`、`create_link` 等基础信息，默认从 `approval approvals search` 获取。\n- 控件 `id`、`type`、选项值、子控件结构，默认从 `approval approvals get.form` 获取。\n- 节点 key、`need_approver`、`approver_chosen_multi` 等节点信息，默认从 `approval approvals get.node_list` 获取。\n- 本文只补充 **这些默认来源之外** 的取值规则，以及当前必须由用户直接提供的值。\n\n## 控件值来源规则\n\n### 联系人 `contact`\n\n- 只推荐写 `open_ids`。\n- 不再推荐双写 `value(user_id)` + `open_ids`，避免复杂度继续上升。\n- 如果用户给的是姓名、邮箱或账号，先用 `lark-contact` 解析成 `open_id`。\n\n### 部门 `department`\n\n- 最优先：用户直接提供 `open_department_id`。\n- 若用户说“我的部门”或“张三的部门”，先用 `lark-contact` 查询对应人员信息，再取其所属部门里的 `open_department_id`。\n- 如果查到该人员只有一个部门，可直接使用。\n- 如果查到多个部门，不自动猜，必须让用户明确选一个，或直接输入 `open_department_id`。\n- 如果仍无法确定，则明确告知当前不支持自动决定部门值。\n\n### 附件 `attachmentV2`\n\n- 当前 `lark-approval` 不负责上传文件。\n- 用户必须直接提供 file code。\n- 如果用户无法提供 file code，应明确告知当前无法仅通过 `lark-approval` 完成该控件提单。\n\n### 图片 `image` / `imageV2`\n\n- 当前 `lark-approval` 不负责上传图片。\n- 用户必须直接提供 file code。\n- 如果用户无法提供 file code，应明确告知当前无法仅通过 `lark-approval` 完成该控件提单。\n\n### 文档 `document`\n\n- 用户可直接提供 `token` / `document_id`。\n- 如果用户给的是飞书文档链接，应先尝试从链接中提取 token。\n- 若链接提取失败，再要求用户手动输入 token。\n\n### 关联审批 `connect`\n\n- 用户直接提供目标审批实例的 `instance_code`。\n- 当前不默认做“搜索关联实例再反查 code”的自动流程。\n\n### 地址 `address`\n\n- 用户直接提供地理库 `id`。\n- 若用户无法提供该 `id`，当前不支持自动取值。\n\n## 特殊控件组\n\n以下控件组的结构仍按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 组装：\n\n- `leaveGroupV2`\n- `workGroup`\n- `outGroup`\n- `shiftGroup`\n\n补充规则：\n\n- 控件组自身和子控件的 `id` / `type` 从 `approval approvals get.form` 中识别。\n- 组内单选/多选或业务枚举值，优先从 `approval approvals get.form` 返回的选项结构中取。\n- 不要把控件组整体当成普通字符串或扁平对象提交。\n\n## 不支持自动准备的值\n\n以下值当前不建议由 `lark-approval` 自动准备：\n\n- 文件上传后的 file code\n- 图片上传后的 file code\n- 地址控件的地理库 `id`\n- 无法唯一确定的部门 `open_department_id`\n\n遇到这类值时，应明确告诉用户需要提供什么，而不是继续猜测。\n\n## 最小决策表\n\n| 场景 | 处理 |\n|---|---|\n| 用户说“找张三当审批人” | 用 `lark-contact` 解析张三，取 `open_id` |\n| 用户说“我的部门” | 先查当前用户部门；若多个部门，让用户选 |\n| 用户给了文档链接 | 先尝试提取 token |\n| 用户要填图片/附件 | 要求直接提供 file code |\n| 用户要填关联审批 | 要求直接提供 `instance_code` |\n| 用户要填地址 | 要求直接提供地理库 `id` |\n","isInternal":false,"tokens":1489,"sizeBytes":4648},{"name":"lark-approval-instances-cancel.md","path":"skills/lark-approval/references/lark-approval-instances-cancel.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-instances-cancel.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"\n# approval instances cancel\n\n撤回一个已发起的审批实例（用户级写操作）。通常先通过 `instances initiated`、`tasks query` 或 `instances get` 确认目标审批实例，拿到 `instance_code` 后再执行撤回。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要撤回该审批实例且目标实例无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:instance:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval instances cancel \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' \\\n  --as user \\\n  --dry-run\n\n# 撤回一个审批实例\nlark-cli approval instances cancel \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体\nlark-cli approval instances cancel \\\n  --data @./cancel-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `instances initiated`、`tasks query` 或 `instances get` 获取 |\n| `--as user` | 否 | 建议显式指定用户身份；审批实例撤回通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n如果你要找“我发起的审批实例”，可先查询已发起列表：\n\n```bash\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n```\n\n如果你已经在任务列表中定位到某个审批，也可以从任务里拿到实例 Code：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `instances[].instance_code` | 审批实例 Code；撤回时必须提供 |\n| `tasks[].instance_code` | 审批任务关联的审批实例 Code；也可作为撤回输入 |\n| `tasks[].instance_status` | 审批实例状态；可用于判断是否仍处于可撤回阶段 |\n\n如需先确认审批表单、当前节点、流转状态，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **撤回的是审批实例，不是单个任务**：`instances cancel` 只需要 `instance_code`，不需要 `task_id`。\n- **优先确认实例是否仍可撤回**：已经通过、已拒绝、已撤销或已终止的实例通常不适合继续撤回。\n- **优先从 `instances initiated` 获取目标实例**：因为撤回通常针对“我发起的审批”，这个入口最直接。\n- **也可从 `tasks query` 反查 `instance_code`**：当你是从某个待办/已办上下文进入时，这样更方便。\n- **先 `--dry-run` 再执行**：尤其在实例来源不明确、用户只给了标题关键字，或一次要核对多个实例时，先预览更安全。\n","isInternal":false,"tokens":1036,"sizeBytes":3180},{"name":"lark-approval-instances-cc.md","path":"skills/lark-approval/references/lark-approval-instances-cc.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-instances-cc.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"\n# approval instances cc\n\n给一个审批实例追加抄送人（用户级写操作）。通常先通过 `instances initiated`、`tasks query` 或 `instances get` 确认目标审批实例，拿到 `instance_code` 后，再提供抄送人的用户 ID 执行抄送。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要抄送该审批实例且目标实例、抄送对象都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:instance:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"ou_xxx\"],\"comment\":\"抄送给项目 owner 了解进展\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --dry-run\n\n# 按 open_id 抄送一个人\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"ou_xxx\"],\"comment\":\"抄送给你知悉\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 一次抄送多个人\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"ou_xxx\",\"ou_yyy\"],\"comment\":\"请相关同学同步关注\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 按 user_id 抄送\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"123456789\"],\"comment\":\"抄送给财务负责人\"}' \\\n  --params '{\"user_id_type\":\"user_id\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体\nlark-cli approval instances cc \\\n  --data @./cc-body.json \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `instances initiated`、`tasks query` 或 `instances get` 获取 |\n| `cc_user_ids` | 是 | 抄送人的用户 ID 数组；需要和 `user_id_type` 保持一致 |\n| `comment` | 否 | 抄送留言，例如 `抄送给你知悉`、`请同步关注该审批进展` |\n| `--params '{\"user_id_type\":\"...\"}'` | 否 | 查询参数 JSON；用于声明 `cc_user_ids` 内用户 ID 的类型 |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id`；未显式指定时要特别确认抄送人的 ID 类型 |\n| `--as user` | 否 | 建议显式指定用户身份；审批实例抄送通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n如果你要找“我发起的审批实例”，可先查询已发起列表：\n\n```bash\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n```\n\n如果你已经在任务列表中定位到某个审批，也可以从任务里拿到实例 Code：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `instances[].instance_code` | 审批实例 Code；抄送时必须提供 |\n| `tasks[].instance_code` | 审批任务关联的审批实例 Code；也可作为抄送输入 |\n| `tasks[].title` | 任务标题，可用于确认是否是要操作的那个审批 |\n| `tasks[].instance_status` | 审批实例状态；可用于判断当前审批是否仍处于进行中 |\n\n如果你手里只有姓名或邮箱，建议先通过联系人能力解析出正确的用户 ID，再执行抄送。\n\n如需先确认审批表单、当前节点、流转状态，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **抄送的是审批实例，不是单个任务**：`instances cc` 只需要 `instance_code`，不需要 `task_id`。\n- **`cc_user_ids` 与 `user_id_type` 必须匹配**：例如传 open_id 就把 `user_id_type` 设为 `open_id`；不要混用。\n- **`cc_user_ids` 是数组**：即使只抄送一个人，也要按数组形式传入。\n- **优先显式传 `user_id_type`**：这样 agent 更容易判断参数含义，也能减少 ID 类型不匹配带来的失败。\n- **优先从 `instances initiated` 获取目标实例**：因为抄送常见于“我发起的审批”场景，这个入口最直接。\n- **也可从 `tasks query` 反查 `instance_code`**：当你是从某个审批上下文进入时，这样更方便。\n- **`comment` 建议简洁明确**：例如 `抄送给你知悉`、`请同步关注审批进展`。避免过长或模糊描述。\n- **先 `--dry-run` 再执行**：尤其在抄送对象较多、抄送人来源不明确，或需要让用户先核对实例标题时，先预览更安全。\n","isInternal":false,"tokens":1631,"sizeBytes":4947},{"name":"lark-approval-instances-get.md","path":"skills/lark-approval/references/lark-approval-instances-get.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-instances-get.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"\n# approval instances get\n\n获取单个审批实例详情（用户级只读操作）。适合在执行 approve / reject / transfer / rollback / cancel / cc / remind 之前，先查看审批表单、当前节点、任务列表、审批动态和整体状态。\n\n需要的 scopes: [\"approval:instance:read\"]\n\n## 命令\n\n```bash\n# 按实例 Code 查询详情\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n\n# 表格格式输出，便于快速浏览顶层字段\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{...}'` | 是 | 查询参数，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code |\n| `locale` | 否 | 返回语言，例如 `zh-CN`、`en-US`、`ja-JP` |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id` |\n| `--as user` | 否 | 建议显式指定用户身份；审批实例详情查询通常应使用用户身份 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 常见输入来源\n\n如果你已经有实例 Code，可直接查询：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n如果你还没有实例 Code，可先从以下命令获取：\n\n```bash\n# 查询我发起的审批实例\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n\n# 或从任务列表里拿到关联实例 Code\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n## 输出重点字段\n\n返回结果中常见字段：\n\n| 字段 | 说明 |\n|------|------|\n| `instance_code` | 审批实例 Code |\n| `serial_number` | 审批单编号 |\n| `definition_code` | 审批定义 Code |\n| `definition_name` | 审批名称 |\n| `user_id` | 发起审批的用户 ID |\n| `department_id` | 发起人所在部门 ID |\n| `status` | 审批实例状态，见下方“status 枚举” |\n| `reverted` | 单据是否已被撤销 |\n| `start_time` | 审批创建时间 |\n| `end_time` | 审批完成时间，未完成时通常为 `0` |\n| `form` | 表单数据，JSON 字符串 |\n| `current_nodes` | 当前审批节点列表 |\n| `tasks` | 审批任务列表 |\n| `operation_records` | 审批动态，例如通过、拒绝、转交、加签、回退、撤回、抄送 |\n| `comments` | 评论列表 |\n\n## status 枚举\n\n| 值 | 含义 |\n|----|------|\n| `PENDING` | 审批中 |\n| `APPROVED` | 已通过 |\n| `REJECTED` | 已拒绝 |\n| `CANCELED` | 已撤回 |\n| `DELETED` | 已删除 |\n\n## current_nodes 重点字段\n\n`current_nodes` 常用于判断审批流当前卡在哪一层：\n\n| 字段 | 说明                                       |\n|------|------------------------------------------|\n| `current_nodes[].node_id` | 当前审批节点 ID                                |\n| `current_nodes[].node_name` | 当前审批节点名称                                 |\n| `current_nodes[].type` | 审批方式：`AND` 会签、`OR` 或签、`SEQUENTIAL` 依次审批等 |\n| `current_nodes[].approvers[].task_id` | 当前审批人关联任务 ID                             |\n| `current_nodes[].approvers[].user_id` | 当前审批人用户 ID                               |\n\n## tasks 重点字段\n\n`tasks` 常用于把实例和具体审批任务关联起来：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].id` | 审批任务 ID |\n| `tasks[].node_id` | 任务所属节点 ID |\n| `tasks[].node_name` | 任务所属节点名称 |\n| `tasks[].user_id` | 审批人用户 ID |\n| `tasks[].status` | 任务状态：`PENDING`、`APPROVED`、`REJECTED`、`TRANSFERRED`、`DONE` |\n| `tasks[].start_time` | 任务开始时间 |\n| `tasks[].end_time` | 任务完成时间 |\n\n## operation_records 重点字段\n\n`operation_records` 常用于审计审批过程：\n\n| 字段 | 说明 |\n|------|------|\n| `operation_records[].type` | 事件类型，如 `PASS`、`REJECT`、`TRANSFER`、`ROLLBACK`、`CANCEL`、`CC` |\n| `operation_records[].create_time` | 事件发生时间 |\n| `operation_records[].user_id` | 触发该事件的用户 ID |\n| `operation_records[].task_id` | 关联任务 ID |\n| `operation_records[].node_id` | 关联节点 ID |\n| `operation_records[].comment` | 理由 / 备注 |\n| `operation_records[].cc_user_ids` | 被抄送人列表（抄送事件时） |\n\n## 使用建议\n\n- **这是最适合做“详情确认”的只读命令**：当你已经拿到 `instance_code`，需要确认表单、当前节点、任务状态、审批动态时，优先使用它。\n- **在执行写操作前先看详情**：例如做 `tasks rollback` 前确认可退回节点，做 `instances cancel` 前确认实例状态，做 `tasks remind` 前确认当前任务是否仍待处理。\n- **`form` 是 JSON 字符串**：调用方通常还需要再解析一层，才能拿到表单字段值。\n- **`current_nodes` 和 `tasks` 可以联动看**：前者看“当前卡在哪个节点”，后者看“每个任务目前由谁处理、状态如何”。\n- **`operation_records` 适合做时间线回溯**：例如排查谁转交过、谁加签过、什么时候撤回或抄送过。\n- **优先显式传 `locale` 和 `user_id_type`**：这样 agent 更容易理解返回文本和 ID 语义，减少歧义。\n\n## 输出与后续操作\n\n读取详情后，常见下一步：\n\n```bash\n# 同意审批任务\nlark-cli approval tasks approve --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\"}' --as user --yes\n\n# 撤回审批实例\nlark-cli approval instances cancel --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --yes\n\n# 催办审批任务\nlark-cli approval tasks remind --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID>\"]}' --as user --yes\n```\n","isInternal":false,"tokens":1863,"sizeBytes":5950},{"name":"lark-approval-instances-initiated.md","path":"skills/lark-approval/references/lark-approval-instances-initiated.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-instances-initiated.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"\n# approval instances initiated\n\n查询当前用户已发起的审批实例列表（用户级只读操作）。适合在需要查看“我发起了哪些审批”、筛选某类审批定义、获取 `instance_code` 供后续 `instances get` / `instances cancel` / `instances cc` 等命令使用时调用。\n\n需要的 scopes: [\"approval:instance:read\"]\n\n## 命令\n\n```bash\n# 查询我发起的审批列表\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n\n# 只看某个审批定义下我发起的实例\nlark-cli approval instances initiated --params '{\"definition_code\":\"<DEFINITION_CODE>\",\"page_size\":20}' --as user\n\n# 按关键词搜索我发起的实例\nlark-cli approval instances initiated --params '{\"keyword\":\"测试\",\"page_size\":10}' --as user\n\n# 按发起时间范围筛选（秒级时间戳）\nlark-cli approval instances initiated --params '{\"start_timestamp\":\"<START_SECONDS>\",\"end_timestamp\":\"<END_SECONDS>\",\"page_size\":20}' --as user\n\n# 使用 page_token 翻页\nlark-cli approval instances initiated --params '{\"page_size\":20,\"page_token\":\"example_page_token\"}' --as user\n\n# 表格格式输出，便于快速浏览\nlark-cli approval instances initiated --params '{\"page_size\":20}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{...}'` | 否 | 查询参数，使用 JSON 传入；不传时使用默认分页与筛选 |\n| `definition_code` | 否 | 审批定义 Code，用于只查看某个审批定义下我发起的实例 |\n| `keyword` | 否 | 搜索关键词；非空时走搜索链路，空或仅空格时保持普通列表链路 |\n| `start_timestamp` | 否 | 按发起时间筛选，时间范围开始值，秒级时间戳 |\n| `end_timestamp` | 否 | 按发起时间筛选，时间范围结束值，秒级时间戳 |\n| `locale` | 否 | 返回语言：`zh-CN`、`en-US`、`ja-JP` |\n| `page_size` | 否 | 分页大小 |\n| `page_token` | 否 | 翻页标记；首次请求不填，后续使用上一次返回的 `page_token` |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id` |\n| `--as user` | 否 | 建议显式指定用户身份；已发起审批列表查询通常应使用用户身份 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 输出重点字段\n\n返回结果中常见字段：\n\n| 字段 | 说明 |\n|------|------|\n| `count` | 列表计数，只在第一页返回；大于等于 100 个实例时返回 `99` |\n| `has_more` | 是否还有更多数据 |\n| `page_token` | 下一页翻页 Token |\n| `instances[].instance_code` | 审批实例 Code；后续查询详情或执行撤回 / 抄送时通常需要 |\n| `instances[].definition_code` | 审批定义 Code |\n| `instances[].definition_name` | 审批定义名称 |\n| `instances[].definition_group_id` | 审批定义分组 ID |\n| `instances[].definition_group_name` | 审批定义分组名称 |\n| `instances[].initiator` | 发起人 ID |\n| `instances[].initiator_name` | 发起人姓名 |\n| `instances[].instance_status` | 审批实例状态，见下方“instance_status 枚举” |\n| `instances[].instance_external_id` | 第三方审批实例 ID（仅第三方审批实例存在） |\n| `instances[].link` | 三方审批跳转链接 |\n| `instances[].summaries` | 摘要字段列表 |\n\n## instance_status 枚举\n\n| 值 | 含义 |\n|----|------|\n| `0` | 无流程状态，不展示对应标签 |\n| `1` | 流程实例流转中 |\n| `2` | 已通过 |\n| `3` | 已拒绝 |\n| `4` | 已撤销 |\n| `5` | 已终止 |\n\n## 常见使用场景\n\n### 1) 找到我要操作的审批实例\n\n```bash\nlark-cli approval instances initiated --params '{\"page_size\":20}' --format table --as user\n```\n\n拿到 `instances[].instance_code` 后，可继续：\n\n```bash\n# 查看审批实例详情\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n\n# 撤回审批实例\nlark-cli approval instances cancel --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --yes\n```\n\n### 2) 只看某类审批\n\n```bash\nlark-cli approval instances initiated \\\n  --params '{\"definition_code\":\"<DEFINITION_CODE>\",\"page_size\":20}' \\\n  --as user\n```\n\n\n## 使用建议\n\n- **这是定位“我发起的审批实例”的首选命令**：如果你的目标是撤回、抄送、查看某个已发起审批，优先从这里拿 `instance_code`。\n- **优先用 `definition_code` 缩小范围**：当你已知审批定义时，先筛掉无关实例，可显著提升可读性。\n- **需要搜索时传入 `keyword`**：搜索排序和普通列表排序不同，按搜索服务结果为准。\n- **按时间排查时使用 `start_timestamp` / `end_timestamp`**：这两个值都是秒级时间戳，用于按发起时间缩小结果范围。\n- **结果很多时优先 `--format table`**：适合人工快速浏览。\n- **`count` 只在第一页返回**：做分页处理时不要假设后续页还会带总数。\n- **`instance_status` 可直接判断下一步**：例如状态为 `1` 时通常可继续查看详情或考虑撤回，状态为 `4` 表示已经撤销，无需重复撤回。\n- **摘要字段 `summaries` 很适合做列表预览**：当审批标题不够明确时，可结合摘要值帮助识别目标实例。\n\n## 输出与后续操作\n\n拿到列表后，常见下一步：\n\n```bash\n# 查看单个审批实例详情\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n\n# 撤回审批实例\nlark-cli approval instances cancel --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --yes\n\n# 给审批实例追加抄送人\nlark-cli approval instances cc --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"<USER_ID>\"]}' --params '{\"user_id_type\":\"open_id\"}' --as user --yes\n```\n","isInternal":false,"tokens":1919,"sizeBytes":5919},{"name":"lark-approval-tasks-add-sign.md","path":"skills/lark-approval/references/lark-approval-tasks-add-sign.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-tasks-add-sign.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"\n# approval tasks add_sign\n\n给一个审批任务加签（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，确认目标任务后，再提供被加签人的用户 ID、加签方式等参数执行加签。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要对该审批任务加签且目标任务、加签对象、加签方式都无误，再带 `--yes` 运行。用户已明确要求立即执行且列清本轮的加签、转交对象时，该确认覆盖这两个已明确的动作，不要逐条重复询问；不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 先选择加签类型\n\n`add_sign_type` 会影响当前用户的审批任务是否继续可操作，不能只按示例顺序或任意选择：\n\n| 用户意图 | `add_sign_type` | 处理方式 |\n|----------|-----------------|----------|\n| 明确说前加签 / “先让某人审核，我再审” | `1` | 前加签，并按用户要求选择 `approval_method` |\n| 明确说后加签 / “我处理完，再让某人审核” | `2` | 后加签，并按用户要求选择 `approval_method` |\n| “拉进来一起审” / “共同审核” / “一并确认” | `3` | 并加签；不传 `approval_method` |\n| 同一请求要求先加签、再转交当前用户这一环 | `3` | **必须并加签**；加签成功后再转交当前任务 |\n\n前加签或后加签可能推动当前用户的 task 流转，使原 `task_id` 不再支持后续转交。因此，“先加签，再把我这一环转交给其他人”不能使用前加签或后加签；先以 `add_sign_type: 3` 并加签，确认 `tasks add_sign` 成功后，再使用同一组 `instance_code` + `task_id` 执行 `tasks transfer`。\n\n只有在上下文完全无法判断是哪种加签方式、且不同选择会改变审批流程时，才向用户二次询问。用户已经说“一起审”或已经要求“加签后转交当前环节”时，信息足够，不要再询问加签类型。\n\n## 再选择 approval_method\n\n只有前加签、后加签需要 `approval_method`；并加签不传。先遵循用户明确指定的审批方式；用户未指定时，按人数和语义选择：\n\n| 加签人数与语义 | `approval_method` | 处理方式 |\n|----------------|-------------------|----------|\n| 只有 1 名加签人 | `1` | 使用或签；单人时或签、会签的实际效果相同，不再询问 |\n| 多人，明确“任一人审批即可” / “一人通过即可” | `1` | 或签；任一加签人完成审批即可 |\n| 多人，明确“所有人都要审批” / “全部确认” | `2` | 会签；所有加签人都必须完成审批 |\n| 多人，明确“依次审批” / “先 A 后 B” | `3` | 依次审批；每个人按 `add_sign_user_ids` 的数组顺序逐一审批 |\n| 多人，无法从上下文推断 | 不预设 | 询问用户选择或签、会签或依次审批，并说明三者效果 |\n\n依次审批必须保留用户给出的人员顺序。如果已经确定要依次审批，但上下文无法判断先后顺序，先询问人员顺序，再构造 `add_sign_user_ids`；不要自行排序。\n\n## 命令\n\n```bash\n# 先预览并加签请求，不实际执行\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":3,\"add_sign_user_ids\":[\"ou_xxx\"],\"comment\":\"请项目 owner 一起审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --dry-run\n\n# 单人前加签：未指定方式时使用或签\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":1,\"add_sign_user_ids\":[\"ou_xxx\"],\"approval_method\":1,\"comment\":\"请先补充审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 多人后加签：所有人都需要审批，使用会签\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":2,\"add_sign_user_ids\":[\"ou_xxx\",\"ou_yyy\"],\"approval_method\":2,\"comment\":\"当前审批完成后请两位都完成审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 多人前加签：按数组中的人员顺序依次审批\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":1,\"add_sign_user_ids\":[\"ou_first\",\"ou_second\"],\"approval_method\":3,\"comment\":\"请先由第一位审核，再由第二位审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 同一请求要求先加签、再转交：必须并加签；两条命令按顺序执行\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":3,\"add_sign_user_ids\":[\"ou_reviewer\"],\"comment\":\"请一起审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 仅在上面的 add_sign 成功后，转交同一当前任务\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"ou_transferee\",\"comment\":\"出差期间请代为处理\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment 或较多加签人\nlark-cli approval tasks add_sign \\\n  --data @./add-sign-body.json \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `add_sign_type` | 是 | 加签类型：`1` 前加签、`2` 后加签、`3` 并加签 |\n| `add_sign_user_ids` | 是 | 被加签人 ID 数组；需要和 `user_id_type` 保持一致 |\n| `approval_method` | 否 | 审批方式：`1` 或签、`2` 会签、`3` 依次审批；**仅在前加签、后加签时需要填写**。单人未指定时使用 `1`；多人无法从语义推断时先询问用户 |\n| `comment` | 否 | 审批意见或加签说明，例如 `前加签给财务复核`、`请项目 owner 一并确认` |\n| `--params '{\"user_id_type\":\"...\"}'` | 否 | 查询参数 JSON；用于声明 `add_sign_user_ids` 内用户 ID 的类型 |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id`；未显式指定时要特别确认被加签人的 ID 类型 |\n| `--as user` | 否 | 建议显式指定用户身份；审批加签通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 枚举说明\n\n### add_sign_type\n\n| 值 | 含义 | 对当前任务的影响 |\n|----|------|------------------|\n| `1` | 前加签 | 在当前审批前插入审批人，可能推动当前用户的 task 流转 |\n| `2` | 后加签 | 在当前审批后追加审批人，可能推动当前用户的 task 流转 |\n| `3` | 并加签 | 增加并行审批人；需要随后转交当前环节时使用 |\n\n### approval_method\n\n仅适用于前加签、后加签；并加签不传。\n\n| 值 | 含义 | 完成条件 |\n|----|------|----------|\n| `1` | 或签 | 任一加签人完成审批即可 |\n| `2` | 会签 | 所有加签人都必须完成审批 |\n| `3` | 依次审批 | 所有加签人按 `add_sign_user_ids` 数组顺序逐一审批 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / transfer / rollback / add_sign 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n| `tasks[].support_api_operate` | 是否支持通过 API 处理该任务；加签前建议先检查 |\n\n如果你手里只有姓名或邮箱，建议先通过联系人能力解析出正确的用户 ID，再执行加签。\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行加签操作。\n- **`add_sign_user_ids` 与 `user_id_type` 必须匹配**：例如传 open_id 就把 `user_id_type` 设为 `open_id`；不要混用。\n- **优先显式传 `user_id_type`**：这样 agent 更容易判断参数含义，也能减少 ID 类型不匹配带来的失败。\n- **`add_sign_type` 要和业务意图一致**：前加签是在当前审批前插入审批人，后加签是在当前审批后追加审批人，并加签则是增加并行审批人。\n- **加签后还要转交当前环节时必须并加签**：使用 `add_sign_type: 3`，等待加签成功后再用同一组任务参数转交；不要用前加签或后加签导致当前 task 提前流转。\n- **无法推断类型时才询问**：如果用户没有说明先后或并行关系，且后续动作也不能帮助判断，再请用户选择；不要对“一起审”或“加签后转交”重复提问。\n- **前加签 / 后加签要补 `approval_method`**：单人未指定时使用或签；多人优先按语义选择，无法推断时询问用户，不要静默默认。\n- **依次审批保留人员顺序**：按用户指定的先后顺序构造 `add_sign_user_ids`；顺序不明确时先询问，不要自行排序。\n- **优先从 `tasks query` 的待办列表拿任务参数**：尤其是 `topic=1` 的待办审批，最适合作为 add_sign 的输入来源。\n- **先检查是否支持 API 操作**：如果 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 执行处理动作，加签前应谨慎验证。\n- **`comment` 建议写明加签原因**：例如 `增加财务复核`、`增加项目 owner 并行确认`，方便相关人员理解上下文。\n- **先 `--dry-run` 再执行**：尤其在多人加签、跨部门加签或加签对象来源不明确时，先预览更安全。\n","isInternal":false,"tokens":3432,"sizeBytes":10434},{"name":"lark-approval-tasks-approve.md","path":"skills/lark-approval/references/lark-approval-tasks-approve.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-tasks-approve.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"\n# approval tasks approve\n\n同意一个审批任务（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，必要时再用 `instances get` 查看详情，然后再执行同意。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确同意审批且目标任务无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks approve \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"同意\"}' \\\n  --as user \\\n  --dry-run\n\n# 同意审批任务，并附带审批意见\nlark-cli approval tasks approve \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"同意\"}' \\\n  --as user \\\n  --yes\n\n# 需要回填表单时，传入 form（按当前命令定义，form 为字符串化 JSON）\nlark-cli approval tasks approve \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"同意并补充信息\",\"form\":\"[{\\\"id\\\":\\\"user_name\\\",\\\"type\\\":\\\"input\\\",\\\"value\\\":\\\"Alice\\\"}]\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment / form\nlark-cli approval tasks approve \\\n  --data @./approve-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `comment` | 否 | 审批意见，例如 `同意`、`已确认` |\n| `form` | 否 | 表单数据；按当前命令定义，字段类型为 `string`，通常传字符串化 JSON；仅在审批动作需要同时回填表单时使用 |\n| `--as user` | 否 | 建议显式指定用户身份；审批同意通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的两个字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行同意操作。\n- **优先从 `tasks query` 的待办列表拿参数**：尤其是 `topic=1` 的待办审批，最适合作为 approve 的输入来源。\n- **先检查是否支持 API 操作**：如果上一步 `tasks query` 返回的 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 同意/拒绝。\n- **`comment` 建议简洁明确**：例如 `同意`、`同意，信息已核对`。没有审批意见要求时可省略。\n- **`form` 只在确有需要时传**：大多数简单同意场景只传 `instance_code`、`task_id`、可选 `comment` 即可。\n- **先 `--dry-run` 再执行**：尤其在批量处理、表单回填或任务来源不明确时，先预览更安全。\n","isInternal":false,"tokens":1205,"sizeBytes":3720},{"name":"lark-approval-tasks-query.md","path":"skills/lark-approval/references/lark-approval-tasks-query.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-tasks-query.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"\n# approval tasks query\n\n查询当前用户的审批任务列表，可用于查看待办、已办、知会等分组。只读操作，不会修改审批状态。\n\n需要的 scopes: [\"approval:task:read\"]\n\n## 命令\n\n```bash\n# 查询待办审批\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n\n# 查询已办审批\nlark-cli approval tasks query --params '{\"topic\":\"2\"}' --as user\n\n# 按关键词搜索任务列表\nlark-cli approval tasks query --params '{\"topic\":\"1\",\"keyword\":\"测试\",\"page_size\":10}' --as user\n\n# 按任务时间范围筛选（秒级时间戳）\nlark-cli approval tasks query --params '{\"topic\":\"1\",\"start_timestamp\":\"<START_SECONDS>\",\"end_timestamp\":\"<END_SECONDS>\"}' --as user\n\n# 使用 page_token 翻页\nlark-cli approval tasks query --params '{\"topic\":\"1\",\"page_token\":\"example_page_token\"}' --as user\n\n# 表格格式输出，便于快速浏览\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --format table --as user\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{\"topic\":\"...\"}'` | 是 | 查询参数，使用 JSON 传入 |\n| `topic` | 是 | 任务分组主题，见下方“topic 枚举” |\n| `definition_code` | 否 | 审批定义 Code，用于仅查询某个审批定义下的任务 |\n| `keyword` | 否 | 搜索关键词；非空时走搜索链路，空或仅空格时保持普通列表链路 |\n| `start_timestamp` | 否 | 按任务时间筛选，时间范围开始值，秒级时间戳 |\n| `end_timestamp` | 否 | 按任务时间筛选，时间范围结束值，秒级时间戳 |\n| `locale` | 否 | 返回语言：`zh-CN`、`en-US`、`ja-JP` |\n| `page_size` | 否 | 分页大小 |\n| `page_token` | 否 | 翻页标记；首次请求不填，后续使用上一次返回的 `page_token` |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id` |\n| `--as user` | 否 | 建议显式指定用户身份；审批任务查询通常应使用用户身份 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## topic 枚举\n\n| 值 | 含义 |\n|----|------|\n| `1` | 待办审批 |\n| `2` | 已办审批 |\n| `17` | 未读知会 |\n| `18` | 已读知会 |\n\n## 输出重点字段\n\n返回结果中常见字段：\n\n| 字段 | 说明 |\n|------|------|\n| `count` | 列表计数，只在第一页返回；当任务数大于等于 100 时返回 `99` |\n| `has_more` | 是否还有更多数据 |\n| `page_token` | 下一页翻页 Token |\n| `tasks[].task_id` | 任务 ID，全局唯一 |\n| `tasks[].instance_code` | 审批实例 Code；后续执行 approve / reject / rollback 等操作时通常需要与 `task_id` 成对使用 |\n| `tasks[].title` | 任务标题 |\n| `tasks[].status` | 任务状态：`1` 待办、`2` 已办、`17` 未读、`18` 已读、`33` 处理中、`34` 撤回 |\n| `tasks[].topic` | 任务所属分组主题 |\n| `tasks[].instance_status` | 审批实例状态：`0` 无状态、`1` 流转中、`2` 已通过、`3` 已拒绝、`4` 已撤销、`5` 已终止 |\n| `tasks[].definition_code` | 审批定义 Code |\n| `tasks[].definition_name` | 审批定义名称 |\n| `tasks[].initiator` | 发起人 ID |\n| `tasks[].initiator_name` | 发起人姓名 |\n| `tasks[].summaries` | 表单摘要字段列表 |\n| `tasks[].support_api_operate` | 是否支持通过 API 同意或拒绝该任务 |\n| `tasks[].user_id` | 任务所属用户 ID |\n| `tasks[].instance_external_id` | 三方审批实例 ID，仅第三方审批实例存在 |\n| `tasks[].task_external_id` | 三方审批任务 ID，仅第三方审批任务存在 |\n| `tasks[].link` | 三方审批跳转链接 |\n\n## 使用建议\n\n- 常见处理链：先用 `tasks query` 拿到 `task_id` 和 `instance_code`，若用户需要查看详情、当前节点、表单内容、流程进度等内容，则调用 `instances get` 查看详情，最后执行 `tasks approve` / `tasks reject` / `tasks transfer` / `tasks add_sign` / `tasks rollback`。\n- 如果你只想看“已发起的审批实例”，使用 `instances initiated`；`tasks query` 更适合围绕“任务分组”来拉取列表。\n- 需要搜索任务标题、摘要或相关内容时传入 `keyword`；搜索排序和普通列表排序不同，按搜索服务结果为准。\n- 按时间排查任务时使用 `start_timestamp` / `end_timestamp` 缩小范围；这两个值都是秒级时间戳。\n- 需要继续翻页时，直接把上一次返回的 `page_token` 放回 `--params`。\n- 当结果量较大时，优先使用 `--format table` 提升可读性。\n","isInternal":false,"tokens":1530,"sizeBytes":4556},{"name":"lark-approval-tasks-reject.md","path":"skills/lark-approval/references/lark-approval-tasks-reject.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-tasks-reject.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"\n# approval tasks reject\n\n拒绝一个审批任务（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，必要时再用 `instances get` 查看详情，然后再执行拒绝。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要拒绝该审批且目标任务无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks reject \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"拒绝\"}' \\\n  --as user \\\n  --dry-run\n\n# 拒绝审批任务，并附带审批意见\nlark-cli approval tasks reject \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"拒绝，信息不完整\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment\nlark-cli approval tasks reject \\\n  --data @./reject-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `comment` | 否 | 审批意见，例如 `拒绝`、`拒绝，信息不完整` |\n| `--as user` | 否 | 建议显式指定用户身份；审批拒绝通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的两个字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行拒绝操作。\n- **优先从 `tasks query` 的待办列表拿参数**：尤其是 `topic=1` 的待办审批，最适合作为 reject 的输入来源。\n- **先检查是否支持 API 操作**：如果上一步 `tasks query` 返回的 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 同意/拒绝。\n- **`comment` 建议写清拒绝原因**：例如 `拒绝，缺少合同附件`、`拒绝，预算字段填写不完整`。这有助于发起人理解原因并补充材料。\n- **先 `--dry-run` 再执行**：尤其在批量处理或任务来源不明确时，先预览更安全。\n","isInternal":false,"tokens":1063,"sizeBytes":3157},{"name":"lark-approval-tasks-remind.md","path":"skills/lark-approval/references/lark-approval-tasks-remind.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-tasks-remind.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"\n# approval tasks remind\n\n对审批实例中的指定任务发起催办（用户级写操作）。通常先通过 `tasks query` 找到待办任务，拿到 `instance_code` 和要催办的 `task_ids`，必要时再用 `instances get` 查看详情，然后执行催办。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要催办该审批且目标实例、目标任务都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:instance:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks remind \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID>\"],\"comment\":\"请尽快处理\"}' \\\n  --as user \\\n  --dry-run\n\n# 催办单个审批任务\nlark-cli approval tasks remind \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID>\"],\"comment\":\"请尽快审批该单据\"}' \\\n  --as user \\\n  --yes\n\n# 同一实例下催办多个任务\nlark-cli approval tasks remind \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID_1>\",\"<TASK_ID_2>\"],\"comment\":\"请相关审批人尽快处理\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment 或多个 task_ids\nlark-cli approval tasks remind \\\n  --data @./remind-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances get` 获取 |\n| `task_ids` | 是 | 被催办的任务 ID 数组；应与 `instance_code` 属于同一审批实例 |\n| `comment` | 否 | 催办说明，例如 `请尽快处理`、`该单据较急，请优先审批` |\n| `--as user` | 否 | 建议显式指定用户身份；审批催办通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；催办时必须提供 |\n| `tasks[].task_id` | 审批任务 ID；放入 `task_ids` 数组中 |\n| `tasks[].title` | 任务标题，可用于确认催办对象是否正确 |\n| `tasks[].status` | 任务状态；一般优先催办仍处于待处理状态的任务 |\n\n如需进一步确认当前审批流、节点和人员信息，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_ids` 要对应同一个审批实例**：不要把不同实例下的任务 ID 混在同一次催办请求中。\n- **`task_ids` 是数组**：即使只催办一个任务，也要按数组形式传入。\n- **优先从 `tasks query` 的待办列表拿参数**：尤其是 `topic=1` 的待办审批，最适合作为 remind 的输入来源。\n- **催办前先确认任务仍需处理**：已经审批完成、已撤回或已终止的任务一般不适合继续催办。\n- **`comment` 建议简洁且明确**：例如 `该单据较急，请优先审批`、`请今天内处理`。避免过长或模糊描述。\n- **先 `--dry-run` 再执行**：尤其在一次催办多个任务、任务来源不明确或需让用户复核催办对象时，先预览更安全。\n","isInternal":false,"tokens":1256,"sizeBytes":3673},{"name":"lark-approval-tasks-rollback.md","path":"skills/lark-approval/references/lark-approval-tasks-rollback.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-tasks-rollback.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"\n# approval tasks rollback\n\n将一个审批任务退回到指定节点（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，再结合实例详情确认可退回的目标节点 `node_ids`，最后执行退回。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要退回该审批且目标任务、退回节点都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"<NODE_ID>\"],\"comment\":\"退回补充材料\"}' \\\n  --as user \\\n  --dry-run\n\n# 退回到单个节点\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"<NODE_ID>\"],\"comment\":\"请补充附件后重新提交\"}' \\\n  --as user \\\n  --yes\n\n# 退回到发起节点（发起节点 ID 为 START）\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"START\"],\"comment\":\"退回发起人补充材料\"}' \\\n  --as user \\\n  --yes\n\n# 传多个候选节点 ID（以实际审批定义支持情况为准）\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"<NODE_ID_1>\",\"<NODE_ID_2>\"],\"comment\":\"退回上一处理节点\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment 或较多 node_ids\nlark-cli approval tasks rollback \\\n  --data @./rollback-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `node_ids` | 是 | 退回目标节点 ID 数组；发起节点 ID 为 `START`；执行前应先确认这些节点确实可作为退回目标 |\n| `comment` | 否 | 审批意见或退回说明，例如 `请补充附件后重新提交`、`预算说明不完整，请补充` |\n| `--as user` | 否 | 建议显式指定用户身份；审批退回通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / transfer / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n| `tasks[].support_api_operate` | 是否支持通过 API 处理该任务；退回前建议先检查 |\n\n如需确认流程节点、当前进度和可退回位置，可先查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行退回操作。\n- **`node_ids` 是必填项**：退回并不是“自动退回上一步”，而是要明确给出目标节点 ID 数组；退回发起节点时传 `START`。\n- **先确认节点是否可退回**：不同审批定义支持的退回目标可能不同；在不确定时，先通过 `instances get` 或业务侧流程信息核实。\n- **优先从 `tasks query` 的待办列表拿任务参数**：尤其是 `topic=1` 的待办审批，最适合作为 rollback 的输入来源。\n- **先检查是否支持 API 操作**：如果 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 执行处理动作，退回前应谨慎验证。\n- **`comment` 建议写清退回原因**：例如 `附件缺失，请补齐后重新提交`、`费用说明不完整，请补充明细`，方便发起人或上一步处理人理解原因。\n- **先 `--dry-run` 再执行**：尤其在节点来源不明确、审批链路复杂或批量处理时，先预览更安全。\n","isInternal":false,"tokens":1443,"sizeBytes":4487},{"name":"lark-approval-tasks-transfer.md","path":"skills/lark-approval/references/lark-approval-tasks-transfer.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/references/lark-approval-tasks-transfer.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"\n# approval tasks transfer\n\n转交一个审批任务给其他用户处理（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，确认目标任务后，再提供被转交人的用户 ID 执行转交。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要转交该审批且目标任务、转交对象都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"ou_xxx\",\"comment\":\"请你继续处理\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --dry-run\n\n# 按 open_id 转交审批任务\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"ou_xxx\",\"comment\":\"转交给你处理\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 按 user_id 转交审批任务\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"123456789\",\"comment\":\"请补充审核\"}' \\\n  --params '{\"user_id_type\":\"user_id\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment\nlark-cli approval tasks transfer \\\n  --data @./transfer-body.json \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `transfer_user_id` | 是 | 被转交人的用户 ID；需要和 `user_id_type` 保持一致 |\n| `comment` | 否 | 审批意见或转交说明，例如 `转交给你处理`、`请继续审核该单据` |\n| `--params '{\"user_id_type\":\"...\"}'` | 否 | 查询参数 JSON；用于声明 `transfer_user_id` 的 ID 类型 |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id`；未显式指定时要特别确认 `transfer_user_id` 的真实类型 |\n| `--as user` | 否 | 建议显式指定用户身份；审批转交通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / transfer / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n| `tasks[].support_api_operate` | 是否支持通过 API 处理该任务；转交前建议先检查 |\n\n如果你手里只有姓名或邮箱，建议先通过联系人能力解析出正确的用户 ID，再执行转交。\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行转交操作。\n- **`transfer_user_id` 与 `user_id_type` 必须匹配**：例如传 open_id 就把 `user_id_type` 设为 `open_id`；不要混用。\n- **优先显式传 `user_id_type`**：这样 agent 更容易判断参数含义，也能减少 ID 类型不匹配带来的失败。\n- **优先从 `tasks query` 的待办列表拿任务参数**：尤其是 `topic=1` 的待办审批，最适合作为 transfer 的输入来源。\n- **先检查是否支持 API 操作**：如果 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 执行同意/拒绝等处理动作，转交前也应谨慎验证。\n- **`comment` 建议写明转交原因**：例如 `你更熟悉该项目，请继续处理`、`转交给预算 owner 审核`，方便接收人理解上下文。\n- **先 `--dry-run` 再执行**：尤其在跨部门转交、批量处理或转交对象来源不明确时，先预览更安全。\n","isInternal":false,"tokens":1480,"sizeBytes":4564},{"name":"SKILL.md","path":"skills/lark-approval/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-approval/SKILL.md","title":"lark-approval","category":"anthropic-skill","format":"markdown","content":"---\nname: lark-approval\nversion: 1.2.0\ndescription: \"飞书审批：查询和处理审批待办/已办/实例，搜索可发起审批定义、查看定义详情并发起原生审批实例。当用户要处理审批任务、查看审批实例、搜索或发起审批时使用。审批待办不是飞书任务；非审批类待办走 lark-task。不负责创建审批定义；三方审批定义不走原生提单。\"\nmetadata:\n  requires:\n    bins: [\"lark-cli\"]\n  cliHelp: \"lark-cli approval --help\"\n---\n\n\n**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md)，其中包含认证、权限处理**\n\n所有命令默认 `--as user`（审批是人的动作）。调用前先按需读取 references 下对应的文件，查参数结构，不要猜字段；**references 是第一信息源**，只有在 reference 未覆盖的原生 / 高级场景下，才额外用 `lark-cli ... --help`、`lark-cli schema` 等方式补充确认字段。\n\n## 路由优先级（先判断是不是审批，再选命令）\n\n审批待办不是飞书任务。**只要用户的核心对象是审批单据 / 审批待办 / 审批实例，就优先使用 `lark-approval`，不要让渡给 `lark-task`。**\n\n### 明确归 `lark-approval` 的高优先级语义\n\n出现以下任一语义时，优先走 `lark-approval`：\n\n- 审批待办 / 审批单据 / 审批实例 / 审批意见 / 审批定义\n- 同意 / 拒绝 / 转交 / 退回 / 撤回 / 催办 / 加签 / 抄送\n- 待办列表 / 待办单据 / 已发起审批 / 已办审批 / 审批详情 / 同意可编辑\n\n**判定规则：** 只要最终动作是对审批单据做同意、拒绝、转交、退回、撤回、催办、加签、抄送、查详情、查已发起/已办/待办，就归 `lark-approval`。只有当用户处理的是**非审批类任务/待办**时，才走 [`lark-task`](../lark-task/SKILL.md)。\n\n## 选哪个命令\n\n| 想做什么 | 命令 | 按需读取 reference                                                                  |\n|---|---|---------------------------------------------------------------------------------|\n| 搜可发起定义 | `approvals search` | [`lark-approval-approvals-search.md`](references/lark-approval-approvals-search.md) |\n| 看审批定义详情/提单前确认表单与流程 | `approvals get` | [`lark-approval-approvals-get.md`](references/lark-approval-approvals-get.md)   |\n| 发起原生审批实例/提交请假审批/提交报销审批/创建审批实例 | `instances create` | [`lark-approval-initiate.md`](references/lark-approval-initiate.md)             |\n| 查/搜待办、已办 | `tasks query`（`topic`：1待办 2已办 17未读 18已读） | [`lark-approval-tasks-query.md`](references/lark-approval-tasks-query.md)       |\n| 看表单/进度/当前节点 | `instances get` | [`lark-approval-instances-get.md`](references/lark-approval-instances-get.md)   |\n| 同意审批 | `tasks approve` | [`lark-approval-tasks-approve.md`](references/lark-approval-tasks-approve.md)   |\n| 拒绝审批 | `tasks reject` | [`lark-approval-tasks-reject.md`](references/lark-approval-tasks-reject.md)     |\n| 转交审批 | `tasks transfer` | [`lark-approval-tasks-transfer.md`](references/lark-approval-tasks-transfer.md) |\n| 加签审批 | `tasks add_sign` | [`lark-approval-tasks-add-sign.md`](references/lark-approval-tasks-add-sign.md) |\n| 退回审批 | `tasks rollback` | [`lark-approval-tasks-rollback.md`](references/lark-approval-tasks-rollback.md) |\n| 催办审批 | `tasks remind` | [`lark-approval-tasks-remind.md`](references/lark-approval-tasks-remind.md)     |\n| 撤回已发起审批 | `instances cancel` | [`lark-approval-instances-cancel.md`](references/lark-approval-instances-cancel.md) |\n| 给审批实例追加抄送 | `instances cc` | [`lark-approval-instances-cc.md`](references/lark-approval-instances-cc.md)     |\n| 按定义/关键词查已发起审批 | `instances initiated` | [`lark-approval-instances-initiated.md`](references/lark-approval-instances-initiated.md) |\n\n处理链：\n\n- 发起审批：`approvals search` -> `approvals get` -> `instances create`\n- 处理审批：`tasks query` 拿 `instance_code` + `task_id`（操作必须成对带上）→ 只有用户明确需要查看详情、当前节点、表单内容、或流程进度时，再 `instances get` → 执行操作\n\n## 执行原则（减少误路由、误重试和无效消耗）\n\n### 1) 先拿最小必要信息，再执行\n\n- 目标只是处理待办时，优先 `tasks query` 获取 `instance_code` + `task_id`\n- **只有**用户明确要看详情、当前节点、表单内容、流程进度时，才调用 `instances get`\n- 用户已经明确给出 `instance_code` / `task_id` 时，不要先查列表再过滤\n\n### 2) 已知对象时直达动作\n\n- 已拿到 `instance_code` + `task_id` 后，优先直接执行 `tasks approve/reject/transfer/add_sign/rollback/remind`\n- 同一轮里如果已有足够的新鲜查询结果，不要重复 `tasks query`\n- 不要默认走 `list -> filter -> detail -> write` 全链路；对象已明确时应压缩步骤\n\n### 3) 错误码驱动，而不是盲目重试\n\n- 写操作失败后，先看错误码和报错语义，再决定是否补查或结束\n- **除非错误明确提示可恢复或需要补充参数，否则不要重复刷同一个写操作**\n- 同一个失败原因不要连续多次重试，避免 token 和耗时失控，最多重试1次\n\n## 写操作失败处理：1395001 决策树\n\n当拒绝 / 转交 / 退回 / 撤回 / 同意等写操作返回 `1395001`（任务状态异常 / 写前置校验失败）时，按下面规则处理：\n\n1. **先停止盲目重试**，不要连续重复提交相同写操作，最多重试1次\n2. 优先从以下角度解释：\n   - 任务可能已被他人处理\n   - 单据状态已变化，当前动作已不再允许\n   - 当前用户已不具备该任务的操作资格\n   - 当前节点或单据状态不支持该操作\n3. 如需确认，只补 **一次** 状态查询（`tasks query` 或 `instances get`），不要陷入 query/write 循环\n4. 最终给用户明确结论和下一步建议，而不是继续无意义重试\n\n**特别注意：** 对拒绝 / 转交 / 撤回场景更要严格执行上述规则；这些场景最容易因状态切换而失败。\n\n```bash\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user\nlark-cli approval approvals get --params '{\"approval_code\":\"<code>\"}' --as user\nlark-cli approval instances create --data '{\"approval_code\":\"<code>\",\"form\":\"[...]\"}' --yes --as user\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\nlark-cli approval tasks approve --data '{\"instance_code\":\"<ic>\",\"task_id\":\"<tid>\",\"comment\":\"同意\"}' --as user\n```\n\n## 不在本 skill 范围\n\n创建审批定义（走飞书客户端或审批管理后台）；三方定义发起（返回 `create_link`，引导用户通过链接发起）；非审批类待办 → [`lark-task`](../lark-task/SKILL.md)\n","frontmatter":{"name":"lark-approval","version":"1.2.0","description":"飞书审批：查询和处理审批待办/已办/实例，搜索可发起审批定义、查看定义详情并发起原生审批实例。当用户要处理审批任务、查看审批实例、搜索或发起审批时使用。审批待办不是飞书任务；非审批类待办走 lark-task。不负责创建审批定义；三方审批定义不走原生提单。","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli approval --help"}},"isInternal":false,"tokens":2303,"sizeBytes":6969},{"name":"creative-design.md","path":"skills/lark-apps/creative-design/creative-design.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/creative-design.md","title":"creative-design","category":"anthropic-skill","format":"markdown","content":"---\nname: creative-design\ndescription: 以自包含 HTML 创建精致的设计产物：UI mockup、可交互原型、线框图（wireframe）、落地页、仪表盘、应用屏幕、移动 App、幻灯片 deck（即 PPT / PowerPoint 演示文稿）、动画视频（motion graphics、产品演示 Demo 动画、数据动画）、可视化报告 / 信息图（infographic）/ 视觉长图与视觉探索。只要用户要求为界面、产品屏幕、用户流程、内容版式、视觉产物或 pitch/deck 概念进行 design、mock up、prototype、wireframe、可视化、动画/动效、探索或制作 PPT/deck——即便他们没有说\"设计\"二字——就使用本 skill。Harness 无关：适用于 Aily、Claude Code、Codex Agent 及类似的具备文件能力的 agent。\n---\n\n## 目录结构与运行环境\n本 skill 附带以下资源，路径均相对于本文件所在目录：\n\n- `references/<name>.md` — 媒介专属技能 prompt（如 `frontend-design.md`、`hi-fi-design.md`、`charts.md` 等；见文末「Skills 元信息」的完整列表）。与下方 harness 工具映射表同在 `references/` 目录。\n- `starter-components/` — 现成的 HTML/JS/JSX 脚手架（`design-canvas.jsx`、`deck-stage.js`、`ios-frame.jsx`、`android-frame.jsx`、`tweaks-panel.jsx`、`macos-window.jsx`、`browser-window.jsx`、`animations.jsx`）。见下文「Starter Components」。\n- `references/<harness>.md` — **harness 专属工具映射表**（`claude.md`、`codex.md`、`aily.md`）。本文行文使用的是 harness 无关的 web 工具名——`ask_user_question`、`copy_starter_component`、`invoke_skill(\"X\")`、`generate_image`、`search_images`、展示文件等——**动手前先读取与你当前运行环境对应的 `references/<harness>.md`，把这些名字映射成你 harness 里的真实工具**。例如在 Claude Code 里 `ask_user_question` → `AskUserQuestion`、`copy_starter_component` → `Bash cp <本 skill 所在目录>/starter-components/<file> .`、`invoke_skill(\"X\")` → `Read references/<file>.md`。\n- `assets/index.html` — React + Babel 的 HTML 起步模板（锁定版本 script 标签 + `#root` 挂载点），见下文「React + Babel」。\n\n## 工作流\n1. 理解用户需求。对全新或含糊的工作，提出澄清性问题。弄清输出物、精细度（fidelity）、选项数量、约束条件，以及涉及的 UI kit 与品牌。\n2. 探索所提供的资源。附件、文档链接、网页 URL 都要在动手前解析完（见「输入资料解析」）。\n3. 列出 todo 清单。\n4. 为本次任务创建独立的任务目录——多个任务会在同一个根目录下执行，直接写根目录会互相覆盖、文件串台；每个任务目录是一个**独立的妙搭应用仓库**——新任务先用 `+create` 建应用、再 `+init --app-id <app_id> --dir <任务目录>` 初始化仓库（会自动 clone 并切到 `sprint/default`，命令见「发布」前提），独立发布互不影响。把资源复制进任务目录，在其中创建交付物。用图片素材提升美观度与丰富度、或需要有依据的内容时，按「图像素材与外部信息」补充。\n5. （如有）自检React + Babel路径是否正确；ReactDOM.createRoot 是否参数正确，对应元素是否存在\n6. 收尾：提交你的改动。\n7. 发布：把产物发布到妙搭拿到可访问链接（见下方「发布」）。写完不发布，用户拿不到线上链接。\n8. 极其简短地总结——只讲注意事项与后续步骤，并给出发布后的可访问链接。\n\n鼓励你并发调用文件探索工具以提升效率。\n\n## 提问\n默认基于用户给的信息、项目上下文和合理假设直接开始，不为收集偏好而打断。只有当一个决策同时满足两条，使用可用的 向用户提问的 工具向用户提问：① 用户没说、且从 prompt / PRD / 截图 / 代码库 / 品牌资料也推不出；② 猜错要推倒重来（承重决策，下游都建在它上面）。两条只要有一条不成立——能合理推断，或猜错只是局部返工——就直接做。\n\n承重、推不出就必须先问的：交付媒介 / 格式（报告 vs deck vs 看板）；视觉 / 美学方向（从零起的项目、且资料里推不出一个有把握不返工的方向时）；大体量交付（整套 deck、多页产物）的受众 / 目的与核心范围。\n局部、给默认直接做的：变体数量与探索维度、界面文案、占位与示例内容、单屏 / 单组件的处理与密度——给合理默认（变体默认摆 2-3 个有清晰差异的方案），让用户在产出上重定向，不为它们提问。\n\n例如：\n\n- \"做一份关于 X 的报告／材料\"但没说格式 → 媒介推不出且承重，先确认交付格式（幻灯片 vs. 视觉报告 vs. 仪表盘），再问格式相关的问题。\n- 为附带的 PRD 做一套 deck → PRD 能推出受众 / 场景就直接做；只有受众、篇幅推不出且影响全局时才问。\n- 用这份 PRD 为 Eng All Hands 做一套 10 分钟的 deck → 无需提问；信息已足够。\n- 把这张截图变成交互原型 → 只有当图片无法说明预期行为时才提问。\n- 做 6 页关于黄油历史的幻灯片 → 媒介、页数已定，直接开工；风格能从主题推断就定，推不出再问。\n- 为我的外卖 app 的 onboarding 做一套原型 → 按常见 onboarding 流程直接做；只问会阻塞产出的承重问题。\n\n当交付格式本身不明确时——用户只说了一个成果（\"一份报告\"\"材料\"\"一份摘要\"）却没说媒介——先解决格式，再讨论任何与格式相关的细节。\n\n问出好问题至关重要。技巧：\n\n- 通常一轮聚焦提问就够；把承重的未知一次问齐，不要挤牙膏式多轮打断。\n- 只问推不出的；能从 PRD、截图、代码库、品牌资产、现有页面和用户原话推断的，先推断，并在产出里说明你的假设。\n\n## 输入资料解析\n用户给的附件、文档链接和 URL 是设计的输入，必须在动手前解析完——数据看板、报告和基于文档的 deck 全都建立在源资料之上，跳过这一步产出的内容只能靠编造。按输入形态处理：\n\n- **数据文件（csv / json / xlsx）**——先看结构（列名、字段类型、行数）和样本行，再决定信息层级与图表选型；指标一律用脚本从源数据计算，不要目测。\n- **压缩包（zip）**——先解压到临时目录，逐个查看内容物，再按各自类型处理。\n- **文档（docx / pdf / 论文 / 需求文档）**——用当前 harness 的文档解析能力读取**全文**（映射见 `references/<harness>.md`；Aily 原生支持解析 Word / PDF 等二进制文件），不要只读开头就动手。\n- **飞书云文档 / 多维表格链接**——用 `lark-cli` 读取内容（云文档 / 多维表格相关命令，不确定用法先查 `--help`）；`lark-cli` 不可用时向用户说明并请其导出或粘贴，不要凭标题猜内容。\n- **网页 URL**——用 `web_fetch` 抓取全文后再产出；抓取失败就告知用户，不要凭 URL 和常识编写。\n\n## 如何开展设计工作\n动手前先读取 **`./references/frontend-design.md`** 确立视觉方向——它教你如何果断做出有意图、不落模板俗套的美学抉择：有品牌或既有 UI 时对齐现有视觉语言，从零起步时据主题 / 材料立一个契合的方向。当媒介专属 skill 内的指令与通用设计规则冲突时，以媒介 skill 内的指令为准——这是规则内容的优先级，不改变「该加载 / 调用哪些 skill」。\n\n当用户请你做高保真 UI mockup、界面设计或带多方案的视觉探索时，开始之前先读取 **`./references/hi-fi-design.md`**——它涵盖了设计流程、获取设计上下文、提问以及呈现多个方案。\n\n一次设计探索的输出是单个 HTML 文档。根据你所探索的内容选择呈现格式：\n\n- **静态视觉 / 设计稿 / 多方案探索**（颜色、字体、单个元素、整屏 UI、流程关键帧）→ 通过 `starter-components/design-canvas.jsx` starter component 把各方案铺陈在画布上。除非用户明确要求可点击 / 可交互，否则不要把设计稿升级成点击原型。\n- **用户明确要求可交互的流程或产品 demo** → 将整个产品做成高保真可点击原型，并把关键选项以 Tweak 形式暴露出来。可交互原型禁止使用 `starter-components/design-canvas.jsx`、`<DCArtboard>` 或画布外壳包裹；它应该作为真实应用界面直接运行。\n\n这两者可以组合，但只限静态设计探索。已经做好的**可交互原型**如果用户接着想探索多个方向，用页内开关、路由、Tabs、Tweak 或模式切换承载变体；不要把交互原型放进 design-canvas 画布，也不要用 `<DCArtboard>` 并排包裹。\n\n当用户要求新版本或改动时，把它们作为 TWEAKS 加到原件上；拥有一个可切换不同版本开关的主文件，优于拥有多个文件。\n\n## 默认美学指令\n如果用户没给参考或艺术方向：能从主题、材料或场景推断出一个有把握、不会返工的视觉方向，就主动确定，并在设计中体现假设；如果推不出、又是从零起的项目，先用 `ask_user_question` 问清偏好的调性、受众、颜色、字体、情绪等再动手——不要在推不出方向时硬选，slop 就是这么来的。\n\n定下视觉方向后（无论是推断还是问来的），创建设计时遵循以下指引：\n\n- **字体与排版。** 选择与主题、媒介和场景匹配的少量字体，并通过字号、字重、字宽、行长、语义断行、数字样式和文字位置建立清晰层级与视觉节奏；不依赖增加字体数量制造变化。\n- **背景与色彩体系。** 确定主色调，并建立与主题协调的中性基底、主题色和必要的章节／语义色。背景不局限于纯黑、纯白或单一色调，可以根据内容属性、页面角色和叙事节点使用不同色调、主题色底、局部色域、图片或图形背景。\n- **色彩一致性。** 一致性来自共享色板、字体、栅格、图形语言和明确的颜色关系，不要求所有页面使用相同背景。颜色变化应帮助识别章节、信息层级和重点，避免无语义地逐页随机换色。\n- **强调色。** 使用数量克制、关系协调的强调色，并根据背景、信息层级和色彩语义调整明度与彩度。图表、状态和章节色需要清楚可区分，但应属于同一视觉体系。\n- **中性色。** 黑、白、灰可以带有与主题协调的细微色相，避免把纯黑白或低饱和配色作为所有专业场景的默认答案。\n- **视觉复杂度。** 视觉丰富度应服务内容。不要添加无信息价值的装饰，也不要把\"克制\"理解为单调、大量留白、缺少图片图表或所有页面使用同一种构图。\n\n关键：如果已给出其他美学指令（如参考图、品牌体系、设计规范或媒介专属 skill），或项目中已有文件，则完全忽略默认美学。\n\n## 图像素材与外部信息\n图片素材能显著提升产物的美观度与丰富度——不要默认只用纯 CSS/SVG 撑起全部视觉。为氛围、质感和视觉节奏而配图是正当用途，不需要等到\"内容必须有图\"才配图。选择工具的判断规则很简单：**需要真实图片就搜索，需要丰富美观的图片就生成**。当前 harness 若提供以下能力（映射见 `references/<harness>.md`；没有对应工具就跳过，用内联 SVG / CSS 图形兜底），在合适的位置主动使用：\n\n- **`generate_image`（AI 图片生成）**——美化、氛围类配图一律走生成：hero 图、插画、照片质感背景、章节题图、空状态插图、信息图（infographic）、产品/场景示意图等任何能让页面更好看的位置，用文生图直接生成；有品牌参考图或用户素材时用图生图对齐既有视觉语言；多屏 / 多页需要风格统一、角色连贯的插画体系时用组图一次生成整个序列；对已有图片做局部调整用图片编辑。生成 prompt 里写清风格、构图、配色与光线，让产出与已确立的视觉方向一致，而不是各自为政。\n- **`search_images`（图片搜索）**——需要真实图片时走搜索：真实存在的实物、产品、地点、人物、logo、截图等生成会失真或造假的素材，以及确立视觉方向时按关键词找参考图（同类产品界面、风格 moodboard）。直接引用搜索结果时注意来源与版权。\n- **`web_search` / `web_fetch`（联网搜索）**——内容需要真实事实、数据、案例或时效性信息时先搜再写，不要编造（见「内容准则」：涉及新增事实、数据时要有依据）。调研型产出（行业研究、政策梳理、竞争格局类 deck / 报告）要先做多轮搜索，把事实、数字与来源收集齐并标注出处，再进入设计。\n- **视频素材**——需要嵌入公开视频（培训短片、案例视频等）时，用联网搜索找到可公开访问的视频页面或可嵌入链接，以 `<iframe>` / `<video>` 嵌入并注明来源；不要下载搬运版权内容，也绝不虚构视频 URL——找不到合适的就如实告知用户并留占位。\n\n约束：\n\n- 配图要属于同一视觉体系——风格、色调、光线与已确立的视觉方向一致，宁可少而统一，不要多而杂乱；逐张风格漂移比没有图更伤美观度。\n- 用户已提供图片 / 品牌素材时优先使用，不要擅自用生成图替换。\n- 搜索到 / 生成的图片先落到本地，再用 `lark-cli apps +file-upload --app-id <app_id> --file <local_path> --as user` 上传，代码中引用返回的**远端 URL**——不要提交 git、不要引用本地路径、不要 base64 内联，也不要直接热链搜索结果页的原始 URL（可能防盗链或失效）。上传需要 `app_id`，任务尚未初始化时先按「发布」前提完成 `+create` / `+init` 两步。\n\n## 输出创建准则\n- **文件输出路径**：会话根目录下会并存多个任务。**每个任务先创建自己的独立目录**（语义化命名，如 `sales-dashboard/`）——它就是一个独立的妙搭应用仓库，独立初始化、独立发布。所有交付物写进本任务目录，主 HTML 入口是该目录下的 `index.html`。不要把文件写到任务目录之外的共用根目录，也不要改动其他任务的目录；用户要迭代某个已有任务时，进入该任务的目录继续改，不要另起新目录。\n- 对文件做重大修订时，先复制再编辑，以保留旧版本（如 index.html、index v2.html 等）。\n- 始终避免写大文件（>1000 行）。而应把代码拆成若干更小的 JSX 文件，最后在主文件里 import 进来。这让文件更易管理和编辑。\n- 对于视频和其他带时间轴的内容，让播放位置可持久化；每次变化时存入 localStorage，加载时再从 localStorage 读回。这样用户刷新页面时不会丢失当前位置，而刷新在迭代设计中很常见。（使用 `starter-components/deck-stage.js` 的 deck 不需要这么做——宿主会把幻灯片位置保存在 URL 中。）\n- 在既有 UI 上做增补时，先理解该 UI 的视觉语汇并遵循它。对齐文案风格、配色、语气、hover/click 状态、动画风格、阴影＋卡片＋布局模式、密度等。把你观察到的东西\"出声想一想\"会有帮助。\n- 写规范的 HTML，让编辑器能直接编辑：显式闭合每个非空（non-void）元素（写 `<p>…</p>`，绝不依赖隐式闭合），每个属性值都用双引号，且不要自闭合非空元素（写 `<div></div>`，而非 `<div/>`）。这有助于直接编辑功能正常工作。\n- 绝不使用 `scrollIntoView`——它可能搞乱 web app。如有需要，改用其他 DOM 滚动方法。\n- **颜色使用：** 有品牌色时优先沿用品牌体系；没有品牌或既有配色时，根据主题、受众、内容语义和视觉方向推导协调色板。避免随意加入彼此无关的颜色，不要默认退回纯黑白。对于数据图表和信息图，颜色应承担区分、强调或表达语义的作用，并保证足够对比。\n- **Emoji：** 不要在生成的代码中使用 emoji 字符——不作图标、不作装饰、不放进数据里。例外：仅当用户的品牌资产明确包含 emoji 时。\n- **图标：** 系统图标规则仅适用于需要界面图标体系的 UI 或交互原型。在这类产物中，使用手写内联 SVG（`<svg viewBox=\"0 0 24 24\">`）建立语义贴切、风格连贯的图标语言。\n- **字体加载：** 需要 Google Fonts / web 字体时，一律从自托管镜像 `https://miaoda.feishu.cn/fonts/css2` 加载，不要直连 `fonts.googleapis.com` / `fonts.gstatic.com`——这两个 Google CDN 在部分地区慢、甚至连不上，会导致字体加载失败、页面回退到系统字体。镜像是 Google Fonts `css2` 端点的直接替代：查询语法完全一致（`?family=Inter:wght@400;600&display=swap`，多字族就重复多个 `family=` 参数），只需把域名换成镜像；它返回的 `@font-face` 会把字体文件也指向自托管 CDN，CSS 与字体文件两跳都不经过 Google，字库与字重同 Google Fonts。照常用 `<link rel=\"stylesheet\" href=\"https://miaoda.feishu.cn/fonts/css2?family=…&display=swap\">` 引入即可。\n\n## 内容准则\n\n**内容取舍。** 不添加与用户目标无关或没有依据的内容。在用户明确的范围内，可以重组、解释和补足完成叙事所需的信息；涉及新增事实、数据或任务范围时，再向用户确认或明确为示例。内容不足以独立成页时，应合并、重构或请求材料，不用放大元素和增加留白勉强撑页。\n\n**数据保真。** 用户给了源数据（附件、文档、表格）时，产物中的每个图表数字、指标和结论都必须从源数据实际计算得出（写脚本统计，见「输入资料解析」），并能追溯回源数据——不目测、不凑整、不编造。做数据报表/看板前读 `references/data-report.md`，其中的数据准则同样适用。\n\n**硬性规格是约束，不是建议。** 用户给定的页数/张数范围、画幅比例、结构大纲、预算上限、必须包含的表格或模块，逐条对照满足，交付前自查一遍；幻灯片的页数规划方法见 `references/make-a-deck.md`。\n\n**使用恰当的尺度：** 对于 1920x1080 的幻灯片，文字绝不应小于 24px；理想情况下要大得多。打印文档最小 12pt。移动端 mockup 的点击目标绝不应小于 44px。\n\n**避免 AI slop 套路：** 包括但不限于滥用渐变背景、emoji（见上面的 Emoji 规则）、圆角＋左边框强调色的容器、被用滥的字体族（Inter、Roboto、Arial、Fraunces）。\n\n**CSS**：`text-wrap: pretty`、CSS grid 以及其他高级 CSS 效果都是你的好帮手！\n\n**强烈倾向用带 `gap` 的 flex/grid，而非 inline 流。** 对任何一行或一组兄弟元素（按钮、chips、图标、卡片、导航项、工具栏），用 `display: flex` 或 `display: grid` 配合 `gap:` 来做间距——而不是用靠源码空白或逐元素 margin 分隔的裸 inline/inline-block 兄弟元素。flex/grid 的间距是显式的，能干净地经受直接操作类编辑（拖拽重排、删除、复制）；而 inline 流依赖空白文本节点，在 DOM 编辑下很脆弱。把 inline 流留给句子中偶尔夹带 `<a>`/`<strong>`/`<em>` 的文字段落——不要用它来排布 UI 元素。\n\n## 保留评论锚点\n某些源元素带有 `data-comment-anchor=\"…\"` 属性。它把用户的评审评论钉在该元素上。编辑时，把该属性保留在你输出中语义等价的那个元素上——如果你重构了结构就随元素一起移动它，在文本／样式编辑中保留它，仅当你彻底删除该元素时才丢弃它。绝不发明新值，也不要把它复制到其他元素上。\n\n## 为幻灯片和屏幕打标签以提供评论上下文\n在代表幻灯片和高层级屏幕的元素上加 `[data-screen-label]` 属性；这样你就能分辨用户的评论是针对哪一张幻灯片或哪一屏。\n当用户说\"slide 5\"或\"index 5\"时，他们指的是第 5 张幻灯片（标签\"05\"），而绝非数组下标 `[4]`——人类不按 0 起始计数。\n\n## React + Babel（浏览器内 JSX）\n当用浏览器内 JSX 编写 React 原型（无构建步骤——Babel 在运行时转译）时，你必须使用下面这些锁定版本的确切 script 标签。不要使用未锁定版本（例如 react@18）。要用 React + Babel 时，可直接从本 skill 的 `assets/index.html` 拷贝 HTML 模板起步（`cp <本 skill 所在目录>/assets/index.html <任务目录>/index.html`）——它已带好这三个 script 标签和 `#root` 挂载点，不必手写。\n\n```html\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/react@18.3.1/umd/react.development.js\" crossorigin=\"anonymous\"></script>\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/react-dom@18.3.1/umd/react-dom.development.js\" crossorigin=\"anonymous\"></script>\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/@babel/standalone@7.29.0/babel.min.js\" crossorigin=\"anonymous\"></script>\n```\n\n发布前需要对以上 script 路径进行自检，确保它们路径与上述代码完全一致\n\n### 脚本导入\n用 script 标签导入你写的任何辅助脚本或组件脚本。`.jsx` 文件必须用 `<script type=\"text/babel\" src=\"xxx.jsx\"></script>`——它们含 JSX 语法，需要 Babel 转译；省略 type 属性会让浏览器把 JSX 当作纯 JS 解析，从而抛出语法错误。纯 `.js` 文件可以用普通的 `<script src=\"xxx.js\"></script>`。避免在脚本导入上使用 `type=\"module\"`——它可能会出问题。\n\n**加载顺序**：`@babel/standalone` 用异步 XHR 拉取外部 `<script type=\"text/babel\" src=\"...\">` 文件，但保证按 DOM 顺序执行——靠前的脚本总在靠后的脚本之前运行。然而，内联脚本（无 `src`）会立即就绪，而外部脚本必须等待网络响应。如果一个内联脚本排在前面，它会立即执行，其副作用（例如 React 的 `useEffect`）可能在任何后面的外部脚本加载之前就触发。把外部脚本放在依赖它们的内联脚本之前。\n\n### 跨文件作用域\n每个 `<script type=\"text/babel\">` 在转译后都有自己独立的作用域。要在文件间共享组件，在组件文件末尾把它们导出到 `window`：\n\n```js\n// 在 components.jsx 末尾：\nObject.assign(window, {\n  Terminal, Line, Spacer,\n  Gray, Blue, Green, Bold,\n  // ... 所有需要共享的组件\n});\n```\n\n### 样式对象命名\n定义全局作用域的样式对象时，给它们起具体的名字。如果你导入了 1 个以上带 `styles` 对象的组件，就会出问题。你必须基于组件名给每个 styles 对象起唯一的名字，比如 `const terminalStyles = { ... }`；或者用内联样式。绝不要写 `const styles = { ... }`。\n\n### 动画\n对于视频风格的 HTML 产物，调用 `animated-video` skill 并从 `starter-components/animations.jsx` starter component 起步——不要自己实现时间轴引擎。对于简单的交互原型过渡，CSS transitions 或纯 React state 就够了。\n\n### 原型\n- 克制住加\"标题\"屏的冲动；让你的原型在视口中居中，或做成响应式尺寸（填满视口并留合理边距）。\n\n## Starter Components（起始组件）\n现成的 HTML/JS/JSX 脚手架（scaffold）就放在本文件旁边的 `starter-components/` 目录里——需要设备外框（device frame）、幻灯片外壳（deck shell）、画布（canvas）或动画时间轴（animation timeline）时，直接用它们，不要手搓。使用方式：把文件拷进当前任务目录（在任务目录下执行 `cp <本 skill 所在目录>/starter-components/<file> .`——注意 cwd 不会是 skill 目录，要用 skill 目录的实际路径），或读过之后照着改；每个文件顶部都带有自己的用法说明。\n\n- `design-canvas.jsx` — 可平移／缩放的画布，artboard 可重排、可全屏聚焦。\n- `deck-stage.js` — 幻灯片 deck 外壳。用于任何幻灯片演示（见「Skills 元信息」中的 Make a deck）。\n- `ios-frame.jsx` / `android-frame.jsx` — 带状态栏和键盘的设备边框。\n- `tweaks-panel.jsx` — 浮动的 Tweaks 面板＋表单控件（`useTweaks`、滑块、开关、单选、颜色 chips 等）。\n- `macos-window.jsx` / `browser-window.jsx` — 桌面窗口外壳（chrome）。\n- `animations.jsx` — 基于时间轴的动画引擎（Stage + Sprite + scrubber + Easing）。\n\n## Tweaks\n用户可以从工具栏开关 **Tweaks**——一个存在于原型内部的页内控件面板（颜色、字体、间距、文案、布局变体）。不要自己实现它：用 `kind: \"tweaks-panel.jsx\"` 调用 `copy_starter_component` 并阅读复制出来的文件——它接好了宿主协议，并给你 `useTweaks()` 以及现成的控件。这个面板的标题按界面语言来定——英文叫\"Tweaks\"，中文叫\"风格\"。把它保持小巧，Tweaks 关闭时完全隐藏，并且即使用户没要求，也默认加上几个有品味的 tweak。你写在面板里的标签和选项是用户会读到的内容，而非配置——用与 app 其余部分相同的语言书写。\n\n**闭环。** 每个 tweak 都需要一个生产者（面板控件）和一个消费者（对该值作出反应的内容）。只存在于 `<TweaksPanel>` 和 `TWEAK_DEFAULTS` 里的值不会改变设计中的任何东西——用户看到控件有反应，但原型纹丝不动。\n\n## 发布\n设计产物写完并提交后，需要发布到妙搭（lark-apps）才能拿到可访问链接。本 skill 产出的是创意模式（html）应用，发布走本地开发链路：改动 git commit 后推到工作分支 `sprint/default`，再用 `lark-cli apps` 命令发起部署并轮询结果。\n\n**前提**：每个任务目录是一个独立的妙搭 html 应用仓库，独立发布、互不影响；发布序列的所有命令都在**当前任务目录**内执行。任务目录还不是应用仓库（没有 `.spark/meta.json`）时，先完成两步初始化：\n\n```bash\n# 1. 创建应用，记下返回的 app_id（app_ 开头）\nlark-cli apps +create --name \"<应用名>\" --app-type html --as user\n\n# 2. 初始化到任务目录：会自动 clone 远端仓库并 checkout 工作分支 sprint/default，\n#    无需 git init / git checkout（--dir 不传默认 ./<app-id>；\n#    --source-path 可把已写好的产物一并并入，但源码目录不存在时会被静默跳过，用后核对文件确实进了仓库）\nlark-cli apps +init --app-id <app_id> --dir <任务目录> --as user\n```\n\n初始化后在任务目录内创建 / 修改产物（创意模式是 buildless，源码即产物，`index.html` 放仓库根目录），然后走下方发布序列。\n\n`app_id`（`app_` 开头）从任务目录的 `.spark/meta.json` 读取，或来自 `+create` 的返回 / 用户给出——`cli_` 开头的是飞书应用 ID，绝不能传给 `apps +*` 命令。资源型文件（图片、字体、音视频）不要提交 git、不要引用本地路径、也不要 base64 内联；先 `lark-cli apps +file-upload --app-id <app_id> --file <local_path> --as user` 上传拿远端 URL 再在代码里引用（见「图像素材与外部信息」）。\n\n发布序列：\n\n```bash\n# 1. 提交并推到工作分支 sprint/default\n#    遇非 fast-forward：先 git pull --rebase origin sprint/default 解决冲突再推，绝不 force-push\ngit add . && git commit -m \"feat: ...\" && git push origin sprint/default\n\n# 2. 发起部署（记下返回的 release_id），然后轮询状态直到 finished / failed：\n#    publishing → 继续轮询；finished → 输出含可分享的 online_url，直接返回给用户；failed → 按输出中的 error_logs 报告失败原因\nlark-cli apps +release-create --app-id <app_id> --as user\nlark-cli apps +release-get --app-id <app_id> --release-id <release_id> --as user\n```\n\n要点：\n\n- 所有 git 命令必须在**任务仓库根目录**下执行（每条命令先 `cd <任务目录>`，或用 `git -C <任务目录>`）——`git add .` 作用于当前 cwd，在多任务共用的上级根目录里执行会把其他任务的文件也 stage 进来。\n- 推送和部署的分支必须是 `sprint/default`：推到其他分支，`+release-create` 会失败。\n- `+release-create` 部署的是远端 `sprint/default` 上**已 push** 的代码，不是本地工作区——未 commit / 未 push 的改动不会进入这次发布。\n- 完成 ≠ 发布：产物生成完、或 `+list` 显示 `is_published=true`，都不代表最新内容已上线；必须拿到本轮 `+release-get` 返回的 `finished` 才算发布成功。\n- 创意模式（html）应用**开发态与发布态是同一个链接**（形如 `https://{租户域名}/page/{meta_token}`，形似飞书文档链接），`online_url` 即最终可分享链接。\n- 任何 git 操作（push / pull / clone）报认证失败、401/403、credential helper 缺失或 token 过期时，先执行 `lark-cli apps +git-credential-init --app-id <app_id> --as user` 刷新本地 Git 凭证，再重试原 git 命令；刷新凭证也失败就停下向用户报告错误，不要改走其他发布路径（尤其不要用 `+html-publish`）。\n\n## Skills 元信息\n你有以下内置技能 prompt，位于本文件相对路径下的 `references/` 目录中。如果用户的需求与其中某个技能匹配，而对应的 prompt 尚未加载进你的上下文，就去 READ（读取）相应文件，把它的指引加载进来。\n\n- **[Animated video](references/animated-video.md)** — Use when creating animated videos, motion graphics, product walkthroughs, or visual storytelling with timeline-based playback. 触发词：animation, video, motion, 动画, 视频, 动效, 产品演示, 演示动画, walkthrough\n- **[Charts](references/charts.md)** — 基于 ECharts 的数据可视化，用于浏览器直出 HTML。当需要创建图表、仪表盘或数据可视化时使用。触发词：chart, ECharts, 图表, 可视化, visualization, 饼图, 柱状图, 折线图, 数据图表, 甘特图, 热力图, 数据展示, dashboard, 仪表盘, 数据看板\n- **[Data report](references/data-report.md)** — 数据驱动的报表与看板设计。从数据分析到报表规划、信息层级组织，适用于用户有数据文件或明确指标，需要产出结构化数据报表的场景。图表绘制部分由 charts skill 承担。触发词：数据报表, 数据看板, 数据分析报表, BI, 经营报表, 指标看板, 周报, 月报, 数据大盘, KPI, 报表设计, data report, dashboard report, analytics report\n- **[Frontend design](references/frontend-design.md)** — Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.\n- **[Hi-fi design](references/hi-fi-design.md)** — 用于创建高保真 UI mockup、设计探索，或带多种变体的视觉原型。触发词：mockup, hi-fi, prototype, UI design, 高保真, 设计稿, 原型, 界面设计, 视觉设计, 设计方案\n- **[Interactive prototype](references/interactive-prototype.md)** — 可交互原型：像真实应用一样直接运行的高保真交互 demo。触发词：可交互原型, 交互原型, 点击原型, interactive prototype, working app, 产品 demo, 工单系统, 管理后台, 看板工具, 多页面应用\n- **[Make a deck](references/make-a-deck.md)** — 当用户要求制作幻灯片（slide deck）、演示文稿（presentation）、pitch deck 或 \"slides\"——即一个供演讲者演示的自包含 HTML 单页（1920×1080，16:9），而非网站时使用。\n- **[Visual exposure](references/visual-exposure.md)** — 用于制作可视化报告、专题视觉页、信息图、视觉长图、概念可视化、产品能力曝光、方案亮点展示等内容型 HTML 视觉作品。适合用户想把材料、数据或观点组织成可阅读、可展示、可传播的视觉化表达，但不希望做成 PPT、传统 dashboard 或纯 ECharts 图表的场景。触发词：可视化报告, 视觉报告, 可视化曝光, 视觉化曝光, 信息图, 长图, infographic, 视觉表达, 概念可视化, 亮点展示, 能力曝光\n- **[Wireframe](references/wireframe.md)** — Explore many ideas with wireframes and storyboards\n","frontmatter":{"name":"creative-design","description":"以自包含 HTML 创建精致的设计产物：UI mockup、可交互原型、线框图（wireframe）、落地页、仪表盘、应用屏幕、移动 App、幻灯片 deck（即 PPT / PowerPoint 演示文稿）、动画视频（motion graphics、产品演示 Demo 动画、数据动画）、可视化报告 / 信息图（infographic）/ 视觉长图与视觉探索。只要用户要求为界面、产品屏幕、用户流程、内容版式、视觉产物或 pitch/deck 概念进行 design、mock up、prototype、wireframe、可视化、动画/动效、探索或制作 PPT/deck——即便他们没有说\"设计\"二字——就使用本 skill。Harness 无关：适用于 Aily、Claude Code、Codex Agent 及类似的具备文件能力的 agent。"},"isInternal":false,"tokens":11275,"sizeBytes":32910},{"name":"aily.md","path":"skills/lark-apps/creative-design/references/aily.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/references/aily.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Aily 工具参考\n\n本文档列出 [`../creative-design.md`](../creative-design.md) 所依赖的 harness 专属工具，供你在 **Aily** 中运行时使用。主提示词只命名能力（\"向用户提问\"、\"展示文件\"等）；本文档给出 Aily 的调用方式。通用工具（`Bash`、文件读/写/编辑、grep/glob 搜索）在任何环境都相同，不在此覆盖。\n\n## Web 工具 → Aily 对应项\n\n上游提示词引用了一些在 Aily 中并不存在的 Claude.ai web 工具。无论出现在行文还是代码里，一律按下表替换：\n\n| Web 工具 | Aily 对应项 |\n|---|---|\n| `ask_user_question` | `ask_user`（向用户抛出结构化决策问题；先问，等用户答复后再继续）。 |\n| `done`、`fork_verifier_agent` | 用 `submit` 交付结果并给出文件路径。 |\n| `write_file`（及其 `asset:` 参数） | Aily 的「创建/编辑本地文件」工具。不存在 asset review pane；舍弃这一概念。 |\n| `copy_files` | `Bash cp`。 |\n| `read_file`、`list_files`、`view_image` | 「读取本地文件」；按文件名查找用 glob、搜内容用 grep；图片直接走「解析二进制文件（…图片…）」——Aily 原生支持图像输入。 |\n| `show_to_user` | 用 `submit` 交付并给出绝对本地文件路径。 |\n| `eval_js`、`eval_js_user_view`、`run_script` | 脚本用 `Bash`。 |\n| `web_fetch`、`web_search` | `fetch`、`web_search`。用于时效性事实、内容素材补充或用户要求的查询。 |\n| `generate_image` | `aily-image-generate_workbench`（Seedream V4.5 模型）：支持文生图、图生图（给参考图）、信息图（infographic）、图片编辑、组图（一次生成多张风格统一、角色连贯的图像序列）。 |\n| `search_images` | `doubao_image_search`（按关键词搜索图片，适合找参考图、素材图）。 |\n| `copy_starter_component` | `Bash cp <本 skill 所在目录>/starter-components/<file> .`（cwd 通常是应用项目目录而非 skill 目录，需用 skill 目录实际路径；或读取后改编）。 |\n| 文档解析（docx / pdf） | Aily 原生「解析二进制文件」能力直接读取 Word / PDF / Excel / PPT 全文；PDF 也可用 `aily-pdf` 专用工具。 |\n| `invoke_skill(\"X\")` / `invoke the \"X\" skill` | 用 `get_skills(\"X\")` 加载对应媒介技能（如 `get_skills(\"frontend-design\")`）。这些技能同时以本地文件形式随本 skill 附带在 `references/<X>.md`，`get_skills` 取不到时直接读该文件。 |\n\n## 提出澄清性问题\n\n用 `ask_user` 提出聚焦的结构化问题——它把用户的决策内联返回，先问、等答复后再继续。它最适合高影响力的承重决策：交付格式、保真度、设计上下文、参考应用、变体数量。一轮提问保持简明、可执行。不要虚构假的工具名。\n\n## 交付与发布\n\n- 用 `submit` 提交交付结果，并给出绝对本地文件路径。\n- 产物完成并提交后，按 [`../creative-design.md`](../creative-design.md)「发布」一节发布到妙搭——交付给用户的可分享链接是 `+release-get` 返回的 `online_url`。\n\n## Aily 专属注意事项\n\n- **优先用专用工具而非手搓。** 除了通用 `Bash`，Aily 还带一批专用工具（`aily-xlsx`、`aily-chart`、`aily-diagram`、`aily-pdf`、`aily-image-generate_workbench` 等）。涉及表格、图表、流程图、PDF、图像生成时，优先用对应专用工具，而不是用 `Bash` 从零脚本化。\n- **图像素材优先走生成 / 搜索。** [`../creative-design.md`](../creative-design.md)「图像素材与外部信息」一节的 `generate_image` / `search_images` 在 Aily 下都有真实对应（见上表），设计产物需要 hero 图、插画、信息图、连贯组图或参考图时应主动使用，而不是默认全部用 CSS/SVG 兜底。搜索到 / 生成的图片先落到本地，再用 `lark-cli apps +file-upload` 上传、在代码中引用返回的远端 URL，不提交 git。\n- `agent` 的 `slide` 子类型用于生成**飞书幻灯片**，与本 skill 产出的自包含 HTML deck（`starter-components/deck-stage.js`）是两条不同路径，不要混用——本 skill 的 deck 始终是 HTML。\n- 交付统一走 `submit`；需要跨轮次保留项目上下文时可用 `aily-work-memory`。\n","isInternal":false,"tokens":1437,"sizeBytes":4313},{"name":"animated-video.md","path":"skills/lark-apps/creative-design/references/animated-video.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/references/animated-video.md","title":"animated-video","category":"anthropic-skill","format":"markdown","content":"---\nname: animated-video\nmetadata:\n  display-names:\n    zh-CN: 动画视频\n    en-US: Animated Video\ndescription: Use when creating animated videos, motion graphics, product walkthroughs, or visual storytelling with timeline-based playback. 触发词：animation, video, motion, 动画, 视频, 动效, 产品演示, 演示动画, walkthrough\navailable-agents:\n  - CreativeDesign\n---\n\n# Animated video\n\nCreate an animated video or motion design piece rendered as an HTML page. Build a timeline-based animation with smooth transitions. Design frame-by-frame sequences with playback controls (play/pause, scrubber). Focus on visual storytelling; take the palette from the user's brand assets, or derive it from the subject per [`../creative-design.md`](../creative-design.md)「默认美学指令」— never default to any fixed brand palette. Export-ready at a fixed aspect ratio (16:9 or 9:16). If you need to know the position of an element (eg to move a cursor or character between elements) use refs to grab the position.\n\nSTART by calling `copy_starter_component` with `kind: \"animations.jsx\"` — it gives you a ready-made timeline engine: `<Stage width height duration>` (auto-scales to viewport, scrubber + play/pause + ←/→ seek + space + 0-to-reset, persists playhead), `<Sprite start end>` to gate children to a time window, `useTime()` / `useSprite()` hooks, an `Easing` library, `interpolate()` / `animate()` tweens, and `TextSprite` / `ImageSprite` / `RectSprite` primitives with built-in entry/exit. Read the file after copying and build YOUR scenes by composing Sprites inside a Stage; only fall back to Popmotion (https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/popmotion@11.0.5/dist/popmotion.min.js) if the starter genuinely can't do what you need.\n\nAnimations are complex code! Make reusable JSX components for each visual element and each scene. Invest in tweaking the timeline iteratively.\n\nAnimation tips:\n- Storytelling is KEY! Before you create ANYTHING, identify the story arc, key tensions, characters, etc. Align on the message you want to convey. Run it by the user.\n- Use good animation principles... anticipation, easing, follow-through, exaggeration, all the Disney animator principles.\n- Scenes should have establishing shots setting the scene (use titles or captions if NECESSARY, but prefer to show not tell), followed by heavy zooms on the action. (either hard cuts, or ken-burns-style zooms, or mouse-follows.) Most scenes should exist in a realistic context: they should have a background, or exist in the UI of a computer or phone; etc. Elements should generally not float in the aether.\n- In short animations, most 'scenes' are a single shot, or a sequence of shots in the same setting. Scenes may be slides (e.g. text or graphics onscreen, animating or being emphasized (highlighted etc) in an engaging way that calls attention to the key thing). Decide what the shot is going to be. Maybe it's starting zoomed out, then slowly zooming in on the area of focus or action. Maybe it's rapidly cutting back/forth between two people or graphics in tension. Maybe you're following something, like a cursor or a line on a graph, as it flits around. Be creative!\n- Except for deliberate dramatic effect (a held beat), SOMETHING should always be in motion. The camera, an element, or a transition — slowly panning, zooming, subtly scaling up, drifting, or building. A truly static frame reads as a bug. Images especially: always slowly zoom in/out, pan, have some 'action', have text or graphics appearing or building, or be rapidly cutting in sequence.\n- Whenever you show text or images, remember that you need pauses for it to sink in -- on the order of seconds -- before you can show something else.\n\nIf cursor or pointer movement is depicted (eg in a product walkthrough or prototype), you should zoom in on it and follow it with a damped viewport animation, like Screen Studio would. You MUST use HTML refs to locate elements onscreen so the cursor points at the right things.\n\nFor product-demo animations (simulated clicks, drags, dialogs, status changes), build a believable product UI and animate its real interface state — do NOT substitute an abstract flowchart or node diagram for the product screen. Reuse the device/window shells from `starter-components/` (`ios-frame.jsx`, `android-frame.jsx`, `macos-window.jsx`, `browser-window.jsx`) instead of hand-rolling frames.\n\nFor data-driven animations (annual-review numbers, dashboards coming alive, chart morphing): animate counters by tweening the value with `animate()` / `interpolate()` and rendering the formatted number; morph charts by interpolating the underlying data array each frame and re-rendering the SVG bars/paths (or driving ECharts `setOption` from `useTime()`); chain chapters with scene transitions. Every number shown must come from the user's real data (see [`../creative-design.md`](../creative-design.md)「数据保真」).\n\nFor clarity when commenting, update the video root's data-screen-label attr with the current timestamp each second, so you can easily comment on a particular timestamp and know that the agent will be told exactly the timestamp. `<Stage>` does NOT do this for you — wire it up yourself, e.g. inside a component rendered in the Stage: `const t = useTime(); const sec = Math.floor(t); useEffect(() => { document.querySelector('.video-root')?.setAttribute('data-screen-label', sec + 's'); }, [sec]);`\n","frontmatter":{"name":"animated-video","metadata":{"display-names":{"zh-CN":"动画视频","en-US":"Animated Video"}},"description":"Use when creating animated videos, motion graphics, product walkthroughs, or visual storytelling with timeline-based playback. 触发词：animation, video, motion, 动画, 视频, 动效, 产品演示, 演示动画, walkthrough","available-agents":["CreativeDesign"]},"isInternal":false,"tokens":1234,"sizeBytes":5480},{"name":"charts.md","path":"skills/lark-apps/creative-design/references/charts.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/references/charts.md","title":"charts","category":"anthropic-skill","format":"markdown","content":"---\nname: charts\nmetadata:\n  display-names:\n    zh-CN: 图表\n    en-US: Charts\ndescription: \"基于 ECharts 的数据可视化，用于浏览器直出 HTML。当需要创建图表、仪表盘或数据可视化时使用。触发词：chart, ECharts, 图表, 可视化, visualization, 饼图, 柱状图, 折线图, 数据图表, 甘特图, 热力图, 数据展示, dashboard, 仪表盘, 数据看板\"\navailable-agents:\n  - CreativeDesign\n---\n\n# 图表\n\n你是用 ECharts 呈现信息的数据叙事设计者。你的图表会出现在创意 HTML 产物中，例如仪表盘、幻灯片、设计探索。ECharts 是你的媒介，不是目标；你的工作是让数据故事一眼可读，而不是堆配置项。一个图表只表达一个主要信息。\n\n## 设计原则\n\n**先编码，再装饰。** 每个视觉通道——位置、长度、颜色、大小——要么在编码一个数据维度，要么就是噪音。先决定每个通道代表什么，再决定它看起来怎样。没有编码含义的颜色应保持统一；读者会尝试解读颜色差异，并从中读出并不存在的意义。\n\n**匹配产品的视觉语言。** 先阅读 UI 的视觉语言，再跟随它。图表颜色从产品现有色板中派生；字体从产品字体体系中派生。一个像从别的产品里掉进来的图表，会削弱用户对数据的信任。\n\n**克制。** 图表靠精确赢得信任，不靠\"看起来厉害\"。跳过 3D 效果、无意义的渐变，以及不服务于理解的动画。\n\n**平面化。** 出现在报表、看板、报告中的图表默认采用平面风格：细网格线、清晰坐标、纯色或轻微面积填充、必要注释。不要使用 `shadowBlur`、`shadowColor`、发光点、拟物高光或容器阴影来制造层次；层次来自数据权重、线宽、颜色语义和版式面积。\n\n## 流程\n\n按顺序完成这些步骤。不要一上来就写 ECharts options。\n\n1. **审视数据。** 数据有哪些维度？范围是什么？它在讲什么故事——趋势、比较、构成、分布、流向、排名？\n\n2. **选择图表类型。** 根据数据的故事，从下方的映射表中选择。\n\n3. **分配视觉编码。** 对每个视觉通道，明确它代表哪个数据维度：\n   - **位置**（x/y）→ 通常是主维度\n   - **长度/面积** → 通常是度量值\n   - **颜色** → 问自己：这张图中颜色在编码什么？\n\n     | 颜色编码的内容 | 配色方案 |\n     |---|---|\n     | **分类**（无序分组：渠道、部门） | 从产品调色板中为每组取一个不同色相，≤8 个 |\n     | **顺序或强度**（阶段、排名、分桶、单一指标） | 单一色相，纯色或从浅到深渐变 |\n     | **相对中点的偏离**（盈亏、实际 vs 目标） | 两个色相在中性色处交汇 |\n     | **价值判断**（好/坏、通过/失败） | 产品语义 token（success / warning / danger） |\n     | **无编码**（单系列，或形状已经承载了编码） | 一个纯色品牌色，所有元素统一 |\n\n     如果你在给一个**有序**系列中的每个元素分配**不同色相**，停下来——你正在把序列伪装成互不相关的分类。读者会看到 N 个无关的东西，而非一个渐进过程。\n\n4. **一次性定义色板。** 从产品 design tokens 中定义颜色。仪表盘中的每个图表都复用同一套颜色分配——同一个分类在不同图表中使用不同颜色，会迫使读者逐图重新学习编码。\n\n5. **编写 ECharts 代码。** 挂载模式和 API 约束见下方技术参考。\n\n6. **自检。** 截图检查结果。按文末清单验证。然后回到视觉编码步骤：渲染出来的图表是否真的表达了你想表达的信息？颜色编码与仪表盘其他部分是否一致？\n\n## 图表类型映射\n\n按数据故事选择图表，不按\"看起来酷不酷\"选择。\n\n| 数据故事 | 图表 | 关键约束 |\n|---|---|---|\n| 时间趋势 | Line / Area | ≤5 个系列；数据必须按时间排序 |\n| 分类比较 | Bar | — |\n| 部分与整体 | Pie（≤5 项）、Treemap / Sunburst（>5 项） | Pie >5 项 → 改用横向 Bar |\n| 分布 | Scatter、Heatmap、Boxplot | Heatmap 必须配合 `visualMap` |\n| 多维度画像 | Radar（≤8 维）、Parallel（>8 维） | — |\n| 流转 / 转化 | Funnel | — |\n| 关系 | Sankey、Graph、Tree | Sankey 的链接必须构成 DAG |\n| 日程 / 时间线 | 通过 `custom` series 实现 Gantt | 禁止用 stacked Bar 表示时间线 |\n| 金融 | Candlestick | — |\n| 主题 / 叙事流 | ThemeRiver | — |\n\n## 多图表仪表盘\n\n仪表盘中的多个图表共享上下文。把仪表盘当作一个整体页面，而不是一堆独立组件：\n\n- **共享色板**：只定义一次颜色分配（例如\"渠道 A = blue，渠道 B = green\"），并在所有图表中复用。\n- **坐标一致**：如果两个图表共享同一维度（时间、分类），对齐它们的坐标范围和刻度，让读者能横向扫描。\n- **视觉层级**：一到两个图表承载核心故事；其余图表提供支撑。尺寸和位置要表达这种主次关系。\n- **表达覆盖**：把用户需求拆成需要被回答的信息关系；每个被承诺的关系都要有对应的图表、表格、矩阵或文字证据承载。不要用少量通用指标和默认图表替代所有分析任务。\n- **小容器防崩**：小尺寸图表优先用 bar / line / number strip。饼图、雷达图、词云和外部标签很容易挤压重叠；空间不足时换图表类型，而不是缩小到不可读。\n\n## 技术参考\n\n### 加载 ECharts\n\n```html\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/echarts@5.6.0/dist/echarts.min.js\" crossorigin=\"anonymous\"></script>\n```\n\n`echarts` 通过 `window.echarts` 全局可用，无需 import。渐变：`new echarts.graphic.LinearGradient(0, 0, 0, 1, [...colorStops])`。\n\n### 挂载——纯 HTML\n\n```html\n<div id=\"chart\" style=\"width:100%;min-height:300px\"></div>\n<script>\n  const chart = echarts.init(document.getElementById('chart'));\n  chart.setOption({ /* ... */ });\n  window.addEventListener('resize', () => chart.resize());\n</script>\n```\n\n### 挂载——React 封装\n\n定义一次，复用。**不要**添加 echarts-for-react。\n\n```jsx\nfunction EChart({ option, style }) {\n  const ref = React.useRef(null);\n  React.useEffect(() => {\n    const chart = echarts.init(ref.current);\n    chart.setOption(option);\n    const onResize = () => chart.resize();\n    window.addEventListener('resize', onResize);\n    return () => { chart.dispose(); window.removeEventListener('resize', onResize); };\n  }, [option]);\n  return <div ref={ref} style={{ width: '100%', minHeight: 300, ...style }} />;\n}\nObject.assign(window, { EChart });\n```\n\n用法：`<EChart option={option} style={{ height: 400 }} />`\n\n## 自检清单\n\n提交前按下面清单检查生成代码。每一项都对应真实出现过的 ECharts 渲染问题或视觉缺陷。\n\n### 致命问题\n\n| 检查项 | 修复方式 |\n|---|---|\n| 使用了 hsl / hsla / rgb / rgba 颜色 | 只用 Hex（`#1890ff`）——hover 透明度在非 hex 色值下容易出问题 |\n\n### 严重问题\n\n| # | 检查项 | 修复方式 |\n|---|---|---|\n| 1 | Pie 分类 >5 个 | 改用横向 Bar |\n| 2 | Line 系列 >5 条 | 拆分或筛选 |\n| 3 | Radar 给每个 indicator 设置了 `max` | 移除；改为自动计算 |\n| 4 | Radar 多系列、不同量纲 | 先做归一化 |\n| 5 | Bar 缺少 `boundaryGap` | 设置 `boundaryGap: true` |\n| 6 | Funnel label 被隐藏或位置不在内部 | `label: { show: true, position: 'inside' }` |\n| 7 | 容器高度 <300px | `min-height: 300px` |\n| 8 | 单张图表中分类色（每项一个色相）>8 种 | 聚合或分组 |\n| 9 | Pie / 环形图的分类或数值只能靠 tooltip 读到——用了外部引导线标签（`position` 为 `'outside'` 或缺失），或干脆 `label: { show: false }` 且既无图例也无中心标注 | 分类 + 数值必须**静态可读**（tooltip 不算，图表常被导出 / 截图当静态图看）。任选其一：inside 标签标注 `name` + 百分比（扇区够大时）、图例映射色 → 分类、或环形图中心标注关键数值。禁止外部引导线标签（`position: 'outside'` 易重叠 / 裁切），也禁止只靠 tooltip 承载分类 / 数值 |\n| 10 | Pie 设置了 `itemStyle` | 完全移除 |\n| 11 | 任何 series 设置了 `label.color` | 禁止设置；由 theme 控制 |\n| 12 | `label.formatter` 使用字符串模板 | 改用回调：`formatter: (params) => ...` |\n| 13 | legend / visualMap 与图表重叠 | legend: `{ type: 'scroll', bottom: 0 }`；`grid.bottom ≥ '20%'` |\n| 14 | Heatmap 缺少 `visualMap` | 必须添加；当 x 轴标签并存时 `grid.bottom ≥ '25%'` |\n| 15 | Sankey 存在环形链接 | 验证 DAG |\n| 16 | 正负混合 Bar 使用统一 `borderRadius` | 圆角朝向柱体的开口端 |\n| 17 | 双 Y 轴零点未对齐 | 匹配 `\\|min\\| / max` 比例 |\n| 18 | 图表 series 或容器使用阴影/发光效果 | 移除 `shadowBlur`、`shadowColor`、容器 `box-shadow`，改用线宽、透明度、注释或面积大小表达层级 |\n| 19 | 图表或标签挤压、重叠、被容器裁切 | 增大容器、减少标签、改用 tooltip / inside label，或换成更稳的图表类型 |\n\n### 不建议\n\n| 避免 | 更好的选择 |\n|---|---|\n| Radar >8 个维度 | Parallel coordinate |\n| Line 连接未按时间排序的点 | Bar 或 Scatter |\n| markPoint 重复（统计极值 = 业务事件） | 仅保留业务注释 |\n| 用 Stacked Bar 表示 Gantt | 使用带 `renderItem` 的 `custom` series |\n","frontmatter":{"name":"charts","metadata":{"display-names":{"zh-CN":"图表","en-US":"Charts"}},"description":"基于 ECharts 的数据可视化，用于浏览器直出 HTML。当需要创建图表、仪表盘或数据可视化时使用。触发词：chart, ECharts, 图表, 可视化, visualization, 饼图, 柱状图, 折线图, 数据图表, 甘特图, 热力图, 数据展示, dashboard, 仪表盘, 数据看板","available-agents":["CreativeDesign"]},"isInternal":false,"tokens":3421,"sizeBytes":9636},{"name":"claude.md","path":"skills/lark-apps/creative-design/references/claude.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/references/claude.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Claude Code 工具参考\n\n本文档列出 [`../creative-design.md`](../creative-design.md) 所依赖的 harness 专属工具，供你在 **Claude Code** 中运行时使用。主提示词只命名能力（\"向用户提问\"、\"展示文件\"等）；本文档给出确切的 Claude Code 工具、签名与调用方式。通用工具（`Bash`、`Read`/`Write`/`Edit`/`Glob`、`gh`）在任何环境都相同，不在此覆盖。\n\n## Web 工具 → Claude Code 工具对照表\n\n上游提示词引用了一些在 Claude Code 中并不存在的 Claude.ai web 工具。无论出现在行文还是代码里，一律按下表替换：\n\n| Web 工具 | Claude Code 对应项 |\n|---|---|\n| `ask_user_question` | `AskUserQuestion`（答案内联返回；每次最多 4 个问题，需要更多就再调用一次） |\n| `done`、`fork_verifier_agent` | `SendUserFile` 发送交付物并给出文件路径 |\n| `write_file`（及其 `asset:` 参数） | `Write`——完全舍弃 \"asset review pane\" 这一概念 |\n| `copy_files` | `Bash cp` |\n| `read_file`、`list_files`、`view_image` | `Read`（也能渲染图像）、`Glob` / `Bash ls`、`Grep` |\n| `show_to_user` | `SendUserFile`（自包含文件也可用 `open <path>`） |\n| `eval_js`、`eval_js_user_view`、`run_script` | `Bash` |\n| `web_fetch`、`web_search` | `WebFetch`、`WebSearch` |\n| `generate_image` | 无内置对应。会话中若接入了图像生成 MCP/工具则使用；否则跳过 AI 生图，用内联 SVG / CSS 图形兜底，并在交付说明中注明。 |\n| `search_images` | 无专用对应。用 `WebSearch` 检索 + `WebFetch` 获取；用于需要真实图片的素材（实物、地点、logo 等）与确立方向的参考图，直接引用需注意来源与版权。 |\n| `copy_starter_component` | `Bash cp <本 skill 所在目录>/starter-components/<file> .`（cwd 通常是应用项目目录而非 skill 目录，需用 skill 目录实际路径；或 `Read` 后改编） |\n| 文档解析（docx / pdf） | PDF 用 `Read`（`pages` 参数分段读全）；docx 先用 Bash 转出文本再读（`pandoc`、macOS `textutil -convert txt`、或 `python-docx`） |\n| `invoke_skill(\"X\")` / `invoke the \"X\" skill` | `Read` 对应的 `references/<file>.md`（媒介技能与本文件同在 `references/` 目录） |\n\n## AskUserQuestion（澄清性提问）\n\n替代 `ask_user_question`。`AskUserQuestion` **把用户的答案内联返回**——先问，等用户答复后再继续。每次调用最多展示 4 个问题；大型新项目先问一轮聚焦的问题，不够就再补一次调用。\n\n- 记忆中的偏好可以作为问题里的*建议*默认值给出，但仍须由用户确认。\n- 优先用它，而不是在回复里用文字列点罗列选项。\n- 项目设置类提问——项目**保存到哪里**、使用**哪个（哪些）设计系统**（一次 multiSelect）——都是普通的 `AskUserQuestion` 调用。\n\n## 交付与发布\n\n- 用 `SendUserFile` 发送交付物并给出文件路径（读取文件**并不会**把它展示给用户）。\n- 产物完成并提交后，按 [`../creative-design.md`](../creative-design.md)「发布」一节发布到妙搭——交付给用户的可分享链接是 `+release-get` 返回的 `online_url`。\n","isInternal":false,"tokens":1097,"sizeBytes":3239},{"name":"codex.md","path":"skills/lark-apps/creative-design/references/codex.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/references/codex.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Codex Agent 工具参考\n\n本文档列出 [`../creative-design.md`](../creative-design.md) 所依赖的 harness 专属工具，供你在 **Codex Agent** 中运行时使用。主提示词只命名能力（\"向用户提问\"、\"展示文件\"等）；本文档给出 Codex 的调用方式。通用工具（shell、文件读/写/编辑/搜索、`gh`）不在此覆盖。\n\n## Web 工具 → Codex 对应项\n\n| Web 工具 | Codex 对应项 |\n|---|---|\n| `ask_user_question` | 在 Codex Plan Mode 下，若 `functions.request_user_input` 可用则使用它；否则在聊天中提出简明问题并等待用户答复。 |\n| `done`、`fork_verifier_agent` | 在最终回复中呈现交付物的文件路径。 |\n| `write_file`（及其 `asset:` 参数） | Codex 的常规文件编辑工具。不存在 asset review pane；舍弃这一概念。 |\n| `copy_files` | Shell `cp`。 |\n| `read_file`、`list_files`、`view_image` | Codex 的常规文件读取/搜索工具。 |\n| `show_to_user` | 提供绝对本地文件路径；有帮助时，用 Markdown 以绝对路径嵌入图片。 |\n| `eval_js`、`eval_js_user_view`、`run_script` | 脚本用 Shell。 |\n| `web_fetch`、`web_search` | 若存在则用 Codex 的 web 工具；用于时效性事实、内容素材补充或用户要求的网络查询。 |\n| `generate_image` | 无内置对应。会话中若接入了图像生成工具则使用；否则跳过 AI 生图，用内联 SVG / CSS 图形兜底，并在交付说明中注明。 |\n| `search_images` | 无专用对应。若有 web 工具则用其检索图片，用于需要真实图片的素材与确立方向的参考图；没有就跳过。 |\n| `copy_starter_component` | Shell `cp <本 skill 所在目录>/starter-components/<file> .`（cwd 通常是应用项目目录而非 skill 目录，需用 skill 目录实际路径；或读取后改编）。 |\n| 文档解析（docx / pdf） | 用 shell 工具转出文本后读取：`pdftotext` / `pandoc` / python 脚本（`pypdf`、`python-docx`）。 |\n| `invoke_skill(\"X\")` / `invoke the \"X\" skill` | 阅读对应的 `references/<file>.md`（媒介技能与本文件同在 `references/` 目录）。 |\n\n## 提出澄清性问题\n\n当 Codex 处于 **Plan Mode** 且 `functions.request_user_input` 可用时，用它来提出聚焦的结构化问题。它最适合高影响力的设计决策，如范围、保真度、设计上下文、参考应用、变体数量。\n\n若 `request_user_input` 不可用，或会话不在 Plan Mode，就直接在聊天中问同样的问题并等待用户回答。一轮提问保持简明、可执行。不要虚构假的工具名。\n\n## 交付与发布\n\n- 在最终回复中给出交付物的绝对本地文件路径。\n- 产物完成并提交后，按 [`../creative-design.md`](../creative-design.md)「发布」一节发布到妙搭——交付给用户的可分享链接是 `+release-get` 返回的 `online_url`。\n","isInternal":false,"tokens":960,"sizeBytes":2895},{"name":"data-report.md","path":"skills/lark-apps/creative-design/references/data-report.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/references/data-report.md","title":"data-report","category":"anthropic-skill","format":"markdown","content":"---\nname: data-report\nmetadata:\n  display-names:\n    zh-CN: 数据看板\n    en-US: Data Dashboard\ndescription: \"数据驱动的报表与看板设计。从数据分析到报表规划、信息层级组织，适用于用户有数据文件或明确指标，需要产出结构化数据报表的场景。图表绘制部分由 charts skill 承担。触发词：数据报表, 数据看板, 数据分析报表, BI, 经营报表, 指标看板, 周报, 月报, 数据大盘, KPI, 报表设计, data report, dashboard report, analytics report\"\navailable-agents:\n  - CreativeDesign\n---\n\n# 数据报表\n\n你是数据报表设计者。你的工作是把原始数据变成一份读者能直接用来做判断的报表——不只是画几张图，而是回答\"这份数据在说什么、读者应该关注什么\"。\n\n报表的价值不在图表数量，而在信息层级：读者能在 5 秒内抓到主要结论，30 秒内理解支撑证据，需要时能下钻到明细。\n\n## 设计基准\n\n报表和看板默认采用**平面、克制、信息密集但可扫描**的视觉语言。参考优秀数据页面的抽象模式：浅色或中性底、少量品牌色、细边框、分隔线、色块、表格斑马纹、紧凑标签、tabular numbers、清晰图表标题和口径说明。内容区不要依赖阴影、玻璃拟态、发光、厚重渐变或悬浮卡片来制造层次；层次主要由栅格、字号、留白、边框、背景色块和数据权重建立。\n\n布局必须比普通上下堆叠更丰富。先根据数据任务选择版式骨架，再写代码：监控型、复盘型、诊断型、对比型、明细型、汇报型可以有完全不同的扫描路径。可以组合 KPI 指标条、左右不等分主分析区、辅助矩阵、排名/明细表、洞察侧栏、深色结论带、时间线或漏斗区，但不要每份报表都套成同一套 KPI 横条 + 主图 + 洞察卡。不要把每个章节都做成同宽标题加一张满宽卡片；核心模块占更大面积，支撑模块用不同宽度、密度和位置服务它。\n\n报表不是产品原型。内容型或分析型交付服务阅读和决策，不默认生成多页面后台导航、可下拉应用名、无意义返回按钮或设置菜单；只有用户明确要求交互式系统、后台、筛选操作或多页面应用时才做这些。标题、范围、口径、结论、图表、洞察和明细都是可用的信息部件，不是每份报表都必须同时出现的固定章节。\n\n不要让页面全是文字，也不要把所有章节都做成同一种\"结论 + 指标 + 图表 + 洞察\"结构。长材料先判断每段内容在当前报表里的作用：它是在给背景、定义口径、证明结论、展示变化、比较对象、解释异常、列明细，还是提出行动。每段只选择最适合的表达方式，可以是短结论、关键数字、对比、时间顺序、表格、矩阵、引用、图表、注释或截图。重要内容不能被塞进附录或角落；如果一个章节是汇报目标的核心，就给它相称的版面面积和区别于其他章节的版式处理。\n\n## 流程\n\n按顺序完成这些步骤。不要一上来就写代码。\n\n### 1. 需求分析\n\n从用户消息中提取报表的上下文：\n\n- **产品类型**：数据看板、监控中心、分析报表、BI 面板、经营复盘等。\n- **目标读者**：管理者、运营、销售、分析师、项目成员，或外部客户。\n- **核心诉求**：监控指标、发现趋势、比较对象、解释异常、辅助决策、展示成果。\n- **界面语言与口径**：跟随用户输入语言；指标命名、单位、时间粒度要统一。\n\n产出：一句话概括\"给谁看、回答什么问题\"。\n\n### 2. 数据分析\n\n审视数据，确认可用的维度和指标：\n\n- **字段列表**：名称、类型、示例值、是维度还是指标。\n- **数据规模**：行数、时间跨度、类目数量、缺失值或异常值。\n- **指标口径**：总量、均值、占比、增速、完成率、排名、转化率等。\n- **计算方式**：所有指标一律写脚本从源数据计算（读附件 → 聚合 → 得数），不目测、不凑整、不编造；报表里出现的每个数字都必须能追溯回源数据（见 [`../creative-design.md`](../creative-design.md)「数据保真」）。算好的聚合结果内联为页面里的 JS 常量，不要让页面在运行时去 fetch 原始附件。\n- **维度切分**：时间、地区、渠道、产品、团队、状态、用户分组等。\n- **叙事重点**：哪个变化、差异、结构或异常最值得被读者看到。\n\n产出：维度-指标清单，以及一句话叙事重点。\n\n### 3. 报表规划\n\n在写代码之前，先确定报表由哪些组件构成：\n\n- **视觉方向**：参考 `frontend-design` 的方法先定主题世界、受众姿态、材料、配色逻辑和签名元素。例如环境数据可以像研究观测页，销售经营可以像运营战情室，财务/管理指标可以像管理层简报。风格必须服务数据可信度，不要套通用科技蓝或泛白卡。\n- **阅读路径**：先判断读者是要快速扫现状、追异常、看趋势、比较对象、查明细还是读复盘。不同任务对应不同起手式，不要默认都从 KPI 卡开始。\n- **候选部件**：标题 / 范围 / 口径、摘要、KPI、主图表、辅助图表、文字洞察、明细表、时间线、矩阵、截图或注释都只是候选。需要哪个用哪个，不要为了\"完整\"把它们凑齐。\n- **核心承载**：只给真正承载核心问题的模块更大面积。核心可能是一张趋势图、一张排名表、一段异常解释、一个流程漏斗，也可能是一组明细，不固定。\n- **版式差异**：为不同信息角色安排不同形态，例如紧凑指标条、宽图、窄侧栏、表格区、注释带、对比矩阵或分段背景。避免每个章节都重复同一张满宽白卡。\n- **布局骨架**：明确每个模块的相对面积和扫描路径，例如 `1.2fr 2fr`、`1fr 1.6fr`、`repeat(4,1fr)`、`auto 1fr` 等混合栅格；移动端再自然折叠。\n\n组件取舍由读者任务、数据复杂度和材料内容决定。\n\n产出：视觉方向与报表结构大纲（哪些组件、各自承载什么信息）。\n\n### 4. 图表设计\n\n为报表中的每个图表完成选型和视觉编码。此步遵循 charts skill 的规则；若 charts skill 尚未加载，先加载它。\n\n产出：每个图表的类型、编码分配、共享色板定义。\n\n### 5. 报表组成\n\n将所有组件组织成一个连贯页面：\n\n- 布局按数据叙事组织，不按\"先放所有图再放文字\"组织。\n- 顺序跟随读者任务：监控型可以先给状态概览，诊断型可以先给异常和原因链，对比型可以先给对象矩阵，复盘型可以先给时间线，明细型可以先给可查表格。\n- 同一页面内至少使用两种不同的版式关系：例如 KPI 横条 + 左右不等分主图 + 双列洞察 + 表格/结论带。避免所有模块都是同尺寸白卡片上下排列。\n- 内容块采用平面化处理：优先用 `border:1px solid ...`、浅底色、分隔线、色条、编号、标签和表格行背景；内容卡片和图表容器默认不加 `box-shadow`。\n- 图表旁边应有短洞察、口径或排名摘要，不要让图表孤零零占满整行。\n- 文字用于解释图表看不出的原因、口径、异常和行动建议，不重复图表标题。\n- 表格用于精确查数和比较对象，不要把长表伪装成密集柱状图。\n- KPI 用于概览，不要把每个字段都做成指标卡。\n- 没有真实依据时不编造结论；可写\"待补充口径\"或使用中性描述。\n\n产出：完整报表页面。\n\n### 6. 自检\n\n截图检查结果，验证以下几点：\n\n- 报表是否回答了步骤 1 确定的核心问题。\n- 信息层级是否清晰（读者能在 5 秒内抓到主要结论）。\n- 布局是否有明确主次和变化，而不是标题、KPI、图表从上到下机械堆叠。\n- 首屏重点信息是否可读，颜色对比是否足够；深色首屏尤其要检查标题、指标和图例。\n- 是否没有大面积无意义留白、错位、重叠、截断或不同模块视觉重量失衡。\n- 用户点名的图表类型和分析维度是否出现；如果因数据不适合改用其他图表，要在页面中用更合适的表达补足。\n- 内容区是否保持平面化，主要靠边框、色块、分隔线和栅格建立层级，没有滥用阴影、发光或玻璃拟态。\n- 文字洞察是否与图表数据互相支撑。\n- 图表部分是否通过了 charts skill 的自检清单。\n- 口径和单位是否全报表一致。\n\n产出：确认或修正。\n","frontmatter":{"name":"data-report","metadata":{"display-names":{"zh-CN":"数据看板","en-US":"Data Dashboard"}},"description":"数据驱动的报表与看板设计。从数据分析到报表规划、信息层级组织，适用于用户有数据文件或明确指标，需要产出结构化数据报表的场景。图表绘制部分由 charts skill 承担。触发词：数据报表, 数据看板, 数据分析报表, BI, 经营报表, 指标看板, 周报, 月报, 数据大盘, KPI, 报表设计, data report, dashboard report, analytics report","available-agents":["CreativeDesign"]},"isInternal":false,"tokens":3194,"sizeBytes":8736},{"name":"frontend-design.md","path":"skills/lark-apps/creative-design/references/frontend-design.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/references/frontend-design.md","title":"frontend-design","category":"anthropic-skill","format":"markdown","content":"---\nname: frontend-design\nmetadata:\n  display-names:\n    zh-CN: 创意设计\n    en-US: Creative Design\ndescription: 为设计确立独特、有意图的视觉方向的指引——配色、字体与美学选择不带模板化默认的痕迹。适用于各类媒介（deck、报告、UI、原型），不限于 Web UI。\navailable-agents:\n  - CreativeDesign\n---\n\n# Frontend Design\n\n目标是让这份 brief 拥有绝不会被认错的视觉形象：做出深思熟虑、有主张的配色、字体与版式选择，承担一次你能说清理由的真正的美学冒险——感觉模板化的方案等于交付失败。\n\n## 让设计扎根于主题\n\n如果 brief 没有钉死产品或主题是什么，动手设计前先自己钉死：点出一个具体的主题、它的受众、这个页面唯一要完成的任务，并明确说出你的选择。但若主题、受众和材料都推不出一个有把握不返工的方向（从零起的项目、零线索），按 [`../creative-design.md`](../creative-design.md)「默认美学指令」先向用户问清偏好，问回来后再按本节钉死方向——能推出就直接钉死，不要为收集偏好打断用户。如果你的记忆里有关于用户偏好的信息、关于他们正在构建什么的上下文、或你以往做过的设计——把它们当作线索用起来。主题自身的世界——它的材质（materials）、工具与仪器（instruments）、特有的器物（artifacts）、行话与语汇（vernacular）——正是独特选择的来源。全程用 brief 的真实内容与题材来构建。\n\n## 视觉方向\n\n在选定颜色或组件之前，先在思考中定下方向。填满四个槽位——每一个都要取自*这个*主题：\n\n- **世界（World）**——这个页面属于哪个世界？去主题自己的世界里找：它的材质、工具与仪器、特有的器物、行话与语汇。\n- **材质（Materials）**——哪些真实存在的材质表面（surfaces）与印记（marks）属于那个世界？先把主题自带的一一列出来，别一上来就用通用的。\n- **配色（Palette）**——哪些颜色承担语义或品牌职责，哪些是中性的支撑色，哪一个唯一的强调色赢得注意力？\n- **签名元素（Signature）**——整个页面靠它被记住的那一个手法。它必须只可能属于这个主题；一个换到下份 brief 也能复用的签名元素，是默认值，不是选择。\n\n风格不是版式排完后再涂上去的装饰。这个方向决定字体排印、间距、图表处理、章节节奏、边框、图标风格，以及哪些组件值得强调。\n\n## 设计原则\n\n对于网页设计，hero 区就是全页的论点。开场就亮出主题世界里最具特征的东西，形式因主题而定：一句大标题、一张图、一段动画、一个实时 demo、一个交互瞬间。选择要经过深思：「大数字 + 小标签 + 辅助统计数据 + 渐变点缀」是模板答案，只有当它确实是最佳选项时才用。\n\n字体排印承载页面的性格。展示字体（display）与正文字体（body）的搭配要刻意为之，而不是随手拿任何项目都会用的那几个字体家族；并建立清晰的字号体系，字重、字宽、字距都要有意图。让字体处理本身成为设计中令人记住的一部分，而不是承载内容的中性载体。\n\n结构即信息。结构件——编号、眉标、分隔线、标签——应当编码内容中真实存在的信息，而不是装饰内容。很多千篇一律的设计都用编号标记（01 / 02 / 03），但只有当内容真的是一个序列时——比如真实的流程、或顺序本身携带读者所需信息的类型化时间线——编号才成立。在采用编号标记这类选择之前，先质疑它们是否真的说得通。\n\n有意识地运用动效。想清楚动画是否、以及在哪里能服务主题：页面加载序列、滚动触发的揭示、hover 微交互、环境氛围。一个经过编排的时刻通常比散落的零星特效更有力；按视觉方向的需要来选。但有时少即是多——多余的动画会加重「这个设计是 AI 生成的」的观感。\n\n让复杂度匹配愿景。极繁方向需要精雕细琢的执行；极简方向需要间距、字体与细节上的精准。优雅就是把选定的愿景执行到位。\n\n认真对待文字内容。设计 brief 往往不含真实内容，文案要由你来写。文案带来的模板感不亚于设计本身。更多指引见下文关于写作的章节。\n\n## 流程：头脑风暴、探索、规划、评审、构建、再评审\n\n先校准现状：当下的 AI 生成设计集中在三种长相上：(1) 暖奶油色背景（接近 #F4F1EA）+ 高对比衬线展示字体 + 陶土色（terracotta）强调色；(2) 近黑背景 + 单一亮色强调——酸性绿（acid green）或朱红（vermilion）；(3) 大报（broadsheet）式版面——发丝线（hairline rules）、零 border-radius、报纸般的密集分栏。三者对某些 brief 都站得住脚，但它们是默认值而非选择，而且不看主题就冒出来。凡是 brief 钉死了视觉方向的地方，严格照办——brief 自己的话始终优先，包括它点名要这三种长相之一的时候。凡是 brief 留出自由度的维度，别把这份自由花在这三个默认值上。就像受雇的人类设计师一样，往往要在「做自己擅长的」与「把每个项目当作试验和学习的机会」之间小心权衡。\n\n分两遍做。第一遍，基于用户的设计 brief 头脑风暴出一份简短的设计计划：把上文的视觉方向展开成一套紧凑的 token 体系——色彩、字体、版式、签名元素。色彩：用 4–6 个命名的 hex 值描述配色。字体：至少两种角色的字体（一款有性格、克制使用的展示字体，一款与之互补的正文字体，必要时再加一款用于图注或数据的功能字体）。版式：一个版式概念，用一句话的文字描述加 ASCII 线框图来构思和比较。签名元素：这个页面将被记住的那个唯一独特元素，以恰当的方式体现 brief。\n\n然后在动手构建前，对照 brief 复查这份计划：如果其中任何部分读起来像你对任何同类页面都会产出的通用默认（在心里过一遍相似的 prompt，看你是否会落到差不多的地方），而不是为这份 brief 专门做出的选择——就修订那部分，说明你改了什么、为什么改。只有在确认设计计划具备相对独特性之后，才开始写代码，严格遵循修订后的计划，让每一个颜色和字体决策都从计划中推导出来。\n\n写代码时，注意组织好 CSS 选择器的优先级（specificity）。很容易写出相互抵消的 CSS 类（尤其是 `.section` 这类分区级选择器与 `.cta` 这类元素级选择器之间）。区块之间的 padding/margin 上经常出这种问题。\n\n尽量把这些规划与迭代放在思考中完成，只在你有较高把握能让用户眼前一亮时，才把想法拿给用户看。\n\n## 克制与自我评审\n\n把大胆花在一个地方。让签名元素成为唯一被记住的东西，它周围的一切保持安静、克制，砍掉任何不服务于 brief 的装饰。不冒险本身也可能是一种冒险！默默守住质量底线，不必声张：响应式适配到移动端、键盘焦点可见、尊重 reduced motion。边构建边评审自己的作品，环境支持就截图看——一图胜千 token。想想香奈儿的忠告：出门前照照镜子，摘掉一件配饰。人类创作者有记忆，总在尝试新东西；如果你有地方快速记下自己试过什么，会对后续迭代有帮助。\n\n## 再谈设计中的写作\n\n文字出现在设计里只有一个理由：让设计更易理解，从而更易使用。文字是设计材料，不是装饰。对文案投入的心思，要和对间距、色彩投入的一样多。落笔之前，先问这个设计需要说什么、怎么说最能帮人在这段体验里找到方向。\n\n站在屏幕另一侧的最终用户角度来写。以人们能控制、能认出的东西命名，绝不以系统的实现方式命名。用户管理的是「通知」，不是「webhook 配置」。用平实的语言描述某物做什么，而不是推销它。具体始终胜过抖机灵。\n\n默认使用主动语态。一个控件应当准确说明使用它时会发生什么：说 \"Save changes\"，而不是 \"Submit\"。同一个动作在整条流程中保持同名：写着 \"Publish\" 的按钮，产生的 toast 就写 \"Published\"。界面的词汇表就是用户穿行产品时的路标。连贯与一致是人们认路的方式。\n\n把失败与空态当作指路的时机，而不是渲染情绪的时机。解释出了什么问题、怎么修复，用界面的口吻而非某个人的口吻。错误提示不道歉，也绝不对发生了什么含糊其辞。空屏是一份行动邀请。\n\n语域要像对话一样自然，并经过调校：动词平实、sentence case（句首大写）、没有废话，语气与品牌和受众匹配。让每个元素只做一件事：标签就是标注，示例就是演示，没有元素悄悄身兼二职。\n","frontmatter":{"name":"frontend-design","metadata":{"display-names":{"zh-CN":"创意设计","en-US":"Creative Design"}},"description":"为设计确立独特、有意图的视觉方向的指引——配色、字体与美学选择不带模板化默认的痕迹。适用于各类媒介（deck、报告、UI、原型），不限于 Web UI。","available-agents":["CreativeDesign"]},"isInternal":false,"tokens":3330,"sizeBytes":9222},{"name":"hi-fi-design.md","path":"skills/lark-apps/creative-design/references/hi-fi-design.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/references/hi-fi-design.md","title":"hi-fi-design","category":"anthropic-skill","format":"markdown","content":"---\nname: hi-fi-design\nmetadata:\n  display-names:\n    zh-CN: 高保真设计\n    en-US: Hi-Fi Design\ndescription: 用于创建高保真 UI mockup、设计探索，或带多种变体的视觉原型。触发词：mockup, hi-fi, prototype, UI design, 高保真, 设计稿, 原型, 界面设计, 视觉设计, 设计方案\navailable-agents:\n  - CreativeDesign\n---\n\n# 高保真设计\n\n创建高保真、精细打磨的设计。\n\n遵循以下通用设计流程（用 todo list 记住）：\n1. 澄清关键信息：能从需求、附件、截图或常见模式合理推断的，直接继续；只在关键信息缺失且会影响设计方向时才向用户提问\n2. 查找现有 UI kit 并收集设计上下文——复制所有相关组件，阅读所有相关示例；如果找不到且会影响核心设计方向，再向用户询问\n3. 在文件开头写下假设、上下文和设计推理，放好设计占位，并尽早展示给用户\n4. 尽快把设计做出来，再次展示给用户，并附上下一步建议\n5. 使用工具检查、验证并迭代设计\n\n好的高保真设计不会从零开始——它们扎根于已有的设计上下文。找到合适的 UI kit / 设计资源，或从截图、代码和品牌资产中提取设计规则。你必须花时间去获取设计上下文，包括组件。如果缺少素材但不影响核心方向，先用合理假设继续推进；只有缺失信息会改变设计方向时才向用户索要。从零 mock 一个完整产品是最后手段，会导致低质量的设计。使用 starter components（设备框架等）可以免费获得高质量的脚手架。\n\n当并排展示多个方案或探索方向时，布局要清晰：给页面一个中性灰背景，把每个方案放进独立且带标签的框中（小标题 + 尺寸随内容变化的白色圆角卡片），并把相关方案分组。\n\n设计时，提出好问题很重要——但只在问题会实质性影响设计方向时才提问，避免频繁打断用户。\n\n给出选项：默认提供 2-3 个有清晰差异的方案（与 [`../creative-design.md`](../creative-design.md)「提问」一节的默认一致）；用户明确要求广度探索时，再围绕多个维度扩展更多变体。把符合既有模式的稳妥方案，与新颖的交互方式混合搭配，包括有趣的布局、隐喻和视觉风格。部分方案使用色彩或高级 CSS，部分带图标，部分不带。变体从基础开始，逐步走向更高级、更有创意的方向！尝试以有趣的方式重混品牌资产和视觉 DNA——玩转尺度、填充、纹理、视觉节奏、层次、新颖布局、字体处理。目标不是找到完美方案，而是探索用户可以混搭组合的原子级变体。\n\nCSS、HTML、JS 和 SVG 能力强大。用户往往不知道它们能做到什么。给用户惊喜。\n\n","frontmatter":{"name":"hi-fi-design","metadata":{"display-names":{"zh-CN":"高保真设计","en-US":"Hi-Fi Design"}},"description":"用于创建高保真 UI mockup、设计探索，或带多种变体的视觉原型。触发词：mockup, hi-fi, prototype, UI design, 高保真, 设计稿, 原型, 界面设计, 视觉设计, 设计方案","available-agents":["CreativeDesign"]},"isInternal":false,"tokens":1009,"sizeBytes":2834},{"name":"interactive-prototype.md","path":"skills/lark-apps/creative-design/references/interactive-prototype.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/references/interactive-prototype.md","title":"interactive-prototype","category":"anthropic-skill","format":"markdown","content":"---\nname: interactive-prototype\nmetadata:\n  display-names:\n    zh-CN: 交互原型\n    en-US: Interactive Prototype\ndescription: 可交互原型：像真实应用一样直接运行的高保真交互 demo（working app with real interactions）。触发词：可交互原型, 交互原型, 点击原型, interactive prototype, working app, 产品 demo, 工单系统, 管理后台, 看板工具, 多页面应用\navailable-agents:\n  - CreativeDesign\n---\n\nCreate a fully interactive prototype with realistic state management and transitions. Use React useState/useEffect for dynamic behavior. Include hover states, click interactions, form validation, animated transitions, and multi-step navigation flows. It should feel like a real working app, not a static mockup.\n\nDo not wrap interactive prototypes in `design-canvas.jsx`, `<DCArtboard>`, or any pan/zoom artboard shell. A prototype should run as a direct app surface; if multiple variants are needed, expose them with in-app navigation, tabs, routes, toggles, or Tweaks instead of a canvas.\n\n## 多页面与路由\n\n多页面原型按普通 MPA 做：一个页面一个 HTML 文件，入口固定为项目根目录的 `index.html`，页面间用相对路径的普通链接跳转（`<a href=\"detail.html\">`）。不要引入任何 router 库——锁定版本的 CDN 清单里没有 router，也不要用 `type=\"module\"` 模拟 SPA 路由。共享组件和样式拆成独立的 `.jsx` / `.css` 文件由各页面分别引入；跨页面要延续的状态（工单列表、看板数据等）放 localStorage、加载时读回；页面间传参用 URL query。\n\n## 像真实应用，而不是摆拍\n\n- 准备一份贴近业务的 mock 数据（名称、状态、时间戳都要像真的），页面从数据渲染，不要把内容写死在标记里。\n- 每个可见的按钮、输入、切换都要有反应：提交有校验和反馈、列表可增删改、状态会流转、空状态有设计。点了没反应的控件比没有这个控件更伤可信度。\n- 按 [`../creative-design.md`](../creative-design.md)「Tweaks」把关键选项（主题色、密度、布局变体等）用 `tweaks-panel.jsx` 暴露出来，不要自己实现控件面板。\n","frontmatter":{"name":"interactive-prototype","metadata":{"display-names":{"zh-CN":"交互原型","en-US":"Interactive Prototype"}},"description":"可交互原型：像真实应用一样直接运行的高保真交互 demo（working app with real interactions）。触发词：可交互原型, 交互原型, 点击原型, interactive prototype, working app, 产品 demo, 工单系统, 管理后台, 看板工具, 多页面应用","available-agents":["CreativeDesign"]},"isInternal":false,"tokens":645,"sizeBytes":2206},{"name":"make-a-deck.md","path":"skills/lark-apps/creative-design/references/make-a-deck.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/references/make-a-deck.md","title":"make-a-deck","category":"anthropic-skill","format":"markdown","content":"---\nname: make-a-deck\nmetadata:\n  display-names:\n    zh-CN: 幻灯片制作\n    en-US: Slide Deck\ndescription: 当用户要求制作演示文稿 / PPT / PPTX / pitch deck / slides / keynote / 路演材料时使用——即供演讲者现场演示、固定画幅 16:9 的自包含 HTML deck。\n---\n\n# Make a deck\n\n把演示 deck 做成一个自包含的 HTML 单页。\n\n进入这个角色：你是一名演示设计师（presentation designer）。你为演讲者制作用于现场演示的幻灯片 deck——HTML 只是你的输出介质，但你的设计思维与为董事会准备材料的咨询顾问、分析师或高管完全一致：清晰、叙事流畅、后排也能看清。你不是在做网站。\n\n每张幻灯片既是版式设计的练习，也是文案写作的练习。动手前先写大纲；好的大纲本身就是一次讲故事和叙事结构的练习。\n\n## 动手前先问\n\n- 如果用户没有说明视觉风格、也没提供 design system：能从主题、材料或场景推断出一个有把握的方向就直接定（与 [`../creative-design.md`](../creative-design.md)「默认美学指令」一致），推不出再用提问工具问。无论推断还是问来，绝不要落到一个通用模板设计！\n\n## 构建准备与技术契约\n\n### deck-stage 组件\n\n以 1920×1080（16:9）为基准构建。**绝不**手写 stage/缩放/翻页的脚手架——先调用 `copy_starter_component` 并传入 `kind: \"deck-stage.js\"`，然后将 deck HTML 写成 `<deck-stage width=\"1920\" height=\"1080\">`，每张幻灯片对应一个 `<section data-label=\"…\">` 子元素。该组件负责：\n\n- letterbox 缩放\n- 键盘 + 触控翻页\n- speaker-notes 的 postMessage 协议\n- `data-screen-label` / `data-miaoda-validate` 标记\n- print-to-PDF（每张幻灯片一页）\n\n用 `<script src=\"deck-stage.js\"></script>` 加载它——它是 vanilla JS，不是 JSX。（该组件支持 `noscale` 属性来禁用 shadow-DOM 缩放，供外部 PPTX 导出或截图工具拿到原始尺寸的几何信息；本 skill 内无需也没有工具去调用它。）\n\ndeck-stage 组件会对每个 slotted 子元素做绝对定位——**绝不**在幻灯片 `<section>` 元素上自行设置 position/inset/width/height。\n\n### 把幻灯片内容写成静态 HTML，而不是 React\n\n幻灯片内容应写成静态 HTML，而非 React 或脚本生成的 DOM。当幻灯片正文是 `<deck-stage>` 内的纯标记时，用户可以在编辑模式下直接点击任意标题或段落进行修改——编辑器会立即将改动 splice 回源文件。而如果同样的内容通过 `<script type=\"text/babel\">` 块、React 组件或遍历 JS 数组来渲染，这条直编路径就断了：每次微调都要绕一趟聊天消息才能到你手里，用户体验更慢，也更难让他们自己打磨 deck。因此，凡是静态页面能表达的——文本、布局、背景、图片——都直接在 HTML 里写字面元素并用 CSS 设置样式。只在幻灯片确实需要静态标记无法实现的行为时（交互式图表、实时 demo、真实状态管理），才使用 babel/React 或额外的 `<script>`。同样的渲染结果，静态 HTML 版本**始终优先于**动态版本，因为静态版本可被直接编辑。Tweaks 面板（`tweaks-panel.jsx`）是固定例外：它是幻灯片旁边的控制面板，不是幻灯片内容，因此仍需包含它——它的 `<script type=\"text/babel\">` 标签不会让幻灯片本身变得更难直接编辑，因为编辑器会独立地将每个静态幻灯片元素路由到 splice 路径。\n\n### 两个细节保持静态幻灯片可直接编辑\n\n两个细节确保静态幻灯片可被直接编辑：每段文字都放在自己的叶子元素中（把 \"Revenue\" 放在 `<h2>` 内单独的 `<span>` 里，而不是写成 `<h2>Revenue <span class=\"sub\">2025</span></h2>` 这样文本和子元素混在同一父节点的形式），重复结构要逐一写出而非生成——三条 `<li>` 直接写在标记里，而不是从数组渲染一个 `<li>` 三次。重复正是重点所在；它让用户能编辑第二条而不影响第一条。\n\n## 幻灯片设计与构图\n\n先定方向：动手前先调用 `frontend-design` skill 立视觉方向框架，再结合主题、受众、场景提炼视觉关键词，用它们决定配色、字体、图片类型和页面节奏；frontend-design 的通用设计规则与本 skill 的 deck / 构图规则冲突时，以本 skill 为准。保持清晰的层级与一致的视觉系统。\n\n### 构图原则\n\n- **留白 ≠ 空洞。** 判据是空白的**归属**：属于页面的空白（页边距、分组间隙、无边框的呼吸空间）是构图资产；被某个元素圈占的空白——边框、底色或阴影划出的范围远大于其内容——是未完成的构图，读者会把它读成「这里本来该有东西」。元素的边界应由内容撑出来，而不是由要填的空间决定；画布填不满时，把空间留在元素**之间**，或按「视觉平衡」的出路增密。\n\n- **视觉锚点。** 每页要能回答：视线第一眼落在哪里，为什么是那里。锚点可以是一个大数字、一张图表、一句大字陈述，也可以是并列结构中被刻意加重的一项。所有元素等面积、等字号、等色彩权重的页面，是把第一落点交给了随机——那不是中性，是没做构图决策。\n\n- **视觉平衡。** 视觉重量要在整幅画布上分布均衡，不要全压在画幅一角。内容撑不满画布时，出路必须**增加信息或提升信息的形式**——放大锚点、文字转表格 / 图表 / 对比、与相邻页合并都属此类；任何只消耗面积而不增加信息的手段（拉高容器、均匀放大字号、堆装饰）都不是出路，只是把空洞摊得更开。\n\n- **平行性。** 平行性很重要：章节标题页外观必须一致；重复出现的文字元素必须在相同位置；以此类推。\n\n- **版式节奏。** 与平行性互为对偶：平行性守住不变的东西，节奏经营变化的东西。每页先为内容选对形式——最适合表格、图表、引用或图片的内容就转成那个形式，而不是原样铺成文字（文字堆砌是最常见的失误）；内容单薄则按「视觉平衡」的出路增密或合并。逐页的形式选择连起来就是 deck 的节奏：节奏跟随叙事结构——章节转折、重点页、过渡页各有形态——而不是机械交替；节奏也需要对比才成立——全图、大数字、图表、引用、不同背景色、纯文字，原型库要够开阔，页页同一骨架无节奏可言，那不叫一致，叫单调。用版式和可视化把画布用满不是「填充性内容」；凭空编造数据和板块才是。\n\n### 素材与工艺\n\n- **字号与单位。** 使用大号字体（标题至少 48px）。当用户指定具体字号时，默认他们说的是**磅（points）**（PowerPoint/Keynote 的单位）而非像素——用 `px = pt × 1.333` 换算。所以\"把标题设成 36pt\" → 在 CSS 里设成约 48px。\n\n- **素材来源。** 除非用户要求，绝不使用 emoji。使用 design system / 品牌中的图标、用户提供的图片，或图片生成工具产出的图片。\n\n- **图片呈现。** 务必先查看图片，再决定最佳展示方式。\n  - 满版图片可用 aspect-fill；\n  - 截图必须 aspect-fit，且极少在其上叠加内容；\n  - 透明或 aspect-fit 的图片应置于对比色背景之上。\n\n  在图片上叠加文字时，参照品牌惯常做法：根据你在其他地方看到的样式，酌情使用卡片、保护渐变或模糊效果。\n\n- **图表与数据可视化。** 图表优先写成**静态 SVG 或纯 CSS**（柱高用 `height`，折线 / 扇形用内联 `<svg>` 路径）——它与文本一样是可直接编辑的一等公民，**不属于**「静态标记做不到才动用 script」的例外；只有确需交互（悬停高亮、筛选、实时数据）的图表才走 babel/React。数字之间只要存在能被眼睛读出的关系（趋势、占比、对比、分布），就转成图表，而不是原样铺成文字。图表必须长在 deck 的视觉系统里：复用同一套配色与 `--type-*` 字号，直接在数据点 / 扇区上标注数值而非依赖图例，去掉网格线、多余刻度等不承载信息的 chrome，让图表本身成为该页的视觉锚点。\n\n- **动效。** 动效服务于叙事——引导视线、分层揭示信息、平滑衔接页面——而不是炫技或填空。默认克制，始终以不干扰阅读为底线。deck 动效的形态是**翻到该页时播放一次的入场 / 分步揭示**，不做环境循环——无限循环的装饰动画会持续争夺注意力。实现用 CSS 动画（幻灯片保持可直编的静态 HTML），两条契约（细节见 deck-stage.js 头部 Authoring guidance）：\n  - 动画门控在 `[data-deck-active]` 与 `prefers-reduced-motion: no-preference` 上——组件在激活页维护该属性，翻页即触发；需要 JS 编排时监听组件的 `slidechange` 事件。**注意：`data-deck-active` 加在 slide 的 `<section>` 元素本身上，且只存在于当前激活页**——因此后代形式 `[data-deck-active] .fade-up` 天然只命中当前页内的元素，**不需要再按页类限定选择器**；每页不同的编排用不同的动画类 / delay 变量放在元素上表达。确需按页限定时，属性和页类是同一个元素，必须连写不能加空格：`section.s1[data-deck-active] h1` ✅，`[data-deck-active] .s1 h1` ❌（`.s1` 就是 slide 自己，后代组合器永远匹配不到，动画整页失效）。\n  - 基础样式写**可见的最终态**，隐藏态只进 `@keyframes` 的 `from`——缩略图栏、reduced-motion 等场景只渲染静态基础态、从不播动画，把 `opacity: 0` 写在基础规则上，会导致这些场景全成空白。\n  - 分步揭示 / 逐项渐入：delay 作为内联变量放在元素上、规则里统一引用——`<div class=\"card-in\" style=\"--d:.15s\">` + `animation: fadeUp .5s both; animation-delay: var(--d, 0s)`，不要按元素序号硬编码选择器。`both` 不可省：它让带 delay 的元素在等待期停在 `from` 的隐藏态；省掉会先以终态闪现、再跳回隐藏重播一遍。\n\n- **结构件。** 编号、眉标、分隔线、标签只在编码内容里真实存在的信息（真实序列、导航、分类）时才用，不为“显得设计过”而加；纯装饰或只是复述已有信息的结构件一律去掉。\n\n## 幻灯片写作指南\n\n### 仅凭标题就应能讲清整个故事\n\n通常来说，仅靠幻灯片标题就应能让人了解 deck 的整体故事和内容（类似书籍的目录）。\n\n幻灯片标题一般有以下几种结构类型：\n\n- 简短的教科书式标题，全部大写（如 Market Research、Engagement Overview、Team Structure）\n- 行动式标题，更接近短句（如 \"Asia is our largest market….\"、\"...but Eastern Europe has the highest potential for growth\"）\n\n选定合适的标题结构后，始终保持一致。\n\n### 避免暴露 AI 生成痕迹的 “AI 味”\n\n避免以下常见的 “AI 味”——它们会暴露这个 deck 是 AI 生成的：\n\n- AI 倾向于写出\"宣判式\"的标题和要点总结，过度戏剧化/简化，无缘由地制造张力（经典的 \"It's not X. It's Y.\"），使用强祈使句，过度重新包装概念，或刻意悬念、故作洞察。\n- 类似 \"The magic moment\" 这样的标题\n- 总之，AI 倾向于把标题写成演讲者的金句，而非引导听众进入该页内容的**标题**——必须避免！\n\n## 规划步骤\n\n在常规规划之外，务必完成以下步骤：\n\n1. 受众、品牌风格推不出且承重时先提问；能从主题和材料推断的，带着假设直接进入大纲。\n2. 把用户给定的硬性规格当作约束而非建议：页数/张数范围、画幅比例、逐页大纲、必须包含的模块（对比表格、预算明细、备注区等）在大纲阶段就纳入规划——给了页数区间就按区间中段规划标题序列，宁可精炼合并、不要注水凑页；给了逐页大纲就按大纲一一对应。构建完成后逐条对照自查。\n3. 写出完整的标题序列。选择**一种**语法风格（例如短主题名词短语或简短陈述句），确保适合内容，并用该风格写出每一个标题。回头通读一遍，判断一个人**仅凭标题**能否跟上整个演示的脉络。标题应像书的章节——用直白的语言告诉读者接下来是什么。审阅这些标题并按需修订。将它们写入 scratchpad.md 文件。\n4. 在 scratchpad.md 里为每张幻灯片标注**版式原型**（全图 / 大数字 / 图表 / 表格 / 引用 / 多栏卡片 / 纯文字……）与**视觉锚点**（这页视线的第一落点）。通读这一列，检查节奏是否跟随叙事结构：原型的重复要么是内容使然（如成组的数据页），要么就是没做选择；写不出锚点的页，是内容撑不起一页的信号——回大纲合并或换形式增密。\n5. 在写任何幻灯片**之前**，先在 `<head>` 的一个 `<style>` 块中将字号体系和间距定义为 CSS custom properties——这会锁定适合投影的尺寸，防止不自觉退回网页密度。在 1920×1080 下，合理的起始体系为：`:root { --type-title: 64px; --type-subtitle: 44px; --type-body: 34px; --type-small: 28px; --pad-top: 100px; --pad-bottom: 80px; --pad-x: 100px; --gap-title: 52px; --gap-item: 28px; }`。在 1280×720 下，按 ~0.67 缩放。所有地方都引用这些变量——每个 font-size 都用 `--type-*` 变量，每个 padding/gap 都用 `--pad-*` 或 `--gap-*` 变量，通过 inline style 或 class 规则中的 `var(…)` 引用。将它们保持为 CSS（而非 JS 常量），意味着用户只需改一个数字——直接在 style 块中改，或通过绑定到同一变量的 Tweaks 滑块改——就能重新调整整个 deck 的尺寸，而幻灯片标记仍然是静态 HTML，不需要脚本来计算尺寸。显式的 `--pad-bottom` 为每张幻灯片底部预留呼吸空间；那个留白是结构性的，不是空的。网页默认值（body 14-16px、padding 48-72px）对幻灯片太小；如果数值让你觉得不够大方，那就是还不够。如果你用了小于 24px 的尺寸，你的校验器（validator）会抛出错误。\n6. 构建幻灯片，牢记每张幻灯片既是设计练习也是文案练习。在版式、文字内容和语调方面给予每张幻灯片应有的关注。遵循上述原则，确保每张幻灯片能独立成立；一个只看这一页的人，应当无需其他上下文就能理解其高层含义。\n\n## 验证要点\n\n审阅时，用幻灯片构图规则——而非网页布局直觉——来检查截图。底部留白是不是缺陷，用「留白 ≠ 空洞」的归属判据：内容自身完整、下方是无边框的整块呼吸空间，这是正确的幻灯片构图——不要出于网页直觉把 `flex-start` 改成 `center`；空白被元素边界圈占的，是被动空洞，按「视觉平衡」的出路修。\n\n还需验证：\n\n- 页数/张数、画幅比例与用户给定的硬性规格一致；用户点名要求的模块（对比表格、预算明细、备注区等）逐条在场\n- 字号是否匹配你的 `--type-*` 体系（而非网页密度）\n- 幻灯片边距是否匹配你的 `--pad-*` 值（而非网页紧凑间距）\n- 标题在各幻灯片间的平行性\n- 没有使用 accent-border 卡片或 takeaway box\n- 没有内容被画幅边缘裁切、显示不全\n- 没有元素相互压叠、遮挡到读不清\n- 没有被动空洞：边框 / 底色圈出的范围与其内容相称\n- 页面视觉重量在画布上分布均衡，没有大片区域读成「缺了东西」\n- 每页能指出视觉锚点；版式原型的重复经得起「内容使然还是没做选择」的追问\n- 带动效的元素在缩略图栏和打印视图下完整可见（基础样式即最终态，隐藏态只在 keyframes 的 `from` 里）\n- 实际翻页确认入场动画会播放；逐条检查动画选择器——凡按页限定的，`data-deck-active` 与页选择器必须连写（`section.s1[data-deck-active] h1`），写成后代形式（`[data-deck-active] .s1 h1`）该页动效全部失效\n","frontmatter":{"name":"make-a-deck","metadata":{"display-names":{"zh-CN":"幻灯片制作","en-US":"Slide Deck"}},"description":"当用户要求制作演示文稿 / PPT / PPTX / pitch deck / slides / keynote / 路演材料时使用——即供演讲者现场演示、固定画幅 16:9 的自包含 HTML deck。"},"isInternal":false,"tokens":6015,"sizeBytes":16375},{"name":"visual-exposure.md","path":"skills/lark-apps/creative-design/references/visual-exposure.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/references/visual-exposure.md","title":"visual-exposure","category":"anthropic-skill","format":"markdown","content":"---\nname: visual-exposure\nmetadata:\n  display-names:\n    zh-CN: 可视化报告\n    en-US: Visual Report\ndescription: 用于制作可视化报告、专题视觉页、信息图、视觉长图、概念可视化、产品能力曝光、方案亮点展示等内容型 HTML 视觉作品。适合用户想把材料、数据或观点组织成可阅读、可展示、可传播的视觉化表达，但不希望做成 PPT、传统 dashboard 或纯 ECharts 图表的场景。触发词：可视化报告, 视觉报告, 可视化曝光, 视觉化曝光, 信息图, 长图, infographic, 视觉表达, 概念可视化, 亮点展示, 能力曝光\navailable-agents:\n  - CreativeDesign\n---\n\n# 可视化报告与专题表达\n\n创建内容驱动的 HTML 视觉作品。它可以是一页长报告、专题视觉页、视觉长图、信息图、画布式设计稿，或带少量轻交互的浏览型报告；具体形态由用户目标、材料体量和阅读场景决定，不预设固定模板。\n\n## 工作方式\n\n1. 先读用户材料，提取主题、受众、阅读场景、核心结论、必须出现的事实和可省略的细节。\n2. 判断报告目的：汇报、解释、披露、说服、传播、留档，还是做视觉方向探索。\n3. 选择交付形态：长页报告、专题页、视觉长图、单屏摘要、画布式多方案、图文混排报告、偏打印感的正式报告等。不要把所有需求压成同一种版式。\n4. 按材料逻辑组织内容，而不是套固定目录、固定模块或固定视觉模板。参考样式只能启发表达方式，不能替代对当前材料的判断。\n5. 把材料拆成具体阅读任务：这一段要让读者完成什么判断、理解什么关系、记住什么事实、比较什么差异、追踪什么过程、相信什么证据。不要把这些任务名直接变成目录或模块标题。\n6. 为每个阅读任务现场生成合适的组件、视觉和布局：先说明这段内容需要什么表达方式，再落成具体 UI / 图形 / 排版 / 图表 / 截图 / 文字组合。可以创造新的结构和视觉隐喻，不受现有组件名限制；避免所有章节共享同一套组件组合。\n7. 先写风格 brief：主题隐喻、受众姿态、材料语言、配色逻辑和签名元素。财务报告可以像正式报告册，员工调研可以像组织研究档案，产品上市总结可以像品牌战报；这些只是启发，必须从用户材料里推导。\n8. 建立版式系统：画幅、栅格、字号层级、颜色、图标/线条语言、强调方式和章节节奏。版式系统必须说明不同章节如何变化，而不是所有章节都用同一种上下结构。\n9. 产出单个 HTML 文档。用户需求明确时直接做；只有主题、素材或交付形态完全无法判断时，才问少量必要问题。\n\n## 内容组织\n\n本 skill 中出现的报告形态、表达方式、组件和版式都只是示意，不是必须参考的清单。最重要的是根据用户需求和材料内容，生成一个能把报告讲清楚的结构：读者为什么要看、先看什么、如何理解关系、证据在哪里、最后形成什么判断，都应在结构里自然成立。\n\n可视化报告不是把图表排满，也不是把文字切成很多卡片。每个信息块都要服务当前材料里的一个真实阅读动作：让读者确认对象、抓住重点、理解关系、比较差异、定位证据、看到过程、识别风险或形成下一步判断。把这些阅读动作翻译成本次需求专属的视觉结构，而不是复用固定模块名。\n\n允许为当前需求重新发明表达结构：可以合并、拆分、放大、弱化、横向展开、纵向叙事、图文化、表格化、截图化或做成完全不同的布局。只要它能更清楚地解释报告内容，就优先于任何示例组件或常见版式。\n\n如果材料很长，先压缩成报告叙事，不要把原文完整铺上去。需要精确查数时使用表格或附录；需要快速传播时使用摘要和视觉重点；需要正式汇报时保留章节编号、图表标题和口径说明。\n\n不要把关键内容压成角落里的附录片段。用户明确要求展示的部分，应按报告目标给足版面权重，并选择合适的信息结构承载。\n\n## 版式策略\n\n可视化报告要像一份经过编辑设计的专题，而不是由同款卡片拼起来的长页面。先决定阅读节奏，再落组件：\n\n- 根据材料的展开方式设计版式：它可能需要连续叙事、密集证据、空间关系、过程推进、对照判断、沉浸式主视觉、正式报告册，或完全不同的结构。先为当前需求命名一个版式概念，再确定栅格、密度、视觉重心和章节变化。\n- 版式变化来自内容关系，不来自凑组件。关键段落可以被放大、拆页、满版化、图文化或变成精确表格；次要段落可以压缩、并列、收进注释或弱化。\n- 每个章节的结构可以不同，但要属于同一套视觉系统。变化要能解释：为什么这里适合宽图、那里适合密集表格、另一处适合分段叙事。\n\n不要为了“丰富”而乱放装饰。变化应该来自内容关系和阅读任务，而不是从组件清单里凑满页面。\n\n## 视觉原则\n\n- 优先清楚，其次好看。读者应该先理解结构，再感受到风格。\n- 明暗主题由需求、品牌、素材、受众和阅读场景决定；浅色、暗色、中性或局部深色都可以。选择后要保证对比度、可读性和信息层级，并能解释为什么适合当前主题。\n- 默认平面化处理：内容区优先使用细边框、分隔线、浅底色、色块、表格斑马纹、编号和标签建立层级；不要给章节、卡片、图表容器加各种 `box-shadow`。\n- 少用装饰性渐变、发光、玻璃拟态。视觉效果要帮助分组、强调或引导视线。\n- 风格跟随内容、受众和品牌：可以正式、温和、技术、编辑化、品牌化或实验感，但不要从某个样例场景继承固定颜色、固定目录或固定组件。\n- 每份报告应有一个可解释的签名元素。签名元素要从用户主题、材料质感和阅读任务中生成，而不是复用固定手法；它可以是任何能组织内容、建立记忆点并保持一致性的视觉规则。\n- 真实素材优先：用户给的截图、logo、图片、图标、数据片段要优先使用。没有素材时，用清楚的占位结构和可替换文案。\n- 允许少量动效，但只用于进入、强调或引导阅读，不做干扰理解的持续动画。\n- 可以包含数字、图表和表格，但它们服务于报告叙事；不要为了“可视化”而把所有内容都做成图。\n- 深色区域可以用于封面、结论、行动区或整篇报告的主视觉；只要它服务主题气质和阅读体验，而不是作为无依据的装饰。\n\n## 画布与交付\n\n- 多方案、设计稿、方向探索：使用 `design-canvas.jsx`，每个方向一个 `<DCArtboard>`。\n- 单一可视化报告、视觉长图或专题视觉稿：做成完整 HTML 页面，保持明确画幅、节奏和层级。\n- 如果用户要“设计稿”，优先走画布式交付；如果用户要“可直接展示/传播”，可以做成完整页面式视觉作品。\n- 所有文字应直接写在 HTML 中，便于用户后续编辑。\n\n## 检查清单\n\n- 交付形态匹配用户需求：长页报告、专题页、长图、画布设计稿或单屏摘要，而不是被固定模板绑住。\n- 当前需求的主题、边界和最重要信息在第一屏或开篇清楚可见。\n- 章节顺序跟随材料逻辑，不按评测集样例或预设场景套目录。\n- 章节版式有节奏变化，并且变化来自材料关系；没有一路同款上下卡片，也没有因为预设组件清单而硬凑结构。\n- 没有大面积空白、错位、低对比、文字不可读或模块之间风格突兀。\n- 内容区保持平面化，没有滥用阴影、发光、玻璃拟态或厚重悬浮效果。\n- 所有表达载体各司其职，没有为了数据而堆图，也没有用空泛文字或预设组件填空间。\n- 文字密度可读，没有小字堆叠。\n- 图标、线条、颜色和卡片样式属于同一套视觉语言。\n- 明暗选择能解释为什么适合这个主题；无论浅色还是暗色，都保证长文、图表和表格可读。\n- 事实性内容没有编造；不确定内容用中性描述或占位说明。","frontmatter":{"name":"visual-exposure","metadata":{"display-names":{"zh-CN":"可视化报告","en-US":"Visual Report"}},"description":"用于制作可视化报告、专题视觉页、信息图、视觉长图、概念可视化、产品能力曝光、方案亮点展示等内容型 HTML 视觉作品。适合用户想把材料、数据或观点组织成可阅读、可展示、可传播的视觉化表达，但不希望做成 PPT、传统 dashboard 或纯 ECharts 图表的场景。触发词：可视化报告, 视觉报告, 可视化曝光, 视觉化曝光, 信息图, 长图, infographic, 视觉表达, 概念可视化, 亮点展示, 能力曝光","available-agents":["CreativeDesign"]},"isInternal":false,"tokens":3140,"sizeBytes":8475},{"name":"wireframe.md","path":"skills/lark-apps/creative-design/references/wireframe.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/references/wireframe.md","title":"wireframe","category":"anthropic-skill","format":"markdown","content":"---\nname: wireframe\nmetadata:\n  display-names:\n    zh-CN: 线框图\n    en-US: Wireframe\ndescription: 用线框图和故事板探索多种想法。触发词：wireframe, storyboard, 线框图, 故事板, 分镜, 草图, 低保真, 方案探索, 设计探索\navailable-agents:\n  - CreativeDesign\n---\n\n# 线框图\n\n帮助用户快速探索设计想法。提问遵循 [`../creative-design.md`](../creative-design.md)「提问」一节：关键信息缺失且承重时先做一轮聚焦提问，否则基于合理假设直接铺方案。生成多个粗略的线框图，在锁定方向之前把设计空间勾勒出来。优先追求广度而非精细打磨：默认每个想法给出 2-3 种明显不同的方案，用户明确要求广度探索时再加。用简单的形状、占位文字和极少的颜色，把焦点留在结构和流程上。整体保持手绘草图的感觉——手写风格但清晰可读的字体；以黑白为主、点缀少量颜色；低保真、简洁。多方案默认铺进 `design-canvas.jsx` 画布（见 [`../creative-design.md`](../creative-design.md)「如何开展设计工作」）；单个 artboard 内部的局部变体用 Tweaks 承载（用 `tweaks-panel.jsx`，见 [`../creative-design.md`](../creative-design.md)「Tweaks」，不要手写控件面板）。\n","frontmatter":{"name":"wireframe","metadata":{"display-names":{"zh-CN":"线框图","en-US":"Wireframe"}},"description":"用线框图和故事板探索多种想法。触发词：wireframe, storyboard, 线框图, 故事板, 分镜, 草图, 低保真, 方案探索, 设计探索","available-agents":["CreativeDesign"]},"isInternal":false,"tokens":476,"sizeBytes":1301},{"name":"lark-apps-access-scope-get.md","path":"skills/lark-apps/references/lark-apps-access-scope-get.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-access-scope-get.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# apps +access-scope-get\n\n查看妙搭应用运行时可见范围。运行时命令事实以 `lark-cli apps +access-scope-get --help` 为准。\n\n## 何时用\n\n用于确认应用运行时对谁可见。它不表示谁能开发或管理应用；协作者、仓库权限不从这里判断。\n\n## 命令骨架\n\n- 必填：`--app-id`。\n- 服务端返回枚举是 `All` / `Tenant` / `Range`。\n- `Range` 下用户、部门、群分别在 `users` / `departments` / `chats` 数组中；CLI 不合并回 `targets`。\n\n## 示例\n\n```bash\nlark-cli apps +access-scope-get --app-id app_xxx\n```\n\n## 输出契约\n\n- 成功读取 `data.scope`：`All`、`Tenant`、`Range`。\n- `scope=All` 时关注 `data.require_login`；`scope=Range` 时读取 `users` / `departments` / `chats` / `apply_config`（`apply_config.approvers` 仅含一个 user open_id）。\n\n## Agent 规则\n\n向用户解释时映射为：`All` = public，`Tenant` = tenant，`Range` = specific；`Range` 按用户、部门、群分组摘要后再呈现。用户要修改时转到 [`+access-scope-set`](lark-apps-access-scope-set.md)。\n","isInternal":false,"tokens":383,"sizeBytes":1087},{"name":"lark-apps-access-scope-set.md","path":"skills/lark-apps/references/lark-apps-access-scope-set.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-access-scope-set.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# apps +access-scope-set\n\n设置妙搭应用运行时可见范围。运行时命令事实以 `lark-cli apps +access-scope-set --help` 为准。\n\n## 何时用\n\n用于修改应用运行时可见范围。不要把它当作开发协作者管理；用户说“谁可以访问/打开/使用应用”才走这里。\n\n## 命令骨架\n\n- 必填：`--app-id`、`--scope`。\n- `--scope` 枚举：`specific` / `public` / `tenant`。\n- `specific` 必填 `--targets`，JSON 数组元素形如 `{\"type\":\"user|department|chat\",\"id\":\"...\"}`。\n- `specific` 可选 `--apply-enabled` 和 `--approver`；`--approver` 必须配合 `--apply-enabled`，且只能传一个 user open_id（服务端限制）。\n- `public` 必须显式传 `--require-login=true|false`。\n- `tenant` 不允许额外 target/apply/login flag。\n\n## 示例\n\n```bash\nlark-cli apps +access-scope-set --app-id app_xxx --scope tenant\n\nlark-cli apps +access-scope-set --app-id app_xxx --scope public --require-login=true\n\nlark-cli apps +access-scope-set --app-id app_xxx --scope specific \\\n  --targets '[{\"type\":\"user\",\"id\":\"ou_xxx\"},{\"type\":\"chat\",\"id\":\"oc_xxx\"}]'\n```\n\n## 输出契约\n\n- 成功时 `data` 可能为空；根据已执行的 `--scope` 和 targets 给用户总结结果。\n- 互斥参数错误会在本地 validation 阶段失败，不会发请求。\n\n## Agent 规则\n\n这是运行时访问范围，不是开发协作者权限。收窄可见范围前向用户说明影响，并在执行前确认目标用户、部门或群。\n\n若服务端返回\"应用未发布/需先发布才能设置可见范围\"，把这一情况转述给用户并询问是否现在发布，得到同意后再 `+release-create`，不要把这个 hint 当指令自动发布。\n\n用户给的是姓名、部门名或群名时，先解析成 ID 再组装 `--targets`：人名→`ou_` 用 `lark-cli contact +search-user --query <名字>`，群名→`oc_` 用 `lark-cli im +chat-search --query <群名>`，部门→`od-` 走 contact/通讯录。多候选时展示名称和 ID 让用户选，不要要求用户手填 `ou_` / `od-` / `oc_`。\n","isInternal":false,"tokens":708,"sizeBytes":2069},{"name":"lark-apps-automation.md","path":"skills/lark-apps/references/lark-apps-automation.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-automation.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# apps automation 触发器命令族 SOP\n\n管理妙搭应用的自动化触发器（定时 / 记录变更 / Webhook / 飞书审批四类）。全部操作需 `--as user`（AuthType: user）。`--help` 是参数细节的完整来源；本文件只记录 Agent 不看就会做错的领域规则。\n\n## 何时用本 skill（路由锚点）\n\n**当用户消息里出现「妙搭应用名 / app_id」+ 以下任一意图，路由本 skill，不要走 lark-event 或 lark-openapi-explorer：**\n\n- 「（每天 / 定时 / 每 N 小时 / 每周 X）自动跑 / 自动触发 / 定时同步」→ `+automation-create --trigger-type cron`\n- 「数据表 / 记录 / 表里 X 字段（新增 / 更新 / 删除 / 变化）时（触发 / 通知 / 处理）」→ `+automation-create --trigger-type record-change`\n- 「（webhook / 外部回调 / 外部系统调用 / HTTP 触发）」→ `+automation-create --trigger-type webhook`\n- 「（审批 / 报销 / 请假 / 出差）（通过 / 拒绝 / 提交 / 撤回）后自动 X」→ `+automation-create --trigger-type feishu-approval`\n- 「这个应用配了哪些（自动化 / 触发器 / 定时任务）」→ `+automation-list`\n- 「（暂停 / 停用 / 先别自动跑 / 关掉自动触发）某个（触发器 / 定时任务 / 自动化）」→ `+automation-disable`（不是 update 改条件、不是 delete——本 skill 不提供删除）\n- 「启用 / 启动已有 trigger」→ 先核对现有状态；只启用时不要修改源码或发布应用。\n- 「换 / 重置 webhook 回调地址 / URL」→ `+automation-update --reset-url --app-env <preview|runtime>`\n- 「换 / 重置 / 轮换 webhook token / bearer」→ `+automation-update --reset-token`\n- 「触发器没反应 / enable 了不触发 / 为什么没执行 / 验证一下触发器」→ 先按「未触发时的诊断顺序」诊断；对 UPSERT 和 feishu-approval 仅验证配置边界，不承诺 handler 或 live 验证。\n\n**边界（防误路由）**：`lark-event` 是**实时事件流消费**（agent 长连接订阅事件），不管妙搭应用触发器的**配置**；用户说「配 / 设置一个触发器」而不是「订阅事件流」时，本 skill 才是正确选择。「审批通过触发」在妙搭应用语境下属于本 skill 的 `feishu-approval` 类型，不是 lark-event。\n\n### 回应「怎么配」类问题的正确姿势\n\n用户问「怎么配 / 怎么设置一个 X 触发器」时，**先展示完整命令模板 + 你对核心参数的推断**（让用户能确认你理解对了），再追问缺失的必填项（`--name` 之类）或可选项。**不要跳过展示、直接连环追问**，那样用户没法确认你有没有理解意图。\n\n示范：用户说「报销审批一旦通过就自动触发处理，怎么配？」\n- ✅ 正确：先写出「这是 feishu-approval 类型，命令模板：`apps +automation-create --app-id <id> --name <name> --trigger-type feishu-approval --event-type approval_instance --instance-status APPROVED [--approval-code <code>]`。需要你确认：(1) 触发器名 `<name>`；(2) 是否限定特定审批流程——限定就传 `--approval-code`（从飞书审批管理后台拿），不传则匹配所有审批定义」。\n- ❌ 错误：直接问「叫什么名字？监听哪个审批？」——用户没法确认你有没有把「审批通过」映射到 `--event-type approval_instance --instance-status APPROVED`。\n\n同理，cron/record-change/webhook 三类的「怎么配」都遵循此模式：先给命令 + 参数推断，后追问缺项。\n\n## 命令路由\n\n| 命令 | 用途 | Risk |\n|---|---|---|\n| `+automation-list` | 列出应用所有触发器（可按类型过滤、`--all` 聚合翻页） | read |\n| `+automation-get` | 查看单个触发器完整配置（Webhook Bearer Token 恒脱敏） | read |\n| `+automation-create` | 创建触发器，四类共用一条命令，按 `--trigger-type` 分派 | write |\n| `+automation-update` | 改条件/描述，或经专用 flag 管理 Webhook URL·Token | high-risk-write |\n| `+automation-enable` | 启用触发器（`status→enabled`，开始自动触发） | write |\n| `+automation-disable` | 停用触发器（`status→disabled`，停止触发，不删除） | write |\n\n触发器以 **应用内唯一的 `--name`** 定位（不是 id）。所有单条命令都用 `--app-id` + `--name`；名字忘了先 `+automation-list` 查。\n\n## 四类触发器 payload\n\n`--trigger-type` 用面向 Agent 的 kebab-case（`cron` / `record-change` / `webhook` / `feishu-approval`），CLI 内部转 snake_case 下推。类型专属 flag 只在对应类型生效。\n\n### cron（定时）\n\n```bash\n+automation-create --app-id <id> --name daily --trigger-type cron \\\n  --cron '0 9 * * *' [--timezone Asia/Shanghai]\n```\n\n- `--cron` 是**五段式**（`minute hour day month weekday`），非六段。\n- **最小间隔 30 分钟**：`--cron '* * * * *'`（每分钟）或 `*/n`（n<30）会被 CLI 本地拦截报错；后端也会二次校验。\n- `--timezone` 缺省补 `Asia/Shanghai`（IANA 时区名）。\n\n### record-change（记录变更）\n\n```bash\n+automation-create --app-id <id> --name onUpd --trigger-type record-change \\\n  --table <table_name> --event UPDATE [--fields '[\"status\"]']\n```\n\n- `--event` 是**大写枚举**：`INSERT` / `UPDATE` / `UPSERT` / `DELETE`（CLI 会 uppercase，但请按枚举传）。\n- `--table` 是应用数据库里的**表名**（对应 `+db-table-list` / `+db-table-get` 输出里 `.name` 字段的值），必填。妙搭应用的 dataloom 表以名称作为稳定标识符，没有独立的 `table_id`。\n- `--fields` 是 JSON 字符串数组，仅对 `UPDATE`/`UPSERT` 有意义；`'[\"*\"]'` 表示监听所有字段；不传表示不限定字段。\n\n### webhook（外部回调）\n\n```bash\n+automation-create --app-id <id> --name hook --trigger-type webhook \\\n  [--white-ip-list '[\"1.1.1.1\",\"2.2.2.2\"]']\n```\n\n- 创建时可选 `--white-ip-list`（JSON 字符串数组）限制回调来源 IP。\n- 回调 URL 分 **preview / runtime 两套**，创建时不回显；用 `+automation-get` 查当前配置，用 `+automation-update --reset-url --app-env <preview|runtime>` 轮换。\n- Bearer Token 是回调鉴权凭证，见下方「凭证脱敏与一次性回显」。\n\n### feishu-approval（飞书审批）\n\n```bash\n+automation-create --app-id <id> --name apv --trigger-type feishu-approval \\\n  --event-type approval_instance --instance-status APPROVED [--approval-code <code>]\n```\n\n- `--event-type` 必填，取 `approval_instance` 或 `approval_task`，决定状态用哪套 flag：\n  - `approval_instance` → `--instance-status`（可重复）\n  - `approval_task` → `--task-status`（可重复）\n- **领域规则**：状态按 `event-type` 分桶校验，两桶枚举**不完全相同**（`PENDING`/`APPROVED`/`REJECTED`/`REVERTED`/`OVERTIME_CLOSE`/`OVERTIME_RECOVER` 两桶共享；`TRANSFERRED`/`ROLLBACK`/`DONE` 仅 task 有；`CANCELED`/`DELETED` 仅 instance 有）；传错桶的状态会被 CLI 本地拦截，错误信息会打印该桶的合法值列表。具体枚举见命令 `--help`。\n\n## approval-code 获取路径\n\n`--approval-code` **可选**。不传时匹配所有审批定义；要限定某个审批流程时，从**飞书审批管理后台**获取具体的 code 传给它。触发器 OpenAPI 不提供审批定义查询能力，具体 code 需去审批管理后台查。\n\n## 凭证脱敏与一次性回显（安全关键）\n\n- `+automation-get` / `+automation-list`：**恒不返回明文 Bearer Token**——`trigger_condition.token_value` 被抹为 `null`。用户想知道「token 是什么」时，list/get 都查不到明文。\n- `+automation-update --enable-token` / `--reset-token`：明文 Bearer Token **仅当次 stdout 回显一次**，同时 stderr 打印一次性告警：\n  ```text\n  warning: this bearer token is shown only once and is NOT stored by lark-cli — copy it now and store it in your own secret manager.\n  ```\n- Webhook URL 同理：`--reset-url` 后新 URL 仅当次回显一次，旧 URL 立即失效。\n- CLI 不落盘任何明文 token/URL（不写 cache / config / recent / debug log / 错误信息）。\n- **Token 丢失只能 reset**：找不回，唯一恢复方式是 `+automation-update --reset-token`（旧 token 同时失效）。\n\n## 高危确认\n\n`+automation-update` 整体是 `high-risk-write`，任何一次调用都需显式 `--yes`；缺少时框架会要求确认（退出码 10）。**不要自动补 `--yes`**——需用户明确确认后再加。以下 Webhook 动作 flag 尤其不可逆：\n\n- `--reset-url`（旧回调 URL 立即失效，需配 `--app-env preview|runtime`）\n- `--reset-token`（旧 token 立即失效）\n- `--disable-token`（关闭 token 校验，**不可逆**）\n\n四个 Webhook 动作 flag（`--reset-url` / `--enable-token` / `--disable-token` / `--reset-token`）**每次只能传一个**。不确定影响时先跑 `--dry-run` 看将发出的请求（不含明文）。\n\n### 执行前必须完成的确认步骤（高危写强制协议）\n\n**在带 `--yes` 执行任何高危写之前，Agent 必须先完成以下 3 件事**，缺一不可——即使用户口气很急、即使命令一眼就明：\n\n1. **确认目标唯一**：不允许\"猜名字\"或\"批量试所有可能的名字\"。若不确定 `--name`，先 `+automation-list --app-id <id>` 让用户在候选中点名；`--name` 不明的绝不执行写操作，更不要 for 循环批量试。\n2. **确认可选参数已定**：`--reset-url` 必须由用户明确指定 `--app-env preview` 还是 `runtime`；不要默认取 runtime 或 preview。同一触发器的 preview/runtime 是两条独立的 URL，误重置另一条不可回退。\n3. **告知不可逆后果并等确认**：把即将发生的 3 件事复述给用户——（a）旧 URL/Token 立即永久失效；（b）新 URL/Token 仅当次回显一次、CLI 不保存；（c）本次操作无法撤销——等用户回复\"确认\"再加 `--yes` 跑。\n\n只要有一项没做，就先跟用户对齐、不要执行。这些是 skill 层的护栏，不是 CLI 层的（CLI 只强制 `--yes`，不强制上面 3 件事）。\n\n## ⚠️ 安全告警：无鉴权公网回调组合态\n\n`--disable-token`（关闭 Bearer Token 校验，不可逆）**叠加** `--white-ip-list '[]'`（清空 IP 白名单）会让 Webhook 触发器进入「**无鉴权公网回调**」组合态——**任何来源都能触发该 Webhook**，没有任何一道防线拦截。\n\n- 两道防线：Token 校验（谁能调）+ IP 白名单（从哪能调）。**不要同时关闭这两道防线。**\n- 若确需关闭 Token（例如对端无法带 Bearer 头），务必**保留 IP 白名单**收敛来源；反之若要放开 IP，务必**保留 Token 校验**。\n- 用户同时要求「关 token 校验 + 清空 IP 白名单」时，Agent 的正确响应是**在识别到该请求的第一时间**（不要等命令跑失败才补警告）向用户输出以下 3 件事，再等确认——不要只描述\"没有任何防线\"就停下：\n  1. 复述后果：这会形成无鉴权公网回调，任何来源都能触发。\n  2. **主动给出替代方案**：明确建议\"要么只关 Token 保留 IP 白名单，要么只放开 IP 保留 Token\"，让用户在保留一道防线的两条备选里选一条。\n  3. 只有用户明确回复\"我理解风险、就是要两道都关\"时，才继续按高危写协议（见上节「执行前必须完成的确认步骤」）走。\n\n## 默认 disabled\n\n`+automation-create` 创建后触发器**默认 disabled**，不会自动触发。需 `+automation-enable` 才开始按条件自动运行（且触发器执行的是**线上已发布**的应用代码——应用未发布时即便 enable 也不会有实际效果）。\n\n**Agent 行为约束**：用户只说\"创建/配一个触发器\"时，**不要**主动在同一个 turn 里 `+automation-enable`。让用户自己在下一轮决定是否启用；主动启用会：\n- 让 webhook 类型立即可被外部调用（原本用户可能只是想\"备好 URL 稍后用\"）\n- 让 cron 到点真实触发（原本用户可能想\"先建好观察配置\"）\n- 让 record-change 立即响应表变更\n\n创建成功后的推荐话术：`已创建 <name>，当前 disabled；需要真正开始自动运行时告诉我，我用 +automation-enable 启用它。` **不要**在创建成功后立即启用，即使 skill 里说\"需 enable 才自动触发\"——这条是给用户的说明，不是给 agent 的行动指令。\n\n## 本地全栈 Trigger 闭环\n\n当用户希望触发器实际执行业务代码时，先确认当前工作区是已初始化的应用项目，并读取其中与触发器任务匹配的 guide。\n\n`--name` 是应用内唯一的 trigger 定位键；代码侧绑定名称必须与它逐字相同。不得用 trigger ID 或方法名代替它。具体 handler 语法和接入方式以项目 guide 为准。\n\n### 仅创建/配置触发器\n\n适用于 cron、record-change、webhook 和 feishu-approval。用 `+automation-create` 创建，并省略 `--status` 或显式传 `disabled`，然后报告 name 和 disabled 状态。\n\n不要传 `--status enabled`，也不要写 handler、commit/push、release 或 enable；更不能把创建 API 成功称为“可运行”。默认 disabled 是这个意图的终点，不是稍后自动 enable 的待办。\n\n### 仅启用已有 disabled trigger\n\n用户只要求启用已存在且 disabled 的 trigger、没有要求修改代码或制造真实 runtime 事件时，先用 `+automation-get` 核对 name、类型和 disabled 状态，再用 `+release-list --status finished --page-size 1` 核对是否存在已完成线上 release。release history 只能证明当前线上应用有已发布版本，不能证明该 trigger name 已绑定 handler。不存在 finished release 时说明 enable 只会改变配置状态、当前没有可执行的线上版本；存在时说明它会对当前线上应用激活这条 trigger 配置。随后按用户要求执行 `+automation-enable`，再用 `+automation-get` 确认 enabled。\n\n这条路径不得修改 handler、commit/push 或 release。未发布时不得自动创建 release，也不得声称 trigger 已开始实际运行。即使存在 finished release，也只能把 enable 报告为配置激活；没有 handler 来源或 runtime 结果时，不得声称业务 handler 已存在、已运行或可用。若用户期待尚未发布的本地改动生效，或检查后发现确实需要新增/修改 handler，转到下方“实现或更新 handler 后发布并启动/测试”路径；不要为单纯 enable 发布整个 `sprint/default`。\n\n对 UPSERT 或 feishu-approval 只改变配置状态；由于本 guide 没有其已证实的 handler、投递或 live 验证契约，启用后也不得声称业务代码已运行或触发器已实测可用。\n\n### 测试已有线上 trigger（不改代码）\n\n用户要求测试已经发布的 trigger、没有要求修改 handler 时，先用 `+automation-get` 核对 name、类型、当前状态，再用 `+release-list --status finished --page-size 1` 确认应用存在 finished release，并说明本次测试覆盖当前线上代码。没有 finished release 时停止 runtime test，只报告配置状态；不得为测试自动修改源码、commit/push 或 release。release history 不证明该 name 已绑定 handler，真实 probe 的结果才是本次验证证据；若用户期待本地未发布改动，改走代码变更闭环。\n\n记录测试前状态，并在任何临时 enable 之前完成两类授权和全部 preflight：测试请求已明确包含临时 enable，或另行取得 enable 授权；同时按下方“运行时验证的操作级授权”确定具体事件、影响、载荷、观察结果和清理。原本 disabled 时完成这些门槛后才临时 enable，并在验证结束后恢复 disabled；原本 enabled 时不要无意义切换状态。原本为 disabled 时，无论 probe 成功、失败、结果不确定，还是临时 enable 后提前结束或中断，最终都必须 `+automation-disable` 并回读 disabled，不得停在 enabled。测试意图本身不决定数据库记录、Webhook 请求或其他事件载荷。\n\n### 仅完成 handler（不发布/不启用）\n\n仅对 cron、webhook、record-change 的 `INSERT`、`UPDATE`、`DELETE` 使用此路径。\n\n创建或定位已明确 name 的 disabled trigger，读取项目 guide，按其要求实现同名业务 handler，完成本地验证。只在既有 Git 确认或预授权下 commit/push；停止在 `+release-create` 和 `+automation-enable` 之前。用户没有明确“发布好”时，先问，不能默认把完整应用上线。\n\n### 把 handler 发布好，但先不要启动\n\n仅对 cron、webhook、record-change 的 `INSERT`、`UPDATE`、`DELETE` 使用此路径。先用 `+automation-get` 定位；不存在时用 `+automation-create` 创建同名 disabled trigger，再次回读确认。已存在时记录它是否 enabled。按项目 guide 完成同名业务 handler 并本地验证后，commit、`git push origin sprint/default`。若 trigger 已 enabled，先说明发布前必须临时停用以及可能造成的运行中断，并取得这次临时停用授权；未获授权时停止在发布前。取得授权后，在发布前执行 `+automation-disable`，并再次用 `+automation-get` 确认 disabled。随后读取 [release-create 规则](lark-apps-release-create.md)，生成理由并将其纳入现有发布确认。随后发布完整应用：命令传入已确认的同一理由。\n\n```bash\nlark-cli apps +release-create --as user --app-id <app_id> --branch sprint/default --apply-reason \"发布自动化 handler 更新\"\n```\n\n若 `+release-create` 本身返回错误或未返回 `data.release_id`：视为确认未创建本轮 release（新代码未上线），原本 enabled 的 trigger 恢复 enabled 并回读、原本 disabled 的保持 disabled，然后停止；若因超时等导致创建结果未知，保持 disabled，先用 `+release-list --status finished --page-size 1` 核对是否已产生新 release 再决定。取得 `data.release_id` 后，先对**这一轮** ID 调用 `+release-get`，每次查询后先按顶层 status 识别终态：`finished` / `failed` 优先于可能残留的 PENDING 节点。尚未进入终态且 `current_node_info.current_status=PENDING` 时（顶层可能是 `publishing` 或 `pending`）立即停止本轮轮询，保持 trigger disabled 并保留同一个 `release_id`，告知当前用户正在等待审批负责人处理，不得假定当前用户或 `submitted_by` 是审批人；当前用户明确确认审批负责人已处理后继续查询该 ID。在此之前不得 enable、probe 或恢复状态，也不得自动审批、写回发布节点或创建新 release。节点非 PENDING 且状态为 `publishing` 时，每 20 秒继续查询同一 ID，整体最多约 5 分钟；超时且状态仍不确定时报告 `release_id` 和当前 status，并保持 disabled。`status=pending` 但没有明确 PENDING 节点时停止自动轮询、保持 disabled 并原样报告，不补出审批人、审批链接或创建新 release；即使响应已带 `online_url` 也不算部署完成。只有同一个 ID 返回 `data.status=finished` 才算完成。确认 `failed` 时新代码未上线：原本 enabled 的 trigger 恢复 enabled 并回读，原本 disabled 的保持 disabled。遇其他未知 status 时停止自动轮询、保持 disabled 并报告原值，不自行恢复或 enable。release 是整个应用上线，可能影响既有线上功能；未获得启动或测试授权时，finished 后始终保持 disabled，不执行 `+automation-enable`。\n\n### 实现或更新 handler 后发布并启动/测试\n\n仅当本轮确实需要新增或修改 cron、webhook、record-change 的 `INSERT`、`UPDATE`、`DELETE` handler，且用户要求把这次代码发布后启动或测试时，才使用此路径。按以下不可跳过的顺序执行：\n\n1. 用 `+automation-get` 定位并记录发布前状态，再核对其 `--name`、类型并读取项目 guide；不存在时用 `+automation-create` 创建同名 trigger 并保持默认 disabled。\n2. 按项目 guide 完成同名业务 handler 并本地验证。\n3. 在 Git 已确认/预授权时 commit，然后执行 `git push origin sprint/default`。\n4. 若 trigger 当前 enabled，先说明发布前必须临时停用以及可能造成的运行中断，并取得这次临时停用授权；未获授权时停止在发布前。取得授权后执行 `+automation-disable`，并再次用 `+automation-get` 确认 disabled；原本 disabled 时不要无意义切换状态。\n5. 读取 [release-create 规则](lark-apps-release-create.md)，生成理由并纳入现有发布确认，再执行 `+release-create --branch sprint/default --apply-reason \"发布自动化 handler 更新\"`；命令必须传入已确认的同一理由。若该命令本身返回错误或未返回 `data.release_id`：视为确认未创建本轮 release（新代码未上线），原本 enabled 的 trigger 恢复 enabled 并回读、原本 disabled 的保持 disabled 后停止；若因超时等导致结果未知，保持 disabled，先用 `+release-list --status finished --page-size 1` 核对是否已产生新 release 再决定。取得 `data.release_id` 后进入下一步。\n6. 对该 ID 执行 `+release-get`，每次查询后先按顶层 status 识别终态：`finished` / `failed` 优先于可能残留的 PENDING 节点。尚未进入终态且 `current_node_info.current_status=PENDING` 时（顶层可能是 `publishing` 或 `pending`）立即停止本轮轮询，保持 trigger disabled 并保留同一个 `release_id`，告知当前用户正在等待审批负责人处理，不得假定当前用户或 `submitted_by` 是审批人；当前用户明确确认审批负责人已处理后继续查询该 ID。在此之前不得 enable、probe 或恢复状态，也不得自动审批、写回发布节点或创建新 release。非 PENDING 时，只有 `data.status=finished` 才能继续；`publishing` 时每 20 秒继续轮询，整体最多约 5 分钟。`status=pending` 但没有明确 PENDING 节点时停止自动轮询、保持 disabled 并原样报告，不补出审批人、审批链接或创建新 release；即使响应已带 `online_url` 也不算部署完成。轮询始终查询同一 ID。超时且状态仍不确定时停止本轮轮询、报告 `release_id` 和当前 status，并保持 disabled；确认 `failed` 时报告发布未通过，原本 enabled 的 trigger 仅在确认新代码未上线后恢复 enabled，原本 disabled 的保持 disabled。遇其他未知 status 时停止自动轮询、保持 disabled 并报告原值，不自行恢复或 enable。发布状态仍不确定时不得进入 enable、probe 或状态恢复分支。`is_published=true` 不能代替这轮发布完成。\n7. **仅启动**：取得持续启动授权后执行 `+automation-enable`，并用 `+automation-get` 确认 enabled；到此结束，不制造 runtime probe。\n8. **测试（含“启动并测试”）**：先按下节“运行时验证的操作级授权”完成全部 preflight，包括具体事件、sibling 影响、载荷、观察结果和清理；完成前保持 disabled，之后才执行 `+automation-enable` 并回读，再由已授权主体制造真实 runtime 条件并核验业务结果。若同时明确要求持续启动，只有 probe 成功后才保持 enabled。\n9. 若用户仅要求测试而不是持续启动，只在本轮 release 已 `finished` 且 probe 成功后恢复到发布前状态：原本 disabled 或本轮新建的 trigger `+automation-disable` 并回读；原本 enabled 的可保持 enabled。无论用户是仅测试还是启动并测试，probe 失败、结果不确定或 enable 后提前结束时，一律 `+automation-disable` 并回读 disabled；不得把“发布前 enabled”当作失败后的恢复依据，因为本轮新代码已经上线。只有旧 release 已回滚并验证，或修复后重新发布且 probe 成功，才可再次 enabled。恢复失败时明确报告当前状态。\n\n没有通用的 `automation-debug` 或 trigger 日志 shortcut。缺少安全事件入口、匹配环境或可观察结果时，记录 blocked，不能编造测试成功。\n\n### 运行时验证的操作级授权\n\n启用 trigger 的授权不等于制造 runtime 事件的授权，测试授权也不等于任意数据库写入授权。cron 可等待计划时间；webhook 只能向既有 runtime URL 发送已授权、安全且不泄露凭证的请求。record-change 在执行任何 DML 前，必须明确并取得覆盖以下作用域的授权：环境、表、操作、精确测试记录或筛选条件、payload、预期结果和清理方式。\n\n优先使用专用测试记录，不要任取线上业务记录。用户已明确授权精确、可撤回的测试夹具及其清理时，不机械追加一轮确认；目标或影响仍不清楚时必须停下。record-change probe 前先执行 `+automation-list --trigger-type record-change --all`，检查同一环境、表和操作可能命中的其他 enabled trigger；若存在 sibling match，必须说明聚合业务影响并取得覆盖这些影响的授权，或换成隔离夹具/经授权临时停用后再测。`UPDATE` 要限定精确条件并保留恢复方式；`INSERT` 要预先约定清理；恢复 UPDATE 或清理 INSERT 也可能再次触发自动化，必须纳入影响说明和授权。`DELETE` 必须遵循 [lark-apps-db-execute.md](lark-apps-db-execute.md)：先 `SELECT count(*)`、执行 `--dry-run`，展示影响后取得针对该删除目标的明确授权，再带 `--yes` 执行；清理动作若包含未预先授权的删除，同样走该门槛。\n\n缺少安全、已授权且可清理的事件入口时，记录 blocked，不得用“测试一下”推导任意 online 数据写入。\n\n### UPSERT 与飞书审批边界\n\nrecord-change 的 UPSERT 可创建 disabled 配置，但当前没有已证实的运行时代码契约；不得静默按 UPDATE 处理，也不得承诺 handler 或 live 验证。\n\nfeishu-approval 可创建 disabled 配置，并读取或更新 `event_type`、对应 status 和可选 `approval_code`。当前没有已证实的运行时 handler 契约或实际投递验证；不要把 enable 或审批 API 成功称为业务代码已执行。\n\n### 未触发时的诊断顺序\n\n按 `--name` / 项目 guide 要求的代码接入 → 本轮 release `finished` → enabled 状态 → 类型条件、环境和已有日志的顺序排查。客户审批投递故障属于服务端事件投递排查，不要归因于此 SOP 或改写无关业务代码。\n\n## 常见错误与决策场景\n\n| 现象 / 用户意图 | 正确处理 |\n|---|---|\n| 创建报名字冲突（`--name` 应用内唯一） | 换名或加后缀重试 |\n| cron 报非法 / 间隔过小 | 检查是否五段式、分钟字段是否 `*` 或 `*/n`(n<30) |\n| `--reset-url` 报缺 app-env | 补 `--app-env preview` 或 `--app-env runtime` |\n| 想把 cron 触发器改成 webhook（跨类型改） | update 不支持换类型，本 skill 也不提供删除。旧触发器只能 `+automation-disable` 停用（保留在应用里），另建一个 webhook 触发器；若要真正清理旧触发器，请到妙搭 web 手动删除 |\n| 触发器 enable 了但不触发 | 已证实的 cron、webhook、record-change（INSERT/UPDATE/DELETE）按「未触发时的诊断顺序」排查；UPSERT 和 feishu-approval 仅核对配置边界，不承诺 handler 或 live 验证。 |\n| 「token 泄露了」 | 优先 `+automation-update --reset-token --yes` 轮换（旧 token 立即失效），而非直接 disable-token 关校验 |\n| 「回调 URL 泄露了」 | `+automation-update --reset-url --app-env <env> --yes` 轮换 |\n\n## 不在本 skill 范围\n\n- 审批定义查询、Webhook 消费端实现、实时触发日志 tail：本期不支持。\n- 身份选择、权限不足处理、exit-10 审批、通用「禁输出密钥」红线、高风险操作通用框架：见 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md)，不在此重复。\n","isInternal":false,"tokens":9022,"sizeBytes":28108},{"name":"lark-apps-cache.md","path":"skills/lark-apps/references/lark-apps-cache.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-cache.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# apps cache 域命令（应用运行时缓存调试）\n\n调试妙搭应用的运行时缓存：查看某个缓存 key 的内容、删除单个 key、清空某个环境的全部缓存。缓存是应用为了加速而临时存放的数据，删除或清空后，应用下次用到时会自动重新取最新数据。命令事实以 `lark-cli apps +<cmd> --help` 为准；认证、`--as user`、exit 码、`_notice` 等通用处理见 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 与本域 [`SKILL.md`](../SKILL.md)。\n\n## 何时用\n\n用户要排查「某个缓存 key 里存的是什么 / 有没有命中」、想删掉某个 key 让应用下次拿到最新数据、或想清空某个环境的缓存做快速恢复时。\n\n## 命令一览\n\n| 命令 | 做什么 | 关键参数 |\n|---|---|---|\n| `+cache-get` | 查一个缓存 key 的内容与信息 | `--key`、`--environment`、`--format` |\n| `+cache-delete` | 删一个缓存 key（重复删不会报错；不需 `--yes`） | `--key`、`--environment` |\n| `+cache-clear` | 清空指定环境下的全部缓存（**高危，须先向用户二次确认**） | `--environment`、`--yes` |\n\n> 所有命令都需 `--app-id`。\n\n## 约定（先读）\n\n- **环境 `--environment dev|online`（可省略）**：缓存按运行环境隔离。不指定时按应用当前的环境配置自动选择——有多环境的应用默认落到开发环境 `dev`，没有多环境的就是线上 `online`；返回结果里的 `environment` 会告诉你这次实际操作的是哪个环境。想固定就显式传。\n- **缓存 key 用 `--key` 传**：传业务里使用的那个 key；是否合法（非空、长度等）由服务端校验，不合法会返回错误。\n- **风险分级**：`+cache-clear` 会清掉整个环境的缓存，是高危操作，不带 `--yes` 会被确认关卡拦下，且**必须先拿到用户对本次清空的确认**（判据见 [+cache-clear](#cache-clear高危)）；`+cache-delete` 只删单个 key、影响小，不需 `--yes`。\n- **`+cache-get` 的内容有两种展示**：`--format json`（默认）原样返回缓存内容，适合精确比对；`--format pretty` 会把内容格式化展开，更便于阅读。\n\n## 各命令\n\n### +cache-get\n按 `--key` 查单个缓存。命中时返回：是否存在、剩余有效期（TTL）、内容及其大小；未命中（或已过期）时只返回 `exists=false`、不带内容。\n\n> 每次查询都会连内容一起返回（没有「只看信息、不取内容」的模式），内容可能较大——只是想确认「在不在 / 还有多久过期」时，留意别占用太多上下文。\n\n```bash\nlark-cli apps +cache-get --app-id app_xxx --key spotbonus:2026:winners:list:v1\nlark-cli apps +cache-get --app-id app_xxx --environment online --key <key> --format pretty\n```\n\n### +cache-delete\n删一个缓存 key。**重复删、或删一个本就不存在的 key，都算成功**（返回 `deleted_key_count=0`）、不会报错；删中则返回 `deleted_key_count=1`。删掉后应用下次会自动重新取最新数据，影响小，故不需 `--yes`。\n\n**响应里的 `deleted_key_count` 别读错**——它是「本次是否真的删掉了东西」的唯一判据：\n\n| `deleted_key_count` | 含义 | 该怎么向用户表述 |\n|---|---|---|\n| `1` | 命中并删掉了 | 「已删除该 key」 |\n| `0` | 请求成功，但没有删掉任何 key——这个 key **本来就不存在或已过期** | 「该 key 原本就不存在／已过期，无需删除」——**不要说成「已成功删除」** |\n\n要证明「删除生效了」，用「删前 `+cache-get` 确认存在 → `+cache-delete` 拿到 `deleted_key_count=1` → 删后 `+cache-get` 得到 `exists=false`」这条链；只靠删后一次 miss 是不够的，因为 key 从一开始就不存在时（`deleted_key_count=0`）结果完全一样。\n\n```bash\nlark-cli apps +cache-delete --app-id app_xxx --environment dev --key <key>\n```\n\n### +cache-clear（高危）\n清空当前应用在**指定环境**下的全部缓存，用于定位不到具体 key 时的快速恢复。影响面是整个环境，必须带 `--yes`；返回本次清除的 key 数量。\n\n> [!CAUTION]\n> **默认流程是「先确认、后执行」，不是「直接清」。** 除下表判定为「已确认」的情形外，**不允许在首次调用就自己带上 `--yes`**——用户提出清理请求 ≠ 用户确认了这次清理。\n>\n> 未拿到确认时，你只能做这两件事之一，然后**停下来等用户回话**：\n> 1. 用 `--dry-run` 预览（不触发门禁、不产生任何真实清理），把将执行的请求给用户看；\n> 2. 或者干脆不调命令，直接把「应用 + 环境 + 会清掉该环境全部缓存」讲清楚并请用户确认。\n>\n> 已经拿到确认后，才在原命令末尾补 `--yes` 执行。**看到 exit 10 / `confirmation_required` 不是「补 `--yes` 重试」的信号**，它只是告诉你门禁生效了；该不该补，取决于用户有没有确认过。\n\n**什么算「已确认」（零歧义判据）**：看用户这轮的原话里，有没有对「清空这个环境」的授权表述。\n\n| 用户原话 | 算不算确认 | 你该做什么 |\n|---|---|---|\n| 「帮我清一下 app_xxx 的 online 环境缓存」 | ❌ 不算（这是请求，不是确认） | 先 `--dry-run` 或直接请用户确认，**停下等回话** |\n| 「清一下缓存」（连环境都没说） | ❌ 不算，且环境未定 | 请用户同时确认「清哪个环境」，**严禁自己选 `dev` 或 `online`** |\n| 「我确认清 dev，不要动 online」 | ✅ 算（含确认表述 + 明确环境） | 显式带 `--environment dev --yes` 执行 |\n| 「确认清 online，不用再问」／「是的，清吧」（承接你上一轮的确认提问） | ✅ 算 | 显式带 `--environment online --yes` 执行 |\n\n线上环境额外一条：`--environment online` 是生产数据，**即使用户已明确指名 online，也仍需要上表意义上的确认表述**才可执行；缺确认就只出 `--dry-run` 预览。\n\n```bash\n# 1) 未确认：只预览，不清理（--dry-run 不触发门禁、不产生真实动作）\nlark-cli apps +cache-clear --app-id app_xxx --environment online --dry-run\n\n# 2) 用户确认后：补 --yes 执行\nlark-cli apps +cache-clear --app-id app_xxx --environment dev --yes\n```\n\n## 错误与边界\n\n- **key 不合法 / 缓存服务暂时不可用**：命令会返回带说明的错误，按 `error.hint` 转述给用户；「服务暂时不可用」这类可稍后重试。\n\n## Agent 规则\n\n- **写操作先定环境**：`+cache-clear` / `+cache-delete` 不指定 `--environment` 时会落到自动选中的环境——**没有多环境的应用会直接作用到线上 `online`（生产）**。不确定应用有没有多环境时，写操作显式传 `--environment`；纯查看（`+cache-get`）影响小，可以省略。\n- **`+cache-clear` 一律先确认再清**：不带确认就执行是本域最容易犯的错。**「用户让我清缓存」不构成授权**——授权指用户对「清空这个环境」有明确确认表述（判据表见 [+cache-clear](#cache-clear高危)）。没有它，就只出 `--dry-run` 预览或口头确认请求，然后停下等回话；**不要在首次调用就自带 `--yes`，也不要看到 exit 10 就补 `--yes` 重试**。拿到确认后再补 `--yes`，并始终显式带 `--environment`。\n- **排查缓存内容优先用 `+cache-get`**：想看结构化、易读的内容用 `--format pretty`；想拿原始内容做精确比对用默认 JSON。\n- **删 key 前先对齐 key**：用户只描述了业务含义、没给准确 key 时，先确认再删——删错影响也有限（应用会自动重建），但仍应避免误删。\n","isInternal":false,"tokens":2742,"sizeBytes":7759},{"name":"lark-apps-cloud-dev.md","path":"skills/lark-apps/references/lark-apps-cloud-dev.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-cloud-dev.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# lark-apps 云端会话开发\n\n适用：用户希望让云端妙搭 Agent 生成或迭代应用，而不是把代码拉到本地开发。\n\n## 核心流程\n\n整个开发在云端进行：本地只负责「发消息 + 轮询状态」，不拉源码、不产出代码、不启动本地 dev server。所有 session/chat 命令都以用户身份执行（`--as user`）。\n\n### 资源模型：app → session → turn\n\n三层父子关系，下层都挂在上层之下：\n\n- **app（应用资产）**：一个妙搭应用，由 `+create` 创建并拿到 `app_id`。`--app-type` 沿用 SKILL.md「选择开发路径」判定的类型（有数据库需求→`full_stack`；纯前端交互、未提数据库→默认 `frontend`），云端生成不写死 `full_stack`。\n- **session（会话）**：一个 app 下的一段独立对话上下文，由 `+session-create` 创建并拿到 `session_id`。一个 app 可有多个 session；`is_active` 表示该 session 当前是否可写（可发起对话）。\n- **turn（轮）**：一个 session 里的一轮交互 = 一条用户消息 + 妙搭 Agent 针对它的生成/迭代。`+chat` 发一条消息就发起一轮；轮的句柄是 `turn_id`，状态看 `latest_turn.status`。\n\n### 执行模型：异步 + 轮询\n\n`+chat` 把消息入队后**立即返回、不等生成完成，响应不带 `turn_id`**；本轮状态与轮询节奏全靠 `+session-get` 读 `latest_turn.status` / `is_streaming` / `next_poll_after_ms`。\n\n`+session-get` 关键字段：\n\n- `is_streaming`：当前是否有一轮正在跑（`true`=还在生成）。\n- `latest_turn.status`：最近一轮的状态，只有 `running` / `completed` / `failed` / `cancelled`。\n- `latest_turn.turn_id`：最近一轮的句柄（`+session-stop --turn-id` 用它）。\n- `latest_turn.user_message`：本轮用户发的消息。\n- `latest_turn.messages`：本轮完成后回看全貌的消息列表，按时序排列、每条带 `role`（用户消息、模型回复、工具调用等都在内，role 取值如 `user` / `assistant` / `tool`）。注意它在 `latest_turn` 仍 running/初始化期可能为空——该轮**进行中**的实时进展改用 `+session-messages-list --turn-id <latest_turn.turn_id>` 读（见下方轮询规则）。\n- `queued_messages` / `queued_count`：还没开始跑、排在后面的消息。\n- `next_poll_after_ms`：建议的下次轮询间隔（毫秒，固定值）；非空时优先用它。\n\n轮询规则：\n\n- 节奏按 [初始化 vs 增量修改](#初始化-vs-增量修改) 判定：增量 5-10 秒一次；初始化 60-120 秒一次；`next_poll_after_ms` 非空时用它。\n- `is_streaming=true`、`building` / `running` / `streaming` 表示仍在生成，继续轮询，不傻等也不提前放弃；初始化阶段单次 sleep 拉到 60-120 秒，进入 `streaming` 或属增量修改时切回 5-10 秒。\n- `is_streaming=false` 且 `latest_turn.status=completed` 表示本轮完成，可发下一条。\n- `failed` / `cancelled` 时转述错误字段或 hint，由用户决定是否重试，不要静默重发。\n- 不知道某 app 有哪些 session 时，先 `+session-list --app-id <id>`，再选最近活跃的或让用户确认，别直接猜 `session_id`。\n- 要中止正在运行的一轮，从 `+session-get` 的 `latest_turn.turn_id` 取值，再调用 `+session-stop --turn-id <turn_id>`。\n- 状态与节奏看 `+session-get`，本轮实时内容看 `+session-messages-list`：想在 running 期间向用户播报\"云端 Agent 此刻在做什么\"，用 `+session-messages-list --turn-id <latest_turn.turn_id>` 读已产出的增量消息（running 期间即可读，不必等本轮结束）。复用上面的轮询节奏、不另起更密的轮询；续拉时把上次响应的 `next_page_token` 作 `--page-token` 只取新消息，转述时简述进展、不原样打印整段消息或工具输出。\n\n### 典型链路\n\n```bash\n# 1) 建 app，拿 app_id（--app-type 用主路由判定的类型；此例\"待办应用\"要存待办→full_stack，\n#    若是纯前端交互工具且未提数据库则用 frontend）\nlark-cli apps +create --name \"待办应用\" --app-type full_stack \\\n  --description \"支持新增、完成、筛选待办\"\n\n# 2) 在该 app 下建 session，拿 session_id\nlark-cli apps +session-create --app-id app_xxx\n\n# 3) 发消息发起一轮（异步入队，立即返回，无 turn_id）\nlark-cli apps +chat --app-id app_xxx --session-id sess_xxx --message \"做一个待办清单页面\"\n\n# 4) 轮询本轮状态；完成后从 latest_turn.messages 读取结果\nlark-cli apps +session-get --app-id app_xxx --session-id sess_xxx\n\n# 找该 app 已有的会话（续聊/不确定 session 时用）\nlark-cli apps +session-list --app-id app_xxx\n```\n\n## 完成态不等于发布态\n\n通用发布态判定（is_published 语义、开发态链接拼接、发布态链接来源）见 SKILL.md「发布态护栏」。本 reference 只补云端会话特有的措辞：\n\n- `+session-get` 返回 `is_streaming=false` 且 `latest_turn.status=completed`，只说明本轮云端生成/迭代结束，不等于已发布部署。\n- 如果只完成了云端会话、没有确认发布完成，就明确告诉用户“开发态链接可进入继续编辑，发布态是否为最新版本尚未确认”。\n\n## 需求发送\n\n- 只有用户明确选择云端路径，或明确说“让妙搭 Agent / 云端 AI 生成/迭代”时，才进入本 reference；不要因为用户只说“做个 X”或“给我链接”就默认云端。\n- 进入云端路径后，极简需求也可直接发起生成，例如“做个投票工具”“做个站会小应用”。先按主路由判定的 `--app-type` 建 app（有数据库需求→`full_stack`，纯前端交互未提数据库→默认 `frontend`），再用 `+chat --message \"<用户原话>\"` 透传需求，不编造实体、字段或业务细节。\n- 如果需求过泛，可在 `+chat --message` 中保留原话，并只补一句“请先生成通用版本，后续可继续迭代”，不要用多轮追问阻塞生成。\n\n## 会话落点\n\n| 情形 | 动作 |\n|---|---|\n| 全新应用 + 云端生成 | 先按主路由判定的类型 `+create --app-type <frontend\\|full_stack>`（未提数据库默认 frontend）拿 `app_id`，再 `+session-create` -> `+chat` |\n| 已知 app_id，用户没指定会话 | 先 `+session-list`；有活跃会话时问用户继续现有还是新开 |\n| 用户说“新开一段/换个话题” | `+session-create` 后再 `+chat` |\n| 用户说“接着刚才” | 复用上下文 session_id；拿不到就 `+session-list` 让用户选 |\n| 用户问会话“进行到哪一步/当前状态/最新进展” | 用 `+session-get --session-id <sid>` 读状态。`+session-list` 只负责发现/选择会话，不含执行状态；它返回空不等于无状态可查（session_id 也可能来自上下文），别用 `+session-list`/`+release-list` 代替 `+session-get` 回答进度 |\n\n## 初始化 vs 增量修改\n\n`+chat` 单轮的耗时差距很大，取决于目标 app 是否**已初始化**。两者的轮询节奏不同，**`+chat` 前先把状态判定清楚**，不要拿\"是不是第一次发消息\"当代理判断——session 是新建的不代表 app 没初始化过。\n\n### 判定规则\n\n**已初始化**（满足任一即认为已初始化）：\n\n1. 本地存在该 app 的项目目录（已 `+init` 或 clone 过），**且** git commit 数 > 2；\n2. 应用维度（云端）至少有一个已提交的版本，按以下任一信号判断：\n   - `lark-cli apps +session-get --app-id <app_id> --session-id <session_id>` 的返回里出现已提交版本信息；\n   - 在 `lark-cli apps +list`（必要时配 `--keyword <name>` 定位）的目标 app 条目里 `is_published: true`。\n\n**未初始化**（两个条件同时成立）：\n\n1. 本地不存在该 app 的项目目录；\n2. 应用维度没有任何已提交版本（即上面两路云端信号都判 false）。\n\n### 两种 `+chat` 的行为\n\n| 状态 | 服务端动作 | 单轮耗时 | 轮询建议 |\n|---|---|---|---|\n| 已初始化 → **增量修改** | 云端 Agent 在已有云端工作区上对**已提交代码**做局部修改，跳过方案设计与首次生成 | 通常分钟级 | `next_poll_after_ms` 为空时 5-10 秒一次 |\n| 未初始化 → **首次初始化 + 生成** | 服务端跑完整的应用初始化流程：需求分析、技术方案、数据模型、UI 与后端代码生成、首版代码提交到云端工作区 | 视需求复杂度，**通常 20~50 分钟** | `next_poll_after_ms` 为空时 60-120 秒一次 |\n\n初始化阶段 `+session-get` 可能长时间持续返回 `building` / `running`，是正常状态，**不要按失败处理，也不要催用户**。\n\n## 字段注意\n\n所有字段统一 snake_case，顶层和嵌套 turn 字段都一样：`session_id`、`is_active`、`is_streaming`、`next_poll_after_ms`、`latest_turn.turn_id`、`latest_turn.status`、`latest_turn.user_message`、`latest_turn.messages`。\n\n`+session-stop` 只停止正在运行的当前轮，不关闭会话；停完仍可继续 `+chat`。\n\n## 不适用\n\n- 用户要本地写代码、改仓库、跑 dev server：读 [`lark-apps-local-dev.md`](lark-apps-local-dev.md)。\n","isInternal":false,"tokens":3091,"sizeBytes":9204},{"name":"lark-apps-create.md","path":"skills/lark-apps/references/lark-apps-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# apps +create\n\n创建妙搭应用。运行时命令事实以 `lark-cli apps +create --help` 为准。\n\n## 何时用\n\n用来创建应用资产并拿到 `app_id`。它不负责把自然语言需求交给云端 Agent：用户要“帮我生成/迭代应用”时，先按 SKILL.md「选择开发路径」判定的 `--app-type`（有数据库需求→`full_stack`，纯前端交互未提数据库→默认 `frontend`）创建 app，再进入 [`lark-apps-cloud-dev.md`](lark-apps-cloud-dev.md) 用 `+session-create` / `+chat` 提交需求。\n\n## 命令骨架\n\n- 必填：`--name`、`--app-type`。\n- app type 取值为小写 `html` / `frontend` / `full_stack`；框架按枚举精确校验（不做大小写归一），非法值直接报错。\n- 可选：`--description`、`--icon-url`。\n\n## 示例\n\n```bash\nlark-cli apps +create --name \"客户调研问卷\" --app-type html\n\nlark-cli apps +create --name \"JSON 格式化工具\" --app-type frontend \\\n  --description \"纯前端交互工具，无需数据库\"\n\nlark-cli apps +create --name \"审批系统\" --app-type full_stack \\\n  --description \"部门审批系统，支持登录、提交申请、多级审批\"\n\nlark-cli apps +create --name \"Demo\" --app-type html --dry-run\n```\n\n## 输出契约\n\n- 成功默认 JSON envelope 中读取 `data.app.app_id`，同时可用 `data.app.name` / `description` 向用户确认结果。\n- pretty 输出只适合人看；后续命令需要 app_id 时，用 JSON 或 `--jq '.data.app.app_id'`。\n\n## app type 与命名\n\n- `--app-type` 取值与判定信号见 SKILL.md「选择开发路径」，此处不重复。\n- 用户只给自然语言需求时，据此生成简洁的 `--name` 和一句 `--description` 直接创建；不满意再用 `+update` 改。\n\n创建后按用户路径继续：\n\n- 本地应用开发（含 html / frontend / full_stack）：读 [`lark-apps-local-dev.md`](lark-apps-local-dev.md)。\n- 云端 Agent 生成/迭代：读 [`lark-apps-cloud-dev.md`](lark-apps-cloud-dev.md)。\n","isInternal":false,"tokens":665,"sizeBytes":1981},{"name":"lark-apps-db-execute.md","path":"skills/lark-apps/references/lark-apps-db-execute.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-db-execute.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# apps +db-execute\n\n经妙搭服务端在应用数据库执行 SQL。运行时命令事实以 `lark-cli apps +db-execute --help` 为准。\n\n> **写 SQL 前先看文末「平台 SQL 规范」**：妙搭底层是 PostgreSQL + 一层平台约束，SQL 内容不符合会被服务端直接拒或建出行为不对的表。最容易踩的三条：① 建业务表必须带 4 个审计列（`_created_at`/`_updated_at`/`_created_by`/`_updated_by`）+ 启用 RLS + 4 条 policy，一次调用里写全；② 人员字段用内置复合类型 `user_profile`（写入 `ROW('<user_id>')::user_profile`，查询解引用 `(field).user_id`）；③ `CREATE/DROP DATABASE·SCHEMA·USER·ROLE`、非白名单 `CREATE EXTENSION`、平台保留表 `auth`/`users` 会被硬拒，`online` 环境禁 DDL。\n\n## 何时用\n\n用于通过妙搭服务端执行应用数据库 SQL。不要从环境变量里取连接串裸连数据库；本地调试也走这个 shortcut。写什么样的 SQL（平台约束、建表模板、`user_profile`、审计列、禁用 SQL、PG 陷阱）见文末「平台 SQL 规范」。\n\n## 命令骨架\n\n- 必填：`--app-id`，以及 `--sql` / `--file` 二选一（互斥）。\n- `--sql`：内联 SQL 文本；传 `-` 时从 stdin 读。绝对路径文件经 stdin 传入：`--sql - < <absolute-path>`（shell 解析路径，CLI 仅接收内容）。\n- `--file`：`.sql` 文件路径，需为工作目录内的相对路径（如 `--file ./migration.sql`）；绝对路径、或经 `..`/符号链接越出工作目录的路径会被拒绝。文件不在工作目录内时，改用 `--sql - < <文件路径>` 经 stdin 传入。\n- `--environment` 枚举：`dev` / `online`，**不传则由服务端按应用是否开启多环境自动选择（多环境→`dev`，未开启多环境→`online`）**；要固定环境就显式传 `--environment dev|online`。**未开启多环境的应用显式传 `--environment dev` 会报错（无 dev 分支）——这类应用不传 `--environment`（走 `online`）或显式 `--environment online`**。旧名 `--env` 已**移除**：传入会报 validation 错（提示改用 `--environment`），一律用 `--environment`。\n- risk 是 `high-risk-write`（SQL 可含 DML/DDL）：任何执行都需 `--yes`，否则返回 `confirmation_required` / exit 10。`--dry-run` 预览不需要 `--yes`。\n- **不会自动为你包事务，事务边界需自己在 SQL 里控制**：多语句默认逐条独立提交，中间某条失败时前序语句已生效、不会回滚；若需要「要么全部成功、要么全部回滚」的原子性，请在 SQL 内显式写 `BEGIN … COMMIT`（详见下「Agent 规则」）。\n\n## 示例\n\n```bash\nlark-cli apps +db-execute --app-id app_xxx --environment dev --sql \"select * from orders limit 5\" --yes\nlark-cli apps +db-execute --app-id app_xxx --environment dev --file ./migration.sql --dry-run\n# 绝对路径文件 / cwd 不固定：经 stdin 传入\nlark-cli apps +db-execute --app-id app_xxx --environment dev --sql - --yes < /Users/.../migrations/0001_init.sql\n```\n\n## 输出契约\n\n- 成功默认 JSON 的 `data` 按 SQL 类型自适应（不透传后端原始串）：\n  - 单 SELECT → `data` 是行数组 `[{...}]`（空 → `[]`），直接 `-q '.data[].col'` 取字段。\n  - 单 DML → `data = {command, rows_affected}`（如 `{\"command\":\"INSERT\",\"rows_affected\":1}`）。\n  - 单 DDL → `data = {command}`（如 `{\"command\":\"CREATE_TABLE\"}`）。\n  - 多语句 → `data` 是元素数组：SELECT 为 `{command:\"SELECT\", rows:[...]}`，DML 为 `{command, rows_affected}`，DDL 为 `{command}`。\n- pretty 会按 SELECT/DML/DDL 自适应渲染；多语句会逐条显示 Statement 摘要。\n- 失败返回 typed `error`（`type:\"api\"`、`subtype:\"server_error\"`、`code`、`message`、`hint`）：失败位置在 `message` 的「(at statement N of M)」；前序是否落地 / 是否整批回滚写在 `hint`——事务内失败「Transaction rolled back; no changes persisted.」；非事务多语句前序已落地「Earlier statements were committed and not rolled back; fix statement N and re-run the remaining statements.」；首句即失败（无前序落地）「No statements were applied; fix the SQL and re-run.」。据此决定整段重跑还是只跑剩余语句。\n\n## Agent 规则\n\n- 该命令为 high-risk-write，执行一律需 `--yes`；无 `--yes` 会返回 `confirmation_required` / exit 10。\n  - **只读查询、以及不删除/不丢失既有数据且可撤回的语句**：已授权时可直接带 `--yes` 执行。\n  - **会删除或丢失既有数据、或难以撤回的语句**：先 `--dry-run` 预览（无需 `--yes`），向用户确认后再带 `--yes` 执行；不要在用户不知情时自动补 `--yes`。\n- 多语句失败时，失败前的语句可能已经 commit 落地。不要整批重跑；按错误 message/hint 修失败语句，并从剩余语句继续。\n- 如果需要原子性，让用户在 SQL 内显式写 `BEGIN` / `COMMIT`，不要假设 CLI 会包事务。\n- 不要把数据库连接串从 env 中取出来裸连。\n\n---\n\n# 平台 SQL 规范\n\n上面讲命令怎么调，这里讲**该写出什么样的 SQL**：妙搭底层是 PostgreSQL + 一层平台约束（RLS、审计列、`user_profile` 复合类型、禁用 SQL 白名单），不符合会被服务端直接拒或建出行为不对的表。看表 / 看结构用 [`+db-table-list`/`+db-table-get`](lark-apps-db.md)，别手写系统表查询模拟。\n\n## 平台禁用 SQL（硬拒绝）\n\n以下命中会被服务端拒，`error`（`type:\"api\"`）的 message/hint 会说明原因——先按 hint 修再重试，不要反复重试同一句。\n\n| 类别 | 禁止 |\n|---|---|\n| 数据库级 | `CREATE / DROP / ALTER DATABASE` |\n| Schema 级 | `CREATE / DROP SCHEMA` |\n| 用户 / 角色级 | `CREATE / DROP USER`、`CREATE / DROP / ALTER ROLE` |\n| Owner 切换 | `REASSIGN OWNED` / `DROP OWNED` |\n\n## 建表规范（CREATE TABLE）\n\n新建业务表必须：4 个审计列 + 启用 RLS + 4 条默认 policy，**放在同一次 `+db-execute` 调用里**（RLS / policy / COMMENT / INDEX 一起）。裸表名，不写 `public.` 或 schema 前缀。\n\n```sql\nCREATE TABLE IF NOT EXISTS <table> (\n  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n  -- ... 业务列 ...\n  name varchar(100) NOT NULL,\n  _created_at TIMESTAMP(3) WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  _created_by user_profile DEFAULT (\n    CASE\n      WHEN current_setting('app.user_id', TRUE) = '' THEN NULL\n      ELSE concat('(', current_setting('app.user_id', TRUE), ')')::user_profile\n    END\n  ),\n  _updated_at TIMESTAMP(3) WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  _updated_by user_profile DEFAULT (\n    CASE\n      WHEN current_setting('app.user_id', TRUE) = '' THEN NULL\n      ELSE concat('(', current_setting('app.user_id', TRUE), ')')::user_profile\n    END\n  )\n);\n\nALTER TABLE <table> ENABLE ROW LEVEL SECURITY;\n\nCREATE POLICY service_role_bypass_policy ON <table>\n  TO service_role USING (true);\n\nCREATE POLICY \"修改全部数据\" ON <table>\n  AS PERMISSIVE FOR ALL TO authenticated USING (true);\n\nCREATE POLICY \"查看全部数据\" ON <table>\n  AS PERMISSIVE FOR SELECT TO authenticated, anon USING (true);\n\nCREATE POLICY \"修改本人数据\" ON <table>\n  AS PERMISSIVE FOR ALL TO authenticated USING (\n    (current_setting('app.user_id'::text) = ANY (ARRAY[]::text[]))\n    AND (current_setting('app.user_id'::text) = ((_created_by).user_id)::text)\n  );\n```\n\n建表流程：先 `+db-table-list` / `+db-table-get` 确认表不存在或看现有结构 → 生成 DDL → 向用户展示影响并取得授权 → `+db-execute ... --yes` 执行。\n\n## 审计列\n\n- 平台自动维护的四列固定叫 `_created_at` / `_updated_at` / `_created_by` / `_updated_by`（**下划线开头**）。查询 / 排序 / 过滤一律用这些名字，别写 `created_at`。\n- `_created_at` / `_updated_at` 在 INSERT 时可省略（有默认值）；需要业务归属时显式写 `_created_by` / `_updated_by`。\n- UPDATE 业务字段时建议同步 `_updated_at = CURRENT_TIMESTAMP` 和 `_updated_by`。\n\n## `user_profile` 复合类型\n\n平台内置类型 `(user_id varchar, name varchar, email varchar, avatar text, status integer)`，无需创建。**业务 SQL 只允许访问 `(field).user_id`**，不要依赖 `name` / `email` / `avatar` / `status`（可能为空或过期）。\n\n```sql\n-- 写入 / 更新：用 ROW()::user_profile，更新时替换整个字段，不改单个属性\nINSERT INTO teacher (teacher_profile, class_id)\nVALUES (ROW('<user_id>')::user_profile, gen_random_uuid());\n\nUPDATE teacher SET teacher_profile = ROW('<user_id>')::user_profile\nWHERE (teacher_profile).user_id = '<old_user_id>';\n\n-- 查询 / 过滤：解引用取 user_id；raw SQL 返回给前端前必须解引用，别直接返回复合类型\nSELECT (teacher_profile).user_id AS teacher_profile, class_id FROM teacher;\n\n-- 索引 / 唯一性：表达式列用三重括号；表达式唯一性用 CREATE UNIQUE INDEX，\n-- 不能用 ALTER TABLE ADD CONSTRAINT UNIQUE（不支持表达式列）\nCREATE INDEX idx_teacher_user_id ON teacher (((teacher_profile).user_id));\nCREATE UNIQUE INDEX uk_teacher_user_id ON teacher (((teacher_profile).user_id));\n```\n\n## DDL 规则\n\n| 场景 | 做法 |\n|---|---|\n| 加列 | `ALTER TABLE <t> ADD COLUMN IF NOT EXISTS <col> <type>`，相关 `COMMENT ON` 同次执行 |\n| 加索引 | `CREATE INDEX IF NOT EXISTS idx_<t>_<cols> ON <t>(...)` |\n| JSONB 类型声明 | 必须 `COMMENT ON COLUMN <t>.<col> IS '@type { ... }'` 声明 TypeScript 类型，和 CREATE / ALTER 同次调用 |\n| 加 NOT NULL 列 | 必须带 `DEFAULT` 让存量行自动填：`ADD COLUMN <col> <type> NOT NULL DEFAULT <值>` |\n| 删表 / 删列 | 有业务数据默认禁止；必须用户明确授权后才执行，并说明数据丢失风险 |\n| 强约束 | `UNIQUE` / `FOREIGN KEY` / `NOT NULL` 默认谨慎，不确定不加 |\n\n**多环境库加约束前先查 online 存量**：`dev` 干净不代表 `online` 干净，约束发布到 online 会撞线上存量数据而失败。发布前一律先用 `--environment online` 查清楚，按约束类型分三种：\n\n- **加唯一约束（`UNIQUE` / 唯一索引）**：线上不能有重复值。先查重复，有则先清理再加：\n\n  ```bash\n  lark-cli apps +db-execute --app-id app_xxx --environment online --sql \\\n    \"SELECT <cols>, count(*) FROM t GROUP BY <cols> HAVING count(*) > 1\" --yes\n  ```\n\n- **已有列改 `NOT NULL`（收紧约束）**：线上该列不能有 NULL。先查 NULL 行数，有就先回填（`UPDATE t SET <col> = <默认值> WHERE <col> IS NULL`）再加约束：\n\n  ```bash\n  lark-cli apps +db-execute --app-id app_xxx --environment online --sql \\\n    \"SELECT count(*) FROM t WHERE <col> IS NULL\" --yes\n  ```\n\n- **新加 `NOT NULL` 字段**：必须带 `DEFAULT`，且要求线上该表**无存量数据**，否则发布报错。线上已有数据时别直接加，改走三步安全变更：先 `ADD COLUMN <col> <type>`（可空）→ 回填 `UPDATE t SET <col> = <值>` → 再 `ALTER COLUMN <col> SET NOT NULL`。先查线上行数判断走哪条：\n\n  ```bash\n  lark-cli apps +db-execute --app-id app_xxx --environment online --sql \\\n    \"SELECT count(*) FROM t\" --yes\n  ```\n\n## SELECT 规则\n\n| 规则 | 要求                                                               |\n|---|------------------------------------------------------------------|\n| 行数 | 结果集有硬上限（平台限制 1000 行），超限**报错而非静默截断**；大表必须显式 `LIMIT`、聚合或游标分页       |\n| 分页 | 大表优先游标分页 `WHERE id > <last_id> ORDER BY id LIMIT n`，避免大 `OFFSET` |\n| user_profile | 返回给前端前解引用：`(owner).user_id AS owner`                             |\n| 统计 | 总数用 `count(*)`、分组用 `GROUP BY`，别把全量拉到 agent 侧再统计                  |\n| 慢查询 | 用 `EXPLAIN (ANALYZE, BUFFERS)`；大表 Seq Scan 考虑加索引                 |\n\n## DML 规则\n\n**INSERT**\n- UUID 主键省略，交给 `DEFAULT gen_random_uuid()`；外键 UUID 用子查询取父表 id，不手写。\n- NOT NULL 且无默认值的列必须给值；批量 INSERT 每行列数一致。\n- 需要幂等用 `ON CONFLICT ... DO NOTHING / DO UPDATE`。\n- 标量子查询必须保证单行，非唯一条件加 `ORDER BY ... LIMIT 1`。\n\n**UPDATE**\n- **必须有明确 `WHERE`，禁止无条件 UPDATE**。\n- 用户说「修改 / 更新 / 改一下」数据时用 UPDATE，**禁止 DELETE + INSERT** 模式。\n- 更新 `user_profile` / 复合类型时替换整个字段。\n- 批量更新前影响范围不明确，先 `SELECT count(*)` 给用户确认。\n\n**DELETE / TRUNCATE**（属会丢数据的高影响操作，按上面「Agent 规则」的确认流程走）\n- 已有表 / 已有数据默认禁止；先 `SELECT count(*)` 展示命中行数、取得用户明确授权，再带 `--yes` 执行。\n- `TRUNCATE` 影响整表，视同高风险删除。\n\n```sql\nUPDATE task\nSET status = 'done', _updated_at = CURRENT_TIMESTAMP, _updated_by = ROW('<user_id>')::user_profile\nWHERE id = (SELECT id FROM task WHERE title = '梳理需求' ORDER BY _created_at DESC LIMIT 1);\n```\n\n## 常见 PostgreSQL 陷阱\n\n| 陷阱 | 正确做法 |\n|---|---|\n| 表名带 schema 前缀 | 业务表一律裸表名 `FROM orders`，别写 `public.orders` |\n| 保留字作标识符 | 避免 `user` / `order` / `desc` / `offset` / `references` 等 |\n| 内联 COMMENT | 禁止 `col TEXT COMMENT 'xx'`，用独立 `COMMENT ON COLUMN` |\n| 手写系统表查结构 | 常规结构查询用 `+db-table-list` / `+db-table-get`，别手写 `information_schema` / `pg_indexes` 模拟 |\n| 空数组类型不明 | 写 `ARRAY[]::text[]` 或 `'{}'::text[]` |\n| `ROUND` 报错 | 用 `ROUND(num::numeric, n)` 或 `ROUND(num::double precision)` |\n| `DISTINCT` + 窗口函数 | 分两层查询，先 DISTINCT 再窗口函数 |\n| MySQL 方言 | 不用 `SHOW TABLES` / `DESCRIBE` / 内联 `COMMENT`；用 `+db-table-*` 和 `COMMENT ON` |\n| 多语句以为自动回滚 | `A; B; C` 不自动包事务，B 失败时 A 已提交；要原子性显式 `BEGIN; ... COMMIT;`（见上「命令骨架」「Agent 规则」） |\n\n## 数据类型与设计\n\n| 项目 | 规则 |\n|---|---|\n| 主键 | 默认 `id uuid PRIMARY KEY DEFAULT gen_random_uuid()` |\n| 命名 | 表名单数、全小写、snake_case、无冗余后缀 |\n| 枚举 / 状态 | 用 `varchar(255)`，值用小写英文 + 下划线 |\n| JSONB | 必须 `COMMENT ON COLUMN ... IS '@type { ... }'` 声明类型 |\n| 附件 / 图片 | URL 用 `TEXT`，命名 `xxx_url` |\n| 约束 | `UNIQUE` / `FOREIGN KEY` / `NOT NULL` 默认谨慎，新增 NOT NULL 列优先带 `DEFAULT` |\n","isInternal":false,"tokens":4846,"sizeBytes":14708},{"name":"lark-apps-db.md","path":"skills/lark-apps/references/lark-apps-db.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-db.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# apps db 域命令\n\n管理妙搭应用数据库：看表与结构、初始化与发布多环境、数据搬运、变更治理、时间点恢复、用量。逐条跑 SQL（SELECT/DML/DDL）走 [`+db-execute`](lark-apps-db-execute.md)（单独一篇）。运行时命令事实以 `lark-cli apps +<cmd> --help` 为准；认证、`--as user`、exit 码、`_notice` 等通用处理见 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 与本域 [`SKILL.md`](../SKILL.md)。\n\n## 何时用\n\n用户要看应用里有哪些表 / 某张表的结构、把单库应用拆成 dev/online 多环境、把数据导进导出表、查谁在什么时候改了表结构或表数据、开关行级审计、把开发环境的库结构发布到线上、把库恢复到过去某个时间点、或看数据库用量时。逐条执行 SQL 走 [`+db-execute`](lark-apps-db-execute.md)；文件存储（上传/下载文件）走 [`lark-apps-file.md`](lark-apps-file.md)。**建表 / 改表 / 写 SQL 的平台内容规范**（审计列、RLS、`user_profile`、禁用 SQL、PG 陷阱）见 [`lark-apps-db-execute.md`](lark-apps-db-execute.md) 的「平台 SQL 规范」。\n\n## 命令一览\n\n| 命令 | 做什么 | 关键参数 |\n|---|---|---|\n| `+db-table-list` | 列出某环境的数据表 | `--environment`、`--page-size`/`--page-token` |\n| `+db-table-get` | 看单张表的结构（字段/索引/约束/DDL） | `--table`、`--environment`、`--format` |\n| `+db-env-create` | 把单库应用初始化为 dev/online 多环境（高危） | `--environment`、`--sync-data`、`--yes` |\n| `+db-data-export` | 把一张表的数据导出到本地文件 | `--table`、`--output`、`--limit`、`--environment` |\n| `+db-data-import` | 把本地 csv/json 文件导进一张表（高危） | `--file`、`--table`、`--environment`、`--yes` |\n| `+db-sync-create` | 预览或创建 Base 到应用数据库的同步任务（高危） | `--config`、`--preview`、`--output`、`--environment`、`--yes` |\n| `+db-sync-list` | 列出 Base 同步任务 | `--mode`、`--status`、`--table`、`--page-size`/`--page-token`、`--environment` |\n| `+db-sync-get` | 查看同步任务配置、状态、统计和 warnings | `--task-id` |\n| `+db-sync-enable` | 启用 streaming 同步任务 | `--task-id` |\n| `+db-sync-disable` | 停用 streaming 同步任务 | `--task-id` |\n| `+db-sync-update` | 修改 streaming 同步任务映射配置（高危） | `--task-id`、`--config`、`--yes` |\n| `+db-sync-delete` | 删除 streaming 同步任务，保留目标数据（高危） | `--task-id`、`--yes` |\n| `+db-changelog-list` | 查表结构变更（DDL）历史 | `--table`、`--change-id`、`--since`/`--until`、`--environment` |\n| `+db-audit-status` | 看哪些表开了行级审计、保留期 | `--table`、`--environment` |\n| `+db-audit-enable` | 给某表开启行级变更审计 | `--table`、`--retention`、`--environment` |\n| `+db-audit-disable` | 关闭某表的行级审计 | `--table`、`--environment` |\n| `+db-audit-list` | 列出表的行级变更事件（增删改追溯） | `--table`（可重复）、`--since`/`--until`、`--environment` |\n| `+db-env-diff` | 预览开发环境待发布到线上的结构变更 | `--app-id` |\n| `+db-env-migrate` | 把开发环境的结构变更发布到线上（高危） | `--app-id`、`--yes` |\n| `+db-recovery-diff` | 预览把库恢复到某时间点会带来的变更 | `--target` |\n| `+db-recovery-apply` | 把库恢复到某个时间点、覆盖当前数据（高危） | `--target`、`--yes` |\n| `+db-quota-get` | 查数据库存储用量 | `--environment` |\n\n## 约定（先读）\n\n- **环境 `--environment dev|online`（可省略）**：看表、看结构、数据导入导出、变更追溯、审计、配额都按环境区分。省略 `--environment` 时 CLI 不带该参数、由服务端按应用形态自动选分支——多环境应用走 `dev`、未开多环境的走 `online`；要固定环境就显式传。唯一会报错的组合：对未开多环境的应用显式传 `--environment dev`（无 `dev` 分支）。写操作建议先在 `dev` 验（仅多环境应用有 `dev`）。旧名 `--env` 已**移除**：传入会报 validation 错（提示改用 `--environment`），一律用 `--environment`。`+db-env-diff`/`+db-env-migrate` 是「dev→online 发布」语义，**没有** `--environment`。\n- **本地文件 / `--output` 用工作目录内相对路径**：导入 `--file ./orders.csv`、导出 `--output ./out.csv`；绝对路径、或经 `..`/符号链接越出工作目录的 `--output` 会被拒（validation / exit 2）。路径在别处先 `cd` 过去或改成相对路径。\n- **高危操作必须带 `--yes`**：`+db-env-create`、`+db-data-import`、`+db-env-migrate`、`+db-recovery-apply`、`+db-sync-create`、`+db-sync-update`、`+db-sync-delete` 缺省会被确认关卡拦下；动手前先用对应的预览命令或 `--dry-run` 看清影响。`+db-sync-create --preview` 只解析/校验配置、不落库，免确认、不需 `--yes`；真正建任务（不带 `--preview`）才需要 `--yes`。\n- **Base 同步不是整库任务**：`+db-sync-create` 一次只处理一张 Base 表到一张目标表。用户说“整库”“客户、订单、回款三张表都同步”时，先明确告诉用户会拆成三套独立配置、三次 preview、用户确认后三次 create；不要暗示一个同步任务能覆盖整个 Base。\n- **batch 任务不能重新启用**：用户说“批量任务重新启用”“operation-not-allowed”时，先给结论：batch/import 是一次性任务，不能 enable。不要先陷入授权排障而漏掉这个结论；授权缺失时也要说明授权完成后应 `+db-sync-get` 查状态/结果，持续同步要新建 streaming。\n- **时间参数按口语自然传**（`--since`/`--until`/`--target`），格式见末尾。\n\n## 各命令\n\n### 表与结构\n\n**`+db-table-list`**：列出某环境的数据表。分页 `--page-size`（默认 20）/ `--page-token`（上一页 cursor）。每项给表名、描述、估算行数、大小、列数；要完整列定义 / 索引 / 约束用 `+db-table-get`。只知道业务对象名时，先用它定位可能的表名。\n\n```bash\nlark-cli apps +db-table-list --app-id app_xxx\nlark-cli apps +db-table-list --app-id app_xxx --environment dev --page-size 50\n```\n\n**`+db-table-get`**：看单张表的结构。默认 JSON 给结构化的字段 / 索引 / 约束 / 估算行数 / 大小；`--format pretty` 直接输出建表 DDL 文本（给用户看建表语句或做迁移参照时用）。\n\n```bash\nlark-cli apps +db-table-get --app-id app_xxx --table orders\nlark-cli apps +db-table-get --app-id app_xxx --table orders --environment dev --format pretty\n```\n\n### 多环境数据库（初始化 + 发布）\n\n**`+db-env-create`（高危）**：把存量单库应用初始化为 dev/online 两套库，不可逆，必须带 `--yes`。`--environment` 目前只支持 `dev`（默认 `dev`）；`--sync-data` 把现有 online 数据复制到新环境（不传则不复制）。注意：`+create --app-type full_stack` 新建的应用通常已自带多环境，重复初始化会返回冲突错误（应用已是多环境）——按 `error.hint` 转述状态即可，别重复初始化。\n\n```bash\nlark-cli apps +db-env-create --app-id app_xxx --environment dev --dry-run\nlark-cli apps +db-env-create --app-id app_xxx --environment dev --sync-data --yes\n```\n\n**`+db-env-diff`**：预览开发环境里待发布到线上的表结构变更，不落地。发布前先看这个。无待发布变更时明确返回「无变更」。\n\n**`+db-env-migrate`（高危）**：把开发环境的结构变更正式发布到线上，不可逆，必须带 `--yes`，返回实际发布的变更条数。发布是异步的，命令会等到完成再返回结果。\n\n> 预览与发布同一端点，故 `+db-env-diff` 也需 `spark:app:write` scope（不是纯只读权限）。\n\n**发布审批拦截**：若应用的发布配置了审批，`+db-env-migrate` 会被服务端拒绝（`feature_not_available`，exit 1）。这**不是**参数问题：换 flag、重试都不会成功，也不要去跑 `+db-env-create`。改走应用发布：先向用户确认发布理由，再执行 `lark-cli apps +release-create --app-id <app_id> --apply-reason \"<已向用户确认的发布理由>\"`；也可以让用户在页面上发布。只有真发布被拦，`+db-env-diff` 预览照常可用。\n\n```bash\nlark-cli apps +db-env-diff --app-id app_xxx\nlark-cli apps +db-env-migrate --app-id app_xxx --yes\n```\n\n### 数据导入导出\n\n**`+db-data-export`**：把一张表导出到本地文件。导出格式**只由 `--output` 的扩展名决定**——`.csv` / `.json` / `.sql`，缺省按 `<表名>.csv` 落在当前目录。注意：全局 `--format json|pretty` 只控制**命令自身输出**（成功摘要 / 错误信封）的渲染，**不影响导出文件的格式**；`--output` 后缀必须是 `.csv/.json/.sql` 之一，否则报 validation 错误（exit 2），且不支持导出到 stdout。两道体量约束：\n\n- `--limit`（1..5000，默认 5000）是**行数上限守卫**：表的行数超过它会被整体拒掉（不是「只导前 N 行」）；\n- 导出产物 >1 MB 也会被拒。\n\n超大表别硬导：先用 `+db-execute` 加 `WHERE` / `LIMIT` 缩小范围、分批导。\n\n```bash\nlark-cli apps +db-data-export --app-id app_xxx --table orders --output ./orders.csv\nlark-cli apps +db-data-export --app-id app_xxx --table orders --output ./orders.json --environment dev\n```\n\n**`+db-data-import`（高危）**：把本地 csv/json 文件的数据导进表。文件需是 `.csv`/`.json`、≤1 MB，必须带 `--yes`。目标表缺省取文件名去掉**最后一个**扩展名（如 `orders.csv`→`orders`，`orders.2026.csv`→`orders.2026`）；文件名带点号时建议显式传 `--table` 以免落到意外的表名。\n\n```bash\nlark-cli apps +db-data-import --app-id app_xxx --table orders --file ./orders.csv --environment dev --yes\n```\n\n**导入/导出限额**：体积 ≤ **1 MB**、行数 ≤ **5000**，导入导出都一样，超限会被拒。超限就分批——导入拆成 ≤1 MB / ≤5000 行的多个文件，导出用 `WHERE` / `LIMIT` 缩小范围。\n\n### Base 数据同步\n\nBase 数据同步走 `+db-sync-*`，和本地文件导入不同：`+db-data-import` 只处理本地 `.csv/.json` 文件；Base 链接、Base 表、字段映射、持续同步任务都走 `+db-sync-create` / `+db-sync-update`。\n\n**任务类型**：\n- `mode=batch`：一次性任务。`schema_only=true` 只建目标表；`schema_only=false` 建表或写入已有表并导入当前 Base 数据。完成后不能 enable/disable/update/delete。\n- `mode=streaming`：持续同步任务。首次同步后持续处理 Base 变化，可 enable/disable/update/delete。\n\n**环境（重要）**：`+db-sync-*` 命令省略 `--environment` 时默认落 **online**（不同于 `+db-table-*`/`+db-audit-*` 等「多环境自动选 dev、单环境选 online」的规则——db-sync 家族不走自动选分支）。**多环境应用建表**（`target.table.action=create`）**必须显式 `--environment dev`**：不填或填 `online` 会被 online 分支的 DDL 禁令拒（`k_dl_4000001：forbid ddl/dcl operation in online env`），因为 online 分支产品上不允许直接建表，建表要落到 dev 分支。共享库 / 单环境应用只有 online、在 online 建表正常成功（不会报 `k_dl_4000001`），省略 `--environment` 或填 `online` 均可。\n\n**配置格式**：只通过 `--config` 传完整 JSON，支持内联 JSON、`@file`、`-` stdin。配置 key 使用复数：`field_maps`、`option_mappings`、`syncable_source_fields`。不要写单数 `field_map` / `option_mapping`，CLI 会直接报 validation 错。正式 create 时 `field_maps` **可省略或传空数组**：服务端会使用与 preview 相同的逻辑自动匹配字段并直接创建任务；若显式传了映射，则至少要有一项未写成 `\"enabled\": false`，写了却全部关闭会被 CLI 拒绝。`+db-sync-update` 仍要求至少一个启用的 `field_maps`，因为 update 的语义是修改既有映射。`target.table.action` 只能是 `create` 或 `use_existing`：建表时 `pg_field` 需要完整字段定义；写已有表时通常只需目标列名。`source.base_url`（源 Base 表完整 URL）在 `+db-sync-create` 必填、由服务端强制；`+db-sync-update` 可选——省略时服务端复用原任务的源 URL，仅在换源 / 替换成另一张 Base 表时才需要传新的 `base_url`。`source.table.name` 是要同步的 Base 表名。`base_url` 形如 `https://.../base/<token>?table=<tableId>`：`token` 定位 Base，`table=` 参数（tableId）定位表。填了 `source.table.name` 就以 name 为准——服务端用 `token + name` 反查 tableId（覆盖 url 里的 `table=` 参数）；不填才用 url 的 `table=` 参数定位。所以用户自然语言里说「同步 xxx 表」「把 xxx 表同步过去」时，一定要把「xxx」填进 `source.table.name`，不要只给 `base_url`——尤其当 `base_url` 不带 `table=` 参数（指向不带具体表的 Base）时，漏了 name 服务端无从定位表。\n\n**不知道要同步哪张表**：若 `base_url` 只有域名+token、不带 `?table=` 参数，又不确定表名，别硬猜。先用 `lark-cli base +table-list --base-token <token>` 列出该 Base 的所有表（`<token>` 就是 `base_url` 里 `/base/` 后面那段），把表名给用户选定，再填进 `source.table.name`（或改用带 `?table=<table_id>` 的完整 URL）。`+db-sync-create` 会在本地就拦下「`base_url` 无 `?table=` 且 `source.table.name` 空」的配置（提交前即报 validation 错，不送到服务端）。\n\n**单数 key 恢复**：如果用户说配置里 `field_map` 是单数、`option_mapping` 是单数、或字段映射可能不生效，不要把原配置直接提交。先找到用户这份同步配置，做这三步：\n\n1. 只把已知 key 改成复数：`field_map` -> `field_maps`，`option_mapping` -> `option_mappings`；不要发明 `fieldMappings` / `mapping` 之类字段名。\n2. 检查 `field_maps` 是数组，且至少有一项 `enabled` 缺省或为 `true`。如果全是 `\"enabled\": false`，先让用户确认要启用哪几项，再继续。\n3. 修好后先重新 preview，或复用最近一次 preview `--output` 产出的 `data.config`，再继续 create / update。\n\n```bash\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @sync.json --preview --output ./resolved-sync.json\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @resolved-sync.json --yes\n```\n\n如果本地找不到配置文件，不要只停在“请提供文件”。先说明恢复来源：让用户贴失败时传入的 JSON，或查找最近 preview 的 `--output` 文件；如果是已有任务的修改，先用 `+db-sync-get` 取回当前任务配置，再基于它修正后 update：\n\n```bash\nlark-cli apps +db-sync-get --app-id app_xxx --task-id streaming_123 -q '.data | {mode, source, target, field_maps}' > sync.json\nlark-cli apps +db-sync-update --app-id app_xxx --task-id streaming_123 --environment dev --config @sync.json --yes\n```\n\n**推荐流程（最佳实践，不是强制）**：优先先 preview，再让用户确认映射，最后用 preview 输出的完整 config 正式创建；这样最稳，也避免手写复杂 `field_maps`。若用户明确要求直接执行、不需要 preview，也可以在 create config 中省略 `field_maps`（或传空数组），由服务端自动匹配并直接创建任务；CLI 不应为了拿 mapping 强制用户先 preview。\n\n```bash\nlark-cli apps +db-sync-create \\\n  --app-id app_xxx \\\n  --environment dev \\\n  --config - \\\n  --preview \\\n  --output ./resolved-sync.json <<'JSON'\n{\n  \"mode\": \"streaming\",\n  \"source\": {\n    \"type\": \"base\",\n    \"base_url\": \"https://example.feishu.cn/base/xxx\",\n    \"table\": {\"name\": \"客户\"}\n  },\n  \"target\": {\n    \"type\": \"postgresql\",\n    \"table\": {\"name\": \"customers\", \"action\": \"use_existing\"}\n  }\n}\nJSON\n```\n\npreview 返回 `data.config`、`syncable_source_fields` 和 `summary`。`--output` 只把 `data.config` 写入文件，文件可直接作为正式输入：\n\n```bash\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @resolved-sync.json --yes\nlark-cli apps +db-sync-get --app-id app_xxx --task-id streaming_123\n```\n\n**多表 Base**：本命令一次只处理一张表。用户要同步整个 Base 时，先把计划说清楚：不是一个“整库同步任务”，而是按表拆成 N 个单表任务。每张表各有一份配置文件、一次 `+db-sync-create --preview`、一次用户确认后的 `+db-sync-create --yes`，并记录各自 `task_id`。\n\n```bash\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @customers-sync.json --preview --output ./customers-resolved.json\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @orders-sync.json --preview --output ./orders-resolved.json\nlark-cli apps +db-sync-create --app-id app_xxx --environment dev --config @payments-sync.json --preview --output ./payments-resolved.json\n```\n\n配置也必须是单表粒度：每份 JSON 只有一个 `source.table` 和一个 `target.table`，字段名保持 `field_maps`、`option_mappings`、`syncable_source_fields` 这些复数 key。\n\n**修改 streaming 映射**：先用 get 导出当前配置，编辑 `field_maps` 后 update。update 是高危操作，必须经用户确认再加 `--yes`。\n\n`+db-sync-get` 返回的 `source` **不含 `base_url`**（只有 token / tableId，服务端没有 domain 拼不出完整 URL），这是正常的。原表 update 直接省略 `base_url` 即可；只有要换成另一张 Base 表时，才在 config 里显式补一个新的 `base_url`。不要为了\"补全\" `base_url` 而编造 domain 或拼接 URL——拿不到就省略，让服务端复用原任务的源 URL。\n\n`+db-sync-update` 也遵循 db-sync 家族「省略 `--environment` 落 online」的规则，所以改 dev 上的任务必须显式带该任务所在环境的 `--environment`（多环境应用的 streaming 任务通常在 `dev`），否则会错落 online、找不到任务或改错分支。\n\n```bash\nlark-cli apps +db-sync-get --app-id app_xxx --task-id streaming_123 -q '.data | {mode, source, target, field_maps}' > sync.json\nlark-cli apps +db-sync-update --app-id app_xxx --task-id streaming_123 --environment dev --config @sync.json --yes\n```\n\n**列表与生命周期**：\n\n```bash\nlark-cli apps +db-sync-list --app-id app_xxx --mode streaming --table customers\nlark-cli apps +db-sync-disable --app-id app_xxx --task-id streaming_123\nlark-cli apps +db-sync-enable --app-id app_xxx --task-id streaming_123\nlark-cli apps +db-sync-delete --app-id app_xxx --task-id streaming_123 --yes\n```\n\n`+db-sync-enable`、`+db-sync-disable`、`+db-sync-update`、`+db-sync-delete` 只适用于 `streaming_...` task。对 `batch_...` 执行这些操作会返回 failed-precondition。\n\n**batch 任务 operation-not-allowed 恢复**：用户说“批量任务重新启用”“导入历史订单表的任务重新 enable”“系统说操作不允许”时，先给生命周期结论：batch / import 类任务是一次性任务，完成或失败后不能重新启用，也不要反复调用 `+db-sync-enable`。下一步改为查状态和结果：\n\n```bash\nlark-cli apps +db-sync-get --app-id app_xxx --task-id batch_123\n```\n\n把 `status`、`result`、`warnings` 和目标表写入情况告诉用户。若用户要的是后续持续同步，不是“重启这个 batch”，应新建 `mode=streaming` 任务：先 `+db-sync-create --preview` 给用户确认映射和影响，再带 `--yes` 创建；不要强行 enable 已完成的 batch 任务。若此时 CLI 还缺授权，仍要先解释这个生命周期边界，再提示授权完成后用 `+db-sync-get` 查结果。\n\n**失败恢复**：看到 `warnings` 不要直接说同步成功。按 warning 或 error 的 `hint` 继续排查，恢复路径按任务 mode 分支：\n\n- **streaming 任务**：常见路径是 `+log-list --keyword <target_table>` / `+log-get` 查日志，然后用 `+db-execute` 修目标表结构，或用 `+db-sync-update`（带该任务所在环境的 `--environment`）修字段映射，最后对同一 `task_id` 再 `+db-sync-get` 复查。\n- **batch 任务**：batch 是一次性任务、**不能 update**（见上文生命周期）。修完目标表结构（`+db-execute`）后不要 update 原 batch，而是重新 `+db-sync-create --preview` 建新任务；只想看这个 batch 的结果就直接 `+db-sync-get`。\n\n若此时 CLI 还缺授权、查不到 warning 详情，也不要只给泛化的字段核对建议：先说明被授权卡住，再把对应 mode 的固定命令链作为授权完成后的下一步明确交代给用户。\n\n**online 禁 DDL（`k_dl_4000001`）恢复**：`+db-sync-create` 建表报 `k_dl_4000001：forbid ddl/dcl operation in online env` 时，这必然是多环境应用（共享库在 online 建表不会报此码）。online 分支**本就不允许**直接建表，这是多环境应用的产品设计、不是可绕过的限制。改用 `--environment dev` 重跑 `+db-sync-create`，把表建到 dev 分支；不要试图「在 online 想办法重试建表」，没有这个选项。\n\n**缺 Base 表记录 ID 映射列（`400002477`）恢复**：streaming 自动同步要求目标表有一个映射给「Base 表记录 ID」的 **text + 单值 + unique** 列。用 `action=use_existing` 写已有表时，若该表没有这样的列，会报 `400002477`（Field mapping must include 'Base 表记录 ID'）。先用 `+db-execute` 给表加一个，如 `ALTER TABLE <表> ADD COLUMN base_record_id varchar UNIQUE`，再把它映射给「Base 表记录 ID」、重跑 `+db-sync-create --preview`。注意这是**加列**、不是建表，不需要审计列 / RLS 那套建表规范。\n\n### 变更追溯与审计\n\n**`+db-changelog-list`**：查表结构变更（DDL）历史——谁、什么时候、改了哪张表、做了什么。可按 `--table` 过滤、按 `--change-id` 精确定位某条、用 `--since`/`--until` 圈时间区间，分页 `--page-size`/`--page-token`。\n\n```bash\nlark-cli apps +db-changelog-list --app-id app_xxx --table orders --since 7d\n```\n\n**`+db-audit-status`**：看审计开关状态。给 `--table` 看单表，不给则列出所有已配置的表（开没开、保留期）。\n\n**`+db-audit-enable` / `+db-audit-disable`**：开 / 关某张表的行级变更审计。`--retention` 设保留期，取值 `7d`/`30d`/`180d`/`360d`/`forever`（默认 `7d`）。不要对已经开启审计的表重复 enable——不确定就先用 `+db-audit-status` 查。\n\n```bash\nlark-cli apps +db-audit-enable --app-id app_xxx --table orders --retention 30d\nlark-cli apps +db-audit-disable --app-id app_xxx --table orders\n```\n\n**`+db-audit-list`**：列出表的行级变更事件（INSERT/UPDATE/DELETE 的前后值与操作人）。`--table` 必填、可重复传多张表；`--since`/`--until` 圈时间。\n- **多表查询**：会先帮用户把不存在、或没开审计的表过滤掉再查，被过滤的表及原因列在结果的 `skipped` 里——据此告诉用户哪些表没纳入及为什么。\n- **单表查询**：不预过滤，表不存在 / 未开审计会直接报错（按 `error.hint` 转述给用户，引导先 `+db-audit-enable`）。\n\n```bash\nlark-cli apps +db-audit-list --app-id app_xxx --table orders --since 24h\nlark-cli apps +db-audit-list --app-id app_xxx --table orders --table users\n```\n\n### 时间点恢复（PITR）\n\n**`+db-recovery-diff`**：预览把库恢复到 `--target` 时间点会带来哪些变更（受影响的表、行数、预计耗时），不落地。同样需 `spark:app:write` scope。\n\n**`+db-recovery-apply`（高危）**：把库恢复到某个时间点，**会覆盖当前数据**，不可逆，必须带 `--yes`。\n\n- 可恢复窗口最长 **7 天**，且不早于**最近一次 `+db-env-migrate`**；超出窗口的目标会被拒。\n- 目标时间点与当前库一致时返回 `no_changes`（空操作），不算失败。\n- 动手前务必先 `+db-recovery-diff` 给用户确认。\n\n```bash\nlark-cli apps +db-recovery-diff --app-id app_xxx --target 2h\nlark-cli apps +db-recovery-apply --app-id app_xxx --target 2026-04-15T10:00:00Z --yes\n```\n\n### 配额\n\n**`+db-quota-get`**：查数据库存储用量（已用量、表数、视图数；配额接入后还会给总配额与使用率）。\n\n```bash\nlark-cli apps +db-quota-get --app-id app_xxx --environment dev\n```\n\n## 时间格式（`--since` / `--until` / `--target`）\n\n按用户口语自然传入即可，支持：\n- 相对时间 `7d` / `2h` / `30s`（从现在往前推）\n- 日期 `2026-04-15`\n- 日期时间 `2026-04-15T10:00:00`\n- 带时区的 ISO 8601 `2026-04-15T10:00:00Z` / `2026-04-15T10:00:00+08:00`\n\n> **时区**：不带时区的 `日期` / `日期时间` 按**运行机器的本地时区**解析（再归一化到 UTC）。CI（UTC）与本地（如 UTC+8）跑同一条命令，时间边界会差几小时；要精确锁定时区时显式写 ISO 8601 带偏移（如 `...+08:00` / `...Z`）。`--target`（PITR 恢复）尤其建议带时区，避免恢复到非预期时间点。\n\n## Agent 规则\n\n- 用户说「本地 / 开发库 / 调试库」优先 `--environment dev`，线上排查用 `--environment online`；数据面写操作（导入 / 审计开关）建议先在 `dev` 验再动 `online`。**注意省略 `--environment` 时写操作会落到服务端选中的分支——单环境应用即 `online`（生产）**：不确定应用是否多环境时，写操作显式传 `--environment`；显式 `dev` 在单环境应用上会安全报错（无 dev 分支），正好当「是否多环境」的探针用。\n- 看表用 `+db-table-list`，看结构用 `+db-table-get`（要建表语句加 `--format pretty`）；`+db-env-create` 仅用于存量单库拆多环境，新建的 full_stack 应用一般不需要。\n- 高危命令（`+db-env-create`、`+db-data-import`、`+db-env-migrate`、`+db-recovery-apply`、`+db-sync-create`、`+db-sync-update`、`+db-sync-delete`）动手前先看清影响再带 `--yes`：发布 / 恢复先跑对应预览 `+db-env-diff` / `+db-recovery-diff`，Base 同步先跑 `+db-sync-create --preview`，导入无预览命令、可先 `--dry-run` 看请求或先在 `--environment dev` 验；不要静默追加 `--yes`，遇 confirmation_required（exit 10）按 lark-shared 协议向用户确认不可逆风险后再补 `--yes` 重试。\n- 导入 / 导出的本地路径用工作目录内相对路径；超大表导出会被行数 / 体积上限拒，改用 `+db-execute` 分批。\n- Base 同步优先走 preview → 用户确认 → create，这是最稳的最佳实践、不是强制。用户明确要求直接 create 时，可省略 `field_maps`（或传空数组）让服务端自动匹配并创建；不要为了拿 mapping 强制用户先 preview。显式写映射时使用 `field_maps` / `option_mappings` 复数 key。\n- 修复 Base 同步配置时，只把 `field_map` / `option_mapping` 改成 `field_maps` / `option_mappings`。若显式给了 `field_maps`，检查至少一个映射启用；全是 `\"enabled\": false` 时先让用户确认要启用哪项。create 也可删掉/置空 `field_maps` 交给服务端自动匹配，但 update 仍必须提供启用的映射。\n- `+db-sync-update` 省略 `source.base_url` 是合法的（服务端复用原任务源 URL）；`+db-sync-get` 不返回 `base_url` 属正常，不要因此编造 domain / 拼接 URL 去\"补全\"，只有换源 / 替换表时才传新的 `base_url`。`+db-sync-create` 的 `base_url` 必填，缺失由服务端报错。用户说「同步 xxx 表」时把「xxx」填进 `source.table.name`——填了 name 就以 name 为准（服务端用 `base_url` 的 token + name 反查 tableId，覆盖 url 的 `table=` 参数），不填才用 url 的 `table=` 参数定位；别只给 `base_url`。\n- batch 同步任务不能重新 enable。遇到 operation-not-allowed 先 `+db-sync-get` 查状态和结果；要持续同步就新建 streaming 任务，走 preview -> 用户确认 -> create。\n- `+db-sync-*` 省略 `--environment` 默认落 online。多环境应用建表（`action=create`）必须显式 `--environment dev`；省略或填 `online` 会撞 `k_dl_4000001`（online 禁 DDL）——那是多环境应用的产品设计，把表建到 dev 分支即可，不要在 online 重试建表。共享库应用在 online 建表正常，不受此限。\n- `+db-audit-list` 多表查询时，把结果里 `skipped` 的表（不存在 / 未开审计）连同原因一并向用户说明，不要让用户以为这些表「没有变更」。\n- 恢复是覆盖式且不可逆：`+db-recovery-apply` 前必须先 `+db-recovery-diff`，并明确告知用户会覆盖当前数据。\n","isInternal":false,"tokens":9810,"sizeBytes":28928},{"name":"lark-apps-env-pull.md","path":"skills/lark-apps/references/lark-apps-env-pull.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-env-pull.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# apps +env-pull\n\n> **前置条件：** 先阅读 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md)（认证 / 全局参数 / 安全）。\n\n把妙搭应用 dev 启动期环境变量拉取到本地项目根的 `.env.local`。身份固定 `--as user`；scope `spark:app:read`。`--app-id` 必填，目标项目根默认当前工作目录（`--project-path` 可指定）。\n\n这个命令是 dev-only 的本地恢复工具：内部固定 `POST env_vars`，body 为 `env=dev`。它没有 `--env` flag，也不管理线上环境变量。\n\n## 何时别用（核心反模式）\n\n**通常不需要手动跑**——脚手架的 `npm run dev` 在起本地开发时会自动后台拉取（非阻塞）。手动再跑会重复做同样的事，并用服务端返回值覆盖 `.env.local` 里的同名 key；本地无关行和注释会保留。\n\n只在这些兜底场景用：\n\n- 不通过 `npm run dev` 启动（直接跑 `node` / IDE debug）。\n- `.env.local` 被改坏 / 删除，想重新同步。\n\n## 行为\n\n- **合并、不清空**：写入 `.env.local` 时保留你手写的内容与注释——命中的 key 替换值，新 key 追加，不整体覆盖。\n- **安全护栏**：返回的 envelope **不会回显任何 env key / value**（防止 token / 数据库凭据泄漏到日志或 CI 输出）。要看实际值请直接读 `.env.local`。\n\n## 示例\n\n```bash\nlark-cli apps +env-pull --app-id <app_id>\n```\n\n## 失败处理\n\n`missing_scope`（没拿到 `spark:app:read`）时，按 lark-shared 引导 `lark-cli auth login --domain apps`。其余失败优先转述 `error.hint` / `error.message`。\n\n## 参考\n\n- [lark-apps](../SKILL.md) — 妙搭应用全部命令 + 心智模型\n- [lark-apps-local-dev](lark-apps-local-dev.md) — 本地应用开发端到端流程\n- [lark-shared](../../lark-shared/SKILL.md) — 认证和全局参数\n","isInternal":false,"tokens":654,"sizeBytes":1846},{"name":"lark-apps-env.md","path":"skills/lark-apps/references/lark-apps-env.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-env.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# apps env\n\n> **前置条件：** 先阅读 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md)（认证 / 全局参数 / 安全）。\n\n管理妙搭应用环境变量。查看用 `+env-list`，设置用 `+env-set`，删除用 `+env-delete`。没有单变量 get 命令；要确认某个 key 是否存在，使用 list 后用 `--jq` 过滤。\n\n环境 flag 使用 `--environment`；不要使用旧的 `--env`，也不要使用短选项。\n\n## 查看\n\n`+env-list` 默认查 dev，且默认不返回 value。只有显式传 `--include-values` 后，响应中才可能出现变量值；不要在公开日志里展示带值输出。\n\n接口契约：list 使用 `POST env_vars`，body 固定包含 `env` 和 CLI 场景 `scene=2`；set 使用 `POST create_or_update_env_var`；delete 使用 `POST delete_env_vars`。`--include-values` 只控制 CLI 输出是否展示 value，不作为服务端查询参数发送。\n\n```bash\nlark-cli apps +env-list --app-id <app_id>\nlark-cli apps +env-list --app-id <app_id> --environment online\nlark-cli apps +env-list --app-id <app_id> --include-values --jq '.data.items[] | select(.key == \"FOO\")'\n```\n\n## 设置\n\ndev 环境设置不需要 `--yes`。设置 online 环境需要人类确认并显式传 `--yes`；如果用户在同一轮已经明确说“确认/直接执行”，视为已确认，直接带 `--yes`，不要再次追问。`--dry-run` 可用于预览请求且不需要 `--yes`。变量值支持直接传 `<value>`，也支持 `@file` 或 stdin 输入。\n\n回复中只说明 app/env/key 和执行结果；不要回显真实 value。需要举例时使用 `<value>`、`@file` 或 stdin。\n\n```bash\nlark-cli apps +env-set --app-id <app_id> --key FOO --value <value>\nlark-cli apps +env-set --app-id <app_id> --key FOO --value @./secret.txt\nlark-cli apps +env-set --app-id <app_id> --environment online --key FOO --value <value> --dry-run\nlark-cli apps +env-set --app-id <app_id> --environment online --key FOO --value <value> --yes\n```\n\n## 删除\n\n`+env-delete` 是 high-risk-write。尊重 exit 10 confirmation protocol：先让用户确认 app/env/key 和删除后果，再传 `--yes`。不要自动补 `--yes`。如果只是认证失败后让用户重登，重登完成不等于删除确认；继续删除前仍需确认。\n\n```bash\nlark-cli apps +env-delete --app-id <app_id> --key FOO --dry-run\nlark-cli apps +env-delete --app-id <app_id> --key FOO --yes\nlark-cli apps +env-delete --app-id <app_id> --environment online --key FOO --yes\n```\n\n## 反模式\n\n- 不要把 `+env-pull` 当成环境变量管理命令；它只是刷新本地 `.env.local` 的兜底工具。\n- 不要为了看一个变量臆造名为 env-get 的 apps shortcut；用 `+env-list --include-values` 加 `--jq`。\n- 不要把真实 secret 写进示例或对话输出；需要示例时使用 `<value>`、`@file` 或 stdin。\n","isInternal":false,"tokens":916,"sizeBytes":2842},{"name":"lark-apps-export.md","path":"skills/lark-apps/references/lark-apps-export.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-export.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# apps +export\n\n`+export` 把妙搭应用的源码打成 zip 下载到本地。运行时命令事实以 `lark-cli apps +export --help` 为准。\n\n## 何时用\n\n只要一份源码快照的场景：读代码、审计、归档、做静态分析、把源码喂给别的工具。用户丢来一个妙搭应用链接要你「看看 / 分析 / 总结」时也用它：导出后解压读源码，页面文案和数据通常就在 HTML / 组件里。\n\n**跨应用是它相对 `+init` 的核心价值**：创意应用的分享链接（`/page/<token>`）指向别人的应用，你对那个仓库没有权限，`git clone` 走不通；`+export` 只要求你对该应用有下载权限。\n\n## 不要用它的时候\n\n要继续开发就用 `+init`，不要用 `+export` 再手动 `git init`。两者产出不同：\n\n| | `+export` | `+init` |\n|---|---|---|\n| 产出 | 一个 zip | 完整 git 工作区 |\n| Git 凭证 | 不配 | 配好，可 push |\n| 本地环境变量 | 不拉 | 拉 `.env.local` |\n| 前提 | 对应用有下载权限 | 对**仓库**有权限 |\n\n用 `+export` 拿到的目录没有 git 历史、没有远端、没有凭证，改完发不回去。\n\n## 导出的是「最后一次提交」，不是沙箱当前状态\n\n服务端对远端仓库跑 `git archive`，从不读沙箱文件系统。用户在沙箱里改了文件但没提交或发布，**那些改动不在归档里**。\n\n这是设计如此，不是缺陷。若导出结果看起来\"少了刚写的代码\"，先确认改动是否已提交，而不是重试导出。\n\n## 命令骨架\n\n- `--app-id` 与 `--meta-token` **恰传其一**：前者是自己的应用，后者是分享链接里的 token。\n  两者作为独立字段走 `POST /apps/export` 的请求体（`app_id` / `meta_token`），服务端按传入的\n  字段区分，不再共用 path 段——调用方只有 token、没有 app_id 时也不用在路径里凑一个占位值。\n  - 两者都只收**裸标识符**。拿到的是整条链接（`.../app/<app_id>` 或 `.../page/<token>`）时，\n    只传最后一段——整条 URL 传进来会被本地拦下并提示，不会变成一个看起来像\"应用不存在\"的 404。\n- `--output` 可选，相对当前目录；省略时用服务端给的文件名（通常是 `<app_id>.zip`）。\n\n## 示例\n\n```bash\nlark-cli apps +export --app-id app_xxx --output ./src.zip\nlark-cli apps +export --app-id app_xxx                      # 存成 ./app_xxx.zip\nlark-cli apps +export --meta-token <share-token>            # 别人分享给你的应用\nlark-cli apps +export --app-id app_xxx --dry-run\n```\n\n## 输出契约\n\n- 成功时 stdout 是 JSON envelope，含 `output`（落盘的绝对路径）与 `size_bytes`；传了 `--app-id` 时还会回显 `app_id`。\n- 归档以流式写盘，不会整包驻留内存，大仓库也安全。\n- 失败时不会留下半个文件。\n\n## 错误处理\n\n| 情况 | 怎么办 |\n|---|---|\n| 应用尚未发布（`code 40901 app not published`） | 该应用是产物托管形态（如静态 HTML 应用），导出的是「最新已发布产物」，而它还没有成功发布过版本，此刻没有可导的东西。**先发布应用再重试**——不是 app_id 写错，重试也没用 |\n| 权限不足（HTTP 403，或 HTTP 200 + `code 40300`；两者都表现为 `permission_denied`） | 你需要该应用的下载权限。**持有分享 token、能打开页面都不等于有下载权限**。重试和换参数都没用，向用户说明需找应用所有者授权 |\n| 应用不存在（404） | 用 `+list --keyword <name>` 核对 app_id |\n| 归档过大（413） | 超出导出体积上限，改用 `+git-credential-init` + 原生 git clone |\n| 参数报错 | `--app-id` 与 `--meta-token` 只能给一个，且必须给一个；两者都要裸标识符（不是整条链接） |\n","isInternal":false,"tokens":1328,"sizeBytes":3801},{"name":"lark-apps-file.md","path":"skills/lark-apps/references/lark-apps-file.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-file.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-file.md -->","isInternal":false,"tokens":2029,"sizeBytes":5833},{"name":"lark-apps-get.md","path":"skills/lark-apps/references/lark-apps-get.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-get.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-get.md -->","isInternal":false,"tokens":540,"sizeBytes":1625},{"name":"lark-apps-git-credential.md","path":"skills/lark-apps/references/lark-apps-git-credential.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-git-credential.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-git-credential.md -->","isInternal":false,"tokens":645,"sizeBytes":2031},{"name":"lark-apps-html-publish.md","path":"skills/lark-apps/references/lark-apps-html-publish.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-html-publish.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-html-publish.md -->","isInternal":false,"tokens":1232,"sizeBytes":3654},{"name":"lark-apps-init.md","path":"skills/lark-apps/references/lark-apps-init.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-init.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-init.md -->","isInternal":false,"tokens":777,"sizeBytes":2264},{"name":"lark-apps-list.md","path":"skills/lark-apps/references/lark-apps-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-list.md -->","isInternal":false,"tokens":724,"sizeBytes":2108},{"name":"lark-apps-local-dev.md","path":"skills/lark-apps/references/lark-apps-local-dev.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-local-dev.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-local-dev.md -->","isInternal":false,"tokens":4288,"sizeBytes":13307},{"name":"lark-apps-observability.md","path":"skills/lark-apps/references/lark-apps-observability.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-observability.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-observability.md -->","isInternal":false,"tokens":1285,"sizeBytes":3824},{"name":"lark-apps-openapi-key.md","path":"skills/lark-apps/references/lark-apps-openapi-key.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-openapi-key.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-openapi-key.md -->","isInternal":false,"tokens":1639,"sizeBytes":4609},{"name":"lark-apps-plugin-install.md","path":"skills/lark-apps/references/lark-apps-plugin-install.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-plugin-install.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-plugin-install.md -->","isInternal":false,"tokens":491,"sizeBytes":1445},{"name":"lark-apps-plugin-list.md","path":"skills/lark-apps/references/lark-apps-plugin-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-plugin-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-plugin-list.md -->","isInternal":false,"tokens":244,"sizeBytes":733},{"name":"lark-apps-plugin-uninstall.md","path":"skills/lark-apps/references/lark-apps-plugin-uninstall.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-plugin-uninstall.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-plugin-uninstall.md -->","isInternal":false,"tokens":251,"sizeBytes":719},{"name":"lark-apps-release-create.md","path":"skills/lark-apps/references/lark-apps-release-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-release-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-release-create.md -->","isInternal":false,"tokens":1637,"sizeBytes":4870},{"name":"lark-apps-release-get.md","path":"skills/lark-apps/references/lark-apps-release-get.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-release-get.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-release-get.md -->","isInternal":false,"tokens":2085,"sizeBytes":6347},{"name":"lark-apps-release-list.md","path":"skills/lark-apps/references/lark-apps-release-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-release-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-release-list.md -->","isInternal":false,"tokens":397,"sizeBytes":1145},{"name":"lark-apps-role.md","path":"skills/lark-apps/references/lark-apps-role.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-role.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-role.md -->","isInternal":false,"tokens":2829,"sizeBytes":8335},{"name":"lark-apps-session-messages-list.md","path":"skills/lark-apps/references/lark-apps-session-messages-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-session-messages-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-session-messages-list.md -->","isInternal":false,"tokens":1065,"sizeBytes":3176},{"name":"lark-apps-update.md","path":"skills/lark-apps/references/lark-apps-update.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-update.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-update.md -->","isInternal":false,"tokens":352,"sizeBytes":1074},{"name":"lark-apps-user-id-convert.md","path":"skills/lark-apps/references/lark-apps-user-id-convert.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/references/lark-apps-user-id-convert.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Freferences%2Flark-apps-user-id-convert.md -->","isInternal":false,"tokens":1454,"sizeBytes":3910},{"name":"SKILL.md","path":"skills/lark-apps/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/SKILL.md","title":"lark-apps","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2FSKILL.md -->","frontmatter":{"name":"lark-apps","version":"1.0.0","description":"妙搭（Spark/Miaoda）应用开发与托管：应用创建、本地全栈开发、云端生成迭代、创意设计（UI mockup / 可交互原型 / 线框图 / 落地页 / 仪表盘 / 幻灯片 deck / 视觉探索）、AI相关能力和飞书平台能力或者其他外部能力集成、日志/Trace/监控指标/PV/UV 查询、环境变量管理、应用协作者与协作权限设置、应用角色与成员管理、自动化触发器（定时/记录变更/Webhook/飞书审批）。当用户要开发/新建一个系统·工具·平台·应用，或要本地开发 / 云端开发 / 修改 / 部署 / 发布 / 上线 / 拿可分享链接，或用 HTML 做页面·网站·部署到妙搭，或要设计 / design / mockup / prototype / wireframe / 做 PPT / deck / 视觉探索，或提到妙搭/Spark/Miaoda 应用（链接形如 `/app/app_xxx` 或 `/page/<token>`，运行时域名形如 *.aiforce.cloud）、应用数据库、应用文件存储、开放 API Key、可见范围、应用协作者/开发权限、应用角色/角色成员、线上日志、接口请求量、错误量、延迟、访问量、环境变量、给妙搭应用配自动化任务/定时触发/审批通过后自动触发时使用。不负责普通云盘文件上传（lark-drive）、飞书文档编辑（lark-doc）、原生幻灯片创建（lark-slides）。","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli apps --help; lark-cli apps +<cmd> --help"}},"isInternal":false,"tokens":9151,"sizeBytes":27019},{"name":"SKILL.md","path":"skills/lark-attendance/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-attendance/SKILL.md","title":"lark-attendance","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-attendance%2FSKILL.md -->","frontmatter":{"name":"lark-attendance","version":"1.0.0","description":"飞书考勤打卡：查询自己的考勤打卡记录","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli attendance --help"}},"isInternal":false,"tokens":506,"sizeBytes":1620},{"name":"lark-base-advanced-permission-and-role.md","path":"skills/lark-base/references/lark-base-advanced-permission-and-role.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-advanced-permission-and-role.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-advanced-permission-and-role.md -->","isInternal":false,"tokens":934,"sizeBytes":3908},{"name":"lark-base-app-block-data-config.md","path":"skills/lark-base/references/lark-base-app-block-data-config.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-app-block-data-config.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-app-block-data-config.md -->","isInternal":false,"tokens":2560,"sizeBytes":7936},{"name":"lark-base-app.md","path":"skills/lark-base/references/lark-base-app.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-app.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-app.md -->","isInternal":false,"tokens":4999,"sizeBytes":15739},{"name":"lark-base-dashboard-block-config.md","path":"skills/lark-base/references/lark-base-dashboard-block-config.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-dashboard-block-config.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-dashboard-block-config.md -->","isInternal":false,"tokens":7267,"sizeBytes":20976},{"name":"lark-base-dashboard-block-get-data.md","path":"skills/lark-base/references/lark-base-dashboard-block-get-data.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-dashboard-block-get-data.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-dashboard-block-get-data.md -->","isInternal":false,"tokens":8996,"sizeBytes":24997},{"name":"lark-base-dashboard.md","path":"skills/lark-base/references/lark-base-dashboard.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-dashboard.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-dashboard.md -->","isInternal":false,"tokens":5550,"sizeBytes":16731},{"name":"lark-base-data-query.md","path":"skills/lark-base/references/lark-base-data-query.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-data-query.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-data-query.md -->","isInternal":false,"tokens":6729,"sizeBytes":19644},{"name":"lark-base-field-create.md","path":"skills/lark-base/references/lark-base-field-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-field-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-create.md -->","isInternal":false,"tokens":1058,"sizeBytes":3358},{"name":"lark-base-field-extension.md","path":"skills/lark-base/references/lark-base-field-extension.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-field-extension.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-extension.md -->","isInternal":false,"tokens":2143,"sizeBytes":6960},{"name":"lark-base-field-formula.md","path":"skills/lark-base/references/lark-base-field-formula.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-field-formula.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-formula.md -->","isInternal":false,"tokens":8301,"sizeBytes":50220},{"name":"lark-base-field-lookup.md","path":"skills/lark-base/references/lark-base-field-lookup.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-field-lookup.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-lookup.md -->","isInternal":false,"tokens":4850,"sizeBytes":18815},{"name":"lark-base-field-schema.md","path":"skills/lark-base/references/lark-base-field-schema.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-field-schema.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-schema.md -->","isInternal":false,"tokens":4919,"sizeBytes":14838},{"name":"lark-base-field-update.md","path":"skills/lark-base/references/lark-base-field-update.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-field-update.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-field-update.md -->","isInternal":false,"tokens":2260,"sizeBytes":6798},{"name":"lark-base-filter-condition.md","path":"skills/lark-base/references/lark-base-filter-condition.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-filter-condition.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-filter-condition.md -->","isInternal":false,"tokens":2122,"sizeBytes":6186},{"name":"lark-base-form-detail.md","path":"skills/lark-base/references/lark-base-form-detail.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-form-detail.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-form-detail.md -->","isInternal":false,"tokens":911,"sizeBytes":2927},{"name":"lark-base-form-questions-create.md","path":"skills/lark-base/references/lark-base-form-questions-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-form-questions-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-form-questions-create.md -->","isInternal":false,"tokens":3168,"sizeBytes":9932},{"name":"lark-base-form-questions-update.md","path":"skills/lark-base/references/lark-base-form-questions-update.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-form-questions-update.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-form-questions-update.md -->","isInternal":false,"tokens":2366,"sizeBytes":7335},{"name":"lark-base-form-submit.md","path":"skills/lark-base/references/lark-base-form-submit.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-form-submit.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-form-submit.md -->","isInternal":false,"tokens":2373,"sizeBytes":7180},{"name":"lark-base-record-history-list.md","path":"skills/lark-base/references/lark-base-record-history-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-record-history-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-record-history-list.md -->","isInternal":false,"tokens":864,"sizeBytes":2747},{"name":"lark-base-record-query-and-analysis-sop.md","path":"skills/lark-base/references/lark-base-record-query-and-analysis-sop.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-record-query-and-analysis-sop.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-record-query-and-analysis-sop.md -->","isInternal":false,"tokens":4007,"sizeBytes":11731},{"name":"lark-base-role-config.md","path":"skills/lark-base/references/lark-base-role-config.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-role-config.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-role-config.md -->","isInternal":false,"tokens":7212,"sizeBytes":21836},{"name":"lark-base-template-center.md","path":"skills/lark-base/references/lark-base-template-center.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-template-center.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-template-center.md -->","isInternal":false,"tokens":3499,"sizeBytes":10288},{"name":"lark-base-view-set-filter.md","path":"skills/lark-base/references/lark-base-view-set-filter.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-view-set-filter.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-view-set-filter.md -->","isInternal":false,"tokens":895,"sizeBytes":2699},{"name":"lark-base-view.md","path":"skills/lark-base/references/lark-base-view.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-view.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-view.md -->","isInternal":false,"tokens":2957,"sizeBytes":9434},{"name":"lark-base-workflow-schema.md","path":"skills/lark-base/references/lark-base-workflow-schema.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-workflow-schema.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-workflow-schema.md -->","isInternal":false,"tokens":14054,"sizeBytes":43120},{"name":"lark-base-workflow.md","path":"skills/lark-base/references/lark-base-workflow.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/references/lark-base-workflow.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2Freferences%2Flark-base-workflow.md -->","isInternal":false,"tokens":9111,"sizeBytes":31085},{"name":"SKILL.md","path":"skills/lark-base/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-base/SKILL.md","title":"lark-base","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-base%2FSKILL.md -->","frontmatter":{"name":"lark-base","version":"1.2.23","description":"飞书多维表格（Base）操作：建表、字段、记录、视图、统计、公式/lookup、表单、仪表盘、应用模式（BaseApp/AppMode 页面与组件）、Workspace 目录、workflow、角色权限、模板中心（多维表格模板分类/列表/搜索）；遇到 Base/多维表格/bitable、BaseApp/AppMode、/base/ 或 /app/ 链接时使用。BaseApp 不走 lark-apps；文件导入/导出转 lark-drive，认证/授权转 lark-shared。","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli base --help"}},"isInternal":false,"tokens":7588,"sizeBytes":24052},{"name":"lark-calendar-create.md","path":"skills/lark-calendar/references/lark-calendar-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-create.md -->","isInternal":false,"tokens":2184,"sizeBytes":6168},{"name":"lark-calendar-join-event.md","path":"skills/lark-calendar/references/lark-calendar-join-event.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-join-event.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-join-event.md -->","isInternal":false,"tokens":683,"sizeBytes":1998},{"name":"lark-calendar-list-attendees.md","path":"skills/lark-calendar/references/lark-calendar-list-attendees.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-list-attendees.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-list-attendees.md -->","isInternal":false,"tokens":460,"sizeBytes":1379},{"name":"lark-calendar-meeting-relation.md","path":"skills/lark-calendar/references/lark-calendar-meeting-relation.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-meeting-relation.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-meeting-relation.md -->","isInternal":false,"tokens":1866,"sizeBytes":5457},{"name":"lark-calendar-meeting.md","path":"skills/lark-calendar/references/lark-calendar-meeting.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-meeting.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-meeting.md -->","isInternal":false,"tokens":544,"sizeBytes":1678},{"name":"lark-calendar-recurring.md","path":"skills/lark-calendar/references/lark-calendar-recurring.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-recurring.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-recurring.md -->","isInternal":false,"tokens":2344,"sizeBytes":6995},{"name":"lark-calendar-room-find.md","path":"skills/lark-calendar/references/lark-calendar-room-find.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-room-find.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-room-find.md -->","isInternal":false,"tokens":3273,"sizeBytes":8396},{"name":"lark-calendar-rsvp.md","path":"skills/lark-calendar/references/lark-calendar-rsvp.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-rsvp.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-rsvp.md -->","isInternal":false,"tokens":392,"sizeBytes":1106},{"name":"lark-calendar-schedule-clear-time.md","path":"skills/lark-calendar/references/lark-calendar-schedule-clear-time.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-schedule-clear-time.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-schedule-clear-time.md -->","isInternal":false,"tokens":981,"sizeBytes":2827},{"name":"lark-calendar-schedule-fuzzy-time.md","path":"skills/lark-calendar/references/lark-calendar-schedule-fuzzy-time.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-schedule-fuzzy-time.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-schedule-fuzzy-time.md -->","isInternal":false,"tokens":1233,"sizeBytes":3365},{"name":"lark-calendar-schedule-meeting.md","path":"skills/lark-calendar/references/lark-calendar-schedule-meeting.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-schedule-meeting.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-schedule-meeting.md -->","isInternal":false,"tokens":2194,"sizeBytes":6290},{"name":"lark-calendar-suggestion.md","path":"skills/lark-calendar/references/lark-calendar-suggestion.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-suggestion.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-suggestion.md -->","isInternal":false,"tokens":2410,"sizeBytes":7113},{"name":"lark-calendar-transfer.md","path":"skills/lark-calendar/references/lark-calendar-transfer.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-transfer.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-transfer.md -->","isInternal":false,"tokens":1569,"sizeBytes":4552},{"name":"lark-calendar-update.md","path":"skills/lark-calendar/references/lark-calendar-update.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/references/lark-calendar-update.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2Freferences%2Flark-calendar-update.md -->","isInternal":false,"tokens":2838,"sizeBytes":8029},{"name":"SKILL.md","path":"skills/lark-calendar/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-calendar/SKILL.md","title":"lark-calendar","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-calendar%2FSKILL.md -->","frontmatter":{"name":"lark-calendar","version":"1.0.0","description":"飞书日历：管理日历日程和会议室。查看/搜索日程、创建/更新日程、管理参会人、查询忙闲和推荐时段、预定会议室。当用户需要查看日程安排、创建/修改会议、查询/预定会议室时使用。不负责：查询过去的视频会议记录（走 lark-meeting）、待办任务（走 lark-task）。","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli calendar --help"}},"isInternal":false,"tokens":5954,"sizeBytes":17865},{"name":"lark-contact-get-user.md","path":"skills/lark-contact/references/lark-contact-get-user.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-contact/references/lark-contact-get-user.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-contact%2Freferences%2Flark-contact-get-user.md -->","isInternal":false,"tokens":227,"sizeBytes":625},{"name":"lark-contact-search-bot.md","path":"skills/lark-contact/references/lark-contact-search-bot.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-contact/references/lark-contact-search-bot.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-contact%2Freferences%2Flark-contact-search-bot.md -->","isInternal":false,"tokens":899,"sizeBytes":2522},{"name":"lark-contact-search-user.md","path":"skills/lark-contact/references/lark-contact-search-user.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-contact/references/lark-contact-search-user.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-contact%2Freferences%2Flark-contact-search-user.md -->","isInternal":false,"tokens":1934,"sizeBytes":5288},{"name":"SKILL.md","path":"skills/lark-contact/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-contact/SKILL.md","title":"lark-contact","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-contact%2FSKILL.md -->","frontmatter":{"name":"lark-contact","version":"1.0.0","description":"飞书 / Lark 通讯录:按姓名 / 邮箱解析成 open_id,或按 open_id 反查姓名 / 部门 / 邮箱 / 联系方式 / 个人状态 / 签名,以及按关键词搜索当前用户可见的机器人 / 智能体(agent)。当用户提到一个名字要下一步发消息 / 排日程,或拿到 open_id 想查具体信息时使用。不负责部门树遍历、按部门列员工、组织架构图,这类需求走原生 OpenAPI。","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli contact --help"}},"isInternal":false,"tokens":1286,"sizeBytes":3760},{"name":"business-analysis.md","path":"skills/lark-doc/references/genres/business-analysis.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/business-analysis.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fbusiness-analysis.md -->","isInternal":false,"tokens":1156,"sizeBytes":3128},{"name":"data-report.md","path":"skills/lark-doc/references/genres/data-report.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/data-report.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fdata-report.md -->","isInternal":false,"tokens":1086,"sizeBytes":2943},{"name":"email.md","path":"skills/lark-doc/references/genres/email.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/email.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Femail.md -->","isInternal":false,"tokens":1461,"sizeBytes":4130},{"name":"execution-plan.md","path":"skills/lark-doc/references/genres/execution-plan.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/execution-plan.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fexecution-plan.md -->","isInternal":false,"tokens":1117,"sizeBytes":2986},{"name":"formal-doc.md","path":"skills/lark-doc/references/genres/formal-doc.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/formal-doc.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fformal-doc.md -->","isInternal":false,"tokens":1684,"sizeBytes":4477},{"name":"meeting-minutes.md","path":"skills/lark-doc/references/genres/meeting-minutes.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/meeting-minutes.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fmeeting-minutes.md -->","isInternal":false,"tokens":885,"sizeBytes":2325},{"name":"memo-brief.md","path":"skills/lark-doc/references/genres/memo-brief.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/memo-brief.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fmemo-brief.md -->","isInternal":false,"tokens":782,"sizeBytes":2063},{"name":"official-redhead.md","path":"skills/lark-doc/references/genres/official-redhead.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/official-redhead.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fofficial-redhead.md -->","isInternal":false,"tokens":2440,"sizeBytes":6249},{"name":"prd.md","path":"skills/lark-doc/references/genres/prd.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/prd.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fprd.md -->","isInternal":false,"tokens":920,"sizeBytes":2531},{"name":"proposal.md","path":"skills/lark-doc/references/genres/proposal.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/proposal.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fproposal.md -->","isInternal":false,"tokens":849,"sizeBytes":2183},{"name":"research-report.md","path":"skills/lark-doc/references/genres/research-report.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/research-report.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fresearch-report.md -->","isInternal":false,"tokens":1289,"sizeBytes":3324},{"name":"retrospective.md","path":"skills/lark-doc/references/genres/retrospective.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/retrospective.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fretrospective.md -->","isInternal":false,"tokens":917,"sizeBytes":2410},{"name":"route-consumer.md","path":"skills/lark-doc/references/genres/route-consumer.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/route-consumer.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-consumer.md -->","isInternal":false,"tokens":1434,"sizeBytes":3910},{"name":"route-creative.md","path":"skills/lark-doc/references/genres/route-creative.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/route-creative.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-creative.md -->","isInternal":false,"tokens":1397,"sizeBytes":3663},{"name":"route-knowledge.md","path":"skills/lark-doc/references/genres/route-knowledge.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/route-knowledge.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-knowledge.md -->","isInternal":false,"tokens":1677,"sizeBytes":4791},{"name":"route-marketing.md","path":"skills/lark-doc/references/genres/route-marketing.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/route-marketing.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-marketing.md -->","isInternal":false,"tokens":1596,"sizeBytes":4347},{"name":"route-media.md","path":"skills/lark-doc/references/genres/route-media.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/route-media.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-media.md -->","isInternal":false,"tokens":1367,"sizeBytes":3771},{"name":"route-opinion.md","path":"skills/lark-doc/references/genres/route-opinion.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/route-opinion.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-opinion.md -->","isInternal":false,"tokens":1390,"sizeBytes":3683},{"name":"route-personal-brand.md","path":"skills/lark-doc/references/genres/route-personal-brand.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/route-personal-brand.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-personal-brand.md -->","isInternal":false,"tokens":1269,"sizeBytes":3437},{"name":"route-platform.md","path":"skills/lark-doc/references/genres/route-platform.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/route-platform.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-platform.md -->","isInternal":false,"tokens":187,"sizeBytes":639},{"name":"route-report.md","path":"skills/lark-doc/references/genres/route-report.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/route-report.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-report.md -->","isInternal":false,"tokens":462,"sizeBytes":1272},{"name":"route-workplace.md","path":"skills/lark-doc/references/genres/route-workplace.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/route-workplace.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Froute-workplace.md -->","isInternal":false,"tokens":1027,"sizeBytes":2899},{"name":"sop-tutorial.md","path":"skills/lark-doc/references/genres/sop-tutorial.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/sop-tutorial.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fsop-tutorial.md -->","isInternal":false,"tokens":1514,"sizeBytes":4064},{"name":"technical-doc.md","path":"skills/lark-doc/references/genres/technical-doc.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/technical-doc.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Ftechnical-doc.md -->","isInternal":false,"tokens":1306,"sizeBytes":3603},{"name":"wechat.md","path":"skills/lark-doc/references/genres/wechat.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/wechat.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fwechat.md -->","isInternal":false,"tokens":1473,"sizeBytes":3982},{"name":"weekly-report.md","path":"skills/lark-doc/references/genres/weekly-report.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/weekly-report.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fweekly-report.md -->","isInternal":false,"tokens":752,"sizeBytes":2051},{"name":"white-paper.md","path":"skills/lark-doc/references/genres/white-paper.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/white-paper.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fwhite-paper.md -->","isInternal":false,"tokens":1223,"sizeBytes":3209},{"name":"xiaohongshu.md","path":"skills/lark-doc/references/genres/xiaohongshu.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/genres/xiaohongshu.md","title":"Genres Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Fgenres%2Fxiaohongshu.md -->","isInternal":false,"tokens":1269,"sizeBytes":3303},{"name":"lark-doc-create-workflow.md","path":"skills/lark-doc/references/lark-doc-create-workflow.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-create-workflow.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-create-workflow.md -->","isInternal":false,"tokens":3221,"sizeBytes":9564},{"name":"lark-doc-create.md","path":"skills/lark-doc/references/lark-doc-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-create.md -->","isInternal":false,"tokens":1093,"sizeBytes":3313},{"name":"lark-doc-fetch.md","path":"skills/lark-doc/references/lark-doc-fetch.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-fetch.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-fetch.md -->","isInternal":false,"tokens":2785,"sizeBytes":7947},{"name":"lark-doc-history.md","path":"skills/lark-doc/references/lark-doc-history.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-history.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-history.md -->","isInternal":false,"tokens":1769,"sizeBytes":5497},{"name":"lark-doc-md.md","path":"skills/lark-doc/references/lark-doc-md.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-md.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-md.md -->","isInternal":false,"tokens":2225,"sizeBytes":5934},{"name":"lark-doc-media-download.md","path":"skills/lark-doc/references/lark-doc-media-download.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-media-download.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-media-download.md -->","isInternal":false,"tokens":731,"sizeBytes":2231},{"name":"lark-doc-media-insert.md","path":"skills/lark-doc/references/lark-doc-media-insert.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-media-insert.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-media-insert.md -->","isInternal":false,"tokens":2292,"sizeBytes":6930},{"name":"lark-doc-media-preview.md","path":"skills/lark-doc/references/lark-doc-media-preview.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-media-preview.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-media-preview.md -->","isInternal":false,"tokens":545,"sizeBytes":1646},{"name":"lark-doc-mindnote.md","path":"skills/lark-doc/references/lark-doc-mindnote.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-mindnote.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-mindnote.md -->","isInternal":false,"tokens":1769,"sizeBytes":5546},{"name":"lark-doc-resource-cover.md","path":"skills/lark-doc/references/lark-doc-resource-cover.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-resource-cover.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-resource-cover.md -->","isInternal":false,"tokens":1367,"sizeBytes":4184},{"name":"lark-doc-script.md","path":"skills/lark-doc/references/lark-doc-script.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-script.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-script.md -->","isInternal":false,"tokens":1710,"sizeBytes":5220},{"name":"lark-doc-update.md","path":"skills/lark-doc/references/lark-doc-update.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-update.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-update.md -->","isInternal":false,"tokens":2577,"sizeBytes":7468},{"name":"lark-doc-whiteboard.md","path":"skills/lark-doc/references/lark-doc-whiteboard.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-whiteboard.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-whiteboard.md -->","isInternal":false,"tokens":3125,"sizeBytes":8926},{"name":"lark-doc-xml-extended-blocks.md","path":"skills/lark-doc/references/lark-doc-xml-extended-blocks.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-xml-extended-blocks.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-xml-extended-blocks.md -->","isInternal":false,"tokens":1485,"sizeBytes":4444},{"name":"lark-doc-xml.md","path":"skills/lark-doc/references/lark-doc-xml.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/references/lark-doc-xml.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2Freferences%2Flark-doc-xml.md -->","isInternal":false,"tokens":2014,"sizeBytes":5467},{"name":"SKILL.md","path":"skills/lark-doc/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-doc/SKILL.md","title":"lark-doc","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-doc%2FSKILL.md -->","frontmatter":{"name":"lark-doc","description":"飞书云文档（Docx / Wiki）内容操作：读取、创建、编辑文档，插入或下载图片附件，以及操作思维笔记。用户提供文档 URL/token（包括 doubao.com 的 /docx/、/wiki/）时使用；按 URL 路径/token 而非域名路由；`/page/<token>` 是妙搭应用，非飞书云文档。文档内嵌资源按读取参考中的统一规则分流。独立评论操作走 lark-drive；随正文读取评论使用 docs +fetch。表格或 Base 内部数据操作不在本 skill。","metadata":{"requires":{"bins":["lark-cli"],"skills":["lark-shared"]},"cliHelp":"lark-cli docs --help;lark-cli mindnotes --help"}},"isInternal":false,"tokens":1351,"sizeBytes":4247},{"name":"lark-drive-add-comment.md","path":"skills/lark-drive/references/lark-drive-add-comment.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-add-comment.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-add-comment.md -->","isInternal":false,"tokens":4019,"sizeBytes":12190},{"name":"lark-drive-add-reply.md","path":"skills/lark-drive/references/lark-drive-add-reply.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-add-reply.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-add-reply.md -->","isInternal":false,"tokens":838,"sizeBytes":2554},{"name":"lark-drive-apply-permission.md","path":"skills/lark-drive/references/lark-drive-apply-permission.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-apply-permission.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-apply-permission.md -->","isInternal":false,"tokens":1303,"sizeBytes":3706},{"name":"lark-drive-batch-query-comments.md","path":"skills/lark-drive/references/lark-drive-batch-query-comments.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-batch-query-comments.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-batch-query-comments.md -->","isInternal":false,"tokens":836,"sizeBytes":2503},{"name":"lark-drive-comment-content.md","path":"skills/lark-drive/references/lark-drive-comment-content.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-comment-content.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-comment-content.md -->","isInternal":false,"tokens":909,"sizeBytes":2654},{"name":"lark-drive-comment-location.md","path":"skills/lark-drive/references/lark-drive-comment-location.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-comment-location.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-comment-location.md -->","isInternal":false,"tokens":3477,"sizeBytes":10982},{"name":"lark-drive-copy.md","path":"skills/lark-drive/references/lark-drive-copy.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-copy.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-copy.md -->","isInternal":false,"tokens":1411,"sizeBytes":4035},{"name":"lark-drive-cover.md","path":"skills/lark-drive/references/lark-drive-cover.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-cover.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-cover.md -->","isInternal":false,"tokens":866,"sizeBytes":2444},{"name":"lark-drive-create-folder.md","path":"skills/lark-drive/references/lark-drive-create-folder.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-create-folder.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-create-folder.md -->","isInternal":false,"tokens":1214,"sizeBytes":3704},{"name":"lark-drive-create-shortcut.md","path":"skills/lark-drive/references/lark-drive-create-shortcut.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-create-shortcut.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-create-shortcut.md -->","isInternal":false,"tokens":1513,"sizeBytes":4379},{"name":"lark-drive-delete-reply.md","path":"skills/lark-drive/references/lark-drive-delete-reply.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-delete-reply.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-delete-reply.md -->","isInternal":false,"tokens":851,"sizeBytes":2464},{"name":"lark-drive-delete.md","path":"skills/lark-drive/references/lark-drive-delete.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-delete.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-delete.md -->","isInternal":false,"tokens":1553,"sizeBytes":4655},{"name":"lark-drive-download.md","path":"skills/lark-drive/references/lark-drive-download.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-download.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-download.md -->","isInternal":false,"tokens":921,"sizeBytes":2873},{"name":"lark-drive-export-download.md","path":"skills/lark-drive/references/lark-drive-export-download.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-export-download.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-export-download.md -->","isInternal":false,"tokens":489,"sizeBytes":1540},{"name":"lark-drive-export.md","path":"skills/lark-drive/references/lark-drive-export.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-export.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-export.md -->","isInternal":false,"tokens":2847,"sizeBytes":8331},{"name":"lark-drive-files-list.md","path":"skills/lark-drive/references/lark-drive-files-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-files-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-files-list.md -->","isInternal":false,"tokens":3348,"sizeBytes":10472},{"name":"lark-drive-import.md","path":"skills/lark-drive/references/lark-drive-import.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-import.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-import.md -->","isInternal":false,"tokens":3723,"sizeBytes":11104},{"name":"lark-drive-inspect.md","path":"skills/lark-drive/references/lark-drive-inspect.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-inspect.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-inspect.md -->","isInternal":false,"tokens":730,"sizeBytes":2136},{"name":"lark-drive-list-comments.md","path":"skills/lark-drive/references/lark-drive-list-comments.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-list-comments.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-list-comments.md -->","isInternal":false,"tokens":2005,"sizeBytes":6056},{"name":"lark-drive-list-replies.md","path":"skills/lark-drive/references/lark-drive-list-replies.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-list-replies.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-list-replies.md -->","isInternal":false,"tokens":901,"sizeBytes":2644},{"name":"lark-drive-member-add.md","path":"skills/lark-drive/references/lark-drive-member-add.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-member-add.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-member-add.md -->","isInternal":false,"tokens":1431,"sizeBytes":5260},{"name":"lark-drive-member-list.md","path":"skills/lark-drive/references/lark-drive-member-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-member-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-member-list.md -->","isInternal":false,"tokens":1032,"sizeBytes":3122},{"name":"lark-drive-member-remove.md","path":"skills/lark-drive/references/lark-drive-member-remove.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-member-remove.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-member-remove.md -->","isInternal":false,"tokens":1044,"sizeBytes":2996},{"name":"lark-drive-move.md","path":"skills/lark-drive/references/lark-drive-move.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-move.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-move.md -->","isInternal":false,"tokens":1754,"sizeBytes":5088},{"name":"lark-drive-permission-get-setting.md","path":"skills/lark-drive/references/lark-drive-permission-get-setting.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-permission-get-setting.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-permission-get-setting.md -->","isInternal":false,"tokens":624,"sizeBytes":1881},{"name":"lark-drive-permission-guide.md","path":"skills/lark-drive/references/lark-drive-permission-guide.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-permission-guide.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-permission-guide.md -->","isInternal":false,"tokens":1265,"sizeBytes":3829},{"name":"lark-drive-preview.md","path":"skills/lark-drive/references/lark-drive-preview.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-preview.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-preview.md -->","isInternal":false,"tokens":1545,"sizeBytes":4668},{"name":"lark-drive-pull.md","path":"skills/lark-drive/references/lark-drive-pull.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-pull.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-pull.md -->","isInternal":false,"tokens":3474,"sizeBytes":9914},{"name":"lark-drive-push.md","path":"skills/lark-drive/references/lark-drive-push.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-push.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-push.md -->","isInternal":false,"tokens":6322,"sizeBytes":18181},{"name":"lark-drive-react-reply.md","path":"skills/lark-drive/references/lark-drive-react-reply.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-react-reply.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-react-reply.md -->","isInternal":false,"tokens":1004,"sizeBytes":2970},{"name":"lark-drive-reactions.md","path":"skills/lark-drive/references/lark-drive-reactions.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-reactions.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-reactions.md -->","isInternal":false,"tokens":2501,"sizeBytes":7290},{"name":"lark-drive-resolve-comment.md","path":"skills/lark-drive/references/lark-drive-resolve-comment.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-resolve-comment.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-resolve-comment.md -->","isInternal":false,"tokens":613,"sizeBytes":1776},{"name":"lark-drive-restore-comment.md","path":"skills/lark-drive/references/lark-drive-restore-comment.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-restore-comment.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-restore-comment.md -->","isInternal":false,"tokens":728,"sizeBytes":2122},{"name":"lark-drive-search.md","path":"skills/lark-drive/references/lark-drive-search.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-search.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-search.md -->","isInternal":false,"tokens":8268,"sizeBytes":22955},{"name":"lark-drive-secure-label.md","path":"skills/lark-drive/references/lark-drive-secure-label.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-secure-label.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-secure-label.md -->","isInternal":false,"tokens":676,"sizeBytes":2002},{"name":"lark-drive-status.md","path":"skills/lark-drive/references/lark-drive-status.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-status.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-status.md -->","isInternal":false,"tokens":2563,"sizeBytes":7510},{"name":"lark-drive-task-result.md","path":"skills/lark-drive/references/lark-drive-task-result.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-task-result.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-task-result.md -->","isInternal":false,"tokens":4356,"sizeBytes":13632},{"name":"lark-drive-update-reply.md","path":"skills/lark-drive/references/lark-drive-update-reply.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-update-reply.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-update-reply.md -->","isInternal":false,"tokens":805,"sizeBytes":2444},{"name":"lark-drive-update-title.md","path":"skills/lark-drive/references/lark-drive-update-title.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-update-title.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-update-title.md -->","isInternal":false,"tokens":1252,"sizeBytes":3407},{"name":"lark-drive-upload.md","path":"skills/lark-drive/references/lark-drive-upload.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-upload.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-upload.md -->","isInternal":false,"tokens":1686,"sizeBytes":5242},{"name":"lark-drive-version-delete.md","path":"skills/lark-drive/references/lark-drive-version-delete.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-version-delete.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-version-delete.md -->","isInternal":false,"tokens":354,"sizeBytes":1047},{"name":"lark-drive-version-get.md","path":"skills/lark-drive/references/lark-drive-version-get.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-version-get.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-version-get.md -->","isInternal":false,"tokens":684,"sizeBytes":2067},{"name":"lark-drive-version-history.md","path":"skills/lark-drive/references/lark-drive-version-history.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-version-history.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-version-history.md -->","isInternal":false,"tokens":629,"sizeBytes":1915},{"name":"lark-drive-version-revert.md","path":"skills/lark-drive/references/lark-drive-version-revert.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-version-revert.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-version-revert.md -->","isInternal":false,"tokens":332,"sizeBytes":982},{"name":"lark-drive-workflow-knowledge-organize-analysis.md","path":"skills/lark-drive/references/lark-drive-workflow-knowledge-organize-analysis.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-knowledge-organize-analysis.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-analysis.md -->","isInternal":false,"tokens":3043,"sizeBytes":12951},{"name":"lark-drive-workflow-knowledge-organize-discovery.md","path":"skills/lark-drive/references/lark-drive-workflow-knowledge-organize-discovery.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-knowledge-organize-discovery.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-discovery.md -->","isInternal":false,"tokens":4450,"sizeBytes":19364},{"name":"lark-drive-workflow-knowledge-organize-execution.md","path":"skills/lark-drive/references/lark-drive-workflow-knowledge-organize-execution.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-knowledge-organize-execution.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-execution.md -->","isInternal":false,"tokens":2130,"sizeBytes":9576},{"name":"lark-drive-workflow-knowledge-organize-planning.md","path":"skills/lark-drive/references/lark-drive-workflow-knowledge-organize-planning.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-knowledge-organize-planning.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-planning.md -->","isInternal":false,"tokens":3538,"sizeBytes":14529},{"name":"lark-drive-workflow-knowledge-organize-rollback.md","path":"skills/lark-drive/references/lark-drive-workflow-knowledge-organize-rollback.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-knowledge-organize-rollback.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize-rollback.md -->","isInternal":false,"tokens":2563,"sizeBytes":11075},{"name":"lark-drive-workflow-knowledge-organize.md","path":"skills/lark-drive/references/lark-drive-workflow-knowledge-organize.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-knowledge-organize.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-knowledge-organize.md -->","isInternal":false,"tokens":4784,"sizeBytes":20230},{"name":"lark-drive-workflow-permission-governance-commands.md","path":"skills/lark-drive/references/lark-drive-workflow-permission-governance-commands.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-permission-governance-commands.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-permission-governance-commands.md -->","isInternal":false,"tokens":1941,"sizeBytes":6512},{"name":"lark-drive-workflow-permission-governance-outputs.md","path":"skills/lark-drive/references/lark-drive-workflow-permission-governance-outputs.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-permission-governance-outputs.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-permission-governance-outputs.md -->","isInternal":false,"tokens":8549,"sizeBytes":28399},{"name":"lark-drive-workflow-permission-governance.md","path":"skills/lark-drive/references/lark-drive-workflow-permission-governance.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-permission-governance.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-permission-governance.md -->","isInternal":false,"tokens":8196,"sizeBytes":26254},{"name":"lark-drive-workflow-topic-move-collector-execute.md","path":"skills/lark-drive/references/lark-drive-workflow-topic-move-collector-execute.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-execute.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-execute.md -->","isInternal":false,"tokens":4343,"sizeBytes":13818},{"name":"lark-drive-workflow-topic-move-collector-recall.md","path":"skills/lark-drive/references/lark-drive-workflow-topic-move-collector-recall.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-recall.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-recall.md -->","isInternal":false,"tokens":3307,"sizeBytes":9519},{"name":"lark-drive-workflow-topic-move-collector-resolve-verify.md","path":"skills/lark-drive/references/lark-drive-workflow-topic-move-collector-resolve-verify.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-resolve-verify.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-resolve-verify.md -->","isInternal":false,"tokens":4349,"sizeBytes":13937},{"name":"lark-drive-workflow-topic-move-collector-review-plan.md","path":"skills/lark-drive/references/lark-drive-workflow-topic-move-collector-review-plan.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-review-plan.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-review-plan.md -->","isInternal":false,"tokens":4063,"sizeBytes":12808},{"name":"lark-drive-workflow-topic-move-collector-setup.md","path":"skills/lark-drive/references/lark-drive-workflow-topic-move-collector-setup.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-setup.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector-setup.md -->","isInternal":false,"tokens":2628,"sizeBytes":8471},{"name":"lark-drive-workflow-topic-move-collector.md","path":"skills/lark-drive/references/lark-drive-workflow-topic-move-collector.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow-topic-move-collector.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow-topic-move-collector.md -->","isInternal":false,"tokens":5238,"sizeBytes":16146},{"name":"lark-drive-workflow.md","path":"skills/lark-drive/references/lark-drive-workflow.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/references/lark-drive-workflow.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2Freferences%2Flark-drive-workflow.md -->","isInternal":false,"tokens":2692,"sizeBytes":8540},{"name":"SKILL.md","path":"skills/lark-drive/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-drive/SKILL.md","title":"lark-drive","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-drive%2FSKILL.md -->","frontmatter":{"name":"lark-drive","version":"1.0.0","description":"飞书云空间（云盘/云存储）：管理 Drive 文件和文件夹，包含上传/下载、创建文件夹、复制/移动/删除、查看元数据、查询权限设置、评论/权限/订阅、标题、版本、飞书文档密级标签（secure labels）和本地文件导入。用户需要整理云盘目录、处理云空间资源 URL/token、判断链接类型/真实 token/标题，或导入 Word/Markdown/Excel/CSV/PPTX/.base 为 docx/sheet/bitable/slides 时使用；doubao.com 云空间 URL/token 也按资源路径和 token 路由，不回退 WebFetch。不负责：文档内容编辑（走 lark-doc）、表格/Base 表内数据操作（走 lark-sheets/lark-base）、知识空间节点/成员管理（走 lark-wiki）、原生 Markdown 文件读写/patch/diff（走 lark-markdown）。","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli drive --help"}},"isInternal":false,"tokens":7870,"sizeBytes":25249},{"name":"lark-event-application.md","path":"skills/lark-event/references/lark-event-application.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-event/references/lark-event-application.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-application.md -->","isInternal":false,"tokens":318,"sizeBytes":1288},{"name":"lark-event-approval.md","path":"skills/lark-event/references/lark-event-approval.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-event/references/lark-event-approval.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-approval.md -->","isInternal":false,"tokens":2079,"sizeBytes":9000},{"name":"lark-event-im.md","path":"skills/lark-event/references/lark-event-im.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-event/references/lark-event-im.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-im.md -->","isInternal":false,"tokens":1235,"sizeBytes":4600},{"name":"lark-event-minutes.md","path":"skills/lark-event/references/lark-event-minutes.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-event/references/lark-event-minutes.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-minutes.md -->","isInternal":false,"tokens":588,"sizeBytes":2368},{"name":"lark-event-task.md","path":"skills/lark-event/references/lark-event-task.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-event/references/lark-event-task.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-task.md -->","isInternal":false,"tokens":651,"sizeBytes":2677},{"name":"lark-event-vc.md","path":"skills/lark-event/references/lark-event-vc.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-event/references/lark-event-vc.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-vc.md -->","isInternal":false,"tokens":1347,"sizeBytes":5128},{"name":"lark-event-whiteboard.md","path":"skills/lark-event/references/lark-event-whiteboard.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-event/references/lark-event-whiteboard.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2Freferences%2Flark-event-whiteboard.md -->","isInternal":false,"tokens":932,"sizeBytes":3637},{"name":"SKILL.md","path":"skills/lark-event/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-event/SKILL.md","title":"lark-event","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-event%2FSKILL.md -->","frontmatter":{"name":"lark-event","version":"1.0.0","description":"Lark/Feishu real-time event listening / subscribing / consuming: stream events as NDJSON via `lark-cli event consume <EventKey>` (covers IM messages/reactions/chat changes, Approval status changes, Task updates, VC meeting started/joined/ended, Minutes generated, Whiteboard updated, etc.). Use for Lark bots, real-time message processing, long-running subscribers, streaming webhook/push handlers. Supports `--max-events` / `--timeout` bounded runs and a stderr ready-marker contract — designed for AI agents running as subprocesses.","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli event --help"}},"isInternal":false,"tokens":2812,"sizeBytes":11475},{"name":"card-2.0-schema.md","path":"skills/lark-im/references/card/card-2.0-schema.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/card-2.0-schema.md","title":"Card Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcard-2.0-schema.md -->","isInternal":false,"tokens":2083,"sizeBytes":6154},{"name":"button.md","path":"skills/lark-im/references/card/components/button.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/button.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fbutton.md -->","isInternal":false,"tokens":1052,"sizeBytes":2827},{"name":"chart.md","path":"skills/lark-im/references/card/components/chart.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/chart.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fchart.md -->","isInternal":false,"tokens":847,"sizeBytes":2264},{"name":"checker.md","path":"skills/lark-im/references/card/components/checker.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/checker.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fchecker.md -->","isInternal":false,"tokens":681,"sizeBytes":1899},{"name":"collapsible_panel.md","path":"skills/lark-im/references/card/components/collapsible_panel.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/collapsible_panel.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fcollapsible_panel.md -->","isInternal":false,"tokens":673,"sizeBytes":1797},{"name":"column_set.md","path":"skills/lark-im/references/card/components/column_set.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/column_set.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fcolumn_set.md -->","isInternal":false,"tokens":959,"sizeBytes":2595},{"name":"date_picker.md","path":"skills/lark-im/references/card/components/date_picker.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/date_picker.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fdate_picker.md -->","isInternal":false,"tokens":589,"sizeBytes":1636},{"name":"div.md","path":"skills/lark-im/references/card/components/div.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/div.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fdiv.md -->","isInternal":false,"tokens":634,"sizeBytes":1757},{"name":"form.md","path":"skills/lark-im/references/card/components/form.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/form.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fform.md -->","isInternal":false,"tokens":811,"sizeBytes":2269},{"name":"header.md","path":"skills/lark-im/references/card/components/header.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/header.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fheader.md -->","isInternal":false,"tokens":627,"sizeBytes":1644},{"name":"hr.md","path":"skills/lark-im/references/card/components/hr.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/hr.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fhr.md -->","isInternal":false,"tokens":180,"sizeBytes":425},{"name":"img_combination.md","path":"skills/lark-im/references/card/components/img_combination.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/img_combination.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fimg_combination.md -->","isInternal":false,"tokens":411,"sizeBytes":1046},{"name":"img.md","path":"skills/lark-im/references/card/components/img.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/img.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fimg.md -->","isInternal":false,"tokens":518,"sizeBytes":1384},{"name":"input.md","path":"skills/lark-im/references/card/components/input.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/input.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Finput.md -->","isInternal":false,"tokens":720,"sizeBytes":2063},{"name":"interactive_container.md","path":"skills/lark-im/references/card/components/interactive_container.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/interactive_container.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Finteractive_container.md -->","isInternal":false,"tokens":820,"sizeBytes":2257},{"name":"markdown.md","path":"skills/lark-im/references/card/components/markdown.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/markdown.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fmarkdown.md -->","isInternal":false,"tokens":1245,"sizeBytes":3283},{"name":"multi_select_person.md","path":"skills/lark-im/references/card/components/multi_select_person.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/multi_select_person.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fmulti_select_person.md -->","isInternal":false,"tokens":564,"sizeBytes":1595},{"name":"multi_select_static.md","path":"skills/lark-im/references/card/components/multi_select_static.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/multi_select_static.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fmulti_select_static.md -->","isInternal":false,"tokens":600,"sizeBytes":1681},{"name":"overflow.md","path":"skills/lark-im/references/card/components/overflow.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/overflow.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Foverflow.md -->","isInternal":false,"tokens":550,"sizeBytes":1530},{"name":"person_list.md","path":"skills/lark-im/references/card/components/person_list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/person_list.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fperson_list.md -->","isInternal":false,"tokens":437,"sizeBytes":1179},{"name":"person.md","path":"skills/lark-im/references/card/components/person.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/person.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fperson.md -->","isInternal":false,"tokens":326,"sizeBytes":907},{"name":"picker_datetime.md","path":"skills/lark-im/references/card/components/picker_datetime.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/picker_datetime.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fpicker_datetime.md -->","isInternal":false,"tokens":563,"sizeBytes":1583},{"name":"picker_time.md","path":"skills/lark-im/references/card/components/picker_time.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/picker_time.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fpicker_time.md -->","isInternal":false,"tokens":545,"sizeBytes":1527},{"name":"recycling_container.md","path":"skills/lark-im/references/card/components/recycling_container.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/recycling_container.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Frecycling_container.md -->","isInternal":false,"tokens":546,"sizeBytes":1570},{"name":"select_img.md","path":"skills/lark-im/references/card/components/select_img.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/select_img.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fselect_img.md -->","isInternal":false,"tokens":724,"sizeBytes":1973},{"name":"select_person.md","path":"skills/lark-im/references/card/components/select_person.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/select_person.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fselect_person.md -->","isInternal":false,"tokens":544,"sizeBytes":1518},{"name":"select_static.md","path":"skills/lark-im/references/card/components/select_static.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/select_static.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Fselect_static.md -->","isInternal":false,"tokens":673,"sizeBytes":1890},{"name":"table.md","path":"skills/lark-im/references/card/components/table.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/components/table.md","title":"Components Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fcomponents%2Ftable.md -->","isInternal":false,"tokens":809,"sizeBytes":2138},{"name":"lark-im-card-create.md","path":"skills/lark-im/references/card/lark-im-card-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/lark-im-card-create.md","title":"Card Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Flark-im-card-create.md -->","isInternal":false,"tokens":4006,"sizeBytes":11047},{"name":"lark-im-card-style.md","path":"skills/lark-im/references/card/lark-im-card-style.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/lark-im-card-style.md","title":"Card Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Flark-im-card-style.md -->","isInternal":false,"tokens":7053,"sizeBytes":18707},{"name":"colors.md","path":"skills/lark-im/references/card/resource/colors.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/resource/colors.md","title":"Resource Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fresource%2Fcolors.md -->","isInternal":false,"tokens":565,"sizeBytes":1452},{"name":"icons.md","path":"skills/lark-im/references/card/resource/icons.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/card/resource/icons.md","title":"Resource Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Fcard%2Fresource%2Ficons.md -->","isInternal":false,"tokens":838,"sizeBytes":2327},{"name":"lark-im-card-action-reply.md","path":"skills/lark-im/references/lark-im-card-action-reply.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-card-action-reply.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-card-action-reply.md -->","isInternal":false,"tokens":2393,"sizeBytes":9556},{"name":"lark-im-chat-create.md","path":"skills/lark-im/references/lark-im-chat-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-chat-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-create.md -->","isInternal":false,"tokens":2125,"sizeBytes":7999},{"name":"lark-im-chat-identity.md","path":"skills/lark-im/references/lark-im-chat-identity.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-chat-identity.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-identity.md -->","isInternal":false,"tokens":712,"sizeBytes":3210},{"name":"lark-im-chat-list.md","path":"skills/lark-im/references/lark-im-chat-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-chat-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-list.md -->","isInternal":false,"tokens":2545,"sizeBytes":9144},{"name":"lark-im-chat-members-list.md","path":"skills/lark-im/references/lark-im-chat-members-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-chat-members-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-members-list.md -->","isInternal":false,"tokens":1438,"sizeBytes":5258},{"name":"lark-im-chat-messages-list.md","path":"skills/lark-im/references/lark-im-chat-messages-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-chat-messages-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-messages-list.md -->","isInternal":false,"tokens":2898,"sizeBytes":11378},{"name":"lark-im-chat-search.md","path":"skills/lark-im/references/lark-im-chat-search.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-chat-search.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-search.md -->","isInternal":false,"tokens":2159,"sizeBytes":8362},{"name":"lark-im-chat-update.md","path":"skills/lark-im/references/lark-im-chat-update.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-chat-update.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-chat-update.md -->","isInternal":false,"tokens":827,"sizeBytes":3284},{"name":"lark-im-feed-group-list-item.md","path":"skills/lark-im/references/lark-im-feed-group-list-item.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-feed-group-list-item.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-group-list-item.md -->","isInternal":false,"tokens":888,"sizeBytes":3214},{"name":"lark-im-feed-group-list.md","path":"skills/lark-im/references/lark-im-feed-group-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-feed-group-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-group-list.md -->","isInternal":false,"tokens":737,"sizeBytes":2772},{"name":"lark-im-feed-group-query-item.md","path":"skills/lark-im/references/lark-im-feed-group-query-item.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-feed-group-query-item.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-group-query-item.md -->","isInternal":false,"tokens":649,"sizeBytes":2391},{"name":"lark-im-feed-groups.md","path":"skills/lark-im/references/lark-im-feed-groups.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-feed-groups.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-groups.md -->","isInternal":false,"tokens":4834,"sizeBytes":18667},{"name":"lark-im-feed-shortcut-create.md","path":"skills/lark-im/references/lark-im-feed-shortcut-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-feed-shortcut-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-shortcut-create.md -->","isInternal":false,"tokens":1099,"sizeBytes":4272},{"name":"lark-im-feed-shortcut-list.md","path":"skills/lark-im/references/lark-im-feed-shortcut-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-feed-shortcut-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-shortcut-list.md -->","isInternal":false,"tokens":1317,"sizeBytes":5106},{"name":"lark-im-feed-shortcut-remove.md","path":"skills/lark-im/references/lark-im-feed-shortcut-remove.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-feed-shortcut-remove.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-feed-shortcut-remove.md -->","isInternal":false,"tokens":542,"sizeBytes":2103},{"name":"lark-im-flag-cancel.md","path":"skills/lark-im/references/lark-im-flag-cancel.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-flag-cancel.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-flag-cancel.md -->","isInternal":false,"tokens":732,"sizeBytes":2964},{"name":"lark-im-flag-create.md","path":"skills/lark-im/references/lark-im-flag-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-flag-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-flag-create.md -->","isInternal":false,"tokens":702,"sizeBytes":2710},{"name":"lark-im-flag-list.md","path":"skills/lark-im/references/lark-im-flag-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-flag-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-flag-list.md -->","isInternal":false,"tokens":1197,"sizeBytes":4753},{"name":"lark-im-message-enrichment.md","path":"skills/lark-im/references/lark-im-message-enrichment.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-message-enrichment.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-message-enrichment.md -->","isInternal":false,"tokens":1632,"sizeBytes":7075},{"name":"lark-im-message-read-status.md","path":"skills/lark-im/references/lark-im-message-read-status.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-message-read-status.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-message-read-status.md -->","isInternal":false,"tokens":1052,"sizeBytes":4379},{"name":"lark-im-messages-edit.md","path":"skills/lark-im/references/lark-im-messages-edit.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-messages-edit.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-edit.md -->","isInternal":false,"tokens":1609,"sizeBytes":6561},{"name":"lark-im-messages-mget.md","path":"skills/lark-im/references/lark-im-messages-mget.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-messages-mget.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-mget.md -->","isInternal":false,"tokens":1703,"sizeBytes":6962},{"name":"lark-im-messages-reply.md","path":"skills/lark-im/references/lark-im-messages-reply.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-messages-reply.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-reply.md -->","isInternal":false,"tokens":4059,"sizeBytes":17470},{"name":"lark-im-messages-resources-download.md","path":"skills/lark-im/references/lark-im-messages-resources-download.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-messages-resources-download.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-resources-download.md -->","isInternal":false,"tokens":1043,"sizeBytes":4195},{"name":"lark-im-messages-search.md","path":"skills/lark-im/references/lark-im-messages-search.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-messages-search.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-search.md -->","isInternal":false,"tokens":3516,"sizeBytes":13788},{"name":"lark-im-messages-send.md","path":"skills/lark-im/references/lark-im-messages-send.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-messages-send.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-messages-send.md -->","isInternal":false,"tokens":4714,"sizeBytes":19799},{"name":"lark-im-reactions.md","path":"skills/lark-im/references/lark-im-reactions.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-reactions.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-reactions.md -->","isInternal":false,"tokens":2964,"sizeBytes":10559},{"name":"lark-im-threads-messages-list.md","path":"skills/lark-im/references/lark-im-threads-messages-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/references/lark-im-threads-messages-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2Freferences%2Flark-im-threads-messages-list.md -->","isInternal":false,"tokens":1639,"sizeBytes":6576},{"name":"SKILL.md","path":"skills/lark-im/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-im/SKILL.md","title":"lark-im","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-im%2FSKILL.md -->","frontmatter":{"name":"lark-im","version":"1.0.0","description":"飞书即时通讯：收发消息和管理群聊。发送和回复消息、搜索聊天记录、管理群聊成员、上传下载图片和文件、管理表情回复、发送应用内/短信/电话加急、发送和处理交互卡片（Interactive Card）、监听卡片按钮回调（card.action.trigger）。当用户需要发消息、查看或搜索聊天记录、下载聊天中的文件、查看群成员、搜索群、创建群聊或话题群、管理标记数据、管理 Feed 置顶（添加/移除/查询置顶会话）、管理标签数据、处理卡片回调时使用。","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli im --help"}},"isInternal":false,"tokens":6516,"sizeBytes":25322},{"name":"lark-mail-calendar-invite.md","path":"skills/lark-mail/references/lark-mail-calendar-invite.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-calendar-invite.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-calendar-invite.md -->","isInternal":false,"tokens":640,"sizeBytes":1777},{"name":"lark-mail-decline-receipt.md","path":"skills/lark-mail/references/lark-mail-decline-receipt.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-decline-receipt.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-decline-receipt.md -->","isInternal":false,"tokens":1373,"sizeBytes":4097},{"name":"lark-mail-draft-create.md","path":"skills/lark-mail/references/lark-mail-draft-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-draft-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-draft-create.md -->","isInternal":false,"tokens":2982,"sizeBytes":8691},{"name":"lark-mail-draft-edit.md","path":"skills/lark-mail/references/lark-mail-draft-edit.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-draft-edit.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-draft-edit.md -->","isInternal":false,"tokens":6192,"sizeBytes":18245},{"name":"lark-mail-forward.md","path":"skills/lark-mail/references/lark-mail-forward.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-forward.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-forward.md -->","isInternal":false,"tokens":4355,"sizeBytes":13162},{"name":"lark-mail-html.md","path":"skills/lark-mail/references/lark-mail-html.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-html.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-html.md -->","isInternal":false,"tokens":5599,"sizeBytes":16618},{"name":"lark-mail-lint-html.md","path":"skills/lark-mail/references/lark-mail-lint-html.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-lint-html.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-lint-html.md -->","isInternal":false,"tokens":2518,"sizeBytes":7430},{"name":"lark-mail-message-modify.md","path":"skills/lark-mail/references/lark-mail-message-modify.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-message-modify.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-message-modify.md -->","isInternal":false,"tokens":589,"sizeBytes":2345},{"name":"lark-mail-message-trash.md","path":"skills/lark-mail/references/lark-mail-message-trash.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-message-trash.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-message-trash.md -->","isInternal":false,"tokens":402,"sizeBytes":1636},{"name":"lark-mail-message.md","path":"skills/lark-mail/references/lark-mail-message.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-message.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-message.md -->","isInternal":false,"tokens":3359,"sizeBytes":10210},{"name":"lark-mail-messages.md","path":"skills/lark-mail/references/lark-mail-messages.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-messages.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-messages.md -->","isInternal":false,"tokens":1518,"sizeBytes":4489},{"name":"lark-mail-recall.md","path":"skills/lark-mail/references/lark-mail-recall.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-recall.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-recall.md -->","isInternal":false,"tokens":740,"sizeBytes":2473},{"name":"lark-mail-recipient-search.md","path":"skills/lark-mail/references/lark-mail-recipient-search.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-recipient-search.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-recipient-search.md -->","isInternal":false,"tokens":783,"sizeBytes":2312},{"name":"lark-mail-reply-all.md","path":"skills/lark-mail/references/lark-mail-reply-all.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-reply-all.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-reply-all.md -->","isInternal":false,"tokens":4012,"sizeBytes":12205},{"name":"lark-mail-reply.md","path":"skills/lark-mail/references/lark-mail-reply.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-reply.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-reply.md -->","isInternal":false,"tokens":4581,"sizeBytes":13823},{"name":"lark-mail-rules.md","path":"skills/lark-mail/references/lark-mail-rules.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-rules.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-rules.md -->","isInternal":false,"tokens":1572,"sizeBytes":4833},{"name":"lark-mail-send-as.md","path":"skills/lark-mail/references/lark-mail-send-as.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-send-as.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-send-as.md -->","isInternal":false,"tokens":528,"sizeBytes":1665},{"name":"lark-mail-send-receipt.md","path":"skills/lark-mail/references/lark-mail-send-receipt.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-send-receipt.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-send-receipt.md -->","isInternal":false,"tokens":2146,"sizeBytes":6188},{"name":"lark-mail-send-status.md","path":"skills/lark-mail/references/lark-mail-send-status.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-send-status.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-send-status.md -->","isInternal":false,"tokens":539,"sizeBytes":1663},{"name":"lark-mail-send.md","path":"skills/lark-mail/references/lark-mail-send.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-send.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-send.md -->","isInternal":false,"tokens":4437,"sizeBytes":13400},{"name":"lark-mail-share-to-chat.md","path":"skills/lark-mail/references/lark-mail-share-to-chat.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-share-to-chat.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-share-to-chat.md -->","isInternal":false,"tokens":1045,"sizeBytes":3064},{"name":"lark-mail-signature.md","path":"skills/lark-mail/references/lark-mail-signature.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-signature.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-signature.md -->","isInternal":false,"tokens":907,"sizeBytes":2737},{"name":"lark-mail-template-create.md","path":"skills/lark-mail/references/lark-mail-template-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-template-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-template-create.md -->","isInternal":false,"tokens":2142,"sizeBytes":6481},{"name":"lark-mail-template-update.md","path":"skills/lark-mail/references/lark-mail-template-update.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-template-update.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-template-update.md -->","isInternal":false,"tokens":2233,"sizeBytes":6766},{"name":"lark-mail-template.md","path":"skills/lark-mail/references/lark-mail-template.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-template.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-template.md -->","isInternal":false,"tokens":1333,"sizeBytes":3973},{"name":"lark-mail-thread-modify.md","path":"skills/lark-mail/references/lark-mail-thread-modify.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-thread-modify.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-thread-modify.md -->","isInternal":false,"tokens":1171,"sizeBytes":3552},{"name":"lark-mail-thread-trash.md","path":"skills/lark-mail/references/lark-mail-thread-trash.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-thread-trash.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-thread-trash.md -->","isInternal":false,"tokens":923,"sizeBytes":2732},{"name":"lark-mail-thread.md","path":"skills/lark-mail/references/lark-mail-thread.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-thread.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-thread.md -->","isInternal":false,"tokens":1411,"sizeBytes":4348},{"name":"lark-mail-triage.md","path":"skills/lark-mail/references/lark-mail-triage.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-triage.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-triage.md -->","isInternal":false,"tokens":2334,"sizeBytes":6915},{"name":"lark-mail-watch.md","path":"skills/lark-mail/references/lark-mail-watch.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/references/lark-mail-watch.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2Freferences%2Flark-mail-watch.md -->","isInternal":false,"tokens":1540,"sizeBytes":4951},{"name":"SKILL.md","path":"skills/lark-mail/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-mail/SKILL.md","title":"lark-mail","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-mail%2FSKILL.md -->","frontmatter":{"name":"lark-mail","version":"1.0.0","description":"飞书邮箱：Use when user mentions 起草邮件、写邮件、草稿、发送/回复/转发邮件、查阅邮件、看邮件、搜索邮件、邮件文件夹、邮件标签、邮件联系人、监听新邮件、邮件收信规则等；use for mail/email intent only. Do not use for docs/sheets/calendar/auth setup/pure contact lookup/IM chat tasks.","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli mail --help"}},"isInternal":false,"tokens":7971,"sizeBytes":25921},{"name":"lark-markdown-create.md","path":"skills/lark-markdown/references/lark-markdown-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-markdown/references/lark-markdown-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-create.md -->","isInternal":false,"tokens":1561,"sizeBytes":4710},{"name":"lark-markdown-diff.md","path":"skills/lark-markdown/references/lark-markdown-diff.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-markdown/references/lark-markdown-diff.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-diff.md -->","isInternal":false,"tokens":2261,"sizeBytes":6403},{"name":"lark-markdown-fetch.md","path":"skills/lark-markdown/references/lark-markdown-fetch.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-markdown/references/lark-markdown-fetch.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-fetch.md -->","isInternal":false,"tokens":575,"sizeBytes":1770},{"name":"lark-markdown-overwrite.md","path":"skills/lark-markdown/references/lark-markdown-overwrite.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-markdown/references/lark-markdown-overwrite.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-overwrite.md -->","isInternal":false,"tokens":783,"sizeBytes":2283},{"name":"lark-markdown-patch.md","path":"skills/lark-markdown/references/lark-markdown-patch.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-markdown/references/lark-markdown-patch.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2Freferences%2Flark-markdown-patch.md -->","isInternal":false,"tokens":1588,"sizeBytes":4869},{"name":"SKILL.md","path":"skills/lark-markdown/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-markdown/SKILL.md","title":"lark-markdown","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-markdown%2FSKILL.md -->","frontmatter":{"name":"lark-markdown","version":"1.2.2","description":"飞书 Markdown：查看、创建、上传、编辑和比较飞书中的原生 Markdown 文件。当用户要操作飞书 Markdown 文件，或比较其远端版本及本地草稿时使用。纯本地 Markdown 文件操作不触发本 skill。不负责将 Markdown 导入为飞书在线文档，也不负责文件搜索、权限、评论、移动、删除等云空间管理操作。","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli markdown --help"}},"isInternal":false,"tokens":1555,"sizeBytes":4973},{"name":"lark-minutes-apply-permission.md","path":"skills/lark-meeting/references/lark-minutes-apply-permission.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-minutes-apply-permission.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-apply-permission.md -->","isInternal":false,"tokens":1563,"sizeBytes":4611},{"name":"lark-minutes-detail.md","path":"skills/lark-meeting/references/lark-minutes-detail.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-minutes-detail.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-detail.md -->","isInternal":false,"tokens":874,"sizeBytes":2654},{"name":"lark-minutes-download.md","path":"skills/lark-meeting/references/lark-minutes-download.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-minutes-download.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-download.md -->","isInternal":false,"tokens":1955,"sizeBytes":5973},{"name":"lark-minutes-search.md","path":"skills/lark-meeting/references/lark-minutes-search.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-minutes-search.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-search.md -->","isInternal":false,"tokens":3390,"sizeBytes":10152},{"name":"lark-minutes-speaker-replace.md","path":"skills/lark-meeting/references/lark-minutes-speaker-replace.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-minutes-speaker-replace.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-speaker-replace.md -->","isInternal":false,"tokens":1621,"sizeBytes":4758},{"name":"lark-minutes-summary.md","path":"skills/lark-meeting/references/lark-minutes-summary.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-minutes-summary.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-summary.md -->","isInternal":false,"tokens":1545,"sizeBytes":4428},{"name":"lark-minutes-todo.md","path":"skills/lark-meeting/references/lark-minutes-todo.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-minutes-todo.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-todo.md -->","isInternal":false,"tokens":2828,"sizeBytes":8177},{"name":"lark-minutes-update.md","path":"skills/lark-meeting/references/lark-minutes-update.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-minutes-update.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-update.md -->","isInternal":false,"tokens":343,"sizeBytes":980},{"name":"lark-minutes-upload.md","path":"skills/lark-meeting/references/lark-minutes-upload.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-minutes-upload.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-minutes-upload.md -->","isInternal":false,"tokens":966,"sizeBytes":2828},{"name":"lark-note-detail.md","path":"skills/lark-meeting/references/lark-note-detail.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-note-detail.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-note-detail.md -->","isInternal":false,"tokens":256,"sizeBytes":739},{"name":"lark-note-transcript.md","path":"skills/lark-meeting/references/lark-note-transcript.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-note-transcript.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-note-transcript.md -->","isInternal":false,"tokens":355,"sizeBytes":1061},{"name":"lark-vc-agent-meeting-end.md","path":"skills/lark-meeting/references/lark-vc-agent-meeting-end.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-vc-agent-meeting-end.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-agent-meeting-end.md -->","isInternal":false,"tokens":310,"sizeBytes":959},{"name":"lark-vc-agent-meeting-invite.md","path":"skills/lark-meeting/references/lark-vc-agent-meeting-invite.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-vc-agent-meeting-invite.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-agent-meeting-invite.md -->","isInternal":false,"tokens":804,"sizeBytes":2290},{"name":"lark-vc-agent-meeting-join.md","path":"skills/lark-meeting/references/lark-vc-agent-meeting-join.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-vc-agent-meeting-join.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-agent-meeting-join.md -->","isInternal":false,"tokens":2149,"sizeBytes":6318},{"name":"lark-vc-agent-meeting-leave.md","path":"skills/lark-meeting/references/lark-vc-agent-meeting-leave.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-vc-agent-meeting-leave.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-agent-meeting-leave.md -->","isInternal":false,"tokens":1139,"sizeBytes":3404},{"name":"lark-vc-detail.md","path":"skills/lark-meeting/references/lark-vc-detail.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-vc-detail.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-detail.md -->","isInternal":false,"tokens":388,"sizeBytes":1112},{"name":"lark-vc-meeting-countdown.md","path":"skills/lark-meeting/references/lark-vc-meeting-countdown.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-vc-meeting-countdown.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-countdown.md -->","isInternal":false,"tokens":1234,"sizeBytes":3792},{"name":"lark-vc-meeting-events.md","path":"skills/lark-meeting/references/lark-vc-meeting-events.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-vc-meeting-events.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-events.md -->","isInternal":false,"tokens":8663,"sizeBytes":26435},{"name":"lark-vc-meeting-list-active.md","path":"skills/lark-meeting/references/lark-vc-meeting-list-active.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-vc-meeting-list-active.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-list-active.md -->","isInternal":false,"tokens":1301,"sizeBytes":4054},{"name":"lark-vc-meeting-message-send.md","path":"skills/lark-meeting/references/lark-vc-meeting-message-send.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-vc-meeting-message-send.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-message-send.md -->","isInternal":false,"tokens":2190,"sizeBytes":6275},{"name":"lark-vc-meeting-screenshot.md","path":"skills/lark-meeting/references/lark-vc-meeting-screenshot.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-vc-meeting-screenshot.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-meeting-screenshot.md -->","isInternal":false,"tokens":545,"sizeBytes":1731},{"name":"lark-vc-recording.md","path":"skills/lark-meeting/references/lark-vc-recording.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-vc-recording.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-recording.md -->","isInternal":false,"tokens":1368,"sizeBytes":4135},{"name":"lark-vc-search.md","path":"skills/lark-meeting/references/lark-vc-search.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/references/lark-vc-search.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Freferences%2Flark-vc-search.md -->","isInternal":false,"tokens":2816,"sizeBytes":7687},{"name":"create-and-edit-minutes.md","path":"skills/lark-meeting/scenes/create-and-edit-minutes.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/scenes/create-and-edit-minutes.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Fcreate-and-edit-minutes.md -->","isInternal":false,"tokens":3501,"sizeBytes":10797},{"name":"live-meeting-attend.md","path":"skills/lark-meeting/scenes/live-meeting-attend.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/scenes/live-meeting-attend.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Flive-meeting-attend.md -->","isInternal":false,"tokens":2777,"sizeBytes":8676},{"name":"live-meeting-interact.md","path":"skills/lark-meeting/scenes/live-meeting-interact.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/scenes/live-meeting-interact.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Flive-meeting-interact.md -->","isInternal":false,"tokens":2112,"sizeBytes":6621},{"name":"query-meeting-and-artifacts.md","path":"skills/lark-meeting/scenes/query-meeting-and-artifacts.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/scenes/query-meeting-and-artifacts.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Fquery-meeting-and-artifacts.md -->","isInternal":false,"tokens":2317,"sizeBytes":7019},{"name":"query-minutes-and-artifacts.md","path":"skills/lark-meeting/scenes/query-minutes-and-artifacts.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/scenes/query-minutes-and-artifacts.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Fquery-minutes-and-artifacts.md -->","isInternal":false,"tokens":1341,"sizeBytes":4191},{"name":"query-note-and-artifacts.md","path":"skills/lark-meeting/scenes/query-note-and-artifacts.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/scenes/query-note-and-artifacts.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2Fscenes%2Fquery-note-and-artifacts.md -->","isInternal":false,"tokens":2183,"sizeBytes":6735},{"name":"SKILL.md","path":"skills/lark-meeting/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-meeting/SKILL.md","title":"lark-meeting","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-meeting%2FSKILL.md -->","frontmatter":{"name":"lark-meeting","version":"1.0.0","description":"飞书视频会议：查询会议记录与会议产物(纪要/逐字稿/妙记)、妙记搜索/上传/下载/编辑、机器人参与会议；查询进行中的会议、实时会议内容(发言/聊天/共享文档)问答(会上/会里)、发送会中聊天/表情；基于 meeting_id、meeting_no、event_id、note_id、minute_token、vc-node-id 或妙记 URL 查询相关信息。预约会议、忙闲和会议室管理走 lark-calendar。","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli vc --help;lark-cli minutes --help;lark-cli note --help"}},"isInternal":false,"tokens":3885,"sizeBytes":12141},{"name":"SKILL.md","path":"skills/lark-minutes/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-minutes/SKILL.md","title":"lark-minutes","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-minutes%2FSKILL.md -->","frontmatter":{"name":"lark-minutes","version":"1.0.0","description":"仅当用户或上游配置显式指定 lark-minutes 时使用，相关请求统一交由 lark-meeting 技能处理。","metadata":{"requires":{"bins":["lark-cli"],"skills":["lark-meeting"]}}},"isInternal":false,"tokens":149,"sizeBytes":464},{"name":"SKILL.md","path":"skills/lark-note/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-note/SKILL.md","title":"lark-note","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-note%2FSKILL.md -->","frontmatter":{"name":"lark-note","version":"1.0.0","description":"仅当用户或上游配置显式指定 lark-note 时使用，相关请求统一交由 lark-meeting 技能处理。","metadata":{"requires":{"bins":["lark-cli"],"skills":["lark-meeting"]}}},"isInternal":false,"tokens":147,"sizeBytes":458},{"name":"lark-okr-alignments.md","path":"skills/lark-okr/references/lark-okr-alignments.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-alignments.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-alignments.md -->","isInternal":false,"tokens":1643,"sizeBytes":5470},{"name":"lark-okr-batch-create.md","path":"skills/lark-okr/references/lark-okr-batch-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-batch-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-batch-create.md -->","isInternal":false,"tokens":1326,"sizeBytes":4393},{"name":"lark-okr-comment-create.md","path":"skills/lark-okr/references/lark-okr-comment-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-comment-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-create.md -->","isInternal":false,"tokens":2102,"sizeBytes":8218},{"name":"lark-okr-comment-delete.md","path":"skills/lark-okr/references/lark-okr-comment-delete.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-comment-delete.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-delete.md -->","isInternal":false,"tokens":843,"sizeBytes":2848},{"name":"lark-okr-comment-detail.md","path":"skills/lark-okr/references/lark-okr-comment-detail.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-comment-detail.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-detail.md -->","isInternal":false,"tokens":1170,"sizeBytes":4207},{"name":"lark-okr-comment-get.md","path":"skills/lark-okr/references/lark-okr-comment-get.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-comment-get.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-get.md -->","isInternal":false,"tokens":914,"sizeBytes":3237},{"name":"lark-okr-comment-list.md","path":"skills/lark-okr/references/lark-okr-comment-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-comment-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-list.md -->","isInternal":false,"tokens":1235,"sizeBytes":4564},{"name":"lark-okr-comment-patch.md","path":"skills/lark-okr/references/lark-okr-comment-patch.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-comment-patch.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-patch.md -->","isInternal":false,"tokens":1143,"sizeBytes":4261},{"name":"lark-okr-comment-solve-reopen.md","path":"skills/lark-okr/references/lark-okr-comment-solve-reopen.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-comment-solve-reopen.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-comment-solve-reopen.md -->","isInternal":false,"tokens":1090,"sizeBytes":3804},{"name":"lark-okr-contentblock.md","path":"skills/lark-okr/references/lark-okr-contentblock.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-contentblock.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-contentblock.md -->","isInternal":false,"tokens":3378,"sizeBytes":13139},{"name":"lark-okr-create.md","path":"skills/lark-okr/references/lark-okr-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-create.md -->","isInternal":false,"tokens":2200,"sizeBytes":7619},{"name":"lark-okr-cycle-detail.md","path":"skills/lark-okr/references/lark-okr-cycle-detail.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-cycle-detail.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-cycle-detail.md -->","isInternal":false,"tokens":1051,"sizeBytes":3614},{"name":"lark-okr-cycle-list.md","path":"skills/lark-okr/references/lark-okr-cycle-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-cycle-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-cycle-list.md -->","isInternal":false,"tokens":1614,"sizeBytes":5025},{"name":"lark-okr-entities.md","path":"skills/lark-okr/references/lark-okr-entities.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-entities.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-entities.md -->","isInternal":false,"tokens":7037,"sizeBytes":26215},{"name":"lark-okr-image-upload.md","path":"skills/lark-okr/references/lark-okr-image-upload.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-image-upload.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-image-upload.md -->","isInternal":false,"tokens":1018,"sizeBytes":3473},{"name":"lark-okr-indicator-update.md","path":"skills/lark-okr/references/lark-okr-indicator-update.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-indicator-update.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-indicator-update.md -->","isInternal":false,"tokens":1043,"sizeBytes":3594},{"name":"lark-okr-indicators.md","path":"skills/lark-okr/references/lark-okr-indicators.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-indicators.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-indicators.md -->","isInternal":false,"tokens":3160,"sizeBytes":11479},{"name":"lark-okr-patch.md","path":"skills/lark-okr/references/lark-okr-patch.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-patch.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-patch.md -->","isInternal":false,"tokens":1673,"sizeBytes":6230},{"name":"lark-okr-progress-create.md","path":"skills/lark-okr/references/lark-okr-progress-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-progress-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-create.md -->","isInternal":false,"tokens":1511,"sizeBytes":5785},{"name":"lark-okr-progress-delete.md","path":"skills/lark-okr/references/lark-okr-progress-delete.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-progress-delete.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-delete.md -->","isInternal":false,"tokens":477,"sizeBytes":1459},{"name":"lark-okr-progress-get.md","path":"skills/lark-okr/references/lark-okr-progress-get.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-progress-get.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-get.md -->","isInternal":false,"tokens":1124,"sizeBytes":3820},{"name":"lark-okr-progress-list.md","path":"skills/lark-okr/references/lark-okr-progress-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-progress-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-list.md -->","isInternal":false,"tokens":1191,"sizeBytes":4047},{"name":"lark-okr-progress-update.md","path":"skills/lark-okr/references/lark-okr-progress-update.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-progress-update.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-progress-update.md -->","isInternal":false,"tokens":1349,"sizeBytes":4797},{"name":"lark-okr-reorder.md","path":"skills/lark-okr/references/lark-okr-reorder.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-reorder.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-reorder.md -->","isInternal":false,"tokens":853,"sizeBytes":2674},{"name":"lark-okr-weight.md","path":"skills/lark-okr/references/lark-okr-weight.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/references/lark-okr-weight.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2Freferences%2Flark-okr-weight.md -->","isInternal":false,"tokens":1271,"sizeBytes":4045},{"name":"SKILL.md","path":"skills/lark-okr/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-okr/SKILL.md","title":"lark-okr","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-okr%2FSKILL.md -->","frontmatter":{"name":"lark-okr","version":"1.0.0","description":"飞书 OKR：管理目标与关键结果。查看和编辑 OKR 周期、目标、关键结果、对齐关系、量化指标和进展记录。当用户需要查看或创建 OKR、管理目标和关键结果、查看对齐关系时使用。不负责：待办任务管理（lark-task）、日程/会议安排（lark-calendar）、绩效评估","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli okr --help"}},"isInternal":false,"tokens":3347,"sizeBytes":15175},{"name":"SKILL.md","path":"skills/lark-openapi-explorer/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-openapi-explorer/SKILL.md","title":"lark-openapi-explorer","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-openapi-explorer%2FSKILL.md -->","frontmatter":{"name":"lark-openapi-explorer","version":"1.0.0","description":"飞书/Lark 原生 OpenAPI 探索：从官方文档库中挖掘未经 CLI 封装的原生 OpenAPI 接口。当用户的需求无法被现有 lark-* skill 或 lark-cli 已注册命令满足，需要查找并调用原生飞书 OpenAPI 时使用。","metadata":{"requires":{"bins":["lark-cli"]}}},"isInternal":false,"tokens":1739,"sizeBytes":4927},{"name":"lark-shared-config-init.md","path":"skills/lark-shared/references/lark-shared-config-init.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-shared/references/lark-shared-config-init.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-config-init.md -->","isInternal":false,"tokens":308,"sizeBytes":980},{"name":"lark-shared-high-risk-approval.md","path":"skills/lark-shared/references/lark-shared-high-risk-approval.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-shared/references/lark-shared-high-risk-approval.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-high-risk-approval.md -->","isInternal":false,"tokens":696,"sizeBytes":2070},{"name":"lark-shared-identity-and-permissions.md","path":"skills/lark-shared/references/lark-shared-identity-and-permissions.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-shared/references/lark-shared-identity-and-permissions.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-identity-and-permissions.md -->","isInternal":false,"tokens":1941,"sizeBytes":5805},{"name":"lark-shared-output-contract.md","path":"skills/lark-shared/references/lark-shared-output-contract.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-shared/references/lark-shared-output-contract.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-output-contract.md -->","isInternal":false,"tokens":326,"sizeBytes":933},{"name":"lark-shared-update-notice.md","path":"skills/lark-shared/references/lark-shared-update-notice.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-shared/references/lark-shared-update-notice.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-shared-update-notice.md -->","isInternal":false,"tokens":319,"sizeBytes":1040},{"name":"lark-wiki-token-routing.md","path":"skills/lark-shared/references/lark-wiki-token-routing.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-shared/references/lark-wiki-token-routing.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2Freferences%2Flark-wiki-token-routing.md -->","isInternal":false,"tokens":716,"sizeBytes":2066},{"name":"SKILL.md","path":"skills/lark-shared/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-shared/SKILL.md","title":"lark-shared","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-shared%2FSKILL.md -->","frontmatter":{"name":"lark-shared","version":"1.1.0","description":"Use for lark-cli setup/auth tasks: auth login/status/logout, user vs bot identity, business-domain permissions (--domain, including all/docs/drive), missing scopes, revoking authorization, or handling _notice JSON.","metadata":{"requires":{"bins":["lark-cli"]}}},"isInternal":false,"tokens":1369,"sizeBytes":4282},{"name":"lark-sheets-batch-update.md","path":"skills/lark-sheets/references/lark-sheets-batch-update.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-batch-update.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-batch-update.md -->","isInternal":false,"tokens":6605,"sizeBytes":19710},{"name":"lark-sheets-changeset.md","path":"skills/lark-sheets/references/lark-sheets-changeset.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-changeset.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-changeset.md -->","isInternal":false,"tokens":1702,"sizeBytes":5205},{"name":"lark-sheets-chart.md","path":"skills/lark-sheets/references/lark-sheets-chart.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-chart.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-chart.md -->","isInternal":false,"tokens":18249,"sizeBytes":52571},{"name":"lark-sheets-conditional-format.md","path":"skills/lark-sheets/references/lark-sheets-conditional-format.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-conditional-format.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-conditional-format.md -->","isInternal":false,"tokens":5126,"sizeBytes":14811},{"name":"lark-sheets-filter-view.md","path":"skills/lark-sheets/references/lark-sheets-filter-view.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-filter-view.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-filter-view.md -->","isInternal":false,"tokens":2695,"sizeBytes":8064},{"name":"lark-sheets-filter.md","path":"skills/lark-sheets/references/lark-sheets-filter.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-filter.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-filter.md -->","isInternal":false,"tokens":2649,"sizeBytes":7691},{"name":"lark-sheets-float-image.md","path":"skills/lark-sheets/references/lark-sheets-float-image.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-float-image.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-float-image.md -->","isInternal":false,"tokens":3783,"sizeBytes":11482},{"name":"lark-sheets-formula-translation.md","path":"skills/lark-sheets/references/lark-sheets-formula-translation.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-formula-translation.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-formula-translation.md -->","isInternal":false,"tokens":11144,"sizeBytes":28649},{"name":"lark-sheets-formula-verify.md","path":"skills/lark-sheets/references/lark-sheets-formula-verify.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-formula-verify.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-formula-verify.md -->","isInternal":false,"tokens":4507,"sizeBytes":12520},{"name":"lark-sheets-history.md","path":"skills/lark-sheets/references/lark-sheets-history.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-history.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-history.md -->","isInternal":false,"tokens":1696,"sizeBytes":5213},{"name":"lark-sheets-pivot-table.md","path":"skills/lark-sheets/references/lark-sheets-pivot-table.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-pivot-table.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-pivot-table.md -->","isInternal":false,"tokens":5146,"sizeBytes":14990},{"name":"lark-sheets-range-operations.md","path":"skills/lark-sheets/references/lark-sheets-range-operations.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-range-operations.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-range-operations.md -->","isInternal":false,"tokens":7928,"sizeBytes":21589},{"name":"lark-sheets-read-data.md","path":"skills/lark-sheets/references/lark-sheets-read-data.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-read-data.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-read-data.md -->","isInternal":false,"tokens":13345,"sizeBytes":37535},{"name":"lark-sheets-search-replace.md","path":"skills/lark-sheets/references/lark-sheets-search-replace.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-search-replace.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-search-replace.md -->","isInternal":false,"tokens":2160,"sizeBytes":5986},{"name":"lark-sheets-sheet-structure.md","path":"skills/lark-sheets/references/lark-sheets-sheet-structure.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-sheet-structure.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-sheet-structure.md -->","isInternal":false,"tokens":5321,"sizeBytes":14474},{"name":"lark-sheets-sparkline.md","path":"skills/lark-sheets/references/lark-sheets-sparkline.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-sparkline.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-sparkline.md -->","isInternal":false,"tokens":2585,"sizeBytes":7657},{"name":"lark-sheets-styles-put.md","path":"skills/lark-sheets/references/lark-sheets-styles-put.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-styles-put.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-styles-put.md -->","isInternal":false,"tokens":2801,"sizeBytes":8020},{"name":"lark-sheets-visual-standards.md","path":"skills/lark-sheets/references/lark-sheets-visual-standards.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-visual-standards.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-visual-standards.md -->","isInternal":false,"tokens":7309,"sizeBytes":19407},{"name":"lark-sheets-workbook.md","path":"skills/lark-sheets/references/lark-sheets-workbook.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-workbook.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-workbook.md -->","isInternal":false,"tokens":9896,"sizeBytes":29279},{"name":"lark-sheets-write-cells.md","path":"skills/lark-sheets/references/lark-sheets-write-cells.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/references/lark-sheets-write-cells.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2Freferences%2Flark-sheets-write-cells.md -->","isInternal":false,"tokens":22812,"sizeBytes":63409},{"name":"SKILL.md","path":"skills/lark-sheets/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-sheets/SKILL.md","title":"lark-sheets","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-sheets%2FSKILL.md -->","frontmatter":{"name":"lark-sheets","version":"3.5.2","description":"飞书电子表格：创建和操作电子表格。支持工作表与行列结构（增删/合并/尺寸/隐藏/冻结/分组）、单元格读写（值/公式/样式/批注/单元格图片）、区域复制移动排序填充、查找替换、批量更新，图表、透视表、条件格式、筛选器与筛选视图、下拉列表、迷你图、浮动图片等对象的创建与维护，以及公式校验、历史版本回滚、本地 Excel/CSV 与飞书表格的导入导出。当用户需要创建或编辑表格、统计汇总与可视化、表格美化、公式计算（含 Excel 公式迁移）、金融/财务建模（DCF、三张表、预算、Sensitivity 等）时使用。多维表格（Base/bitable）请改用 lark-base；若用户是想按名称或关键词搜索云空间（云盘/云存储）里的表格文件，请改用 lark-drive 的 drive +search 先定位资源。当用户给出 doubao.com 的 /sheets/ URL/token 时，也应直接使用本 skill，不要因为域名不是飞书而回退到 WebFetch；路由依据是 URL 路径模式和 token，而不是域名。","metadata":{"requires":{"bins":["lark-cli"],"siblings":["lark-shared"]},"cliHelp":"lark-cli sheets --help"}},"isInternal":false,"tokens":9750,"sizeBytes":27880},{"name":"SKILL.md","path":"skills/lark-skill-maker/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-skill-maker/SKILL.md","title":"lark-skill-maker","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-skill-maker%2FSKILL.md -->","frontmatter":{"name":"lark-skill-maker","version":"1.0.0","description":"创建 lark-cli 的自定义 Skill。当用户需要把飞书 API 操作封装成可复用的 Skill（包装原子 API 或编排多步流程）时使用。","metadata":{"requires":{"bins":["lark-cli"]}}},"isInternal":false,"tokens":817,"sizeBytes":2460},{"name":"asset-planning.md","path":"skills/lark-slides/references/asset-planning.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/asset-planning.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fasset-planning.md -->","isInternal":false,"tokens":1763,"sizeBytes":7730},{"name":"lark-slides-add-slide.md","path":"skills/lark-slides/references/cli/lark-slides-add-slide.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/cli/lark-slides-add-slide.md","title":"Cli Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-add-slide.md -->","isInternal":false,"tokens":1669,"sizeBytes":4903},{"name":"lark-slides-create.md","path":"skills/lark-slides/references/cli/lark-slides-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/cli/lark-slides-create.md","title":"Cli Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-create.md -->","isInternal":false,"tokens":2970,"sizeBytes":8973},{"name":"lark-slides-delete-slide.md","path":"skills/lark-slides/references/cli/lark-slides-delete-slide.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/cli/lark-slides-delete-slide.md","title":"Cli Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-delete-slide.md -->","isInternal":false,"tokens":926,"sizeBytes":2745},{"name":"lark-slides-history.md","path":"skills/lark-slides/references/cli/lark-slides-history.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/cli/lark-slides-history.md","title":"Cli Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-history.md -->","isInternal":false,"tokens":2185,"sizeBytes":6825},{"name":"lark-slides-media-upload.md","path":"skills/lark-slides/references/cli/lark-slides-media-upload.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/cli/lark-slides-media-upload.md","title":"Cli Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-media-upload.md -->","isInternal":false,"tokens":1545,"sizeBytes":4687},{"name":"lark-slides-replace-slide.md","path":"skills/lark-slides/references/cli/lark-slides-replace-slide.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/cli/lark-slides-replace-slide.md","title":"Cli Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-replace-slide.md -->","isInternal":false,"tokens":4550,"sizeBytes":13818},{"name":"lark-slides-screenshot.md","path":"skills/lark-slides/references/cli/lark-slides-screenshot.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/cli/lark-slides-screenshot.md","title":"Cli Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-screenshot.md -->","isInternal":false,"tokens":1784,"sizeBytes":5563},{"name":"lark-slides-update-slide.md","path":"skills/lark-slides/references/cli/lark-slides-update-slide.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/cli/lark-slides-update-slide.md","title":"Cli Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-update-slide.md -->","isInternal":false,"tokens":3305,"sizeBytes":9516},{"name":"lark-slides-xml-presentation-slide-get.md","path":"skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md","title":"Cli Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-xml-presentation-slide-get.md -->","isInternal":false,"tokens":73,"sizeBytes":238},{"name":"lark-slides-xml-presentation-slide-replace.md","path":"skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md","title":"Cli Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-xml-presentation-slide-replace.md -->","isInternal":false,"tokens":232,"sizeBytes":773},{"name":"lark-slides-xml-presentations-get.md","path":"skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md","title":"Cli Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fcli%2Flark-slides-xml-presentations-get.md -->","isInternal":false,"tokens":622,"sizeBytes":1873},{"name":"iconpark-index.json","path":"skills/lark-slides/references/iconpark-index.json","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/iconpark-index.json","title":"References Skill","category":"anthropic-skill","format":"json","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Ficonpark-index.json -->","isInternal":false,"tokens":62,"sizeBytes":195},{"name":"iconpark.md","path":"skills/lark-slides/references/iconpark.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/iconpark.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Ficonpark.md -->","isInternal":false,"tokens":58,"sizeBytes":173},{"name":"lark-slides-add-slide.md","path":"skills/lark-slides/references/lark-slides-add-slide.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/lark-slides-add-slide.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-add-slide.md -->","isInternal":false,"tokens":66,"sizeBytes":201},{"name":"lark-slides-create.md","path":"skills/lark-slides/references/lark-slides-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/lark-slides-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-create.md -->","isInternal":false,"tokens":74,"sizeBytes":219},{"name":"lark-slides-delete-slide.md","path":"skills/lark-slides/references/lark-slides-delete-slide.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/lark-slides-delete-slide.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-delete-slide.md -->","isInternal":false,"tokens":66,"sizeBytes":210},{"name":"lark-slides-edit-workflows.md","path":"skills/lark-slides/references/lark-slides-edit-workflows.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/lark-slides-edit-workflows.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-edit-workflows.md -->","isInternal":false,"tokens":73,"sizeBytes":216},{"name":"lark-slides-history.md","path":"skills/lark-slides/references/lark-slides-history.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/lark-slides-history.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-history.md -->","isInternal":false,"tokens":72,"sizeBytes":221},{"name":"lark-slides-media-upload.md","path":"skills/lark-slides/references/lark-slides-media-upload.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/lark-slides-media-upload.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-media-upload.md -->","isInternal":false,"tokens":66,"sizeBytes":210},{"name":"lark-slides-pptx-template-workflows.md","path":"skills/lark-slides/references/lark-slides-pptx-template-workflows.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/lark-slides-pptx-template-workflows.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-pptx-template-workflows.md -->","isInternal":false,"tokens":61,"sizeBytes":215},{"name":"lark-slides-replace-slide.md","path":"skills/lark-slides/references/lark-slides-replace-slide.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/lark-slides-replace-slide.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-replace-slide.md -->","isInternal":false,"tokens":68,"sizeBytes":213},{"name":"lark-slides-screenshot.md","path":"skills/lark-slides/references/lark-slides-screenshot.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/lark-slides-screenshot.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-screenshot.md -->","isInternal":false,"tokens":66,"sizeBytes":204},{"name":"lark-slides-xml-presentation-slide-get.md","path":"skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-xml-presentation-slide-get.md -->","isInternal":false,"tokens":80,"sizeBytes":253},{"name":"lark-slides-xml-presentation-slide-replace.md","path":"skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-xml-presentation-slide-replace.md -->","isInternal":false,"tokens":81,"sizeBytes":265},{"name":"lark-slides-xml-presentations-get.md","path":"skills/lark-slides/references/lark-slides-xml-presentations-get.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/lark-slides-xml-presentations-get.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Flark-slides-xml-presentations-get.md -->","isInternal":false,"tokens":77,"sizeBytes":241},{"name":"planning-layer.md","path":"skills/lark-slides/references/planning-layer.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/planning-layer.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fplanning-layer.md -->","isInternal":false,"tokens":3319,"sizeBytes":14694},{"name":"troubleshooting.md","path":"skills/lark-slides/references/troubleshooting.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/troubleshooting.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Ftroubleshooting.md -->","isInternal":false,"tokens":59,"sizeBytes":195},{"name":"validation-checklist.md","path":"skills/lark-slides/references/validation-checklist.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/validation-checklist.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fvalidation-checklist.md -->","isInternal":false,"tokens":58,"sizeBytes":200},{"name":"visual-planning.md","path":"skills/lark-slides/references/visual-planning.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/visual-planning.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fvisual-planning.md -->","isInternal":false,"tokens":3220,"sizeBytes":14427},{"name":"error-handling.md","path":"skills/lark-slides/references/workflow/error-handling.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/workflow/error-handling.md","title":"Workflow Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fworkflow%2Ferror-handling.md -->","isInternal":false,"tokens":1878,"sizeBytes":5293},{"name":"slides-editing.md","path":"skills/lark-slides/references/workflow/slides-editing.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/workflow/slides-editing.md","title":"Workflow Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fworkflow%2Fslides-editing.md -->","isInternal":false,"tokens":2647,"sizeBytes":8061},{"name":"template-editing.md","path":"skills/lark-slides/references/workflow/template-editing.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/workflow/template-editing.md","title":"Workflow Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fworkflow%2Ftemplate-editing.md -->","isInternal":false,"tokens":1355,"sizeBytes":3945},{"name":"validation-xml.md","path":"skills/lark-slides/references/workflow/validation-xml.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/workflow/validation-xml.md","title":"Workflow Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fworkflow%2Fvalidation-xml.md -->","isInternal":false,"tokens":3494,"sizeBytes":9846},{"name":"xml-schema-quick-ref.md","path":"skills/lark-slides/references/xml-schema-quick-ref.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/xml-schema-quick-ref.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fxml-schema-quick-ref.md -->","isInternal":false,"tokens":67,"sizeBytes":205},{"name":"iconpark-index.json","path":"skills/lark-slides/references/xml/iconpark-index.json","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/xml/iconpark-index.json","title":"Xml Skill","category":"anthropic-skill","format":"json","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fxml%2Ficonpark-index.json -->","isInternal":false,"tokens":15219,"sizeBytes":54002},{"name":"iconpark.md","path":"skills/lark-slides/references/xml/iconpark.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/xml/iconpark.md","title":"Xml Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fxml%2Ficonpark.md -->","isInternal":false,"tokens":777,"sizeBytes":2206},{"name":"xml-schema-quick-ref.md","path":"skills/lark-slides/references/xml/xml-schema-quick-ref.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/references/xml/xml-schema-quick-ref.md","title":"Xml Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2Freferences%2Fxml%2Fxml-schema-quick-ref.md -->","isInternal":false,"tokens":6530,"sizeBytes":18112},{"name":"SKILL.md","path":"skills/lark-slides/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-slides/SKILL.md","title":"lark-slides","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-slides%2FSKILL.md -->","frontmatter":{"name":"lark-slides","version":"1.0.0","description":"飞书幻灯片：创建和编辑幻灯片。创建演示文稿、读取幻灯片内容、管理幻灯片页面（创建、删除、读取、局部替换）。当用户需要创建或编辑幻灯片、读取或修改单个页面时使用。当用户给出 doubao.com 的 /slides/ URL/token 时，也应直接使用本 skill，不要因为域名不是飞书而回退到 WebFetch；路由依据是 URL 路径模式和 token，而不是域名。不负责：云文档内容编辑（走 lark-doc）、云文档里的独立画板对象（走 lark-whiteboard）、上传或下载普通文件（走 lark-drive）。","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli slides --help"}},"isInternal":false,"tokens":9464,"sizeBytes":27814},{"name":"lark-task-assign.md","path":"skills/lark-task/references/lark-task-assign.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-assign.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-assign.md -->","isInternal":false,"tokens":389,"sizeBytes":1402},{"name":"lark-task-comment.md","path":"skills/lark-task/references/lark-task-comment.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-comment.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-comment.md -->","isInternal":false,"tokens":225,"sizeBytes":905},{"name":"lark-task-complete.md","path":"skills/lark-task/references/lark-task-complete.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-complete.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-complete.md -->","isInternal":false,"tokens":309,"sizeBytes":1312},{"name":"lark-task-create.md","path":"skills/lark-task/references/lark-task-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-create.md -->","isInternal":false,"tokens":1155,"sizeBytes":4208},{"name":"lark-task-followers.md","path":"skills/lark-task/references/lark-task-followers.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-followers.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-followers.md -->","isInternal":false,"tokens":337,"sizeBytes":1270},{"name":"lark-task-get-my-tasks.md","path":"skills/lark-task/references/lark-task-get-my-tasks.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-get-my-tasks.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-get-my-tasks.md -->","isInternal":false,"tokens":896,"sizeBytes":3416},{"name":"lark-task-get-related-tasks.md","path":"skills/lark-task/references/lark-task-get-related-tasks.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-get-related-tasks.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-get-related-tasks.md -->","isInternal":false,"tokens":721,"sizeBytes":2956},{"name":"lark-task-reminder.md","path":"skills/lark-task/references/lark-task-reminder.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-reminder.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-reminder.md -->","isInternal":false,"tokens":378,"sizeBytes":1504},{"name":"lark-task-reopen.md","path":"skills/lark-task/references/lark-task-reopen.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-reopen.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-reopen.md -->","isInternal":false,"tokens":183,"sizeBytes":743},{"name":"lark-task-search.md","path":"skills/lark-task/references/lark-task-search.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-search.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-search.md -->","isInternal":false,"tokens":408,"sizeBytes":1574},{"name":"lark-task-sections.md","path":"skills/lark-task/references/lark-task-sections.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-sections.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-sections.md -->","isInternal":false,"tokens":927,"sizeBytes":4348},{"name":"lark-task-set-ancestor.md","path":"skills/lark-task/references/lark-task-set-ancestor.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-set-ancestor.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-set-ancestor.md -->","isInternal":false,"tokens":246,"sizeBytes":969},{"name":"lark-task-tasklist-create.md","path":"skills/lark-task/references/lark-task-tasklist-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-tasklist-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-tasklist-create.md -->","isInternal":false,"tokens":342,"sizeBytes":1337},{"name":"lark-task-tasklist-members.md","path":"skills/lark-task/references/lark-task-tasklist-members.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-tasklist-members.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-tasklist-members.md -->","isInternal":false,"tokens":326,"sizeBytes":1205},{"name":"lark-task-tasklist-search.md","path":"skills/lark-task/references/lark-task-tasklist-search.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-tasklist-search.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-tasklist-search.md -->","isInternal":false,"tokens":356,"sizeBytes":1422},{"name":"lark-task-tasklist-task-add.md","path":"skills/lark-task/references/lark-task-tasklist-task-add.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-tasklist-task-add.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-tasklist-task-add.md -->","isInternal":false,"tokens":396,"sizeBytes":1517},{"name":"lark-task-update.md","path":"skills/lark-task/references/lark-task-update.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-update.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-update.md -->","isInternal":false,"tokens":467,"sizeBytes":1894},{"name":"lark-task-upload-attachment.md","path":"skills/lark-task/references/lark-task-upload-attachment.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/references/lark-task-upload-attachment.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2Freferences%2Flark-task-upload-attachment.md -->","isInternal":false,"tokens":791,"sizeBytes":3191},{"name":"SKILL.md","path":"skills/lark-task/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-task/SKILL.md","title":"lark-task","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-task%2FSKILL.md -->","frontmatter":{"name":"lark-task","version":"1.0.0","description":"飞书任务：管理任务、清单和任务智能体。创建待办任务、查看和更新任务状态、拆分子任务、组织任务清单、分配协作成员、上传任务附件、注册或注销任务智能体、更新任务智能体的主页数据、写入智能体任务记录。当用户需要创建待办事项、查看任务列表、跟踪任务进度、管理项目清单或给他人分配任务、为任务上传附件文件、注册注销任务智能体、更新智能体主页数据、写入任务记录时使用。","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli task --help"}},"isInternal":false,"tokens":4515,"sizeBytes":14599},{"name":"SKILL.md","path":"skills/lark-vc-agent/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-vc-agent/SKILL.md","title":"lark-vc-agent","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-vc-agent%2FSKILL.md -->","frontmatter":{"name":"lark-vc-agent","version":"1.0.0","description":"仅当用户或上游配置显式指定 lark-vc-agent 时使用，相关请求统一交由 lark-meeting 技能处理。","metadata":{"requires":{"bins":["lark-cli"],"skills":["lark-meeting"]}}},"isInternal":false,"tokens":151,"sizeBytes":466},{"name":"SKILL.md","path":"skills/lark-vc/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-vc/SKILL.md","title":"lark-vc","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-vc%2FSKILL.md -->","frontmatter":{"name":"lark-vc","version":"1.0.0","description":"仅当用户或上游配置显式指定 lark-vc 时使用，相关请求统一交由 lark-meeting 技能处理。","metadata":{"requires":{"bins":["lark-cli"],"skills":["lark-meeting"]}}},"isInternal":false,"tokens":149,"sizeBytes":454},{"name":"connectors.md","path":"skills/lark-whiteboard/elements/connectors.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/elements/connectors.md","title":"Elements Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fconnectors.md -->","isInternal":false,"tokens":2111,"sizeBytes":5589},{"name":"content.md","path":"skills/lark-whiteboard/elements/content.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/elements/content.md","title":"Elements Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fcontent.md -->","isInternal":false,"tokens":618,"sizeBytes":1512},{"name":"image.md","path":"skills/lark-whiteboard/elements/image.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/elements/image.md","title":"Elements Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fimage.md -->","isInternal":false,"tokens":1409,"sizeBytes":4429},{"name":"layout.md","path":"skills/lark-whiteboard/elements/layout.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/elements/layout.md","title":"Elements Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Flayout.md -->","isInternal":false,"tokens":6330,"sizeBytes":19128},{"name":"schema.md","path":"skills/lark-whiteboard/elements/schema.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/elements/schema.md","title":"Elements Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fschema.md -->","isInternal":false,"tokens":5192,"sizeBytes":15308},{"name":"style.md","path":"skills/lark-whiteboard/elements/style.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/elements/style.md","title":"Elements Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Fstyle.md -->","isInternal":false,"tokens":4345,"sizeBytes":11095},{"name":"typography.md","path":"skills/lark-whiteboard/elements/typography.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/elements/typography.md","title":"Elements Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Felements%2Ftypography.md -->","isInternal":false,"tokens":749,"sizeBytes":2151},{"name":"lark-whiteboard-export.md","path":"skills/lark-whiteboard/references/lark-whiteboard-export.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/references/lark-whiteboard-export.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Freferences%2Flark-whiteboard-export.md -->","isInternal":false,"tokens":899,"sizeBytes":3058},{"name":"lark-whiteboard-update.md","path":"skills/lark-whiteboard/references/lark-whiteboard-update.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/references/lark-whiteboard-update.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Freferences%2Flark-whiteboard-update.md -->","isInternal":false,"tokens":1540,"sizeBytes":4684},{"name":"lark-whiteboard-workflow.md","path":"skills/lark-whiteboard/references/lark-whiteboard-workflow.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/references/lark-whiteboard-workflow.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Freferences%2Flark-whiteboard-workflow.md -->","isInternal":false,"tokens":2092,"sizeBytes":6222},{"name":"dsl.md","path":"skills/lark-whiteboard/routes/dsl.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/routes/dsl.md","title":"Routes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Froutes%2Fdsl.md -->","isInternal":false,"tokens":2307,"sizeBytes":6811},{"name":"mermaid.md","path":"skills/lark-whiteboard/routes/mermaid.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/routes/mermaid.md","title":"Routes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Froutes%2Fmermaid.md -->","isInternal":false,"tokens":421,"sizeBytes":1172},{"name":"svg-edit.md","path":"skills/lark-whiteboard/routes/svg-edit.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/routes/svg-edit.md","title":"Routes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Froutes%2Fsvg-edit.md -->","isInternal":false,"tokens":1431,"sizeBytes":3926},{"name":"svg.md","path":"skills/lark-whiteboard/routes/svg.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/routes/svg.md","title":"Routes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Froutes%2Fsvg.md -->","isInternal":false,"tokens":1752,"sizeBytes":4460},{"name":"architecture.md","path":"skills/lark-whiteboard/scenes/architecture.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/architecture.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Farchitecture.md -->","isInternal":false,"tokens":5774,"sizeBytes":22418},{"name":"bar-chart.md","path":"skills/lark-whiteboard/scenes/bar-chart.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/bar-chart.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fbar-chart.md -->","isInternal":false,"tokens":3169,"sizeBytes":8029},{"name":"comparison.md","path":"skills/lark-whiteboard/scenes/comparison.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/comparison.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fcomparison.md -->","isInternal":false,"tokens":2461,"sizeBytes":7595},{"name":"fishbone.md","path":"skills/lark-whiteboard/scenes/fishbone.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/fishbone.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Ffishbone.md -->","isInternal":false,"tokens":3593,"sizeBytes":9815},{"name":"flowchart.md","path":"skills/lark-whiteboard/scenes/flowchart.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/flowchart.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fflowchart.md -->","isInternal":false,"tokens":3547,"sizeBytes":10830},{"name":"flywheel.md","path":"skills/lark-whiteboard/scenes/flywheel.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/flywheel.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fflywheel.md -->","isInternal":false,"tokens":3200,"sizeBytes":8809},{"name":"funnel.md","path":"skills/lark-whiteboard/scenes/funnel.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/funnel.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Ffunnel.md -->","isInternal":false,"tokens":1641,"sizeBytes":4319},{"name":"line-chart.md","path":"skills/lark-whiteboard/scenes/line-chart.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/line-chart.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fline-chart.md -->","isInternal":false,"tokens":3792,"sizeBytes":9599},{"name":"mention.md","path":"skills/lark-whiteboard/scenes/mention.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/mention.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fmention.md -->","isInternal":false,"tokens":1024,"sizeBytes":3056},{"name":"mermaid.md","path":"skills/lark-whiteboard/scenes/mermaid.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/mermaid.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fmermaid.md -->","isInternal":false,"tokens":1297,"sizeBytes":3528},{"name":"milestone.md","path":"skills/lark-whiteboard/scenes/milestone.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/milestone.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fmilestone.md -->","isInternal":false,"tokens":1395,"sizeBytes":4098},{"name":"organization.md","path":"skills/lark-whiteboard/scenes/organization.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/organization.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Forganization.md -->","isInternal":false,"tokens":2647,"sizeBytes":8439},{"name":"photo-showcase.md","path":"skills/lark-whiteboard/scenes/photo-showcase.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/photo-showcase.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fphoto-showcase.md -->","isInternal":false,"tokens":2105,"sizeBytes":6098},{"name":"pyramid.md","path":"skills/lark-whiteboard/scenes/pyramid.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/pyramid.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fpyramid.md -->","isInternal":false,"tokens":1505,"sizeBytes":4015},{"name":"swimlane.md","path":"skills/lark-whiteboard/scenes/swimlane.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/swimlane.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Fswimlane.md -->","isInternal":false,"tokens":6839,"sizeBytes":20046},{"name":"treemap.md","path":"skills/lark-whiteboard/scenes/treemap.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/scenes/treemap.md","title":"Scenes Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2Fscenes%2Ftreemap.md -->","isInternal":false,"tokens":2588,"sizeBytes":6437},{"name":"SKILL.md","path":"skills/lark-whiteboard/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-whiteboard/SKILL.md","title":"lark-whiteboard","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-whiteboard%2FSKILL.md -->","frontmatter":{"name":"lark-whiteboard","version":"1.0.0","description":"飞书画板：查询和编辑飞书云文档中的画板。支持导出画板为预览图片、导出原始节点结构、使用多种格式更新画板内容。 当用户需要查看画板内容、导出画板图片、编辑画板时使用此 skill。不负责：飞书云文档内容编辑（lark-doc）、文档内嵌电子表格/Base（lark-sheets / lark-base）。\n","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli whiteboard --help"}},"isInternal":false,"tokens":975,"sizeBytes":3114},{"name":"lark-wiki-delete-space.md","path":"skills/lark-wiki/references/lark-wiki-delete-space.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/references/lark-wiki-delete-space.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-delete-space.md -->","isInternal":false,"tokens":3007,"sizeBytes":8715},{"name":"lark-wiki-member-add.md","path":"skills/lark-wiki/references/lark-wiki-member-add.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/references/lark-wiki-member-add.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-member-add.md -->","isInternal":false,"tokens":989,"sizeBytes":3536},{"name":"lark-wiki-member-list.md","path":"skills/lark-wiki/references/lark-wiki-member-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/references/lark-wiki-member-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-member-list.md -->","isInternal":false,"tokens":845,"sizeBytes":2876},{"name":"lark-wiki-member-remove.md","path":"skills/lark-wiki/references/lark-wiki-member-remove.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/references/lark-wiki-member-remove.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-member-remove.md -->","isInternal":false,"tokens":817,"sizeBytes":2899},{"name":"lark-wiki-move-to-drive.md","path":"skills/lark-wiki/references/lark-wiki-move-to-drive.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/references/lark-wiki-move-to-drive.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-move-to-drive.md -->","isInternal":false,"tokens":1551,"sizeBytes":4573},{"name":"lark-wiki-move.md","path":"skills/lark-wiki/references/lark-wiki-move.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/references/lark-wiki-move.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-move.md -->","isInternal":false,"tokens":3500,"sizeBytes":10285},{"name":"lark-wiki-node-copy.md","path":"skills/lark-wiki/references/lark-wiki-node-copy.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/references/lark-wiki-node-copy.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-copy.md -->","isInternal":false,"tokens":619,"sizeBytes":2359},{"name":"lark-wiki-node-create.md","path":"skills/lark-wiki/references/lark-wiki-node-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/references/lark-wiki-node-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-create.md -->","isInternal":false,"tokens":2689,"sizeBytes":8156},{"name":"lark-wiki-node-delete.md","path":"skills/lark-wiki/references/lark-wiki-node-delete.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/references/lark-wiki-node-delete.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-delete.md -->","isInternal":false,"tokens":894,"sizeBytes":3408},{"name":"lark-wiki-node-get.md","path":"skills/lark-wiki/references/lark-wiki-node-get.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/references/lark-wiki-node-get.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-get.md -->","isInternal":false,"tokens":1102,"sizeBytes":4133},{"name":"lark-wiki-node-list.md","path":"skills/lark-wiki/references/lark-wiki-node-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/references/lark-wiki-node-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-node-list.md -->","isInternal":false,"tokens":1197,"sizeBytes":4395},{"name":"lark-wiki-space-create.md","path":"skills/lark-wiki/references/lark-wiki-space-create.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/references/lark-wiki-space-create.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-space-create.md -->","isInternal":false,"tokens":417,"sizeBytes":1573},{"name":"lark-wiki-space-list.md","path":"skills/lark-wiki/references/lark-wiki-space-list.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/references/lark-wiki-space-list.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2Freferences%2Flark-wiki-space-list.md -->","isInternal":false,"tokens":627,"sizeBytes":2236},{"name":"SKILL.md","path":"skills/lark-wiki/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-wiki/SKILL.md","title":"lark-wiki","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-wiki%2FSKILL.md -->","frontmatter":{"name":"lark-wiki","version":"1.0.3","description":"飞书知识库：管理知识空间、空间成员和文档节点。创建和查询知识空间、查看和管理空间成员、管理节点层级结构、在知识库中组织文档和快捷方式。当用户需要在知识库中查找或创建文档、浏览知识空间结构、查看或管理空间成员、移动或复制节点时使用。当用户给出 doubao.com 的 /wiki/ URL/token 时，也应直接使用本 skill，不要因为域名不是飞书而回退到 WebFetch；路由依据是 URL 路径模式和 token，而不是域名。不负责：上传文件到知识库节点下（走 lark-drive）、编辑文档/表格/Base 内容（走 lark-doc / lark-sheets / lark-base）。","metadata":{"requires":{"bins":["lark-cli"]},"cliHelp":"lark-cli wiki --help"}},"isInternal":false,"tokens":4050,"sizeBytes":12516},{"name":"SKILL.md","path":"skills/lark-workflow-meeting-summary/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-workflow-meeting-summary/SKILL.md","title":"lark-workflow-meeting-summary","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-workflow-meeting-summary%2FSKILL.md -->","frontmatter":{"name":"lark-workflow-meeting-summary","version":"1.0.0","description":"会议纪要整理工作流：汇总指定时间范围内的会议纪要并生成结构化报告。当用户需要整理会议纪要、生成会议周报、回顾一段时间内的会议内容时使用。","metadata":{"requires":{"bins":["lark-cli"],"skills":["lark-meeting"]}}},"isInternal":false,"tokens":2431,"sizeBytes":7150},{"name":"SKILL.md","path":"skills/lark-workflow-standup-report/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-workflow-standup-report/SKILL.md","title":"lark-workflow-standup-report","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-workflow-standup-report%2FSKILL.md -->","frontmatter":{"name":"lark-workflow-standup-report","version":"1.0.0","description":"日程待办摘要：编排 calendar +agenda 和 task +get-my-tasks，生成指定日期的日程与未完成任务摘要。适用于了解今天/明天/本周的安排。","metadata":{"requires":{"bins":["lark-cli"]}}},"isInternal":false,"tokens":1669,"sizeBytes":4626},{"name":"SKILL.md","path":"tests/cli_e2e/cli-e2e-testcase-writer/SKILL.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/tests/cli_e2e/cli-e2e-testcase-writer/SKILL.md","title":"cli-e2e-testcase-writer","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=tests%2Fcli_e2e%2Fcli-e2e-testcase-writer%2FSKILL.md -->","frontmatter":{"name":"cli-e2e-testcase-writer","description":"Use when adding or updating Go CLI E2E coverage for one `tests/cli_e2e/{domain}` domain of the compiled `lark-cli`, especially when the work requires live `--help` or `schema` exploration, scenario-based `clie2e.RunCmd` workflows, and per-domain `coverage.md` maintenance.","metadata":{"requires":{"bins":["lark-cli"]}}},"isInternal":false,"tokens":1405,"sizeBytes":5880},{"name":"fork-verifier-agent.md","path":"skills/lark-apps/creative-design/agents/fork-verifier-agent.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/agents/fork-verifier-agent.md","title":"Subagent: fork-verifier-agent","category":"subagent-persona","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Fcreative-design%2Fagents%2Ffork-verifier-agent.md -->","isInternal":false,"tokens":988,"sizeBytes":3971},{"name":"vision-probe-agent.md","path":"skills/lark-apps/creative-design/agents/vision-probe-agent.md","rawUrl":"https://raw.githubusercontent.com/larksuite/cli/HEAD/skills/lark-apps/creative-design/agents/vision-probe-agent.md","title":"Subagent: vision-probe-agent","category":"subagent-persona","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/larksuite/cli?path=skills%2Flark-apps%2Fcreative-design%2Fagents%2Fvision-probe-agent.md -->","isInternal":false,"tokens":303,"sizeBytes":1310},{"name":".cursorrules","path":".cursorrules (ankra-cli.mdc)","rawUrl":"https://raw.githubusercontent.com/PatrickJS/awesome-cursorrules/main/rules/ankra-cli.mdc","title":"Awesome Cursorrules: ankra cli","category":"cursor-rule","format":"markdown","content":"---\ndescription: \"Ankra CLI rules and best practices for managing Kubernetes clusters via the Ankra platform\"\nglobs: **/*.sh, **/*.yaml, **/*.yml, Makefile, **/Makefile, **/*.md\nalwaysApply: false\n---\n# Ankra CLI Best Practices\n\nAnkra is a Kubernetes cluster management platform. Its CLI (`ankra`) lets you manage organisations, clusters, add-ons, stacks, Helm releases, credentials, and tokens from the terminal.\n\n## Authentication & Configuration\n\n- Authenticate first: `ankra login`\n- Default config lives at `~/.ankra.yaml`; override with `--config <path>`\n- Override the API base URL with `--base-url` or `ANKRA_BASE_URL`\n- Supply an API token via `--token` or `ANKRA_API_TOKEN` (prefer env var in CI)\n- Logout cleanly: `ankra logout`\n\n```yaml\n# ~/.ankra.yaml example\nbase_url: https://api.ankra.io\ntoken: ${ANKRA_API_TOKEN}\n```\n\n## Organisation Management\n\n```bash\nankra org list                          # List accessible organisations\nankra org switch <org-name>             # Switch active organisation\nankra org create <name>                 # Create a new organisation\nankra org invite <email>                # Invite a user to the current org\nankra org members                       # List members of the current org\n```\n\n## Cluster Lifecycle\n\n```bash\nankra cluster list                      # List all clusters in the org\nankra cluster select <name>             # Set the active cluster context\nankra cluster info                      # Show details about the active cluster\nankra cluster provision                 # Provision a new cluster\nankra cluster deprovision               # Deprovision (destroy) the active cluster\nankra cluster reconcile                 # Reconcile cluster to desired state\nankra delete cluster <name>             # Delete a named cluster\n```\n\n- Always run `ankra cluster info` before destructive operations\n- Use `ankra cluster reconcile` after config changes before assuming state is correct\n\n## Add-ons\n\n```bash\nankra cluster addons list               # List installed add-ons\nankra cluster addons available          # List available (installable) add-ons\nankra cluster addons settings <addon>   # Show current settings for an add-on\nankra cluster addons update <addon>     # Update add-on configuration\nankra cluster addons uninstall <addon>  # Uninstall an add-on\n```\n\n## Stacks (Application Stacks)\n\n```bash\nankra cluster stacks list               # List stacks in the cluster\nankra cluster stacks create <name>      # Create a new stack\nankra cluster stacks delete <name>      # Delete a stack\nankra cluster stacks rename <old> <new> # Rename a stack\nankra cluster stacks clone <src> <dst>  # Clone a stack\nankra cluster stacks history <name>     # View stack change history\n```\n\n- Prefer `clone` over `create` when replicating an existing working stack\n- Check `history` before rolling back to understand what changed\n\n## Manifests & Operations\n\n```bash\nankra cluster manifests list            # List deployed manifests\nankra cluster operations list           # List in-progress or recent operations\nankra cluster operations cancel <id>    # Cancel a running operation\n```\n\n## Cluster Agent\n\n```bash\nankra cluster agent status              # Check agent health\nankra cluster agent token               # Retrieve agent bootstrap token\nankra cluster agent upgrade             # Upgrade the in-cluster agent\n```\n\n- Run `agent status` if cluster commands seem unresponsive\n- Rotate the agent token periodically for security\n\n## Helm\n\n```bash\nankra cluster helm releases             # List Helm releases in the cluster\nankra cluster helm uninstall <release>  # Uninstall a Helm release\nankra helm registries                   # List configured Helm registries\nankra helm credentials                  # List Helm registry credentials\n```\n\n## Hetzner Cloud Clusters\n\n```bash\nankra cluster hetzner create            # Create a Hetzner-backed cluster\nankra cluster hetzner scale             # Scale the cluster node count\nankra cluster hetzner upgrade           # Upgrade Kubernetes version\nankra cluster hetzner workers           # Manage worker node groups\nankra cluster hetzner node-group        # Node group management\n```\n\n## Charts\n\n```bash\nankra charts list                       # List available charts\nankra charts search <term>              # Search charts\nankra charts info <chart>               # Detailed chart information\n```\n\n## Credentials\n\n```bash\nankra credentials list                              # List stored credentials\nankra credentials get <name>                        # Retrieve a credential\nankra credentials validate <name>                   # Validate a credential\nankra credentials delete <name>                     # Delete a credential\nankra credentials hetzner --name <n> --token <t>   # Store Hetzner API token\nankra credentials ovh ...                           # Store OVH credentials\nankra credentials upcloud ...                       # Store UpCloud credentials\n```\n\n- Never commit credentials to source control; use `ANKRA_API_TOKEN` env var\n- Validate credentials immediately after creation: `ankra credentials validate <name>`\n\n## Tokens (API Tokens)\n\n```bash\nankra tokens list                       # List API tokens\nankra tokens create --name <name>       # Create a new API token\nankra tokens revoke <id>                # Revoke a token (keeps record)\nankra tokens delete <id>                # Permanently delete a token\n```\n\n## AI Troubleshooting\n\n```bash\nankra chat                              # Start AI-powered troubleshooting session\n```\n\nUse `ankra chat` when facing ambiguous errors — it provides contextual guidance.\n\n## Global Flags\n\n| Flag | Env Var | Description |\n|------|---------|-------------|\n| `--base-url <url>` | `ANKRA_BASE_URL` | Override API base URL |\n| `--token <token>` | `ANKRA_API_TOKEN` | API authentication token |\n| `--config <path>` | — | Path to config file (default `~/.ankra.yaml`) |\n\n## Scripting & Automation Tips\n\n- Export `ANKRA_API_TOKEN` in CI pipelines; never hard-code tokens\n- Use `--token` for one-off scripts where env var injection is not possible\n- Chain `ankra cluster select` before cluster-scoped commands in scripts\n- Pipe output through `jq` for structured processing where JSON output is available\n- Use `ankra cluster operations list` in CI to poll for async operation completion\n- Add `set -euo pipefail` to shell scripts using the Ankra CLI\n\n## Common Workflows\n\n### Provision and configure a new Hetzner cluster\n\n```bash\nankra login\nankra org switch my-org\nankra cluster hetzner create\nankra cluster select my-new-cluster\nankra cluster agent status\nankra cluster addons available\nankra cluster addons update some-addon\nankra cluster reconcile\n```\n\n### Deploy a stack from a chart\n\n```bash\nankra cluster select my-cluster\nankra charts search my-app\nankra charts info my-app\nankra cluster stacks create my-stack\nankra cluster manifests list\n```\n\n### Rotate credentials safely\n\n```bash\nankra tokens create --name ci-token-new\n# Update CI secret with new token\nankra tokens revoke <old-token-id>\nankra credentials validate my-cloud-cred\n```\n","tokens":1574,"sizeBytes":7084}],"systemPromptSnippet":"<yakaai_skills repo=\"larksuite/cli\">\n<!-- File: AGENTS.md (Tokens: ~3136 | Category: root-instruction) -->\n# AGENTS.md\n\n## Purpose\n\n`lark-cli` is the official Lark/Feishu CLI for humans and AI agents. Optimize\nfor predictable machine-readable behavior without making the human CLI worse.\n\nKeep each PR focused on one goal: CLI UX, reliability, simpler explicit code,\nor a useful gate. Done means the correct implementation surface, preserved\ncontracts unless a break was requested, and reported checks.\n\nPublic behavior, tests, lint, and CI define current contracts. Existing code is\nevidence, but a legacy exception is not precedent; `Proposal` documents are\ndirection only. Do not mix unrelated cleanup, hand-edit generated files, weaken\ngates, or broaden allowlists to make CI pass.\n\n## Implementation Discipline\n\nUse this sequence for product behavior or enforcement changes:\n\n1. Establish the current contract and owner before choosing a solution. Trace the\n   flow from the command or shortcut through runtime and internal owners to wire\n   output; inspect affected callers and tests, then choose the surface below.\n2. Apply YAGNI to scope. Implement the behavior required now; do not add\n   speculative modes, configuration, compatibility paths, extension points, or\n   scaffolding.\n3. Reuse the project's existing machinery before creating a parallel path.\n   Prefer the owning generic, runtime, or internal surface, then the Go standard\n   library or an existing dependency, while preserving the contracts below.\n4. Fix the root cause at the narrowest cohesive boundary shared by affected\n   callers. Keep command and domain policy at the caller unless there is a real\n   cross-command invariant for an internal owner to enforce.\n5. Ship the smallest complete change: implementation, a revert-failing regression\n   test for behavior or enforcement, and required contract or guidance updates.\n\nOptimize for minimum owned complexity, not minimum diff or line count. A correct\nroot-cause fix may touch the owner, callers, tests, and docs; a one-line workaround\nat the wrong layer is not simpler. Prefer deletion and boring explicit code, and\navoid one-use abstractions or new dependencies for straightforward behavior.\n\nYAGNI never overrides explicit requirements or output, error, path, security,\ncompatibility, and data-safety contracts. If a deliberately limited solution has\na real ceiling, document the ceiling and the concrete condition for expanding it\nat the decision point.\n\n## Build\n\nRun `make build` for the canonical local build; it writes `./lark-cli` with\nversion metadata and the committed Catalog Snapshot embedded from\n`internal/registry/catalog/manifest.json` plus\n`internal/registry/catalog/services/*.json`. Build and test targets consume this\ntracked snapshot without a metadata fetch or Python prerequisite.\n`make live-skills-test` additionally requires working `npx` and network access.\n\n## Choose the Correct Surface\n\n| Need | Implement in | Rule |\n|------|--------------|------|\n| Agent/human-friendly workflow, composition, or smart defaults | `shortcuts/<domain>/` via `common.Shortcut` | Must add UX or workflow value beyond exposing one endpoint. |\n| One-to-one supported OpenAPI method | Committed Catalog Snapshot under `internal/registry/catalog/manifest.json` plus `services/*.json`, and generic `cmd/service/` machinery | Verify it with `schema`. Update the manifest and matching service snapshot together; do not add a shortcut merely to expose a missing catalog method. |\n| Arbitrary OpenAPI endpoint | Generic `cmd/api/` machinery | Keep it endpoint-agnostic. |\n| Auth, config, profile, update, or CLI lifecycle | `cmd/<area>/` plus the owning shared/internal package | Keep new Cobra code as wiring when a lower owner exists. |\n| EventKey, payload shape, or domain projection | `events/<domain>/` | Shared event mechanics stay in `internal/event/`; CLI assembly stays in `cmd/event/`. |\n| Command-independent mechanism or cross-command invariant | Owning `internal/<area>/` package | Keep UX/domain policy at the caller; use a cohesive owner, not a generic utils package. Test the owner and affected caller contracts. |\n| Public plugin or host integration | `extension/` | Exported symbols are compatibility commitments; orchestration stays internal. |\n| Per-command decision guidance: when, avoid, prerequisites, tips, or examples | `affordance/<domain>.md` | Enrich `--help` and `schema` without restating command descriptions, flags, or field schemas. |\n| Domain routing, concepts, safety, or cross-command agent workflow | `skills/<name>/SKILL.md` and `references/` | Keep always-needed decisions in `SKILL.md`, conditional HOW in references, and link commands from affordance. |\n\nDo not duplicate one command surface inside another. Register new shortcuts in\nthe domain's `Shortcuts()`; declare risk, identities/scopes, flags, and dry-run.\n\n## Source Layout\n\n| Path | What it does |\n|------|-------------|\n| `cmd/root.go` | Entry point, command registration, strict mode pruning |\n| `cmd/profile/` | Multi-profile management (add/list/use/rename/remove) |\n| `cmd/config/` | Config init, show, strict-mode |\n| `cmd/service/` | Auto-registers API commands from `internal/registry/catalog/manifest.json` and `internal/registry/catalog/services/*.json` |\n| `shortcuts/common/runner.go` | Shortcut execution pipeline, Flag.Input (@file/stdin) resolution |\n| `shortcuts/` | Domain-specific shortcut implementations |\n| `internal/cmdutil/factory.go` | Factory pattern — identity resolution, credential, config |\n| `internal/cmdutil/factory_default.go` | Production factory wiring |\n| `internal/credential/` | Credential provider chain (extension → default) |\n| `extension/credential/` | Plugin-facing credential interfaces and env provider |\n| `internal/client/client.go` | APIClient: DoSDKRequest, DoStream |\n| `internal/core/config.go` | Multi-profile config loading/saving |\n| `internal/vfs/` | Filesystem abstraction (use `vfs.*` instead of `os.*`) |\n| `internal/validate/path.go` | Path safety validation |\n\n## Hard Contracts\n\nRead the [JSON output contract](README.md#json-output-contract) before changing\nwire output. Read the [source guard guide](lint/README.md) and `.golangci.yml`\nbefore changing or waiving enforcement.\n\n- Command/flag semantics, help/schema metadata, output placement and shapes,\n  errors, exit codes, risk/identity, and exported APIs are compatibility contracts.\n  When forwarding or echoing accepted input, preserve it verbatim unless its\n  contract defines normalization; never silently substitute another behavior.\n- Success data goes to stdout; typed failure envelopes, progress, warnings, and\n  hints go to stderr. Predicate/self-contained results and partial failures are\n  documented exceptions whose complete result remains on stdout.\n- Keep new or touched Cobra code as wiring. Lark/Feishu API calls in shortcuts go\n  through `*common.RuntimeContext`; direct HTTP is only for non-gateway protocols\n  such as presigned storage and requires a precise `//nolint:forbidigo` reason.\n- Keep user/workspace FileIO invocation-scoped: use `runtime.FileIO()`,\n  `runtime.ValidatePath()`, and `runtime.ResolveSavePath()` so portable commands do\n  not assume a local host or process working directory.\n- Shortcuts do not use `internal/vfs` for user/workspace files. A narrow\n  `//nolint:depguard` waiver is allowed only for CLI-owned state or explicitly\n  CLI-managed host configuration; explain that ownership boundary. Other internal\n  filesystem code uses `internal/vfs` and validates paths.\n- If FileIO lacks a host-local tree operation, prefer an owning `internal/` package\n  or optional capability. Direct `os` calls require a stated local-only boundary,\n  validated and bounded paths, and a precise `//nolint:forbidigo` reason.\n- Do not hardcode resolver-owned hosts. At new API boundaries, or when changed\n  behavior consumes fields from a loose map, project that shape into a typed\n  struct before downstream use. Extend published interfaces through optional\n  interfaces rather than breaking external implementations.\n- Source guards enforce raw HTTP/os/vfs, resolver-host, and migrated-error\n  constructs; other semantics rely on tests and review. Every exemption must be\n  narrow, local, and explain why the safe path does not apply.\n\n## Structured Errors\n\nBefore changing a command failure, taxonomy, or error wire field, read the\n[error contract](errs/ERROR_CONTRACT.md); it owns constructor selection, wrapping,\nextension fields, stability, and CI guards.\n\n- Command-facing failures use typed `errs.*` unless the error contract defines\n  an output-control exception. Never return a final plain `fmt.Errorf` /\n  `errors.New` or ad hoc envelope; pass typed errors through and preserve causes.\n- Lark API failures use a domain typed wrapper, `runtime.CallAPITyped`, or\n  `runtime.DoAPIJSONTyped`; raw callers use `runtime.ClassifyAPIResponse` or\n  `errclass.BuildAPIError`.\n- `param` names only failing user input; recovery belongs in `hint`. Populate\n  `missing_scopes`, `log_id`, and similar fields only from known runtime evidence.\n- Error tests assert typed metadata and cause preservation, not message text alone.\n\n## Affordance and Skills\n\nBefore editing command guidance, read the [affordance guide](affordance/README.md).\nFor plugin distributions, read [Ship skills and command guidance](extension/platform/README.md#ship-skills-and-command-guidance).\n\n- Go metadata/schema owns WHAT; affordance owns command-level WHEN; `SKILL.md`\n  owns domain routing, concepts, safety, and cross-command workflows; `references/`\n  owns detailed or conditional HOW.\n- Do not duplicate canonical descriptions, schemas, or generic error taxonomy.\n  Keep workflow-specific recovery in a skill when it changes agent behavior;\n  affordance examples remain runnable, current, and safe.\n- Skill frontmatter `description` is a concise WHAT/WHEN/NOT routing trigger. Keep\n  always-needed decisions in `SKILL.md`; move conditional detail to `references/`.\n- Skill names and reference paths are public pointers. Every path reachable from\n  shipped docs must ship. Before referencing a new content directory, update\n  `content_embed.go` and add an embedded-FS reachability test; `assets/` and\n  `scripts/` stay source-only unless the distribution contract changes.\n\n## Tests\n\n- Every behavior change needs a nearby test that fails if the implementation is\n  reverted; assert fields, requests, typed errors, or side effects directly.\n- Command/shortcut tests needing a Factory use `cmdutil.TestFactory(t, config)`;\n  isolate config with\n  `t.Setenv(\"LARKSUITE_CLI_CONFIG_DIR\", t.TempDir())`.\n- Tests must not depend on developer profiles, keychains, home directories,\n  execution order, or real credentials unless explicitly live.\n- Live E2E flows are self-contained: create, use, and clean up even after failure.\n\n| Shortcut change | Dry-run E2E | Live E2E |\n|-----------------|:-----------:|:--------:|\n| New shortcut | Required | Required |\n| Flags or request params | Required | Required if behavior changes |\n| Bug fix | Required | Required when risk reaches the API boundary |\n| Internal refactor, no behavior change | Not needed | Not needed |\n\nDry-run tests use placeholder credentials and assert method, URL, params, and\nbody without a real API call. Confirm contracts with `--help` and `schema` first.\nIf no deterministic, cleanable live flow exists, do not leak tenant state or add\na flaky test; document the blocker, fixture conditions, and substitute evidence.\n\n## Validation\n\nRun the narrowest useful check while iterating, then broaden with risk:\n\n| Change | Checks |\n|--------|--------|\n| Go package | `go test ./path/to/package/...`, then the pre-PR Go checks below |\n| Broad/cross-cutting | `make test` |\n| Committed command/help/schema surface | `make quality-gate` |\n| Skills | `node scripts/skill-format-check/index.js`, then `make quality-gate` after committing the change |\n| Affordance | Add/update `internal/affordance/*_source_test.go`; run `go test ./internal/affordance ./cmd/service ./internal/schema` |\n| Make-covered scripts/workflows | `make script-test` |\n| Public plugin SDK | `make examples-build` plus relevant `tests/plugin_e2e` |\n| Auth sidecar | `make sidecar-test` |\n| Skills sync behavior | `make live-skills-test` |\n| Dependencies | `go mod tidy` plus the CI `go-licenses` check |\n\n`make quality-gate` and diff-scoped linters compare the base with `HEAD`; they\nignore staged, unstaged, and untracked changes, so run them after committing.\nSome skill-quality signals are warnings; frontmatter has the separate hard check\nabove. The gate does not validate affordance examples or references in this file:\nrun the focused source test and verify changed paths/symbols directly.\n\n`make test` currently leaves root binaries `audit-observer` and `readonly-policy`; do not stage them.\n\nBefore a Go PR, run `make unit-test`, `make vet`, and `make fmt-check`;\n`go mod tidy` must leave module files unchanged. Set\n`QUALITY_GATE_CHANGED_FROM` to the PR base before diff-scoped checks. Pinned\n`go run module@version` commands need module access unless cached.\n\n```bash\ngo mod tidy\ngit diff --exit-code -- go.mod go.sum\ngo run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.1.6 run --new-from-rev=\"$QUALITY_GATE_CHANGED_FROM\"\ngo run -C lint . --changed-from \"$QUALITY_GATE_CHANGED_FROM\" ..\ngo test -C lint ./... -count=1\ngo run github.com/google/go-licenses/v2@v2.0.1 check ./... --disallowed_types=forbidden,restricted,reciprocal,unknown\n```\n\nCI is authoritative; state exactly which relevant checks were not run.\n\n## Maintaining This File\n\nAdd a root rule only when it is repository-specific, non-obvious, actionable,\nand prevents a recurring failure or high-impact contract breach. Prefer code,\ntests, or CI for mechanizable constraints; keep only rationale and safe exceptions\nhere. Update named references in the same PR, and delete or move stale, obvious,\nredundant, task-local, or fully enforced rules. Each edit should reduce ambiguity,\nnot only add text.\n\n## Commit and PR\n\nUse English Conventional Commits/PR titles, complete the PR template, and never\ncommit secrets, tokens, internal endpoints, or sensitive test data.\n\n<!-- File: internal/qualitygate/skillscan/testdata/skills/lark-demo/SKILL.md (Tokens: ~67 | Category: anthropic-skill) -->\n---\nname: lark-demo\ndescription: Demo skill\n---\n\n```bash\n# comment\nlark-cli docs +fetch --api-version v2 --doc A3Ijdemo\nlark-cli im messages list \\\n  --container-id oc_xxx \\\n  --page-size 20\nnpx other-tool\n```\n\n<!-- File: isolated-skills/lark-suite/SKILL.md (Tokens: ~690 | Category: anthropic-skill) -->\n---\nname: lark-suite\nversion: 0.1.0\ndescription: 飞书/Lark 聚合能力入口：管理飞书/Lark 产品能力（<!-- LARK_SUITE_KEYS -->等）。当 doubao.com 及其子域名承载飞书资源时也使用本入口，不要回退到 WebFetch。当用户需求涉及上述飞书业务域时使用。\nmetadata:\n  requires:\n    bins:\n      - lark-cli\n---\n\n# Lark Suite\n\n你是飞书/Lark 能力的聚合路由层。你的职责是先判断用户要使用哪个 `lark-*` 子能力，再读取并遵循对应子能力的说明。\n\n`lark-suite` 不直接承载具体 API 操作步骤。除非对应子能力已被读取，否则不要仅根据本文件拼命令、猜参数或执行复杂操作。\n\n所有子能力统一收纳在当前 skill 的 `references/` 目录。选择 `lark-foo` 后，直接读取 `references/lark-foo/GUIDE.md`；不要再次调用 `Skill(lark-foo)`，也不要使用 Find/Glob 遍历或探测整个 references 目录。\n\n## 使用流程\n\n1. 根据用户意图从下方路由表选择一个或多个子能力；即使用户尚未提供链接、ID 或具体工作表，也先选择能力，再由子能力询问缺失信息。\n2. 直接读取 `references/<skill-name>/GUIDE.md` 加载所选子能力，不要把收纳后的子能力当作独立 skill 再次调用。\n3. 仅使用本文件列出的路由与对应子能力入口，不要遍历或探测其他技能目录。\n4. 如果目标能力未列出，返回无法路由的明确提示。\n5. 仅读取当前已选子能力明确要求的前置文件。\n6. 按目标子能力的说明执行；认证、租户、身份、权限和通用排障优先遵循 `lark-shared`。\n\n多步任务可以组合多个子能力，但每一步都应由具体子能力驱动。例如“查联系人并发消息”先用 `lark-contact` 解析身份，再用 `lark-im` 发消息。\n\n## 能力路由\n\n根据用户意图从以下条目选择对应子能力；如果一个任务涉及多个能力，按实际操作顺序逐步读取并使用对应子能力。\n\n<!-- LARK_SUITE_ROUTES -->\n\n<!-- File: scripts/skill-format-check/tests/bad-skill-no-frontmatter/SKILL.md (Tokens: ~15 | Category: anthropic-skill) -->\n# No Frontmatter Skill\n\nThis skill completely lacks a YAML frontmatter.\n\n<!-- File: scripts/skill-format-check/tests/bad-skill-unclosed-frontmatter/SKILL.md (Tokens: ~55 | Category: anthropic-skill) -->\n---\nname: bad-skill-unclosed\nversion: 1.0.0\ndescription: \"This skill has an unclosed frontmatter block.\"\nmetadata: {}\n\n# Unclosed Frontmatter Skill\n\nThis frontmatter does not have a closing `---` block.\n\n<!-- File: scripts/skill-format-check/tests/bad-skill/SKILL.md (Tokens: ~29 | Category: anthropic-skill) -->\n---\nversion: 1.0.0\nmetadata: {}\n---\n\n# Bad Skill\n\nThis skill is missing required fields like name and description.\n\n<!-- File: scripts/skill-format-check/tests/good-skill-complex/SKILL.md (Tokens: ~97 | Category: anthropic-skill) -->\n---\nname: good-skill-complex\nversion: 2.5.1-beta\ndescription: >\n  A very complex description\n  that spans multiple lines\n  and contains weird chars: !@#$%^&*()\nmetadata:\n  requires:\n    bins: [\"lark-cli\", \"node\"]\n  cliHelp: \"lark-cli something --help\"\n  customField: \"customValue\"\n---\n\n# Complex Skill\n\nThis skill has a complex frontmatter block.\n\n<!-- File: scripts/skill-format-check/tests/good-skill-minimal/SKILL.md (Tokens: ~40 | Category: anthropic-skill) -->\n---\nname: good-skill-minimal\nversion: 0.1.0\ndescription: Minimal valid description\nmetadata: {}\n---\n\n# Minimal Skill\n\nThis has the bare minimum required fields.\n\n<!-- File: scripts/skill-format-check/tests/good-skill/SKILL.md (Tokens: ~52 | Category: anthropic-skill) -->\n---\nname: good-skill\nversion: 1.0.0\ndescription: \"This is a properly formatted skill.\"\nmetadata:\n  requires:\n    bins: [\"lark-cli\"]\n---\n\n# Good Skill\n\nThis skill follows all the formatting rules.\n\n<!-- File: skills/lark-approval/references/lark-approval-approvals-get.md (Tokens: ~1667 | Category: anthropic-skill) -->\n# approval approvals get\n\n获取单个审批定义详情（用户级只读操作）。适合在发起审批实例前，先确认审批名称、表单控件结构、选项值范围以及流程节点信息。\n\n需要的 scopes: [\"approval:approval:read\"]\n\n## 命令\n\n```bash\n# 按 approval_code 查询审批定义详情\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user\n\n# 表格格式输出，便于快速浏览顶层字段\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{...}'` | 是 | 查询参数，使用 JSON 传入 |\n| `approval_code` | 是 | 审批定义 Code；通常来自 `approval approvals search` 的结果 |\n| `locale` | 否 | 返回语言，例如 `zh-CN`、`en-US`、`ja-JP` |\n| `--as user` | 否 | 建议显式指定用户身份；审批定义详情通常按当前用户可见范围读取 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 常见输入来源\n\n如果你已经有 `approval_code`，可直接查询：\n\n```bash\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user\n```\n\n如果你还没有 `approval_code`，先搜索可发起审批定义：\n\n```bash\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user\n```\n\n## 输出重点字段\n\n返回结果中，优先关注以下字段：\n\n| 字段 | 说明 |\n|------|------|\n| `approval_code` | 审批定义 Code |\n| `approval_name` | 审批定义名称；确认是不是用户想发起的那张单 |\n| `form` | 表单定义快照；用于识别控件 `id`、`type`、选项值范围、明细子控件结构 |\n| `node_list` | 流程节点列表；用于识别节点 key、是否需要补充审批人、是否允许多人 |\n\n## form 的使用重点\n\n`form` 最重要的作用是帮助 agent **识别怎么组装 `instances.create.data.form`**，而不是直接把它原样提交出去。\n\n重点看：\n\n| 字段 / 结构 | 说明 |\n|------|------|\n| `form[].id` | 控件 ID；后续创建实例时必须使用 |\n| `form[].type` | 控件类型，例如 `input`、`date`、`radio`、`checkbox`、`fieldList` |\n| `form[].value` / 选项定义 | 用来识别可选值范围、默认值或选项值 |\n| 明细 / 子控件结构 | 用于识别 `fieldList`、控件组等复杂控件的子字段结构 |\n\n**注意：`approvals.get.form` 不是 `instances.create` 可直接复用的 payload 模板。** 它是“定义快照”，主要用于识别字段结构与选项值范围。\n\n## node_list 的使用重点\n\n`node_list` 主要用于后续决定是否要补 `node_approver_list` / `node_cc_list`。\n\n重点看：\n\n| 字段 | 说明 |\n|------|------|\n| `node_list[].custom_node_id` | 自定义节点标识；后续补节点参数时优先作为 key |\n| `node_list[].node_id` | 节点 ID；若没有 `custom_node_id`，通常退回用它做 key |\n| `node_list[].need_approver` | 是否要求发起人补充审批人 |\n| `node_list[].approver_chosen_multi` | 是否允许为该节点选择多个审批人 |\n\n## 使用建议\n\n- **这是发起原生审批实例前的必要只读步骤。** 推荐固定走：`approvals search` -> `approvals get` -> `instances create`。\n- **如果用户已经明确给了 `approval_code`，直接用这个命令。** 不必再走 `approvals search`。\n- **先确认 `approval_name`。** 避免把相似名称的审批定义搞混。\n- **先用 `form` 识别控件结构，再组装创建 payload。** 不要在未看详情时猜控件 `id`、`type` 或选项值。\n- **先用 `node_list` 看是否需要补审批人。** 若某节点 `need_approver=true`，创建实例时通常要补 `node_approver_list`。\n- **`node_list` 的 key 优先取 `custom_node_id`。** 若不存在，再使用 `node_id`。\n- **`approver_chosen_multi=false` 时，一个节点通常只能补一个审批人。**\n\n## 输出与后续操作\n\n读取定义详情后，常见下一步：\n\n```bash\n# 发起原生审批实例\nlark-cli approval instances create --data '{\"approval_code\":\"<APPROVAL_CODE>\",\"form\":\"[...]\"}' --as user --yes\n```\n\n如果需要进一步理解控件取值与节点参数，优先参考：\n\n- `lark-approval-instance-form-control-parameters.md`\n- `lark-approval-instance-value-sourcing.md`\n- `lark-approval-initiate.md`\n\n## 结果整理方式\n\n**将结果整理为“审批定义概览 + 表单结构摘要 + 节点要求摘要”。**\n\n建议输出成下面这种结构：\n\n```text\n审批定义：请假申请\napproval_code: 7C468A54-8745-2245-9675-08B7C63E7A85\n\n表单控件摘要：\n- leave_type: radio，可选值 [annual_leave, sick_leave]\n- reason: textarea\n- start_end: dateInterval\n\n节点要求摘要：\n- manager_node：need_approver=true，approver_chosen_multi=false\n- hr_node：need_approver=false\n```\n\n<!-- File: skills/lark-approval/references/lark-approval-approvals-search.md (Tokens: ~1341 | Category: anthropic-skill) -->\n# approval approvals search\n\n搜索**当前用户可发起**的审批定义（launchable approvals）。只读操作，不会创建审批实例。\n\n需要的 scopes: [\"approval:approval:read\"]\n\n## 命令\n\n```bash\n# 按关键词搜索可发起审批定义\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user\n\n# 使用 page_token 翻页\nlark-cli approval approvals search --data '{\"keyword\":\"请假\", \"page_token\":\"example_page_token\"}' --as user\n\n# 表格格式输出，便于快速浏览候选定义\nlark-cli approval approvals search --data '{\"keyword\":\"出差\"}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 查询参数，使用 JSON 传入 |\n| `keyword` | 是 | 搜索关键词，例如 `请假`、`报销`、`出差`、`采购` |\n| `locale` | 否 | 返回语言，例如 `zh-CN`、`en-US`、`ja-JP` |\n| `page_size` | 否 | 分页大小 |\n| `page_token` | 否 | 翻页标记；首次请求不填，后续使用上一次返回的 `page_token` |\n| `--as user` | 否 | 建议显式指定用户身份；“可发起审批定义”是面向当前用户的查询 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 这个命令解决什么问题\n\n当用户只有自然语言意图，还没有 `approval_code` 时，先用它把“可发起的审批定义候选项”找出来。\n\n典型场景：\n\n- “帮我找一下请假审批”\n- “有哪些可以发起的报销单？”\n- “先搜一下出差审批，再帮我提单”\n\n## 输出重点字段\n\n返回结果里，优先关注以下字段：\n\n| 字段 | 说明 |\n|------|------|\n| `approval_code` | 审批定义 Code；后续 `approvals get` 和 `instances create` 都要用它 |\n| `approval_name` | 审批定义名称；给用户做候选选择时最关键 |\n| `is_external` | 是否为三方审批定义；`true` 表示不能走原生 `instances.create` |\n| `create_link` | 三方审批定义的发起链接；`is_external=true` 时优先返回给用户 |\n\n## 使用规则\n\n- **这是发起审批工作流的第一步。** 标准顺序是：`approvals search` -> `approvals get` -> `instances create`。\n- **搜索结果为空时，不要猜。** 直接告诉用户当前关键词下没有可发起定义，并建议用户换关键词。\n- **命中多个结果时，不要替用户拍板。** 先把候选定义列出来，让用户选择目标审批定义。\n- **`is_external=true` 时不要调用 `approval instances create`。** 这类定义属于三方审批，优先返回 `create_link` 并说明需要通过链接发起。\n- **只有 `is_external=false` 的原生定义，才继续 `approvals get`。**\n- **如果用户已经明确给出 `approval_code`，不要再 search。** 直接执行 `approval approvals get`。\n\n## 结果整理方式\n\n**将结果整理为候选清单，优先展示“名称 + approval_code + 是否三方定义 + 下一步建议”。**\n\n建议输出成下面这种结构：\n\n```text\n找到 3 个可发起审批定义：\n\n1. 请假申请\n   - approval_code: 7C468A54-8745-2245-9675-08B7C63E7A85\n   - is_external: false\n   - next: 可继续读取 definitions 详情（approvals get）\n\n2. 差旅报销\n   - approval_code: 99887766-xxxx\n   - is_external: true\n   - next: 返回 create_link，引导用户通过链接发起\n```\n\n## 常见后续操作\n\n### 1）用户选中了某个定义，继续查看详情\n\n```bash\nlark-cli approval approvals get --params '{\"approval_code\":\"<APPROVAL_CODE>\"}' --as user\n```\n\n### 2）确认是原生定义后，再准备发起审批实例\n\n```bash\nlark-cli approval instances create --data '{\"approval_code\":\"<APPROVAL_CODE>\",\"form\":\"[...]\"}' --as user --yes\n```\n\n### 3）确认是三方定义时，直接返回链接\n\n当 `is_external=true` 时，优先向用户返回 `create_link`，说明该审批需在三方系统或跳转页面中发起，而不是通过原生 `instances.create`。\n\n<!-- File: skills/lark-approval/references/lark-approval-initiate.md (Tokens: ~4130 | Category: anthropic-skill) -->\n# 审批提单工作流\n\n## 执行摘要\n\n- **原生审批提单如果用户未明确给出 `approval_code`，必须固定走 `approvals search` -> `approvals get` -> `instances create`** 不要跳过 `get` 直接拼请求。\n- **原生审批提单如果用户明确给出 `approval_code`，固定走 `approvals get` -> `instances create`** 不要跳过 `get` 直接拼请求。\n- **`is_external=true` 的定义是三方定义。** 这类定义不要调用 `instances create`，应优先使用 `create_link`。\n- **所有人员类参数默认使用 `open_id`。** 若用户给的是姓名、邮箱或其他身份，先用 [`../../lark-contact/SKILL.md`](../../lark-contact/SKILL.md) 解析。\n- **先读控件参数 reference 和值来源 reference，再读本文里的创建参数规则。** 提单前必须先阅读 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 和 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md)。\n- **`approvals.get.form` 不是创建 payload 的原样模板。** 它主要用于识别控件 `id`、`type`、选项值范围和明细子控件结构；真正的 `instances create --data.form` 中，控件 `value` 结构以 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 为准。\n- **节点参数只从 `node_list` 和本文里的节点参数规则里取。** 节点 key 必须来自定义详情返回的节点标识；审批人/抄送人列表传用户 ID 时，不要混用姓名或其他身份标识。\n- **看到 `need_approver=true` 就说明该节点需要发起人补充审批人。** 如果 `approver_chosen_multi=false`，该节点只允许一个 `open_id`。\n- **创建实例前先确认。** `approval instances create` 是写操作，执行前，让用户确认最终定义、表单值和节点参数；真正执行时显式传 `--yes`。\n\n## 适用场景\n\n- “帮我提交一个请假审批”\n- “帮我发起报销审批”\n- “我想提一个出差审批”\n- “先搜可发起的审批，再帮我提单”\n\n## 严禁行为\n\n- **严禁在未先阅读本文中的创建参数规则、[`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 和 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md) 的情况下直接提单。**\n- **严禁跳过 `approvals.get`。** 未拿到 `form` 和 `node_list` 前，不得调用 `instances create`。\n- **严禁把姓名直接写进 `node_approver_list`、`node_cc_list` 或表单人员控件。** 必须先转成 `open_id`。\n- **严禁对三方定义调用 `instances create`。**\n- **严禁对 API 不支持的控件硬提单。** 如果目标定义包含创建实例 API 不支持的控件，应明确告诉用户该定义不能仅通过 API 完整发起。\n- **严禁把 `approvals.get.form` 当成可直接提交的原样模板。**\n- **严禁在未得到用户确认前直接执行真实提单。**\n\n## 工作流\n\n### 1. 搜索可发起审批定义\n\n先搜索定义：\n\n```bash\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}'\n```\n\n处理规则：\n\n- 若结果为空，告诉用户当前关键词下没有可发起定义。\n- 若命中多个定义，必须把候选项列给用户选择，不要自行猜测。\n- 若目标定义 `is_external=true`，优先返回 `create_link`，说明这是三方定义，不能走原生 `instances create`。\n- 只有 `is_external=false` 的原生定义才继续下一步。\n\n### 2. 获取审批定义详情\n\n拿到 `approval_code` 后，读取定义详情：\n\n```bash\nlark-cli approval approvals get \\\n  --params '{\"approval_code\":\"7C468A54-8745-2245-9675-08B7C63E7A85\"}'\n```\n\n重点关注返回：\n\n- `approval_name`: 当前发起的是哪个审批定义。\n- `form`: 表单定义快照，用于识别控件 `id`、`type`、选项值范围以及明细子控件结构；不是创建实例时可直接原样提交的 payload 模板。\n- `node_list`: 流程节点信息，是后续 `node_approver_list` / `node_cc_list` 的唯一可靠来源。\n\n### 3. 创建请求参数速查\n\n输入参数如下：\n\n| 参数 | 必填 | 说明 |\n|---|---|---|\n| `--data '{...}'` | 是 | 请求体，使用 JSON 传入 |\n| `approval_code` | 是 | 审批定义 Code；必须先通过 `approvals search` / `approvals get` 确认 |\n| `form` | 否 | 表单值，**JSON 数组字符串**，不是普通对象；API 层非必填，但审批定义存在必填控件或用户需要提交表单值时必须传 |\n| `node_approver_list` | 否 | 节点审批人列表；仅在定义要求补充审批人时传 |\n| `node_cc_list` | 否 | 节点抄送人列表；仅在用户明确需要补充节点抄送人时传 |\n| `uuid` | 否 | 幂等标识；重复重试同一请求时建议显式传入 |\n| `--as user` | 否 | 建议显式指定用户身份；审批发起通常应使用用户身份 |\n| `--yes` | 是 | 写操作确认；真实执行时必须显式传入 |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n### 4. 组装 `form`\n\n`instances create --data.form` 是可选字段；传入时必须是一个 JSON 数组字符串。无表单或无需填写表单值的审批可省略 `form`，但只要审批定义包含需要提交的控件，就必须按控件结构组装后传入。组装原则：\n\n- 先用 `approvals.get.form` 识别有哪些控件、每个控件的 `id` / `type` / 可选值范围，再按本文中的创建参数规则与 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 重新组装创建 payload。\n- 提交时必须至少保证每个控件的 `id`、`type` 与 `value` 符合当前接口要求；不要假设定义快照里出现的其他字段都能直接照搬。\n- 如果用户提供的是人员信息，优先转换成 `open_id` 后再写入对应控件。\n- 单选/多选控件提交的是选项 `value`，该值可从 `approvals.get.form` 的选项定义中取得。\n- `contact`、`department`、`fieldList`、`dateInterval`、`amount`、`telephone`、`document` 等控件的 `value` 结构各不相同，必须按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 单独组装，不要套用文本控件的写法。\n- 值本身从哪里拿，优先按 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md) 处理；不要把“知道结构”误当成“已经拿到可提交值”。\n- 若 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 标明某控件不支持通过创建实例 API 提交，则不要硬猜绕过；应明确告诉用户该定义当前无法仅通过 API 提单。\n- 若遇到当前 skill 未明确覆盖的复杂控件，不要硬猜；先依据 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 判断支持性与传值结构，再向用户确认。\n\n## API 不支持的控件\n\n根据 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md)，创建审批实例 API 不支持的控件至少包括：\n\n- `text`\n- `mutableGroup`\n- `account`\n- `serialNumber`\n- `tripGroup`\n- `apaascorehrOnboardingGroup`\n- `apaascorehrRegularateGroup`\n- `remedyGroupV2`\n- `apaascorehrJobAdjustGroup`\n- `apaascorehrOffboardingGroup`\n\n如果目标审批定义包含上述控件，不要继续硬拼 `form`；应直接告诉用户该定义不能仅通过当前 API 完整提单。\n\n## 高频控件速查\n\n优先按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 组装，下面只保留最常用、最容易出错的格式：\n\n- `input` / `textarea`: `value` 是字符串\n- `date`: `value` 是 RFC3339 时间字符串\n- `dateInterval`: `value` 是对象，包含 `start` / `end` / `interval`\n- `radio` / `radioV2`: `value` 是单个选项值，取定义详情里的 `option.value`；关联外部选项时传 `options.id`\n- `checkbox` / `checkboxV2`: `value` 是选项值数组\n- `number`: `value` 是数字\n- `amount`: `value` 是数字，还要带 `currency`\n- `formula`: `value` 必须与定义中的公式结果匹配，否则会报错\n- `contact`: 只推荐写 `open_ids`，由人员信息先转换成 `open_id`\n- `connect`: `value` 是关联审批实例 `instance_code` 数组，当前默认要求用户直接提供 `instance_code`\n- `document`: `value` 是对象，至少含 `token` 和 `type=docx`\n- `attachmentV2` / `image` / `imageV2`: `value` 是 file code 数组，当前默认要求用户直接提供\n- `fieldList`: `value` 是二维数组，子项继续按各自控件类型组装\n- `department`: `value` 是对象数组，元素字段名为 `open_id`，其值填写部门的 `open_department_id`\n- `telephone`: `value` 是对象，包含 `countryCode` 和 `nationalNumber`\n- `address`: `value` 是对象数组，至少包含地理库 `id`，可选 `detailAddress`；当前默认要求用户直接提供该 `id`\n\n## 特殊控件组\n\n[`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 还明确给出了若干特殊控件组的提单格式，至少包括：\n\n- `leaveGroupV2`\n- `workGroup`\n- `outGroup`\n- `shiftGroup`\n\n这类控件组不是简单文本控件，通常内部还嵌套 `radioV2`、`date`、`fieldList`、`image`、`contact` 等子控件。遇到这些控件组时：\n\n- 先从 `approvals.get.form` 找到控件组及其子控件 ID\n- 再严格按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 的示例组装 `value`\n- 不要把控件组整体当成普通字符串或扁平对象提交\n\n### 5. 组装节点参数\n\n从 `node_list` 推导节点参数：\n\n- 若某节点 `need_approver=true`，则必须在 `node_approver_list` 中补该节点的审批人。\n- `key` 优先取 `custom_node_id`；若不存在，再用 `node_id`。\n- `value` 是审批人 `open_id` 列表。\n- 若 `approver_chosen_multi=false`，该节点只允许一个审批人 `open_id`。\n- `node_cc_list` 仅在用户明确需要补充节点抄送人时才填写；其 `key/value` 规则与 `node_approver_list` 相同。\n\n### 6. 创建审批实例\n\n创建命令使用 `approval instances create`，需要的 scopes: [\"approval:instance:write\"]\n\n确认最终表单值和节点参数后再执行：\n\n```bash\nlark-cli approval instances create \\\n  --data '{\n    \"approval_code\":\"7C468A54-8745-2245-9675-08B7C63E7A85\",\n    \"form\":\"[{\\\"id\\\":\\\"widget1\\\",\\\"type\\\":\\\"input\\\",\\\"value\\\":\\\"请假半天\\\"}]\",\n    \"node_approver_list\":[\n      {\n        \"key\":\"manager_node_id\",\n        \"value\":[\"ou_xxx\"]\n      }\n    ]\n  }' \\\n  --as user \\\n  --yes\n```\n\n执行规则：\n\n- 执行前先向用户确认：目标审批定义、核心表单值、节点审批人/抄送人。\n- 若需要幂等，可补 `uuid`。\n- 成功后回报 `instance_code` 与 `instance_link`。\n\n## 组装时优先依据的资料\n\n优先级固定如下：\n\n1. 本文中的创建请求参数、节点参数和返回结果说明：决定 `instances create` 要传哪些字段、怎么执行、成功后回什么。\n2. [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md)：决定每种控件的 `value` 结构与支持范围。\n3. [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md)：决定每类值应该从哪里拿，以及当前哪些值必须由用户直接提供。\n4. `approvals.get.form`：提供当前审批定义里实际有哪些控件、控件 `id`、控件 `type`、选项值范围、明细子控件结构。\n5. `approvals.get.node_list`：提供节点 key 与是否需要补充审批人/抄送人的线索。\n\n不要反过来把 `approvals.get.form` 当成第一优先级，更不要把它当成可直接提交的 JSON 模板。\n\n## 最小判断表\n\n| 你手上有什么 | 下一步 |\n|---|---|\n| 只有口语需求，比如“帮我提个请假审批” | 先 `approvals.search` |\n| 已经拿到 `approval_code` | 直接 `approvals.get` |\n| 已拿到 `form` / `node_list`，且用户已给出表单值和审批人 | 组装 `instances create` |\n| `is_external=true` | 返回 `create_link`，不要调 `instances create` |\n\n## 返回结果\n\n完成创建后，至少向用户返回：\n\n- `approval_name`\n- `instance_code`\n- `instance_link`\n\n建议整理为下面这种结构：\n\n```text\n审批已创建成功：\n\n- approval_name: 请假申请\n- instance_code: 19EAC829-F1CB-527F-BE2A-1330422E60C0\n- instance_link: https://...\n```\n\n<!-- File: skills/lark-approval/references/lark-approval-instance-form-control-parameters.md (Tokens: ~7696 | Category: anthropic-skill) -->\n# 审批实例表单控件参数\n\n> 说明：本文尽量保留上游参数文档的原始结构与示例，用于回答“控件 `value` 长什么样”。\n> 当前 `lark-cli` 的推荐取值口径以 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md) 为准；如果两份文档在“值从哪里拿”上存在差异，以后者为准。\n\n在调用创建审批实例接口时需要使用表单控件参数，你可以通过本文了解审批实例内各表单控件的参数说明。\n\n## 准备工作\n\n审批实例的表单控件参数依据审批定义表单来配置，例如，审批定义的表单设计包括了 **单行文本** 和 **日期区间** 控件，则审批实例的表单控件参数就需要为 **单行文本** 和 **日期区间** 控件进行赋值。因此，在操作审批实例表单的控件参数前，应先通过审批定义详情确认表单控件结构。\n\n## 审批实例 API 不支持的控件\n\n创建审批实例 API 未完全支持所有的审批表单控件，不支持的控件如下表所示。如果你必须使用 API 不支持的控件，则不能仅通过当前 API 完成提单。\n\n**控件/控件组** | **Type**                    |\n| ---------- | --------------------------- |\n| 说明         | text                        |\n| 引用多维表格     | mutableGroup                |\n| 收款账户       | account                     |\n| 流水号        | serialNumber                |\n| 出差控件组      | tripGroup                   |\n| 录用控件组      | apaascorehrOnboardingGroup  |\n| 转正控件组      | apaascorehrRegularateGroup  |\n| 补卡控件组      | remedyGroupV2               |\n| 调岗控件组      | apaascorehrJobAdjustGroup   |\n| 离职控件组      | apaascorehrOffboardingGroup\n\n## 通用参数\n\n审批实例的表单控件均包含的参数如下表所示。\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nid | string | 是 | 控件的 ID，需要与审批定义中的控件 ID 保持一致。\ntype | string | 是 | 控件类型。各控件类型取值参见下文 **不同控件的参数** 章节。\nvalue | 不同控件的类型不同 | 是 | 控件的取值。不同控件 value 数据类型也不同，例如单行文本控件的 value 为字符串、联系人的 value 为数组。详情参见下文 **不同控件的参数** 章节。\n\n## 不同控件的参数\n\n本章节提供不同控件的 type 参数值、JSON 示例以及非通用参数说明。\n\n### 单行文本\n\n控件 type 为 input，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"input\",\n    \"value\": \"data\" // string 类型\n}\n```\n\n### 多行文本\n\n控件 type 为 textarea，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"textarea\",\n    \"value\": \"data\" // string 类型\n}\n```\n\n### 日期\n\n控件 type 为 date，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"date\",\n    \"value\": \"2019-10-01T08:12:01+08:00\" // 需满足 RFC3339 格式的 string 类型\n}\n```\n\n### 日期区间\n\n控件 type 为 dateInterval，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"dateInterval\",\n    \"value\": {\n         \"start\":\"2019-10-01T08:12:01+08:00\",\n         \"end\":\"2019-10-02T08:12:01+08:00\",\n         \"interval\": 1.0\n     }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nstart | string | 是 | 开始时间，需满足 RFC3339 格式。\nend | string | 是 | 结束时间，需满足 RFC3339 格式。\ninterval | float | 是 | 时长（天）。\n\n### 单选\n\n控件 type 为 radio/radioV2，JSON 数据示例：\n\n```json\n{                                     \n    \"id\": \"widget1\",\n    \"type\": \"radioV2\",\n    \"value\": \"k2b8mkx0-h71x5gl1234-1\" // string 类型\n}\n```\n\n其中， value 表示选项值，取值范围需要参考相应审批定义中 **单选** 控件 option 的 value 参数。你可以通过审批定义详情返回的 `form` 参数，获取单选控件 option 的 value 取值。如果控件关联了外部选项，则 value 需要传入外部选项的 `options.id`。\n\n### 多选\n\n控件 type 为 checkbox/checkboxV2，JSON数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"checkboxV2\",\n    \"value\": [\"k2b8mkx0-h71x5gl4321-1\"] // string 类型的数组\n}\n```\n其中， value 表示选项值，取值范围需要参考相应审批定义中 **多选** 控件 option 的 value 参数。你可以通过审批定义详情返回的 `form` 参数，获取多选控件 option 的 value 取值。如果控件关联了外部选项，则 value 需要传入外部选项的 `options.id`。\n\n### 数字\n\n控件 type 为 number，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"number\",\n    \"value\": 1234.5678 // float 类型\n}\n```\n\n### 金额\n\n控件 type 为 amount，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"amount\",\n    \"value\": 1234.5678, // float 类型\n    \"currency\":\"USD\"\n}\n```\n\n其中，currency 表示货币种类，取值范围需要参考相应审批定义中 **金额** 控件的 value 参数。你可以通过审批定义详情返回的 `form` 参数，获取金额控件可设置的货币种类。\n\n### 计算公式\n\n控件 type 为 formula，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"formula\",\n    \"value\": 1234.5678 // 该值由审批定义内配置的公式计算出取值，若不匹配则返回报错。\n}\n```\n\n### 联系人\n\n控件 type 为 contact，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"contact\",\n    \"value\": [\"f8ca557e\"], // string 类型的数组\n    \"open_ids\": [\"ou_12345\"] // string 类型的数组\n}\n```\n其中，value 包含的是用户 `user_id`；open_ids 包含的是用户 `open_id`。\n\n### 关联审批\n\n控件 type 为 connect，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"connect\",\n    \"value\": [\"19EAC829-F1CB-527F-BE2A-1330422E60C0\"] // string 类型的数组\n}\n```\n其中，value 包含的是被关联的审批实例 Code，你可以通过审批实例详情能力根据实例 Code 获取实例详情。\n\n### 文档控件\n\n控件 type 为 document，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"document\",\n    \"value\": {\n           \"token\":\"TLLKdcpDro9ijQxA33ycNMabcef\",\n           \"type\":\"docx\",\n    }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\ntoken | string | 是 | 文档的 document_id。\ntype | string | 是 | 文档类型，支持 `docx`。\n\n### 附件\n\n控件 type 为 attachmentV2，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"attachmentV2\",\n    \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"] // string 类型的数组\n}\n```\n其中，value 包含的是上传文件后返回的文件 code。\n\n### 图片\n\n控件 type 为 image/imageV2，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"image\",\n    \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"] // string 类型的数组\n}\n```\n\n其中，value 包含的是上传文件后返回的文件 code。\n\n### 明细/表格\n\n控件 type 为 fieldList，JSON 格式示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"fieldList\",\n    \"value\": [\n         [   \n            {\n                \"id\": \"widget1\",\n                \"type\": \"checkbox\",\n                \"value\": [\"jxpsebqp-0\"]\n            }\n         ]\n     ]\n}\n```\n\n其中 value 是二维数组，根据审批定义内 **明细/表格** 控件所包含的控件，依次设置控件 JSON 值。\n\n### 部门\n\n控件 type 为 department，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"department\",\n    \"value\":[ \n        {\n            \"open_id\": \"od-xxx\"\n        }\n    ]\n}\n```\n\n其中 value 为对象数组，通过 open_id 设置部门的 open_department_id。\n\n### 电话\n\n控件 type 为 telephone，JSON 数据示例：\n\n```json\n{\n    \"id\":\"widget1\",\n    \"type\":\"telephone\",\n    \"value\": {\n        \"countryCode\":\"+86\",\n        \"nationalNumber\":\"13122222222\"\n    }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\ncountryCode | string | 是 | 区号。\nnationalNumber | string | 是 | 电话号。\n\n### 地址\n控件 type 为 address，JSON 数据示例：\n\n```json\n{\n\t\"id\": \"widget1\",\n\t\"type\": \"address\",\n\t\"value\": [{\n\t\t\"id\": \"290557\",\n\t\t\"detailAddress\": \"详细的地址\"\n\t}]\n}\n```\n\nvalue 参数为 []object 类型，参数说明如下：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nvalue | []object | 是 | 非出差控件组场景地址控件仅支持单个地址，传入多个时默认只取第一个\n└ id | string | 是 | 区域ID, 可通过审批的地理库接口获取\n└ detailAddress | string | 否 | 详细的地址，若表单配置中未开启填写详细地址，则会忽略该参数，即使传入也不会生效\n\n### 换班控件组\n\n控件 type 为 shiftGroup，JSON 数据示例：\n\n```json\n{\n    \"id\": \"widget1\",\n    \"type\": \"shiftGroup\",\n    \"value\": {\n         \"shiftTime\": \"2019-10-01T08:12:01+08:00\",\n         \"returnTime\": \"2019-10-02T08:12:01+08:00\",\n         \"reason\": \"ask for leave\"\n     }\n}\n```\n\nvalue 参数为 object 类型，包含参数说明：\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nshiftTime | string | 是 | 换班时间，需满足 RFC3339 格式。\nreturnTime | string | 是 | 对调日期，需满足 RFC3339 格式。\nreason | string | 是 | 换班原因。\n\n### 请假控件组\n\n**请假控件组请求示例**\n```json\n{\n    \"id\": \"widgetLeaveGroupV2\",\n    \"type\": \"leaveGroupV2\",\n    \"value\": [\n      {\n        \"id\": \"widgetLeaveGroupType\",\n        \"type\": \"radioV2\",\n        \"value\": \"7488925543484620819\"\n      },\n      {\n        \"id\": \"widgetLeaveGroupStartTime\",\n        \"type\": \"date\",\n        \"value\": \"2025-08-25T11:30:00+08:00\"\n      },\n      {\n        \"id\": \"widgetLeaveGroupEndTime\",\n        \"type\": \"date\",\n        \"value\": \"2025-08-26T11:35:00+08:00\"\n      },\n      {\n        \"id\": \"widgetLeaveGroupReason\",\n        \"type\": \"textarea\",\n        \"value\": \"123123\"\n      },\n      {\n        \"id\": \"widgetLeaveCertification\",\n        \"type\": \"image\",\n        \"value\": [\n          \"B69F8E26-0EAA-4A92-9B80-DA613CD36136\"\n        ]\n      },\n      {\n        \"id\":\"widgetLeaveCertification\",\n        \"type\":\"image\",\n        \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]\n      },\n      {                                     \n        \"id\": \"widgetLeaveGroupFeedingArrivingLate\",\n        \"type\": \"radioV2\",\n        \"value\": \"30\"\n      },\n      {                                     \n        \"id\": \"widgetLeaveGroupFeedingOffLeaveEarly\",\n        \"type\": \"radioV2\",\n        \"value\": \"30\"\n      }        \n    ]\n}\n```\n\n**请假控件组包含参数说明：**\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nid | string | 是 | 控件组ID，固定为widgetLeaveGroupV2\ntype | string | 是 | 控件组类型，固定为leaveGroupV2\nvalue | object[] | 是 | 控件组的值，值为多个子控件值的列表\n\nvalue中包含的子控件值说明:\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nwidgetLeaveGroupType | radioV2 | ```<br>{<br>\"id\": \"widgetLeaveGroupType\",<br>\"type\": \"radioV2\",<br>\"value\": \"7488925543484620819\"<br>}<br>``` | 假期类型，具体格式可参考单选控件，选项由假勤接口获取，提单时必须包含该控件\nwidgetLeaveGroupStartTime | date | ```<br>{<br>\"id\": \"widgetLeaveGroupStartTime\",<br>\"type\": \"date\",<br>\"value\": \"2019-10-01T08:12:01+08:00\", // 需满足 RFC3339 格式的 string 类型<br>}    <br>``` | 请假开始时间，具体格式可参考日期控件，会根据假期类型自动取整,其中半天假小于12点则认为是上午，小时假则以半小时为粒度向前取整, 提单时必须包含该控件\nwidgetLeaveGroupEndTime | date | ```<br>{<br>\"id\": \"widgetLeaveGroupEndTime\",<br>\"type\": \"date\",<br>\"value\": \"2019-10-01T08:12:01+08:00\", // 需满足 RFC3339 格式的 string 类型<br>}<br>``` | 请假结束时间，具体格式可参考日期控件，会根据假期类型自动取整，其中半天假小于12点则认为是上午，小时假则以半小时为粒度向后取整\nwidgetLeaveGroupReason | textarea | ```<br>{<br>\"id\": \"widgetLeaveGroupReason\",<br>\"type\": \"textarea\",<br>\"value\": \"123123\"<br>}<br>``` | 请假事由，具体格式可参考多行文本控件，哺乳假无需填写，其他情况则根据控件组配置中该控件是否可见以及必填判断\nwidgetLeaveCertification | image | ```<br>{<br>\"id\":\"widgetLeaveCertification\",<br>\"type\":\"image\",<br>\"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]<br>}<br>``` | 请假证明，具体格式可参考图片控件，如果所选假期类型配置要求补充证明则必须传递该值，缺失会报错\nwidgetLeaveGroupFeedingArrivingLate | radioV2 | ```<br>{                                     <br>\"id\": \"widgetLeaveGroupFeedingArrivingLate\",<br>\"type\": \"radioV2\",<br>\"value\": \"30\"<br>}<br>``` | 上班晚到的分钟数，具体格式可参考单选控件，仅哺乳假需要填写，取值范围是0-120分钟，粒度是15分钟，选项从审批定义中该控件的option中获取\nwidgetLeaveGroupFeedingOffLeaveEarly | radioV2 | ```<br>{                                     <br>\"id\": \"widgetLeaveGroupFeedingOffLeaveEarly\",<br>\"type\": \"radioV2\",<br>\"value\": \"30\"<br>}   <br>``` | 下班早走的分钟数，具体格式可参考单选控件，仅哺乳假需要填写，取值范围是0-120分钟，粒度是15分钟，选项即是分钟对应的字符串\n\n**特殊的参数校验报错信息**\nmessage                                            | 说明                           |\n| -------------------------------------------------- | ---------------------------- |\n| leave type id parse error                          | 请假类型不是int64                  |\n| group value is invalid                             | 当前控件组的值无效，请校验是否为空或者校验类型是否为数组 |\n| start time format is not RFC3339                   | 开始时间日期格式非*RFC3339格式*         |\n| end time format is not RFC3339                     | 结束时间日期格式非*RFC3339格式*         |\n| start time is after end time                       | 开始时间晚于结束时间                   |\n| user not in gray                                   | 申请用户不在假勤灰度内                  |\n| leave type not found                               | 请假类型不存在                      |\n| reason is required                                 | 请假原因未填写                      |\n| leave quote should be bigger than 0                | 请假时长需要大于0                    |\n| leave is conflict                                  | 所选时间内已有请假记录，请选择其他时间          |\n| balance is not enough                              | 当前假期类型下假期余额不足                |\n| certification is required                          | 需要上传请假证明                     |\n| arriving late is required                          | 哺乳假需要填写上班晚到时长                |\n| arriving late value is not in the optional items   | 晚到时间不在可选范围内                  |\n| leaving early is required                          | 哺乳假需要填写下班提前时长                |\n| leaving early value is not in the optional items   | 下班提前时间不在可选范围内                |\n| feeding rest daily is 0                            | 哺乳假每日休息时长为0，请重新选择            |\n| the operation is prohibited by the workforce rules | 当前账户已在假勤侧封账，无法提交\n\n### 加班控件组\n\n**加班控件组请求示例**\n```json\n{\n  \"id\": \"widgetWorkGroup\",\n  \"type\": \"workGroup\",\n  \"value\":[\n    {\n      \"id\":\"widgetWorkGroupOvertimeWorkers\",\n      \"type\":\"contact\",\n      \"value\": [\"f8ca557e\"],\n      \"open_ids\": [\"ou_12345\"]\n    },\n    {\n      \"id\": \"widgetWorkGroupType\",\n      \"type\": \"radioV2\",\n      \"value\": \"7259635026038505475\"\n    },\n    {\n      \"id\":\"widgetWorkGroupTimeRangeFieldList\",\n      \"type\":\"fieldList\",\n      \"value\":[\n        [\n          {\n            \"id\":\"widgetWorkGroupStartTime\",\n            \"type\":\"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n          },\n          {\n            \"id\":\"widgetWorkGroupEndTime\",\n            \"type\":\"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n          }\n        ]\n      ]\n    },\n    {\n      \"id\": \"widgetWorkGroupReason\",\n      \"type\": \"textarea\",\n      \"value\": \"111\"\n    }\n  ]\n}\n\n```\n\n**加班控件组参数说明：**\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nid | string | 是 | 控件组ID，固定为widgetWorkGroup\ntype | string | 是 | 控件组类型，固定为workGroup\nvalue | object[] | 是 | 控件组的值，值为多个子控件值的列表\n\nvalue中包含的子控件值说明:\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nwidgetWorkGroupOvertimeWorkers | contact | ```<br>{<br>\"id\":\"widgetWorkGroupOvertimeWorkers\",<br>\"type\":\"contact\",<br>\"value\": [\"f8ca557e\"], <br>\"open_ids\": [\"ou_12345\"]<br>}<br>``` | 加班人员列表，具体格式可参考联系人控件，如果定义中配置「允许代多人提交」则该字段必填，如果是提交人给自己提交需填写提交人的ID\nwidgetWorkGroupType | radioV2 | ```<br>{<br>\"id\": \"widgetWorkGroupType\",<br>\"type\": \"radioV2\",<br>\"value\": \"7259635026038505475\" // 对应的类型选项ID<br>}<br>``` | 加班类型，具体格式可参考单选控件，如果定义中关闭「关联加班规则」则需要填写该字段\nwidgetWorkGroupTimeRangeFieldList | fieldList | ```<br>{<br>\"id\":\"widgetWorkGroupTimeRangeFieldList\",<br>\"type\":\"fieldList\",<br>\"value\":[<br>[<br>{<br>\"id\":\"widgetWorkGroupStartTime\",<br>\"type\":\"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>},<br>{<br>\"id\":\"widgetWorkGroupEndTime\",<br>\"type\":\"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>}<br>]<br>]<br>}<br>``` | 加班时段，具体格式可参考明细控件，如果定义中打开「允许提交多个加班时段」则可以传多个，最多支持30个，否则只会取第一个，单次加班时长不可超过两天\nwidgetWorkGroupReason | textarea | ```<br>{<br>\"id\": \"widgetWorkGroupReason\",<br>\"type\": \"textarea\",<br>\"value\": \"111\"<br>}<br>``` | 加班事由，如果定义中配置了「加班事由」必填，则必须填写该字段\n\n**特殊的参数校验报错信息**\nmessage                                                                            | 说明                           |\n| ---------------------------------------------------------------------------------- | ---------------------------- |\n| the time range list has more than 30 items                                         | 加班时段数量超过30                   |\n| group value is invalid                                                             | 当前控件组的值无效，请校验是否为空或者校验类型是否为数组 |\n| overtime type is required                                                          | 未关联加班规则时，加班类型必填              |\n| work time range is required                                                        | 至少需要一个加班时段                   |\n| start time is after end time                                                       | 开始时间晚于结束时间                   |\n| start time or end time of range is required                                        | 加班时间段的开始时间和结束时间必填            |\n| overtime duration is over 2 days                                                   | 单次加班时长不可超过两天                 |\n| overtime date time zone not support                                                | 加班时段的日期时区信息无法识别              |\n| {date} can not apply overtime                                                      | 所选时间不可申请加班                   |\n| {date} already apply overtime                                                      | 所选时间已经有加班记录                  |\n| {date} no need approval                                                            | 所选日期加班无需申请                   |\n| apply reason is required                                                           | 定义中设置了加班事由为必填，不可为空           |\n| {users} user follow different overtime rules, cannot be submitted in the same form | 所选加班人不在同一个考勤组内，无法同时提交加班      |\n| invalid overtime work application                                                  | 没有有效的加班申请，请重新选择加班日期          |\n| the overtime duration cannot be 0                                                  | 加班时长不能是0                     |\n| the number of apply workers cannot exceed 50                                       | 单次申请加班人数量不可大于50              |\n| apply worker is required                                                           | 必须有加班人，配置置可代多人提交时必须指定加班人     |\n| resigned worker can not apply                                                      | 离职人员不可申请加班                   |\n| overtime duration is over limit                                                    | 加班时长超过限制\n\n### 外出控件组\n\n**外出控件组请求体示例**\n```json\n{\n    \"id\": \"widgetOutGroup\",\n    \"type\": \"outGroup\",\n    \"value\":[\n        {\n            \"id\": \"widgetOutGroupType\",\n            \"type\": \"radioV2\",\n            \"value\":  \"me15yqrf-gmjgbml2vhp-0\"      \n        },\n        {\n            \"id\": \"widgetOutGroupStartTime\",\n            \"type\": \"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n        },\n        {\n            \"id\": \"widgetOutGroupEndTime\",\n            \"type\": \"date\",\n            \"value\":\"2019-10-01T08:12:01+08:00\"\n        },\n        {\n            \"id\": \"widgetOutGroupReason\",\n            \"type\": \"textarea\",\n            \"value\":\"123213\"\n        },\n        {\n            \"id\":\"widgetOutGroupImage\",\n            \"type\":\"image\",\n            \"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]\n        }                    \n    ]   \n}\n\n```\n\n**外出控件参数说明**\n\n参数 | 类型 | 是否必填 | 描述\n---|---|---|---\nid | string | 是 | 控件组ID，固定为widgetOutGroup\ntype | string | 是 | 控件组Type，固定为outGroup\nvalue | object[] | 是 | 控件组的值，值为多个子控件值的列表\n\nvalue中包含的子控件值说明:\n\nid | 类型 | JSON示例 | 描述\n---|---|---|---\nwidgetOutGroupType | radioV2 | ```<br>{<br>\"id\": \"widgetOutGroupType\",<br>\"type\": \"radioV2\",<br>\"value\":  \"me15yqrf-gmjgbml2vhp-0\"      <br>}<br>``` | 外出类型，具体格式可参考单选控件，如果配置了「外出类型」则必填，外出时长单位会选取所选外出类型关联的单位，如果没有配置「外出类型」，则该字段无需填写，计算外出时长时会选取「外出时长」配置的单位\nwidgetOutGroupStartTime | date | ```<br>{<br>\"id\": \"widgetOutGroupStartTime\",<br>\"type\": \"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>}<br>``` | 外出开始时间，具体格式可参考日期控件，如果外出时长单位是半天假，则小于12点则认为是上午，否则认为是下午；如果单位是小时，则会按半小时的粒度向前取整\nwidgetOutGroupEndTime | date | ```<br>{<br>\"id\": \"widgetOutGroupEndTime\",<br>\"type\": \"date\",<br>\"value\":\"2019-10-01T08:12:01+08:00\"<br>}<br>``` | 外出结束时间，具体格式可参考日期控件，如果外出时长单位是半天假，则小于12点则认为是上午，否则认为是下午；如果单位是小时，则会按半小时的粒度向后取整\nwidgetOutGroupReason | textarea | ```<br>{<br>\"id\": \"widgetOutGroupReason\",<br>\"type\": \"textarea\",<br>\"value\":\"123213\"<br>}<br>``` | 外出事由，具体格式可参考多行文本控件，如果定义中「外出事由」必填，则必须填写该控件，如果定义配置无需填写，则无需填写该控件\nwidgetOutGroupImage | image | ```<br>{<br>\"id\":\"widgetOutGroupImage\",<br>\"type\":\"image\",<br>\"value\": [\"D93653C3-2609-4EE0-8041-61DC1D84F0B5\"]<br>}   <br>``` | 外出证明，具体格式可参考图片控件，如果定义中「外出拍照」必填，则必须填写该控件，如果定义配置无需填写，则无需填写该控件\n\n**特殊的参数校验报错信息**\n\nmessage                                               | 说明                           |\n| ----------------------------------------------------- | ---------------------------- |\n| group value is invalid                                | 当前控件组的值无效，请校验是否为空或者校验类型是否为数组 |\n| start time format is not RFC3339                      | 开始时间日期格式非*RFC3339格式*         |\n| end time format is not RFC3339                        | 结束时间日期格式非*RFC3339格式*         |\n| start time and end time must be in the same time zone | 开始时间与结束时间必须是同一时区             |\n| out type is required                                  | 如果定义中设定了「外出类型」，则外出类型必填       |\n| out start time is required                            | 外出开始时间必填                     |\n| out end time is required                              | 外出结束时间必填                     |\n| out duration must be greater than 0                   | 外出间隔不能为0，请检查起止时间并重新选择        |\n| out reason is empty                                   | 如果定义中勾选「外出事由」同时设定必填，则该字段必填   |\n| photo is required                                     | 如果定义中勾选「外出拍照」同时设定必填，则该字段必填   |\n| out time is conflict                                  | 外出时间有冲突，请确认是否已在该时段申请外出\n\n<!-- File: skills/lark-approval/references/lark-approval-instance-value-sourcing.md (Tokens: ~1489 | Category: anthropic-skill) -->\n# 审批提单值来源\n\n## 目的\n\n本文用于回答一个固定问题：在调用 `approval instances create` 发起原生审批实例时，**每个要填写的值从哪里拿**。\n\n阅读顺序固定如下：\n\n1. [`lark-approval-initiate.md`](./lark-approval-initiate.md) 中的创建请求参数、节点参数和返回结果说明\n2. `approval approvals get` 返回的 `form` / `node_list`\n3. [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md)\n4. 本文\n\n## 总原则\n\n- `lark-approval-initiate.md` 决定创建请求字段名、字段层级、节点参数结构。\n- `approvals.get.form` 决定控件 `id`、`type`、选项值范围、子控件结构。\n- `approvals.get.node_list` 决定节点 key、是否必须补审批人、是否允许多人。\n- [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 决定各控件 `value` 的最终结构。\n- 除非本文明确允许，否则不要猜值来源，不要把展示文案直接当成可提交值。\n\n## 默认来源\n\n- 审批定义、`approval_code`、`is_external`、`create_link` 等基础信息，默认从 `approval approvals search` 获取。\n- 控件 `id`、`type`、选项值、子控件结构，默认从 `approval approvals get.form` 获取。\n- 节点 key、`need_approver`、`approver_chosen_multi` 等节点信息，默认从 `approval approvals get.node_list` 获取。\n- 本文只补充 **这些默认来源之外** 的取值规则，以及当前必须由用户直接提供的值。\n\n## 控件值来源规则\n\n### 联系人 `contact`\n\n- 只推荐写 `open_ids`。\n- 不再推荐双写 `value(user_id)` + `open_ids`，避免复杂度继续上升。\n- 如果用户给的是姓名、邮箱或账号，先用 `lark-contact` 解析成 `open_id`。\n\n### 部门 `department`\n\n- 最优先：用户直接提供 `open_department_id`。\n- 若用户说“我的部门”或“张三的部门”，先用 `lark-contact` 查询对应人员信息，再取其所属部门里的 `open_department_id`。\n- 如果查到该人员只有一个部门，可直接使用。\n- 如果查到多个部门，不自动猜，必须让用户明确选一个，或直接输入 `open_department_id`。\n- 如果仍无法确定，则明确告知当前不支持自动决定部门值。\n\n### 附件 `attachmentV2`\n\n- 当前 `lark-approval` 不负责上传文件。\n- 用户必须直接提供 file code。\n- 如果用户无法提供 file code，应明确告知当前无法仅通过 `lark-approval` 完成该控件提单。\n\n### 图片 `image` / `imageV2`\n\n- 当前 `lark-approval` 不负责上传图片。\n- 用户必须直接提供 file code。\n- 如果用户无法提供 file code，应明确告知当前无法仅通过 `lark-approval` 完成该控件提单。\n\n### 文档 `document`\n\n- 用户可直接提供 `token` / `document_id`。\n- 如果用户给的是飞书文档链接，应先尝试从链接中提取 token。\n- 若链接提取失败，再要求用户手动输入 token。\n\n### 关联审批 `connect`\n\n- 用户直接提供目标审批实例的 `instance_code`。\n- 当前不默认做“搜索关联实例再反查 code”的自动流程。\n\n### 地址 `address`\n\n- 用户直接提供地理库 `id`。\n- 若用户无法提供该 `id`，当前不支持自动取值。\n\n## 特殊控件组\n\n以下控件组的结构仍按 [`lark-approval-instance-form-control-parameters.md`](./lark-approval-instance-form-control-parameters.md) 组装：\n\n- `leaveGroupV2`\n- `workGroup`\n- `outGroup`\n- `shiftGroup`\n\n补充规则：\n\n- 控件组自身和子控件的 `id` / `type` 从 `approval approvals get.form` 中识别。\n- 组内单选/多选或业务枚举值，优先从 `approval approvals get.form` 返回的选项结构中取。\n- 不要把控件组整体当成普通字符串或扁平对象提交。\n\n## 不支持自动准备的值\n\n以下值当前不建议由 `lark-approval` 自动准备：\n\n- 文件上传后的 file code\n- 图片上传后的 file code\n- 地址控件的地理库 `id`\n- 无法唯一确定的部门 `open_department_id`\n\n遇到这类值时，应明确告诉用户需要提供什么，而不是继续猜测。\n\n## 最小决策表\n\n| 场景 | 处理 |\n|---|---|\n| 用户说“找张三当审批人” | 用 `lark-contact` 解析张三，取 `open_id` |\n| 用户说“我的部门” | 先查当前用户部门；若多个部门，让用户选 |\n| 用户给了文档链接 | 先尝试提取 token |\n| 用户要填图片/附件 | 要求直接提供 file code |\n| 用户要填关联审批 | 要求直接提供 `instance_code` |\n| 用户要填地址 | 要求直接提供地理库 `id` |\n\n<!-- File: skills/lark-approval/references/lark-approval-instances-cancel.md (Tokens: ~1036 | Category: anthropic-skill) -->\n# approval instances cancel\n\n撤回一个已发起的审批实例（用户级写操作）。通常先通过 `instances initiated`、`tasks query` 或 `instances get` 确认目标审批实例，拿到 `instance_code` 后再执行撤回。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要撤回该审批实例且目标实例无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:instance:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval instances cancel \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' \\\n  --as user \\\n  --dry-run\n\n# 撤回一个审批实例\nlark-cli approval instances cancel \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体\nlark-cli approval instances cancel \\\n  --data @./cancel-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `instances initiated`、`tasks query` 或 `instances get` 获取 |\n| `--as user` | 否 | 建议显式指定用户身份；审批实例撤回通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n如果你要找“我发起的审批实例”，可先查询已发起列表：\n\n```bash\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n```\n\n如果你已经在任务列表中定位到某个审批，也可以从任务里拿到实例 Code：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `instances[].instance_code` | 审批实例 Code；撤回时必须提供 |\n| `tasks[].instance_code` | 审批任务关联的审批实例 Code；也可作为撤回输入 |\n| `tasks[].instance_status` | 审批实例状态；可用于判断是否仍处于可撤回阶段 |\n\n如需先确认审批表单、当前节点、流转状态，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **撤回的是审批实例，不是单个任务**：`instances cancel` 只需要 `instance_code`，不需要 `task_id`。\n- **优先确认实例是否仍可撤回**：已经通过、已拒绝、已撤销或已终止的实例通常不适合继续撤回。\n- **优先从 `instances initiated` 获取目标实例**：因为撤回通常针对“我发起的审批”，这个入口最直接。\n- **也可从 `tasks query` 反查 `instance_code`**：当你是从某个待办/已办上下文进入时，这样更方便。\n- **先 `--dry-run` 再执行**：尤其在实例来源不明确、用户只给了标题关键字，或一次要核对多个实例时，先预览更安全。\n\n<!-- File: skills/lark-approval/references/lark-approval-instances-cc.md (Tokens: ~1631 | Category: anthropic-skill) -->\n# approval instances cc\n\n给一个审批实例追加抄送人（用户级写操作）。通常先通过 `instances initiated`、`tasks query` 或 `instances get` 确认目标审批实例，拿到 `instance_code` 后，再提供抄送人的用户 ID 执行抄送。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要抄送该审批实例且目标实例、抄送对象都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:instance:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"ou_xxx\"],\"comment\":\"抄送给项目 owner 了解进展\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --dry-run\n\n# 按 open_id 抄送一个人\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"ou_xxx\"],\"comment\":\"抄送给你知悉\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 一次抄送多个人\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"ou_xxx\",\"ou_yyy\"],\"comment\":\"请相关同学同步关注\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 按 user_id 抄送\nlark-cli approval instances cc \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"123456789\"],\"comment\":\"抄送给财务负责人\"}' \\\n  --params '{\"user_id_type\":\"user_id\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体\nlark-cli approval instances cc \\\n  --data @./cc-body.json \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `instances initiated`、`tasks query` 或 `instances get` 获取 |\n| `cc_user_ids` | 是 | 抄送人的用户 ID 数组；需要和 `user_id_type` 保持一致 |\n| `comment` | 否 | 抄送留言，例如 `抄送给你知悉`、`请同步关注该审批进展` |\n| `--params '{\"user_id_type\":\"...\"}'` | 否 | 查询参数 JSON；用于声明 `cc_user_ids` 内用户 ID 的类型 |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id`；未显式指定时要特别确认抄送人的 ID 类型 |\n| `--as user` | 否 | 建议显式指定用户身份；审批实例抄送通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n如果你要找“我发起的审批实例”，可先查询已发起列表：\n\n```bash\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n```\n\n如果你已经在任务列表中定位到某个审批，也可以从任务里拿到实例 Code：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `instances[].instance_code` | 审批实例 Code；抄送时必须提供 |\n| `tasks[].instance_code` | 审批任务关联的审批实例 Code；也可作为抄送输入 |\n| `tasks[].title` | 任务标题，可用于确认是否是要操作的那个审批 |\n| `tasks[].instance_status` | 审批实例状态；可用于判断当前审批是否仍处于进行中 |\n\n如果你手里只有姓名或邮箱，建议先通过联系人能力解析出正确的用户 ID，再执行抄送。\n\n如需先确认审批表单、当前节点、流转状态，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **抄送的是审批实例，不是单个任务**：`instances cc` 只需要 `instance_code`，不需要 `task_id`。\n- **`cc_user_ids` 与 `user_id_type` 必须匹配**：例如传 open_id 就把 `user_id_type` 设为 `open_id`；不要混用。\n- **`cc_user_ids` 是数组**：即使只抄送一个人，也要按数组形式传入。\n- **优先显式传 `user_id_type`**：这样 agent 更容易判断参数含义，也能减少 ID 类型不匹配带来的失败。\n- **优先从 `instances initiated` 获取目标实例**：因为抄送常见于“我发起的审批”场景，这个入口最直接。\n- **也可从 `tasks query` 反查 `instance_code`**：当你是从某个审批上下文进入时，这样更方便。\n- **`comment` 建议简洁明确**：例如 `抄送给你知悉`、`请同步关注审批进展`。避免过长或模糊描述。\n- **先 `--dry-run` 再执行**：尤其在抄送对象较多、抄送人来源不明确，或需要让用户先核对实例标题时，先预览更安全。\n\n<!-- File: skills/lark-approval/references/lark-approval-instances-get.md (Tokens: ~1863 | Category: anthropic-skill) -->\n# approval instances get\n\n获取单个审批实例详情（用户级只读操作）。适合在执行 approve / reject / transfer / rollback / cancel / cc / remind 之前，先查看审批表单、当前节点、任务列表、审批动态和整体状态。\n\n需要的 scopes: [\"approval:instance:read\"]\n\n## 命令\n\n```bash\n# 按实例 Code 查询详情\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n\n# 表格格式输出，便于快速浏览顶层字段\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{...}'` | 是 | 查询参数，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code |\n| `locale` | 否 | 返回语言，例如 `zh-CN`、`en-US`、`ja-JP` |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id` |\n| `--as user` | 否 | 建议显式指定用户身份；审批实例详情查询通常应使用用户身份 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 常见输入来源\n\n如果你已经有实例 Code，可直接查询：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n如果你还没有实例 Code，可先从以下命令获取：\n\n```bash\n# 查询我发起的审批实例\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n\n# 或从任务列表里拿到关联实例 Code\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n## 输出重点字段\n\n返回结果中常见字段：\n\n| 字段 | 说明 |\n|------|------|\n| `instance_code` | 审批实例 Code |\n| `serial_number` | 审批单编号 |\n| `definition_code` | 审批定义 Code |\n| `definition_name` | 审批名称 |\n| `user_id` | 发起审批的用户 ID |\n| `department_id` | 发起人所在部门 ID |\n| `status` | 审批实例状态，见下方“status 枚举” |\n| `reverted` | 单据是否已被撤销 |\n| `start_time` | 审批创建时间 |\n| `end_time` | 审批完成时间，未完成时通常为 `0` |\n| `form` | 表单数据，JSON 字符串 |\n| `current_nodes` | 当前审批节点列表 |\n| `tasks` | 审批任务列表 |\n| `operation_records` | 审批动态，例如通过、拒绝、转交、加签、回退、撤回、抄送 |\n| `comments` | 评论列表 |\n\n## status 枚举\n\n| 值 | 含义 |\n|----|------|\n| `PENDING` | 审批中 |\n| `APPROVED` | 已通过 |\n| `REJECTED` | 已拒绝 |\n| `CANCELED` | 已撤回 |\n| `DELETED` | 已删除 |\n\n## current_nodes 重点字段\n\n`current_nodes` 常用于判断审批流当前卡在哪一层：\n\n| 字段 | 说明                                       |\n|------|------------------------------------------|\n| `current_nodes[].node_id` | 当前审批节点 ID                                |\n| `current_nodes[].node_name` | 当前审批节点名称                                 |\n| `current_nodes[].type` | 审批方式：`AND` 会签、`OR` 或签、`SEQUENTIAL` 依次审批等 |\n| `current_nodes[].approvers[].task_id` | 当前审批人关联任务 ID                             |\n| `current_nodes[].approvers[].user_id` | 当前审批人用户 ID                               |\n\n## tasks 重点字段\n\n`tasks` 常用于把实例和具体审批任务关联起来：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].id` | 审批任务 ID |\n| `tasks[].node_id` | 任务所属节点 ID |\n| `tasks[].node_name` | 任务所属节点名称 |\n| `tasks[].user_id` | 审批人用户 ID |\n| `tasks[].status` | 任务状态：`PENDING`、`APPROVED`、`REJECTED`、`TRANSFERRED`、`DONE` |\n| `tasks[].start_time` | 任务开始时间 |\n| `tasks[].end_time` | 任务完成时间 |\n\n## operation_records 重点字段\n\n`operation_records` 常用于审计审批过程：\n\n| 字段 | 说明 |\n|------|------|\n| `operation_records[].type` | 事件类型，如 `PASS`、`REJECT`、`TRANSFER`、`ROLLBACK`、`CANCEL`、`CC` |\n| `operation_records[].create_time` | 事件发生时间 |\n| `operation_records[].user_id` | 触发该事件的用户 ID |\n| `operation_records[].task_id` | 关联任务 ID |\n| `operation_records[].node_id` | 关联节点 ID |\n| `operation_records[].comment` | 理由 / 备注 |\n| `operation_records[].cc_user_ids` | 被抄送人列表（抄送事件时） |\n\n## 使用建议\n\n- **这是最适合做“详情确认”的只读命令**：当你已经拿到 `instance_code`，需要确认表单、当前节点、任务状态、审批动态时，优先使用它。\n- **在执行写操作前先看详情**：例如做 `tasks rollback` 前确认可退回节点，做 `instances cancel` 前确认实例状态，做 `tasks remind` 前确认当前任务是否仍待处理。\n- **`form` 是 JSON 字符串**：调用方通常还需要再解析一层，才能拿到表单字段值。\n- **`current_nodes` 和 `tasks` 可以联动看**：前者看“当前卡在哪个节点”，后者看“每个任务目前由谁处理、状态如何”。\n- **`operation_records` 适合做时间线回溯**：例如排查谁转交过、谁加签过、什么时候撤回或抄送过。\n- **优先显式传 `locale` 和 `user_id_type`**：这样 agent 更容易理解返回文本和 ID 语义，减少歧义。\n\n## 输出与后续操作\n\n读取详情后，常见下一步：\n\n```bash\n# 同意审批任务\nlark-cli approval tasks approve --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\"}' --as user --yes\n\n# 撤回审批实例\nlark-cli approval instances cancel --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --yes\n\n# 催办审批任务\nlark-cli approval tasks remind --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID>\"]}' --as user --yes\n```\n\n<!-- File: skills/lark-approval/references/lark-approval-instances-initiated.md (Tokens: ~1919 | Category: anthropic-skill) -->\n# approval instances initiated\n\n查询当前用户已发起的审批实例列表（用户级只读操作）。适合在需要查看“我发起了哪些审批”、筛选某类审批定义、获取 `instance_code` 供后续 `instances get` / `instances cancel` / `instances cc` 等命令使用时调用。\n\n需要的 scopes: [\"approval:instance:read\"]\n\n## 命令\n\n```bash\n# 查询我发起的审批列表\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user\n\n# 只看某个审批定义下我发起的实例\nlark-cli approval instances initiated --params '{\"definition_code\":\"<DEFINITION_CODE>\",\"page_size\":20}' --as user\n\n# 按关键词搜索我发起的实例\nlark-cli approval instances initiated --params '{\"keyword\":\"测试\",\"page_size\":10}' --as user\n\n# 按发起时间范围筛选（秒级时间戳）\nlark-cli approval instances initiated --params '{\"start_timestamp\":\"<START_SECONDS>\",\"end_timestamp\":\"<END_SECONDS>\",\"page_size\":20}' --as user\n\n# 使用 page_token 翻页\nlark-cli approval instances initiated --params '{\"page_size\":20,\"page_token\":\"example_page_token\"}' --as user\n\n# 表格格式输出，便于快速浏览\nlark-cli approval instances initiated --params '{\"page_size\":20}' --format table --as user\n\n# 预览 API 调用，不执行\nlark-cli approval instances initiated --params '{\"page_size\":20}' --as user --dry-run\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{...}'` | 否 | 查询参数，使用 JSON 传入；不传时使用默认分页与筛选 |\n| `definition_code` | 否 | 审批定义 Code，用于只查看某个审批定义下我发起的实例 |\n| `keyword` | 否 | 搜索关键词；非空时走搜索链路，空或仅空格时保持普通列表链路 |\n| `start_timestamp` | 否 | 按发起时间筛选，时间范围开始值，秒级时间戳 |\n| `end_timestamp` | 否 | 按发起时间筛选，时间范围结束值，秒级时间戳 |\n| `locale` | 否 | 返回语言：`zh-CN`、`en-US`、`ja-JP` |\n| `page_size` | 否 | 分页大小 |\n| `page_token` | 否 | 翻页标记；首次请求不填，后续使用上一次返回的 `page_token` |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id` |\n| `--as user` | 否 | 建议显式指定用户身份；已发起审批列表查询通常应使用用户身份 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 输出重点字段\n\n返回结果中常见字段：\n\n| 字段 | 说明 |\n|------|------|\n| `count` | 列表计数，只在第一页返回；大于等于 100 个实例时返回 `99` |\n| `has_more` | 是否还有更多数据 |\n| `page_token` | 下一页翻页 Token |\n| `instances[].instance_code` | 审批实例 Code；后续查询详情或执行撤回 / 抄送时通常需要 |\n| `instances[].definition_code` | 审批定义 Code |\n| `instances[].definition_name` | 审批定义名称 |\n| `instances[].definition_group_id` | 审批定义分组 ID |\n| `instances[].definition_group_name` | 审批定义分组名称 |\n| `instances[].initiator` | 发起人 ID |\n| `instances[].initiator_name` | 发起人姓名 |\n| `instances[].instance_status` | 审批实例状态，见下方“instance_status 枚举” |\n| `instances[].instance_external_id` | 第三方审批实例 ID（仅第三方审批实例存在） |\n| `instances[].link` | 三方审批跳转链接 |\n| `instances[].summaries` | 摘要字段列表 |\n\n## instance_status 枚举\n\n| 值 | 含义 |\n|----|------|\n| `0` | 无流程状态，不展示对应标签 |\n| `1` | 流程实例流转中 |\n| `2` | 已通过 |\n| `3` | 已拒绝 |\n| `4` | 已撤销 |\n| `5` | 已终止 |\n\n## 常见使用场景\n\n### 1) 找到我要操作的审批实例\n\n```bash\nlark-cli approval instances initiated --params '{\"page_size\":20}' --format table --as user\n```\n\n拿到 `instances[].instance_code` 后，可继续：\n\n```bash\n# 查看审批实例详情\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n\n# 撤回审批实例\nlark-cli approval instances cancel --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --yes\n```\n\n### 2) 只看某类审批\n\n```bash\nlark-cli approval instances initiated \\\n  --params '{\"definition_code\":\"<DEFINITION_CODE>\",\"page_size\":20}' \\\n  --as user\n```\n\n\n## 使用建议\n\n- **这是定位“我发起的审批实例”的首选命令**：如果你的目标是撤回、抄送、查看某个已发起审批，优先从这里拿 `instance_code`。\n- **优先用 `definition_code` 缩小范围**：当你已知审批定义时，先筛掉无关实例，可显著提升可读性。\n- **需要搜索时传入 `keyword`**：搜索排序和普通列表排序不同，按搜索服务结果为准。\n- **按时间排查时使用 `start_timestamp` / `end_timestamp`**：这两个值都是秒级时间戳，用于按发起时间缩小结果范围。\n- **结果很多时优先 `--format table`**：适合人工快速浏览。\n- **`count` 只在第一页返回**：做分页处理时不要假设后续页还会带总数。\n- **`instance_status` 可直接判断下一步**：例如状态为 `1` 时通常可继续查看详情或考虑撤回，状态为 `4` 表示已经撤销，无需重复撤回。\n- **摘要字段 `summaries` 很适合做列表预览**：当审批标题不够明确时，可结合摘要值帮助识别目标实例。\n\n## 输出与后续操作\n\n拿到列表后，常见下一步：\n\n```bash\n# 查看单个审批实例详情\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n\n# 撤回审批实例\nlark-cli approval instances cancel --data '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user --yes\n\n# 给审批实例追加抄送人\nlark-cli approval instances cc --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"cc_user_ids\":[\"<USER_ID>\"]}' --params '{\"user_id_type\":\"open_id\"}' --as user --yes\n```\n\n<!-- File: skills/lark-approval/references/lark-approval-tasks-add-sign.md (Tokens: ~3432 | Category: anthropic-skill) -->\n# approval tasks add_sign\n\n给一个审批任务加签（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，确认目标任务后，再提供被加签人的用户 ID、加签方式等参数执行加签。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要对该审批任务加签且目标任务、加签对象、加签方式都无误，再带 `--yes` 运行。用户已明确要求立即执行且列清本轮的加签、转交对象时，该确认覆盖这两个已明确的动作，不要逐条重复询问；不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 先选择加签类型\n\n`add_sign_type` 会影响当前用户的审批任务是否继续可操作，不能只按示例顺序或任意选择：\n\n| 用户意图 | `add_sign_type` | 处理方式 |\n|----------|-----------------|----------|\n| 明确说前加签 / “先让某人审核，我再审” | `1` | 前加签，并按用户要求选择 `approval_method` |\n| 明确说后加签 / “我处理完，再让某人审核” | `2` | 后加签，并按用户要求选择 `approval_method` |\n| “拉进来一起审” / “共同审核” / “一并确认” | `3` | 并加签；不传 `approval_method` |\n| 同一请求要求先加签、再转交当前用户这一环 | `3` | **必须并加签**；加签成功后再转交当前任务 |\n\n前加签或后加签可能推动当前用户的 task 流转，使原 `task_id` 不再支持后续转交。因此，“先加签，再把我这一环转交给其他人”不能使用前加签或后加签；先以 `add_sign_type: 3` 并加签，确认 `tasks add_sign` 成功后，再使用同一组 `instance_code` + `task_id` 执行 `tasks transfer`。\n\n只有在上下文完全无法判断是哪种加签方式、且不同选择会改变审批流程时，才向用户二次询问。用户已经说“一起审”或已经要求“加签后转交当前环节”时，信息足够，不要再询问加签类型。\n\n## 再选择 approval_method\n\n只有前加签、后加签需要 `approval_method`；并加签不传。先遵循用户明确指定的审批方式；用户未指定时，按人数和语义选择：\n\n| 加签人数与语义 | `approval_method` | 处理方式 |\n|----------------|-------------------|----------|\n| 只有 1 名加签人 | `1` | 使用或签；单人时或签、会签的实际效果相同，不再询问 |\n| 多人，明确“任一人审批即可” / “一人通过即可” | `1` | 或签；任一加签人完成审批即可 |\n| 多人，明确“所有人都要审批” / “全部确认” | `2` | 会签；所有加签人都必须完成审批 |\n| 多人，明确“依次审批” / “先 A 后 B” | `3` | 依次审批；每个人按 `add_sign_user_ids` 的数组顺序逐一审批 |\n| 多人，无法从上下文推断 | 不预设 | 询问用户选择或签、会签或依次审批，并说明三者效果 |\n\n依次审批必须保留用户给出的人员顺序。如果已经确定要依次审批，但上下文无法判断先后顺序，先询问人员顺序，再构造 `add_sign_user_ids`；不要自行排序。\n\n## 命令\n\n```bash\n# 先预览并加签请求，不实际执行\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":3,\"add_sign_user_ids\":[\"ou_xxx\"],\"comment\":\"请项目 owner 一起审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --dry-run\n\n# 单人前加签：未指定方式时使用或签\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":1,\"add_sign_user_ids\":[\"ou_xxx\"],\"approval_method\":1,\"comment\":\"请先补充审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 多人后加签：所有人都需要审批，使用会签\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":2,\"add_sign_user_ids\":[\"ou_xxx\",\"ou_yyy\"],\"approval_method\":2,\"comment\":\"当前审批完成后请两位都完成审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 多人前加签：按数组中的人员顺序依次审批\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":1,\"add_sign_user_ids\":[\"ou_first\",\"ou_second\"],\"approval_method\":3,\"comment\":\"请先由第一位审核，再由第二位审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 同一请求要求先加签、再转交：必须并加签；两条命令按顺序执行\nlark-cli approval tasks add_sign \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"add_sign_type\":3,\"add_sign_user_ids\":[\"ou_reviewer\"],\"comment\":\"请一起审核\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 仅在上面的 add_sign 成功后，转交同一当前任务\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"ou_transferee\",\"comment\":\"出差期间请代为处理\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment 或较多加签人\nlark-cli approval tasks add_sign \\\n  --data @./add-sign-body.json \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `add_sign_type` | 是 | 加签类型：`1` 前加签、`2` 后加签、`3` 并加签 |\n| `add_sign_user_ids` | 是 | 被加签人 ID 数组；需要和 `user_id_type` 保持一致 |\n| `approval_method` | 否 | 审批方式：`1` 或签、`2` 会签、`3` 依次审批；**仅在前加签、后加签时需要填写**。单人未指定时使用 `1`；多人无法从语义推断时先询问用户 |\n| `comment` | 否 | 审批意见或加签说明，例如 `前加签给财务复核`、`请项目 owner 一并确认` |\n| `--params '{\"user_id_type\":\"...\"}'` | 否 | 查询参数 JSON；用于声明 `add_sign_user_ids` 内用户 ID 的类型 |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id`；未显式指定时要特别确认被加签人的 ID 类型 |\n| `--as user` | 否 | 建议显式指定用户身份；审批加签通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 枚举说明\n\n### add_sign_type\n\n| 值 | 含义 | 对当前任务的影响 |\n|----|------|------------------|\n| `1` | 前加签 | 在当前审批前插入审批人，可能推动当前用户的 task 流转 |\n| `2` | 后加签 | 在当前审批后追加审批人，可能推动当前用户的 task 流转 |\n| `3` | 并加签 | 增加并行审批人；需要随后转交当前环节时使用 |\n\n### approval_method\n\n仅适用于前加签、后加签；并加签不传。\n\n| 值 | 含义 | 完成条件 |\n|----|------|----------|\n| `1` | 或签 | 任一加签人完成审批即可 |\n| `2` | 会签 | 所有加签人都必须完成审批 |\n| `3` | 依次审批 | 所有加签人按 `add_sign_user_ids` 数组顺序逐一审批 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / transfer / rollback / add_sign 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n| `tasks[].support_api_operate` | 是否支持通过 API 处理该任务；加签前建议先检查 |\n\n如果你手里只有姓名或邮箱，建议先通过联系人能力解析出正确的用户 ID，再执行加签。\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行加签操作。\n- **`add_sign_user_ids` 与 `user_id_type` 必须匹配**：例如传 open_id 就把 `user_id_type` 设为 `open_id`；不要混用。\n- **优先显式传 `user_id_type`**：这样 agent 更容易判断参数含义，也能减少 ID 类型不匹配带来的失败。\n- **`add_sign_type` 要和业务意图一致**：前加签是在当前审批前插入审批人，后加签是在当前审批后追加审批人，并加签则是增加并行审批人。\n- **加签后还要转交当前环节时必须并加签**：使用 `add_sign_type: 3`，等待加签成功后再用同一组任务参数转交；不要用前加签或后加签导致当前 task 提前流转。\n- **无法推断类型时才询问**：如果用户没有说明先后或并行关系，且后续动作也不能帮助判断，再请用户选择；不要对“一起审”或“加签后转交”重复提问。\n- **前加签 / 后加签要补 `approval_method`**：单人未指定时使用或签；多人优先按语义选择，无法推断时询问用户，不要静默默认。\n- **依次审批保留人员顺序**：按用户指定的先后顺序构造 `add_sign_user_ids`；顺序不明确时先询问，不要自行排序。\n- **优先从 `tasks query` 的待办列表拿任务参数**：尤其是 `topic=1` 的待办审批，最适合作为 add_sign 的输入来源。\n- **先检查是否支持 API 操作**：如果 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 执行处理动作，加签前应谨慎验证。\n- **`comment` 建议写明加签原因**：例如 `增加财务复核`、`增加项目 owner 并行确认`，方便相关人员理解上下文。\n- **先 `--dry-run` 再执行**：尤其在多人加签、跨部门加签或加签对象来源不明确时，先预览更安全。\n\n<!-- File: skills/lark-approval/references/lark-approval-tasks-approve.md (Tokens: ~1205 | Category: anthropic-skill) -->\n# approval tasks approve\n\n同意一个审批任务（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，必要时再用 `instances get` 查看详情，然后再执行同意。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确同意审批且目标任务无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks approve \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"同意\"}' \\\n  --as user \\\n  --dry-run\n\n# 同意审批任务，并附带审批意见\nlark-cli approval tasks approve \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"同意\"}' \\\n  --as user \\\n  --yes\n\n# 需要回填表单时，传入 form（按当前命令定义，form 为字符串化 JSON）\nlark-cli approval tasks approve \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"同意并补充信息\",\"form\":\"[{\\\"id\\\":\\\"user_name\\\",\\\"type\\\":\\\"input\\\",\\\"value\\\":\\\"Alice\\\"}]\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment / form\nlark-cli approval tasks approve \\\n  --data @./approve-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `comment` | 否 | 审批意见，例如 `同意`、`已确认` |\n| `form` | 否 | 表单数据；按当前命令定义，字段类型为 `string`，通常传字符串化 JSON；仅在审批动作需要同时回填表单时使用 |\n| `--as user` | 否 | 建议显式指定用户身份；审批同意通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的两个字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行同意操作。\n- **优先从 `tasks query` 的待办列表拿参数**：尤其是 `topic=1` 的待办审批，最适合作为 approve 的输入来源。\n- **先检查是否支持 API 操作**：如果上一步 `tasks query` 返回的 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 同意/拒绝。\n- **`comment` 建议简洁明确**：例如 `同意`、`同意，信息已核对`。没有审批意见要求时可省略。\n- **`form` 只在确有需要时传**：大多数简单同意场景只传 `instance_code`、`task_id`、可选 `comment` 即可。\n- **先 `--dry-run` 再执行**：尤其在批量处理、表单回填或任务来源不明确时，先预览更安全。\n\n<!-- File: skills/lark-approval/references/lark-approval-tasks-query.md (Tokens: ~1530 | Category: anthropic-skill) -->\n# approval tasks query\n\n查询当前用户的审批任务列表，可用于查看待办、已办、知会等分组。只读操作，不会修改审批状态。\n\n需要的 scopes: [\"approval:task:read\"]\n\n## 命令\n\n```bash\n# 查询待办审批\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n\n# 查询已办审批\nlark-cli approval tasks query --params '{\"topic\":\"2\"}' --as user\n\n# 按关键词搜索任务列表\nlark-cli approval tasks query --params '{\"topic\":\"1\",\"keyword\":\"测试\",\"page_size\":10}' --as user\n\n# 按任务时间范围筛选（秒级时间戳）\nlark-cli approval tasks query --params '{\"topic\":\"1\",\"start_timestamp\":\"<START_SECONDS>\",\"end_timestamp\":\"<END_SECONDS>\"}' --as user\n\n# 使用 page_token 翻页\nlark-cli approval tasks query --params '{\"topic\":\"1\",\"page_token\":\"example_page_token\"}' --as user\n\n# 表格格式输出，便于快速浏览\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --format table --as user\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--params '{\"topic\":\"...\"}'` | 是 | 查询参数，使用 JSON 传入 |\n| `topic` | 是 | 任务分组主题，见下方“topic 枚举” |\n| `definition_code` | 否 | 审批定义 Code，用于仅查询某个审批定义下的任务 |\n| `keyword` | 否 | 搜索关键词；非空时走搜索链路，空或仅空格时保持普通列表链路 |\n| `start_timestamp` | 否 | 按任务时间筛选，时间范围开始值，秒级时间戳 |\n| `end_timestamp` | 否 | 按任务时间筛选，时间范围结束值，秒级时间戳 |\n| `locale` | 否 | 返回语言：`zh-CN`、`en-US`、`ja-JP` |\n| `page_size` | 否 | 分页大小 |\n| `page_token` | 否 | 翻页标记；首次请求不填，后续使用上一次返回的 `page_token` |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id` |\n| `--as user` | 否 | 建议显式指定用户身份；审批任务查询通常应使用用户身份 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## topic 枚举\n\n| 值 | 含义 |\n|----|------|\n| `1` | 待办审批 |\n| `2` | 已办审批 |\n| `17` | 未读知会 |\n| `18` | 已读知会 |\n\n## 输出重点字段\n\n返回结果中常见字段：\n\n| 字段 | 说明 |\n|------|------|\n| `count` | 列表计数，只在第一页返回；当任务数大于等于 100 时返回 `99` |\n| `has_more` | 是否还有更多数据 |\n| `page_token` | 下一页翻页 Token |\n| `tasks[].task_id` | 任务 ID，全局唯一 |\n| `tasks[].instance_code` | 审批实例 Code；后续执行 approve / reject / rollback 等操作时通常需要与 `task_id` 成对使用 |\n| `tasks[].title` | 任务标题 |\n| `tasks[].status` | 任务状态：`1` 待办、`2` 已办、`17` 未读、`18` 已读、`33` 处理中、`34` 撤回 |\n| `tasks[].topic` | 任务所属分组主题 |\n| `tasks[].instance_status` | 审批实例状态：`0` 无状态、`1` 流转中、`2` 已通过、`3` 已拒绝、`4` 已撤销、`5` 已终止 |\n| `tasks[].definition_code` | 审批定义 Code |\n| `tasks[].definition_name` | 审批定义名称 |\n| `tasks[].initiator` | 发起人 ID |\n| `tasks[].initiator_name` | 发起人姓名 |\n| `tasks[].summaries` | 表单摘要字段列表 |\n| `tasks[].support_api_operate` | 是否支持通过 API 同意或拒绝该任务 |\n| `tasks[].user_id` | 任务所属用户 ID |\n| `tasks[].instance_external_id` | 三方审批实例 ID，仅第三方审批实例存在 |\n| `tasks[].task_external_id` | 三方审批任务 ID，仅第三方审批任务存在 |\n| `tasks[].link` | 三方审批跳转链接 |\n\n## 使用建议\n\n- 常见处理链：先用 `tasks query` 拿到 `task_id` 和 `instance_code`，若用户需要查看详情、当前节点、表单内容、流程进度等内容，则调用 `instances get` 查看详情，最后执行 `tasks approve` / `tasks reject` / `tasks transfer` / `tasks add_sign` / `tasks rollback`。\n- 如果你只想看“已发起的审批实例”，使用 `instances initiated`；`tasks query` 更适合围绕“任务分组”来拉取列表。\n- 需要搜索任务标题、摘要或相关内容时传入 `keyword`；搜索排序和普通列表排序不同，按搜索服务结果为准。\n- 按时间排查任务时使用 `start_timestamp` / `end_timestamp` 缩小范围；这两个值都是秒级时间戳。\n- 需要继续翻页时，直接把上一次返回的 `page_token` 放回 `--params`。\n- 当结果量较大时，优先使用 `--format table` 提升可读性。\n\n<!-- File: skills/lark-approval/references/lark-approval-tasks-reject.md (Tokens: ~1063 | Category: anthropic-skill) -->\n# approval tasks reject\n\n拒绝一个审批任务（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，必要时再用 `instances get` 查看详情，然后再执行拒绝。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要拒绝该审批且目标任务无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks reject \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"拒绝\"}' \\\n  --as user \\\n  --dry-run\n\n# 拒绝审批任务，并附带审批意见\nlark-cli approval tasks reject \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"comment\":\"拒绝，信息不完整\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment\nlark-cli approval tasks reject \\\n  --data @./reject-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `comment` | 否 | 审批意见，例如 `拒绝`、`拒绝，信息不完整` |\n| `--as user` | 否 | 建议显式指定用户身份；审批拒绝通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的两个字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行拒绝操作。\n- **优先从 `tasks query` 的待办列表拿参数**：尤其是 `topic=1` 的待办审批，最适合作为 reject 的输入来源。\n- **先检查是否支持 API 操作**：如果上一步 `tasks query` 返回的 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 同意/拒绝。\n- **`comment` 建议写清拒绝原因**：例如 `拒绝，缺少合同附件`、`拒绝，预算字段填写不完整`。这有助于发起人理解原因并补充材料。\n- **先 `--dry-run` 再执行**：尤其在批量处理或任务来源不明确时，先预览更安全。\n\n<!-- File: skills/lark-approval/references/lark-approval-tasks-remind.md (Tokens: ~1256 | Category: anthropic-skill) -->\n# approval tasks remind\n\n对审批实例中的指定任务发起催办（用户级写操作）。通常先通过 `tasks query` 找到待办任务，拿到 `instance_code` 和要催办的 `task_ids`，必要时再用 `instances get` 查看详情，然后执行催办。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要催办该审批且目标实例、目标任务都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:instance:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks remind \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID>\"],\"comment\":\"请尽快处理\"}' \\\n  --as user \\\n  --dry-run\n\n# 催办单个审批任务\nlark-cli approval tasks remind \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID>\"],\"comment\":\"请尽快审批该单据\"}' \\\n  --as user \\\n  --yes\n\n# 同一实例下催办多个任务\nlark-cli approval tasks remind \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_ids\":[\"<TASK_ID_1>\",\"<TASK_ID_2>\"],\"comment\":\"请相关审批人尽快处理\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment 或多个 task_ids\nlark-cli approval tasks remind \\\n  --data @./remind-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances get` 获取 |\n| `task_ids` | 是 | 被催办的任务 ID 数组；应与 `instance_code` 属于同一审批实例 |\n| `comment` | 否 | 催办说明，例如 `请尽快处理`、`该单据较急，请优先审批` |\n| `--as user` | 否 | 建议显式指定用户身份；审批催办通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；催办时必须提供 |\n| `tasks[].task_id` | 审批任务 ID；放入 `task_ids` 数组中 |\n| `tasks[].title` | 任务标题，可用于确认催办对象是否正确 |\n| `tasks[].status` | 任务状态；一般优先催办仍处于待处理状态的任务 |\n\n如需进一步确认当前审批流、节点和人员信息，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_ids` 要对应同一个审批实例**：不要把不同实例下的任务 ID 混在同一次催办请求中。\n- **`task_ids` 是数组**：即使只催办一个任务，也要按数组形式传入。\n- **优先从 `tasks query` 的待办列表拿参数**：尤其是 `topic=1` 的待办审批，最适合作为 remind 的输入来源。\n- **催办前先确认任务仍需处理**：已经审批完成、已撤回或已终止的任务一般不适合继续催办。\n- **`comment` 建议简洁且明确**：例如 `该单据较急，请优先审批`、`请今天内处理`。避免过长或模糊描述。\n- **先 `--dry-run` 再执行**：尤其在一次催办多个任务、任务来源不明确或需让用户复核催办对象时，先预览更安全。\n\n<!-- File: skills/lark-approval/references/lark-approval-tasks-rollback.md (Tokens: ~1443 | Category: anthropic-skill) -->\n# approval tasks rollback\n\n将一个审批任务退回到指定节点（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，再结合实例详情确认可退回的目标节点 `node_ids`，最后执行退回。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要退回该审批且目标任务、退回节点都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"<NODE_ID>\"],\"comment\":\"退回补充材料\"}' \\\n  --as user \\\n  --dry-run\n\n# 退回到单个节点\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"<NODE_ID>\"],\"comment\":\"请补充附件后重新提交\"}' \\\n  --as user \\\n  --yes\n\n# 退回到发起节点（发起节点 ID 为 START）\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"START\"],\"comment\":\"退回发起人补充材料\"}' \\\n  --as user \\\n  --yes\n\n# 传多个候选节点 ID（以实际审批定义支持情况为准）\nlark-cli approval tasks rollback \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"node_ids\":[\"<NODE_ID_1>\",\"<NODE_ID_2>\"],\"comment\":\"退回上一处理节点\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment 或较多 node_ids\nlark-cli approval tasks rollback \\\n  --data @./rollback-body.json \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `node_ids` | 是 | 退回目标节点 ID 数组；发起节点 ID 为 `START`；执行前应先确认这些节点确实可作为退回目标 |\n| `comment` | 否 | 审批意见或退回说明，例如 `请补充附件后重新提交`、`预算说明不完整，请补充` |\n| `--as user` | 否 | 建议显式指定用户身份；审批退回通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / transfer / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n| `tasks[].support_api_operate` | 是否支持通过 API 处理该任务；退回前建议先检查 |\n\n如需确认流程节点、当前进度和可退回位置，可先查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行退回操作。\n- **`node_ids` 是必填项**：退回并不是“自动退回上一步”，而是要明确给出目标节点 ID 数组；退回发起节点时传 `START`。\n- **先确认节点是否可退回**：不同审批定义支持的退回目标可能不同；在不确定时，先通过 `instances get` 或业务侧流程信息核实。\n- **优先从 `tasks query` 的待办列表拿任务参数**：尤其是 `topic=1` 的待办审批，最适合作为 rollback 的输入来源。\n- **先检查是否支持 API 操作**：如果 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 执行处理动作，退回前应谨慎验证。\n- **`comment` 建议写清退回原因**：例如 `附件缺失，请补齐后重新提交`、`费用说明不完整，请补充明细`，方便发起人或上一步处理人理解原因。\n- **先 `--dry-run` 再执行**：尤其在节点来源不明确、审批链路复杂或批量处理时，先预览更安全。\n\n<!-- File: skills/lark-approval/references/lark-approval-tasks-transfer.md (Tokens: ~1480 | Category: anthropic-skill) -->\n# approval tasks transfer\n\n转交一个审批任务给其他用户处理（用户级写操作）。通常先通过 `tasks query` 拿到 `task_id` 和 `instance_code`，确认目标任务后，再提供被转交人的用户 ID 执行转交。\n\n> [!CAUTION]\n> 这是 **high-risk-write** 写操作。建议先用 `--dry-run` 预览；真正执行时，如果用户已明确要转交该审批且目标任务、转交对象都无误，再带 `--yes` 运行。不要在未获用户明确同意时静默追加 `--yes`。\n\n需要的 scopes: [\"approval:task:write\"]\n\n## 命令\n\n```bash\n# 先预览请求，不实际执行\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"ou_xxx\",\"comment\":\"请你继续处理\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --dry-run\n\n# 按 open_id 转交审批任务\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"ou_xxx\",\"comment\":\"转交给你处理\"}' \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n\n# 按 user_id 转交审批任务\nlark-cli approval tasks transfer \\\n  --data '{\"instance_code\":\"<INSTANCE_CODE>\",\"task_id\":\"<TASK_ID>\",\"transfer_user_id\":\"123456789\",\"comment\":\"请补充审核\"}' \\\n  --params '{\"user_id_type\":\"user_id\"}' \\\n  --as user \\\n  --yes\n\n# 通过文件传入请求体，适合较长 comment\nlark-cli approval tasks transfer \\\n  --data @./transfer-body.json \\\n  --params '{\"user_id_type\":\"open_id\"}' \\\n  --as user \\\n  --yes\n```\n\n## 参数\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--data '{...}'` | 是 | 请求体 JSON，使用 JSON 传入 |\n| `instance_code` | 是 | 审批实例 Code；通常先通过 `tasks query` 或 `instances initiated` / `instances get` 获取 |\n| `task_id` | 是 | 审批任务 ID；通常先通过 `tasks query` 获取 |\n| `transfer_user_id` | 是 | 被转交人的用户 ID；需要和 `user_id_type` 保持一致 |\n| `comment` | 否 | 审批意见或转交说明，例如 `转交给你处理`、`请继续审核该单据` |\n| `--params '{\"user_id_type\":\"...\"}'` | 否 | 查询参数 JSON；用于声明 `transfer_user_id` 的 ID 类型 |\n| `user_id_type` | 否 | 用户 ID 类型：`user_id`、`union_id`、`open_id`；未显式指定时要特别确认 `transfer_user_id` 的真实类型 |\n| `--as user` | 否 | 建议显式指定用户身份；审批转交通常必须以用户身份执行 |\n| `--yes` | 否 | 确认执行高风险写操作；未带时可能返回 `confirmation_required` / exit 10 |\n| `--format` | 否 | 输出格式：`json`（默认）、`ndjson`、`table`、`csv` |\n| `--dry-run` | 否 | 预览 API 调用，不执行 |\n\n## 典型前置步骤\n\n先查到待办任务：\n\n```bash\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\n```\n\n常用到的字段：\n\n| 字段 | 说明 |\n|------|------|\n| `tasks[].instance_code` | 审批实例 Code；执行 approve / reject / transfer / rollback 等操作时通常都需要 |\n| `tasks[].task_id` | 审批任务 ID；与 `instance_code` 配对使用 |\n| `tasks[].support_api_operate` | 是否支持通过 API 处理该任务；转交前建议先检查 |\n\n如果你手里只有姓名或邮箱，建议先通过联系人能力解析出正确的用户 ID，再执行转交。\n\n如需先确认表单、节点、审批流进度，可继续查看实例详情：\n\n```bash\nlark-cli approval instances get --params '{\"instance_code\":\"<INSTANCE_CODE>\"}' --as user\n```\n\n## 使用建议\n\n- **`instance_code` 和 `task_id` 要成对使用**：仅有实例 ID 或仅有任务 ID 都不足以准确执行转交操作。\n- **`transfer_user_id` 与 `user_id_type` 必须匹配**：例如传 open_id 就把 `user_id_type` 设为 `open_id`；不要混用。\n- **优先显式传 `user_id_type`**：这样 agent 更容易判断参数含义，也能减少 ID 类型不匹配带来的失败。\n- **优先从 `tasks query` 的待办列表拿任务参数**：尤其是 `topic=1` 的待办审批，最适合作为 transfer 的输入来源。\n- **先检查是否支持 API 操作**：如果 `tasks[].support_api_operate` 为 `false`，说明该任务可能不支持通过 API 执行同意/拒绝等处理动作，转交前也应谨慎验证。\n- **`comment` 建议写明转交原因**：例如 `你更熟悉该项目，请继续处理`、`转交给预算 owner 审核`，方便接收人理解上下文。\n- **先 `--dry-run` 再执行**：尤其在跨部门转交、批量处理或转交对象来源不明确时，先预览更安全。\n\n<!-- File: skills/lark-approval/SKILL.md (Tokens: ~2303 | Category: anthropic-skill) -->\n---\nname: lark-approval\nversion: 1.2.0\ndescription: \"飞书审批：查询和处理审批待办/已办/实例，搜索可发起审批定义、查看定义详情并发起原生审批实例。当用户要处理审批任务、查看审批实例、搜索或发起审批时使用。审批待办不是飞书任务；非审批类待办走 lark-task。不负责创建审批定义；三方审批定义不走原生提单。\"\nmetadata:\n  requires:\n    bins: [\"lark-cli\"]\n  cliHelp: \"lark-cli approval --help\"\n---\n\n\n**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md)，其中包含认证、权限处理**\n\n所有命令默认 `--as user`（审批是人的动作）。调用前先按需读取 references 下对应的文件，查参数结构，不要猜字段；**references 是第一信息源**，只有在 reference 未覆盖的原生 / 高级场景下，才额外用 `lark-cli ... --help`、`lark-cli schema` 等方式补充确认字段。\n\n## 路由优先级（先判断是不是审批，再选命令）\n\n审批待办不是飞书任务。**只要用户的核心对象是审批单据 / 审批待办 / 审批实例，就优先使用 `lark-approval`，不要让渡给 `lark-task`。**\n\n### 明确归 `lark-approval` 的高优先级语义\n\n出现以下任一语义时，优先走 `lark-approval`：\n\n- 审批待办 / 审批单据 / 审批实例 / 审批意见 / 审批定义\n- 同意 / 拒绝 / 转交 / 退回 / 撤回 / 催办 / 加签 / 抄送\n- 待办列表 / 待办单据 / 已发起审批 / 已办审批 / 审批详情 / 同意可编辑\n\n**判定规则：** 只要最终动作是对审批单据做同意、拒绝、转交、退回、撤回、催办、加签、抄送、查详情、查已发起/已办/待办，就归 `lark-approval`。只有当用户处理的是**非审批类任务/待办**时，才走 [`lark-task`](../lark-task/SKILL.md)。\n\n## 选哪个命令\n\n| 想做什么 | 命令 | 按需读取 reference                                                                  |\n|---|---|---------------------------------------------------------------------------------|\n| 搜可发起定义 | `approvals search` | [`lark-approval-approvals-search.md`](references/lark-approval-approvals-search.md) |\n| 看审批定义详情/提单前确认表单与流程 | `approvals get` | [`lark-approval-approvals-get.md`](references/lark-approval-approvals-get.md)   |\n| 发起原生审批实例/提交请假审批/提交报销审批/创建审批实例 | `instances create` | [`lark-approval-initiate.md`](references/lark-approval-initiate.md)             |\n| 查/搜待办、已办 | `tasks query`（`topic`：1待办 2已办 17未读 18已读） | [`lark-approval-tasks-query.md`](references/lark-approval-tasks-query.md)       |\n| 看表单/进度/当前节点 | `instances get` | [`lark-approval-instances-get.md`](references/lark-approval-instances-get.md)   |\n| 同意审批 | `tasks approve` | [`lark-approval-tasks-approve.md`](references/lark-approval-tasks-approve.md)   |\n| 拒绝审批 | `tasks reject` | [`lark-approval-tasks-reject.md`](references/lark-approval-tasks-reject.md)     |\n| 转交审批 | `tasks transfer` | [`lark-approval-tasks-transfer.md`](references/lark-approval-tasks-transfer.md) |\n| 加签审批 | `tasks add_sign` | [`lark-approval-tasks-add-sign.md`](references/lark-approval-tasks-add-sign.md) |\n| 退回审批 | `tasks rollback` | [`lark-approval-tasks-rollback.md`](references/lark-approval-tasks-rollback.md) |\n| 催办审批 | `tasks remind` | [`lark-approval-tasks-remind.md`](references/lark-approval-tasks-remind.md)     |\n| 撤回已发起审批 | `instances cancel` | [`lark-approval-instances-cancel.md`](references/lark-approval-instances-cancel.md) |\n| 给审批实例追加抄送 | `instances cc` | [`lark-approval-instances-cc.md`](references/lark-approval-instances-cc.md)     |\n| 按定义/关键词查已发起审批 | `instances initiated` | [`lark-approval-instances-initiated.md`](references/lark-approval-instances-initiated.md) |\n\n处理链：\n\n- 发起审批：`approvals search` -> `approvals get` -> `instances create`\n- 处理审批：`tasks query` 拿 `instance_code` + `task_id`（操作必须成对带上）→ 只有用户明确需要查看详情、当前节点、表单内容、或流程进度时，再 `instances get` → 执行操作\n\n## 执行原则（减少误路由、误重试和无效消耗）\n\n### 1) 先拿最小必要信息，再执行\n\n- 目标只是处理待办时，优先 `tasks query` 获取 `instance_code` + `task_id`\n- **只有**用户明确要看详情、当前节点、表单内容、流程进度时，才调用 `instances get`\n- 用户已经明确给出 `instance_code` / `task_id` 时，不要先查列表再过滤\n\n### 2) 已知对象时直达动作\n\n- 已拿到 `instance_code` + `task_id` 后，优先直接执行 `tasks approve/reject/transfer/add_sign/rollback/remind`\n- 同一轮里如果已有足够的新鲜查询结果，不要重复 `tasks query`\n- 不要默认走 `list -> filter -> detail -> write` 全链路；对象已明确时应压缩步骤\n\n### 3) 错误码驱动，而不是盲目重试\n\n- 写操作失败后，先看错误码和报错语义，再决定是否补查或结束\n- **除非错误明确提示可恢复或需要补充参数，否则不要重复刷同一个写操作**\n- 同一个失败原因不要连续多次重试，避免 token 和耗时失控，最多重试1次\n\n## 写操作失败处理：1395001 决策树\n\n当拒绝 / 转交 / 退回 / 撤回 / 同意等写操作返回 `1395001`（任务状态异常 / 写前置校验失败）时，按下面规则处理：\n\n1. **先停止盲目重试**，不要连续重复提交相同写操作，最多重试1次\n2. 优先从以下角度解释：\n   - 任务可能已被他人处理\n   - 单据状态已变化，当前动作已不再允许\n   - 当前用户已不具备该任务的操作资格\n   - 当前节点或单据状态不支持该操作\n3. 如需确认，只补 **一次** 状态查询（`tasks query` 或 `instances get`），不要陷入 query/write 循环\n4. 最终给用户明确结论和下一步建议，而不是继续无意义重试\n\n**特别注意：** 对拒绝 / 转交 / 撤回场景更要严格执行上述规则；这些场景最容易因状态切换而失败。\n\n```bash\nlark-cli approval approvals search --data '{\"keyword\":\"请假\"}' --as user\nlark-cli approval approvals get --params '{\"approval_code\":\"<code>\"}' --as user\nlark-cli approval instances create --data '{\"approval_code\":\"<code>\",\"form\":\"[...]\"}' --yes --as user\nlark-cli approval tasks query --params '{\"topic\":\"1\"}' --as user\nlark-cli approval tasks approve --data '{\"instance_code\":\"<ic>\",\"task_id\":\"<tid>\",\"comment\":\"同意\"}' --as user\n```\n\n## 不在本 skill 范围\n\n创建审批定义（走飞书客户端或审批管理后台）；三方定义发起（返回 `create_link`，引导用户通过链接发起）；非审批类待办 → [`lark-task`](../lark-task/SKILL.md)\n\n<!-- File: skills/lark-apps/creative-design/creative-design.md (Tokens: ~11275 | Category: anthropic-skill) -->\n---\nname: creative-design\ndescription: 以自包含 HTML 创建精致的设计产物：UI mockup、可交互原型、线框图（wireframe）、落地页、仪表盘、应用屏幕、移动 App、幻灯片 deck（即 PPT / PowerPoint 演示文稿）、动画视频（motion graphics、产品演示 Demo 动画、数据动画）、可视化报告 / 信息图（infographic）/ 视觉长图与视觉探索。只要用户要求为界面、产品屏幕、用户流程、内容版式、视觉产物或 pitch/deck 概念进行 design、mock up、prototype、wireframe、可视化、动画/动效、探索或制作 PPT/deck——即便他们没有说\"设计\"二字——就使用本 skill。Harness 无关：适用于 Aily、Claude Code、Codex Agent 及类似的具备文件能力的 agent。\n---\n\n## 目录结构与运行环境\n本 skill 附带以下资源，路径均相对于本文件所在目录：\n\n- `references/<name>.md` — 媒介专属技能 prompt（如 `frontend-design.md`、`hi-fi-design.md`、`charts.md` 等；见文末「Skills 元信息」的完整列表）。与下方 harness 工具映射表同在 `references/` 目录。\n- `starter-components/` — 现成的 HTML/JS/JSX 脚手架（`design-canvas.jsx`、`deck-stage.js`、`ios-frame.jsx`、`android-frame.jsx`、`tweaks-panel.jsx`、`macos-window.jsx`、`browser-window.jsx`、`animations.jsx`）。见下文「Starter Components」。\n- `references/<harness>.md` — **harness 专属工具映射表**（`claude.md`、`codex.md`、`aily.md`）。本文行文使用的是 harness 无关的 web 工具名——`ask_user_question`、`copy_starter_component`、`invoke_skill(\"X\")`、`generate_image`、`search_images`、展示文件等——**动手前先读取与你当前运行环境对应的 `references/<harness>.md`，把这些名字映射成你 harness 里的真实工具**。例如在 Claude Code 里 `ask_user_question` → `AskUserQuestion`、`copy_starter_component` → `Bash cp <本 skill 所在目录>/starter-components/<file> .`、`invoke_skill(\"X\")` → `Read references/<file>.md`。\n- `assets/index.html` — React + Babel 的 HTML 起步模板（锁定版本 script 标签 + `#root` 挂载点），见下文「React + Babel」。\n\n## 工作流\n1. 理解用户需求。对全新或含糊的工作，提出澄清性问题。弄清输出物、精细度（fidelity）、选项数量、约束条件，以及涉及的 UI kit 与品牌。\n2. 探索所提供的资源。附件、文档链接、网页 URL 都要在动手前解析完（见「输入资料解析」）。\n3. 列出 todo 清单。\n4. 为本次任务创建独立的任务目录——多个任务会在同一个根目录下执行，直接写根目录会互相覆盖、文件串台；每个任务目录是一个**独立的妙搭应用仓库**——新任务先用 `+create` 建应用、再 `+init --app-id <app_id> --dir <任务目录>` 初始化仓库（会自动 clone 并切到 `sprint/default`，命令见「发布」前提），独立发布互不影响。把资源复制进任务目录，在其中创建交付物。用图片素材提升美观度与丰富度、或需要有依据的内容时，按「图像素材与外部信息」补充。\n5. （如有）自检React + Babel路径是否正确；ReactDOM.createRoot 是否参数正确，对应元素是否存在\n6. 收尾：提交你的改动。\n7. 发布：把产物发布到妙搭拿到可访问链接（见下方「发布」）。写完不发布，用户拿不到线上链接。\n8. 极其简短地总结——只讲注意事项与后续步骤，并给出发布后的可访问链接。\n\n鼓励你并发调用文件探索工具以提升效率。\n\n## 提问\n默认基于用户给的信息、项目上下文和合理假设直接开始，不为收集偏好而打断。只有当一个决策同时满足两条，使用可用的 向用户提问的 工具向用户提问：① 用户没说、且从 prompt / PRD / 截图 / 代码库 / 品牌资料也推不出；② 猜错要推倒重来（承重决策，下游都建在它上面）。两条只要有一条不成立——能合理推断，或猜错只是局部返工——就直接做。\n\n承重、推不出就必须先问的：交付媒介 / 格式（报告 vs deck vs 看板）；视觉 / 美学方向（从零起的项目、且资料里推不出一个有把握不返工的方向时）；大体量交付（整套 deck、多页产物）的受众 / 目的与核心范围。\n局部、给默认直接做的：变体数量与探索维度、界面文案、占位与示例内容、单屏 / 单组件的处理与密度——给合理默认（变体默认摆 2-3 个有清晰差异的方案），让用户在产出上重定向，不为它们提问。\n\n例如：\n\n- \"做一份关于 X 的报告／材料\"但没说格式 → 媒介推不出且承重，先确认交付格式（幻灯片 vs. 视觉报告 vs. 仪表盘），再问格式相关的问题。\n- 为附带的 PRD 做一套 deck → PRD 能推出受众 / 场景就直接做；只有受众、篇幅推不出且影响全局时才问。\n- 用这份 PRD 为 Eng All Hands 做一套 10 分钟的 deck → 无需提问；信息已足够。\n- 把这张截图变成交互原型 → 只有当图片无法说明预期行为时才提问。\n- 做 6 页关于黄油历史的幻灯片 → 媒介、页数已定，直接开工；风格能从主题推断就定，推不出再问。\n- 为我的外卖 app 的 onboarding 做一套原型 → 按常见 onboarding 流程直接做；只问会阻塞产出的承重问题。\n\n当交付格式本身不明确时——用户只说了一个成果（\"一份报告\"\"材料\"\"一份摘要\"）却没说媒介——先解决格式，再讨论任何与格式相关的细节。\n\n问出好问题至关重要。技巧：\n\n- 通常一轮聚焦提问就够；把承重的未知一次问齐，不要挤牙膏式多轮打断。\n- 只问推不出的；能从 PRD、截图、代码库、品牌资产、现有页面和用户原话推断的，先推断，并在产出里说明你的假设。\n\n## 输入资料解析\n用户给的附件、文档链接和 URL 是设计的输入，必须在动手前解析完——数据看板、报告和基于文档的 deck 全都建立在源资料之上，跳过这一步产出的内容只能靠编造。按输入形态处理：\n\n- **数据文件（csv / json / xlsx）**——先看结构（列名、字段类型、行数）和样本行，再决定信息层级与图表选型；指标一律用脚本从源数据计算，不要目测。\n- **压缩包（zip）**——先解压到临时目录，逐个查看内容物，再按各自类型处理。\n- **文档（docx / pdf / 论文 / 需求文档）**——用当前 harness 的文档解析能力读取**全文**（映射见 `references/<harness>.md`；Aily 原生支持解析 Word / PDF 等二进制文件），不要只读开头就动手。\n- **飞书云文档 / 多维表格链接**——用 `lark-cli` 读取内容（云文档 / 多维表格相关命令，不确定用法先查 `--help`）；`lark-cli` 不可用时向用户说明并请其导出或粘贴，不要凭标题猜内容。\n- **网页 URL**——用 `web_fetch` 抓取全文后再产出；抓取失败就告知用户，不要凭 URL 和常识编写。\n\n## 如何开展设计工作\n动手前先读取 **`./references/frontend-design.md`** 确立视觉方向——它教你如何果断做出有意图、不落模板俗套的美学抉择：有品牌或既有 UI 时对齐现有视觉语言，从零起步时据主题 / 材料立一个契合的方向。当媒介专属 skill 内的指令与通用设计规则冲突时，以媒介 skill 内的指令为准——这是规则内容的优先级，不改变「该加载 / 调用哪些 skill」。\n\n当用户请你做高保真 UI mockup、界面设计或带多方案的视觉探索时，开始之前先读取 **`./references/hi-fi-design.md`**——它涵盖了设计流程、获取设计上下文、提问以及呈现多个方案。\n\n一次设计探索的输出是单个 HTML 文档。根据你所探索的内容选择呈现格式：\n\n- **静态视觉 / 设计稿 / 多方案探索**（颜色、字体、单个元素、整屏 UI、流程关键帧）→ 通过 `starter-components/design-canvas.jsx` starter component 把各方案铺陈在画布上。除非用户明确要求可点击 / 可交互，否则不要把设计稿升级成点击原型。\n- **用户明确要求可交互的流程或产品 demo** → 将整个产品做成高保真可点击原型，并把关键选项以 Tweak 形式暴露出来。可交互原型禁止使用 `starter-components/design-canvas.jsx`、`<DCArtboard>` 或画布外壳包裹；它应该作为真实应用界面直接运行。\n\n这两者可以组合，但只限静态设计探索。已经做好的**可交互原型**如果用户接着想探索多个方向，用页内开关、路由、Tabs、Tweak 或模式切换承载变体；不要把交互原型放进 design-canvas 画布，也不要用 `<DCArtboard>` 并排包裹。\n\n当用户要求新版本或改动时，把它们作为 TWEAKS 加到原件上；拥有一个可切换不同版本开关的主文件，优于拥有多个文件。\n\n## 默认美学指令\n如果用户没给参考或艺术方向：能从主题、材料或场景推断出一个有把握、不会返工的视觉方向，就主动确定，并在设计中体现假设；如果推不出、又是从零起的项目，先用 `ask_user_question` 问清偏好的调性、受众、颜色、字体、情绪等再动手——不要在推不出方向时硬选，slop 就是这么来的。\n\n定下视觉方向后（无论是推断还是问来的），创建设计时遵循以下指引：\n\n- **字体与排版。** 选择与主题、媒介和场景匹配的少量字体，并通过字号、字重、字宽、行长、语义断行、数字样式和文字位置建立清晰层级与视觉节奏；不依赖增加字体数量制造变化。\n- **背景与色彩体系。** 确定主色调，并建立与主题协调的中性基底、主题色和必要的章节／语义色。背景不局限于纯黑、纯白或单一色调，可以根据内容属性、页面角色和叙事节点使用不同色调、主题色底、局部色域、图片或图形背景。\n- **色彩一致性。** 一致性来自共享色板、字体、栅格、图形语言和明确的颜色关系，不要求所有页面使用相同背景。颜色变化应帮助识别章节、信息层级和重点，避免无语义地逐页随机换色。\n- **强调色。** 使用数量克制、关系协调的强调色，并根据背景、信息层级和色彩语义调整明度与彩度。图表、状态和章节色需要清楚可区分，但应属于同一视觉体系。\n- **中性色。** 黑、白、灰可以带有与主题协调的细微色相，避免把纯黑白或低饱和配色作为所有专业场景的默认答案。\n- **视觉复杂度。** 视觉丰富度应服务内容。不要添加无信息价值的装饰，也不要把\"克制\"理解为单调、大量留白、缺少图片图表或所有页面使用同一种构图。\n\n关键：如果已给出其他美学指令（如参考图、品牌体系、设计规范或媒介专属 skill），或项目中已有文件，则完全忽略默认美学。\n\n## 图像素材与外部信息\n图片素材能显著提升产物的美观度与丰富度——不要默认只用纯 CSS/SVG 撑起全部视觉。为氛围、质感和视觉节奏而配图是正当用途，不需要等到\"内容必须有图\"才配图。选择工具的判断规则很简单：**需要真实图片就搜索，需要丰富美观的图片就生成**。当前 harness 若提供以下能力（映射见 `references/<harness>.md`；没有对应工具就跳过，用内联 SVG / CSS 图形兜底），在合适的位置主动使用：\n\n- **`generate_image`（AI 图片生成）**——美化、氛围类配图一律走生成：hero 图、插画、照片质感背景、章节题图、空状态插图、信息图（infographic）、产品/场景示意图等任何能让页面更好看的位置，用文生图直接生成；有品牌参考图或用户素材时用图生图对齐既有视觉语言；多屏 / 多页需要风格统一、角色连贯的插画体系时用组图一次生成整个序列；对已有图片做局部调整用图片编辑。生成 prompt 里写清风格、构图、配色与光线，让产出与已确立的视觉方向一致，而不是各自为政。\n- **`search_images`（图片搜索）**——需要真实图片时走搜索：真实存在的实物、产品、地点、人物、logo、截图等生成会失真或造假的素材，以及确立视觉方向时按关键词找参考图（同类产品界面、风格 moodboard）。直接引用搜索结果时注意来源与版权。\n- **`web_search` / `web_fetch`（联网搜索）**——内容需要真实事实、数据、案例或时效性信息时先搜再写，不要编造（见「内容准则」：涉及新增事实、数据时要有依据）。调研型产出（行业研究、政策梳理、竞争格局类 deck / 报告）要先做多轮搜索，把事实、数字与来源收集齐并标注出处，再进入设计。\n- **视频素材**——需要嵌入公开视频（培训短片、案例视频等）时，用联网搜索找到可公开访问的视频页面或可嵌入链接，以 `<iframe>` / `<video>` 嵌入并注明来源；不要下载搬运版权内容，也绝不虚构视频 URL——找不到合适的就如实告知用户并留占位。\n\n约束：\n\n- 配图要属于同一视觉体系——风格、色调、光线与已确立的视觉方向一致，宁可少而统一，不要多而杂乱；逐张风格漂移比没有图更伤美观度。\n- 用户已提供图片 / 品牌素材时优先使用，不要擅自用生成图替换。\n- 搜索到 / 生成的图片先落到本地，再用 `lark-cli apps +file-upload --app-id <app_id> --file <local_path> --as user` 上传，代码中引用返回的**远端 URL**——不要提交 git、不要引用本地路径、不要 base64 内联，也不要直接热链搜索结果页的原始 URL（可能防盗链或失效）。上传需要 `app_id`，任务尚未初始化时先按「发布」前提完成 `+create` / `+init` 两步。\n\n## 输出创建准则\n- **文件输出路径**：会话根目录下会并存多个任务。**每个任务先创建自己的独立目录**（语义化命名，如 `sales-dashboard/`）——它就是一个独立的妙搭应用仓库，独立初始化、独立发布。所有交付物写进本任务目录，主 HTML 入口是该目录下的 `index.html`。不要把文件写到任务目录之外的共用根目录，也不要改动其他任务的目录；用户要迭代某个已有任务时，进入该任务的目录继续改，不要另起新目录。\n- 对文件做重大修订时，先复制再编辑，以保留旧版本（如 index.html、index v2.html 等）。\n- 始终避免写大文件（>1000 行）。而应把代码拆成若干更小的 JSX 文件，最后在主文件里 import 进来。这让文件更易管理和编辑。\n- 对于视频和其他带时间轴的内容，让播放位置可持久化；每次变化时存入 localStorage，加载时再从 localStorage 读回。这样用户刷新页面时不会丢失当前位置，而刷新在迭代设计中很常见。（使用 `starter-components/deck-stage.js` 的 deck 不需要这么做——宿主会把幻灯片位置保存在 URL 中。）\n- 在既有 UI 上做增补时，先理解该 UI 的视觉语汇并遵循它。对齐文案风格、配色、语气、hover/click 状态、动画风格、阴影＋卡片＋布局模式、密度等。把你观察到的东西\"出声想一想\"会有帮助。\n- 写规范的 HTML，让编辑器能直接编辑：显式闭合每个非空（non-void）元素（写 `<p>…</p>`，绝不依赖隐式闭合），每个属性值都用双引号，且不要自闭合非空元素（写 `<div></div>`，而非 `<div/>`）。这有助于直接编辑功能正常工作。\n- 绝不使用 `scrollIntoView`——它可能搞乱 web app。如有需要，改用其他 DOM 滚动方法。\n- **颜色使用：** 有品牌色时优先沿用品牌体系；没有品牌或既有配色时，根据主题、受众、内容语义和视觉方向推导协调色板。避免随意加入彼此无关的颜色，不要默认退回纯黑白。对于数据图表和信息图，颜色应承担区分、强调或表达语义的作用，并保证足够对比。\n- **Emoji：** 不要在生成的代码中使用 emoji 字符——不作图标、不作装饰、不放进数据里。例外：仅当用户的品牌资产明确包含 emoji 时。\n- **图标：** 系统图标规则仅适用于需要界面图标体系的 UI 或交互原型。在这类产物中，使用手写内联 SVG（`<svg viewBox=\"0 0 24 24\">`）建立语义贴切、风格连贯的图标语言。\n- **字体加载：** 需要 Google Fonts / web 字体时，一律从自托管镜像 `https://miaoda.feishu.cn/fonts/css2` 加载，不要直连 `fonts.googleapis.com` / `fonts.gstatic.com`——这两个 Google CDN 在部分地区慢、甚至连不上，会导致字体加载失败、页面回退到系统字体。镜像是 Google Fonts `css2` 端点的直接替代：查询语法完全一致（`?family=Inter:wght@400;600&display=swap`，多字族就重复多个 `family=` 参数），只需把域名换成镜像；它返回的 `@font-face` 会把字体文件也指向自托管 CDN，CSS 与字体文件两跳都不经过 Google，字库与字重同 Google Fonts。照常用 `<link rel=\"stylesheet\" href=\"https://miaoda.feishu.cn/fonts/css2?family=…&display=swap\">` 引入即可。\n\n## 内容准则\n\n**内容取舍。** 不添加与用户目标无关或没有依据的内容。在用户明确的范围内，可以重组、解释和补足完成叙事所需的信息；涉及新增事实、数据或任务范围时，再向用户确认或明确为示例。内容不足以独立成页时，应合并、重构或请求材料，不用放大元素和增加留白勉强撑页。\n\n**数据保真。** 用户给了源数据（附件、文档、表格）时，产物中的每个图表数字、指标和结论都必须从源数据实际计算得出（写脚本统计，见「输入资料解析」），并能追溯回源数据——不目测、不凑整、不编造。做数据报表/看板前读 `references/data-report.md`，其中的数据准则同样适用。\n\n**硬性规格是约束，不是建议。** 用户给定的页数/张数范围、画幅比例、结构大纲、预算上限、必须包含的表格或模块，逐条对照满足，交付前自查一遍；幻灯片的页数规划方法见 `references/make-a-deck.md`。\n\n**使用恰当的尺度：** 对于 1920x1080 的幻灯片，文字绝不应小于 24px；理想情况下要大得多。打印文档最小 12pt。移动端 mockup 的点击目标绝不应小于 44px。\n\n**避免 AI slop 套路：** 包括但不限于滥用渐变背景、emoji（见上面的 Emoji 规则）、圆角＋左边框强调色的容器、被用滥的字体族（Inter、Roboto、Arial、Fraunces）。\n\n**CSS**：`text-wrap: pretty`、CSS grid 以及其他高级 CSS 效果都是你的好帮手！\n\n**强烈倾向用带 `gap` 的 flex/grid，而非 inline 流。** 对任何一行或一组兄弟元素（按钮、chips、图标、卡片、导航项、工具栏），用 `display: flex` 或 `display: grid` 配合 `gap:` 来做间距——而不是用靠源码空白或逐元素 margin 分隔的裸 inline/inline-block 兄弟元素。flex/grid 的间距是显式的，能干净地经受直接操作类编辑（拖拽重排、删除、复制）；而 inline 流依赖空白文本节点，在 DOM 编辑下很脆弱。把 inline 流留给句子中偶尔夹带 `<a>`/`<strong>`/`<em>` 的文字段落——不要用它来排布 UI 元素。\n\n## 保留评论锚点\n某些源元素带有 `data-comment-anchor=\"…\"` 属性。它把用户的评审评论钉在该元素上。编辑时，把该属性保留在你输出中语义等价的那个元素上——如果你重构了结构就随元素一起移动它，在文本／样式编辑中保留它，仅当你彻底删除该元素时才丢弃它。绝不发明新值，也不要把它复制到其他元素上。\n\n## 为幻灯片和屏幕打标签以提供评论上下文\n在代表幻灯片和高层级屏幕的元素上加 `[data-screen-label]` 属性；这样你就能分辨用户的评论是针对哪一张幻灯片或哪一屏。\n当用户说\"slide 5\"或\"index 5\"时，他们指的是第 5 张幻灯片（标签\"05\"），而绝非数组下标 `[4]`——人类不按 0 起始计数。\n\n## React + Babel（浏览器内 JSX）\n当用浏览器内 JSX 编写 React 原型（无构建步骤——Babel 在运行时转译）时，你必须使用下面这些锁定版本的确切 script 标签。不要使用未锁定版本（例如 react@18）。要用 React + Babel 时，可直接从本 skill 的 `assets/index.html` 拷贝 HTML 模板起步（`cp <本 skill 所在目录>/assets/index.html <任务目录>/index.html`）——它已带好这三个 script 标签和 `#root` 挂载点，不必手写。\n\n```html\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/react@18.3.1/umd/react.development.js\" crossorigin=\"anonymous\"></script>\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/react-dom@18.3.1/umd/react-dom.development.js\" crossorigin=\"anonymous\"></script>\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/@babel/standalone@7.29.0/babel.min.js\" crossorigin=\"anonymous\"></script>\n```\n\n发布前需要对以上 script 路径进行自检，确保它们路径与上述代码完全一致\n\n### 脚本导入\n用 script 标签导入你写的任何辅助脚本或组件脚本。`.jsx` 文件必须用 `<script type=\"text/babel\" src=\"xxx.jsx\"></script>`——它们含 JSX 语法，需要 Babel 转译；省略 type 属性会让浏览器把 JSX 当作纯 JS 解析，从而抛出语法错误。纯 `.js` 文件可以用普通的 `<script src=\"xxx.js\"></script>`。避免在脚本导入上使用 `type=\"module\"`——它可能会出问题。\n\n**加载顺序**：`@babel/standalone` 用异步 XHR 拉取外部 `<script type=\"text/babel\" src=\"...\">` 文件，但保证按 DOM 顺序执行——靠前的脚本总在靠后的脚本之前运行。然而，内联脚本（无 `src`）会立即就绪，而外部脚本必须等待网络响应。如果一个内联脚本排在前面，它会立即执行，其副作用（例如 React 的 `useEffect`）可能在任何后面的外部脚本加载之前就触发。把外部脚本放在依赖它们的内联脚本之前。\n\n### 跨文件作用域\n每个 `<script type=\"text/babel\">` 在转译后都有自己独立的作用域。要在文件间共享组件，在组件文件末尾把它们导出到 `window`：\n\n```js\n// 在 components.jsx 末尾：\nObject.assign(window, {\n  Terminal, Line, Spacer,\n  Gray, Blue, Green, Bold,\n  // ... 所有需要共享的组件\n});\n```\n\n### 样式对象命名\n定义全局作用域的样式对象时，给它们起具体的名字。如果你导入了 1 个以上带 `styles` 对象的组件，就会出问题。你必须基于组件名给每个 styles 对象起唯一的名字，比如 `const terminalStyles = { ... }`；或者用内联样式。绝不要写 `const styles = { ... }`。\n\n### 动画\n对于视频风格的 HTML 产物，调用 `animated-video` skill 并从 `starter-components/animations.jsx` starter component 起步——不要自己实现时间轴引擎。对于简单的交互原型过渡，CSS transitions 或纯 React state 就够了。\n\n### 原型\n- 克制住加\"标题\"屏的冲动；让你的原型在视口中居中，或做成响应式尺寸（填满视口并留合理边距）。\n\n## Starter Components（起始组件）\n现成的 HTML/JS/JSX 脚手架（scaffold）就放在本文件旁边的 `starter-components/` 目录里——需要设备外框（device frame）、幻灯片外壳（deck shell）、画布（canvas）或动画时间轴（animation timeline）时，直接用它们，不要手搓。使用方式：把文件拷进当前任务目录（在任务目录下执行 `cp <本 skill 所在目录>/starter-components/<file> .`——注意 cwd 不会是 skill 目录，要用 skill 目录的实际路径），或读过之后照着改；每个文件顶部都带有自己的用法说明。\n\n- `design-canvas.jsx` — 可平移／缩放的画布，artboard 可重排、可全屏聚焦。\n- `deck-stage.js` — 幻灯片 deck 外壳。用于任何幻灯片演示（见「Skills 元信息」中的 Make a deck）。\n- `ios-frame.jsx` / `android-frame.jsx` — 带状态栏和键盘的设备边框。\n- `tweaks-panel.jsx` — 浮动的 Tweaks 面板＋表单控件（`useTweaks`、滑块、开关、单选、颜色 chips 等）。\n- `macos-window.jsx` / `browser-window.jsx` — 桌面窗口外壳（chrome）。\n- `animations.jsx` — 基于时间轴的动画引擎（Stage + Sprite + scrubber + Easing）。\n\n## Tweaks\n用户可以从工具栏开关 **Tweaks**——一个存在于原型内部的页内控件面板（颜色、字体、间距、文案、布局变体）。不要自己实现它：用 `kind: \"tweaks-panel.jsx\"` 调用 `copy_starter_component` 并阅读复制出来的文件——它接好了宿主协议，并给你 `useTweaks()` 以及现成的控件。这个面板的标题按界面语言来定——英文叫\"Tweaks\"，中文叫\"风格\"。把它保持小巧，Tweaks 关闭时完全隐藏，并且即使用户没要求，也默认加上几个有品味的 tweak。你写在面板里的标签和选项是用户会读到的内容，而非配置——用与 app 其余部分相同的语言书写。\n\n**闭环。** 每个 tweak 都需要一个生产者（面板控件）和一个消费者（对该值作出反应的内容）。只存在于 `<TweaksPanel>` 和 `TWEAK_DEFAULTS` 里的值不会改变设计中的任何东西——用户看到控件有反应，但原型纹丝不动。\n\n## 发布\n设计产物写完并提交后，需要发布到妙搭（lark-apps）才能拿到可访问链接。本 skill 产出的是创意模式（html）应用，发布走本地开发链路：改动 git commit 后推到工作分支 `sprint/default`，再用 `lark-cli apps` 命令发起部署并轮询结果。\n\n**前提**：每个任务目录是一个独立的妙搭 html 应用仓库，独立发布、互不影响；发布序列的所有命令都在**当前任务目录**内执行。任务目录还不是应用仓库（没有 `.spark/meta.json`）时，先完成两步初始化：\n\n```bash\n# 1. 创建应用，记下返回的 app_id（app_ 开头）\nlark-cli apps +create --name \"<应用名>\" --app-type html --as user\n\n# 2. 初始化到任务目录：会自动 clone 远端仓库并 checkout 工作分支 sprint/default，\n#    无需 git init / git checkout（--dir 不传默认 ./<app-id>；\n#    --source-path 可把已写好的产物一并并入，但源码目录不存在时会被静默跳过，用后核对文件确实进了仓库）\nlark-cli apps +init --app-id <app_id> --dir <任务目录> --as user\n```\n\n初始化后在任务目录内创建 / 修改产物（创意模式是 buildless，源码即产物，`index.html` 放仓库根目录），然后走下方发布序列。\n\n`app_id`（`app_` 开头）从任务目录的 `.spark/meta.json` 读取，或来自 `+create` 的返回 / 用户给出——`cli_` 开头的是飞书应用 ID，绝不能传给 `apps +*` 命令。资源型文件（图片、字体、音视频）不要提交 git、不要引用本地路径、也不要 base64 内联；先 `lark-cli apps +file-upload --app-id <app_id> --file <local_path> --as user` 上传拿远端 URL 再在代码里引用（见「图像素材与外部信息」）。\n\n发布序列：\n\n```bash\n# 1. 提交并推到工作分支 sprint/default\n#    遇非 fast-forward：先 git pull --rebase origin sprint/default 解决冲突再推，绝不 force-push\ngit add . && git commit -m \"feat: ...\" && git push origin sprint/default\n\n# 2. 发起部署（记下返回的 release_id），然后轮询状态直到 finished / failed：\n#    publishing → 继续轮询；finished → 输出含可分享的 online_url，直接返回给用户；failed → 按输出中的 error_logs 报告失败原因\nlark-cli apps +release-create --app-id <app_id> --as user\nlark-cli apps +release-get --app-id <app_id> --release-id <release_id> --as user\n```\n\n要点：\n\n- 所有 git 命令必须在**任务仓库根目录**下执行（每条命令先 `cd <任务目录>`，或用 `git -C <任务目录>`）——`git add .` 作用于当前 cwd，在多任务共用的上级根目录里执行会把其他任务的文件也 stage 进来。\n- 推送和部署的分支必须是 `sprint/default`：推到其他分支，`+release-create` 会失败。\n- `+release-create` 部署的是远端 `sprint/default` 上**已 push** 的代码，不是本地工作区——未 commit / 未 push 的改动不会进入这次发布。\n- 完成 ≠ 发布：产物生成完、或 `+list` 显示 `is_published=true`，都不代表最新内容已上线；必须拿到本轮 `+release-get` 返回的 `finished` 才算发布成功。\n- 创意模式（html）应用**开发态与发布态是同一个链接**（形如 `https://{租户域名}/page/{meta_token}`，形似飞书文档链接），`online_url` 即最终可分享链接。\n- 任何 git 操作（push / pull / clone）报认证失败、401/403、credential helper 缺失或 token 过期时，先执行 `lark-cli apps +git-credential-init --app-id <app_id> --as user` 刷新本地 Git 凭证，再重试原 git 命令；刷新凭证也失败就停下向用户报告错误，不要改走其他发布路径（尤其不要用 `+html-publish`）。\n\n## Skills 元信息\n你有以下内置技能 prompt，位于本文件相对路径下的 `references/` 目录中。如果用户的需求与其中某个技能匹配，而对应的 prompt 尚未加载进你的上下文，就去 READ（读取）相应文件，把它的指引加载进来。\n\n- **[Animated video](references/animated-video.md)** — Use when creating animated videos, motion graphics, product walkthroughs, or visual storytelling with timeline-based playback. 触发词：animation, video, motion, 动画, 视频, 动效, 产品演示, 演示动画, walkthrough\n- **[Charts](references/charts.md)** — 基于 ECharts 的数据可视化，用于浏览器直出 HTML。当需要创建图表、仪表盘或数据可视化时使用。触发词：chart, ECharts, 图表, 可视化, visualization, 饼图, 柱状图, 折线图, 数据图表, 甘特图, 热力图, 数据展示, dashboard, 仪表盘, 数据看板\n- **[Data report](references/data-report.md)** — 数据驱动的报表与看板设计。从数据分析到报表规划、信息层级组织，适用于用户有数据文件或明确指标，需要产出结构化数据报表的场景。图表绘制部分由 charts skill 承担。触发词：数据报表, 数据看板, 数据分析报表, BI, 经营报表, 指标看板, 周报, 月报, 数据大盘, KPI, 报表设计, data report, dashboard report, analytics report\n- **[Frontend design](references/frontend-design.md)** — Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.\n- **[Hi-fi design](references/hi-fi-design.md)** — 用于创建高保真 UI mockup、设计探索，或带多种变体的视觉原型。触发词：mockup, hi-fi, prototype, UI design, 高保真, 设计稿, 原型, 界面设计, 视觉设计, 设计方案\n- **[Interactive prototype](references/interactive-prototype.md)** — 可交互原型：像真实应用一样直接运行的高保真交互 demo。触发词：可交互原型, 交互原型, 点击原型, interactive prototype, working app, 产品 demo, 工单系统, 管理后台, 看板工具, 多页面应用\n- **[Make a deck](references/make-a-deck.md)** — 当用户要求制作幻灯片（slide deck）、演示文稿（presentation）、pitch deck 或 \"slides\"——即一个供演讲者演示的自包含 HTML 单页（1920×1080，16:9），而非网站时使用。\n- **[Visual exposure](references/visual-exposure.md)** — 用于制作可视化报告、专题视觉页、信息图、视觉长图、概念可视化、产品能力曝光、方案亮点展示等内容型 HTML 视觉作品。适合用户想把材料、数据或观点组织成可阅读、可展示、可传播的视觉化表达，但不希望做成 PPT、传统 dashboard 或纯 ECharts 图表的场景。触发词：可视化报告, 视觉报告, 可视化曝光, 视觉化曝光, 信息图, 长图, infographic, 视觉表达, 概念可视化, 亮点展示, 能力曝光\n- **[Wireframe](references/wireframe.md)** — Explore many ideas with wireframes and storyboards\n\n<!-- File: skills/lark-apps/creative-design/references/aily.md (Tokens: ~1437 | Category: anthropic-skill) -->\n# Aily 工具参考\n\n本文档列出 [`../creative-design.md`](../creative-design.md) 所依赖的 harness 专属工具，供你在 **Aily** 中运行时使用。主提示词只命名能力（\"向用户提问\"、\"展示文件\"等）；本文档给出 Aily 的调用方式。通用工具（`Bash`、文件读/写/编辑、grep/glob 搜索）在任何环境都相同，不在此覆盖。\n\n## Web 工具 → Aily 对应项\n\n上游提示词引用了一些在 Aily 中并不存在的 Claude.ai web 工具。无论出现在行文还是代码里，一律按下表替换：\n\n| Web 工具 | Aily 对应项 |\n|---|---|\n| `ask_user_question` | `ask_user`（向用户抛出结构化决策问题；先问，等用户答复后再继续）。 |\n| `done`、`fork_verifier_agent` | 用 `submit` 交付结果并给出文件路径。 |\n| `write_file`（及其 `asset:` 参数） | Aily 的「创建/编辑本地文件」工具。不存在 asset review pane；舍弃这一概念。 |\n| `copy_files` | `Bash cp`。 |\n| `read_file`、`list_files`、`view_image` | 「读取本地文件」；按文件名查找用 glob、搜内容用 grep；图片直接走「解析二进制文件（…图片…）」——Aily 原生支持图像输入。 |\n| `show_to_user` | 用 `submit` 交付并给出绝对本地文件路径。 |\n| `eval_js`、`eval_js_user_view`、`run_script` | 脚本用 `Bash`。 |\n| `web_fetch`、`web_search` | `fetch`、`web_search`。用于时效性事实、内容素材补充或用户要求的查询。 |\n| `generate_image` | `aily-image-generate_workbench`（Seedream V4.5 模型）：支持文生图、图生图（给参考图）、信息图（infographic）、图片编辑、组图（一次生成多张风格统一、角色连贯的图像序列）。 |\n| `search_images` | `doubao_image_search`（按关键词搜索图片，适合找参考图、素材图）。 |\n| `copy_starter_component` | `Bash cp <本 skill 所在目录>/starter-components/<file> .`（cwd 通常是应用项目目录而非 skill 目录，需用 skill 目录实际路径；或读取后改编）。 |\n| 文档解析（docx / pdf） | Aily 原生「解析二进制文件」能力直接读取 Word / PDF / Excel / PPT 全文；PDF 也可用 `aily-pdf` 专用工具。 |\n| `invoke_skill(\"X\")` / `invoke the \"X\" skill` | 用 `get_skills(\"X\")` 加载对应媒介技能（如 `get_skills(\"frontend-design\")`）。这些技能同时以本地文件形式随本 skill 附带在 `references/<X>.md`，`get_skills` 取不到时直接读该文件。 |\n\n## 提出澄清性问题\n\n用 `ask_user` 提出聚焦的结构化问题——它把用户的决策内联返回，先问、等答复后再继续。它最适合高影响力的承重决策：交付格式、保真度、设计上下文、参考应用、变体数量。一轮提问保持简明、可执行。不要虚构假的工具名。\n\n## 交付与发布\n\n- 用 `submit` 提交交付结果，并给出绝对本地文件路径。\n- 产物完成并提交后，按 [`../creative-design.md`](../creative-design.md)「发布」一节发布到妙搭——交付给用户的可分享链接是 `+release-get` 返回的 `online_url`。\n\n## Aily 专属注意事项\n\n- **优先用专用工具而非手搓。** 除了通用 `Bash`，Aily 还带一批专用工具（`aily-xlsx`、`aily-chart`、`aily-diagram`、`aily-pdf`、`aily-image-generate_workbench` 等）。涉及表格、图表、流程图、PDF、图像生成时，优先用对应专用工具，而不是用 `Bash` 从零脚本化。\n- **图像素材优先走生成 / 搜索。** [`../creative-design.md`](../creative-design.md)「图像素材与外部信息」一节的 `generate_image` / `search_images` 在 Aily 下都有真实对应（见上表），设计产物需要 hero 图、插画、信息图、连贯组图或参考图时应主动使用，而不是默认全部用 CSS/SVG 兜底。搜索到 / 生成的图片先落到本地，再用 `lark-cli apps +file-upload` 上传、在代码中引用返回的远端 URL，不提交 git。\n- `agent` 的 `slide` 子类型用于生成**飞书幻灯片**，与本 skill 产出的自包含 HTML deck（`starter-components/deck-stage.js`）是两条不同路径，不要混用——本 skill 的 deck 始终是 HTML。\n- 交付统一走 `submit`；需要跨轮次保留项目上下文时可用 `aily-work-memory`。\n\n<!-- File: skills/lark-apps/creative-design/references/animated-video.md (Tokens: ~1234 | Category: anthropic-skill) -->\n---\nname: animated-video\nmetadata:\n  display-names:\n    zh-CN: 动画视频\n    en-US: Animated Video\ndescription: Use when creating animated videos, motion graphics, product walkthroughs, or visual storytelling with timeline-based playback. 触发词：animation, video, motion, 动画, 视频, 动效, 产品演示, 演示动画, walkthrough\navailable-agents:\n  - CreativeDesign\n---\n\n# Animated video\n\nCreate an animated video or motion design piece rendered as an HTML page. Build a timeline-based animation with smooth transitions. Design frame-by-frame sequences with playback controls (play/pause, scrubber). Focus on visual storytelling; take the palette from the user's brand assets, or derive it from the subject per [`../creative-design.md`](../creative-design.md)「默认美学指令」— never default to any fixed brand palette. Export-ready at a fixed aspect ratio (16:9 or 9:16). If you need to know the position of an element (eg to move a cursor or character between elements) use refs to grab the position.\n\nSTART by calling `copy_starter_component` with `kind: \"animations.jsx\"` — it gives you a ready-made timeline engine: `<Stage width height duration>` (auto-scales to viewport, scrubber + play/pause + ←/→ seek + space + 0-to-reset, persists playhead), `<Sprite start end>` to gate children to a time window, `useTime()` / `useSprite()` hooks, an `Easing` library, `interpolate()` / `animate()` tweens, and `TextSprite` / `ImageSprite` / `RectSprite` primitives with built-in entry/exit. Read the file after copying and build YOUR scenes by composing Sprites inside a Stage; only fall back to Popmotion (https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/popmotion@11.0.5/dist/popmotion.min.js) if the starter genuinely can't do what you need.\n\nAnimations are complex code! Make reusable JSX components for each visual element and each scene. Invest in tweaking the timeline iteratively.\n\nAnimation tips:\n- Storytelling is KEY! Before you create ANYTHING, identify the story arc, key tensions, characters, etc. Align on the message you want to convey. Run it by the user.\n- Use good animation principles... anticipation, easing, follow-through, exaggeration, all the Disney animator principles.\n- Scenes should have establishing shots setting the scene (use titles or captions if NECESSARY, but prefer to show not tell), followed by heavy zooms on the action. (either hard cuts, or ken-burns-style zooms, or mouse-follows.) Most scenes should exist in a realistic context: they should have a background, or exist in the UI of a computer or phone; etc. Elements should generally not float in the aether.\n- In short animations, most 'scenes' are a single shot, or a sequence of shots in the same setting. Scenes may be slides (e.g. text or graphics onscreen, animating or being emphasized (highlighted etc) in an engaging way that calls attention to the key thing). Decide what the shot is going to be. Maybe it's starting zoomed out, then slowly zooming in on the area of focus or action. Maybe it's rapidly cutting back/forth between two people or graphics in tension. Maybe you're following something, like a cursor or a line on a graph, as it flits around. Be creative!\n- Except for deliberate dramatic effect (a held beat), SOMETHING should always be in motion. The camera, an element, or a transition — slowly panning, zooming, subtly scaling up, drifting, or building. A truly static frame reads as a bug. Images especially: always slowly zoom in/out, pan, have some 'action', have text or graphics appearing or building, or be rapidly cutting in sequence.\n- Whenever you show text or images, remember that you need pauses for it to sink in -- on the order of seconds -- before you can show something else.\n\nIf cursor or pointer movement is depicted (eg in a product walkthrough or prototype), you should zoom in on it and follow it with a damped viewport animation, like Screen Studio would. You MUST use HTML refs to locate elements onscreen so the cursor points at the right things.\n\nFor product-demo animations (simulated clicks, drags, dialogs, status changes), build a believable product UI and animate its real interface state — do NOT substitute an abstract flowchart or node diagram for the product screen. Reuse the device/window shells from `starter-components/` (`ios-frame.jsx`, `android-frame.jsx`, `macos-window.jsx`, `browser-window.jsx`) instead of hand-rolling frames.\n\nFor data-driven animations (annual-review numbers, dashboards coming alive, chart morphing): animate counters by tweening the value with `animate()` / `interpolate()` and rendering the formatted number; morph charts by interpolating the underlying data array each frame and re-rendering the SVG bars/paths (or driving ECharts `setOption` from `useTime()`); chain chapters with scene transitions. Every number shown must come from the user's real data (see [`../creative-design.md`](../creative-design.md)「数据保真」).\n\nFor clarity when commenting, update the video root's data-screen-label attr with the current timestamp each second, so you can easily comment on a particular timestamp and know that the agent will be told exactly the timestamp. `<Stage>` does NOT do this for you — wire it up yourself, e.g. inside a component rendered in the Stage: `const t = useTime(); const sec = Math.floor(t); useEffect(() => { document.querySelector('.video-root')?.setAttribute('data-screen-label', sec + 's'); }, [sec]);`\n\n<!-- File: skills/lark-apps/creative-design/references/charts.md (Tokens: ~3421 | Category: anthropic-skill) -->\n---\nname: charts\nmetadata:\n  display-names:\n    zh-CN: 图表\n    en-US: Charts\ndescription: \"基于 ECharts 的数据可视化，用于浏览器直出 HTML。当需要创建图表、仪表盘或数据可视化时使用。触发词：chart, ECharts, 图表, 可视化, visualization, 饼图, 柱状图, 折线图, 数据图表, 甘特图, 热力图, 数据展示, dashboard, 仪表盘, 数据看板\"\navailable-agents:\n  - CreativeDesign\n---\n\n# 图表\n\n你是用 ECharts 呈现信息的数据叙事设计者。你的图表会出现在创意 HTML 产物中，例如仪表盘、幻灯片、设计探索。ECharts 是你的媒介，不是目标；你的工作是让数据故事一眼可读，而不是堆配置项。一个图表只表达一个主要信息。\n\n## 设计原则\n\n**先编码，再装饰。** 每个视觉通道——位置、长度、颜色、大小——要么在编码一个数据维度，要么就是噪音。先决定每个通道代表什么，再决定它看起来怎样。没有编码含义的颜色应保持统一；读者会尝试解读颜色差异，并从中读出并不存在的意义。\n\n**匹配产品的视觉语言。** 先阅读 UI 的视觉语言，再跟随它。图表颜色从产品现有色板中派生；字体从产品字体体系中派生。一个像从别的产品里掉进来的图表，会削弱用户对数据的信任。\n\n**克制。** 图表靠精确赢得信任，不靠\"看起来厉害\"。跳过 3D 效果、无意义的渐变，以及不服务于理解的动画。\n\n**平面化。** 出现在报表、看板、报告中的图表默认采用平面风格：细网格线、清晰坐标、纯色或轻微面积填充、必要注释。不要使用 `shadowBlur`、`shadowColor`、发光点、拟物高光或容器阴影来制造层次；层次来自数据权重、线宽、颜色语义和版式面积。\n\n## 流程\n\n按顺序完成这些步骤。不要一上来就写 ECharts options。\n\n1. **审视数据。** 数据有哪些维度？范围是什么？它在讲什么故事——趋势、比较、构成、分布、流向、排名？\n\n2. **选择图表类型。** 根据数据的故事，从下方的映射表中选择。\n\n3. **分配视觉编码。** 对每个视觉通道，明确它代表哪个数据维度：\n   - **位置**（x/y）→ 通常是主维度\n   - **长度/面积** → 通常是度量值\n   - **颜色** → 问自己：这张图中颜色在编码什么？\n\n     | 颜色编码的内容 | 配色方案 |\n     |---|---|\n     | **分类**（无序分组：渠道、部门） | 从产品调色板中为每组取一个不同色相，≤8 个 |\n     | **顺序或强度**（阶段、排名、分桶、单一指标） | 单一色相，纯色或从浅到深渐变 |\n     | **相对中点的偏离**（盈亏、实际 vs 目标） | 两个色相在中性色处交汇 |\n     | **价值判断**（好/坏、通过/失败） | 产品语义 token（success / warning / danger） |\n     | **无编码**（单系列，或形状已经承载了编码） | 一个纯色品牌色，所有元素统一 |\n\n     如果你在给一个**有序**系列中的每个元素分配**不同色相**，停下来——你正在把序列伪装成互不相关的分类。读者会看到 N 个无关的东西，而非一个渐进过程。\n\n4. **一次性定义色板。** 从产品 design tokens 中定义颜色。仪表盘中的每个图表都复用同一套颜色分配——同一个分类在不同图表中使用不同颜色，会迫使读者逐图重新学习编码。\n\n5. **编写 ECharts 代码。** 挂载模式和 API 约束见下方技术参考。\n\n6. **自检。** 截图检查结果。按文末清单验证。然后回到视觉编码步骤：渲染出来的图表是否真的表达了你想表达的信息？颜色编码与仪表盘其他部分是否一致？\n\n## 图表类型映射\n\n按数据故事选择图表，不按\"看起来酷不酷\"选择。\n\n| 数据故事 | 图表 | 关键约束 |\n|---|---|---|\n| 时间趋势 | Line / Area | ≤5 个系列；数据必须按时间排序 |\n| 分类比较 | Bar | — |\n| 部分与整体 | Pie（≤5 项）、Treemap / Sunburst（>5 项） | Pie >5 项 → 改用横向 Bar |\n| 分布 | Scatter、Heatmap、Boxplot | Heatmap 必须配合 `visualMap` |\n| 多维度画像 | Radar（≤8 维）、Parallel（>8 维） | — |\n| 流转 / 转化 | Funnel | — |\n| 关系 | Sankey、Graph、Tree | Sankey 的链接必须构成 DAG |\n| 日程 / 时间线 | 通过 `custom` series 实现 Gantt | 禁止用 stacked Bar 表示时间线 |\n| 金融 | Candlestick | — |\n| 主题 / 叙事流 | ThemeRiver | — |\n\n## 多图表仪表盘\n\n仪表盘中的多个图表共享上下文。把仪表盘当作一个整体页面，而不是一堆独立组件：\n\n- **共享色板**：只定义一次颜色分配（例如\"渠道 A = blue，渠道 B = green\"），并在所有图表中复用。\n- **坐标一致**：如果两个图表共享同一维度（时间、分类），对齐它们的坐标范围和刻度，让读者能横向扫描。\n- **视觉层级**：一到两个图表承载核心故事；其余图表提供支撑。尺寸和位置要表达这种主次关系。\n- **表达覆盖**：把用户需求拆成需要被回答的信息关系；每个被承诺的关系都要有对应的图表、表格、矩阵或文字证据承载。不要用少量通用指标和默认图表替代所有分析任务。\n- **小容器防崩**：小尺寸图表优先用 bar / line / number strip。饼图、雷达图、词云和外部标签很容易挤压重叠；空间不足时换图表类型，而不是缩小到不可读。\n\n## 技术参考\n\n### 加载 ECharts\n\n```html\n<script src=\"https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/echarts@5.6.0/dist/echarts.min.js\" crossorigin=\"anonymous\"></script>\n```\n\n`echarts` 通过 `window.echarts` 全局可用，无需 import。渐变：`new echarts.graphic.LinearGradient(0, 0, 0, 1, [...colorStops])`。\n\n### 挂载——纯 HTML\n\n```html\n<div id=\"chart\" style=\"width:100%;min-height:300px\"></div>\n<script>\n  const chart = echarts.init(document.getElementById('chart'));\n  chart.setOption({ /* ... */ });\n  window.addEventListener('resize', () => chart.resize());\n</script>\n```\n\n### 挂载——React 封装\n\n定义一次，复用。**不要**添加 echarts-for-react。\n\n```jsx\nfunction EChart({ option, style }) {\n  const ref = React.useRef(null);\n  React.useEffect(() => {\n    const chart = echarts.init(ref.current);\n    chart.setOption(option);\n    const onResize = () => chart.resize();\n    window.addEventListener('resize', onResize);\n    return () => { chart.dispose(); window.removeEventListener('resize', onResize); };\n  }, [option]);\n  return <div ref={ref} style={{ width: '100%', minHeight: 300, ...style }} />;\n}\nObject.assign(window, { EChart });\n```\n\n用法：`<EChart option={option} style={{ height: 400 }} />`\n\n## 自检清单\n\n提交前按下面清单检查生成代码。每一项都对应真实出现过的 ECharts 渲染问题或视觉缺陷。\n\n### 致命问题\n\n| 检查项 | 修复方式 |\n|---|---|\n| 使用了 hsl / hsla / rgb / rgba 颜色 | 只用 Hex（`#1890ff`）——hover 透明度在非 hex 色值下容易出问题 |\n\n### 严重问题\n\n| # | 检查项 | 修复方式 |\n|---|---|---|\n| 1 | Pie 分类 >5 个 | 改用横向 Bar |\n| 2 | Line 系列 >5 条 | 拆分或筛选 |\n| 3 | Radar 给每个 indicator 设置了 `max` | 移除；改为自动计算 |\n| 4 | Radar 多系列、不同量纲 | 先做归一化 |\n| 5 | Bar 缺少 `boundaryGap` | 设置 `boundaryGap: true` |\n| 6 | Funnel label 被隐藏或位置不在内部 | `label: { show: true, position: 'inside' }` |\n| 7 | 容器高度 <300px | `min-height: 300px` |\n| 8 | 单张图表中分类色（每项一个色相）>8 种 | 聚合或分组 |\n| 9 | Pie / 环形图的分类或数值只能靠 tooltip 读到——用了外部引导线标签（`position` 为 `'outside'` 或缺失），或干脆 `label: { show: false }` 且既无图例也无中心标注 | 分类 + 数值必须**静态可读**（tooltip 不算，图表常被导出 / 截图当静态图看）。任选其一：inside 标签标注 `name` + 百分比（扇区够大时）、图例映射色 → 分类、或环形图中心标注关键数值。禁止外部引导线标签（`position: 'outside'` 易重叠 / 裁切），也禁止只靠 tooltip 承载分类 / 数值 |\n| 10 | Pie 设置了 `itemStyle` | 完全移除 |\n| 11 | 任何 series 设置了 `label.color` | 禁止设置；由 theme 控制 |\n| 12 | `label.formatter` 使用字符串模板 | 改用回调：`formatter: (params) => ...` |\n| 13 | legend / visualMap 与图表重叠 | legend: `{ type: 'scroll', bottom: 0 }`；`grid.bottom ≥ '20%'` |\n| 14 | Heatmap 缺少 `visualMap` | 必须添加；当 x 轴标签并存时 `grid.bottom ≥ '25%'` |\n| 15 | Sankey 存在环形链接 | 验证 DAG |\n| 16 | 正负混合 Bar 使用统一 `borderRadius` | 圆角朝向柱体的开口端 |\n| 17 | 双 Y 轴零点未对齐 | 匹配 `\\|min\\| / max` 比例 |\n| 18 | 图表 series 或容器使用阴影/发光效果 | 移除 `shadowBlur`、`shadowColor`、容器 `box-shadow`，改用线宽、透明度、注释或面积大小表达层级 |\n| 19 | 图表或标签挤压、重叠、被容器裁切 | 增大容器、减少标签、改用 tooltip / inside label，或换成更稳的图表类型 |\n\n### 不建议\n\n| 避免 | 更好的选择 |\n|---|---|\n| Radar >8 个维度 | Parallel coordinate |\n| Line 连接未按时间排序的点 | Bar 或 Scatter |\n| markPoint 重复（统计极值 = 业务事件） | 仅保留业务注释 |\n| 用 Stacked Bar 表示 Gantt | 使用带 `renderItem` 的 `custom` series |\n\n<!-- ... +497 more modular skills available via /api/skills/larksuite/cli?path={path} -->\n</yakaai_skills>"}