yugoo-design 0.2.6 → 0.2.8

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 (221) hide show
  1. package/README.md +4 -4
  2. package/bin/npm-agent-installation.mjs +12 -5
  3. package/bin/npm-desktop-preparation.mjs +47 -33
  4. package/bin/npm-installer-dsh.mjs +2 -1
  5. package/bin/npm-node-runtime.mjs +4 -3
  6. package/package.json +1 -1
  7. package/payload/desktop-preparation/materials.json +46 -46
  8. package/payload/desktop-preparation/qwenwork-package.mjs +26 -11
  9. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/material.json +1 -1
  10. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/.agents/skills/design-bundle-creator/references/bundle-checklist.md +1 -1
  11. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/.agents/skills/design-bundle-creator/references/panel-authoring.md +6 -4
  12. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/.agents/skills/design-bundle-creator/scripts/inspect-panel-component.mjs +27 -33
  13. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/docs/dsl-spec.md +104 -19
  14. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/docs/panel-uiux-standard.md +361 -90
  15. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/docs/system-design-baseline.md +1 -1
  16. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/SKILL.md +7 -4
  17. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/artifact-contract.md +12 -5
  18. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/bpmn_authoring.md +13 -10
  19. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/canvas-guide.md +2 -1
  20. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/schema.yaml +1 -1
  21. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/reference/artifact-contract.md +5 -0
  22. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/reference/preview.json +1 -0
  23. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/schema.yaml +4 -0
  24. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/SKILL.md +4 -2
  25. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/reference/artifact-contract.md +16 -8
  26. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/schema.yaml +2 -2
  27. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/packages/skills-web-app/bundles/web_app_prd_assembly/SKILL.md +4 -0
  28. package/payload/desktop-preparation/qwenwork-template/authoring/studio-creators/source/packages/skills-web-app/bundles/web_app_prd_assembly/reference/artifact-contract.md +6 -0
  29. package/payload/desktop-preparation/qwenwork-template/scripts/native-hook-transport.mjs +21 -15
  30. package/payload/desktop-preparation/qwenwork-template/scripts/qwenwork-connection.mjs +56 -11
  31. package/payload/desktop-preparation/src/native-hook-transport.mjs +21 -15
  32. package/payload/desktop-preparation/src/qwenwork-connection.mjs +56 -11
  33. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/material.json +1 -1
  34. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/.agents/skills/design-bundle-creator/references/bundle-checklist.md +1 -1
  35. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/.agents/skills/design-bundle-creator/references/panel-authoring.md +6 -4
  36. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/.agents/skills/design-bundle-creator/scripts/inspect-panel-component.mjs +27 -33
  37. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/docs/dsl-spec.md +104 -19
  38. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/docs/panel-uiux-standard.md +361 -90
  39. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/docs/system-design-baseline.md +1 -1
  40. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/SKILL.md +7 -4
  41. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/artifact-contract.md +12 -5
  42. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/bpmn_authoring.md +13 -10
  43. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/canvas-guide.md +2 -1
  44. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/schema.yaml +1 -1
  45. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/reference/artifact-contract.md +5 -0
  46. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/reference/preview.json +1 -0
  47. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/schema.yaml +4 -0
  48. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/SKILL.md +4 -2
  49. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/reference/artifact-contract.md +16 -8
  50. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/schema.yaml +2 -2
  51. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/packages/skills-web-app/bundles/web_app_prd_assembly/SKILL.md +4 -0
  52. package/payload/desktop-preparation/studio-authoring-template/authoring/studio-creators/source/packages/skills-web-app/bundles/web_app_prd_assembly/reference/artifact-contract.md +6 -0
  53. package/payload/desktop-preparation/workbuddy-package.mjs +13 -8
  54. package/payload/overlays/claude-code/.claude-plugin/plugin.json +1 -1
  55. package/payload/overlays/claude-code/authoring/studio-creators/material.json +1 -1
  56. package/payload/overlays/claude-code/authoring/studio-creators/source/.agents/skills/design-bundle-creator/references/bundle-checklist.md +1 -1
  57. package/payload/overlays/claude-code/authoring/studio-creators/source/.agents/skills/design-bundle-creator/references/panel-authoring.md +6 -4
  58. package/payload/overlays/claude-code/authoring/studio-creators/source/.agents/skills/design-bundle-creator/scripts/inspect-panel-component.mjs +27 -33
  59. package/payload/overlays/claude-code/authoring/studio-creators/source/docs/dsl-spec.md +104 -19
  60. package/payload/overlays/claude-code/authoring/studio-creators/source/docs/panel-uiux-standard.md +361 -90
  61. package/payload/overlays/claude-code/authoring/studio-creators/source/docs/system-design-baseline.md +1 -1
  62. package/payload/overlays/claude-code/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/SKILL.md +7 -4
  63. package/payload/overlays/claude-code/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/artifact-contract.md +12 -5
  64. package/payload/overlays/claude-code/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/bpmn_authoring.md +13 -10
  65. package/payload/overlays/claude-code/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/canvas-guide.md +2 -1
  66. package/payload/overlays/claude-code/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/schema.yaml +1 -1
  67. package/payload/overlays/claude-code/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/reference/artifact-contract.md +5 -0
  68. package/payload/overlays/claude-code/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/reference/preview.json +1 -0
  69. package/payload/overlays/claude-code/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/schema.yaml +4 -0
  70. package/payload/overlays/claude-code/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/SKILL.md +4 -2
  71. package/payload/overlays/claude-code/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/reference/artifact-contract.md +16 -8
  72. package/payload/overlays/claude-code/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/schema.yaml +2 -2
  73. package/payload/overlays/claude-code/authoring/studio-creators/source/packages/skills-web-app/bundles/web_app_prd_assembly/SKILL.md +4 -0
  74. package/payload/overlays/claude-code/authoring/studio-creators/source/packages/skills-web-app/bundles/web_app_prd_assembly/reference/artifact-contract.md +6 -0
  75. package/payload/overlays/claude-code/scripts/native-hook-transport.mjs +21 -15
  76. package/payload/overlays/codex/.codex-plugin/plugin.json +1 -1
  77. package/payload/overlays/codex/authoring/studio-creators/material.json +1 -1
  78. package/payload/overlays/codex/authoring/studio-creators/source/.agents/skills/design-bundle-creator/references/bundle-checklist.md +1 -1
  79. package/payload/overlays/codex/authoring/studio-creators/source/.agents/skills/design-bundle-creator/references/panel-authoring.md +6 -4
  80. package/payload/overlays/codex/authoring/studio-creators/source/.agents/skills/design-bundle-creator/scripts/inspect-panel-component.mjs +27 -33
  81. package/payload/overlays/codex/authoring/studio-creators/source/docs/dsl-spec.md +104 -19
  82. package/payload/overlays/codex/authoring/studio-creators/source/docs/panel-uiux-standard.md +361 -90
  83. package/payload/overlays/codex/authoring/studio-creators/source/docs/system-design-baseline.md +1 -1
  84. package/payload/overlays/codex/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/SKILL.md +7 -4
  85. package/payload/overlays/codex/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/artifact-contract.md +12 -5
  86. package/payload/overlays/codex/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/bpmn_authoring.md +13 -10
  87. package/payload/overlays/codex/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/canvas-guide.md +2 -1
  88. package/payload/overlays/codex/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/schema.yaml +1 -1
  89. package/payload/overlays/codex/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/reference/artifact-contract.md +5 -0
  90. package/payload/overlays/codex/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/reference/preview.json +1 -0
  91. package/payload/overlays/codex/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/schema.yaml +4 -0
  92. package/payload/overlays/codex/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/SKILL.md +4 -2
  93. package/payload/overlays/codex/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/reference/artifact-contract.md +16 -8
  94. package/payload/overlays/codex/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/schema.yaml +2 -2
  95. package/payload/overlays/codex/authoring/studio-creators/source/packages/skills-web-app/bundles/web_app_prd_assembly/SKILL.md +4 -0
  96. package/payload/overlays/codex/authoring/studio-creators/source/packages/skills-web-app/bundles/web_app_prd_assembly/reference/artifact-contract.md +6 -0
  97. package/payload/overlays/qoder/.qoder-plugin/plugin.json +1 -1
  98. package/payload/overlays/qoder/authoring/studio-creators/material.json +1 -1
  99. package/payload/overlays/qoder/authoring/studio-creators/source/.agents/skills/design-bundle-creator/references/bundle-checklist.md +1 -1
  100. package/payload/overlays/qoder/authoring/studio-creators/source/.agents/skills/design-bundle-creator/references/panel-authoring.md +6 -4
  101. package/payload/overlays/qoder/authoring/studio-creators/source/.agents/skills/design-bundle-creator/scripts/inspect-panel-component.mjs +27 -33
  102. package/payload/overlays/qoder/authoring/studio-creators/source/docs/dsl-spec.md +104 -19
  103. package/payload/overlays/qoder/authoring/studio-creators/source/docs/panel-uiux-standard.md +361 -90
  104. package/payload/overlays/qoder/authoring/studio-creators/source/docs/system-design-baseline.md +1 -1
  105. package/payload/overlays/qoder/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/SKILL.md +7 -4
  106. package/payload/overlays/qoder/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/artifact-contract.md +12 -5
  107. package/payload/overlays/qoder/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/bpmn_authoring.md +13 -10
  108. package/payload/overlays/qoder/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/canvas-guide.md +2 -1
  109. package/payload/overlays/qoder/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/schema.yaml +1 -1
  110. package/payload/overlays/qoder/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/reference/artifact-contract.md +5 -0
  111. package/payload/overlays/qoder/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/reference/preview.json +1 -0
  112. package/payload/overlays/qoder/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/schema.yaml +4 -0
  113. package/payload/overlays/qoder/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/SKILL.md +4 -2
  114. package/payload/overlays/qoder/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/reference/artifact-contract.md +16 -8
  115. package/payload/overlays/qoder/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/schema.yaml +2 -2
  116. package/payload/overlays/qoder/authoring/studio-creators/source/packages/skills-web-app/bundles/web_app_prd_assembly/SKILL.md +4 -0
  117. package/payload/overlays/qoder/authoring/studio-creators/source/packages/skills-web-app/bundles/web_app_prd_assembly/reference/artifact-contract.md +6 -0
  118. package/payload/overlays/qoder/scripts/native-hook-transport.mjs +21 -15
  119. package/payload/shared/authoring/panel-components.json +1015 -878
  120. package/payload/shared/authoring/studio-creators/material.json +1 -1
  121. package/payload/shared/authoring/studio-creators/source/.agents/skills/design-bundle-creator/references/bundle-checklist.md +1 -1
  122. package/payload/shared/authoring/studio-creators/source/.agents/skills/design-bundle-creator/references/panel-authoring.md +6 -4
  123. package/payload/shared/authoring/studio-creators/source/.agents/skills/design-bundle-creator/scripts/inspect-panel-component.mjs +27 -33
  124. package/payload/shared/authoring/studio-creators/source/docs/dsl-spec.md +104 -19
  125. package/payload/shared/authoring/studio-creators/source/docs/panel-uiux-standard.md +361 -90
  126. package/payload/shared/authoring/studio-creators/source/docs/system-design-baseline.md +1 -1
  127. package/payload/shared/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/SKILL.md +7 -4
  128. package/payload/shared/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/artifact-contract.md +12 -5
  129. package/payload/shared/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/bpmn_authoring.md +13 -10
  130. package/payload/shared/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/reference/canvas-guide.md +2 -1
  131. package/payload/shared/authoring/studio-creators/source/packages/skills-web-app/bundles/flow_design/schema.yaml +1 -1
  132. package/payload/shared/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/reference/artifact-contract.md +5 -0
  133. package/payload/shared/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/reference/preview.json +1 -0
  134. package/payload/shared/authoring/studio-creators/source/packages/skills-web-app/bundles/function_modules/schema.yaml +4 -0
  135. package/payload/shared/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/SKILL.md +4 -2
  136. package/payload/shared/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/reference/artifact-contract.md +16 -8
  137. package/payload/shared/authoring/studio-creators/source/packages/skills-web-app/bundles/smart_questions/schema.yaml +2 -2
  138. package/payload/shared/authoring/studio-creators/source/packages/skills-web-app/bundles/web_app_prd_assembly/SKILL.md +4 -0
  139. package/payload/shared/authoring/studio-creators/source/packages/skills-web-app/bundles/web_app_prd_assembly/reference/artifact-contract.md +6 -0
  140. package/payload/shared/bundles/ai_agent_capabilities/locales/en-US.json +29 -28
  141. package/payload/shared/bundles/ai_agent_capabilities/locales/zh-CN.json +35 -34
  142. package/payload/shared/bundles/ai_agent_capabilities/panel.yaml +55 -75
  143. package/payload/shared/bundles/business_data/locales/en-US.json +2 -2
  144. package/payload/shared/bundles/business_data/locales/zh-CN.json +1 -1
  145. package/payload/shared/bundles/business_rules/locales/en-US.json +2 -3
  146. package/payload/shared/bundles/business_rules/locales/zh-CN.json +2 -3
  147. package/payload/shared/bundles/business_rules/panel.yaml +4 -10
  148. package/payload/shared/bundles/design_style/locales/en-US.json +4 -4
  149. package/payload/shared/bundles/design_style/locales/zh-CN.json +4 -4
  150. package/payload/shared/bundles/flow_design/LICENSE +202 -0
  151. package/payload/shared/bundles/flow_design/NOTICE +13 -0
  152. package/payload/shared/bundles/flow_design/SKILL.md +7 -4
  153. package/payload/shared/bundles/flow_design/THIRD_PARTY_NOTICES.md +35 -0
  154. package/payload/shared/bundles/flow_design/licenses/bundled-js/bpmn-moddle@9.0.4/LICENSE +21 -0
  155. package/payload/shared/bundles/flow_design/licenses/bundled-js/min-dash@4.2.3/LICENSE +21 -0
  156. package/payload/shared/bundles/flow_design/licenses/bundled-js/moddle-xml@11.0.0/LICENSE +21 -0
  157. package/payload/shared/bundles/flow_design/licenses/bundled-js/moddle@7.2.0/LICENSE +21 -0
  158. package/payload/shared/bundles/flow_design/licenses/bundled-js/rolldown@1.2.4/LICENSE +25 -0
  159. package/payload/shared/bundles/flow_design/licenses/bundled-js/rolldown@1.2.4/THIRD-PARTY-LICENSE +33 -0
  160. package/payload/shared/bundles/flow_design/licenses/bundled-js/saxen@10.0.0/LICENSE +21 -0
  161. package/payload/shared/bundles/flow_design/licenses/flow-build.json +204 -0
  162. package/payload/shared/bundles/flow_design/licenses/third-party/elkjs-0.10.2/DEPENDENCIES +631 -0
  163. package/payload/shared/bundles/flow_design/licenses/third-party/elkjs-0.10.2/LICENSE.md +264 -0
  164. package/payload/shared/bundles/flow_design/licenses/third-party/elkjs-0.10.2/NOTICE.md +55 -0
  165. package/payload/shared/bundles/flow_design/licenses/third-party/elkjs-0.10.2/SOURCE.md +62 -0
  166. package/payload/shared/bundles/flow_design/licenses/third-party/elkjs-0.10.2/graph-layout-worker.ts +33 -0
  167. package/payload/shared/bundles/flow_design/licenses/third-party/elkjs-0.10.2/release-source-binding.json +81 -0
  168. package/payload/shared/bundles/flow_design/licenses/third-party/elkjs-0.10.2/upstream-README.md +391 -0
  169. package/payload/shared/bundles/flow_design/licenses/third-party/elkjs-0.10.2/upstream-build.gradle +322 -0
  170. package/payload/shared/bundles/flow_design/licenses/third-party/elkjs-0.10.2/upstream-ci.yml +67 -0
  171. package/payload/shared/bundles/flow_design/reference/artifact-contract.md +12 -5
  172. package/payload/shared/bundles/flow_design/reference/bpmn_authoring.md +13 -10
  173. package/payload/shared/bundles/flow_design/reference/canvas-guide.md +2 -1
  174. package/payload/shared/bundles/flow_design/schema.yaml +1 -1
  175. package/payload/shared/bundles/flow_design/scripts/bpmn-validator.mjs +35 -20
  176. package/payload/shared/bundles/function_modules/locales/en-US.json +2 -2
  177. package/payload/shared/bundles/function_modules/panel.yaml +1 -0
  178. package/payload/shared/bundles/function_modules/reference/artifact-contract.md +5 -0
  179. package/payload/shared/bundles/function_modules/reference/preview.json +1 -0
  180. package/payload/shared/bundles/function_modules/schema.yaml +4 -0
  181. package/payload/shared/bundles/integration_design/locales/en-US.json +3 -1
  182. package/payload/shared/bundles/integration_design/locales/zh-CN.json +3 -1
  183. package/payload/shared/bundles/integration_design/panel.yaml +18 -2
  184. package/payload/shared/bundles/notification_design/locales/en-US.json +2 -0
  185. package/payload/shared/bundles/notification_design/locales/zh-CN.json +2 -0
  186. package/payload/shared/bundles/notification_design/panel.yaml +18 -6
  187. package/payload/shared/bundles/page_design/locales/en-US.json +12 -1
  188. package/payload/shared/bundles/page_design/locales/zh-CN.json +12 -1
  189. package/payload/shared/bundles/page_design/panel.yaml +23 -1
  190. package/payload/shared/bundles/quality_acceptance/locales/en-US.json +2 -2
  191. package/payload/shared/bundles/quality_acceptance/locales/zh-CN.json +2 -2
  192. package/payload/shared/bundles/quality_acceptance/panel.yaml +10 -7
  193. package/payload/shared/bundles/role_access/locales/en-US.json +5 -5
  194. package/payload/shared/bundles/role_access/locales/zh-CN.json +5 -5
  195. package/payload/shared/bundles/smart_questions/SKILL.md +4 -2
  196. package/payload/shared/bundles/smart_questions/reference/artifact-contract.md +16 -8
  197. package/payload/shared/bundles/smart_questions/schema.yaml +2 -2
  198. package/payload/shared/bundles/web_app_prd_assembly/SKILL.md +4 -0
  199. package/payload/shared/bundles/web_app_prd_assembly/locales/en-US.json +2 -2
  200. package/payload/shared/bundles/web_app_prd_assembly/locales/zh-CN.json +1 -1
  201. package/payload/shared/bundles/web_app_prd_assembly/reference/artifact-contract.md +6 -0
  202. package/payload/shared/bundles/web_app_prd_assembly/scripts/prd.mjs +28 -16
  203. package/payload/shared/scripts/{content-archive-CnwVcuWA.mjs → content-archive-BvVmbecb.mjs} +2 -2
  204. package/payload/shared/scripts/{core-entry-DESmwP78.mjs → core-entry-S65aB8cC.mjs} +47 -0
  205. package/payload/shared/scripts/design.mjs +2 -2
  206. package/payload/shared/scripts/git-runtime-check.mjs +1 -1
  207. package/payload/shared/scripts/knowledge-snapshot-query.mjs +1 -1
  208. package/payload/shared/scripts/{load-C-RwS23Y.mjs → load-D1xLlKL_.mjs} +1 -1
  209. package/payload/shared/scripts/{panel-preview-BeVRYFk1.mjs → panel-preview-D-OD9mro.mjs} +2 -2
  210. package/payload/shared/scripts/{server-BnEtfptI.mjs → server-B6kGo8xO.mjs} +159 -55
  211. package/payload/shared/scripts/{studio-CFUWk0vJ.mjs → studio-DumCCbFT.mjs} +6 -6
  212. package/payload/shared/scripts/{studio-instance-composition-BJzYMyvV.mjs → studio-instance-composition-DfbZVetl.mjs} +2 -2
  213. package/payload/shared/scripts/{studio-instances-gQFR9yqL.mjs → studio-instances-BnVSHNCf.mjs} +3 -3
  214. package/payload/shared/scripts/{studio-panel-drafts-Dq171F6x.mjs → studio-panel-drafts-DSxfgHfk.mjs} +1 -1
  215. package/payload/shared/scripts/workbuddy-panel-service.mjs +1 -1
  216. package/payload/shared/web/{_dsh-design-css_owned_89a065927fa266797ef9ce977561ca0c4a3502195b0ba467350b7673cd701bdf_bpmn-embedded.css-CS3_MdFX.js → _dsh-design-css_owned_89a065927fa266797ef9ce977561ca0c4a3502195b0ba467350b7673cd701bdf_bpmn-embedded.css-BVX0LPx6.js} +3 -3
  217. package/payload/shared/web/{_dsh-design-css_owned_cc41a10f41ce4c8219d75daefaa99c08ac76f04537f7ec1abc92622e819f5bba_bpmn-js.css-BMPB0-R-.js → _dsh-design-css_owned_cc41a10f41ce4c8219d75daefaa99c08ac76f04537f7ec1abc92622e819f5bba_bpmn-js.css-TpJpFSU5.js} +3 -3
  218. package/payload/shared/web/{_dsh-design-css_owned_f311e6c6d8e65aed0c9a7ee24ef653d3c38574a3505babc3e0cad2a40b94a188_diagram-js.css-C11OT7zU.js → _dsh-design-css_owned_f311e6c6d8e65aed0c9a7ee24ef653d3c38574a3505babc3e0cad2a40b94a188_diagram-js.css-DreYyNMC.js} +3 -3
  219. package/payload/shared/web/client.js +3389 -1843
  220. package/release-hosts.json +1 -1
  221. package/release-manifest.json +223 -203
