openyida 2026.9.16 → 2026.9.18

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 (102) hide show
  1. package/README.md +2 -2
  2. package/bin/yida.js +4 -1
  3. package/lib/app/app-list.js +7 -3
  4. package/lib/app/application-entry-urls.js +31 -0
  5. package/lib/app/canvas-compile.js +6 -0
  6. package/lib/app/canvas-icon-exports.json +6160 -0
  7. package/lib/app/canvas-icon-guard.js +87 -0
  8. package/lib/app/canvas-navigation-guard.js +84 -0
  9. package/lib/app/canvas-path-guard.js +78 -0
  10. package/lib/app/canvas-theme-guard.js +68 -1
  11. package/lib/app/check-prd-completeness.js +7 -0
  12. package/lib/app/create-app.js +4 -1
  13. package/lib/asset/ai-image.js +21 -7
  14. package/lib/asset/asset-cmd.js +7 -5
  15. package/lib/asset/asset-execution.js +79 -0
  16. package/lib/asset/asset-plan.js +23 -3
  17. package/lib/asset/asset-resolve.js +44 -7
  18. package/lib/asset/asset-status.js +5 -4
  19. package/lib/asset/host-capabilities.js +11 -2
  20. package/lib/asset/url-verify.js +19 -4
  21. package/lib/connector/connector-test.js +19 -5
  22. package/lib/connector/contract.js +3 -1
  23. package/lib/core/agent-capabilities.js +2 -1
  24. package/lib/core/command-manifest.js +46 -16
  25. package/lib/core/locales/en.js +12 -1
  26. package/lib/core/locales/zh.js +12 -1
  27. package/lib/core/sample.js +23 -7
  28. package/lib/design-plan/entry-navigation.js +9 -3
  29. package/lib/design-plan/init.js +13 -6
  30. package/lib/design-plan/materialize.js +15 -5
  31. package/lib/design-plan/navigation-policy.js +38 -0
  32. package/lib/design-plan/normalize.js +24 -0
  33. package/lib/design-plan/parallel.js +9 -3
  34. package/lib/design-plan/patch.js +10 -2
  35. package/lib/design-plan/preview.js +3 -2
  36. package/lib/design-plan/visual-policy.js +17 -0
  37. package/lib/process/create-process.js +44 -5
  38. package/lib/samples/openyida-scaffold/canvas-admin-entry.jsx +62 -0
  39. package/lib/samples/openyida-scaffold/canvas-form-drawer.canvas.jsx +3 -2
  40. package/lib/samples/openyida-scaffold/canvas-nav/content.jsx +93 -13
  41. package/lib/samples/openyida-scaffold/canvas-nav/data.jsx +23 -8
  42. package/lib/samples/openyida-scaffold/canvas-nav/top.jsx +10 -5
  43. package/lib/samples/openyida-scaffold/canvas-navigation.jsx +56 -0
  44. package/lib/samples/openyida-scaffold/canvas-view-state.jsx +74 -0
  45. package/package.json +1 -1
  46. package/yida-skills/SKILL.md +12 -10
  47. package/yida-skills/skills/yida-app/SKILL.md +16 -10
  48. package/yida-skills/skills/yida-app/references/entry-navigation.md +27 -6
  49. package/yida-skills/skills/yida-app/workflow/parallel-work.md +8 -8
  50. package/yida-skills/skills/yida-app/workflow/plan/step-4-deliver.md +10 -12
  51. package/yida-skills/skills/yida-app/workflow/plan/workflow.md +2 -2
  52. package/yida-skills/skills/yida-app/workflow/step-2-design.md +4 -2
  53. package/yida-skills/skills/yida-app/workflow/step-7-page-code.md +9 -5
  54. package/yida-skills/skills/yida-app/workflow/step-8-publish-navigation.md +5 -3
  55. package/yida-skills/skills/yida-app/workflow/step-9-output-finish.md +38 -11
  56. package/yida-skills/skills/yida-canvas-custom-page/SKILL.md +11 -2
  57. package/yida-skills/skills/yida-canvas-custom-page/references/canvas-style-implementation-guide.md +14 -6
  58. package/yida-skills/skills/yida-canvas-custom-page/references/canvas-theme-provider.md +27 -1
  59. package/yida-skills/skills/yida-canvas-custom-page/references/component-library-guide.md +11 -1
  60. package/yida-skills/skills/yida-canvas-custom-page/references/navigation-and-entry-guide.md +98 -71
  61. package/yida-skills/skills/yida-canvas-custom-page/references/page-generation-guide.md +4 -2
  62. package/yida-skills/skills/yida-canvas-custom-page/references/view-state-recovery.md +52 -0
  63. package/yida-skills/skills/yida-canvas-custom-page/scripts/build-canvas-theme.js +10 -1
  64. package/yida-skills/skills/yida-canvas-custom-page/scripts/canvas-theme-provider.template.jsx +62 -6
  65. package/yida-skills/skills/yida-canvas-data-binding/SKILL.md +2 -0
  66. package/yida-skills/skills/yida-canvas-data-binding/references/business-action-permissions.md +31 -0
  67. package/yida-skills/skills/yida-create-app/SKILL.md +2 -0
  68. package/yida-skills/skills/yida-create-process/SKILL.md +7 -0
  69. package/yida-skills/skills/yida-custom-page/SKILL.md +2 -0
  70. package/yida-skills/skills/yida-custom-page/references/design-system.md +1 -1
  71. package/yida-skills/skills/yida-design/SKILL.md +2 -0
  72. package/yida-skills/skills/yida-design/references/ask-human-interaction-contract.md +19 -15
  73. package/yida-skills/skills/yida-design/references/asset-workflow.md +4 -2
  74. package/yida-skills/skills/yida-design/references/navigation-decision.md +11 -3
  75. package/yida-skills/skills/yida-design/references/page-continuity.md +44 -0
  76. package/yida-skills/skills/yida-design/references/style-design-selection.md +13 -1
  77. package/yida-skills/skills/yida-design/references/visual-decision-engine.md +5 -28
  78. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/SKILL.md +1 -1
  79. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-compact-schema.md +17 -3
  80. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-schema.md +4 -2
  81. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/visual-design.md +2 -0
  82. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/visual-theme-selection.md +1 -1
  83. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/render_build_plan.py +2 -1
  84. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-modular-clarity.md +1 -1
  85. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/matrix-grid-focus.md +2 -2
  86. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/ribbon-ledger-lift.md +1 -1
  87. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/segmented-meter-clarity.md +1 -1
  88. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/split-rail-precision.md +1 -1
  89. package/yida-skills/skills/yida-design/workflow/output-design.md +4 -2
  90. package/yida-skills/skills/yida-design/workflow/step-2-theme-system.md +3 -2
  91. package/yida-skills/skills/yida-design/workflow/step-4-wireframe-interaction.md +1 -1
  92. package/yida-skills/skills/yida-image-assets/SKILL.md +35 -9
  93. package/yida-skills/skills/yida-image-assets/references/manifest-contract.md +13 -10
  94. package/yida-skills/skills/yida-image-assets/references/source-policy.md +4 -4
  95. package/yida-skills/skills/yida-login/SKILL.md +2 -0
  96. package/yida-skills/skills/yida-nav-shell/SKILL.md +13 -6
  97. package/yida-skills/skills/yida-nav-shell/references/nav-shell-patterns.md +70 -133
  98. package/yida-skills/skills/yida-prd/SKILL.md +1 -1
  99. package/yida-skills/skills/yida-prd/workflow/step-2-information-architecture.md +1 -1
  100. package/yida-skills/skills/yida-publish-page/SKILL.md +3 -0
  101. package/yida-skills/skills/yida-requirement-analysis/references/handoff.md +5 -1
  102. package/yida-skills/skills-index.json +2 -2
