openyida 2026.7.19 → 2026.7.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +14 -0
  2. package/bin/yida.js +107 -18
  3. package/lib/app/create-app.js +12 -1
  4. package/lib/app/create-form/args.js +13 -0
  5. package/lib/app/create-form.js +154 -67
  6. package/lib/app/create-page.js +45 -9
  7. package/lib/app/get-schema.js +65 -14
  8. package/lib/app/import-app.js +92 -41
  9. package/lib/app/publish.js +289 -556
  10. package/lib/app/schema-field-resolution.js +370 -0
  11. package/lib/app/services/app-reader.js +85 -0
  12. package/lib/app/services/app-service.js +235 -0
  13. package/lib/app/services/canvas-page-compiler.js +91 -0
  14. package/lib/app/services/canvas-page-schema-builder.js +149 -0
  15. package/lib/app/services/field-bindings.js +68 -0
  16. package/lib/app/services/form-compiler.js +1922 -0
  17. package/lib/app/services/form-mode-service.js +182 -0
  18. package/lib/app/services/form-schema-patcher.js +333 -0
  19. package/lib/app/services/form-schema-reader.js +59 -0
  20. package/lib/app/services/form-service.js +379 -0
  21. package/lib/app/services/form-validation.js +562 -0
  22. package/lib/app/services/native-page-compiler.js +92 -0
  23. package/lib/app/services/native-page-schema-builder.js +428 -0
  24. package/lib/app/services/page-resource-service.js +185 -0
  25. package/lib/app/update-app.js +18 -6
  26. package/lib/auth/token-auth.js +34 -3
  27. package/lib/auth/token-store.js +22 -4
  28. package/lib/bridge/bridge.js +37 -5
  29. package/lib/core/agent-capabilities.js +5 -3
  30. package/lib/core/command-manifest.js +40 -0
  31. package/lib/core/doctor.js +15 -4
  32. package/lib/core/env-cmd.js +1 -1
  33. package/lib/core/env.js +7 -6
  34. package/lib/core/legacy-schema-guard.js +408 -0
  35. package/lib/core/locales/en.js +8 -46
  36. package/lib/core/locales/zh.js +8 -46
  37. package/lib/core/sample.js +1 -1
  38. package/lib/core/utils.js +334 -66
  39. package/lib/core/yida-client.js +104 -3
  40. package/lib/formula/evaluate.js +8 -66
  41. package/lib/formula/field-refs.js +83 -0
  42. package/lib/process/configure-process.js +44 -1992
  43. package/lib/process/create-process.js +54 -87
  44. package/lib/process/services/process-compiler.js +2056 -0
  45. package/lib/process/services/process-reader.js +232 -0
  46. package/lib/process/services/process-resource-service.js +571 -0
  47. package/lib/process/services/process-service.js +122 -0
  48. package/lib/process/services/process-stage-checkpoint.js +246 -0
  49. package/lib/report/append.js +7 -26
  50. package/lib/report/http.js +31 -5
  51. package/lib/report/index.js +10 -2
  52. package/lib/samples/yida-canvas-custom-page/business-list.canvas.jsx +63 -14
  53. package/lib/samples/yida-canvas-custom-page/dashboard-overview.canvas.jsx +176 -32
  54. package/lib/samples/yida-canvas-custom-page/data-management.canvas.jsx +228 -14
  55. package/lib/samples/yida-canvas-custom-page/split-pane-detail.canvas.jsx +204 -8
  56. package/lib/schema/adapters/app-adapter.js +210 -0
  57. package/lib/schema/adapters/form-adapter.js +1362 -0
  58. package/lib/schema/adapters/keys.js +19 -0
  59. package/lib/schema/adapters/page-adapter.js +566 -0
  60. package/lib/schema/adapters/process-adapter.js +519 -0
  61. package/lib/schema/applier.js +1878 -0
  62. package/lib/schema/apply-store.js +1083 -0
  63. package/lib/schema/command.js +645 -0
  64. package/lib/schema/dependency-graph.js +83 -0
  65. package/lib/schema/errors.js +481 -0
  66. package/lib/schema/hash.js +9 -0
  67. package/lib/schema/manifest-limits.js +177 -0
  68. package/lib/schema/manifest-loader.js +309 -0
  69. package/lib/schema/manifest-schema-v1.json +193 -0
  70. package/lib/schema/normalize-manifest.js +281 -0
  71. package/lib/schema/page-canvas-foundation.js +447 -0
  72. package/lib/schema/page-data-source-builder.js +561 -0
  73. package/lib/schema/page-foundation.js +556 -0
  74. package/lib/schema/page-source-loader.js +314 -0
  75. package/lib/schema/planner.js +691 -0
  76. package/lib/schema/remote-dispatch-boundary.js +39 -0
  77. package/lib/schema/remote-missing.js +21 -0
  78. package/lib/schema/remote-reader.js +189 -0
  79. package/lib/schema/resource-registry.js +157 -0
  80. package/lib/schema/server-revision.js +71 -0
  81. package/lib/schema/sort.js +28 -0
  82. package/lib/schema/state-store.js +589 -0
  83. package/package.json +2 -2
  84. package/scripts/postinstall.js +8 -12
  85. package/scripts/validate-package-size.js +1 -1
  86. package/yida-skills/SKILL.md +114 -29
  87. package/yida-skills/references/schema-as-code-phase1.md +99 -0
  88. package/yida-skills/references/setup-and-env.md +59 -59
  89. package/yida-skills/references/task-retrospective.md +6 -6
  90. package/yida-skills/skills/yida-app/SKILL.md +60 -14
  91. package/yida-skills/skills/yida-canvas-custom-page/SKILL.md +18 -7
  92. package/yida-skills/skills/yida-canvas-custom-page/references/data-bridge-guide.md +3 -3
  93. package/yida-skills/skills/yida-canvas-custom-page/references/page-generation-guide.md +7 -1
  94. package/yida-skills/skills/yida-create-app/SKILL.md +21 -3
  95. package/yida-skills/skills/yida-create-form-page/SKILL.md +19 -1
  96. package/yida-skills/skills/yida-create-page/SKILL.md +16 -3
  97. package/yida-skills/skills/yida-create-process/SKILL.md +100 -4
  98. package/yida-skills/skills/yida-custom-page/SKILL.md +19 -4
  99. package/yida-skills/skills/yida-dashboard/SKILL.md +1 -1
  100. package/yida-skills/skills/yida-dashboard/references/pitfalls.md +1 -1
  101. package/yida-skills/skills/yida-get-schema/SKILL.md +49 -5
  102. package/yida-skills/skills/yida-i18n/SKILL.md +1 -1
  103. package/yida-skills/skills/yida-integration/SKILL.md +7 -1
  104. package/yida-skills/skills/yida-login/SKILL.md +50 -99
  105. package/yida-skills/skills/yida-page-config/SKILL.md +7 -1
  106. package/yida-skills/skills/yida-page-uiux/references/app/blueprint.md +0 -1
  107. package/yida-skills/skills/yida-page-uiux/references/app/navigation-patterns.md +0 -1
  108. package/yida-skills/skills/yida-page-uiux/references/app/role-journey.md +0 -1
  109. package/yida-skills/skills/yida-page-uiux/references/dashboard/app-blueprint.md +0 -1
  110. package/yida-skills/skills/yida-page-uiux/references/dashboard/chart-contracts.md +0 -1
  111. package/yida-skills/skills/yida-page-uiux/references/dashboard/component-contracts.md +0 -1
  112. package/yida-skills/skills/yida-page-uiux/references/dashboard/layout-patterns.md +0 -1
  113. package/yida-skills/skills/yida-page-uiux/references/dashboard/theme-recipes.md +0 -1
  114. package/yida-skills/skills/yida-page-uiux/references/detail/object-narrative.md +0 -1
  115. package/yida-skills/skills/yida-page-uiux/references/detail/section-patterns.md +0 -1
  116. package/yida-skills/skills/yida-page-uiux/references/detail/timeline-and-related.md +0 -1
  117. package/yida-skills/skills/yida-page-uiux/references/landing/assets-workflow.md +0 -1
  118. package/yida-skills/skills/yida-page-uiux/references/landing/industry-playbooks.md +0 -1
  119. package/yida-skills/skills/yida-page-uiux/references/landing/research-levels.md +0 -1
  120. package/yida-skills/skills/yida-page-uiux/references/landing/section-patterns.md +0 -1
  121. package/yida-skills/skills/yida-page-uiux/references/list/drawer-detail.md +0 -1
  122. package/yida-skills/skills/yida-page-uiux/references/list/empty-loading-error.md +0 -1
  123. package/yida-skills/skills/yida-page-uiux/references/list/filter-patterns.md +0 -1
  124. package/yida-skills/skills/yida-page-uiux/references/list/table-patterns.md +0 -1
  125. package/yida-skills/skills/yida-page-uiux/references/scenes/screen.md +0 -1
  126. package/yida-skills/skills/yida-page-uiux/references/workbench/entry-patterns.md +0 -1
  127. package/yida-skills/skills/yida-page-uiux/references/workbench/portal-layouts.md +0 -1
  128. package/yida-skills/skills/yida-page-uiux/references/workbench/task-feed.md +0 -1
  129. package/yida-skills/skills/yida-page-uiux/workflow/output-decision-block.md +1 -1
  130. package/yida-skills/skills/yida-process-rule/SKILL.md +35 -1
  131. package/yida-skills/skills/yida-publish-page/SKILL.md +46 -4
  132. package/yida-skills/skills/yida-report/SKILL.md +7 -1
  133. package/yida-skills/skills-index.json +14 -46
  134. package/yida-skills/skills/large-file-write/SKILL.md +0 -93
  135. package/yida-skills/skills/large-file-write/references/write-patterns.md +0 -147
  136. package/yida-skills/skills/large-file-write/scripts/write.js +0 -157
  137. package/yida-skills/skills/sls-log-workbench/SKILL.md +0 -134
  138. package/yida-skills/skills/sls-log-workbench/references/workbench-reference.md +0 -130
  139. package/yida-skills/skills/sls-log-workbench/sls-query.js +0 -295
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  name: openyida
3
3
  description: >
