openyida 2026.10.28 → 2026.10.29-1

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 (38) hide show
  1. package/README.md +1 -0
  2. package/bin/yida.js +5 -0
  3. package/lib/agent/provider-preflight.js +5 -3
  4. package/lib/core/agent-capabilities.js +3 -3
  5. package/lib/core/command-manifest.js +57 -4
  6. package/lib/core/locales/en.js +1 -0
  7. package/lib/core/locales/zh.js +1 -0
  8. package/lib/plugin/plugin-lifecycle.js +379 -0
  9. package/lib/plugin/runtime-registry.js +58 -0
  10. package/package.json +1 -1
  11. package/scripts/postinstall.js +3 -1
  12. package/yida-skills/SKILL.md +9 -4
  13. package/yida-skills/references/setup-and-env.md +2 -2
  14. package/yida-skills/references/source-repair.md +2 -2
  15. package/yida-skills/references/user-facing-summary.md +45 -0
  16. package/yida-skills/skills/yida-app/SKILL.md +2 -2
  17. package/yida-skills/skills/yida-app/references/common-issues.md +1 -1
  18. package/yida-skills/skills/yida-app/workflow/step-7-page-code.md +1 -1
  19. package/yida-skills/skills/yida-app/workflow/step-8-publish-navigation.md +2 -0
  20. package/yida-skills/skills/yida-app/workflow/step-9-output-finish.md +23 -22
  21. package/yida-skills/skills/yida-canvas-custom-page/SKILL.md +3 -1
  22. package/yida-skills/skills/yida-canvas-upgrade/SKILL.md +6 -4
  23. package/yida-skills/skills/yida-canvas-upgrade/references/migration-examples.md +1 -1
  24. package/yida-skills/skills/yida-create-form-page/SKILL.md +2 -0
  25. package/yida-skills/skills/yida-custom-page/SKILL.md +4 -2
  26. package/yida-skills/skills/yida-design/references/ask-human-interaction-contract.md +6 -2
  27. package/yida-skills/skills/yida-design/sub_skill/page-design/SKILL.md +2 -0
  28. package/yida-skills/skills/yida-design/sub_skill/ui-improve/SKILL.md +3 -1
  29. package/yida-skills/skills/yida-openyida-publish-guard/SKILL.md +2 -0
  30. package/yida-skills/skills/yida-plugin-frontend-deploy/SKILL.md +38 -0
  31. package/yida-skills/skills/yida-plugin-frontend-deploy/references/frontend-contract.md +72 -0
  32. package/yida-skills/skills/yida-plugin-frontend-deploy/references/frontend-hosting.md +65 -0
  33. package/yida-skills/skills/yida-plugin-lifecycle/SKILL.md +107 -0
  34. package/yida-skills/skills/yida-plugin-lifecycle/references/development-guide.md +74 -0
  35. package/yida-skills/skills/yida-publish-page/SKILL.md +7 -5
  36. package/yida-skills/skills/yida-rechart/SKILL.md +1 -1
  37. package/yida-skills/skills/yida-upgrade-app-theme/SKILL.md +2 -0
  38. package/yida-skills/skills-index.json +35 -5
package/README.md CHANGED
@@ -470,6 +470,7 @@ When preparing a PR that needs a personal Fork, or when you ask how to support t
470
470
  | `openyida app-settings <appType> [--section theme\|basic\|data-card\|cool-card] [--json]` | Read theme, frontend/backend, native data card and cool card management links |
471
471
  | `openyida cool-card <list\|templates\|create\|get> <appType> [cardPageCode] [--type im\|onebox] [--name <title>] [--page <n>] [--size <n>] [--search <text>] [--out <file>] [--json]` | Create and read native YiDA cool cards (interactive and pinned) |
472
472
  | `openyida data-card <list\|create\|get\|save\|publish\|probe\|release-get\|release-save\|release-check\|release-test\|refs> <appType> [cardCode] [--name <title>] [--description <text>] [--schema <file>\|--config <file>] [--expected-hash <hash>] [--backup <file>] [--out <file>] [--published\|--version <version>] [--page <n>] [--size <n>] [--search <text>] [--allow-send] [--json]` | Create, configure, publish and distribute native YiDA data cards |
