nocobase-ui-builder について
`nb` コマンドラインと Flow Surfaces を使って NocoBase の UI を作成するエージェントスキルです。Portal Manager を経由するルーティングを必須とし、ページ作成、部分編集、検証、エラー修復の手順を定めています。
主な機能
- 01Portal 優先のリクエストルーティング
- 02Flow Surfaces によるページ作成
- 03既存 UI の部分編集
- 04集約検証エラーの修復指針
- 05ナビゲーションとブロックの規則
活用シーン
- 01ノーコード Portal ページの作成
- 02既存ページ UI の編集
- 03作成ペイロードの検証エラー修復
MCP 対応
このスキルは公開トランスポートとして `nb` を使い、Flow Surfaces 経由で UI を書き込みます。NocoBase の UI 作成と検証の手順を定めています。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ nocobase/ skills --skill nocobase-ui-builderインストール後、Claude Code で/nocobase-ui-builderを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlreferences/ai-employee-actions.mdaliases.mdboundary-quick.mdcapabilities.mdchart-core.mdchart-validation.mdchart.mdcli-command-surface.mdcli-transport.mddashboard-routing.mdexecution-checklist.mdhelper-contracts.mdindex.mdreferences/blocks/calendar.mdchart.mdcomments.mdcreate-form.mddetails.mdedit-form.mdfilter-form.mdgrid-card.mdindex.mdkanban.mdrecord-history.mdtable.mdtree.mdreferences/js-models/index.mdjs-action.mdjs-block.md詳細
目標
- エージェント向けの書き込みパスは、未加工のビジネスペイロードを指定する
nb api flow-surfaces <action>です。 - バックエンドの
flow-surfacesは作成コンパイラーです。互換性のあるペイロードを正規化し、重大な検証エラーを集約したerrors[]を返します。 - 作成時に集約された
errors[]は、修正すべき問題の全件をまとめたものです。バックエンドが提供するerrorCount、各エラーのpath/ruleId/details、およびagentInstructionを使って、列挙されたすべての問題を1つのペイロード改訂で修正し、同じ書き込みを再試行してください。必須の Portal 事前確認 にある Portal のナビゲーションエラーは、対象または実装パスの失敗であり、ペイロード修正の一括処理ではありません。 - 公開トランスポートとして
nbのみを使用してください。nbが見つからない、または古い場合は、別のトランスポートに切り替えず、ブロックされているコマンド/環境の状態を報告してください。 - ルーティングは意図を優先してください。ディレクトリ全体ではなく、最初に一致するクイックルートのドキュメントを1つ開いてください。
- すでに一致するクイックルートがある場合は、そのルートを使い続けてください。ドキュメントを再発見するためだけにスキルディレクトリを列挙しないでください。
- リクエストが部分一致、または引き継ぎのみの場合は、このスキルの対象範囲の境界に沿って直接回答してください。引き継ぎの根拠を示すためだけに、ランタイム、スクリプト、ヘルパードキュメントを調べないでください。
- 1つのユーザーリクエストが複数のページにまたがる場合は、ページごとに順番に処理してください。同じ
navigation.group.titleを共有する複数のページは直列化します。最初のページでタイトルを解決してrouteIdを取得し、後続のページではそのrouteIdを使用してください。タイトルのみでの作成は行わず、共有グループをタイトルのみで同時に作成することは禁止されています。 - ページ全体のナビゲーション対象のルールは navigation-targets.md に記載されています。解決済みの no-code Portal には、正確な
kind: "portal"とrouteNameの検出、およびnavigation.portalUidが必要です。Admin/Mobile レイアウトを直接対象とする方法は、capabilities.multiPortal === falseの場合に限り、レガシー方式として使用できます。同じタイトルを持つ重複した非モバイルグループには、明示的なrouteIdが必要です。共有グループのタイトルのみでの作成は、直列化してください。
必須の Portal Manager エントリーポイント
このスキル内の他の指示を適用する前に、同じユーザーリクエストに対して nocobase-portal-manage を読み込み、実行し、その通常の UI 構築ワークフローに従ってください。最初にクイックルートを開始したり、UI Builder のナビゲーション対象を調べたり、flow-surfaces を呼び出したりしないでください。
- 現在のリクエストに Portal Manager のルーティング結果がすでに含まれている場合は、それを使用し、Portal Manager を再度呼び出さないでください。これにより、no-code の UI Builder へのディスパッチがループするのを防ぎます。
- 有効な結果は、選択済みの有効な Portal 1件とその正確な
nameおよびportalType、capabilities.multiPortal === falseを示す明示的なレガシーの証拠、または Portal Manager によって検証済みのレガシー Flow Surfaces シグネチャ(Portal の対象検出がなく、コアのapply-blueprintと構造化読み取り機能がある)のいずれかに限られます。引き継がれたisDefaultマーカーは、表示/読み戻し用の情報にすぎず、選択の代わりにしてはなりません。 portalType === "no-code":選択済みの Portal コンテキストを使って、このスキルを続行してください。portalType === "ai":このスキルを終了し、同じリクエストを Portal Manager の AI Portal ソースコードパスで続行してください。選択されたレコード/情報にローカルの開発パスがない場合、Portal Manager は最初に Portal を取得する必要があります。- 有効な Portal が0件、未選択の Portal が複数件、またはタイプがない/サポートされていない場合は、Portal Manager の結果として扱ってください。UI Builder 内でこれらを回避しないでください。
ルーター
- ポータルを最優先する境界:必須の Portal Manager エントリが、このルーターへの唯一の入口です。有効な Portal が1つだけの場合は自動選択できますが、件数やデフォルト状態だけでは受け入れ条件を満たしません。選択されたレコードの
portalTypeが厳密にno-codeであると Portal Manager が報告した場合、またはcapabilities.multiPortal === falseであることを示す明示的な根拠がある場合に限り、ここから処理を続行してください。AI Portal が1つだけの場合は、flow-surfacesへの書き込みを行わずにこのスキルを終了し、同じリクエストの処理を Portal Manager のソースコード実装パスですぐに続けてください。開発パスが存在しない場合は、Portal Manager が先に Portal を取得します。AI Portal を使用するか、no-code Portal を作成するかを尋ねないでください。portalTypeがない、またはサポートされていない場合は、Admin にフォールバックせず、解決のため Portal Manager に戻してください。 - ページ全体の作成には、バックエンドの
applyBlueprint、nb api flow-surfaces apply-blueprint、および ページ全体のクイックガイドを使用します。 - AI 社員/AI アシスタントのアクション作成は、ページ全体の書き込み、または
flow-surfacesの局所的な書き込みの範囲内で行います。リクエストに AI 社員の配置、AI 分析ボタン、AI アシスタント、または AI タスクの再設定が含まれる場合は、ai-employee-actions.mdを読んでください。既存の表示ユーザー名のバインドを超えて、社員の検索、マッチング、作成、プロンプト/モデル/スキル/ツールの設定、またはライフサイクルの判断が必要な場合に限り、最初にnocobase-ai-employeeを使用します。 - ダッシュボード/KPI/概要のルーティング:ダッシュボードのルーティング
- コメントとレコード履歴は、公開されている Flow Surfaces のブロックタイプを通じてルーティングします。リクエストにコメント、ディスカッションスレッド、履歴、監査履歴、または変更履歴が含まれる場合は、comments.mdまたはrecord-history.mdを読んでください。
- カレンダー/スケジュール/イベントビューの作成には
CalendarBlockModelを使用します。リクエストに 日历、calendar、排期、日程、事件视图、または 排班 が含まれる場合は、calendar.mdを読んでください。 - メニュー、ページエントリ、
routeId、pageSchemaUid、レイアウト/ワークスペースのスコープ、およびページ重複時の識別に関する判断には、navigation-targets.mdを使用します。表示可能なデスクトップメニューの検索にはnb api resource list --resource 'desktopRoutes:listAccessible' --no-paginate -jを使用してください。メニュー項目を探すためだけに、利用できない desktop-routes 系 CLI、menus、catalog、またはdescribe-surfaceを試さないでください。 - 既存のサーフェスへの局所的な編集には、
compose、configure、update-settings、add-*、move-*、remove-*などのバックエンドアクションと、局所編集のクイックガイドを使用します。 - 既存のサーフェスへの局所的なリアクション作業は、
get-reaction-metaから始め、set*Rulesで書き込み、reaction-quick.mdを参照します。初回のページ全体のリアクションは、実行時のget-reaction-metaを使わずにreaction.items[]内で処理します。成果物のみの局所的なリアクション草案では、予定しているget-reaction-metaの確認を記録してください。 - 部分一致または境界のみを扱うリクエストは、まず境界のクイックガイドを使用します。
- ルートが明確になった後、テンプレート/参照/
copyのルーティングが実際に対象となる場合は、まずテンプレートのクイックガイドを読み、次に全体の判断マトリクスとして templates.mdを読んでください。 - 実際の nb body を準備するまで、tool-shapes.mdを開かないでください。
- タスクに JS の
code、renderer: "js"、jsBlock、jsColumn、jsItem、JS アクション、チャート、またはctx.*API に関する質問が含まれる場合は、まず js.md、次に js-surfaces/index.md、その次に js-snippets/index.md、最後に js-reference-index.mdを読んでください。その意図にポップアップ/ドロワー/ダイアログ/ドリルダウンを開く処理が含まれる場合は、popup-openview.mdも読んでください。JS を書き込む前に、テンプレート優先で、ポップアップに対応した FlowModel を解決してください。 - ペイロードまたは RunJS body で
defaultFilter、dataScope.filter、resource.setFilter()、リクエストのparams.filter、または{ path, operator, value }形式の条件を明示的に作成する場合は、必ず最初にfilterトピックでnocobase-utilsスキルを読み込み、次に Filter Condition Formatを読み、末端フィールドのライブメタデータを確認してください。ホストが求める UI Builder の形式は維持しつつ、演算子には末端フィールドのフロントエンド許可リストにあるものだけを選んでください。日付の比較には$dateBefore、$dateAfter、$dateNotBefore、または$dateNotAfterを使用し、$lt、$lte、$gt、$gteは使用しないでください。 - 現在のタスクでまだ使用していない
flow-surfacesアクションを使う前に、利用可能な場合はnb api flow-surfaces <action> --helpを実行してください。 - このスキルで保持されている唯一のローカルヘルパー CLI は
nb-template-decisionです。このリポジトリのルートからnode skills/nocobase-ui-builder/runtime/bin/nb-template-decision.mjsを使って呼び出すか、このスキルの同等の絶対パスを使ってください。最初にヘルパー名だけで試さないでください。
必須の Portal 事前確認
ページ全体への書き込みと部分的な書き込みを含め、flow-surfaces を変更する前に、このゲートを完了してください。
- Mandatory Portal Manager Entry が生成した現在のリクエストの結果を確認します。それがない場合は、UI Builder で何かを行う前に、エントリーに戻って Portal Manager を実行してください。
- 現在のリクエストに Portal の解決結果がない場合、または複数の Portal が未選択のままの場合は、書き込みを行わずに停止し、リクエストを
nocobase-portal-manageにとどめてください。 - 有効な Portal が 1 つだけ選択されている場合、Portal Manager が選択されたレコードの
portalTypeを報告することを必須とします。Portal が 1 つしか存在しないことや、Portal にisDefaultのマークが付いていることだけでは、決して十分ではありません。 portalType === "no-code"の場合に限り、UI Builder を続行してください。portalType === "ai"の Portal が 1 つだけ選択されている場合は、UI Builder を終了し、同じビルドリクエストを Portal Manager のソースコード経路ですぐに続行します。選択された Portal のプロジェクトを特定し、選択されたレコード/情報に開発パスがない場合は、まずnb portal pull <portal>を実行してから、実装とテストを行ってください。元のビルドリクエストはこの引き継ぎをすでに許可しているため、AI Portal と no-code Portal の作成のどちらかをユーザーに選ばせないでください。また、UI Builder を終了したことだけを理由に、タスク全体を停止しないでください。タイプがない場合、または未対応のタイプの場合は、書き込みを行わずに終了し、互換性のあるスキルまたは実装経路を選択するため Portal Manager に戻ってください。Admin にフォールバックすることは決してありません。- no-code Portal が確認されたら、選択された Portal の空でない
nameを必須とし、navigation-targets.md の説明に従って、空でないnavigation.portalUidを解決してください。マッピングが存在しないか曖昧な場合は、書き込みを行わずに停止してください。 - 従来の Admin/Mobile レイアウト経路には、
capabilities.multiPortal === falseの明示的な証拠、または Portal Manager による検証済みの従来の Flow Surfaces シグネチャのいずれかが必要です。単に欠落している、true である、失敗した、認可されていない、サーバーエラーである、または不明瞭な機能結果は、従来型である証拠にはなりません。 - マルチポータルのページ全体の作成では、解決済みの
navigation.portalUidを含め、navigation.layoutUidを省略し、admin-layout-modelへの再試行を決して行わないでください。モバイルバックエンドの no-code Portal もnavigation.portalUid経由で開始し、その後、バックエンドのモバイルルート規則に従います。
バックエンドの Portal ナビゲーションエラーは停止/引き継ぎのシグナルであり、一括作成ペイロードの修復対象ではありません。
navigation-portal-type-unsupported:同じ書き込みでの再試行を停止し、Admin に切り替えず、選択された AI Portal のソース経路に引き継いでください。navigation-portal-selection-required:すべての書き込みを停止し、Portal Manage を通じて Portal を選択するようユーザーに依頼してください。navigation-portal-not-found:停止し、Portal Manage を通じて要求された Portal を作成または確認するようユーザーに依頼してください。navigation-admin-layout-not-portal-target:Portal の解決をやり直してください。Admin への書き込みを続けるためにペイロードを変更しないでください。
必須ブロックタイプのエラーからの復旧
- ユーザー要件またはセマンティックルーティングによって
jsBlockが選択された場合、作成エラーが発生しても、そのセクションはjsBlockのままにしてください。ペイロードの形式(settings.codeまたはassets.scripts.<key>.codeとblock.script)を修正し、同じブロックタイプで再試行してください。エラーを回避するためだけに、table、list、chart、actionPanel、gridCard、markdown、または後回しにする旨の注記に置き換えてはいけません。 - ユーザー要件またはセマンティックルーティングによって
chartが選択された場合、作成エラーが発生しても、そのセクションはchartのままにしてください。ペイロードの形式(ページ全体のブループリントではassets.charts.<key>.query、assets.charts.<key>.visual、およびblock.chart、またはローカライズされたsettings.query/settings.visual)を修正し、同じブロックタイプで再試行してください。エラーを回避するためだけに、table、list、jsBlock、actionPanel、gridCard、markdown、または後回しにする旨の注記に置き換えてはいけません。 - 必須の
jsBlockまたはchartに対する集約されたerrors[]の応答は、現在のペイロードが無効であることを意味します。必須のブロックタイプを変更してよいという許可ではありません。ユーザーが要件を変更した場合、またはバックエンドが現在のコンテナーではそのブロックタイプをサポートしていないと明示した場合に限り、ブロックタイプを変更してください。 - 必須の
jsBlockまたはchartが、ドキュメントに記載された修正を試みても作成できない場合は、代替ブロックで完了したと主張するのではなく、最新のエラーの証拠を添えて、その特定のセクションが未完了であると報告してください。
厳守事項
- 必須の Portal Preflight が成功した後は、nb への書き込みに
nb api flow-surfaces <action>を直接使用します。生のビジネスペイロードを一度だけ送信し、事前にラッパーエンベロープ、cliBody、ローカルヘルパーの出力を作成しないでください。 - 通常の単一ページリクエストでは、実際のタブを正確に1つだけ使用することをデフォルトとします。ユーザーから求められていない限り、空のタブやプレースホルダーの
markdown/メモ/バナーブロックを追加しないでください。 - ブループリントの
fields[]エントリーは、デフォルトで単純な文字列にします。popup、target、renderer、フィールド固有のtype、またはライブフィールドのdescriptionから推測される明確なフォーム動作が必要な場合に限り、フィールドエントリーをオブジェクトにします。 - ページ作成では、フィールドの正確な情報はライブコレクションメタデータから取得します。
nb api data-modeling collections get --filter-by-tk <collection> --appends fields -jを優先します。このコマンド群を利用できない場合は、nb api resource list --resource collections --filter '{"name":"<collection>"}' --appends fields -jを使用します。作成時の正確な情報としてdata-modeling fields list/nb api data-modeling collections fields listを使用しないでください。ブループリントのfields[]で使用するフィールドには、空でないinterfaceが必要です。コレクションフィールドのdescriptionは、フォーム作成時に使う入力情報として扱います。任意の言語からの意味抽出にはエージェント/LLM を使用し、構造化された公開動作のみを出力してください。必要に応じて、prepare の前に正規化済みフィールドメタデータdescriptionBehavior.{settings,linkage}として出力できます。明確な静的必須ヒントはsettings.requiredに、低リスクの長さ/範囲/正規表現/件数制約はsettings.rulesまたはsettings.maxCountにします。同一フォーム内の条件付き必須/無効/非表示のヒントが明確な場合は、安定したローカルフォームターゲットを対象にreaction.items[]として出力し、生成されたローカルキーは必要な場合にのみ実体化します。バックエンド生成の追加/編集ポップアップでは、同じ動作をターゲットスコープのdefaults.collections.<collection>.formBehavior.addNew/editに指定します。条件の説明でフィールド名ではなくローカライズ済みの UI ラベル/タイトル(たとえばstatusの代わりに状态、highlightsの代わりに重点变化)が使われている場合は、ライブメタデータを通じてラベルを解決し、明示的なリンケージルールを出力してください。バックエンドのフォールバック解析に頼らないでください。利用可能な場合は、ライブのオプションvalue/ローカライズ済みlabelメタデータを使って条件値をマッピングします。settings.extraなどの補助テキストだけでは、条件付き必須/無効/非表示の動作を網羅したことになりません。実際のリンケージルールがフィールドを対象にしていない限り、そのフィールドをimplementedとしてマークしないでください。曖昧な説明は推測せず、補助テキストとして残します。NocoBase バックエンドに生の説明を解析させたり、任意の言語を網羅するために決定論的なキーワードリストに頼ったりしないでください。ページ全体のapplyBlueprintでは、すべてのドラフトでライブメタデータから関係するコレクション全体を再計算し、古い断片を再利用せずにdefaults.collectionsを一から再構築します。関係するすべての直接コレクションについて、popups.view/popups.addNew/popups.editを安定した{ name, description }ディスクリプターとして出力するか、バックエンドに実体化させてください。また、ブループリントでaddNewを開く設定を明示していなくても、tableブロックがそのコレクションをaddNew閾値評価の対象にするようにします。fieldGroupsとformBehaviorはターゲットコレクションだけに指定します。固定の生成ポップアップシーンの1つで、シーンフィルタリング後も有効なフィールド数が10を超える場合に限り、defaults.collections.<collection>.fieldGroupsを追加します。それ以外は、互換性のあるデフォルトをバックエンドに実体化させてください。生成したデフォルトのfieldGroupsを確定する前に、コンパクトなセルフレビュー判定(approveまたはregenerate)を一度行い、実用上もっとも低い推論/no-think モードを使って最大1回だけ再生成します。バックエンドから集約されたフィールドグループエラーが返された場合は、ライブメタデータから意味的なグループを再生成して、一度だけ再試行します。関連フィールドでは、すべての関係スコープを、defaults.collections.<sourceCollection>.popups.associations.<associationField>.<action>の固定view/addNew/editの3種類に統一し、同じ{ name, description }コントラクトを使用します。キーには最初の関係セグメントだけを使います。関連ごとまたは関係スコープごとのfieldGroups/formBehaviorは作成しないでください。defaults.blocksは生成しないでください。また、defaults.collections.*.popupsの下にblocks、fields、fieldGroups、レイアウトを配置しないでください。 バックエンド生成の追加/編集候補フィールドに空でないdescriptionがある場合、説明のある生成フィールドごとに、構造化されたdefaults.collections.<collection>.formBehavior.addNew/editの出力、または兄弟プロパティdefaults.collections.<collection>.formBehaviorDescriptionReview.fields.<field> = { decision, reasonCode? }のいずれかで対応してください。実際のカバレッジが構造化されたformBehaviorまたは適用可能なreaction.items[]によって存在する場合に限り、decision: "implemented"を使用します。それ以外は、有効なreasonCodeとともにdecision: "noUiBehavior"または"unsupported"を使用してください。何もしないための逃げ道として、旧形式のfields: string[]、hasTried、formBehavior: {}、nullを送信しないでください。nullのレビュー項目は、生成候補のdescriptionが空の場合に限り使用できます。 layoutを指定できるのはtabs[]またはインラインpopupのみであり、ブロックオブジェクトには指定できません。createForm、editForm、detailsでは、デフォルトでfieldsLayoutを省略し、バックエンド作成処理に内部グリッドを生成させます。通常のフィールドは1行に2つ、divider、richText、vditorフィールドはライブコレクションメタデータに基づいて全幅の行になります。filterFormでは、prepare により引き続き1行に3つのコンパクトなfieldsLayoutが生成される場合があります。ブループリントで内部フィールドグリッドを直接制御する必要がある場合に限り、明示的なfieldsLayoutを使用します。そのタブ/ポップアップにフィルター以外のブロックが1つ以下の場合に限り、ページ/ポップアップのlayoutを省略できます。それ以外は明示的なレイアウトが必須です。同じタブ/ポップアップにフィルター以外のブロックが複数ある場合、テンプレートに裏付けられていない各データブロックにはタイトルが必要です。テンプレートに裏付けられたブロックは対象外です。フィルター以外のブロックが1つだけなら、ユーザーが明示的に求めない限りタイトルは省略できます。単一スコープのデータブロックに冗長なタイトルを指定した場合、バックエンド作成処理は保存されるブロックのタイトル表示を削除します。低レベルのset-layoutでは、公開形式の{ rows: [[{ key, span }]] }構文を再利用しないでください。実行時のrowsはRecord<string, string[][]>であり、各セル配列にはライブの子uidが積み重ねられます。[[uidA], [uidB]]は2列、[[uidA, uidB]]は縦積みの1列を意味します。createForm、editForm、detailsでは、ブロックに実フィールドが10個を超えて含まれる場合、フラットなfields[]リストではなく、明示的なfieldGroupsを使用します。手動のdivider項目を代用として扱わないでください。また、fieldGroupsとfieldsLayoutを併用しないでください。- 表示されたレコードまたは関連レコードをクリックすると詳細が開くべき場合は、フィールドポップアップを優先します。ボタンまたはアクション列を使用するのは、リクエストで明示的に求められた場合に限ります。
- ページ全体の
navigationの判断は、navigation-targets.md に従ってください。同じタイトルの重複する非モバイルグループでは、navigation.group.routeIdを明示する必要があります。モバイルターゲットではルートナビゲーションを使用し、グループを指定しません。非モバイルページの識別情報は、ターゲット、メニューグループのrouteId、ページタイトルの組み合わせです。同じグループで同じタイトルの場合は置き換えられることがありますが、同じタイトルでもグループ、レイアウト、Portal が異なれば、別のページと統合、再利用、自動置換されることはありません。選択されたノーコード Portal では、必ず厳密にマッピングされたnavigation.portalUidを使用し、navigation.layoutUidは省略します。ナビゲーションターゲットのデフォルト、レイアウトターゲット、バックエンドのlayoutUid値は無視します。Admin/Mobile レイアウトへの直接ナビゲーションは、レガシーレーンであることが確認できている場合に限り許可されます。 - 非モバイルの
applyBlueprint createでは、新たに作成するnavigation.groupと、トップレベルまたは第2階層のすべてのnavigation.itemに、有効な Ant Design アイコン名を1つ含める必要があります。モバイルで作成する場合、navigation.item.iconにはページエントリーのアイコンが必要で、グループアイコンは不要です。 - タイトルだけを指定する共有グループの作成は、順番に行います。非モバイルの最初のページでは
navigation.group.titleによる解決/作成が可能ですが、同じターゲットレイアウト内の後続ページでは、取得済みのnavigation.group.routeIdを使用する必要があります。 navigation.group.routeIdとデスクトップルートのidはナビゲーションロケーター専用です。create/init またはページ全体のapplyBlueprint成功後に、後続のローカライズ作業や明示的な調査が必要な場合は、ページレベルのflow-surfaces get用にpageSchemaUidに正規化します。catalog、context、get-reaction-meta、compose、configure、add*、remove*には、get/describe-surface/作成レスポンスから返されたライブのuid値だけを使用してください。デスクトップルートのidをtarget.uidとして渡さないでください。アーティファクトのみのロケーター引き継ぎでは、機械可読フィールドnavigation.routeId、page.pageSchemaUid、liveTargets[].uidを直接保持します。ライブuidがまだ存在しない場合は、nullではなく空でないプレースホルダー文字列を使用してください。- 最初の実際のページ全体
applyBlueprintを実行する前に、必須の Portal Preflight を完了し、計画に使うライブコレクション/ページ/メニューのメタデータが最新であることを確認したうえで、nb api flow-surfaces apply-blueprint --body-file <payload>.json -jを呼び出します。バックエンドは、ソートエイリアス、高さモード、ポップアップのデフォルト、フィールドグループ、タイトルフィールド、ナビゲーショングループのタイトル一致、テンプレートに関する判断、直接データサーフェスで省略されたdefaultFilterグループなど、互換性のあるデフォルトを解決します。明示的な無効なデフォルトフィルターは、集約errors[]を返します。バックエンドから集約された作成エラーerrors[]が返された場合は、問題をすべてまとめて修正してから生のペイロードを再試行します。最初のエラーだけを修正してすぐにapplyBlueprintを再度呼び出さないでください。前述の4つの Portal ナビゲーションエラーが発生した場合は、このループを停止します。 - 更新アクションのフィールド割り当てには、公開 API の
settings.assignValuesのみを使用します。bulkUpdateはブロックのactionsに属するコレクションアクションです。updateRecordはrecordActionsに属するレコードアクションです。assignValuesはホストコレクションのメタデータにあるフィールドをキーとする単純なオブジェクトでなければなりません。{}は有効で、割り当て値をクリアします。求められたアクションが 图标按钮/仅图标/アイコンボタンと説明されている場合は、公開設定settings.iconとsettings.iconOnly: trueを設定して、その視覚的な意図を維持します。submit/update-record のワークフローバインディングには、公開 API のsettings.triggerWorkflowsまたはconfigure.changes.triggerWorkflowsのみを使用します。各行は{ workflowKey, context? }で、[]はバインディングをクリアし、nullは無効です。これらのアクション設定にadd-fields、生のflowModels、AssignFormGridModel、AssignFormItemModel、内部のstepParamsを使用しないでください。 AI 従業員アクションには、公開 API のtype: "aiEmployee"とsettings.username、settings.auto、settings.workContext、settings.tasks、settings.styleのみを使用します。既存の AI 従業員アクションも、configure.changesまたはupdate-settingsの同じキーを使って再設定します。applyBlueprint/composeにおけるワークコンテキストの参照には、target: "self"または同じ実行内のブロックキーを使用できます。ローカライズ編集ではselfまたはライブ Flow Model のuidを使用します。バックエンドがデフォルトでflow-modelを設定するため、typeは省略可能です。タスクのプロンプトはtasks[].message.userまたはtasks[].promptエイリアスに指定し、両方には指定しないでください。ショートカットのために生の AIprops、stepParams、flowModels、データベース行を書き込まないでください。 - 正規化されて保存された書き込み形式の正確な情報源は、バックエンドレスポンスです。ページ全体の作業には、ページ全体の作成/置換、1つのルートに基づくタブの完全な構築、複雑な複数ブロックページ、ネストされたポップアップを含むページ、複数のリアクションファミリーを持つページが含まれます。書き込み前の読み取りとメタデータの取得は許可されますが、そのルートで最初に行う変更書き込みはバックエンドの
applyBlueprintでなければなりません。applyBlueprintの成功レスポンスをデフォルトの停止地点とします。後続のローカライズ作業または明示的な調査でライブ構造が必要な場合に限り、追加のgetを実行します。この追加の読み戻しを行わない場合は、正規化された保存済みサブツリーとしてではなく、成功レスポンスとリクエスト意図に基づいて書き込み内容を報告してください。 - デフォルト値、計算値、フィールド/ブロック/アクションの状態、表示/非表示は、まずリアクション作業として扱います。生の configure キーを推測しないでください。
- JS/RunJS の書き込みペイロードでは、複数行の読みやすいソースを維持してください。
value.source: "runjs"、jsBlock/jsItem/JS アクション、チャートの生コード、その他のcodeフィールドでは、書き込み前に、実際の改行文字と2スペースのインデントを使って、簡潔でないコードを作成します。周囲のペイロードが JSON だからといって、複数の文、ローカル変数の設定、条件分岐、文字列の組み立てを1行に圧縮しないでください。JSON 文字列内では改行を\nとしてエンコードします。設定や分岐がない短い return/式1つだけなら、1行のままでも構いません。jsBlockの公開ペイロードには厳密なルールがあります。新しいインラインブロックにはtype: "jsBlock"と必須のsettings.code、任意のsettings.versionを使用します。既存の JSBlock のconfigureにはchanges.code/changes.versionを使用します。ページ全体でアセットを再利用する場合は、ブロックのscript: "<key>"とともにassets.scripts.<key>.codeを使用します。デフォルトのテンプレートコードに依存するタイトルだけの JSBlock は作成しないでください。jsBlockでは、ブロック直下のcode、ブロック直下のversion、手書きのstepParams、内部のprops/decoratorProps/flowRegistryを作成しないでください。また、scriptとインラインのコード/バージョンを併用しないでください。 ポップアップを開く JS/RunJS/チャートコードでは、コードを書く前に、テンプレートを優先するポップアップ/openView の経路を使用します。コードからctx.openView(triggerUid, ...)を呼び出すことはできますが、triggerUidは既存のポップアップ対応 FlowModel のuidでなければなりません。通常は、openView.uidのtargetUidがpopupTemplateUid/popupTemplateMode="reference"を持つテンプレートターゲットを指すポップアップホストです。デフォルトのトリガーターゲットとして、ChildPageModel、ページ、タブ、ポップアップサブツリー、一時的なuidを使用しないでください。 ポップアップブロック/設定が消費する実行時値(たとえばテーブルのdataScope用チャートドリルダウンフィルター)は、metaを含むdefinePropertiesを通じて渡し、{{ctx.drilldownValue}}のようなトップレベル変数として読み取ります。ポップアップブロック設定に{{ctx.view.inputArgs.params.*}}を生成しないでください。保存されるアクションがこれらの変数用のチャートctx.openView()ホストだけである場合は、actionLinkageでそのホストを非表示にします。チャート専用のdefinePropertiesに依存するポップアップを、表示される行アクションとして残さないでください。 - ライブ読み戻しで既存のテンプレート参照が確認され、変更対象がテンプレート所有コンテンツである場合は、テンプレートソースをデフォルトとします。ホスト/openView の設定変更はローカルのままにします。ページ単位の文言はローカル限定の意図を意味しないため、自動的に
copyに切り離さないでください。スコープが明確でない場合は、書き込む前に確認してください。判断アーティファクトでは、テンプレート所有コンテンツの経路とホスト/openView 設定の経路を、それぞれtemplateOwnedContentRouteとhostOpenViewConfigRouteとして別々に記録します。 - インラインポップアップのオープナーを
popup.templateに結び付けるapplyBlueprintの成功レスポンスは、テンプレート再利用に成功した結果であり、構造上の欠落ではありません。送信されたブループリント内のインラインpopup.blocksは、テンプレートが見つからない場合のフォールバックコンテンツです。バックエンドが互換性のあるポップアップテンプレートを選択した場合、これらが保存される必要はありません。正規化レスポンスに展開済みのローカルポップアップブロックではなくテンプレート参照が表示されるという理由だけで、テンプレート再利用の確認を削除したり、replaceに切り替えたり、copyに変換したり、ページ全体を再実行したりしないでください。ユーザーが「不要模板」「只改当前」、copy、detach、「本地独立」のようにローカル限定の動作を明示的に求めた場合に限り、インライン/ローカルのポップアップコンテンツを強制します。ポップアップテンプレートの厳密なフラグについては、template-quick.md と templates.md に従ってください。 - テストまたはマルチエージェント実行では、ユーザーが削除を明示的に依頼した場合を除き、破壊的なクリーンアップを実行しないでください。
- ユーザーまたはローカルヘルパーアーティファクト向けに、実際に保存済みの読み戻し内容を要約する場合は、
table、details、editForm、filterForm、createFormなど、正規化された型ラベルを使用する安定した公開サマリーを優先します。生のモデル名だけに頼らないでください。ページレベルの作成/置換では、サマリーにpage.pageSchemaUid、page.pageTitle、page.menuGroupTitleを明示します。複数のページにまたがるシナリオでは、同じ正規ページ識別キーをpages.*の下で使用し、tables.*、lists.*、forms.*などの具体的なサマリーノードにはtypeを使用します。blockTypesは、root.blockTypesやpopups.*.blockTypesなどの集約配列に限って使用します。ルートアクションはroot.actionTitlesに配置し、証拠としてrecordActionTitlesだけを残さないでください。 - リアクション作業では、
get-reaction-metaによってそのシーンで必要なソースパスが利用可能であることを確認した後に限り、最終的なブロック/アクションターゲットを選択します。複数の機能を公開するターゲットでは、まずkindを照合して書き込みスロットを選び、その正確な機能フィンガープリントを再利用します。別のkindから近いフィンガープリントをコピーしないでください。現在のターゲットが必要なパスを公開できない場合は、サポートされないホストに推測したルールを書き込むのではなく、ターゲットを変更するか、ページ/ポップアップの構造を先に組み直します。 - 構造を選ぶ前に、フィルターに関する文言を判別してください。テーブル/リスト/gridCard/カレンダー/カンバン系データサーフェスで、曖昧な「筛选/filter」リクエストがある場合は、別のフィルターブロックではなく、同じホストのブロックレベルの
filterアクション/ボタンをデフォルトとします。テーブル/リスト/gridCard/カレンダー/カンバン/カード系のホストに検索を明示的に追加するリクエストの場合に限り、「搜索/search」も同様に扱います。「搜索页/搜索结果页/搜索门户/搜索列表页」のようにページを表す語が含まれる場合は、フィルターの意図ではなくページの意図として扱います。树筛选/树状筛选/tree filter/tree filter block/树形筛选区块はFilterFormBlockModelではなく、TreeBlockModelに直接割り当てます。書き込み前に references/blocks/tree.md を読んでください。「分析看板/dashboard/trend/概览」は、デフォルトでチャート/JSBlock のインサイト経路に割り当てます。トレンド、分布、ランキング、割合/占比、ビジュアル分析にはチャートを使用します。KPI/指標カード/数値統計/未読数形式の件数指標にはJSBlockModelを使用します。レコードカードを表す文言にはGridCardBlockModelを使用します。KanbanBlockModelに割り当てるのは、「看板区块/kanban/pipeline/status columns/拖拽/泳道/backlog」など、カンバンを示す手がかりがある場合に限ります。「看板」だけでは分析意図より優先されません。デフォルトで新しいfilterFormを作成しないでください。まず references/aliases.md を読んでください。ユーザーがフィルター/検索ブロック、フォーム、またはクエリエリアを明示的に求めており、その表現がツリーフィルターのリクエストではない場合に限り、references/blocks/filter-form.md を開き、最初のブループリントに実際のfilterFormを含めてください。その場合は、安定したフィルター項目、submit/resetアクション、低レベルのdefaultTargetUidや生のブロック設定ペイロードではなく、同じブループリント内の文字列targetブロックキーを含めます。 ダッシュボード指標に関する厳格なルール:
- リクエストされたサーフェスに KPI/指標カード/数値統計/統計カード/追踪产品数/未読数/今週の新規数/サマリー数値が含まれる場合、デフォルトで
JSBlockModelを使用します。 - パッシブな指標カードを
actionPanelとjsアクションで実装しないでください。 - 集約数値指標に
GridCardBlockModelを使用しないでください。 - ユーザー操作、ショートカット、アクションのエントリーポイントには
ActionPanelBlockModelのみを使用します。ただし、ユーザーがクリック可能なアクションカードを主要 UI として明示的に求めている場合は除きます。 - ダッシュボードのドラフトで純粋な数値サマリーが
actionPanel内に配置されている場合は、書き込む前にドラフトを再生成します。 - バックエンドから
jsBlock作成エラーが返された場合、最終再試行の指示では同じjsBlockペイロード(settings.codeまたはassets.scriptsとblock.script)を修正し、そのブロックタイプで再試行します。KPI エリアをtable、chart、actionPanel、gridCardに切り替えないでください。 - バックエンドからチャート作成エラーが返された場合、
details.repairHintに基づいて現在のチャートペイロードを修正し、chartとして再試行します。エラーを回避するためだけにブロックタイプを変更しないでください。コンテンツが KPI/サマリー数値であるというエラーの場合は、そのセクションをjsBlockとして再構築します。 - ダッシュボードのチャートゲート:リクエストでチャート/图表/Charts が明示的に求められている場合、またはトレンド/趋势、分布/分布、ランキング/排行、割合/占比が求められている場合、最初のダッシュボードドラフトには該当セクション向けの
type: "chart"ブロックを含める必要があります。チャート数が指定されている場合、applyBlueprintの前にペイロードに少なくともその数のチャートブロックを含める必要があります。 jsBlockの KPI カードとテーブル/リストのサマリーは、チャート要件の充足数に含めません。必須のチャートセクションがドラフトまたは読み戻しにない場合は、chartとして再生成または修正します。ダッシュボードが完成したと報告しないでください。- チャートが必須のページ全体を作成する場合、
applyBlueprintの成功だけでは不十分です。返されたpageSchemaUidを使ってflow-surfaces getを実行し、完了を報告する前にチャートブロックの存在を確認します。 - 調査やペイロードの検証にはプローブページを使用できますが、最終成果物には含めません。最終引き継ぎにプローブページを含めず、クリーンアップが安全な場合は、ユーザーの納品用メニューに残ったプローブページを削除してください。
テンプレートを使用しない直接のテーブル/リスト/gridCard/カレンダー/カンバンデータサーフェスでは、
defaultFilterを省略できます。バックエンド作成処理がライブコレクションメタデータから、スカラー/フィルター可能なフィールドを最大4つまで使って生成し、同じホストのfilterアクションに割り当てます。これらのフィールドを意図的に上書きする場合に限り、ブロックレベルのdefaultFilterまたはactions[].settings.defaultFilterを指定します。明示的なデフォルトフィルターには、コレクション内の直接対象となるインターフェースフィールド数と3のいずれか小さい方の数だけフィールドを含める必要があります。空、無効、関連フィールド、未知のパスを明示的に指定すると、バックエンドの集約errors[]によって拒否されます。テーブルブロックの設定には、settings.pageSize、settings.sorting、settings.dataScope、settings.density、settings.showRowNumbers、settings.treeTable、settings.dragSort、settings.dragSortByなどの公開キーを使用します。ブロック直下またはsettingsの下に、保存/内部キーのtableSettings、defaultSorting、stepParamsを書き込まないでください。直接の公開データサーフェスでは、部分指定のactionsはそのホストのデフォルト(filter/refresh/addNewと、テーブルではbulkDelete)とマージされます。通常のテーブルrecordActionsはview/edit/deleteとマージされますが、settings.treeTable=trueのツリーコレクションテーブルではview/edit/deleteは補完されません。ユーザーから明示的に求められない限り、ツリーテーブルではrecordActionsを省略し、デフォルトでバックエンドがaddChildだけを挿入するようにします。fields[]を明示するツリーテーブルでは、リスト内で必要なフィールドをすべて指定します。fields[0]は、ライブメタデータにある、直接読み取り可能で関連ではないフィールドでなければなりません。既存の後続フィールドが読み取り可能であれば、それを先頭に移動できます。明示的なfieldsにtitle/nameのフォールバックを挿入しないでください。また、読み取り可能な直接フィールドを含まない明示的なリストは拒否します。fields[]を省略した場合に限り、デフォルトの先頭フィールドは、メタデータの優先順位に従ってtitleField、次にname、code、title、その後に空でないinterfaceを持つ別の直接フィールドから選択されます。id、uid、uuid、parentId、主キー/外部キー、xxxId/xxxUid、_id、_uidを先頭にしないでください。ユーザーが別のフィルターブロックを明示的に求めていない限り、フィルター/検索の意図は同じホストのブロックレベルfilterアクションに割り当てます。 テンプレートを使用しないページ全体のapplyBlueprintでは、カンバンのメインブロックに明示できるカードfields[]は最大2つです。フィールドを省略すると、ライブメタデータから表示に適したフィールドが最大2つまで実体化されます。明示的に上限を超えた場合は、切り詰めずにkanban-main-fields-too-manyが返されます。同じapplyBlueprint経路ではsettings.dragEnabled=trueがデフォルトになります。互換性のあるソートフィールドがある場合に限りsettings.dragSortByを送信し、それ以外は書き込み可能なメインデータソースコレクションに隠しソートフィールドをバックエンドに作成させます。明示的にdragEnabled=falseを指定すると無効になり、明示的に互換性のないdragSortByを指定すると拒否されます。
- ローカライズされた
compose/add-block/add-blocks/configureの本文を作成する場合は、nb api flow-surfaces <action>に直接送信します。バックエンド作成パイプラインは、書き込みの副作用が発生する前に互換性の正規化と厳格な検証を実行します。集約されたerrors[]が返された場合は、最初のエラーだけではなく、リスト全体を修正します。commentsとrecordHistoryには公開ブロックキーのみを使用し、ローカライズされた追加を行う前にcatalogを確認します。ページブロックのcommentsにはコメントテンプレートコレクションが必要です。ポップアップのコメントには、コメントテンプレートコレクションへのhasManyまたはbelongsToManyの関連を持つresource.binding: "associatedRecords"が必要です。recordHistoryブロックには、実際のfilterTargetKeyを持つコレクションが必要です。現在のレコードの履歴は、1レコードのみのポップアップ/詳細シーンでしか有効ではありません。関連履歴リソースは無効です。これらのチェックを回避するために、生のCommentsBlockModel、RecordHistoryBlockModel、CommentItemModel、props、stepParams、生のスキーマを書き込まないでください。 - ページ全体の最初の書き込みが成功した
applyBlueprintの後もfilterFormが空の枠のままの場合は、明示的なローカル/ライブの欠落として扱い、低レベルのaddBlock/addAction/addFieldによる修正は狭い範囲に限定します。最初のapplyBlueprintが、filterForm固有の形状/実行時エラーで失敗したことが確認できている場合は、バックエンドの集約エラーに基づいてブループリントを修正し、ブループリントのみで最大5ラウンド再試行します。成功前の再試行中に低レベルの書き込みへ切り替えないでください。5ラウンド失敗した後は、最新のブループリント/エラーの証拠を報告します。 - 作成/編集フォームのヘルパーまたは参照が
formValues.*に依存する場合は、ホストを選ぶ前に catalog/get-reaction-metaを調べます。そのライブシーンでfields/actions/nodeが公開されていてもblocksが公開されていない場合は、独立したブロックではなく、同じフォームシーン内のjsItemまたは他のフィールド系ヘルパーとしてモデル化します。現在の JSItem ターゲットでは、setFieldStateが JSItem を対象にできると仮定せず、フォーム値が存在するまでnullをレンダリングして非表示/表示を実装します。この render-null パターンの使用に成功した場合は、読み戻し/証拠では設定済みのヘルパー切り替えとして扱います。fieldLinkageが JSItem 自体を対象にできないという理由だけで、ヘルパーの結果を未実装として扱わないでください。 - 複数の作業領域、フィルター/検索ブロック、ネストされたポップアップ、または複数のリアクションファミリーがあるページは、別のルーター経路ではなく、複雑なページ全体のリクエストとして扱います。引き続き whole-page-quick.md に従い、
applyBlueprintを1回だけ使う方法を優先します。 - これらの複雑なページ全体のリクエストでは、最初のブループリント生成時に、構造ブロック、インラインポップアップ、トップレベルの
reaction.items[]をまとめて含める必要があります。ページが大規模だからといって、ルートシェル/ポップアップ/リアクションのフェーズに分割しないでください。 - 低レベルの
get-reaction-metaとset*Rulesまたはadd*による修正は、既存のライブページに対するローカライズ編集、またはページ全体のapplyBlueprint成功後に明示的なローカル/ライブの欠落があり、狭い範囲での修正が必要な場合に限り使用します。ページ全体のapplyBlueprintが一度成功する前に、createMenu、createPage、compose、configure、update-settings、add*、move*、remove*、set*Rulesを使用しないでください。ページ全体のapplyBlueprintが初回成功前に失敗した場合は、バックエンドの集約エラーに基づいてブループリントを修正し、ブループリントのみで最大5ラウンド再試行します。成功前の再試行中に低レベルの書き込みへ切り替えないでください。5ラウンド失敗した後は、最新のブループリント/エラーの証拠を報告します。 - 一般的なスキルコントラクトでは、環境に依存しない状態を保ってください。ローカルのエイリアスや固定 URL をハードコードせず、現在設定されている CLI 環境または明示的なランタイムフラグを使用します。
読み取りパス
- ルートが不明な場合:references/index.md
- 業務上の意図に基づくページ全体の下書き作成/作成/置き換え:whole-page-quick.md
- ページ全体のナビゲーションレイアウト、グループ、ルート、および重複ページの識別ルール:navigation-targets.md
- ダッシュボード/KPI/概要のルーティング:dashboard-routing.md
- 既存画面の局所編集:local-edit-quick.md
- AI 従業員のアクション配置またはタスク編集:ai-employee-actions.md
- カレンダー/スケジュール/イベント表示ブロック:calendar.md
- コメントまたはレコード履歴ブロック:comments.md、record-history.md
- ページ全体または局所的なリアクション変更:reaction-quick.md
- 部分一致への対応と範囲を絞った引き継ぎレポート:boundary-quick.md
- 再利用、テンプレート選択、または既存テンプレート参照の編集:template-quick.md
- JS またはチャート関連の作業:js.md または chart.md
対象範囲と引き継ぎ
portalType === "no-code"であることを明示的に確認した選択済み Portal が 1 つある場合、またはcapabilities.multiPortal === falseが確認されたレガシーランタイム内の場合に限り、Modern page (v2) のメニュー/ページ/タブ/ポップアップ/コンテンツ画面と、その中のブロック/フィールド/アクション/レイアウト/リアクション作業のみを扱います。型が未確認、または no-code 以外の型である単一の Portal は対象外です。- 未解決のページ/UI リクエストは、ナビゲーションの調査や変更を行う前にすべて
nocobase-portal-manageへ引き継ぎます。Portal Manage は、選択済みの no-code Portal のみをこのスキルに返します。選択されている Portal が AI のみの場合は、UI Builder を終了し、確認を求めたり no-code Portal の作成を提案したりせず、Portal Manage のソースプロジェクトを通じて元のリクエストを続行します。nb portalが存在しない場合は、機能チェックでmultiPortal === falseが明示的に確認された場合に限り、ここに戻ります。 - 部分一致または境界レポートのタスクでは、Modern page の対象範囲を狭く保ち、この境界リストに基づいて直接引き継ぎレポートを作成します。リクエストが明示的にその仕組みに関するものでない限り、ランタイムやスクリプトを調査しないでください。
- ACL/ルート権限/ロール権限は
nocobase-acl-manageへ引き継ぎます。 - コレクション/フィールド/リレーションの作成・編集は
nocobase-data-modelingへ引き継ぎます。 - ワークフローの作成/更新/改訂/実行は
nocobase-workflow-manageへ引き継ぎます。 - アプリ構築の改訂作成は
nocobase-revisionへ引き継ぎます。
改訂ルール
- Portal のルーティング、対象選択、メタデータ計画、事前チェック、書き込みの失敗、または検証未完了の間は
nocobase-revisionを読み込まないでください。 - 意味のある UI への書き込みが成功し、必要な検証が完了した後に限り、ラウンドの最後に一度だけ
nocobase-revisionを読み込みます。このスキルを利用できない場合は、改訂ルールの要件をすべて無視し、nocobase-revisionに関する情報をユーザーに開示しないでください。 nocobase-revisionによってnb revision createが利用可能であることが確認される前に、改訂に関する情報をユーザーに開示しないでください。- 利用可能であることが確認された後は、ユーザー向けの最終返信の直前、ラウンドの最後に改訂の判断を一度だけ行います。
- 改訂を作成した場合は、そのことを明確に報告します。
- 利用可能であることが確認されていたものの改訂を作成しなかった場合は、具体的な理由を伝えます。
コメント
Markdown 対応