m8-codex-mcp 1.0.2 → 1.0.4

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/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{McpServer}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport}from"@modelcontextprotocol/sdk/server/stdio.js";import{z}from"zod";import{loadKnowledgeBase,getComponentDoc,getStandardDocs,getUtilDocs,getStandardRules,getStandardCategories}from"./knowledge/index.js";import{generateModuleFiles}from"./tools/generate_module_structure.js";const server=new McpServer({name:"m8-generator-mcp",version:"1.0.0"}),knowledgeBase=loadKnowledgeBase();async function main(){const e=new StdioServerTransport;await server.connect(e),console.error("m8-generator-mcp server started")}server.tool("get_component_usage","获取 M8 UI 组件的详细用法、Props、Events 和示例代码。组件名格式如 em-button, em-form, em-field 等。",{component_name:z.string().describe("组件名称,如 em-button, em-form, em-field")},async({component_name:e})=>{const n=getComponentDoc(knowledgeBase,e);if(!n)return{content:[{type:"text",text:`未找到组件 "${e}" 的文档。\n\n可用组件列表:\n${knowledgeBase.components.map(e=>`- ${e.name}`).join("\n")}`}]};const t=getStandardDocs(knowledgeBase);return{content:[{type:"text",text:`# ${n.name} 组件用法\n\n${n.description}\n\n## Props\n\n${n.props}\n\n## Events\n\n${n.events}\n\n## 示例代码\n\n${n.examples.join("\n\n---\n\n")}\n\n---\n\n## M8 开发规范提醒\n\n${t}`}]}}),server.tool("generate_module_structure","为 M8 项目生成新页面/模块的标准目录结构和文件模板,遵循 M8 开发规范。",{module_name:z.string().describe("模块名称(小写下划线格式,如 user_list)"),page_name:z.string().describe("页面名称(小写下划线格式,如 index)"),vue_version:z.enum(["2","3"]).optional().describe("Vue 版本,2 或 3,默认为 3"),author:z.string().optional().describe("作者名称"),description:z.string().optional().describe("页面描述")},async({module_name:e,page_name:n,vue_version:t,author:o,description:r})=>{const s=generateModuleFiles({moduleName:e,pageName:n,vueVersion:t||"3",author:o||"developer",description:r||"页面功能描述"});let a=`# 模块 "${e}" 结构生成完成\n\n`;a+=`## 目录结构\n\n\`\`\`\nsrc/pages/${e}/\n`;for(const e of s)a+=`├── ${e.path}\n`;a+="```\n\n",a+="## 文件内容\n\n";for(const e of s){const n=e.path.split(".").pop()||"";a+=`### ${e.path}\n\n\`\`\`${n}\n${e.content}\n\`\`\`\n\n`}return a+=`---\n\n## M8 开发规范提醒\n\n${getStandardDocs(knowledgeBase)}`,{content:[{type:"text",text:a}]}}),server.tool("search_utils","搜索 M8 框架的 Util 工具函数用法,如 Util.ajax, Util.upload, Util.string 等。",{keyword:z.string().describe("搜索关键词,如 ajax, upload, string")},async({keyword:e})=>{const n=getUtilDocs(knowledgeBase,e);return n?{content:[{type:"text",text:n}]}:{content:[{type:"text",text:`未找到与 "${e}" 相关的 Util 工具函数。\n\n可用的工具函数文档:\n- Ajax 与文件上传 (ajax, upload)\n- 工具函数库 (string, os 等)`}]}}),server.tool("get_standard_rules","获取 M8 框架的开发规范文档,包括项目规范、Vue规范、CSS规范、API规范、TypeScript规范、Mock规范、路由规范等。",{category:z.string().describe("规范类别:project(项目)、vue、css、api、typescript、mock、router")},async({category:e})=>{const n=getStandardRules(knowledgeBase,e);if(!n){return{content:[{type:"text",text:`未找到 "${e}" 相关规范。\n\n可用的规范类别:\n${getStandardCategories().map(e=>`- ${e}`).join("\n")}`}]}}return{content:[{type:"text",text:n}]}}),main().catch(console.error);
2
+ import{McpServer}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport}from"@modelcontextprotocol/sdk/server/stdio.js";import{z}from"zod";import{loadKnowledgeBase,getComponentDoc,getStandardDocs,getUtilDocs,getStandardRules,getStandardCategories}from"./knowledge/index.js";import{generateModuleFiles}from"./tools/generate_module_structure.js";const server=new McpServer({name:"m8-generator-mcp",version:"1.0.0"}),knowledgeBase=loadKnowledgeBase();async function main(){const e=new StdioServerTransport;await server.connect(e),console.error("m8-generator-mcp server started")}server.tool("get_component_usage","获取 M8 UI 组件的详细用法、Props、Events 和示例代码。组件名格式如 em-button, em-form, em-field 等。",{component_name:z.string().describe("组件名称,如 em-button, em-form, em-field")},async({component_name:e})=>{const n=getComponentDoc(knowledgeBase,e);if(!n)return{content:[{type:"text",text:`未找到组件 "${e}" 的文档。\n\n可用组件列表:\n${knowledgeBase.components.map(e=>`- ${e.name}`).join("\n")}`}]};const t=getStandardDocs(knowledgeBase);return{content:[{type:"text",text:`# ${n.name} 组件用法\n\n${n.description}\n\n## Props\n\n${n.props}\n\n## Events\n\n${n.events}\n\n## 示例代码\n\n${n.examples.join("\n\n---\n\n")}\n\n---\n\n## M8 开发规范提醒\n\n${t}`}]}}),server.tool("generate_module_structure","为 M8 项目生成新页面/模块的标准目录结构和文件模板,遵循 M8 开发规范。注意:使用前请先检查用户项目的 package.json 中的 vue 版本来确定 vue_version 参数。默认会生成 mock.js 文件用于模拟数据接口。",{module_name:z.string().describe("模块名称(小写下划线格式,如 user_list)"),page_name:z.string().describe("页面名称(小写下划线格式,如 index)"),vue_version:z.enum(["2","3"]).optional().describe("Vue 版本,2 或 3。请根据用户项目 package.json 中的 vue 依赖版本判断:2.x.x 用 '2',3.x.x 用 '3'。默认为 '3'"),author:z.string().optional().describe("作者名称"),description:z.string().optional().describe("页面描述"),skip_mock:z.boolean().optional().describe("是否跳过生成 mock.js 文件,默认 false(即默认生成 mock)")},async({module_name:e,page_name:n,vue_version:t,author:o,description:r,skip_mock:s})=>{const a=generateModuleFiles({moduleName:e,pageName:n,vueVersion:t||"3",author:o||"developer",description:r||"页面功能描述",skipMock:s||!1});let c=`# 模块 "${e}" 结构生成完成\n\n`;c+=`## 目录结构\n\n\`\`\`\nsrc/pages/${e}/\n`;for(const e of a)c+=`├── ${e.path}\n`;c+="```\n\n",c+="## 文件内容\n\n";for(const e of a){const n=e.path.split(".").pop()||"";c+=`### ${e.path}\n\n\`\`\`${n}\n${e.content}\n\`\`\`\n\n`}return c+=`---\n\n## M8 开发规范提醒\n\n${getStandardDocs(knowledgeBase)}`,{content:[{type:"text",text:c}]}}),server.tool("search_utils","搜索 M8 框架的 Util 工具函数用法,如 Util.ajax, Util.upload, Util.string 等。",{keyword:z.string().describe("搜索关键词,如 ajax, upload, string")},async({keyword:e})=>{const n=getUtilDocs(knowledgeBase,e);return n?{content:[{type:"text",text:n}]}:{content:[{type:"text",text:`未找到与 "${e}" 相关的 Util 工具函数。\n\n可用的工具函数文档:\n- Ajax 与文件上传 (ajax, upload)\n- 工具函数库 (string, os 等)`}]}}),server.tool("get_standard_rules","获取 M8 框架的开发规范文档,包括项目规范、Vue规范、CSS规范、API规范、TypeScript规范、Mock规范、路由规范等。",{category:z.string().describe("规范类别:project(项目)、vue、css、api、typescript、mock、router")},async({category:e})=>{const n=getStandardRules(knowledgeBase,e);if(!n){return{content:[{type:"text",text:`未找到 "${e}" 相关规范。\n\n可用的规范类别:\n${getStandardCategories().map(e=>`- ${e}`).join("\n")}`}]}}return{content:[{type:"text",text:n}]}}),main().catch(console.error);
@@ -15,6 +15,7 @@ export interface ComponentDoc {
15
15
  export interface KnowledgeBase {
16
16
  components: ComponentDoc[];
17
17
  standards: string;
18
+ fullStandards: string;
18
19
  standardDocs: Map<string, string>;
19
20
  utilDocs: Map<string, string>;
20
21
  }
@@ -27,7 +28,8 @@ export declare function loadKnowledgeBase(): KnowledgeBase;
27
28
  */
28
29
  export declare function getComponentDoc(kb: KnowledgeBase, componentName: string): ComponentDoc | undefined;
29
30
  /**
30
- * 获取规范文档摘要
31
+ * 获取完整规范文档
32
+ * 返回 01-07 目录下所有规范文件的完整内容,确保生成代码时严格遵循
31
33
  */
32
34
  export declare function getStandardDocs(kb: KnowledgeBase): string;
33
35
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/knowledge/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC1B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,CAWjD;AA6KD;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAQlG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CAiBzD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWlF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiBxF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAUhD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/knowledge/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC1B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,CAYjD;AAqLD;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAQlG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CAazD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWlF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiBxF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAUhD"}
@@ -1 +1 @@
1
- import*as fs from"fs";import*as path from"path";import{fileURLToPath}from"url";const __filename=fileURLToPath(import.meta.url),__dirname=path.dirname(__filename),KNOWLEDGE_ROOT=path.resolve(__dirname,"../../data");export function loadKnowledgeBase(){const t=loadComponentDocs(),{summary:e,docs:o}=loadAllStandardDocs();return{components:t,standards:e,standardDocs:o,utilDocs:loadUtilDocs()}}function loadComponentDocs(){const t=path.join(KNOWLEDGE_ROOT,"m8mpdoc","UI组件库"),e=[];if(!fs.existsSync(t))return console.error(`Components directory not found: ${t}`),e;const o=fs.readdirSync(t).filter(t=>t.endsWith(".md"));for(const n of o)try{const o=path.join(t,n),s=parseComponentDoc(n,fs.readFileSync(o,"utf-8"));s&&e.push(s)}catch(t){console.error(`Failed to parse component doc: ${n}`,t)}return e}function parseComponentDoc(t,e){const o=t.match(/\d+-(\w+)/);if(!o)return null;const n=`em-${o[1]}`,s=e.match(/### 介绍\s*\n+([\s\S]*?)(?=\n###|\n##|$)/),r=s?s[1].trim():"",a=e.match(/#### Props\s*\n+([\s\S]*?)(?=\n####|\n###|\n##|$)/),c=a?a[1].trim():"无 Props 文档",i=e.match(/#### Events\s*\n+([\s\S]*?)(?=\n####|\n###|\n##|$)/),d=i?i[1].trim():"无 Events 文档",l=[],f=/```(html|vue|js|javascript)\n([\s\S]*?)```/g;let p;for(;null!==(p=f.exec(e));)l.push(`\`\`\`${p[1]}\n${p[2]}\`\`\``);return{name:n,filename:t,description:r,props:c,events:d,examples:l.slice(0,5),rawContent:e}}function loadAllStandardDocs(){const t=path.join(KNOWLEDGE_ROOT,"standards"),e=new Map;let o="";const n=path.join(t,"_index.md");if(fs.existsSync(n))try{o=fs.readFileSync(n,"utf-8")}catch(t){console.error("Failed to load standards index",t)}const s=[{dir:"01-project",keys:["project","naming","structure","version"]},{dir:"02-vue",keys:["vue","component","basic","performance","state"]},{dir:"03-css",keys:["css","scss","style","bem"]},{dir:"04-api",keys:["api","ajax","ejs","util"]},{dir:"05-typescript",keys:["typescript","ts","type"]},{dir:"06-mock",keys:["mock","test"]},{dir:"07-router",keys:["router","route","navigation"]}];for(const o of s){const n=path.join(t,o.dir);if(!fs.existsSync(n))continue;const s=fs.readdirSync(n).filter(t=>t.endsWith(".md"));let r="";for(const t of s)try{const e=path.join(n,t);r+=`\n\n---\n\n${fs.readFileSync(e,"utf-8")}`}catch(e){console.error(`Failed to load standard doc: ${o.dir}/${t}`,e)}if(r)for(const t of o.keys)e.set(t,r)}return{summary:o,docs:e}}function loadUtilDocs(){const t=new Map,e=path.join(KNOWLEDGE_ROOT,"m8mpdoc","核心通用Util工具库");if(fs.existsSync(e)){const o=fs.readdirSync(e).filter(t=>t.endsWith(".md"));for(const n of o)try{const o=path.join(e,n),s=fs.readFileSync(o,"utf-8"),r=n.replace(".md","").toLowerCase();t.set(r,s)}catch(t){console.error(`Failed to load util doc: ${n}`,t)}}else console.error(`Util directory not found: ${e}`);const o=path.join(KNOWLEDGE_ROOT,"standards","04-api","util.md");if(fs.existsSync(o))try{const e=fs.readFileSync(o,"utf-8");t.set("string",e),t.set("validate",e),t.set("mobile",e),t.set("email",e),t.set("idcard",e)}catch(t){console.error("Failed to load api util doc",t)}return t}export function getComponentDoc(t,e){let o=e.toLowerCase().trim();return o.startsWith("em-")||(o=`em-${o}`),t.components.find(t=>t.name===o)}export function getStandardDocs(t){return'\n### 关键规范要点\n\n1. **全局变量**:直接使用 `Config`、`Util`、`ejs`,禁止 import\n2. **样式分离**:禁止内联 CSS,必须使用 `@import "./css/[module_name].scss";`\n3. **API 调用**:使用 `Util.ajax` 进行数据请求\n4. **交互反馈**:使用 `ejs.ui.toast`、`ejs.ui.confirm` 替代原生 alert\n5. **命名规范**:\n - 页面文件:小写+下划线 (如 `user_list.vue`)\n - 组件:PascalCase (如 `UserCard.vue`)\n - CSS 类名:BEM 命名 (如 `.user-card__title`)\n6. **注释规范**:Vue 文件必须包含头部注释块\n7. **readonly 输入框**:必须添加 `is-link` + `clickable`\n'}export function getUtilDocs(t,e){const o=e.toLowerCase();for(const[e,n]of t.utilDocs)if(e.includes(o)||n.toLowerCase().includes(o))return n}export function getStandardRules(t,e){const o=e.toLowerCase();if(t.standardDocs.has(o))return t.standardDocs.get(o);for(const[e,n]of t.standardDocs)if(e.includes(o)||o.includes(e))return n}export function getStandardCategories(){return["project - 项目规范(命名、结构、版本检测)","vue - Vue 开发规范(基础、组件、性能、状态管理)","css - CSS/SCSS 规范(BEM命名、样式分离)","api - API 规范(ajax、ejs接口、util工具)","typescript - TypeScript 规范","mock - Mock 数据规范","router - 路由规范"]}
1
+ import*as fs from"fs";import*as path from"path";import{fileURLToPath}from"url";const __filename=fileURLToPath(import.meta.url),__dirname=path.dirname(__filename),KNOWLEDGE_ROOT=path.resolve(__dirname,"../../data");export function loadKnowledgeBase(){const t=loadComponentDocs(),{summary:n,docs:e,fullContent:o}=loadAllStandardDocs();return{components:t,standards:n,fullStandards:o,standardDocs:e,utilDocs:loadUtilDocs()}}function loadComponentDocs(){const t=path.join(KNOWLEDGE_ROOT,"m8mpdoc","UI组件库"),n=[];if(!fs.existsSync(t))return console.error(`Components directory not found: ${t}`),n;const e=fs.readdirSync(t).filter(t=>t.endsWith(".md"));for(const o of e)try{const e=path.join(t,o),s=parseComponentDoc(o,fs.readFileSync(e,"utf-8"));s&&n.push(s)}catch(t){console.error(`Failed to parse component doc: ${o}`,t)}return n}function parseComponentDoc(t,n){const e=t.match(/\d+-(\w+)/);if(!e)return null;const o=`em-${e[1]}`,s=n.match(/### 介绍\s*\n+([\s\S]*?)(?=\n###|\n##|$)/),r=s?s[1].trim():"",a=n.match(/#### Props\s*\n+([\s\S]*?)(?=\n####|\n###|\n##|$)/),c=a?a[1].trim():"无 Props 文档",i=n.match(/#### Events\s*\n+([\s\S]*?)(?=\n####|\n###|\n##|$)/),d=i?i[1].trim():"无 Events 文档",l=[],f=/```(html|vue|js|javascript)\n([\s\S]*?)```/g;let p;for(;null!==(p=f.exec(n));)l.push(`\`\`\`${p[1]}\n${p[2]}\`\`\``);return{name:o,filename:t,description:r,props:c,events:d,examples:l.slice(0,5),rawContent:n}}function loadAllStandardDocs(){const t=path.join(KNOWLEDGE_ROOT,"standards"),n=new Map;let e="",o="";const s=path.join(t,"_index.md");if(fs.existsSync(s))try{e=fs.readFileSync(s,"utf-8")}catch(t){console.error("Failed to load standards index",t)}const r=[{dir:"01-project",name:"项目规范",keys:["project","naming","structure","version"]},{dir:"02-vue",name:"Vue 规范",keys:["vue","component","basic","performance","state"]},{dir:"03-css",name:"CSS 规范",keys:["css","scss","style","bem"]},{dir:"04-api",name:"API 规范",keys:["api","ajax","ejs","util"]},{dir:"05-typescript",name:"TypeScript 规范",keys:["typescript","ts","type"]},{dir:"06-mock",name:"Mock 规范",keys:["mock","test"]},{dir:"07-router",name:"路由规范",keys:["router","route","navigation"]}];for(const e of r){const s=path.join(t,e.dir);if(!fs.existsSync(s))continue;const r=fs.readdirSync(s).filter(t=>t.endsWith(".md"));let a="";a+=`\n\n${"=".repeat(60)}\n`,a+=`## 📋 ${e.name} (${e.dir})\n`,a+=`${"=".repeat(60)}\n`;for(const t of r)try{const n=path.join(s,t);a+=`\n\n---\n### 📄 文件: ${t}\n---\n\n${fs.readFileSync(n,"utf-8")}`}catch(n){console.error(`Failed to load standard doc: ${e.dir}/${t}`,n)}if(a){for(const t of e.keys)n.set(t,a);o+=a}}return{summary:e,docs:n,fullContent:o}}function loadUtilDocs(){const t=new Map,n=path.join(KNOWLEDGE_ROOT,"m8mpdoc","核心通用Util工具库");if(fs.existsSync(n)){const e=fs.readdirSync(n).filter(t=>t.endsWith(".md"));for(const o of e)try{const e=path.join(n,o),s=fs.readFileSync(e,"utf-8"),r=o.replace(".md","").toLowerCase();t.set(r,s)}catch(t){console.error(`Failed to load util doc: ${o}`,t)}}else console.error(`Util directory not found: ${n}`);const e=path.join(KNOWLEDGE_ROOT,"standards","04-api","util.md");if(fs.existsSync(e))try{const n=fs.readFileSync(e,"utf-8");t.set("string",n),t.set("validate",n),t.set("mobile",n),t.set("email",n),t.set("idcard",n)}catch(t){console.error("Failed to load api util doc",t)}return t}export function getComponentDoc(t,n){let e=n.toLowerCase().trim();return e.startsWith("em-")||(e=`em-${e}`),t.components.find(t=>t.name===e)}export function getStandardDocs(t){return"\n################################################################################\n## ⚠️ 重要警告:以下是必须严格遵循的 M8 开发规范(完整版)\n################################################################################\n\n> **生成代码时务必全部遵循以下规范,严禁臆想或使用非规范写法!**\n> 规范来源:`data/standards/01-project` `data/standards/07-router` 目录下的所有文件\n\n"+t.fullStandards}export function getUtilDocs(t,n){const e=n.toLowerCase();for(const[n,o]of t.utilDocs)if(n.includes(e)||o.toLowerCase().includes(e))return o}export function getStandardRules(t,n){const e=n.toLowerCase();if(t.standardDocs.has(e))return t.standardDocs.get(e);for(const[n,o]of t.standardDocs)if(n.includes(e)||e.includes(n))return o}export function getStandardCategories(){return["project - 项目规范(命名、结构、版本检测)","vue - Vue 开发规范(基础、组件、性能、状态管理)","css - CSS/SCSS 规范(BEM命名、样式分离)","api - API 规范(ajax、ejs接口、util工具)","typescript - TypeScript 规范","mock - Mock 数据规范","router - 路由规范"]}
@@ -9,6 +9,7 @@ export interface GenerateModuleOptions {
9
9
  vueVersion: "2" | "3";
10
10
  author: string;
11
11
  description: string;
12
+ skipMock?: boolean;
12
13
  }
13
14
  export interface GeneratedFile {
14
15
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"generate_module_structure.d.ts","sourceRoot":"","sources":["../../src/tools/generate_module_structure.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,qBAAqB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,GAAG,GAAG,GAAG,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,EAAE,CA4DnF"}
1
+ {"version":3,"file":"generate_module_structure.d.ts","sourceRoot":"","sources":["../../src/tools/generate_module_structure.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,qBAAqB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,GAAG,GAAG,GAAG,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,EAAE,CAkEnF"}
@@ -1 +1 @@
1
- import{generateVue2Template,generateVue2ScssTemplate,generateVue2RouterTemplate,generateVue2StoreTemplate,generateVue2MockTemplate}from"../templates/vue2.js";import{generateVue3Template,generateVue3ScssTemplate,generateVue3RouterTemplate,generateVue3StoreTemplate,generateVue3MockTemplate}from"../templates/vue3.js";export function generateModuleFiles(e){const{moduleName:t,pageName:a,vueVersion:r,author:n,description:u}=e,o=formatDate(new Date),p=[];return"2"===r?(p.push({path:`${a}.vue`,content:generateVue2Template({moduleName:t,pageName:a,author:n,description:u,dateStr:o})}),p.push({path:`css/${t}.scss`,content:generateVue2ScssTemplate({moduleName:t})}),p.push({path:"router.js",content:generateVue2RouterTemplate({moduleName:t,pageName:a})}),p.push({path:"store.js",content:generateVue2StoreTemplate({moduleName:t})}),p.push({path:"mock.js",content:generateVue2MockTemplate({moduleName:t})})):(p.push({path:`${a}.vue`,content:generateVue3Template({moduleName:t,pageName:a,author:n,description:u,dateStr:o})}),p.push({path:`css/${t}.scss`,content:generateVue3ScssTemplate({moduleName:t})}),p.push({path:"router.js",content:generateVue3RouterTemplate({moduleName:t,pageName:a})}),p.push({path:"store.ts",content:generateVue3StoreTemplate({moduleName:t})}),p.push({path:"mock.js",content:generateVue3MockTemplate({moduleName:t})})),p.push({path:"images/.gitkeep",content:"# 图片资源目录\n"}),p}function formatDate(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")} ${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}:${String(e.getSeconds()).padStart(2,"0")}`}
1
+ import{generateVue2Template,generateVue2ScssTemplate,generateVue2RouterTemplate,generateVue2StoreTemplate,generateVue2MockTemplate}from"../templates/vue2.js";import{generateVue3Template,generateVue3ScssTemplate,generateVue3RouterTemplate,generateVue3StoreTemplate,generateVue3MockTemplate}from"../templates/vue3.js";export function generateModuleFiles(e){const{moduleName:t,pageName:a,vueVersion:r,author:n,description:u,skipMock:o=!1}=e,p=formatDate(new Date),m=[];return"2"===r?(m.push({path:`${a}.vue`,content:generateVue2Template({moduleName:t,pageName:a,author:n,description:u,dateStr:p})}),m.push({path:`css/${t}.scss`,content:generateVue2ScssTemplate({moduleName:t})}),m.push({path:"router.js",content:generateVue2RouterTemplate({moduleName:t,pageName:a})}),m.push({path:"store.js",content:generateVue2StoreTemplate({moduleName:t})}),o||m.push({path:"mock.js",content:generateVue2MockTemplate({moduleName:t})})):(m.push({path:`${a}.vue`,content:generateVue3Template({moduleName:t,pageName:a,author:n,description:u,dateStr:p})}),m.push({path:`css/${t}.scss`,content:generateVue3ScssTemplate({moduleName:t})}),m.push({path:"router.js",content:generateVue3RouterTemplate({moduleName:t,pageName:a})}),m.push({path:"store.ts",content:generateVue3StoreTemplate({moduleName:t})}),o||m.push({path:"mock.js",content:generateVue3MockTemplate({moduleName:t})})),m.push({path:"images/.gitkeep",content:"# 图片资源目录\n"}),m}function formatDate(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")} ${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}:${String(e.getSeconds()).padStart(2,"0")}`}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "m8-codex-mcp",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "M8 框架智能辅助工具 - 基于 MCP 协议提供组件用法查询和模块结构生成",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",