473
+ | `openyida plugin <dev-list\|get\|version-list\|version-get\|extensions\|installed-list\|installed-get\|runtime-list\|probe\|create\|create-version\|save-dev\|configure\|enable\|disable\|upgrade\|uninstall> [pluginId] [version] [options]` | Manage YiDA platform plugin versions, installation state, and runtime registrations |
473
474
  | `openyida app-entry get <appType> [--json]` | Read frontend and management runtime entries |
474
475
  | `openyida app-entry set <appType> [--frontend <url>\|--frontend-page <formUuid>] [--management <url>\|--management-page <formUuid>] [--clear-frontend] [--clear-management] [--json]` | Register application entries with partial update and readback |
475
476
  | `openyida app-list [--type managed\|created] [--page N] [--size N]` | Page through apps I manage or created |
package/bin/yida.js CHANGED
@@ -775,6 +775,11 @@ async function main() {
775
775
  await run(args);
776
776
  break;
777
777
  }
778
+ case 'plugin': {
779
+ const { run } = require('../lib/plugin/plugin-lifecycle');
780
+ await run(args);
781
+ break;
782
+ }
778
783
 
779
784
  case 'app-settings': {
780
785
  const { run } = require('../lib/app/app-settings');
@@ -139,13 +139,15 @@ function probe(executable, args, rpc, options = {}) {
139
139
  child = (options.probeSpawn || spawn)(command.executable, command.args, {
140
140
  env, cwd: os.tmpdir(), shell: false, windowsHide: true,
141
141
  windowsVerbatimArguments: command.windowsVerbatimArguments,
142
- detached: platform !== 'win32', stdio: ['pipe', 'pipe', 'pipe'],
142
+ // Finite Windows probes do not consume input. Avoid an unused redirected
143
+ // stdin pipe during PowerShell startup; ACP still needs its live pipe.
144
+ detached: platform !== 'win32', stdio: [platform === 'win32' && !rpc ? 'ignore' : 'pipe', 'pipe', 'pipe'],
143
145
  });
144
146
  signals.once('SIGINT', interrupted);
145
147
  signals.once('SIGTERM', interrupted);
146
148
  timer = setTimeout(() => { stop(); finish({ status: 'probe_timeout' }); }, options.timeoutMs || 15000);
147
149
  child.on('error', () => finish({ status: 'launch_failed' }));
148
- child.stdin.on('error', () => {});
150
+ if (child.stdin) { child.stdin.on('error', () => {}); }
149
151
  child.stderr.on('data', chunk => { output = (output + chunk.toString()).slice(-65536); });
150
152
  child.stdout.on('data', chunk => {
151
153
  output = (output + chunk.toString()).slice(-65536);
@@ -171,7 +173,7 @@ function probe(executable, args, rpc, options = {}) {
171
173
  ? { protocolVersion: 1, clientCapabilities: {}, clientInfo: { name: 'openyida-preflight', version: '1' } }
172
174
  : { clientInfo: { name: 'openyida-preflight', version: '1' }, capabilities: {} };
173
175
  child.stdin.write(JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'initialize', params }) + '\n');
174
- } else { child.stdin.end(); }
176
+ } else if (child.stdin) { child.stdin.end(); }
175
177
  } catch { finish({ status: 'launch_failed' }); }
176
178
  });
177
179
  }
@@ -5,7 +5,7 @@ const fs = require('fs');
5
5
  const path = require('path');
6
6
  const { version } = require('../../package.json');
7
7
  const { t } = require('./i18n');
8
- const { buildCommandManifest } = require('./command-manifest');
8
+ const { buildCommandManifest, buildEntryDeliveryPolicy } = require('./command-manifest');
9
9
  const { buildEnvironmentSnapshot } = require('./env');
10
10
  const coreUtils = require('./utils');
11
11
  const { buildHostAssetCapabilities } = require('../asset/host-capabilities');