4
- 宜搭 AI 应用开发总入口技能。通过有 AI Coding 能力的智能体(悟空/Claude/Open Code 等)+ 宜搭低代码平台,实现一句话生成完整应用。
5
- 包含应用创建、表单设计、自定义页面开发、页面发布、登录态管理等完整开发流程。
4
+ 宜搭 AI 应用开发总入口技能。通过有 AI Coding 能力的智能体(悟空/Claude/Open Code 等)+ 宜搭低代码平台,实现一句话搭建或修改完整应用。
5
+ 包含资源上下文解析、应用创建/复用、表单设计/更新、自定义页面开发、页面发布、登录态管理等完整开发流程。
6
6
  当用户提到"宜搭"、"yida"、"低代码"、"创建应用"、"创建表单"、"发布页面"、"搭建"、"系统"等关键词时,使用此技能;以下情况不要触发:只是讨论通用前端/后端代码、非宜搭平台产品、或只需要解释概念而不操作宜搭资源。
7
7
  ---
8
8
 
9
9
  # 宜搭 AI 应用开发指南
10
10
 
11
- 通过有 AI Coding 能力的智能体(悟空/Claude/Open Code 等)+ 宜搭低代码平台,实现一句话生成完整应用。所有操作通过 **`openyida`** CLI 统一执行,命令自动读取 `.cache/auth-token-<env>.json`,并在业务请求中携带 `Authorization: Bearer <access_token>`;token 不可用时执行 `openyida login` 重新登录。
11
+ 通过有 AI Coding 能力的智能体(悟空/Claude/Open Code 等)+ 宜搭低代码平台,实现一句话搭建或修改完整应用。所有操作通过 **`openyida`** CLI 统一执行。IF 未设置 `YIDA_AUTH_ENABLED=true`:默认 OAuth token,token 不可用才执行 `openyida login`。IF `YIDA_AUTH_ENABLED=true`:进入宿主注入 token 模式,仅使用 `OPENYIDA_ACCESS_TOKEN` / `OPENYIDA_REFRESH_TOKEN` 等 token env;缺 token 必须 STOP 回宿主,禁止触发 OAuth,禁止读 `.cache/cookies*.json`。
12
12
 
13
13
  ---
14
14
 
@@ -38,33 +38,115 @@ description: >
38
38
  |---------|------|
39
39
  | 命令跑不了(`command not found`) | openyida 未安装 → `npm install -g openyida` |
40
40
  | Node/npm 版本不达标 | 先升级 Node(≥16)再装/升级 openyida |
41
- | `login.status` 不是 `ok` 且 `login.can_auto_use` 不是 true | 未登录 → `openyida login`(指定入口带 URL 或 flag) |
41
+ | `login.auth_mode=token` 且未登录,且未开启 `YIDA_AUTH_ENABLED` | `openyida login`(指定入口带 URL 或 flag) |
42
+ | `login.auth_mode=token` 且 `auth_source=env` / `failure_reason=env_token_missing` | STOP;宿主必须注入 `OPENYIDA_ACCESS_TOKEN` 或 `OPENYIDA_REFRESH_TOKEN`;禁止触发 OAuth;禁止读 `.cache/cookies*.json` |
42
43
  | `workdir_exists` / `active.projectRootExists` 为 false | 无工作目录 → `openyida copy` 初始化 |
43
44
 
44
45
  **👉 环境异常、登录失败、悟空降级、OAuth token 登录异常等特殊分支 → [references/setup-and-env.md](references/setup-and-env.md)。正常 `agent-capabilities` 通过时不要默认读取该 reference。**
45
46
 
46
47
  ---
47
48
 
48
- ## 第二步:意图路由(先判断「全量搭建」还是「单一任务」)
49
+ ## 执行路径:schema-managed 与 direct/standalone
49
50
 
