@didnhdj/fnmap 0.2.1 → 0.3.0
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.md +2 -1
- package/README_CN.md +2 -1
- package/dist/analyzer/index.d.ts.map +1 -1
- package/dist/generator/fnmap.d.ts.map +1 -1
- package/dist/index.js +27 -52
- package/dist/main.d.ts.map +1 -1
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -142,7 +142,8 @@ The `.fnmap` file contains structured information about your code:
|
|
|
142
142
|
- `ClassName:SuperClass startLine-endLine` - Class information
|
|
143
143
|
- ` .methodName(params) line description →calls` - Instance method
|
|
144
144
|
- ` +methodName(params) line description →calls` - Static method
|
|
145
|
-
-
|
|
145
|
+
- `$constName line description` - Constant definition (`$` prefix)
|
|
146
|
+
- `>export1,export2,default` - Exports (`>` prefix, supports `default`, `type:Name`)
|
|
146
147
|
|
|
147
148
|
## CLI Options
|
|
148
149
|
|
package/README_CN.md
CHANGED
|
@@ -142,7 +142,8 @@ fnmap 支持多种配置方式(按优先级排序):
|
|
|
142
142
|
- `ClassName:SuperClass startLine-endLine` - 类信息
|
|
143
143
|
- ` .methodName(params) line description →calls` - 实例方法
|
|
144
144
|
- ` +methodName(params) line description →calls` - 静态方法
|
|
145
|
-
-
|
|
145
|
+
- `$constName line description` - 常量定义(`$` 前缀)
|
|
146
|
+
- `>export1,export2,default` - 导出(`>` 前缀,支持 `default`、`type:Name`)
|
|
146
147
|
|
|
147
148
|
## CLI 选项
|
|
148
149
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,aAAa,EAOd,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,uBAAuB,EAAqB,MAAM,SAAS,CAAC;AAKrE;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,aAAa,CAk7BjF;AAoFD,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fnmap.d.ts","sourceRoot":"","sources":["../../src/generator/fnmap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"fnmap.d.ts","sourceRoot":"","sources":["../../src/generator/fnmap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,MAAM,CA0EjF"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
3
|
-
`)}let
|
|
2
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("fs"),g=require("path"),nt=require("commander"),Se=require("child_process"),rt=require("@babel/parser"),je=require("@babel/traverse"),st=require("os"),it=require("node:readline");function ot(e){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const s=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,s.get?s:{enumerable:!0,get:()=>e[n]})}}return r.default=e,Object.freeze(r)}const at=ot(it),U={FILE_NOT_FOUND:"FILE_NOT_FOUND",FILE_READ_ERROR:"FILE_READ_ERROR",PARSE_ERROR:"PARSE_ERROR",CONFIG_ERROR:"CONFIG_ERROR",VALIDATION_ERROR:"VALIDATION_ERROR",PERMISSION_ERROR:"PERMISSION_ERROR",FILE_TOO_LARGE:"FILE_TOO_LARGE"};function Me(e){return"parseError"in e}function ct(e){return e.success===!0}function lt(e){return e.success===!1}function ft(e){return e.valid===!0}function dt(e){return e.valid===!1}const F={reset:"\x1B[0m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",gray:"\x1B[90m",bold:"\x1B[1m"},Le=10*1024*1024,Ne=50,we=[".js",".ts",".jsx",".tsx",".mjs"],Pe=["node_modules",".git","dist","build",".next","coverage","__pycache__",".cache"],ke={enable:!0,include:["**/*.js","**/*.ts","**/*.jsx","**/*.tsx","**/*.mjs"],exclude:[]};function Ee(e){if(!e)return e;const r=e.replace(/\\/g,"/");return g.normalize(r)}function pt(e){return e.map(Ee)}function Be(e){if(!e||typeof e!="string")return{valid:!1,error:"File path is required and must be a string / 文件路径必须是字符串",errorType:U.VALIDATION_ERROR};if(!v.existsSync(e))return{valid:!1,error:`File not found: ${e} / 文件不存在: ${e}`,errorType:U.FILE_NOT_FOUND};try{const r=v.statSync(e);if(!r.isFile())return{valid:!1,error:`Path is not a file: ${e} / 路径不是文件: ${e}`,errorType:U.VALIDATION_ERROR};if(r.size>Le)return{valid:!1,error:`File too large (${(r.size/1024/1024).toFixed(2)}MB > ${Le/1024/1024}MB): ${e} / 文件过大`,errorType:U.FILE_TOO_LARGE}}catch(r){return{valid:!1,error:`Cannot access file: ${e}. Reason: ${r.message} / 无法访问文件`,errorType:U.PERMISSION_ERROR}}return{valid:!0}}function _e(e){if(!e||typeof e!="object")return{valid:!1,error:"Config must be an object / 配置必须是对象"};const r=e;return r.enable!==void 0&&typeof r.enable!="boolean"?{valid:!1,error:"Config.enable must be a boolean / enable 字段必须是布尔值"}:r.include!==void 0&&!Array.isArray(r.include)?{valid:!1,error:"Config.include must be an array / include 字段必须是数组"}:r.exclude!==void 0&&!Array.isArray(r.exclude)?{valid:!1,error:"Config.exclude must be an array / exclude 字段必须是数组"}:{valid:!0}}function Ae(e,r,n={}){const s=[r];return n.file&&s.push(`File: ${n.file}`),n.line!==void 0&&n.column!==void 0&&s.push(`Location: Line ${n.line}, Column ${n.column}`),n.suggestion&&s.push(`Suggestion: ${n.suggestion}`),s.join(`
|
|
3
|
+
`)}let he=!0,Ce=null;const b={error:e=>{he||console.error(`${F.red}✗${F.reset} ${e}`)},success:e=>{he||console.log(`${F.green}✓${F.reset} ${e}`)},info:e=>{he||console.log(e)},warn:e=>{he||console.warn(`${F.yellow}!${F.reset} ${e}`)},title:e=>{he||console.log(`${F.bold}${e}${F.reset}`)},stats:e=>{console.log(e)}};function xe(e){he=e}function Te(){return he}function Je(){try{let e;try{e=require("../../package.json")}catch{e=require("../package.json")}return e.version}catch{return"0.1.0"}}function Ge(){return Ce=new nt.Command,Ce.name("fnmap").description("AI code indexing tool - Analyzes JS/TS code structure and generates structured code maps").version(Je(),"-v, --version","Show version number").option("-f, --files <files>","Process specified files (comma-separated)",e=>e.split(",").map(r=>Ee(r.trim())).filter(Boolean)).option("-d, --dir <dir>","Process all code files in directory",e=>Ee(e)).option("-p, --project <dir>","Specify project root directory (default: current directory)",e=>Ee(e),process.env.CLAUDE_PROJECT_DIR??process.cwd()).option("-c, --changed","Process only git changed files (staged + modified + untracked)").option("-s, --staged","Process only git staged files (for pre-commit hook)").option("-m, --mermaid [mode]","Generate Mermaid call graph (file=file-level, project=project-level)").option("-l, --log","Show detailed processing logs").option("--init","Create default config file and setup project (interactive)").option("--clear","Clear generated files (.fnmap, *.fnmap, *.mermaid)").argument("[files...]","Directly specify file paths").allowUnknownOption(!1).addHelpText("after",`
|
|
4
4
|
Configuration files (by priority):
|
|
5
5
|
.fnmaprc JSON config file
|
|
6
6
|
.fnmaprc.json JSON config file
|
|
@@ -23,58 +23,33 @@ Examples:
|
|
|
23
23
|
$ fnmap --init Interactive project setup
|
|
24
24
|
$ fnmap --clear Clear all generated files
|
|
25
25
|
$ fnmap --clear --dir src Clear generated files in src directory
|
|
26
|
-
`),
|
|
27
|
-
${
|
|
28
|
-
${h}`}const
|
|
29
|
-
`).map(
|
|
30
|
-
`).map(s=>s.replace(/^\s*\*\s?/,"").trim());for(const s of n)if(s.startsWith("@description "))return s.slice(13).trim().slice(0,60);for(const s of n)if(s&&!s.startsWith("@")&&!s.startsWith("/"))return s.slice(0,60);return""}function
|
|
31
|
-
`).map(i=>i.replace(/^\s*\*\s?/,"").trim()).filter(i=>i&&!i.startsWith("/")&&!i.startsWith("@ai"));for(const i of t)if(i.startsWith("@description ")){n.description=i.slice(13).trim();break}if(!n.description&&t.length>0){const i=t.find(m=>!m.startsWith("@"));i&&(n.description=i)}}let c;try{const a=r&&(r.endsWith(".ts")||r.endsWith(".tsx"));c=nn.parse(e,{sourceType:"unambiguous",plugins:["jsx","classPrivateProperties","classPrivateMethods",...a?["typescript"]:[]]})}catch(a){const t=a;return{parseError:Se(z.PARSE_ERROR,`Syntax error: ${t.message} / 语法错误`,{file:r??void 0,line:(I=t.loc)==null?void 0:I.line,column:(v=t.loc)==null?void 0:v.column,suggestion:"Check syntax errors in the file / 检查文件中的语法错误"}),loc:t.loc,errorType:z.PARSE_ERROR}}const f=new Map,$=new Map,u=new Map;function p(a){if(!a)return null;if(a.type==="Identifier")return a.name;if(a.type==="MemberExpression"){const t=a.object,i=a.property;if(t.type==="Identifier"&&i.type==="Identifier")return t.name}return null}function h(a){var i,m,b;let t=a;for(;t;){if(t.node.type==="FunctionDeclaration"){const x=t.node;if(x.id)return x.id.name}if(t.node.type==="ClassMethod"){const x=t.node,R=(i=t.parentPath)==null?void 0:i.parentPath,C=R==null?void 0:R.node,j=((m=C==null?void 0:C.id)==null?void 0:m.name)??"",T=((b=x.key)==null?void 0:b.name)??"";return j?`${j}.${T}`:T}if(t.node.type==="ArrowFunctionExpression"||t.node.type==="FunctionExpression"){const x=t.parent;if((x==null?void 0:x.type)==="VariableDeclarator"){const C=x.id;if(C!=null&&C.name)return C.name}}t=t.parentPath}return null}ve(c,{VariableDeclarator(a){var i,m,b,x;const t=a.node;if(((i=t.init)==null?void 0:i.type)==="CallExpression"&&((m=t.init.callee)==null?void 0:m.type)==="Identifier"&&t.init.callee.name==="require"&&((x=(b=t.init.arguments)==null?void 0:b[0])==null?void 0:x.type)==="StringLiteral"){const R=t.init.arguments[0].value;if(f.has(R)||f.set(R,new Set),t.id.type==="Identifier"){const C=t.id.name;f.get(R).add(C),$.set(C,R),u.set(C,new Set)}else if(t.id.type==="ObjectPattern"){for(const C of t.id.properties)if(C.type==="ObjectProperty"&&C.key.type==="Identifier"){const j=C.value.type==="Identifier"?C.value.name:C.key.name;f.get(R).add(C.key.name),$.set(j,R),u.set(j,new Set)}}}},CallExpression(a){var i,m,b,x,R,C;const t=a.node;if(((i=t.callee)==null?void 0:i.type)==="Identifier"&&t.callee.name==="require"&&((b=(m=t.arguments)==null?void 0:m[0])==null?void 0:b.type)==="StringLiteral"){const j=a.parent;if((j==null?void 0:j.type)==="MemberExpression"&&((x=j.property)==null?void 0:x.type)==="Identifier"){const T=t.arguments[0].value;f.has(T)||f.set(T,new Set),f.get(T).add(j.property.name);const U=(R=a.parentPath)==null?void 0:R.parent;if((U==null?void 0:U.type)==="VariableDeclarator"){const q=U;((C=q.id)==null?void 0:C.type)==="Identifier"&&($.set(q.id.name,T),u.set(q.id.name,new Set))}}}},ImportDeclaration(a){const t=a.node,i=t.source.value;f.has(i)||f.set(i,new Set);for(const m of t.specifiers){let b,x;if(m.type==="ImportDefaultSpecifier")b="default",x=m.local.name;else if(m.type==="ImportNamespaceSpecifier")b="*",x=m.local.name;else if(m.type==="ImportSpecifier"){const R=m.imported;b=R.type==="Identifier"?R.name:R.value,x=m.local.name}b&&x&&(f.get(i).add(b),$.set(x,i),u.set(x,new Set))}}}),ve(c,{Identifier(a){const t=a.node.name;if(u.has(t)){const i=a.parent;if((i==null?void 0:i.type)==="VariableDeclarator"&&i.id===a.node||(i==null?void 0:i.type)==="ImportSpecifier"||(i==null?void 0:i.type)==="ImportDefaultSpecifier")return;const m=h(a);m&&u.get(t).add(m)}},FunctionDeclaration(a){var C,j,T,U,q;if(a.parent.type==="ExportDefaultDeclaration")return;const t=a.node,i=((C=t.id)==null?void 0:C.name)??"[anonymous]",m=t.params.map(G=>{var K,X;return G.type==="Identifier"?G.name:G.type==="AssignmentPattern"&&((K=G.left)==null?void 0:K.type)==="Identifier"?G.left.name+"?":G.type==="RestElement"&&((X=G.argument)==null?void 0:X.type)==="Identifier"?"..."+G.argument.name:"?"}),b=((T=(j=t.loc)==null?void 0:j.start)==null?void 0:T.line)??0,x=((q=(U=t.loc)==null?void 0:U.end)==null?void 0:q.line)??0,R=Y(ge(t,a.parent));n.functions.push({name:i,params:m.join(","),startLine:b,endLine:x,description:R})},ClassDeclaration(a){var j,T,U,q,G,K,X,ee,ne;if(a.parent.type==="ExportDefaultDeclaration")return;const t=a.node,i=((j=t.id)==null?void 0:j.name)??"[anonymous]",m=((U=(T=t.loc)==null?void 0:T.start)==null?void 0:U.line)??0,b=((G=(q=t.loc)==null?void 0:q.end)==null?void 0:G.line)??0,x=p(t.superClass),R=Y(ge(t,a.parent)),C=[];if((K=t.body)!=null&&K.body){for(const W of t.body.body)if(W.type==="ClassMethod"){const se=((X=W.key)==null?void 0:X.type)==="Identifier"?W.key.name:"[computed]",ie=W.params.map(H=>{var re;return H.type==="Identifier"?H.name:H.type==="AssignmentPattern"&&((re=H.left)==null?void 0:re.type)==="Identifier"?H.left.name+"?":"?"}),oe=((ne=(ee=W.loc)==null?void 0:ee.start)==null?void 0:ne.line)??0;let te="";const Z=W.leadingComments;Z&&Z.length>0&&(te=Y(Z[Z.length-1])),C.push({name:se,params:ie.join(","),line:oe,static:W.static,kind:W.kind,description:te})}}n.classes.push({name:i,superClass:x,startLine:m,endLine:b,methods:C,description:R})},VariableDeclaration(a){var b,x,R,C,j,T,U,q,G,K,X,ee,ne,W,se,ie,oe,te,Z,H,re,ce,le,fe,de,me,pe,ae,B,L,J;const t=a.parent.type;if(t!=="Program"&&t!=="ExportNamedDeclaration")return;const i=a.node,m=Y(ge(i,a.parent));for(const O of i.declarations){const _=((b=O.id)==null?void 0:b.type)==="Identifier"?O.id.name:void 0;if(_){if(((x=O.init)==null?void 0:x.type)==="ArrowFunctionExpression"||((R=O.init)==null?void 0:R.type)==="FunctionExpression"){const d=O.init.params.map(P=>{var N,V;return P.type==="Identifier"?P.name:P.type==="AssignmentPattern"&&((N=P.left)==null?void 0:N.type)==="Identifier"?P.left.name+"?":P.type==="RestElement"&&((V=P.argument)==null?void 0:V.type)==="Identifier"?"..."+P.argument.name:"?"}),A=((j=(C=i.loc)==null?void 0:C.start)==null?void 0:j.line)??0,M=((U=(T=i.loc)==null?void 0:T.end)==null?void 0:U.line)??0;n.functions.push({name:_,params:d.join(","),startLine:A,endLine:M,description:m});continue}if(((q=O.init)==null?void 0:q.type)==="ClassExpression"){const w=O.init,d=((K=(G=i.loc)==null?void 0:G.start)==null?void 0:K.line)??0,A=((ee=(X=i.loc)==null?void 0:X.end)==null?void 0:ee.line)??0,M=p(w.superClass),P=[];if((ne=w.body)!=null&&ne.body){for(const N of w.body.body)if(N.type==="ClassMethod"){const V=((W=N.key)==null?void 0:W.type)==="Identifier"?N.key.name:"[computed]",k=N.params.map(Ee=>{var Ue;return Ee.type==="Identifier"?Ee.name:Ee.type==="AssignmentPattern"&&((Ue=Ee.left)==null?void 0:Ue.type)==="Identifier"?Ee.left.name+"?":"?"}),D=((ie=(se=N.loc)==null?void 0:se.start)==null?void 0:ie.line)??0;let Q="";const ue=N.leadingComments;ue&&ue.length>0&&(Q=Y(ue[ue.length-1])),P.push({name:V,params:k.join(","),line:D,static:N.static,kind:N.kind,description:Q})}}n.classes.push({name:_,superClass:M,startLine:d,endLine:A,methods:P,description:m});continue}if(((oe=O.init)==null?void 0:oe.type)==="ObjectExpression"){const w=O.init;for(const d of w.properties)if(d.type==="ObjectMethod"){const A=((te=d.key)==null?void 0:te.type)==="Identifier"?`${_}.${d.key.name}`:`${_}.[computed]`,M=d.params.map(k=>{var D,Q;return k.type==="Identifier"?k.name:k.type==="AssignmentPattern"&&((D=k.left)==null?void 0:D.type)==="Identifier"?k.left.name+"?":k.type==="RestElement"&&((Q=k.argument)==null?void 0:Q.type)==="Identifier"?"..."+k.argument.name:"?"}),P=((H=(Z=d.loc)==null?void 0:Z.start)==null?void 0:H.line)??0,N=((ce=(re=d.loc)==null?void 0:re.end)==null?void 0:ce.line)??0;let V="";d.leadingComments&&d.leadingComments.length>0&&(V=Y(d.leadingComments[d.leadingComments.length-1])),n.functions.push({name:A,params:M.join(","),startLine:P,endLine:N,description:V})}else if(d.type==="ObjectProperty"&&((le=d.key)==null?void 0:le.type)==="Identifier"&&(((fe=d.value)==null?void 0:fe.type)==="ArrowFunctionExpression"||((de=d.value)==null?void 0:de.type)==="FunctionExpression")){const A=d.value,M=`${_}.${d.key.name}`,P=A.params.map(D=>{var Q,ue;return D.type==="Identifier"?D.name:D.type==="AssignmentPattern"&&((Q=D.left)==null?void 0:Q.type)==="Identifier"?D.left.name+"?":D.type==="RestElement"&&((ue=D.argument)==null?void 0:ue.type)==="Identifier"?"..."+D.argument.name:"?"}),N=((pe=(me=d.loc)==null?void 0:me.start)==null?void 0:pe.line)??0,V=((B=(ae=d.loc)==null?void 0:ae.end)==null?void 0:B.line)??0;let k="";d.leadingComments&&d.leadingComments.length>0&&(k=Y(d.leadingComments[d.leadingComments.length-1])),n.functions.push({name:M,params:P.join(","),startLine:N,endLine:V,description:k})}}if(i.kind==="const"&&_===_.toUpperCase()&&_.length>2){const w=((J=(L=i.loc)==null?void 0:L.start)==null?void 0:J.line)??0;n.constants.push({name:_,line:w,description:m})}}}},ExportDefaultDeclaration(a){var b,x,R,C,j,T,U,q,G,K,X,ee,ne,W,se,ie,oe,te,Z,H,re,ce,le,fe,de,me,pe,ae,B;const t=a.node,i=t.declaration,m=Y(ge(t,a.parent));if(i.type==="FunctionDeclaration"){const L=i,J=((b=L.id)==null?void 0:b.name)??"[default]",O=L.params.map(d=>{var A,M;return d.type==="Identifier"?d.name:d.type==="AssignmentPattern"&&((A=d.left)==null?void 0:A.type)==="Identifier"?d.left.name+"?":d.type==="RestElement"&&((M=d.argument)==null?void 0:M.type)==="Identifier"?"..."+d.argument.name:"?"}),_=((R=(x=t.loc)==null?void 0:x.start)==null?void 0:R.line)??0,w=((j=(C=t.loc)==null?void 0:C.end)==null?void 0:j.line)??0;n.functions.push({name:J,params:O.join(","),startLine:_,endLine:w,description:m});return}if(i.type==="ClassDeclaration"){const L=i,J=((T=L.id)==null?void 0:T.name)??"[default]",O=((q=(U=t.loc)==null?void 0:U.start)==null?void 0:q.line)??0,_=((K=(G=t.loc)==null?void 0:G.end)==null?void 0:K.line)??0,w=p(L.superClass),d=[];if((X=L.body)!=null&&X.body){for(const A of L.body.body)if(A.type==="ClassMethod"){const M=((ee=A.key)==null?void 0:ee.type)==="Identifier"?A.key.name:"[computed]",P=A.params.map(D=>{var Q;return D.type==="Identifier"?D.name:D.type==="AssignmentPattern"&&((Q=D.left)==null?void 0:Q.type)==="Identifier"?D.left.name+"?":"?"}),N=((W=(ne=A.loc)==null?void 0:ne.start)==null?void 0:W.line)??0;let V="";const k=A.leadingComments;k&&k.length>0&&(V=Y(k[k.length-1])),d.push({name:M,params:P.join(","),line:N,static:A.static,kind:A.kind,description:V})}}n.classes.push({name:J,superClass:w,startLine:O,endLine:_,methods:d,description:m});return}if(i.type==="ArrowFunctionExpression"||i.type==="FunctionExpression"){const L=i,J=L.type==="FunctionExpression"&&((se=L.id)!=null&&se.name)?L.id.name:"[default]",O=L.params.map(d=>{var A,M;return d.type==="Identifier"?d.name:d.type==="AssignmentPattern"&&((A=d.left)==null?void 0:A.type)==="Identifier"?d.left.name+"?":d.type==="RestElement"&&((M=d.argument)==null?void 0:M.type)==="Identifier"?"..."+d.argument.name:"?"}),_=((oe=(ie=t.loc)==null?void 0:ie.start)==null?void 0:oe.line)??0,w=((Z=(te=t.loc)==null?void 0:te.end)==null?void 0:Z.line)??0;n.functions.push({name:J,params:O.join(","),startLine:_,endLine:w,description:m});return}if(i.type==="ClassExpression"){const L=i,J=((H=L.id)==null?void 0:H.name)??"[default]",O=((ce=(re=t.loc)==null?void 0:re.start)==null?void 0:ce.line)??0,_=((fe=(le=t.loc)==null?void 0:le.end)==null?void 0:fe.line)??0,w=((de=L.superClass)==null?void 0:de.type)==="Identifier"?L.superClass.name:null,d=[];if((me=L.body)!=null&&me.body){for(const A of L.body.body)if(A.type==="ClassMethod"){const M=((pe=A.key)==null?void 0:pe.type)==="Identifier"?A.key.name:"[computed]",P=A.params.map(D=>{var Q;return D.type==="Identifier"?D.name:D.type==="AssignmentPattern"&&((Q=D.left)==null?void 0:Q.type)==="Identifier"?D.left.name+"?":"?"}),N=((B=(ae=A.loc)==null?void 0:ae.start)==null?void 0:B.line)??0;let V="";const k=A.leadingComments;k&&k.length>0&&(V=Y(k[k.length-1])),d.push({name:M,params:P.join(","),line:N,static:A.static,kind:A.kind,description:V})}}n.classes.push({name:J,superClass:w,startLine:O,endLine:_,methods:d,description:m})}},AssignmentExpression(a){var x,R,C,j,T,U,q,G,K,X,ee,ne,W,se,ie,oe,te,Z,H,re,ce,le,fe,de,me,pe;const t=a.node;if(a.parent.type!=="ExpressionStatement")return;const i=(x=a.parentPath)==null?void 0:x.parent;if((i==null?void 0:i.type)!=="Program")return;const m=t.left,b=t.right;if(m.type==="MemberExpression"&&((R=m.object)==null?void 0:R.type)==="Identifier"&&m.object.name==="module"&&((C=m.property)==null?void 0:C.type)==="Identifier"&&m.property.name==="exports"){const ae=Y(ge(a.parent,i));if(b.type==="FunctionExpression"||b.type==="ArrowFunctionExpression"){const B=b,L=b.type==="FunctionExpression"&&((j=b.id)!=null&&j.name)?b.id.name:"[exports]",J=B.params.map(w=>{var d,A;return w.type==="Identifier"?w.name:w.type==="AssignmentPattern"&&((d=w.left)==null?void 0:d.type)==="Identifier"?w.left.name+"?":w.type==="RestElement"&&((A=w.argument)==null?void 0:A.type)==="Identifier"?"..."+w.argument.name:"?"}),O=((U=(T=t.loc)==null?void 0:T.start)==null?void 0:U.line)??0,_=((G=(q=t.loc)==null?void 0:q.end)==null?void 0:G.line)??0;n.functions.push({name:L,params:J.join(","),startLine:O,endLine:_,description:ae});return}if(b.type==="ClassExpression"){const B=b,L=((K=B.id)==null?void 0:K.name)??"[exports]",J=((ee=(X=t.loc)==null?void 0:X.start)==null?void 0:ee.line)??0,O=((W=(ne=t.loc)==null?void 0:ne.end)==null?void 0:W.line)??0,_=p(B.superClass),w=[];if((se=B.body)!=null&&se.body){for(const d of B.body.body)if(d.type==="ClassMethod"){const A=((ie=d.key)==null?void 0:ie.type)==="Identifier"?d.key.name:"[computed]",M=d.params.map(N=>{var V;return N.type==="Identifier"?N.name:N.type==="AssignmentPattern"&&((V=N.left)==null?void 0:V.type)==="Identifier"?N.left.name+"?":"?"}),P=((te=(oe=d.loc)==null?void 0:oe.start)==null?void 0:te.line)??0;w.push({name:A,params:M.join(","),line:P,static:d.static,kind:d.kind,description:""})}}n.classes.push({name:L,superClass:_,startLine:J,endLine:O,methods:w,description:ae});return}}if(m.type==="MemberExpression"&&((Z=m.property)==null?void 0:Z.type)==="Identifier"){const ae=m.property.name;let B=!1;if(((H=m.object)==null?void 0:H.type)==="Identifier"&&m.object.name==="exports"&&(B=!0),((re=m.object)==null?void 0:re.type)==="MemberExpression"&&((ce=m.object.object)==null?void 0:ce.type)==="Identifier"&&m.object.object.name==="module"&&((le=m.object.property)==null?void 0:le.type)==="Identifier"&&m.object.property.name==="exports"&&(B=!0),B){const L=Y(ge(a.parent,i));if(b.type==="FunctionExpression"||b.type==="ArrowFunctionExpression"){const O=b.params.map(d=>{var A,M;return d.type==="Identifier"?d.name:d.type==="AssignmentPattern"&&((A=d.left)==null?void 0:A.type)==="Identifier"?d.left.name+"?":d.type==="RestElement"&&((M=d.argument)==null?void 0:M.type)==="Identifier"?"..."+d.argument.name:"?"}),_=((de=(fe=t.loc)==null?void 0:fe.start)==null?void 0:de.line)??0,w=((pe=(me=t.loc)==null?void 0:me.end)==null?void 0:pe.line)??0;n.functions.push({name:ae,params:O.join(","),startLine:_,endLine:w,description:L})}}}}});for(const[a,t]of f){const i=new Set;for(const m of $.keys())if($.get(m)===a&&u.has(m))for(const b of u.get(m))i.add(b);n.imports.push({module:a,members:Array.from(t),usedIn:Array.from(i)})}const o=new Set;for(const a of n.functions)o.add(a.name);for(const a of n.classes)for(const t of a.methods)o.add(t.name),o.add(`${a.name}.${t.name}`);const y=new Set($.keys()),l=new Map;ve(c,{CallExpression(a){var m,b;const t=a.node;let i=null;if(t.callee.type==="Identifier")i=t.callee.name;else if(t.callee.type==="MemberExpression"&&((m=t.callee.property)==null?void 0:m.type)==="Identifier"){const x=((b=t.callee.object)==null?void 0:b.type)==="Identifier"?t.callee.object.name:void 0,R=t.callee.property.name;x&&y.has(x)?i=`${x}.${R}`:i=R}if(i){const x=h(a);if(x&&x!==i){const R=o.has(i),C=y.has(i)||i.includes(".")&&y.has(i.split(".")[0]);(R||C)&&(l.has(x)||l.set(x,new Set),l.get(x).add(i))}}}}),n.callGraph={};for(const[a,t]of l)n.callGraph[a]=Array.from(t);return n.isPureType=yn(c),n}function yn(e){let r=!1;for(const n of e.program.body){switch(n.type){case"TSTypeAliasDeclaration":case"TSInterfaceDeclaration":case"TSEnumDeclaration":break;case"ImportDeclaration":n.importKind!=="type"&&n.specifiers.some(c=>c.type==="ImportSpecifier"?c.importKind!=="type":!0)&&n.specifiers.length>0&&(r=!0);break;case"ExportNamedDeclaration":if(n.exportKind==="type")break;if(n.declaration){const s=n.declaration.type;s!=="TSTypeAliasDeclaration"&&s!=="TSInterfaceDeclaration"&&(r=!0)}else n.specifiers&&n.specifiers.length>0&&n.specifiers.some(c=>c.type==="ExportSpecifier"?c.exportKind!=="type":!0)&&(r=!0);break;case"ExportDefaultDeclaration":r=!0;break;case"ExportAllDeclaration":n.exportKind!=="type"&&(r=!0);break;default:r=!0;break}if(r)break}return!r}function gn(e,r){const n=[];let s=`/*@AI ${r}`;e.description&&(s+=` - ${e.description.slice(0,50)}`),n.push(s);for(const c of e.imports){const f=Array.isArray(c.members)?c.members.join(","):"";let $=`<${c.module}:${f}`;Array.isArray(c.usedIn)&&c.usedIn.length>0&&($+=` ->${c.usedIn.join(",")}`),n.push($)}for(const c of e.classes){let f=c.name;c.superClass&&(f+=`:${c.superClass}`),f+=` ${c.startLine}-${c.endLine}`,c.description&&(f+=` ${c.description}`),n.push(f);for(const $ of c.methods){const u=$.static?" +":" .",p=$.kind==="get"?"get:":$.kind==="set"?"set:":"";let h=`${u}${p}${$.name}(${$.params}) ${$.line}`;$.description&&(h+=` ${$.description}`),n.push(h)}}for(const c of e.functions){let f=`${c.name}(${c.params}) ${c.startLine}-${c.endLine}`;c.description&&(f+=` ${c.description}`),n.push(f)}for(const c of e.constants){let f=`${c.name} ${c.line}`;c.description&&(f+=` ${c.description}`),n.push(f)}return n.push("@AI*/"),n.join(`
|
|
32
|
-
`)}function
|
|
33
|
-
`)}function
|
|
34
|
-
`)}function
|
|
35
|
-
`)}function
|
|
36
|
-
|
|
37
|
-
## .fnmap Code Index Format
|
|
38
|
-
|
|
39
|
-
The \`.fnmap\` file provides a structured code index for quick navigation. Read it before exploring code to locate target files and function line numbers.
|
|
40
|
-
|
|
41
|
-
**Format Reference:**
|
|
42
|
-
|
|
43
|
-
- \`#filename.js\` - Filename followed by file description
|
|
44
|
-
- \`<module:members\` - Imported module and its members
|
|
45
|
-
- \`funcName(params) 10-20 description →callee1,callee2\` - Function signature, line range, description, call graph
|
|
46
|
-
- \`ClassName:SuperClass 30-100\` - Class definition with inheritance
|
|
47
|
-
- \` .method(params) 35 →callee\` - Instance method (\`.\` prefix)
|
|
48
|
-
- \` +staticMethod(params) 40\` - Static method (\`+\` prefix)
|
|
49
|
-
- \`CONST_NAME 5\` - Constant definition with line number
|
|
50
|
-
|
|
51
|
-
**Call Graph:** The \`→\` at the end of function/method lines indicates which functions are called (both local and imported), helping you understand code execution flow.
|
|
52
|
-
|
|
53
|
-
**Note:** \`.fnmap\` files are auto-maintained by scripts and should not be manually updated.
|
|
54
|
-
|
|
55
|
-
## Code Comment Guidelines
|
|
56
|
-
|
|
57
|
-
1. Every global variable, function, class, and file module must have a **concise comment describing its purpose or functionality** - avoid describing anything else
|
|
58
|
-
2. When updating code, always update related comments to reflect the changes
|
|
59
|
-
3. Prefer encapsulating logic in functions rather than writing flat, sequential code
|
|
60
|
-
`,Ve=`
|
|
26
|
+
`),Ce}function be(){return Ce||Ge()}const mt={get opts(){return be().opts.bind(be())},get args(){return be().args},get parse(){return be().parse.bind(be())}};function Ke(e){const r=[".fnmaprc",".fnmaprc.json"];for(const s of r){const c=g.join(e,s);if(v.existsSync(c))try{const d=v.readFileSync(c,"utf-8");if(!d.trim()){b.warn(`Config file is empty: ${s}. Using default config / 配置文件为空,使用默认配置`);continue}let E;try{E=JSON.parse(d)}catch(y){const h=y,o=Ae(U.CONFIG_ERROR,`Failed to parse config file: ${s} / 配置文件解析失败`,{file:c,line:h.lineNumber,column:h.columnNumber,suggestion:"Check JSON syntax, ensure proper quotes and commas / 检查 JSON 语法,确保引号和逗号正确"});b.warn(o);continue}const m=_e(E);if(!m.valid){b.warn(`Invalid config in ${s}: ${m.error}`);continue}return{config:E,source:s}}catch(d){const E=d,m=Ae(U.FILE_READ_ERROR,`Failed to read config file: ${s} / 配置文件读取失败`,{file:c,suggestion:E.message});b.warn(m)}}const n=g.join(e,"package.json");if(v.existsSync(n))try{const s=JSON.parse(v.readFileSync(n,"utf-8"));if(s.fnmap){const c=_e(s.fnmap);if(!c.valid)b.warn(`Invalid fnmap config in package.json: ${c.error}`);else return{config:s.fnmap,source:"package.json#fnmap"}}}catch{}return{config:null,source:null}}function Xe(e){return e?{...ke,...e,exclude:[...e.exclude??[]]}:ke}function Ue(e){return e.endsWith(".d.ts")||e.endsWith(".d.tsx")||e.endsWith(".d.mts")}function ut(e){try{return Se.execSync("git rev-parse --show-toplevel",{cwd:e,encoding:"utf-8"}).trim()}catch{return null}}function He(e,r=!1){const n=[];try{const s=ut(e);if(!s)return[];let c;if(r)c=Se.execSync("git diff --cached --name-only --diff-filter=ACMR",{cwd:e,encoding:"utf-8"});else{const m=Se.execSync("git diff --cached --name-only --diff-filter=ACMR",{cwd:e,encoding:"utf-8"}),y=Se.execSync("git diff --name-only --diff-filter=ACMR",{cwd:e,encoding:"utf-8"}),h=Se.execSync("git ls-files --others --exclude-standard",{cwd:e,encoding:"utf-8"});c=`${m}
|
|
27
|
+
${y}
|
|
28
|
+
${h}`}const d=c.split(`
|
|
29
|
+
`).map(m=>m.trim()).filter(Boolean).filter(m=>{const y=g.extname(m);return we.includes(y)&&!Ue(m)}),E=[...new Set(d)];for(const m of E){const y=g.resolve(s,m);v.existsSync(y)&&y.startsWith(g.resolve(e))&&n.push(y)}}catch{return[]}return n}function yt(e){const r=[];if(!v.existsSync(e))return r;try{const n=v.readdirSync(e,{withFileTypes:!0});for(const s of n)if(s.isFile()){const c=g.extname(s.name);we.includes(c)&&!Ue(s.name)&&r.push(g.join(e,s.name))}}catch{return r}return r}function ve(e,r=e,n=Pe,s=0,c=new Set){const d=[];if(!v.existsSync(e))return b.warn(`Directory does not exist: ${e} / 目录不存在`),d;if(s>Ne)return b.warn(`Max directory depth (${Ne}) exceeded: ${e} / 超过最大目录深度`),d;let E;try{E=v.realpathSync(e)}catch(y){const h=y;return b.warn(`Cannot resolve real path: ${e}. Reason: ${h.message} / 无法解析真实路径`),d}if(c.has(E))return b.warn(`Circular reference detected, skipping: ${e} / 检测到循环引用`),d;c.add(E);let m;try{m=v.readdirSync(e,{withFileTypes:!0})}catch(y){const h=y;return h.code==="EACCES"||h.code==="EPERM"?b.warn(`Permission denied: ${e} / 权限不足`):b.warn(`Failed to read directory: ${e}. Reason: ${h.message} / 读取目录失败`),d}for(const y of m)try{const h=g.join(e,y.name);if(y.isDirectory())n.includes(y.name)||d.push(...ve(h,r,n,s+1,c));else if(y.isFile()){const o=g.extname(y.name);we.includes(o)&&!Ue(y.name)&&d.push(g.relative(r,h))}}catch(h){const o=h;b.warn(`Error processing entry: ${y.name}. Reason: ${o.message} / 处理条目出错`)}return d}function ee(e){if(!e)return"";const n=e.value.split(`
|
|
30
|
+
`).map(s=>s.replace(/^\s*\*\s?/,"").trim());for(const s of n)if(s.startsWith("@description "))return s.slice(13).trim().slice(0,60);for(const s of n)if(s&&!s.startsWith("@")&&!s.startsWith("/"))return s.slice(0,60);return""}function $e(e,r){if(e.leadingComments&&e.leadingComments.length>0)return e.leadingComments[e.leadingComments.length-1]??null;if(r&&(r.type==="ExportNamedDeclaration"||r.type==="ExportDefaultDeclaration")){const n=r;if(n.leadingComments&&n.leadingComments.length>0)return n.leadingComments[n.leadingComments.length-1]??null}return null}const Fe=typeof je=="function"?je:je.default;function qe(e,r){var S,j;if(e==null)return{parseError:"Code content is null or undefined / 代码内容为空",errorType:U.VALIDATION_ERROR};if(typeof e!="string")return{parseError:"Code must be a string / 代码必须是字符串类型",errorType:U.VALIDATION_ERROR};if(!e.trim())return{description:"",imports:[],functions:[],classes:[],constants:[],exports:[],callGraph:{}};const n={description:"",imports:[],functions:[],classes:[],constants:[],exports:[],callGraph:{}},s=e.match(/^\/\*\*[\s\S]*?\*\//);if(s){const t=s[0].split(`
|
|
31
|
+
`).map(i=>i.replace(/^\s*\*\s?/,"").trim()).filter(i=>i&&!i.startsWith("/")&&!i.startsWith("@ai"));for(const i of t)if(i.startsWith("@description ")){n.description=i.slice(13).trim();break}if(!n.description&&t.length>0){const i=t.find(f=>!f.startsWith("@"));i&&(n.description=i)}}let c;try{const a=r&&(r.endsWith(".ts")||r.endsWith(".tsx"));c=rt.parse(e,{sourceType:"unambiguous",plugins:["jsx","classPrivateProperties","classPrivateMethods",...a?["typescript"]:[]]})}catch(a){const t=a;return{parseError:Ae(U.PARSE_ERROR,`Syntax error: ${t.message} / 语法错误`,{file:r??void 0,line:(S=t.loc)==null?void 0:S.line,column:(j=t.loc)==null?void 0:j.column,suggestion:"Check syntax errors in the file / 检查文件中的语法错误"}),loc:t.loc,errorType:U.PARSE_ERROR}}const d=new Map,E=new Map,m=new Map;function y(a){if(!a)return null;if(a.type==="Identifier")return a.name;if(a.type==="MemberExpression"){const t=a.object,i=a.property;if(t.type==="Identifier"&&i.type==="Identifier")return t.name}return null}function h(a){var i,f,I;let t=a;for(;t;){if(t.node.type==="FunctionDeclaration"){const $=t.node;if($.id)return $.id.name}if(t.node.type==="ClassMethod"){const $=t.node,u=(i=t.parentPath)==null?void 0:i.parentPath,C=u==null?void 0:u.node,D=((f=C==null?void 0:C.id)==null?void 0:f.name)??"",k=((I=$.key)==null?void 0:I.name)??"";return D?`${D}.${k}`:k}if(t.node.type==="ArrowFunctionExpression"||t.node.type==="FunctionExpression"){const $=t.parent;if(($==null?void 0:$.type)==="VariableDeclarator"){const C=$.id;if(C!=null&&C.name)return C.name}}t=t.parentPath}return null}Fe(c,{VariableDeclarator(a){var i,f,I,$;const t=a.node;if(((i=t.init)==null?void 0:i.type)==="CallExpression"&&((f=t.init.callee)==null?void 0:f.type)==="Identifier"&&t.init.callee.name==="require"&&(($=(I=t.init.arguments)==null?void 0:I[0])==null?void 0:$.type)==="StringLiteral"){const u=t.init.arguments[0].value;if(d.has(u)||d.set(u,new Set),t.id.type==="Identifier"){const C=t.id.name;d.get(u).add(C),E.set(C,u),m.set(C,new Set)}else if(t.id.type==="ObjectPattern"){for(const C of t.id.properties)if(C.type==="ObjectProperty"&&C.key.type==="Identifier"){const D=C.value.type==="Identifier"?C.value.name:C.key.name;d.get(u).add(C.key.name),E.set(D,u),m.set(D,new Set)}}}},CallExpression(a){var i,f,I,$,u,C;const t=a.node;if(((i=t.callee)==null?void 0:i.type)==="Identifier"&&t.callee.name==="require"&&((I=(f=t.arguments)==null?void 0:f[0])==null?void 0:I.type)==="StringLiteral"){const D=a.parent;if((D==null?void 0:D.type)==="MemberExpression"&&(($=D.property)==null?void 0:$.type)==="Identifier"){const k=t.arguments[0].value;d.has(k)||d.set(k,new Set),d.get(k).add(D.property.name);const M=(u=a.parentPath)==null?void 0:u.parent;if((M==null?void 0:M.type)==="VariableDeclarator"){const G=M;((C=G.id)==null?void 0:C.type)==="Identifier"&&(E.set(G.id.name,k),m.set(G.id.name,new Set))}}}},ImportDeclaration(a){const t=a.node,i=t.source.value;d.has(i)||d.set(i,new Set);for(const f of t.specifiers){let I,$;if(f.type==="ImportDefaultSpecifier")I="default",$=f.local.name;else if(f.type==="ImportNamespaceSpecifier")I="*",$=f.local.name;else if(f.type==="ImportSpecifier"){const u=f.imported;I=u.type==="Identifier"?u.name:u.value,$=f.local.name}I&&$&&(d.get(i).add(I),E.set($,i),m.set($,new Set))}}}),Fe(c,{Identifier(a){const t=a.node.name;if(m.has(t)){const i=a.parent;if((i==null?void 0:i.type)==="VariableDeclarator"&&i.id===a.node||(i==null?void 0:i.type)==="ImportSpecifier"||(i==null?void 0:i.type)==="ImportDefaultSpecifier")return;const f=h(a);f&&m.get(t).add(f)}},FunctionDeclaration(a){var C,D,k,M,G;if(a.parent.type==="ExportDefaultDeclaration")return;const t=a.node,i=((C=t.id)==null?void 0:C.name)??"[anonymous]",f=t.params.map(O=>{var K,X;return O.type==="Identifier"?O.name:O.type==="AssignmentPattern"&&((K=O.left)==null?void 0:K.type)==="Identifier"?O.left.name+"?":O.type==="RestElement"&&((X=O.argument)==null?void 0:X.type)==="Identifier"?"..."+O.argument.name:"?"}),I=((k=(D=t.loc)==null?void 0:D.start)==null?void 0:k.line)??0,$=((G=(M=t.loc)==null?void 0:M.end)==null?void 0:G.line)??0,u=ee($e(t,a.parent));n.functions.push({name:i,params:f.join(","),startLine:I,endLine:$,description:u})},ClassDeclaration(a){var D,k,M,G,O,K,X,te,ne;if(a.parent.type==="ExportDefaultDeclaration")return;const t=a.node,i=((D=t.id)==null?void 0:D.name)??"[anonymous]",f=((M=(k=t.loc)==null?void 0:k.start)==null?void 0:M.line)??0,I=((O=(G=t.loc)==null?void 0:G.end)==null?void 0:O.line)??0,$=y(t.superClass),u=ee($e(t,a.parent)),C=[];if((K=t.body)!=null&&K.body){for(const q of t.body.body)if(q.type==="ClassMethod"){const ie=((X=q.key)==null?void 0:X.type)==="Identifier"?q.key.name:"[computed]",oe=q.params.map(H=>{var se;return H.type==="Identifier"?H.name:H.type==="AssignmentPattern"&&((se=H.left)==null?void 0:se.type)==="Identifier"?H.left.name+"?":"?"}),ae=((ne=(te=q.loc)==null?void 0:te.start)==null?void 0:ne.line)??0;let re="";const Q=q.leadingComments;Q&&Q.length>0&&(re=ee(Q[Q.length-1])),C.push({name:ie,params:oe.join(","),line:ae,static:q.static,kind:q.kind,description:re})}}n.classes.push({name:i,superClass:$,startLine:f,endLine:I,methods:C,description:u})},VariableDeclaration(a){var I,$,u,C,D,k,M,G,O,K,X,te,ne,q,ie,oe,ae,re,Q,H,se,le,fe,de,pe,me,ue,ce,z,L,J,W,B;const t=a.parent.type;if(t!=="Program"&&t!=="ExportNamedDeclaration")return;const i=a.node,f=ee($e(i,a.parent));for(const w of i.declarations){const x=((I=w.id)==null?void 0:I.type)==="Identifier"?w.id.name:void 0;if(x){if((($=w.init)==null?void 0:$.type)==="ArrowFunctionExpression"||((u=w.init)==null?void 0:u.type)==="FunctionExpression"){const A=w.init.params.map(_=>{var N,T;return _.type==="Identifier"?_.name:_.type==="AssignmentPattern"&&((N=_.left)==null?void 0:N.type)==="Identifier"?_.left.name+"?":_.type==="RestElement"&&((T=_.argument)==null?void 0:T.type)==="Identifier"?"..."+_.argument.name:"?"}),Z=((D=(C=i.loc)==null?void 0:C.start)==null?void 0:D.line)??0,V=((M=(k=i.loc)==null?void 0:k.end)==null?void 0:M.line)??0;n.functions.push({name:x,params:A.join(","),startLine:Z,endLine:V,description:f});continue}if(((G=w.init)==null?void 0:G.type)==="ClassExpression"){const R=w.init,A=((K=(O=i.loc)==null?void 0:O.start)==null?void 0:K.line)??0,Z=((te=(X=i.loc)==null?void 0:X.end)==null?void 0:te.line)??0,V=y(R.superClass),_=[];if((ne=R.body)!=null&&ne.body){for(const N of R.body.body)if(N.type==="ClassMethod"){const T=((q=N.key)==null?void 0:q.type)==="Identifier"?N.key.name:"[computed]",P=N.params.map(Ie=>{var Ve;return Ie.type==="Identifier"?Ie.name:Ie.type==="AssignmentPattern"&&((Ve=Ie.left)==null?void 0:Ve.type)==="Identifier"?Ie.left.name+"?":"?"}),Y=((oe=(ie=N.loc)==null?void 0:ie.start)==null?void 0:oe.line)??0;let ye="";const ge=N.leadingComments;ge&&ge.length>0&&(ye=ee(ge[ge.length-1])),_.push({name:T,params:P.join(","),line:Y,static:N.static,kind:N.kind,description:ye})}}n.classes.push({name:x,superClass:V,startLine:A,endLine:Z,methods:_,description:f});continue}if(((ae=w.init)==null?void 0:ae.type)==="ObjectExpression"){const R=w.init;for(const A of R.properties)if(A.type==="ObjectMethod"){const Z=((re=A.key)==null?void 0:re.type)==="Identifier"?`${x}.${A.key.name}`:`${x}.[computed]`,V=A.params.map(P=>{var Y,ye;return P.type==="Identifier"?P.name:P.type==="AssignmentPattern"&&((Y=P.left)==null?void 0:Y.type)==="Identifier"?P.left.name+"?":P.type==="RestElement"&&((ye=P.argument)==null?void 0:ye.type)==="Identifier"?"..."+P.argument.name:"?"}),_=((H=(Q=A.loc)==null?void 0:Q.start)==null?void 0:H.line)??0,N=((le=(se=A.loc)==null?void 0:se.end)==null?void 0:le.line)??0;let T="";A.leadingComments&&A.leadingComments.length>0&&(T=ee(A.leadingComments[A.leadingComments.length-1])),n.functions.push({name:Z,params:V.join(","),startLine:_,endLine:N,description:T})}else if(A.type==="ObjectProperty"&&((fe=A.key)==null?void 0:fe.type)==="Identifier"&&(((de=A.value)==null?void 0:de.type)==="ArrowFunctionExpression"||((pe=A.value)==null?void 0:pe.type)==="FunctionExpression")){const Z=A.value,V=`${x}.${A.key.name}`,_=Z.params.map(Y=>{var ye,ge;return Y.type==="Identifier"?Y.name:Y.type==="AssignmentPattern"&&((ye=Y.left)==null?void 0:ye.type)==="Identifier"?Y.left.name+"?":Y.type==="RestElement"&&((ge=Y.argument)==null?void 0:ge.type)==="Identifier"?"..."+Y.argument.name:"?"}),N=((ue=(me=A.loc)==null?void 0:me.start)==null?void 0:ue.line)??0,T=((z=(ce=A.loc)==null?void 0:ce.end)==null?void 0:z.line)??0;let P="";A.leadingComments&&A.leadingComments.length>0&&(P=ee(A.leadingComments[A.leadingComments.length-1])),n.functions.push({name:V,params:_.join(","),startLine:N,endLine:T,description:P})}}if(i.kind==="const"&&!(((L=w.init)==null?void 0:L.type)==="CallExpression"&&((J=w.init.callee)==null?void 0:J.type)==="Identifier"&&w.init.callee.name==="require")){const A=((B=(W=i.loc)==null?void 0:W.start)==null?void 0:B.line)??0;n.constants.push({name:x,line:A,description:f})}}}},ExportDefaultDeclaration(a){var I,$,u,C,D,k,M,G,O,K,X,te,ne,q,ie,oe,ae,re,Q,H,se,le,fe,de,pe,me,ue,ce,z;const t=a.node,i=t.declaration,f=ee($e(t,a.parent));if(i.type==="FunctionDeclaration"){const L=i,J=((I=L.id)==null?void 0:I.name)??"[default]",W=L.params.map(x=>{var R,A;return x.type==="Identifier"?x.name:x.type==="AssignmentPattern"&&((R=x.left)==null?void 0:R.type)==="Identifier"?x.left.name+"?":x.type==="RestElement"&&((A=x.argument)==null?void 0:A.type)==="Identifier"?"..."+x.argument.name:"?"}),B=((u=($=t.loc)==null?void 0:$.start)==null?void 0:u.line)??0,w=((D=(C=t.loc)==null?void 0:C.end)==null?void 0:D.line)??0;n.functions.push({name:J,params:W.join(","),startLine:B,endLine:w,description:f});return}if(i.type==="ClassDeclaration"){const L=i,J=((k=L.id)==null?void 0:k.name)??"[default]",W=((G=(M=t.loc)==null?void 0:M.start)==null?void 0:G.line)??0,B=((K=(O=t.loc)==null?void 0:O.end)==null?void 0:K.line)??0,w=y(L.superClass),x=[];if((X=L.body)!=null&&X.body){for(const R of L.body.body)if(R.type==="ClassMethod"){const A=((te=R.key)==null?void 0:te.type)==="Identifier"?R.key.name:"[computed]",Z=R.params.map(T=>{var P;return T.type==="Identifier"?T.name:T.type==="AssignmentPattern"&&((P=T.left)==null?void 0:P.type)==="Identifier"?T.left.name+"?":"?"}),V=((q=(ne=R.loc)==null?void 0:ne.start)==null?void 0:q.line)??0;let _="";const N=R.leadingComments;N&&N.length>0&&(_=ee(N[N.length-1])),x.push({name:A,params:Z.join(","),line:V,static:R.static,kind:R.kind,description:_})}}n.classes.push({name:J,superClass:w,startLine:W,endLine:B,methods:x,description:f});return}if(i.type==="ArrowFunctionExpression"||i.type==="FunctionExpression"){const L=i,J=L.type==="FunctionExpression"&&((ie=L.id)!=null&&ie.name)?L.id.name:"[default]",W=L.params.map(x=>{var R,A;return x.type==="Identifier"?x.name:x.type==="AssignmentPattern"&&((R=x.left)==null?void 0:R.type)==="Identifier"?x.left.name+"?":x.type==="RestElement"&&((A=x.argument)==null?void 0:A.type)==="Identifier"?"..."+x.argument.name:"?"}),B=((ae=(oe=t.loc)==null?void 0:oe.start)==null?void 0:ae.line)??0,w=((Q=(re=t.loc)==null?void 0:re.end)==null?void 0:Q.line)??0;n.functions.push({name:J,params:W.join(","),startLine:B,endLine:w,description:f});return}if(i.type==="ClassExpression"){const L=i,J=((H=L.id)==null?void 0:H.name)??"[default]",W=((le=(se=t.loc)==null?void 0:se.start)==null?void 0:le.line)??0,B=((de=(fe=t.loc)==null?void 0:fe.end)==null?void 0:de.line)??0,w=((pe=L.superClass)==null?void 0:pe.type)==="Identifier"?L.superClass.name:null,x=[];if((me=L.body)!=null&&me.body){for(const R of L.body.body)if(R.type==="ClassMethod"){const A=((ue=R.key)==null?void 0:ue.type)==="Identifier"?R.key.name:"[computed]",Z=R.params.map(T=>{var P;return T.type==="Identifier"?T.name:T.type==="AssignmentPattern"&&((P=T.left)==null?void 0:P.type)==="Identifier"?T.left.name+"?":"?"}),V=((z=(ce=R.loc)==null?void 0:ce.start)==null?void 0:z.line)??0;let _="";const N=R.leadingComments;N&&N.length>0&&(_=ee(N[N.length-1])),x.push({name:A,params:Z.join(","),line:V,static:R.static,kind:R.kind,description:_})}}n.classes.push({name:J,superClass:w,startLine:W,endLine:B,methods:x,description:f})}},AssignmentExpression(a){var $,u,C,D,k,M,G,O,K,X,te,ne,q,ie,oe,ae,re,Q,H,se,le,fe,de,pe,me,ue;const t=a.node;if(a.parent.type!=="ExpressionStatement")return;const i=($=a.parentPath)==null?void 0:$.parent;if((i==null?void 0:i.type)!=="Program")return;const f=t.left,I=t.right;if(f.type==="MemberExpression"&&((u=f.object)==null?void 0:u.type)==="Identifier"&&f.object.name==="module"&&((C=f.property)==null?void 0:C.type)==="Identifier"&&f.property.name==="exports"){const ce=ee($e(a.parent,i));if(I.type==="FunctionExpression"||I.type==="ArrowFunctionExpression"){const z=I,L=I.type==="FunctionExpression"&&((D=I.id)!=null&&D.name)?I.id.name:"[exports]",J=z.params.map(w=>{var x,R;return w.type==="Identifier"?w.name:w.type==="AssignmentPattern"&&((x=w.left)==null?void 0:x.type)==="Identifier"?w.left.name+"?":w.type==="RestElement"&&((R=w.argument)==null?void 0:R.type)==="Identifier"?"..."+w.argument.name:"?"}),W=((M=(k=t.loc)==null?void 0:k.start)==null?void 0:M.line)??0,B=((O=(G=t.loc)==null?void 0:G.end)==null?void 0:O.line)??0;n.functions.push({name:L,params:J.join(","),startLine:W,endLine:B,description:ce});return}if(I.type==="ClassExpression"){const z=I,L=((K=z.id)==null?void 0:K.name)??"[exports]",J=((te=(X=t.loc)==null?void 0:X.start)==null?void 0:te.line)??0,W=((q=(ne=t.loc)==null?void 0:ne.end)==null?void 0:q.line)??0,B=y(z.superClass),w=[];if((ie=z.body)!=null&&ie.body){for(const x of z.body.body)if(x.type==="ClassMethod"){const R=((oe=x.key)==null?void 0:oe.type)==="Identifier"?x.key.name:"[computed]",A=x.params.map(V=>{var _;return V.type==="Identifier"?V.name:V.type==="AssignmentPattern"&&((_=V.left)==null?void 0:_.type)==="Identifier"?V.left.name+"?":"?"}),Z=((re=(ae=x.loc)==null?void 0:ae.start)==null?void 0:re.line)??0;w.push({name:R,params:A.join(","),line:Z,static:x.static,kind:x.kind,description:""})}}n.classes.push({name:L,superClass:B,startLine:J,endLine:W,methods:w,description:ce});return}}if(f.type==="MemberExpression"&&((Q=f.property)==null?void 0:Q.type)==="Identifier"){const ce=f.property.name;let z=!1;if(((H=f.object)==null?void 0:H.type)==="Identifier"&&f.object.name==="exports"&&(z=!0),((se=f.object)==null?void 0:se.type)==="MemberExpression"&&((le=f.object.object)==null?void 0:le.type)==="Identifier"&&f.object.object.name==="module"&&((fe=f.object.property)==null?void 0:fe.type)==="Identifier"&&f.object.property.name==="exports"&&(z=!0),z){const L=ee($e(a.parent,i));if(I.type==="FunctionExpression"||I.type==="ArrowFunctionExpression"){const W=I.params.map(x=>{var R,A;return x.type==="Identifier"?x.name:x.type==="AssignmentPattern"&&((R=x.left)==null?void 0:R.type)==="Identifier"?x.left.name+"?":x.type==="RestElement"&&((A=x.argument)==null?void 0:A.type)==="Identifier"?"..."+x.argument.name:"?"}),B=((pe=(de=t.loc)==null?void 0:de.start)==null?void 0:pe.line)??0,w=((ue=(me=t.loc)==null?void 0:me.end)==null?void 0:ue.line)??0;n.functions.push({name:ce,params:W.join(","),startLine:B,endLine:w,description:L})}}}}});for(const[a,t]of d){const i=new Set;for(const f of E.keys())if(E.get(f)===a&&m.has(f))for(const I of m.get(f))i.add(I);n.imports.push({module:a,members:Array.from(t),usedIn:Array.from(i)})}const o=new Set;for(const a of n.functions)o.add(a.name);for(const a of n.classes)for(const t of a.methods)o.add(t.name),o.add(`${a.name}.${t.name}`);const p=new Set(E.keys()),l=new Map;Fe(c,{CallExpression(a){var f,I;const t=a.node;let i=null;if(t.callee.type==="Identifier")i=t.callee.name;else if(t.callee.type==="MemberExpression"&&((f=t.callee.property)==null?void 0:f.type)==="Identifier"){const $=((I=t.callee.object)==null?void 0:I.type)==="Identifier"?t.callee.object.name:void 0,u=t.callee.property.name;$&&p.has($)?i=`${$}.${u}`:i=u}if(i){const $=h(a);if($&&$!==i){const u=o.has(i),C=p.has(i)||i.includes(".")&&p.has(i.split(".")[0]);(u||C)&&(l.has($)||l.set($,new Set),l.get($).add(i))}}}}),n.callGraph={};for(const[a,t]of l)n.callGraph[a]=Array.from(t);return Fe(c,{ExportNamedDeclaration(a){var I,$;const t=a.node,i=(($=(I=t.loc)==null?void 0:I.start)==null?void 0:$.line)??0,f=t.exportKind==="type";if(t.specifiers&&t.specifiers.length>0){for(const u of t.specifiers)if(u.type==="ExportSpecifier"){const C=u.exported.type==="Identifier"?u.exported.name:u.exported.value,D=u.local.name,k=f||u.exportKind==="type";n.exports.push({name:C,localName:D!==C?D:void 0,line:i,kind:k?"type":"value"})}return}if(t.declaration){const u=t.declaration;if(u.type==="FunctionDeclaration"&&u.id)n.exports.push({name:u.id.name,line:i,kind:"value"});else if(u.type==="ClassDeclaration"&&u.id)n.exports.push({name:u.id.name,line:i,kind:"value"});else if(u.type==="VariableDeclaration")for(const C of u.declarations)C.id.type==="Identifier"&&n.exports.push({name:C.id.name,line:i,kind:"value"});else(u.type==="TSTypeAliasDeclaration"||u.type==="TSInterfaceDeclaration")&&u.id&&n.exports.push({name:u.id.name,line:i,kind:"type"})}},ExportDefaultDeclaration(a){var $,u;const t=a.node,i=((u=($=t.loc)==null?void 0:$.start)==null?void 0:u.line)??0,f=t.declaration;let I;f.type==="FunctionDeclaration"&&f.id||f.type==="ClassDeclaration"&&f.id?I=f.id.name:f.type==="Identifier"&&(I=f.name),n.exports.push({name:"default",localName:I,line:i,kind:"default"})}}),n.isPureType=gt(c),n}function gt(e){let r=!1;for(const n of e.program.body){switch(n.type){case"TSTypeAliasDeclaration":case"TSInterfaceDeclaration":case"TSEnumDeclaration":break;case"ImportDeclaration":n.importKind!=="type"&&n.specifiers.some(c=>c.type==="ImportSpecifier"?c.importKind!=="type":!0)&&n.specifiers.length>0&&(r=!0);break;case"ExportNamedDeclaration":if(n.exportKind==="type")break;if(n.declaration){const s=n.declaration.type;s!=="TSTypeAliasDeclaration"&&s!=="TSInterfaceDeclaration"&&(r=!0)}else n.specifiers&&n.specifiers.length>0&&n.specifiers.some(c=>c.type==="ExportSpecifier"?c.exportKind!=="type":!0)&&(r=!0);break;case"ExportDefaultDeclaration":r=!0;break;case"ExportAllDeclaration":n.exportKind!=="type"&&(r=!0);break;default:r=!0;break}if(r)break}return!r}function ht(e,r){const n=[];let s=`/*@AI ${r}`;e.description&&(s+=` - ${e.description.slice(0,50)}`),n.push(s);for(const c of e.imports){const d=Array.isArray(c.members)?c.members.join(","):"";let E=`<${c.module}:${d}`;Array.isArray(c.usedIn)&&c.usedIn.length>0&&(E+=` ->${c.usedIn.join(",")}`),n.push(E)}for(const c of e.classes){let d=c.name;c.superClass&&(d+=`:${c.superClass}`),d+=` ${c.startLine}-${c.endLine}`,c.description&&(d+=` ${c.description}`),n.push(d);for(const E of c.methods){const m=E.static?" +":" .",y=E.kind==="get"?"get:":E.kind==="set"?"set:":"";let h=`${m}${y}${E.name}(${E.params}) ${E.line}`;E.description&&(h+=` ${E.description}`),n.push(h)}}for(const c of e.functions){let d=`${c.name}(${c.params}) ${c.startLine}-${c.endLine}`;c.description&&(d+=` ${c.description}`),n.push(d)}for(const c of e.constants){let d=`${c.name} ${c.line}`;c.description&&(d+=` ${c.description}`),n.push(d)}return n.push("@AI*/"),n.join(`
|
|
32
|
+
`)}function $t(e){let r=e;return r=r.replace(/\/\*@AI[\s\S]*?@AI\*\/\s*/g,""),r=r.replace(/\/\*\*[\s\S]*?@ai-context-end[\s\S]*?\*\/\s*/g,""),r=r.replace(/^\/\*\*[\s\S]*?\*\/\s*\n?/,""),r}function Oe(e,r){var s,c,d;const n=[`@FNMAP ${g.basename(e)}/`];for(const{relativePath:E,info:m}of r){let h=`#${g.basename(E)}`;m.description&&(h+=` ${m.description.slice(0,50)}`),n.push(h);for(const o of m.imports){const p=Array.isArray(o.members)?o.members.join(","):"";n.push(` <${o.module}:${p}`)}for(const o of m.classes){let p=` ${o.name}`;o.superClass&&(p+=`:${o.superClass}`),p+=` ${o.startLine}-${o.endLine}`,o.description&&(p+=` ${o.description}`),n.push(p);for(const l of o.methods){const S=l.static?" +":" .",j=l.kind==="get"?"get:":l.kind==="set"?"set:":"";let a=`${S}${j}${l.name}(${l.params}) ${l.line}`;l.description&&(a+=` ${l.description}`);const t=`${o.name}.${l.name}`,i=((s=m.callGraph)==null?void 0:s[t])??((c=m.callGraph)==null?void 0:c[l.name]);Array.isArray(i)&&i.length>0&&(a+=` →${i.join(",")}`),n.push(a)}}for(const o of m.functions){let p=` ${o.name}(${o.params}) ${o.startLine}-${o.endLine}`;o.description&&(p+=` ${o.description}`);const l=(d=m.callGraph)==null?void 0:d[o.name];Array.isArray(l)&&l.length>0&&(p+=` →${l.join(",")}`),n.push(p)}for(const o of m.constants){let p=` $${o.name} ${o.line}`;o.description&&(p+=` ${o.description}`),n.push(p)}if(m.exports&&m.exports.length>0){const o=[];for(const p of m.exports)p.kind==="default"?o.push(p.localName?`default:${p.localName}`:"default"):p.kind==="type"?o.push(`type:${p.name}`):o.push(p.name);n.push(` >${o.join(",")}`)}}return n.push("@FNMAP"),n.join(`
|
|
33
|
+
`)}function Qe(e,r){const n=["flowchart TD"],s=o=>"id_"+o.replace(/[^a-zA-Z0-9]/g,p=>`_${p.charCodeAt(0)}_`),c=o=>o.replace(/"/g,"#quot;"),d=r.functions.map(o=>o.name),E=[];for(const o of r.classes)for(const p of o.methods)E.push(`${o.name}.${p.name}`);const m=[...d,...E];if(m.length===0)return null;const y=g.basename(e,g.extname(e));n.push(` subgraph ${s(y)}["${y}"]`);for(const o of m)n.push(` ${s(o)}["${c(o)}"]`);n.push(" end");const h=r.callGraph??{};for(const[o,p]of Object.entries(h))if(Array.isArray(p)){for(const l of p)if(m.includes(l)||l.includes(".")){const S=m.includes(l)?l:l.split(".").pop();(m.includes(l)||m.some(j=>j.endsWith(S)))&&n.push(` ${s(o)} --> ${s(l)}`)}}return n.join(`
|
|
34
|
+
`)}function Ze(e,r){const n=["flowchart TD"],s=y=>"id_"+y.replace(/[^a-zA-Z0-9]/g,h=>`_${h.charCodeAt(0)}_`),c=y=>y.replace(/"/g,"#quot;"),d=new Map,E=[];for(const{relativePath:y,info:h}of r){const o=g.basename(y,g.extname(y)),p=h.functions.map(a=>a.name),l=[];for(const a of h.classes)for(const t of a.methods)l.push(`${a.name}.${t.name}`);const S=[...p,...l];d.set(y,{fileName:o,functions:S});const j=h.callGraph??{};for(const[a,t]of Object.entries(j))if(Array.isArray(t))for(const i of t)E.push({file:y,fileName:o,caller:a,callee:i})}for(const[,{fileName:y,functions:h}]of d)if(h.length!==0){n.push(` subgraph ${s(y)}["${c(y)}"]`);for(const o of h)n.push(` ${s(y)}_${s(o)}["${c(o)}"]`);n.push(" end")}const m=new Set;for(const{fileName:y,caller:h,callee:o}of E){const p=`${s(y)}_${s(h)}`;let l=null;for(const[,{fileName:S,functions:j}]of d)if(j.includes(o)){l=`${s(S)}_${s(o)}`;break}if(!l){const S=[...d.keys()].find(j=>{var a;return((a=d.get(j))==null?void 0:a.fileName)===y});if(S){const j=d.get(S);j!=null&&j.functions.includes(o)&&(l=`${s(y)}_${s(o)}`)}}if(l){const S=`${p}-->${l}`;m.has(S)||(n.push(` ${p} --> ${l}`),m.add(S))}}return n.join(`
|
|
35
|
+
`)}function xt(e,r){const n=(r==null?void 0:r.filePath)??null;try{const s=qe(e,n);return s?Me(s)?{success:!1,error:s.parseError,errorType:s.errorType,loc:s.loc}:{success:!0,info:s}:{success:!1,error:"Analysis returned null / 分析返回空值",errorType:U.PARSE_ERROR}}catch(s){return{success:!1,error:`Failed to process code / 处理代码失败: ${s.message}`,errorType:U.PARSE_ERROR}}}function Ye(e){const r=Be(e);if(!r.valid)return{success:!1,error:r.error,errorType:r.errorType??U.VALIDATION_ERROR};try{const n=v.readFileSync(e,"utf-8"),s=qe(n,e);return s?Me(s)?{success:!1,error:s.parseError,errorType:s.errorType,loc:s.loc}:{success:!0,info:s}:{success:!1,error:"Analysis returned null / 分析返回空值",errorType:U.PARSE_ERROR}}catch(n){const s=n;return{success:!1,error:Ae(U.FILE_READ_ERROR,"Failed to read or process file / 读取或处理文件失败",{file:e,suggestion:s.message}),errorType:U.FILE_READ_ERROR}}}const ze="\n\n## .fnmap Code Index Format\n\nThe `.fnmap` file provides a structured code index for quick navigation. Read it before exploring code to locate target files and function line numbers.\n\n**Format Reference:**\n\n- `#filename.js` - Filename followed by file description\n- `<module:members` - Imported module and its members\n- `funcName(params) 10-20 description →callee1,callee2` - Function signature, line range, description, call graph\n- `ClassName:SuperClass 30-100` - Class definition with inheritance\n- ` .method(params) 35 →callee` - Instance method (`.` prefix)\n- ` +staticMethod(params) 40` - Static method (`+` prefix)\n- `$constName 5` - Constant definition (`$` prefix)\n- `>export1,export2,default` - Exports (`>` prefix, supports `default`, `type:Name`)\n\n**Call Graph:** The `→` at the end of function/method lines indicates which functions are called (both local and imported), helping you understand code execution flow.\n\n**Note:** `.fnmap` files are auto-maintained by scripts and should not be manually updated.\n\n## Code Comment Guidelines\n\n1. Every global variable, function, class, and file module must have a **concise comment describing its purpose or functionality** - avoid describing anything else\n2. When updating code, always update related comments to reflect the changes\n3. Prefer encapsulating logic in functions rather than writing flat, sequential code\n",We=`
|
|
61
36
|
# fnmap generated files
|
|
62
37
|
.fnmap
|
|
63
38
|
*.fnmap
|
|
64
39
|
*.mermaid
|
|
65
40
|
.fnmap.mermaid
|
|
66
|
-
`;function
|
|
67
|
-
`);console.log(`${
|
|
68
|
-
`);console.log(`${
|
|
69
|
-
${
|
|
70
|
-
Add fnmap rules to .gitignore? (Y/n): `)).toLowerCase()!=="n"&&
|
|
71
|
-
${
|
|
72
|
-
${
|
|
73
|
-
`);const
|
|
74
|
-
`);const a=(await
|
|
75
|
-
`+"=".repeat(50)),console.log(`${
|
|
76
|
-
Run ${
|
|
77
|
-
Analyzing: ${
|
|
78
|
-
Generating .fnmap index...`)
|
|
79
|
-
Generating Mermaid call graphs...`),r.mermaid==="file"||r.mermaid===!0)for(const[o,
|
|
80
|
-
`+"=".repeat(50)),
|
|
41
|
+
`;function Re(e,r){return new Promise(n=>{e.question(r,s=>{n(s.trim())})})}function et(e,r){let n=0;const s=["node_modules",".git","dist","build",".next","coverage"];if(!v.existsSync(e))return b.warn(`Directory does not exist: ${e}`),0;const c=v.readdirSync(e,{withFileTypes:!0});for(const d of c){const E=g.join(e,d.name);if(d.isDirectory()){if(s.includes(d.name))continue;n+=et(E,r)}else if(d.isFile()){const m=d.name;if(m===".fnmap"||m.endsWith(".fnmap")||m.endsWith(".mermaid"))try{v.unlinkSync(E),b.success(`Deleted: ${g.relative(r,E)}`),n++}catch(y){const h=y;b.error(`Failed to delete ${g.relative(r,E)}: ${h.message}`)}}}return n}function Et(e,r){b.title("fnmap - Clear Generated Files"),b.info("=".repeat(50));const n=r?g.resolve(e,r):e,s=et(n,e);b.info("=".repeat(50)),s>0?b.success(`Cleared ${s} generated file(s)`):b.info("No generated files found")}function It(e){const r=g.join(e,".gitignore");if(v.existsSync(r)){const n=v.readFileSync(r,"utf-8");if(n.includes("fnmap generated files")||n.includes("*.fnmap")){console.log(`${F.yellow}!${F.reset} .gitignore already contains fnmap rules`);return}v.appendFileSync(r,We)}else v.writeFileSync(r,We.trim()+`
|
|
42
|
+
`);console.log(`${F.green}✓${F.reset} Added fnmap rules to .gitignore`)}function De(e,r){const n=g.dirname(e);if(v.existsSync(n)||v.mkdirSync(n,{recursive:!0}),v.existsSync(e)){if(v.readFileSync(e,"utf-8").includes(".fnmap Code Index Format")){console.log(`${F.yellow}!${F.reset} ${r} already contains fnmap documentation`);return}v.appendFileSync(e,ze)}else v.writeFileSync(e,ze.trim()+`
|
|
43
|
+
`);console.log(`${F.green}✓${F.reset} Added fnmap documentation to ${r}`)}async function bt(e){const r=at.createInterface({input:process.stdin,output:process.stdout});console.log(`
|
|
44
|
+
${F.bold}fnmap - Interactive Setup${F.reset}`),console.log("=".repeat(50));try{const n=g.join(e,".fnmaprc");if(v.existsSync(n))console.log(`${F.yellow}!${F.reset} Config file already exists: .fnmaprc`);else{const p={enable:!0,include:["src/**/*.js","src/**/*.ts","src/**/*.jsx","src/**/*.tsx"],exclude:["node_modules","dist","build",".next","coverage","__pycache__",".cache"]};v.writeFileSync(n,JSON.stringify(p,null,2)),console.log(`${F.green}✓${F.reset} Created config file: .fnmaprc`)}(await Re(r,`
|
|
45
|
+
Add fnmap rules to .gitignore? (Y/n): `)).toLowerCase()!=="n"&&It(e);const c=g.join(e,"CLAUDE.md"),d=g.join(e,"AGENTS.md"),E=g.join(st.homedir(),".claude","CLAUDE.md"),m=v.existsSync(c),y=v.existsSync(d),h=v.existsSync(E);if(!(m||y))console.log(`
|
|
46
|
+
${F.yellow}!${F.reset} No CLAUDE.md or AGENTS.md found in project.`),(await Re(r,"Create CLAUDE.md with fnmap documentation? (Y/n): ")).toLowerCase()!=="n"&&De(c,"CLAUDE.md");else{console.log(`
|
|
47
|
+
${F.bold}Select files to add fnmap documentation:${F.reset}`),console.log(`(Enter numbers separated by comma, e.g., 1,2)
|
|
48
|
+
`);const p=[];let l=1;m&&p.push({key:String(l++),label:"Project CLAUDE.md",path:c,exists:!0}),p.push({key:String(l++),label:"User CLAUDE.md (~/.claude/CLAUDE.md)",path:E,exists:h}),y&&p.push({key:String(l++),label:"AGENTS.md",path:d,exists:!0});const S=String(l);for(const t of p){const i=t.exists?`${F.green}[exists]${F.reset}`:`${F.gray}[new]${F.reset}`;console.log(` ${t.key}. ${t.label} ${i}`)}console.log(` ${S}. Custom file path`),console.log(` 0. Skip
|
|
49
|
+
`);const a=(await Re(r,"Your choice: ")).split(",").map(t=>t.trim()).filter(Boolean);if(a.includes("0")||a.length===0)console.log("Skipped adding documentation to files.");else for(const t of a)if(t===S){const i=await Re(r,"Enter custom file path: ");if(i){const f=g.isAbsolute(i)?i:g.resolve(e,i);De(f,i)}}else{const i=p.find(f=>f.key===t);i&&De(i.path,i.label)}}console.log(`
|
|
50
|
+
`+"=".repeat(50)),console.log(`${F.green}✓${F.reset} Setup complete!`),console.log(`
|
|
51
|
+
Run ${F.bold}fnmap${F.reset} or ${F.bold}fnmap --dir src${F.reset} to generate code index.`)}finally{r.close()}}async function tt(){const e=Ge();e.parse(process.argv);const r=e.opts(),n=e.args;r.log&&xe(!1);const s=g.resolve(r.project);if(r.clear){const o=Te();xe(!1),Et(s,r.dir),xe(o);return}if(r.init){const o=Te();xe(!1),await bt(s),xe(o);return}const c=[...r.files??[],...n.map(Ee)].filter(o=>v.existsSync(o));let d=[],E=!1;if(r.changed||r.staged){const o=He(s,r.staged);if(o.length===0){b.info("No git changed code files detected");return}const p=new Set;for(const l of o)p.add(g.dirname(l));for(const l of p){const S=yt(l);d.push(...S)}}else if(c.length>0)E=!0,d=c.map(o=>g.isAbsolute(o)?o:g.resolve(s,o));else if(r.dir){const o=g.resolve(s,r.dir);d=ve(o,s).map(l=>g.join(s,l))}else{const{config:o,source:p}=Ke(s);if(o){if(b.info(`Using config: ${p}`),o.enable===!1){b.info("Config file has enable set to false, skipping processing");return}const l=Xe(o),S=[...Pe,...l.exclude];if(l.include&&l.include.length>0){const j=new Set;for(const a of l.include){const t=a.replace(/\/\*\*\/.*$/,"").replace(/\*\*\/.*$/,"").replace(/\/\*\..*$/,"").replace(/\*\..*$/,"");t&&j.add(t)}for(const a of j){const t=g.resolve(s,a);if(v.existsSync(t)){const i=ve(t,s,S);d.push(...i.map(f=>g.join(s,f)))}}}}else{b.warn("No config file found. Use fnmap init to create config, or use --dir/--files to specify scope"),b.info(""),b.info("Supported config files: .fnmaprc, .fnmaprc.json, package.json#fnmap");return}}if(d.length===0){b.info("No files found to process");return}d=[...new Set(d)],b.info("=".repeat(50)),b.title("fnmap - AI Code Indexing Tool"),b.info("=".repeat(50));let m=0,y=0;const h=new Map;for(const o of d){const p=g.relative(s,o);b.info(`
|
|
52
|
+
Analyzing: ${p}`);const l=Ye(o);if(l.success){m++;const S=l.info;if(S.isPureType){b.info("Skipped (pure type file) / 跳过纯类型文件");continue}if(!(S.functions.length>0||S.classes.length>0||S.constants.length>0||S.exports&&S.exports.length>0)){b.info("Skipped (empty file) / 跳过空文件");continue}b.success(`Imports: ${S.imports.length}, Functions: ${S.functions.length}, Classes: ${S.classes.length}, Constants: ${S.constants.length}`);const a=g.dirname(o);h.has(a)||h.set(a,[]),h.get(a).push({relativePath:p,info:S})}else y++,b.error(l.error)}if(h.size>0)if(b.info(`
|
|
53
|
+
Generating .fnmap index...`),E)for(const[o,p]of h)for(const{relativePath:l,info:S}of p)try{const j=Oe(o,[{relativePath:l,info:S}]),a=g.basename(l,g.extname(l)),t=g.join(o,`${a}.fnmap`);v.writeFileSync(t,j),b.success(g.relative(s,t))}catch(j){const a=j;b.error(`Failed to generate .fnmap for ${l}: ${a.message}`)}else for(const[o,p]of h)try{const l=Oe(o,p),S=g.join(o,".fnmap");v.writeFileSync(S,l),b.success(g.relative(s,S))}catch(l){const S=l;b.error(`Failed to generate .fnmap for ${g.relative(s,o)}: ${S.message}`)}if(r.mermaid&&h.size>0){if(b.info(`
|
|
54
|
+
Generating Mermaid call graphs...`),r.mermaid==="file"||r.mermaid===!0)for(const[o,p]of h)for(const{relativePath:l,info:S}of p)try{const j=Qe(l,S);if(j){const a=g.basename(l,g.extname(l)),t=g.join(o,`${a}.mermaid`);v.writeFileSync(t,j),b.success(g.relative(s,t))}}catch(j){const a=j;b.error(`Failed to generate mermaid for ${l}: ${a.message}`)}else if(r.mermaid==="project")try{const o=[];for(const[,S]of h)o.push(...S);const p=Ze(s,o),l=g.join(s,".fnmap.mermaid");v.writeFileSync(l,p),b.success(g.relative(s,l))}catch(o){const p=o;b.error(`Failed to generate project mermaid: ${p.message}`)}}b.info(`
|
|
55
|
+
`+"=".repeat(50)),b.stats(`Complete! Analyzed: ${F.green}${m}${F.reset}, Failed: ${y>0?F.red:""}${y}${F.reset}`),b.info("=".repeat(50))}require.main===module&&tt().catch(e=>{console.error(e),process.exit(1)});exports.COLORS=F;exports.DEFAULT_CONFIG=ke;exports.DEFAULT_EXCLUDES=Pe;exports.ErrorTypes=U;exports.MAX_DIR_DEPTH=Ne;exports.MAX_FILE_SIZE=Le;exports.SUPPORTED_EXTENSIONS=we;exports.analyzeFile=qe;exports.extractJSDocDescription=ee;exports.formatError=Ae;exports.generateAiMap=Oe;exports.generateFileMermaid=Qe;exports.generateHeader=ht;exports.generateProjectMermaid=Ze;exports.getGitChangedFiles=He;exports.getVersion=Je;exports.isParseError=Me;exports.isProcessFailure=lt;exports.isProcessSuccess=ct;exports.isQuietMode=Te;exports.isValidationFailure=dt;exports.isValidationSuccess=ft;exports.loadConfig=Ke;exports.logger=b;exports.main=tt;exports.mergeConfig=Xe;exports.normalizePath=Ee;exports.normalizePaths=pt;exports.processCode=xt;exports.processFile=Ye;exports.program=mt;exports.removeExistingHeaders=$t;exports.scanDirectory=ve;exports.setQuietMode=xe;exports.setupCLI=Ge;exports.validateConfig=_e;exports.validateFilePath=Be;
|
package/dist/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAoRA;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA6P1C"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -59,6 +59,12 @@ export interface ConstantInfo {
|
|
|
59
59
|
line: number;
|
|
60
60
|
description: string;
|
|
61
61
|
}
|
|
62
|
+
export interface ExportInfo {
|
|
63
|
+
name: string;
|
|
64
|
+
localName?: string;
|
|
65
|
+
line: number;
|
|
66
|
+
kind: 'value' | 'type' | 'default';
|
|
67
|
+
}
|
|
62
68
|
export type CallGraph = Record<string, string[]>;
|
|
63
69
|
export interface FileInfo {
|
|
64
70
|
description: string;
|
|
@@ -66,6 +72,7 @@ export interface FileInfo {
|
|
|
66
72
|
functions: FunctionInfo[];
|
|
67
73
|
classes: ClassInfo[];
|
|
68
74
|
constants: ConstantInfo[];
|
|
75
|
+
exports: ExportInfo[];
|
|
69
76
|
callGraph: CallGraph;
|
|
70
77
|
isPureType?: boolean;
|
|
71
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU;;;;;;;;CAQb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAIrE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,IAAI,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAIrE,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAID,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,aAAa,CAAC;IAC/C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAIxD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,cAAc,CAAC;AAI5D,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACvC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAGD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACtC,WAAW,EAAE,OAAO,CAAC;CACtB;AAID,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,IAAI,gBAAgB,CAE9E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,IAAI,cAAc,CAEhF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,IAAI,cAAc,CAEhF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,iBAAiB,CAEzF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,iBAAiB,CAEzF"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU;;;;;;;;CAQb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAIrE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,IAAI,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAIrE,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAID,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,aAAa,CAAC;IAC/C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAIxD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,cAAc,CAAC;AAI5D,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACvC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAGD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACtC,WAAW,EAAE,OAAO,CAAC;CACtB;AAID,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,IAAI,gBAAgB,CAE9E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,IAAI,cAAc,CAEhF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,IAAI,cAAc,CAEhF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,iBAAiB,CAEzF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,iBAAiB,CAEzF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@didnhdj/fnmap",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "AI code indexing tool for analyzing JS/TS code structure and generating structured code maps to help AI understand code quickly",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|