@@ -497,7 +497,7 @@ function buildApplicationEntryPolicy(builderPath, env = process.env) {
497
497
  return {
498
498
  schema_version: 1,
499
499
  environment: injectedAuthUsable ? 'managed_cloud_agent' : 'non_cloud_agent',
500
- delivery_unit: 'single_application_entry_group',
500
+ ...buildEntryDeliveryPolicy(),
501
501
  resource_delivery: 'summary_only',
502
502
  internal_artifact_delivery: 'never',
503
503
  frontend_delivery: 'Infer standalone for a scoped service frontend, persist page navigation hiding and return the verified publish/get-form-config standaloneUrl. No extra flag or navigation URL parameter. Missing verification is incomplete delivery; never silently omit the frontend or replace it with workbench/admin.',
@@ -701,7 +701,7 @@ function buildAgentCapabilities() {
701
701
  ],
702
702
  retry_policy: 'Do not repeat the same failed command without changing login state, organization, parameters, files, or field IDs.',
703
703
  completion_contracts: {
704
- full_app: 'Default full-app build is complete after creating or reusing the app, core forms, primary page, publishing it, and returning one named application entry group. Summarize business resources in prose; do not deliver one artifact or link card per resource.',
704
+ full_app: 'Default full-app build is complete after creating or reusing the app, core forms, primary page, publishing it, and returning up to three verified application entry URLs, with runtime access and developer admin included by default. Summarize business resources in prose; do not deliver one artifact or link card per resource.',
705
705
  },
706
706
  full_app_data_contract: 'Default full-app page code must not call this.dataSourceMap.* unless the same run created and bound a designer data source; use this.utils.yida.* or an entry-only page by default.',
707
707
  },
@@ -10,6 +10,29 @@ const { DIVIDER_TYPES, DEFAULT_DIVIDER_TYPE } = require('../app/form-field-valid
10
10
  const { FORMULA_COMMANDS } = require('../formula/cli-contract');
11
11
  const { printTemplateCommand, printTemplateEffects, printTemplatePermission } = require('../print-template/contract');
12
12
 
13
+ /** 应用交付只约定入口内容;展示方式由宿主负责。 */
14
+ function buildEntryDeliveryPolicy() {
15
+ return {
16
+ delivery_unit: 'application_entries',
17
+ presentation: 'host_managed',
18
+ entry_delivery: {
19
+ max_count: 3,
20
+ deduplicate_by: 'verified_url',
21
+ order: ['frontend', 'management', 'admin'],
22
+ by_scope: {
23
+ 'service-management': ['frontend', 'management', 'admin'],
24
+ 'frontend-only': ['frontend', 'admin'],
25
+ 'backend-only': ['management', 'admin'],
26
+ unified: ['management', 'admin'],
27
+ },
28
+ explicit_user_exclusions: 'take_precedence',
29
+ resource_only: 'current_resource_only',
30
+ missing_entry: 'report_incomplete_without_guessing',
31
+ },
32
+ };
33
+ }
34
+
35
+
13
36
  const SIDE_EFFECT_BASES = Object.freeze({
14
37
  local_read: Object.freeze({
15
38
  kind: 'local_read',
@@ -564,6 +587,13 @@ const COMMAND_SIDE_EFFECTS = new Map([
564
587
  note: 'Direct enable writes a durable local request receipt before the one-shot platform copy. AI build only validates the template and returns the native builder handoff.',
565
588
  })],
566
589
  ['data-card', sideEffect('mixed', { mutates_yida: true, mutates_local: true, read_actions: ['list', 'get', 'probe', 'release-check', 'refs'], mutating_actions: ['create', 'save', 'publish', 'release-get', 'release-save', 'release-test'], note: 'release-get reads broadcast settings but the native backend may initialize the application cool app; classify it conservatively as a possible mutation.' })],
590
+ ['plugin', sideEffect('mixed', {
591
+ mutates_yida: true,
592
+ mutates_local: true,
593
+ read_actions: ['dev-list', 'get', 'version-list', 'version-get', 'extensions', 'installed-list', 'installed-get', 'runtime-list', 'probe'],
594
+ mutating_actions: ['create', 'create-version', 'save-dev', 'configure', 'enable', 'disable', 'upgrade', 'uninstall'],
595
+ note: 'Organization-level YiDA plugin lifecycle. Writes require --confirm and deterministic readback; save-dev also writes a local backup.',
596
+ })],
567
597
  ['print-template', sideEffect('mixed', printTemplateEffects)],
568
598
  ['form-view', sideEffect('mixed', {
569
599
  mutates_yida: true,
@@ -864,6 +894,9 @@ const COMMAND_PERMISSIONS = new Map([
864
894
  ...permissionEntries(['cool-card'], actionDependentPermission({ preauthorized_actions: ['create'] })),
865
895
  ...permissionEntries(['solution-template'], actionDependentPermission({ ask_actions: ['enable'] })),
866
896
  ...permissionEntries(['data-card'], actionDependentPermission({ preauthorized_actions: ['create', 'save', 'publish', 'release-get'], ask_actions: ['release-save', 'release-test'] })),
897
+ ...permissionEntries(['plugin'], actionDependentPermission({
898
+ ask_actions: ['create', 'create-version', 'save-dev', 'configure', 'enable', 'disable', 'upgrade', 'uninstall'],
899
+ })),
867
900
  ...permissionEntries([
868
901
  'form-view',
869
902
  ], actionDependentPermission({
@@ -1237,6 +1270,25 @@ const COMMAND_GROUPS = [
1237
1270
  examples: ['openyida data-card create APP_XXX --name "Sales summary" --json', 'openyida data-card get APP_XXX CARD-XXX --out card-schema.json --json'],
1238
1271
  notes: ['Native dataCardRpc resources. Agent use requires an explicit user choice of native YiDA data cards or continuation of an already explicit native-card task; generic cards, KPIs, dashboards or broadcasts do not trigger this capability. Metric cards rendered by custom page code belong to the page; an embedded CARD reference alone does not authorize changes to its native source. get defaults to the draft; --published reads the online schema. --out exports the complete schema without overwriting a file. save accepts either a complete exported --schema or a simplified --config with charts and optional select filters (legacy indicators remains compatible), appending verified native components. Supports indicator/bar/line/pie/table/combo/gauge/funnel/calendarheatmap with real form fields, aggregates and date grain. Six-column layout, full-width tables and optional gauge min/max ranges. Five chart maximum; filters link only within the same source. probe performs read-only CARD runtime queries and returns component data; a saved schema alone is not runtime evidence. Numeric fields support COUNT/SUM/AVG/MIN/MAX; text and serial fields support COUNT. Config generation preserves the existing page and rejects unsupported keys/types. save requires its original --expected-hash; backs up and rereads before writing, then verifies readback. publish requires the current draft hash, backs up, and verifies the published schema, version and state; it does not save unsent local edits. Hash checks are not atomic server locking. New i18n bindings are synchronized before saving. Writes are not automatically replayed. Preserve platform permission and entitlement errors; never alter quotas or app tags. release-get exports broadcast configuration and releaseHash; the native GET may initialize a cool app and is conservatively classified as a possible mutation; release-save requires its original --expected-hash, backup and verified readback. Enabled schedules require explicit --allow-send; release-test also requires --allow-send and only requests a test to the current operator. release-check checks published state and broadcast entitlement; refs queries portal usage records. Group delivery still requires installation in DingTalk. Successful save or test acceptance does not prove delivery. The CLI does not mount portal components or delete cards. Mutation receipts refresh the app using the existing update_app_setting operation.'],
1239
1272
  }),
1273
+ command('plugin', ['plugin'], 'plugin <dev-list|get|version-list|version-get|extensions|installed-list|installed-get|runtime-list|probe|create|create-version|save-dev|configure|enable|disable|upgrade|uninstall> [pluginId] [version] [options]', 'plugin_lifecycle.description', {
1274
+ managedRun: { scope: 'denied', reason: 'organization_level_plugin_lifecycle' },
1275
+ output: 'json',
1276
+ args: [
1277
+ { name: 'action', type: 'string', source: 'positional', position: 0, required: true },
1278
+ { name: 'pluginId', type: 'string', source: 'positional', position: 1 },
1279
+ { name: 'version', type: 'string', source: 'positional', position: 2 },
1280
+ { name: 'config', type: 'file', source: 'option', builder_options: ['--config'] },
1281
+ { name: 'expectedHash', type: 'string', source: 'option', builder_options: ['--expected-hash'] },
1282
+ { name: 'backup', type: 'file', source: 'option', builder_options: ['--backup'] },
1283
+ { name: 'extensions', type: 'string', source: 'option', builder_options: ['--extensions'] },
1284
+ { name: 'checkResource', type: 'boolean', source: 'option', builder_options: ['--check-resource'] },
1285
+ { name: 'type', type: 'string', source: 'option', builder_options: ['--type'], description: 'create only: connector (default) or other; custom-page extensions use other.' },
1286
+ { name: 'confirm', type: 'boolean', source: 'option', builder_options: ['--confirm'] },
1287
+ { name: 'json', type: 'boolean', source: 'option', builder_options: ['--json'] },
1288
+ ],
1289
+ examples: ['openyida plugin dev-list --search AI --json', 'openyida plugin runtime-list --extensions yida.app.custom-page.component --json', 'openyida plugin create --type other --name Timeline --description "Custom page timeline" --logo https://example.com/logo.png --confirm --json'],
1290
+ notes: ['YiDA platform plugins, not npm packages or Codex plugins. Read commands separate persisted developer configuration, static resource reachability, runtime registry candidates, enabled state, and actual consumer execution. runtime-list includes disabled candidates and does not prove that an application consumed one. probe --check-resource sends a read-only HEAD request to the resolved HTTPS entry. save-dev and configure require the original hash and a non-overwriting backup; save-dev validates extension IDs and never publishes. Organization-wide writes require --confirm and readback. disable follows platform semantics: it blocks new selection but may not unload existing uses. The CLI intentionally does not publish/release/delete developer plugins or install from the market.'],
1291
+ }),
1240
1292
  command('app-entry.get', ['app-entry', 'get'], 'app-entry get <appType> [--json]', 'app_entry.desc_get', { managedRun: {'scope':'app','appPosition':1},
1241
1293
  args: [{ name: 'appType', type: 'string', source: 'positional', position: 0, required: true },
1242
1294
  { name: 'json', type: 'boolean', source: 'option', builder_options: ['--json'] }],
@@ -2364,7 +2416,7 @@ function summarizeLocalizedCommands(commands) {
2364
2416
  product_design_policy: 'yida-requirement-analysis owns shared facts and first-time intake. yida-prd owns business planning; yida-design owns visual design. Reuse the same confirmed brief and supplied details. Prepare business and base visuals concurrently, then bind visuals to settled page tasks. yida-app merges and checks the artifacts before creating resources. Plan authors scope, data and rules, page organization, business interactions and acceptance once. Ordered blocks {name,purpose} supply default priority and content layers; explicit designs remain authoritative. Project-specific acceptance criteria are merged with generated resource checks. Plan uses the compact authoring contract and selected theme context; the CLI reads full templates and renders all artifacts. Fast, Plan and single-page design share yida-design/templates/design-themes and visual_decision_policy: infer directly from supplied style intent or extracted reference DNA, and use the shared three-direction rule only when comparison is needed. Theme templates declare application-global variables from basic-tokens.json with fixed typography, spacing and Tooltip colors, plus scoped custom-page variables; component recipes consume those variables. Each selected template is the authority for navTheme, its six navigation color tokens, and its selected-item shadow token; free-creative authors its own navigation tone and tokens. Explicit project customization stays in visualStyle.tokens. The CLI declares each fixed application palette once in a shared :root and platform-mode selector block. The CLI preserves mode-independent navigation appearance tokens. Light, dark, white and gray mode classes consume the same project tokens; navTheme remains platform metadata, not a second palette. Legacy generated mode blocks are consolidated on update, while unrelated custom CSS is preserved.',
2365
2417
  ui_guidance_policy: 'Page implementation consumes yida-prd prd.md for positioning, information architecture, page prototype, native form entry policy, material strategy, business-specific checks, resource creation order, page implementation delivery order, navigation order, and acceptance criteria; it consumes yida-design design.md for app custom theme CSS delivery, themeColor/navTheme, visual states, visualScaffold, surface material, rounded rules, density rules, components, state styling, and page-level imageNeed. When a page is imageNeed=required, or beneficial with declared image slots, yida-image-assets prepares a traceable asset manifest alongside page layout and interaction work; wait for final images only at that page\'s image binding and acceptance. imageNeed=none skips the branch. prd.md and design.md remain the only design sources of truth. Page implementation may extract page-spec.json as a derived implementation handoff from prd.md + design.md; conflicts are resolved by sending business conflicts to yida-prd and visual conflicts to yida-design before regenerating the spec. Core normal forms default to 1-3 business sample records before page implementation, followed by query readback. An explicit opt-out, configuration dictionary, sensitive data, or lack of safely constructible values requires a recorded skip reason. Screenshots, public sharing, data-source deep binding, and fine navigation grouping are optional after explicit user request or PRD acceptance criteria.',
2366
2418
  default_nav_order_policy: 'For application-wide custom navigation, implement each entry menu and verify app/page navigation hiding. A standalone frontend preserves platform navigation for the management workspace; frontend-only delivery skips platform ordering. After all scoped resources and page publications finish, perform exactly one navigation order operation. Use management tasks and their default destination, without creating a homepage or putting a frontend page first. When execution.entryRecommendation exists, derive navigationOrder from its management/workspace menus. Call openyida nav-group order <appType> <items...> for an explicit order; otherwise call openyida nav-group auto-order <appType> once for legacy single-workspace plans. Do not use openyida publish ... --auto-nav-order for per-page application builds. Explicit and automatic ordering are mutually exclusive; never generate per-item move loops.',
2367
- final_link_policy: 'Return exactly one user-visible application entry group, never one artifact or link card per form, process, report, schema, manifest, PRD, design file, or intermediate artifact. Include one verified management entry when a management or unified workspace is in scope: the app workbench URL or a planned workbench/formUuid URL with its real viewUuid. Backend-only returns its verified business backend entry and developer admin URL without adding a frontend. Native management does not require a display homepage; frontend-only delivery includes its verified frontend entry and developer admin URL, without inventing a business backend. For scoped service frontend pages, infer standalone when entryMode is missing; preserve an explicit platform-shell choice and its verified workbenchUrl. Add the clean custom page URL only for standalone pages when get-form-config readback confirms renderNav=false (fallback to isRenderNav only when renderNav is absent). Complete application delivery defaults to 2-3 distinct entries: frontend or unified workspace, business backend when separately planned, and developer admin. agent-capabilities application_entry_policy.entries.admin=include is independent of auth runtime. Read adminUrl from create-app or app-list results; route construction does not verify recipient permissions. Explicit user exclusions take precedence; single-page tasks retain their scope. Put the business summary, verification results and remaining work in the terminal delivery artifact description; when no delivery tool is available, return the same content and entry group in the final response. Summarize business resources by capability or count, but every resource count, seed-record count, and completed/verified claim must come from that resource\'s own successful result or readback. When the user or caller explicitly requests a resource manifest, resource UUIDs/IDs, publish status, or test-data summary, include one concise verified delivery manifest in that description (or the final response when no delivery tool is available).',
2419
+ final_link_policy: 'Return up to three verified application entry URLs in frontend, business management, developer admin order; default complete delivery includes runtime access and developer admin. Never emit one artifact or link card per form, process, report, schema, manifest, PRD, design file, or intermediate artifact. Include one verified management entry when a management or unified workspace is in scope: the app workbench URL or a planned workbench/formUuid URL with its real viewUuid. Backend-only returns its verified business backend entry and developer admin URL without adding a frontend. Native management does not require a display homepage; frontend-only delivery includes its verified frontend entry and developer admin URL, without inventing a business backend. For scoped service frontend pages, infer standalone when entryMode is missing; preserve an explicit platform-shell choice and its verified workbenchUrl. Add the clean custom page URL only for standalone pages when get-form-config readback confirms renderNav=false (fallback to isRenderNav only when renderNav is absent). agent-capabilities application_entry_policy.entries.admin=include is independent of auth runtime. Read adminUrl from create-app or app-list results; route construction does not verify recipient permissions. Explicit user exclusions take precedence; single-page tasks retain their scope. QwenWork owns link, file and result presentation; return the verified summary and URLs without prescribing styles, card counts, display tools or update identifiers. Other hosts may use their terminal delivery artifact description; return the same concise content when no delivery tool is available. Summarize business resources by capability or count, but every resource count, seed-record count, and completed/verified claim must come from that resource\'s own successful result or readback. When the user or caller explicitly requests a resource manifest, resource UUIDs/IDs, publish status, or test-data summary, include one concise verified delivery manifest in that description (or the final response when no delivery tool is available).',
2368
2420
  entry_navigation_contract: {
2369
2421
  reference: 'yida-skills/skills/yida-app/references/entry-navigation.md',
2370
2422
  brief_path: 'entryRecommendation',
@@ -2407,10 +2459,10 @@ function summarizeLocalizedCommands(commands) {
2407
2459
  },
2408
2460
  },
2409
2461
  application_entry_policy: {
2410
- delivery_unit: 'single_application_entry_group',
2462
+ ...buildEntryDeliveryPolicy(),
2411
2463
  persistence: {
2412
2464
  command_ids: ['app-entry.get', 'app-entry.set'],
2413
- policy: 'Before final complete-application delivery, registration and readback of all verified in-scope business runtime entries is required by default: service-management writes both, frontend-only writes frontend, backend-only/unified writes management. Resolve each planned default resource/view independently; never reuse the last published page or substitute a root workbench for a task URL. Use readback urls.frontend/management for final cards. Existing identical entries can reuse the readback; set performs partial merge and readback. Missing verification or failed persistence is incomplete delivery, not a reason to emit guessed links. Respect explicit no-write constraints. Do not register admin/design URLs. Incremental resource-only work preserves existing entries. Clear only on explicit removal. Conflicts require reread and review, never blind retries.',
2465
+ policy: 'Before final complete-application delivery, registration and readback of all verified in-scope business runtime entries is required by default: service-management writes both, frontend-only writes frontend, backend-only/unified writes management. Resolve each planned default resource/view independently; never reuse the last published page or substitute a root workbench for a task URL. Use readback urls.frontend/management for final entry URLs. Existing identical entries can reuse the readback; set performs partial merge and readback. Missing verification or failed persistence is incomplete delivery, not a reason to emit guessed links. Respect explicit no-write constraints. Do not register admin/design URLs. Incremental resource-only work preserves existing entries. Clear only on explicit removal. Conflicts require reread and review, never blind retries.',
2414
2466
  },
2415
2467
  workbench: {
2416
2468
  include: 'when_workspace_in_scope',
@@ -2462,7 +2514,7 @@ function summarizeLocalizedCommands(commands) {
2462
2514
  'yida-data-source-connectors',
2463
2515
  'yida-dashboard',
2464
2516
  ],
2465
- completion_contract: 'Clarify core functions and actual usage first, then resolve the required resource context and settle entry navigation before PRD planning. Fast generates prd.md and design.md in parallel; Plan uses design-plan init/preview/materialize/patch and confirms the current revision. Validate both artifacts, create or reuse app and core forms/processes, seed and query-check core normal-form samples or record an allowed skip reason, then implement the primary page in PRD resource order, publish it, apply PRD navigation order or lightweight fallback navigation order for platform navigation, or verify app and per-page hiding for application-wide custom navigation. For a standalone frontend in a platform-navigation app, verify that page independently and retain workspace navigation. Before returning one named application entry group, persist and read back the verified in-scope frontend/management access addresses through app-entry get/set; final business links come from urls.frontend/management, not the last publish result. Include workbench when a management or unified workspace is in scope; backend-only delivers its business backend and developer admin URL without adding a frontend; frontend-only delivery includes its verified frontend entry and developer admin URL, without inventing a business backend. Always include developer adminUrl for complete application delivery unless explicitly excluded by the user, regardless of auth runtime; this is separate from the optional business backend. Use create-app or app-list URL fields and state any unavailable entry instead of silently omitting it. Put the verified business summary, results and remaining work in the delivery artifact description; use the final response when no delivery tool is available.',
2517
+ completion_contract: 'Clarify core functions and actual usage first, then resolve the required resource context and settle entry navigation before PRD planning. Fast generates prd.md and design.md in parallel; Plan uses design-plan init/preview/materialize/patch and confirms the current revision. Validate both artifacts, create or reuse app and core forms/processes, seed and query-check core normal-form samples or record an allowed skip reason, then implement the primary page in PRD resource order, publish it, apply PRD navigation order or lightweight fallback navigation order for platform navigation, or verify app and per-page hiding for application-wide custom navigation. For a standalone frontend in a platform-navigation app, verify that page independently and retain workspace navigation. Before returning up to three verified application entry URLs, persist and read back the verified in-scope frontend/management access addresses through app-entry get/set; final business links come from urls.frontend/management, not the last publish result. Include workbench when a management or unified workspace is in scope; backend-only delivers its business backend and developer admin URL without adding a frontend; frontend-only delivery includes its verified frontend entry and developer admin URL, without inventing a business backend. Always include developer adminUrl for complete application delivery unless explicitly excluded by the user, regardless of auth runtime; this is separate from the optional business backend. Use create-app or app-list URL fields and state any unavailable entry instead of silently omitting it. Put the verified business summary, results and remaining work in the delivery artifact description; use the final response when no delivery tool is available.',
2466
2518
  },
2467
2519
  },
2468
2520
  };
@@ -2498,6 +2550,7 @@ function buildCommandManifest(options = {}) {
2498
2550
  module.exports = {
2499
2551
  COMMAND_GROUPS,
2500
2552
  buildCommandManifest,
2553
+ buildEntryDeliveryPolicy,
2501
2554
  findCommandSuggestion,
2502
2555
  findForbiddenAliasSuggestion,
2503
2556
  flattenCommandManifest,
@@ -4,6 +4,7 @@
4
4
  'use strict';
5
5
 
6
6
  module.exports = {
7
+ plugin_lifecycle: { description: 'Manage YiDA platform plugin versions, installation state, and runtime registrations', failed: 'Plugin operation stopped: {0}', usage: 'Usage: openyida plugin <dev-list|get|version-list|version-get|extensions|installed-list|installed-get|runtime-list|probe|create|create-version|save-dev|configure|enable|disable|upgrade|uninstall> [pluginId] [version] [options]; create accepts --type connector|other; use other for custom-page extensions' },
7
8
  print_template: {
8
9
  'description': 'Manage native YiDA print templates, generate document layouts, back up, restore and request PDFs',
9
10
  'error': 'Print template operation failed: {0}',
@@ -4,6 +4,7 @@
4
4
  'use strict';
5
5
 
6
6
  module.exports = {
7
+ plugin_lifecycle: { description: '管理宜搭平台插件开发版本、安装状态与运行时注册', failed: '插件操作已停止:{0}', usage: '用法:openyida plugin <dev-list|get|version-list|version-get|extensions|installed-list|installed-get|runtime-list|probe|create|create-version|save-dev|configure|enable|disable|upgrade|uninstall> [pluginId] [version] [options];create 可选 --type connector|other,自定义页面扩展使用 other' },
7
8
  print_template: {
8
9
  'description': '管理宜搭原生打印模板、按字段生成多种单据、备份恢复与生成PDF',
9
10
  'error': '打印模板操作失败:{0}',