@@ -10,6 +10,10 @@ type: object
10
10
  additional_properties: false
11
11
  properties:
12
12
  skill_name: { knowledge: { role: metadata }, type: string }
13
+ function_order:
14
+ knowledge: { role: metadata }
15
+ type: array
16
+ items: { type: string }
13
17
  functions:
14
18
  type: map
15
19
  value:
@@ -7,6 +7,8 @@
7
7
  "newIntegration": "New system integration",
8
8
  "newIntegrationNumbered": "New system integration {index}",
9
9
  "title": "Name",
10
+ "connectionDetails": "Connection details",
11
+ "usageAndNotes": "Usage and notes",
10
12
  "description": "Capability description",
11
13
  "descriptionHelp": "In one sentence, explain what this connection does for the product.",
12
14
  "descriptionExample": "For example: create a warehouse shipment and return its identifier.",
@@ -15,7 +17,7 @@
15
17
  "secrets": "Credential requirements",
16
18
  "secretsHelp": "Record credential names and purposes only. Configure actual secrets through the host credential service, never in Design Files. Leave this empty if authentication is unnecessary.",
17
19
  "secret": "Credential",
18
- "secretName": "Credential name (uppercase letters, digits and underscores)",
20
+ "secretName": "Credential name or configuration key",
19
21
  "secretDescription": "Purpose",
