mvframe 1.0.71 → 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 +17 -1
- package/README.md +17 -1
- package/dist/css/cpt.css +1 -1
- package/dist/store-shared.js +3 -1
- package/dist/vendor.js +3 -3
- package/package.json +4 -1
- package/scripts/install-codex-agents.js +127 -0
- package/scripts/scaffold-app.js +12 -0
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
|
|
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-1402b119]{position:relative;display:flex;flex-direction:column;min-height:calc(100vh - 3rem);z-index:1}.MvcPage .PageHeader[data-v-1402b119]{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-1402b119]{margin:0}.MvcPage .PageHeader .PageHeaderSubTitle[data-v-1402b119]{margin:0;font-size:.875rem;color:var(--color-txt-p)}.MvcPage .PageBody[data-v-1402b119]{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-1402b119]{z-index:10}.MvcPage.hasTab .PageHeader[data-v-1402b119]{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}
|
package/dist/store-shared.js
CHANGED
|
@@ -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({
|
|
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
|
@@ -6001,7 +6001,7 @@ const To = jl({
|
|
|
6001
6001
|
}
|
|
6002
6002
|
},
|
|
6003
6003
|
setup(l) {
|
|
6004
|
-
const a = l, { proxy: t } = ke(), o = De("store").tab(), n = j(() => a.title || a.subtitle), f = j(() =>
|
|
6004
|
+
const a = l, { proxy: t } = ke(), o = De("store").tab(), n = j(() => a.title || a.subtitle), f = j(() => o.useTab), b = j(() => {
|
|
6005
6005
|
let v = "calc(100vh";
|
|
6006
6006
|
return o.useTab && (v += " - 2.25rem"), a.noheader || (v += " - 4rem"), {
|
|
6007
6007
|
minHeight: `${v})`
|
|
@@ -6029,7 +6029,7 @@ const To = jl({
|
|
|
6029
6029
|
], 6)
|
|
6030
6030
|
], 2));
|
|
6031
6031
|
}
|
|
6032
|
-
}), qn = /* @__PURE__ */ ue(Zn, [["__scopeId", "data-v-
|
|
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.
|
|
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.
|
|
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
|
+
};
|
package/scripts/scaffold-app.js
CHANGED
|
@@ -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\`,则跳过对应文件。
|