@grafema/cli 0.2.11 → 0.3.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +13 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +2 -4
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/analyzeAction.d.ts +5 -3
- package/dist/commands/analyzeAction.d.ts.map +1 -1
- package/dist/commands/analyzeAction.js +109 -151
- package/dist/commands/analyzeAction.js.map +1 -1
- package/dist/commands/check.d.ts +1 -1
- package/dist/commands/check.js +4 -4
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/context.js +2 -2
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/coverage.js +2 -2
- package/dist/commands/coverage.js.map +1 -1
- package/dist/commands/describe.d.ts +13 -0
- package/dist/commands/describe.d.ts.map +1 -0
- package/dist/commands/describe.js +131 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/doctor/checks.d.ts +6 -1
- package/dist/commands/doctor/checks.d.ts.map +1 -1
- package/dist/commands/doctor/checks.js +128 -13
- package/dist/commands/doctor/checks.js.map +1 -1
- package/dist/commands/doctor.d.ts +10 -9
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +12 -10
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain.js +2 -2
- package/dist/commands/explain.js.map +1 -1
- package/dist/commands/file.js +2 -2
- package/dist/commands/file.js.map +1 -1
- package/dist/commands/get.js +2 -2
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/git-ingest.d.ts +6 -0
- package/dist/commands/git-ingest.d.ts.map +1 -0
- package/dist/commands/git-ingest.js +46 -0
- package/dist/commands/git-ingest.js.map +1 -0
- package/dist/commands/impact.d.ts.map +1 -1
- package/dist/commands/impact.js +276 -50
- package/dist/commands/impact.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +20 -22
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/ls.js +2 -2
- package/dist/commands/ls.js.map +1 -1
- package/dist/commands/overview.js +2 -2
- package/dist/commands/overview.js.map +1 -1
- package/dist/commands/query.d.ts +1 -1
- package/dist/commands/query.d.ts.map +1 -1
- package/dist/commands/query.js +169 -7
- package/dist/commands/query.js.map +1 -1
- package/dist/commands/schema.js +2 -2
- package/dist/commands/schema.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +122 -76
- package/dist/commands/server.js.map +1 -1
- package/dist/commands/stats.js +2 -2
- package/dist/commands/stats.js.map +1 -1
- package/dist/commands/tldr.d.ts +12 -0
- package/dist/commands/tldr.d.ts.map +1 -0
- package/dist/commands/tldr.js +81 -0
- package/dist/commands/tldr.js.map +1 -0
- package/dist/commands/trace.d.ts +1 -1
- package/dist/commands/trace.d.ts.map +1 -1
- package/dist/commands/trace.js +17 -133
- package/dist/commands/trace.js.map +1 -1
- package/dist/commands/types.js +2 -2
- package/dist/commands/types.js.map +1 -1
- package/dist/commands/who.d.ts +12 -0
- package/dist/commands/who.d.ts.map +1 -0
- package/dist/commands/who.js +184 -0
- package/dist/commands/who.js.map +1 -0
- package/dist/commands/why.d.ts +12 -0
- package/dist/commands/why.d.ts.map +1 -0
- package/dist/commands/why.js +118 -0
- package/dist/commands/why.js.map +1 -0
- package/dist/commands/wtf.d.ts +12 -0
- package/dist/commands/wtf.d.ts.map +1 -0
- package/dist/commands/wtf.js +117 -0
- package/dist/commands/wtf.js.map +1 -0
- package/dist/plugins/builtinPlugins.d.ts +1 -9
- package/dist/plugins/builtinPlugins.d.ts.map +1 -1
- package/dist/plugins/builtinPlugins.js +2 -67
- package/dist/plugins/builtinPlugins.js.map +1 -1
- package/dist/plugins/pluginLoader.d.ts +1 -15
- package/dist/plugins/pluginLoader.d.ts.map +1 -1
- package/dist/plugins/pluginLoader.js +2 -100
- package/dist/plugins/pluginLoader.js.map +1 -1
- package/dist/plugins/pluginResolver.js +3 -3
- package/dist/utils/progressRenderer.d.ts +15 -1
- package/dist/utils/progressRenderer.d.ts.map +1 -1
- package/dist/utils/progressRenderer.js +19 -3
- package/dist/utils/progressRenderer.js.map +1 -1
- package/dist/utils/queryHints.d.ts +6 -0
- package/dist/utils/queryHints.d.ts.map +1 -0
- package/dist/utils/queryHints.js +36 -0
- package/dist/utils/queryHints.js.map +1 -0
- package/package.json +4 -4
- package/skills/grafema-codebase-analysis/SKILL.md +1 -1
- package/src/cli.ts +14 -0
- package/src/commands/analyze.ts +2 -4
- package/src/commands/analyzeAction.ts +122 -168
- package/src/commands/check.ts +5 -5
- package/src/commands/context.ts +3 -3
- package/src/commands/coverage.ts +2 -2
- package/src/commands/describe.ts +160 -0
- package/src/commands/doctor/checks.ts +153 -10
- package/src/commands/doctor.ts +13 -9
- package/src/commands/explain.ts +2 -2
- package/src/commands/explore.tsx +2 -2
- package/src/commands/file.ts +3 -3
- package/src/commands/get.ts +2 -2
- package/src/commands/git-ingest.ts +49 -0
- package/src/commands/impact.ts +318 -55
- package/src/commands/init.ts +20 -22
- package/src/commands/ls.ts +2 -2
- package/src/commands/overview.ts +2 -2
- package/src/commands/query.ts +197 -7
- package/src/commands/schema.ts +2 -2
- package/src/commands/server.ts +136 -84
- package/src/commands/stats.ts +2 -2
- package/src/commands/tldr.ts +103 -0
- package/src/commands/trace.ts +19 -161
- package/src/commands/types.ts +2 -2
- package/src/commands/who.ts +215 -0
- package/src/commands/why.ts +134 -0
- package/src/commands/wtf.ts +140 -0
- package/src/plugins/builtinPlugins.ts +1 -108
- package/src/plugins/pluginLoader.ts +1 -123
- package/src/plugins/pluginResolver.js +3 -3
- package/src/utils/progressRenderer.ts +34 -4
- package/src/utils/queryHints.ts +46 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progressRenderer.js","sourceRoot":"","sources":["../../src/utils/progressRenderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"progressRenderer.js","sourceRoot":"","sources":["../../src/utils/progressRenderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA8BH;;;;;;GAMG;AACH,MAAM,OAAO,gBAAgB;IACnB,MAAM,GAAa,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IACrF,iBAAiB,GAAW,CAAC,CAAC,CAAC;IAC/B,YAAY,GAAW,EAAE,CAAC;IAC1B,aAAa,GAAW,EAAE,CAAC;IAC3B,OAAO,GAAW,EAAE,CAAC;IACrB,UAAU,GAAW,CAAC,CAAC;IACvB,cAAc,GAAW,CAAC,CAAC;IAC3B,gBAAgB,GAAW,CAAC,CAAC;IAC7B,aAAa,GAAW,CAAC,CAAC;IAC1B,cAAc,GAAW,EAAE,CAAC;IAC5B,YAAY,GAAW,CAAC,CAAC;IACzB,aAAa,CAAU;IACvB,SAAS,CAAS;IAClB,eAAe,GAAW,CAAC,CAAC;IAC5B,eAAe,CAAS;IACxB,KAAK,CAAyB;IAC9B,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACnE,aAAa,GAAa,EAAE,CAAC;IAC7B,SAAS,GAAW,CAAC,CAAC;IACtB,SAAS,GAAW,CAAC,CAAC;IAE9B,YAAY,OAAiC;QAC3C,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;QAC7E,IAAI,CAAC,eAAe,GAAG,OAAO,EAAE,QAAQ,IAAI,GAAG,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAChF,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAkB;QACvB,wBAAwB;QACxB,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YACnD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;YAC/B,CAAC;YACD,6BAA6B;YAC7B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACtB,CAAC;QAED,kCAAkC;QAClC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACxC,yDAAyD;YACzD,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,YAAY,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC;gBAC1E,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC3E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACpC,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC5C,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAChD,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QAC1C,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC5C,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAExE,mBAAmB;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;QAE3B,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,SAAiB,EAAE,SAAiB;QAC3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,OAAO;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAEnC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,0EAA0E;YAC1E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,+BAA+B;YAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QACrD,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;YACjB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QAClC,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACzC,OAAO,GAAG,OAAO,IAAI,OAAO,GAAG,CAAC;IAClC,CAAC;IAEO,iBAAiB;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEjC,oEAAoE;QACpE,OAAO,GAAG,OAAO,IAAI,UAAU,GAAG,QAAQ,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;IACpE,CAAC;IAEO,oBAAoB;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,OAAO,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,mBAAmB,EAAE,KAAK,OAAO,GAAG,CAAC;IAC7F,CAAC;IAED;;OAEG;IACK,WAAW;QACjB,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,OAAO,MAAM,KAAK,WAAW,KAAK,QAAQ,CAAC;IAC7C,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,CAAS;QAC5B,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YACf,OAAO,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACtC,CAAC;QACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzF,OAAO,IAAI,QAAQ,IAAI,WAAW,KAAK,SAAS,KAAK,CAAC;IACxD,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1B,KAAK,WAAW;gBACd,IAAI,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;oBAC9B,OAAO,IAAI,IAAI,CAAC,gBAAgB,iBAAiB,CAAC;gBACpD,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,KAAK,GAAa,EAAE,CAAC;gBAC3B,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,aAAa,WAAW,CAAC,CAAC;gBACxE,CAAC;gBACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACxB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,EAAE;wBAC1C,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;wBACxC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;oBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;gBACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,KAAK,GAAa,EAAE,CAAC;gBAC3B,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;oBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,UAAU,QAAQ,CAAC,CAAC;gBAChE,CAAC;gBACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACxB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,EAAE;wBAC1C,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;wBACxC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;oBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;gBACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,CAAC;YACD,KAAK,YAAY,CAAC;YAClB,KAAK,YAAY;gBACf,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClC,OAAO,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;gBAC3D,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ;gBACE,OAAO,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,OAAiB;QACxC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,gCAAgC;QAChC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;IAClD,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,eAAuB;QAC5B,OAAO,wBAAwB,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/D,CAAC;IAED;;;OAGG;IACH,QAAQ;QAaN,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,iBAAiB;YAClC,KAAK,EAAE,IAAI,CAAC,YAAY;YACxB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,aAAa,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;YACtC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function extractQueriedTypes(query: string): {
|
|
2
|
+
nodeTypes: string[];
|
|
3
|
+
edgeTypes: string[];
|
|
4
|
+
};
|
|
5
|
+
export declare function findSimilarTypes(queriedType: string, availableTypes: string[], maxDistance?: number): string[];
|
|
6
|
+
//# sourceMappingURL=queryHints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryHints.d.ts","sourceRoot":"","sources":["../../src/utils/queryHints.ts"],"names":[],"mappings":"AASA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAkB/F;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EAAE,EACxB,WAAW,GAAE,MAAU,GACtB,MAAM,EAAE,CAYV"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query hint utilities for the CLI raw query path.
|
|
3
|
+
*
|
|
4
|
+
* Note: extractQueriedTypes() is intentionally duplicated from packages/mcp/src/utils.ts.
|
|
5
|
+
* The CLI cannot import @grafema/mcp (dependency direction). If the Datalog syntax changes,
|
|
6
|
+
* both copies must be updated.
|
|
7
|
+
*/
|
|
8
|
+
import { levenshtein } from '@grafema/util';
|
|
9
|
+
export function extractQueriedTypes(query) {
|
|
10
|
+
const nodeTypes = [];
|
|
11
|
+
const edgeTypes = [];
|
|
12
|
+
// Match node(VAR, "TYPE") — only working node predicate.
|
|
13
|
+
// type(VAR, "TYPE") is excluded: Rust evaluator has no "type" branch.
|
|
14
|
+
const nodeRegex = /\bnode\([^,)]+,\s*"([^"]+)"\)/g;
|
|
15
|
+
let m;
|
|
16
|
+
while ((m = nodeRegex.exec(query)) !== null) {
|
|
17
|
+
nodeTypes.push(m[1]);
|
|
18
|
+
}
|
|
19
|
+
const edgeRegex = /\b(?:edge|incoming)\([^,)]+,\s*[^,)]+,\s*"([^"]+)"\)/g;
|
|
20
|
+
while ((m = edgeRegex.exec(query)) !== null) {
|
|
21
|
+
edgeTypes.push(m[1]);
|
|
22
|
+
}
|
|
23
|
+
return { nodeTypes, edgeTypes };
|
|
24
|
+
}
|
|
25
|
+
export function findSimilarTypes(queriedType, availableTypes, maxDistance = 2) {
|
|
26
|
+
const queriedLower = queriedType.toLowerCase();
|
|
27
|
+
const similar = [];
|
|
28
|
+
for (const type of availableTypes) {
|
|
29
|
+
const dist = levenshtein(queriedLower, type.toLowerCase());
|
|
30
|
+
if (dist <= maxDistance && (dist > 0 || queriedType !== type)) {
|
|
31
|
+
similar.push(type);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return similar;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=queryHints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryHints.js","sourceRoot":"","sources":["../../src/utils/queryHints.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,yDAAyD;IACzD,sEAAsE;IACtE,MAAM,SAAS,GAAG,gCAAgC,CAAC;IACnD,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5C,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,SAAS,GAAG,uDAAuD,CAAC;IAC1E,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5C,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,EACnB,cAAwB,EACxB,cAAsB,CAAC;IAEvB,MAAM,YAAY,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,IAAI,WAAW,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,WAAW,KAAK,IAAI,CAAC,EAAE,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grafema/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0-beta",
|
|
4
4
|
"description": "CLI for Grafema code analysis toolkit",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cli.js",
|
|
@@ -35,9 +35,9 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"commander": "^13.0.0",
|
|
37
37
|
"yaml": "^2.8.2",
|
|
38
|
-
"@grafema/api": "0.
|
|
39
|
-
"@grafema/
|
|
40
|
-
"@grafema/
|
|
38
|
+
"@grafema/api": "0.3.0-beta",
|
|
39
|
+
"@grafema/types": "0.3.0-beta",
|
|
40
|
+
"@grafema/util": "0.3.0-beta"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/node": "^25.0.8",
|
package/src/cli.ts
CHANGED
|
@@ -17,6 +17,11 @@ import { getCommand } from './commands/get.js';
|
|
|
17
17
|
import { traceCommand } from './commands/trace.js';
|
|
18
18
|
import { impactCommand } from './commands/impact.js';
|
|
19
19
|
import { contextCommand } from './commands/context.js';
|
|
20
|
+
import { describeCommand } from './commands/describe.js';
|
|
21
|
+
import { tldrCommand } from './commands/tldr.js';
|
|
22
|
+
import { wtfCommand } from './commands/wtf.js';
|
|
23
|
+
import { whoCommand } from './commands/who.js';
|
|
24
|
+
import { whyCommand } from './commands/why.js';
|
|
20
25
|
|
|
21
26
|
import { statsCommand } from './commands/stats.js';
|
|
22
27
|
import { checkCommand } from './commands/check.js';
|
|
@@ -27,6 +32,7 @@ import { schemaCommand } from './commands/schema.js';
|
|
|
27
32
|
import { explainCommand } from './commands/explain.js';
|
|
28
33
|
import { fileCommand } from './commands/file.js';
|
|
29
34
|
import { setupSkillCommand } from './commands/setup-skill.js';
|
|
35
|
+
import { gitIngestCommand } from './commands/git-ingest.js';
|
|
30
36
|
|
|
31
37
|
// Read version from package.json
|
|
32
38
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
@@ -39,12 +45,19 @@ program
|
|
|
39
45
|
.description('Grafema code analysis CLI')
|
|
40
46
|
.version(pkg.version);
|
|
41
47
|
|
|
48
|
+
// Human-first commands
|
|
49
|
+
program.addCommand(tldrCommand);
|
|
50
|
+
program.addCommand(wtfCommand);
|
|
51
|
+
program.addCommand(whoCommand);
|
|
52
|
+
program.addCommand(whyCommand);
|
|
53
|
+
|
|
42
54
|
// Commands in logical order
|
|
43
55
|
program.addCommand(initCommand);
|
|
44
56
|
program.addCommand(analyzeCommand);
|
|
45
57
|
program.addCommand(overviewCommand);
|
|
46
58
|
program.addCommand(queryCommand);
|
|
47
59
|
program.addCommand(contextCommand);
|
|
60
|
+
program.addCommand(describeCommand);
|
|
48
61
|
program.addCommand(typesCommand);
|
|
49
62
|
program.addCommand(lsCommand);
|
|
50
63
|
program.addCommand(getCommand);
|
|
@@ -60,5 +73,6 @@ program.addCommand(schemaCommand);
|
|
|
60
73
|
program.addCommand(explainCommand);
|
|
61
74
|
program.addCommand(fileCommand);
|
|
62
75
|
program.addCommand(setupSkillCommand);
|
|
76
|
+
program.addCommand(gitIngestCommand);
|
|
63
77
|
|
|
64
78
|
program.parse();
|
package/src/commands/analyze.ts
CHANGED
|
@@ -20,7 +20,7 @@ export const analyzeCommand = new Command('analyze')
|
|
|
20
20
|
.option('--log-level <level>', 'Set log level (silent, errors, warnings, info, debug)')
|
|
21
21
|
.option('--log-file <path>', 'Write all log output to a file')
|
|
22
22
|
.option('--strict', 'Enable strict mode (fail on unresolved references)')
|
|
23
|
-
.option('--auto-start', '
|
|
23
|
+
.option('--no-auto-start', 'Do not auto-start RFDB server (require manual start)')
|
|
24
24
|
.addHelpText('after', `
|
|
25
25
|
Examples:
|
|
26
26
|
grafema analyze Analyze current project
|
|
@@ -31,8 +31,6 @@ Examples:
|
|
|
31
31
|
grafema analyze --debug Write diagnostics.log for debugging
|
|
32
32
|
grafema analyze --log-file out.log Write all logs to a file
|
|
33
33
|
grafema analyze --strict Fail on unresolved references (debugging)
|
|
34
|
-
grafema analyze --auto-start
|
|
35
|
-
|
|
36
|
-
Note: Start the server first with: grafema server start
|
|
34
|
+
grafema analyze --no-auto-start Require manual server start
|
|
37
35
|
`)
|
|
38
36
|
.action(analyzeAction);
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Analyze command action —
|
|
2
|
+
* Analyze command action — spawns grafema-orchestrator for project analysis.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* The Rust grafema-orchestrator binary handles the full analysis pipeline:
|
|
5
|
+
* discovery, parsing (OXC), analysis (grafema-analyzer), resolution,
|
|
6
|
+
* and RFDB ingestion. This action finds the binary, spawns it with
|
|
7
|
+
* the correct args, streams output, and prints a summary.
|
|
6
8
|
*/
|
|
7
9
|
|
|
8
10
|
import { resolve, join } from 'path';
|
|
9
11
|
import { existsSync, mkdirSync } from 'fs';
|
|
12
|
+
import { spawn } from 'child_process';
|
|
10
13
|
import {
|
|
11
|
-
Orchestrator,
|
|
12
14
|
RFDBServerBackend,
|
|
13
|
-
DiagnosticReporter,
|
|
14
|
-
DiagnosticWriter,
|
|
15
15
|
createLogger,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
import {
|
|
16
|
+
findOrchestratorBinary,
|
|
17
|
+
getBinaryNotFoundMessage,
|
|
18
|
+
findAnalyzerBinary,
|
|
19
|
+
ensureBinary,
|
|
20
|
+
} from '@grafema/util';
|
|
21
|
+
import type { LogLevel } from '@grafema/util';
|
|
22
22
|
|
|
23
23
|
export interface NodeEdgeCountBackend {
|
|
24
24
|
nodeCount: () => Promise<number>;
|
|
@@ -53,6 +53,28 @@ function getLogLevel(options: { quiet?: boolean; verbose?: boolean; logLevel?: s
|
|
|
53
53
|
return 'silent'; // Default: silent logs, clean progress UI
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
+
/**
|
|
57
|
+
* Find the grafema.config.yaml config file for the orchestrator.
|
|
58
|
+
*
|
|
59
|
+
* Search order:
|
|
60
|
+
* 1. <projectPath>/grafema.config.yaml
|
|
61
|
+
* 2. <projectPath>/.grafema/config.yaml (legacy location)
|
|
62
|
+
*/
|
|
63
|
+
function findConfigFile(projectPath: string): string | null {
|
|
64
|
+
const candidates = [
|
|
65
|
+
join(projectPath, 'grafema.config.yaml'),
|
|
66
|
+
join(projectPath, '.grafema', 'config.yaml'),
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
for (const candidate of candidates) {
|
|
70
|
+
if (existsSync(candidate)) {
|
|
71
|
+
return candidate;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
|
|
56
78
|
export async function analyzeAction(path: string, options: { service?: string; entrypoint?: string; clear?: boolean; quiet?: boolean; verbose?: boolean; debug?: boolean; logLevel?: string; logFile?: string; strict?: boolean; autoStart?: boolean }): Promise<void> {
|
|
57
79
|
const projectPath = resolve(path);
|
|
58
80
|
const grafemaDir = join(projectPath, '.grafema');
|
|
@@ -71,35 +93,74 @@ export async function analyzeAction(path: string, options: { service?: string; e
|
|
|
71
93
|
// Create logger based on CLI flags
|
|
72
94
|
const logLevel = getLogLevel(options);
|
|
73
95
|
const logFile = options.logFile ? resolve(options.logFile) : undefined;
|
|
74
|
-
const
|
|
96
|
+
const _logger = createLogger(logLevel, logFile ? { logFile } : undefined);
|
|
75
97
|
|
|
76
98
|
if (logFile) {
|
|
77
99
|
debug(`Log file: ${logFile}`);
|
|
78
100
|
}
|
|
79
101
|
debug(`Analyzing project: ${projectPath}`);
|
|
80
102
|
|
|
81
|
-
//
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
103
|
+
// Find grafema-orchestrator binary
|
|
104
|
+
const orchestratorBinary = findOrchestratorBinary();
|
|
105
|
+
if (!orchestratorBinary) {
|
|
106
|
+
console.error('');
|
|
107
|
+
console.error(getBinaryNotFoundMessage('grafema-orchestrator'));
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
debug(`Using orchestrator: ${orchestratorBinary}`);
|
|
112
|
+
|
|
113
|
+
// Ensure JS/TS analyzer binaries exist (lazy download if missing)
|
|
114
|
+
for (const binName of ['grafema-analyzer', 'grafema-resolve']) {
|
|
115
|
+
const existing = findAnalyzerBinary(binName);
|
|
116
|
+
if (!existing) {
|
|
117
|
+
const downloaded = await ensureBinary(binName, null, info);
|
|
118
|
+
if (downloaded) {
|
|
119
|
+
debug(`Downloaded ${binName} → ${downloaded}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Find config file for the orchestrator
|
|
125
|
+
const configPath = findConfigFile(projectPath);
|
|
126
|
+
if (!configPath) {
|
|
127
|
+
console.error('');
|
|
128
|
+
console.error('No grafema config file found.');
|
|
129
|
+
console.error('');
|
|
130
|
+
console.error('Expected one of:');
|
|
131
|
+
console.error(` ${join(projectPath, 'grafema.config.yaml')}`);
|
|
132
|
+
console.error(` ${join(projectPath, '.grafema', 'config.yaml')}`);
|
|
133
|
+
console.error('');
|
|
134
|
+
console.error('Create a config file with at least:');
|
|
135
|
+
console.error(' root: "."');
|
|
136
|
+
console.error(' include:');
|
|
137
|
+
console.error(' - "src/**/*.js"');
|
|
138
|
+
console.error('');
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
debug(`Using config: ${configPath}`);
|
|
143
|
+
|
|
144
|
+
// Connect to RFDB server — auto-start by default (zero-config UX)
|
|
85
145
|
const backend = new RFDBServerBackend({
|
|
86
146
|
dbPath,
|
|
87
|
-
autoStart: options.autoStart ??
|
|
88
|
-
silent: !options.verbose
|
|
147
|
+
autoStart: options.autoStart ?? true,
|
|
148
|
+
silent: !options.verbose,
|
|
149
|
+
clientName: 'cli'
|
|
89
150
|
});
|
|
90
151
|
|
|
91
152
|
try {
|
|
92
153
|
await backend.connect();
|
|
93
154
|
} catch (err) {
|
|
94
|
-
if (
|
|
155
|
+
if (err instanceof Error && err.message.includes('not running')) {
|
|
95
156
|
console.error('');
|
|
96
|
-
console.error('RFDB server
|
|
157
|
+
console.error('RFDB server failed to start.');
|
|
97
158
|
console.error('');
|
|
98
|
-
console.error('
|
|
159
|
+
console.error('Try starting manually:');
|
|
99
160
|
console.error(' grafema server start');
|
|
100
161
|
console.error('');
|
|
101
|
-
console.error('Or
|
|
102
|
-
console.error(' grafema
|
|
162
|
+
console.error('Or run diagnostics:');
|
|
163
|
+
console.error(' grafema doctor');
|
|
103
164
|
console.error('');
|
|
104
165
|
process.exit(1);
|
|
105
166
|
}
|
|
@@ -111,174 +172,67 @@ export async function analyzeAction(path: string, options: { service?: string; e
|
|
|
111
172
|
await backend.clear();
|
|
112
173
|
}
|
|
113
174
|
|
|
114
|
-
const config = loadConfig(projectPath, logger);
|
|
115
|
-
|
|
116
|
-
// Extract services from config (REG-174)
|
|
117
|
-
if (config.services.length > 0) {
|
|
118
|
-
debug(`Loaded ${config.services.length} service(s) from config`);
|
|
119
|
-
for (const svc of config.services) {
|
|
120
|
-
const entry = svc.entryPoint ? ` (entry: ${svc.entryPoint})` : '';
|
|
121
|
-
debug(` - ${svc.name}: ${svc.path}${entry}`);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Load custom plugins from .grafema/plugins/
|
|
126
|
-
const customPlugins = await loadCustomPlugins(projectPath, debug);
|
|
127
|
-
const plugins = createPlugins(config.plugins, customPlugins, options.verbose);
|
|
128
|
-
|
|
129
|
-
debug(`Loaded ${plugins.length} plugins`);
|
|
130
|
-
|
|
131
|
-
// Resolve strict mode: CLI flag overrides config
|
|
132
|
-
const strictMode = options.strict ?? config.strict ?? false;
|
|
133
|
-
if (strictMode) {
|
|
134
|
-
debug('Strict mode enabled - analysis will fail on unresolved references');
|
|
135
|
-
}
|
|
136
|
-
|
|
137
175
|
const startTime = Date.now();
|
|
138
176
|
|
|
139
|
-
//
|
|
140
|
-
|
|
141
|
-
// In verbose mode, use non-interactive (newlines per update)
|
|
142
|
-
// In normal mode, use interactive (spinner with line overwrite)
|
|
143
|
-
const renderer = options.quiet
|
|
144
|
-
? null
|
|
145
|
-
: new ProgressRenderer({
|
|
146
|
-
isInteractive: !options.verbose && process.stdout.isTTY,
|
|
147
|
-
});
|
|
177
|
+
// Build orchestrator args
|
|
178
|
+
const args: string[] = ['analyze', '--config', configPath, '--socket', backend.socketPath];
|
|
148
179
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (renderer && !options.quiet) {
|
|
152
|
-
statsInterval = setInterval(async () => {
|
|
153
|
-
try {
|
|
154
|
-
const stats = await fetchNodeEdgeCounts(backend);
|
|
155
|
-
renderer.setStats(stats.nodeCount, stats.edgeCount);
|
|
156
|
-
} catch {
|
|
157
|
-
// Ignore stats errors during analysis
|
|
158
|
-
}
|
|
159
|
-
}, 500); // Poll every 500ms
|
|
160
|
-
statsInterval.unref?.();
|
|
180
|
+
if (options.clear) {
|
|
181
|
+
args.push('--force');
|
|
161
182
|
}
|
|
162
183
|
|
|
163
|
-
|
|
164
|
-
graph: backend as unknown as GraphBackend,
|
|
165
|
-
plugins,
|
|
166
|
-
serviceFilter: options.service || null,
|
|
167
|
-
entrypoint: options.entrypoint,
|
|
168
|
-
forceAnalysis: options.clear || false,
|
|
169
|
-
logger,
|
|
170
|
-
services: config.services.length > 0 ? config.services : undefined, // Pass config services (REG-174)
|
|
171
|
-
strictMode, // REG-330: Pass strict mode flag
|
|
172
|
-
onProgress: (progress) => {
|
|
173
|
-
renderer?.update(progress);
|
|
174
|
-
},
|
|
175
|
-
});
|
|
184
|
+
debug(`Spawning: ${orchestratorBinary} ${args.join(' ')}`);
|
|
176
185
|
|
|
177
186
|
let exitCode = 0;
|
|
178
187
|
|
|
179
188
|
try {
|
|
180
|
-
|
|
181
|
-
await
|
|
189
|
+
// Spawn grafema-orchestrator
|
|
190
|
+
exitCode = await new Promise<number>((resolvePromise, reject) => {
|
|
191
|
+
const child = spawn(orchestratorBinary, args, {
|
|
192
|
+
stdio: [
|
|
193
|
+
'ignore',
|
|
194
|
+
options.quiet ? 'ignore' : 'inherit',
|
|
195
|
+
options.quiet ? 'ignore' : 'inherit',
|
|
196
|
+
],
|
|
197
|
+
env: {
|
|
198
|
+
...process.env,
|
|
199
|
+
// Pass RUST_LOG for tracing verbosity
|
|
200
|
+
RUST_LOG: options.verbose ? 'info' : (options.debug ? 'debug' : 'warn'),
|
|
201
|
+
},
|
|
202
|
+
});
|
|
182
203
|
|
|
183
|
-
|
|
184
|
-
|
|
204
|
+
child.on('error', (err) => {
|
|
205
|
+
reject(new Error(`Failed to spawn grafema-orchestrator: ${err.message}`));
|
|
206
|
+
});
|
|
185
207
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
}
|
|
190
|
-
info('');
|
|
191
|
-
info(renderer ? renderer.finish(elapsedSeconds) : `Analysis complete in ${elapsedSeconds.toFixed(2)}s`);
|
|
192
|
-
info(` Nodes: ${stats.nodeCount}`);
|
|
193
|
-
info(` Edges: ${stats.edgeCount}`);
|
|
208
|
+
child.on('close', (code) => {
|
|
209
|
+
resolvePromise(code ?? 1);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
194
212
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
213
|
+
if (exitCode === 0) {
|
|
214
|
+
const elapsedSeconds = (Date.now() - startTime) / 1000;
|
|
215
|
+
const stats = await fetchNodeEdgeCounts(backend);
|
|
198
216
|
|
|
199
|
-
// Print summary if there are any issues
|
|
200
|
-
if (diagnostics.count() > 0) {
|
|
201
217
|
info('');
|
|
202
|
-
info(
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
if (options.verbose) {
|
|
206
|
-
debug('');
|
|
207
|
-
debug(reporter.report({ format: 'text', includeSummary: false }));
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// Always write diagnostics.log (required for `grafema check` command)
|
|
212
|
-
const writer = new DiagnosticWriter();
|
|
213
|
-
await writer.write(diagnostics, grafemaDir);
|
|
214
|
-
if (options.debug) {
|
|
215
|
-
debug(`Diagnostics written to ${writer.getLogPath(grafemaDir)}`);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// Determine exit code based on severity
|
|
219
|
-
if (diagnostics.hasFatal()) {
|
|
220
|
-
exitCode = 1;
|
|
221
|
-
} else if (diagnostics.hasErrors()) {
|
|
222
|
-
exitCode = 2; // Completed with errors
|
|
218
|
+
info(`Analysis complete in ${elapsedSeconds.toFixed(2)}s`);
|
|
219
|
+
info(` Nodes: ${stats.nodeCount}`);
|
|
220
|
+
info(` Edges: ${stats.edgeCount}`);
|
|
223
221
|
} else {
|
|
224
|
-
exitCode = 0; // Success (maybe warnings)
|
|
225
|
-
}
|
|
226
|
-
} catch (e) {
|
|
227
|
-
const diagnostics = orchestrator.getDiagnostics();
|
|
228
|
-
const reporter = new DiagnosticReporter(diagnostics);
|
|
229
|
-
|
|
230
|
-
// Clear progress line in interactive mode
|
|
231
|
-
if (renderer && process.stdout.isTTY) {
|
|
232
|
-
process.stdout.write('\r\x1b[K');
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// Check if this is a strict mode failure (REG-332: structured output)
|
|
236
|
-
if (e instanceof StrictModeFailure) {
|
|
237
|
-
// Format ONLY from diagnostics, not from error.message
|
|
238
|
-
console.error('');
|
|
239
|
-
console.error(`✗ Strict mode: ${e.count} unresolved reference(s) found during ENRICHMENT.`);
|
|
240
222
|
console.error('');
|
|
241
|
-
console.error(
|
|
242
|
-
verbose: options.verbose,
|
|
243
|
-
suppressedCount: e.suppressedCount, // REG-332
|
|
244
|
-
}));
|
|
245
|
-
console.error('');
|
|
246
|
-
console.error('Run without --strict for graceful degradation, or fix the underlying issues.');
|
|
247
|
-
} else {
|
|
248
|
-
// Generic error handling (non-strict)
|
|
249
|
-
const error = e instanceof Error ? e : new Error(String(e));
|
|
250
|
-
console.error('');
|
|
251
|
-
console.error(`✗ Analysis failed: ${error.message}`);
|
|
252
|
-
console.error('');
|
|
253
|
-
console.error('→ Run with --debug for detailed diagnostics');
|
|
254
|
-
|
|
255
|
-
if (diagnostics.count() > 0) {
|
|
256
|
-
console.error('');
|
|
257
|
-
console.error(reporter.report({ format: 'text', includeSummary: true }));
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// Write diagnostics.log in debug mode even on failure
|
|
262
|
-
if (options.debug) {
|
|
263
|
-
const writer = new DiagnosticWriter();
|
|
264
|
-
await writer.write(diagnostics, grafemaDir);
|
|
265
|
-
console.error(`Diagnostics written to ${writer.getLogPath(grafemaDir)}`);
|
|
223
|
+
console.error(`Analysis failed with exit code ${exitCode}`);
|
|
266
224
|
}
|
|
267
|
-
|
|
225
|
+
} catch (e) {
|
|
226
|
+
const error = e instanceof Error ? e : new Error(String(e));
|
|
227
|
+
console.error('');
|
|
228
|
+
console.error(`Analysis failed: ${error.message}`);
|
|
268
229
|
exitCode = 1;
|
|
269
230
|
} finally {
|
|
270
|
-
// Stop stats polling
|
|
271
|
-
if (statsInterval) {
|
|
272
|
-
clearInterval(statsInterval);
|
|
273
|
-
statsInterval = null;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
231
|
if (backend.connected) {
|
|
277
232
|
await backend.close();
|
|
278
233
|
}
|
|
279
234
|
|
|
280
235
|
// Exit with appropriate code
|
|
281
|
-
// 0 = success, 1 = fatal, 2 = errors
|
|
282
236
|
exitWithCode(exitCode);
|
|
283
237
|
}
|
|
284
238
|
}
|
package/src/commands/check.ts
CHANGED
|
@@ -15,8 +15,8 @@ import {
|
|
|
15
15
|
GraphFreshnessChecker,
|
|
16
16
|
IncrementalReanalyzer,
|
|
17
17
|
DIAGNOSTIC_CATEGORIES,
|
|
18
|
-
} from '@grafema/
|
|
19
|
-
import type { GuaranteeGraph, DiagnosticCategoryKey } from '@grafema/
|
|
18
|
+
} from '@grafema/util';
|
|
19
|
+
import type { GuaranteeGraph, DiagnosticCategoryKey } from '@grafema/util';
|
|
20
20
|
import { exitWithError } from '../utils/errorFormatter.js';
|
|
21
21
|
|
|
22
22
|
|
|
@@ -31,7 +31,7 @@ const BUILT_IN_VALIDATORS: Record<string, { name: string; description: string; c
|
|
|
31
31
|
// }
|
|
32
32
|
};
|
|
33
33
|
|
|
34
|
-
// Re-export for backward compatibility (deprecated - import from @grafema/
|
|
34
|
+
// Re-export for backward compatibility (deprecated - import from @grafema/util instead)
|
|
35
35
|
export { DIAGNOSTIC_CATEGORIES as CHECK_CATEGORIES };
|
|
36
36
|
|
|
37
37
|
export const checkCommand = new Command('check')
|
|
@@ -132,7 +132,7 @@ Examples:
|
|
|
132
132
|
exitWithError('No graph database found', ['Run: grafema analyze']);
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
-
const backend = new RFDBServerBackend({ dbPath });
|
|
135
|
+
const backend = new RFDBServerBackend({ dbPath, clientName: 'cli' });
|
|
136
136
|
await backend.connect();
|
|
137
137
|
|
|
138
138
|
// Check graph freshness
|
|
@@ -287,7 +287,7 @@ async function runBuiltInValidator(
|
|
|
287
287
|
exitWithError('No graph database found', ['Run: grafema analyze']);
|
|
288
288
|
}
|
|
289
289
|
|
|
290
|
-
const backend = new RFDBServerBackend({ dbPath });
|
|
290
|
+
const backend = new RFDBServerBackend({ dbPath, clientName: 'cli' });
|
|
291
291
|
await backend.connect();
|
|
292
292
|
|
|
293
293
|
// Check graph freshness
|
package/src/commands/context.ts
CHANGED
|
@@ -21,8 +21,8 @@ import {
|
|
|
21
21
|
getNodeDisplayName,
|
|
22
22
|
formatEdgeMetadata,
|
|
23
23
|
STRUCTURAL_EDGE_TYPES,
|
|
24
|
-
} from '@grafema/
|
|
25
|
-
import type { NodeContext, EdgeGroup } from '@grafema/
|
|
24
|
+
} from '@grafema/util';
|
|
25
|
+
import type { NodeContext, EdgeGroup } from '@grafema/util';
|
|
26
26
|
import type { BaseNodeRecord } from '@grafema/types';
|
|
27
27
|
import { getCodePreview, formatCodePreview } from '../utils/codePreview.js';
|
|
28
28
|
import { formatLocation } from '../utils/formatNode.js';
|
|
@@ -79,7 +79,7 @@ Examples:
|
|
|
79
79
|
exitWithError('No graph database found', ['Run: grafema analyze']);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
const backend = new RFDBServerBackend({ dbPath });
|
|
82
|
+
const backend = new RFDBServerBackend({ dbPath, clientName: 'cli' });
|
|
83
83
|
await backend.connect();
|
|
84
84
|
|
|
85
85
|
const spinner = new Spinner('Loading context...');
|
package/src/commands/coverage.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import { Command } from 'commander';
|
|
11
11
|
import { resolve, join } from 'path';
|
|
12
12
|
import { existsSync } from 'fs';
|
|
13
|
-
import { RFDBServerBackend, CoverageAnalyzer, type CoverageResult } from '@grafema/
|
|
13
|
+
import { RFDBServerBackend, CoverageAnalyzer, type CoverageResult } from '@grafema/util';
|
|
14
14
|
import { exitWithError } from '../utils/errorFormatter.js';
|
|
15
15
|
|
|
16
16
|
export const coverageCommand = new Command('coverage')
|
|
@@ -34,7 +34,7 @@ Examples:
|
|
|
34
34
|
exitWithError('No graph database found', ['Run: grafema analyze']);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
const backend = new RFDBServerBackend({ dbPath });
|
|
37
|
+
const backend = new RFDBServerBackend({ dbPath, clientName: 'cli' });
|
|
38
38
|
await backend.connect();
|
|
39
39
|
|
|
40
40
|
try {
|