20
22
  "prompt": "Usage instructions",
21
23
  "promptHelp": "Explain when to use the connection, what to do, and which results to return.",
@@ -7,6 +7,8 @@
7
7
  "newIntegration": "新系统集成",
8
8
  "newIntegrationNumbered": "新系统集成 {index}",
9
9
  "title": "名称",
10
+ "connectionDetails": "连接信息",
11
+ "usageAndNotes": "使用与说明",
10
12
  "description": "能力说明",
11
13
  "descriptionHelp": "用一句话说明这个连接替产品完成什么事情。",
12
14
  "descriptionExample": "例如:向仓储系统创建发货任务,并返回任务编号",
@@ -15,7 +17,7 @@
15
17
  "secrets": "凭据需求",
16
18
  "secretsHelp": "这里只记录宿主需要配置的凭据名称和用途。实际密钥必须通过宿主应用凭据服务提供,不能写入设计文件。如果服务不需要密钥,可以保持为空。",
17
19
  "secret": "凭据",
18
- "secretName": "凭据名称(大写字母、数字和下划线)",
20
+ "secretName": "凭据名称或配置项",
19
21
  "secretDescription": "用途说明",
20
22
  "prompt": "使用方法",
21
23
  "promptHelp": "告诉 Agent 何时使用这个连接、需要完成什么,以及应该返回哪些结果。",