package/README.md CHANGED
@@ -491,7 +491,7 @@ Run `openyida --help` or `openyida <command> --help` for detailed usage.
491
491
  | `openyida connector update-action --connector-id <id> --action <operationId> --query-json JSON --confirm` | Safely update action query defaults |
492
492
  | `openyida connector list-actions <id>` | List actions |
493
493
  | `openyida connector delete-action <id> <operation-id>` | Delete an action |
494
- | `openyida connector test --connector-id <id> --action <actionId> [--path-json JSON] [--query-json JSON] [--header-json JSON] [--body-json JSON] [--account-id <id>] [--system-token-app <appType>]` | Test an action |
494
+ | `openyida connector test --connector-id <id> --action <actionId> [--path-json JSON] [--query-json JSON] [--header-json JSON] [--body-json JSON] [--account-id <id>] [--system-token-app <appType>] [--ignore-defaults]` | Test an action |
495
495
  | `openyida connector list-connections <id>` | List auth connections |
496
496
  | `openyida connector create-connection <id> <name> [--interactive]` | Create an auth connection |
497
497
  | `openyida connector smart-create --curl "..."` | Generate a redacted action draft from cURL (no remote create) |
@@ -543,7 +543,7 @@ Run `openyida --help` or `openyida <command> --help` for detailed usage.
543
543
 