50
- > **环境就绪后,先判断用户诉求属于哪一类,再走对应路线**:从零搭一个完整应用,还是对已有资源做单点改动。选错会导致多余步骤或回退;歧义时简短确认一次即可。
51
+ 在选择完整应用或单一任务技能前,先判断本次写操作属于哪条执行合同。Agent 只做轻量路由;`schema` 子命令自身强制 validate/plan/apply 与 `planId`,legacy 写命令仅对明确传入的 schema-managed context/state 做最小 fail-closed guard。上下文不足以判断时,先只读确认或询问用户,不由 Agent 猜测 ownership。
52
+
53
+ | 路径 | 何时选择 | 执行方式 |
54
+ |------|----------|----------|
55
+ | `schema-managed` | 用户提供 Schema-as-Code manifest、要求 `schema validate/plan/apply`,或 CLI/context 明确目标身份来自 Schema-as-Code state | 走 `openyida schema validate <manifest> --json --quiet` → `openyida schema plan <manifest> --state <path> --json --quiet` → 用户审阅本次 `planId` → `openyida schema apply <manifest> --state <path> --plan-id <reviewed-planId> --json --quiet` |
56
+ | `direct/standalone` | 没有 manifest/state 管理关系,或用户明确要求 standalone legacy 命令 | 走下方 Resource-First direct workflow:先解析已有资源,再 create missing only / update / publish |
57
+
58
+ schema-managed create/update 必须等待用户对当前 `planId` 显式批准;`nextAction`、错误恢复或路由判断都不能授予 `mixed/write`。Phase 1 中 report、automation、page config、delete、pull 不从 Manifest fallback 到 legacy。
59
+
60
+ `.cache/<项目名>-schema.json` 只是 direct/standalone 的 ID 映射,不等于 Schema-as-Code state。路径不明确时先只读确认或询问用户;不要通过新建同类资源规避不确定性。
61
+
62
+ ---
63
+
64
+ ## 路由前置:resolve_resource_context
65
+
66
+ > Resource-First Workflow:进入 direct/standalone 路径后,任何完整搭建或单点任务都先解析目标资源上下文,再判断是新建、补齐、修改还是发布。不要把 `create-app` / `create-page` / `create-form` 当作默认动作。
67
+
68
+ ### 资源解析顺序
69
+
70
+ 按以下优先级选择 app/page/form/process,上游来源更明确时覆盖下游来源:
71
+
72
+ 1. 本轮用户明确给出的 `appType`、`formUuid`、应用 URL、页面 URL、流程标识或页面/表单上下文;
73
+ 2. agent 或宿主注入的当前任务 resource context;
74
+ 3. workspace 中的 `project/config.json`、`.cache/<项目名>-schema.json`、`.cache/openyida/**` 等 standalone cache/config;
75
+ 4. 当前会话历史中已创建或已确认的资源;
76
+ 5. 无资源且用户明确说“从零创建 / 新建另一个 / 创建新应用或新页面”时,允许创建缺失资源;
77
+ 6. 仍有多个同优先级候选、当前轮显式资源互相冲突,或无法判断目标时,才 `ask_human`。
78
+
79
+ **本轮显式目标覆盖注入上下文**:agent / 宿主注入的 bound app/page/form 只是默认候选,不是锁定目标。若当前会话绑定页面 A,但用户本轮明确给出页面 B 的 URL、`formUuid`、页面名称或其他可识别线索,必须重新解析 B;B 能唯一解析时切换到 B,B 不能唯一解析时 `ask_human`,禁止静默回落到 A。
80
+
81
+ 可选的 agent 注入协议如下;本地 agent 不支持时忽略,不作为运行前置:
82
+
83
+ ```json
84
+ {
85
+ "kind": "openyida_resource_context",
86
+ "version": 1,
87
+ "app": {
88
+ "appType": "APP_xxx",
89
+ "source": "explicit_prompt|url|agent_bound|workspace_cache",
90
+ "precreated": true,
91
+ "placeholderName": "新应用",
92
+ "allowCreate": false,
93
+ "allowRename": true
94
+ },
95
+ "page": { "formUuid": "FORM_xxx", "source": "explicit_prompt|url|agent_bound|workspace_cache", "allowCreate": false },
96
+ "form": { "formUuid": "FORM_xxx", "source": "explicit_prompt|url|workspace_cache", "allowCreate": false }
97
+ }
98
+ ```
99
+
100
+ `precreated` 表示该 app 由 agent / 宿主提前创建并绑定到本轮任务;`placeholderName` 是宿主创建时的占位名;`allowRename` 控制 OpenYida 是否可在语义名稳定后修正应用名称。这些字段都是 direct/standalone 的可选提示:缺失时按普通已有资源处理,不作为运行前置。
101
+
102
+ **预创建占位 app 改名**:当 `app.source === "agent_bound"`,且满足 `precreated === true` 或当前名称 / `placeholderName` 命中“新应用 / 未命名 / 占位 / APP_xxx”等占位样式,并且 `allowRename !== false`、用户没有明确要求保留原应用名称、目标不是 schema-managed、已从本轮需求确定稳定语义应用名时,`yida-app` 应复用该 `appType` 并调用 `openyida update-app APP_xxx --name "语义应用名"`。该动作只修正 agent 预创建占位应用名称;不要按标题发现/adopt 其他应用,不要 cleanup orphan,不要对非占位已有业务应用自动改名,不要让 `yida-create-app` 参与改名,也不要把 schema-managed 资源交给 legacy `update-app`。
103
+
104
+ ### create-or-update 判定
105
+
106
+ - 已解析到目标 app 时,默认在该 app 内修改、补齐或发布,不执行 `yida-create-app`;只有用户明确要求“新建另一个应用”并确认目标组织后才创建新 app。
107
+ - 已解析到目标自定义页面 URL / `formUuid` / bound page 时,默认写源码并发布到该页面,不执行 `yida-create-page`;只有缺少目标 display page 且本次意图允许新增页面时才创建。
108
+ - 已解析到目标表单 `formUuid` 时,字段结构诉求默认走 `yida-create-form-page` 的 update/patch/rule/bind-datasource 模式,不创建同名或同类表单。
109
+ - 已解析到目标流程表单 / `processCode` 时,默认走 `yida-process-rule` 配置/更新流程,不从零执行 `yida-create-process`。
110
+ - 完整应用 `fast_build` 也遵守本规则:`resolve app → resolve forms → resolve main page → create missing resources only → update/publish`。
111
+
112
+ 验收心智模型:
113
+
114
+ | 场景 | 正确动作 |
115
+ |------|----------|
116
+ | `帮我搭建访客系统` + bound app/page | 不 create app/page;直接在已有 app/page 内补表单、写页面并发布 |
117
+ | `在 APP_xxx 里增加客户表和回访页面` | 不 create app;允许按缺口 create form/page |
118
+ | `优化这个页面 URL` | 不 create app/page;直接进入 custom-page + publish existing page |
119
+ | bound 页面 A,但用户说“修复页面 B 的 xx 字段” | 先解析页面/表单 B;B 有 URL/formUuid 时改 B,只有 B 无法唯一识别时询问用户,不能默认改 A |
120
+ | `从零创建一个 CRM 应用` 且无 context | 允许 create app/form/page 并发布 |
121
+ | 多个 app/page 候选 | 按来源优先级选;同级冲突或目标不明才问人 |
122
+
123
+ > 该 resource context 是 direct/standalone 路径的前置解析;schema-managed 路径仍以 schema CLI 的 validate/plan/apply 结果为准。legacy direct 命令的 guard 只覆盖明确 schema-managed context/state,不替代这里的资源前置解析。
124
+
125
+ ---
126
+
127
+ ## 第二步:意图路由(先判断「完整搭建」还是「单一任务」)
128
+
129
+ > 环境和 resource context 就绪后,先判断用户诉求属于哪一类,再走对应路线:完整搭建/补齐一个应用,还是对已有资源做单点改动。选错会导致多余步骤或回退;歧义时简短确认一次即可。
51
130
 