@@ -7,7 +7,23 @@ initial_values: {schema_version: 8}
7
7
  empty_description: $t:empty
8
8
  sections:
9
9
  - id: integrations
10
- form: {header: {variant: detail, title: {field: title, editable: true}}}
10
+ form:
11
+ header: {variant: detail, title: {field: title, editable: true}}
12
+ body:
13
+ - kind: group
14
+ title: $t:connectionDetails
15
+ items:
16
+ - {kind: field, field: description}
17
+ - {kind: field, field: url}
18
+ - kind: group
19
+ title: $t:secrets
20
+ items:
21
+ - {kind: field, field: secrets, label: visually_hidden}
22
+ - kind: group
23
+ title: $t:usageAndNotes
24
+ items:
25
+ - {kind: field, field: prompt_content}
26
+ - {kind: field, field: business_rules}
11
27
  title: $t:integrations
12
28
  item_name: $t:integration
13
29
  order: integration_order
@@ -46,7 +62,7 @@ fields:
46
62
  order_field: secret_order
47
63
  max_rows: 10
48
64
  columns:
49
- - {key: name, label: '$t:secretName', control: text, format: upper_identifier}
65
+ - {key: name, label: '$t:secretName', control: text}
50
66
  - {key: description, label: '$t:secretDescription', control: text}
51
67
  applies_to: [integrations]
52
68
  - key: prompt_content
@@ -7,6 +7,8 @@
7
7
  "newNotification": "New notification 1",
8
8
  "newNotificationNumbered": "New notification {index}",
9
9
  "title": "Notification name",
10
+ "deliveryGroup": "Notification delivery",
11
+ "messageAndAction": "Message and action",
10
12
  "trigger": "Trigger",
11
13
  "recipients": "Recipients",
12
14
  "channels": "Channels",
@@ -7,6 +7,8 @@
7
7
  "newNotification": "新通知 1",
8
8
  "newNotificationNumbered": "新通知 {index}",
9
9
  "title": "通知名称",
10
+ "deliveryGroup": "通知安排",
11
+ "messageAndAction": "内容与操作",
10
12
  "trigger": "触发时机",
11
13
  "recipients": "接收对象",
12
14
  "channels": "通知方式",
@@ -14,11 +14,17 @@ sections:
14
14
  reorder: false
15
15
  header: {variant: detail, title: {field: title, editable: true}}
16
16
  body:
17
- - {kind: field, field: trigger}
18
- - {kind: field, field: recipients}
19
- - {kind: field, field: channels}
20
- - {kind: field, field: message}
21
- - {kind: field, field: action_target}
17
+ - kind: group
18
+ title: $t:deliveryGroup
19
+ items:
20
+ - {kind: field, field: trigger}
21
+ - {kind: field, field: recipients}
22
+ - {kind: field, field: channels}
23
+ - kind: group
24
+ title: $t:messageAndAction
25
+ items:
26
+ - {kind: field, field: message}
27
+ - {kind: field, field: action_target}
22
28
  create:
23
29
  id_field: id
24
30
  defaults: {title: '', channels: [in_app]}
@@ -30,7 +36,13 @@ sections:
30
36
  fields:
31
37
  - {key: title, label: $t:title, control: text, required: true, applies_to: [notifications]}
32
38
  - {key: trigger, label: $t:trigger, control: textarea, required: true, applies_to: [notifications]}
33
- - {key: recipients, label: $t:recipients, control: token_list, required: true, applies_to: [notifications]}
39
+ - key: recipients
40
+ label: $t:recipients
41
+ control: token_list
42
+ token_add_mode: menu
43
+ required: true
44
+ options_from_panel: {panel_type: role_access, section_id: roles}
45
+ applies_to: [notifications]
34
46
  - key: channels
35
47
  required: true
36
48
  label: $t:channels
@@ -30,5 +30,16 @@
30
30
  "members": "Pages in group",
31
31
  "map": "Page map",
32
32
  "guidance": "Walk through the user task and check that page content, actions and navigation form a coherent path without gaps or dead ends. Map positions and groups only organize the view.",
33
- "shared": "Shared specification"
33
+ "shared": "Shared styles",
34
+ "sharedLayout": "Layout",
35
+ "sharedBrand": "Brand identity",
36
+ "sharedBrandName": "Brand name",
37
+ "sharedBrandDescription": "Appearance",
38
+ "sharedMarkRef": "Mark reference",
39
+ "sharedNavigation": "Navigation",
40
+ "sharedNavigationGroup": "Navigation group",
41
+ "sharedIconRef": "Icon reference",
42
+ "sharedNavigationId": "Navigation ID",
43
+ "sharedComponents": "Shared components",
44
+ "sharedSource": "Visual style source"
34
45
  }
@@ -30,5 +30,16 @@
30
30
  "members": "分区内页面",
31
31
  "map": "页面地图",
32
32
  "guidance": "从用户要完成的任务出发,检查页面内容、操作和跳转是否连贯,有没有遗漏或死路;地图位置和分区只影响组织方式。",
33
- "shared": "公共规格"
33
+ "shared": "公共样式",
34
+ "sharedLayout": "布局",
35
+ "sharedBrand": "品牌标识",
36
+ "sharedBrandName": "品牌名称",
37
+ "sharedBrandDescription": "外观说明",
38
+ "sharedMarkRef": "标识引用",
39
+ "sharedNavigation": "导航",
40
+ "sharedNavigationGroup": "导航分组",
41
+ "sharedIconRef": "图标引用",
42
+ "sharedNavigationId": "导航编号",
43
+ "sharedComponents": "共享组件",
44
+ "sharedSource": "视觉风格来源"
34
45
  }
@@ -55,4 +55,26 @@ ui:
55
55
  edges: {path: connections, order: connection_order, source: source_page_id, target: target_page_id, label: label, hotspot: source_element_id, hotspot_label: source_element_label, context: preview_context, new_label: '$t:newConnectionLabel'}
56
56
  frames: {path: canvas_sections, label: label, members: page_ids, position: canvas_position, size: canvas_size}
57
57
  children:
58
- - {component: structured_data, id: shared-specification, title: $t:shared, source: common_spec}
58
+ - component: structured_data
59
+ id: shared-specification
60
+ title: $t:shared
61
+ source: common_spec
62
+ read_fields:
63
+ - {key: layout, label: '$t:sharedLayout'}
64
+ - key: logo
65
+ label: $t:sharedBrand
66
+ fields:
67
+ - {key: name, label: '$t:sharedBrandName'}
68
+ - {key: description, label: '$t:sharedBrandDescription'}
69
+ - {key: mark_ref, label: '$t:sharedMarkRef', collapsed: true}
70
+ - key: navigation
71
+ label: $t:sharedNavigation
72
+ item_label_field: label
73
+ fields:
74
+ - {key: target_page_id, label: '$t:target', options_from_section: pages}
75
+ - {key: group, label: '$t:sharedNavigationGroup'}
76
+ - {key: icon_ref, label: '$t:sharedIconRef', collapsed: true}
77
+ - {key: id, label: '$t:sharedNavigationId', collapsed: true}
78
+ - {key: shared_components, label: '$t:sharedComponents'}
79
+ - {key: visual_pattern_refs, label: '$t:patterns', collapsed: true}
80
+ - {key: source, label: '$t:sharedSource', collapsed: true}
@@ -13,9 +13,9 @@
13
13
  "criteria": "What counts as passing?",
14
14
  "criteriaHelp": "Use observable or measurable criteria; avoid vague statements such as “a good experience”.",
15
15
  "criteriaExample": "For example: an order number is created and Pending is displayed",
16
- "verification": "How will this be verified? (optional)",
16
+ "verification": "How will this be verified?",
17
17
  "verificationHelp": "Add a method only when it is not obvious. Test code is not required.",
18
18
  "workspace": "Acceptance criteria",
