mvframe 1.0.72 → 1.0.73

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.
package/README.cn.md CHANGED
@@ -163,7 +163,7 @@ yarn build
163
163
 
164
164
  ## 命令行:项目目录雏形(推荐)
165
165
 
166
- 在**空目录或已有 Vite 工程根目录**执行,生成 `src/views`、`src/component`、`src/api`、`src/assets/img`、`src/assets/style`、`src/router`、`src/pinia/chip`、`src/config` 及示例 `main.js` / `App.vue`(已 `app.use(mvframe, …)` 挂好路由、Pinia `storeChips`、config),并复制 **`/.cursor/rules/*.mdc`**(与 mvframe 仓库内 Cursor 规则一致)。若不存在则附带 `index.html` 与 `vite.config.js`。会**合并** `package.json` 的 `scripts` / `dependencies` / `devDependencies`(与 Vite 模板一致;**同名脚本和包保留你原有值**),并自动执行 **`yarn install`**,最后请执行 **`yarn dev`**;加 `--no-package-json` 可不改动 `package.json` 且跳过安装。
166
+ 在**空目录或已有 Vite 工程根目录**执行,生成 `src/views`、`src/component`、`src/api`、`src/assets/img`、`src/assets/style`、`src/router`、`src/pinia/chip`、`src/config` 及示例 `main.js` / `App.vue`(已 `app.use(mvframe, …)` 挂好路由、Pinia `storeChips`、config),同时写入/更新宿主项目 **`AGENTS.md`** 的 MVFrame Codex 规则,并复制 **`/.cursor/rules/*.mdc`**(与 mvframe 仓库内 Cursor 规则一致)。若不存在则附带 `index.html` 与 `vite.config.js`。会**合并** `package.json` 的 `scripts` / `dependencies` / `devDependencies`(与 Vite 模板一致;**同名脚本和包保留你原有值**),并自动执行 **`yarn install`**,最后请执行 **`yarn dev`**;加 `--no-package-json` 可不改动 `package.json` 且跳过安装。
167
167
 
