forked from arechen/EapilSkillMarket
Sync third-party and MCP marketplace plugins
Constraint: Public skills are published only by explicit administrator action unless they are tracked third-party market sources. Confidence: high Scope-risk: narrow Directive: Keep private/internal skills out of the public marketplace and preserve normal incremental market Git history. Tested: Marketplace validation passed.
This commit is contained in:
1 parent
c03a1a6924
commit
049ed5ace3
65 files changed
+1646
-939
No files matched your search
@@ -94,10 +94,10 @@
|
||||
"id": "dingtalk-workspace",
|
||||
"pluginName": "dingtalk-workspace",
|
||||
"repo": "https://github.com/DingTalk-Real-AI/dingtalk-workspace-cli.git",
|
||||
"ref": "v1.0.63",
|
||||
"ref": "v1.0.64",
|
||||
"adapter": "skill-collection",
|
||||
"commit": "4cd5d05393a8748e89d9265eb9f7ec85745a0331",
|
||||
"syncedAt": "2026-10-03T16:00:00Z"
|
||||
"commit": "e2c0cdf97e016ee76687d9c26986c23a26a84738",
|
||||
"syncedAt": "2026-10-14T16:00:00Z"
|
||||
},
|
||||
{
|
||||
"id": "ui-ux-pro-max",
|
||||
@@ -123,8 +123,8 @@
|
||||
"repo": "https://github.com/Leonxlnx/taste-skill.git",
|
||||
"ref": "main",
|
||||
"adapter": "skill-collection",
|
||||
"commit": "a60a36dc2bb3bb77ccf17f2f62041f5ca8a458b9",
|
||||
"syncedAt": "2026-10-14T02:09:15Z"
|
||||
"commit": "f624f37a8c650b9cc550253104925efe4c8de246",
|
||||
"syncedAt": "2026-10-14T16:00:00Z"
|
||||
},
|
||||
{
|
||||
"id": "shadcn",
|
||||
@@ -132,8 +132,8 @@
|
||||
"repo": "https://github.com/shadcn-ui/ui.git",
|
||||
"ref": "main",
|
||||
"adapter": "claude-skill",
|
||||
"commit": "30a58d4498f270af1c1e981a7d78a15cf5740841",
|
||||
"syncedAt": "2026-10-14T02:09:15Z"
|
||||
"commit": "4233ed1caded8c38f4bc14b14afe1f93ebcaf966",
|
||||
"syncedAt": "2026-10-14T16:00:00Z"
|
||||
},
|
||||
{
|
||||
"id": "frontend-slides",
|
||||
@@ -168,8 +168,8 @@
|
||||
"repo": "https://github.com/hugohe3/ppt-master.git",
|
||||
"ref": "main",
|
||||
"adapter": "claude-skill",
|
||||
"commit": "bf89859cbf3c5f5974de70e0dd2ccf2239c8c51b",
|
||||
"syncedAt": "2026-10-14T02:09:15Z"
|
||||
"commit": "8070d3df1f6f54b5fb60a9ae66e79c664f050212",
|
||||
"syncedAt": "2026-10-14T16:00:00Z"
|
||||
},
|
||||
{
|
||||
"id": "grill-me",
|
||||
@@ -258,8 +258,8 @@
|
||||
"repo": "https://github.com/vercel/next.js.git",
|
||||
"ref": "canary",
|
||||
"adapter": "skill-collection",
|
||||
"commit": "6cc25f4f27cb01b10cab07e9c81cf016b5251274",
|
||||
"syncedAt": "2026-10-14T02:09:15Z"
|
||||
"commit": "2df613dbe00b82a6a684e570bc77e242825182ab",
|
||||
"syncedAt": "2026-10-14T16:00:00Z"
|
||||
},
|
||||
{
|
||||
"id": "shuorenhua",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "dingtalk-workspace",
|
||||
"version": "1.0.63",
|
||||
"version": "1.0.64",
|
||||
"description": "通过 dws CLI 操作钉钉消息、文档、表格、日历、待办和知识库的官方 Skill 集合。需要另行安装匹配版本的 dws、登录并取得企业授权;辅助脚本需要 Python 3。",
|
||||
"author": {
|
||||
"name": "DingTalk",
|
||||
|
||||
@@ -12,6 +12,13 @@ common types, and component/function catalogs; the source distribution's
|
||||
skills/multi/dingtalk-aicard/references/protocol/NOTICE records the per-file
|
||||
provenance. This CLI is not published or endorsed by the A2UI project.
|
||||
|
||||
The statically linked SafeChat message-crypto backend
|
||||
(third_party/safechat-go-sdk/lib/*/libsafechat.a, including the
|
||||
openharmony/arm64 variant) embeds a build of OpenSSL. OpenSSL is licensed
|
||||
under the Apache License 2.0 with the OpenSSL exception
|
||||
(https://www.openssl.org/source/license.html). The archives are provided by
|
||||
the SafeChat SDK vendor; report upstream issues through the vendor channel.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"sourceId": "dingtalk-workspace",
|
||||
"repo": "https://github.com/DingTalk-Real-AI/dingtalk-workspace-cli.git",
|
||||
"ref": "v1.0.63",
|
||||
"commit": "4cd5d05393a8748e89d9265eb9f7ec85745a0331",
|
||||
"ref": "v1.0.64",
|
||||
"commit": "e2c0cdf97e016ee76687d9c26986c23a26a84738",
|
||||
"adapter": "skill-collection",
|
||||
"sourcePath": "skills/multi",
|
||||
"syncedAt": "2026-10-03T16:00:00Z"
|
||||
"syncedAt": "2026-10-14T16:00:00Z"
|
||||
}
|
||||
@@ -17,127 +17,115 @@ metadata:
|
||||
catalogId: https://dingtalk.com/card/a2ui/catalogs/public/catalog.json
|
||||
---
|
||||
|
||||
# Create and validate DingTalk AI Cards V0.8
|
||||
# DingTalk AI Cards V0.8
|
||||
|
||||
Turn the user's content and interaction requirements into a maintainable A2UI file. Look up contracts in the bundled DingTalk protocol, check syntax and structure, and identify runtime behavior that remains unverified. Sending and rendering require a delivery tool and a target client.
|
||||
Create or edit an A2UI file from the user's content or image, look up only the contracts needed, and distinguish local validation from delivery and client rendering. This Skill uses the DingTalk V0.8 package based on A2UI 1.0: message `version` is `"v1.0"` and send API `protocolVersion` is `"1.0"`.
|
||||
|
||||
The DingTalk specification version is **V0.8**, based on the official A2UI **1.0** reference. The message `version` remains `"v1.0"`, and the sending API's `protocolVersion` remains `"1.0"`; neither becomes V0.8.
|
||||
Follow the user's requested lookup, file, send or update directly; the references are not a mandatory sequence. Obey command and protocol requirements. Ask only when missing facts, interaction meaning or the target affect the outcome.
|
||||
|
||||
## Determine content and interactions
|
||||
## Route by intent
|
||||
|
||||
Build the card when the available information is sufficient. Ask only when missing information affects factual content, the meaning of a required interaction, or delivery. A file-only request does not need a conversation target. Choose the layout, grouping, and a stable `surfaceId` as appropriate.
|
||||
Read only the relevant reference. Do not preload the complete protocol, every pattern, or the whole guide.
|
||||
|
||||
- Preserve requested components, information, and interactions; do not drop requirements to fit a pattern.
|
||||
- Use provided or verified numbers, names, dates, and business URLs. Clearly label demonstration data in a prototype.
|
||||
- Preserve buttons, tags, and other visual elements requested by the user or shown in a reference image. Do not invent URLs or event names when business behavior is unknown. A static `ButtonGroup` may omit each item's `action` where the protocol permits it; report that its interaction is not connected. Standalone `Button.action` is still required: do not rely on renderer tolerance to omit it. Do not add buttons without a visual or operational need.
|
||||
| Intent | First reference | Optional follow-up |
|
||||
|---|---|---|
|
||||
| Set up lookup and validation | [Execution environment](#execution-environment) | Installed command help |
|
||||
| Create or redesign from content or images | [Visual focus and layout](references/design.md) | One relevant [pattern](#composition-patterns) or example |
|
||||
| Query a known name | [Query a named contract](#query-a-named-contract) | The result's source pointer |
|
||||
| Find an unknown name | [Component](references/index/components.md), [function](references/index/functions.md), or [Token](references/index/tokens.md) index | Query only the selected names |
|
||||
| Construct or repair a card | [Construct and validate](#construct-and-validate) | Diagnostic pointer and named contract |
|
||||
| Send, preview, or update | [Delivery boundary](#delivery-boundary) | Installed command help |
|
||||
|
||||
## Surface and delivery scenarios
|
||||
Use patterns for composition guidance and linked JSON for message shapes. Read a named example directly; use the [example index](references/protocol/examples/README.md) only to choose one.
|
||||
|
||||
Choose the message boundary for the known delivery route. If the user specified creation or update, use that route directly:
|
||||
## Composition patterns
|
||||
|
||||
| Scenario | Required messages |
|
||||
| Content | Reference |
|
||||
|---|---|
|
||||
| New card or complete snapshot loaded from an empty state | Send `createSurface`, root `updateDataModel`, then `updateComponents`; set `catalogId` explicitly |
|
||||
| Host has created an empty Surface | Initialize with `updateDataModel` and `updateComponents`; do not create it again |
|
||||
| Existing-card update | Reuse the original `surfaceId` and identify the card as required by the host API; send only changes, without replaying `createSurface` or unrelated form defaults |
|
||||
| Notifications and reminders | [Notification](references/patterns/notification.md) |
|
||||
| Object facts and decisions | [Detail](references/patterns/detail.md) |
|
||||
| Illustrated content and attachments | [Content](references/patterns/content.md) |
|
||||
| Metrics and reports | [Report](references/patterns/report.md) |
|
||||
| Editable inputs and submission | [Form](references/patterns/form.md) |
|
||||
| Generation and execution updates | [Progress](references/patterns/progress.md) |
|
||||
|
||||
For a new card, use `createSurface →` root `updateDataModel → updateComponents` and set `catalogId` explicitly. The current DingTalk creation and delivery API requires data initialization, even for a purely static card:
|
||||
For editable inputs, also consult the form pattern for bindings and submission,
|
||||
even when another pattern describes the card.
|
||||
When replaying an execution example, read [Examples and replay](references/patterns/progress.md#examples-and-replay) for its batch boundaries, even if the JSON was selected directly.
|
||||
|
||||
```json
|
||||
{"version":"v1.0","createSurface":{"surfaceId":"same-as-following-messages","catalogId":"https://dingtalk.com/card/a2ui/catalogs/public/catalog.json"}}
|
||||
```
|
||||
## Execution environment
|
||||
|
||||
```json
|
||||
{"version":"v1.0","updateDataModel":{"surfaceId":"same-as-create-message","path":"/","value":{}}}
|
||||
```
|
||||
This edition uses native DWS commands, not Python. Confirm `dws aicard --help` exposes `explain`, `lint`, and `preview`; copying the Skill does not install commands. Lookup and lint are offline and need no Profile. Check each command's current help and structured envelope (`ok`, `outcome`, `data`, or `error.details`). If unavailable, references can guide a draft, but do not claim DWS validation.
|
||||
|
||||
Replace the empty object with real initial business data when needed. This is a DingTalk delivery requirement for complete creation, not a universal A2UI message-order rule. It does not require every string to be bound, `sendDataModel` to be enabled, or all updates to be sent at once. Preflight also accepts protocol-valid inline initialization in `createSurface.dataModel/components`; do not split such an existing file just to match the examples. Send only changed values in an incremental update.
|
||||
|
||||
When integrating with an existing host, determine whether its API creates the Surface. The four [protocol examples](references/protocol/examples/README.md) contain creation, data initialization, and component initialization for new cards. For a host-created empty Surface, remove `createSurface` and use the host's `surfaceId`. Removing `createSurface` from a complete file does not turn it into a safe incremental update; construct the actual delta.
|
||||
|
||||
## Query and validation environment
|
||||
|
||||
This edition uses native DWS commands for lookup, validation, and preview; it does not need Python or the standalone Skill's scripts. On first use or an unrecognized command, run `dws aicard --help` to confirm that the binary provides `explain`, `lint`, and `preview`. Copying Skill files does not install commands in an older binary.
|
||||
|
||||
`explain` and `lint` use the embedded protocol offline and need no Profile. Check `dws aicard explain --help` before a batch or compact query; query names individually if unsupported. Follow the current command help. Use `dws aicard explain` for lookup, not `dws aicard lint --explain`. Inspect the exit code, `ok`, and `outcome`: successful content is in `data`, failures in `error`, and structural diagnostics in `error.details`.
|
||||
|
||||
If a command is missing, use a DWS build that includes aicard. Preserve the actual error if embedded protocol loading fails and inspect the DWS installation. When temporarily unavailable, the indexes can still guide a draft; state that DWS validation was not run. Do not present Python or manual checks as a DWS validation result.
|
||||
|
||||
## Read on demand
|
||||
|
||||
Choose components from the content, then look up their fields. Use the host's default background unless the content needs a local treatment. Short content does not require a title, metric, or button. Group content as needed and implement explicit interaction requirements.
|
||||
|
||||
For image reconstruction, identify visible copy, controls, states, and media regions before querying the needed components. Use structured components for interface text and controls. Photography, posters, and complex illustrations may retain their original image regions. Use a real asset or reliable crop for a brand mark; do not imitate it with an emoji or character. Before delivery, compare key text, numbers, region order, and controls with the image. Do not infer business behavior from the image alone. See [image reconstruction](references/design.md#image-reconstruction).
|
||||
|
||||
Read only the relevant section of [design guidance](references/design.md) when layout, color, density, or progress-state advice is needed. Do not load the entire guide, all indexes, or the whole catalog by default.
|
||||
|
||||
For a known component, function, or Token name, query its contract directly. If the name is unknown, read only the relevant [component index](references/index/components.md), [function index](references/index/functions.md), or [Token index](references/index/tokens.md):
|
||||
## Query a named contract
|
||||
|
||||
```bash
|
||||
dws aicard explain Tabs --format json
|
||||
dws aicard explain Text Row Column --compact --format json
|
||||
```
|
||||
|
||||
Replace `Tabs` with the component, function, common type, or Token name. In a deduplicated batch result, `$contractRef` points to the corresponding `definitions` entry. These are lookup results, not A2UI fields. Use a normal query when fields need to be expanded directly. A query returns one definition's fields and example without loading the entire catalog. It includes essential nested structures and event-specific slots. If a function's arguments are missing, query that function by name rather than recursively loading every function.
|
||||
Query only needed names. Compact `$contractRef` and `definitions` are lookup metadata, not A2UI fields. Query without `--compact` for expanded fields; `source` locates omitted details.
|
||||
|
||||
Read one component composition pattern when it fits the content; consult only the needed parts of another pattern for mixed content. Compositions are optional blocks, not complete-card templates. The user's requirements and current protocol determine the final layout and fields.
|
||||
## Construct and validate
|
||||
|
||||
If the card has editable inputs, also consult [form](references/patterns/form.md) for field titles, bindings, and submission behavior, even when another pattern describes the overall card.
|
||||
Use `references/protocol/` as the contract. Write an ordered JSON message array.
|
||||
Within one card, keep the same `surfaceId`; choose an ID suitable for that card
|
||||
when creating it. A complete new card requires Surface creation, root data
|
||||
initialization (even `{}` for static content), and a component with ID `root`.
|
||||
The recommended explicit form is:
|
||||
|
||||
| Current task | Reference |
|
||||
```json
|
||||
[
|
||||
{"version":"v1.0","createSurface":{"surfaceId":"example-surface","catalogId":"https://dingtalk.com/card/a2ui/catalogs/public/catalog.json"}},
|
||||
{"version":"v1.0","updateDataModel":{"surfaceId":"example-surface","path":"/","value":{}}},
|
||||
{"version":"v1.0","updateComponents":{"surfaceId":"example-surface","components":[{"id":"root","component":"Text","text":"Example"}]}}
|
||||
]
|
||||
```
|
||||
|
||||
This is a structural example, not a business card to send. Protocol-valid inline
|
||||
initialization in `createSurface.dataModel` and `createSurface.components` is also
|
||||
accepted; three separate messages are not the only valid representation.
|
||||
|
||||
| Scenario | Messages and checks |
|
||||
|---|---|
|
||||
| Short result, alert, or status reminder | [notification](references/patterns/notification.md) |
|
||||
| Object facts and actions: approval, schedule, task, or order | [detail](references/patterns/detail.md) |
|
||||
| Illustrated content, recommendations, media, or attachments | [content](references/patterns/content.md) |
|
||||
| Metrics, records, charts, or analytical conclusions | [report](references/patterns/report.md) |
|
||||
| Inputs, settings, ratings, or feedback submission | [form](references/patterns/form.md) |
|
||||
| Agent generation, execution, and result updates | [progress](references/patterns/progress.md) |
|
||||
| Complete new card | Create and initialize as above; use `--preflight new-card` |
|
||||
| Host-created empty Surface | Initialize its existing ID without `createSurface`; use Schema and resource checks |
|
||||
| Existing card update | Keep IDs and send only intentional changes; use Schema and resource checks, then check against known current state |
|
||||
|
||||
Simple content can use known components directly. In the pattern notation, `+` combines items, `>` shows a container and its contents, and `/` lists alternatives; none is sendable JSON. Fill actual reference fields from the contract. Reconstruct an image from what is visible, without adding unsupported content or actions because a pattern suggests them. General visual guidance is in `references/design.md`.
|
||||
Removing `createSurface` from a complete file does not make it a safe delta.
|
||||
Do not replay form defaults or unrelated initial data: that can overwrite user
|
||||
input. Resource checks alone cannot prove an update preserves state or references.
|
||||
|
||||
The `source` field in a lookup result points to a protocol file and JSON Pointer. It also marks omitted deep structures or long descriptions; inspect that location rather than reloading the catalog. The [example index](references/protocol/examples/README.md) provides complete new-card form, host-action, agent-progress, and report scenarios. Read one that matches the task. Adapt its messages for a host-created Surface or existing-card update using the delivery scenarios above. Do not guess unread fields; confirm them in the protocol or a contract query.
|
||||
Preserve unrelated styling when editing. For ordinary new cards, prefer a root `Column` without background fields. If a root `Card` is needed, use `backgroundColor: "#00FFFFFF"` and no background token. Honor explicit surface designs; see [design guidance](references/design.md#root-surface).
|
||||
|
||||
## Construction constraints
|
||||
Prefer `Markdown` for rich text and static tables; `Text` for short titles and labels. Omit root `padding` for ordinary cards. Do not default to `CardHeader`; preserve it when requested and check [insets](references/design.md#headers-and-card-insets).
|
||||
|
||||
- Use `references/protocol/` as the contract for A2UI messages, common types, and DingTalk components, expressions, operators, host actions, and visual Tokens. An identically named official component or function is not necessarily identical to this package's definition.
|
||||
- Write an ordered JSON message array. A complete component tree has root `id` `root`; keep `surfaceId` stable within one card. Include `createSurface` according to the delivery scenario.
|
||||
- Match a binding's initial-value type to its literal counterpart. For example, `DynamicNumber` uses a JSON number and `ChoicePicker.value` uses an array of strings. A dynamic list's `path` points to an array; templates may use relative paths and `@index`.
|
||||
- Follow each function contract for placement, arguments, return type, and host `catalogId`. Select colors, font sizes, and icons from their Token definitions.
|
||||
- Replace `REPLACE_*` markers in prototypes or existing files before delivery. Do not describe unconnected events, inaccessible resources, or unverified client behavior as implemented.
|
||||
Preserve supplied facts and requested interactions; label demonstration data. Replace `REPLACE_*` placeholders before delivery. Do not present unverified resources, unconnected actions, or simulated states as real and working.
|
||||
|
||||
## Validate before delivery
|
||||
|
||||
Validate this file:
|
||||
Choose literals or bindings as the field contract permits. Initialize bound data with the required types and update it through `updateDataModel`; change component literals through `updateComponents`. `sendDataModel` controls whether A2A messages include the full data model, not whether bindings work.
|
||||
|
||||
```bash
|
||||
dws aicard lint --file card.a2ui.json --format json
|
||||
```
|
||||
|
||||
Add `--preflight new-card` for a new card, or `--preflight resources` to check inline resources in a delta or host-created content. Confirm option support with `dws aicard lint --help`; an older binary cannot claim to have run preflight.
|
||||
Choose `--preflight new-card` or `--preflight resources` for the selected scenario, and use `--emit` only when serialized message strings are needed; it cannot be combined with `--fragment`. Check exit status and `data.valid` plus `data.preflight.valid` when selected. `dws aicard lint --self-check --format json` verifies the full package.
|
||||
|
||||
Read `data.valid` on success, plus `data.preflight.valid` and diagnostics when preflight is enabled. Warnings do not block. Structural or preflight errors cause a nonzero exit with details in `error.details`; `valid` still refers only to Schema checks. An environment or read failure is not a pass.
|
||||
## Validation scope
|
||||
|
||||
Add `--emit` when the sending layer needs an array of message strings. After structural validation, `data.a2uiMessages` contains individually serialized messages. JSON-encode the whole array for the sending parameter; do not hand-write shell escaping. `--fragment` and `--emit` are mutually exclusive. Run `dws aicard lint --self-check --format json` separately to check embedded protocol integrity.
|
||||
Lint checks syntax and Schema fields. New-card preflight additionally checks initialization, root, duplicate IDs within a message, static references and cycles in the final component snapshot, not every intermediate streaming frame. Unreachable components are warnings. Resource preflight checks inline encoding; neither mode evaluates bindings or proves image loading. `--fragment` checks component/message fragments; it is not a way to bypass new-card initialization. Do not silently rewrite user data, remove requested components, or downgrade interactions to pass a check.
|
||||
|
||||
Lint checks JSON syntax and the bundled A2UI protocol structure: Schema constraints on messages, components, functions, and DingTalk extensions, including field names, required fields, types, and enumerations. It does not merge data, execute functions, check reference closure or binding initial values, or grade design. `--fragment` accepts one component, a component array, or one message under the same structural rules as the default message-array input.
|
||||
A successful named lookup is not a full package check. Use the self-check supported by the selected execution environment; local checks do not establish client behavior.
|
||||
|
||||
Generic lint accepts host-created content, so passing lint alone does not mean a new file can be delivered. Run the preflight appropriate to the delivery scenario; do not hide missing new-card initialization with `--fragment`. `new-card` merges the final component snapshot per Surface and checks the root, duplicate IDs within a message, existence of reachable static child references and template targets, and static cycles. Reusing an ID across update messages is valid. Unreachable components produce warnings only; retain them when they serve a purpose rather than deleting them to silence a warning. Template expansion, binding evaluation, intermediate frames, image decoding, and client support still require runtime verification. `resources` checks resource encoding without requiring a delta to be self-contained.
|
||||
## Delivery boundary
|
||||
|
||||
Use media URLs provided by the user or otherwise verified. Have a program read and encode inline media into the standard resource field, then run resource preflight; do not paste tool logs into Base64. Mark unknown schemes and client SVG support as unverified rather than inventing a protocol allowlist. Follow [image reconstruction](references/design.md#image-reconstruction) when choosing image assets.
|
||||
With native `--emit`, read `data.a2uiMessages`.
|
||||
|
||||
Static copy may be literal. Bind values that must update and provide first-frame initial values. `sendDataModel` controls whether the model accompanies an A2A message; it is not a switch that enables bindings. If delivery fails, check the initialization sequence, current sending API, and server receipt. A successful repair of one card does not justify enabling that field or binding every string in every card.
|
||||
Send only when requested. Resolve exactly one target under the sending profile: `--conversation-id` for a conversation or `--open-dingtalk-id` for a person. Names are not target IDs. Inspect installed command help, JSON-encode the emitted message-string array as one `--content` argument, and call `dws chat message send-a2ui-card`. Preserve the request, target, profile and returned `bizId`. An uncertain result must be checked before another create; do not resend automatically.
|
||||
|
||||
**Fix structural errors and errors from the selected preflight.** Apply design suggestions according to the user and scenario; they are not lint gates. Confirm binding initial values, resource availability, and interaction behavior during authoring and runtime acceptance.
|
||||
Creation starts in PROCESSING. Update with `dws chat message update-a2ui-card --biz-id <bizId> --content <message-strings> --flow-status <state>` under the original profile. Keep the same `surfaceId` and component IDs; send only intended `updateDataModel` or `updateComponents` changes, not another `createSurface` or unrelated defaults. Static cards require `--flow-status FINISH` with a nonempty valid delta; prepare it before sending and preserve business data. Stream complete messages, not JSON tokens. Resource preflight checks only the delta. If current state is known, validate it with the delta; Schema validity does not prove business safety.
|
||||
|
||||
Use a diagnostic's `pointer` to locate and edit the original field, then rerun validation. Do not silently rewrite user data. If several attempts fail, recheck the relevant field contract and diagnostic rather than replacing a requested component or downgrading an interaction.
|
||||
`dws aicard preview --file card.a2ui.json` sends a self-preview in PROCESSING; `--dry-run` does not send. For a completed static preview, finish it under the same profile with `dws chat message update-a2ui-card --biz-id <data.bizId> --content <message-strings> --flow-status FINISH`, using a nonempty state-preserving delta for the same Surface. Do not replay form defaults. Use server-issued `data.bizId`, never request-side `bizCardId`. If absent, inspect `updateWarning` and the receipt; do not recreate automatically. `openTaskId` cannot be used with `query-send-status`.
|
||||
|
||||
## Delivery and rendering boundaries
|
||||
After sending, use the available readback capability under the same profile and target to identify this exact card from returned instance/message identifiers. Generic card text and a nearby timestamp are not sufficient. Report request acceptance, same-target readback, client rendering and interaction separately. If readback is unavailable or inconclusive, mark it unverified; do not claim the user received or correctly rendered the card from API acceptance alone.
|
||||
|
||||
Deliver the file path, its purpose (new card, host-created initialization, or existing-card delta), validation results, and unresolved issues that affect use. `valid: true` means syntax and protocol structure passed. `renderingVerified: false` in the validation report means there is no evidence of client rendering.
|
||||
The `metrics` object is reserved for output compatibility and is currently empty; do not infer measurements from it.
|
||||
|
||||
Local validation does not execute functions, invoke host actions, or simulate a client. Function evaluation and results, remote-resource availability, client-version support, actual layout, and button callbacks need runtime verification. If the user asks for client confirmation, use available delivery and preview capabilities in that environment. Request acceptance or conversation readback alone does not establish successful rendering or interaction.
|
||||
|
||||
If the user requests a preview sent to themselves, use `dws aicard preview --file card.a2ui.json`. It really sends a card and requires a complete new-card sequence. `--dry-run` checks the local sending boundary without resolving identity or sending. To send to another person or a group, follow the current `dws chat message send-a2ui-card` contract for target and parameters.
|
||||
|
||||
`preview` reports `success` only when the card creation request is explicitly accepted, even if its receipt contains `openTaskId`. Keep that ID in the receipt, but do not pass it to `dws chat message query-send-status`, which is for current-user message sends. `deliveryVerified` and `renderingVerified` remain `false`. Conversation readback is separate evidence; generic card text and a nearby timestamp do not uniquely identify this card. The default sending status is `PROCESSING`. Update or finish through `dws chat message update-a2ui-card`, locating the original card by `bizId` without replaying creation. Investigate an unknown result before retrying; a receipt is not client acceptance evidence.
|
||||
Report the file, checks actually run, and delivery result when requested. Local validation and request acceptance do not prove client rendering.
|
||||
+62
-21
@@ -4,8 +4,8 @@
|
||||
|
||||
## Global design guidance
|
||||
|
||||
1. **Use the host background by default.** Do not set a background on the outermost card unless the content requires it. Local content areas may use backgrounds to establish hierarchy.
|
||||
2. **Show generation state when relevant.** For an Agent that is generating or executing, a `Markdown` component may prefix its `content` with `[AIGenerating]`, for example `[AIGenerating]Running a command…`. This is a DingTalk host convention for an animated GIF, subject to target-client support. Remove the marker and update the copy on completion, failure, or cancellation.
|
||||
1. **Prefer a transparent root for ordinary new cards.** Let the host provide the outer background instead of approximating its color. Preserve explicit surface designs and unrelated existing styling; see [root surface](#root-surface).
|
||||
2. **Show generation state when relevant.** For an Agent that is generating or executing, a `Markdown` component may prefix its `content` with `[AIGenerating]`. DingTalk supports this convention across its six platforms; remove it on completion, failure, or cancellation. For panel titles and execution updates, see the [progress pattern](patterns/progress.md).
|
||||
3. **Group execution details.** Use `CollapsiblePanel` with `variant: "reasoning"` for an Agent generation or execution process. Choose its expanded state and internal layout from the content.
|
||||
|
||||
## 1. What each check establishes
|
||||
@@ -24,7 +24,7 @@ Passing structural checks does not establish the other two layers. Explain unsup
|
||||
|
||||
| Content in the image | Implementation |
|
||||
|---|---|
|
||||
| Interface copy, data, buttons, forms, lists | Use structured components and preserve content and state. Static reproduction may use literals; changing business values need bindings and initial values |
|
||||
| Interface copy, data, buttons, forms, lists | Preserve content and state with structured components. Bind data-driven fields only where supported, with typed initial values; update other fields through `updateComponents` |
|
||||
| Photography, marketing posters, complex illustrations | Use the original asset or a reliable crop in `Image`; preserve its subject and essential text. Poster text need not be forcibly decomposed into components |
|
||||
| Brand marks and specific document or product icons | Use a real asset or a crop of the reference. Do not impersonate them with emoji, ordinary characters, or vaguely similar icons. If the asset is unavailable, report the gap and, when appropriate, use an explicit text description |
|
||||
| Generic action or status icons | Prefer a registered `Icon` with matching meaning. Otherwise use a supplied asset or text; do not invent an Icon name |
|
||||
@@ -37,16 +37,16 @@ Crop media to the media region itself. Do not bake surrounding interface copy or
|
||||
|
||||
## 2. Information roles and blocks
|
||||
|
||||
First decide what the user most needs to know or do, then arrange conclusions, evidence, details, and actions. A report may lead with the conclusion; an execution card may lead with progress. Short content needs no extra blocks. These combinations are optional layout notation, not a fixed order or required structure.
|
||||
First rank the content: order the facts, group them by relationship, and assign visual weight before selecting components. A report may lead with the conclusion; an execution card may lead with progress. Short content needs no extra blocks. These combinations are optional layout notation, not a fixed order or required structure.
|
||||
|
||||
| Role | Purpose | Components | Layout notation |
|
||||
|---|---|---|---|
|
||||
| `header` | Title, source, and status | Row + Text + Tag | `Row(align=center, gap=8) > Text(bold, weight=1) + Tag` |
|
||||
| `hero` | Key cover or person image | Image | `Image(variant=header, fit=cover, cornerRadius=10)` |
|
||||
| `facts` | Label-value facts | Column + Row + Text | Each row: `Row(align=start, gap=8) > Text(label) + Text(value, weight=1)`; see [key-value rows](#key-value-rows) |
|
||||
| `facts` | Label-value facts | Column + Row + Text | One-line rows use `align=center`; wrapping values use `align=start` and matching label/value typography so the label aligns with the value's first line; see [key-value rows](#key-value-rows) |
|
||||
| `summary` | Conclusion-first prose | Markdown | Literal or bound content, for example `/content/body` |
|
||||
| `metrics` | A few important measures | Row + Column + Text | `Row(gap=8) > Column(weight=1, padding=12) > Text(value, bold) + Text(label, caption)` |
|
||||
| `data` | Comparison, trend, or composition | Table / Chart | Use Table for exact records and a suitable Chart for graphical data; look up values in the contract. See the [report example](protocol/examples/data-report.json) |
|
||||
| `data` | Comparison, trend, or composition | Markdown / Chart | For static tabular data, prefer Markdown table syntax over a separate `Table` component. Use a suitable Chart for graphical data and query its contract. |
|
||||
| `list` | Repeated entries | Column + Card + Text | — |
|
||||
| `timeline` | Time- or stage-ordered progress | Column + Row + Text + Tag | — |
|
||||
| `attachments` | File results | Divider + Text + File | `File(fileName, url, description, onPreview)` |
|
||||
@@ -60,51 +60,79 @@ States, icons, illustrated entries, and highlights may support a main block or s
|
||||
|
||||
| Local combination | Use | Layout or choice |
|
||||
|---|---|---|
|
||||
| Compact header | Schedule, task, light reminder | `Card(padding=0) > Column(gap=0) > CardHeader(trailing=Tag) + Column(padding=8, gap=8)` |
|
||||
| Compact header | Schedule, task, light reminder | `Text`; add a `Row` with a `Tag` only when there is a status to show |
|
||||
| Content section | Related content needing a bounded visual surface | `Card(padding=12, cornerRadius=8, borderWidth=0.5) > Column(gap=8) > content` |
|
||||
| Status | Current stage or risk | Tag + Text |
|
||||
| Icon | Action, source, or status | Icon or Text.icon; use a registered matching icon, or a supplied image or explanation if none exists. Do not invent a name or default to emoji for a specific icon |
|
||||
| Illustrated item | Compact image-and-text content | `Row(align=center, gap=12) > Column(weight=1) + Image(variant=smallFeature)` |
|
||||
| Highlight | Key conclusion or local emphasis | See [local highlights](#local-highlights); this is a design technique, not a protocol field |
|
||||
|
||||
Read [composition patterns](patterns/detail.md) from the Skill's task table. Approval, schedules, and tasks share the detail pattern; ongoing generation uses the [progress pattern](patterns/progress.md). For mixed content, select only needed blocks and avoid duplicating headers or actions. Choose one [message example](protocol/examples/README.md); all four are complete new-card messages. Adapt them for host-created Surfaces or updates as described in the [Skill entrypoint](../SKILL.md). The protocol and contract lookup govern fields.
|
||||
Select a relevant pattern from the Skill's [composition-pattern table](../SKILL.md#composition-patterns). Approval, schedules, and tasks share the detail pattern; ongoing generation uses the [progress pattern](patterns/progress.md). For mixed content, select only needed blocks and avoid duplicating headers or actions. When concrete message shapes would help, read the pattern's linked JSON; use the [example index](protocol/examples/README.md) only if unsure which fits. Examples initialize new cards; adapt them for host-created Surfaces or updates as described in the [Skill entrypoint](../SKILL.md#construct-and-validate). The protocol and contract lookup govern fields.
|
||||
|
||||
## 3. Host behavior and layout
|
||||
|
||||
The bundled protocol governs field capabilities. Visual numbers are starting points, not extra protocol limits.
|
||||
|
||||
Ordinary vertical content can use `Column` directly; add a `Card` only when grouping, background, or border serves the content. Omitting root `padding` may still leave host padding and is not the same as setting it to `0`.
|
||||
|
||||
Use `Text` or `CardHeader` for ordinary group titles. Reserve Markdown headings for actual document sections; a small field or status label does not need heading hierarchy.
|
||||
Reserve Markdown headings for actual document sections; a small field or status label does not need heading hierarchy. Keep independent facts, statuses, and controls in appropriate components rather than flattening the card into one Markdown block.
|
||||
|
||||
1. `Row.align=stretch` can make containers in a row the same height. Container children and leaf components are handled differently; consult the Row contract for client behavior and integration boundaries.
|
||||
2. Check long titles, metrics, and multiple columns at the target conversation width. Wrap or reduce adjacent items when space is limited; do not assume identical client widths.
|
||||
3. `Image.variant=smallFeature` is a starting point for illustrated cards; adjust to the asset and protocol size guidance.
|
||||
4. Use `CardHeader` for a compact native header when appropriate; build other headers from actual requirements.
|
||||
5. Usually emphasize one primary action within a visible action area. Assess separate Tabs or states independently, not by counting every Button in the component list. Label actions by what they do, not by phrases such as “click the button below.”
|
||||
6. Remove empty rows and dividers without information value. Choose truncation, full display, or collapse for long content; do not hide necessary text with `maxLine`.
|
||||
7. Check media URLs under the host policy; lint does not fetch them. Table pagination is local, so provide the data at once. Paginate, limit rows, or link to details for long tables.
|
||||
8. Query a component for defaults, platform fallbacks, and conditions under which a field takes effect. The host may apply defaults when fields such as `Image.variant` are omitted.
|
||||
4. Usually emphasize one primary action within a visible action area. Assess separate Tabs or states independently, not by counting every Button in the component list. Label actions by what they do, not by phrases such as “click the button below.”
|
||||
5. Remove empty rows and dividers without information value. Choose truncation, full display, or collapse for long content; do not hide necessary text with `maxLine`.
|
||||
6. Check media URLs under the host policy; lint does not fetch them. Prefer Markdown table syntax for static tabular data. Limit rows or link to details for long tables. If a separate `Table` is explicitly required, its pagination is local, so provide the data at once.
|
||||
7. Query a component for defaults and conditions under which a field takes effect. The host may apply defaults when fields such as `Image.variant` are omitted.
|
||||
|
||||
Keep related content close and separate groups with appropriate space. Set `gap` and `padding` on the containers responsible for layout rather than stacking padding at several levels. Multiples of 2 are a reasonable spacing starting point, adjustable for host defaults, density, and user requirements; they are not validation rules.
|
||||
|
||||
### Root surface
|
||||
|
||||
For ordinary new cards, prefer a transparent root so the host supplies the outer background. A configured color or theme token is not guaranteed to match the message surface across clients, themes, or tenants. Do not use `common_bg_color` merely to imitate the host background.
|
||||
|
||||
| Intent | Root and background |
|
||||
|---|---|
|
||||
| Ordinary vertical content | Prefer `Column`; omit `backgroundColor` and `backgroundColorToken` |
|
||||
| A root `Card` is needed without a separate surface | Set `backgroundColor: "#00FFFFFF"`; omit `backgroundColorToken` |
|
||||
| An explicitly requested theme-aware surface | Use a registered `backgroundColorToken` and verify the result in the target host |
|
||||
| An explicitly requested custom `Card` surface | Use `backgroundColor` with `light` and `dark` values, or a single color when a fixed color is intended |
|
||||
| An edit to an existing card | Preserve the root, background, and unrelated styling unless the requested change requires otherwise |
|
||||
|
||||
The public `Card` contract uses `#FFFFFFFF` in light mode and `#FF1F1F1F` in dark mode when both background fields are omitted. Omission is therefore not a request for transparency. `backgroundColorToken` takes precedence over `backgroundColor`; leave it out when requesting a transparent surface. `Column` also supports borders and corner rounding, so those features alone do not require an extra `Card` wrapper.
|
||||
|
||||
Use filled panels for local grouping or emphasis, not as an automatic full-body layer beneath a transparent root. The content-section `Card` above illustrates such a local panel. Preserve business-content backgrounds required by the user or reference design; transparency is a default, not a reason to override that design. When reconstructing a screenshot, do not reproduce the host chat bubble or window background as the card's own fill unless the user explicitly requests a separate surface.
|
||||
|
||||
These are authoring defaults, not Schema restrictions or cross-client rendering guarantees. Default, opaque, and themed `Card` backgrounds remain valid. Check background, insets, and readability in the target client's light and dark themes before claiming visual consistency.
|
||||
|
||||
### Headers and card insets
|
||||
|
||||
Omit root `padding` for ordinary cards: omission allows default insets, while explicit `0` can leave mobile content flush against the edge. Do not add a second whole-body inset by default; local content panels may still need padding.
|
||||
|
||||
`CardHeader` can trigger header-specific spacing that differs across hosts. When explicitly requested, preserve it and verify insets and any requested corner rounding on target clients; do not assume a full-bleed header or identical spacing. These are authoring defaults, not Schema restrictions: `CardHeader` and explicit zero padding remain valid.
|
||||
|
||||
### Key-value rows
|
||||
|
||||
- Put related facts in one `Column`. Each row can begin with `Row(align=start, gap=8)`; give long values `weight=1` for remaining width.
|
||||
- Put related facts in one `Column`. For a single-line key-value pair use `Row(align=center, gap=8)`. If the value can wrap, use `Row(align=start, gap=8)` and the same text size/line height for label and value; color may mute the label. This keeps the label centered against the value's first line instead of the entire paragraph. Give the value `weight=1` for remaining width.
|
||||
- End a visible key label with a colon (`:` in Chinese text), such as `ISO 8601:` or `Elapsed time:`. Keep the value in a separate Text component so it can wrap without moving the label.
|
||||
- Labels and values may both use `body`, with `common_level2_base_color` and `common_level1_base_color` respectively. Consider `caption` labels for compact content.
|
||||
- Omit `weight` for a naturally sized label; do not write `weight=0`. Labels of different lengths do not guarantee aligned value columns. Stack a long label and value vertically when width is insufficient rather than assuming unsupported fixed columns.
|
||||
- `Text` displays at most three lines by default. Set sufficient `maxLine` for important long values, or use full text or collapsible details. Do not truncate every value to two lines.
|
||||
|
||||
### Local highlights
|
||||
|
||||
- An ordinary content section may use `Card.backgroundColorToken=common_fg_z1_color`, `borderWidth=0.5`, and `borderColorToken=common_line_hard_color`.
|
||||
- A highlighted content section may use a registered `extended_*0_color` for `Card.backgroundColorToken`, the matching color family's `extended_*1_color` for `borderColorToken`, and `borderWidth=0.5`. For example, pair `extended_blue0_color` with `extended_blue1_color`; never mix families.
|
||||
- `padding=12` and `cornerRadius=8` are starting points for a local `Card`; adjust to the content and host spacing. `Card` accepts one `child`, so wrap multiple elements in a `Column` or `Row`.
|
||||
- Give a key conclusion or risk its own block when needed, for example `Column(padding=12, gap=8) > Text(bold) + Markdown`; add a local background only when useful.
|
||||
- Emphasize a short label within `Markdown.content`, for example `**Risk:** Only completed tasks are included.`, without wrapping every note in another container.
|
||||
- Choose background and border for hierarchy; they need not both appear. When both are used, keep them in one semantic color family and select actual values from the [Token index](index/tokens.md).
|
||||
- `Card.backgroundColorToken` can use a registered `extended_*0_color`; `borderColorToken` can use its matching `extended_*1_color`. `borderWidth` is numeric, for example `0.5`, not a string with units. `*` denotes a family only: send complete registered Token IDs and do not put Token names in hex-color fields.
|
||||
- Choose background and border independently according to the hierarchy; neither is mandatory. When both appear, keep them in one semantic color family and select actual values from the [Token index](index/tokens.md).
|
||||
- `borderWidth` is numeric, for example `0.5`, not a string with units. `*` denotes a family only: send complete registered Token IDs and do not put Token names in hex-color fields.
|
||||
- Use component defaults when no emphasis is needed. Do not add a colored container for decoration or repeat the same highlighted block in every subsection. A short bold label often suffices.
|
||||
- Use only supported fields. Simplify a one-sided indent or inline treatment that cannot be expressed accurately. Do not invent a field or pad with spaces; container `padding` affects all sides.
|
||||
|
||||
## 4. Color discipline
|
||||
|
||||
Follow the user's requested style. When color helps emphasize key metrics, titles, or focal areas, choose a suitable color family; neutral component defaults are also valid. A local panel can pair a pale background with stronger accents from the same family while ordinary body text stays neutral. A transparent root does not require a monochrome card. Avoid coloring every section, and preserve business-status meanings independently of the visual palette.
|
||||
|
||||
Prefer registered Tokens or semantic component variants (`Tag.theme`, `CardHeader.theme`). Some fields accept hex colors; consult their contracts. For semantic colors, consider:
|
||||
|
||||
| Meaning | `Tag.theme` / `CardHeader.theme` | Text `colorToken` |
|
||||
@@ -124,7 +152,9 @@ Keep ordinary key-value labels neutral; use semantic color for a value only when
|
||||
|
||||
## 5. Hierarchy and density
|
||||
|
||||
- **One strongest focal point:** use `bold` and `level1` for a title, a normal body, and `caption` with `level2` for explanation, as the content warrants.
|
||||
Choose the main visual area from the content: an available relevant image for illustrated content, key metrics for a report, or the current goal for a task. Give it more emphasis than supporting details without inventing content for decoration. When useful, put secondary details in a collapsed section or a details Tab; keep essential risks and required inputs visible, and do not add Tabs to simple cards.
|
||||
|
||||
- **Text hierarchy:** emphasize focal `Text` with `bold=true` when needed. Use `variant=body` for normal text or `variant=caption` for smaller supporting text. Optional `colorToken` values include `common_level1_base_color` for primary text and `common_level2_base_color` for secondary text; preserve requested typography.
|
||||
- **Top-level grouping:** two to five groups can guide a complex card. A short notice may have one, and complex content may need more.
|
||||
- **Group with containers:** put related fields in one `Column` or `Card`. Use `Divider` between semantic sections, such as content and actions, not between every row.
|
||||
- **Contain long content:** use `CollapsiblePanel(defaultExpanded=false)` for details. Offer a “View all” `Link` when a real full-content destination exists.
|
||||
@@ -141,6 +171,17 @@ After a user reviews the card, locate the affected fields and check related effe
|
||||
| Layout | `Row` ↔ `Column`, `align` / `gap` / `weight` / `padding` | Grouping and references |
|
||||
| Missing information | Add it to the relevant role; initialize its model value when bound | Information and bindings |
|
||||
| Too dense or too sparse | `gap` / `padding` / `maxLine`, or collapse details in `CollapsiblePanel` | Density at actual width |
|
||||
| Wrong button | `action.event.name` / `context`, `variant`, `disabled` | Visual and interaction behavior separately |
|
||||
| Button label or appearance | Referenced `Button.child` Text or its binding; `ButtonGroup.buttons[].label`; supported style or disabled fields | Preserve the action when only presentation changes |
|
||||
| Button behavior | Inspect the existing `action.event` or `action.functionCall` and change only the requested behavior; event data belongs in `action.event.context` | Intended behavior, parameters, and existing result bindings |
|
||||
|
||||
Rerun lint and deliver the revised file and check results. Send a real card only when requested and supported by an available delivery route.
|
||||
|
||||
## Media resources
|
||||
|
||||
Prefer verified HTTPS assets, including avatars, Markdown images and bound values. Preserve explicitly requested inline Base64 resources and disclose unverified client compatibility. Valid encoding does not establish image decoding, transport limits or client support. Resource preflight adds `resource.base64_image_unverified` warnings and rejects malformed encoding; it does not fetch URLs or resolve bindings and Markdown destinations.
|
||||
|
||||
Use supplied or verified assets. If one is unavailable, disclose the gap or ask for an accessible URL; do not invent URLs, impersonate a real avatar with an unrelated image, or silently upload private screenshots. Any agreed placeholder must be identified as a substitution, not faithful reconstruction.
|
||||
|
||||
## Content hierarchy
|
||||
|
||||
Choose a focal conclusion, group related evidence, and keep supporting metadata quiet. Do not add titles, metrics, or actions merely to fill a template. See [information roles](#2-information-roles-and-blocks) and [hierarchy and density](#5-hierarchy-and-density) for layout choices.
|
||||
+1
-1
@@ -54,4 +54,4 @@ Required fields include `id` and `component`. Child references show the field pa
|
||||
| `Video` | Data and media | id, url | — | Cover, inline playback, and control bar. |
|
||||
|
||||
---
|
||||
Generated from `references/protocol/` (fingerprint `7005139e5267c69e`). Do not edit this index: protocol changes regenerate it. For exact fields and a minimal example, query a name as shown in the Skill entrypoint; the whole catalog need not enter the model context.
|
||||
Generated from `references/protocol/` (fingerprint `cf4611469d2c3f5e`). Do not edit this index: protocol changes regenerate it. For exact fields and a minimal example, query a name as shown in the Skill entrypoint; the whole catalog need not enter the model context.
|
||||
+1
-1
@@ -46,4 +46,4 @@ Value functions use `{"call": …, "args": {…}}` and may nest. Host actions re
|
||||
| `@index` | System function | number | — | | Returns the 0-based index of the current item when rendering a dynamic list fro… |
|
||||
|
||||
---
|
||||
Generated from `references/protocol/` (fingerprint `7005139e5267c69e`). Do not edit this index: protocol changes regenerate it. For exact fields and a minimal example, query a name as shown in the Skill entrypoint; the whole catalog need not enter the model context.
|
||||
Generated from `references/protocol/` (fingerprint `cf4611469d2c3f5e`). Do not edit this index: protocol changes regenerate it. For exact fields and a minimal example, query a name as shown in the Skill entrypoint; the whole catalog need not enter the model context.
|
||||
+1
-1
@@ -131,4 +131,4 @@
|
||||
|
||||
|
||||
---
|
||||
Generated from `references/protocol/` (fingerprint `7005139e5267c69e`). Do not edit this index: protocol changes regenerate it. For exact fields and a minimal example, query a name as shown in the Skill entrypoint; the whole catalog need not enter the model context.
|
||||
Generated from `references/protocol/` (fingerprint `cf4611469d2c3f5e`). Do not edit this index: protocol changes regenerate it. For exact fields and a minimal example, query a name as shown in the Skill entrypoint; the whole catalog need not enter the model context.
|
||||
+1
-1
@@ -4,7 +4,7 @@ Use for an approval request, schedule item, task, order, or another object with
|
||||
|
||||
| Needed presentation | Optional components | When to choose them |
|
||||
|---|---|---|
|
||||
| Title and current status | `CardHeader(trailing → Tag)` or `Row > Text + Tag` | Native themed header or a custom compact header |
|
||||
| Title and current status | `Text`, or `Row > Text + Tag` | Add a Tag only for an actual status; for CardHeader see [header layouts](../design.md#headers-and-card-insets) |
|
||||
| Labels and values | `Column > Row > Text + Text` | A few object attributes; see [key-value rows](../design.md#key-value-rows) for long values |
|
||||
| Fact and adjacent destination | `Row > Text + Link` | A role and "View role," or an attachment name and its details |
|
||||
| Reason or supporting material | `Markdown`, `File`, optionally within `CollapsiblePanel` | Choose separately for prose, a real file, and collapsible detail |
|
||||
|
||||
+7
@@ -28,3 +28,10 @@ Make each field recognizable before and after input. Component labels have diffe
|
||||
Use the component contract for exact fields. A placeholder or current value alone should not carry a field name that must remain visible. Add a short purpose or outcome line for a longer form when the surrounding context does not explain it.
|
||||
|
||||
Preserve user input after failure; show a completed state only after a real result. See [form interaction](../protocol/examples/form-interaction.json) for bindings, submit context, and checks, and [host action](../protocol/examples/host-action.json) for a host dialog and result writeback.
|
||||
|
||||
## Example interaction notes
|
||||
|
||||
- In the form example, `required(false)` passes; an agreement check must test the boolean value directly. ImageUpload reports only successful uploads, not cancellation or failure.
|
||||
- For host dialogs, use the explicit host catalog `urn:dingtalk:a2ui:host:v1`. The host-action example passes `initialValue` to `promptText` and reads `{status: "success", data: {text: "..."}}` from `resultPath`. Keep an empty state before a result arrives; a missing-initial-value warning on that asynchronous output binding is expected.
|
||||
- Cancellation preserves the previous result; a failed result has no `data.text`. Handle the status rather than treating every callback as new successful input.
|
||||
- ButtonGroup items own their metadata, including result writeback configuration; they do not inherit it from the group. Query the action contract before adapting the example.
|
||||
+10
-2
@@ -2,13 +2,21 @@
|
||||
|
||||
Use for a short result, risk alert, or status change. When there are many facts or a decision, use the [detail pattern](detail.md).
|
||||
|
||||
Start with the [content hierarchy guidance](../design.md#content-hierarchy). A notice with a cause, two observations, and a proposed fix needs distinct semantic groups even when it is short. Keep the source and status quiet, make the consequence scannable, keep related evidence together, and place the next step after the explanation. Do not flatten all roles into one Markdown paragraph or create one equally prominent colored box per sentence.
|
||||
|
||||
| Needed presentation | Optional components | When to choose them |
|
||||
|---|---|---|
|
||||
| Compact reminder | `Row > Icon + Text + Link`, then `Text` or `Markdown` | Title, source, and detail destination in one row; add icon and link only if useful |
|
||||
| Themed notification | `Column > CardHeader + Markdown + ButtonGroup` | Native themed header and connected actions after the body |
|
||||
| Title and explanation | `Column > Text + Markdown` | Add status or actions only when needed |
|
||||
| Result or exception | `Row > Tag + Text`, then explanation | A distinct status and body; a very short result may use text alone |
|
||||
| Capacity or quota | `Text + ProgressBar + Text` | A real computable ratio; show a number directly if only balance or remaining amount is known |
|
||||
|
||||
`CardHeader` supplies a coordinated title and background theme; `Tag` supplies status styling without hand-built colors. An outer `Column` is enough unless a local background, border, or grouping calls for `Card`.
|
||||
`Tag` supplies status styling without hand-built colors. For a requested `CardHeader`, use the [header and inset guidance](../design.md#headers-and-card-insets).
|
||||
|
||||
Do not select this pattern from words such as “notification”, “reminder”, or “issue” alone. First infer the product job from the user's intent, the event semantics, the reading behavior, and the expected action. A message is notification-shaped when its primary job is to make a recipient aware of an event, status change, risk, or result; a detailed investigation, approval decision, periodic report, or data-entry request may need a different pattern even if its copy contains notification words.
|
||||
|
||||
Keep the event or issue title as the focal fact; do not replace it with a generic header or duplicate the sole title in a separate identity strip.
|
||||
|
||||
Validate at the actual target container width, including narrower layouts when supported by the host. A 360px preview is only a sample design starting point, not a minimum width or an acceptance gate. Check wrapping, overflow and actions at the widths the card will actually use.
|
||||
|
||||
`ButtonGroup.buttons[]` contains inline objects. For static reproduction, each item may omit `action` and keep only its noninteractive appearance. Standalone `Button.action` remains required by the protocol. Use [image reconstruction](../design.md#image-reconstruction) for a branded title icon.
|
||||
+35
-30
@@ -1,41 +1,46 @@
|
||||
# Progress: Agent execution and results
|
||||
|
||||
Use for generation, search, analysis, tool execution, and other ongoing processes. An ordinary task detail does not need a reasoning panel; use the [detail pattern](detail.md).
|
||||
Use for generation, search, analysis, tool execution, and other ongoing processes such as uploads. An ordinary task detail does not need a reasoning panel; use the [detail pattern](detail.md).
|
||||
|
||||
| Process need | Optional components | When to choose them |
|
||||
For one status, a short Text or Markdown block, optionally in one panel, is enough. Group tools only when useful. Default to concise operation summaries; include necessary input/output details when the user requests diagnostics and the content is appropriate to disclose. For a known ratio, use `ProgressBar`; for stages or counts, use Text with an optional `Row + Tag`, without inventing a percentage.
|
||||
|
||||
## State and presentation
|
||||
|
||||
For an Agent reasoning or tool-execution flow, use this recommended pattern. Ordinary upload or task progress does not require reasoning styling or generation effects:
|
||||
|
||||
- The outer `CollapsiblePanel(variant=reasoning)` shows the current operation in its title, with the host's `[AIGenerating]` convention and `textEffect: shimmer` while running. On completion, show completion text and omit both the generating marker and `textEffect`.
|
||||
- Group related tools in nested `indented` panels when useful. While running, set `icon` to the light loading GIF URL and `darkIcon` to the dark loading GIF URL. For the requested DingTalk named-icon completion style, replace `icon` with `"Check_L_outlined"` when the tool group succeeds and omit the loading `darkIcon`. Do not show a success check for failed or cancelled groups.
|
||||
- Panel icons accept image URLs or registered icon names. Tool-row named icons use `Icon.name`.
|
||||
- Tool rows use `Icon.name`, chosen from [IconName](../protocol/common-types-visual.json#/$defs/IconName) for the tool type, not image URLs. `SpinLoading_L_outlined` alone does not enable rotation. Keep tool icons separate from panel status images; the outer panel uses the generation marker rather than a loading icon.
|
||||
- For the compact example style, use `common_level2_base_color` on panel titles and tool rows, and `common_action_text_style__font_size` on tool-row Text. These are styling defaults, not protocol requirements; preserve requested styling. Panel-title size is renderer-owned; do not invent a size field.
|
||||
- Children may contain any contract-supported composition, including Markdown, File, charts, or forms. Content placement and reveal timing are task choices, not restrictions imposed by the execution state.
|
||||
|
||||
| State | Title and effects | Content |
|
||||
|---|---|---|
|
||||
| Collapsible execution | `CollapsiblePanel(variant=reasoning) > Markdown/Column` | Process title and steps; choose expanded state from the content |
|
||||
| Current generation hint | `Markdown` or `Text(textEffect=shimmer)` | Markdown may use the host's `[AIGenerating]` convention; choose either treatment as appropriate |
|
||||
| Stage or counts | `Row > Text + Tag`, or several numeric groups | Show known stage, number searched, or number analyzed |
|
||||
| Known progress ratio | `Text + ProgressBar` | Use a real 0–100 `value`; do not infer a percentage from a stage alone |
|
||||
| Final result | `Markdown`, `File`, data, or actions | Choose by result type; the full process need not remain visible |
|
||||
| Running | Name the current operation; keep generation effects active | Show actual steps and any available partial result |
|
||||
| Completed | Show completion; remove the generating marker, shimmer, and loading indicators | Show the final content or artifact |
|
||||
| Failed or cancelled | Name the actual terminal state; stop generation effects | Preserve valid results; offer retry only through a real action |
|
||||
|
||||
## Group execution and result
|
||||
Distinguish generated results from user confirmation. Completion describes the A2UI content state, not a delivery API status.
|
||||
|
||||
For a demonstration task that summarizes data, steps can be grouped as below. This is structural notation, not sendable JSON.
|
||||
## Updates and interaction
|
||||
|
||||
```text
|
||||
Column
|
||||
├─ CollapsiblePanel (variant=reasoning, execution)
|
||||
│ └─ Column
|
||||
│ ├─ Text (demonstration data read)
|
||||
│ └─ CollapsiblePanel (variant=indented, summary details)
|
||||
│ └─ Row
|
||||
│ ├─ Icon (registered tool or status icon)
|
||||
│ └─ Text (current step summary)
|
||||
└─ Markdown (final result, outside the process panel)
|
||||
```
|
||||
- Start panels with reachable content so expansion reveals useful information. Set `defaultExpanded` only for the initial state; later updates must respect the user's local toggle state.
|
||||
- `CollapsiblePanel.title` is a nonempty string and `textEffect` is a string enum, not a `{path: ...}` binding. Update them through `updateComponents`; update bound body content through `updateDataModel`.
|
||||
- Keep the same `surfaceId` and existing component IDs. When adding a step, update its parent's `children` too. Supply the replacement component definition when clearing effects; do not send an unsupported empty `textEffect`.
|
||||
- Shimmer, generation indicators, loading GIFs, and collapse interactions are supported across iOS, Android, HarmonyOS, Windows, macOS, and Web. Check the actual card's resource loading and interactions separately from protocol validation.
|
||||
|
||||
For one status, one panel containing Markdown or Text is sufficient. Add a nested panel only when several tool records benefit from grouping. Show a short operation summary, not raw tool inputs and outputs.
|
||||
Initialize new bound fields with correctly typed values before using them. A text update through `updateDataModel` replaces the value at its path; it does not append characters. Do not replay initial values for existing editable fields.
|
||||
|
||||
| Stage | Process area | Result area |
|
||||
|---|---|---|
|
||||
| Running | "Summarizing demonstration data"; append actual steps and show generation effect if useful | May be hidden or show an available partial result |
|
||||
| Completed | "Summary complete"; update step copy and remove the generation effect | Show final content or artifact |
|
||||
| Failed or cancelled | Show the actual terminal state and necessary explanation; stop the generation effect | Retain still-valid results; offer retry only when a real action exists |
|
||||
## Examples and replay
|
||||
|
||||
## Incremental updates and display boundary
|
||||
The message positions below are one-based. Read one matching JSON, not both by default.
|
||||
|
||||
- `CollapsiblePanel.title` is a nonempty string and `textEffect` is a string enum; neither accepts `{path: ...}`. Change the title by updating that component with `updateComponents`. Bound body text may be changed through `updateDataModel`.
|
||||
- `defaultExpanded` controls only the initial state; do not use it to override a user's later expansion or collapse. `shimmer` depends on client support. Use the `[AIGenerating]` host convention described in [global design guidance](../design.md#global-design-guidance) only in appropriate text, not every field.
|
||||
- Reuse the original `surfaceId` and component IDs in deltas. Distinguish "result generated" from "user confirmed." For message shapes, appended steps, and removing the effect on completion, see the [agent progress example](../protocol/examples/agent-progress.json).
|
||||
| Example | Batch 1 | Batch 2 | Batch 3 |
|
||||
|---|---|---|---|
|
||||
| [agent-run-progress.json](../protocol/examples/agent-run-progress.json) | Messages 1–3: initialize reading | Message 4: finish reading, start analysis | None; intentionally stays running |
|
||||
| [agent-run.json](../protocol/examples/agent-run.json) | Messages 1–3: initialize reading | Message 4: finish reading, start analysis | Message 5: complete and reveal results |
|
||||
|
||||
The batches describe successive A2UI states on the same Surface; applying the entire array at once may hide intermediate states. Timing belongs to the consuming application, not the JSON. Keep the running-only example unfinished when demonstrating that state. For a requested complete lifecycle, include the actual completed, failed, or cancelled content state; do not infer success from the end of a message array.
|
||||
|
||||
The complete example reveals Markdown and File outside the panel in its final batch. Its File is a public sample PDF, not a generated report, and has no `onPreview` callback. Replace sample resources for real tasks and configure file interaction when required.
|
||||
+6
-4
@@ -8,12 +8,14 @@ Use for a data summary, analytical report, monitoring, or execution result. Sele
|
||||
| A few adjacent metrics | `Row > Column(Text, Text, Text)` | Label, value, and change in each group; an optional Card can provide a local background |
|
||||
| Metrics at wide and narrow widths | `ColumnLayout > metric groups` | Query and enable `responsive` when narrow layouts must become vertical; this is not an automatic wrapping grid |
|
||||
| Status or exception list | `Column/List > Row(Icon/Tag, Text)` | Status and separate explanation per item; choose a registered icon |
|
||||
| Homogeneous records | `Table` | Exact comparison by column |
|
||||
| Static tabular records | `Markdown` with table syntax | Exact comparison by column; prefer this over a separate `Table` component |
|
||||
| Trend or distribution | `Chart` | Data suited to a graphic; add a table separately when useful |
|
||||
| Method and full report | `CollapsiblePanel`, `File`, or `Link` | Supplemental details, an attachment, or a real detail destination |
|
||||
|
||||
`Table.data` is structured data and pagination runs locally. `Chart.data` holds chart type and data, not component IDs. `ColumnLayout.columns` does not automatically wrap any number of items into groups; build actual columns according to its responsive contract.
|
||||
For static tabular data, use table syntax in `Markdown.content` by default. Use a separate `Table` only when explicitly requested or when a required capability calls for it; query its contract first. `Table.data` is structured data and its pagination runs locally. `Chart.data` holds chart type and data, not component IDs. `ColumnLayout.columns` does not automatically wrap any number of items into groups; build actual columns according to its responsive contract.
|
||||
|
||||
Preserve numeric units, time ranges, and comparison baselines. Do not represent missing data as zero. Use [design guidance](../design.md#3-host-behavior-and-layout) for metric type size, spacing, and color rather than copying cramped, truncated, or gradient-heavy sample cards.
|
||||
Preserve numeric units, time ranges, and comparison baselines. Do not represent missing data as zero. Use [layout guidance](../design.md#3-host-behavior-and-layout), [text hierarchy](../design.md#5-hierarchy-and-density), and [color guidance](../design.md#4-color-discipline) rather than copying cramped, truncated, or gradient-heavy sample cards.
|
||||
|
||||
See the [data report example](../protocol/examples/data-report.json) for field and data shapes.
|
||||
The [data report example](../protocol/examples/data-report.json) illustrates protocol capabilities and field shapes; it does not override the Markdown recommendation for static tables.
|
||||
|
||||
In that example, the full table dataset is supplied once for local pagination. Loop bindings are relative to each row. The Stack includes both its base child and a referenced corner label.
|
||||
+1
-1
@@ -82,7 +82,7 @@
|
||||
"enum": [
|
||||
"shimmer"
|
||||
],
|
||||
"description": "Text presentation effect. `shimmer` repeatedly sweeps a highlight across the text and is intended for streaming wait states such as \"Thinking...\". If omitted, no effect is applied. On `CollapsiblePanel`, it applies to the panel title. The field is sent consistently to all clients. The effect currently works only on iOS; unsupported clients silently ignore it and render regular text without affecting the text itself. No protocol change is required when those clients add support."
|
||||
"description": "Text presentation effect. `shimmer` repeatedly sweeps a highlight across the text and is intended for streaming wait states such as \"Thinking...\". If omitted, no effect is applied. On `CollapsiblePanel`, it applies to the panel title. Supported on iOS, Android, HarmonyOS, Windows, macOS, and Web."
|
||||
},
|
||||
"onLinkClick": {
|
||||
"$ref": "./common-types-basic.json#/$defs/Action",
|
||||
|
||||
+3
-3
@@ -469,15 +469,15 @@
|
||||
"enum": [
|
||||
"shimmer"
|
||||
],
|
||||
"description": "Text presentation effect. `shimmer` repeatedly sweeps a highlight across the text and is intended for streaming wait states such as \"Thinking...\". If omitted, no effect is applied. On `CollapsiblePanel`, it applies to the panel title. The field is sent consistently to all clients. The effect currently works only on iOS; unsupported clients silently ignore it and render regular text without affecting the text itself. No protocol change is required when those clients add support."
|
||||
"description": "Text presentation effect. `shimmer` repeatedly sweeps a highlight across the text and is intended for streaming wait states such as \"Thinking...\". If omitted, no effect is applied. On `CollapsiblePanel`, it applies to the panel title. Supported on iOS, Android, HarmonyOS, Windows, macOS, and Web."
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Light mode title icon address."
|
||||
"description": "Light-mode title icon. Accepts an image URL or a registered IconName such as Check_L_outlined."
|
||||
},
|
||||
"darkIcon": {
|
||||
"type": "string",
|
||||
"description": "Dark mode title icon URL; falls back to icon if not provided."
|
||||
"description": "Dark-mode title icon. Accepts an image URL or a registered IconName; falls back to icon when omitted."
|
||||
},
|
||||
"variant": {
|
||||
"type": "string",
|
||||
|
||||
+10
-24
@@ -1,29 +1,15 @@
|
||||
---
|
||||
status: authoritative
|
||||
updated: 2026-09-21
|
||||
scope: Four task-oriented message examples of DingTalk AICard Protocol V0.8
|
||||
---
|
||||
# Choose an example
|
||||
|
||||
# DingTalk AICard Protocol V0.8 scenario examples
|
||||
Read only the matching JSON. Adapt its content and layout to the task.
|
||||
|
||||
Read one matching scenario when composing bindings, actions or updates. For a single field, read its component or function definition instead. These are adaptable examples, not required layouts.
|
||||
|
||||
Each JSON file is a complete new-card message array: createSurface with the public catalogId, root updateDataModel, then updateComponents and any scenario updates. For a host-created empty Surface, omit createSurface; for an existing-card update, construct only the actual changes instead of replaying initial data and components. Keep each surfaceId consistent. See [Surface and delivery scenarios](../../../SKILL.md) for delivery boundaries. FULL_DATA / DELTA wrappers are not part of these arrays.
|
||||
|
||||
| Example | Demonstrates | Relevant shards |
|
||||
| Need | JSON example | Guidance |
|
||||
|---|---|---|
|
||||
| [form-interaction.json](form-interaction.json) | Persistent field titles, typed initial values, local input state, upload events and submit-button checks | [catalog-components-common.json](../catalog-components-common.json), [catalog-components-inputs.json](../catalog-components-inputs.json), [catalog-functions-core.json](../catalog-functions-core.json) |
|
||||
| [host-action.json](host-action.json) | Explicit host catalog, promptText result writeback and item-owned button metadata | [catalog-components-common.json](../catalog-components-common.json), [catalog-components-composition.json](../catalog-components-composition.json), [catalog-functions-host-actions.json](../catalog-functions-host-actions.json) |
|
||||
| [agent-progress.json](agent-progress.json) | Nested collapsed execution panels, incremental steps and a completed state | [catalog-components-common.json](../catalog-components-common.json), [catalog-components-composition.json](../catalog-components-composition.json) |
|
||||
| [data-report.json](data-report.json) | Tabs, local table pagination, chart data, relative Loop bindings and Stack references | [catalog-components-common.json](../catalog-components-common.json), [catalog-components-composition.json](../catalog-components-composition.json), [catalog-components-specialized.json](../catalog-components-specialized.json) |
|
||||
| Form bindings, upload events, and submit checks | [form-interaction.json](form-interaction.json) | [Form](../../patterns/form.md) |
|
||||
| Host dialog and result writeback | [host-action.json](host-action.json) | [Form](../../patterns/form.md#example-interaction-notes) |
|
||||
| Running state with generation effects and tool icons | [agent-run-progress.json](agent-run-progress.json) | [Progress](../../patterns/progress.md) |
|
||||
| Execution updates through completion | [agent-run.json](agent-run.json) | [Progress](../../patterns/progress.md) |
|
||||
| Tabs, table pagination, charts, Loop, and Stack | [data-report.json](data-report.json) | [Report](../../patterns/report.md) |
|
||||
|
||||
Shard names describe reading dependencies, not runtime catalog IDs. Follow field $refs into the common-type files as needed. Do not load this whole directory into every prompt.
|
||||
Execution replay requires the [batch instructions](../../patterns/progress.md#examples-and-replay); sending the whole array at once may hide intermediate states.
|
||||
|
||||
## Interaction notes
|
||||
|
||||
- In the form, single selection still binds a string array. `required(false)` passes: the agreement check therefore reads the boolean binding directly. ImageUpload reports only after a successful upload; canceled or failed uploads do not report an event.
|
||||
- Host actions explicitly use `urn:dingtalk:a2ui:host:v1`. promptText takes `initialValue`, then writes `{status: "success", data: {text: "..."}}` to the declared resultPath. Before a call, result slots are empty; a missing-initial-value warning at these asynchronous output bindings is expected. Cancellation preserves the previous result; a failed result has no data.text. The static hint and bounded result text provide an empty state. ButtonGroup items own their metadata and never inherit a parent writeback path.
|
||||
- The progress example uses an outer reasoning panel and a nested tool panel. Titles and shimmer are literals supported by the current public contract; subsequent updateComponents messages replace those definitions. Adding a step also updates its parent children. The final update removes shimmer. Current shimmer animation is iOS-only; other clients show plain text.
|
||||
- The table receives its complete dataset once; pageSize 2 with three rows demonstrates local pagination. Loop item bindings are relative to each row. The chart Stack has both a base child and a referenced corner label.
|
||||
|
||||
All examples are checked structurally and semantically. Host callbacks and device rendering are not executed by static validation. No user or tool activity is performed by reading these files.
|
||||
These arrays initialize new cards. For existing cards, send only intended changes, not initialization. See [Construct and validate](../../../SKILL.md#construct-and-validate) for creation and update scenarios.
|
||||
-174
@@ -1,174 +0,0 @@
|
||||
[
|
||||
{
|
||||
"version": "v1.0",
|
||||
"createSurface": {
|
||||
"surfaceId": "open-progress",
|
||||
"catalogId": "https://dingtalk.com/card/a2ui/catalogs/public/catalog.json"
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1.0",
|
||||
"updateDataModel": {
|
||||
"surfaceId": "open-progress",
|
||||
"path": "/",
|
||||
"value": {
|
||||
"answer": {
|
||||
"text": "Generating a report."
|
||||
},
|
||||
"tools": {
|
||||
"text": "Summarizing sample data"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1.0",
|
||||
"updateComponents": {
|
||||
"surfaceId": "open-progress",
|
||||
"components": [
|
||||
{
|
||||
"id": "root",
|
||||
"component": "Column",
|
||||
"children": [
|
||||
"executionPanel",
|
||||
"answer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "executionPanel",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "Summarizing data",
|
||||
"variant": "reasoning",
|
||||
"defaultExpanded": false,
|
||||
"children": [
|
||||
"executionTimeline"
|
||||
],
|
||||
"fallbackMarkdown": "Execution steps",
|
||||
"textEffect": "shimmer"
|
||||
},
|
||||
{
|
||||
"id": "executionTimeline",
|
||||
"component": "Column",
|
||||
"children": [
|
||||
"step1",
|
||||
"toolGroup_summary"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "step1",
|
||||
"component": "Text",
|
||||
"text": "Sample data loaded",
|
||||
"maxLine": 2
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_summary",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "Summarizing",
|
||||
"defaultExpanded": false,
|
||||
"children": [
|
||||
"toolRow"
|
||||
],
|
||||
"fallbackMarkdown": "Tool call details"
|
||||
},
|
||||
{
|
||||
"id": "toolRow",
|
||||
"component": "Row",
|
||||
"children": [
|
||||
"toolIcon",
|
||||
"toolText"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "toolIcon",
|
||||
"component": "Icon",
|
||||
"name": "CodeProgram_L_outlined",
|
||||
"colorToken": "common_level2_base_color"
|
||||
},
|
||||
{
|
||||
"id": "toolText",
|
||||
"component": "Text",
|
||||
"text": {
|
||||
"path": "/tools/text"
|
||||
},
|
||||
"maxLine": 2,
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"id": "answer",
|
||||
"component": "Markdown",
|
||||
"content": {
|
||||
"path": "/answer/text"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1.0",
|
||||
"updateComponents": {
|
||||
"surfaceId": "open-progress",
|
||||
"components": [
|
||||
{
|
||||
"id": "executionTimeline",
|
||||
"component": "Column",
|
||||
"children": [
|
||||
"step1",
|
||||
"toolGroup_summary",
|
||||
"step2"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "step2",
|
||||
"component": "Text",
|
||||
"text": "Category totals calculated",
|
||||
"maxLine": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1.0",
|
||||
"updateDataModel": {
|
||||
"surfaceId": "open-progress",
|
||||
"path": "/tools/text",
|
||||
"value": "Data summary complete"
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1.0",
|
||||
"updateDataModel": {
|
||||
"surfaceId": "open-progress",
|
||||
"path": "/answer/text",
|
||||
"value": "**Summary complete**: Engineering 8, Design 3, Testing 2; 13 items in total."
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1.0",
|
||||
"updateComponents": {
|
||||
"surfaceId": "open-progress",
|
||||
"components": [
|
||||
{
|
||||
"id": "executionPanel",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "Execution complete",
|
||||
"variant": "reasoning",
|
||||
"defaultExpanded": false,
|
||||
"children": [
|
||||
"executionTimeline"
|
||||
],
|
||||
"fallbackMarkdown": "Execution steps"
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_summary",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "Summary complete",
|
||||
"defaultExpanded": false,
|
||||
"children": [
|
||||
"toolRow"
|
||||
],
|
||||
"fallbackMarkdown": "Tool call details"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
+173
@@ -0,0 +1,173 @@
|
||||
[
|
||||
{
|
||||
"version": "v1.0",
|
||||
"createSurface": {
|
||||
"surfaceId": "open-progress",
|
||||
"catalogId": "https://dingtalk.com/card/a2ui/catalogs/public/catalog.json"
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1.0",
|
||||
"updateDataModel": {
|
||||
"surfaceId": "open-progress",
|
||||
"path": "/",
|
||||
"value": {}
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1.0",
|
||||
"updateComponents": {
|
||||
"surfaceId": "open-progress",
|
||||
"components": [
|
||||
{
|
||||
"id": "root",
|
||||
"component": "Column",
|
||||
"children": [
|
||||
"executionPanel"
|
||||
],
|
||||
"gap": 6
|
||||
},
|
||||
{
|
||||
"id": "executionPanel",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "[AIGenerating]Reading...",
|
||||
"children": [
|
||||
"executionTimeline"
|
||||
],
|
||||
"colorToken": "common_level2_base_color",
|
||||
"variant": "reasoning",
|
||||
"fallbackMarkdown": "Execution details",
|
||||
"defaultExpanded": false,
|
||||
"textEffect": "shimmer"
|
||||
},
|
||||
{
|
||||
"id": "executionTimeline",
|
||||
"component": "Column",
|
||||
"children": [
|
||||
"toolGroup_read"
|
||||
],
|
||||
"gap": 6
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_read",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "Reading...",
|
||||
"children": [
|
||||
"toolGroup_read_row"
|
||||
],
|
||||
"colorToken": "common_level2_base_color",
|
||||
"variant": "indented",
|
||||
"fallbackMarkdown": "Execution details",
|
||||
"defaultExpanded": false,
|
||||
"icon": "https://g.alicdn.com/dingding/card_a2ui/0.1.1/img/loading-circular/loading_circular_light.DlX94S3.gif",
|
||||
"darkIcon": "https://g.alicdn.com/dingding/card_a2ui/0.1.1/img/loading-circular/loading_circular_dark.D-pS11K.gif"
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_read_row",
|
||||
"component": "Row",
|
||||
"align": "center",
|
||||
"children": [
|
||||
"toolGroup_read_icon",
|
||||
"toolGroup_read_text"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_read_icon",
|
||||
"component": "Icon",
|
||||
"name": "Folder_L_outlined",
|
||||
"colorToken": "common_level2_base_color"
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_read_text",
|
||||
"component": "Text",
|
||||
"text": "Read sample data",
|
||||
"colorToken": "common_level2_base_color",
|
||||
"sizeToken": "common_action_text_style__font_size",
|
||||
"bold": false,
|
||||
"maxLine": 2,
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1.0",
|
||||
"updateComponents": {
|
||||
"surfaceId": "open-progress",
|
||||
"components": [
|
||||
{
|
||||
"id": "executionPanel",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "[AIGenerating]Analyzing...",
|
||||
"children": [
|
||||
"executionTimeline"
|
||||
],
|
||||
"colorToken": "common_level2_base_color",
|
||||
"variant": "reasoning",
|
||||
"fallbackMarkdown": "Execution details",
|
||||
"textEffect": "shimmer"
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_read",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "Read complete",
|
||||
"children": [
|
||||
"toolGroup_read_row"
|
||||
],
|
||||
"colorToken": "common_level2_base_color",
|
||||
"variant": "indented",
|
||||
"fallbackMarkdown": "Execution details",
|
||||
"icon": "Check_L_outlined"
|
||||
},
|
||||
{
|
||||
"id": "executionTimeline",
|
||||
"component": "Column",
|
||||
"children": [
|
||||
"toolGroup_read",
|
||||
"toolGroup_summary"
|
||||
],
|
||||
"gap": 6
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_summary",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "Analyzing...",
|
||||
"children": [
|
||||
"toolGroup_summary_row"
|
||||
],
|
||||
"colorToken": "common_level2_base_color",
|
||||
"variant": "indented",
|
||||
"fallbackMarkdown": "Execution details",
|
||||
"defaultExpanded": false,
|
||||
"icon": "https://g.alicdn.com/dingding/card_a2ui/0.1.1/img/loading-circular/loading_circular_light.DlX94S3.gif",
|
||||
"darkIcon": "https://g.alicdn.com/dingding/card_a2ui/0.1.1/img/loading-circular/loading_circular_dark.D-pS11K.gif"
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_summary_row",
|
||||
"component": "Row",
|
||||
"align": "center",
|
||||
"children": [
|
||||
"toolGroup_summary_icon",
|
||||
"toolGroup_summary_text"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_summary_icon",
|
||||
"component": "Icon",
|
||||
"name": "CodeProgram_L_outlined",
|
||||
"colorToken": "common_level2_base_color"
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_summary_text",
|
||||
"component": "Text",
|
||||
"text": "Calculate summary",
|
||||
"colorToken": "common_level2_base_color",
|
||||
"sizeToken": "common_action_text_style__font_size",
|
||||
"bold": false,
|
||||
"maxLine": 2,
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
+233
@@ -0,0 +1,233 @@
|
||||
[
|
||||
{
|
||||
"version": "v1.0",
|
||||
"createSurface": {
|
||||
"surfaceId": "open-streaming",
|
||||
"catalogId": "https://dingtalk.com/card/a2ui/catalogs/public/catalog.json"
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1.0",
|
||||
"updateDataModel": {
|
||||
"surfaceId": "open-streaming",
|
||||
"path": "/",
|
||||
"value": {}
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1.0",
|
||||
"updateComponents": {
|
||||
"surfaceId": "open-streaming",
|
||||
"components": [
|
||||
{
|
||||
"id": "root",
|
||||
"component": "Column",
|
||||
"children": [
|
||||
"executionPanel"
|
||||
],
|
||||
"gap": 6
|
||||
},
|
||||
{
|
||||
"id": "executionPanel",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "[AIGenerating]Reading...",
|
||||
"children": [
|
||||
"executionTimeline"
|
||||
],
|
||||
"colorToken": "common_level2_base_color",
|
||||
"variant": "reasoning",
|
||||
"fallbackMarkdown": "Execution details",
|
||||
"defaultExpanded": false,
|
||||
"textEffect": "shimmer"
|
||||
},
|
||||
{
|
||||
"id": "executionTimeline",
|
||||
"component": "Column",
|
||||
"children": [
|
||||
"toolGroup_read"
|
||||
],
|
||||
"gap": 6
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_read",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "Reading...",
|
||||
"children": [
|
||||
"toolGroup_read_row"
|
||||
],
|
||||
"colorToken": "common_level2_base_color",
|
||||
"variant": "indented",
|
||||
"fallbackMarkdown": "Execution details",
|
||||
"defaultExpanded": false,
|
||||
"icon": "https://g.alicdn.com/dingding/card_a2ui/0.1.1/img/loading-circular/loading_circular_light.DlX94S3.gif",
|
||||
"darkIcon": "https://g.alicdn.com/dingding/card_a2ui/0.1.1/img/loading-circular/loading_circular_dark.D-pS11K.gif"
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_read_row",
|
||||
"component": "Row",
|
||||
"align": "center",
|
||||
"children": [
|
||||
"toolGroup_read_icon",
|
||||
"toolGroup_read_text"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_read_icon",
|
||||
"component": "Icon",
|
||||
"name": "Folder_L_outlined",
|
||||
"colorToken": "common_level2_base_color"
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_read_text",
|
||||
"component": "Text",
|
||||
"text": "Read sample data",
|
||||
"colorToken": "common_level2_base_color",
|
||||
"sizeToken": "common_action_text_style__font_size",
|
||||
"bold": false,
|
||||
"maxLine": 2,
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1.0",
|
||||
"updateComponents": {
|
||||
"surfaceId": "open-streaming",
|
||||
"components": [
|
||||
{
|
||||
"id": "executionPanel",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "[AIGenerating]Analyzing...",
|
||||
"children": [
|
||||
"executionTimeline"
|
||||
],
|
||||
"colorToken": "common_level2_base_color",
|
||||
"variant": "reasoning",
|
||||
"fallbackMarkdown": "Execution details",
|
||||
"textEffect": "shimmer"
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_read",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "Read complete",
|
||||
"children": [
|
||||
"toolGroup_read_row"
|
||||
],
|
||||
"colorToken": "common_level2_base_color",
|
||||
"variant": "indented",
|
||||
"fallbackMarkdown": "Execution details"
|
||||
},
|
||||
{
|
||||
"id": "executionTimeline",
|
||||
"component": "Column",
|
||||
"children": [
|
||||
"toolGroup_read",
|
||||
"toolGroup_summary"
|
||||
],
|
||||
"gap": 6
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_summary",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "Analyzing...",
|
||||
"children": [
|
||||
"toolGroup_summary_row"
|
||||
],
|
||||
"colorToken": "common_level2_base_color",
|
||||
"variant": "indented",
|
||||
"fallbackMarkdown": "Execution details",
|
||||
"defaultExpanded": false,
|
||||
"icon": "https://g.alicdn.com/dingding/card_a2ui/0.1.1/img/loading-circular/loading_circular_light.DlX94S3.gif",
|
||||
"darkIcon": "https://g.alicdn.com/dingding/card_a2ui/0.1.1/img/loading-circular/loading_circular_dark.D-pS11K.gif"
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_summary_row",
|
||||
"component": "Row",
|
||||
"align": "center",
|
||||
"children": [
|
||||
"toolGroup_summary_icon",
|
||||
"toolGroup_summary_text"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_summary_icon",
|
||||
"component": "Icon",
|
||||
"name": "CodeProgram_L_outlined",
|
||||
"colorToken": "common_level2_base_color"
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_summary_text",
|
||||
"component": "Text",
|
||||
"text": "Calculate summary",
|
||||
"colorToken": "common_level2_base_color",
|
||||
"sizeToken": "common_action_text_style__font_size",
|
||||
"bold": false,
|
||||
"maxLine": 2,
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"version": "v1.0",
|
||||
"updateComponents": {
|
||||
"surfaceId": "open-streaming",
|
||||
"components": [
|
||||
{
|
||||
"id": "executionPanel",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "Completed",
|
||||
"children": [
|
||||
"executionTimeline"
|
||||
],
|
||||
"colorToken": "common_level2_base_color",
|
||||
"variant": "reasoning",
|
||||
"fallbackMarkdown": "Execution details"
|
||||
},
|
||||
{
|
||||
"id": "toolGroup_summary",
|
||||
"component": "CollapsiblePanel",
|
||||
"title": "Analysis complete",
|
||||
"children": [
|
||||
"toolGroup_summary_row"
|
||||
],
|
||||
"colorToken": "common_level2_base_color",
|
||||
"variant": "indented",
|
||||
"fallbackMarkdown": "Execution details"
|
||||
},
|
||||
{
|
||||
"id": "root",
|
||||
"component": "Column",
|
||||
"children": [
|
||||
"executionPanel",
|
||||
"result"
|
||||
],
|
||||
"gap": 6
|
||||
},
|
||||
{
|
||||
"id": "result",
|
||||
"component": "Column",
|
||||
"children": [
|
||||
"answer",
|
||||
"artifact"
|
||||
],
|
||||
"gap": 6
|
||||
},
|
||||
{
|
||||
"id": "answer",
|
||||
"component": "Markdown",
|
||||
"content": "Analysis complete. Sample file attached."
|
||||
},
|
||||
{
|
||||
"id": "artifact",
|
||||
"component": "File",
|
||||
"fileName": "dummy.pdf",
|
||||
"url": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
|
||||
"mimeType": "application/pdf",
|
||||
"description": "Public sample PDF; not a generated report"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -30,7 +30,7 @@ metadata:
|
||||
| 请求意图 | 本次唯一契约查询 |
|
||||
|---|---|
|
||||
| 评审返回值、恢复方案、故障或 dry-run 样本 | 把正在核对的完整入口原样放入 `dws schema --cli-path "aitable <原入口>" --compact --format json`;保留 `+`,不改查 Help,也不切换原子/Shortcut |
|
||||
| 仅问原子 `form share update` 的写法 | 只执行 `dws aitable form share update --help`(禁止改查 Schema) |
|
||||
| 仅问原子 `form share update` 的写法 | 只查询 `dws schema --cli-path "aitable form share update" --compact --format json` |
|
||||
| 仅问 Shortcut 的写法 | 只查该 Shortcut 的 compact Schema |
|
||||
|
||||
<!-- DWS_RUNTIME_CONTRACT_START -->
|
||||
@@ -57,7 +57,7 @@ metadata:
|
||||
|
||||
收到仅询问用法的请求后,第一步必须立即实际执行且仅执行下列对应命令;即使用户提到“help/schema”,也按入口选择,不能自行替换:
|
||||
|
||||
- `form share update`:`dws aitable form share update --help`
|
||||
- `form share update`:`dws schema --cli-path "aitable form share update" --compact --format json`
|
||||
- `+form-share-update`:`dws schema --cli-path "aitable +form-share-update" --compact --format json`
|
||||
|
||||
Shortcut 名称开头的 `+` 是命令名不可省略的一部分;不得改写、试探其他拼法或改用 `--help`/`-h`。
|
||||
@@ -114,7 +114,7 @@ Help/Schema 是离线契约查询,不调用线上业务,也不读写用户
|
||||
<!-- VISIBLE_SHORTCUTS_START -->
|
||||
## Shortcut 发现(按需)
|
||||
|
||||
`aitable` 当前有 126 条公开 shortcut,完整清单保留在 Runtime Catalog 与 Schema,不在高频产品根 Skill 中重复展开。已知 leaf 直接执行。参数只查 `dws schema --cli-path "aitable <leaf>" --compact --jq '{cli_path,parameters,constraints,confirmation}' -f json`;仅需且已发布 `result` 时查 outcomes/pagination,字段级再查 `data_schema`;缺失不以 Help/样例推断。Schema 不可用才读一次已知 leaf Help;`unknown flag` 用同 leaf Help 修正一次。`unknown command` 禁 Help:错误 suggestion → 已加载 Skill/reference 明确入口;均无则报漂移。禁全 Catalog/root/parent/product Help;低频 reference 不默认 Help;同一任务只读一个 Reference。
|
||||
`aitable` 当前有 127 条公开 shortcut,完整清单保留在 Runtime Catalog 与 Schema,不在高频产品根 Skill 中重复展开。已知 leaf 直接执行。参数只查 `dws schema --cli-path "aitable <leaf>" --compact --jq '{cli_path,parameters,constraints,confirmation}' -f json`;仅需且已发布 `result` 时查 outcomes/pagination,字段级再查 `data_schema`;缺失不以 Help/样例推断。Schema 不可用才读一次已知 leaf Help;`unknown flag` 用同 leaf Help 修正一次。`unknown command` 禁 Help:错误 suggestion → 已加载 Skill/reference 明确入口;均无则报漂移。禁全 Catalog/root/parent/product Help;低频 reference 不默认 Help;同一任务只读一个 Reference。
|
||||
|
||||
仅当根路由、精确 task reference 和 `references/aitable.md` 的低频原子索引都无法定位能力时,才执行 `dws shortcut list --service aitable --format json` 做最终回退;不要为已知意图加载完整 Shortcut Catalog 或产品级 Schema。
|
||||
<!-- VISIBLE_SHORTCUTS_END -->
|
||||
@@ -143,7 +143,7 @@ Help/Schema 是离线契约查询,不调用线上业务,也不读写用户
|
||||
| 查询一条记录的变更历史 | `dws aitable +record-history-list --base-id <ID> --table-id <ID> --record-id <ID>` | 已知 recordId 时直接执行,不探测 Help、Catalog 或全量 Schema |
|
||||
| 管理一条记录的评论 | 查询用 `dws aitable comment list --base-id <B> --table-id <T> --record-id <R>`;创建、回复、更新和删除按需使用同组 leaf | 先读 [comment](references/aitable/aitable-comment.md);topicId/commentKey 只复用同一记录真实返回;空评论页仍读取 `meta.pagination`,仅 `meta.pagination.endpoint_exhausted=true` 时停止,否则将 `meta.pagination.next_token` 原样传给下一次 `--cursor`;写入未知状态先 list 对账 |
|
||||
| 按业务键同步或按条件批改 | 唯一键用 `dws aitable +record-upsert-by-key ...`;有界批改用 `dws aitable +record-bulk-patch ... --max-matches <N>` | upsert 仅允许 0 条创建、1 条更新;批改必须有 query/filters/record-ids 边界。普通 update/upsert 直接执行;只有历史、分享、删除恢复、空行或特殊字段值才读 [record-ops](references/aitable-record-ops.md);明确 AND/OR、日期或比较操作符只读 [filter-sort](references/aitable/aitable-filter-sort.md) |
|
||||
| 生成记录分享链接并发送给联系人 | `dws aitable +record-share-links --base <B> --table <T> --record-ids <IDs>` → `dws chat +dm --to <姓名> --text <完整链接文本>` | AITable 只生成链接;用户要求“发送”时还必须完成真实发送,不能停在联系人解析 |
|
||||
| 生成记录分享链接并发送给联系人 | `dws aitable +record-share-links --base <B> --table <T> --record-ids <IDs>` → `dws chat +dm --to <姓名> --content <完整链接文本>` | AITable 只生成链接;用户要求“发送”时还必须完成真实发送,不能停在联系人解析 |
|
||||
| 创建或复制视图 | 创建用 `dws aitable view create --base-id <B> --table-id <T> --view-type <Grid|FormDesigner|Gantt|Calendar|Kanban|Gallery> [--name <名称>]`;复制用 `dws aitable +view-duplicate --base-id <B> --table-id <T> --view-id <V> [--new-name <名称>]` | 创建和复制直接执行;需要配置时按下方“按需加载”选择一个 View Reference |
|
||||
| 创建并验证 Dashboard,按需创建 Chart | `dws aitable dashboard create --base-id <B> --name <名称>` → `dws aitable +dashboard-get --base-id <B> --dashboard-id <D>`;需要 Chart 时按下方“按需加载”处理 | 只使用创建返回的真实 dashboardId;失败时不要猜同义命令或更换 dashboardId |
|
||||
| 管理 AI 表格应用模式 | `dws aitable app get --base-id <B>` → `dws aitable app page list --base-id <B>` → 按需 `app page create/update/move/delete` 或 `app widget create/get/list/update/delete` | 一个 Base 只有一个面向用户的 App;页面 `pageId` 同时是对应 Dashboard ID。Widget 的 `config`/`layout` 是完整对象,更新前先读回;创建操作未知状态时不得自动重放 |
|
||||
|
||||
+3
-3
@@ -19,7 +19,7 @@ dws aitable record query --base-id <B> --table-id <T> --filters '<JSON>' --all -
|
||||
- filters 使用 `{"operator":"and|or","operands":[...]}`,字段引用使用 fieldId。明确出现 AND/OR、日期或比较操作符时,应由根 Skill 直接选中记录筛选 reference;不要先读本文件再跳到第二个 reference。
|
||||
- `+record-query` 必须传真实 `base-id` 和 `table-id`。URL 先用 `+url-resolve`;名称先用 `+resolve-base` / `+resolve-table` 唯一解析,禁止自动选第一项。
|
||||
- 单页 `limit` 为 1-100。返回 `data.records`、`data.hasMore`,存在后续页时还会返回 `data.nextCursor`;把该值原样传给下一次 `--cursor`。
|
||||
- `+record-query` 不提供 `--all`;明确要求全量时改用原子 `record query --all --page-limit <N>`。达到页上限后仍有 `hasMore=true` 代表截断,应从返回 cursor 续跑;只有 `hasMore=false`,或按 `record-ids` 查询且所有请求 ID 均已返回时,才能声称结果完整。
|
||||
- `+record-query --all --max-records <N>` 支持有界全量读取,`max-records` 默认 10000、范围 1–10000,超限返回错误;`--all` 与 `--cursor` 互斥。原子 `record query --all --page-limit <N>` 按页数限界,达到页上限且仍有更多页时也返回非零错误。只有已确认遍历结束,或按 `record-ids` 查询且所有请求 ID 均已返回时,才能声称结果完整。
|
||||
- 出现 `pagination_cursor_cycle`、相同 cursor 或重复页时,保留已取记录并立即停止;不要用相同参数重跑,也不要更换查询命令把不完整结果误报为完整。
|
||||
|
||||
## 新增
|
||||
@@ -31,7 +31,7 @@ dws aitable record create --base-id <B> --table-id <T> \
|
||||
--records '[{"cells":{"fldText":"内容"}}]' --format json
|
||||
```
|
||||
|
||||
长 JSON 写到 cwd 内相对文件后使用 `--records-file ./records.json`。从真实返回的 `data.newRecordIds[]` 取 recordId,再用 `+record-query --record-ids` 回读;用户限定返回列时同时传 `--field-ids`。不要从输入顺序、名称或行号推断 ID。
|
||||
长 JSON 写到 cwd 内相对文件后使用 `--records-file ./records.json`。从真实返回的 `data.createdRecordIds[]` 取 recordId(兼容保留 `data.newRecordIds[]`),再用 `+record-query --record-ids` 回读;用户限定返回列时同时传 `--field-ids`。不要从输入顺序、名称或行号推断 ID。需要回收丢失回执时,调用前持久化 UUID v4 并传 `--client-token`;遇到超时只用原 Base/Table/token 调用 `+record-write-result`,不得自动重放创建。
|
||||
|
||||
## 更新、同步与批量修改
|
||||
|
||||
@@ -79,4 +79,4 @@ dws aitable +record-delete --base-id <B> --table-id <T> --record-ids <R1,R2>
|
||||
|
||||
- 记录历史:`dws aitable +record-history-list --base-id <B> --table-id <T> --record-id <R>`。已有真实 recordId 直接执行,不扫描 Help 或产品 Catalog。
|
||||
- 批量记录分享:`dws aitable +record-share-links --base <B> --table <T> --record-ids <R1,R2>`;单条也可用 `+record-share-url`。
|
||||
- 用户要求把分享链接“发给”联系人时,AITable 的职责在链接生成后结束;随后加载 `dingtalk-chat`,用 `dws chat +dm --to <姓名> --text <包含全部链接的文本>` 对每位收件人分别发送并检查真实回执。只解析联系人或只生成 URL 都不算完成。
|
||||
- 用户要求把分享链接“发给”联系人时,AITable 的职责在链接生成后结束;随后加载 `dingtalk-chat`,用 `dws chat +dm --to <姓名> --content <包含全部链接的文本>` 对每位收件人分别发送并检查真实回执。只解析联系人或只生成 URL 都不算完成。
|
||||
+4
-1
@@ -2,7 +2,10 @@
|
||||
|
||||
> 适用命令:`dws aitable field create`、`dws aitable table create --fields`、`dws aitable field update --config`
|
||||
>
|
||||
> 本文件是 DWS AI 表格字段 config 的 **source of truth**。创建/更新字段时,必须严格按此规范构造 JSON。
|
||||
> 本文件是字段 config 的使用参考;可执行能力以当前 leaf Help/Schema 和服务端契约为准。
|
||||
>
|
||||
> 2026-09-23 核对:生产 MCP `create_fields` / `update_field` 的工具 Schema 只显式列出 `config.options`,与配置说明存在缺口;这不等于已证明网关会丢弃其他键。下文 `formula`、`formatter`、`linkedTableId` 等配置需要完整契约和发布验证;不能把创建回执当作配置已生效,也不要重复试写。
|
||||
> `table create` 使用独立 config 契约。创建回执的 success 不是可读性保证;建表/建字段可使用 `--wait --wait-timeout 30` 连续两次只读核对,超时保留 receipt 和 ID,禁止重放创建。
|
||||
|
||||
## 1. 顶层规则
|
||||
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@
|
||||
| `number` | JSON number | 将明确数值转换为数字,禁止传字符串数字 |
|
||||
| `date` | `YYYY-MM-DD`、RFC3339 或毫秒时间戳 | 使用日期专用操作符;范围拆为 `not_before` + `not_after` |
|
||||
| `singleSelect` / `multipleSelect` | singleSelect 通常传 option ID 标量;multipleSelect 或数组型条件传 option ID 数组,如 `["optA"]` | `field get` 或 `field search-options` 唯一匹配;写记录时才使用 option name |
|
||||
| 人员 | `[{"userId":"..."}]`(需要时同时带 `corpId`) | `dws aisearch person --keyword "<姓名>" --dimension name --format json`;取唯一 `userId`,重名必须消歧 |
|
||||
| 人员 | `[{"userId":"..."}]`(需要时同时带 `corpId`) | `dws aisearch person --query "<姓名>" --dimension name --format json`;取唯一 `userId`,重名必须消歧 |
|
||||
| 部门 | `[{"departmentId":"..."}]` | `dws contact +resolve-dept --name "<部门名>" --format json`;取唯一 `deptId` 并写入 `departmentId`,零/多命中必须停止 |
|
||||
| 群组 | `[{"cid":"..."}]` | `dws chat +chat-search --query "<群名>" --page-all --format json`;取唯一 `openConversationId` 并写入 `cid`,零/多命中必须停止 |
|
||||
| 关联记录 | 稳定 `recordId` 或字段协议要求的 recordId 结构 | 先查询关联目标表并唯一定位记录;不得传记录标题 |
|
||||
|
||||
+2
-2
@@ -19,9 +19,9 @@
|
||||
|
||||
## 仅询问分享更新用法时
|
||||
|
||||
用法询问与返回值评审不能共用发现路径:问原子命令写法只执行 `dws aitable form share update --help`(禁止改查 Schema);本专用规则优先于通用 Schema 导航。
|
||||
用法询问与返回值评审不能共用发现路径:问原子命令写法只查询 `dws schema --cli-path "aitable form share update" --compact --format json`;本专用规则优先于通用 Schema 导航。
|
||||
|
||||
收到仅询问用法的请求后,第一步必须立即实际执行且仅执行对应命令:原子入口用 `dws aitable form share update --help`;Shortcut 入口用 `dws schema --cli-path "aitable +form-share-update" --compact --format json`。Shortcut 名称开头的 `+` 是命令名不可省略的一部分;不得改写、试探其他拼法或改用 `--help`/`-h`。
|
||||
收到仅询问用法的请求后,第一步必须立即实际执行且仅执行对应命令:原子入口用 `dws schema --cli-path "aitable form share update" --compact --format json`;Shortcut 入口用 `dws schema --cli-path "aitable +form-share-update" --compact --format json`。Shortcut 名称开头的 `+` 是命令名不可省略的一部分;不得改写、试探其他拼法或改用 `--help`/`-h`。
|
||||
|
||||
发现门禁:即使 Skill 或参考文档已提供完整示例,回答前也必须实际执行一次且仅执行一次目标 leaf 的安全 help/schema 查询;不得仅依据 Skill 或参考文档直接作答。用户仅询问用法时,最终回答必须先给出完整命令;缺少必填 ID 时则给出带明确占位符的完整命令模板,禁止猜测。随后明确说明“未传入的分享配置保持原值”;不得执行目标写操作或声称已经执行。上述只读查询是唯一允许的命令。
|
||||
|
||||
|
||||
+2
@@ -2,6 +2,8 @@
|
||||
|
||||
> 当用户要创建 formula 类型字段、编写表内计算公式、做派生指标时,必须先读本文档。
|
||||
|
||||
> 当前生产契约边界(2026-09-23):`create_fields` / `update_field` 的工具 Schema 尚未显式列出 `config.formula`;下方语法和示例不是该生产入口已可用的保证。先核对服务端契约与发布状态,未确认时不要试写;不得改用建表绕过原有目标。已返回 fieldId 但 `verificationStatus=pending` 或读回 `FIELD_NOT_FOUND` 时保留原回执,只读核对,不重新创建。`--wait` 仅验证字段结构可读,不证明公式计算结果已完成。
|
||||
|
||||
## 1. 何时使用 formula 字段
|
||||
|
||||
| 场景 | 用 formula | 不用 formula |
|
||||
|
||||
+1
-1
@@ -54,7 +54,7 @@
|
||||
- 常规模式参数仅使用 `-d`、`-l`、`-t`、`-c`;查看全属性列可使用 `--all-properties`,执行约束可使用 `--limit`、`--timeout`;禁止改写为 `--base-id`、`--table-id`、`--sql` 或 `--base`。
|
||||
- 查看表结构时,默认只查看与 AI 表格页面一致的基础字段(默认属性),不得因字段类型复杂而自动添加 `--all-properties`。仅当用户显式要求查看全部扩展属性时,才添加该参数。
|
||||
- 不得使用不存在的 `dws aitable table list` 作为回退;表发现只能使用 `psql -d '<BASE_ID>' -l`。
|
||||
- 本文已明确命令契约时,不得通过 `dws aitable psql --help` 判断功能是否存在。
|
||||
- 本文已明确命令契约时,不得通过帮助输出重新猜测功能是否存在;以本文公开命令契约为准。
|
||||
- 执行前向用户展示命令时,必须展示即将执行的完整命令,不能简写为 `dws aitable psql -l`。
|
||||
- 命令失败时保留并依据真实错误处理;不得据此猜测“命令尚未实现”或“功能未发布”。
|
||||
|
||||
|
||||
+1
-1
@@ -107,7 +107,7 @@ dws aitable record query --base-id X --table-id Y --filters '<原 filters>' --so
|
||||
|
||||
> **singleSelect/multipleSelect 过滤**:先通过 `field get` 或 `field search-options` 将用户输入唯一解析到现有选项,filter 优先传稳定 option ID;当条件涉及 multipleSelect 或其他数组型字段时,第二个 operand 必须是 option ID/稳定 ID 数组(如 `"operands":["fldMulti",["optA"]]`),不能传裸字符串;`record create/update` 仍传 option name。不要把模糊名称或未确认的原始文本直接透传。
|
||||
>
|
||||
> **人员/部门/群组过滤**:禁止把姓名、部门名或群名直接放入 filters。必须先调用 `dws aisearch person --keyword "<姓名>" --dimension name`、`dws contact +resolve-dept --name "<部门名>"`、`dws chat +chat-search --query "<群名>" --page-all`,唯一取得 `userId`、`deptId`、`openConversationId`,再分别传 `[{"userId":"..."}]`、`[{"departmentId":"..."}]`、`[{"cid":"..."}]`。零命中或多命中必须停止并消歧。
|
||||
> **人员/部门/群组过滤**:禁止把姓名、部门名或群名直接放入 filters。必须先调用 `dws aisearch person --query "<姓名>" --dimension name`、`dws contact +resolve-dept --name "<部门名>"`、`dws chat +chat-search --query "<群名>" --page-all`,唯一取得 `userId`、`deptId`、`openConversationId`,再分别传 `[{"userId":"..."}]`、`[{"departmentId":"..."}]`、`[{"cid":"..."}]`。零命中或多命中必须停止并消歧。
|
||||
|
||||
## 减少响应体积
|
||||
|
||||
|
||||
-3
@@ -10,7 +10,6 @@
|
||||
|---|---|
|
||||
| 已有稳定成员 ID 创建话题圈 | `dws chat thread create-group --name <名称> --users <userId,...>` |
|
||||
| 发布新话题 | `dws chat thread send --conversation-id <openConversationId>` |
|
||||
| 将普通群中的已有消息升级为 Thread | `dws chat thread promote --conversation-id <openConversationId> --message-id <openMessageId>` |
|
||||
| 浏览话题主消息 | `dws chat thread list --conversation-id <openConversationId>` |
|
||||
| 向具体话题直接追加回复 | `dws chat thread reply --conversation-id <openConvThreadId>` |
|
||||
| 读取一个话题的回复 | `dws chat +thread-replies --group <openConversationId> --thread-id <openConvThreadId>` |
|
||||
@@ -24,8 +23,6 @@
|
||||
|
||||
`thread send` 的 `--conversation-id` 是承载话题的会话 `openConversationId`,用于发布新的顶层话题。
|
||||
|
||||
`thread promote` 用于把普通群中一条已经存在的消息升级为 Thread 根消息;它同时需要消息所属普通群的 `openConversationId` 和该消息的 `openMessageId`,成功后返回新的 `openConvThreadId`。单聊消息不能升级;若要发送全新的 Thread,继续使用 `thread send`。
|
||||
|
||||
`thread reply` 沿用原发送命令的 `--conversation-id`,但这里传 Thread 子会话的 `openConvThreadId`。它直接追加回复,不使用消息引用回复,也不创建新的顶层 Thread。
|
||||
|
||||
已有父会话 `openConversationId` 和 Thread `openConvThreadId` 时使用 `+thread-replies --group ... --thread-id ...`;只有主消息 ID 时用 `--message-id` 自动解析。按需加 `--page-all`、排序或资源下载。原子 `thread list-replies` 仅用于 Shortcut 未发布的底层字段或原始响应。只浏览话题主消息时使用 `thread list`。
|
||||
|
||||
@@ -26,6 +26,12 @@ metadata:
|
||||
|---|---|---|
|
||||
| `dws contact +by-mobile` | read | 按手机号查询某人的完整资料(自动解析 userId 后取详情) |
|
||||
| `dws contact +dept-members` | read | 按部门名列出部门成员(自动解析 deptId) |
|
||||
| `dws contact +friend-list` | read | 查询当前用户的好友列表 |
|
||||
| `dws contact +friend-remove` | high-risk-write | 删除指定好友 |
|
||||
| `dws contact +friend-request-accept` | write | 同意指定用户发来的好友申请 |
|
||||
| `dws contact +friend-request-list` | read | 查询当前用户收到的好友申请列表 |
|
||||
| `dws contact +friend-request-reject` | write | 删除(忽略)指定用户发来的好友申请 |
|
||||
| `dws contact +friend-request-send` | write | 向指定用户发起好友申请 |
|
||||
| `dws contact +list-dept-members` | read | 查看部门成员(仅本部门,不含下级) |
|
||||
| `dws contact +list-followings` | read | 获取当前用户的特别关注列表 |
|
||||
| `dws contact +list-role-members` | read | 查询角色下的成员列表 |
|
||||
@@ -46,6 +52,13 @@ metadata:
|
||||
| "查我自己的信息" | `dws contact user get-self` |
|
||||
| "按 userId 查详情" | `dws contact user get --ids <userId1>,<userId2>,...`(多个并行) |
|
||||
| "完整手机号反查用户" | `dws contact user search-mobile --mobile <手机号>` |
|
||||
| "按开放钉钉号ID(openDingTalkId)取 userId" | `dws contact user get-by-open-dingtalk-id --id <openDingTalkId>` |
|
||||
| "我的好友 / 好友列表 / 有哪些好友" | `dws contact +friend-list` |
|
||||
| "好友申请 / 谁加我 / pending 好友请求" | `dws contact +friend-request-list` |
|
||||
| "加好友 / 发送好友申请 / 添加某人为好友" | `dws contact +friend-request-send --to <openDingTalkId>` |
|
||||
| "同意好友申请 / 接受加好友" | `dws contact +friend-request-accept --from <openDingTalkId>` |
|
||||
| "拒绝好友申请 / 忽略好友申请" | `dws contact +friend-request-reject --from <openDingTalkId>` |
|
||||
| "删除好友 / 移除好友" | `dws contact +friend-remove --friend <openDingTalkId>`(高风险,需用户确认) |
|
||||
| "按部门名拉成员" | `python scripts/contact_dept_members.py --query "<部门名>"` |
|
||||
| "搜部门" | `dws contact dept search --query "<关键词>"` |
|
||||
| "部门成员列表" | `dws contact dept list-members --ids <deptId>` |
|
||||
@@ -102,6 +115,16 @@ metadata:
|
||||
|
||||
**禁止**:使用不存在的 `contact dept list`(已废弃/歧义)、编造 deptId/labelId、跳过 aisearch 维度直接猜上下级。
|
||||
|
||||
### SOP-5 好友关系(friend)
|
||||
|
||||
**触发**:好友列表、好友申请、加好友、同意/拒绝申请、删除好友。
|
||||
|
||||
1. **获取 openDingTalkId(必须)**:好友命令全部以 **开放钉钉号ID(openDingTalkId)** 为身份键。openDingTalkId 的来源:①好友域自身数据——`dws contact +friend-list --format json` / `dws contact +friend-request-list --format json` 返回项的 `openDingTalkId` 字段,或好友事件消息体(`user_contact_friend_request_received` 的 `src/dest_open_dingtalk_id`、`user_contact_friend_added` 的 `friend_open_dingtalk_id`);②按姓名等关键词搜人——`dws contact user search --query "<姓名>" --format json`(search_contact_by_key_word)结果同时返回 `userId` 与 `openDingTalkId`。注意:`aisearch person` 与 `contact user get-by-dingtalk-id` 只返回 userId、**取不到 openDingTalkId**;拿到 `openDingTalkId` 后如需 userId 再调 `dws contact user get-by-open-dingtalk-id --id <openDingTalkId> --format json`。
|
||||
2. **查好友(必须)**:`dws contact +friend-list --format json` 返回当前登录用户的好友名单(含昵称 nick、备注名 alias)、好友状态与分页信息;`dws contact +friend-request-list --format json` 返回收到的好友申请(含申请人昵称 nick、申请留言、状态)与 pending 数量。向用户展示列表时优先用 nick / alias 标识好友,openDingTalkId 非必要不展示;汇报申请 status 时必须翻译为中文状态(1=待接受、3=已成为好友),不要直接显示数字。
|
||||
3. **写操作(必须)**:发送申请 `dws contact +friend-request-send --to <openDingTalkId> --remark "<验证留言>" --format json`;同意 `dws contact +friend-request-accept --from <openDingTalkId> --format json`;拒绝 `dws contact +friend-request-reject --from <openDingTalkId> --format json`;删除好友 `dws contact +friend-remove --friend <openDingTalkId> --format json`(最后一条为不可逆高风险写操作,**必须先取得用户明确确认**)。
|
||||
|
||||
**禁止**:把钉钉号(dingtalkId)与开放钉钉号ID(openDingTalkId)混用;在缺少 openDingTalkId 时直接执行写操作;删除好友不确认。
|
||||
|
||||
## 高频硬约束
|
||||
|
||||
- 通讯录问题必须调用 `dws contact` 或 `dws aisearch` 获取实时结果;严禁只读 `USER.md`、环境身份或静态上下文后直接回答。
|
||||
@@ -110,6 +133,8 @@ metadata:
|
||||
- 查询直属主管/上下级时,如果 `contact user get` 没返回明确主管字段,必须继续 `dws aisearch person --query "<完整姓名或工号>" --dimension supervisor --format json`,不要停在"可能需要进一步查询"。
|
||||
- 多个同名候选时,批量 `contact user get --ids id1,id2,... --format json` 获取部门/职位后再消歧;不要默认取第一个。
|
||||
- 用户查询企业角色、角色ID、角色成员,或“管理员/财务/HR/主管”等角色类型人员时,走 `contact label list/get/list-members`;不要用 `dept list-members` 筛字段替代。
|
||||
- 好友命令(`+friend-*`)全部以 **openDingTalkId** 为身份键,不是 userId 也不是钉钉号;openDingTalkId 可从 `+friend-list` / `+friend-request-list` 响应、好友事件消息体,或 `contact user search`(按关键词搜人,同时返回 userId 与 openDingTalkId)取得;`aisearch person` / `get-by-dingtalk-id` 只返回 userId、取不到 openDingTalkId。
|
||||
- `+friend-remove` 为不可逆高风险写操作,执行前**必须**向用户展示目标 openDingTalkId 并获取明确确认;确认后才可加 `--yes`。
|
||||
|
||||
## 跨产品协作
|
||||
|
||||
|
||||
+169
-1
@@ -1,6 +1,6 @@
|
||||
# 通讯录 (contact) 命令参考
|
||||
|
||||
> **CRITICAL — 命令合法性**:contact 二级子命令包括 `user` / `dept` / `label` / `relation` / `org` / `account`。
|
||||
> **CRITICAL — 命令合法性**:contact 二级子命令包括 `user` / `dept` / `label` / `relation` / `org` / `account`;此外 contact 还提供一组 `+friend-*` shortcut(`+friend-list` / `+friend-request-list` / `+friend-request-send` / `+friend-request-accept` / `+friend-request-reject` / `+friend-remove`)用于好友关系操作。
|
||||
> 不存在 `contact search`、`contact find`、`contact list`、`contact get`、`contact user find/list`。
|
||||
> 构造命令前必须确认路径在下方「命令总览」中存在;不确定时,**根据意图对照下方「意图判断」选择正确命令**。
|
||||
>
|
||||
@@ -61,6 +61,23 @@ Flags:
|
||||
--mobile string 手机号 (必填)
|
||||
```
|
||||
|
||||
#### 按开放钉钉号ID获取用户ID
|
||||
```
|
||||
Usage:
|
||||
dws contact user get-by-open-dingtalk-id [flags]
|
||||
Aliases:
|
||||
get-by-open-dingtalk-id, get-user-by-open-dingtalk-id
|
||||
Example:
|
||||
dws contact user get-by-open-dingtalk-id --id open-dt-xxx
|
||||
dws contact user get-user-by-open-dingtalk-id --id open-dt-xxx # 别名
|
||||
Flags:
|
||||
--id string 开放钉钉号ID(openDingTalkId)(必填)
|
||||
Notes:
|
||||
- openDingTalkId 是开放平台场景下、用于标识两个 uid 关系的开放钉钉号ID,通常出现在好友事件等业务消息体中
|
||||
- openDingTalkId 与钉钉号(dingtalkId,如 zhangsan)不是同一概念;已知普通钉钉号时请使用 `contact user get-by-dingtalk-id`
|
||||
- 本命令别名必须使用 `get-user-by-open-dingtalk-id`,禁止其他变体
|
||||
```
|
||||
|
||||
#### 批量获取用户详情
|
||||
```
|
||||
Usage:
|
||||
@@ -352,6 +369,121 @@ Notes:
|
||||
- 不知道角色ID时:先 `dws contact label get --names "角色名"` 或 `dws contact label list` 获取 labelId
|
||||
```
|
||||
|
||||
### friend (好友关系 shortcut)
|
||||
|
||||
> **身份键**:好友 shortcut 全部以 **开放钉钉号ID(openDingTalkId)** 为身份键,不是 userId 也不是钉钉号(dingtalkId)。openDingTalkId 是成对编码值,仅在当前登录用户视角下有效;通常来自 `+friend-list` / `+friend-request-list` 的返回、好友事件消息体,或 `user get-by-open-dingtalk-id` 的入参。
|
||||
|
||||
#### 查询好友列表
|
||||
```
|
||||
Usage:
|
||||
dws contact +friend-list [flags]
|
||||
Example:
|
||||
dws contact +friend-list
|
||||
dws contact +friend-list --cursor 100 --size 50
|
||||
Flags:
|
||||
--cursor int 分页游标;首页不传,翻页时传上一页返回的 cursor (默认 0)
|
||||
--size int 每页数量,1-100 (默认 20)
|
||||
Returns:
|
||||
count int 当前页好友数量
|
||||
cursor int 分页游标(翻页用)
|
||||
hasMore bool 是否还有更多数据
|
||||
friends list 好友列表,每项包含:
|
||||
openDingTalkId string 好友开放钉钉号ID(后续操作必需的内部标识)
|
||||
nick string 好友昵称(可选)
|
||||
alias string 好友备注名(可选)
|
||||
remark string 好友备注信息(可选)
|
||||
status number 好友操作状态,增量同步用途(1=新增 0=删除);列表查询场景不可靠,展示时可忽略(可选)
|
||||
gmtCreate number 加好友时间,毫秒时间戳(可选)
|
||||
Notes:
|
||||
- 向用户展示列表时优先用 nick / alias 标识好友;openDingTalkId 是执行加好友/删除等操作所必需的内部标识,仅在需要操作时展示,非必要不显示
|
||||
```
|
||||
|
||||
#### 查询收到的好友申请列表
|
||||
```
|
||||
Usage:
|
||||
dws contact +friend-request-list [flags]
|
||||
Example:
|
||||
dws contact +friend-request-list
|
||||
dws contact +friend-request-list --size 50
|
||||
Flags:
|
||||
--cursor int 分页游标 (默认 0)
|
||||
--size int 每页数量,1-100 (默认 20)
|
||||
Returns:
|
||||
count int 当前页申请数量
|
||||
pendingCount number 待处理申请数量
|
||||
cursor int 分页游标
|
||||
hasMore bool 是否还有更多数据
|
||||
requests list 好友申请列表,每项包含:
|
||||
openDingTalkId string 申请人开放钉钉号ID(后续操作必需的内部标识)
|
||||
nick string 申请人昵称(可选)
|
||||
status number 申请状态:0=无关系 1=待接受 2=已发送 3=已接受(成为好友) 4=推荐 5=推荐完成 6=准备推荐 8=已过期 9=智能推荐(可选)
|
||||
remark string 申请留言(可选)
|
||||
modifyAt number 申请时间,毫秒时间戳(可选)
|
||||
isRead bool 是否已读(可选)
|
||||
Notes:
|
||||
- 查询后未读申请会被服务端标记为已读
|
||||
- 向用户汇报 status 时必须翻译为中文状态描述(如 1 → "待接受"、3 → "你们已成为好友"),不要直接显示数字
|
||||
- 向用户展示申请列表时优先用 nick 标识申请人;openDingTalkId 是同意/忽略申请所必需的内部标识,仅在需要操作时展示,非必要不显示
|
||||
```
|
||||
|
||||
#### 发送好友申请
|
||||
```
|
||||
Usage:
|
||||
dws contact +friend-request-send [flags]
|
||||
Example:
|
||||
dws contact +friend-request-send --to open-dt-alice
|
||||
dws contact +friend-request-send --to open-dt-alice --remark "我是研发部的 Bob"
|
||||
Flags:
|
||||
--to string 对方开放钉钉号ID(openDingTalkId)(必填)
|
||||
--remark string 好友申请验证留言(可选)
|
||||
--yes 跳过二次确认(可选)
|
||||
Notes:
|
||||
- 写操作:执行前需用户确认;仅在已取得明确同意后才可追加 --yes
|
||||
```
|
||||
|
||||
#### 同意好友申请
|
||||
```
|
||||
Usage:
|
||||
dws contact +friend-request-accept [flags]
|
||||
Example:
|
||||
dws contact +friend-request-accept --from open-dt-alice
|
||||
dws contact +friend-request-accept --from open-dt-alice --alias "Alice Li"
|
||||
Flags:
|
||||
--from string 申请人开放钉钉号ID(openDingTalkId)(必填)
|
||||
--alias string 同意后为该好友设置的备注名(可选)
|
||||
--yes 跳过二次确认(可选)
|
||||
Notes:
|
||||
- 写操作:执行前需用户确认;仅在已取得明确同意后才可追加 --yes
|
||||
```
|
||||
|
||||
#### 拒绝(忽略)好友申请
|
||||
```
|
||||
Usage:
|
||||
dws contact +friend-request-reject [flags]
|
||||
Example:
|
||||
dws contact +friend-request-reject --from open-dt-alice
|
||||
Flags:
|
||||
--from string 申请人开放钉钉号ID(openDingTalkId)(必填)
|
||||
--yes 跳过二次确认(可选)
|
||||
Notes:
|
||||
- 写操作:执行前需用户确认;仅在已取得明确同意后才可追加 --yes
|
||||
- 拒绝后该申请不再出现在好友申请列表中
|
||||
```
|
||||
|
||||
#### 删除好友(高风险)
|
||||
```
|
||||
Usage:
|
||||
dws contact +friend-remove [flags]
|
||||
Example:
|
||||
dws contact +friend-remove --friend open-dt-alice
|
||||
Flags:
|
||||
--friend string 要删除的好友开放钉钉号ID(openDingTalkId)(必填)
|
||||
--yes 跳过二次确认(可选)
|
||||
Notes:
|
||||
- **不可逆高风险写操作**:删除后双方不再是好友,恢复需重新发起好友申请
|
||||
- 执行前必须向用户展示目标 openDingTalkId 并取得明确确认,确认后才可追加 --yes
|
||||
```
|
||||
|
||||
### org (企业管理)
|
||||
|
||||
#### 创建企业
|
||||
@@ -433,6 +565,13 @@ Notes:
|
||||
用户说"更新企业账号/修改企业账号/改企业账号信息/改企业账号姓名/改企业账号部门/改企业账号主管/改企业账号昵称/改企业账号头像"(含"账号"且含"改/更新/修改")→ `account update`(需 userId;至少改一项)
|
||||
用户说"创建企业/新建企业/开通企业/初始化企业"(不含"账号")→ `org create`(需企业名称 + 创建者名称)
|
||||
用户说"找部门/哪个部门" → `dept search`
|
||||
用户说"我的好友 / 好友列表 / 有哪些好友 / 查好友" → `+friend-list`(好友关系,非特别关注)
|
||||
用户说"好友申请 / 谁加我 / 待处理的好友请求 / pending 好友请求" → `+friend-request-list`
|
||||
用户说"加好友 / 添加好友 / 发送好友申请 / 想加某人为好友" → `+friend-request-send --to <openDingTalkId>`(需先取得对方 openDingTalkId)
|
||||
用户说"同意好友申请 / 接受加好友 / 通过好友申请" → `+friend-request-accept --from <openDingTalkId>`
|
||||
用户说"拒绝好友申请 / 忽略好友申请 / 不同意加好友" → `+friend-request-reject --from <openDingTalkId>`
|
||||
用户说"删除好友 / 移除好友 / 解除好友关系" → `+friend-remove --friend <openDingTalkId>`(高风险,必须确认)
|
||||
用户提供开放钉钉号ID(openDingTalkId)要查 userId → `user get-by-open-dingtalk-id --id <openDingTalkId>`
|
||||
用户说"部门详情/部门信息/部门多少人" → `dept get-info`(返回部门ID、部门名称、部门人数;需 deptId,若只有部门名称需先 `dept search`)
|
||||
用户说"子部门/下设部门/部门有哪些下级部门/枚举二级部门" → `dept list-children`(需父 deptId;只有部门名先 `dept search`)
|
||||
用户说"部门有谁/部门成员/人员名单" → `dept list-members`(需 deptId;**仅本部门不含下级**,含下级先 `dept list-children` 再合并查)
|
||||
@@ -553,6 +692,27 @@ dws contact dept create --name "新产品部" --parent 12345 --create-dept-group
|
||||
|
||||
# 22. 更新部门
|
||||
dws contact dept update --dept 12345 --name "新部门名" --parent 67890 --yes --format json
|
||||
|
||||
# 23. 查询我的好友列表 — 提取好友 openDingTalkId
|
||||
dws contact +friend-list --format json
|
||||
|
||||
# 24. 查询收到的好友申请(含 pendingCount)
|
||||
dws contact +friend-request-list --format json
|
||||
|
||||
# 25. 发送好友申请
|
||||
dws contact +friend-request-send --to <openDingTalkId> --remark "我是张三" --format json
|
||||
|
||||
# 26. 同意好友申请
|
||||
dws contact +friend-request-accept --from <openDingTalkId> --format json
|
||||
|
||||
# 27. 拒绝(忽略)好友申请
|
||||
dws contact +friend-request-reject --from <openDingTalkId> --format json
|
||||
|
||||
# 28. 删除好友(不可逆,必须先确认)
|
||||
dws contact +friend-remove --friend <openDingTalkId> --yes --format json
|
||||
|
||||
# 29. 按开放钉钉号ID换取 userId
|
||||
dws contact user get-by-open-dingtalk-id --id <openDingTalkId> --format json
|
||||
```
|
||||
|
||||
## 上下文传递表
|
||||
@@ -569,6 +729,9 @@ dws contact dept update --dept 12345 --name "新部门名" --parent 67890 --yes
|
||||
| `dept search/list-children` | `deptId` | dismission search 的 --depts |
|
||||
| `label create` | `labelId` | `label list-members` 的 --id |
|
||||
| `dept create` | `deptId` | dept get-info/list-children/update 的 --dept;dept list-members 的 --ids |
|
||||
| `+friend-list` | `openDingTalkId` | +friend-remove 的 --friend;user get-by-open-dingtalk-id 的 --id |
|
||||
| `+friend-request-list` | `openDingTalkId` | +friend-request-accept / +friend-request-reject 的 --from |
|
||||
| `user get-by-open-dingtalk-id` | `userId` | user get / 其他产品的 --users/--executor |
|
||||
|
||||
## 注意事项
|
||||
|
||||
@@ -587,6 +750,11 @@ dws contact dept update --dept 12345 --name "新部门名" --parent 67890 --yes
|
||||
- `label list-members` 需要先通过 `label list` 或 `label get` 获取 labelId,再用 --id 查询角色下的成员
|
||||
- `user update-self` 用于更新当前用户自己的昵称/头像;头像 fileId 需先上传头像到钉盘获取
|
||||
- `account update` 用于更新企业账号用户信息;`--depts` 为 JSON 数组格式,头像 fileId 需先上传钉盘获取
|
||||
- 好友命令(`+friend-*`)的身份键是 **openDingTalkId(开放钉钉号ID)**,与 userId、钉钉号(dingtalkId)均不同;openDingTalkId 可从 `+friend-list` / `+friend-request-list` 响应的 `openDingTalkId` 字段、好友事件消息体,或 `user search`(按关键词搜人,结果同时返回 userId 与 openDingTalkId)取得,`aisearch person` / `user get-by-dingtalk-id` 只返回 userId、取不到 openDingTalkId;拿到 openDingTalkId 后可用 `user get-by-open-dingtalk-id` 反查 userId
|
||||
- `+friend-list` 与 `+friend-request-list` 支持分页:翻页时把上一页返回的 `cursor` 传入 `--cursor`(或从统一 envelope 的 `meta.pagination.next_token` 取);`hasMore=true` 表示还有下一页
|
||||
- `+friend-request-list` 查询后未读申请会被标记为已读,属正常副作用
|
||||
- `+friend-remove` 不可逆:删除后需重新发起好友申请才可恢复,执行前必须确认
|
||||
- 好友 ≠ 特别关注:特别关注(星标)列表走 `relation list-my-followings`,好友关系走 `+friend-list`,两者互不包含,禁止互路由
|
||||
|
||||
## 自动化脚本
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: dingtalk-doc
|
||||
description: 钉钉在线文字文档(adoc)内容:查找、创建、读取编辑、块、评论、媒体/附件、白板卡片容器、导入导出、版本、模板、权限、分享及 Markdown/JSONML。不做白板图形/原生 .md/电子表格(dingtalk-misc)、文档空间与钉盘存储(dingtalk-drive)、知识库组织(dingtalk-wiki)、AI 表格(dingtalk-aitable)。命令前缀:dws doc。
|
||||
description: 钉钉在线文档(adoc):查找、读写、块、评论、附件、导入导出、版本、模板、权限、分享、Markdown/JSONML;文档内白板卡片容器的插入、定位、删除。白板图形内容创建或修改走 dingtalk-misc。
|
||||
metadata:
|
||||
cli_version: ">=0.2.14"
|
||||
category: product
|
||||
@@ -105,6 +105,7 @@ Golden Route 已给出命令且参数足够时,禁止读取 reference;其余
|
||||
|
||||
## 产品边界
|
||||
|
||||
- 白板创建/绘图/修改 → [白板](../dingtalk-misc/references/whiteboard.md)(`dws whiteboard`);`dws doc whiteboard` 仅操作文档内卡片容器,不改图形。
|
||||
- 姓名/工号/部门/职责找人或解析 userId → `dingtalk-aisearch`;已有完整 userId 补详情才用 `dingtalk-contact`
|
||||
- 普通文件/目录存储与上传下载 → `dingtalk-drive`;保留原文件进入明确知识库可用 `drive +upload --workspace`;“放进/附到这篇文档”是正文附件 → `doc +media-insert`;在线转换 → `doc +import`
|
||||
- 文档节点复制、移动、模板另存 → `dingtalk-drive +copy/+move`;doc 同名命令仅兼容
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: dingtalk-event
|
||||
description: 钉钉个人 IM、OA 审批、VoIP 通话邀请、待办与互动卡片回调事件长连接监听。Use when 用户说监听消息/@我/某人/某群/全部消息、已读/撤回/reaction、群成员加入/群成员退出/群状态变化,监听审批任务创建/完成/转交、审批实例发起/抄送/终止/完成、VoIP 通话邀请、待办创建/更新/删除,或互动卡片回调。命令前缀:dws event。
|
||||
description: 钉钉个人 IM、OA 审批、VoIP 通话邀请、待办、互动卡片与好友事件长连接监听。Use when 用户说监听消息/@我/某人/某群/全部消息、已读/撤回/reaction、群成员加入/群成员退出,监听审批任务创建/完成/转交、审批实例发起/抄送/终止/完成、VoIP 通话邀请、待办创建/更新/删除、好友申请/好友添加成功,或互动卡片回调。命令前缀:dws event。
|
||||
metadata:
|
||||
cli_version: ">=0.2.14"
|
||||
category: product
|
||||
@@ -9,15 +9,14 @@ metadata:
|
||||
- dws
|
||||
---
|
||||
|
||||
# 钉钉个人 IM、OA 审批、VoIP、待办与互动卡片事件
|
||||
# 钉钉个人 IM、OA 审批、VoIP、待办、互动卡片与好友事件
|
||||
|
||||
> **前置:执行 `dws` 前必须完整读取 [`dingtalk-shared`](../dingtalk-shared/SKILL.md)。**Shared references 仅按需加载。
|
||||
|
||||
本 Skill 只负责实时个人事件;发送/历史消息、审批处理、待办操作分别走 `dingtalk-chat`、`dingtalk-misc`、`dingtalk-todo`。IM 优先 `+listen-im`;OA、VoIP、Todo、互动卡片使用 `event consume`,不用列表轮询模拟事件。
|
||||
本 Skill 只负责实时个人事件;发送/历史消息、审批处理、待办操作分别走 `dingtalk-chat`、`dingtalk-misc`、`dingtalk-todo`。
|
||||
|
||||
<!-- dws-intent: event.listen.im -->消息、reaction、已读和撤回的默认监听入口是 `dws event +listen-im`;
|
||||
只有群生命周期、Filter DSL、原始 envelope 或底层订阅控制才使用
|
||||
`event consume` fallback。
|
||||
只有群生命周期、Filter DSL、原始 envelope 或底层订阅控制才使用 `event consume`。
|
||||
|
||||
<!-- dws-intent: event.listen.oa -->OA 审批任务与审批实例的实时变化使用 `dws event consume`;查询或操作已有审批走 `dws oa`,不要用轮询模拟事件。
|
||||
|
||||
@@ -31,14 +30,16 @@ metadata:
|
||||
| 监听某人发来的消息 | `dws event +listen-im --kind sender --user-query <姓名>` |
|
||||
| 监听指定群消息 | `dws event +listen-im --kind group --chat-query <群名>` |
|
||||
| 同一人/群的消息、表情、已读或撤回 | `dws event +listen-im --kind <sender|group> --events message,reaction,read,recall ...` |
|
||||
| 监听全部单聊或全部群消息 | `dws event +listen-im --kind <all-direct|all-group>`;只有用户明确要求“全部”时使用 |
|
||||
| 群改名、成员进退、群解散 | 读取 [EventKey 索引](references/event-im-keys.md),使用精确 `event consume` EventKey |
|
||||
| 监听全部单聊或全部群消息 | `dws event +listen-im --kind <all-direct|all-group>`(`user_im_message_receive_o2o_all`/`user_im_message_receive_group_all`);只有用户明确要求“全部”时使用 |
|
||||
| 群改名、成员进退、群解散 | EventKey 为 `user_im_group_updated`、`user_im_group_member_added`、`user_im_group_member_exited`、`user_im_group_disbanded`,读取 [EventKey 索引](references/event-im-keys.md) |
|
||||
| OA 审批任务或实例事件 | 读取 [OA 事件参考](references/event-oa.md),使用精确 `event consume` EventKey |
|
||||
| 查看 OA 事件目录 | `dws event list --category oa` |
|
||||
| VoIP 通话邀请 | 读取 [VoIP 事件参考](references/event-voip.md),使用精确 `event consume` EventKey |
|
||||
| 待办创建、更新或删除事件 | 读取 [Todo 事件参考](references/event-todo.md),使用精确 `event consume` EventKey 与 `--role-types` |
|
||||
| 查看 Todo 事件目录 | `dws event list --category todo` |
|
||||
| 互动卡片回调 | 读取 [互动卡片事件参考](references/event-card.md),使用 `dws event consume user_card_action_triggered --flatten -f ndjson` |
|
||||
| 好友申请/好友添加成功事件 | 读取 [好友事件参考](references/event-contact.md),使用精确 `event consume` EventKey |
|
||||
| 查看好友事件目录 | `dws event list --category contact` |
|
||||
| 互动卡片回调 | 读取 [互动卡片事件参考](references/event-card.md);命令与字段见下方卡片契约 |
|
||||
| 查看互动卡片事件目录 | `dws event list --category card` |
|
||||
| 已知 EventKey 或需要底层订阅控制 | `dws event consume`;参数与约束以 leaf Schema 为准 |
|
||||
| 查看状态 / 停止 | `dws event status` / `dws event stop <subscribe_id> --dry-run`,确认后再 `--yes` |
|
||||
@@ -50,37 +51,39 @@ metadata:
|
||||
- `group` 必须且只能传 `--chat-id` 或 `--chat-query` 之一。
|
||||
- `--query` 只用于纯 `message` 监听;混入 reaction/read/recall 时不得使用。
|
||||
|
||||
OA 七个 EventKey 使用 `ruleType=all`、`filterRule={}`,不接受目标或消息过滤;Todo 三个 EventKey 仅接受 `--role-types creator,executor,participant`,省略时取并集。每项独立订阅并共享 bus。
|
||||
OA 七个 EventKey 使用 `ruleType=all`、`filterRule={}`,不接受目标或消息过滤;Todo 三个 EventKey 仅接受 `--role-types creator,executor,participant`,省略时取并集;好友两个 EventKey 约束同 OA。每项独立订阅并共享 bus。
|
||||
|
||||
<!-- dws-intent: event.listen.card -->互动卡片使用 `dws event consume user_card_action_triggered --flatten -f ndjson`、`ruleType=all`、`filterRule={}`;不接受目标、角色或消息过滤。结构化上下文在 `payload.body.actionData.context`,未知字段保留。
|
||||
<!-- dws-intent: event.listen.card -->互动卡片使用 `dws event consume user_card_action_triggered --flatten -f ndjson`、`ruleType=all`、`filterRule={}`;不接受目标、角色或消息过滤。结构化上下文在 `payload.body.actionData.context`:`questions[].id` 关联 `answers[question_id]` 读 `selected`,未知字段保留。
|
||||
|
||||
姓名/群名必须唯一解析,零命中或多候选在创建订阅前停止。解析、监听、状态、停止使用同一 `--profile`,不得跨组织搬运 ID;`--dry-run` 走同一解析链。
|
||||
<!-- dws-intent: event.listen.contact -->好友申请/好友添加成功事件使用 `dws event consume`;查询或操作好友关系走 `dws contact`,不要轮询模拟事件。
|
||||
|
||||
姓名/群名必须唯一解析,零命中或多候选在创建订阅前停止。解析、监听、状态、停止使用同一 `--profile`,不得跨组织搬运 ID。
|
||||
|
||||
### EventKey 索引
|
||||
|
||||
16 个 EventKey 及目标约束见 [索引](references/event-im-keys.md),含 `user_im_message_receive_o2o_all`、`user_im_message_receive_group_all`、`user_im_group_updated`、`user_im_group_member_added`、`user_im_group_member_exited`、`user_im_group_disbanded`;群输出可含 `operator_open_dingtalk_id`、`members[].open_dingtalk_id`。其它类别见下方 Reference。
|
||||
16 个 EventKey 及目标约束见 [索引](references/event-im-keys.md);群输出可含 `operator_open_dingtalk_id`、`members[].open_dingtalk_id`。
|
||||
|
||||
## 运行与结果契约
|
||||
|
||||
- 正常消费使用当前用户 OAuth、`--flatten` 和 NDJSON;stdout 仅事件,stderr 为生命周期状态。
|
||||
- 单事件 ready:`[event] ready event_key=<key> bus_pid=<pid> subscribe_id=<id>`。
|
||||
- 多事件先逐条输出 subscription,全部就绪后输出 `[event] ready event_count=<n> bus_pid=<pid>`。必须等待 ready,不用 `sleep` 猜测。
|
||||
- 有界任务用 `--max-events N`/`--duration 10m`;干净退出会取消本次新建订阅。无界任务由宿主管理并持续读 stdout;用 SIGTERM 或受控 stdin/bounded exit,不用 `kill -9`。
|
||||
- 多事件先逐条输出 subscription,全部就绪后输出 `[event] ready event_count=<n> bus_pid=<pid>`。等 ready,不用 `sleep` 猜测。
|
||||
- 有界任务用 `--max-events N`/`--duration 10m`;干净退出会取消本次新建订阅。无界任务由宿主持续读 stdout;用 SIGTERM 或 bounded exit,不用 `kill -9`。
|
||||
- 自发消息会被 self-loop 过滤。回复时把真实 `conversation_id`/`sender_open_dingtalk_id` 交给 `dws chat +messages-send`,不从显示名猜 ID。
|
||||
- 扁平消息/动作字段按事件类型读取:已读为 `reader_open_dingtalk_id`,撤回为 `recaller_open_dingtalk_id`,回应为 `reaction_name`、`operation_type`。媒体优先通过聊天读取命令加 `--download-resources`;已知消息 ID 的底层降级入口是 `dws chat message download-media`。
|
||||
- 扁平消息/动作字段按事件类型读取:已读为 `reader_open_dingtalk_id`,撤回为 `recaller_open_dingtalk_id`,回应为 `reaction_name`、`operation_type`。媒体优先通过聊天读取命令加 `--download-resources`,已知消息 ID 用 `dws chat message download-media`。
|
||||
- OA 扁平事件提供审批实例、任务和状态字段;字段差异、原始回退条件及与 OA 命令的稳定 ID 交接以 [OA 事件参考](references/event-oa.md) 为准。
|
||||
- Todo 扁平事件提供 `task_id`、标题、角色、状态阶段和时间字段;用真实 `task_id` 交给 `dws todo`,字段差异见 [Todo 事件参考](references/event-todo.md)。
|
||||
- 互动卡片输出 `type/event_id/timestamp/subscribe_id/payload`。在 `payload.body.actionData.context` 用 `questions[].id` 关联 `answers[question_id]`,按选项 ID 读 `selected`;空数组合法。操作者是 `operatorDTO.uid`;分别保留 `timestamp`、`event_time`、`triggerTimestamp`。其它字段与回退见 [互动卡片参考](references/event-card.md)。
|
||||
- 互动卡片输出 `type/event_id/timestamp/subscribe_id/payload`;操作者 `operatorDTO.uid`,`triggerTimestamp` 等三个时间戳照原样保留;回退见 [互动卡片参考](references/event-card.md)。
|
||||
|
||||
## 安全与失败处理
|
||||
|
||||
开源 normal 获取缺失 AppKey,无需 AppSecret;custom/定制版除外。[排障](references/event-im-operations.md)。
|
||||
|
||||
- `event stop` 会取消订阅并影响本地 consumer:先 `--dry-run`,用户确认后再加 `--yes`。
|
||||
- `event stop` 取消订阅并影响本地 consumer:先 `--dry-run`,确认后 `--yes`。
|
||||
- 多事件属于一次原始操作;任一订阅启动失败时 Runtime 回滚本次已创建项,不拆成新命令绕过重试预算。
|
||||
- 全部 28 个公开个人 EventKey(16 IM + 7 OA + 1 VoIP + 3 Todo + 1 卡片)遵循 Agent/host `0/2/1`:`retryable=false`→`max_additional_attempts=0`,`retryable=true`→`max_additional_attempts=2`,`retryable=unknown`→`max_additional_attempts=1`。它不是 CLI 持久化硬总次数上限;进程内不会自动重试,CLI 不持久化或计算跨调用的 Agent/host 尝试次数。
|
||||
- 全部 30 个公开个人 EventKey(16 IM + 7 OA + 1 VoIP + 3 Todo + 1 卡片 + 2 好友)遵循 Agent/host `0/2/1`:`retryable=false`→`max_additional_attempts=0`;`retryable=true`→`max_additional_attempts=2`;`retryable=unknown`→`max_additional_attempts=1`。它不是 CLI 持久化硬总次数上限;进程内不会自动重试,也不持久化或计算跨调用的 Agent/host 尝试次数。
|
||||
- 遵守 `retry_after_seconds`/`next_retry_at`;`in_flight`、`cooldown`、`terminal_hold` 时不并发或换 `subscribe_id`/`trace_id` 绕过。
|
||||
- 认证、profile、订阅保护状态和 bus 排障按失败类型读取 [订阅运维](references/event-im-operations.md),不要在正常路径预加载完整运维手册。
|
||||
- 认证、profile、订阅保护状态和 bus 排障按失败类型读取 [订阅运维](references/event-im-operations.md)。
|
||||
|
||||
### 本地订阅保护
|
||||
|
||||
@@ -89,20 +92,21 @@ OA 七个 EventKey 使用 `ruleType=all`、`filterRule={}`,不接受目标或
|
||||
## 何时查询 Schema
|
||||
|
||||
- 已知 Golden Route 时直接执行,不先跑 `event list`。
|
||||
- 只有解析业务字段时才用 `dws event schema <event_key> --flatten`。
|
||||
- 只有参数或安全不确定时才用 `dws schema --cli-path "event +listen-im" --compact` 或对应 compact leaf。
|
||||
- 解析业务字段时用 `dws event schema <event_key> --flatten`。
|
||||
- 参数或安全不确定时用 `dws schema --cli-path "event +listen-im" --compact` 或对应 compact leaf。
|
||||
- `event schema` 描述事件 payload;顶层 `dws schema` 描述 CLI 命令,两者不要混用。
|
||||
|
||||
## Reference
|
||||
|
||||
| Topic | Reference | 何时读取 |
|
||||
|---|---|---|
|
||||
| 任务索引 | [event-im.md](references/event-im.md) | 还不能判断应该加载哪一个子 reference |
|
||||
| 任务索引 | [event-im.md](references/event-im.md) | 不确定加载哪个 reference |
|
||||
| EventKey、目标规则与底层 consume | [event-im-keys.md](references/event-im-keys.md) | 群生命周期、显式 EventKey 或多事件组合 |
|
||||
| ready、bounded consume 与退出清理 | [event-im-lifecycle.md](references/event-im-lifecycle.md) | 启动/托管/关闭 consumer |
|
||||
| 扁平字段与事件到 Chat 交接 | [event-im-output.md](references/event-im-output.md) | 解析事件或自动回复 |
|
||||
| Filter、status/stop、重试与排障 | [event-im-operations.md](references/event-im-operations.md) | 订阅控制或失败恢复 |
|
||||
| OA 审批事件 | [event-oa.md](references/event-oa.md) | 选择七个 OA EventKey、组合消费或解析审批字段 |
|
||||
| VoIP 通话邀请事件 | [event-voip.md](references/event-voip.md) | 选择 VoIP EventKey、解析邀请字段或检查敏感输出边界 |
|
||||
| Todo 待办事件 | [event-todo.md](references/event-todo.md) | 选择三个 Todo EventKey、设置角色范围或解析待办字段 |
|
||||
| 互动卡片回调事件 | [event-card.md](references/event-card.md) | 订阅互动卡片回调、解析开放 payload 或检查空过滤规则 |
|
||||
| OA 审批事件 | [event-oa.md](references/event-oa.md) | 七个 OA EventKey 与审批字段解析 |
|
||||
| VoIP 通话邀请事件 | [event-voip.md](references/event-voip.md) | VoIP EventKey 与邀请字段、敏感输出边界 |
|
||||
| Todo 待办事件 | [event-todo.md](references/event-todo.md) | Todo EventKey、角色范围与待办字段 |
|
||||
| 好友事件 | [event-contact.md](references/event-contact.md) | 好友 EventKey、申请与添加字段解析 |
|
||||
| 互动卡片回调事件 | [event-card.md](references/event-card.md) | 回调订阅与 payload 解析 |
|
||||
+91
@@ -0,0 +1,91 @@
|
||||
# 好友事件
|
||||
|
||||
先读事件产品入口 [SKILL.md](../SKILL.md) 的命令规则、调用流和子进程契约。本参考覆盖当前公开的两个好友个人事件:收到好友申请、好友添加成功。
|
||||
|
||||
<!-- dws-intent: event.listen.contact -->实时监听好友事件必须使用 `dws event consume` 长连接,不要轮询好友列表或好友申请列表来模拟事件。
|
||||
|
||||
## Prerequisite
|
||||
|
||||
好友个人事件使用当前用户 OAuth 登录态。未登录或 token 失效时,先执行:
|
||||
|
||||
```bash
|
||||
dws auth login
|
||||
```
|
||||
|
||||
非默认组织使用全局 `--profile <corpId 或 profile 名>`。事件范围始终是该 OAuth 用户相关的好友事件,不需要也不接受目标用户、组织或消息过滤参数。
|
||||
|
||||
## Event catalog
|
||||
|
||||
| 事件码 | 订阅规则 | 接收语义 | 必填参数 |
|
||||
|---|---|---|---|
|
||||
| `user_contact_friend_request_received` | `all` | 当前用户收到好友申请 | 无 |
|
||||
| `user_contact_friend_added` | `all` | 当前用户与目标用户建立好友关系 | 无 |
|
||||
|
||||
只承认上表 2 个好友事件码。CLI 为每个事件发送 `ruleType=all`、`filterRule={}` 的独立订阅请求;不要添加 `--user`、`--open-dingtalk-id`、`--group`、`--query`、`--role-types` 或 `--filter-json`。
|
||||
|
||||
## Intent mapping
|
||||
|
||||
| 用户说 | 下一步 |
|
||||
|---|---|
|
||||
| “收到好友申请时通知我” | `dws event consume user_contact_friend_request_received --flatten -f ndjson` |
|
||||
| “有人加我好友时通知我” | `dws event consume user_contact_friend_request_received --flatten -f ndjson` |
|
||||
| “好友添加成功时通知我” | `dws event consume user_contact_friend_added --flatten -f ndjson` |
|
||||
| “同时监听全部好友事件” | 一个 consume 放入两个好友 event key,不加目标或过滤参数 |
|
||||
| “查看好友事件目录” | `dws event list --category contact` |
|
||||
| “查看好友事件输出字段” | 对对应事件运行 `dws event schema <event_key> --flatten` |
|
||||
|
||||
## Commands
|
||||
|
||||
查看稳定的扁平输出 schema:
|
||||
|
||||
```bash
|
||||
dws event schema user_contact_friend_request_received --flatten
|
||||
dws event schema user_contact_friend_added --flatten
|
||||
```
|
||||
|
||||
单独监听一种事件:
|
||||
|
||||
```bash
|
||||
dws event consume user_contact_friend_request_received --flatten -f ndjson
|
||||
dws event consume user_contact_friend_added --flatten -f ndjson
|
||||
```
|
||||
|
||||
同时监听两种事件:
|
||||
|
||||
```bash
|
||||
dws event consume \
|
||||
user_contact_friend_request_received \
|
||||
user_contact_friend_added \
|
||||
--flatten \
|
||||
-f ndjson
|
||||
```
|
||||
|
||||
多事件 consume 会为两个 event key 分别创建订阅和逻辑 consumer,并共享当前组织的 personal bus、远程连接、stdout 和生命周期。不要给好友事件命令加 `--query` 或 `--filter-json`。
|
||||
|
||||
## Output contract
|
||||
|
||||
`--flatten` 模式的两个好友事件都包含以下顶层字段:
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "user_contact_friend_request_received",
|
||||
"event_id": "...",
|
||||
"timestamp": 0,
|
||||
"subscribe_id": "..."
|
||||
}
|
||||
```
|
||||
|
||||
- `type` 是当前 event key;`event_id` 可用于去重;`timestamp` 是 transport 事件发生时间;`subscribe_id` 标识对应的独立订阅。
|
||||
- 收到好友申请事件额外提供 `src_open_dingtalk_id`、`src_name`、`dest_open_dingtalk_id`、`remark`、`source`、`biz_type`、`apply_time`。
|
||||
- 好友添加成功事件额外提供 `friend_open_dingtalk_id`、`friend_name`、`establish_time`、`direction`。
|
||||
- `direction` 表示当前用户视角:`active` 表示当前用户主动添加对方,`passive` 表示对方主动添加当前用户。
|
||||
- `apply_time`、`establish_time` 是毫秒时间戳。
|
||||
- 服务端 payload 缺失、为空或无法解析时,consume 会在 stderr 记录 warning,并把原始 transport envelope 写到 stdout,保证事件不被静默丢弃。
|
||||
- 不传 `--flatten` 时保持兼容 transport envelope,业务 payload 位于 `.data | fromjson`。需要联调完整原始协议时使用不带 `--flatten` 的 `-f raw` 或 `--debug-raw-events`。
|
||||
|
||||
## Lifecycle
|
||||
|
||||
- 单事件等待 `[event] ready event_key=<key> bus_pid=<pid> subscribe_id=<id>`。
|
||||
- 两事件先保存两条 `[event] subscription event_key=<key> subscribe_id=<id>`,再等待 `[event] ready event_count=2 bus_pid=<pid>`。
|
||||
- 临时验证使用 `--max-events 1` 或 `--duration 10m`;任务完成后优雅结束 consume,本次新建的订阅会自动取消。
|
||||
- 外部停止已有订阅时先运行 `dws event stop <subscribe_id> --dry-run`,确认后再加 `--yes`。不要 `kill -9`,否则会跳过自动退订。
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: dingtalk-misc
|
||||
description: 长尾产品集合技能,覆盖低频钉钉产品:OA审批查询与处理/法务智能合同/考勤/直播/DING紧急消息/开放平台应用与MCP开发/Agoal目标管理/日志日报周报/电子表格/开放平台文档搜索与OpenAPI逃生舱/独立及文档内嵌白板/钉钉招聘/DWS技能市场安装/组织大脑Hrbrain/原生Markdown/原生HTML/PAT行为授权/多组织profile。Use when 用户提到上述任一产品,尤其是 Agoal/目标管理/战略解码/经营合约及字段配置/计分卡/OKR/目标规则与周期/个人目标/目标模板/周月报规则提交统计/按时/迟交/未提交/跟催,或查询/创建合同台账、批量导入合同、按听记起草合同、归档合同、管理合同项目/相对方/账款,或查待审批/同意拒绝转交撤销审批/打卡/排班/日报周报内容填报/独立白板带内容创建/白板节点读写/单元格读写/招聘职位/JD/创建职位/搜索安装技能/开发者后台应用/企业内部应用/查应用状态或能否删除/应用管理成员及角色汇总/应用版本历史/企业内部应用机器人配置、消息模式或在线状态/本机机器人连接器/Stream连接/MCP服务或工具/发布或调试MCP/获取或调用已发布MCP/把OpenAPI、Swagger、Postman、curl或HTTP接口做成MCP或给Agent使用/未封装OpenAPI/llms.txt/dws api/人才池/员工档案/职业历程/绩效/原生.md文件/Markdown版本比较/本地草稿diff/Markdown评论/原生.html文件/新建HTML页面/PAT授权/切换组织/跨组织/profile 等相关操作。周报/月报内容填报属于 report;规则级按时、迟交、未提交统计与人员跟催属于 Agoal;带审批人、抄送人或审批流的日报、周报、简报提交属于 OA 审批。未来审批任务或实例变化的实时监听不属于本 skill,应使用 dingtalk-event。命中后由本 skill 的「产品索引表」定位具体子产品和命令前缀,再按对应子产品说明执行。
|
||||
description: 钉钉独立白板(白板文件)的创建、绘图、保存和修改;文档内嵌白板仅在已有承载文档 nodeId 和 partId 时提供图形内容读写(dws whiteboard)。两类目标相互独立,不互相推断或切换;文档内白板卡片容器不属于本 skill。长尾产品集合技能,覆盖低频钉钉产品:OA审批查询与处理/法务智能合同/考勤/直播/DING紧急消息/开放平台应用与MCP开发/Agoal目标管理/日志日报周报/电子表格/开放平台文档搜索与OpenAPI逃生舱/DWS技能市场安装/组织大脑Hrbrain/原生Markdown/原生HTML/PAT行为授权/多组织profile。Use when 用户提到上述任一产品,尤其是 Agoal/目标管理/战略解码/经营合约及字段配置/计分卡/OKR/目标规则与周期/个人目标/目标模板/周月报规则提交统计/按时/迟交/未提交/跟催,或查询/创建合同台账、批量导入合同、按听记起草合同、归档合同、管理合同项目/相对方/账款,或查待审批/同意拒绝转交撤销审批/打卡/排班/日报周报内容填报/独立白板带内容创建/独立白板节点读写/已有 nodeId 和 partId 的文档内嵌白板图形内容读写/单元格读写/搜索安装技能/开发者后台应用/企业内部应用/查应用状态或能否删除/应用管理成员及角色汇总/应用版本历史/企业内部应用机器人配置、消息模式或在线状态/本机机器人连接器/Stream连接/MCP服务或工具/发布或调试MCP/获取或调用已发布MCP/把OpenAPI、Swagger、Postman、curl或HTTP接口做成MCP或给Agent使用/未封装OpenAPI/llms.txt/dws api/人才池/员工档案/职业历程/绩效/原生.md文件/Markdown版本比较/本地草稿diff/Markdown评论/原生.html文件/新建HTML页面/PAT授权/切换组织/跨组织/profile 等相关操作。周报/月报内容填报属于 report;规则级按时、迟交、未提交统计与人员跟催属于 Agoal;带审批人、抄送人或审批流的日报、周报、简报提交属于 OA 审批。未来审批任务或实例变化的实时监听不属于本 skill,应使用 dingtalk-event。命中后由本 skill 的「产品索引表」定位具体子产品和命令前缀,再按对应子产品说明执行。
|
||||
metadata:
|
||||
cli_version: ">=1.0.61"
|
||||
category: product
|
||||
@@ -13,12 +13,14 @@ metadata:
|
||||
|
||||
## 执行前路由
|
||||
|
||||
本文件只负责产品路由。先由下表确定唯一产品:单一、清晰的 Attendance、Report、Sheet 或 Dev 任务直接读取对应 reference(内含该任务所需的最小执行契约);其它产品先读取 [`dingtalk-shared`](../dingtalk-shared/SKILL.md),再读取唯一产品 reference。仅在实际触发认证、profile、确认或错误恢复时补读一份精确 shared reference,不做冷启动预读。
|
||||
本文件只负责产品路由。先由下表确定唯一产品:单一、清晰的 Whiteboard、Attendance、Report、Sheet 或 Dev 任务直接读取对应 reference(内含该任务所需的最小执行契约);其它产品先读取 [`dingtalk-shared`](../dingtalk-shared/SKILL.md),再读取唯一产品 reference。仅在实际触发认证、profile、确认或错误恢复时补读一份精确 shared reference,不做冷启动预读。
|
||||
|
||||
同一请求同时出现日报、周报或简报名称与审批人、抄送人、审批路径、审批单等审批意图时,审批意图优先,统一路由 OA 并读取 `oa.md`;本次任务不得执行 `dws report`。OA 中没有同名模板也不能降级提交 Report,只能交付 OA 搜索结果或请求消歧。只有用户明确要求提交钉钉日志,且没有审批流语义时,才路由 Report。
|
||||
|
||||
Attendance 任务直接按产品索引读取一份最匹配的 `attendance*.md`,不要重复预读 `dingtalk-shared`。只有出现跨产品编排、profile/认证问题、未知全局错误或 Reference 明确指向 shared 时,才按需读取 shared 对应内容。
|
||||
|
||||
用户明确要求创建或操作白板文件、独立白板时,直接读取 [whiteboard.md](references/whiteboard.md),无需先读 Doc 或 shared 路由。课表、日历、流程图等是内容形态,不能据此把文档内嵌目标改成独立白板。文档内嵌白板的卡片容器操作走 `dingtalk-doc`;只有已有承载文档 `nodeId` 和 `partId` 的图形内容操作才读取 whiteboard reference。缺少任一身份时停止并补齐,禁止转成独立白板。
|
||||
|
||||
## 产品索引表
|
||||
|
||||
| 触发关键词 | 一句话范围 | 命令前缀 | 详细参考 |
|
||||
@@ -35,8 +37,8 @@ Attendance 任务直接按产品索引读取一份最匹配的 `attendance*.md`
|
||||
| 电子表格 / 工作表 / 单元格读写 / 公式 / 超链接 / 浮动图片 | 电子表格创建/读写/公式/超链接/浮动图片/导出 | `dws sheet` | [sheet.md](references/sheet.md) |
|
||||
| 开放平台文档 / API文档 / 接口文档 / 接口报错 | 开放平台开发文档搜索 | `dws devdoc` | [devdoc.md](references/devdoc.md) |
|
||||
| 未封装 OpenAPI / llms.txt / dws api / Raw API / API 逃生舱 | 官方 llms.txt 分层发现,仅对企业内部应用 App Token 服务端 API 生成并确认 Raw 调用 | `dws api` | [openapi-explorer.md](references/openapi-explorer.md) |
|
||||
| 白板 / 独立白板 / 文档内嵌白板 / 画布 / OpenNodes / 白板节点 / SVG 预渲染 | 带内容创建、本地 SVG 预渲染、读取、写前 diff 预览和更新独立或文档内嵌白板;没有 `partId` 时默认独立白板 | `dws whiteboard` | [whiteboard.md](references/whiteboard.md) |
|
||||
| 招聘 / 职位 / JD / 在招职位 / 创建职位 / 职位详情 | 钉钉招聘职位的查询、详情与创建 | `dws recruit` | [recruit.md](references/recruit.md) |
|
||||
| 白板文件 / 独立白板 / 保存到白板 / 画布 / OpenNodes / 白板节点 / SVG 预渲染 | 独立白板的带内容创建、本地 SVG 预渲染、读取、写前 diff 预览和更新 | `dws whiteboard` | [whiteboard.md](references/whiteboard.md) |
|
||||
| 已有承载文档 nodeId 和 partId 的文档内嵌白板图形内容 | 只读写该 part 内的图形内容;卡片容器插入、定位、删除走 `dingtalk-doc`;身份缺失时停止,禁止改成独立白板 | `dws whiteboard --node ... --part-id ...` | [whiteboard.md](references/whiteboard.md) |
|
||||
| 搜索技能 / 找技能 / 安装技能 / 技能市场 / 安装 DWS mono 或 multi skill | DWS 技能市场搜索、下载、安装与内置技能部署 | `dws skill` | [skill.md](references/skill.md) |
|
||||
| 人才池 / 储备干部池 / 员工档案 / 职业历程 / 绩效记录 / 员工标签 / 组织大脑 / 人才搜索 | 组织大脑:人才池、员工档案专项模块与结构化人才搜索 | `dws hrbrain` | [hrbrain.md](references/hrbrain.md) |
|
||||
| 原生 Markdown / `.md` 原文 / Markdown 版本比较 / 本地草稿 diff / 覆盖 Markdown / 局部替换 Markdown / Markdown 评论 | 原生 `.md` 文件读取、创建、版本或草稿对比、全量覆盖、局部替换与评论列表 | `dws markdown` | [markdown.md](references/markdown.md) |
|
||||
@@ -68,4 +70,4 @@ Attendance 任务直接按产品索引读取一份最匹配的 `attendance*.md`
|
||||
|
||||
Agent 使用 OpenNodes 带内容创建白板时,必须先执行 `whiteboard render`,展示 SVG 和渲染提示后停止,等待用户明确确认当前版本才能创建;修改后重新渲染和确认。不得跳过预览直接创建,最初的创建请求及创建后回读不能替代预览确认。详见白板入口的创建流程;空白创建、直接套用模板和已有白板更新不由此规则扩展。
|
||||
|
||||
Agent 更新已有白板内容(追加、修改、删除、清空)必须先执行 `whiteboard +diff`,展示差异和风险后停止,等待用户明确确认当前差异,再用同一 sourceDigest 执行 `+update`;diff 失败或有 blocker 时不得写入。不得换原子 update 绕过,render、dry-run 和写后回读不能替代 diff。详见白板入口的更新流程。
|
||||
Agent 更新已有白板内容(追加、修改、删除、清空)必须先执行 `whiteboard +diff`,展示差异和风险后停止,等待用户明确确认当前差异,再用同一 sourceDigest 执行 `+update`;diff 失败或有 blocker 时不得写入。不得换原子 update 绕过,render、dry-run 和写后回读不能替代 diff。详见白板入口的更新流程。更新只设一个用户确认点:先完成所需的 render 和必需的 +diff,再把视觉预览(如有)、差异与覆盖影响一起展示并一次确认;不要在 render 后先索要确认、获准后才补做 diff 再次询问。同一目标、revision、source 和模式已获确认后,直接提交;只有这些内容变化或出现未披露的实质风险才重新确认。
|
||||
@@ -1,90 +0,0 @@
|
||||
# 钉钉招聘
|
||||
|
||||
`dws recruit` 查询和创建钉钉招聘职位。当前公开命令只覆盖职位列表、职位详情和
|
||||
职位创建;候选人、面试、Offer、职位修改、开放或关闭尚未作为稳定命令发布。
|
||||
|
||||
所有命令都应加 `--format json`。组织、业务标识和当前操作人由登录身份及 MCP
|
||||
Connector 注入,不要要求用户提供或猜测 `corpId`、`bizCode`、`opUserId`。
|
||||
|
||||
## 查询职位列表
|
||||
|
||||
```bash
|
||||
dws recruit job list --format json
|
||||
dws recruit job list --keyword "Java" --status open --size 20 --format json
|
||||
dws recruit job list --job-ids JOB_ID_1,JOB_ID_2 --format json
|
||||
```
|
||||
|
||||
可选筛选包括 `--job-ids`、`--required-edu`、`--status`、`--job-nature`、
|
||||
`--campus`、`--start-modified-time`、`--end-modified-time`、
|
||||
`--creator-user-ids`、`--keyword`、`--category`。状态接受:
|
||||
|
||||
- `draft`:草稿
|
||||
- `open`:招聘中
|
||||
- `invalid`:已失效
|
||||
- `closed`:已关闭/完成
|
||||
|
||||
`--size` 默认 20,范围 1–100。首页不传 `--cursor`;响应 `hasMore=true` 时,
|
||||
把 `nextCursor` 回填到下一次查询。
|
||||
|
||||
## 查询职位详情
|
||||
|
||||
先从列表结果取得真实 `jobId`,不得编造:
|
||||
|
||||
```bash
|
||||
dws recruit job get --job-id JOB_ID --format json
|
||||
```
|
||||
|
||||
## 创建职位
|
||||
|
||||
创建是非幂等远端写入。先准备只包含职位对象的 UTF-8 JSON 文件,并用
|
||||
`--dry-run` 检查完整调用;向用户展示职位名称、性质、薪资、创建人和负责人(如有),取得
|
||||
明确确认后,交由 CLI 的确认流程执行实际创建。不要在存储示例中加入确认绕过参数。
|
||||
|
||||
`creatorUserId` 是必填字段,必须使用同一 profile 下当前操作者的真实 userId,不得
|
||||
猜测或复用其他组织的 userId。`ownerUserIds` 是可选的负责人 userId JSON 字符串数组;
|
||||
提供负责人时同样必须使用真实通讯录结果。用户说“负责人是我”时先运行
|
||||
`dws contact user get-self --format json` 取得当前 userId;用户指定其他负责人时按
|
||||
通讯录 Skill 解析唯一 userId。未指定负责人时允许省略 `ownerUserIds`,不要默认选人。
|
||||
|
||||
```bash
|
||||
dws recruit job create --from ./job.json --dry-run --format json
|
||||
dws recruit job create --from ./job.json --format json
|
||||
```
|
||||
|
||||
最小 `job.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Java 开发工程师",
|
||||
"description": "负责服务端系统开发",
|
||||
"jobNature": "FULL-TIME",
|
||||
"requiredEdu": 6,
|
||||
"minSalary": 20000,
|
||||
"maxSalary": 35000,
|
||||
"extData": {
|
||||
"headCount": 1,
|
||||
"fullTimeExtData": {
|
||||
"salaryMonth": 12
|
||||
}
|
||||
},
|
||||
"creatorUserId": "CURRENT_USER_ID",
|
||||
"ownerUserIds": ["OWNER_USER_ID"]
|
||||
}
|
||||
```
|
||||
|
||||
必填字段为 `name`、`description`、`jobNature`、`requiredEdu`、`extData`、
|
||||
`creatorUserId`;`ownerUserIds` 可选。
|
||||
`campus` 缺失或为 null 时默认 `false`;只有明确创建校招职位时才设置为 `true`。
|
||||
`jobNature` 当前固定为 `FULL-TIME`;`requiredEdu` 为 1–9 的整数(1小学、2初中、
|
||||
3高中、4中专、5大专、6本科、7硕士、8博士、9其他)。`minSalary` 与
|
||||
`maxSalary` 可选;两者同时提供时最低薪资不得高于最高薪资。
|
||||
|
||||
`extData.headCount` 范围 1–999;`extData.fullTimeExtData.salaryMonth` 范围
|
||||
12–24;最高工作年限不得小于最低工作年限。提供 `address` 时必须同时包含
|
||||
`name`、`detail`、`longitude`、`latitude`,经纬度只能来自地图选点或可信地址解析,
|
||||
不得猜测。`source` 可省略,由 Connector 默认补充为 `manual`;不传 `category` 时
|
||||
Connector 会设置 `checkJobCategory=false`。
|
||||
|
||||
可选字段以当前 `dws recruit job create --help` 和 leaf Schema 为准。不要把 MCP
|
||||
信封字段 `atsAddJobParam`、`corpId`、`bizCode` 或 `opUserId` 写进文件;CLI 与
|
||||
Connector 会负责包装和身份注入。
|
||||
+39
-28
@@ -1,10 +1,16 @@
|
||||
# 钉钉白板(独立与文档内嵌)
|
||||
# 钉钉白板内容操作
|
||||
|
||||
本页是 Whiteboard 的默认入口。未提供 `--part-id` 时,`whiteboard query/+diff/+update`
|
||||
默认操作独立 `.adraw` 白板;显式提供非空 `--part-id` 时操作文档内嵌白板。
|
||||
接口失败后不得自动切换类型。Doc 只负责普通文件生命周期以及插入、定位、删除文档内
|
||||
白板卡片容器。已知命令直接执行;仅真实 `unknown command` / `unknown flag` 时读一次
|
||||
leaf Help,契约不确定时读一次 compact leaf Schema。
|
||||
本页覆盖两个相互独立的目标,不能互相推断、转换或回退:
|
||||
|
||||
- 独立白板是 `.adraw` 白板文件,使用白板自身 `nodeId`,不存在文档 `partId`。
|
||||
- 文档内嵌白板是文档中的一个 part。只有已知承载文档 `nodeId` 和非空 `partId` 后,
|
||||
才使用 `whiteboard query/+diff/+update` 读写该 part 的图形内容;卡片容器的插入、
|
||||
定位、删除始终属于 Doc。
|
||||
|
||||
CLI 未提供 `--part-id` 时会寻址独立白板,但 Agent 必须先确认用户目标本来就是独立
|
||||
白板。文档内嵌目标缺少 `partId` 属于身份不完整,必须停止并补齐,不能因此改成独立
|
||||
白板。接口失败后也不得切换目标类型。已知命令直接执行;仅真实 `unknown command` /
|
||||
`unknown flag` 时读一次 leaf Help,契约不确定时读一次 compact leaf Schema。
|
||||
|
||||
根据本次操作只读取以下一份操作 Reference,不预加载完整协议或多个示例集:
|
||||
|
||||
@@ -40,6 +46,8 @@ Reference;只有操作页仍缺少具体字段时,才读取一份精确协
|
||||
|
||||
## Agent 更新:先 diff,再确认
|
||||
|
||||
更新只设一个用户确认点:先完成所需的 render 和必需的 +diff,再把视觉预览(如有)、差异与覆盖影响一起展示并一次确认;不要在 render 后先索要确认、获准后才补做 diff 再次询问。同一目标、revision、source 和模式已获确认后,直接提交;只有这些内容变化或出现未披露的实质风险才重新确认。
|
||||
|
||||
对已有白板追加、修改、删除或清空内容,必须在提交前执行 `+diff`:
|
||||
先读取所需当前内容并准备 source,再按 [diff.md](./whiteboard/diff.md) 比较同一目标。
|
||||
即使已读 compose、replace 等操作页,也必须读取 diff 指引;文档数量预算不能省略此步骤。
|
||||
@@ -62,8 +70,9 @@ diff 不可用、失败或存在 blocker 时停止,不换原子 update 绕过
|
||||
- 同一 profile,目标须有真实身份:独立白板使用 `nodeId`;内嵌白板使用承载文档
|
||||
`nodeId + whiteboardId/partId`。零/多目标、身份不明或 profile 不一致时停止,
|
||||
不能取第一个候选。
|
||||
- `--part-id` 完全未提供时默认独立白板;显式提供空值或纯空白会报错,不能借此
|
||||
切换类型。权限、网络、Feature Switch、revision 冲突等失败均不得跨接口回退。
|
||||
- 独立白板命令不传 `--part-id`;文档内嵌白板内容命令必须传真实非空 `--part-id`。
|
||||
Agent 先按用户目标确定类型,再构造参数;缺少身份、空值、权限、网络、Feature
|
||||
Switch 或 revision 冲突均须停止,不得切换或回退到另一目标。
|
||||
- Runtime 确认后执行层才添加 `--yes`;存储示例不得预置确认。
|
||||
- Agent 更新前必须执行 `+diff` 并等待差异确认。独立白板把 diff 返回的 `target.revision` 传给
|
||||
`+update --expected-revision`,两类白板都把 `sourceDigest` 传给
|
||||
@@ -79,7 +88,8 @@ diff 不可用、失败或存在 blocker 时停止,不换原子 update 绕过
|
||||
|
||||
## 调用与上下文预算
|
||||
|
||||
- 每板建立 `{blockId, whiteboardId, payloadFile}`,禁止重复 fetch、insert 或搜索。
|
||||
- 每个已经明确的目标只建立一份 `{nodeId, partId(仅内嵌目标), payloadFile}` 上下文;
|
||||
禁止重复查询或搜索,且不得通过另一目标类型补全身份。
|
||||
- 每阶段最多一次 update;提交前校验错误只修相关字段一次。相同 Payload、
|
||||
`--verbose` 或 commit-unknown 不重放;commit-unknown 按同一稳定目标 query 对账。
|
||||
- 先用单次响应完整校验,再无损投影;ID、mode、verified、节点摘要和链接只是最小
|
||||
@@ -95,15 +105,12 @@ diff 不可用、失败或存在 blocker 时停止,不换原子 update 绕过
|
||||
|
||||
| ID | 来源 | 用途 |
|
||||
|---|---|---|
|
||||
| `nodeId` | 独立白板创建结果 / 文档解析 | 独立白板自身 ID,或内嵌白板的承载文档 ID |
|
||||
| `blockId` | `doc whiteboard insert` | 文档块定位、排序和删除 |
|
||||
| `whiteboardId` | `doc whiteboard insert` | 白板命令的 `--part-id` |
|
||||
| `nodeId`(独立目标) | 独立白板文件创建或定位结果 | 独立 `.adraw` 白板文件自身 ID |
|
||||
| `nodeId`(内嵌目标) | 已知的承载文档身份 | 承载该白板 part 的文档 ID |
|
||||
| `partId`(仅内嵌目标) | 已知的文档 part 身份 | 白板内容命令的 `--part-id`;不能用于独立白板文件 |
|
||||
| 请求节点 `id` | 本地 OpenNodes 文件 | 同一请求的 parent/connector 引用 |
|
||||
| 真实节点 ID | `+query` / `+update` 读回 | 读回身份;不能直接做局部 update |
|
||||
|
||||
insert 返回 `whiteboardId` 后直接使用;若为 null,只 fetch 一次并按本次 `blockId`
|
||||
定位,仍未落库则报 pending,禁止重复插入。
|
||||
|
||||
<!-- VISIBLE_SHORTCUTS_START -->
|
||||
## Shortcuts(无专用脚本/recipe 时优先)
|
||||
|
||||
@@ -118,25 +125,30 @@ insert 返回 `whiteboardId` 后直接使用;若为 null,只 fetch 一次并
|
||||
|
||||
## 定位与调用
|
||||
|
||||
文档内嵌白板和独立白板文件分别寻址。以下两组命令只展示各自已经明确的目标,
|
||||
不能把其中一组当作另一组的创建、发现或失败回退流程。
|
||||
|
||||
### 文档内嵌白板 part 的图形内容
|
||||
|
||||
必须已经取得承载文档 `nodeId` 和该 part 的 `partId`。文档中白板卡片容器的插入、
|
||||
定位和删除由 `dingtalk-doc` 处理,不在本 Reference 中编排。
|
||||
|
||||
```bash
|
||||
# 新建文档和白板卡片
|
||||
dws doc +create --name "<文档标题>" --format json
|
||||
dws doc whiteboard insert --node <DOC_ID> --format json
|
||||
|
||||
# 在指定块后插入
|
||||
dws doc +fetch --node <DOC_ID> --detail with-ids --format json
|
||||
dws doc whiteboard insert --node <DOC_ID> \
|
||||
--ref-block <BLOCK_ID> --where after --format json
|
||||
|
||||
# 读取与更新
|
||||
# 对身份已知的内嵌白板 part 读取与更新图形内容
|
||||
dws whiteboard +query --node <DOC_ID> --part-id <PART_ID> --format json
|
||||
dws whiteboard +diff --node <DOC_ID> --part-id <PART_ID> \
|
||||
--source @whiteboard.json --format json
|
||||
dws whiteboard +update --node <DOC_ID> --part-id <PART_ID> \
|
||||
--expected-source-digest <DIFF_SOURCE_DIGEST> \
|
||||
--source @whiteboard.json --format json
|
||||
```
|
||||
|
||||
# 独立白板(无 part-id,默认独立)
|
||||
### 独立白板文件
|
||||
|
||||
这里的 `nodeId` 是独立 `.adraw` 白板文件自身的 ID;该目标不属于任何文档 part。
|
||||
|
||||
```bash
|
||||
# 读取与更新已经明确的独立白板文件
|
||||
dws whiteboard +query --node <WHITEBOARD_NODE_ID> --view all --format json
|
||||
dws whiteboard +diff --node <WHITEBOARD_NODE_ID> --page-id <PAGE_ID> \
|
||||
--source @whiteboard.json --format json
|
||||
@@ -220,8 +232,7 @@ SVG artifact,并返回规范化 `sourceDigest`、`fidelity` 和逐节点 warni
|
||||
`create-with-content --expected-source-digest`。摘要不一致时停止创建并重新渲染,不能
|
||||
绕过。图片、Vector 和未知节点使用占位框,不会在预览阶段拉取外链资源。
|
||||
|
||||
`--source` 接受 JSON、`@relative-file.json` 或 stdin;本地文件必须加 `@`,裸路径
|
||||
会被当作 JSON。白板 shortcut 不支持 `--jq` / `--fields`。
|
||||
`render`、`+diff` 和 `+update` 的 `--source` 接受 JSON、`@relative-file.json` 或 stdin;这些命令的本地文件必须加 `@`,裸路径会被当作 JSON。`create-with-content` 使用 JSON 或裸文件路径,不接受 `@文件` 或 stdin,不能套用 shortcut 的写法。白板 shortcut 不支持 `--jq` / `--fields`。
|
||||
|
||||
## 坐标读回与稳定结构
|
||||
|
||||
|
||||
+3
-1
@@ -199,4 +199,6 @@ Frame 页面直属,子节点坐标相对其左上角;connector 不放入 Fra
|
||||
]
|
||||
```
|
||||
|
||||
`presentationOrder` 须唯一且非负;未知字段、跨请求引用或不支持值会拒绝整批。
|
||||
`presentationOrder` 仅允许用于 `frame`,且须唯一、非负;`shape`、`text`、
|
||||
`stickyNote` 等其他节点不得携带该字段。普通节点的层叠顺序使用 `zIndex`。
|
||||
未知字段、跨请求引用或不支持值会拒绝整批。
|
||||
+2
@@ -6,6 +6,8 @@ OpenNodes source,不调用任何白板写 Tool。
|
||||
|
||||
## 必经闭环
|
||||
|
||||
更新只设一个用户确认点:先完成所需的 render 和必需的 +diff,再把视觉预览(如有)、差异与覆盖影响一起展示并一次确认;不要在 render 后先索要确认、获准后才补做 diff 再次询问。同一目标、revision、source 和模式已获确认后,直接提交;只有这些内容变化或出现未披露的实质风险才重新确认。
|
||||
|
||||
准备 source 后执行 +diff,展示实际变化和全部风险提示,然后停止等待用户明确确认
|
||||
当前差异。确认后才执行 +update 并添加 --yes。最初的更新请求、render、dry-run
|
||||
及写后读回不能替代此确认;不得换原子 update 绕过。目标、revision、source 或模式
|
||||
|
||||
+6
@@ -82,6 +82,12 @@ interface OpenText extends OpenTextWrite {
|
||||
|
||||
约束:
|
||||
|
||||
- 垂直对齐只写在 `text.verticalAlign`(frame 标题为 `title.text.verticalAlign`),
|
||||
不得写进 `text.blocks[i]`;block 的对齐字段是 `horizontalAlign`。
|
||||
DWS 在 render、创建、diff 和更新前拒绝 block 内的 `verticalAlign`,返回节点 ID、
|
||||
字段路径与正确位置(validation / 退出码 3)。修正 source 后重新预览和确认,
|
||||
不直接重试旧的 sourceDigest。此本地检查不替代服务端完整 Schema 校验。
|
||||
|
||||
- `blocks.length >= 1`,每个 block 的 `type` 必须是 `paragraph`、
|
||||
`bulletList` 或 `orderedList`。
|
||||
- 每个 block 都必须满足 `runs.length >= 1`。
|
||||
|
||||
+2
-1
@@ -55,7 +55,8 @@ frame 的 update 结构见第 6 节 `OpenFrameNodeWrite`。
|
||||
|
||||
- frame 必须是页面直属节点,不能带 `parentId`。
|
||||
- angle 只允许 `0`。
|
||||
- `presentationOrder` 是非负整数,并且不能和已有或本次创建的 frame 冲突。
|
||||
- 只有 frame 可以携带 `presentationOrder`;它是非负整数,并且不能和已有或
|
||||
本次创建的 frame 冲突。其他节点的层叠顺序使用 `zIndex`。
|
||||
- frame 的子节点通过子节点 `parentId` 引用 frame 临时 ID。
|
||||
- frame 不能包含 frame 或 connector。
|
||||
- frame 默认 layer 为 `background`。
|
||||
|
||||
+3
-1
@@ -3,7 +3,9 @@
|
||||
`dws whiteboard render` 是纯本地语义预览。它读取与创建相同的 OpenNodes source,写出
|
||||
确定性 SVG,不访问任何图片、字体或外链资源,也不调用白板 MCP。
|
||||
|
||||
这是本地文件写入操作,不是只读命令。先确认 `--output` 目标和写入授权,再执行;
|
||||
已有白板更新若需要视觉预览,render 只是确认前的准备步骤:继续完成 +diff,再合并展示 SVG、差异和覆盖影响,一次确认后提交。下面“暂停等待预览确认”的流程仅适用于带内容创建,不叠加到已有白板更新。
|
||||
|
||||
这是本地文件写入操作,不是只读命令。用户要求创建或修改白板已授权生成必要的本地预览,选择新的 `--output` 路径即可执行,无需另问一次生成预览的许可;
|
||||
非交互环境取得授权后才可追加 `--yes`。覆盖已有文件还须明确授权覆盖并添加 `--force`,
|
||||
`--force` 本身不代替确认。命令不支持 `--dry-run`,传入时会拒绝执行且不写文件。
|
||||
本地文件写入授权不代表用户已审阅 SVG,也不授权创建远端白板;后者仍按下述流程单独确认。
|
||||
|
||||
+2
@@ -5,6 +5,8 @@
|
||||
|
||||
## 执行顺序
|
||||
|
||||
更新只设一个用户确认点:先完成所需的 render 和必需的 +diff,再把视觉预览(如有)、差异与覆盖影响一起展示并一次确认;不要在 render 后先索要确认、获准后才补做 diff 再次询问。同一目标、revision、source 和模式已获确认后,直接提交;只有这些内容变化或出现未披露的实质风险才重新确认。
|
||||
|
||||
1. 对同一稳定目标执行一次 `+query`:内嵌白板使用 `nodeId/partId`,独立白板使用
|
||||
`nodeId/pageId` 并保留当前 revision。保留完整当前快照并汇总将被删除的节点。
|
||||
2. 准备完整终态,保留用户未要求删除的内容。必读 [diff.md](./diff.md) 并执行同一目标的 +diff;展示变化、删除重建影响、warnings 和 blockers 后停止,等待用户明确确认当前差异。失败或有 blocker 不得提交。
|
||||
|
||||
+1
-1
@@ -103,7 +103,7 @@
|
||||
| "给机器人发单聊/给机器人发消息/跟机器人聊天" | 给机器人发单聊消息 | `chat bot find` → `chat message send --open-dingtalk-id` | `chat bot search` | 必须先用 find 拿 openDingTalkId(search 没有此字段),再用 send --open-dingtalk-id 发单聊 |
|
||||
| "我创建的机器人/我的机器人/我自己的机器人/查看我的机器人" | 搜索我创建的机器人 | `chat bot search` | `chat bot find` | search 仅返回当前用户自己创建的机器人(返回 robotCode + robotName,无 openDingTalkId);find 返回全部可用机器人 |
|
||||
| "合并转发/批量转发/合并转发多条消息" | 合并转发多条消息 | `chat message combine-forward` | `chat message forward` | combine-forward 合并多条为一条转发;forward 转发单条消息 |
|
||||
| "把群里这条已有消息转成 Thread/升级成群内话题" | 消息升级为 Thread | `chat thread promote` | `chat thread send` | promote 转换已有普通群消息;send 发布一条全新的 Thread |
|
||||
| "把群里这条已有消息转成 Thread/升级成群内话题" | 消息升级为 Thread(已下线) | — | — | 当前无等价替代;仅当用户改为新建话题时才使用 `chat thread send` |
|
||||
| "转发话题/转发话题消息/话题转发到另一个群" | 转发 Thread | `chat thread forward` | `chat message forward` | thread forward 转发整条 Thread 并保留上下文;message forward 只转发普通单条消息 |
|
||||
| "发卡片消息/推送流式卡片" | 创建并推送流式卡片 | `chat message send-card` | `chat message send` | send-card 发流式卡片;send 发普通文本/Markdown 消息 |
|
||||
| "更新卡片/流式更新卡片" | 流式更新卡片内容 | `chat message update-card` | `chat message send-card` | update-card 更新已有卡片;send-card 创建新卡片 |
|
||||
|
||||
+5
-1
@@ -12,7 +12,9 @@
|
||||
| 群聊、消息、机器人、Webhook、群成员 | [`dingtalk-chat`](../../dingtalk-chat/SKILL.md) |
|
||||
| 实时监听未来 IM 消息、reaction、已读、撤回、群生命周期或 OA 审批变化 | [`dingtalk-event`](../../dingtalk-event/SKILL.md) |
|
||||
| 已有 userId 的用户详情、部门、角色、组织关系 | [`dingtalk-contact`](../../dingtalk-contact/SKILL.md) |
|
||||
| 文档正文读取、创建、更新、块编辑、媒体和导出 | [`dingtalk-doc`](../../dingtalk-doc/SKILL.md) |
|
||||
| 白板文件、独立白板、保存到白板、独立白板课表/流程图及内容修改 | [`dingtalk-misc`](../../dingtalk-misc/SKILL.md) → [`whiteboard.md`](../../dingtalk-misc/references/whiteboard.md)(`dws whiteboard`) |
|
||||
| 文档正文读取、创建、更新、块编辑、媒体、导出,以及文档内白板卡片容器的插入、定位、删除 | [`dingtalk-doc`](../../dingtalk-doc/SKILL.md) |
|
||||
| 已有承载文档 nodeId 和 partId 的文档内嵌白板图形内容读写 | [`dingtalk-misc`](../../dingtalk-misc/SKILL.md) → [`whiteboard.md`](../../dingtalk-misc/references/whiteboard.md)(`dws whiteboard --node ... --part-id ...`) |
|
||||
| 文件搜索、上传下载、复制移动、重命名、权限 | [`dingtalk-drive`](../../dingtalk-drive/SKILL.md) |
|
||||
| 邮件查询、搜索、读取和发送 | [`dingtalk-mail`](../../dingtalk-mail/SKILL.md) |
|
||||
| 听记列表、摘要、转写、关键字和标题 | [`dingtalk-minutes`](../../dingtalk-minutes/SKILL.md) |
|
||||
@@ -39,6 +41,8 @@ reference,不要加载全部长尾产品文档。
|
||||
|
||||
## 高频边界
|
||||
|
||||
- 白板文件/独立白板与文档内嵌白板是互不转换的目标。前者走 `whiteboard`(`dingtalk-misc`);后者的卡片容器插入、定位、删除走 `doc whiteboard`,只有已知承载文档 `nodeId + partId` 后才用 `whiteboard` 读写 part 内图形内容。文档内嵌目标缺少 `partId` 时停止并补齐,禁止改成独立白板。
|
||||
|
||||
- `aisearch person`:按姓名、职责、上下级、工号或手机号线索语义找人;`contact`:
|
||||
完整手机号精确反查,或拿到 userId 后查详情、部门和角色;`mail`:邮件内容与收发。
|
||||
- `drive`:对任何文件都成立的存储操作;`doc`:文档正文和块内容;`wiki`:空间与
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
"name": "playwright浏览器自动化操作",
|
||||
"version": "20260605",
|
||||
"keySource": "none",
|
||||
"syncedAt": "2026-10-14T02:11:59Z"
|
||||
"syncedAt": "2026-10-14T16:02:40Z"
|
||||
}
|
||||
@@ -2,8 +2,8 @@
|
||||
"sourceId": "next-skills",
|
||||
"repo": "https://github.com/vercel/next.js.git",
|
||||
"ref": "canary",
|
||||
"commit": "6cc25f4f27cb01b10cab07e9c81cf016b5251274",
|
||||
"commit": "2df613dbe00b82a6a684e570bc77e242825182ab",
|
||||
"adapter": "skill-collection",
|
||||
"sourcePath": "skills",
|
||||
"syncedAt": "2026-10-14T02:09:15Z"
|
||||
"syncedAt": "2026-10-14T16:00:00Z"
|
||||
}
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
English | [中文](./README_CN.md)
|
||||
|
||||
> 🆕 **As a finance professional (CPA · CPV · Consulting Engineer (Investment)), I drew on my expertise and project experience to build a tool website: [Construction Project Economic Evaluation](https://cs.hehugo.com/)** (in Chinese) — enter your project data and get a full financial evaluation online: investment, revenue, cost, debt service, profit, cash flow and balance sheet statements, plus IRR, NPV, sensitivity and break-even analysis, exportable to Excel / Word. Built for energy projects such as wind, solar and storage, with a general-purpose mode for other projects. The site is in an early trial phase; new accounts get 3 free runs.
|
||||
> 🆕 **As a finance professional (CPA · CPV · Consulting Engineer (Investment)), I drew on my expertise and project experience to build a tool website: [Construction Project Economic Evaluation](https://cs.hehugo.com/)** (in Chinese) — enter your project data and get a full financial evaluation online: investment, revenue, cost, debt service, profit, cash flow and balance sheet statements, plus IRR, NPV, sensitivity and break-even analysis, exportable to Excel / Word. Built for energy projects such as wind, solar and storage, with a general-purpose mode for other projects. The site is in an early trial phase; the first 100 accounts get 3 free runs, later accounts get 1.
|
||||
|
||||
## ❤️ Sponsors
|
||||
|
||||
@@ -430,7 +430,7 @@ If PPT Master has been helpful to you, individual support of any amount helps ke
|
||||
|
||||
<img src="docs/assets/alipay-qr.jpg" alt="Alipay QR Code" width="220" />
|
||||
|
||||
> 🎁 Sponsor ¥100 or more (in multiples of ¥100) via Alipay and put the email you registered on [Construction Project Economic Evaluation](https://cs.hehugo.com/) in the payment note to receive compute credits on that site. During the early trial phase, every ¥100 earns 50 credits.
|
||||
> 🎁 Sponsor ¥100 or more (in multiples of ¥100) via Alipay and put the email you registered on [Construction Project Economic Evaluation](https://cs.hehugo.com/) in the payment note to receive compute credits on that site. Every ¥100 earns 20 credits (one run costs 1 credit).
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"sourceId": "ppt-master",
|
||||
"repo": "https://github.com/hugohe3/ppt-master.git",
|
||||
"ref": "main",
|
||||
"commit": "bf89859cbf3c5f5974de70e0dd2ccf2239c8c51b",
|
||||
"commit": "8070d3df1f6f54b5fb60a9ae66e79c664f050212",
|
||||
"adapter": "claude-skill",
|
||||
"sourcePath": "skills/ppt-master",
|
||||
"syncedAt": "2026-10-14T02:09:15Z"
|
||||
"syncedAt": "2026-10-14T16:00:00Z"
|
||||
}
|
||||
@@ -114,7 +114,7 @@ ends at export. Step numbers stay as written.
|
||||
## Global Communication Rules
|
||||
|
||||
- Match the user's language and source language unless the user explicitly overrides it.
|
||||
- Localize user-facing option labels and explanations. Keep exact enum IDs or field names when needed for precision.
|
||||
- Localize user-facing option labels and explanations. Render each fixed message template (role-switch banner, completion report) in the user's chat language when it differs from the template's. Keep exact enum IDs or field names when needed for precision.
|
||||
- Keep `design_spec.md` section headings and field names in the template's original English; content values may use the user's language.
|
||||
- Before switching roles, read the corresponding role reference and output:
|
||||
|
||||
|
||||
+141
-197
@@ -35,19 +35,14 @@
|
||||
template_free_desc: "Use no reusable template workspace. The Strategist will derive the visual system from this project.",
|
||||
template_use_title: "Use templates",
|
||||
template_use_desc: "Select one or more reusable Brand, Style, Layout, Deck, or specified workspaces.",
|
||||
sec_template_library: "Template combination",
|
||||
template_library_hint: "Choose at most one workspace per kind. All four kinds can combine; Layout takes structural precedence over Deck.",
|
||||
sec_template_explicit: "Specified templates",
|
||||
template_explicit_hint: "Choose exact workspaces supplied for this run with non-overlapping kinds; every kind in each selected root is applied. Source paths are shown for verification.",
|
||||
template_kind_brand: "Brand",
|
||||
template_kind_style: "Style",
|
||||
template_kind_layout: "Layout",
|
||||
template_kind_deck: "Deck",
|
||||
template_source_library: "Library",
|
||||
template_source_explicit: "Specified path",
|
||||
template_source_path: "Source path",
|
||||
template_select_none: "None",
|
||||
template_none_registered: "No registered templates",
|
||||
template_none_explicit: "No specified templates for this run",
|
||||
sec_canvas: "Canvas format",
|
||||
sec_pages: "Page count",
|
||||
@@ -80,7 +75,6 @@
|
||||
sec_template_application: "Template application",
|
||||
template_application_hint: "After reading every installed template SVG, the AI proposes one natural-language application plan. Edit it directly; this is not a mode selector.",
|
||||
placeholder_template_application: "Name exact SVG files for page-specific rules; describe what to use, skip, repeat, or reorder, what stays fixed, and what may be replaced or reorganized.",
|
||||
sub_mode: "Narrative mode",
|
||||
sub_visual: "Visual style",
|
||||
sub_divergence: "Material divergence (how freely to reshape vs. stay close to the source)",
|
||||
placeholder_divergence: "In your words — e.g. \"stick closely to the document\" / \"freely restructure and expand within the source\". Leave blank for a balanced default.",
|
||||
@@ -111,7 +105,7 @@
|
||||
placeholder_audience: "Who is this deck for?",
|
||||
placeholder_pages: "e.g. 12-15",
|
||||
hex_override: "Custom HEX override:",
|
||||
image_ai_path: "AI image source",
|
||||
image_ai_path: "AI image path",
|
||||
image_strategy: "Generated image style",
|
||||
image_strategy_empty: "No preset style references are available. You can still use a custom style.",
|
||||
image_strategy_required: "Choose a generated-image preset or describe a custom style.",
|
||||
@@ -172,17 +166,9 @@
|
||||
role_accent: "accent",
|
||||
role_secondary_accent: "2nd accent",
|
||||
role_body_text: "body text",
|
||||
cjk: "CJK",
|
||||
latin: "Latin",
|
||||
sample_heading_cjk: "主题方案标题",
|
||||
sample_heading_latin: "Presentation Title",
|
||||
sample_body_cjk: "关键信息摘要",
|
||||
sample_body_latin: "Key message summary",
|
||||
style_preview_label: "Overall impression (color + typography + icons)",
|
||||
style_preview_body: "· rough feel only, not the actual slide layout",
|
||||
no_icons: "No icons",
|
||||
preview_big_title: "Big Title",
|
||||
preview_section_title: "Section Title",
|
||||
preview_latin_title: "Section Title",
|
||||
preview_body_intro: "Body copy shows the baseline text rhythm and contrast.",
|
||||
preview_latin_body: "Body text sample for checking Latin typography.",
|
||||
@@ -204,43 +190,38 @@
|
||||
ja: {
|
||||
page_title: "PPT Master - デザイン確認",
|
||||
topbar_hint: "自由記述の質問に答えるか、提案を選択・調整して次へ進んでください。",
|
||||
stage_anchors: "ステージ 1 · コミュニケーション契約",
|
||||
stage_final_plan: "ステージ 2 · 最終プランと制作",
|
||||
stage_anchors: "ステージ1 · コミュニケーション方針",
|
||||
stage_final_plan: "ステージ2 · 最終プランと制作",
|
||||
loading: "読み込み中…",
|
||||
load_error: "現在の推奨ステージを読み込めませんでした。起動前にAIが書き込む必要があります。",
|
||||
load_error: "現在のステージの提案を読み込めませんでした。起動前にAIが書き込んでおく必要があります。",
|
||||
btn_confirm: "確定",
|
||||
btn_confirm_contract: "契約内容を確定して次へ →",
|
||||
btn_confirm_contract: "方針を確定して次へ →",
|
||||
btn_confirm_final_plan: "最終プランを確定 →",
|
||||
deriving: "最終プランを準備し、選択したテンプレートを確認しています…",
|
||||
template_selection_required: "自由デザインまたはテンプレート利用を選んでください。テンプレート利用時は、1つ以上のワークスペースを選択してください。",
|
||||
template_selection_conflict: "種類ごとにワークスペースを1件まで選択してください。",
|
||||
connection_lost: "確認ページのサーバー接続が中断されました。再試行しています。失敗が続く場合はチャットで確認してください。",
|
||||
connection_lost: "確認サーバーへの接続が中断されました。再試行しています。失敗が続く場合は、チャットに戻って確定してください。",
|
||||
confirmed_title: "✓ 確定しました",
|
||||
confirmed_hint: "選択内容を保存しました。このページを閉じてチャットに戻ってください。",
|
||||
confirmed_hint: "選択内容を保存しました。このページを閉じてチャットに戻れます。",
|
||||
lang_toggle_title: "言語を切り替え",
|
||||
sec_template_choice: "デザインの基準",
|
||||
template_choice_hint: "この資料のデザインシステムをどう決めるか選択します。",
|
||||
template_free_title: "現在の内容からデザインする",
|
||||
template_free_desc: "再利用テンプレートを使わず、Strategist がこのプロジェクトからビジュアルシステムを組み立てます。",
|
||||
template_free_desc: "再利用可能なテンプレートワークスペースを使わず、Strategist がこのプロジェクトの内容からビジュアルシステムを組み立てます。",
|
||||
template_use_title: "テンプレートを使用",
|
||||
template_use_desc: "Brand、Style、Layout、Deck、または指定ワークスペースから1つ以上選択します。",
|
||||
sec_template_library: "テンプレートの組み合わせ",
|
||||
template_use_desc: "再利用可能な Brand、Style、Layout、Deck、または指定ワークスペースを1つ以上選択します。",
|
||||
template_library_hint: "種類ごとにワークスペースを1件まで選択できます。4種類はすべて組み合わせ可能で、構造は Layout が Deck より優先されます。",
|
||||
sec_template_explicit: "指定テンプレート",
|
||||
template_explicit_hint: "この実行で指定されたワークスペースを、種別が重複しない範囲で複数選択できます。各ルートに含まれる全種別が適用され、確認用に参照元パスを表示します。",
|
||||
template_explicit_hint: "今回の実行で指定されたワークスペースを、種類が重複しない範囲で複数選択できます。選択したワークスペースに含まれるすべての種類が適用されます。確認用に参照元パスを表示します。",
|
||||
template_kind_brand: "Brand",
|
||||
template_kind_style: "Style",
|
||||
template_kind_layout: "Layout",
|
||||
template_kind_deck: "Deck",
|
||||
template_source_library: "ライブラリ",
|
||||
template_source_explicit: "指定パス",
|
||||
template_source_path: "参照元パス",
|
||||
template_select_none: "なし",
|
||||
template_none_registered: "登録済みテンプレートはありません",
|
||||
template_none_explicit: "この実行で指定されたテンプレートはありません",
|
||||
template_none_explicit: "今回の実行で指定されたテンプレートはありません",
|
||||
sec_canvas: "キャンバス形式",
|
||||
sec_pages: "ページ数",
|
||||
sec_audience: "想定読者",
|
||||
sec_audience: "対象者",
|
||||
sec_communication: "このプレゼンで何を実現するか",
|
||||
sec_delivery: "どう使い、何を残すか",
|
||||
sec_narrative: "ナラティブ方針",
|
||||
@@ -250,15 +231,15 @@
|
||||
sec_type: "タイポグラフィ",
|
||||
sec_images: "画像の使用",
|
||||
sec_image_production: "画像制作",
|
||||
sec_proactive_execution: "能動的な実行",
|
||||
sec_proactive_execution: "自動で行う作業",
|
||||
sec_mode: "生成モード",
|
||||
sec_refine: "先に設計仕様を確認",
|
||||
sec_refine: "先に設計仕様をレビュー",
|
||||
sec_design_spec_depth: "設計仕様の詳細度",
|
||||
design_spec_depth_brief: "簡潔",
|
||||
design_spec_depth_brief_desc: "各ページを短いブロック一覧で記し、全文は書きません。",
|
||||
design_spec_depth_complete: "完全",
|
||||
design_spec_depth_complete_desc: "完全な文言を含む各ページの詳細なブリーフを記載します。",
|
||||
design_spec_depth_locked: "分割モードまたは設計仕様のレビューが有効なため、「完全」に固定されています。",
|
||||
design_spec_depth_complete: "詳細",
|
||||
design_spec_depth_complete_desc: "各ページの詳細な内容を、文言まで含めて記載します。",
|
||||
design_spec_depth_locked: "分割モードまたは設計仕様のレビューが有効なため、「詳細」に固定されています。",
|
||||
sec_design_directions: "統合デザイン方針",
|
||||
design_directions_hint: "おすすめの全体案が最初に適用されています。別案を選ぶか、下の各項目を微調整できます。調整後は「元の案に戻す」で最初の組み合わせを復元できます。",
|
||||
direction_active: "適用中",
|
||||
@@ -268,24 +249,23 @@
|
||||
scheme_component_options: "プロジェクト専用カスタム案 · カードを選んで編集",
|
||||
sec_template_application: "テンプレートの適用方法",
|
||||
template_application_hint: "AIがインストール済みテンプレートの全SVGを確認し、自然言語の適用方針を1段落で提案します。モード選択ではなく、文章を直接修正できます。",
|
||||
placeholder_template_application: "ページ固有の規則は正確なSVGファイル名で示し、使用・省略・反復・並べ替え、固定する要素、差し替え・再構成できる内容を記述します。",
|
||||
sub_mode: "ナラティブモード",
|
||||
placeholder_template_application: "ページ固有の規則は正確なSVGファイル名で示し、使用・省略・反復・並べ替え、固定する要素、差し替え・再構成できる内容を記述してください。",
|
||||
sub_visual: "ビジュアルスタイル",
|
||||
sub_divergence: "素材からの発散度(どこまで自由に再構成するか、原文に忠実か)",
|
||||
placeholder_divergence: "自分の言葉でどうぞ — 例:「文書に忠実に」「元素材の範囲内で自由に再構成・展開」。空欄ならバランス型になります。",
|
||||
sub_divergence: "元資料からの自由度(どこまで自由に再構成するか、原文に忠実か)",
|
||||
placeholder_divergence: "自分の言葉で入力してください(例:「文書に忠実に」「元資料の範囲内で自由に再構成・展開」)。空欄の場合はバランス型になります。",
|
||||
communication_intent: "このプレゼンで何を実現したいですか?",
|
||||
communication_intent_hint: "自由記述です。情報共有・説明・説得・意思決定・合意形成・教育・報告と説明責任・行動喚起・記録と引き継ぎを必要に応じて組み合わせ、必要なら優先順位や順序も書いてください。ラベルを選ぶ必要はありません。",
|
||||
communication_intent_hint: "自由記述です。情報共有・説明・説得・意思決定・合意形成・教育・報告と説明責任・行動喚起・記録と引き継ぎのうち、当てはまるものを組み合わせてください。必要なら優先順位や順序も書いてください。ラベルを選ぶ必要はありません。",
|
||||
placeholder_communication_intent: "例:まず進捗とリスクを報告し、そのうえで次の投資判断を得る。",
|
||||
audience_outcome: "聴衆に期待する変化・成功条件",
|
||||
placeholder_audience_outcome: "終了後、聴衆は何を知り、理解し、信じ、決め、行動できる状態になるべきですか?",
|
||||
core_message: "中核メッセージ/意思決定の依頼/行動",
|
||||
audience_outcome: "対象者に期待する変化・成功条件",
|
||||
placeholder_audience_outcome: "終了後、対象者は何を知り、理解し、信じ、決め、行動できる状態になるべきですか?",
|
||||
core_message: "コアメッセージ/意思決定の依頼/行動",
|
||||
placeholder_core_message: "ほかの内容が忘れられても、必ず残すべき主張・依頼・行動は何ですか?",
|
||||
delivery_context: "利用状況(主モードを明記)",
|
||||
delivery_context_hint: "発表者主導、読者主導、ハイブリッド、録画/自動再生を区別してください。ハイブリッドでは主モードと、維持すべき副用途を明記します。",
|
||||
placeholder_delivery_context: "例:主は発表者付き20分の経営レビュー。副は会議後に単独で読む承認資料。",
|
||||
artifact_afterlife: "資料の利用後",
|
||||
placeholder_artifact_afterlife: "例:承認、レビュー、監査、保管、引き継ぎ、再利用。後続利用がなければ空欄で構いません。",
|
||||
stage1_current_value_hint: "編集可能な欄には提案が入っています。そのまま使う・修正する・空にすることができ、確定時の現在値を空欄も含めてそのまま保存します。",
|
||||
delivery_context: "利用状況(主な使い方を明記)",
|
||||
delivery_context_hint: "発表者主導、読者主導、ハイブリッド、録画/自動再生を区別してください。ハイブリッドの場合は、主となる使い方と、あわせて成り立たせたい副次的な用途も明記してください。",
|
||||
placeholder_delivery_context: "例:主な用途は発表者主導の20分の経営レビュー。副次的な用途は、会議後に共有する読者主導の承認資料。",
|
||||
artifact_afterlife: "資料の利用後の扱い",
|
||||
placeholder_artifact_afterlife: "例:承認、レビュー、監査、保管、引き継ぎ、再利用。後で使う予定がなければ空欄で構いません。",
|
||||
stage1_current_value_hint: "編集できる欄には提案が入っています。そのまま使う、修正する、空にするのいずれも可能です。確定すると、空欄も含めて現在の入力内容がそのまま保存されます。",
|
||||
content_divergence_locked_hint: "このプロファイルは原文とページ構成を保持するため、この項目は固定されています。",
|
||||
custom: "カスタム",
|
||||
custom_placeholder: "自由に入力…",
|
||||
@@ -293,14 +273,14 @@
|
||||
ai_custom_candidate_hint: "比較できるよう常に全文を表示します。初期選択はされず、選択後に編集できます。",
|
||||
custom_behavior_required: "選択したAIカスタム案を空欄にはできません。",
|
||||
custom_color_required: "続行する前に、カスタム配色の説明を入力してください。",
|
||||
design_system_required: "続行する前に、完全な配色と書体システムを選択してください。",
|
||||
mode_behavior_placeholder: "構成の流れ、タイトルの語り口、ページのリズム、表現姿勢を記述します。",
|
||||
visual_style_behavior_placeholder: "形状言語、構図、装飾密度、余白、書体の性格、質感を記述します。",
|
||||
design_system_required: "続行する前に、配色とタイポグラフィをすべて選択してください。",
|
||||
mode_behavior_placeholder: "構成の流れ、タイトルの語り口、ページのリズム、プレゼンのスタンスを記述してください。",
|
||||
visual_style_behavior_placeholder: "形状の特徴、構図、装飾の密度、余白、書体の性格、質感を記述してください。",
|
||||
recommended: "おすすめ",
|
||||
placeholder_audience: "この資料は誰に向けたもの?",
|
||||
placeholder_audience: "この資料は誰に向けたものですか?",
|
||||
placeholder_pages: "例:12-15",
|
||||
hex_override: "カスタムHEXで上書き:",
|
||||
image_ai_path: "AI画像の生成元",
|
||||
image_ai_path: "AI画像の生成経路",
|
||||
image_strategy: "生成画像のスタイル",
|
||||
image_strategy_empty: "プリセットのスタイル見本を利用できません。カスタムスタイルは引き続き使用できます。",
|
||||
image_strategy_required: "生成画像のプリセットを選ぶか、カスタムスタイルを記述してください。",
|
||||
@@ -308,27 +288,27 @@
|
||||
image_strategy_select_placeholder: "生成画像のプリセットを選択…",
|
||||
image_strategy_recommended_group: "この資料へのおすすめ",
|
||||
image_strategy_all_group: "すべてのプリセットスタイル",
|
||||
image_strategy_rendering: "レンダリング",
|
||||
image_strategy_rendering: "表現スタイル",
|
||||
image_strategy_visual: "ビジュアル",
|
||||
image_strategy_mood: "ムード",
|
||||
image_strategy_ai_custom: "AIカスタム案",
|
||||
image_strategy_ai_custom_desc: "新規または複数の既存表現を統合したレンダリング案です。選択後に編集できます。",
|
||||
image_strategy_ai_custom_desc: "新規、または複数の既存スタイルを組み合わせた表現案です。選択後に編集できます。",
|
||||
image_strategy_custom_placeholder: "生成画像の方向性、被写体、構図、スタイル要素、避けたい要素を具体的に入力してください。",
|
||||
image_strategy_reference_hint: "参照画像はレンダリングのみを示します。最終AI画像の色は上で選んだデッキ配色を継承します。",
|
||||
image_strategy_reference_hint: "参照画像が示すのは表現スタイルのみです。最終的なAI画像の配色は、上で選んだ資料の配色を引き継ぎます。",
|
||||
image_strategy_no_reference: "このカスタム選択には参照画像がありません。",
|
||||
image_source_summary: "選択中の画像ソース",
|
||||
image_production_hint: "画像ソースとレンダリングは上で選択済みです。ここでは制作経路だけを決めます。",
|
||||
image_production_hint: "画像ソースと表現スタイルは上で選択済みです。ここでは制作経路だけを決めます。",
|
||||
image_usage_notes: "画像に関する補足要件",
|
||||
image_usage_notes_placeholder: "例:リアルな手洗いシーンを優先、漫画調の菌のイラストは避ける、製品写真はそのまま使う。",
|
||||
image_usage_required: "画像の使用方法を少なくとも1つ選択してください。",
|
||||
image_usage_none_exclusive: "「画像なし」は他の画像オプションと同時に選択できません。",
|
||||
proactive_execution_hint: "これらの初期設定は、明示的な指示がない場合にのみ適用されます。最新の明示的な指示が常に優先されます。",
|
||||
proactive_speaker_notes: "発表者ノートを能動的に生成",
|
||||
proactive_speaker_notes_desc: "初期設定はオンです。個別の依頼がなくても発表者ノートを生成します。",
|
||||
proactive_custom_animations: "カスタムアニメーションを能動的に作成",
|
||||
proactive_custom_animations_desc: "初期設定はオフです。ストラテジストの動きの提案は維持され、オンにすると個別の依頼がなくてもカスタムアニメーションを作成します。",
|
||||
proactive_narration_audio: "ナレーション音声を能動的に生成",
|
||||
proactive_narration_audio_desc: "初期設定はオフです。この選択は発表者ノートの設定を書き換えません。ナレーションに必要なノートの有効状態は、ストラテジストが設計仕様で解決します。",
|
||||
proactive_speaker_notes: "発表者ノートを自動で生成",
|
||||
proactive_speaker_notes_desc: "初期設定はオンです。別途依頼しなくても、エージェントが発表者ノートを生成します。",
|
||||
proactive_custom_animations: "カスタムアニメーションを自動で作成",
|
||||
proactive_custom_animations_desc: "初期設定はオフです。Strategist によるアニメーションの提案は引き続き利用できます。オンにすると、別途依頼しなくてもエージェントがカスタムアニメーションを作成します。",
|
||||
proactive_narration_audio: "ナレーション音声を自動で生成",
|
||||
proactive_narration_audio_desc: "初期設定はオフです。ここでの選択は発表者ノートの設定を書き換えません。ナレーションに実際に必要なノートの扱いは、Strategist が設計仕様の中で決定します。",
|
||||
font_heading: "見出し",
|
||||
font_body: "本文",
|
||||
font_selection: "フォント選択",
|
||||
@@ -339,56 +319,48 @@
|
||||
other_font_placeholder: "インストール済みフォントの正確な名前",
|
||||
customized: "カスタマイズ済み",
|
||||
font_body_size: "本文の基準サイズ",
|
||||
font_body_size_hint: "すべての文字サイズはこの本文基準から導出されます。",
|
||||
body_size_unit_relation: "SVG px と PPT pt の換算:1px = 0.75pt。",
|
||||
body_size_pt_hint: "約 {pt} pt(1px = 0.75pt 換算、保存は px)。",
|
||||
role_size_pt_hint: "約 {pt} pt",
|
||||
body_size_hint_canvas: "このキャンバスの目安は約{lo}–{hi}px(有効キャンバス尺度から算出)。",
|
||||
body_size_hint_purpose: "この閲覧モードの推奨は{def}px — 範囲ではなく固定値です。",
|
||||
body_size_hint_oor: "(現在の値はこのキャンバスの通常範囲外です — 単位とサイズ感を確認してください。)",
|
||||
font_body_size_hint: "すべての文字サイズは、この本文の基準サイズをもとに決まります。",
|
||||
body_size_unit_relation: "SVGのpxとPPTのptの換算:1px = 0.75pt。",
|
||||
body_size_pt_hint: "約{pt}pt(1px = 0.75ptで換算。保存はpx単位)。",
|
||||
role_size_pt_hint: "約{pt}pt",
|
||||
body_size_hint_canvas: "このキャンバスの目安は約{lo}〜{hi}px(キャンバスの実効サイズから算出)。",
|
||||
body_size_hint_purpose: "この閲覧モードの推奨値は{def}pxです(範囲ではなく固定値)。",
|
||||
body_size_hint_oor: "(現在の値はこのキャンバスの通常の範囲外です。単位が正しいか、サイズが適切かを確認してください。)",
|
||||
delivery_purpose: "閲覧モード",
|
||||
delivery_purpose_hint: "情報を主にページと話者のどちらに担わせるかを決めます。近距離閲覧は完全な文と細部で自立させ、プレゼン型は1枚1メッセージで短い主張と視覚的根拠を中心にします。",
|
||||
delivery_purpose_hint: "情報をページと発表者のどちらに担わせるかを決めます。文書型は完結した文と必要な細部でページ単体で理解できるようにし、プレゼン型は1枚1メッセージで、短い主張と視覚的な根拠を中心にします。",
|
||||
size_override: "役割ごとのサイズ上書き:",
|
||||
size_role_title: "タイトル",
|
||||
size_role_subtitle: "サブタイトル",
|
||||
size_role_annotation: "注釈",
|
||||
custom_typography: "カスタムタイポグラフィ",
|
||||
custom_color: "カスタム配色",
|
||||
custom_color_placeholder: "配色を言葉で説明 — 例:濃紺をメインに暖色オレンジのアクセント、背景は白 — またはHEX値を貼り付け…",
|
||||
custom_color_placeholder: "配色を言葉で入力(例:濃紺をメインに、暖色オレンジをアクセントに、背景は白)、またはHEX値を貼り付け…",
|
||||
role_background: "背景",
|
||||
role_secondary_bg: "第2背景",
|
||||
role_primary: "メイン",
|
||||
role_accent: "アクセント",
|
||||
role_secondary_accent: "第2アクセント",
|
||||
role_body_text: "本文文字",
|
||||
cjk: "和文",
|
||||
latin: "欧文",
|
||||
sample_heading_cjk: "プレゼンテーションの表題",
|
||||
sample_heading_latin: "Presentation Title",
|
||||
sample_body_cjk: "キーメッセージの要約",
|
||||
sample_body_latin: "Key message summary",
|
||||
style_preview_label: "全体の印象(配色 + タイポグラフィ + アイコン)",
|
||||
role_body_text: "本文テキスト",
|
||||
style_preview_label: "全体の印象(配色・タイポグラフィ・アイコン)",
|
||||
style_preview_body: "· 雰囲気の確認用で、実際のレイアウトではありません",
|
||||
no_icons: "アイコンなし",
|
||||
preview_big_title: "大見出し",
|
||||
preview_section_title: "章タイトル",
|
||||
preview_latin_title: "Section Title",
|
||||
preview_body_intro: "本文の基準サイズとコントラストを確認するための文です。",
|
||||
preview_latin_body: "Body text sample for checking Latin typography.",
|
||||
preview_point_1_title: "本文内容",
|
||||
preview_point_1_text: "段落密度と行間の見え方をここで確認します。",
|
||||
preview_point_2_title: "要点説明",
|
||||
preview_point_2_title: "要点",
|
||||
preview_point_2_text: "アイコンは単独ではなく、実際の文章の横に配置します。",
|
||||
preview_point_3_title: "結論・提案",
|
||||
preview_point_3_title: "結論",
|
||||
preview_point_3_text: "投影時にも読みやすい組み合わせかを判断します。",
|
||||
mode_continuous_desc: "デッキ全体を一気に生成します。",
|
||||
mode_split_desc: "設計仕様の作成後に停止し、別ウィンドウでSVG生成を再開します。",
|
||||
mode_continuous_desc: "資料全体を一括で生成します。",
|
||||
mode_split_desc: "設計仕様の作成後に停止し、新しいチャットでSVG生成を再開します。",
|
||||
refine_off_desc: "設計仕様と実行ロックを順番に作成し、そのまま自動で進みます。",
|
||||
refine_on_desc: "設計仕様の作成後に停止します。レビューページが開き、各ページを直接編集するかコメントを残せます。チャットで承認すると実行ロックを作成して生成を続けます。",
|
||||
off_default: "オフ",
|
||||
on: "オン",
|
||||
option_prefix: "案",
|
||||
error_retry: "エラー - 再試行"
|
||||
error_retry: "エラーが発生しました。再試行してください"
|
||||
},
|
||||
zh: {
|
||||
page_title: "确认设计方案",
|
||||
@@ -396,36 +368,31 @@
|
||||
stage_anchors: "第一阶段 · 沟通契约",
|
||||
stage_final_plan: "第二阶段 · 最终方案与制作",
|
||||
loading: "加载中…",
|
||||
load_error: "无法加载推荐文件,需在启动前写入。",
|
||||
load_error: "无法加载当前阶段的推荐内容。需由 AI 在启动页面前先写入。",
|
||||
btn_confirm: "确认",
|
||||
btn_confirm_contract: "确认沟通契约并继续 →",
|
||||
btn_confirm_final_plan: "确认最终方案 →",
|
||||
deriving: "正在准备最终方案并核验所选模板…",
|
||||
template_selection_required: "请选择自由设计或使用模板;选择使用模板时,至少选择一个工作区。",
|
||||
template_selection_conflict: "每种模板最多选择一个工作区。",
|
||||
connection_lost: "确认页服务连接中断,正在重试;如果持续失败,请回到聊天窗口走聊天确认。",
|
||||
template_selection_conflict: "每种类型最多选择一个工作区。",
|
||||
connection_lost: "与确认服务的连接已中断,正在重试;若持续失败,请回到对话窗口,在对话中确认。",
|
||||
confirmed_title: "✓ 已确认",
|
||||
confirmed_hint: "选择已保存,可关闭此页并回到聊天窗口。",
|
||||
confirmed_hint: "选择已保存,可关闭此页并回到对话窗口。",
|
||||
lang_toggle_title: "切换语言",
|
||||
sec_template_choice: "设计基础",
|
||||
sec_template_choice: "设计依据",
|
||||
template_choice_hint: "选择这份演示文稿如何建立设计系统。",
|
||||
template_free_title: "根据当前内容从零设计",
|
||||
template_free_desc: "不使用可复用模板工作区,由 Strategist 根据当前项目推导视觉系统。",
|
||||
template_free_title: "根据当前内容自由设计",
|
||||
template_free_desc: "不使用可复用模板工作区,由策略师根据当前项目推导视觉系统。",
|
||||
template_use_title: "使用模板",
|
||||
template_use_desc: "选择一个或多个 Brand、Style、Layout、Deck 或指定工作区。",
|
||||
sec_template_library: "模板组合",
|
||||
template_library_hint: "每种模板最多选择一个工作区;四种模板均可组合,结构由 Layout 优先于 Deck。",
|
||||
sec_template_explicit: "指定模板",
|
||||
template_explicit_hint: "可选择本次运行提供的多个精确工作区,各根的模板类型不得重叠;选中的根会采用其全部类型,来源路径供你核对。",
|
||||
template_library_hint: "每种类型最多选择一个工作区;四种类型可任意组合,结构上 Layout 优先于 Deck。",
|
||||
template_explicit_hint: "可多选本次运行指定的工作区,但各工作区的模板类型不得重叠;所选工作区中的全部类型都会被应用,来源路径仅供核对。",
|
||||
template_kind_brand: "Brand",
|
||||
template_kind_style: "Style",
|
||||
template_kind_layout: "Layout",
|
||||
template_kind_deck: "Deck",
|
||||
template_source_library: "模板库",
|
||||
template_source_explicit: "指定地址",
|
||||
template_source_path: "来源路径",
|
||||
template_source_explicit: "指定路径",
|
||||
template_select_none: "无",
|
||||
template_none_registered: "暂无已注册模板",
|
||||
template_none_explicit: "本次运行没有指定模板",
|
||||
sec_canvas: "画布格式",
|
||||
sec_pages: "页数",
|
||||
@@ -434,22 +401,22 @@
|
||||
sec_delivery: "如何使用、之后留下什么",
|
||||
sec_narrative: "叙事方向",
|
||||
sec_visual: "视觉方向",
|
||||
sec_color: "色彩方案",
|
||||
sec_color: "配色方案",
|
||||
sec_icons: "图标使用",
|
||||
sec_type: "字体方案",
|
||||
sec_images: "图片使用",
|
||||
sec_image_production: "图片生产",
|
||||
sec_image_production: "图片制作",
|
||||
sec_proactive_execution: "主动执行",
|
||||
sec_mode: "生成模式",
|
||||
sec_refine: "先审核设计规范",
|
||||
sec_refine: "先评审设计规范",
|
||||
sec_design_spec_depth: "设计规范深度",
|
||||
design_spec_depth_brief: "简要",
|
||||
design_spec_depth_brief_desc: "每页只写简短的内容块列表,不写整页文案。",
|
||||
design_spec_depth_complete: "完整",
|
||||
design_spec_depth_complete_desc: "写入包含完整文案的逐页简报。",
|
||||
design_spec_depth_locked: "分段模式或设计规范审核已开启,因此固定为“完整”。",
|
||||
design_spec_depth_locked: "分段模式或设计规范评审已开启,因此固定为“完整”。",
|
||||
sec_design_directions: "成套设计方向",
|
||||
design_directions_hint: "AI 最倾向的成套方案已默认应用;你可以改选其他方案,或在下方微调各项。调整后可用“恢复原方案”还原整套预设。",
|
||||
design_directions_hint: "推荐的成套方案已默认应用;你可以改选其他方案,或在下方微调各项。调整后可点击“恢复原方案”还原整套预设。",
|
||||
direction_active: "已应用",
|
||||
direction_adjusted: "已调整",
|
||||
direction_apply_hint: "点击应用这套完整方案。",
|
||||
@@ -458,24 +425,23 @@
|
||||
sec_template_application: "模板应用方式",
|
||||
template_application_hint: "AI 会先阅读已安装模板的全部 SVG,再给出一段自然语言应用方案;这不是模式选择,你可以直接修改文字。",
|
||||
placeholder_template_application: "页面级规则请写明精确 SVG 文件名;说明使用、跳过、重复或重排哪些原型,哪些内容固定,哪些可以替换或重组。",
|
||||
sub_mode: "叙事模式",
|
||||
sub_visual: "视觉风格",
|
||||
sub_divergence: "材料发散度(多大程度重塑,还是贴近源材料)",
|
||||
placeholder_divergence: "用你自己的话写,例如「严格贴着文档来」/「在源材料范围内自由重组并展开」。留空则按平衡处理。",
|
||||
placeholder_divergence: "用你自己的话写,例如“严格贴着文档来”/“在源材料范围内自由重组并展开”。留空则按平衡处理。",
|
||||
communication_intent: "这份演示文稿需要完成什么?",
|
||||
communication_intent_hint: "开放回答,可按需组合:告知、解释、说服、决策、对齐、教学、汇报与问责、动员、留档与交接。必要时说明主次或先后,不需要选择标签。",
|
||||
placeholder_communication_intent: "例如:先汇报进展并暴露风险,再推动管理层决定下一阶段投入。",
|
||||
audience_outcome: "期望的受众变化 / 成功条件",
|
||||
placeholder_audience_outcome: "结束后,受众应该知道、理解、相信、决定或采取什么行动?",
|
||||
core_message: "核心信息 / 决策请求 / 行动",
|
||||
placeholder_core_message: "即使其他内容没有被记住,受众至少需要接住哪些主张、请求或行动?",
|
||||
delivery_context: "传递场景(明确主要模式)",
|
||||
placeholder_core_message: "即使其他内容都没被记住,哪些主张、请求或行动也必须传达到位?",
|
||||
delivery_context: "使用场景(明确主要模式)",
|
||||
delivery_context_hint: "区分演讲者主导、读者主导、混合、录制/自动播放;混合场景要说明哪一种主导,以及还要兼顾什么次要用途。",
|
||||
placeholder_delivery_context: "例如:主要为有主讲的 20 分钟管理层现场评审;次要为会后独立阅读的审批材料。",
|
||||
placeholder_delivery_context: "例如:主要为演讲者主导的 20 分钟管理层现场评审;次要为会后独立阅读的审批材料。",
|
||||
artifact_afterlife: "演示后的成果用途",
|
||||
placeholder_artifact_afterlife: "例如:审批、评审、审计、留档、交接或复用;没有后续用途时可留空。",
|
||||
stage1_current_value_hint: "可编辑字段中是推荐内容。你可以保留、修改或清空;确认时会按当前内容原样保存,空白也会保持为空。",
|
||||
content_divergence_locked_hint: "当前流程要求原文和页面结构保持不变,因此该字段已锁定。",
|
||||
stage1_current_value_hint: "可编辑字段已预填推荐内容。你可以保留、修改或清空;确认时会原样保存当前内容,留空也会保持为空。",
|
||||
content_divergence_locked_hint: "当前模式会保留原文措辞和页面结构,因此该字段已锁定。",
|
||||
custom: "自定义",
|
||||
custom_placeholder: "输入自定义内容…",
|
||||
ai_custom_candidate: "AI 自定义方案",
|
||||
@@ -487,9 +453,9 @@
|
||||
visual_style_behavior_placeholder: "描述形状语言、构图、装饰密度、留白、字体气质和纹理。",
|
||||
recommended: "推荐",
|
||||
placeholder_audience: "这份演示文稿面向谁?",
|
||||
placeholder_pages: "如:12-15",
|
||||
placeholder_pages: "例如:12-15",
|
||||
hex_override: "自定义色值覆盖:",
|
||||
image_ai_path: "生成配图来源",
|
||||
image_ai_path: "AI 生成图路径",
|
||||
image_strategy: "生成图风格",
|
||||
image_strategy_empty: "当前没有可用的预设风格参考,仍可使用自定义风格。",
|
||||
image_strategy_required: "请选择一种生成图预设,或填写自定义风格。",
|
||||
@@ -498,19 +464,19 @@
|
||||
image_strategy_recommended_group: "本项目推荐",
|
||||
image_strategy_all_group: "全部预设风格",
|
||||
image_strategy_rendering: "渲染风格",
|
||||
image_strategy_visual: "视觉",
|
||||
image_strategy_mood: "情绪",
|
||||
image_strategy_visual: "画面",
|
||||
image_strategy_mood: "氛围",
|
||||
image_strategy_ai_custom: "AI 自定义方案",
|
||||
image_strategy_ai_custom_desc: "一套全新或综合多个已有风格的渲染方案;选择后可以编辑。",
|
||||
image_strategy_custom_placeholder: "描述生成图的具体方向、主体、构图、风格关键词或需要避免的内容。",
|
||||
image_strategy_reference_hint: "参考图只展示渲染风格;最终 AI 图片直接继承上方已选的整套 PPT 配色。",
|
||||
image_strategy_reference_hint: "参考图只展示渲染风格;最终 AI 生成图直接继承上方已选的整套 PPT 配色。",
|
||||
image_strategy_no_reference: "自定义选择没有参考图。",
|
||||
image_source_summary: "已选图片来源",
|
||||
image_production_hint: "图片来源和渲染方向已在上方选择;这里仅决定实际生产路径。",
|
||||
image_production_hint: "图片来源和渲染风格已在上方选择;这里只需确定实际制作路径。",
|
||||
image_usage_notes: "图片补充要求",
|
||||
image_usage_notes_placeholder: "例如:优先真实洗手场景;不要卡通病菌;产品照片保持原样。",
|
||||
image_usage_required: "请至少选择一种图片使用方式。",
|
||||
image_usage_none_exclusive: "「不使用图片」不能和其它图片选项同时选择。",
|
||||
image_usage_none_exclusive: "“不使用图片”不能和其他图片选项同时选择。",
|
||||
proactive_execution_hint: "这些默认开关只在你没有明确要求时生效;你最新的明确指令始终优先。",
|
||||
proactive_speaker_notes: "主动生成演讲者备注",
|
||||
proactive_speaker_notes_desc: "默认开启。无需另行要求,Agent 也会生成演讲者备注。",
|
||||
@@ -523,7 +489,7 @@
|
||||
font_selection: "字体选择",
|
||||
primary_language_font: "主要语言字体",
|
||||
english_font: "英文字体",
|
||||
font_picker_hint: "选择推荐方案会同步下方字体;修改任一下拉或手动字体后会标记为已自定义。",
|
||||
font_picker_hint: "选择推荐方案会自动填入下方的字体选择器;修改任一字体后,字体方案会标记为已自定义。",
|
||||
other_installed_font: "其他已安装字体…",
|
||||
other_font_placeholder: "输入精确的已安装字体名称",
|
||||
customized: "已自定义",
|
||||
@@ -534,46 +500,38 @@
|
||||
role_size_pt_hint: "约 {pt} pt",
|
||||
body_size_hint_canvas: "当前画布建议 ~{lo}–{hi}px(按有效画布跨度计算)。",
|
||||
body_size_hint_purpose: "该阅读模式推荐 {def}px(单一固定值,非区间)。",
|
||||
body_size_hint_oor: "(当前数值超出该画布的常用范围——请确认单位无误、是否合适。)",
|
||||
body_size_hint_oor: "(当前数值超出该画布的常用范围——请确认单位是否正确、字号是否合适。)",
|
||||
delivery_purpose: "阅读模式",
|
||||
delivery_purpose_hint: "决定信息主要由页面还是讲者承担:近读型用完整句、短段落和细节自洽;演讲型一页一意,以简短主张和视觉证据为主。",
|
||||
delivery_purpose_hint: "决定信息主要由页面还是演讲者承担:文字型(近读)用完整句子和必要细节,让页面无需讲解也能读懂;展示型(演讲)一页一意,以简短主张和视觉证据为主。",
|
||||
size_override: "逐角色字号覆盖:",
|
||||
size_role_title: "标题",
|
||||
size_role_subtitle: "副标题",
|
||||
size_role_annotation: "注释",
|
||||
custom_typography: "自定义字体方案",
|
||||
custom_color: "自定义配色",
|
||||
custom_color_placeholder: "用文字描述配色,如:深蓝主色、暖橙强调、白色背景——或直接粘贴 HEX 值…",
|
||||
custom_color_placeholder: "用文字描述配色,例如:深蓝主色、暖橙强调、白色背景——或直接粘贴 HEX 值…",
|
||||
role_background: "背景",
|
||||
role_secondary_bg: "次级背景",
|
||||
role_primary: "主色",
|
||||
role_accent: "强调",
|
||||
role_secondary_accent: "次强调",
|
||||
role_accent: "强调色",
|
||||
role_secondary_accent: "次强调色",
|
||||
role_body_text: "正文文字",
|
||||
cjk: "中文",
|
||||
latin: "西文",
|
||||
sample_heading_cjk: "主题方案标题",
|
||||
sample_heading_latin: "Presentation Title",
|
||||
sample_body_cjk: "关键信息摘要",
|
||||
sample_body_latin: "Key message summary",
|
||||
style_preview_label: "整体形象(配色 + 字体 + 图标)",
|
||||
style_preview_body: "· 仅大致形象,非实际版式",
|
||||
no_icons: "无图标",
|
||||
style_preview_label: "整体观感(配色 + 字体 + 图标)",
|
||||
style_preview_body: "· 仅供感受大致风格,并非实际版式",
|
||||
preview_big_title: "大标题",
|
||||
preview_section_title: "章节标题",
|
||||
preview_latin_title: "Section Title",
|
||||
preview_body_intro: "正文内容用于判断基础字号、行距和颜色对比。",
|
||||
preview_body_intro: "正文内容用于观察基础文字的节奏与对比度。",
|
||||
preview_latin_body: "Body text sample for checking Latin typography.",
|
||||
preview_point_1_title: "正文内容",
|
||||
preview_point_1_text: "这里展示普通段落的密度和阅读节奏。",
|
||||
preview_point_2_title: "要点说明",
|
||||
preview_point_1_text: "这里用于判断段落密度和行距。",
|
||||
preview_point_2_title: "要点",
|
||||
preview_point_2_text: "图标和文字放在一起,判断真实使用效果。",
|
||||
preview_point_3_title: "结论建议",
|
||||
preview_point_3_title: "结论",
|
||||
preview_point_3_text: "组合效果需要在演示场景下保持清晰可读。",
|
||||
mode_continuous_desc: "一次性连续生成整份演示文稿。",
|
||||
mode_split_desc: "写完设计规范后停止,另开窗口继续生成页面。",
|
||||
mode_split_desc: "写完设计规范后停止,在新的对话窗口中继续生成 SVG 页面。",
|
||||
refine_off_desc: "依次生成设计规范和执行锁,然后自动继续。",
|
||||
refine_on_desc: "生成设计规范后暂停,并打开评审页面:可逐页直接修改或留下修改意见;在聊天中明确确认后再生成执行锁并继续制作。",
|
||||
refine_on_desc: "生成设计规范后暂停,并打开评审页面:可逐页直接修改或留下修改意见;在对话中明确确认后再生成执行锁并继续制作。",
|
||||
off_default: "关",
|
||||
on: "开",
|
||||
option_prefix: "方案",
|
||||
@@ -585,36 +543,31 @@
|
||||
stage_anchors: "第一階段 · 溝通契約",
|
||||
stage_final_plan: "第二階段 · 最終方案與製作",
|
||||
loading: "載入中…",
|
||||
load_error: "無法載入推薦檔案,需在啟動前寫入。",
|
||||
load_error: "無法載入目前的推薦階段。AI 必須在啟動前先寫入。",
|
||||
btn_confirm: "確認",
|
||||
btn_confirm_contract: "確認溝通契約並繼續 →",
|
||||
btn_confirm_final_plan: "確認最終方案 →",
|
||||
deriving: "正在準備最終方案並核驗所選範本…",
|
||||
template_selection_required: "請選擇自由設計或使用範本;選擇使用範本時,至少選擇一個工作區。",
|
||||
template_selection_conflict: "每種範本最多選擇一個工作區。",
|
||||
connection_lost: "確認頁服務連線中斷,正在重試;如果持續失敗,請回到聊天視窗走聊天確認。",
|
||||
template_selection_conflict: "每種類型最多選擇一個工作區。",
|
||||
connection_lost: "與確認伺服器的連線已中斷,正在重試;若持續失敗,請回到對話視窗,改在對話中確認。",
|
||||
confirmed_title: "✓ 已確認",
|
||||
confirmed_hint: "選擇已儲存,可關閉此頁並回到聊天視窗。",
|
||||
confirmed_hint: "選擇已儲存,可關閉此頁並回到對話視窗。",
|
||||
lang_toggle_title: "切換語言",
|
||||
sec_template_choice: "設計基礎",
|
||||
template_choice_hint: "選擇這份簡報如何建立設計系統。",
|
||||
template_free_title: "根據目前內容從零設計",
|
||||
template_free_desc: "不使用可重複使用的範本工作區,由 Strategist 根據目前專案推導視覺系統。",
|
||||
template_free_desc: "不使用可重複使用的範本工作區,由策略師根據目前專案推導視覺系統。",
|
||||
template_use_title: "使用範本",
|
||||
template_use_desc: "選擇一個或多個 Brand、Style、Layout、Deck 或指定工作區。",
|
||||
sec_template_library: "範本組合",
|
||||
template_library_hint: "每種範本最多選擇一個工作區;四種範本均可組合,結構由 Layout 優先於 Deck。",
|
||||
sec_template_explicit: "指定範本",
|
||||
template_explicit_hint: "可選擇本次執行提供的多個精確工作區,各根的範本類型不得重疊;選中的根會採用其全部類型,來源路徑供你核對。",
|
||||
template_library_hint: "每種類型最多選擇一個工作區;四種類型均可組合,其中 Layout 的結構優先於 Deck。",
|
||||
template_explicit_hint: "可選擇本次執行提供的多個指定工作區,各工作區的範本類型不得重疊;選取的工作區會套用其全部類型,來源路徑供你核對。",
|
||||
template_kind_brand: "Brand",
|
||||
template_kind_style: "Style",
|
||||
template_kind_layout: "Layout",
|
||||
template_kind_deck: "Deck",
|
||||
template_source_library: "範本庫",
|
||||
template_source_explicit: "指定地址",
|
||||
template_source_path: "來源路徑",
|
||||
template_source_explicit: "指定路徑",
|
||||
template_select_none: "無",
|
||||
template_none_registered: "尚無已註冊範本",
|
||||
template_none_explicit: "本次執行沒有指定範本",
|
||||
sec_canvas: "畫布格式",
|
||||
sec_pages: "頁數",
|
||||
@@ -647,17 +600,16 @@
|
||||
sec_template_application: "範本套用方式",
|
||||
template_application_hint: "AI 會先閱讀已安裝範本的全部 SVG,再提出一段自然語言套用方案;這不是模式選擇,你可以直接修改文字。",
|
||||
placeholder_template_application: "頁面級規則請寫明精確 SVG 檔名;說明使用、略過、重複或重排哪些原型,哪些內容固定,哪些可以替換或重組。",
|
||||
sub_mode: "敘事模式",
|
||||
sub_visual: "視覺風格",
|
||||
sub_divergence: "材料發散度(多大程度重塑,還是貼近源材料)",
|
||||
placeholder_divergence: "用你自己的話寫,例如「嚴格貼著文件來」/「在源材料範圍內自由重組並展開」。留空則按平衡處理。",
|
||||
sub_divergence: "素材發散度(要多自由地重塑,還是貼近來源素材)",
|
||||
placeholder_divergence: "用你自己的話寫,例如「嚴格貼著文件來」/「在來源素材範圍內自由重組並展開」。留空則採平衡處理。",
|
||||
communication_intent: "這份簡報需要完成什麼?",
|
||||
communication_intent_hint: "開放回答,可按需組合:告知、解釋、說服、決策、對齊、教學、報告與問責、動員、留檔與交接。必要時說明主次或先後,不需要選擇標籤。",
|
||||
placeholder_communication_intent: "例如:先報告進展並暴露風險,再推動管理階層決定下一階段投入。",
|
||||
placeholder_communication_intent: "例如:先報告進度並揭露風險,再爭取管理階層決定下一階段投入。",
|
||||
audience_outcome: "期望的受眾變化 / 成功條件",
|
||||
placeholder_audience_outcome: "結束後,受眾應該知道、理解、相信、決定或採取什麼行動?",
|
||||
core_message: "核心資訊 / 決策請求 / 行動",
|
||||
placeholder_core_message: "即使其他內容沒有被記住,受眾至少需要接住哪些主張、請求或行動?",
|
||||
placeholder_core_message: "即使其他內容都沒被記住,受眾至少要記得哪些主張、請求或行動?",
|
||||
delivery_context: "傳遞場景(明確主要模式)",
|
||||
delivery_context_hint: "區分演講者主導、讀者主導、混合、錄製/自動播放;混合場景要說明哪一種主導,以及還要兼顧什麼次要用途。",
|
||||
placeholder_delivery_context: "例如:主要為有主講的 20 分鐘管理階層現場評審;次要為會後獨立閱讀的簽核文件。",
|
||||
@@ -675,15 +627,15 @@
|
||||
mode_behavior_placeholder: "描述敘事階段、標題語氣、頁面節奏和表達姿態。",
|
||||
visual_style_behavior_placeholder: "描述形狀語言、構圖、裝飾密度、留白、字型氣質和紋理。",
|
||||
recommended: "推薦",
|
||||
placeholder_audience: "這份簡報面向誰?",
|
||||
placeholder_audience: "這份簡報是給誰看的?",
|
||||
placeholder_pages: "如:12-15",
|
||||
hex_override: "自訂色值覆蓋:",
|
||||
image_ai_path: "生成配圖來源",
|
||||
image_strategy: "生成圖風格",
|
||||
hex_override: "自訂色碼覆寫:",
|
||||
image_ai_path: "AI 生成圖片路徑",
|
||||
image_strategy: "生成圖片風格",
|
||||
image_strategy_empty: "目前沒有可用的預設風格參考,仍可使用自訂風格。",
|
||||
image_strategy_required: "請選擇一種生成圖預設,或填寫自訂風格。",
|
||||
image_strategy_invalid: "所選生成圖預設目前不可用。",
|
||||
image_strategy_select_placeholder: "選擇生成圖預設…",
|
||||
image_strategy_required: "請選擇一種生成圖片預設,或填寫自訂風格。",
|
||||
image_strategy_invalid: "所選生成圖片預設目前不可用。",
|
||||
image_strategy_select_placeholder: "選擇生成圖片預設…",
|
||||
image_strategy_recommended_group: "本專案推薦",
|
||||
image_strategy_all_group: "全部預設風格",
|
||||
image_strategy_rendering: "渲染風格",
|
||||
@@ -691,7 +643,7 @@
|
||||
image_strategy_mood: "情緒",
|
||||
image_strategy_ai_custom: "AI 自訂方案",
|
||||
image_strategy_ai_custom_desc: "一套全新或綜合多個已有風格的渲染方案;選擇後可以編輯。",
|
||||
image_strategy_custom_placeholder: "描述生成圖的具體方向、主體、構圖、風格關鍵字或需要避免的內容。",
|
||||
image_strategy_custom_placeholder: "描述生成圖片的具體方向、主體、構圖、風格關鍵字或需要避免的內容。",
|
||||
image_strategy_reference_hint: "參考圖只展示渲染風格;最終 AI 圖片直接繼承上方已選的整套 PPT 配色。",
|
||||
image_strategy_no_reference: "自訂選擇沒有參考圖。",
|
||||
image_source_summary: "已選圖片來源",
|
||||
@@ -701,32 +653,32 @@
|
||||
image_usage_required: "請至少選擇一種圖片使用方式。",
|
||||
image_usage_none_exclusive: "「不使用圖片」不能和其他圖片選項同時選擇。",
|
||||
proactive_execution_hint: "這些預設開關只在你沒有明確要求時生效;你最新的明確指令始終優先。",
|
||||
proactive_speaker_notes: "主動生成演講者備註",
|
||||
proactive_speaker_notes_desc: "預設開啟。無需另行要求,Agent 也會生成演講者備註。",
|
||||
proactive_speaker_notes: "主動生成講者備忘稿",
|
||||
proactive_speaker_notes_desc: "預設開啟。無需另行要求,Agent 也會生成講者備忘稿。",
|
||||
proactive_custom_animations: "主動生成自訂動畫",
|
||||
proactive_custom_animations_desc: "預設關閉。策略師的動畫建議仍會保留;開啟後,Agent 可在沒有另行要求時實際製作自訂動畫。",
|
||||
proactive_narration_audio: "主動生成旁白音訊",
|
||||
proactive_narration_audio_desc: "預設關閉。這裡保留原始選擇,不改寫演講者備註開關;策略師會在設計規範中解析旁白所需的最終備註狀態。",
|
||||
proactive_narration_audio_desc: "預設關閉。這裡保留原始選擇,不改寫講者備忘稿開關;策略師會在設計規範中解析旁白所需的最終備忘稿狀態。",
|
||||
font_heading: "標題",
|
||||
font_body: "正文",
|
||||
font_selection: "字型選擇",
|
||||
primary_language_font: "主要語言字型",
|
||||
english_font: "英文字型",
|
||||
font_picker_hint: "選擇推薦方案會同步下方字型;修改任一下拉或手動字型後會標記為已自訂。",
|
||||
font_picker_hint: "選擇推薦方案會同步下方字型;修改任一下拉選單或手動輸入字型後,會標示為已自訂。",
|
||||
other_installed_font: "其他已安裝字型…",
|
||||
other_font_placeholder: "輸入精確的已安裝字型名稱",
|
||||
customized: "已自訂",
|
||||
font_body_size: "正文基準字級",
|
||||
font_body_size_hint: "所有字級按這個正文基準推導。",
|
||||
body_size_unit_relation: "SVG px 與 PPT pt 的換算:1px = 0.75pt。",
|
||||
body_size_pt_hint: "約 {pt} pt(按 1px = 0.75pt 換算;提交仍儲存 px)。",
|
||||
body_size_pt_hint: "約 {pt} pt(依 1px = 0.75pt 換算;儲存時仍以 px 為準)",
|
||||
role_size_pt_hint: "約 {pt} pt",
|
||||
body_size_hint_canvas: "目前畫布建議 ~{lo}–{hi}px(依有效畫布跨距計算)。",
|
||||
body_size_hint_purpose: "該閱讀模式推薦 {def}px(單一固定值,非區間)。",
|
||||
body_size_hint_oor: "(目前數值超出該畫布的常用範圍——請確認單位無誤、是否合適。)",
|
||||
delivery_purpose: "閱讀模式",
|
||||
delivery_purpose_hint: "決定資訊主要由頁面還是講者承擔:近讀型用完整句、短段落和細節自洽;演講型一頁一意,以簡短主張和視覺證據為主。",
|
||||
size_override: "逐角色字級覆蓋:",
|
||||
delivery_purpose_hint: "決定資訊主要由頁面還是講者承擔:文字型簡報要能獨立閱讀,用完整句、短段落和必要細節說清楚;演講型簡報一頁一意,以簡短主張和視覺證據為主。",
|
||||
size_override: "逐角色字級覆寫:",
|
||||
size_role_title: "標題",
|
||||
size_role_subtitle: "副標題",
|
||||
size_role_annotation: "註解",
|
||||
@@ -739,30 +691,22 @@
|
||||
role_accent: "強調",
|
||||
role_secondary_accent: "次強調",
|
||||
role_body_text: "正文文字",
|
||||
cjk: "中文",
|
||||
latin: "西文",
|
||||
sample_heading_cjk: "主題方案標題",
|
||||
sample_heading_latin: "Presentation Title",
|
||||
sample_body_cjk: "關鍵資訊摘要",
|
||||
sample_body_latin: "Key message summary",
|
||||
style_preview_label: "整體形象(配色 + 字型 + 圖示)",
|
||||
style_preview_body: "· 僅大致形象,非實際版式",
|
||||
no_icons: "無圖示",
|
||||
style_preview_label: "整體印象(配色 + 字型 + 圖示)",
|
||||
style_preview_body: "· 僅供大致印象參考,非實際版面",
|
||||
preview_big_title: "大標題",
|
||||
preview_section_title: "章節標題",
|
||||
preview_latin_title: "Section Title",
|
||||
preview_body_intro: "正文內容用於判斷基礎字級、行距和顏色對比。",
|
||||
preview_latin_body: "Body text sample for checking Latin typography.",
|
||||
preview_point_1_title: "正文內容",
|
||||
preview_point_1_text: "這裡展示普通段落的密度和閱讀節奏。",
|
||||
preview_point_2_title: "要點說明",
|
||||
preview_point_2_title: "要點",
|
||||
preview_point_2_text: "圖示和文字放在一起,判斷真實使用效果。",
|
||||
preview_point_3_title: "結論建議",
|
||||
preview_point_3_title: "結論",
|
||||
preview_point_3_text: "組合效果需要在簡報場景下保持清晰可讀。",
|
||||
mode_continuous_desc: "一次性連續生成整份簡報。",
|
||||
mode_split_desc: "寫完設計規範後停止,另開視窗繼續生成頁面。",
|
||||
refine_off_desc: "依次生成設計規範和執行鎖,然後自動繼續。",
|
||||
refine_on_desc: "生成設計規範後暫停,並開啟評審頁面:可逐頁直接修改或留下修改意見;在聊天中明確確認後再生成執行鎖並繼續製作。",
|
||||
refine_on_desc: "生成設計規範後暫停,並開啟審閱頁面:可逐頁直接修改或留下修改意見;在對話中明確確認後再生成執行鎖並繼續製作。",
|
||||
off_default: "關",
|
||||
on: "開",
|
||||
option_prefix: "方案",
|
||||
@@ -822,22 +766,22 @@
|
||||
flat: { zh: "扁平插画", zh_tw: "扁平插畫", en: "Flat illustration", ja: "フラットイラスト" },
|
||||
"3d-isometric": { zh: "3D 等距", zh_tw: "3D 等距", en: "3D isometric", ja: "3Dアイソメトリック" },
|
||||
"digital-dashboard": { zh: "数字仪表盘", zh_tw: "數位儀表板", en: "Digital dashboard", ja: "デジタルダッシュボード" },
|
||||
"corporate-photo": { zh: "企业摄影", zh_tw: "企業攝影", en: "Corporate photo", ja: "企業写真" },
|
||||
"corporate-photo": { zh: "企业摄影", zh_tw: "企業攝影", en: "Corporate photo", ja: "ビジネス写真" },
|
||||
blueprint: { zh: "蓝图线稿", zh_tw: "藍圖線稿", en: "Blueprint", ja: "ブループリント" },
|
||||
editorial: { zh: "编辑杂志", zh_tw: "編輯雜誌", en: "Editorial", ja: "エディトリアル" },
|
||||
editorial: { zh: "杂志编辑风", zh_tw: "編輯雜誌", en: "Editorial", ja: "エディトリアル" },
|
||||
"sketch-notes": { zh: "手绘笔记", zh_tw: "手繪筆記", en: "Sketch notes", ja: "スケッチノート" },
|
||||
"ink-notes": { zh: "墨线笔记", zh_tw: "墨線筆記", en: "Ink notes", ja: "インクノート" },
|
||||
chalkboard: { zh: "粉笔黑板", zh_tw: "粉筆黑板", en: "Chalkboard", ja: "チョークボード" },
|
||||
"ink-notes": { zh: "墨迹笔记", zh_tw: "墨跡筆記", en: "Ink notes", ja: "インクノート" },
|
||||
chalkboard: { zh: "粉笔黑板", zh_tw: "粉筆黑板", en: "Chalkboard", ja: "黒板" },
|
||||
watercolor: { zh: "水彩", zh_tw: "水彩", en: "Watercolor", ja: "水彩" },
|
||||
"warm-scene": { zh: "暖调场景", zh_tw: "暖調場景", en: "Warm scene", ja: "暖色シーン" },
|
||||
"screen-print": { zh: "丝网印刷", zh_tw: "絲網印刷", en: "Screen print", ja: "スクリーンプリント" },
|
||||
"fantasy-animation": { zh: "幻想动画", zh_tw: "幻想動畫", en: "Fantasy animation", ja: "ファンタジーアニメ" },
|
||||
"pixel-art": { zh: "像素艺术", zh_tw: "像素藝術", en: "Pixel art", ja: "ピクセルアート" },
|
||||
nature: { zh: "自然有机", zh_tw: "自然有機", en: "Nature", ja: "自然・オーガニック" },
|
||||
"minimalist-swiss": { zh: "瑞士极简", zh_tw: "瑞士極簡", en: "Minimalist Swiss", ja: "スイスミニマル" },
|
||||
"minimalist-swiss": { zh: "瑞士极简", zh_tw: "瑞士極簡", en: "Minimalist Swiss", ja: "スイス・ミニマル" },
|
||||
glassmorphism: { zh: "玻璃拟态", zh_tw: "玻璃擬態", en: "Glassmorphism", ja: "グラスモーフィズム" },
|
||||
"vintage-poster": { zh: "复古海报", zh_tw: "復古海報", en: "Vintage poster", ja: "ヴィンテージポスター" },
|
||||
"paper-cut": { zh: "剪纸拼贴", zh_tw: "剪紙拼貼", en: "Paper cut", ja: "ペーパーカット" }
|
||||
"paper-cut": { zh: "剪纸拼贴", zh_tw: "剪紙拼貼", en: "Paper cut", ja: "切り絵" }
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+79
-79
@@ -11,9 +11,9 @@
|
||||
"dim": "1280×720",
|
||||
"viewbox": "0 0 1280 720",
|
||||
"use_zh": "现代投影 / 在线演示",
|
||||
"use_zh_tw": "現代投影 / 線上簡報",
|
||||
"use_zh_tw": "現代投影機 / 線上簡報",
|
||||
"use_en": "Modern projectors / online",
|
||||
"use_ja": "現代的なプロジェクター/オンライン発表"
|
||||
"use_ja": "現在主流のプロジェクター/オンライン発表"
|
||||
},
|
||||
{
|
||||
"id": "ppt43",
|
||||
@@ -25,7 +25,7 @@
|
||||
"dim": "1024×768",
|
||||
"viewbox": "0 0 1024 768",
|
||||
"use_zh": "传统投影",
|
||||
"use_zh_tw": "傳統投影",
|
||||
"use_zh_tw": "傳統投影機",
|
||||
"use_en": "Traditional projectors",
|
||||
"use_ja": "従来型プロジェクター"
|
||||
},
|
||||
@@ -55,7 +55,7 @@
|
||||
"use_zh": "知识分享 / 种草封面",
|
||||
"use_zh_tw": "知識分享 / 種草封面",
|
||||
"use_en": "Knowledge sharing",
|
||||
"use_ja": "知識共有/おすすめ紹介カバー"
|
||||
"use_ja": "知識共有/おすすめ紹介のカバー画像"
|
||||
},
|
||||
{
|
||||
"id": "moments",
|
||||
@@ -83,7 +83,7 @@
|
||||
"use_zh": "短视频 / 竖屏封面",
|
||||
"use_zh_tw": "短影片 / 直式封面",
|
||||
"use_en": "Short-video / story cover",
|
||||
"use_ja": "ショート動画/ストーリーカバー"
|
||||
"use_ja": "ショート動画/ストーリーズのカバー画像"
|
||||
},
|
||||
{
|
||||
"id": "banner",
|
||||
@@ -111,7 +111,7 @@
|
||||
"use_zh": "打印 / 文档导出",
|
||||
"use_zh_tw": "列印 / 文件匯出",
|
||||
"use_en": "Print / PDF export",
|
||||
"use_ja": "印刷/PDF出力"
|
||||
"use_ja": "印刷/PDFエクスポート"
|
||||
}
|
||||
],
|
||||
"fonts": [
|
||||
@@ -352,7 +352,7 @@
|
||||
{
|
||||
"id": "Yu Gothic",
|
||||
"label": "Yu Gothic",
|
||||
"label_zh": "游哥特体",
|
||||
"label_zh": "游黑体",
|
||||
"label_zh_tw": "游黑體",
|
||||
"label_en": "Yu Gothic",
|
||||
"label_ja": "游ゴシック",
|
||||
@@ -378,7 +378,7 @@
|
||||
{
|
||||
"id": "BIZ UDGothic",
|
||||
"label": "BIZ UDGothic",
|
||||
"label_zh": "BIZ UD哥特体",
|
||||
"label_zh": "BIZ UD黑体",
|
||||
"label_zh_tw": "BIZ UD黑體",
|
||||
"label_en": "BIZ UDGothic",
|
||||
"label_ja": "BIZ UDゴシック",
|
||||
@@ -391,7 +391,7 @@
|
||||
{
|
||||
"id": "BIZ UDPGothic",
|
||||
"label": "BIZ UDPGothic",
|
||||
"label_zh": "BIZ UDP哥特体",
|
||||
"label_zh": "BIZ UDP黑体",
|
||||
"label_zh_tw": "BIZ UDP黑體",
|
||||
"label_en": "BIZ UDPGothic",
|
||||
"label_ja": "BIZ UDPゴシック",
|
||||
@@ -404,7 +404,7 @@
|
||||
{
|
||||
"id": "MS Gothic",
|
||||
"label": "MS Gothic",
|
||||
"label_zh": "MS 哥特体",
|
||||
"label_zh": "MS 黑体",
|
||||
"label_zh_tw": "MS 黑體",
|
||||
"label_en": "MS Gothic",
|
||||
"label_ja": "MS ゴシック",
|
||||
@@ -417,7 +417,7 @@
|
||||
{
|
||||
"id": "MS PGothic",
|
||||
"label": "MS PGothic",
|
||||
"label_zh": "MS P哥特体",
|
||||
"label_zh": "MS P黑体",
|
||||
"label_zh_tw": "MS P黑體",
|
||||
"label_en": "MS PGothic",
|
||||
"label_ja": "MS Pゴシック",
|
||||
@@ -1008,10 +1008,10 @@
|
||||
"label_zh_tw": "金字塔",
|
||||
"label_en": "pyramid",
|
||||
"label_ja": "ピラミッド",
|
||||
"desc_zh": "结论先行、相互独立且完全穷尽的论证、每个数据都带比较。适合决策、分析、战略、汇报。",
|
||||
"desc_zh_tw": "結論先行、相互獨立且完全窮盡的論證、每個數據都帶比較。適合決策、分析、戰略、報告。",
|
||||
"desc_en": "Lead with the answer, use MECE reasoning, and compare every key data point. Best for decisions, analysis, strategy, and reporting.",
|
||||
"desc_ja": "結論を先に示し、MECEな論理構成で、主要データは必ず比較を添える。意思決定・分析・戦略・報告に最適。"
|
||||
"desc_zh": "结论先行;材料支持时采用相互独立、完全穷尽的论证,并为数据配上有依据的对比。适合决策、分析、战略、汇报。",
|
||||
"desc_zh_tw": "結論先行;材料支持時採用相互獨立、完全窮盡的論證,並為數據配上有依據的對比。適合決策、分析、策略、報告。",
|
||||
"desc_en": "Lead with the answer, use MECE reasoning where the source supports it, and give data a supported comparison where useful. Best for decisions, analysis, strategy, and reporting.",
|
||||
"desc_ja": "結論を先に示し、元資料が裏付ける範囲でMECEな論理構成をとり、根拠のある比較で数値の意味を示す。意思決定・分析・戦略・報告に最適。"
|
||||
},
|
||||
{
|
||||
"id": "narrative",
|
||||
@@ -1020,10 +1020,10 @@
|
||||
"label_zh_tw": "敘事",
|
||||
"label_en": "narrative",
|
||||
"label_ja": "ナラティブ",
|
||||
"desc_zh": "情境、张力、解决方案形成故事弧线,保留悬念与转折。适合路演、案例、品牌、融资。",
|
||||
"desc_zh_tw": "情境、張力、解決方案形成故事弧線,保留懸念與轉折。適合路演、案例、品牌、融資。",
|
||||
"desc_zh": "从情境到张力再到化解,形成故事弧线,保留悬念与转折。适合路演、案例、品牌故事、融资。",
|
||||
"desc_zh_tw": "情境、張力、解決方案形成故事弧線,保留懸念與轉折。適合路演、案例、品牌、募資。",
|
||||
"desc_en": "Build a story arc from context to tension to resolution, with suspense and turns. Best for roadshows, cases, brand stories, and fundraising.",
|
||||
"desc_ja": "状況設定から緊張、解決へとストーリーアークを描き、意外性や転換を残す。ロードショー・事例紹介・ブランドストーリー・資金調達向け。"
|
||||
"desc_ja": "状況設定から緊張、解決へと物語の流れを組み立て、先が気になる展開や転換を残す。ピッチ・事例紹介・ブランドストーリー・資金調達向け。"
|
||||
},
|
||||
{
|
||||
"id": "instructional",
|
||||
@@ -1033,7 +1033,7 @@
|
||||
"label_en": "instructional",
|
||||
"label_ja": "教育・解説",
|
||||
"desc_zh": "概念拆解、分步推进、并列讲解。适合培训、教程、科普、知识分享。",
|
||||
"desc_zh_tw": "概念拆解、分步推進、並列講解。適合培訓、教程、科普、知識分享。",
|
||||
"desc_zh_tw": "概念拆解、分步推進、並列講解。適合培訓、教學、科普、知識分享。",
|
||||
"desc_en": "Break concepts down, advance step by step, and explain parallel ideas clearly. Best for training, tutorials, popular science, and knowledge sharing.",
|
||||
"desc_ja": "概念を分解し、段階的に進め、並列する要素を明確に説明する。研修・チュートリアル・科学解説・知識共有に最適。"
|
||||
},
|
||||
@@ -1044,10 +1044,10 @@
|
||||
"label_zh_tw": "展演",
|
||||
"label_en": "showcase",
|
||||
"label_ja": "ショーケース",
|
||||
"desc_zh": "视觉主导,大图、大数和情绪节奏优先。适合发布、品牌秀、活动。",
|
||||
"desc_zh": "视觉主导,大图、大数字和情绪节奏优先。适合发布会、品牌秀、活动。",
|
||||
"desc_zh_tw": "視覺主導,大圖、大數和情緒節奏優先。適合發表、品牌秀、活動。",
|
||||
"desc_en": "Use visual rhythm, large images, and strong numbers as the lead. Best for launches, brand showcases, and events.",
|
||||
"desc_ja": "ビジュアル主導で、大きな画像・大きな数字・感情のリズムを優先する。発表会・ブランドショー・イベント向け。"
|
||||
"desc_en": "Lead visually with large images, strong numbers, and emotional rhythm. Best for launches, brand showcases, and events.",
|
||||
"desc_ja": "ビジュアル主導で、大きな画像・インパクトのある数字・感情のリズムを優先する。製品発表・ブランド紹介・イベント向け。"
|
||||
},
|
||||
{
|
||||
"id": "briefing",
|
||||
@@ -1056,10 +1056,10 @@
|
||||
"label_zh_tw": "簡報",
|
||||
"label_en": "briefing",
|
||||
"label_ja": "ブリーフィング",
|
||||
"desc_zh": "中性完整、便于速览,采用主题式标题和均匀权重。适合周报、参考材料、常见问题、会议包。",
|
||||
"desc_zh_tw": "中性完整、便於速覽,採用主題式標題和均勻權重。適合週報、參考材料、常見問題、會議包。",
|
||||
"desc_zh": "中性完整、便于速览,采用主题式标题和均匀权重。适合周报、参考材料、常见问题、会议资料。",
|
||||
"desc_zh_tw": "中性完整、便於速覽,採用主題式標題和均勻權重。適合週報、參考資料、常見問題、會議簡報。",
|
||||
"desc_en": "Stay neutral, complete, and scannable with topical headings and balanced weight. Best for weekly reports, reference packs, FAQs, and meeting decks.",
|
||||
"desc_ja": "中立的かつ網羅的で一覧しやすく、トピック見出しと均等な重み付けを用いる。週次報告・参考資料・FAQ・会議資料に最適。"
|
||||
"desc_ja": "中立的で漏れがなく、ざっと目を通しやすい構成。話題ごとに見出しを立て、各項目を均等な比重で扱う。週次報告・参考資料・FAQ・会議資料に最適。"
|
||||
}
|
||||
],
|
||||
"visual_styles": [
|
||||
@@ -1077,7 +1077,7 @@
|
||||
"label_zh_tw": "瑞士極簡",
|
||||
"label_en": "swiss-minimal",
|
||||
"label_ja": "スイス・ミニマル",
|
||||
"desc_zh": "网格锁定、锐利层级、大留白、少装饰。",
|
||||
"desc_zh": "网格严谨、层级分明、大量留白、装饰极少。",
|
||||
"desc_zh_tw": "網格鎖定、銳利層級、大留白、少裝飾。",
|
||||
"desc_en": "Grid-locked layout, sharp hierarchy, generous whitespace, and minimal decoration.",
|
||||
"desc_ja": "グリッドに沿ったレイアウト、明快な階層、余白を活かした装飾の少ないデザイン。"
|
||||
@@ -1102,7 +1102,7 @@
|
||||
"label_en": "glassmorphism",
|
||||
"label_ja": "グラスモーフィズム",
|
||||
"desc_zh": "半透明玻璃面板、渐变光感、漂浮层次。",
|
||||
"desc_zh_tw": "半透明玻璃面板、漸變光感、漂浮層次。",
|
||||
"desc_zh_tw": "半透明玻璃面板、漸層光感、漂浮層次。",
|
||||
"desc_en": "Translucent glass panels, gradient light, and floating depth.",
|
||||
"desc_ja": "半透明のガラスパネル、グラデーションの光、浮遊感のある奥行き。"
|
||||
},
|
||||
@@ -1113,7 +1113,7 @@
|
||||
"label_zh_tw": "深色科技",
|
||||
"label_en": "dark-tech",
|
||||
"label_ja": "ダークテック",
|
||||
"desc_zh": "深色画布、发光强调、几何精确。",
|
||||
"desc_zh": "深色背景、发光强调色、几何精确。",
|
||||
"desc_zh_tw": "深色畫布、發光強調、幾何精確。",
|
||||
"desc_en": "Dark canvas, glowing accents, and precise geometry.",
|
||||
"desc_ja": "ダークな背景、光るアクセント、精密な幾何学表現。"
|
||||
@@ -1142,7 +1142,7 @@
|
||||
{
|
||||
"id": "editorial",
|
||||
"label": "editorial",
|
||||
"label_zh": "编辑出版",
|
||||
"label_zh": "杂志编辑风",
|
||||
"label_zh_tw": "編輯出版",
|
||||
"label_en": "editorial",
|
||||
"label_ja": "エディトリアル",
|
||||
@@ -1154,7 +1154,7 @@
|
||||
{
|
||||
"id": "photo-editorial",
|
||||
"label": "photo-editorial",
|
||||
"label_zh": "摄影编辑",
|
||||
"label_zh": "摄影编辑风",
|
||||
"label_zh_tw": "攝影編輯",
|
||||
"label_en": "photo-editorial",
|
||||
"label_ja": "フォトエディトリアル",
|
||||
@@ -1185,7 +1185,7 @@
|
||||
"desc_zh": "报纸密度、粗线框、原始结构、扁平表达。",
|
||||
"desc_zh_tw": "報紙密度、粗線框、原始結構、扁平表達。",
|
||||
"desc_en": "Newspaper-like density, heavy rules, raw structure, and flat treatment.",
|
||||
"desc_ja": "新聞のような情報密度、太い罫線、素朴な構造、フラットな表現。"
|
||||
"desc_ja": "新聞のような情報密度、太い罫線、むき出しの構造、フラットな表現。"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1194,7 +1194,7 @@
|
||||
"group_zh": "表现 / 印刷",
|
||||
"group_zh_tw": "表現 / 印刷",
|
||||
"group_en": "Expressive / print",
|
||||
"group_ja": "表現的/印刷",
|
||||
"group_ja": "表現重視/印刷物風",
|
||||
"items": [
|
||||
{
|
||||
"id": "memphis",
|
||||
@@ -1215,10 +1215,10 @@
|
||||
"label_zh_tw": "小刊",
|
||||
"label_en": "zine",
|
||||
"label_ja": "ジン(自主制作誌)",
|
||||
"desc_zh": "孔版印刷错位、半调、有限色、印刷颗粒。",
|
||||
"desc_zh": "孔版印刷错位、半色调、有限色、印刷颗粒。",
|
||||
"desc_zh_tw": "孔版印刷錯位、半色調、有限色、印刷顆粒。",
|
||||
"desc_en": "Riso offsets, halftones, limited colors, and print grain.",
|
||||
"desc_ja": "リソグラフのズレ、ハーフトーン、限られた色数、印刷の粒感。"
|
||||
"desc_ja": "リソグラフ印刷特有の版ズレ、ハーフトーン、限られた色数、印刷の粒感。"
|
||||
},
|
||||
{
|
||||
"id": "vintage-poster",
|
||||
@@ -1227,7 +1227,7 @@
|
||||
"label_zh_tw": "復古海報",
|
||||
"label_en": "vintage-poster",
|
||||
"label_ja": "ヴィンテージポスター",
|
||||
"desc_zh": "中世纪扁平色块、半调、复古几何暖意。",
|
||||
"desc_zh": "20 世纪中期风格的扁平色块、半色调与暖调复古几何。",
|
||||
"desc_zh_tw": "二十世紀中期的扁平色塊、半色調與暖調復古幾何。",
|
||||
"desc_en": "Mid-century flat color blocks, halftones, and warm vintage geometry.",
|
||||
"desc_ja": "ミッドセンチュリー調のフラットな色面、ハーフトーン、温かみのあるレトロな幾何学模様。"
|
||||
@@ -1242,7 +1242,7 @@
|
||||
"desc_zh": "层叠剪纸、层间柔影、手作质感。",
|
||||
"desc_zh_tw": "層疊剪紙、層間柔影、手作質感。",
|
||||
"desc_en": "Layered cut paper, soft inter-layer shadows, and a handmade feel.",
|
||||
"desc_ja": "重なり合う切り紙、層間の柔らかな影、手作り感のある質感。"
|
||||
"desc_ja": "重なり合う切り絵、層間の柔らかな影、手作り感のある質感。"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1259,7 +1259,7 @@
|
||||
"label_zh": "手绘笔记",
|
||||
"label_zh_tw": "手繪筆記",
|
||||
"label_en": "sketch-notes",
|
||||
"label_ja": "手描きノート",
|
||||
"label_ja": "スケッチノート",
|
||||
"desc_zh": "暖纸底、涂鸦线条、柔和彩块。",
|
||||
"desc_zh_tw": "暖紙底、塗鴉線條、柔和彩塊。",
|
||||
"desc_en": "Warm paper, doodle lines, and soft color blocks.",
|
||||
@@ -1284,7 +1284,7 @@
|
||||
"label_zh_tw": "黑板",
|
||||
"label_en": "chalkboard",
|
||||
"label_ja": "黒板",
|
||||
"desc_zh": "深板岩底、粉笔笔触、粉彩强调。",
|
||||
"desc_zh": "深石板底、粉笔笔触、粉彩强调。",
|
||||
"desc_zh_tw": "深板岩底、粉筆筆觸、粉彩強調。",
|
||||
"desc_en": "Dark slate surface, chalk strokes, and pastel emphasis.",
|
||||
"desc_ja": "濃いスレート調の背景に、チョークの筆致とパステルの強調色。"
|
||||
@@ -1332,7 +1332,7 @@
|
||||
"label_zh": "几何实心图标",
|
||||
"label_zh_tw": "幾何實心圖示",
|
||||
"label_en": "chunk-filled",
|
||||
"label_ja": "幾何学的塗りつぶしアイコン",
|
||||
"label_ja": "幾何学的な塗りつぶしアイコン",
|
||||
"desc_zh": "实心、直线几何、锐利厚重,适合科技、工程、企业结构图。",
|
||||
"desc_zh_tw": "實心、直線幾何、銳利厚重,適合科技、工程、企業結構圖。",
|
||||
"desc_en": "Solid, straight, geometric, sharp, and heavy. Good for tech, engineering, and corporate structure diagrams.",
|
||||
@@ -1348,7 +1348,7 @@
|
||||
"desc_zh": "实心、圆润曲线、中等视觉重量,适合亲和现代风格。",
|
||||
"desc_zh_tw": "實心、圓潤曲線、中等視覺重量,適合親和現代風格。",
|
||||
"desc_en": "Solid, rounded, and medium-weight. Good for friendly modern styles.",
|
||||
"desc_ja": "塗りつぶし・丸みのある曲線で、中程度の視覚的な重み。親しみやすいモダンなスタイルに適する。"
|
||||
"desc_ja": "塗りつぶし・丸みのある曲線で、太さは中程度。親しみやすいモダンなスタイルに適する。"
|
||||
},
|
||||
{
|
||||
"id": "tabler-outline",
|
||||
@@ -1356,11 +1356,11 @@
|
||||
"label_zh": "线性描边图标",
|
||||
"label_zh_tw": "線性描邊圖示",
|
||||
"label_en": "tabler-outline",
|
||||
"label_ja": "線形アウトラインアイコン",
|
||||
"desc_zh": "线性描边,轻盈精致,适合屏幕阅读和编辑型图标。",
|
||||
"desc_zh_tw": "線性描邊,輕盈精緻,適合螢幕閱讀和編輯型圖示。",
|
||||
"label_ja": "線画(アウトライン)アイコン",
|
||||
"desc_zh": "线性描边,轻盈精致,适合屏幕阅读和可编辑图标。",
|
||||
"desc_zh_tw": "線性描邊,輕盈精緻,適合螢幕閱讀與可編輯圖示。",
|
||||
"desc_en": "Linear stroke, light and refined. Good for screen reading and editable icons.",
|
||||
"desc_ja": "線形のストロークで、軽やかで洗練された印象。画面表示や編集用アイコンに適する。"
|
||||
"desc_ja": "細い線のストロークで、軽やかで洗練された印象。画面での閲覧や、編集しやすいアイコンに適する。"
|
||||
},
|
||||
{
|
||||
"id": "phosphor-duotone",
|
||||
@@ -1368,11 +1368,11 @@
|
||||
"label_zh": "双色层次图标",
|
||||
"label_zh_tw": "雙色層次圖示",
|
||||
"label_en": "phosphor-duotone",
|
||||
"label_ja": "デュオトーン階調アイコン",
|
||||
"label_ja": "デュオトーン(2色)アイコン",
|
||||
"desc_zh": "双色层次、中等重量,适合现代产品和平台类表达。",
|
||||
"desc_zh_tw": "雙色層次、中等重量,適合現代產品和平台類表達。",
|
||||
"desc_en": "Two-tone layering with medium weight. Good for modern product and platform narratives.",
|
||||
"desc_ja": "2色の階調表現で中程度の重み。モダンなプロダクトやプラットフォームの説明に適する。"
|
||||
"desc_ja": "2色を重ねた表現で、太さは中程度。モダンなプロダクトやプラットフォームの説明に適する。"
|
||||
},
|
||||
{
|
||||
"id": "emoji",
|
||||
@@ -1384,12 +1384,12 @@
|
||||
"desc_zh": "系统表情符号,适合轻量、社交、教学或快速识别场景;正式企业 / 咨询风谨慎使用。",
|
||||
"desc_zh_tw": "系統表情符號,適合輕量、社交、教學或快速識別場景;正式企業 / 諮詢風謹慎使用。",
|
||||
"desc_en": "System emoji for lightweight, social, instructional, or quick-recognition contexts; use carefully in formal corporate or consulting decks.",
|
||||
"desc_ja": "システム絵文字。軽やかなSNS・教育・素早い視認が求められる場面向き。フォーマルな企業/コンサル資料では慎重に使用すること。"
|
||||
"desc_ja": "OS標準の絵文字。カジュアルな場面、SNS、教育、瞬時の認識が求められる場面に向く。フォーマルな企業資料やコンサル資料では使用に注意。"
|
||||
},
|
||||
{
|
||||
"id": "none",
|
||||
"label": "不用图标",
|
||||
"label_zh": "不用图标",
|
||||
"label_zh": "不使用图标",
|
||||
"label_zh_tw": "不用圖示",
|
||||
"label_en": "No icons",
|
||||
"label_ja": "アイコンなし"
|
||||
@@ -1399,7 +1399,7 @@
|
||||
{
|
||||
"id": "ai",
|
||||
"label": "AI 生成",
|
||||
"label_zh": "生成配图",
|
||||
"label_zh": "AI 生成图",
|
||||
"label_zh_tw": "生成配圖",
|
||||
"label_en": "AI-generated",
|
||||
"label_ja": "AI生成"
|
||||
@@ -1410,7 +1410,7 @@
|
||||
"label_zh": "网络来源",
|
||||
"label_zh_tw": "網路來源",
|
||||
"label_en": "Web-sourced",
|
||||
"label_ja": "Web由来"
|
||||
"label_ja": "Webから取得"
|
||||
},
|
||||
{
|
||||
"id": "provided",
|
||||
@@ -1424,7 +1424,7 @@
|
||||
"id": "placeholder",
|
||||
"label": "占位符",
|
||||
"label_zh": "占位符",
|
||||
"label_zh_tw": "佔位符",
|
||||
"label_zh_tw": "預留位置",
|
||||
"label_en": "Placeholder",
|
||||
"label_ja": "プレースホルダー"
|
||||
},
|
||||
@@ -1441,38 +1441,38 @@
|
||||
{
|
||||
"id": "auto",
|
||||
"label": "Automatic Path A → Path B",
|
||||
"label_zh": "自动生成(接口 → 宿主工具)",
|
||||
"label_zh_tw": "自動生成(API → 宿主工具)",
|
||||
"label_zh": "自动(API → 宿主原生工具)",
|
||||
"label_zh_tw": "自動生成(API → 主機端工具)",
|
||||
"label_en": "Automatic Path A → Path B",
|
||||
"label_ja": "自動生成(Path A → Path B)",
|
||||
"desc_zh": "两条自动路径都不可用或失败时暂停,由你选择修复后重试、手动生成或取消受影响的 AI 图;不会自动转为手动。",
|
||||
"label_ja": "自動(Path A → Path B)",
|
||||
"desc_zh": "两条自动路径都不可用或失败时暂停,由你选择修复后重试、手动生成或取消受影响的 AI 生成图;不会自动转为手动。",
|
||||
"desc_zh_tw": "兩條自動路徑都不可用或失敗時暫停,由你選擇修復後重試、手動生成或取消受影響的 AI 圖;不會自動轉為手動。",
|
||||
"desc_en": "If both automated paths are unavailable or fail, pause for your choice: repair and retry, generate manually, or cancel the affected AI images. Manual is never assumed.",
|
||||
"desc_ja": "両方の自動経路が利用不能または失敗した場合は停止し、修復後の再試行、手動生成、影響を受けたAI画像の取り消しから選択します。手動へ自動移行しません。"
|
||||
"desc_ja": "2つの自動経路がどちらも利用できないか失敗した場合は、いったん停止して選択を求めます。選択肢は、修復して再試行、手動で生成、対象のAI画像の生成を取りやめる、の3つです。自動で手動生成に切り替わることはありません。"
|
||||
},
|
||||
{
|
||||
"id": "api",
|
||||
"label": "Path A",
|
||||
"label_zh": "接口后端",
|
||||
"label_zh": "API 后端(路径 A)",
|
||||
"label_zh_tw": "API 後端",
|
||||
"label_en": "Path A",
|
||||
"label_ja": "Path A",
|
||||
"desc_zh": "强制走接口后端,第 5 步运行 image_gen.py(需已配置 IMAGE_BACKEND)。",
|
||||
"desc_zh_tw": "強制走 API 後端,第 5 步執行 image_gen.py(需已配置 IMAGE_BACKEND)。",
|
||||
"desc_zh": "强制使用 API 后端,第 5 步运行 image_gen.py(需已配置 IMAGE_BACKEND)。",
|
||||
"desc_zh_tw": "強制走 API 後端,第 5 步執行 image_gen.py(需已設定 IMAGE_BACKEND)。",
|
||||
"desc_en": "Force the API backend — image_gen.py runs in Step 5 (requires IMAGE_BACKEND).",
|
||||
"desc_ja": "APIバックエンドを強制使用。ステップ5でimage_gen.pyを実行(IMAGE_BACKENDの設定が必要)。"
|
||||
"desc_ja": "APIバックエンドに固定します。ステップ5で image_gen.py を実行します(IMAGE_BACKEND の設定が必要)。"
|
||||
},
|
||||
{
|
||||
"id": "host-native",
|
||||
"label": "Path B",
|
||||
"label_zh": "宿主原生工具",
|
||||
"label_zh_tw": "宿主原生工具",
|
||||
"label_zh": "宿主原生工具(路径 B)",
|
||||
"label_zh_tw": "主機端原生工具",
|
||||
"label_en": "Path B",
|
||||
"label_ja": "Path B",
|
||||
"desc_zh": "强制使用当前环境的原生图像工具生成(即使配置了 IMAGE_BACKEND 也跳过接口);需宿主提供原生图像工具(Codex / Claude Code 等)。",
|
||||
"desc_zh_tw": "強制使用目前環境的原生影像工具生成(即使配置了 IMAGE_BACKEND 也跳過 API);需宿主提供原生影像工具(Codex / Claude Code 等)。",
|
||||
"desc_zh": "强制使用当前环境的原生图像工具生成(即使配置了 IMAGE_BACKEND 也跳过 API);需宿主提供原生图像工具(Codex / Claude Code 等)。",
|
||||
"desc_zh_tw": "強制使用目前環境的原生圖片工具生成(即使設定了 IMAGE_BACKEND 也跳過 API);需主機提供原生圖片工具(Codex / Claude Code 等)。",
|
||||
"desc_en": "Force the host's native image tool (skips the API even if IMAGE_BACKEND is set); requires a host with a native image tool (Codex / Claude Code / similar).",
|
||||
"desc_ja": "現在の環境のネイティブ画像ツールを強制使用(IMAGE_BACKENDが設定されていてもAPIをスキップ)。ネイティブ画像ツールを持つホスト(Codex/Claude Codeなど)が必要。"
|
||||
"desc_ja": "実行環境に内蔵の画像ツールに固定します(IMAGE_BACKEND が設定されていても API は使いません)。Codex/Claude Code など、画像ツールを内蔵した環境が必要です。"
|
||||
},
|
||||
{
|
||||
"id": "manual",
|
||||
@@ -1482,9 +1482,9 @@
|
||||
"label_en": "Offline Manual",
|
||||
"label_ja": "オフライン手動",
|
||||
"desc_zh": "写入图片提示词;你在外部生成并放入项目图片目录。必需图片齐全并验证前不允许导出。",
|
||||
"desc_zh_tw": "寫入圖片提示詞;你在外部生成並放入專案圖片目錄。必要圖片齊全並驗證前不允許匯出。",
|
||||
"desc_zh_tw": "寫入圖片提示詞;你在外部生成並放入專案圖片資料夾。必要圖片齊全並驗證前不允許匯出。",
|
||||
"desc_en": "Prompts are written for external generation and placement in project/images/. Export stays blocked until every required file is present and validated.",
|
||||
"desc_ja": "外部生成用のプロンプトを書き出し、画像をproject/images/に配置します。必要な全ファイルの配置と検証が済むまでエクスポートできません。"
|
||||
"desc_ja": "外部生成用のプロンプトを書き出し、画像を project/images/ に配置します。必要な全ファイルの配置と検証が済むまでエクスポートできません。"
|
||||
}
|
||||
],
|
||||
"generation_mode": [
|
||||
@@ -1524,11 +1524,11 @@
|
||||
"label_zh": "完整",
|
||||
"label_zh_tw": "完整",
|
||||
"label_en": "Complete",
|
||||
"label_ja": "完全",
|
||||
"label_ja": "詳細",
|
||||
"desc_zh": "写入包含完整文案的逐页简报。",
|
||||
"desc_zh_tw": "寫入包含完整文案的逐頁簡報。",
|
||||
"desc_en": "Full page briefs with complete wording.",
|
||||
"desc_ja": "完全な文言を含む各ページの詳細なブリーフを記載します。"
|
||||
"desc_ja": "各ページの詳細な内容を、文言まで含めて記載します。"
|
||||
}
|
||||
],
|
||||
"delivery_purpose": [
|
||||
@@ -1536,13 +1536,13 @@
|
||||
"id": "text",
|
||||
"label": "text",
|
||||
"label_zh": "文字型 · 近读",
|
||||
"label_zh_tw": "文字型 · 近讀",
|
||||
"label_zh_tw": "文字型 · 閱讀",
|
||||
"label_en": "text / read-close",
|
||||
"label_ja": "文書型・近距離閲覧",
|
||||
"desc_zh": "页面脱离讲者也能独立读懂:使用完整句、短段落、图注、表格和必要细节;bullet 只用于真正并列的项目。",
|
||||
"desc_zh_tw": "頁面脫離講者也能獨立讀懂:使用完整句、短段落、圖說、表格和必要細節;bullet 只用於真正並列的項目。",
|
||||
"label_ja": "文書型・手元で読む",
|
||||
"desc_zh": "页面脱离演讲者也能独立读懂:使用完整句、短段落、图注、表格和必要细节;项目符号只用于真正并列的项目。",
|
||||
"desc_zh_tw": "即使沒有講者,頁面也能獨立讀懂:使用完整句、短段落、圖說、表格和必要細節;bullet 只用於真正並列的項目。",
|
||||
"desc_en": "The page stands alone without a presenter: use complete sentences, short prose, captions, tables, and necessary detail; reserve bullets for genuinely parallel items.",
|
||||
"desc_ja": "話者なしでもページ単体で理解できる構成。完全な文、短い段落、注釈、表、必要な細部を用い、箇条書きは本当に並列な項目だけに使う。"
|
||||
"desc_ja": "発表者がいなくてもページ単体で理解できる構成。完結した文、短い段落、キャプション、表、必要な細部を用い、箇条書きは本当に並列な項目だけに使う。"
|
||||
},
|
||||
{
|
||||
"id": "balanced",
|
||||
@@ -1551,10 +1551,10 @@
|
||||
"label_zh_tw": "均衡 · 商務",
|
||||
"label_en": "balanced / business",
|
||||
"label_ja": "バランス型・ビジネス",
|
||||
"desc_zh": "页面与讲者共同承担信息:一条主结论配合简短说明、结构化证据或必要列表,适合路演和业务评审。",
|
||||
"desc_zh": "页面与演讲者共同承担信息:一条主结论配合简短说明、结构化证据或必要列表,适合路演和业务评审。",
|
||||
"desc_zh_tw": "頁面與講者共同承擔資訊:一個主結論配合簡短說明、結構化證據或必要列表,適合路演和業務評審。",
|
||||
"desc_en": "The page and presenter share the load: pair one primary claim with concise explanation, structured evidence, or a necessary list. Best for roadshows and business reviews.",
|
||||
"desc_ja": "ページと話者で情報を分担する構成。主張を一つ置き、短い説明、構造化した根拠、または必要なリストを組み合わせる。ロードショーや事業レビュー向け。"
|
||||
"desc_ja": "ページと発表者で情報を分担する構成。主張を一つ置き、短い説明、構造化した根拠、または必要なリストを組み合わせる。ピッチや事業レビュー向け。"
|
||||
},
|
||||
{
|
||||
"id": "presentation",
|
||||
@@ -1563,10 +1563,10 @@
|
||||
"label_zh_tw": "展示型 · 演講",
|
||||
"label_en": "presentation / keynote",
|
||||
"label_ja": "プレゼン型・講演",
|
||||
"desc_zh": "讲者与视觉承担主要表达:一页一意,以简短主张、关键词、大图或大数字为主,解释进入讲述或备注,避免段落堆积。",
|
||||
"desc_zh_tw": "講者與視覺承擔主要表達:一頁一意,以簡短主張、關鍵字、大圖或大數字為主,解釋進入講述或備註,避免段落堆積。",
|
||||
"desc_zh": "演讲者与视觉承担主要表达:一页一意,以简短主张、关键词、大图或大数字为主,细节交给口头讲述或备注,避免段落堆积。",
|
||||
"desc_zh_tw": "講者與視覺承擔主要表達:一頁一意,以簡短主張、關鍵字、大圖或大數字為主,解釋進入講述或備忘稿,避免段落堆積。",
|
||||
"desc_en": "The presenter and visuals carry the explanation: use one idea per page, concise claims, keywords, large visuals, or hero numbers; move detail into speech or notes and avoid paragraph dumps.",
|
||||
"desc_ja": "話者とビジュアルが主に説明を担う構成。1枚1メッセージで、短い主張、キーワード、大きな図や数値を中心にし、詳細は話者またはノートに置いて段落の詰め込みを避ける。"
|
||||
"desc_ja": "発表者とビジュアルが説明を主に担う構成。1枚1メッセージで、短い主張、キーワード、大きな図や数値を中心にする。詳細は発表者の話やノートに回し、文章の詰め込みは避ける。"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -430,30 +430,30 @@ persist it in a new receipt.
|
||||
"candidates": [
|
||||
{
|
||||
"id": "executive-clarity",
|
||||
"name_zh": "稳妥专业",
|
||||
"note_zh": "以瑞士极简为主,融合柔和圆角与编辑出版风格。",
|
||||
"name": "稳妥专业",
|
||||
"note": "以瑞士极简为主,融合柔和圆角与编辑出版风格。",
|
||||
"mode": "custom",
|
||||
"mode_behavior_zh": "以 pyramid 作为唯一目录基底,为当前风险决策材料定制两次结论闸门;标题保持判断句,每章先给判断,再用证据展开并以可执行结论收束。",
|
||||
"mode_behavior": "以 pyramid 作为唯一目录基底,为当前风险决策材料定制两次结论闸门;标题保持判断句,每章先给判断,再用证据展开并以可执行结论收束。",
|
||||
"visual_style": "custom",
|
||||
"visual_style_behavior_zh": "由 swiss-minimal 负责精确栅格和大留白,soft-rounded 负责少量关键容器的轮廓与轻微抬升,editorial 负责细规则、边注与证据层级;标题锐利,正文中性,装饰只标记推理关系。",
|
||||
"visual_style_behavior": "由 swiss-minimal 负责精确栅格和大留白,soft-rounded 负责少量关键容器的轮廓与轻微抬升,editorial 负责细规则、边注与证据层级;标题锐利,正文中性,装饰只标记推理关系。",
|
||||
"icons": "tabler-outline",
|
||||
"color": { "name_zh": "冷静专业", "palette": {
|
||||
"color": { "name": "冷静专业", "palette": {
|
||||
"background": "#FFFFFF", "secondary_bg": "#F4F6F8",
|
||||
"primary": "#1A3A6B", "accent": "#E8A317",
|
||||
"secondary_accent": "#4A7BB5", "body_text": "#1D2430"
|
||||
} },
|
||||
"typography": {
|
||||
"name_zh": "微软雅黑 + Arial",
|
||||
"name": "微软雅黑 + Arial",
|
||||
"heading": { "primary": "Microsoft YaHei", "english": "Arial", "css": "sans-serif" },
|
||||
"body": { "primary": "Microsoft YaHei", "english": "Arial", "css": "sans-serif" },
|
||||
"body_size": 24
|
||||
},
|
||||
"image_strategy": {
|
||||
"name_zh": "编辑式证据图",
|
||||
"name": "编辑式证据图",
|
||||
"rendering": "custom",
|
||||
"visual_zh": "简化矢量主体配合编辑式注释与局部材质对比",
|
||||
"mood_zh": "审慎、可信,像调查报道中的证据插图",
|
||||
"behavior_zh": "由 vector-illustration 负责清晰轮廓,minimalist-swiss 负责留白构图,screen-print 负责克制的半调纹理,warm-scene 负责暖光与可信氛围;四者服从同一平面主体和当前演示文稿颜色角色,避免写实景深与装饰性渐变。"
|
||||
"visual": "简化矢量主体配合编辑式注释与局部材质对比",
|
||||
"mood": "审慎、可信,像调查报道中的证据插图",
|
||||
"behavior": "由 vector-illustration 负责清晰轮廓,minimalist-swiss 负责留白构图,screen-print 负责克制的半调纹理,warm-scene 负责暖光与可信氛围;四者服从同一平面主体和当前演示文稿颜色角色,避免写实景深与装饰性渐变。"
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -484,7 +484,7 @@ Template-mode-only Stage-2 fragment:
|
||||
- `image_notes` is the initial strategy note shown under the image source chips. Use it for page-role guidance and constraints: which source applies where, what to avoid, which user assets are authoritative, how realistic / abstract the imagery should be, and what can remain as placeholders. It is intent guidance, not a separate finite option.
|
||||
- Final Stage 2 shows and submits `recommend.image_ai_path` as one of `auto` / `api` / `host-native` / `manual` only while its current `image_usage` includes `ai`; changing sources refreshes that production control on the same page.
|
||||
- **Color candidates carry the user-facing core `palette`**: `background`, `secondary_bg`, `primary`, `accent`, `secondary_accent`, and `body_text`. The page renders every role as a labelled swatch with its HEX value visible, and offers per-role override inputs for precise single-role edits, plus a **Custom color card with a free-text box** — the user can describe the palette in words or paste HEX values instead of filling each role; this writes `color: { "name": "custom", "custom": "<text>" }` to `result.json` for the AI to interpret. Legacy `text` is accepted as an alias for `body_text`, but new files should write `body_text`. Strategist derives secondary text, borders, state colors, and visual-style neutral tiers while writing `design_spec.md`, then projects the machine values to `spec_lock.md`; those are not user-facing confirmation choices.
|
||||
- **Candidate display text is written once, in the confirmed UI language**: use the plain keys (`name`, `note`, `mode_behavior`, `visual_style_behavior`, `visual`, `mood`, `behavior`). The server accepts the plain key or any one of the `_zh` / `_zh_tw` / `_en` / `_ja` suffixed variants, and the page falls back across them, so authoring the same text in several languages only adds output.
|
||||
- **Candidate display text is written once, in the confirmed UI language**: use the plain keys (`name`, `note`, `mode_behavior`, `visual_style_behavior`, `visual`, `mood`, `behavior`). The server accepts the plain key or, as legacy fallbacks, any one of the `_zh` / `_zh_tw` / `_en` / `_ja` suffixed variants, and the page falls back across them, so authoring the same text in several languages only adds output.
|
||||
- **Typography candidates** use concrete heading/body `primary`; non-English decks also use `english`, while English-primary decks omit it. `cjk` / `latin` remain legacy aliases. Localized `name` labels the pair and `css` only previews. Bundles differ overall; font pairs may repeat without blocking. Fixed pairs require `fixed: true`. Catalog `fonts` supplies language-filtered dropdowns plus Other without limiting recommendations; edits mark Custom and refresh the preview. Include topic samples. [`canvas-formats.md`](../../references/canvas-formats.md) § "Typography Scale Start" is the single owner of initial body anchors and sanity bands; the browser mirrors that rule, and submitted values remain px.
|
||||
- **Per-role size override** (parallel to color's per-role HEX override): besides `body_size`, the page exposes editable inputs for `title` / `subtitle` / `annotation`. The browser applies one documented deterministic dependency chain: PPT uses `reading mode → body baseline`, non-PPT uses `canvas → body baseline`, then every canvas uses `body baseline → unpinned role sizes` (role ramp: `body ×` the §g ratios). Changing reading mode updates a PPT body and all unpinned roles locally; changing body updates unpinned roles locally. Editing body or a role pins that value, so later reading-mode changes do not overwrite it. A font-only selection preserves current sizes; applying a different complete direction, or using the active card's explicit restore action, restores that direction's typography baseline and derived unpinned sizes. This is a browser-only state update: it performs no fetch and asks the backend to author no new recommendations. Each role input is labelled as px and shows an approximate pt equivalent (`1px = 0.75pt`) for orientation. The final values are written to `result.json` as `typography.sizes: { "title", "subtitle", "annotation" }` in **px** — every canvas, no pt and no `sizes_pt` provenance. These confirmed values are Strategist input anchors: the completed page plan may add recurring roles, and downstream execution owns bounded per-occurrence treatment. Candidate `sizes` remain accepted for compatibility; fresh Stage 2 preserves a candidate `body_size` as its baseline and derives only missing or unpinned role sizes from the same local ramp before first render.
|
||||
- **`delivery_purpose` compatibility key / Reading mode** (enumerable, PPT only) decides where meaning is carried, not merely how large type is: `text` makes pages self-contained with complete sentences, short prose, captions, tables, and necessary detail; `balanced` shares explanation between page and presenter; `presentation` uses one idea, concise claims, and visual evidence while speech / notes carry the detail. It therefore governs page grammar, granularity, density / rhythm, and note burden. Reading-mode cards intentionally show **no px value**; the typography section owns the separately visible body / role sizes and applies any local default. It is surfaced in Stage 2 beside the visual system, separate from communication intent. `recommend.delivery_purpose` pre-selects one; `result.json` retains the key, while `spec_lock.md` uses canonical `consumption_mode`. Non-PPT canvases omit it.
|
||||
|
||||
+25
-25
@@ -22,14 +22,14 @@ const strings = {
|
||||
},
|
||||
zh: {
|
||||
first: '首块', prev: '上一块', next: '下一块', last: '末块', source: '查看原文', rendered: '渲染视图',
|
||||
reload: '重载磁盘原文', editor: '块 Markdown', apply: '应用更改', undo: '撤销草稿', rebase: '以当前磁盘版本为草稿基准',
|
||||
reload: '重载磁盘原文', editor: '块 Markdown', apply: '应用修改', undo: '放弃草稿', rebase: '以当前磁盘版本为草稿基准',
|
||||
annotations: '修改意见', thisBlock: '当前块', global: '全局', newAnnotation: '新增意见', saveAnnotation: '保存意见',
|
||||
save: '更新', remove: '删除', annotationHint: '意见独立保存,不写入 Design Spec。',
|
||||
save: '更新', remove: '删除', annotationHint: '意见独立保存,不写入设计规范。',
|
||||
structureHint: '保留章节标题及 Slide 层级和编号;Part 块仅可改标题文字。增页、删页、调序请写修改意见。',
|
||||
hold: 'AI 正在修改,已暂停应用更改。', changed: '磁盘原文已变化,请重载查看最新版本。',
|
||||
hold: 'AI 正在修改,已暂停应用修改。', changed: '磁盘原文已变化,请重载查看最新版本。',
|
||||
conflict: '原文已变化,草稿已保留;请重载并核对最新原文,再选择新的草稿基准。',
|
||||
pending: '有未应用草稿', staging: '暂存中…', clean: '无草稿', saved: '已保存', validation: '校验提示(已保存)',
|
||||
missing: '该块已被外部删除,草稿仍可复制或撤销。',
|
||||
missing: '该块已被外部删除,草稿仍可复制或放弃。',
|
||||
stale: '基准与当前原文不同', current: '基准与当前原文相同', comments: '意见', draft: '草稿',
|
||||
blockChanged: '该块自意见创建后已变化', blockUnchanged: '该块自意见创建后未变化',
|
||||
blockUnknown: '该块的意见基准未知', blockMissing: '该块已不存在',
|
||||
@@ -39,41 +39,41 @@ const strings = {
|
||||
disconnected: '无法连接评审服务,本地编辑已保留。', rebaseConfirm: '以当前磁盘版本为基准暂存此内容,替换服务端的当前草稿?请先核对最新原文;应用时将替换该块。',
|
||||
},
|
||||
'zh-TW': {
|
||||
first: '首塊', prev: '上一塊', next: '下一塊', last: '末塊', source: '查看原文', rendered: '算繪檢視',
|
||||
reload: '重新載入磁碟原文', editor: '區塊 Markdown', apply: '套用變更', undo: '撤銷草稿', rebase: '以目前磁碟版本為草稿基準',
|
||||
first: '首塊', prev: '上一塊', next: '下一塊', last: '末塊', source: '檢視原文', rendered: '算繪檢視',
|
||||
reload: '重新載入磁碟原文', editor: '區塊 Markdown', apply: '套用變更', undo: '捨棄草稿', rebase: '以目前磁碟版本為草稿基準',
|
||||
annotations: '修改意見', thisBlock: '目前區塊', global: '全域', newAnnotation: '新增意見', saveAnnotation: '儲存意見',
|
||||
save: '更新', remove: '刪除', annotationHint: '意見獨立儲存,不寫入 Design Spec。',
|
||||
save: '更新', remove: '刪除', annotationHint: '意見獨立儲存,不寫入設計規範。',
|
||||
structureHint: '保留章節標題及 Slide 層級和編號;Part 區塊僅可改標題文字。增頁、刪頁、調序請寫修改意見。',
|
||||
hold: 'AI 正在修改,已暫停套用變更。', changed: '磁碟原文已變更,請重新載入最新版本。',
|
||||
conflict: '原文已變更,草稿已保留;請重新載入並核對原文,再選擇新的草稿基準。',
|
||||
pending: '有未套用草稿', staging: '暫存中…', clean: '無草稿', saved: '已儲存', validation: '驗證提示(已儲存)',
|
||||
missing: '該區塊已被外部刪除,草稿仍可複製或撤銷。',
|
||||
pending: '有未套用草稿', staging: '暫存中…', clean: '無草稿', saved: '已儲存', validation: '結構檢查提示(已儲存)',
|
||||
missing: '該區塊已被外部刪除,草稿仍可複製或捨棄。',
|
||||
stale: '基準與目前原文不同', current: '基準與目前原文相同', comments: '意見', draft: '草稿',
|
||||
blockChanged: '該區塊自意見建立後已變更', blockUnchanged: '該區塊自意見建立後未變更',
|
||||
blockUnknown: '該區塊的意見基準未知', blockMissing: '該區塊已不存在',
|
||||
exit: '退出評審', exitConfirm: '存在未套用草稿或未儲存意見。是否停止評審並放棄待儲存內容?',
|
||||
stopped: '評審服務已停止,可以關閉此分頁。',
|
||||
exit: '結束審閱', exitConfirm: '存在未套用草稿或未儲存意見。是否停止審閱並捨棄待儲存內容?',
|
||||
stopped: '審閱服務已停止,可以關閉此分頁。',
|
||||
pageTitle: 'PPT Master · 設計規範審閱', languageLabel: '語言', blocksLabel: '設計規範區塊', scopeLabel: '意見範圍',
|
||||
disconnected: '無法連線評審服務,本機編輯已保留。', rebaseConfirm: '以目前磁碟版本為基準暫存此內容,取代伺服器上的目前草稿?請先核對最新原文;套用時將取代該區塊。',
|
||||
disconnected: '無法連線至審閱服務,本機編輯已保留。', rebaseConfirm: '以目前磁碟版本為基準暫存此內容,取代伺服器上的目前草稿?請先核對最新原文;套用時將取代該區塊。',
|
||||
},
|
||||
ja: {
|
||||
first: '先頭', prev: '前へ', next: '次へ', last: '末尾', source: '原文を表示', rendered: '表示に戻る',
|
||||
reload: 'ディスクから再読込', editor: 'ブロック Markdown', apply: '変更を適用', undo: '下書きを破棄',
|
||||
rebase: '現在の原文を下書きの基準にする', annotations: '修正コメント', thisBlock: '現在のブロック', global: '全体',
|
||||
first: '先頭', prev: '前へ', next: '次へ', last: '末尾', source: 'ソースを表示', rendered: 'プレビューを表示',
|
||||
reload: 'ディスクから再読み込み', editor: 'ブロックの Markdown', apply: '変更を適用', undo: '下書きを破棄',
|
||||
rebase: 'ディスク上の最新の内容を下書きの基準にする', annotations: 'コメント', thisBlock: 'このブロック', global: '全体',
|
||||
newAnnotation: '新しいコメント', saveAnnotation: 'コメントを保存', save: '更新', remove: '削除',
|
||||
annotationHint: 'コメントは Design Spec と別に保存されます。',
|
||||
structureHint: 'セクション見出しと Slide の階層・番号は固定です。Part は見出しの文字だけ変更できます。追加・削除・並べ替えはコメントで依頼してください。',
|
||||
hold: 'AI が編集中です。変更の適用は一時停止中です。', changed: '原文が変更されました。再読込してください。',
|
||||
conflict: '原文が変更されました。下書きは保持されています。再読込して原文を確認し、新しい基準を選択してください。',
|
||||
pending: '未適用の下書き', staging: '一時保存中…', clean: '下書きなし', saved: '保存済み', validation: '検証結果(保存済み)',
|
||||
annotationHint: 'コメントは設計仕様とは別に保存されます。',
|
||||
structureHint: 'セクション見出しと「Slide」見出しのレベル・番号は変更しないでください。「Part」ブロックは見出しの文字だけ編集できます。スライドの追加・削除・並べ替えはコメントで依頼してください。',
|
||||
hold: 'AIが編集中のため、「変更を適用」は一時的に使用できません。', changed: 'ディスク上の設計仕様が変更されました。再読み込みして最新の内容を確認してください。',
|
||||
conflict: '設計仕様が変更されました。下書きは保持されています。再読み込みして現在の内容を確認してから、下書きの新しい基準を選んでください。',
|
||||
pending: '未適用の下書き', staging: '一時保存中…', clean: '下書きなし', saved: '保存済み', validation: 'スキーマ検証の指摘(保存済み)',
|
||||
missing: 'このブロックは外部で削除されました。下書きはコピーまたは破棄できます。',
|
||||
stale: '基準が現在の原文と異なります', current: '基準は現在の原文と一致', comments: 'コメント', draft: '下書き',
|
||||
blockChanged: 'コメント作成後にこのブロックは変更されています', blockUnchanged: 'コメント作成後にこのブロックは変更されていません',
|
||||
blockUnknown: 'ブロックの基準は不明です', blockMissing: 'このブロックは存在しません',
|
||||
stale: '基準が現在の設計仕様と異なります', current: '基準は現在の設計仕様と一致しています', comments: 'コメント', draft: '下書き',
|
||||
blockChanged: 'このブロックはコメント作成後に変更されています', blockUnchanged: 'このブロックはコメント作成後から変更されていません',
|
||||
blockUnknown: 'ブロックの基準は不明です', blockMissing: 'このブロックはもう存在しません',
|
||||
exit: 'レビューを終了', exitConfirm: '未適用の下書きまたは未保存のコメントがあります。レビューを終了して未保存の内容を破棄しますか?',
|
||||
stopped: 'レビューサービスは停止しました。このタブを閉じてください。',
|
||||
stopped: 'レビューサーバーを停止しました。このタブは閉じて構いません。',
|
||||
pageTitle: 'PPT Master · 設計仕様レビュー', languageLabel: '言語', blocksLabel: '設計仕様のブロック', scopeLabel: 'コメントの対象',
|
||||
disconnected: 'サービスに接続できません。編集内容は保持されています。', rebaseConfirm: '現在の原文を基準にこの内容を一時保存し、サーバーの下書きを置き換えますか?原文を先に確認してください。適用でこのブロックを置き換えます。',
|
||||
disconnected: 'レビューサーバーに接続できません。ローカルの編集内容は保持されています。', rebaseConfirm: 'この内容を現在のディスク上の版に対する下書きとして一時保存し、既存の下書きを置き換えますか?先にソースを確認してください。「変更を適用」を実行すると、このブロックが置き換えられます。',
|
||||
},
|
||||
};
|
||||
const $ = id => document.getElementById(id);
|
||||
|
||||
+66
-70
@@ -10,7 +10,6 @@
|
||||
en: {
|
||||
page_title: "PPT Master - Live Preview",
|
||||
panel_slides: "Slides",
|
||||
panel_annotations: "Annotations",
|
||||
panel_edit_annotate: "Edit / Annotate",
|
||||
placeholder_select_slide: "Select a slide on the left to begin",
|
||||
label_selected_element: "Selected element",
|
||||
@@ -85,68 +84,67 @@
|
||||
ja: {
|
||||
page_title: "PPT Master - ライブプレビュー",
|
||||
panel_slides: "スライド",
|
||||
panel_annotations: "注釈",
|
||||
panel_edit_annotate: "編集 / 注釈",
|
||||
placeholder_select_slide: "左のスライドを選択して開始",
|
||||
panel_edit_annotate: "編集 / コメント",
|
||||
placeholder_select_slide: "左のスライドを選択してください",
|
||||
label_selected_element: "選択中の要素",
|
||||
empty_selected_element: "スライド上の要素をクリックして選択",
|
||||
empty_selected_element: "スライド上の要素をクリックすると選択できます",
|
||||
btn_select_group: "親グループを選択",
|
||||
label_batch_edit: "一括編集",
|
||||
label_group_edit: "グループ編集",
|
||||
section_geometry: "位置・サイズ",
|
||||
section_style: "スタイル",
|
||||
section_text_style: "テキスト",
|
||||
section_raw_attrs: "生の属性",
|
||||
section_raw_attrs: "SVG属性",
|
||||
label_edit_instruction: "編集指示",
|
||||
pending_none: "未適用の変更はありません",
|
||||
pending_summary: "直接編集{edits}件、AI注釈のあるページ{annotations}件が未適用",
|
||||
pending_pages: "対象ページ:{pages}",
|
||||
pending_summary: "直接編集{edits}件、コメントを変更したスライド{annotations}件が未適用",
|
||||
pending_pages: "対象スライド:{pages}",
|
||||
quick_align: "整列 / 移動",
|
||||
quick_resize: "サイズ変更",
|
||||
quick_replace_image: "画像を差し替え",
|
||||
quick_copy: "文言を修正",
|
||||
quick_relayout: "この領域を再レイアウト",
|
||||
placeholder_annotation: "この要素をAIにどう修正してほしいか記述…",
|
||||
placeholder_annotation_multi: "選択した{count}個の要素をどう修正するか記述…",
|
||||
btn_add_annotation: "注釈を追加",
|
||||
label_annotations_on_slide: "このスライドの注釈",
|
||||
quick_replace_image: "画像の差し替え",
|
||||
quick_copy: "文言の修正",
|
||||
quick_relayout: "領域のレイアウト変更",
|
||||
placeholder_annotation: "この要素をAIにどう修正してほしいかを入力…",
|
||||
placeholder_annotation_multi: "選択した{count}個の要素すべてをどう修正するかを入力…",
|
||||
btn_add_annotation: "コメントを追加",
|
||||
label_annotations_on_slide: "このスライドのコメント",
|
||||
btn_submit_annotations: "変更を適用",
|
||||
btn_exit_preview: "プレビューを終了",
|
||||
modal_submit: "送信",
|
||||
modal_submit: "適用",
|
||||
modal_cancel: "キャンセル",
|
||||
empty_waiting_slides: "スライドの生成を待っています…",
|
||||
empty_no_slides: "スライドが見つかりません",
|
||||
placeholder_live_ready: "ライブプレビュー準備完了。生成されたスライドがここに表示されます。",
|
||||
placeholder_live_ready: "ライブプレビューの準備ができました。生成されたスライドがここに表示されます。",
|
||||
placeholder_slide_writing: "スライドはまだ書き込み中です。次の更新を待っています…",
|
||||
empty_annotations: "注釈はまだありません",
|
||||
tooltip_remove_annotation: "注釈を削除",
|
||||
empty_annotations: "コメントはまだありません",
|
||||
tooltip_remove_annotation: "コメントを削除",
|
||||
multi_selected: "{count}個の要素を選択中",
|
||||
multi_mixed: "混在",
|
||||
err_load_slides: "スライド一覧の読み込みに失敗: ",
|
||||
err_load_slide: "スライドの読み込みに失敗: ",
|
||||
err_add_annotation: "注釈の追加に失敗: ",
|
||||
err_remove_annotation: "注釈の削除に失敗: ",
|
||||
err_save: "保存に失敗: ",
|
||||
err_edit: "編集に失敗: ",
|
||||
err_load_slides: "スライド一覧の読み込みに失敗しました:",
|
||||
err_load_slide: "スライドの読み込みに失敗しました:",
|
||||
err_add_annotation: "コメントの追加に失敗しました:",
|
||||
err_remove_annotation: "コメントの削除に失敗しました:",
|
||||
err_save: "保存に失敗しました:",
|
||||
err_edit: "編集に失敗しました:",
|
||||
label_direct_edit: "オブジェクト属性(「変更を適用」までは保留)",
|
||||
prop_multiline_hint: "複数行テキストです — 文字を編集するには1行(tspan)を選択してください",
|
||||
edit_saved_hint: "変更を一時保存しました。「変更を適用」で svg_output に書き込まれます。",
|
||||
edit_saved_hint: "変更は未適用です。「変更を適用」をクリックすると svg_output に書き込まれます。",
|
||||
btn_undo: "元に戻す",
|
||||
undo_done: "直前の一時保存済み編集を取り消しました",
|
||||
undo_empty: "取り消せる編集はありません",
|
||||
undo_done: "直前の未適用の編集を元に戻しました",
|
||||
undo_empty: "元に戻せる編集はありません",
|
||||
overlap_caption: "要素が重なっています — 1つ選択してください",
|
||||
err_empty_svg: "スライドは読み込めましたがキャンバスが空です。SVGが不正か、ルート<svg>要素がない可能性があります。",
|
||||
warn_icon_inline: "{count}個のアイコンを描画できませんでした: {names}",
|
||||
warn_matrix_transform: "このジオメトリ編集は transform matrix として保存されます。プレビューは正確ですが、PPTX出力にはmatrix対応の現行エクスポーターが必要です。",
|
||||
modal_matrix_transform_note: "\n\n注意:一時保存済みのジオメトリ編集に transform matrix を使うものがあります。matrixが反映されるよう、現行のPPTXエクスポーターで再エクスポートしてください。",
|
||||
slide_error_tooltip: "このスライドの解析に失敗: ",
|
||||
reload_banner: "このスライドはディスク上で更新されました。クリックで再読み込み。",
|
||||
modal_confirm_submit: "一時保存済みの直接編集とAI注釈をディスクに書き込みますか?\n\nプレビューサービスは動き続けます。止めたいときは「プレビューを終了」を押してください。",
|
||||
modal_success_submit: "変更を svg_output に保存しました。\n\nプレビューサービスは引き続き動作中です。",
|
||||
modal_success_direct_only: "変更を svg_output に保存しました。\n\n直接編集はSVGソースに反映済みです。PPTXを更新したいときは、チャットに戻って再エクスポートを依頼してください。プレビューサービスは引き続き動作中です。",
|
||||
modal_success_annotations_only: "注釈を svg_output に保存しました。\n\nAIに注釈を解釈・反映させたいときは、チャットに戻って注釈の適用を依頼してください。プレビューサービスは引き続き動作中です。",
|
||||
modal_success_mixed: "直接編集と注釈を svg_output に保存しました。\n\nチャットに戻ってAI判断が必要な注釈の適用を先に依頼し、確認できたらPPTXを再エクスポートしてください。プレビューサービスは引き続き動作中です。",
|
||||
modal_confirm_exit: "プレビューを終了してローカルサーバーを停止しますか?\n\n未適用の編集と注釈は破棄されます。",
|
||||
warn_icon_inline: "{count}個のアイコンを描画できませんでした:{names}",
|
||||
warn_matrix_transform: "この位置・サイズの編集は transform matrix として保存されます。プレビューは正確ですが、PPTXへのエクスポートには matrix 対応のエクスポーターが必要です。",
|
||||
modal_matrix_transform_note: "\n\n注意:未適用の位置・サイズの編集のうち、少なくとも1件が transform matrix を使用しています。matrix が反映されるよう、現行のPPTXエクスポーターで再エクスポートしてください。",
|
||||
slide_error_tooltip: "このスライドの解析に失敗しました:",
|
||||
reload_banner: "このスライドはディスク上で更新されました。クリックすると再読み込みします。",
|
||||
modal_confirm_submit: "未適用の直接編集とAI向けコメントをディスクに書き込みますか?\n\nプレビューサーバーは動作を続けます。停止するには「プレビューを終了」をクリックしてください。",
|
||||
modal_success_submit: "変更を svg_output に保存しました。\n\nプレビューサーバーは引き続き動作しています。",
|
||||
modal_success_direct_only: "変更を svg_output に保存しました。\n\n直接編集はSVGソースに反映済みです。PPTXを更新したいときは、チャットに戻って再エクスポートを依頼してください。プレビューサーバーは引き続き動作しています。",
|
||||
modal_success_annotations_only: "コメントを svg_output に保存しました。\n\nAIにコメントを解釈・反映させたいときは、チャットに戻ってコメントの適用を依頼してください。プレビューサーバーは引き続き動作しています。",
|
||||
modal_success_mixed: "直接編集とコメントを svg_output に保存しました。\n\nチャットに戻ってAIの判断が必要なコメントの適用を先に依頼し、確認できたらPPTXを再エクスポートしてください。プレビューサーバーは引き続き動作しています。",
|
||||
modal_confirm_exit: "プレビューを終了してローカルサーバーを停止しますか?\n\n未適用の編集とコメントは破棄されます。",
|
||||
modal_success_exit: "プレビューを停止しました。\n\nこのタブを閉じてチャットに戻れます。",
|
||||
modal_stopping: "プレビューサーバーを停止しています…",
|
||||
lang_toggle_title: "言語を切り替え",
|
||||
@@ -160,15 +158,14 @@
|
||||
zh: {
|
||||
page_title: "PPT Master - 实时预览",
|
||||
panel_slides: "幻灯片",
|
||||
panel_annotations: "标注",
|
||||
panel_edit_annotate: "编辑 / 标注",
|
||||
placeholder_select_slide: "在左侧选择一张幻灯片开始",
|
||||
label_selected_element: "已选元素",
|
||||
empty_selected_element: "点击幻灯片中的元素进行选择",
|
||||
btn_select_group: "选择父级组",
|
||||
btn_select_group: "选择父级组合",
|
||||
label_batch_edit: "批量编辑",
|
||||
label_group_edit: "组编辑",
|
||||
section_geometry: "几何",
|
||||
label_group_edit: "组合编辑",
|
||||
section_geometry: "位置与大小",
|
||||
section_style: "样式",
|
||||
section_text_style: "文本",
|
||||
section_raw_attrs: "原始属性",
|
||||
@@ -176,7 +173,7 @@
|
||||
pending_none: "没有待应用修改",
|
||||
pending_summary: "{edits} 条直接修改、{annotations} 个页面有 AI 标注待应用",
|
||||
pending_pages: "页面:{pages}",
|
||||
quick_align: "对齐/移动",
|
||||
quick_align: "对齐 / 移动",
|
||||
quick_resize: "调整大小",
|
||||
quick_replace_image: "换图",
|
||||
quick_copy: "改文案",
|
||||
@@ -191,37 +188,37 @@
|
||||
modal_cancel: "取消",
|
||||
empty_waiting_slides: "正在等待生成幻灯片……",
|
||||
empty_no_slides: "未找到幻灯片",
|
||||
placeholder_live_ready: "实时预览已就绪,生成的幻灯片会在这里出现。",
|
||||
placeholder_slide_writing: "幻灯片仍在写入,等待下次刷新……",
|
||||
placeholder_live_ready: "实时预览已就绪,生成的幻灯片会在这里出现。",
|
||||
placeholder_slide_writing: "幻灯片仍在写入,等待下次刷新……",
|
||||
empty_annotations: "暂无标注",
|
||||
tooltip_remove_annotation: "删除标注",
|
||||
multi_selected: "已选 {count} 个元素",
|
||||
multi_mixed: "混合",
|
||||
err_load_slides: "加载幻灯片失败:",
|
||||
err_load_slide: "加载幻灯片失败:",
|
||||
err_add_annotation: "添加标注失败:",
|
||||
err_remove_annotation: "删除标注失败:",
|
||||
err_save: "保存失败:",
|
||||
err_edit: "编辑失败:",
|
||||
label_direct_edit: "对象属性(点击应用修改后写入)",
|
||||
prop_multiline_hint: "多行文本——选中单行(tspan)编辑文字",
|
||||
err_load_slides: "加载幻灯片列表失败:",
|
||||
err_load_slide: "加载幻灯片失败:",
|
||||
err_add_annotation: "添加标注失败:",
|
||||
err_remove_annotation: "删除标注失败:",
|
||||
err_save: "保存失败:",
|
||||
err_edit: "编辑失败:",
|
||||
label_direct_edit: "对象属性(点击“应用修改”后写入)",
|
||||
prop_multiline_hint: "多行文本——选中单行(tspan)后编辑文字",
|
||||
edit_saved_hint: "修改已暂存。点击“应用修改”后写入 svg_output。",
|
||||
btn_undo: "撤销",
|
||||
undo_done: "已撤销上一条暂存修改",
|
||||
undo_empty: "没有可撤销的暂存修改",
|
||||
overlap_caption: "此处重叠元素——点击选择",
|
||||
err_empty_svg: "幻灯片已加载但画布为空。SVG 可能损坏或缺少根 <svg> 元素。",
|
||||
warn_icon_inline: "{count} 个图标渲染失败:{names}",
|
||||
warn_matrix_transform: "本次几何修改会以 transform matrix 保存。预览是准确的;PPTX 导出需要使用支持 matrix 的当前导出器。",
|
||||
modal_matrix_transform_note: "\n\n提示:至少有一条暂存几何修改使用了 transform matrix。请用当前 PPTX 导出器重新导出,确保 matrix 被应用。",
|
||||
slide_error_tooltip: "该幻灯片解析失败:",
|
||||
reload_banner: "当前页已在磁盘上更新,点此重新加载。",
|
||||
modal_confirm_submit: "确认将暂存的直接修改和 AI 标注写入磁盘?\n\n预览服务会继续运行。需要关闭时请点击退出预览。",
|
||||
warn_icon_inline: "{count} 个图标渲染失败:{names}",
|
||||
warn_matrix_transform: "本次位置/大小修改会以 transform matrix 保存。预览是准确的;PPTX 导出需要使用支持 matrix 的当前导出器。",
|
||||
modal_matrix_transform_note: "\n\n提示:至少有一条暂存的位置/大小修改使用了 transform matrix。请用当前 PPTX 导出器重新导出,确保 matrix 被应用。",
|
||||
slide_error_tooltip: "该幻灯片解析失败:",
|
||||
reload_banner: "当前页已在磁盘上更新,点此重新加载。",
|
||||
modal_confirm_submit: "确认将暂存的直接修改和 AI 标注写入磁盘?\n\n预览服务会继续运行。需要关闭时请点击“退出预览”。",
|
||||
modal_success_submit: "修改已保存到 svg_output。\n\n预览服务仍在运行。",
|
||||
modal_success_direct_only: "修改已保存到 svg_output。\n\n直接修改已经写入 SVG 源文件;需要刷新 PPTX 时,请回到对话窗口要求重新导出。预览服务仍在运行。",
|
||||
modal_success_annotations_only: "标注已保存到 svg_output。\n\n需要 AI 理解并执行这些标注时,请回到对话窗口要求应用标注。预览服务仍在运行。",
|
||||
modal_success_mixed: "直接修改和标注已保存到 svg_output。\n\n请回到对话窗口先应用需要 AI 判断的标注,确认后再重新导出 PPTX。预览服务仍在运行。",
|
||||
modal_confirm_exit: "退出预览并停止本地服务?\n\n未应用的属性修改和标注将被丢弃。",
|
||||
modal_confirm_exit: "退出预览并停止本地服务?\n\n未应用的修改和标注将被丢弃。",
|
||||
modal_success_exit: "预览已停止。\n\n可以关闭本标签页并回到对话窗口。",
|
||||
modal_stopping: "正在停止预览服务……",
|
||||
lang_toggle_title: "切换语言",
|
||||
@@ -235,7 +232,6 @@
|
||||
"zh-TW": {
|
||||
page_title: "PPT Master - 即時預覽",
|
||||
panel_slides: "投影片",
|
||||
panel_annotations: "標註",
|
||||
panel_edit_annotate: "編輯 / 標註",
|
||||
placeholder_select_slide: "在左側選擇一張投影片開始",
|
||||
label_selected_element: "已選元素",
|
||||
@@ -262,7 +258,7 @@
|
||||
label_annotations_on_slide: "本頁標註",
|
||||
btn_submit_annotations: "套用修改",
|
||||
btn_exit_preview: "結束預覽",
|
||||
modal_submit: "提交",
|
||||
modal_submit: "送出",
|
||||
modal_cancel: "取消",
|
||||
empty_waiting_slides: "正在等待生成投影片……",
|
||||
empty_no_slides: "未找到投影片",
|
||||
@@ -279,24 +275,24 @@
|
||||
err_save: "儲存失敗:",
|
||||
err_edit: "編輯失敗:",
|
||||
label_direct_edit: "物件屬性(點選套用修改後寫入)",
|
||||
prop_multiline_hint: "多行文字——選取單行(tspan)編輯文字",
|
||||
prop_multiline_hint: "多行文字——選取單行(tspan)編輯文字",
|
||||
edit_saved_hint: "修改已暫存。點選「套用修改」後寫入 svg_output。",
|
||||
btn_undo: "復原",
|
||||
undo_done: "已復原上一筆暫存修改",
|
||||
undo_empty: "沒有可復原的暫存修改",
|
||||
overlap_caption: "此處元素重疊——請點選其中一個",
|
||||
err_empty_svg: "投影片已載入但畫布為空。SVG 可能損壞或缺少根 <svg> 元素。",
|
||||
warn_icon_inline: "{count} 個圖示渲染失敗:{names}",
|
||||
warn_matrix_transform: "本次幾何修改會以 transform matrix 儲存。預覽是準確的;PPTX 匯出需要使用支援 matrix 的目前匯出器。",
|
||||
modal_matrix_transform_note: "\n\n提示:至少有一筆暫存幾何修改使用了 transform matrix。請用目前 PPTX 匯出器重新匯出,確保 matrix 被套用。",
|
||||
warn_icon_inline: "{count} 個圖示算繪失敗:{names}",
|
||||
warn_matrix_transform: "本次幾何修改會以 transform matrix 儲存。預覽結果準確;PPTX 匯出則取決於轉換流程是否支援 matrix。",
|
||||
modal_matrix_transform_note: "\n\n提示:至少有一筆暫存幾何修改使用了 transform matrix。請使用目前版本的 PPTX 匯出器重新匯出,以套用 matrix。",
|
||||
slide_error_tooltip: "該投影片解析失敗:",
|
||||
reload_banner: "目前頁已在磁碟上更新,點此重新載入。",
|
||||
reload_banner: "這張投影片已在磁碟上更新,點此重新載入。",
|
||||
modal_confirm_submit: "確認將暫存的直接修改和 AI 標註寫入磁碟?\n\n預覽服務會繼續執行。需要關閉時請點選結束預覽。",
|
||||
modal_success_submit: "修改已儲存到 svg_output。\n\n預覽服務仍在執行。",
|
||||
modal_success_direct_only: "修改已儲存到 svg_output。\n\n直接修改已經寫入 SVG 原始檔;需要重新整理 PPTX 時,請回到對話視窗要求重新匯出。預覽服務仍在執行。",
|
||||
modal_success_direct_only: "修改已儲存到 svg_output。\n\n直接修改已經寫入 SVG 原始檔;需要更新 PPTX 時,請回到對話視窗要求重新匯出。預覽服務仍在執行。",
|
||||
modal_success_annotations_only: "標註已儲存到 svg_output。\n\n需要 AI 理解並執行這些標註時,請回到對話視窗要求套用標註。預覽服務仍在執行。",
|
||||
modal_success_mixed: "直接修改和標註已儲存到 svg_output。\n\n請回到對話視窗先套用需要 AI 判斷的標註,確認後再重新匯出 PPTX。預覽服務仍在執行。",
|
||||
modal_confirm_exit: "結束預覽並停止本機服務?\n\n未套用的屬性修改和標註將被丟棄。",
|
||||
modal_confirm_exit: "結束預覽並停止本機服務?\n\n未套用的修改和標註將被捨棄。",
|
||||
modal_success_exit: "預覽已停止。\n\n可以關閉本分頁並回到對話視窗。",
|
||||
modal_stopping: "正在停止預覽服務……",
|
||||
lang_toggle_title: "切換語言",
|
||||
|
||||
@@ -139,7 +139,7 @@ Skip analysis; Step 2 lists every Required item as `[decision]`. Create Brand ma
|
||||
|
||||
## Step 2: Fact-Based Brief Proposal
|
||||
|
||||
Compose one concise natural-language proposal, in the user's language, describing the intended result with every material value labelled. Present one recommended creation plan — never a menu of modes, fidelity levels, or checklists; translate "原样还原" / "提取成可复用母版和版式" / "保留风格但重新设计" directly into the plan. Ask a follow-up only when a missing decision would materially change the artifact. Technical IDs appear only in a compact audit note.
|
||||
Compose one concise natural-language proposal, in the user's language, describing the intended result with every material value labelled. Present one recommended creation plan — never a menu of modes, fidelity levels, or checklists; map a request such as "restore it as-is", "extract a reusable master and layouts", or "keep the style but redesign it" (in any language) directly into the plan. Ask a follow-up only when a missing decision would materially change the artifact. Technical IDs appear only in a compact audit note.
|
||||
|
||||
| Label | Meaning |
|
||||
|---|---|
|
||||
|
||||
@@ -165,7 +165,7 @@ If the user selects chat after launch, apply `confirm-surface.md`'s in-run switc
|
||||
|
||||
| Note | When | Content |
|
||||
|---|---|---|
|
||||
| Split-mode note | Only when the confirmed mode is `split` or the run is heavy (long page count, bulky sources, substantial research retained in this chat — an isolated `topic-research` worker's fetches do not count) | Recommend or confirm stopping after Step 5 and entering the execution session with `继续生成 projects/<project_name>` ([`resume-execute`](stages/resume-execute.md)); no response or "continue" means `continuous`, and the default path prints no reminder |
|
||||
| Split-mode note | Only when the confirmed mode is `split` or the run is heavy (long page count, bulky sources, substantial research retained in this chat — an isolated `topic-research` worker's fetches do not count) | Recommend or confirm stopping after Step 5 and entering the execution session with a resume request naming the project, in the user's language (e.g. `继续生成 projects/<project_name>`; [`resume-execute`](stages/resume-execute.md)); no response or "continue" means `continuous`, and the default path prints no reminder |
|
||||
| Spec-refinement note | Always | Offer review of the complete Design Spec before the lock (default OFF; only explicit opt-in or `refine_spec: true` runs `refine-spec`) |
|
||||
|
||||
**Production fields**: resolve Speaker Notes, Custom Animations, and Narration Audio as latest explicit user instruction → final Stage-2 proactive value → default `true` / `false` / `false`. Enabled Narration Audio raises a non-explicitly-disabled Speaker Notes outcome and names that dependency. Persist the effective outcomes with provenance as the three rows in `design_spec.md §I`, keep the raw proactive fields as evidence only, and project neither into `spec_lock.md`. A later explicit request updates only its §I outcome and resumes the owning step without reopening Confirm UI. Disabling notes while audio stays enabled asks one question (disable audio too, or keep its required notes) before writing either row.
|
||||
@@ -206,13 +206,13 @@ Load only the references the rows need; a mixed deck writes both `image_prompts.
|
||||
|
||||
**Workflow**: run the procedure in [`image-base.md`](../references/image-base.md) §2 — separate derivative rows, group canonical rows by `Acquire Via`, finish each path, slice each generated sheet with its grid, `--names`, and the exact key HEX from its prompt, materialize derivatives only from terminal sources under their declared treatment. Then verify every row is terminal (no `Pending`, `Failed`, or `Needs-Selection`; an unresolved Default AI row waits at the gate above) and run `python3 ${SKILL_DIR}/scripts/analyze_images.py <project_path>/images` so the CSV reflects every placeable image. Every Pending/Failed row reaches a terminal state before Executor starts.
|
||||
|
||||
**✅ Internal checkpoint** — sidecars, slice outputs, terminal statuses, refreshed CSV. Do not print. Auto-proceed to Step 6; only `generation_mode: split` prints the handoff and stops this conversation:
|
||||
**✅ Internal checkpoint** — sidecars, slice outputs, terminal statuses, refreshed CSV. Do not print. Auto-proceed to Step 6; only `generation_mode: split` prints the handoff and stops this conversation (English template; translate to the user's chat language if different, including the resume request):
|
||||
|
||||
```markdown
|
||||
## ✅ Planning Session Complete
|
||||
- [x] Spec: `design_spec.md`, `spec_lock.md`
|
||||
- [x] Resources: `sources/`, `images/`, `templates/`
|
||||
- [ ] **Next**: open a fresh chat window and input `继续生成 projects/<project_name>` to enter the execution session via the [`resume-execute`](stages/resume-execute.md) stage.
|
||||
- [ ] **Next**: open a fresh chat window and send a resume request naming the project (e.g. `继续生成 projects/<project_name>`) to enter the execution session via the [`resume-execute`](stages/resume-execute.md) stage.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
+4
-4
@@ -6,7 +6,7 @@ description: Generate profile for 1:1, content-faithful re-layout of an existing
|
||||
|
||||
> Generate profile, not a top-level route. [`edit-native-pptx.md`](../edit-native-pptx.md) keeps a deck's native design and edits selected pages; this profile keeps a deck's content and redoes its layout: text verbatim, source palette/fonts as the preselected recommendation (only explicit user requirements or final confirmation override them), layout, hierarchy, whitespace, and visual treatment rebuilt into a new native deck through the SVG pipeline — not a patch over the original.
|
||||
|
||||
**Trigger**: the user supplies a `.pptx` and asks to beautify / re-layout / 重新排版 / 美化 while keeping the content — explicit intent plus a provided file, never inferred.
|
||||
**Trigger**: the user supplies a `.pptx` and asks, in any language, to beautify or re-layout it while keeping the content — explicit intent plus a provided file, never inferred.
|
||||
|
||||
**Hard rule — select one runtime before continuing**: when the request also meets [`quick-generate.md`](./quick-generate.md)'s explicit trigger, load that runtime and not `generate-pptx.md`; otherwise load [`generate-pptx.md`](../generate-pptx.md) and not Quick. The 1:1 constraints below apply in either runtime.
|
||||
|
||||
@@ -99,7 +99,7 @@ Do not run the Default confirmation flow. Apply the same inventory interpretatio
|
||||
|
||||
**Hard rule — content is frozen, not the scope decisions**: text and chart/table/cell values are non-negotiable; which identity to inherit, what to ignore, and how to treat flagged items are recommend-then-confirm, never silently decided. **Name the v1 ceiling honestly**: an overcrowded page improves within the page as-is (no information-overload relief — flag it for manual split); paste-back keeps confirmed palette + font declarations but guarantees neither coordinate alignment nor font availability; combo / dual-axis / waterfall charts and merged-cell tables are best-effort from captured data and flagged.
|
||||
|
||||
**Visual re-confirm**: apply Step 4's surface decision; in the UI branch use `confirm_ui/recommendations.stage1.json` / `.stage2.json` at the same two handoffs and the same server, in the chat branch present the same stages without a server or `result.json`. Rows abbreviated; follow the four-locale contract ([`confirm-surface.md`](../../references/confirm-surface.md)) and omit `english` for English sources:
|
||||
**Visual re-confirm**: apply Step 4's surface decision; in the UI branch use `confirm_ui/recommendations.stage1.json` / `.stage2.json` at the same two handoffs and the same server, in the chat branch present the same stages without a server or `result.json`. Rows abbreviated; follow the four-locale contract ([`confirm-surface.md`](../../references/confirm-surface.md)) — display text is written once, in the confirmed UI language — and omit `english` for English sources:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -114,10 +114,10 @@ Do not run the Default confirmation flow. Apply the same inventory interpretatio
|
||||
"artifact_afterlife": {"value": "<review / approval / archive / hand-off / reuse / none planned>"},
|
||||
"content_divergence": {"value": "keep source wording and page structure verbatim", "locked": true},
|
||||
"design_directions": {"selected": 0, "candidates": [
|
||||
{"id": "source-replica", "name_en": "Source replica (recommended)", "mode": "custom", "mode_behavior_zh": "briefing 基底;逐页结构、顺序与文字 1:1 逐字不变。", "visual_style": "custom", "visual_style_behavior_zh": "复刻源 PPT 视觉身份与版式。", "icons": "…",
|
||||
{"id": "source-replica", "name": "<Source replica (recommended)>", "mode": "custom", "mode_behavior": "<briefing base; per-page structure, order, and text 1:1 verbatim>", "visual_style": "custom", "visual_style_behavior": "<replicate the source deck's visual identity and layout>", "icons": "…",
|
||||
"color": {"palette": {"background": "#...", "secondary_bg": "#...", "primary": "#...", "accent": "#...", "secondary_accent": "#...", "body_text": "#..."}},
|
||||
"typography": {"heading": {"primary": "…"}, "body": {"primary": "…"}, "body_size": "<dominant observed.sizes_pt × 4/3 × canvas scale, as px>"},
|
||||
"image_strategy": {"rendering": "custom", "behavior_zh": "…"}},
|
||||
"image_strategy": {"rendering": "custom", "behavior": "<…>"}},
|
||||
{"id": "alternative-a", "...": "same shape; body_size = canvas-appropriate baseline"},
|
||||
{"id": "alternative-b", "...": "same shape"}
|
||||
]}
|
||||
|
||||
+1
-1
@@ -43,7 +43,7 @@ From the flat list, pick **3–6 candidates**: cover both genders when the local
|
||||
|
||||
**Quick exception**: do not pause. Apply explicit user values, resolve the rest from the recommended-value rules, keep video off unless the caller selected direct video (then embed the narrated PPTX and continue to native video only when `powerpoint_video.py --check` succeeds); with resolved sound cues continue automatically through the post-export mix. An explicit slideshow-capture request stops at the capture-ready narrated PPTX until the user supplies the recorded MP4 — never silently switching to native export. Require a timestamp-capable provider only when cue sync or subtitle delivery needs page-local SRT.
|
||||
|
||||
**Default / Edit Native — one-shot interaction (mandatory)**: send one message that resolves all five decisions with a recommended value each; never split into rounds. Run `powerpoint_video.py --check` before offering automatic video export (an explicit slideshow-capture choice skips the check and uses the manual handoff). **Cloned-voice fast path**: when the user mentioned a cloned voice / 克隆音色 / 复刻音色 / "my own voice" with a `voice_id`, skip the recommendation list, pin the named provider and `voice_id`, and confirm only rate + embed + video. "Embed" means SVG re-export for Generate or `svg_to_pptx.py --roundtrip --recorded-narration audio` for Edit Native.
|
||||
**Default / Edit Native — one-shot interaction (mandatory)**: send one message that resolves all five decisions with a recommended value each; never split into rounds. Run `powerpoint_video.py --check` before offering automatic video export (an explicit slideshow-capture choice skips the check and uses the manual handoff). **Cloned-voice fast path**: when the user mentioned a cloned voice or "my own voice", in any language, with a `voice_id`, skip the recommendation list, pin the named provider and `voice_id`, and confirm only rate + embed + video. "Embed" means SVG re-export for Generate or `svg_to_pptx.py --roundtrip --recorded-narration audio` for Edit Native.
|
||||
|
||||
**Message template** (Chinese; translate to the user's chat language):
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ description: Main-pipeline editor stage for starting live preview and applying s
|
||||
## When to Run
|
||||
|
||||
- **Step 1** — no preview service is running and the user wants to look at the deck or click an element (post-export re-entry in a fresh chat, or the user clicked **Exit preview** earlier).
|
||||
- **Step 2** — Step 7 has produced at least one PPTX and the user signals that annotations should be applied: quoting the browser prompt (`Changes saved to svg_output...` / `修改已保存到 svg_output...`) or saying `apply my annotations` / `apply my edits` / `应用注解` / `开始应用`.
|
||||
- **Step 2** — Step 7 has produced at least one PPTX and the user signals that annotations should be applied: quoting the browser prompt (`Changes saved to svg_output...` or its localized equivalent) or asking, in any language, to apply the staged annotations (e.g. `apply my annotations`).
|
||||
|
||||
**When not to run**: the service is already running → give the URL; a precise chat edit ("change page 3 title to X") → edit the SVG directly; a full regeneration → main workflow; Step 7 has never run → finish the main pipeline first.
|
||||
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ Context-independent: persisted project artifacts replace the planning session's
|
||||
|
||||
## When to Run
|
||||
|
||||
The user opens a new chat naming a project path with continuation intent — "继续生成 projects/<name>", "resume execution projects/<name>", or a project path plus any 继续 / 恢复 / 接着做 semantic. **Prerequisite**: planning completed in that project, verified by file presence in Step 1; never auto-trigger planning on missing state.
|
||||
The user opens a new chat naming a project path with continuation intent — "继续生成 projects/<name>", "resume execution projects/<name>", or a project path plus any other request, in any language, to continue or resume. **Prerequisite**: planning completed in that project, verified by file presence in Step 1; never auto-trigger planning on missing state.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"sourceId": "shadcn",
|
||||
"repo": "https://github.com/shadcn-ui/ui.git",
|
||||
"ref": "main",
|
||||
"commit": "30a58d4498f270af1c1e981a7d78a15cf5740841",
|
||||
"commit": "4233ed1caded8c38f4bc14b14afe1f93ebcaf966",
|
||||
"adapter": "claude-skill",
|
||||
"sourcePath": "skills/shadcn",
|
||||
"syncedAt": "2026-10-14T02:09:15Z"
|
||||
"syncedAt": "2026-10-14T16:00:00Z"
|
||||
}
|
||||
@@ -82,6 +82,7 @@ These rules are **always enforced**. Each links to a file with Incorrect/Correct
|
||||
- **Chat UI composes the chat primitives.** Conversations use `MessageScroller`, rows use `Message`, surfaces use `Bubble`. Never hand-rolled bubble `div`s or a raw scroll container.
|
||||
- **`MessageScroller` owns scroll behavior.** Streaming follow, anchoring, and jump-to-latest (`MessageScrollerButton`) are built in. Don't write a `useStickToBottom`/`ResizeObserver` hook.
|
||||
- **Attachments use `Attachment`; system notes and dividers use `Marker`.** Not `Item` cards or `Separator` + a label.
|
||||
- **Assistant activity uses `Trace`.** Reasoning, tool calls, sources and steps are `TraceLine`s in a `Trace`, one `Trace` per run of message parts. Behavior wraps the line: `TraceCollapsible`, a sheet trigger or a link. Not a hand-rolled `Collapsible` or a `Marker`.
|
||||
|
||||
### CLI
|
||||
|
||||
@@ -144,7 +145,7 @@ These are the most common patterns that differentiate correct shadcn/ui code. Fo
|
||||
| Empty states | `Empty` |
|
||||
| Menus | `DropdownMenu`, `ContextMenu`, `Menubar` |
|
||||
| Tooltips/info | `Tooltip`, `HoverCard`, `Popover` |
|
||||
| Chat / conversation UI | `MessageScroller`, `Message`, `Bubble`, `Attachment`, `Marker` |
|
||||
| Chat / conversation UI | `MessageScroller`, `Message`, `Bubble`, `Attachment`, `Marker`, `Trace` |
|
||||
|
||||
## Key Fields
|
||||
|
||||
@@ -284,7 +285,7 @@ npx shadcn@latest view owner/repo/item
|
||||
|
||||
- [rules/forms.md](./rules/forms.md) — FieldGroup, Field, InputGroup, ToggleGroup, FieldSet, validation states
|
||||
- [rules/composition.md](./rules/composition.md) — Groups, overlays, Card, Tabs, Avatar, Alert, Empty, Toast, Separator, Skeleton, Badge, Button loading
|
||||
- [rules/chat.md](./rules/chat.md) — MessageScroller, Message, Bubble, Attachment, Marker; streaming, anchoring, jump-to-latest
|
||||
- [rules/chat.md](./rules/chat.md) — MessageScroller, Message, Bubble, Attachment, Marker, Trace; streaming, anchoring, jump-to-latest, assistant activity rows
|
||||
- [rules/icons.md](./rules/icons.md) — data-icon, icon sizing, passing icons as objects
|
||||
- [rules/styling.md](./rules/styling.md) — Semantic colors, variants, className, spacing, size, truncate, dark mode, cn(), z-index
|
||||
- [rules/base-vs-radix.md](./rules/base-vs-radix.md) — asChild vs render, Select, ToggleGroup, Slider, Accordion
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
Components for conversation and chat UI. Compose these instead of hand-rolling
|
||||
bubbles, scroll containers, dividers, or attachment cards.
|
||||
|
||||
Install: `npx shadcn@latest add message-scroller message bubble attachment marker`
|
||||
Install: `npx shadcn@latest add message-scroller message bubble attachment marker trace code-block`
|
||||
|
||||
The same component names and props ship for both `base` and `radix`; only
|
||||
composition differs (`render` vs `asChild`). See [base-vs-radix.md](./base-vs-radix.md).
|
||||
@@ -15,6 +15,8 @@ composition differs (`render` vs `asChild`). See [base-vs-radix.md](./base-vs-ra
|
||||
- Message surfaces use Bubble
|
||||
- Attachments use Attachment
|
||||
- System notes and dividers use Marker
|
||||
- Assistant activity uses Trace
|
||||
- Code and tool output use CodeBlock
|
||||
- Streaming, anchoring, and jump-to-latest are built in
|
||||
- Escape hatch: the scroller hooks
|
||||
|
||||
@@ -193,6 +195,261 @@ labeled separators are `Marker`, not a `Separator` plus a centered span.
|
||||
|
||||
---
|
||||
|
||||
## Assistant activity uses Trace
|
||||
|
||||
What the assistant did or is doing (reasoning, tool calls, chain of thought,
|
||||
steps, sources, file reads) is a `TraceLine` in a `Trace`, not a hand-rolled
|
||||
`Collapsible` or a `Marker`. One line reports one thing; it may have detail.
|
||||
|
||||
- `TraceLine` is always the line: a `TraceIcon` and a `TraceTitle`, then an
|
||||
optional `TraceDescription` for a count, a duration or a diff stat. `status`
|
||||
goes on the `TraceLine`. Never hand-roll a span for secondary text.
|
||||
- Behavior wraps the line. To make a line do something, wrap it in that thing's
|
||||
trigger:
|
||||
- nothing to open: the `TraceLine` alone;
|
||||
- expands: `TraceCollapsible` > `TraceCollapsibleTrigger` > `TraceLine`, then
|
||||
`TraceCollapsibleContent`. The trigger adds its own chevron;
|
||||
- link: `<a href>` > `TraceLine`;
|
||||
- overlay: `<SheetTrigger>` > `TraceLine` (Dialog, Drawer and Popover the
|
||||
same). Aria: `<DialogTrigger><Button>` > `TraceLine`, with React Aria's
|
||||
`Button`.
|
||||
- Never make the line the trigger: no `asChild` or `render={<TraceLine />}` on
|
||||
a trigger. The trigger must stay a real button.
|
||||
- A `TraceCollapsibleTrigger` always has a `TraceCollapsibleContent`. A tool row
|
||||
is a `TraceLine` until its output arrives, then a `TraceCollapsible`.
|
||||
- Rows rendered from message parts go in one `Trace` per run of parts. A text
|
||||
part or a pending approval ends the run. A heading for a run is plain text
|
||||
above it, or a collapsible summary row.
|
||||
- A pending approval (`approval-requested`) is a prompt, not a row. Render it
|
||||
outside `Trace` as an `Item` with Approve and Deny in `ItemActions`. See
|
||||
/docs/ai-elements/base/confirmation. Once answered, the tool part is a line
|
||||
again.
|
||||
- A summary (sources, a task, a whole turn) is a `TraceCollapsible` whose
|
||||
`TraceCollapsibleContent` holds a `Trace`. Set the parent line's status and
|
||||
title from its children yourself.
|
||||
- `status` is `"running"`, `"error"` or `"pending"` (a plan step that has not
|
||||
started), or omitted. The words agree: Running, Ran, Failed to run. Never dim
|
||||
a line with `opacity-*`. Map SDK states yourself; never pass one through.
|
||||
- Add a trailing `TraceIcon` only for a link (arrow-up-right for a new tab, with
|
||||
sr-only " (opens in a new tab)" in the `TraceTitle`) or an overlay
|
||||
(chevron-right).
|
||||
- Open state goes on `TraceCollapsible`: `defaultOpen`, or `open` with
|
||||
`onOpenChange` (aria: `defaultExpanded`, or `isExpanded` with
|
||||
`onExpandedChange`).
|
||||
- Use `Marker` for notes and dividers between turns, not for activity.
|
||||
- A checkpoint marks a turn the reader can return to. Render a `Marker`
|
||||
separator after that message, with a Button that calls `setMessages` with the
|
||||
messages up to and including it. See /docs/ai-elements/base/checkpoint.
|
||||
- A folder of files is nested `Collapsible`s, one folder per row, and a file is
|
||||
a `Button`. See /docs/ai-elements/base/file-tree. A single file the assistant
|
||||
read is still a `TraceLine`.
|
||||
- A person's turn is a `Message` with `align="end"` and a `Bubble`. The
|
||||
assistant's answer is a `Message`. See /docs/ai-elements/base/message.
|
||||
- A thread is those turns in `MessageScroller`. The person's turn is the
|
||||
`scrollAnchor`, and `autoScroll` follows the reply. See
|
||||
/docs/ai-elements/base/chat.
|
||||
- A prompt is an `InputGroup`: a textarea, an attachment chip, and a submit
|
||||
button. See /docs/ai-elements/base/prompt-input.
|
||||
- A suggestion is a `Button` that sends its label with `sendMessage({ text })`.
|
||||
See /docs/ai-elements/base/suggestion.
|
||||
- A model picker is a `DropdownMenu` with a `DropdownMenuRadioGroup`, next to a
|
||||
second one for effort. Send the selected ids on `sendMessage` as
|
||||
`body.model` and `body.effort`. See /docs/ai-elements/base/model-selector.
|
||||
- An inline citation is a `HoverCard` on a short `Button` in the sentence, from
|
||||
a `source-url` part. See /docs/ai-elements/base/inline-citation. A list of
|
||||
sources after the answer is still Sources.
|
||||
- Context usage is a `HoverCard` with `Progress`, read from message metadata
|
||||
`usage`. The window size is the model's limit. See
|
||||
/docs/ai-elements/base/context.
|
||||
- Asked for an AI Elements component such as Tool, Reasoning, Chain of Thought,
|
||||
Task, Plan, Sources or Subagent? It is a component page built with Trace (for example
|
||||
/docs/ai-elements/base/tool). Install `trace` and copy the composition.
|
||||
Message is one turn (/docs/ai-elements/base/message). Chat is the thread in
|
||||
Message Scroller (/docs/ai-elements/base/chat). Checkpoint is a Marker
|
||||
(/docs/ai-elements/base/checkpoint). File Tree is nested
|
||||
Collapsibles (/docs/ai-elements/base/file-tree). Confirmation is an Item
|
||||
(/docs/ai-elements/base/confirmation). Prompt Input is an Input Group
|
||||
(/docs/ai-elements/base/prompt-input). Suggestion is a Button
|
||||
(/docs/ai-elements/base/suggestion). Model Selector is a Dropdown Menu
|
||||
(/docs/ai-elements/base/model-selector). Inline Citation is a Hover Card
|
||||
(/docs/ai-elements/base/inline-citation). Context is a Hover Card and Progress
|
||||
(/docs/ai-elements/base/context).
|
||||
|
||||
**Incorrect:**
|
||||
|
||||
```tsx
|
||||
const [open, setOpen] = useState(true)
|
||||
|
||||
<Collapsible open={open} onOpenChange={setOpen}>
|
||||
<CollapsibleTrigger className="text-sm text-muted-foreground">
|
||||
{isStreaming ? "Thinking..." : "Thought for a few seconds"}
|
||||
</CollapsibleTrigger>
|
||||
<CollapsibleContent>{part.text}</CollapsibleContent>
|
||||
</Collapsible>
|
||||
```
|
||||
|
||||
**Correct:**
|
||||
|
||||
```tsx
|
||||
<TraceCollapsible>
|
||||
<TraceCollapsibleTrigger>
|
||||
<TraceLine status={running ? "running" : undefined}>
|
||||
<TraceIcon>
|
||||
<BrainIcon />
|
||||
</TraceIcon>
|
||||
<TraceTitle>{running ? "Thinking" : "Thought"}</TraceTitle>
|
||||
</TraceLine>
|
||||
</TraceCollapsibleTrigger>
|
||||
<TraceCollapsibleContent>{part.text}</TraceCollapsibleContent>
|
||||
</TraceCollapsible>
|
||||
```
|
||||
|
||||
**Incorrect:** a tool row whose output may not exist yet.
|
||||
|
||||
```tsx
|
||||
<TraceCollapsible>
|
||||
<TraceCollapsibleTrigger>
|
||||
<TraceLine status={status}>…</TraceLine>
|
||||
</TraceCollapsibleTrigger>
|
||||
{output && <TraceCollapsibleContent>{output}</TraceCollapsibleContent>}
|
||||
</TraceCollapsible>
|
||||
```
|
||||
|
||||
**Correct:** a `TraceLine` until there is something to open.
|
||||
|
||||
```tsx
|
||||
function ToolRow({
|
||||
icon,
|
||||
title,
|
||||
status,
|
||||
output,
|
||||
}: {
|
||||
icon: React.ReactNode
|
||||
title: string
|
||||
status?: "running" | "error"
|
||||
output?: string
|
||||
}) {
|
||||
const line = (
|
||||
<TraceLine status={status}>
|
||||
<TraceIcon>{icon}</TraceIcon>
|
||||
<TraceTitle>{title}</TraceTitle>
|
||||
</TraceLine>
|
||||
)
|
||||
|
||||
if (output === undefined) {
|
||||
return line
|
||||
}
|
||||
|
||||
return (
|
||||
<TraceCollapsible>
|
||||
<TraceCollapsibleTrigger>{line}</TraceCollapsibleTrigger>
|
||||
<TraceCollapsibleContent>
|
||||
<CodeBlock size="sm">
|
||||
<CodeBlockContent wrap className="max-h-64">
|
||||
{output}
|
||||
</CodeBlockContent>
|
||||
</CodeBlock>
|
||||
</TraceCollapsibleContent>
|
||||
</TraceCollapsible>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
**Incorrect:** the trigger renders as the line, so it is a span.
|
||||
|
||||
```tsx
|
||||
<Sheet>
|
||||
<SheetTrigger asChild>
|
||||
<TraceLine>…</TraceLine>
|
||||
</SheetTrigger>
|
||||
</Sheet>
|
||||
```
|
||||
|
||||
**Correct:** sources, each link wrapping its own line.
|
||||
|
||||
```tsx
|
||||
<TraceCollapsible>
|
||||
<TraceCollapsibleTrigger>
|
||||
<TraceLine>
|
||||
<TraceIcon>
|
||||
<GlobeIcon />
|
||||
</TraceIcon>
|
||||
<TraceTitle>Used {sources.length} sources</TraceTitle>
|
||||
</TraceLine>
|
||||
</TraceCollapsibleTrigger>
|
||||
<TraceCollapsibleContent>
|
||||
<Trace>
|
||||
{sources.map((source) => (
|
||||
<a key={source.url} href={source.url} target="_blank" rel="noreferrer">
|
||||
<TraceLine>
|
||||
<TraceIcon>
|
||||
<GlobeIcon />
|
||||
</TraceIcon>
|
||||
<TraceTitle>
|
||||
{source.title}
|
||||
<span className="sr-only"> (opens in a new tab)</span>
|
||||
</TraceTitle>
|
||||
<TraceIcon>
|
||||
<ArrowUpRightIcon />
|
||||
</TraceIcon>
|
||||
</TraceLine>
|
||||
</a>
|
||||
))}
|
||||
</Trace>
|
||||
</TraceCollapsibleContent>
|
||||
</TraceCollapsible>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Code and tool output use CodeBlock
|
||||
|
||||
Code, terminal output, tool input and output, logs, stack traces and diffs are
|
||||
a `CodeBlock`, never a hand-rolled `<pre>`.
|
||||
|
||||
- `CodeBlockContent` takes a string. Add `wrap` for tool output and errors,
|
||||
`lineNumbers` for source, and a `max-h-*` class to cap the height.
|
||||
- Errors use `variant="destructive"` on `CodeBlock`. Don't recolor the block.
|
||||
- For diffs and highlighted lines, map each line to a `CodeBlockLine` with
|
||||
`variant="added"`, `"removed"` or `"highlighted"`.
|
||||
- `CodeBlockCopyButton` takes the text to copy as `value`.
|
||||
- Output inside a Trace row is `size="sm"` with `wrap` and `max-h-64`, so long
|
||||
output wraps and scrolls inside the row. Docs, Markdown fences and chat
|
||||
answers use the default size.
|
||||
- Header buttons go in `CodeBlockActions`. With no header, put
|
||||
`CodeBlockActions` directly in `CodeBlock`; it floats and shows on hover.
|
||||
- `code-block` installs `use-highlighted-code`. For source code, map the lines
|
||||
of `useHighlightedCode(code, language)` into `CodeBlockLine`. In a Server
|
||||
Component, use `await highlightCode(code, language)` instead. Don't
|
||||
highlight tool output; pass the string.
|
||||
- `startLine` numbers a snippet from the middle of a file.
|
||||
|
||||
**Incorrect:**
|
||||
|
||||
```tsx
|
||||
<pre className="rounded-md bg-muted p-3 font-mono text-xs whitespace-pre-wrap">
|
||||
{output}
|
||||
</pre>
|
||||
```
|
||||
|
||||
**Correct:**
|
||||
|
||||
```tsx
|
||||
<CodeBlock>
|
||||
<CodeBlockHeader>
|
||||
<CodeBlockTitle>Output</CodeBlockTitle>
|
||||
<CodeBlockActions>
|
||||
<CodeBlockCopyButton value={output} />
|
||||
</CodeBlockActions>
|
||||
</CodeBlockHeader>
|
||||
<CodeBlockContent wrap className="max-h-72">
|
||||
{output}
|
||||
</CodeBlockContent>
|
||||
</CodeBlock>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Streaming, anchoring, and jump-to-latest are built in
|
||||
|
||||
`MessageScroller` handles the behavior that chat UIs usually reinvent. Don't
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"sourceId": "taste-skill",
|
||||
"repo": "https://github.com/Leonxlnx/taste-skill.git",
|
||||
"ref": "main",
|
||||
"commit": "a60a36dc2bb3bb77ccf17f2f62041f5ca8a458b9",
|
||||
"commit": "f624f37a8c650b9cc550253104925efe4c8de246",
|
||||
"adapter": "skill-collection",
|
||||
"sourcePath": "skills",
|
||||
"syncedAt": "2026-10-14T02:09:15Z"
|
||||
"syncedAt": "2026-10-14T16:00:00Z"
|
||||
}
|
||||
Reference in new issue
Block a user