19
- "group": "Group (optional)",
19
+ "group": "Group",
20
20
  "groupExample": "For example: Business flow, AI capabilities"
21
21
  }
@@ -13,9 +13,9 @@
13
13
  "criteria": "怎样才算通过?",
14
14
  "criteriaHelp": "写出用户能看到、系统能确认或可以衡量的标准,避免“体验良好”一类模糊描述。",
15
15
  "criteriaExample": "例如:生成订单号并显示待处理",
16
- "verification": "如何确认?(可选)",
16
+ "verification": "如何确认?",
17
17
  "verificationHelp": "只有检查方法不明显时才补充,不需要写测试代码。",
18
18
  "workspace": "验收标准",
19
- "group": "分组(可选)",
19
+ "group": "分组",
20
20
  "groupExample": "例如:业务流程、AI 能力"
21
21
  }
@@ -51,13 +51,16 @@ fields:
51
51
  description: $t:verificationHelp
52
52
  applies_to: [requirements]
53
53
  ui:
54
- component: record_workspace
55
- guidance: "$t:guidance"
54
+ component: record_board
55
+ guidance: $t:guidance
56
56
  sidebar_icon: clipboard-check
57
- navigation_layout: list
58
- navigation_group_by: group
59
57
  id: acceptance-workspace
60
58
  title: $t:workspace
61
- sources: [requirements]
62
- children:
63
- - {component: record_inspector, id: acceptance-editor}
59
+ source: requirements
60
+ board:
61
+ label: title
62
+ description: pass_criteria
63
+ group: group
64
+ body_fields: [condition, pass_criteria, verification]
65
+ overview: false
66
+ detail_fields: []
@@ -9,8 +9,8 @@
9
9
  "newRoleNumbered": "New role {index}",
10
10
  "title": "Role name",
11
11
  "titleExample": "For example: sales manager",
12
- "assignment": "Who receives this role?",
13
- "assignmentHelp": "Choose how this role is granted. Only Other requires your own rule.",
12
+ "assignment": "How is this role assigned?",
13
+ "assignmentHelp": "Choose how this role is assigned. If you select Other, describe how the role is assigned.",
14
14
  "assignmentExample": "For example: granted on invitation and revoked on leaving the project",
15
15
  "registered": "Registered users",
16
16
  "granted": "Granted by an administrator",
@@ -19,9 +19,9 @@
19
19
  "deny": "Denies",
20
20
  "capability": "Capability",
21
21
  "capabilityExample": "For example: approve orders or view project members",
22
- "condition": "Applies when (optional)",
22
+ "condition": "Applies when",
23
23
  "conditionExample": "For example: only customers assigned to this person and still being followed up",
24
- "requirements": "Before performing the action (optional)",
24
+ "requirements": "Before performing the action",
25
25
  "confirm": "Confirm again",
26
26
  "reauthenticate": "Verify identity again",
27
27
  "other": "Other",
@@ -33,7 +33,7 @@
33
33
  "inherits": "Inherits permissions",
34
34
  "childRole": "Child role",
35
35
  "parentRole": "Source role",
36
- "inheritanceReason": "Evidence for inheritance (optional)",
36
+ "inheritanceReason": "Evidence for inheritance",
37
37
  "addChildRole": "Add child role",
38
38
  "guidance": "Check what each role can do and which data it can access, looking for excessive or missing permissions. Set one source role only when reuse is needed; grants remain independent.",
39
39
  "graphHint": "Connect the child to its source role. Return to details for local permissions and read-only inherited sources.",
@@ -9,8 +9,8 @@
9
9
  "newRoleNumbered": "新角色 {index}",
10
10
  "title": "角色名称",
11
11
  "titleExample": "例如:销售经理",
12
- "assignment": "谁会拥有这个角色?",
13
- "assignmentHelp": "选择这个角色如何获得;只有“其他”需要自己填写规则。",
12
+ "assignment": "如何授予这个角色?",
13
+ "assignmentHelp": "选择角色的授予方式;选择“其他”时,请填写授予规则。",
14
14
  "assignmentExample": "例如:受邀加入项目后拥有,离开项目时失去",
15
15
  "registered": "注册用户",
16
16
  "granted": "由管理员授予",
@@ -19,9 +19,9 @@
19
19
  "deny": "禁止",
20
20
  "capability": "权限内容",
21
21
  "capabilityExample": "例如:审批订单、查看项目成员",
22
- "condition": "适用条件(可选)",
22
+ "condition": "适用条件",
23
23
  "conditionExample": "例如:仅限自己负责的客户,且客户仍在跟进中",
24
- "requirements": "操作前需要(可选)",
24
+ "requirements": "操作前需要",
25
25
  "confirm": "再次确认",
26
26
  "reauthenticate": "重新验证身份",
27
27
  "other": "其他",
@@ -33,7 +33,7 @@
33
33
  "inherits": "继承权限",
34
34
  "childRole": "子角色",
35
35
  "parentRole": "来源角色",
36
- "inheritanceReason": "继承依据(可选)",
36
+ "inheritanceReason": "继承依据",
37
37
  "addChildRole": "添加子角色",
38
38
  "guidance": "检查各角色能做什么、作用于哪些数据,是否存在权限过多或遗漏;仅在确需复用时指定一个来源角色,授予规则仍独立。",
39
39
  "graphHint": "从子角色连向来源角色;返回详情查看本角色权限及只读的继承来源。",
@@ -58,8 +58,10 @@ The question panel remains the interaction surface: put a concise proposal,
58
58
  its useful context and the decision to make in the card's `prompt`, with
59
59
  appropriate `choices` or free-text input. Do not put the proposed answer into
60
60
  the user's `answer` or use `detail` as a substitute for visible question text.
61
- In forward design, leave new `detail` empty unless it preserves an actual
62
- user-supplied explanation or a faithful summary of explicit user evidence.
61
+ Free-text questions have one response field: `answer`. Keep their `detail`
62
+ empty; any user-supplied explanation belongs with that answer. Choice questions
63
+ may use `detail` for an actual user-supplied explanation or a faithful summary
64
+ of explicit user evidence. Do not generate a second response area for free text.
63
65
  Put your proposed scope, rationale, examples and unresolved questions in
64
66
  `prompt`, not in user-response fields. Your earlier proposal, a Producer brief,
65
67
  and another Agent's summary do not establish that the user said or confirmed
@@ -60,8 +60,11 @@ overview from representative entry points and user journeys, then include only
60
60
  material supporting context. Do not ask the user how many Bundles to scan, or
61
61
  replace the overview with component, SEO, billing or deployment inventories.
62
62
 
63
- Put a concise source-supported answer in `answer`; use `detail` for exact
64
- source locations, observation versus supported inference, and remaining limits.
63
+ Put a concise source-supported answer in `answer`. For a free-text question,
64
+ keep source locations, observation versus supported inference and remaining
65
+ limits with that answer; leave `detail` empty. A choice question may use its
66
+ optional `detail` for those qualifications. Free text has no separate supplement
67
+ input or historical supplement display.
65
68
  A supported interpretation may explain the overall product, but label it as
66
69
  inferred, not stated user intent. Do not infer commercial positioning or target
67
70
  audience merely from the presence of an admin route or a technical capability.
@@ -70,8 +73,9 @@ Reconstruction prefill is reviewable, not user confirmation; it is not a license
70
73
  to guess answers during ordinary questioning.
71
74
 
72
75
  If evidence supports part of the answer, retain that part and identify remaining
73
- unknowns in `detail`. Split independent topics rather than let one known fact
74
- mask a separate unknown. Leave genuinely unsupported answers empty. Missing
76
+ unknowns in the same answer (or `detail` for a choice). Split independent topics
77
+ rather than let one known fact mask a separate unknown. Leave genuinely
78
+ unsupported answers empty. Missing
75
79
  information in one summary document is not proof of absence in the repository:
76
80
  inspect a relevant source when the missing fact matters. Preserve user answers
77
81
  and explain conflicting source evidence without replacing their decisions.
