milens 0.7.1 → 0.7.2
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/.agents/skills/adapters/SKILL.md +16 -11
- package/.agents/skills/analyzer/SKILL.md +11 -6
- package/.agents/skills/apps/SKILL.md +6 -1
- package/.agents/skills/docs/SKILL.md +6 -1
- package/.agents/skills/milens/SKILL.md +6 -3
- package/.agents/skills/orchestrator/SKILL.md +5 -0
- package/.agents/skills/parser/SKILL.md +11 -6
- package/.agents/skills/root/SKILL.md +21 -16
- package/.agents/skills/scripts/SKILL.md +9 -4
- package/.agents/skills/security/SKILL.md +10 -5
- package/.agents/skills/server/SKILL.md +18 -11
- package/.agents/skills/store/SKILL.md +10 -5
- package/.agents/skills/test/SKILL.md +15 -8
- package/.agents/skills/ui/SKILL.md +5 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -1
- package/adapters/claude-code/CLAUDE.md +2 -0
- package/adapters/claude-code/hooks/hooks.json +27 -0
- package/dist/agents-md.d.ts +1 -0
- package/dist/agents-md.js +45 -1
- package/dist/agents-md.js.map +1 -1
- package/dist/analyzer/config.js +32 -0
- package/dist/analyzer/config.js.map +1 -1
- package/dist/analyzer/engine.js +26 -2
- package/dist/analyzer/engine.js.map +1 -1
- package/dist/analyzer/enrich.js +68 -1
- package/dist/analyzer/enrich.js.map +1 -1
- package/dist/analyzer/resolver.d.ts +4 -1
- package/dist/analyzer/resolver.js +241 -38
- package/dist/analyzer/resolver.js.map +1 -1
- package/dist/analyzer/review.js +32 -2
- package/dist/analyzer/review.js.map +1 -1
- package/dist/analyzer/scanner.js +3 -0
- package/dist/analyzer/scanner.js.map +1 -1
- package/dist/analyzer/scope-resolver.js +1 -1
- package/dist/analyzer/scope-resolver.js.map +1 -1
- package/dist/build-info.d.ts +2 -2
- package/dist/build-info.js +2 -2
- package/dist/cli.js +84 -15
- package/dist/cli.js.map +1 -1
- package/dist/orchestrator/orchestrator.d.ts +1 -1
- package/dist/orchestrator/orchestrator.js +14 -6
- package/dist/orchestrator/orchestrator.js.map +1 -1
- package/dist/parser/extract.d.ts +7 -0
- package/dist/parser/extract.js +23 -1
- package/dist/parser/extract.js.map +1 -1
- package/dist/parser/lang-css.js +12 -0
- package/dist/parser/lang-css.js.map +1 -1
- package/dist/parser/lang-js.js +15 -4
- package/dist/parser/lang-js.js.map +1 -1
- package/dist/parser/lang-md.js +1 -0
- package/dist/parser/lang-md.js.map +1 -1
- package/dist/parser/lang-ts.js +40 -6
- package/dist/parser/lang-ts.js.map +1 -1
- package/dist/parser/lang-vue.js +0 -21
- package/dist/parser/lang-vue.js.map +1 -1
- package/dist/security/rules.js +22 -23
- package/dist/security/rules.js.map +1 -1
- package/dist/server/guard-hook.d.ts +10 -0
- package/dist/server/guard-hook.js +179 -0
- package/dist/server/guard-hook.js.map +1 -0
- package/dist/server/hooks.js +2 -1
- package/dist/server/hooks.js.map +1 -1
- package/dist/server/mcp.js +172 -30
- package/dist/server/mcp.js.map +1 -1
- package/dist/server/test-plan.d.ts +1 -0
- package/dist/server/test-plan.js +25 -7
- package/dist/server/test-plan.js.map +1 -1
- package/dist/server/tools/findings-report.d.ts +3 -0
- package/dist/server/tools/findings-report.js +170 -0
- package/dist/server/tools/findings-report.js.map +1 -0
- package/dist/server/tools/security.js +61 -5
- package/dist/server/tools/security.js.map +1 -1
- package/dist/server/tools/session.js +37 -17
- package/dist/server/tools/session.js.map +1 -1
- package/dist/server/tools/testing.js +58 -11
- package/dist/server/tools/testing.js.map +1 -1
- package/dist/skills.js +15 -9
- package/dist/skills.js.map +1 -1
- package/dist/store/annotations.d.ts +5 -0
- package/dist/store/annotations.js +45 -9
- package/dist/store/annotations.js.map +1 -1
- package/dist/store/db.d.ts +13 -0
- package/dist/store/db.js +146 -33
- package/dist/store/db.js.map +1 -1
- package/dist/store/registry.d.ts +1 -0
- package/dist/store/registry.js +17 -6
- package/dist/store/registry.js.map +1 -1
- package/dist/store/schema.sql +2 -1
- package/dist/types.d.ts +16 -1
- package/dist/uninstall.d.ts +1 -0
- package/dist/uninstall.js +33 -10
- package/dist/uninstall.js.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +0 -0
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard-hook.js","sourceRoot":"","sources":["../../src/server/guard-hook.ts"],"names":[],"mappings":"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"}
|
package/dist/server/hooks.js
CHANGED
|
@@ -121,10 +121,11 @@ export async function defaultOnSessionStart(ctx, dbPath) {
|
|
|
121
121
|
lines.push('');
|
|
122
122
|
}
|
|
123
123
|
try {
|
|
124
|
-
const { generateCrossRefSection } = await import('../agents-md.js');
|
|
124
|
+
const { generateCrossRefSection, syncCrossRefToAgentsMd } = await import('../agents-md.js');
|
|
125
125
|
const crossRef = generateCrossRefSection(ctx.rootPath);
|
|
126
126
|
if (crossRef) {
|
|
127
127
|
lines.push(crossRef);
|
|
128
|
+
syncCrossRefToAgentsMd(ctx.rootPath);
|
|
128
129
|
}
|
|
129
130
|
}
|
|
130
131
|
catch {
|
package/dist/server/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/server/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAkBlC,SAAS,aAAa;IACpB,OAAO;QACL,OAAO,EAAE,IAAI;QACb,cAAc,EAAE,IAAI;QACpB,YAAY,EAAE,IAAI;QAClB,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,IAAI;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAyB;IACtC,SAAS;IACT,gBAAgB;IAChB,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,eAAe;CAChB,CAAC;AAEF,MAAM,OAAO,WAAW;IACtB,MAAM,CAAC,iBAAiB;QACtB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAClD,CAAC;IAED,oBAAoB,CAAC,WAAmB;QACtC,OAAO,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACpD,CAAC;IAED,UAAU,CAAC,WAAoB;QAC7B,MAAM,UAAU,GAAG,WAAW;YAC5B,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;YACxC,CAAC,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;YAC5B,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC5B,IAAI,OAAQ,MAAc,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC7C,GAAW,CAAC,GAAG,CAAC,GAAI,MAAc,CAAC,GAAG,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,aAAa,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,UAAU,CAAC,MAAkB,EAAE,WAAoB;QACjD,MAAM,UAAU,GAAG,WAAW;YAC5B,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;YACxC,CAAC,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;QAEpC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;IAED,UAAU,CAAC,QAAgB,EAAE,WAAoB;QAC/C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAA4B,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,aAAa,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAc,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC,CAAC;IAED,WAAW,CAAC,QAAgB,EAAE,WAAoB;QAChD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAA4B,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,aAAa,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAc,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAmB,EAAE,MAAc;IAC7E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,MAAM,OAAO,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC;IAExC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,KAAK,OAAO,CAAC,KAAK,eAAe,OAAO,CAAC,OAAO,iBAAiB,OAAO,CAAC,KAAK,qBAAqB,CACpG,CAAC;IACF,KAAK,CAAC,IAAI,CACR,oBAAoB,OAAO,CAAC,WAAW,QAAQ,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,eAAe,GAAG,CACnG,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,IAAI,CACtG,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;YAC1C,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACnB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAmB,EAAE,MAAc;IAC3E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC;IACtC,MAAM,WAAW,GACf,QAAQ,CAAC,yBAAyB,GAAG,CAAC;QACpC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,yBAAyB,CAAC,GAAG,GAAG,CAAC;QACjF,CAAC,CAAC,CAAC,CAAC;IAER,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,KAAK,mBAAmB,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,KAAK,WAAW,KAAK,CAAC,OAAO,aAAa,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC;IAC7F,KAAK,CAAC,IAAI,CAAC,oBAAoB,WAAW,QAAQ,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,yBAAyB,GAAG,CAAC,CAAC;IACnH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,cAAc,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC;YAC5G,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBAC5C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC,SAAS,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClG,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,eAAe,sCAAsC,CAAC,CAAC;YAChF,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,4BAA4B,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3D,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3F,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAEtD,IAAI,EAAE,CAAC;IACP,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACpD,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,yCAAyC,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,gCAAgC,CAAC;IAClH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAEtC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YACzD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,cAAc,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QAChE,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,mBAAmB,MAAM,CAAC,OAAO,CAAC,MAAM,mBAAmB,CACzF,CAAC;QAEF,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAChC,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,CAAC,SAAS,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC7E,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CACR,gBAAgB,MAAM,CAAC,eAAe,sCAAsC,CAC7E,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAC7E,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACtC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;QAC3F,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;QAC7F,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACnD,CAAC;QAED,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,0CAA0C,GAAG,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC;IACxE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAe,EAAE,QAAgB;IACzE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,qBAAqB,CAAC,CAAC;YACjD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC;YAC/C,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;YACtF,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,cAAc,GAAG,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,2BAA2B,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB,EAAE,MAAc;IACxE,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,EAAE,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC5B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,yCAAyC,KAAK,CAAC,KAAK,WAAW,KAAK,CAAC,OAAO,aAAa,KAAK,CAAC,KAAK,SAAS,CAAC;QACvH,CAAC;QAAC,MAAM,CAAC;YACP,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,8BAA8B,CAAC;QACxC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,2BAA2B,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;YACpE,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,MAAM,KAAK,GAAa,CAAC,uCAAuC,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAC;gBACvD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;oBACrB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACnD,CAAC;YACD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,yBAAyB,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,2BAA2B,CAAC;IACrC,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/server/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/server/mcp.js
CHANGED
|
@@ -6,7 +6,7 @@ import { createServer } from 'node:http';
|
|
|
6
6
|
import { randomUUID } from 'node:crypto';
|
|
7
7
|
import { resolve, relative, join, dirname } from 'node:path';
|
|
8
8
|
import { execFileSync } from 'node:child_process';
|
|
9
|
-
import { readFileSync, readdirSync, statSync, mkdirSync } from 'node:fs';
|
|
9
|
+
import { readFileSync, readdirSync, statSync, mkdirSync, existsSync } from 'node:fs';
|
|
10
10
|
import { homedir } from 'node:os';
|
|
11
11
|
import ignore from 'ignore';
|
|
12
12
|
import { Database } from '../store/db.js';
|
|
@@ -22,6 +22,7 @@ import { countDependentFiles } from '../analyzer/risk.js';
|
|
|
22
22
|
import { registerSessionTools } from './tools/session.js';
|
|
23
23
|
import { registerTestingTools } from './tools/testing.js';
|
|
24
24
|
import { registerSecurityTools } from './tools/security.js';
|
|
25
|
+
import { registerFindingsReportTools } from './tools/findings-report.js';
|
|
25
26
|
import { FileWatcher } from './watcher.js';
|
|
26
27
|
import { reviewPr } from '../analyzer/review.js';
|
|
27
28
|
import { globToRegex } from '../utils.js';
|
|
@@ -240,10 +241,10 @@ function isTestFilePath(filePath) {
|
|
|
240
241
|
// ── Text grep across project files ──
|
|
241
242
|
const GREP_SKIP_DIRS = new Set([
|
|
242
243
|
'node_modules', '.git', 'dist', 'build', 'out',
|
|
243
|
-
'.next', '.nuxt', '.svelte-kit',
|
|
244
|
+
'.next', '.nuxt', '.svelte-kit', '.turbo', '.cache', '.parcel-cache',
|
|
244
245
|
'__pycache__', '.venv', 'venv', 'env',
|
|
245
246
|
'vendor', 'target',
|
|
246
|
-
'.idea',
|
|
247
|
+
'.idea',
|
|
247
248
|
'coverage', '.nyc_output',
|
|
248
249
|
]);
|
|
249
250
|
const BINARY_EXTENSIONS = new Set([
|
|
@@ -283,8 +284,6 @@ function grepFiles(rootPath, pattern, options) {
|
|
|
283
284
|
return;
|
|
284
285
|
const abs = join(dir, entry);
|
|
285
286
|
const rel = relative(rootPath, abs).replace(/\\/g, '/');
|
|
286
|
-
if (entry.startsWith('.') && entry !== '.')
|
|
287
|
-
continue;
|
|
288
287
|
if (GREP_SKIP_DIRS.has(entry))
|
|
289
288
|
continue;
|
|
290
289
|
if (ig.ignores(rel))
|
|
@@ -451,6 +450,19 @@ export function createMcpServer(rootPath) {
|
|
|
451
450
|
}
|
|
452
451
|
return abs;
|
|
453
452
|
}
|
|
453
|
+
function isInsideDocstring(content, lineNumber) {
|
|
454
|
+
const lines = content.split('\n');
|
|
455
|
+
let inside = false;
|
|
456
|
+
for (let i = 0; i < lineNumber; i++) {
|
|
457
|
+
if (i >= lines.length)
|
|
458
|
+
break;
|
|
459
|
+
const trimmed = lines[i].trim();
|
|
460
|
+
const tripleCount = (trimmed.match(/"""|'''/g) || []).length;
|
|
461
|
+
for (let j = 0; j < tripleCount; j++)
|
|
462
|
+
inside = !inside;
|
|
463
|
+
}
|
|
464
|
+
return inside;
|
|
465
|
+
}
|
|
454
466
|
function resolveRoot(repoPath) {
|
|
455
467
|
if (repoPath) {
|
|
456
468
|
const root = normalizePath(repoPath);
|
|
@@ -535,7 +547,7 @@ export function createMcpServer(rootPath) {
|
|
|
535
547
|
const profile = process.env.MILENS_PROFILE || undefined;
|
|
536
548
|
if (profile && profile !== 'full') {
|
|
537
549
|
const minimal = new Set(['query', 'grep', 'context', 'impact', 'status', 'codebase_summary', 'edit_check', 'detect_changes', 'get_file_symbols', 'overview']);
|
|
538
|
-
const standard = new Set([...minimal, 'domains', 'repos', 'explain_relationship', 'find_dead_code', 'get_type_hierarchy', 'trace', 'routes', 'smart_context', 'review_pr', 'review_symbol', 'test_coverage_gaps', 'test_plan', 'test_impact', 'session_start', 'recall']);
|
|
550
|
+
const standard = new Set([...minimal, 'domains', 'repos', 'explain_relationship', 'find_dead_code', 'get_type_hierarchy', 'trace', 'routes', 'smart_context', 'review_pr', 'review_symbol', 'test_coverage_gaps', 'test_plan', 'test_impact', 'session_start', 'recall', 'generate_findings_report']);
|
|
539
551
|
const allowed = profile === 'minimal' ? minimal : standard;
|
|
540
552
|
// Wrap the tracking-wrapped server.tool again, so profile gating sits on
|
|
541
553
|
// top: disabled tools still get registered (via the no-op handler below)
|
|
@@ -712,6 +724,18 @@ export function createMcpServer(rootPath) {
|
|
|
712
724
|
const unresolved = db.getUnresolvedStats();
|
|
713
725
|
const coverage = db.getTestCoverage();
|
|
714
726
|
let text = `repo: ${root}\nbuild: ${BUILD_SHA} (built: ${BUILT_AT})\nversion: ${PKG_VERSION}\nsymbols: ${stats.symbols}\nlinks: ${stats.links}\nfiles: ${stats.files}`;
|
|
727
|
+
// Warn if the running server build differs from the on-disk build
|
|
728
|
+
try {
|
|
729
|
+
const distBuildPath = join(__dirname, '..', 'build-info.js');
|
|
730
|
+
if (existsSync(distBuildPath)) {
|
|
731
|
+
const diskBuild = readFileSync(distBuildPath, 'utf-8');
|
|
732
|
+
const m = diskBuild.match(/export const BUILD_SHA = '([^']+)'/);
|
|
733
|
+
if (m && m[1] !== BUILD_SHA) {
|
|
734
|
+
text += `\n⚠ Running server build (${BUILD_SHA}) differs from on-disk build (${m[1]}) — restart the MCP server to pick up recent changes.`;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
catch { /* best-effort */ }
|
|
715
739
|
if (unresolved.imports > 0 || unresolved.calls > 0) {
|
|
716
740
|
text += `\n⚠ unresolved (internal): ${unresolved.imports} imports, ${unresolved.calls} calls — callers may be incomplete`;
|
|
717
741
|
}
|
|
@@ -789,8 +813,11 @@ export function createMcpServer(rootPath) {
|
|
|
789
813
|
// Section 2: Context (incoming + outgoing) for each symbol
|
|
790
814
|
if (symbols.length > 0) {
|
|
791
815
|
for (const sym of symbols) {
|
|
792
|
-
const incoming = db.getIncomingLinks(sym.id)
|
|
793
|
-
const outgoing = db.getOutgoingLinks(sym.id)
|
|
816
|
+
const incoming = db.getIncomingLinks(sym.id);
|
|
817
|
+
const outgoing = db.getOutgoingLinks(sym.id);
|
|
818
|
+
if (symbols.length > 1) {
|
|
819
|
+
sections.push(`─── ${fmtSymbol(sym, detail)} ---`);
|
|
820
|
+
}
|
|
794
821
|
if (incoming.length > 0) {
|
|
795
822
|
sections.push(`[incoming] ${incoming.length} refs:`);
|
|
796
823
|
const inSyms = incoming.map(l => {
|
|
@@ -979,7 +1006,7 @@ export function createMcpServer(rootPath) {
|
|
|
979
1006
|
repo: z.string().optional(),
|
|
980
1007
|
}, async ({ from, to, repo }) => {
|
|
981
1008
|
const { db } = getDb(repo);
|
|
982
|
-
|
|
1009
|
+
let fromSyms = db.findSymbolByName(from);
|
|
983
1010
|
const toSyms = db.findSymbolByName(to);
|
|
984
1011
|
if (fromSyms.length === 0) {
|
|
985
1012
|
return { content: [{ type: 'text', text: `Symbol "${from}" not found in index. Try \`grep\`.` }] };
|
|
@@ -987,12 +1014,24 @@ export function createMcpServer(rootPath) {
|
|
|
987
1014
|
if (toSyms.length === 0) {
|
|
988
1015
|
return { content: [{ type: 'text', text: `Symbol "${to}" not found in index. Try \`grep\`.` }] };
|
|
989
1016
|
}
|
|
990
|
-
|
|
1017
|
+
// Vue SFC: class-kind symbols have no call edges; resolve to file's _top module
|
|
1018
|
+
const fromSym = fromSyms[0];
|
|
1019
|
+
if (fromSym.kind === 'class' && fromSym.filePath.endsWith('.vue')) {
|
|
1020
|
+
const topId = `${fromSym.filePath}#module:_top:0`;
|
|
1021
|
+
const topSym = db.findSymbolById(topId);
|
|
1022
|
+
if (topSym)
|
|
1023
|
+
fromSyms = [topSym];
|
|
1024
|
+
}
|
|
1025
|
+
// Use the id-based lookup once a symbol has been disambiguated above —
|
|
1026
|
+
// findPath(name, ...) would re-resolve by name and could pick a
|
|
1027
|
+
// different same-named symbol (e.g. some other file's "_top"),
|
|
1028
|
+
// silently undoing the disambiguation.
|
|
1029
|
+
const path = db.findPathFromId(fromSyms[0].id, to);
|
|
991
1030
|
if (!path) {
|
|
992
1031
|
return { content: [{ type: 'text', text: `No path between "${from}" and "${to}".` }] };
|
|
993
1032
|
}
|
|
994
|
-
const
|
|
995
|
-
const lines = [`FROM: ${fmtSymbol(
|
|
1033
|
+
const displaySym = fromSyms[0];
|
|
1034
|
+
const lines = [`FROM: ${fmtSymbol(displaySym)}`, ''];
|
|
996
1035
|
for (const { symbol, depth, via } of path) {
|
|
997
1036
|
lines.push(` ${'→'.repeat(depth)} [${via}] ${fmtSymbol(symbol)}`);
|
|
998
1037
|
}
|
|
@@ -1012,7 +1051,8 @@ export function createMcpServer(rootPath) {
|
|
|
1012
1051
|
return { content: [{ type: 'text', text: 'No unreferenced exported symbols found.' }] };
|
|
1013
1052
|
}
|
|
1014
1053
|
if (dead.length > 0) {
|
|
1015
|
-
|
|
1054
|
+
const cappedNote = dead.length >= limit ? ` (showing ${dead.length}, may be more — increase limit to see all)` : '';
|
|
1055
|
+
lines.push(`${dead.length} unreferenced exported symbols (code-level only — verify with grep before removing)${cappedNote}:\n`);
|
|
1016
1056
|
for (const sym of dead) {
|
|
1017
1057
|
lines.push(fmtSymbol(sym));
|
|
1018
1058
|
}
|
|
@@ -1032,7 +1072,11 @@ export function createMcpServer(rootPath) {
|
|
|
1032
1072
|
file: z.string().describe('File path (relative to repo root)'),
|
|
1033
1073
|
repo: z.string().optional(),
|
|
1034
1074
|
detail: z.enum(['L0', 'L1', 'L2']).optional().default('L1').describe('Output detail: L0=names only, L1=default, L2=full metadata'),
|
|
1035
|
-
|
|
1075
|
+
limit: z.number().optional().default(100).describe('Max symbols to return'),
|
|
1076
|
+
offset: z.number().optional().default(0).describe('Offset for pagination'),
|
|
1077
|
+
}, async ({ file, repo, detail, limit, offset }) => {
|
|
1078
|
+
limit = limit ?? 100;
|
|
1079
|
+
offset = offset ?? 0;
|
|
1036
1080
|
const { db } = getDb(repo);
|
|
1037
1081
|
const symbols = db.getSymbolsByFile(file);
|
|
1038
1082
|
if (symbols.length === 0) {
|
|
@@ -1042,8 +1086,13 @@ export function createMcpServer(rootPath) {
|
|
|
1042
1086
|
const sorted = detail === 'L2'
|
|
1043
1087
|
? [...symbols].sort((a, b) => (b.heat ?? 0) - (a.heat ?? 0))
|
|
1044
1088
|
: symbols;
|
|
1045
|
-
const
|
|
1046
|
-
|
|
1089
|
+
const paginated = sorted.slice(offset, offset + limit);
|
|
1090
|
+
const total = sorted.length;
|
|
1091
|
+
const pageInfo = total > limit || offset > 0
|
|
1092
|
+
? ` (showing ${offset + 1}-${Math.min(offset + limit, total)} of ${total}; use offset/limit to paginate)`
|
|
1093
|
+
: '';
|
|
1094
|
+
const lines = [`${file}: ${total} symbols${pageInfo}\n`];
|
|
1095
|
+
for (const sym of paginated) {
|
|
1047
1096
|
const incoming = db.getIncomingLinks(sym.id).filter(l => l.type !== 'contains');
|
|
1048
1097
|
const outgoing = db.getOutgoingLinks(sym.id).filter(l => l.type !== 'contains');
|
|
1049
1098
|
const exp = sym.exported ? ' (exported)' : '';
|
|
@@ -1096,13 +1145,17 @@ export function createMcpServer(rootPath) {
|
|
|
1096
1145
|
if (ancestors.length > 0) {
|
|
1097
1146
|
lines.push('extends/implements:');
|
|
1098
1147
|
for (const { symbol: a, depth } of ancestors) {
|
|
1099
|
-
|
|
1148
|
+
const isExternal = a.filePath === '(external)';
|
|
1149
|
+
const label = isExternal ? ` ${fmtSymbol(a)} (external)` : ` ${fmtSymbol(a)}`;
|
|
1150
|
+
lines.push(` ${'↑'.repeat(depth)}${label}`);
|
|
1100
1151
|
}
|
|
1101
1152
|
}
|
|
1102
1153
|
if (descendants.length > 0) {
|
|
1103
1154
|
lines.push('extended/implemented by:');
|
|
1104
1155
|
for (const { symbol: d, depth } of descendants) {
|
|
1105
|
-
|
|
1156
|
+
const isExternal = d.filePath === '(external)';
|
|
1157
|
+
const label = isExternal ? ` ${fmtSymbol(d)} (external)` : ` ${fmtSymbol(d)}`;
|
|
1158
|
+
lines.push(` ${'↓'.repeat(depth)}${label}`);
|
|
1106
1159
|
}
|
|
1107
1160
|
}
|
|
1108
1161
|
if (ancestors.length === 0 && descendants.length === 0) {
|
|
@@ -1160,7 +1213,7 @@ export function createMcpServer(rootPath) {
|
|
|
1160
1213
|
// 5. Unresolved warning (only for internal)
|
|
1161
1214
|
const unresolved = db.getUnresolvedStats();
|
|
1162
1215
|
if (unresolved.imports > 0 || unresolved.calls > 0) {
|
|
1163
|
-
sections.push(`⚠ index has ${unresolved.imports} unresolved internal imports, ${unresolved.calls} unresolved internal calls — callers list may be incomplete`);
|
|
1216
|
+
sections.push(`⚠ this repo's index has ${unresolved.imports} unresolved internal imports, ${unresolved.calls} unresolved internal calls repo-wide — this symbol's callers list may be incomplete`);
|
|
1164
1217
|
}
|
|
1165
1218
|
// 6. Test coverage for this symbol
|
|
1166
1219
|
for (const sym of symbols) {
|
|
@@ -1264,7 +1317,7 @@ export function createMcpServer(rootPath) {
|
|
|
1264
1317
|
// Unresolved warning
|
|
1265
1318
|
const unresolved = db.getUnresolvedStats();
|
|
1266
1319
|
if (unresolved.imports > 0 || unresolved.calls > 0) {
|
|
1267
|
-
sections.push(`⚠ index has ${unresolved.imports} unresolved internal imports, ${unresolved.calls} unresolved internal calls — callers list may be incomplete`);
|
|
1320
|
+
sections.push(`⚠ this repo's index has ${unresolved.imports} unresolved internal imports, ${unresolved.calls} unresolved internal calls repo-wide — this symbol's callers list may be incomplete`);
|
|
1268
1321
|
}
|
|
1269
1322
|
return { content: [{ type: 'text', text: sections.join('\n') }] };
|
|
1270
1323
|
});
|
|
@@ -1329,8 +1382,8 @@ export function createMcpServer(rootPath) {
|
|
|
1329
1382
|
// ── Tool: routes ──
|
|
1330
1383
|
server.tool('routes', 'Detect framework routes/endpoints and map them to handler symbols. Scans for Express, FastAPI, NestJS, Flask, Go HTTP, PHP, Rails patterns.', {
|
|
1331
1384
|
repo: z.string().optional(),
|
|
1332
|
-
framework: z.string().optional().describe('Filter by framework (express, fastapi, nestjs, flask, go, php, rails). Default: auto-detect all.'),
|
|
1333
|
-
limit: z.number().optional().default(
|
|
1385
|
+
framework: z.string().optional().describe('Filter by framework (express, fastapi, nestjs, nestjs-gateway, flask, go, php, rails). Default: auto-detect all.'),
|
|
1386
|
+
limit: z.number().optional().default(200).describe('Max routes to display. Internal search always scans up to 500 matches per framework, so a low limit only affects display truncation, not detection accuracy.'),
|
|
1334
1387
|
}, async ({ repo, framework, limit }) => {
|
|
1335
1388
|
const root = resolveRoot(repo);
|
|
1336
1389
|
const { db } = getDb(repo);
|
|
@@ -1340,8 +1393,9 @@ export function createMcpServer(rootPath) {
|
|
|
1340
1393
|
const routePatterns = [
|
|
1341
1394
|
{ name: 'express', pattern: /\b(?:app|router)\.(get|post|put|patch|delete|use|all)\s*\(\s*['"`]([^'"`]+)['"`]/, fileGlob: '**/*.{ts,js,mjs,cjs}' },
|
|
1342
1395
|
{ name: 'fastapi', pattern: /@(?:app|router)\.(get|post|put|patch|delete)\s*\(\s*['"]([^'"]+)['"]/, fileGlob: '**/*.py' },
|
|
1343
|
-
{ name: 'flask', pattern: /@(?:app|bp|blueprint)\.
|
|
1396
|
+
{ name: 'flask', pattern: /@(?:app|bp|blueprint)\.route\s*\(\s*['"]([^'"]+)['"]/, fileGlob: '**/*.py' },
|
|
1344
1397
|
{ name: 'nestjs', pattern: /@(Get|Post|Put|Patch|Delete)\s*\(\s*['"]?([^'")]*?)['"]?\s*\)/, fileGlob: '**/*.ts' },
|
|
1398
|
+
{ name: 'nestjs-gateway', pattern: /@SubscribeMessage\s*\(\s*['"]([^'"]+)['"]\s*\)/, fileGlob: '**/*.ts' },
|
|
1345
1399
|
{ name: 'go', pattern: /\b(?:mux|router|http)\.(HandleFunc|Handle|Get|Post|Put|Delete)\s*\(\s*['"]([^'"]+)['"]/, fileGlob: '**/*.go' },
|
|
1346
1400
|
{ name: 'php', pattern: /Route::(get|post|put|patch|delete|any)\s*\(\s*['"]([^'"]+)['"]/, fileGlob: '**/*.php' },
|
|
1347
1401
|
{ name: 'rails', pattern: /\b(get|post|put|patch|delete|resources?|root)\s+['"]([^'"]+)['"]/, fileGlob: '**/*.rb' },
|
|
@@ -1350,19 +1404,29 @@ export function createMcpServer(rootPath) {
|
|
|
1350
1404
|
? routePatterns.filter(p => p.name === framework.toLowerCase())
|
|
1351
1405
|
: routePatterns;
|
|
1352
1406
|
if (activePatterns.length === 0) {
|
|
1353
|
-
return { content: [{ type: 'text', text: `Unknown framework "${framework}". Available: express, fastapi, nestjs, flask, go, php, rails` }] };
|
|
1407
|
+
return { content: [{ type: 'text', text: `Unknown framework "${framework}". Available: express, fastapi, nestjs, nestjs-gateway, flask, go, php, rails` }] };
|
|
1354
1408
|
}
|
|
1355
1409
|
const routes = [];
|
|
1356
1410
|
for (const rp of activePatterns) {
|
|
1357
1411
|
const matches = grepFiles(root, rp.pattern.source, {
|
|
1358
|
-
isRegex: true, maxResults:
|
|
1412
|
+
isRegex: true, maxResults: 500, includePattern: rp.fileGlob,
|
|
1359
1413
|
});
|
|
1360
1414
|
for (const m of matches) {
|
|
1361
1415
|
const match = rp.pattern.exec(m.text);
|
|
1362
1416
|
if (!match)
|
|
1363
1417
|
continue;
|
|
1364
|
-
|
|
1365
|
-
|
|
1418
|
+
// Skip matches inside Python docstrings (triple-quoted strings)
|
|
1419
|
+
if (rp.fileGlob === '**/*.py') {
|
|
1420
|
+
try {
|
|
1421
|
+
const filePath = resolve(root, m.file);
|
|
1422
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
1423
|
+
if (isInsideDocstring(content, m.line))
|
|
1424
|
+
continue;
|
|
1425
|
+
}
|
|
1426
|
+
catch { /* can't read file — skip filtering */ }
|
|
1427
|
+
}
|
|
1428
|
+
const method = rp.name === 'nestjs-gateway' ? 'WS' : match[1].toUpperCase();
|
|
1429
|
+
const path = rp.name === 'nestjs-gateway' ? match[1] : (match[2] || '/');
|
|
1366
1430
|
// Try to find the handler symbol on this line or nearby
|
|
1367
1431
|
const fileSymbols = db.getSymbolsByFile(m.file);
|
|
1368
1432
|
const handler = fileSymbols.find(s => s.startLine <= m.line && s.endLine >= m.line && s.kind === 'method') ?? fileSymbols.find(s => s.startLine <= m.line && s.endLine >= m.line) ?? fileSymbols.find(s => Math.abs(s.startLine - m.line) <= 3 && (s.kind === 'function' || s.kind === 'method'));
|
|
@@ -1379,6 +1443,71 @@ export function createMcpServer(rootPath) {
|
|
|
1379
1443
|
if (routes.length === 0) {
|
|
1380
1444
|
return { content: [{ type: 'text', text: 'No framework routes detected.' }] };
|
|
1381
1445
|
}
|
|
1446
|
+
// NestJS: join controller prefix with method path
|
|
1447
|
+
const nestjsRoutes = routes.filter(r => r.framework === 'nestjs');
|
|
1448
|
+
if (nestjsRoutes.length > 0) {
|
|
1449
|
+
const nestjsByFile = new Map();
|
|
1450
|
+
for (const r of nestjsRoutes) {
|
|
1451
|
+
const arr = nestjsByFile.get(r.file) ?? [];
|
|
1452
|
+
arr.push(r);
|
|
1453
|
+
nestjsByFile.set(r.file, arr);
|
|
1454
|
+
}
|
|
1455
|
+
for (const [file, fileRoutes] of nestjsByFile) {
|
|
1456
|
+
try {
|
|
1457
|
+
const content = readFileSync(resolve(root, file), 'utf-8');
|
|
1458
|
+
const lines = content.split('\n');
|
|
1459
|
+
// Find @Controller decorators with their class body line ranges
|
|
1460
|
+
const controllers = [];
|
|
1461
|
+
const ctrlRe = /@Controller\s*\(\s*['"]?([^'")]*?)['"]?\s*\)/;
|
|
1462
|
+
const classRe = /export\s+(?:abstract\s+)?class\s+\w+/;
|
|
1463
|
+
for (let i = 0; i < lines.length; i++) {
|
|
1464
|
+
const cm = ctrlRe.exec(lines[i]);
|
|
1465
|
+
if (!cm)
|
|
1466
|
+
continue;
|
|
1467
|
+
// Find the class declaration within next 5 lines
|
|
1468
|
+
let classLine = -1;
|
|
1469
|
+
for (let j = i; j < Math.min(i + 5, lines.length); j++) {
|
|
1470
|
+
if (classRe.test(lines[j])) {
|
|
1471
|
+
classLine = j;
|
|
1472
|
+
break;
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
if (classLine === -1)
|
|
1476
|
+
continue;
|
|
1477
|
+
// Track brace depth to find end of class body
|
|
1478
|
+
let depth = 0;
|
|
1479
|
+
let started = false;
|
|
1480
|
+
let endLine = classLine;
|
|
1481
|
+
for (let k = classLine; k < lines.length; k++) {
|
|
1482
|
+
for (const ch of lines[k]) {
|
|
1483
|
+
if (ch === '{') {
|
|
1484
|
+
depth++;
|
|
1485
|
+
started = true;
|
|
1486
|
+
}
|
|
1487
|
+
else if (ch === '}') {
|
|
1488
|
+
depth--;
|
|
1489
|
+
}
|
|
1490
|
+
}
|
|
1491
|
+
if (started && depth === 0) {
|
|
1492
|
+
endLine = k;
|
|
1493
|
+
break;
|
|
1494
|
+
}
|
|
1495
|
+
}
|
|
1496
|
+
controllers.push({ prefix: cm[1] || '', startLine: classLine + 1, endLine: endLine + 1 });
|
|
1497
|
+
}
|
|
1498
|
+
// Map each route to its controller prefix
|
|
1499
|
+
for (const r of fileRoutes) {
|
|
1500
|
+
const ctrl = controllers.find(c => r.line >= c.startLine && r.line <= c.endLine);
|
|
1501
|
+
if (ctrl && ctrl.prefix) {
|
|
1502
|
+
const methodPath = r.path === '/' ? '' : r.path;
|
|
1503
|
+
const joinPath = ctrl.prefix + (methodPath.startsWith('/') || methodPath === '' ? methodPath : '/' + methodPath);
|
|
1504
|
+
r.path = joinPath || '/';
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
}
|
|
1508
|
+
catch { /* can't read file */ }
|
|
1509
|
+
}
|
|
1510
|
+
}
|
|
1382
1511
|
// Group by framework
|
|
1383
1512
|
const grouped = new Map();
|
|
1384
1513
|
for (const r of routes) {
|
|
@@ -1386,10 +1515,13 @@ export function createMcpServer(rootPath) {
|
|
|
1386
1515
|
arr.push(r);
|
|
1387
1516
|
grouped.set(r.framework, arr);
|
|
1388
1517
|
}
|
|
1389
|
-
const
|
|
1518
|
+
const displayRoutes = routes.slice(0, limit);
|
|
1519
|
+
const lines = [`${routes.length} routes detected${routes.length > limit ? ` (showing first ${limit})` : ''}:\n`];
|
|
1390
1520
|
for (const [fw, fwRoutes] of grouped) {
|
|
1391
1521
|
lines.push(`[${fw}]`);
|
|
1392
1522
|
for (const r of fwRoutes) {
|
|
1523
|
+
if (!displayRoutes.includes(r))
|
|
1524
|
+
break;
|
|
1393
1525
|
const handlerInfo = r.handler ? ` → ${r.handler}` : '';
|
|
1394
1526
|
lines.push(` ${r.method.padEnd(7)} ${r.path} (${r.file}:${r.line})${handlerInfo}`);
|
|
1395
1527
|
}
|
|
@@ -1488,10 +1620,19 @@ export function createMcpServer(rootPath) {
|
|
|
1488
1620
|
// Execution paths + data flow
|
|
1489
1621
|
const traces = db.traceToEntrypoints(sym.id, 6);
|
|
1490
1622
|
if (traces.length > 0) {
|
|
1623
|
+
const seenChains = new Set();
|
|
1491
1624
|
sections.push(`execution paths (${traces.length}):`);
|
|
1492
|
-
|
|
1625
|
+
let shown = 0;
|
|
1626
|
+
for (let i = 0; i < traces.length && shown < 3; i++) {
|
|
1493
1627
|
const chain = traces[i].path;
|
|
1494
|
-
|
|
1628
|
+
const firstFile = chain[0]?.symbol?.filePath?.split('/').pop() ?? '';
|
|
1629
|
+
const rendered = chain.map(s => s.symbol.name).join(' → ');
|
|
1630
|
+
const key = `${firstFile}: ${rendered}`;
|
|
1631
|
+
if (seenChains.has(key))
|
|
1632
|
+
continue;
|
|
1633
|
+
seenChains.add(key);
|
|
1634
|
+
sections.push(` ${key}`);
|
|
1635
|
+
shown++;
|
|
1495
1636
|
}
|
|
1496
1637
|
}
|
|
1497
1638
|
else {
|
|
@@ -1913,6 +2054,7 @@ export function createMcpServer(rootPath) {
|
|
|
1913
2054
|
// ── Register MCP Prompts ──
|
|
1914
2055
|
registerAllPrompts(server);
|
|
1915
2056
|
registerSecurityTools(server, { getDb, fmtSymbol, fmtImpact, rootPath, toolCallCounts, resolveRoot, guard, getToolCallCount });
|
|
2057
|
+
registerFindingsReportTools(server, { getDb, fmtSymbol, fmtImpact, rootPath, toolCallCounts, resolveRoot, guard, getToolCallCount });
|
|
1916
2058
|
// ── Tool: compare_impact ──
|
|
1917
2059
|
server.tool('compare_impact', 'Compare impact graph before/after an edit. Takes a snapshot first, then call again to see the diff. Returns new/removed dependents and heat changes.', {
|
|
1918
2060
|
name: z.string().describe('Symbol name to compare'),
|