{"id":"52ce8d9c-9bb3-4664-880d-cf595cdcf9b8","slug":"openyida-openyida","kind":"skill","name":"openyida","summary":"Your own personal YiDA AI assistant!","owner":"openyida","repoUrl":"https://github.com/openyida/openyida","license":"MIT","licenseTier":"permissive","trust":"community","stars":221,"match":null,"fewStars":false,"format":"skill","createdAt":"2026-03-05T02:36:37.000Z","addedAt":"2026-10-14T10:55:09.970Z","logoUrl":"https://avatars.githubusercontent.com/u/265691147?v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["developer-tools"],"tags":["ai","assistant","low-code-platform","yida","agent"],"runtime":"node","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-14T20:18:19.977Z","sample":false,"url":"https://conduits.dev/tools/openyida-openyida","language":"JavaScript","transports":["stdio"],"install":{"npm":"@openyida/mcp-app"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"<div align=\"center\">\n\n![OpenYida](https://img.alicdn.com/imgextra/i2/O1CN01fwUxry9qUtJ3OTaP_!!6000000008165-2-tps-1672-941.png)\n\n# OpenYida\n\n**AI-native CLI for building DingTalk Yida low-code applications.**\n\nOpenYida connects AI coding agents with Yida's low-code platform, so developers can create apps, forms, workflows, custom pages, reports, integrations, and deployment configuration from a normal chat-driven development workflow.\n\n[Quick Start](#quick-start) · [帮助网站&文档](https://demo.aliwork.com/o/openyida/helpCenter) · [Capabilities](#capabilities) · [Full Capability List](https://demo.aliwork.com/o/openyida/helpCenter?openyidaPath=capabilities) · [CLI Reference](https://demo.aliwork.com/o/openyida/helpCenter?openyidaPath=features/skills) · [Examples](https://demo.aliwork.com/o/openyida/helpCenter?openyidaRoute=showcase) · [Contributing](./CONTRIBUTING.md) · [Changelog](https://demo.aliwork.com/o/openyida/helpCenter?openyidaRoute=changelog) · [Application Previews](#application-previews)\n\n[![npm version](https://img.shields.io/npm/v/openyida?color=brightgreen&label=npm)](https://www.npmjs.com/package/openyida)\n[![npm downloads](https://img.shields.io/npm/dm/openyida?color=blue)](https://www.npmjs.com/package/openyida)\n[![CI](https://github.com/openyida/openyida/actions/workflows/ci.yml/badge.svg)](https://github.com/openyida/openyida/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)\n[![Node.js >=18](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)\n\n[English README](./README.md) · [简体中文 README](./README_zhCN.md)\n\n</div>\n\n---\n\n## What OpenYida Provides\n\nOpenYida is a bridge between AI coding tools and Yida. It gives agents a stable `openyida` CLI to create resources, inspect schemas, generate source code, compile and publish pages, and diagnose issues.\n\nThe result remains a native Yida application: teams can continue editing it in Yida, use existing enterprise security controls, and deploy through the Yida platform.\n\n## Application Previews\n\nExample applications built with the themes below. Click an image to view it at full size. These are visual references, not ready-made business applications: content, data, brand colors, and layouts are adapted to your requirements.\n\n<table>\n  <tr>\n    <td width=\"50%\" align=\"center\"><strong>Dark Rail · Fine Lines</strong><br><a href=\"https://img.alicdn.com/imgextra/i1/O1CN01oFp7XMYEjSI5r31K_!!6000000006946-2-tps-2884-1794.png\"><img src=\"https://img.alicdn.com/imgextra/i1/O1CN01oFp7XMYEjSI5r31K_!!6000000006946-2-tps-2884-1794.png\" alt=\"Dark Rail · Fine Lines example application\" width=\"100%\"></a></td>\n    <td width=\"50%\" align=\"center\"><strong>Soft Inset Surfaces</strong><br><a href=\"https://img.alicdn.com/imgextra/i3/O1CN01UEEmuLlMF3I5pHky_!!6000000006290-2-tps-2870-1798.png\"><img src=\"https://img.alicdn.com/imgextra/i3/O1CN01UEEmuLlMF3I5pHky_!!6000000006290-2-tps-2870-1798.png\" alt=\"Soft Inset Surfaces example application\" width=\"100%\"></a></td>\n  </tr>\n  <tr>\n    <td width=\"50%\" align=\"center\"><strong>Sage</strong><br><a href=\"https://img.alicdn.com/imgextra/i1/O1CN01NiHI4pBsbOK5qIC4_!!6000000007377-2-tps-2878-1798.png\"><img src=\"https://img.alicdn.com/imgextra/i1/O1CN01NiHI4pBsbOK5qIC4_!!6000000007377-2-tps-2878-1798.png\" alt=\"Sage example application\" width=\"100%\"></a></td>\n    <td width=\"50%\" align=\"center\"><strong>Teal</strong><br><a href=\"https://img.alicdn.com/imgextra/i2/O1CN01hLAdOTwuEWF5qXno_!!6000000004848-2-tps-2880-1796.png\"><img src=\"https://img.alicdn.com/imgextra/i2/O1CN01hLAdOTwuEWF5qXno_!!6000000004848-2-tps-2880-1796.png\" alt=\"Teal example application\" width=\"100%\"></a></td>\n  </tr>\n  <tr>\n    <td width=\"50%\" align=\"center\"><strong>Terminal</strong><br><a href=\"https://img.alicdn.com/imgextra/i3/O1CN01PPHEYDv6nMB5qXnq_!!6000000004777-2-tps-2880-1798.png\"><img src=\"https://img.alicdn.com/imgextra/i3/O1CN01PPHEYDv6nMB5qXnq_!!6000000004777-2-tps-2880-1798.png\" alt=\"Terminal example application\" width=\"100%\"></a></td>\n    <td width=\"50%\" align=\"center\"><strong>Platinum</strong><br><a href=\"https://img.alicdn.com/imgextra/i2/O1CN01eDGhh1WCtFI5soHi_!!6000000007333-2-tps-2898-1792.png\"><img src=\"https://img.alicdn.com/imgextra/i2/O1CN01eDGhh1WCtFI5soHi_!!6000000007333-2-tps-2898-1792.png\" alt=\"Platinum example application\" width=\"100%\"></a></td>\n  </tr>\n</table>\n\nUse an **application theme or an independent creative direction**. Describe a style you like, or provide a reference website or design image to customize your app’s appearance. [Browse more application examples](https://demo.aliwork.com/o/openyida/helpCenter?openyidaRoute=showcase).\n\n## Core Capabilities\n\n| Area | What you can do |\n|------|-----------------|\n| Application delivery | Create, update, export, and import Yida applications |\n| Form modeling | Create forms, update fields, inspect schemas, and manage permissions |\n| Custom pages | Generate React-based pages, lint Yida runtime rules, compile, and publish |\n| Workflow automation | Create process forms, configure approval flows, preview process instances |\n| Data operations | Query form/process/task/subform data and run anomaly checks |\n| Integrations | Manage HTTP connectors, connector actions, auth accounts, and automation flows |\n| Operations | Diagnose environment issues, manage login state, configure sharing, upload CDN assets |\n\n## From Request to Delivery\n\n1. **Describe the goal.** Explain who will use the app, what they need to do, and any existing app or reference material.\n2. **Share requirements and preferences.** Add the business details and appearance preferences that matter to you. Include any colors, websites, or design images you like.\n3. **Choose how to build.** Fast suits clear requirements you want to move forward with. Plan produces a reviewable proposal and waits for approval before creating resources.\n4. **Review and refine.** Check the delivered app and common actions, then request page, field, or workflow changes. Your chosen style is reused unless you ask to change it.\n\nFor existing-app improvements, review the visual proposal before backups and implementation. Restoration uses the saved backups; page content and theme settings need separate backups, with the supported scope explained before changes.\n\n## Recent Updates\n\n**2026.10.14-1** improves appearance customization, with better support for style descriptions, reference websites, and design images. [Read the full changelog](./CHANGELOG.md#20261014-1---2026-10-14).\n\n## Quick Start\n\n### 1. Install\n\n```bash\nnpm install -g openyida\n```\n\nOpenYida requires Node.js 18 or later. The package exposes both `openyida` and `yida` commands.\n\nGlobal npm installations check for updates at most once a day and update automatically. Run `openyida update` to update manually, or set `OPENYIDA_NO_AUTO_UPDATE=1` to keep your installed version.\n\n<details>\n<summary>Auto-update environments and development settings</summary>\n\nLocal terminals and AI tools share the same policy. Managed cloud Agent runtimes skip automatic updates. For development and testing, `OPENYIDA_AUTO_UPDATE_SECS` changes the check interval.\n\n</details>\n\nIf Codex is already installed, OpenYida also imports a local Codex plugin during postinstall. Restart Codex after installation, then type `@宜搭` or `@openyida` in the composer to attach the OpenYida context.\n\n### 2. Check Your Environment\n\nRun this from the AI coding workspace where you want OpenYida to operate:\n\n```bash\nopenyida agent-capabilities --summary-json\n```\n\nThis checks the installed version, login state, and workspace. Use `openyida agent-capabilities --json` for detailed diagnostics.\n\n### 3. Log In\n\n```bash\nopenyida login\n```\n\nOpenYida login defaults to OAuth token mode. It opens the DingTalk OAuth authorization page, receives the local loopback callback, exchanges `code` / `authCode` with the Yida server, and stores `access_token` / `refresh_token` in the user auth store when available. If the user auth store is not writable, OpenYida explicitly falls back to the current project cache and reports that narrower persistence scope.\n\nWhen the user names a target Yida entry URL, pass it to the login command so OpenYida can select the matching environment and auth profile. For example:\n\n```bash\nopenyida login https://yida-group.alibaba-inc.com/\nopenyida login --alibaba\n```\n\nFor token status checks, use:\n\n```bash\nopenyida login --check-only --json\nopenyida auth status\n```\n\nTo reuse an existing shared login profile for the current project, switch first instead of starting a new OAuth login:\n\n```bash\nopenyida auth profiles\nopenyida auth profile switch <auth_profile>\n```\n\nIf the target profile is not listed, run `openyida login` to add it, then switch to the new profile.\n\nOpenYida does not install Playwright by default.\n\n### 4. Build With an AI Agent\n\nAsk your coding agent for a concrete Yida application or workflow:\n\n```text\nCreate a CRM application in Yida with customer, contact, opportunity, and follow-up forms.\nUse Plan mode to design a procurement app with requests, approvals, and dashboards. Show me the proposal first.\nBuild an oolong tea brand storefront and order management back office, with navigation groups.\nImprove the appearance of this existing app. Show me the proposal first, preserve business logic, and back up before changes.\n```\n\nThe agent can then call OpenYida commands to create the application, generate source files, publish pages, and return the final Yida URLs. In Codex, QwenWork, Qoder, Qoder IDE, and QoderWork environments, successful creation and publish commands also include a browser handoff so the agent can open the resulting Yida page in the in-app browser. Use `--open` to force this handoff or `--no-open` to suppress it.\n\n## Supported AI Coding Tools\n\n| Tool | Support |\n|------|---------|\n| [Codex](https://openai.com/codex/) | Full support |\n| [Claude Code](https://claude.ai/code) | Full support |\n| [MuleRun](https://mulerun.com) | Full support |\n| [Cursor](https://cursor.com/) | Full support |\n| [Visual Studio Code](https://code.visualstudio.com/) | Full support |\n| QwenWork（千问办公） | Full support |\n| [Qoder](https://qoder.com/download) | Full support |\n| [Qoder IDE](https://qoder.com/ide) | Full support |\n| [QoderWork](https://qoder.com/download) | Full support |\n\n## How It Works\n\n```mermaid\nflowchart LR\n  A[\"AI coding agent\"] --> B[\"OpenYida CLI\"]\n  B --> C[\"Environment detection\"]\n  B --> D[\"Login and organization context\"]\n  B --> E[\"Yida API operations\"]\n  B --> F[\"Local page generation and compile\"]\n  E --> G[\"Native Yida app\"]\n  F --> G\n```\n\nOpenYida keeps platform-specific behavior inside the CLI, while agents interact with predictable commands and project files.\n\n## Project Layout\n\n```text\nopenyida/\n├── bin/yida.js                 # CLI entry and command routing\n├── lib/\n│   ├── app/                    # Application, form, page, import/export commands\n│   ├── auth/                   # OAuth token login, token session storage, organization switch\n│   ├── connector/              # HTTP connector lifecycle and smart creation\n│   ├── core/                   # Environment detection, i18n, diagnostics, data commands\n│   ├── process/                # Process form creation, configuration, preview\n│   ├── report/                 # Yida report and chart generation\n│   └── samples/                # Reusable code templates emitted by openyida sample\n├── project/                    # Default workspace template for generated Yida projects\n├── yida-skills/                # Source skill docs and Yida API references\n└── scripts/                    # CI, packaging, and installation helpers\n```\n\n## Capabilities\n\nFor a user-facing list of supported features and matching CLI commands, see [OpenYida 功能完整列表](https://demo.aliwork.com/o/openyida/helpCenter?openyidaPath=capabilities).\n\n### Application and Form Management\n\n```bash\nopenyida create-app --name \"CRM\" --desc \"Customer management\"\nopenyida sample yida-design app-theme --output .cache/openyida/crm/app-theme.css\nopenyida create-app --name \"CRM\" --desc \"Customer management\" --theme-file .cache/openyida/crm/app-theme.css --nav-theme light --logo-source appIcon --layout l_shape\nopenyida app-list --type managed --page 1 --size 16\nopenyida update-app APP_XXX --theme-file .cache/openyida/crm/app-theme.css --nav-theme light --logo-source appIcon --layout l_shape\nopenyida corp-efficiency\nopenyida create-form create APP_XXX \"Customer\" .cache/openyida/forms/customer-fields.json\nopenyida create-form update APP_XXX FORM_XXX .cache/openyida/forms/customer-changes.json\nopenyida create-form update APP_XXX FORM_XXX --data-file .cache/openyida/forms/customer-changes.json\nopenyida create-form resume APP_XXX FORM_XXX .cache/openyida/forms/customer-fields.json --json\nopenyida sample openyida-page-template form-fields --output .cache/openyida/forms/customer-fields.json\nopenyida sample openyida-page-template canvas-form-drawer --output project/pages/src/customer-entry.canvas.jsx --var APP_TYPE=APP_XXX --var FORM_UUID=FORM_XXX\nopenyida get-schema APP_XXX FORM_XXX\nopenyida get-schema APP_XXX FORM_XXX --compact --resolve-fields \"Customer Name,Status\"\nopenyida get-schema APP_XXX --all --output-dir .cache/schemas\n```\n\nNative forms use a component tree: business fields capture data, tabs switch content, action groups trigger business actions, images establish visual focus, status areas provide feedback, and `Divider` plus `ColumnContainer` organize hierarchy and columns. `create-form` field definitions create 19 business field types plus `Divider` and `ColumnContainer` (mapped to `ColumnsLayout` + `Column`), while updates retain other existing components.\n\n### Custom Page Development\n\n```bash\nopenyida create-page APP_XXX \"Dashboard\" --mode dashboard\nopenyida publish pages/src/home.canvas.jsx APP_XXX FORM_XXX\n```\n\nCustom page source is authored directly from PRD and design guidance. Custom page development uses `yida-canvas-custom-page` and `.canvas.jsx`.\n\nFor member, department, attachment, and image upload components, `.canvas.jsx` pages should follow `yida-canvas-custom-page/references/native-components-bridge.md` for feature detection, fallback, and value normalization.\n\nFor the current custom page native-component support matrix, see [Yida native components supported by custom pages](https://demo.aliwork.com/o/openyida/sample/canvas-native-components).\n\n### Workflow, Data, and Permissions\n\n```bash\nopenyida create-process APP_XXX \"Purchase Request\" .cache/openyida/process/fields.json .cache/openyida/process/process.json\nopenyida configure-process APP_XXX FORM_XXX .cache/openyida/process/process.json\nopenyida process preview APP_XXX PROC_INST_XXX --output .cache/openyida/process/process.html\nopenyida data query form APP_XXX FORM_XXX --page 1 --size 20\nopenyida data query form APP_XXX FORM_XXX --dynamic-order '{\"dateField_xxx\":\"-\"}'\nopenyida data create form APP_XXX FORM_XXX --expect-form-name 客户 --expect-form-type receipt --data-file .cache/openyida/data-import/record.json\nopenyida get-permission APP_XXX FORM_XXX\n```\n\nAppend and forward permissions are configured in the process definition through `nodes[].actions.normalActions/appendActions`. Both `create-process` and `configure-process` compile these settings into matching designer and runtime properties. See [approval action configuration](yida-skills/skills/yida-process-rule/references/approval-actions.md) for the JSON example, defaults, and verification limits.\n\n`configure-process` 的流程 JSON 中，审批人可配置为发起人、指定成员、指定角色、部门主管或直属主管，例如：\n\n```json\n{\n  \"nodes\": [\n    {\n      \"type\": \"approval\",\n      \"name\": \"主管审批\",\n      \"approver\": {\n        \"type\": \"user\",\n        \"users\": [{ \"id\": \"manager7350\", \"name\": \"九神\" }],\n        \"multiApproverType\": \"all\"\n      }\n    }\n  ]\n}\n```\n\n`configure-process` 会先通过表单绑定和流程版本只读接口证明 `processCode` ownership。目标已有 PUBLISHED 流程或 SAVED 草稿时，整图替换必须在人工确认后显式传入 `--replace`；未确认或 ownership 不匹配时远程写入数为 0。draft/save/publish 均为 one-shot，认证异常返回 `NON_IDEMPOTENT_RESULT_UNKNOWN`，不得自动重试。\n\n发布成功还必须精确回读同一 PUBLISHED `processId/processVersion` 的 `getProcessById` 平台视图，并验证可见节点的组件、名称、顺序和审批模式。只有输出 `verificationLevel: \"PLATFORM_VIEW_VERIFIED\"` 才表示平台 view 已验证；`PUBLISHED_UNVERIFIED` 表示发布可能已生效但回读不完整，不能宣称 `processJson` 已验证，也不能直接重放写请求。\n\nWhen creating or updating test data with `openyida data`, Yida date fields must use 13-digit millisecond timestamps, for example `\"dateField_xxx\": 1719705600000`. Do not submit `YYYY-MM-DD` strings for `DateField` or `CascadeDateField` values.\nFor deterministic query order, pass `--dynamic-order '{\"fieldId\":\"+\"}'` for ascending order or `--dynamic-order '{\"fieldId\":\"-\"}'` for descending order. Without `--dynamic-order`, `searchFormDatas` does not guarantee a stable result order; pagination, comparison, and pairing logic must not depend on the default order.\nTemporary JSON, CSV, and one-off import scripts should live under `.cache/openyida/` so generated run artifacts do not clutter the repository root.\n\n### Real Environment E2E\n\nMost checks should stay offline, but OpenYida also includes an explicit real-environment smoke path for release and nightly validation:\n\n```bash\nOPENYIDA_E2E=1 npm run test:e2e:real\nOPENYIDA_E2E=1 npm run test:e2e:real:full\nOPENYIDA_E2E=1 OPENYIDA_E2E_FULL_STAGES=auth,app,form,process npm run test:e2e:real:full\nnpm run test:e2e:real:skills\n```\n\nThe runner creates a disposable app, form, and custom page with an `OY_E2E_*` prefix, then verifies token login, app listing, schema fetch, data query, and page publish. It writes a registry to `project/.cache/e2e-real/` so created resources can be audited later. Run `openyida login` for the target environment before starting the real E2E runner.\n\n`test:e2e:real:full` extends the smoke path into a broad deterministic feature matrix: auth/env, app update, form update and option mutation, page build/compile/generate/publish, data create/get/update/query, permission read, page config and short URL check, report create/append, dashboard skill verification, export/import, batch, task-center, formula/doctor/sample/CDN config, and local connector parsing/template generation. AI-backed commands such as `flash-to-prd` are available as the optional `ai` stage because they depend on remote model availability. Workflow mutation is available as the opt-in `process` stage; it creates and republishes a workflow on the disposable E2E form and records advanced official-node fixtures for review.\n\n`test:e2e:real:skills` enforces coverage for every directory under `yida-skills/skills/`. Each skill must be classified as real E2E, offline/unit, opt-in, or deprecated with an explicit reason. This prevents new skills from quietly bypassing the real-environment test plan.\n\nEach successful full run leaves a human-inspectable result app in the target organization. The final step publishes a dedicated `Full E2E Dashboard` custom page, renames the app to `OY_E2E_*_PASSED` by default, and prints direct links for the app, form, dashboard page, and report; the same links are saved under `resultApp` in the registry JSON.\n\nUseful options:\n\n| Env var | Purpose |\n|---------|---------|\n| `OPENYIDA_E2E_PREFIX` | Override the disposable resource name prefix |\n| `OPENYIDA_E2E_CORP_ID` | Switch to the dedicated test organization before creating resources |\n| `OPENYIDA_E2E_RESULT_APP_NAME` | Override the final app name shown as the full-run result |\n| `OPENYIDA_E2E_BASE_URL` | Override the Yida base URL for private deployments |\n| `OPENYIDA_E2E_FIELDS_FILE` | Use a custom form fields fixture |\n| `OPENYIDA_E2E_PAGE_SOURCE` | Use a custom page source for publish verification |\n| `OPENYIDA_E2E_SKIP_PUBLISH=1` | Skip custom page creation and publish |\n| `OPENYIDA_E2E_REGISTRY_DIR` | Write registries outside `project/.cache/e2e-real/` |\n| `OPENYIDA_E2E_FULL_STAGES` | Comma-separated stage list for `test:e2e:real:full`; use `all` or omit for the default broad matrix |\n\nUse `npm run test:e2e:real:cleanup` to list recorded disposable resources. OpenYida does not yet expose a safe app/form deletion command, so cleanup is intentionally a registry-backed audit step rather than an automatic destructive action.\n\n### Skill Evaluation Harness\n\nThe E2E paths above prove the *CLI* works. The eval harness under `scripts/eval/` measures whether the *agent* still routes natural-language requests to the right sub-skill and produces good output after you edit `yida-skills/SKILL.md`. It is the feedback loop for harness engineering.\n\n```bash\n# Routing eval — \"did it pick the right sub-skill?\" No real resources, no login.\n# Drives a headless `claude -p` agent with each scenario prompt and checks\n# the selected sub-skill against the golden set.\nnpm run eval:routing\n\n# Doc quality — static analysis of all SKILL.md files (standards + maintainability).\nnpm run eval:doc-quality\n\n# Safety — credential leak detection, command whitelist, corpId consistency.\nnpm run eval:safety\n\n# Coverage — how much of the skill/category/reference space is covered by scenarios.\nnpm run eval:coverage\n\n# Comprehensive — 10-dimension scorecard for a single skill (doc quality, routing,\n# safety, step completeness, output validity, efficiency, stability, coverage).\n# Outputs a JSON scorecard, SVG radar chart, and trend analysis.\nnpm run eval:comprehensive -- --skill yida-dashboard\n\n# Tool-pipeline baseline (end-to-end) — wraps the real-environment runner for one\n# sub-skill, adds guardrail assertions, screenshots the published page, and writes a\n# human scoring template. Runs deterministic CLI commands (no agent) so it serves as\n# a control that proves the build→publish→screenshot→score plumbing itself works.\n# Requires OPENYIDA_E2E=1 and a valid token session.\nOPENYIDA_E2E=1 npm run eval:e2e -- --skill yida-dashboard --screenshot\n\n# Same, plus automatic screenshot scoring via the local multimodal `claude -p`.\nOPENYIDA_E2E=1 npm run eval:e2e -- --skill yida-dashboard --screenshot --auto-score\n\n# Real-generation eval — \"can one sentence really build a usable app?\" Feeds a\n# natural-language request (\"帮我创建一个订单管理系统\") to a headless `claude -p`\n# that actually reads the openyida skill and runs the CLI to build a real app, then\n# reuses the screenshot + scoring + report pipeline. Creates real 宜搭 resources, so\n# it needs OPENYIDA_E2E=1 + an authenticated agent. Unlike the deterministic baseline\n# above, here the agent self-orchestrates.\nOPENYIDA_E2E=1 npm run eval:generate -- --screenshot\n\n# Re-evaluate an archived real CLI trace against the latest scenario contract and\n# current read-only platform state. This does not run an agent or mutate resources.\nnpm run eval:replay -- --report <generation-report.json> --scenario <scenario.json> --app-type APP_XXX\n\n# Run all three in one pass (routing + tool-pipeline baseline + real generation).\nOPENYIDA_E2E=1 npm run eval:all -- --skill yida-dashboard --screenshot\n\n# Optional: a zero-dependency local web console (buttons + live streamed output)\n# that runs the tasks above on click. Binds to 127.0.0.1 only; tasks are a fixed\n# whitelist. Use the Node version you start it with, so run `nvm use 20` first.\nnpm run eval:dashboard          # http://127.0.0.1:4500\n\n```\n\nConfiguration precedence is `CLI flag > env (OPENYIDA_EVAL_*) > scripts/eval/eval.config.json > defaults`.\n\n| Flag | Purpose |\n|------|---------|\n| `--mode e2e\\|routing\\|generate\\|doc-quality\\|safety\\|coverage\\|comprehensive\\|all` | Which evals to run (default `e2e`) |\n| `--skill <name>` | Restrict the e2e run to one sub-skill; stages are reverse-looked-up from the `SKILL_COVERAGE` matrix |\n| `--stages a,b` | Explicit stage list, overriding the skill reverse-lookup |\n| `--runs N` | Multi-run stability: repeat routing N times, report consistency rate |\n| `--screenshot` / `--no-screenshot` | Capture the published page (default on; skipped gracefully if Playwright is absent) |\n| `--auto-score` / `--no-auto-score` | Score screenshots with the local `claude -p` agent (default off → human template only) |\n| `--scenarios <dir>` | Routing golden-set directory (default `scripts/eval/scenarios`) |\n| `--gen-scenarios <dir>` | Real-generation golden-set directory (default `scripts/eval/scenarios/generation`) |\n\nResults are written back into the existing `acceptance-manifest.json` under a new `eval` section (guardrails, screenshots, scores) plus two sibling artifacts: a `scoring.md` human-scoring template and a self-contained `eval-report.html` visual report (screenshots inlined as base64, so the single file opens anywhere). Routing results land in `project/.cache/eval/routing-report.json`; generation results (with their own `scoring.md` + `eval-report.html`) land in `project/.cache/eval/generate/gen-<timestamp>/`. The harness degrades gracefully: a missing Playwright skips screenshots (enable with `npm install --no-save playwright && npx playwright install chromium`), and a missing `claude` CLI skips auto-scoring while keeping the human template. A guardrail failure (for example a resource-creating command issued before a successful `login --check-only`) fails the run.\n\nA zero-dependency local dashboard (`npm run eval:dashboard`, then open `http://127.0.0.1:4500`) drives these runs from buttons and streams output live; its \"📊 查看最新报告\" button opens the most recent `eval-report.html`.\n\n### Connectors, Integrations, and Reports\n\n```bash\nopenyida connector smart-create --curl \"curl https://api.example.com/users\"\nopenyida connector list\nopenyida integration create APP_XXX FORM_XXX \"Sync customer data\"\nopenyida integration create APP_XXX FORM_XXX \"Approval result notify\" \\\n  --events processFinish --approval-actions agree,disagree --receivers 123456\n# Capability probe only; currently fails closed before auth/spec reads/remote writes\nopenyida integration update APP_XXX FORM_XXX LPROC_XXX \\\n  --spec .cache/openyida/integration/desired-spec.json\nopenyida create-report APP_XXX \"Sales Dashboard\" .cache/openyida/reports/charts.json\nopenyida append-chart APP_XXX REPORT_XXX .cache/openyida/reports/chart.json\n\n# Aggregate tables use two independent optimistic-concurrency axes.\nopenyida aggregate-table inspect APP_XXX FORM_XXX --json\nopenyida aggregate-table preview APP_XXX FORM_XXX .cache/openyida/aggregate/design.json --json\nopenyida aggregate-table save APP_XXX FORM_XXX .cache/openyida/aggregate/design.json --json --no-open\nopenyida aggregate-table publish APP_XXX FORM_XXX .cache/openyida/aggregate/design.json --json --no-open\nopenyida aggregate-table status APP_XXX FORM_XXX --json\n```\n\nAggregate-table `save` verifies the draft `stashGmtModified` axis; `publish` verifies the live `gmtModified` axis. Both commands require the corresponding GET readback revision to advance; when a response revision exists it must equal that readback axis. Both commands also require canonical readback of `relationForms`, `relationships`, `aggregatedFields`, `auxFields`, `formulaFields`, and `validators`. The CLI intentionally does not expose aggregate-table deletion, AI authoring, a high-level design DSL, or tenant-dynamic limits until the corresponding platform contracts are proven.\n\nThe opt-in aggregate real-E2E runner additionally requires `OPENYIDA_AGGREGATE_E2E_RUN_ID` and an exact `OPENYIDA_AGGREGATE_E2E_OWNED_MARKER` beginning with `<runId>__`. Before its first write it verifies the exact list/inspect identity and name, persists a redacted manifest, registry, and baseline snapshot, then conditionally restores the baseline using the latest live revision. Missing ownership proof or concurrent revision movement produces `PLATFORM_PROBE_REQUIRED` / `restore_blocked` without a restore write.\n\n## CLI Reference\n\nRun `openyida --help` or `openyida <command> --help` for detailed usage.\n\n<!-- OPENYIDA_COMMANDS_START -->\n<!-- This section is generated by `npm run docs:commands`. Do not edit command rows by hand. -->\n\n### Auth & Environment\n\n| Command | Description |\n|---------|-------------|\n| `openyida login [target-url] [--env <name>\\|--intl\\|--overseas\\|--global\\|--yidaapps\\|--alibaba] [--client-id <clientId>] [--endpoint <url>] [--no-browser]` | Login with OAuth token mode |\n| `openyida logout` | Logout / unbind current project auth |\n| `openyida auth <status\\|login\\|refresh\\|logout\\|profiles\\|profile switch>` | Token login state and profile management |\n| `openyida org <list\\|switch> [--json] [--corp-id <corpId>]` | Organization management (list / switch existing profiles first) |\n| `openyida env [--json\\|setup\\|list\\|show\\|switch\\|add\\|remove] [options]` | Detect AI tool environment & token login state |\n\n### App Management\n\n| Command | Description |\n|---------|-------------|\n| `openyida app-entry get <appType> [--json]` | Read frontend and management runtime entries |\n| `openyida app-entry set <appType> [--frontend <url>\\|--frontend-page <formUuid>] [--management <url>\\|--management-page <formUuid>] [--clear-frontend] [--clear-management] [--json]` | Register application entries with partial update and readback |\n| `openyida app-list [--type managed\\|created] [--page N] [--size N]` | Page through apps I manage or created |\n| `openyida corp-efficiency [overview\\|details\\|detail\\|groups\\|notify] [options] [--open\\|--no-open]` | Query enterprise efficiency overview and detail reports |\n| `openyida create-app \"<name>\"\\|--name <name> [options] [--locale zh_CN\\|en_US\\|ja_JP] [--open\\|--no-open]` | Create a Yida app |\n| `openyida design-plan catalog [--json]` | List available planning themes and page patterns |\n| `openyida design-plan init <requirement-brief.json> [--theme-id <id>] [--output-dir <dir>] [--json]` | Initialize a plan draft from confirmed requirements |\n| `openyida design-plan preview <build-plan.json> --part-file <module.json> [--json]` | Update plan drafts by module |\n| `openyida design-plan materialize <build-plan.json> [--from-preview \\| --business-file <json> --visual-file <json>] [--output-dir <dir>] [--rebase-parts] [--check] [--json]` | Generate or update plan documents and theme with consistency checks |\n| `openyida design-plan patch <build-plan.json> --set <path=value> [--set <path=value> ...] [--materialize] [--output-dir <dir>] [--json]` | Patch plan fields and optionally sync documents and theme |\n| `openyida update-app <appType> [--name \"...\"] [--desc \"...\"] [--icon <name>] [--icon-color <color>] [--colour <key>] [--theme-color <color>] [--theme-file <css>] [--confirm-legacy-app-style] [--disable-custom-theme] [--nav-theme light\\|dark\\|white\\|gray] [--logo-source appIcon\\|customImage] [--layout side\\|top\\|l_shape] [--hide-app-nav\\|--show-app-nav]` | Update app info |\n| `openyida data-manage-style guide [--json]` | Inspect data-management UI directions, tokens and scoped CSS guidance |\n| `openyida data-manage-style list [--json]` | List optional data-management recipe examples |\n| `openyida data-manage-style generate --app <appType> --form <formUuid> --style <id> --base-css <theme.css> --output <new.css> [--focus balanced\\|actions] [--field-id <actualId>]... [--emphasize-field <actualId>]... [--tag-field <selectFieldId>]... [--follow-shell] [--json]` | Generate data-management CSS from an optional recipe (local only) |\n| `openyida app-theme snapshot <appType> --output-dir <new-dir> [--json]` | Archive application theme settings and CSS (read-only) |\n| `openyida app-theme restore <appType> --snapshot <before.json> --expected-current <after.json> [--check \\| --confirm --output-dir <new-dir>] [--json]` | Check or restore an application theme snapshot (supported exact values only) |\n| `openyida upgrade-app-theme <appType> --explicit-request [--confirm \\| --prepare --output-dir <dir>] [--json]` | Upgrade an AI-built legacy app theme (explicit request and ask_human confirmation required) |\n| `openyida app-online <appType> [--to-ding-app-center] [--show-app-center]` | Enable a Yida app |\n| `openyida app-offline <appType> [--to-ding-app-center] [--show-app-center]` | Disable a Yida app |\n| `openyida nav-group <list\\|create\\|rename\\|delete\\|move\\|order\\|auto-order\\|hide\\|show> <appType> ...` | Manage app sidebar navigation groups |\n| `openyida app-permission <get\\|set\\|add\\|remove\\|search-user> ...` | Manage app primary, data, and developer admins |\n| `openyida i18n <overview\\|config\\|languages\\|list\\|upsert\\|delete\\|translate\\|translate-all\\|upgrade> <appType> ...` | Manage app multilingual copy and language config |\n| `openyida export <appType> [output]` | Export app (generate migration package) |\n| `openyida import <file> [name]` | Import migration package, rebuild app |\n\n### Forms & Pages\n\n| Command | Description |\n|---------|-------------|\n| `openyida create-form batch <appType> <plan.json> [--concurrency 1..4] [--check] [--json]` | Create forms concurrently by dependency |\n| `openyida create-form create <appType> \"<formTitle>\" <fieldsJsonFile> [--layout single\\|double\\|card\\|section] [--theme default\\|compact\\|comfortable] [--label-align top\\|left\\|right] [--icon auto\\|<iconName>] [--locale zh_CN\\|en_US\\|ja_JP] [--open\\|--no-open]` | Create a form page |\n| `openyida create-form icons [--json]` | List available form navigation icons |\n| `openyida create-form validate-fields <fieldsJsonOrFile> [--json]` | Validate form field JSON locally |\n| `openyida create-form update <appType> <formUuid> (<changesJsonOrFile> \\| --data-file <changesJsonOrFile>) [--locale zh_CN\\|en_US\\|ja_JP] [--open\\|--no-open]` | Update a form page |\n| `openyida create-form resume <appType> <formUuid> <fieldsJsonOrFile> [--json]` | Update a form page |\n| `openyida create-form patch <appType> <formUuid> <patchJsonOrFile> [--open\\|--no-open]` | Update a form page |\n| `openyida create-form rule <appType> <formUuid> <rulesJsonOrFile> [--open\\|--no-open]` | Update a form page |\n| `openyida create-form validation <appType> <formUuid> <validationsJsonOrFile> [--open\\|--no-open]` | Update a form page |\n| `openyida add-validation <appType> <formUuid> --field <labelOrId> --type <phone\\|regex\\|idCard\\|email\\|...> [--message <text>]` | Update a form page |\n| `openyida create-form bind-datasource <appType> <formUuid> <fieldLabelOrId> <dataSourceJsonOrFile> [--open\\|--no-open]` | Update a form page |\n| `openyida create-form add-option <appType> <formUuid> <fieldLabel> <option1> [option2] ...` | Update a form page |\n| `openyida list-forms <appType> [--keyword <text>]` | List forms/pages in an app |\n| `openyida aggregate-table <list\\|create-empty\\|inspect\\|preview\\|save\\|publish\\|status> <appType> ...` | Manage aggregate tables (virtualView) |\n| `openyida get-schema <appType> <formUuid\\|--all> [--summary-json\\|--field-map-json\\|--analysis-json]` | Get one form Schema or all form Schemas |\n| `openyida check-prd-completeness <prd.md> --app-type <appType> [--build-manifest <file>] [--json]` | Check PRD page/resource count risk |\n| `openyida check-design <design.md> [--prd <prd.md>] [--base-dir <dir>] [--json]` | Validate design documents, theme tokens and PRD handoff |\n| `openyida er <appType> [--format mermaid\\|json] [--output file] [--include-system] [--include-pages]` | Export app entity relationship diagram |\n| `openyida create-page <appType> \"<name>\" [--mode dashboard] [--hide-nav] [--locale zh_CN\\|en_US\\|ja_JP] [--open\\|--no-open]` | Create a custom display page |\n| `openyida build-page <sourceFile> [--output file\\|--write]` | Build Yida-compatible page source |\n| `openyida check-page <src> [--compat] [--json]` | Check custom page standards |\n| `openyida compile <src> [--canvas] [--compat] [--skip-lint] [--strict-theme\\|--allow-fixed-brand] [--json]` | Compile custom page locally |\n| `openyida publish <src> <appType> <formUuid> [--health-check] [--force] [--canvas] [--compat] [--skip-lint] [--fix-theme] [--strict-theme] [--allow-fixed-brand] [--auto-nav-order] [--open\\|--no-open] [--json]` | Compile and publish custom page |\n| `openyida update-form-config <appType> <formUuid> <true\\|false\\|keep> \"<title>\" [--locale zh_CN\\|en_US\\|ja_JP]` | Update form configuration |\n| `openyida get-form-config <appType> <formUuid> [--json]` | Query form configuration |\n\n### Data & Permissions\n\n| Command | Description |\n|---------|-------------|\n| `openyida data <query\\|get\\|create\\|update> <resource> ... \\| delete form <appType> <formUuid> --inst-id <id> --expect-form-name <name> --expect-form-type receipt --confirm [--json]` | Unified data management (form/process/task/subform) |\n| `openyida task-center <type> [options]` | Global task center (todo/processed/cc etc.) |\n| `openyida basic-info <overview\\|commodity\\|grant\\|capacity\\|quota\\|abs-path\\|dataflow\\|i18n\\|domain>` | Query organization basic info, capacity, quotas, and domain settings |\n| `openyida read-dingtalk-doc <docUrl> [--output <file>] [--json]` | Fetch Markdown content from a DingTalk document |\n| `openyida read-dingtalk-tingji <taskUuid> [--json]` | Fetch DingTalk Tingji details by task UUID |\n| `openyida get-permission <appType> <formUuid> [--package-uuid <packageUuid>] [--json]` | Query form permission config |\n| `openyida save-permission <appType> <formUuid> --package-uuid <packageUuid> [--data-permission <json>\\|--action-permission <json>\\|--field-permission <json>]` | Save form permission config |\n| `openyida corp-manager <search-user\\|list\\|add\\|remove\\|address-book> ...` | Manage platform admins and address book permissions |\n| `openyida agent-center <list\\|create\\|update\\|cancel\\|range\\|search-user> ...` | Manage process and departure delegation |\n\n### Process\n\n| Command | Description |\n|---------|-------------|\n| `openyida configure-process <appType> <formUuid> <definition> [processCode] [--replace]` | Configure and publish process rules; Supports append/forward via JSON nodes[].actions.normalActions/appendActions |\n| `openyida create-process <appType> <formTitle> <fieldsJsonFile> <processDefinitionFile> [--replace] \\| create-process <appType> --formUuid <formUuid> <processDefinitionFile> [--replace]` | Create process form (all-in-one); Supports append/forward via JSON nodes[].actions.normalActions/appendActions |\n| `openyida ai-form-setting <get\\|fields\\|models\\|enable\\|disable\\|save> <appType> ...` | Manage process form AI approval prompts |\n| `openyida process preview <appType> ...` | Preview process instance (visual flowchart) |\n\n### Page Config & Sharing\n\n| Command | Description |\n|---------|-------------|\n| `openyida verify-short-url <appType> ...` | Verify short URL |\n| `openyida save-share-config <appType> ...` | Save public access / share config |\n| `openyida get-page-config <appType> <formUuid>` | Query page public access config |\n| `openyida externalize-form <appType> <formUuid> [--schema-file file]` | Plan external access-safe mirror fields |\n\n### Reports\n\n| Command | Description |\n|---------|-------------|\n| `openyida create-report <appType> \"<name>\" ... [--json] [--open\\|--no-open]` | Create a Yida report |\n| `openyida append-chart <appType> <reportId> ... [--json] [--open\\|--no-open]` | Append chart to existing report |\n| `openyida report inspect <appType> <reportId> --json` | Inspect report runtime bindings (read-only) |\n\n### Connectors\n\n| Command | Description |\n|---------|-------------|\n| `openyida connector list` | List HTTP connectors |\n| `openyida connector create \"name\" \"domain\" ...` | Create a connector |\n| `openyida connector detail <id>` | View connector details |\n| `openyida connector delete <id> [--force]` | Show manual deletion guidance (CLI does not delete) |\n| `openyida connector add-action --operations <file> --connector-id <id>` | Add an action |\n| `openyida connector update-action --connector-id <id> --action <operationId> --query-json JSON --confirm` | Safely update action query defaults |\n| `openyida connector list-actions <id>` | List actions |\n| `openyida connector delete-action <id> <operation-id>` | Delete an action |\n| `openyida connector test --connector-id <id> --action <actionId> [--path-json JSON] [--query-json JSON] [--header-json JSON] [--body-json JSON] [--account-id <id>] [--system-token-app <appType>] [--ignore-defaults]` | Test an action |\n| `openyida connector list-connections <id>` | List auth connections |\n| `openyida connector create-connection <id> <name> [--interactive]` | Create an auth connection |\n| `openyida connector smart-create --curl \"...\"` | Generate a redacted action draft from cURL (no remote create) |\n| `openyida connector parse-api [options]` | Parse API information |\n| `openyida connector gen-template [output]` | Generate API document template |\n\n### Integration & DingTalk\n\n| Command | Description |\n|---------|-------------|\n| `openyida integration create <appType> ... [--spec file.json] [--connector-system-token-app <appType>]` | Create integration automation flow |\n| `openyida integration update <appType> <formUuid> <processCode> --spec <desired-spec.json> [--publish]` | Probe integration update capability (currently blocked without full readback) |\n| `openyida integration list <appType> [--flow-types 1,2,3,5,6] [--form-uuid <uuid>] [--status y\\|n] [--json]` | List integration automation flows |\n| `openyida integration enable <appType> <formUuid> <processCode>` | Enable integration automation flow |\n| `openyida integration disable <appType> <formUuid> <processCode>` | Disable integration automation flow |\n| `openyida integration check <appType...>` | Check abnormal integration automation run logs |\n| `openyida integration diagnose (--text <text>\\|--file <path>\\|--rules) [--json]` | Diagnose integration automation tickets and common pitfalls |\n| `openyida dws <command> [args]` | DingTalk CLI (contacts/calendar/todo/approval etc.) |\n| `openyida dws contact user search --keyword <text>` | DingTalk CLI (contacts/calendar/todo/approval etc.) |\n| `openyida dingtalk-link <url> [--target fullScreen] [--legacy-scheme] [--json]` | Generate DingTalk AppLink / legacy dingtalk:// page links |\n\n### Utility\n\n| Command | Description |\n|---------|-------------|\n| `openyida commands [--json]` | Output machine-readable command manifest |\n| `openyida agent-capabilities [--json] [--summary-json\\|--compact]` | Output one-shot agent capability snapshot |\n| `openyida agent <doctor\\|diagnose\\|status\\|connect\\|run\\|disconnect\\|logout\\|logs> [options]` | Connect a local Agent (Go runtime, development preview) |\n| `openyida a2a <serve\\|agent-card> [options]` | Start local read-only A2A adapter or print Agent Card |\n| `openyida bridge start [--token <pair-token>] [--port 6736] [--origin https://demo.aliwork.com] [--open\\|--no-open]` | Start OpenYida local web bridge service |\n| `openyida copy [--force]` | Copy project working directory |\n| `openyida sample [--list] [<skill> <name>] [--output <file-or-directory>] [--var KEY=VALUE ...] [--design-file <design.md>] [--style-id <themeId\\|free-creative>] [--theme-ids <id,...>] [--pop-art-context <explicit-request\\|showcase>]` | Output code samples/templates |\n| `openyida doctor [--fix]` | Environment diagnostics & auto-fix |\n| `openyida db-seq-fix [--fix]` | Detect and repair PostgreSQL sequence drift |\n| `openyida formula evaluate <formula\\|file> [--schema file]` | Static-check Yida formula syntax and field refs |\n| `openyida update` | Check and update to latest version |\n| `openyida export-conversation [options]` | Export AI conversation records |\n| `openyida feedback <setup\\|url\\|dismiss\\|status> [options]` | Configure experience feedback form and local reminder state |\n| `openyida batch <file>\\|--commands \"cmd1 ; cmd2\" [--stop-on-error] [--json]` | Run OpenYida commands in batch |\n| `openyida flash-to-prd --file <path> --name \"<project>\"` | Convert flash notes or meeting notes to a PRD prompt |\n| `openyida ai <text\\|image> [options]` | Call Yida AI text and image recognition APIs |\n| `openyida asset <status\\|resolve\\|sources> [options]` | Detect asset capability / resolve materials |\n| `openyida cdn-config [options]` | Configure CDN / OSS upload |\n| `openyida cdn-upload <image-path>` | Upload image to CDN |\n| `openyida cdn-refresh [options]` | Refresh CDN cache |\n\n<!-- OPENYIDA_COMMANDS_END -->\n\n### CLI Notes\n\n#### Connector Safety and Real E2E\n\n`connector test` keeps the legacy flat `--params` option, but dispatches each key only to the location proven by the action schema. Unknown or ambiguous keys fail closed. Authenticated connectors require `--account-id`, and that account must belong to the selected connector. The test response follows the frontend canonical contract `{statusLine,responseHeaders,content}`; unknown envelopes and non-2xx status lines are failures. With `--ignore-defaults`, the test starts from empty parameter sets: saved default values from the action definition (including sensitive placeholder values such as documented `***` samples) are ignored for the run, and a warning is printed when a non-empty systemToken default exists. Declared systemToken actions still require `--system-token-app`, target-trust checks still apply, and explicitly provided systemToken values are still rejected.\n\n`connector update-action --connector-id <id> --action <operationId> --query-json '{\"currentPage\":\"1\"}' --confirm` is the narrow safe path for editing existing query defaults. It requires a complete connector/action preflight, changes only declared query defaults mirrored in `inputs` and `parameters`, submits the complete action collection once, and verifies an unchanged connector fingerprint, action count, non-target actions, and stable IDs. Missing/empty/unknown parameters, duplicate IDs, incomplete readback, and unknown write outcomes fail closed without automatic retry. `add-action` no longer overwrites an existing action ID; use `update-action` for query-only edits.\n\nThe opt-in connector E2E is intentionally separate from the shared full runner:\n\n```bash\nOPENYIDA_E2E=1 \\\nOPENYIDA_E2E_CONNECTOR=1 \\\nOPENYIDA_E2E_CORP_ID='<target-corp-id>' \\\nOPENYIDA_E2E_CONNECTOR_ECHO_URL='https://<team-controlled-host>/<stable-echo-path>' \\\nOPENYIDA_E2E_CONNECTOR_FIXTURE_MARKER='<expected-response-marker>' \\\nOPENYIDA_E2E_CONNECTOR_FIXTURE_OWNER='<expected-owner-header-value>' \\\nnode scripts/e2e-real/connector/runner.js\n```\n\nThe runner rejects public generic echo services such as httpbin and example.com. Before its first remote write it selects and verifies the explicit organization profile, prints a redacted resource plan, and persists synchronized registry/manifest evidence plus the SHA-256 of the preserved operations fixture. The controlled fixture must return exact JSON fields `content.runId`, `content.fixtureMarker`, and `content.authorization === \"Basic ***\"`, plus the exact `x-openyida-fixture-owner` response header. Substring matches, malformed JSON, and wrong fields fail closed. Each remote create is persisted as `attempted` before execution and becomes `completed` only after exact readback; an exception is recorded as `outcome_unknown` with a non-owned residual candidate and is never retried. The runner deletes only its temporary local copy and reports remote connector/account cleanup as blocked because the CLI has no proven delete API. If organization or fixture ownership cannot be proven, it returns `PLATFORM_PROBE_REQUIRED` with zero remote writes.\n\nThe opt-in `node scripts/e2e-real/connector/action-update-runner.js` regression uses the owner-confirmed login-free `www.aliwork.com` fixture and a single owned NONE-auth connector containing a target action plus one preservation sentinel. Enable it with `OPENYIDA_E2E=1 OPENYIDA_E2E_CONNECTOR_ACTION_UPDATE=1`. It verifies isolated `currentPage`, `pageSize`, `userLanguage`, `searchFieldJson`, and dynamic `_stamp` edits, restores each field and the final baseline, and persists only response structure, data count, and SHA-256. It never stores response row values or auth/profile/corp identifiers, never retries unknown writes, and intentionally leaves the owned connector as a `cleanup_blocked` residual because no proven delete API exists.\n\n`openyida asset resolve --input manifest-draft.json --manifest asset-manifest.json --json` validates every image slot and writes a traceable manifest. Search assets only accept Unsplash/Pexels; draft results exit with code 2. Use `--offline` to block URL checks and uploads.\n\n#### Environment and Localization\n\nEnvironment selectors such as `--env intl`, `--intl`, `--overseas`, `--global`, and `--yidaapps` can be used on login-required commands to choose the target Yida environment for that run. The `intl` preset uses `https://www.yidaapps.com` as the built-in Global YiDA entrypoint (not the bare `https://yidaapps.com` domain) and DingTalk International OAuth at `https://login.dingtalk.io`; business API requests still use the authenticated environment `baseUrl`, so customer custom subdomains are supported.\n\nFor overseas apps, pass `--locale en_US` or `--locale ja_JP` on creation commands, or set `OPENYIDA_CONTENT_LOCALE`. OpenYida writes YiDA resource names with `zh_CN`, `en_US`, and `ja_JP` values so Global YiDA does not fall back to Chinese-only metadata.\n\nThe CLI package ships the core UI languages `zh` and `en` by default. Other CLI UI language packs are optional: keep or install files such as `ja.js` / `fr.js` in an external directory and point `OPENYIDA_LOCALE_DIR` to that directory, then set `OPENYIDA_LANG=ja`. If an optional language pack is unavailable, OpenYida falls back through `en -> zh`.\n\n#### Forms and Pages\n\nForm field definitions can include `alias` or `componentAlias` to populate Yida designer component aliases, stored as `pages[0].componentAlias.items`. Yida runtime resolves these aliases in page JS, so `this.$('phone')` can be used instead of `this.$('textField_xxx')`; OpenYida form rules, validations, and `openyida data ... --resolve-aliases` JSON inputs also accept aliases as field references. For server-side DingTalk OpenAPI calls, use `GET /v2.0/yida/forms/component/alias/{appType}/{formUuid}` to read the `{ fieldId, alias }` mapping, then translate aliases before sending form data/search JSON. That endpoint requires `systemToken`, `userId`, an access token, and the Yida form data read permission. Use `connector test --system-token-app <appType>` for a transient test or `integration create --connector-system-token-app <appType>` for a server-side automation; OpenYida resolves `systemToken` internally and never prints it or stores it in page source and Action defaults.\n\n`openyida publish` preserves existing custom page data sources by default. Before saving the new compiled JSX Schema, it reads the current page Schema and merges the Page-level `dataSource` with the built-in `urlParams` and `timestamp` sources, so manually configured data sources are not deleted during republish.\n\n#### Data, Permissions, and Sharing\n\n`openyida externalize-form` is useful when a form contains fields such as `AssociationFormField`, `EmployeeField`, or `DepartmentSelectField` that depend on internal organization permissions. It produces a report plus optional `--mirror-fields-output` JSON that can be used with `openyida create-form create` to build a separate public intake form while keeping the internal form and its association fields private.\n\n#### Workflow, Reports, and Integrations\n\n`openyida integration create` supports form events (`insert`, `update`, `delete`, `comment`) and approval events (`processFinish`, `activityTask`; aliases: `approval`, `approvalNode`). Approval events require `--approval-actions agree,disagree,terminated`; `activityTask` also requires `--approval-node-ids <nodeId,...>`. Passing `--process-code` selects a full graph replacement and now requires explicit `--replace`; it is not a safe update. `integration update` currently performs capability detection only: because full platform `processJson` + `viewJson` readback is unproven, it writes a redacted local probe artifact and returns `PLATFORM_PROBE_REQUIRED` before authentication, spec reading, or remote writes. It does not edit a flow.\n\n### Connect a Local Agent\n\nUse an installed Qoder or Codex CLI on your computer to run tasks from the Yida web app. Local Agent supports macOS and Windows; the ordinary OpenYida CLI also supports Linux.\n\nCheck your local environment, then follow the connection instructions in the Yida web app:\n\n```bash\nopenyida agent doctor --json\n```\n\nAfter connecting, the service runs in the background. Use `openyida agent status` to check its status, `openyida agent logs` to view logs, and `openyida agent disconnect` to disconnect. After restarting your computer, run `openyida agent run` to reconnect.\n\n## Agent Skills\n\nThe `yida-skills/` directory is the source skill library used by OpenYida during development and distributed with the npm package.\n\n| Path | Purpose |\n|------|---------|\n| `yida-skills/SKILL.md` | Entry point and skill index |\n| `yida-skills/skills/` | Self-contained sub-skills for app, form, process, page, data, and integration work |\n| `yida-skills/references/` | Shared Yida API, model API, and query-condition references |\n\nWhen OpenYida is used inside a supported AI coding environment, these skills help the agent choose the right command sequence and file conventions.\n\nFor QwenWork, use the same user-level global skills layout as QoderWork: `~/.qwenworkcn/skills/yida-skills/`. Skip QwenWork setup when `~/.qwenworkcn` is not present.\n\nQoder and Qoder IDE share the user-level `~/.qoder/skills/yida-skills/` directory. QoderWork remains a separate product and uses `~/.qoderwork/skills/yida-skills/`.\n\nFor Codex, `npm install -g openyida` additionally creates a local plugin marketplace under `~/.openyida/codex-plugin` and enables `openyida@openyida` in `~/.codex/config.toml` when Codex is detected. This makes OpenYida show up in Codex's `@` plugin menu as **宜搭** after Codex reloads.\n\n## Examples\n\n### Business Systems: IPD and CRM\n\nDescribe your requirements in one sentence; the agent can create a complete multi-form Yida application.\n\n![IPD](https://img.alicdn.com/imgextra/i2/O1CN01YBEMa929J7sD9v8U1_!!6000000008046-2-tps-3840-3366.png)\n\n![CRM](https://img.alicdn.com/imgextra/i3/O1CN01kn0Vcn1H5OkbQaizA_!!6000000000706-2-tps-3840-2168.png)\n\n### Custom Pages and Utilities\n\n![Salary Calculator](https://gw.alicdn.com/imgextra/i2/O1CN017TeJuE1reVH2Dj7b7_!!6000000005656-2-tps-5114-2468.png)\n\n![Enterprise Collaboration](https://gw.alicdn.com/imgextra/i1/O1CN01EZtvfs1cxXV00UaXi_!!6000000003667-2-tps-5118-2470.png)\n\n### Interactive Campaigns\n\n![Lantern Riddle Game](https://img.alicdn.com/imgextra/i3/O1CN01dCoscP25jSAtAB9o3_!!6000000007562-2-tps-2144-1156.png)\n\n## Common Prompts\n\n```text\nBuild a Yida application for [business scenario].\nGenerate an app from this requirements document.\nCreate a [name] form page with these fields.\nAdd a required [field type] field named [field name] to [form name].\nPublish this custom page to the Yida app.\nMake this page publicly accessible.\nExport the application as a migration package.\n```\n\n## OpenClaw Integration\n\nUse OpenYida through [yida-app](https://clawhub.ai/nicky1108/yida-app) in OpenClaw:\n\n```bash\nnpx clawhub@latest install nicky1108/yida-app\n```\n\n## Development\n\n```bash\ngit clone https://github.com/openyida/openyida.git\ncd openyida\nnvm install\nnvm use\nnpm ci --ignore-scripts\nnpm run check:ci\n```\n\nUse the Node.js version in `.nvmrc` to match CI validation. If you do not use nvm, install that version directly.\n\nUseful checks:\n\n| Command | Purpose |\n|---------|---------|\n| `npm test` | Run Jest tests |\n| `npm run lint` | Run ESLint |\n| `npm run check:quick` | Run structure, manifest, syntax, and lint checks |\n| `npm run check:commands` | Validate router, command manifest, and README alignment |\n| `npm run docs:commands` | Regenerate the README command index from the manifest |\n| `npm run check:docs` | Verify generated README command docs are current |\n| `npm run check:syntax` | Validate JavaScript syntax |\n| `npm run check:structure` | Validate project structure |\n| `npm run check:package-size` | Validate npm package size and file-count budget |\n| `npm run check:package` | Validate npm package contents |\n\nWhen adding new CLI commands, register the route in `bin/yida.js`, add it to `lib/core/command-manifest.js`, regenerate the README command index with `npm run docs:commands`, and keep agent skills in `yida-skills/` aligned when the workflow changes. `npm run check:commands` fails if the router, manifest, or README drift apart.\n\n## Security and Configuration\n\n- OAuth token sessions are cached locally and should never be hard-coded into source files.\n- Private deployment environments are managed through `lib/core/env-manager.js`.\n- Yida API requests should use the active environment base URL and Bearer token auth.\n- For multi-organization accounts, prefer explicit `--corp-id` values in non-interactive automation.\n\n## Community\n\nScan the QR code to join the OpenYida DingTalk user group for updates and support.\n\n![Join OpenYida Community](https://img.alicdn.com/imgextra/i4/O1CN01RAlxmO1qF1cxRguyj_!!6000000005465-2-tps-350-356.png)\n\n## Contributors\n\nThanks to everyone who has contributed to OpenYida. Read the [Contributing Guide](./CONTRIBUTING.md) to get involved.\n\nLatest contributors: [DDlixin1](https://github.com/DDlixin1), [fcloud](https://github.com/fcloud).\n\n<!-- openyida-contributors:start -->\n\n<p>\n  <a href=\"https://github.com/yize\"><img src=\"https://github.com/yize.png?size=48\" width=\"48\" height=\"48\" alt=\"九神\" title=\"九神\" /></a>\n  <a href=\"https://github.com/alex-mm\"><img src=\"https://github.com/alex-mm.png?size=48\" width=\"48\" height=\"48\" alt=\"天晟\" title=\"天晟\" /></a>\n  <a href=\"https://github.com/fryaninc\"><img src=\"https://github.com/fryaninc.png?size=48\" width=\"48\" height=\"48\" alt=\"New Core architecture, Core development, user issue support, skill maintenance and Help & Show Case Center 构建者\" title=\"New Core architecture, Core development, user issue support, skill maintenance and Help & Show Case Center 构建者\" /></a>\n  <a href=\"https://github.com/DDlixin1\"><img src=\"https://github.com/DDlixin1.png?size=48\" width=\"48\" height=\"48\" alt=\"DDlixin1\" title=\"DDlixin1\" /></a>\n  <a href=\"https://github.com/xhy-ali\"><img src=\"https://github.com/xhy-ali.png?size=48\" width=\"48\" height=\"48\" alt=\"登录态开发者\" title=\"登录态开发者\" /></a>\n  <a href=\"https://github.com/fcloud\"><img src=\"https://github.com/fcloud.png?size=48\" width=\"48\" height=\"48\" alt=\"Aiden Wu (fcloud)\" title=\"Aiden Wu (fcloud)\" /></a>\n  <a href=\"https://github.com/nicky1108\"><img src=\"https://github.com/nicky1108.png?size=48\" width=\"48\" height=\"48\" alt=\"nicky1108\" title=\"nicky1108\" /></a>\n  <a href=\"https://github.com/angelinheys\"><img src=\"https://github.com/angelinheys.png?size=48\" width=\"48\" height=\"48\" alt=\"angelinheys\" title=\"angelinheys\" /></a>\n  <a href=\"https://github.com/yipengmu\"><img src=\"https://github.com/yipengmu.png?size=48\" width=\"48\" height=\"48\" alt=\"yipengmu\" title=\"yipengmu\" /></a>\n  <a href=\"https://github.com/Waawww\"><img src=\"https://github.com/Waawww.png?size=48\" width=\"48\" height=\"48\" alt=\"Waawww\" title=\"Waawww\" /></a>\n  <a href=\"https://github.com/kangjiano\"><img src=\"https://github.com/kangjiano.png?size=48\" width=\"48\" height=\"48\" alt=\"kangjiano\" title=\"kangjiano\" /></a>\n  <a href=\"https://github.com/ElZe98\"><img src=\"https://github.com/ElZe98.png?size=48\" width=\"48\" height=\"48\" alt=\"ElZe98\" title=\"ElZe98\" /></a>\n  <a href=\"https://github.com/OAHyuhao\"><img src=\"https://github.com/OAHyuhao.png?size=48\" width=\"48\" height=\"48\" alt=\"OAHyuhao\" title=\"OAHyuhao\" /></a>\n  <a href=\"https://github.com/xiaofu704\"><img src=\"https://github.com/xiaofu704.png?size=48\" width=\"48\" height=\"48\" alt=\"xiaofu704\" title=\"xiaofu704\" /></a>\n  <a href=\"https://github.com/guchenglin111\"><img src=\"https://github.com/guchenglin111.png?size=48\" width=\"48\" height=\"48\" alt=\"guchenglin111\" title=\"guchenglin111\" /></a>\n  <a href=\"https://github.com/liug0911\"><img src=\"https://github.com/liug0911.png?size=48\" width=\"48\" height=\"48\" alt=\"LIUG\" title=\"LIUG\" /></a>\n  <a href=\"https://github.com/sunliz-xiuli\"><img src=\"https://github.com/sunliz-xiuli.png?size=48\" width=\"48\" height=\"48\" alt=\"sunliz-xiuli\" title=\"sunliz-xiuli\" /></a>\n  <a href=\"https://github.com/M12REDX\"><img src=\"https://github.com/M12REDX.png?size=48\" width=\"48\" height=\"48\" alt=\"M12REDX\" title=\"M12REDX\" /></a>\n  <a href=\"https://github.com/key-668\"><img src=\"https://github.com/key-668.png?size=48\" width=\"48\" height=\"48\" alt=\"再不喝汽水\" title=\"再不喝汽水\" /></a>\n  <a href=\"https://github.com/dongbeixiaohuo\"><img src=\"https://github.com/dongbeixiaohuo.png?size=48\" width=\"48\" height=\"48\" alt=\"dongbeixiaohuo\" title=\"dongbeixiaohuo\" /></a>\n  <a href=\"https://github.com/nandanadileep\"><img src=\"https://github.com/nandanadileep.png?size=48\" width=\"48\" height=\"48\" alt=\"nandanadileep\" title=\"nandanadileep\" /></a>\n  <a href=\"https://github.com/hj837990198\"><img src=\"https://github.com/hj837990198.png?size=48\" width=\"48\" height=\"48\" alt=\"skill 测试\" title=\"skill 测试\" /></a>\n  <a href=\"https://github.com/chengminchao-create\"><img src=\"https://github.com/chengminchao-create.png?size=48\" width=\"48\" height=\"48\" alt=\"skill共建\" title=\"skill共建\" /></a>\n</p>\n\n<!-- openyida-contributors:end -->\n\n## License\n\n[MIT](./LICENSE) © 2026 Alibaba Group Holding Limited\n"}