168
168
  ```bash
169
169
  cd /path/to/your-app
@@ -183,6 +183,22 @@ yarn exec mvframe-init-app
183
183
 
184
184
  ---
185
185
 
186
+ ## Codex 规则(`AGENTS.md`)
187
+
188
+ Codex 不会自动读取 Cursor 的 `.cursor/rules/*.mdc`。宿主项目需要安装 MVFrame 的 `AGENTS.md` 区块,明确要求 Codex 在写业务代码前优先使用 MVFrame 全局组件、全局方法与全局样式工具类:
189
+
190
+ ```bash
191
+ cd /path/to/your-app
192
+ yarn exec mvframe-install-codex-rules
193
+ # 或:npx mvframe-install-codex-rules
194
+
195
+ # 克隆 / monorepo 中指向 mvframe 源码时
196
+ node /path/to/mvframe/scripts/install-codex-agents.js
197
+ node /path/to/mvframe/scripts/install-codex-agents.js /path/to/your-app
198
+ ```
199
+
200
+ 脚手架命令已自动执行这一步。生成区块带有 `MVFRAME-CODEX-RULES` 标记,重复执行只更新这段内容,不覆盖你在 `AGENTS.md` 中的其它规则。
201
+
186
202
  ## Cursor Skill(应用初始化)
187
203
 
188
204
  本仓库自带 **`.cursor/skills/mvframe-app-init`**,消费方项目可复制到自身 `.cursor/skills` 以便 Cursor 识别 MVFrame 接入规范。
package/README.md CHANGED
@@ -163,7 +163,7 @@ Production uses **library mode** with entry `src/index.js` and obfuscation-relat
163
163
 
164
164
  ## CLI: project skeleton
165
165
 
166
- From an **empty folder or existing Vite root**, generates `src/views`, `src/component`, `src/api`, `src/assets/img`, `src/assets/style`, `src/router`, `src/pinia/chip`, `src/config`, plus starter `main.js` / `App.vue` with `app.use(mvframe, …)` (routes, Pinia `storeChips`, config), and copies **`/.cursor/rules/*.mdc`** from the package (same as this repo’s Cursor rules). Adds `index.html` and `vite.config.js` only if missing (use `--force` to overwrite). **Merges** `scripts` / `dependencies` / `devDependencies` into `package.json` (existing values win for shared keys), then runs **`yarn install`**; use `--no-package-json` to skip package changes and install. Then run **`yarn dev`**.
166
+ From an **empty folder or existing Vite root**, generates `src/views`, `src/component`, `src/api`, `src/assets/img`, `src/assets/style`, `src/router`, `src/pinia/chip`, `src/config`, plus starter `main.js` / `App.vue` with `app.use(mvframe, …)` (routes, Pinia `storeChips`, config). It also writes/updates host-project **`AGENTS.md`** with MVFrame Codex rules, and copies **`/.cursor/rules/*.mdc`** from the package (same as this repo’s Cursor rules). Adds `index.html` and `vite.config.js` only if missing (use `--force` to overwrite). **Merges** `scripts` / `dependencies` / `devDependencies` into `package.json` (existing values win for shared keys), then runs **`yarn install`**; use `--no-package-json` to skip package changes and install. Then run **`yarn dev`**.
167
167
 
168
168
  ```bash
169
169
  cd /path/to/your-app
@@ -181,6 +181,22 @@ See **`MVFRAME-SCAFFOLD.md`** in the target project. Set **`MVFRAME_SCAFFOLD_TAR
181
181
 
182
182
  ---
183
183
 
184
+ ## Codex Rules (`AGENTS.md`)
185
+
186
+ Codex does **not** automatically read Cursor `.cursor/rules/*.mdc`. For host projects, install the MVFrame `AGENTS.md` section so Codex prefers MVFrame global components, global helpers, and style utilities before writing local replacements:
187
+
188
+ ```bash
189
+ cd /path/to/your-app
190
+ yarn exec mvframe-install-codex-rules
191
+ # or: npx mvframe-install-codex-rules
192
+
193
+ # Full checkout / monorepo path to mvframe
194
+ node /path/to/mvframe/scripts/install-codex-agents.js
195
+ node /path/to/mvframe/scripts/install-codex-agents.js /path/to/your-app
196
+ ```
197
+
198
+ The scaffold command already runs this step. The generated block is bounded by `MVFRAME-CODEX-RULES` markers, so rerunning the command updates only that block and preserves other `AGENTS.md` content.
199
+
184
200
  ## Cursor Skill (app scaffold)
185
201
 
186
202
  This repo ships **`.cursor/skills/mvframe-app-init`**. Copy it into your app’s **`.cursor/skills`** so Cursor can pick up MVFrame integration conventions.
package/dist/css/cpt.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";.MvcBtnGroup[data-v-39d01040]{padding:.25rem;background:var(--color-white);border-radius:var(--btn-radius);-webkit-user-select:none;user-select:none}.MvcBtnGroup.sizeSmall[data-v-39d01040]{padding:2px;border-radius:calc(var(--btn-radius, 1rem) / 2)}.MvcBtnGroup.sizeSmall .btnItem[data-v-39d01040]{padding:.25rem .625rem;font-size:.75rem;line-height:1.5;border-radius:.1875rem}.MvcBtnGroup.sizeLarge[data-v-39d01040]{padding:.375rem;border-radius:.5rem}.MvcBtnGroup.sizeLarge .btnItem[data-v-39d01040]{padding:.5rem 1.125rem;font-size:1rem;line-height:1.5;border-radius:.375rem}.MvcBtnGroup .btnItem[data-v-39d01040]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;gap:.25rem;padding:.375rem .875rem;font-size:.875rem;line-height:1.5;color:var(--color-txt-p);background:transparent;border:none;border-radius:var(--btn-radius);word-break:keep-all;text-wrap:nowrap;cursor:pointer;transition:var(--trans-all)}.MvcBtnGroup .btnItem[data-v-39d01040]:hover:not(:disabled):not(.isActive){background:var(--color-bg-menu-item-hover)}.MvcBtnGroup .btnItem.isActive[data-v-39d01040]{color:var(--color-on-primary-text);background:var(--color-primary);position:relative;isolation:isolate}.MvcBtnGroup .btnItem.isActive[data-v-39d01040]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.MvcBtnGroup .btnItem[data-v-39d01040]:disabled{opacity:.5;cursor:not-allowed}.MvcCard[data-v-610b0b4c]{position:relative;border:var(--border-d);border-radius:var(--card-radius);background:var(--color-bg-page-header);box-sizing:border-box;transition:box-shadow var(--trans)}.MvcCard[data-v-610b0b4c]:hover{box-shadow:0 .5rem .5rem color-mix(in srgb,var(--color-dark) 6%,var(--color-white))}.MvcCard.MvcCard--fillParent[data-v-610b0b4c]{display:flex;flex-direction:column;align-self:stretch;min-height:0;height:100%}.MvcCard .header[data-v-610b0b4c]{position:relative;padding:.75rem 1rem;border-block-end:var(--card-header-border);z-index:2;flex-shrink:0;-webkit-user-select:none;user-select:none}.MvcCard .header .headerTitle[data-v-610b0b4c]{margin:0;font-size:.875rem;font-weight:700;color:var(--color-txt-h2)}.MvcCard .body[data-v-610b0b4c]{position:relative;padding:1rem;min-height:1rem;overflow:auto;z-index:1}.MvcCard.MvcCard--fillParent .body[data-v-610b0b4c]{flex:1 1 auto;min-height:0}.MvcCard .footer[data-v-610b0b4c]{position:relative;padding:.75rem 1rem;border-block-start:var(--card-header-border);z-index:2;flex-shrink:0;-webkit-user-select:none;user-select:none}.dragArea[data-v-665c2158]{position:absolute;top:0;left:0;bottom:0;width:1rem;display:flex;align-items:center;z-index:99}.dragArea .dragHandle[data-v-665c2158]{display:flex;align-items:center;width:.875rem;height:1.75rem;background-color:var(--color-border);border-radius:0 .125rem .125rem 0;opacity:0;cursor:ew-resize;z-index:99;transition:var(--trans-all)}.dragArea .dragHandle[data-v-665c2158]:hover,.dragArea .dragHandle.active[data-v-665c2158]{opacity:1;color:var(--color-white);background-color:var(--color-primary);box-shadow:.25rem 0 .5rem var(--color-dark1)}.dragArea:hover .dragHandle[data-v-665c2158]{opacity:1}.MvcDrawerBody[data-v-1df88ac3]{position:relative;width:100%;overflow:hidden}.drawerFooter[data-v-1df88ac3]{background-image:linear-gradient(to top,50% var(--color-white),100 transparent)}.FrameTab .tabShadow[data-v-6592753c]{position:absolute;top:100%;left:0;right:0;height:.5rem;background-image:linear-gradient(to bottom,rgba(0,0,0,.05) 0,transparent 100%);opacity:0;transition:opacity var(--trans)}.FrameTab .tabShadow.visible[data-v-6592753c]{opacity:1}.FrameTab .tabArea[data-v-6592753c]:after{content:"";position:absolute;top:2.175rem;left:0;right:0;border-bottom:var(--border-d);z-index:1}.FrameTab .tabItem[data-v-6592753c]{margin-block-end:-1px;border:var(--border-d);border-block-end-color:transparent;border-radius:.25rem .25rem 0 0;background-color:var(--color-white);opacity:.5;overflow:hidden;transition:var(--trans-all)}.FrameTab .tabItem[data-v-6592753c]:hover{opacity:.8}.FrameTab .tabItem.active[data-v-6592753c]{opacity:1;border-block-end-color:var(--color-white);z-index:3;background-color:var(--color-bg-page-header)}.FrameTab .tabItem .abs[data-v-6592753c]{transition:var(--trans-all);transform:translate(2.25rem)}.FrameTab .tabItem .abs[data-v-6592753c]:hover{opacity:.8;color:var(--color-primary)}.FrameTab .tabItem.hoverItem.active[data-v-6592753c]{padding-inline-end:2.25rem}.FrameTab .tabItem.hoverItem.active .abs[data-v-6592753c]{transform:translate(-.375rem)}.FrameTab .tabItem.hoverItem[data-v-6592753c]:hover{padding-inline-end:2.25rem}.FrameTab .tabItem.hoverItem:hover .abs[data-v-6592753c]{transform:translate(-.375rem)}.FrameTab .tabItem.disabled[data-v-6592753c]{opacity:.7;cursor:not-allowed}.FrameMenu[data-v-d7eb624b]{width:12rem;background-color:var(--color-bg-menu);overflow:hidden}.FrameMenu[data-v-d7eb624b]:after{content:"";position:absolute;top:0;right:0;bottom:0;border-right:var(--border-d)}.FrameMenu:hover .logomini[data-v-d7eb624b]{opacity:.1}.FrameMenu:hover .collapseArea[data-v-d7eb624b]{display:block!important}.FrameMenu .LogoArea .logomini[data-v-d7eb624b]{display:none}.FrameMenu .collapseArea[data-v-d7eb624b]{top:50%;right:1rem;height:1.25rem;width:1.24rem;transform:translateY(-50%)}.FrameMenu .MenuArea[data-v-d7eb624b]{height:calc(100vh - 8rem)}.FrameMenu .MenuArea .menuItem[data-v-d7eb624b]{height:2.75rem;transition:var(--trans-all)}.FrameMenu .MenuArea .menuItem[data-v-d7eb624b]:hover{background-color:var(--color-bg-menu-item-hover)}.FrameMenu .MenuArea .menuItem.active[data-v-d7eb624b]:hover{background-color:var(--color-primary);opacity:.8}.FrameMenu .MenuArea .menuItem.active .itemIcon[data-v-d7eb624b]{color:var(--color-on-primary-text)}.FrameMenu .MenuArea .childrenItem[data-v-d7eb624b]{transition:var(--trans-all)}.FrameMenu .MenuArea .childrenItem[data-v-d7eb624b]:hover{background-color:var(--color-bg-menu-children-item-hover)}.FrameMenu .MenuArea .childrenItem.active[data-v-d7eb624b]:hover{background-color:var(--color-primary);opacity:.8}.FrameMenu .MenuArea .itemChildrenArea[data-v-d7eb624b]{background-color:var(--color-bg-menu-children)}.FrameMenu .MenuArea .itemTitle.active[data-v-d7eb624b]{color:var(--color-on-primary-text)}.FrameMenu.collapse[data-v-d7eb624b]{width:4rem}.FrameMenu.collapse .collapseArea[data-v-d7eb624b]{right:1.5rem;display:none}.FrameMenu.collapse .LogoArea .logo[data-v-d7eb624b]{display:none}.FrameMenu.collapse .LogoArea .logomini[data-v-d7eb624b]{display:block;transition:opacity var(--trans)}.FrameMenu.collapse .MenuArea .menuItem.activeChild[data-v-d7eb624b]{position:relative;isolation:isolate}.FrameMenu.collapse .MenuArea .menuItem.activeChild[data-v-d7eb624b]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.FrameMenu.collapse .MenuArea .itemChildrenArea[data-v-d7eb624b]{display:none}.FrameFooter[data-v-c3ba0162]{display:flex;height:3rem;padding:.5rem 1rem;gap:.5rem;font-size:14px}.MvcFrame[data-v-b25da17b]{display:flex}.MvcFrame .PageArea[data-v-b25da17b]{flex-grow:1;position:relative;min-height:0}.MvcList[data-v-6a45c452]{display:flex;flex-direction:column;width:100%;min-height:0;flex:1 1 auto;height:100%;-webkit-user-select:none;user-select:none}.MvcList .listViewport[data-v-6a45c452]{position:relative;flex:1 1 auto;min-height:0;overflow:hidden}.MvcList .listScroll[data-v-6a45c452]{position:relative;box-sizing:border-box;height:100%;max-height:100%}.MvcList .listItem[data-v-6a45c452]{padding:.5rem;margin-block-end:.25rem}.MvcList .listItem[data-v-6a45c452]:last-child{margin-block-end:0}.MvcList .listItem[data-v-6a45c452]{font-size:.75rem;line-height:1.5;color:var(--color-txt-p);background:transparent;border-radius:.25rem;cursor:pointer;transition:var(--trans-all)}.MvcList .listItem[data-v-6a45c452]:hover:not(.active):not(.isDisabled){background:var(--color-bg-menu-item-hover)}.MvcList .listItem.active[data-v-6a45c452]{position:sticky!important;top:0;color:var(--color-on-primary-text);background:var(--color-primary);z-index:9;position:relative;isolation:isolate}.MvcList .listItem.active[data-v-6a45c452]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.MvcList .listItem.isDisabled[data-v-6a45c452]{opacity:.5;cursor:not-allowed}.MvcList.sizeSmall .listItem[data-v-6a45c452]{padding:.25rem .375rem;margin-block-end:.125rem;font-size:.6875rem;border-radius:.1875rem}.MvcList.sizeSmall .listItem[data-v-6a45c452]:last-child{margin-block-end:0}.MvcList.sizeLarge .listItem[data-v-6a45c452]{padding:.625rem .75rem;margin-block-end:.5rem;font-size:.875rem;border-radius:.375rem}.MvcList.sizeLarge .listItem[data-v-6a45c452]:last-child{margin-block-end:0}.loadingFade-enter-active[data-v-89f58c94],.loadingFade-leave-active[data-v-89f58c94]{transition:opacity var(--trans)}.loadingFade-enter-from[data-v-89f58c94],.loadingFade-leave-to[data-v-89f58c94]{opacity:0}.MvcLoading[data-v-89f58c94]{pointer-events:auto;-webkit-backdrop-filter:blur(.25rem);backdrop-filter:blur(.25rem)}.loaderTxt[data-v-89f58c94]{max-width:15rem;word-break:break-word}.MvcLogin[data-v-6faa6992]{background-color:var(--color-bg-body)}.panelWrap[data-v-6faa6992]{background-color:var(--color-bg-menu);box-shadow:0 .25rem 1rem #0000000f}.qr-dingtalk[data-v-6faa6992]{background:#0089ff}.qr-feishu[data-v-6faa6992]{background:#3370ff}.qr-wechat[data-v-6faa6992]{background:#07c160}.oauthGoogle[data-v-6faa6992]{display:flex;align-items:center;justify-content:center;gap:.75rem;min-height:2.5rem;padding:.5rem 1rem;box-sizing:border-box;background:#fff;border:1px solid #747775;border-radius:.25rem;font-family:Roboto,system-ui,-apple-system,Segoe UI,sans-serif;font-size:.875rem;font-weight:500;line-height:1.25;color:#1f1f1f;cursor:pointer;transition:var(--trans-all)}.oauthGoogle[data-v-6faa6992]:hover:not(:disabled){box-shadow:0 1px 2px #3c40434d,0 1px 3px 1px #3c404326}.oauthGoogle[data-v-6faa6992]:disabled{opacity:.38;cursor:not-allowed}.oauthGoogle[data-v-6faa6992]:focus-visible{outline:2px solid #4285f4;outline-offset:2px}.oauthApple[data-v-6faa6992]{display:flex;align-items:center;justify-content:center;gap:.5rem;min-height:2.5rem;padding:.5rem 1rem;box-sizing:border-box;background:#000;border:none;border-radius:.375rem;font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,Helvetica Neue,sans-serif;font-size:1.0625rem;font-weight:600;line-height:1.2;color:#fff;cursor:pointer;transition:var(--trans-all)}.oauthApple[data-v-6faa6992]:hover:not(:disabled){opacity:.88}.oauthApple[data-v-6faa6992]:disabled{opacity:.3;cursor:not-allowed}.oauthApple[data-v-6faa6992]:focus-visible{outline:2px solid #fff;outline-offset:2px}.MvcNote[data-v-e3e84cc8]{position:relative;padding:.5rem 1rem;background-color:var(--color-bg-menu);font-size:.875rem;border-radius:0 .5rem .5rem 0}.MvcNote[data-v-e3e84cc8]:hover:before{opacity:1}.MvcNote[data-v-e3e84cc8]:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;border-radius:0 .5rem .5rem 0;border:1px solid var(--color-gray);transition:opacity var(--trans)}.MvcPage[data-v-3ff06276]{position:relative;display:flex;flex-direction:column;min-height:calc(100vh - 3rem);z-index:1}.MvcPage .PageHeader[data-v-3ff06276]{position:sticky;display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;min-height:4rem;border-bottom:var(--border-d);background-color:var(--color-bg-page-header);z-index:9}.MvcPage .PageHeader .PageHeaderTitle[data-v-3ff06276]{margin:0}.MvcPage .PageHeader .PageHeaderSubTitle[data-v-3ff06276]{margin:0;font-size:.875rem;color:var(--color-txt-p)}.MvcPage .PageBody[data-v-3ff06276]{position:relative;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;background-color:var(--color-bg-page-body);z-index:2}.MvcPage.hasTab[data-v-3ff06276]{z-index:10}.MvcPage.hasTab .PageHeader[data-v-3ff06276]{top:2.5rem}.ghost[data-v-1927ce52]{cursor:grabbing}.typeItem[data-v-1927ce52]{cursor:pointer}.typeItem[data-v-1927ce52]:hover{background-color:var(--mg-gray3)}.typeItem.active[data-v-1927ce52]{color:var(--mg-white);background-color:var(--mg-primary)}.columnItem[data-v-1927ce52]:hover{background-color:var(--mg-gray3)}.columnItem .fixedBtn[data-v-1927ce52]{cursor:pointer}.columnItem .fixedBtn[data-v-1927ce52]:hover{background-color:var(--mg-primary1)}.MainTable[data-v-f79bf58d]{max-width:calc(100% + 2px);width:calc(100% + 2px);margin:0 -1px}[data-v-4dba94bf] .el-textarea__inner{box-sizing:border-box}.ghost[data-v-73161392]{cursor:grabbing}.typeItem[data-v-73161392]{cursor:pointer}.typeItem[data-v-73161392]:hover{background-color:var(--mg-gray3)}.typeItem.active[data-v-73161392]{color:var(--color-txt-white);background-color:var(--color-bg-menu-item-active);position:relative;isolation:isolate}.typeItem.active[data-v-73161392]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.columnItem[data-v-73161392]:hover{background-color:var(--color-bg-menu-item-hover)}.columnItem .fixedBtn[data-v-73161392]{cursor:pointer}.columnItem .fixedBtn[data-v-73161392]:hover{background-color:var(--mg-primary1)}.tableFooter[data-v-a13ba899]{margin-block-start:-1px;border-block-start:var(--border-d);border-radius:0 0 .5rem .5rem}.vtableHost[data-v-a13ba899]{min-height:10rem;background-color:var(--color-white)}.vtableHostFill[data-v-a13ba899]{height:100%}.treeCellLoadMask[data-v-a13ba899]{z-index:10;box-sizing:border-box;pointer-events:auto;cursor:wait;background-color:#ffffffb8;border-radius:.125rem}.treeCellLoadMask .loadMaskIcon[data-v-a13ba899]{pointer-events:none}
1
+ @charset "UTF-8";.MvcBtnGroup[data-v-39d01040]{padding:.25rem;background:var(--color-white);border-radius:var(--btn-radius);-webkit-user-select:none;user-select:none}.MvcBtnGroup.sizeSmall[data-v-39d01040]{padding:2px;border-radius:calc(var(--btn-radius, 1rem) / 2)}.MvcBtnGroup.sizeSmall .btnItem[data-v-39d01040]{padding:.25rem .625rem;font-size:.75rem;line-height:1.5;border-radius:.1875rem}.MvcBtnGroup.sizeLarge[data-v-39d01040]{padding:.375rem;border-radius:.5rem}.MvcBtnGroup.sizeLarge .btnItem[data-v-39d01040]{padding:.5rem 1.125rem;font-size:1rem;line-height:1.5;border-radius:.375rem}.MvcBtnGroup .btnItem[data-v-39d01040]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;gap:.25rem;padding:.375rem .875rem;font-size:.875rem;line-height:1.5;color:var(--color-txt-p);background:transparent;border:none;border-radius:var(--btn-radius);word-break:keep-all;text-wrap:nowrap;cursor:pointer;transition:var(--trans-all)}.MvcBtnGroup .btnItem[data-v-39d01040]:hover:not(:disabled):not(.isActive){background:var(--color-bg-menu-item-hover)}.MvcBtnGroup .btnItem.isActive[data-v-39d01040]{color:var(--color-on-primary-text);background:var(--color-primary);position:relative;isolation:isolate}.MvcBtnGroup .btnItem.isActive[data-v-39d01040]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.MvcBtnGroup .btnItem[data-v-39d01040]:disabled{opacity:.5;cursor:not-allowed}.MvcCard[data-v-610b0b4c]{position:relative;border:var(--border-d);border-radius:var(--card-radius);background:var(--color-bg-page-header);box-sizing:border-box;transition:box-shadow var(--trans)}.MvcCard[data-v-610b0b4c]:hover{box-shadow:0 .5rem .5rem color-mix(in srgb,var(--color-dark) 6%,var(--color-white))}.MvcCard.MvcCard--fillParent[data-v-610b0b4c]{display:flex;flex-direction:column;align-self:stretch;min-height:0;height:100%}.MvcCard .header[data-v-610b0b4c]{position:relative;padding:.75rem 1rem;border-block-end:var(--card-header-border);z-index:2;flex-shrink:0;-webkit-user-select:none;user-select:none}.MvcCard .header .headerTitle[data-v-610b0b4c]{margin:0;font-size:.875rem;font-weight:700;color:var(--color-txt-h2)}.MvcCard .body[data-v-610b0b4c]{position:relative;padding:1rem;min-height:1rem;overflow:auto;z-index:1}.MvcCard.MvcCard--fillParent .body[data-v-610b0b4c]{flex:1 1 auto;min-height:0}.MvcCard .footer[data-v-610b0b4c]{position:relative;padding:.75rem 1rem;border-block-start:var(--card-header-border);z-index:2;flex-shrink:0;-webkit-user-select:none;user-select:none}.dragArea[data-v-665c2158]{position:absolute;top:0;left:0;bottom:0;width:1rem;display:flex;align-items:center;z-index:99}.dragArea .dragHandle[data-v-665c2158]{display:flex;align-items:center;width:.875rem;height:1.75rem;background-color:var(--color-border);border-radius:0 .125rem .125rem 0;opacity:0;cursor:ew-resize;z-index:99;transition:var(--trans-all)}.dragArea .dragHandle[data-v-665c2158]:hover,.dragArea .dragHandle.active[data-v-665c2158]{opacity:1;color:var(--color-white);background-color:var(--color-primary);box-shadow:.25rem 0 .5rem var(--color-dark1)}.dragArea:hover .dragHandle[data-v-665c2158]{opacity:1}.MvcDrawerBody[data-v-1df88ac3]{position:relative;width:100%;overflow:hidden}.drawerFooter[data-v-1df88ac3]{background-image:linear-gradient(to top,50% var(--color-white),100 transparent)}.FrameTab .tabShadow[data-v-6592753c]{position:absolute;top:100%;left:0;right:0;height:.5rem;background-image:linear-gradient(to bottom,rgba(0,0,0,.05) 0,transparent 100%);opacity:0;transition:opacity var(--trans)}.FrameTab .tabShadow.visible[data-v-6592753c]{opacity:1}.FrameTab .tabArea[data-v-6592753c]:after{content:"";position:absolute;top:2.175rem;left:0;right:0;border-bottom:var(--border-d);z-index:1}.FrameTab .tabItem[data-v-6592753c]{margin-block-end:-1px;border:var(--border-d);border-block-end-color:transparent;border-radius:.25rem .25rem 0 0;background-color:var(--color-white);opacity:.5;overflow:hidden;transition:var(--trans-all)}.FrameTab .tabItem[data-v-6592753c]:hover{opacity:.8}.FrameTab .tabItem.active[data-v-6592753c]{opacity:1;border-block-end-color:var(--color-white);z-index:3;background-color:var(--color-bg-page-header)}.FrameTab .tabItem .abs[data-v-6592753c]{transition:var(--trans-all);transform:translate(2.25rem)}.FrameTab .tabItem .abs[data-v-6592753c]:hover{opacity:.8;color:var(--color-primary)}.FrameTab .tabItem.hoverItem.active[data-v-6592753c]{padding-inline-end:2.25rem}.FrameTab .tabItem.hoverItem.active .abs[data-v-6592753c]{transform:translate(-.375rem)}.FrameTab .tabItem.hoverItem[data-v-6592753c]:hover{padding-inline-end:2.25rem}.FrameTab .tabItem.hoverItem:hover .abs[data-v-6592753c]{transform:translate(-.375rem)}.FrameTab .tabItem.disabled[data-v-6592753c]{opacity:.7;cursor:not-allowed}.FrameMenu[data-v-d7eb624b]{width:12rem;background-color:var(--color-bg-menu);overflow:hidden}.FrameMenu[data-v-d7eb624b]:after{content:"";position:absolute;top:0;right:0;bottom:0;border-right:var(--border-d)}.FrameMenu:hover .logomini[data-v-d7eb624b]{opacity:.1}.FrameMenu:hover .collapseArea[data-v-d7eb624b]{display:block!important}.FrameMenu .LogoArea .logomini[data-v-d7eb624b]{display:none}.FrameMenu .collapseArea[data-v-d7eb624b]{top:50%;right:1rem;height:1.25rem;width:1.24rem;transform:translateY(-50%)}.FrameMenu .MenuArea[data-v-d7eb624b]{height:calc(100vh - 8rem)}.FrameMenu .MenuArea .menuItem[data-v-d7eb624b]{height:2.75rem;transition:var(--trans-all)}.FrameMenu .MenuArea .menuItem[data-v-d7eb624b]:hover{background-color:var(--color-bg-menu-item-hover)}.FrameMenu .MenuArea .menuItem.active[data-v-d7eb624b]:hover{background-color:var(--color-primary);opacity:.8}.FrameMenu .MenuArea .menuItem.active .itemIcon[data-v-d7eb624b]{color:var(--color-on-primary-text)}.FrameMenu .MenuArea .childrenItem[data-v-d7eb624b]{transition:var(--trans-all)}.FrameMenu .MenuArea .childrenItem[data-v-d7eb624b]:hover{background-color:var(--color-bg-menu-children-item-hover)}.FrameMenu .MenuArea .childrenItem.active[data-v-d7eb624b]:hover{background-color:var(--color-primary);opacity:.8}.FrameMenu .MenuArea .itemChildrenArea[data-v-d7eb624b]{background-color:var(--color-bg-menu-children)}.FrameMenu .MenuArea .itemTitle.active[data-v-d7eb624b]{color:var(--color-on-primary-text)}.FrameMenu.collapse[data-v-d7eb624b]{width:4rem}.FrameMenu.collapse .collapseArea[data-v-d7eb624b]{right:1.5rem;display:none}.FrameMenu.collapse .LogoArea .logo[data-v-d7eb624b]{display:none}.FrameMenu.collapse .LogoArea .logomini[data-v-d7eb624b]{display:block;transition:opacity var(--trans)}.FrameMenu.collapse .MenuArea .menuItem.activeChild[data-v-d7eb624b]{position:relative;isolation:isolate}.FrameMenu.collapse .MenuArea .menuItem.activeChild[data-v-d7eb624b]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.FrameMenu.collapse .MenuArea .itemChildrenArea[data-v-d7eb624b]{display:none}.FrameFooter[data-v-c3ba0162]{display:flex;height:3rem;padding:.5rem 1rem;gap:.5rem;font-size:14px}.MvcFrame[data-v-b25da17b]{display:flex}.MvcFrame .PageArea[data-v-b25da17b]{flex-grow:1;position:relative;min-height:0}.MvcList[data-v-6a45c452]{display:flex;flex-direction:column;width:100%;min-height:0;flex:1 1 auto;height:100%;-webkit-user-select:none;user-select:none}.MvcList .listViewport[data-v-6a45c452]{position:relative;flex:1 1 auto;min-height:0;overflow:hidden}.MvcList .listScroll[data-v-6a45c452]{position:relative;box-sizing:border-box;height:100%;max-height:100%}.MvcList .listItem[data-v-6a45c452]{padding:.5rem;margin-block-end:.25rem}.MvcList .listItem[data-v-6a45c452]:last-child{margin-block-end:0}.MvcList .listItem[data-v-6a45c452]{font-size:.75rem;line-height:1.5;color:var(--color-txt-p);background:transparent;border-radius:.25rem;cursor:pointer;transition:var(--trans-all)}.MvcList .listItem[data-v-6a45c452]:hover:not(.active):not(.isDisabled){background:var(--color-bg-menu-item-hover)}.MvcList .listItem.active[data-v-6a45c452]{position:sticky!important;top:0;color:var(--color-on-primary-text);background:var(--color-primary);z-index:9;position:relative;isolation:isolate}.MvcList .listItem.active[data-v-6a45c452]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.MvcList .listItem.isDisabled[data-v-6a45c452]{opacity:.5;cursor:not-allowed}.MvcList.sizeSmall .listItem[data-v-6a45c452]{padding:.25rem .375rem;margin-block-end:.125rem;font-size:.6875rem;border-radius:.1875rem}.MvcList.sizeSmall .listItem[data-v-6a45c452]:last-child{margin-block-end:0}.MvcList.sizeLarge .listItem[data-v-6a45c452]{padding:.625rem .75rem;margin-block-end:.5rem;font-size:.875rem;border-radius:.375rem}.MvcList.sizeLarge .listItem[data-v-6a45c452]:last-child{margin-block-end:0}.loadingFade-enter-active[data-v-89f58c94],.loadingFade-leave-active[data-v-89f58c94]{transition:opacity var(--trans)}.loadingFade-enter-from[data-v-89f58c94],.loadingFade-leave-to[data-v-89f58c94]{opacity:0}.MvcLoading[data-v-89f58c94]{pointer-events:auto;-webkit-backdrop-filter:blur(.25rem);backdrop-filter:blur(.25rem)}.loaderTxt[data-v-89f58c94]{max-width:15rem;word-break:break-word}.MvcLogin[data-v-6faa6992]{background-color:var(--color-bg-body)}.panelWrap[data-v-6faa6992]{background-color:var(--color-bg-menu);box-shadow:0 .25rem 1rem #0000000f}.qr-dingtalk[data-v-6faa6992]{background:#0089ff}.qr-feishu[data-v-6faa6992]{background:#3370ff}.qr-wechat[data-v-6faa6992]{background:#07c160}.oauthGoogle[data-v-6faa6992]{display:flex;align-items:center;justify-content:center;gap:.75rem;min-height:2.5rem;padding:.5rem 1rem;box-sizing:border-box;background:#fff;border:1px solid #747775;border-radius:.25rem;font-family:Roboto,system-ui,-apple-system,Segoe UI,sans-serif;font-size:.875rem;font-weight:500;line-height:1.25;color:#1f1f1f;cursor:pointer;transition:var(--trans-all)}.oauthGoogle[data-v-6faa6992]:hover:not(:disabled){box-shadow:0 1px 2px #3c40434d,0 1px 3px 1px #3c404326}.oauthGoogle[data-v-6faa6992]:disabled{opacity:.38;cursor:not-allowed}.oauthGoogle[data-v-6faa6992]:focus-visible{outline:2px solid #4285f4;outline-offset:2px}.oauthApple[data-v-6faa6992]{display:flex;align-items:center;justify-content:center;gap:.5rem;min-height:2.5rem;padding:.5rem 1rem;box-sizing:border-box;background:#000;border:none;border-radius:.375rem;font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,Helvetica Neue,sans-serif;font-size:1.0625rem;font-weight:600;line-height:1.2;color:#fff;cursor:pointer;transition:var(--trans-all)}.oauthApple[data-v-6faa6992]:hover:not(:disabled){opacity:.88}.oauthApple[data-v-6faa6992]:disabled{opacity:.3;cursor:not-allowed}.oauthApple[data-v-6faa6992]:focus-visible{outline:2px solid #fff;outline-offset:2px}.MvcNote[data-v-e3e84cc8]{position:relative;padding:.5rem 1rem;background-color:var(--color-bg-menu);font-size:.875rem;border-radius:0 .5rem .5rem 0}.MvcNote[data-v-e3e84cc8]:hover:before{opacity:1}.MvcNote[data-v-e3e84cc8]:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;border-radius:0 .5rem .5rem 0;border:1px solid var(--color-gray);transition:opacity var(--trans)}.MvcPage[data-v-763c9c00]{position:relative;display:flex;flex-direction:column;min-height:calc(100vh - 3rem);z-index:1}.MvcPage .PageHeader[data-v-763c9c00]{position:sticky;display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;min-height:4rem;border-bottom:var(--border-d);background-color:var(--color-bg-page-header);z-index:9}.MvcPage .PageHeader .PageHeaderTitle[data-v-763c9c00]{margin:0}.MvcPage .PageHeader .PageHeaderSubTitle[data-v-763c9c00]{margin:0;font-size:.875rem;color:var(--color-txt-p)}.MvcPage .PageBody[data-v-763c9c00]{position:relative;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;background-color:var(--color-bg-page-body);z-index:2}.MvcPage.hasTab[data-v-763c9c00]{z-index:10}.MvcPage.hasTab .PageHeader[data-v-763c9c00]{top:2.25rem}.ghost[data-v-1927ce52]{cursor:grabbing}.typeItem[data-v-1927ce52]{cursor:pointer}.typeItem[data-v-1927ce52]:hover{background-color:var(--mg-gray3)}.typeItem.active[data-v-1927ce52]{color:var(--mg-white);background-color:var(--mg-primary)}.columnItem[data-v-1927ce52]:hover{background-color:var(--mg-gray3)}.columnItem .fixedBtn[data-v-1927ce52]{cursor:pointer}.columnItem .fixedBtn[data-v-1927ce52]:hover{background-color:var(--mg-primary1)}.MainTable[data-v-f79bf58d]{max-width:calc(100% + 2px);width:calc(100% + 2px);margin:0 -1px}[data-v-4dba94bf] .el-textarea__inner{box-sizing:border-box}.ghost[data-v-73161392]{cursor:grabbing}.typeItem[data-v-73161392]{cursor:pointer}.typeItem[data-v-73161392]:hover{background-color:var(--mg-gray3)}.typeItem.active[data-v-73161392]{color:var(--color-txt-white);background-color:var(--color-bg-menu-item-active);position:relative;isolation:isolate}.typeItem.active[data-v-73161392]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.columnItem[data-v-73161392]:hover{background-color:var(--color-bg-menu-item-hover)}.columnItem .fixedBtn[data-v-73161392]{cursor:pointer}.columnItem .fixedBtn[data-v-73161392]:hover{background-color:var(--mg-primary1)}.tableFooter[data-v-a13ba899]{margin-block-start:-1px;border-block-start:var(--border-d);border-radius:0 0 .5rem .5rem}.vtableHost[data-v-a13ba899]{min-height:10rem;background-color:var(--color-white)}.vtableHostFill[data-v-a13ba899]{height:100%}.treeCellLoadMask[data-v-a13ba899]{z-index:10;box-sizing:border-box;pointer-events:auto;cursor:wait;background-color:#ffffffb8;border-radius:.125rem}.treeCellLoadMask .loadMaskIcon[data-v-a13ba899]{pointer-events:none}
@@ -93,7 +93,9 @@ const L = () => ({
93
93
  },
94
94
  closeTab(t, s) {
95
95
  var a;
96
- this.tabs.splice(s, 1), t.name === this.ctab.name && ((a = globalThis.$router) == null || a.push({ name: this.tabs[s - 1 > 0 ? s - 1 : 0].name }));
96
+ this.tabs.length > 1 && (this.tabs.splice(s, 1), t.name === this.ctab.name && ((a = globalThis.$router) == null || a.push({
97
+ name: this.tabs[s - 1 > 0 ? s - 1 : 0].name
98
+ })));
97
99
  },
98
100
  closeRightTab(t, s) {
99
101
  var n;
package/dist/vendor.js CHANGED
@@ -6029,7 +6029,7 @@ const To = jl({
6029
6029
  ], 6)
6030
6030
  ], 2));
6031
6031
  }
6032
- }), qn = /* @__PURE__ */ ue(Zn, [["__scopeId", "data-v-3ff06276"]]), Xn = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6032
+ }), qn = /* @__PURE__ */ ue(Zn, [["__scopeId", "data-v-763c9c00"]]), Xn = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6033
6033
  __proto__: null,