544
544
  #### Connector Safety and Real E2E
545
545
 
546
- `connector test` keeps the legacy flat `--params` option, but dispatches each key only to the location proven by the action schema. Unknown or ambiguous keys fail closed. Authenticated connectors require `--account-id`, and that account must belong to the selected connector. The test response follows the frontend canonical contract `{statusLine,responseHeaders,content}`; unknown envelopes and non-2xx status lines are failures.
546
+ `connector test` keeps the legacy flat `--params` option, but dispatches each key only to the location proven by the action schema. Unknown or ambiguous keys fail closed. Authenticated connectors require `--account-id`, and that account must belong to the selected connector. The test response follows the frontend canonical contract `{statusLine,responseHeaders,content}`; unknown envelopes and non-2xx status lines are failures. With `--ignore-defaults`, the test starts from empty parameter sets: saved default values from the action definition (including sensitive placeholder values such as documented `***` samples) are ignored for the run, and a warning is printed when a non-empty systemToken default exists. Declared systemToken actions still require `--system-token-app`, target-trust checks still apply, and explicitly provided systemToken values are still rejected.
547
547
 
548
548
  `connector update-action --connector-id <id> --action <operationId> --query-json '{"currentPage":"1"}' --confirm` is the narrow safe path for editing existing query defaults. It requires a complete connector/action preflight, changes only declared query defaults mirrored in `inputs` and `parameters`, submits the complete action collection once, and verifies an unchanged connector fingerprint, action count, non-target actions, and stable IDs. Missing/empty/unknown parameters, duplicate IDs, incomplete readback, and unknown write outcomes fail closed without automatic retry. `add-action` no longer overwrites an existing action ID; use `update-action` for query-only edits.
549
549
 
