openyida 2026.7.12-1 → 2026.7.13

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.
@@ -49,6 +49,34 @@ const SIDE_EFFECT_SCHEMA = Object.freeze({
49
49
  },
50
50
  });
51
51
 
52
+ const PERMISSION_SCHEMA = Object.freeze({
53
+ version: 1,
54
+ fields: {
55
+ mode: 'Default agent execution decision: allow, ask, or deny. Action-dependent commands must be checked against ask_actions before using the default.',
56
+ effect: 'Primary effect category: read, write, external, destructive, or unknown.',
57
+ reason: 'Human-readable rationale for the permission decision.',
58
+ action_dependent: 'True when the top-level command contains both read-only and mutating actions.',
59
+ read_actions: 'For action-dependent commands, subcommands/options that can be treated as allow/read.',
60
+ preauthorized_actions: 'For action-dependent commands, mutating subcommands/options that are explicitly pre-authorized by policy.',
61
+ ask_actions: 'For action-dependent commands, subcommands/options that should require confirmation.',
62
+ preauthorized_patterns: 'Structured argument matchers that are explicitly pre-authorized by policy.',
63
+ ask_patterns: 'Structured argument matchers that require confirmation.',
64
+ unknown_action_mode: 'Decision for unrecognized actions under action-dependent commands. Use ask unless a caller has a more specific local proof.',
65
+ },
66
+ modes: {
67
+ allow: 'Allowed by the current OpenYida agent policy without an extra OpenYida-specific confirmation.',
68
+ ask: 'Requires user confirmation before agent execution; currently reserved for destructive/delete-like operations.',
69
+ deny: 'Should not be auto-executed by an agent.',
70
+ },
71
+ effects: {
72
+ read: 'Reads, validates, inspects, or diagnoses without known mutation.',
73
+ write: 'Creates, updates, publishes, imports, uploads, or writes local/remote state.',
74
+ external: 'Touches identity, browser login, local servers, package updates, or third-party execution.',
75
+ destructive: 'Deletes or removes existing state.',
76
+ unknown: 'Action-dependent; callers should inspect read_actions, preauthorized_actions, ask_actions, and unknown_action_mode before using the default mode.',
77
+ },
78
+ });
79
+
52
80
  function sideEffect(kind, overrides = {}) {
53
81
  if (!SIDE_EFFECT_BASES[kind]) {
54
82
  throw new Error('Unknown side effect kind: ' + kind);
@@ -72,6 +100,29 @@ function sideEffectEntries(ids, effect) {
72
100
  return ids.map(id => [id, effect]);
73
101
  }
74
102
 
103
+ function permission(mode, effect, overrides = {}) {
104
+ return {
105
+ mode,
106
+ effect,
107
+ ...overrides,
108
+ };
109
+ }
110
+
111
+ function permissionEntries(ids, metadata) {
112
+ return ids.map(id => [id, metadata]);
113
+ }
114
+
115
+ function actionDependentPermission(options = {}) {
116
+ return permission('allow', 'unknown', {
117
+ reason: ACTION_DEPENDENT_REASON,
118
+ preauthorized_actions: options.preauthorized_actions || [],
119
+ preauthorized_patterns: options.preauthorized_patterns || [],
120
+ ask_actions: options.ask_actions || [],
121
+ ask_patterns: options.ask_patterns || [],
122
+ unknown_action_mode: 'ask',
123
+ });
124
+ }
125
+
75
126
  function cloneSideEffect(effect) {
76
127
  const cloned = { ...effect };
77
128
  if (Array.isArray(effect.read_actions)) {
@@ -87,17 +138,59 @@ function cloneSideEffectSchema() {
87
138
  return JSON.parse(JSON.stringify(SIDE_EFFECT_SCHEMA));
88
139
  }
89
140
 
141
+ function clonePermissionSchema() {
142
+ return JSON.parse(JSON.stringify(PERMISSION_SCHEMA));
143
+ }
144
+
145
+ function normalizePermission(metadata, sideEffectMetadata) {
146
+ const normalized = { ...metadata };
147
+ if (sideEffectMetadata && sideEffectMetadata.kind === 'mixed') {
148
+ if (normalized.action_dependent === undefined) {
149
+ normalized.action_dependent = true;
150
+ }
151
+ if (!Array.isArray(normalized.read_actions)) {
152
+ normalized.read_actions = Array.isArray(sideEffectMetadata.read_actions)
153
+ ? [...sideEffectMetadata.read_actions]
154
+ : [];
155
+ }
156
+ }
157
+ return normalized;
158
+ }
159
+
160
+ function clonePermission(metadata) {
161
+ const cloned = { ...metadata };
162
+ if (Array.isArray(metadata.read_actions)) {
163
+ cloned.read_actions = [...metadata.read_actions];
164
+ }
165
+ if (Array.isArray(metadata.preauthorized_actions)) {
166
+ cloned.preauthorized_actions = [...metadata.preauthorized_actions];
167
+ }
168
+ if (Array.isArray(metadata.preauthorized_patterns)) {
169
+ cloned.preauthorized_patterns = metadata.preauthorized_patterns.map(pattern => ({ ...pattern }));
170
+ }
171
+ if (Array.isArray(metadata.ask_actions)) {
172
+ cloned.ask_actions = [...metadata.ask_actions];
173
+ }
174
+ if (Array.isArray(metadata.ask_patterns)) {
175
+ cloned.ask_patterns = metadata.ask_patterns.map(pattern => ({ ...pattern }));
176
+ }
177
+ return cloned;
178
+ }
179
+
90
180
  function listCommandSideEffectIds() {
91
181
  return [...COMMAND_SIDE_EFFECTS.keys()].sort();
92
182
  }
93
183
 
184
+ function listCommandPermissionIds() {
185
+ return [...COMMAND_PERMISSIONS.keys()].sort();
186
+ }
187
+
94
188
  const COMMAND_SIDE_EFFECTS = new Map([
95
189
  ...sideEffectEntries([
96
190
  'agent-capabilities',
97
191
  'check-page',
98
192
  'commands',
99
193
  'dingtalk-link',
100
- 'env',
101
194
  'formula.evaluate',
102
195
  'integration.diagnose',
103
196
  ], sideEffect('local_read')),
@@ -109,6 +202,7 @@ const COMMAND_SIDE_EFFECTS = new Map([
109
202
  'connector.gen-template',
110
203
  'connector.parse-api',
111
204
  'copy',
205
+ 'export',
112
206
  'export-conversation',
113
207
  'flash-to-prd',
114
208
  'generate-page',
@@ -120,7 +214,6 @@ const COMMAND_SIDE_EFFECTS = new Map([
120
214
 
121
215
  ...sideEffectEntries([
122
216
  'app-list',
123
- 'basic-info',
124
217
  'connector.detail',
125
218
  'connector.list',
126
219
  'connector.list-actions',
@@ -214,17 +307,17 @@ const COMMAND_SIDE_EFFECTS = new Map([
214
307
  read_actions: ['status'],
215
308
  mutating_actions: ['login', 'refresh', 'logout'],
216
309
  })],
217
- ['batch.file', sideEffect('mixed', {
310
+ ['batch', sideEffect('mixed', {
218
311
  mutates_yida: true,
219
312
  mutates_local: true,
220
313
  read_actions: [],
221
- mutating_actions: ['depends on commands in file'],
314
+ mutating_actions: ['depends on commands in batch'],
222
315
  })],
223
- ['batch.inline', sideEffect('mixed', {
316
+ ['basic-info', sideEffect('mixed', {
224
317
  mutates_yida: true,
225
- mutates_local: true,
226
- read_actions: [],
227
- mutating_actions: ['depends on inline commands'],
318
+ mutates_local: false,
319
+ read_actions: ['default', 'overview', 'commodity', 'grant', 'capacity', 'quota', 'abs-path', 'dataflow', 'i18n', 'domain'],
320
+ mutating_actions: ['domain set'],
228
321
  })],
229
322
  ['bridge', sideEffect('mixed', {
230
323
  mutates_yida: false,
@@ -268,10 +361,10 @@ const COMMAND_SIDE_EFFECTS = new Map([
268
361
  read_actions: ['help', 'contact user search', 'calendar event list', 'approval instance list'],
269
362
  mutating_actions: ['install', 'setup', 'todo task create', 'chat robot send', 'depends on dws command'],
270
363
  })],
271
- ['env-management', sideEffect('mixed', {
364
+ ['env', sideEffect('mixed', {
272
365
  mutates_yida: false,
273
366
  mutates_local: true,
274
- read_actions: ['list', 'show'],
367
+ read_actions: ['default', '--json', 'list', 'show'],
275
368
  mutating_actions: ['setup', 'switch', 'add', 'remove'],
276
369
  })],
277
370
  ['er', sideEffect('mixed', {
@@ -280,12 +373,6 @@ const COMMAND_SIDE_EFFECTS = new Map([
280
373
  read_actions: ['default', '--format json'],
281
374
  mutating_actions: ['--output'],
282
375
  })],
283
- ['export', sideEffect('mixed', {
284
- mutates_yida: false,
285
- mutates_local: true,
286
- read_actions: ['read application schema'],
287
- mutating_actions: ['write export file'],
288
- })],
289
376
  ['feedback', sideEffect('mixed', {
290
377
  mutates_yida: true,
291
378
  mutates_local: true,
@@ -302,7 +389,7 @@ const COMMAND_SIDE_EFFECTS = new Map([
302
389
  mutates_yida: false,
303
390
  mutates_local: true,
304
391
  read_actions: [],
305
- mutating_actions: ['start stdio server'],
392
+ mutating_actions: ['default'],
306
393
  })],
307
394
  ['nav-group', sideEffect('mixed', {
308
395
  mutates_yida: true,
@@ -324,11 +411,275 @@ const COMMAND_SIDE_EFFECTS = new Map([
324
411
  })],
325
412
  ]);
326
413
 
414
+ const ALLOW_WRITE_REASON = 'Allowed by policy: non-destructive write, update, publish, import, upload, or local file operation.';
415
+ const ALLOW_EXTERNAL_REASON = 'Allowed by policy: non-destructive auth, external service, local server, or package operation.';
416
+ const ACTION_DEPENDENT_REASON = 'Action-dependent command: allow only read_actions or preauthorized_actions; ask ask_actions and unknown mutating actions.';
417
+
418
+ const COMMAND_PERMISSIONS = new Map([
419
+ ...permissionEntries([
420
+ 'agent-capabilities',
421
+ 'app-list',
422
+ 'check-page',
423
+ 'commands',
424
+ 'connector.detail',
425
+ 'connector.list',
426
+ 'connector.list-actions',
427
+ 'connector.list-connections',
428
+ 'dingtalk-link',
429
+ 'dws.contact-user-search',
430
+ 'formula.evaluate',
431
+ 'get-page-config',
432
+ 'get-permission',
433
+ 'get-schema',
434
+ 'integration.check',
435
+ 'integration.diagnose',
436
+ 'integration.list',
437
+ 'list-forms',
438
+ 'process.preview',
439
+ 'verify-short-url',
440
+ ], permission('allow', 'read', {
441
+ reason: 'Read-only, diagnostic, validation, or manifest discovery command.',
442
+ })),
443
+
444
+ ...permissionEntries([
445
+ 'add-validation',
446
+ 'append-chart',
447
+ 'build-page',
448
+ 'cdn-config',
449
+ 'cdn-refresh',
450
+ 'cdn-upload',
451
+ 'compile',
452
+ 'configure-process',
453
+ 'connector.add-action',
454
+ 'connector.create',
455
+ 'connector.create-connection',
456
+ 'connector.gen-template',
457
+ 'connector.parse-api',
458
+ 'connector.smart-create',
459
+ 'copy',
460
+ 'create-app',
461
+ 'create-form.add-option',
462
+ 'create-form.bind-datasource',
463
+ 'create-form.create',
464
+ 'create-form.patch',
465
+ 'create-form.rule',
466
+ 'create-form.update',
467
+ 'create-form.validation',
468
+ 'create-page',
469
+ 'create-process',
470
+ 'create-report',
471
+ 'export-conversation',
472
+ 'externalize-form',
473
+ 'export',
474
+ 'flash-to-prd',
475
+ 'generate-page',
476
+ 'import',
477
+ 'integration.create',
478
+ 'integration.disable',
479
+ 'integration.enable',
480
+ 'publish',
481
+ 'sample',
482
+ 'save-permission',
483
+ 'save-share-config',
484
+ 'update-app',
485
+ 'update-form-config',
486
+ ], permission('allow', 'write', {
487
+ reason: ALLOW_WRITE_REASON,
488
+ })),
489
+
490
+ ...permissionEntries([
491
+ 'login',
492
+ 'logout',
493
+ 'update',
494
+ ], permission('allow', 'external', {
495
+ reason: ALLOW_EXTERNAL_REASON,
496
+ })),
497
+
498
+ ...permissionEntries([
499
+ 'connector.test',
500
+ ], permission('allow', 'external', {
501
+ reason: ALLOW_EXTERNAL_REASON,
502
+ })),
503
+
504
+ ...permissionEntries([
505
+ 'connector.delete',
506
+ 'connector.delete-action',
507
+ ], permission('ask', 'destructive', {
508
+ reason: 'Deletes or removes existing configuration.',
509
+ })),
510
+
511
+ ...permissionEntries([
512
+ 'a2a',
513
+ ], actionDependentPermission({
514
+ preauthorized_actions: ['serve'],
515
+ })),
516
+
517
+ ...permissionEntries([
518
+ 'aggregate-table',
519
+ ], actionDependentPermission({
520
+ preauthorized_actions: ['create-empty', 'save', 'publish'],
521
+ })),
522
+
523
+ ...permissionEntries([
524
+ 'ai',
525
+ ], actionDependentPermission({
526
+ preauthorized_actions: ['image --file'],
527
+ })),
528
+
529
+ ...permissionEntries([
530
+ 'agent-center',
531
+ ], actionDependentPermission({
532
+ preauthorized_actions: ['create', 'update', 'cancel'],
533
+ })),
534
+
535
+ ...permissionEntries([
536
+ 'ai-form-setting',
537
+ ], actionDependentPermission({
538
+ preauthorized_actions: ['enable', 'disable', 'save'],
539
+ })),
540
+
541
+ ...permissionEntries([
542
+ 'app-permission',
543
+ ], actionDependentPermission({
544
+ preauthorized_actions: ['set', 'add'],
545
+ ask_actions: ['remove'],
546
+ })),
547
+
548
+ ...permissionEntries([
549
+ 'auth',
550
+ ], actionDependentPermission({
551
+ preauthorized_actions: ['login', 'refresh', 'logout'],
552
+ })),
553
+
554
+ ...permissionEntries([
555
+ 'batch',
556
+ ], actionDependentPermission({
557
+ preauthorized_patterns: [{
558
+ type: 'option_value_excludes_any',
559
+ option: '--commands',
560
+ values: ['delete', 'remove'],
561
+ description: 'Inline batch commands that do not contain delete/remove.',
562
+ }],
563
+ ask_patterns: [{
564
+ type: 'argv_contains_any',
565
+ values: ['delete', 'remove'],
566
+ description: 'Batch command arguments or inline command text contains delete/remove.',
567
+ }],
568
+ })),
569
+
570
+ ...permissionEntries([
571
+ 'basic-info',
572
+ ], actionDependentPermission({
573
+ preauthorized_actions: ['domain set'],
574
+ })),
575
+
576
+ ...permissionEntries([
577
+ 'bridge',
578
+ ], actionDependentPermission({
579
+ preauthorized_actions: ['start'],
580
+ })),
581
+
582
+ ...permissionEntries([
583
+ 'corp-efficiency',
584
+ ], actionDependentPermission({
585
+ preauthorized_actions: ['notify'],
586
+ })),
587
+
588
+ ...permissionEntries([
589
+ 'corp-manager',
590
+ ], actionDependentPermission({
591
+ preauthorized_actions: ['add', 'address-book'],
592
+ ask_actions: ['remove'],
593
+ })),
594
+
595
+ ...permissionEntries([
596
+ 'data',
597
+ ], actionDependentPermission({
598
+ preauthorized_actions: ['create', 'update'],
599
+ ask_actions: ['delete'],
600
+ })),
601
+
602
+ ...permissionEntries([
603
+ 'db-seq-fix',
604
+ ], actionDependentPermission({
605
+ preauthorized_actions: ['--fix'],
606
+ })),
607
+
608
+ ...permissionEntries([
609
+ 'doctor',
610
+ ], actionDependentPermission({
611
+ preauthorized_actions: ['--fix'],
612
+ })),
613
+
614
+ ...permissionEntries([
615
+ 'dws',
616
+ ], actionDependentPermission({
617
+ preauthorized_actions: ['install', 'setup', 'todo task create', 'chat robot send'],
618
+ ask_actions: ['unrecognized dws command'],
619
+ })),
620
+
621
+ ...permissionEntries([
622
+ 'env',
623
+ ], actionDependentPermission({
624
+ preauthorized_actions: ['setup', 'switch', 'add'],
625
+ ask_actions: ['remove'],
626
+ })),
627
+
628
+ ...permissionEntries([
629
+ 'er',
630
+ ], actionDependentPermission({
631
+ preauthorized_actions: ['--output'],
632
+ })),
633
+
634
+ ...permissionEntries([
635
+ 'feedback',
636
+ ], actionDependentPermission({
637
+ preauthorized_actions: ['setup', 'dismiss'],
638
+ })),
639
+
640
+ ...permissionEntries([
641
+ 'i18n',
642
+ ], actionDependentPermission({
643
+ preauthorized_actions: ['upsert', 'translate', 'translate-all', 'upgrade'],
644
+ ask_actions: ['delete'],
645
+ })),
646
+
647
+ ...permissionEntries([
648
+ 'mcp',
649
+ ], actionDependentPermission({
650
+ preauthorized_actions: ['default'],
651
+ })),
652
+
653
+ ...permissionEntries([
654
+ 'nav-group',
655
+ ], actionDependentPermission({
656
+ preauthorized_actions: ['create', 'rename', 'move', 'order', 'hide', 'show'],
657
+ ask_actions: ['delete'],
658
+ })),
659
+
660
+ ...permissionEntries([
661
+ 'org',
662
+ ], actionDependentPermission({
663
+ preauthorized_actions: ['switch'],
664
+ })),
665
+
666
+ ...permissionEntries([
667
+ 'task-center',
668
+ ], actionDependentPermission({
669
+ preauthorized_actions: ['submit'],
670
+ })),
671
+ ]);
672
+
327
673
  function command(id, path, usage, descriptionKey, options = {}) {
328
674
  const commandSideEffect = COMMAND_SIDE_EFFECTS.get(id);
329
675
  if (!commandSideEffect) {
330
676
  throw new Error('Missing side effect metadata for command: ' + id);
331
677
  }
678
+ const commandPermission = options.permission || COMMAND_PERMISSIONS.get(id);
679
+ if (!commandPermission) {
680
+ throw new Error('Missing permission metadata for command: ' + id);
681
+ }
682
+ const normalizedPermission = normalizePermission(commandPermission, commandSideEffect);
332
683
 
333
684
  return {
334
685
  id,
@@ -343,6 +694,7 @@ function command(id, path, usage, descriptionKey, options = {}) {
343
694
  examples: options.examples || [],
344
695
  hidden: options.hidden === true,
345
696
  sideEffect: cloneSideEffect(commandSideEffect),
697
+ permission: clonePermission(normalizedPermission),
346
698
  };
347
699
  }
348
700
 
@@ -358,13 +710,10 @@ const COMMAND_GROUPS = [
358
710
  command('logout', ['logout'], 'logout', 'help.cmd_logout', { requiresLogin: false }),
359
711
  command('auth', ['auth'], 'auth <status|login|refresh|logout>', 'help.cmd_auth', { requiresLogin: false }),
360
712
  command('org', ['org'], 'org <list|switch>', 'help.cmd_org'),
361
- command('env', ['env'], 'env [--json]', 'help.cmd_env', {
713
+ command('env', ['env'], 'env [--json|setup|list|show|switch|add|remove] [options]', 'help.cmd_env', {
362
714
  requiresLogin: false,
363
715
  output: 'text|json',
364
716
  }),
365
- command('env-management', ['env'], 'env <setup|list|show|switch|add|remove>', 'help.cmd_env_management', {
366
- requiresLogin: false,
367
- }),
368
717
  ],
369
718
  },
370
719
  {
@@ -407,7 +756,7 @@ const COMMAND_GROUPS = [
407
756
  command('aggregate-table', ['aggregate-table'], 'aggregate-table <list|create-empty|inspect|preview|save|publish|status> <appType> ...', 'help.cmd_aggregate_table', {
408
757
  output: 'json',
409
758
  }),
410
- command('get-schema', ['get-schema'], 'get-schema <appType> <formUuid|--all>', 'help.cmd_get_schema'),
759
+ command('get-schema', ['get-schema'], 'get-schema <appType> <formUuid|--all> [--summary-json|--field-map-json]', 'help.cmd_get_schema'),
411
760
  command('er', ['er'], 'er <appType> [--format mermaid|json] [--output file] [--include-system] [--include-pages]', 'help.cmd_er', {
412
761
  output: 'text|json',
413
762
  }),
@@ -555,10 +904,7 @@ const COMMAND_GROUPS = [
555
904
  requiresLogin: false,
556
905
  output: 'text|json',
557
906
  }),
558
- command('batch.file', ['batch'], 'batch <file> [--stop-on-error] [--json]', 'help.cmd_batch', {
559
- output: 'text|json',
560
- }),
561
- command('batch.inline', ['batch'], 'batch --commands "cmd1 ; cmd2" [--stop-on-error] [--json]', 'help.cmd_batch', {
907
+ command('batch', ['batch'], 'batch <file>|--commands "cmd1 ; cmd2" [--stop-on-error] [--json]', 'help.cmd_batch', {
562
908
  output: 'text|json',
563
909
  }),
564
910
  command('flash-to-prd', ['flash-to-prd'], 'flash-to-prd --file <path> --name "<project>"', 'help.cmd_flash_to_prd', {
@@ -595,14 +941,20 @@ function localizeCommand(entry, translate) {
595
941
  examples: entry.examples,
596
942
  hidden: entry.hidden,
597
943
  side_effect: cloneSideEffect(entry.sideEffect),
944
+ permission: clonePermission(entry.permission),
598
945
  };
599
946
  }
600
947
 
601
948
  function summarizeLocalizedCommands(commands) {
602
949
  const sideEffectCounts = {};
603
950
  const idsBySideEffect = {};
951
+ const permissionModeCounts = {};
952
+ const idsByPermissionMode = {};
604
953
  const readOnlyCommandIds = [];
605
954
  const mutatingCommandIds = [];
955
+ const allowCommandIds = [];
956
+ const askCommandIds = [];
957
+ const denyCommandIds = [];
606
958
 
607
959
  for (const entry of commands) {
608
960
  const effect = entry.side_effect || {};
@@ -619,6 +971,21 @@ function summarizeLocalizedCommands(commands) {
619
971
  if (effect.mutates_yida === true || effect.mutates_local === true || kind === 'mixed') {
620
972
  mutatingCommandIds.push(entry.id);
621
973
  }
974
+
975
+ const permissionMetadata = entry.permission || {};
976
+ const mode = permissionMetadata.mode || 'unknown';
977
+ permissionModeCounts[mode] = (permissionModeCounts[mode] || 0) + 1;
978
+ if (!idsByPermissionMode[mode]) {
979
+ idsByPermissionMode[mode] = [];
980
+ }
981
+ idsByPermissionMode[mode].push(entry.id);
982
+ if (mode === 'allow') {
983
+ allowCommandIds.push(entry.id);
984
+ } else if (mode === 'ask') {
985
+ askCommandIds.push(entry.id);
986
+ } else if (mode === 'deny') {
987
+ denyCommandIds.push(entry.id);
988
+ }
622
989
  }
623
990
 
624
991
  return {
@@ -628,6 +995,11 @@ function summarizeLocalizedCommands(commands) {
628
995
  ids_by_side_effect: idsBySideEffect,
629
996
  read_only_command_ids: readOnlyCommandIds,
630
997
  mutating_command_ids: mutatingCommandIds,
998
+ permission_mode_counts: permissionModeCounts,
999
+ ids_by_permission_mode: idsByPermissionMode,
1000
+ allow_command_ids: allowCommandIds,
1001
+ ask_command_ids: askCommandIds,
1002
+ deny_command_ids: denyCommandIds,
631
1003
  core_workflows: {
632
1004
  full_app_fast_build: {
633
1005
  mode: 'fast_build',
@@ -643,6 +1015,11 @@ function summarizeLocalizedCommands(commands) {
643
1015
  'publish',
644
1016
  ],
645
1017
  optional_read_command_ids: ['get-schema', 'list-forms'],
1018
+ recommended_read_commands: [
1019
+ 'openyida get-schema <appType> <formUuid> --summary-json',
1020
+ 'openyida get-schema <appType> --all --summary-json --keyword <text> --output-dir .cache/openyida/<task>/schemas',
1021
+ ],
1022
+ default_data_contract: 'Do not use this.dataSourceMap.* in fast_build page code unless a designer data source was created and bound in the same run; use this.utils.yida.* or an entry-only page by default.',
646
1023
  optional_after_done_command_ids: [
647
1024
  'nav-group',
648
1025
  'data',
@@ -683,6 +1060,7 @@ function buildCommandManifest(options = {}) {
683
1060
  commands: group.commands.map(entry => entry.id),
684
1061
  })),
685
1062
  side_effect_schema: cloneSideEffectSchema(),
1063
+ permission_schema: clonePermissionSchema(),
686
1064
  summary: summarizeLocalizedCommands(localizedCommands),
687
1065
  commands: localizedCommands,
688
1066
  };
@@ -692,5 +1070,6 @@ module.exports = {
692
1070
  COMMAND_GROUPS,
693
1071
  buildCommandManifest,
694
1072
  flattenCommandManifest,
1073
+ listCommandPermissionIds,
695
1074
  listCommandSideEffectIds,
696
1075
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openyida",
3
- "version": "2026.7.12-1",
3
+ "version": "2026.7.13",
4
4
  "description": "OpenYida CLI - 宜搭低代码 AI 开发工具(安装即用,零配置)",
5
5
  "bin": {
6
6
  "openyida": "bin/yida.js",
@@ -257,11 +257,13 @@ openyida copy
257
257
 
258
258
  \`fast_build\` 只做:创建应用 → 核心表单 → 主页面 → 编写主页面源码 → 发布 → 返回访问链接。发布主页面成功并输出 URL 后即完成。
259
259
 
260
+ fast_build 页面源码默认不得使用 \`this.dataSourceMap.*\`,除非本轮已经明确创建并绑定设计器数据源;默认使用入口型页面或 \`this.utils.yida.*\` 查询已创建表单。
261
+
260
262
  不要默认加载 \`yida-page-uiux\`、\`yida-data-source-connectors\`、\`yida-data-management\`、\`yida-nav-group\`、\`yida-dashboard\`,也不要默认做示例数据、导航整理、截图验收、公开访问、长 PRD 或深读 references;这些只在用户明确要求或 \`full_demo\` / \`deep_design\` 时执行。
261
263
 
262
264
  ## 子技能索引
263
265
 
264
- 根据用户意图选择最匹配的子技能。支持 \`use_skill\` / \`search_skills\` 的宿主中,必须调用 \`use_skill("<技能名>", "<本次目的>")\` 加载子技能;不要用 Read / read_file / cat 读取 SKILL.md 路径。\`skills-index.json\` 仅供 yida-agent 或同构宿主机器发现,不支持该索引的宿主忽略它。完全没有 \`use_skill\` 的本地工具,才允许按根技能路由表选定技能,并按 \`skills/<技能名>/SKILL.md\` 定位当前阶段唯一必要的 SKILL.md,禁止并发批量读取多个 SKILL.md。
266
+ 根据用户意图选择最匹配的子技能。支持 \`use_skill\` / \`search_skills\` 的宿主中,必须调用 \`use_skill("<技能名>", "<本次目的>")\` 加载子技能;不要用 Read / read_file / cat 读取 SKILL.md 路径,也不要猜测 .skills、插件缓存或 workspace/project/.skills。\`skills-index.json\` 仅供 yida-agent 或同构宿主机器发现,不支持该索引的宿主忽略它。完全没有 \`use_skill\` 的本地工具,才允许按根技能路由表选定技能,并按 \`skills/<技能名>/SKILL.md\` 定位当前阶段唯一必要的 SKILL.md,禁止并发批量读取多个 SKILL.md。
265
267
 
266
268
  | 意图 | 子技能 |
267
269
  | --- | --- |