6034
6034
  default: qn
6035
6035
  }, Symbol.toStringTag, { value: "Module" })), Qn = { class: "flexMode hb vc" }, es = { key: 1 }, ls = { class: "tag" }, as = { class: "flexMode hr" }, ts = /* @__PURE__ */ Object.assign({
@@ -9322,7 +9322,7 @@ const vi = {
9322
9322
  }, Ti = {
9323
9323
  name: "Matt Avias Frame",
9324
9324
  copyright: "©2026",
9325
- version: "1.0.72",
9325
+ version: "1.0.73",
9326
9326
  author: "Matt Avias",
9327
9327
  date: "2026-02-26",
9328
9328
  /** 默认语言 key,与 `$getLang`、localStorage `lang` 一致;业务在 app.use(mvframe, { config }) 里覆盖 */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mvframe",
3
3
  "packageManager": "yarn@4.4.1",
4
- "version": "1.0.72",
4
+ "version": "1.0.73",
5
5
  "author": "matt avis",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
@@ -38,6 +38,7 @@
38
38
  "dev": "vite",
39
39
  "build": "node scripts/prebuild.js",
40
40
  "install-cursor-skill": "node scripts/install-cursor-skill.js",
41
+ "install-codex-rules": "node scripts/install-codex-agents.js",
41
42
  "scaffold-app": "node scripts/scaffold-app.js",
42
43
  "gen-icon": "node scripts/gen-iconfont-ant-names.js",
43
44
  "b": "node scripts/build-host.js"
@@ -45,11 +46,13 @@
45
46
  "bin": {
46
47
  "mvframe-init-app": "scripts/scaffold-app.js",
47
48
  "mvframe-install-cursor-skill": "scripts/install-cursor-skill.js",
49
+ "mvframe-install-codex-rules": "scripts/install-codex-agents.js",
48
50
  "mvframe-b": "scripts/build-host.js"
49
51
  },
50
52
  "files": [
51
53
  "dist/*",
52
54
  "scripts/build-host.js",
55
+ "scripts/install-codex-agents.js",
53
56
  "scripts/install-cursor-skill.js",
54
57
  "scripts/scaffold-app.js",
55
58
  ".cursor/skills/mvframe-app-init",
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 将 MVFrame 的 Codex 规则写入宿主项目 AGENTS.md。
4
+ *
5
+ * Codex 不会自动读取 Cursor 的 `.cursor/rules/*.mdc`,因此宿主项目需要
6
+ * `AGENTS.md` 明确告诉 Codex:优先使用 MVFrame 全局组件、全局方法和样式工具类。
7
+ *
8
+ * 用法:
9
+ * node path/to/mvframe/scripts/install-codex-agents.js
10
+ * node path/to/mvframe/scripts/install-codex-agents.js /abs/path/to/your-project
11
+ *
12
+ * 环境变量(可选):
13
+ * MVFRAME_CODEX_AGENTS_OUT=/path/to/project 等价于第一个参数
14
+ */
15
+
16
+ const fs = require("fs");
17
+ const path = require("path");
18
+
19
+ const BEGIN = "<!-- MVFRAME-CODEX-RULES:BEGIN -->";
20
+ const END = "<!-- MVFRAME-CODEX-RULES:END -->";
21
+
22
+ function renderCodexAgentsSection() {
23
+ return `${BEGIN}
24
+ # MVFrame Codex Rules
25
+
26
+ This project uses MVFrame. When editing Vue, JS, TS, SCSS, or CSS in this host app, prefer the framework globals before adding local implementations.
27
+
28
+ ## Global Components
29
+
30
+ - Prefer MVFrame global components in templates without local imports: \`Frame\`, \`Page\`, \`Table\`, \`Form\`, \`Input\`, \`Textarea\`, \`Select\`, \`SelectV2\`, \`Tabs\`, \`BtnGroup\`, \`Icon\`, \`Loading\`, \`Drawer\`, \`DrawerArea\`, \`Login\`, \`Lang\`.
31
+ - Do not rebuild an equivalent control with raw DOM, \`el-*\` combinations, or third-party components unless the MVFrame component cannot express the behavior.
32
+ - For segmented controls, single-choice button groups, login forms, page shells, tables, drawers, loading masks, and framework navigation, check the MVFrame component first.
33
+
34
+ ## Global Style Utilities
35
+
36
+ - Before writing scoped CSS, inline \`:style\`, or new SCSS utility code, check whether MVFrame global classes already cover it.
37
+ - MVFrame styles must be imported once from the app entry: \`import "mvframe/style"\` and \`import "mvframe/style/cpt"\`. If utility classes appear missing, fix the import before duplicating CSS.
38
+ - Prefer utility classes in templates for common layout, spacing, sizing, typography, color, border, scroll, hover, radius, and positioning work.
39
+
40
+ Common utility classes:
41
+
42
+ | Need | Prefer |
43
+ |------|--------|
44
+ | flex layout | \`flexMode\`, \`flexV\`, \`flex1\`, \`flexGrow\`, \`noShrink\`, \`minw0\`, \`minh0\` |
45
+ | flex alignment | \`hl\`, \`hc\`, \`hr\`, \`hb\`, \`ha\`, \`vl\`, \`vc\`, \`vr\`, \`vs\` |
46
+ | wrapping / gaps | \`flexWrap\`, \`grid\`, \`g2\` ... \`g40\` |
47
+ | spacing | \`p{N}\`, \`pt{N}\`, \`pr{N}\`, \`pb{N}\`, \`pl{N}\`, \`m{N}\`, \`mt{N}\`, \`mr{N}\`, \`mb{N}\`, \`ml{N}\` where N is one of \`0,2,4,6,8,10,12,16,20,24,30,32,36,40,48\` |
48
+ | sizing | \`w{N}\`, \`h{N}\`, \`minw{N}\`, \`maxw{N}\`, \`minh{N}\`, \`maxh{N}\`, \`wp25\`, \`wp50\`, \`wp75\`, \`wp100\`, \`hp100\`, \`vh100\` |
49
+ | text | \`fs{N}\`, \`lh{N}\`, \`fw300\`, \`fw500\`, \`fw700\`, \`txt-c\`, \`txt-r\`, \`txt-nowrap\`, \`txt-nowrap{N}\`, \`txt-wrap\`, \`txt-prewrap\` |
50
+ | color / background | \`txt-h1\`, \`txt-h2\`, \`txt-p\`, \`txt-tip\`, \`txt-gray\`, \`txt-primary\`, \`bg-primary\`, \`bg-page-header\`, \`border\`, \`border-t\`, \`border-b\`, \`border-none\` |
51
+ | positioning / effects | \`relative\`, \`abs\`, \`absFull\`, \`absCenter\`, \`sticky\`, \`z1\`, \`z2\`, \`z9\`, \`radius{N}\`, \`radiusP50\`, \`hover\`, \`trans-all\`, \`backdrop\` |
52
+ | interaction / scroll | \`point\`, \`grab\`, \`yscroll\`, \`xscroll\`, \`nobar\`, \`noscroll\`, \`noselect\`, \`noevent\`, \`hide\` |
53
+
54
+ Spacing rule: do not add odd-pixel \`margin\` or \`padding\` such as \`3px\`, \`5px\`, \`7px\`, \`9px\`, or \`11px\`. Use the MVFrame spacing classes or rem values aligned with the spacing scale.
55
+
56
+ Scoped styles are still allowed for component-specific behavior, complex selectors, custom brand visuals, third-party overrides, or values not covered by the utility system. Keep those scoped rules narrow and combine them with MVFrame classes.
57
+
58
+ ## Global Methods
59
+
60
+ - Prefer MVFrame globals instead of repeated imports or local helpers: \`globalThis.$d\`, \`$fa\`, \`$fu\`, \`$pm\`, \`$db\`, \`$copy\`, \`$deepClone\`, \`$getLang\`, \`$getImg\`, \`$sc\`, \`$c.info\`.
61
+ - In templates, call global methods directly when they are provided through Vue globalProperties.
62
+ - For ordinary JS modules, use \`globalThis.$xxx\` or the exported MVFrame subpath only when a direct import is explicitly needed.
63
+
64
+ ## Router, Store, And Maps
65
+
66
+ - Prefer route \`name\` navigation over raw \`path\` navigation.
67
+ - Use the MVFrame store factory pattern already wired by the app: \`inject("store")\` in components or \`import { store, pinia } from "mvframe/store"\` in setup code and guards.
68
+ - For MVFrame maps/i18n maps, prefer \`useMap\`, \`getMaps\`, \`patchMaps\`, \`mapLang\`, and \`mapLangPath\` from \`mvframe/maps\`.
69
+
70
+ ## Editing Checklist
71
+
72
+ - Before adding markup, check whether a MVFrame global component fits.
73
+ - Before adding CSS, check whether MVFrame utility classes fit.
74
+ - Before importing a helper library, check whether a MVFrame global helper already exists.
75
+ - If local CSS or a new helper is still needed, keep it small and specific to the component.
76
+ ${END}
77
+ `;
78
+ }
79
+
80
+ function upsertCodexAgents(projectRoot) {
81
+ const targetRoot = path.resolve(projectRoot);
82
+ const fp = path.join(targetRoot, "AGENTS.md");
83
+ const section = renderCodexAgentsSection();
84
+
85
+ let next;
86
+ if (fs.existsSync(fp)) {
87
+ const current = fs.readFileSync(fp, "utf8");
88
+ const start = current.indexOf(BEGIN);
89
+ const end = current.indexOf(END);
90
+ if (start >= 0 && end >= start) {
91
+ next = `${current.slice(0, start)}${section}${current.slice(end + END.length)}`;
92
+ } else {
93
+ const trimmed = current.replace(/\s*$/, "");
94
+ next = `${trimmed}\n\n${section}`;
95
+ }
96
+ } else {
97
+ next = `${section}`;
98
+ }
99
+
100
+ fs.writeFileSync(fp, next.endsWith("\n") ? next : `${next}\n`, "utf8");
101
+ console.log("[mvframe] 已写入 Codex 规则:");
102
+ console.log(" ", fp);
103
+ }
104
+
105
+ function main() {
106
+ const argPath = process.argv.find((a, i) => i >= 2 && !a.startsWith("--"));
107
+ const projectRoot = path.resolve(
108
+ process.env.MVFRAME_CODEX_AGENTS_OUT || argPath || process.cwd(),
109
+ );
110
+
111
+ if (!fs.existsSync(projectRoot)) {
112
+ console.error("[mvframe] 目录不存在:", projectRoot);
113
+ process.exit(1);
114
+ }
115
+
116
+ upsertCodexAgents(projectRoot);
117
+ console.log("[mvframe] Codex 打开该项目后会读取 AGENTS.md,并优先使用 MVFrame 全局能力。");
118
+ }
119
+
120
+ if (require.main === module) {
121
+ main();
122
+ }
123
+
124
+ module.exports = {
125
+ upsertCodexAgents,
126
+ renderCodexAgentsSection,
127
+ };
@@ -14,6 +14,7 @@
14
14
  const fs = require("fs");
15
15
  const path = require("path");
16
16
  const { execFileSync } = require("child_process");
17
+ const { upsertCodexAgents } = require("./install-codex-agents.js");
17
18
 
18
19
  const FORCE = process.argv.includes("--force");
19
20
  const NO_PKG = process.argv.includes("--no-package-json");
@@ -164,6 +165,7 @@ function main() {
164
165
  }
165
166
 
166
167
  copyCursorRulesFromPackage();
168
+ upsertCodexAgents(target);
167
169
 
168
170
  write(
169
171
  "src/main.js",
@@ -795,6 +797,16 @@ yarn dev
795
797
  | \`src/maps/index.js\` | 与库内置 \`maps/chip\` 深度合并(模块内);\`useMap().$l()\` / \`mapLangPath\` / \`mapLang\` 可由 auto-import 从 \`mvframe/maps\` 引入 |
796
798
  | \`src/composition\` | 可选,与 Vite 别名 \`@cps\` 对应 |
797
799
 
800
+ ## Codex 规则(\`AGENTS.md\`)
801
+
802
+ 初始化脚本会写入/更新项目根 **\`AGENTS.md\`** 的 MVFrame 区块,供 Codex 在宿主项目内优先使用 **MVFrame 全局组件、全局方法与全局样式工具类**。该区块带有 \`MVFRAME-CODEX-RULES\` 标记,重复执行脚手架会更新这段内容,不会覆盖你在 \`AGENTS.md\` 中的其它规则。
803
+
804
+ 仅安装 Codex 规则:
805
+
806
+ \`\`\`bash
807
+ yarn exec mvframe-install-codex-rules
808
+ \`\`\`
809
+
798
810
  ## Cursor 规则(\`.cursor/rules\`)
799
811
 
800
812
  初始化脚本会把 **mvframe 包内**与仓库一致的 **\`*.mdc\`** 写入目标项目 **\`/.cursor/rules/\`**(\`component-hierarchy\`、\`script-setup\`、\`style-system\`、\`views\`、\`router\`、\`global-components\`、\`data\`、\`util\`)。若目录或文件已存在且未加 \`--force\`,则跳过对应文件。