package/bin/yida.js CHANGED
@@ -697,7 +697,10 @@ async function main() {
697
697
  console.log(JSON.stringify(listAuthProfiles(buildTokenLoginOptions(authArgs)), null, 2));
698
698
  } else if (subCommand === 'profile') {
699
699
  const profileSubCommand = authArgs[0];
700
- if (profileSubCommand === 'switch') {
700
+ if (profileSubCommand === 'list') {
701
+ const { listAuthProfiles } = require('../lib/auth/profile');
702
+ console.log(JSON.stringify(listAuthProfiles(buildTokenLoginOptions(authArgs.slice(1))), null, 2));
703
+ } else if (profileSubCommand === 'switch') {
701
704
  const target = getFirstPositionalArg(authArgs, 1);
702
705
  const { switchAuthProfile } = require('../lib/auth/profile');
703
706
  console.log(JSON.stringify(switchAuthProfile(target, buildTokenLoginOptions(authArgs)), null, 2));
@@ -6,13 +6,16 @@
6
6
  * 输出字段:
7
7
  * appName - 应用名称(zh_CN)
8
8
  * appType - 应用唯一标识
9
- * systemLink - 应用访问地址
9
+ * systemLink - 平台返回的应用访问地址
10
+ * appUrl / workbenchUrl - 应用工作台地址
11
+ * adminUrl - 开发者管理后台地址(不表示已验证访问权限)
10
12
  */
11
13
 
12
14
  'use strict';
13
15
 
14
16
  const { createAuthRef, createYidaClient } = require('../core/yida-client');
15
17
  const { t } = require('../core/i18n');
18
+ const { buildApplicationEntryUrls } = require('./application-entry-urls');
16
19
  const { throwCommandError, throwUsage } = require('../core/command-errors');
17
20
 
18
21
  const API_PATH = '/query/app/getAppList.json';
@@ -76,11 +79,12 @@ function parseArgs(args = []) {
76
79
  /**
77
80
  * 将应用原始数据提取为输出字段
78
81
  */
79
- function formatApp(app) {
82
+ function formatApp(app, baseUrl) {
80
83
  return {
81
84
  appName: (app.appName && app.appName.zh_CN) || '',
82
85
  appType: app.appType || '',
83
86
  systemLink: app.systemLink || '',
87
+ ...buildApplicationEntryUrls({ appType: app.appType, systemLink: app.systemLink, baseUrl }),
84
88
  };
85
89
  }
86
90
 
@@ -141,7 +145,7 @@ async function run(args) {
141
145
  const totalCount = Number.isFinite(Number(content.totalCount)) ? Number(content.totalCount) : apps.length;
142
146
  const totalPages = Math.max(1, Math.ceil(totalCount / options.pageSize));
143
147
  const scopeLabel = t(`app_list.scope_${options.type}`);
144
- const formattedApps = apps.map(formatApp);
148
+ const formattedApps = apps.map(app => formatApp(app, authRef.baseUrl));
145
149
 
146
150
  // stdout 输出 JSON,方便 AI 工具解析
147
151
  console.log(JSON.stringify(formattedApps, null, 2));
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ // URLs derived by the CLI from a successful app result and its authenticated
4
+ // base URL. Constructing a route does not verify the recipient's access rights.
5
+ function buildApplicationEntryUrls({ appType, baseUrl, systemLink }) {
6
+ if (typeof appType !== 'string' || !/^APP_[A-Za-z0-9_-]+$/.test(appType)) { return {}; }
7
+ let origin;
8
+ const params = new URLSearchParams();
9
+ try {
10
+ const base = new URL(baseUrl);
11
+ if (!['https:', 'http:'].includes(base.protocol) || base.username || base.password) { return {}; }
12
+ origin = base.origin;
13
+ } catch { return {}; }
14
+ try {
15
+ if (systemLink) {
16
+ const app = new URL(systemLink, origin);
17
+ if (['https:', 'http:'].includes(app.protocol) && !app.username && !app.password && (app.pathname === `/${appType}` || app.pathname.startsWith(`/${appType}/`))) {
18
+ origin = app.origin;
19
+ for (const key of ['corpid', 'locale']) {
20
+ if (app.searchParams.has(key)) { params.set(key, app.searchParams.get(key)); }
21
+ }
22
+ }
23
+ }
24
+ } catch { /* Ignore malformed optional links; retain the authenticated base. */ }
25
+ const query = params.toString();
26
+ const suffix = query ? `?${query}` : '';
27
+ const workbenchUrl = `${origin}/${appType}/workbench${suffix}`;
28
+ return { appUrl: workbenchUrl, workbenchUrl, adminUrl: `${origin}/${appType}/admin${suffix}` };
29
+ }
30
+
31
+ module.exports = { buildApplicationEntryUrls };
@@ -51,6 +51,9 @@ const {
51
51
  const { t } = require('../core/i18n');
52
52
  const { assertInlineCssStructure } = require('./inline-css-guard');
53
53
  const { assertCanvasThemeStructure } = require('./canvas-theme-guard');
54
+ const { assertCanvasIconExports } = require('./canvas-icon-guard');
55
+ const { assertCanvasNavigationStructure } = require('./canvas-navigation-guard');
56
+ const { assertCanvasNavigationPaths } = require('./canvas-path-guard');
54
57
 
55
58
  /**
56
59
  * 依赖 → window 别名白名单,用于把 import 改写到运行时全局对象。
@@ -967,6 +970,9 @@ function compileCanvasLocal(source, options = {}) {
967
970
  assertNoSelfReferentialDependencyBindings(source, options);
968
971
  assertNoBareDependencyGlobals(source, options);
969
972
  assertNoManualDependencyGlobals(source, options);
973
+ assertCanvasIconExports(source, options);
974
+ assertCanvasNavigationStructure(source, options);
975
+ assertCanvasNavigationPaths(source, options);
970
976
  assertInlineCssStructure(source, options);
971
977
  assertCanvasThemeStructure(source, options);
972
978