@@ -79,8 +83,9 @@ and explain conflicting source evidence without replacing their decisions.
79
83
  Before closing, read the cards as a whole: can a reader understand the product's
80
84
  purpose, intended users, main scenario and scope to the extent the source permits?
81
85
  Are later details supporting that account rather than displacing it? Check that
82
- `detail` does not contain a verified answer missing from `answer`, that unknowns
83
- remain honest, and that each inference is supported. This is an Agent self-check,
86
+ free-text `detail` is empty, choice `detail` does not contain a verified answer
87
+ missing from `answer`, unknowns remain honest, and each inference is supported.
88
+ This is an Agent self-check,
84
89
  not a new validator or host gate.
85
90
 
86
91
  ## Fixed-card contract
@@ -172,7 +177,7 @@ existing panel, carry the fixed-card definition and prior user decisions
172
177
  forward into the complete canonical state without adding them to the new round.
173
178
 
174
179
  - `value` is the stable selection token. `label` is visible text. Answers always store `value`, never a label, recommendation suffix, or invented internal token.
175
- - `single` stores one `value`; `multiple` stores comma-separated `value`s; `text` stores its substantive free-text response in `answer` and has no choices. A known answer must not exist only in `detail`; the answer should remain understandable without opening the supplementary explanation.
180
+ - `single` stores one `value`; `multiple` stores comma-separated `value`s; `text` stores its complete free-text response in `answer`, has no choices and leaves `detail` empty. The answer, including useful qualifications, is read and edited in one place.
176
181
  - `recommended` is the only recommendation mechanism. Do not add a question-level `suggest` field or append `(推荐)` to stored labels.
177
182
  - Dynamic-card `round` controls the FE's round grouping; the latest round renders
178
183
  first. Assign a nonnegative integer explicitly: use 0 for the first dynamic
@@ -183,7 +188,10 @@ forward into the complete canonical state without adding them to the new round.
183
188
  values to 0 and truncates fractions for grouping only. Preserve those saved
184
189
  values on unrelated edits rather than silently renumbering history. Fixed
185
190
  cards do not participate in round-number allocation.
186
- - `detail` records the user's optional explanation, constraints, or source/provenance notes in reconstruction; it supplements rather than duplicates the answer. Preserve older detail-only records without automatically promoting uncertainty or provenance into an answer. When the user answers
191
+ - For a choice question, `detail` records the user's optional explanation,
192
+ constraints or source/provenance notes in reconstruction; it supplements rather
193
+ than duplicates the selection. It is not a second field for free-text questions.
194
+ Preserve unrelated saved data without automatic answer conversion. When the user answers
187
195
  a choice question with wording that does not match a rendered option, keep
188
196
  `answer` empty and preserve the exact wording in `detail`; never replace it
189
197
  with a recommended option. On dynamic cards, `rejected` means the user
@@ -66,8 +66,8 @@ properties:
66
66
  # in reconstruction belong here too, without implying user confirmation.
67
67
  # Leave genuinely unknown answers empty; never promote a proposal as an answer.
68
68
  answer: { type: string }
69
- # Optional supplementary explanation, constraints or source locations.
70
- # Do not put a known text answer only here. A choice response outside the
69
+ # Optional choice-question explanation, constraints or source locations.
70
+ # Text questions use only answer and leave detail empty. A choice response outside the
71
71
  # available options may be preserved here without inventing a selection.
72
72
  # Supplementary detail alone does not mark the question answered.
73
73
  detail: { type: string }
@@ -291,6 +291,10 @@ enters Git history, G/R/A owns ongoing cross-Bundle drift checks.
291
291
 
292
292
  ### 4. Finalize inside the same agentic loop
293
293
 
294
+ Keep `<html lang>` in the authored document's language. Fixed visual labels use
295
+ that language as described in the shared contract; source business names remain
296
+ unchanged and switching the Host UI does not translate the document.
297
+
294
298
  Once prose and provenance are complete, run the shared contract’s file-mode finalization against the already-written HTML. Do not rewrite the document or transport visual bytes through model context.
295
299
 
296
300
  If the script reports diagnostics, preserve valid content, apply the smallest
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "guidance": "Check that the PRD reflects the agreed scope and key decisions. Follow source labels back to the original design when something is wrong, or request a revision in the conversation.",
3
3
  "bundleDescription": "- **Capability**: generate or update one development-ready Web App PRD from current design evidence and user material.\n- **Resolves**: the delivery gap where product, design, engineering, test, and operations still lack one shared implementation-ready specification.\n- **Candidate when**: the user asks to generate, export, update, or inspect a complete PRD.\n- **Do not infer**: PRD assembly is an on-demand delivery action, not a required design gate and not permission to mutate owner Bundles.\n- **Output**: one stable canonical `prd.html`; Git retains history.",
4
- "contents": "Contents", "empty": "No PRD yet. Ask in the conversation to generate or revise the complete PRD.",
5
- "pending": "Pending confirmation", "legend": "Purple rail: temporary completion to keep the PRD coherent; not yet confirmed by the user",
4
+ "contents": "Contents", "empty": "No PRD yet. Ask the agent in the conversation to generate or update the complete document.",
5
+ "pending": "Pending confirmation", "legend": "Purple markers show provisional content added to fill gaps. It still needs your confirmation.",
6
6
  "questions": "Requirements", "research": "Research", "functions": "Functions", "flows": "Flows", "style": "Design style", "data": "Business data", "rules": "Business rules", "access": "Roles and access", "integration": "Integrations", "notifications": "Notifications", "quality": "Quality and acceptance", "pages": "Pages", "whiteboard": "Whiteboard", "user": "User input", "upload": "User material"
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "guidance": "核对 PRD 是否准确表达已确认的范围和关键决策;发现偏差时通过来源标签回到原设计,或在对话中提出修订。",
3
3
  "bundleDescription": "- **能力**:从当前设计证据和用户材料生成或修改一份可直接用于研发的完整 Web App PRD。\n- **解决**:产品仍缺少一份各交付角色都能直接理解、审阅和实施的统一需求文档。\n- **适用时机**:用户要求生成、导出、修改或查看完整 PRD。\n- **不要推断**:PRD 整合是按需交付动作,不是必经设计关卡,也不允许修改证据所属 Bundle。\n- **输出**:唯一稳定的 canonical `prd.html`;Git 保留历史修订。",
4
4
  "contents": "文档目录", "empty": "暂无 PRD。可以在对话中要求生成或修订完整 PRD。",
5
- "pending": "待确认", "legend": "紫色左轨:为保持 PRD 结构完整而临时补全,尚待用户确认",
5
+ "pending": "待确认", "legend": "紫色标记表示为补齐文档而暂拟的内容,仍需你确认。",
6
6
  "questions": "需求问题", "research": "调研", "functions": "功能模块", "flows": "流程设计", "style": "设计风格", "data": "业务数据", "rules": "业务规则", "access": "角色权限", "integration": "集成设计", "notifications": "通知设计", "quality": "质量验收", "pages": "页面设计", "whiteboard": "自由白板", "user": "用户说明", "upload": "用户材料"
7
7
  }
@@ -115,6 +115,12 @@ use file-mode scripts for transforms and final checks.
115
115
 
116
116
  ## File-mode finalization
117
117
 
118
+ Keep the document's `<html lang>` aligned with its authored language. The visual
119
+ script uses this existing language for fixed map captions, navigation legends
120
+ and empty-state labels (`en`/`en-*` use English; existing Chinese/default output
121
+ is retained otherwise). It does not translate source business text or follow
122
+ the Host UI language. Materialization and validation use the same document language.
123
+
118
124
  Once the prose and provenance are complete, process the already-written HTML;
119
125
  do not rewrite it for finalization. First call `run_skill_script` with
120
126
  `path: "prd.mjs"`, `args: ["materialize-visuals"]`, and both `input_file` and
@@ -61,6 +61,16 @@ const compactLabel = (value, limit = 24) => {
61
61
  return text.length <= limit ? text : `${text.slice(0, limit - 1)}…`
62
62
  }
63
63
 