52
131
  | 用户诉求信号 | 判定 | 走哪条路线 |
53
132
  |------------|------|-----------|
54
- | 创建/搭建/做一个 + 应用/系统/管理系统;或明确表达从零开始 | **全量搭建** | 加载子技能 `yida-app`,由它执行完整应用 workflow |
133
+ | 创建/搭建/做一个 + 应用/系统/管理系统;或已有 app/page 需要补成完整系统 | **完整搭建 / 补齐** | 加载子技能 `yida-app`,由它执行 create-or-update workflow |
55
134
  | 对已有应用/表单/页面的单点操作(加字段、查改数据、配公式、建报表、改权限、发布、美化…) | **单一 / 增量任务** | 到 [技能路由](#技能路由单一--增量任务) 选定 **1 个**,加载对应子技能执行,不回退流程 |
56
135
 
57
136
  ---
58
137
 
59
- ## 完整开发流程(全量搭建)
138
+ ## 完整开发流程(完整搭建 / 补齐)
60
139
 
61
- > 📌 仅当第二步判定为「全量搭建」时进入;单一/增量任务请跳「技能路由」。
140
+ > 📌 仅当第二步判定为「完整搭建 / 补齐」时进入;单一/增量任务请跳「技能路由」。
62
141
  > 加载子技能 `yida-app`,由它负责完整应用 workflow、阶段子技能加载、关键 ID 流转、PRD 与 schema cache 约束。
63
- > 用户说“按默认方案 / 不要追问 / 直接创建 / 尽快搭建”时,`yida-app` 选择 `fast_build`:创建应用、必要表单、主页面、发布并输出链接。
142
+ > 用户说“按默认方案 / 不要追问 / 直接创建 / 尽快搭建”时,`yida-app` 选择 `fast_build`:先解析并复用已有资源,只创建缺失且允许创建的应用/表单/页面,最后发布并输出链接。
143
+ > `yida-app fast_build` 是 direct/standalone 编排,仅在上方执行路径选择为 direct/standalone 时使用。
144
+
145
+ **默认链路**:`fast_build` 必须只做 `resolve app → resolve forms → resolve main page → create missing resources only → 编写/更新主页面源码 → 发布 → 返回访问链接`。不要因为应用名里有“看板 / 系统 / 管理”就升级到 `deep_design` 或 `full_demo`。
64
146
 
65
- **默认链路**:`fast_build` 必须只做 `创建应用 核心表单 主页面 编写主页面源码 发布 返回访问链接`。不要因为应用名里有“看板 / 系统 / 管理”就升级到 `deep_design` `full_demo`。
147
+ **fast_build 默认加载边界**:只加载 `yida-app` 和当前阶段必需的子技能。`yida-create-app`、`yida-create-page`、`yida-create-form-page` 只有在目标资源缺失且本次意图允许创建时才加载;已有资源时进入对应 update / publish 分支。页面默认走 Code Canvas;当用户明确要求普通自定义页面 JSX/Jsx 组件链路,或页面强依赖普通自定义页实例桥(`this.$(fieldId)` / `this.utils.yida.*` / `this.dataSourceMap` / 表单提交或字段双向绑定深度耦合)时,选择 `yida-custom-page`。不要默认加载 `yida-page-uiux`、`yida-data-source-connectors`、`yida-data-management`、`yida-nav-group`、`yida-dashboard`,也不要默认深读 `references/`。
66
148
 
67
- **fast_build 默认加载边界**:只加载 `yida-app` 和当前阶段必需的子技能:`yida-create-app`、`yida-create-form-page`、`yida-create-page`、`yida-canvas-custom-page`、`yida-publish-page`。页面默认走 Code Canvas;当用户明确要求普通自定义页面 JSX/Jsx 组件链路,或页面强依赖普通自定义页实例桥(`this.$(fieldId)` / `this.utils.yida.*` / `this.dataSourceMap` / 表单提交或字段双向绑定深度耦合)时,选择 `yida-custom-page`。不要默认加载 `yida-page-uiux`、`yida-data-source-connectors`、`yida-data-management`、`yida-nav-group`、`yida-dashboard`,也不要默认深读 `references/`。
149
+ **Canvas 数据边界**:完整应用/真实交付页如果展示列表、看板或详情记录,必须优先把本轮真实 `appType/formUuid/fieldId` 写入 `page-spec.json` `dataBinding.mode=form`;需要演示记录时先写入真实表单再读取。未接真实表单且未写入 demo records 时,页面展示空态/入口,不用前端 seedRows 冒充业务数据。
68
150
 
69
151
  **doneWhen**:`yida-app` 发布主页面成功并输出可访问 URL。到这里默认完成;不要发布后继续 TaskCreate、重复读技能或继续规划。
70
152
 
@@ -88,8 +170,8 @@ description: >
88
170
  | `yida-skills/analytics` | 报表、统计、图表、ECharts、看板、驾驶舱、大屏 | `yida-report`、`yida-chart`、`yida-dashboard` |
89
171
  | `yida-skills/integration` | 连接器、外部 API、执行动作、设计器数据源、集成自动化、逻辑流 | `yida-integration`、`yida-connector`、`yida-connector-safe-actions`、`yida-data-source-connectors` |
90
172
  | `yida-skills/access` | 平台/应用/表单/页面权限、公开访问、分享 | `yida-corp-manager`、`yida-app-permission`、`yida-form-permission`、`yida-page-config` |
91
- | `yida-skills/ops` | SLS、日志、traceId、灰度、Sequence、主键冲突、VOC 反馈 | `sls-log-workbench`、`yida-db-seq-fix`、`yida-voc` |
92
- | `yida-skills/agent` | 大文件写入、导出对话、会议纪要/闪记转 PRD | `large-file-write`、`yida-export-conversation`、`yida-flash-note-to-prd` |
173
+ | `yida-skills/ops` | Sequence、主键冲突、VOC 反馈 | `yida-db-seq-fix`、`yida-voc` |
174
+ | `yida-skills/agent` | 导出对话、会议纪要/闪记转 PRD | `yida-export-conversation`、`yida-flash-note-to-prd` |
93
175
 
94
176
  ### 高频分歧
95
177
 
@@ -126,6 +208,7 @@ description: >
126
208
 
127
209
  | 意图 | 直接执行 |
128
210
  |------|------|
211
+ | 修改当前 app 信息 / 预创建占位 app 改名 | `openyida update-app` |
129
212
  | 聚合表 / 虚拟视图 | `openyida aggregate-table` |
130
213
  | 流程表单 AI 审批提示 | `openyida ai-form-setting` |
131
214
  | 文生文 / 识图通用 AI 能力 | `openyida ai` |
@@ -138,26 +221,28 @@ description: >
138
221
  ### 致命规则(FATAL,违反即失败/报错)
139
222
 
140
223
  1. **技能加载唯一入口**:执行任何子技能前,支持 `use_skill` 的宿主必须调用 `use_skill("<技能名>", "<本阶段目的>")` 加载对应技能;不要用 `Read` / `read_file` / `cat` 读取 SKILL.md 路径,不凭记忆猜参数格式。
141
- 2. **corpId 一致性检查**:创建页面前对比 prd token session 中的 corpId,不一致必须询问用户(重新登录 or 当前组织新建)。
224
+ 2. **corpId 一致性检查**:创建或发布页面前对比 prd/resource context 与当前 auth context(默认 token session;`YIDA_AUTH_ENABLED=true` 时为宿主注入 token)的 corpId,不一致必须询问用户(重新登录到目标组织,或确认在当前组织继续操作已解析资源/缺失资源)。
142
225
  3. **发布前本地校验**:普通自定义页面 `.oyd.jsx` / `.jsx` 发布前跑 `openyida check-page` + `openyida compile`;Code Canvas `.canvas.jsx` 不跑这两个普通自定义页面检查,改由 `openyida publish` 的 Canvas 编译阶段或 `compileCanvasLocal` 快检校验;JSON 配置写盘后先解析校验,再调用平台命令。
143
- 4. **命令输入文件禁止 shell 写入**:当 OpenYida 命令需要 JSON/YAML/CSV/config/script 文件参数时,先使用当前 agent 运行时提供的结构化文件写入工具(如 create_file / Write / file edit tool)创建文件,再把路径传给命令;禁止用 shell heredoc、`cat`/`echo`/`printf`/`tee` 加输出重定向,或把命令 stdout 重定向成业务文件。
226
+ 4. **页面源码修改必须发布闭环**:只要本轮 Write/Edit/Create 了页面源码 `project/pages/src/*.{canvas.jsx,canvas.tsx,oyd.jsx,jsx,tsx}`(含完整搭建、补齐、已有页面 update path、单点优化),final 前必须看到成功的 `openyida publish <source> <appType> <displayPageFormUuid>` 命令结果;本地文件编辑、diff、本地校验或编译只证明源码可发布,不等于远端页面已更新。若没有 publish 成功证据,final 只能说“源码已修改,尚未发布”,禁止说“页面已更新 / 已重新发布 / 已上线”。
227
+ 5. **命令输入文件禁止 shell 写入**:当 OpenYida 命令需要 JSON/YAML/CSV/config/script 文件参数时,先使用当前 agent 运行时提供的结构化文件写入工具(如 create_file / Write / file edit tool)创建文件,再把路径传给命令;禁止用 shell heredoc、`cat`/`echo`/`printf`/`tee` 加输出重定向,或把命令 stdout 重定向成业务文件。
144
228
 
145
229
  ### 重要规则(IMPORTANT,影响质量/性能/可维护性)
146
230
 
147
231
  1. **按阶段加载必要技能**:按意图选 1 个主技能;完整应用按阶段加载当下唯一需要的子技能,禁止并发批量读取多个 `SKILL.md` 或预读未来阶段技能。
148
- 2. **优先复用缓存**:`appType`/`formUuid`/`fieldId` 优先从 `.cache/<项目名>-schema.json` 读,缺失再 `get-schema`。
149
- 3. **模板优先**:复杂产物先用 `openyida sample` 或现有示例生成骨架,再做最小改动。
150
- 4. **配置承载优先于代码**:字段/公式/联动/报表/审批/集成交给对应技能,自定义页面只做展示与胶水。
151
- 5. **数据性能优先**:统计聚合用 `yida-report` 服务端聚合,不在前端拉全量后自行聚合。
152
- 6. **避免无效重试**:失败先查登录态/组织/参数/字段 ID,无修改不连续重试超 1 次。
153
- 7. **配置分两处存**:业务语义 → `prd/<项目名>.md`;Schema ID `.cache/<项目名>-schema.json`(prd 不记 ID)。
154
- 8. **临时文件入 project `.cache/`**:OpenYida 业务中间文件写入 `<projectRoot>/.cache/openyida/<项目名或任务名>/`;Schema ID 映射仍写 `<projectRoot>/.cache/<项目名>-schema.json`。从 workspace 根执行命令时使用 `project/.cache/...`,从 project 工作目录内执行时使用 `.cache/...`;不要写仓库根目录或系统临时目录。
155
- 9. **报表美化先问方案**:用户说"优化/美化报表"时先问选原生报表(`yida-report`)还是 ECharts(`yida-chart`)。
156
- 10. **主题技能优先**:涉及应用主题色、品牌色、全局换肤或 `--color-brand1-*` 时先读 `yida-theme`;表单和页面只消费主题,不要在局部 Schema/JSX 中随意写死蓝色/紫色等品牌色。
232
+ 2. **Resource-First**:任何 legacy 写操作前先解析本轮显式资源、agent bound context、workspace cache/config、历史上下文;已有目标资源时默认修改/补齐/发布,只有目标缺失且意图允许创建时才加载 create 类技能。
233
+ 3. **优先复用 direct 映射**:仅对 direct/standalone 资源,已有 `.cache/<项目名>-schema.json` 中可确认新鲜的 `appType`/`formUuid`/`fieldId` 可复用;该文件不是 Schema-as-Code state,也不是远端真相。字段缺失、重名或结构变化时执行 `get-schema --compact --resolve-fields`,不得猜测。
234
+ 4. **模板优先**:复杂产物先用 `openyida sample` 或现有示例生成骨架,再做最小改动。
235
+ 5. **配置承载优先于代码**:字段/公式/联动/报表/审批/集成交给对应技能,自定义页面只做展示与胶水。
236
+ 6. **数据性能优先**:统计聚合用 `yida-report` 服务端聚合,不在前端拉全量后自行聚合。
237
+ 7. **避免无效重试**:失败先查登录态/组织/参数/字段 ID,无修改不连续重试超 1 次。
238
+ 8. **配置分两处存**:业务语义 `prd/<项目名>.md`;Schema ID `.cache/<项目名>-schema.json`(prd 不记 ID)。
239
+ 9. **临时文件入 project `.cache/`**:OpenYida 业务中间文件写入 `<projectRoot>/.cache/openyida/<项目名或任务名>/`;Schema ID 映射仍写 `<projectRoot>/.cache/<项目名>-schema.json`。从 workspace 根执行命令时使用 `project/.cache/...`,从 project 工作目录内执行时使用 `.cache/...`;不要写仓库根目录或系统临时目录。
240
+ 10. **报表美化先问方案**:用户说"优化/美化报表"时先问选原生报表(`yida-report`)还是 ECharts(`yida-chart`)。
157
241
  11. **按 schema 证据选技能**:先看 `formType`、组件树、`dataSource.online`;`receipt/process/report` 分别落到表单/流程/报表技能。
158
242
  12. **官方示例范式优先**:蒸馏官方示例时先理解脱敏 schema 承载方式,不凭截图/标题/视觉判断。
159
243
  13. **默认完成即停止**:完整应用默认以发布成功并输出 URL 为 doneWhen;UIUX、数据源深读、示例数据、导航、截图、TaskCreate 和深度设计都是 optionalAfterDone。
160
- 14. **任务复盘沉淀**:任务完成前判断是否有可复用经验需要落盘到 CLI、测试、sample skill。用户多次纠正、平台接口假成功、sample 共性质量问题、线上回读验收方法、一次性脚本可产品化等情况必须沉淀;详见 `references/task-retrospective.md`。
244
+ 14. **主题技能优先**:涉及应用主题色、品牌色、全局换肤或 `--color-brand1-*` 时先读 `yida-theme`;表单和页面只消费主题,不要在局部 Schema/JSX 中随意写死蓝色/紫色等品牌色。
245
+ 15. **任务复盘沉淀**:任务完成前判断是否有可复用经验需要落盘到 CLI、测试、sample 或 skill。用户多次纠正、平台接口假成功、sample 共性质量问题、线上回读验收方法、一次性脚本可产品化等情况必须沉淀;详见 `references/task-retrospective.md`。
161
246
 
162
247
  > 📖 每条规则的完整说明、PRD 质量门槛、临时文件路径规范、报表美化话术 → [references/development-rules.md](references/development-rules.md)
163
248
 
@@ -168,9 +253,9 @@ description: >
168
253
  | 问题 | 处理 |
169
254
  |------|------|
170
255
  | 发布提示登录失效 | 先 `openyida login`,再 `openyida publish <源文件> <appType> <formUuid> --health-check` |
171
- | 查已有表单的字段 ID | `openyida get-schema <appType> <formUuid>`,从 Schema 读各字段 `fieldId`(详见 `yida-get-schema`) |
172
- | 更新已有表单字段 | `create-form` 的 update 模式:`openyida create-form update <appType> <formUuid> '[{"action":"add","field":{"type":"TextField","label":"新字段"}}]'`(详见 `yida-create-form-page`) |
173
- | 发布提示 corpId 不匹配 | 问用户:当前组织新建应用发布,或 `openyida logout` 后重新登录到正确组织 |
256
+ | 查已有表单的字段 ID | `openyida get-schema <appType> <formUuid> --compact --resolve-fields "字段名"`,仅使用唯一命中的 `fieldId`(详见 `yida-get-schema`) |
257
+ | 更新已有表单字段 | direct/standalone 表单用 `create-form` 的 update 模式:`openyida create-form update <appType> <formUuid> '[{"action":"add","field":{"type":"TextField","label":"新字段"}}]'`(详见 `yida-create-form-page`);schema-managed 表单走 schema validate → plan → apply |
258
+ | 发布提示 corpId 不匹配 | 问用户:确认在当前组织继续操作已解析资源,或 `openyida logout` 后重新登录到正确组织 |
174
259
 
175
260
  ---
176
261
 
@@ -0,0 +1,99 @@
1
+ # Schema-as-Code Phase 1 Manifest
2
+
3
+ 这是 OpenYida Phase 1 唯一的 Manifest 编写与执行指南。Phase 1 管理 `app`、`form`、`process` 和 `native/default` 展示页;State 是资源 identity bindings 的唯一持久化权威,但 State 不是远端真相。
4
+
5
+ ## Canonical Manifest
6
+
7
+ 页面源码必须是 workspace 内的相对路径。下面的流程节点、字段和资源都使用稳定 semantic key;不要把真实 `appType`、`formUuid`、`fieldId` 或 `processCode` 写进 Manifest。
8
+
9
+ ```json
10
+ {
11
+ "kind": "openyida_app_manifest",
12
+ "schemaVersion": 1,
13
+ "app": {
14
+ "key": "visitorSystem",
15
+ "name": "访客管理系统"
16
+ },
17
+ "forms": {
18
+ "visitorRegistration": {
19
+ "title": "访客登记",
20
+ "mode": "process",
21
+ "fields": {
22
+ "visitorName": {
23
+ "type": "TextField",
24
+ "label": "访客姓名",
25
+ "required": true
26
+ },
27
+ "visitReason": {
28
+ "type": "TextareaField",
29
+ "label": "来访原因"
30
+ }
31
+ }
32
+ }
33
+ },
34
+ "processes": {
35
+ "visitorApproval": {
36
+ "form": "visitorRegistration",
37
+ "nodes": [
38
+ {
39
+ "key": "frontdeskReview",
40
+ "type": "approval",
41
+ "name": "前台初审",
42
+ "approver": "originator"
43
+ }
44
+ ]
45
+ }
46
+ },
47
+ "pages": {
48
+ "visitorHome": {
49
+ "title": "访客工作台",
50
+ "source": "pages/visitor-home.oyd.jsx"
51
+ }
52
+ }
53
+ }
54
+ ```
55
+
56
+ 上例不是单文件即跑:先在 workspace 内创建或替换 companion source `pages/visitor-home.oyd.jsx`,再执行 `validate`。例如文件内容可以是:
57
+
58
+ ```jsx
59
+ export default function Page() {
60
+ return <div>访客工作台</div>;
61
+ }
62
+ ```
63
+
64
+ 更新页面时也先替换同一个 workspace-relative source 文件,再重新 `plan`;不要把 inline source、绝对路径或真实页面 ID 写进 Manifest。
65
+
66
+ ## Review Then Apply
67
+
68
+ ```bash
69
+ openyida schema validate app.yida.json --json --quiet
70
+ openyida schema plan app.yida.json --state .cache/openyida/state.v1.json --json --quiet
71
+ openyida schema apply app.yida.json --state .cache/openyida/state.v1.json --plan-id '<reviewed-planId>' --json --quiet
72
+ ```
73
+
74
+ 1. `validate` 只做本地校验。
75
+ 2. `plan` 使用 `remote_read` 权限读取线上真实状态。人工检查 changes 和 `planId`。
76
+ 3. 对任何正常 create/update,首次 `apply` 都必须由用户审阅本次 `planId` 后显式批准,才以 `mixed/write` 权限执行。baseline plan、State、缓存、成功的 validate/plan 或错误 action 都不能激活写权限。
77
+ 4. form/page 保存使用本次 apply JIT exact read 得到的 `gmtModified`;app/process 没有同类条件写,继续使用 identity/version/JIT/reconciliation 门禁。
78
+
79
+ ## Actions
80
+
81
+ - 正常结果不触发错误恢复型 `ask_human`;但任何 create/update 的 plan 完成后都必须独立暂停,等待用户对当前 `planId` 的显式批准,才可执行首次 `apply`。
82
+ - `stale_replanned` 只展示 replacement plan,等待用户重新审阅并显式 apply;绝不自动 apply 或重试 save。
83
+ - `nextAction=ask_human` 时使用宿主 ask_human;没有工具时原样展示安全的 `blockText` 和 `choices`。
84
+ - `nextAction`、`ask_human` 和 `choices` 只用于错误恢复或业务取舍,不构成首次或后续 `apply` 的写授权。
85
+ - reconciliation、uncertain create/write、managed conflict/missing 时停止。禁止自动 retry、按标题 discover/adopt、猜 ID、cleanup 或重建。
86
+
87
+ ## Phase 1 Boundary
88
+
89
+ | Resource or operation | Phase 1 |
90
+ | --- | --- |
91
+ | app/form/process/native-default display page create/update/noop | Supported |
92
+ | report、integration automation | `SCHEMA_RESOURCE_TYPE_UNSUPPORTED` |
93
+ | page config、delete、pull、adopt | Deferred; not Manifest v1 properties |
94
+ | Canvas、dashboard、raw Schema、inline page source | Deferred/unsupported |
95
+
96
+ Standalone、明确 unmanaged 且用户明确要求 legacy 命令的资源仍可使用原 CLI。SAC Manifest 或 State 已拥有资源身份时,不得 fallback 到 legacy 直写。
97
+
98
+ - SAC-owned Manifest 中的 report、automation、page config、delete 和 pull 在 Phase 1 停止或延期,不 fallback 到 legacy。
99
+ - 明确 standalone/unmanaged 的 report、integration automation 和 page config 仍可路由现有 `yida-report`、`yida-integration`、`yida-page-config`;delete/pull 当前没有 Phase 1 live Manifest 或 standalone routing contract。
@@ -1,91 +1,91 @@
1
- # 环境准备与登录检测
1
+ # setup-and-env
2
2
 
3
- > **本文档的功能**:执行任何宜搭操作前,按序检测并准备运行环境与登录态。**下方 6 步全部通过前,禁止创建应用/页面/表单或发布等真实资源操作。**
4
-
5
- ## 检查流程(按序执行,全绿才可操作)
6
-
7
- 先跑两条只读命令拿快照,再对照下表逐步判断:
3
+ ## Run First
8
4
 
9
5
  ```bash
10
- openyida env --json # 环境快照:装没装 / AI 工具 / project / 登录态
11
- openyida login --check-only --json # 只读 token 登录态,不触发登录、不建资源
6
+ openyida agent-capabilities --summary-json
12
7
  ```
13
8
 
14
- | # | 检查项 | 判断依据 | 未通过时处理 |
15
- |---|--------|---------|-------------|
16
- | 1 | openyida 是否安装 | `env` 能跑并返回 `{"ok": true}` = 已装 | 报 `command not found` / 非零退出 → `npm install -g openyida`(先确认 Node ≥16) |
17
- | 2 | openyida 版本 | `env` 能跑但报错 / 行为异常 = 版本过旧 | `npm install -g openyida@latest` 后重试;仍异常 → `openyida doctor` 逐项体检 |
18
- | 3 | Node 版本 | 需 **Node.js ≥ 16**;`env` 只报告 `system.node`,不做校验 | 安装或运行报版本错 → 先升级 Node,再装/升级 openyida |
19
- | 4 | 登录态 | `login.loggedIn` 为 true 或 `login.status=ok` = 已登录 | 为 false → `openyida login`;指定入口须带 URL 或 flag(见「多环境登录」),勿退化成裸 `openyida login` |
20
- | 5 | project 工作目录 | `active.projectRootExists` 为 true | 为 false → `openyida copy`(非悟空工具须先 `cd` 到工程根目录,见「初始化 project」) |
21
- | 6 | 特殊环境 | 悟空 / Codex | 悟空命令连续失败 → 转人工诊断;Codex → 使用默认 OAuth token 登录(见对应章节) |
22
-
23
- ## 命令速查
9
+ Fallback:
24
10
 
25
11
  ```bash
26
- npm install -g openyida # 安装
27
- npm install -g openyida@latest # 更新到最新(命令报错多因版本旧,更新后重试即可)
12
+ openyida env --json
13
+ openyida login --check-only --json
28
14
  ```
29
15
 
30
- | 命令 | 定位 | 何时用 |
31
- |------|------|--------|
32
- | `env --json` | 机器可读快照:装没装 / 工具 / project / 登录 | 每次操作前(主命令)。恒返回 `ok:true`,`system.node` 仅报告不校验 |
33
- | `login --check-only --json` | 只读 token 登录态,不触发登录/不建资源 | 登录后二次验证 token session 写入 |
34
- | `auth status` / `auth refresh` | 查看或刷新 token 登录态 | access token 过期、业务命令鉴权失败时 |
35
- | `doctor` | 人读深度体检:校验 Node ≥16(ERROR)、npm ≥7(WARNING)、config.json、token 登录态、网络;支持 `--fix` / `--report`,无 `--json` | `env` 报错或行为异常时排查 |
16
+ ## Auth Mode
36
17
 
37
- ## env --json 关键字段
18
+ - IF `login.auth_mode=token`: OAuth token mode.
19
+ - IF `YIDA_AUTH_ENABLED=true`: host-injected token mode; the host must provide token env such as `OPENYIDA_ACCESS_TOKEN` or `OPENYIDA_REFRESH_TOKEN`.
20
+ - NEVER infer auth from `.cache/cookies*.json`.
38
21
 
39
- | 字段 | 含义 | 用途 |
40
- |------|------|------|
41
- | `ok` | 恒为 `true`(命令能跑即为真) | 不能用来判断是否安装 |
42
- | `system.node` | 运行时 Node 版本 | 仅报告,是否达标看 `doctor` |
43
- | `active.tool` | 当前活跃 AI 工具(悟空/OpenCode/Aone 等) | 决定 project 目录位置 |
44
- | `active.projectRootExists` | `project/` 是否存在 | 为 `false` → `openyida copy` |
45
- | `active.isWukong` | 是否悟空环境 | 决定 project 目录位置 |
46
- | `login.loggedIn` / `login.canAutoUse` | 是否已登录 / 可自动使用 | 为 `false` → `openyida login` |
47
- | `login.corpId` / `login.baseUrl` | 组织 ID / 域名 | corpId 一致性检查 |
22
+ ## Decision Table
48
23
 
49
- 不带 `--json` 直接跑 `openyida env` 时,输出报告分三块:
24
+ | Snapshot | Next action |
25
+ |---|---|
26
+ | command not found | install/update `openyida`; do not create resources |
27
+ | `workdir_exists=false` or `active.projectRootExists=false` | run `openyida copy`; do not create resources before workspace exists |
28
+ | `auth_mode=token`, `status=ok` or `can_auto_use=true` | continue |
29
+ | `auth_mode=token`, `failure_reason=env_token_missing` | STOP; host must inject `OPENYIDA_ACCESS_TOKEN` or `OPENYIDA_REFRESH_TOKEN`; do not run OAuth |
30
+ | `auth_mode=token`, not logged in, `YIDA_AUTH_ENABLED` is not true | run `openyida login`; verify with `openyida login --check-only --json` |
31
+ | `auth_mode=token`, access token expired | run `openyida auth refresh`; if still failed and `YIDA_AUTH_ENABLED` is not true, run `openyida login` |
50
32
 
51
- | 报告项 | 显示内容 |
52
- |--------|---------|
53
- | AI 工具检测 | 当前活跃的 AI 工具(悟空 / OpenCode / Aone Copilot 等) |
54
- | 当前生效环境 | 项目根目录路径 |
55
- | 登录态检测 | 是否已登录、域名、组织 ID;显示"未登录"就先 `openyida login` |
33
+ ## Token Mode Commands
56
34
 
57
- ## 多环境登录
35
+ Use OAuth login only when `YIDA_AUTH_ENABLED` is not true.
58
36
 
59
- 登录指定入口时命令必须带该 URL、`--endpoint` 或环境 flag,否则会落到默认公有云 `www.aliwork.com` / `auth-token-public.json`。例如阿里内网 `https://yida-group.alibaba-inc.com/`:
37
+ ```bash
38
+ openyida login
39
+ openyida login --check-only --json
40
+ openyida auth status
41
+ openyida auth refresh
42
+ openyida auth logout
43
+ ```
44
+
45
+ If user gives target entry URL or environment:
60
46
 
61
47
  ```bash
62
48
  openyida login https://yida-group.alibaba-inc.com/
63
- openyida login --alibaba # 等价简写
49
+ openyida login --alibaba
50
+ openyida login --intl
64
51
  ```
65
52
 
66
- ## Codex / Agent token 登录
67
-
68
- 当前登录默认是 OAuth token 模式:`openyida login` 会打开钉钉 OAuth 授权页,用户完成登录后回调到本机 loopback 地址,CLI 换取并保存 `access_token` / `refresh_token`。Codex 或其他 agent 环境中不要再走旧 Cookie / QR handoff,也不要手动导出 Cookie。登录完成后**必须**再执行 `openyida login --check-only --json` 或 `openyida auth status` 验证 token session 写入,验证通过前不得创建真实资源。
53
+ Overseas / international / global / Japan / Global YiDA => add `--intl` or equivalent.
69
54
 
70
- ## 悟空(Wukong)降级规则
55
+ ## Host-Injected Token Mode Commands
71
56
 
72
- 悟空环境本地命令入口连续失败时,不要继续重试,也不要判定为登录失败。转人工协同诊断:请用户在可用终端执行以下低风险命令并贴回输出:
57
+ Use only when `YIDA_AUTH_ENABLED=true`.
73
58
 
74
59
  ```bash
75
- openyida -v
60
+ openyida agent-capabilities --summary-json
76
61
  openyida env --json
77
62
  openyida login --check-only --json
63
+ openyida auth status
64
+ openyida auth refresh
65
+ ```
66
+
67
+ Allowed result:
68
+
69
+ ```json
70
+ {
71
+ "auth_mode": "token",
72
+ "auth_source": "env",
73
+ "status": "ok",
74
+ "can_auto_use": true
75
+ }
78
76
  ```
79
77
 
80
- 确认 `loggedIn` / `can_auto_use`、`auth_mode=token`、`corp_id`、`base_url` 等关键项前,禁止创建任何真实宜搭资源。
78
+ If the host did not inject token env, failure result includes `failure_reason=env_token_missing`; stop the task and go back to the host. Do not launch OAuth from this mode.
81
79
 
82
- ## 初始化 project 工作目录
80
+ ## NEVER
83
81
 
84
- `active.projectRootExists` false(切换 AI 工具、新工程首次使用)时执行 `openyida copy`。目录位置随工具而定:
82
+ - Never run `openyida login` in host-injected token mode.
83
+ - Never read `.cache/cookies*.json` as yida-agent auth.
84
+ - Never ask the user to export browser Cookie.
85
+ - Never print Cookie, CSRF, `access_token`, or `refresh_token`.
85
86
 
86
- | AI 工具 | project 目录位置 | 执行要求 |
87
- |---------|-----------------|---------|
88
- | **悟空(Wukong)** | `~/.real/workspace/project`(专属 workspace,与工程目录无关) | 直接执行 |
89
- | **其他工具**(Aone Copilot / Cursor / Claude Code / OpenCode 等) | `<当前工程目录>/project` | 须先 `cd` 到工程根目录再执行 |
87
+ ## Wukong / Codex
90
88
 
91
- > ⚠️ 对于非悟空工具,必须先 `cd` 到工程根目录再执行 `openyida copy`,否则 `project/` 会铺错位置。
89
+ - Same auth mode rules as above.
90
+ - Do not special-case Wukong or Codex into OAuth login when `YIDA_AUTH_ENABLED=true`.
91
+ - Do not create app/page/form/publish until auth snapshot is usable.
@@ -84,22 +84,22 @@ OpenYida 任务完成后,除了交付当前结果,还要判断是否有可
84
84
 
85
85
  这轮 `Chart - *` sample 暴露出的核心问题是:自定义 ECharts 页面引用了旧应用里的 `REPORT_xxx`、旧 `prdId/topicId` 和旧 `cid`,在当前 Samples 应用中会返回 `no permission for the report`。以后遇到 chart sample 权限或空数据问题时,按下面链路处理。
86
86
 
87
- 1. **先在当前应用创建或同步原生报表**
87
+ 1. **先在当前应用创建或同步原生报表**
88
88
  不要把另一个应用的 `REPORT_xxx` 复制到当前页面。当前应用如果没有可用数据源表单,先创建专用数据源表单并写入可展示的示例数据;再用 `openyida create-report` 创建原生报表。
89
89
 
90
- 2. **所有绑定参数来自新报表 schema**
90
+ 2. **所有绑定参数来自新报表 schema**
91
91
  创建报表后必须 `openyida get-schema <appType> <REPORT_xxx> --json`,从组件树提取 `cid`、`componentName/className`、`dataSetKey`、`filterKey`、`cname`。不要沿用旧 `YoushuTable_mmx...` 或旧 `YoushuSimpleIndicatorCard_mmx...`。
92
92
 
93
- 3. **`prdId/topicId` 运行时动态获取**
93
+ 3. **`prdId/topicId` 运行时动态获取**
94
94
  ECharts 页面不能硬编码 `prdId`。用 `getFormNavigationListByOrder` 按 `REPORT_FORM_UUID` 找 `topicId`,再调用 `getDataAsync.json`。
95
95
 
96
- 4. **filterKey 是组件级,不是字段级**
96
+ 4. **filterKey 是组件级,不是字段级**
97
97
  同一个“状态筛选”联动到不同组件时也会生成不同 `filterKey`。记录时用 `statusTableStatus`、`budgetTableStatus` 这类组件级命名,不能只写 `status`。
98
98
 
99
- 5. **绑定关系要落盘并加测试**
99
+ 5. **绑定关系要落盘并加测试**
100
100
  写入 `.cache/openyida/<任务名>/report-binding.json`,同时在 `tests/sample.test.js` 或相关测试中断言 sample 不再包含旧 `REPORT`、旧 `prdId`、旧 appType 或旧 cid 前缀。
101
101
 
102
- 6. **发布后全量验收**
102
+ 6. **发布后全量验收**
103
103
  对所有 chart sample 执行 `check-page`、`compile`、`publish --health-check`、`git diff --check`。如果页面使用了 ECharts 地图,要同时检查地图底图/GeoJSON 兜底,不允许把“地图组件暂不可用”作为正常态。
104
104
 
105
105
  ### 沉淀优先级