64
+ const VISUAL_COPY = {
65
+ zh: { otherFunctions: '其他功能', noFunctions: '暂无功能', functionRoot: '产品功能结构', noPages: '暂无页面结构', functionMap: '功能范围图', pageMap: '页面关系图', primaryNavigation: '主要导航', relatedNavigation: '关联跳转' },
66
+ en: { otherFunctions: 'Other functions', noFunctions: 'No functions yet', functionRoot: 'Product functions', noPages: 'No page structure yet', functionMap: 'Function scope map', pageMap: 'Page map', primaryNavigation: 'Main navigation', relatedNavigation: 'Related navigation' },
67
+ }
68
+ function visualCopy(html) {
69
+ // The authored document already owns its language; Host UI never translates facts.
70
+ const tag = /<html\b[^>]*>/iu.exec(html)?.[0] ?? ''
71
+ return /^en(?:-|$)/iu.test((attribute(tag, 'lang') ?? '').trim()) ? VISUAL_COPY.en : VISUAL_COPY.zh
72
+ }
73
+
64
74
  function parseSourceJson(sourceFiles, path, diagnostics) {
65
75
  const text = sourceFiles[path]
66
76
  if (typeof text !== 'string') return undefined
@@ -160,11 +170,11 @@ function svgDocument(content, viewBox) {
160
170
  return `<svg class="prd-visual-svg" xmlns="http://www.w3.org/2000/svg" viewBox="${viewBox}" role="img"><defs><marker id="prd-arrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="#64748b"/></marker></defs>${content}</svg>`
161
171
  }
162
172
 
163
- function functionMapSvg(state) {
173
+ function functionMapSvg(state, copy) {
164
174
  const active = orderedRecords(state.functions).filter(([, item]) => item.rejected !== true)
165
175
  const groups = new Map()
166
176
  for (const [id, item] of active) {
167
- const epic = String(item.function_epic ?? '').trim() || '其他功能'
177
+ const epic = String(item.function_epic ?? '').trim() || copy.otherFunctions
168
178
  if (!groups.has(epic)) groups.set(epic, [])
169
179
  groups.get(epic).push([id, item])
170
180
  }
@@ -175,7 +185,7 @@ function functionMapSvg(state) {
175
185
  const branches = []
176
186
  let cursorY = top
177
187
  if (groups.size === 0) {
178
- branches.push({ epic: '暂无功能', functions: [], color: palette[0], centerY: 68 })
188
+ branches.push({ epic: copy.noFunctions, functions: [], color: palette[0], centerY: 68 })
179
189
  cursorY = 108
180
190
  } else for (const [index, [epic, functions]] of [...groups].entries()) {
181
191
  const leaves = functions.map(([id, item], leafIndex) => ({ id, item, y: cursorY + leafIndex * rowHeight }))
@@ -190,7 +200,7 @@ function functionMapSvg(state) {
190
200
  parts.push(`<path d="M ${rootX + rootWidth} ${rootY + 34} C 238 ${rootY + 34}, 246 ${branch.centerY}, ${epicX} ${branch.centerY}" fill="none" stroke="${branch.color}" stroke-width="3"/>`)
191
201
  for (const leaf of branch.functions) parts.push(`<path d="M ${epicX + epicWidth} ${branch.centerY} C 520 ${branch.centerY}, 530 ${leaf.y + 18}, ${leafX} ${leaf.y + 18}" fill="none" stroke="${branch.color}" stroke-width="2" opacity="0.72"/>`)
192
202
  }
193
- parts.push(`<rect x="${rootX}" y="${rootY}" width="${rootWidth}" height="68" rx="18" fill="#4c1d95" stroke="#4c1d95"/><text x="${rootX + rootWidth / 2}" y="${rootY + 41}" text-anchor="middle" font-family="system-ui,sans-serif" font-size="17" font-weight="700" fill="#ffffff">${escapeHtml(compactLabel(state.title ?? '产品功能结构', 16))}</text>`)
203
+ parts.push(`<rect x="${rootX}" y="${rootY}" width="${rootWidth}" height="68" rx="18" fill="#4c1d95" stroke="#4c1d95"/><text x="${rootX + rootWidth / 2}" y="${rootY + 41}" text-anchor="middle" font-family="system-ui,sans-serif" font-size="17" font-weight="700" fill="#ffffff">${escapeHtml(state.title == null ? copy.functionRoot : compactLabel(state.title, 16))}</text>`)
194
204
  for (const branch of branches) {
195
205
  parts.push(`<rect x="${epicX}" y="${branch.centerY - 24}" width="${epicWidth}" height="48" rx="14" fill="${branch.color}" stroke="${branch.color}"/><text x="${epicX + epicWidth / 2}" y="${branch.centerY + 5}" text-anchor="middle" font-family="system-ui,sans-serif" font-size="15" font-weight="700" fill="#ffffff">${escapeHtml(compactLabel(branch.epic, 18))}</text>`)
196
206
  for (const leaf of branch.functions) {
@@ -202,7 +212,7 @@ function functionMapSvg(state) {
202
212
  return svgDocument(parts.join(''), `0 0 ${width} ${height}`)
203
213
  }
204
214
 
205
- function pageMapSvg(state) {
215
+ function pageMapSvg(state, copy) {
206
216
  const pages = record(state.pages)
207
217
  const ordered = orderedRecords(pages, state.page_order)
208
218
  const ids = ordered.map(([id]) => id)
@@ -254,7 +264,7 @@ function pageMapSvg(state) {
254
264
  const maxDepth = Math.max(0, ...depths.values())
255
265
  const height = top + (maxDepth + 1) * cardHeight + maxDepth * verticalGap + 72
256
266
  const parts = []
257
- parts.push('<path d="M 24 18 H 60" stroke="#6d28d9" stroke-width="3" marker-end="url(#prd-arrow)"/><text x="70" y="22" font-family="system-ui,sans-serif" font-size="12" fill="#475569">主要导航</text><path d="M 170 18 H 206" stroke="#94a3b8" stroke-width="1.5" stroke-dasharray="5 5"/><text x="216" y="22" font-family="system-ui,sans-serif" font-size="12" fill="#475569">关联跳转</text>')
267
+ parts.push(`<path d="M 24 18 H 60" stroke="#6d28d9" stroke-width="3" marker-end="url(#prd-arrow)"/><text x="70" y="22" font-family="system-ui,sans-serif" font-size="12" fill="#475569">${escapeHtml(copy.primaryNavigation)}</text><path d="M 170 18 H 206" stroke="#94a3b8" stroke-width="1.5" stroke-dasharray="5 5"/><text x="216" y="22" font-family="system-ui,sans-serif" font-size="12" fill="#475569">${escapeHtml(copy.relatedNavigation)}</text>`)
258
268
  for (const edge of connections.filter(edge => !primaryEdges.has(edge.id))) {
259
269
  const from = positions.get(edge.source), to = positions.get(edge.target)
260
270
  if (from === undefined || to === undefined) continue
@@ -275,7 +285,7 @@ function pageMapSvg(state) {
275
285
  const isRoot = id === primaryRoot
276
286
  parts.push(`<g data-prd-page-id="${escapeHtml(id)}"><rect x="${position.x}" y="${position.y}" width="${cardWidth}" height="${cardHeight}" rx="12" fill="${isRoot ? '#f5f3ff' : '#ffffff'}" stroke="${isRoot ? '#6d28d9' : '#94a3b8'}" stroke-width="${isRoot ? '2' : '1.2'}"/><text x="${position.x + 14}" y="${position.y + 31}" font-family="system-ui,sans-serif" font-size="14" font-weight="700" fill="#0f172a">${escapeHtml(compactLabel(page.name ?? id, 14))}</text><rect x="${position.x + 14}" y="${position.y + 45}" width="${Math.max(48, typeLabel.length * 8 + 16)}" height="20" rx="10" fill="#f1f5f9"/><text x="${position.x + 22}" y="${position.y + 59}" font-family="system-ui,sans-serif" font-size="10.5" fill="#475569">${escapeHtml(typeLabel)}</text></g>`)
277
287
  }
278
- if (ordered.length === 0) parts.push('<rect x="48" y="48" width="864" height="80" rx="12" fill="#f8fafc" stroke="#cbd5e1"/><text x="480" y="96" text-anchor="middle" font-family="system-ui,sans-serif" font-size="14" fill="#64748b">暂无页面结构</text>')
288
+ if (ordered.length === 0) parts.push(`<rect x="48" y="48" width="864" height="80" rx="12" fill="#f8fafc" stroke="#cbd5e1"/><text x="480" y="96" text-anchor="middle" font-family="system-ui,sans-serif" font-size="14" fill="#64748b">${escapeHtml(copy.noPages)}</text>`)
279
289
  return svgDocument(parts.join(''), `0 0 ${width} ${height}`)
280
290
  }
281
291
 
@@ -304,9 +314,9 @@ function htmlPreview(item) {
304
314
  return `<figure class="prd-visual-figure" data-prd-source-ref="${escapeHtml(item.path)}" data-prd-source-digest="${digest(item.content)}" data-prd-projection-digest="${digest(item.screenshot)}"${dependencies}><figcaption class="prd-visual-caption">${escapeHtml(item.title)}</figcaption><img class="prd-page-image" loading="lazy" alt="${escapeHtml(item.title)}" width="${PAGE_VIEWPORT.width * PAGE_VIEWPORT.deviceScaleFactor}" height="${PAGE_VIEWPORT.height * PAGE_VIEWPORT.deviceScaleFactor}" src="${item.screenshot}"></figure>`
305
315
  }
306
316
 
307
- function renderVisual(item) {
308
- if (item.kind === 'function-map') return `<figure class="prd-visual-figure" data-prd-source-ref="${escapeHtml(item.path)}"><figcaption class="prd-visual-caption">功能范围图</figcaption>${functionMapSvg(item.state)}</figure>`
309
- if (item.kind === 'page-map') return `<figure class="prd-visual-figure" data-prd-source-ref="${escapeHtml(item.path)}"><figcaption class="prd-visual-caption">页面关系图</figcaption>${pageMapSvg(item.state)}</figure>`
317
+ function renderVisual(item, copy) {
318
+ if (item.kind === 'function-map') return `<figure class="prd-visual-figure" data-prd-source-ref="${escapeHtml(item.path)}"><figcaption class="prd-visual-caption">${escapeHtml(copy.functionMap)}</figcaption>${functionMapSvg(item.state, copy)}</figure>`
319
+ if (item.kind === 'page-map') return `<figure class="prd-visual-figure" data-prd-source-ref="${escapeHtml(item.path)}"><figcaption class="prd-visual-caption">${escapeHtml(copy.pageMap)}</figcaption>${pageMapSvg(item.state, copy)}</figure>`
310
320
  if (item.kind === 'bpmn') {
311
321
  if (typeof item.renderedSvg !== 'string') throw new Error(`BPMN visual ${JSON.stringify(item.path)} has not been rendered`)
312
322
  return `<figure class="prd-visual-figure" data-prd-source-ref="${escapeHtml(item.path)}" data-prd-source-digest="${digest(item.content)}" data-prd-projection-digest="${digest(item.renderedSvg)}"><figcaption class="prd-visual-caption">${escapeHtml(item.title)}</figcaption>${item.renderedSvg}</figure>`
@@ -323,7 +333,7 @@ function replaceVisualRegion(html, name, content) {
323
333
 
324
334
  const DISTRIBUTED_VISUAL_REGIONS = new Set(['all_bpmn', 'all_page_prototypes'])
325
335
 
326
- function replaceDistributedVisualRegion(html, name, items, diagnostics) {
336
+ function replaceDistributedVisualRegion(html, name, items, diagnostics, copy) {
327
337
  const regionExpression = new RegExp(`(<!--\\s*prd-visual:${name}:start\\s*-->)(?<body>[\\s\\S]*?)(<!--\\s*prd-visual:${name}:end\\s*-->)`, 'iu')
328
338
  const region = regionExpression.exec(html)
329
339
  if (region === null) throw new Error(`prd.html must keep one ordered ${name} visual region`)
@@ -336,7 +346,7 @@ function replaceDistributedVisualRegion(html, name, items, diagnostics) {
336
346
  diagnostics.push(`visual region ${JSON.stringify(name)} must place exactly one inline visual reference for ${JSON.stringify(item.path)}`)
337
347
  continue
338
348
  }
339
- body = body.replace(expression, (_match, start, end) => `${start}\n${renderVisual(item)}\n${end}`)
349
+ body = body.replace(expression, (_match, start, end) => `${start}\n${renderVisual(item, copy)}\n${end}`)
340
350
  }
341
351
  for (const match of body.matchAll(/<!--\s*prd-visual-item:(?<path>[A-Za-z0-9._/-]+):start\s*-->/giu)) {
342
352
  const path = match.groups?.path ?? ''
@@ -346,6 +356,7 @@ function replaceDistributedVisualRegion(html, name, items, diagnostics) {
346
356
  }
347
357
 
348
358
  async function materializeVisuals(html, sourceFiles) {
359
+ const copy = visualCopy(html)
349
360
  const { plan, diagnostics } = visualPlan(sourceFiles)
350
361
  if (diagnostics.length > 0) return { html, diagnostics }
351
362
  try {
@@ -365,8 +376,8 @@ async function materializeVisuals(html, sourceFiles) {
365
376
  try {
366
377
  for (const name of VISUAL_REGIONS) {
367
378
  outputHtml = DISTRIBUTED_VISUAL_REGIONS.has(name)
368
- ? replaceDistributedVisualRegion(outputHtml, name, plan[name], diagnostics)
369
- : replaceVisualRegion(outputHtml, name, plan[name].map(renderVisual).join('\n'))
379
+ ? replaceDistributedVisualRegion(outputHtml, name, plan[name], diagnostics, copy)
380
+ : replaceVisualRegion(outputHtml, name, plan[name].map(item => renderVisual(item, copy)).join('\n'))
370
381
  }
371
382
  } catch (error) {
372
383
  diagnostics.push(error instanceof Error ? error.message : String(error))
@@ -480,6 +491,7 @@ function protectedBlocks(body) {
480
491
  }
481
492
 
482
493
  function htmlDiagnostics(state, html, template, sourceFiles) {
494
+ const copy = visualCopy(html)
483
495
  const diagnostics = []
484
496
  const lower = html.toLowerCase()
485
497
  if (!lower.includes('<html') || !lower.includes('</html>') || !lower.includes('<body') || !lower.includes('</body>')) diagnostics.push('prd.html must be a complete HTML document')
@@ -610,7 +622,7 @@ function htmlDiagnostics(state, html, template, sourceFiles) {
610
622
  const expected = visual.plan[name] ?? []
611
623
  const expectedRefs = expected.map(item => item.path)
612
624
  if (!DISTRIBUTED_VISUAL_REGIONS.has(name) && !expected.some(item => item.kind === 'html')) {
613
- const expectedMarkup = expected.map(renderVisual).join('\n')
625
+ const expectedMarkup = expected.map(item => renderVisual(item, copy)).join('\n')
614
626
  if (region.trim() !== expectedMarkup.trim()) diagnostics.push(`visual region ${JSON.stringify(name)} does not match its deterministic owner projection`)
615
627
  }
616
628
  if (DISTRIBUTED_VISUAL_REGIONS.has(name)) {
@@ -661,7 +673,7 @@ function htmlDiagnostics(state, html, template, sourceFiles) {
661
673
  if (attribute(figureTag, 'data-prd-projection-digest') !== digest(svg)) diagnostics.push(`BPMN visual ${JSON.stringify(ref)} projection integrity check failed`)
662
674
  }
663
675
  } else if (item !== undefined) {
664
- const expectedSvg = item.kind === 'function-map' ? functionMapSvg(item.state) : pageMapSvg(item.state)
676
+ const expectedSvg = item.kind === 'function-map' ? functionMapSvg(item.state, copy) : pageMapSvg(item.state, copy)
665
677
  if (!figure.includes(expectedSvg)) diagnostics.push(`visual projection ${JSON.stringify(ref)} does not match its deterministic owner projection`)
666
678
  }
667
679
  }