@plebeiantech/lat.md 0.12.3-fork.2 → 0.12.3-fork.20
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 +31 -2
- package/dist/src/cli/agent-invocation.d.ts +6 -0
- package/dist/src/cli/agent-invocation.js +23 -0
- package/dist/src/cli/checklist-menu.d.ts +2 -1
- package/dist/src/cli/checklist-menu.js +3 -2
- package/dist/src/cli/comment-guard.d.ts +14 -0
- package/dist/src/cli/comment-guard.js +10 -33
- package/dist/src/cli/comment-reminder.d.ts +65 -6
- package/dist/src/cli/comment-reminder.js +164 -28
- package/dist/src/cli/fork-instructions.d.ts +20 -0
- package/dist/src/cli/fork-instructions.js +184 -0
- package/dist/src/cli/fork-scaffold.d.ts +106 -0
- package/dist/src/cli/fork-scaffold.js +490 -0
- package/dist/src/cli/graph.d.ts +1 -1
- package/dist/src/cli/hook.d.ts +26 -0
- package/dist/src/cli/hook.js +118 -46
- package/dist/src/cli/index.js +166 -64
- package/dist/src/cli/init-preferences.d.ts +4 -0
- package/dist/src/cli/init-preferences.js +36 -0
- package/dist/src/cli/init.d.ts +2 -1
- package/dist/src/cli/init.js +107 -50
- package/dist/src/cli/reindex.d.ts +1 -1
- package/dist/src/cli/reindex.js +7 -10
- package/dist/src/cli/search.d.ts +14 -4
- package/dist/src/cli/search.js +116 -100
- package/dist/src/cli/ui-build-server.d.ts +12 -0
- package/dist/src/cli/ui-build-server.js +26 -0
- package/dist/src/cli/ui-build.d.ts +4 -0
- package/dist/src/cli/ui-build.js +13 -0
- package/dist/src/cli/ui.d.ts +1 -1
- package/dist/src/cli/ui.js +18 -2
- package/dist/src/fork/antigravity-hook.d.ts +47 -0
- package/dist/src/fork/antigravity-hook.js +424 -0
- package/dist/src/fork/antigravity-init.d.ts +17 -0
- package/dist/src/fork/antigravity-init.js +124 -0
- package/dist/src/fork/upstream-drift-cli.js +2 -0
- package/dist/src/fork/upstream-drift.d.ts +26 -0
- package/dist/src/fork/upstream-drift.js +185 -0
- package/dist/src/fork/upstream-guard-cli.d.ts +1 -0
- package/dist/src/fork/upstream-guard-cli.js +2 -0
- package/dist/src/fork/upstream-guard.d.ts +72 -0
- package/dist/src/fork/upstream-guard.js +445 -0
- package/dist/src/graph-export.d.ts +2 -0
- package/dist/src/graph-export.js +38 -19
- package/dist/src/knowledge/claude-memory.d.ts +1 -0
- package/dist/src/knowledge/claude-memory.js +33 -4
- package/dist/src/knowledge/index.js +2 -2
- package/dist/src/mcp/server.js +34 -18
- package/dist/src/search/cache.d.ts +3 -0
- package/dist/src/search/cache.js +104 -0
- package/dist/src/search/chunks.d.ts +23 -0
- package/dist/src/search/chunks.js +197 -0
- package/dist/src/search/db.d.ts +28 -16
- package/dist/src/search/db.js +106 -40
- package/dist/src/search/embedder.d.ts +2 -1
- package/dist/src/search/embedder.js +7 -6
- package/dist/src/search/index.d.ts +6 -2
- package/dist/src/search/index.js +176 -53
- package/dist/src/search/lexical.d.ts +6 -0
- package/dist/src/search/lexical.js +36 -0
- package/dist/src/search/lock.d.ts +5 -0
- package/dist/src/search/lock.js +45 -0
- package/dist/src/search/query.d.ts +26 -0
- package/dist/src/search/query.js +103 -0
- package/dist/src/search/search.d.ts +17 -7
- package/dist/src/search/search.js +164 -14
- package/dist/src/search/types.d.ts +15 -0
- package/dist/src/search/types.js +1 -0
- package/dist/src/view/client/assets/GraphView-Dij8mAA_.js +456 -0
- package/dist/src/view/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/src/view/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/src/view/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/src/view/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/src/view/client/assets/MarkdownEditor-88Wbt0M1.js +28 -0
- package/dist/src/view/client/assets/OrbitControls-DwcpQNja.js +1 -0
- package/dist/src/view/client/assets/STLLoader-CLWTKt5i.js +1 -0
- package/dist/src/view/client/assets/_commonjsHelpers-CqkleIqs.js +1 -0
- package/dist/src/view/client/assets/abnfDiagram-VCTEODGH-y0DlYa8E.js +1 -0
- package/dist/src/view/client/assets/arc-FlMu8dnO.js +1 -0
- package/dist/src/view/client/assets/architectureDiagram-5GKGNRK7-DA_uWZW1.js +36 -0
- package/dist/src/view/client/assets/blockDiagram-I7D4REHJ-BHQ5LU85.js +129 -0
- package/dist/src/view/client/assets/c4Diagram-7LVT6UL2-BRucKCt2.js +38 -0
- package/dist/src/view/client/assets/channel-BgDNA_Ay.js +1 -0
- package/dist/src/view/client/assets/chunk-2Q5K7J3B-BJPcFivt.js +1 -0
- package/dist/src/view/client/assets/chunk-5VM5RSS4-v2q99bGz.js +15 -0
- package/dist/src/view/client/assets/chunk-F27PBJKO-CcHOuJCs.js +1 -0
- package/dist/src/view/client/assets/chunk-IMKFNOWR-DNxYuJNq.js +231 -0
- package/dist/src/view/client/assets/chunk-JWPE2WC7-C0eHKvLW.js +1 -0
- package/dist/src/view/client/assets/chunk-POPQ4Y6H-57CWp2Ve.js +1 -0
- package/dist/src/view/client/assets/chunk-SVP7TREG-BqcoxIJw.js +88 -0
- package/dist/src/view/client/assets/chunk-TICWLB2K-DRUJR5zH.js +206 -0
- package/dist/src/view/client/assets/chunk-XXDRQBXY-Dez0oRoM.js +1 -0
- package/dist/src/view/client/assets/classDiagram-ZZMXUADV-CFZ_Sgh5.js +1 -0
- package/dist/src/view/client/assets/classDiagram-v2-VYDZK3BY-CFZ_Sgh5.js +1 -0
- package/dist/src/view/client/assets/cose-bilkent-JH36ORCC-BHtud6Hg.js +1 -0
- package/dist/src/view/client/assets/cynefin-OW5HDTMX-BjBW8VGk.js +166 -0
- package/dist/src/view/client/assets/cynefinDiagram-5FMLGOSQ-DwGuD7oF.js +62 -0
- package/dist/src/view/client/assets/cytoscape.esm-DzSz-X2X.js +321 -0
- package/dist/src/view/client/assets/dagre-GXQ25YYZ-C5zSlGK9.js +4 -0
- package/dist/src/view/client/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/src/view/client/assets/diagram-S7CK7UJ4-C_NhA3bj.js +30 -0
- package/dist/src/view/client/assets/diagram-UQ7AKVKN-az7QPYNb.js +41 -0
- package/dist/src/view/client/assets/diagram-VSXAHHWV-BRvDuM8_.js +3 -0
- package/dist/src/view/client/assets/diagram-VX7I27RA-BWLgF6S-.js +24 -0
- package/dist/src/view/client/assets/diagram-Z3DM3KII-DV3d6mL5.js +24 -0
- package/dist/src/view/client/assets/ebnfDiagram-PWID7BFC-yUXrEAvK.js +1 -0
- package/dist/src/view/client/assets/erDiagram-RLTQ6QDP-D35FN1Pt.js +99 -0
- package/dist/src/view/client/assets/flowDiagram-HODETNUW-BciZqsjT.js +168 -0
- package/dist/src/view/client/assets/ganttDiagram-EL5Y4UJY-BysPGgXS.js +292 -0
- package/dist/src/view/client/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dist/src/view/client/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dist/src/view/client/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist/src/view/client/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/src/view/client/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
- package/dist/src/view/client/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
- package/dist/src/view/client/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
- package/dist/src/view/client/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/src/view/client/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
- package/dist/src/view/client/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
- package/dist/src/view/client/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dist/src/view/client/assets/gitGraphDiagram-WWUBYQGX-C3DdJ5xG.js +106 -0
- package/dist/src/view/client/assets/index-BnENo9bV.js +1 -0
- package/dist/src/view/client/assets/index-CJokoRSp.js +13 -0
- package/dist/src/view/client/assets/index-DG0Ez15D.css +1 -0
- package/dist/src/view/client/assets/infoDiagram-27XIBGKW-D3HZrDRb.js +2 -0
- package/dist/src/view/client/assets/init-Gi6I4Gst.js +1 -0
- package/dist/src/view/client/assets/ishikawaDiagram-5VMMS53U-BXyVIXTU.js +70 -0
- package/dist/src/view/client/assets/journeyDiagram-3NMN7TZE-D4-1NxVU.js +139 -0
- package/dist/src/view/client/assets/kanban-definition-UXKFOSKX-4Gu_5yBA.js +89 -0
- package/dist/src/view/client/assets/katex-HP8lGamR.js +257 -0
- package/dist/src/view/client/assets/layout-Jf1K3TMM.js +1 -0
- package/dist/src/view/client/assets/linear-DWfwzUT_.js +1 -0
- package/dist/src/view/client/assets/logo-RR_KBOAT.svg +149 -0
- package/dist/src/view/client/assets/maplibre-gl-CDX6Zuow.js +800 -0
- package/dist/src/view/client/assets/mermaid.core-DMx_DAl8.js +310 -0
- package/dist/src/view/client/assets/mindmap-definition-YA3MSWOX-8pxY_RWi.js +96 -0
- package/dist/src/view/client/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/src/view/client/assets/pegDiagram-XKGWAZYB-DNAw_O5t.js +1 -0
- package/dist/src/view/client/assets/pieDiagram-E7YTZNPT-uuvRCDkC.js +39 -0
- package/dist/src/view/client/assets/quadrantDiagram-AXDQQJYC-BER2O4Aq.js +7 -0
- package/dist/src/view/client/assets/railroadDiagram-O6MQD6OU-CxEsJ_0n.js +1 -0
- package/dist/src/view/client/assets/requirementDiagram-BXWQKSXE-yS9rspca.js +84 -0
- package/dist/src/view/client/assets/sankeyDiagram-P5KCCOFB-Bqt70a2j.js +40 -0
- package/dist/src/view/client/assets/sequenceDiagram-WJ2MYXX4-BvOOEJNr.js +162 -0
- package/dist/src/view/client/assets/sizeCapture-INFHLROL-CvO_Pjjo.js +1 -0
- package/dist/src/view/client/assets/stateDiagram-D77RDMKH-KLmVOZkq.js +1 -0
- package/dist/src/view/client/assets/stateDiagram-v2-MP3YSRHH-KCS8Mdzu.js +1 -0
- package/dist/src/view/client/assets/swimlanes-42K2YHIH-DC1r4_sq.js +1 -0
- package/dist/src/view/client/assets/swimlanesDiagram-VR7AAH4N-B2TcAwis.js +8 -0
- package/dist/src/view/client/assets/three.module-PDSP0dbZ.js +4108 -0
- package/dist/src/view/client/assets/timeline-definition-24CTP7MA-ChXLOuBL.js +120 -0
- package/dist/src/view/client/assets/vennDiagram-4TSXK5OY-D9_h25-Y.js +34 -0
- package/dist/src/view/client/assets/wardleyDiagram-VM6X3IG4-CsQJGGW0.js +78 -0
- package/dist/src/view/client/assets/xychartDiagram-S5SC5T6Z-DGMuPMlm.js +7 -0
- package/dist/src/view/client/index.html +2 -2
- package/dist/src/view/client-shell.d.ts +2 -0
- package/dist/src/view/client-shell.js +5 -0
- package/dist/src/view/diagnostics.d.ts +3 -2
- package/dist/src/view/diagnostics.js +49 -58
- package/dist/src/view/document-edit.d.ts +8 -0
- package/dist/src/view/document-edit.js +25 -0
- package/dist/src/view/document-route.d.ts +14 -0
- package/dist/src/view/document-route.js +126 -0
- package/dist/src/view/document-tree.d.ts +18 -0
- package/dist/src/view/document-tree.js +139 -0
- package/dist/src/view/external-document-tree.d.ts +3 -0
- package/dist/src/view/external-document-tree.js +674 -0
- package/dist/src/view/git-diff.js +205 -1
- package/dist/src/view/git.js +1 -1
- package/dist/src/view/graph.d.ts +7 -0
- package/dist/src/view/graph.js +267 -0
- package/dist/src/view/highlight.d.ts +10 -2
- package/dist/src/view/highlight.js +4547 -1363
- package/dist/src/view/markdown.d.ts +8 -3
- package/dist/src/view/markdown.js +308 -41
- package/dist/src/view/preindexed-search.d.ts +15 -0
- package/dist/src/view/preindexed-search.js +25 -0
- package/dist/src/view/protocol.d.ts +95 -6
- package/dist/src/view/protocol.js +1 -1
- package/dist/src/view/publication.d.ts +2 -0
- package/dist/src/view/publication.js +78 -0
- package/dist/src/view/references.d.ts +13 -26
- package/dist/src/view/references.js +150 -119
- package/dist/src/view/repository.d.ts +18 -5
- package/dist/src/view/repository.js +269 -27
- package/dist/src/view/request-security.d.ts +5 -0
- package/dist/src/view/request-security.js +46 -0
- package/dist/src/view/search-result.d.ts +4 -0
- package/dist/src/view/search-result.js +25 -0
- package/dist/src/view/search.d.ts +7 -2
- package/dist/src/view/search.js +23 -33
- package/dist/src/view/server-build.d.ts +21 -0
- package/dist/src/view/server-build.js +145 -0
- package/dist/src/view/server-deployment.d.ts +31 -0
- package/dist/src/view/server-deployment.js +94 -0
- package/dist/src/view/server-index-worker.d.ts +6 -0
- package/dist/src/view/server-index-worker.js +14 -0
- package/dist/src/view/server.d.ts +14 -2
- package/dist/src/view/server.js +254 -51
- package/dist/src/view/source-target.d.ts +10 -0
- package/dist/src/view/source-target.js +43 -0
- package/dist/src/view/static-build.d.ts +32 -0
- package/dist/src/view/static-build.js +741 -0
- package/dist/src/view/static-protocol.d.ts +47 -0
- package/dist/src/view/static-protocol.js +15 -0
- package/dist/src/view/store.d.ts +26 -3
- package/dist/src/view/store.js +325 -44
- package/dist/src/view/table-of-contents.d.ts +9 -0
- package/dist/src/view/table-of-contents.js +83 -0
- package/dist/src/view/vercel-build.d.ts +24 -0
- package/dist/src/view/vercel-build.js +140 -0
- package/dist/src/view/vercel-server-build.d.ts +10 -0
- package/dist/src/view/vercel-server-build.js +61 -0
- package/dist/vendor/lat.md-server/cli.d.ts +2 -0
- package/dist/vendor/lat.md-server/cli.js +12 -0
- package/dist/vendor/lat.md-server/index.d.ts +38 -0
- package/dist/vendor/lat.md-server/index.js +128 -0
- package/package.json +72 -25
- package/plugins/lat-md/README.md +61 -0
- package/plugins/lat-md/hooks.json +38 -0
- package/plugins/lat-md/plugin.json +9 -0
- package/plugins/lat-md/rules/AGENTS.md +118 -0
- package/plugins/lat-md/skills/lat-md/SKILL.md +178 -0
- package/plugins/lat-md/skills/lat-md-conventions/SKILL.md +182 -0
- package/templates/AGENTS.md +19 -18
- package/templates/cursor-rules.md +14 -5
- package/templates/fork/conventions.md +173 -0
- package/templates/opencode-plugin.ts +9 -9
- package/templates/pi-extension.ts +11 -11
- package/templates/skill/SKILL.md +28 -17
- package/dist/src/cli/check-frontmatter.d.ts +0 -12
- package/dist/src/cli/check-frontmatter.js +0 -44
- package/dist/src/cli/check-mode.d.ts +0 -6
- package/dist/src/cli/check-mode.js +0 -303
- package/dist/src/cli/check-status.d.ts +0 -74
- package/dist/src/cli/check-status.js +0 -217
- package/dist/src/cli/check.d.ts +0 -45
- package/dist/src/cli/check.js +0 -777
- package/dist/src/cli/context.d.ts +0 -11
- package/dist/src/cli/context.js +0 -58
- package/dist/src/cli/expand.d.ts +0 -8
- package/dist/src/cli/expand.js +0 -94
- package/dist/src/cli/gen-index.d.ts +0 -45
- package/dist/src/cli/gen-index.js +0 -235
- package/dist/src/cli/link-scheme.d.ts +0 -54
- package/dist/src/cli/link-scheme.js +0 -101
- package/dist/src/cli/locate.d.ts +0 -2
- package/dist/src/cli/locate.js +0 -17
- package/dist/src/cli/refs.d.ts +0 -22
- package/dist/src/cli/refs.js +0 -229
- package/dist/src/cli/section.d.ts +0 -43
- package/dist/src/cli/section.js +0 -252
- package/dist/src/cli/select-menu.d.ts +0 -13
- package/dist/src/cli/select-menu.js +0 -100
- package/dist/src/code-refs.d.ts +0 -17
- package/dist/src/code-refs.js +0 -277
- package/dist/src/config.d.ts +0 -29
- package/dist/src/config.js +0 -83
- package/dist/src/context.d.ts +0 -23
- package/dist/src/context.js +0 -11
- package/dist/src/extensions/wiki-link/from-markdown.d.ts +0 -5
- package/dist/src/extensions/wiki-link/from-markdown.js +0 -34
- package/dist/src/extensions/wiki-link/index.d.ts +0 -4
- package/dist/src/extensions/wiki-link/index.js +0 -3
- package/dist/src/extensions/wiki-link/syntax.d.ts +0 -14
- package/dist/src/extensions/wiki-link/syntax.js +0 -121
- package/dist/src/extensions/wiki-link/to-markdown.d.ts +0 -5
- package/dist/src/extensions/wiki-link/to-markdown.js +0 -28
- package/dist/src/extensions/wiki-link/types.d.ts +0 -34
- package/dist/src/format.d.ts +0 -8
- package/dist/src/format.js +0 -43
- package/dist/src/init-version.d.ts +0 -10
- package/dist/src/init-version.js +0 -49
- package/dist/src/lattice.d.ts +0 -108
- package/dist/src/lattice.js +0 -816
- package/dist/src/parser.d.ts +0 -3
- package/dist/src/parser.js +0 -18
- package/dist/src/source-parser.d.ts +0 -27
- package/dist/src/source-parser.js +0 -916
- package/dist/src/untrusted.d.ts +0 -24
- package/dist/src/untrusted.js +0 -97
- package/dist/src/view/client/assets/index-B0n0u03y.css +0 -1
- package/dist/src/view/client/assets/index-xm2_px4q.js +0 -23
- package/dist/src/walk.d.ts +0 -18
- package/dist/src/walk.js +0 -27
- /package/dist/src/{extensions/wiki-link/types.js → fork/upstream-drift-cli.d.ts} +0 -0
|
@@ -1,916 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { dirname, join } from 'node:path';
|
|
3
|
-
import { createRequire } from 'node:module';
|
|
4
|
-
import { Parser, Language, } from 'web-tree-sitter';
|
|
5
|
-
// Lazy singleton for the parser
|
|
6
|
-
let parserReady = null;
|
|
7
|
-
let parserInstance = null;
|
|
8
|
-
const languages = new Map();
|
|
9
|
-
function wasmDir() {
|
|
10
|
-
const require = createRequire(import.meta.url);
|
|
11
|
-
const pkgPath = require.resolve('@repomix/tree-sitter-wasms/package.json');
|
|
12
|
-
return join(dirname(pkgPath), 'out');
|
|
13
|
-
}
|
|
14
|
-
async function ensureParser() {
|
|
15
|
-
if (!parserReady) {
|
|
16
|
-
parserReady = Parser.init();
|
|
17
|
-
}
|
|
18
|
-
await parserReady;
|
|
19
|
-
if (!parserInstance) {
|
|
20
|
-
parserInstance = new Parser();
|
|
21
|
-
}
|
|
22
|
-
return parserInstance;
|
|
23
|
-
}
|
|
24
|
-
/** Extension → tree-sitter WASM grammar mapping. This is the single source of
|
|
25
|
-
* truth for which source file extensions lat supports. */
|
|
26
|
-
const grammarMap = {
|
|
27
|
-
'.ts': 'tree-sitter-typescript.wasm',
|
|
28
|
-
'.tsx': 'tree-sitter-tsx.wasm',
|
|
29
|
-
'.js': 'tree-sitter-javascript.wasm',
|
|
30
|
-
'.jsx': 'tree-sitter-javascript.wasm',
|
|
31
|
-
'.py': 'tree-sitter-python.wasm',
|
|
32
|
-
'.rs': 'tree-sitter-rust.wasm',
|
|
33
|
-
'.go': 'tree-sitter-go.wasm',
|
|
34
|
-
'.c': 'tree-sitter-c.wasm',
|
|
35
|
-
'.h': 'tree-sitter-c.wasm',
|
|
36
|
-
};
|
|
37
|
-
/** All source file extensions that lat can parse (derived from grammarMap). */
|
|
38
|
-
export const SOURCE_EXTENSIONS = new Set(Object.keys(grammarMap));
|
|
39
|
-
async function getLanguage(ext) {
|
|
40
|
-
const wasmFile = grammarMap[ext];
|
|
41
|
-
if (!wasmFile)
|
|
42
|
-
return null;
|
|
43
|
-
// Ensure WASM runtime is initialized before loading languages
|
|
44
|
-
await ensureParser();
|
|
45
|
-
if (!languages.has(wasmFile)) {
|
|
46
|
-
const wasmPath = join(wasmDir(), wasmFile);
|
|
47
|
-
const lang = await Language.load(wasmPath);
|
|
48
|
-
languages.set(wasmFile, lang);
|
|
49
|
-
}
|
|
50
|
-
return languages.get(wasmFile);
|
|
51
|
-
}
|
|
52
|
-
function extractName(node) {
|
|
53
|
-
const nameNode = node.childForFieldName('name');
|
|
54
|
-
return nameNode ? nameNode.text : null;
|
|
55
|
-
}
|
|
56
|
-
function extractTsSymbols(tree) {
|
|
57
|
-
const symbols = [];
|
|
58
|
-
const root = tree.rootNode;
|
|
59
|
-
for (let i = 0; i < root.childCount; i++) {
|
|
60
|
-
let node = root.child(i);
|
|
61
|
-
// Unwrap export_statement to get the inner declaration
|
|
62
|
-
const isExport = node.type === 'export_statement';
|
|
63
|
-
if (isExport) {
|
|
64
|
-
const inner = node.namedChildren.find((c) => c.type === 'function_declaration' ||
|
|
65
|
-
c.type === 'class_declaration' ||
|
|
66
|
-
c.type === 'lexical_declaration' ||
|
|
67
|
-
c.type === 'type_alias_declaration' ||
|
|
68
|
-
c.type === 'interface_declaration' ||
|
|
69
|
-
c.type === 'abstract_class_declaration');
|
|
70
|
-
if (inner)
|
|
71
|
-
node = inner;
|
|
72
|
-
}
|
|
73
|
-
const startLine = node.startPosition.row + 1;
|
|
74
|
-
const endLine = node.endPosition.row + 1;
|
|
75
|
-
if (node.type === 'function_declaration' ||
|
|
76
|
-
node.type === 'generator_function_declaration') {
|
|
77
|
-
const name = extractName(node);
|
|
78
|
-
if (name) {
|
|
79
|
-
symbols.push({
|
|
80
|
-
name,
|
|
81
|
-
kind: 'function',
|
|
82
|
-
startLine,
|
|
83
|
-
endLine,
|
|
84
|
-
signature: firstLine(node.text),
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
else if (node.type === 'class_declaration' ||
|
|
89
|
-
node.type === 'abstract_class_declaration') {
|
|
90
|
-
const name = extractName(node);
|
|
91
|
-
if (name) {
|
|
92
|
-
symbols.push({
|
|
93
|
-
name,
|
|
94
|
-
kind: 'class',
|
|
95
|
-
startLine,
|
|
96
|
-
endLine,
|
|
97
|
-
signature: firstLine(node.text),
|
|
98
|
-
});
|
|
99
|
-
// Extract methods
|
|
100
|
-
const body = node.childForFieldName('body');
|
|
101
|
-
if (body) {
|
|
102
|
-
extractClassMethods(body, name, symbols);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
else if (node.type === 'lexical_declaration') {
|
|
107
|
-
// const/let declarations
|
|
108
|
-
for (const decl of node.namedChildren) {
|
|
109
|
-
if (decl.type === 'variable_declarator') {
|
|
110
|
-
const name = extractName(decl);
|
|
111
|
-
if (name) {
|
|
112
|
-
symbols.push({
|
|
113
|
-
name,
|
|
114
|
-
kind: 'const',
|
|
115
|
-
startLine,
|
|
116
|
-
endLine,
|
|
117
|
-
signature: firstLine(node.text),
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
else if (node.type === 'type_alias_declaration') {
|
|
124
|
-
const name = extractName(node);
|
|
125
|
-
if (name) {
|
|
126
|
-
symbols.push({
|
|
127
|
-
name,
|
|
128
|
-
kind: 'type',
|
|
129
|
-
startLine,
|
|
130
|
-
endLine,
|
|
131
|
-
signature: firstLine(node.text),
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
else if (node.type === 'interface_declaration') {
|
|
136
|
-
const name = extractName(node);
|
|
137
|
-
if (name) {
|
|
138
|
-
symbols.push({
|
|
139
|
-
name,
|
|
140
|
-
kind: 'interface',
|
|
141
|
-
startLine,
|
|
142
|
-
endLine,
|
|
143
|
-
signature: firstLine(node.text),
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
return symbols;
|
|
149
|
-
}
|
|
150
|
-
function extractClassMethods(body, className, symbols) {
|
|
151
|
-
for (let i = 0; i < body.namedChildCount; i++) {
|
|
152
|
-
const member = body.namedChild(i);
|
|
153
|
-
if (member.type === 'method_definition' ||
|
|
154
|
-
member.type === 'public_field_definition') {
|
|
155
|
-
const name = extractName(member);
|
|
156
|
-
if (name) {
|
|
157
|
-
symbols.push({
|
|
158
|
-
name,
|
|
159
|
-
kind: 'method',
|
|
160
|
-
parent: className,
|
|
161
|
-
startLine: member.startPosition.row + 1,
|
|
162
|
-
endLine: member.endPosition.row + 1,
|
|
163
|
-
signature: firstLine(member.text),
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
function extractPySymbols(tree) {
|
|
170
|
-
const symbols = [];
|
|
171
|
-
const root = tree.rootNode;
|
|
172
|
-
for (let i = 0; i < root.childCount; i++) {
|
|
173
|
-
const node = root.child(i);
|
|
174
|
-
const startLine = node.startPosition.row + 1;
|
|
175
|
-
const endLine = node.endPosition.row + 1;
|
|
176
|
-
// Unwrap decorated_definition to get the inner function/class
|
|
177
|
-
const inner = node.type === 'decorated_definition'
|
|
178
|
-
? node.childForFieldName('definition')
|
|
179
|
-
: node;
|
|
180
|
-
if (!inner)
|
|
181
|
-
continue;
|
|
182
|
-
if (inner.type === 'function_definition') {
|
|
183
|
-
const name = extractName(inner);
|
|
184
|
-
if (name) {
|
|
185
|
-
symbols.push({
|
|
186
|
-
name,
|
|
187
|
-
kind: 'function',
|
|
188
|
-
startLine,
|
|
189
|
-
endLine,
|
|
190
|
-
signature: firstLine(inner.text),
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
else if (inner.type === 'class_definition') {
|
|
195
|
-
const name = extractName(inner);
|
|
196
|
-
if (name) {
|
|
197
|
-
symbols.push({
|
|
198
|
-
name,
|
|
199
|
-
kind: 'class',
|
|
200
|
-
startLine,
|
|
201
|
-
endLine,
|
|
202
|
-
signature: firstLine(inner.text),
|
|
203
|
-
});
|
|
204
|
-
// Extract methods
|
|
205
|
-
const body = inner.childForFieldName('body');
|
|
206
|
-
if (body) {
|
|
207
|
-
for (let j = 0; j < body.namedChildCount; j++) {
|
|
208
|
-
let member = body.namedChild(j);
|
|
209
|
-
// Unwrap decorated methods
|
|
210
|
-
if (member.type === 'decorated_definition') {
|
|
211
|
-
member = member.childForFieldName('definition') ?? member;
|
|
212
|
-
}
|
|
213
|
-
if (member.type === 'function_definition') {
|
|
214
|
-
const methodName = extractName(member);
|
|
215
|
-
if (methodName) {
|
|
216
|
-
symbols.push({
|
|
217
|
-
name: methodName,
|
|
218
|
-
kind: 'method',
|
|
219
|
-
parent: name,
|
|
220
|
-
startLine: member.startPosition.row + 1,
|
|
221
|
-
endLine: member.endPosition.row + 1,
|
|
222
|
-
signature: firstLine(member.text),
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
else if (inner.type === 'expression_statement' &&
|
|
231
|
-
inner.namedChildCount === 1 &&
|
|
232
|
-
inner.namedChild(0).type === 'assignment') {
|
|
233
|
-
// Top-level assignment: FOO = ...
|
|
234
|
-
const assign = inner.namedChild(0);
|
|
235
|
-
const left = assign.childForFieldName('left');
|
|
236
|
-
if (left && left.type === 'identifier') {
|
|
237
|
-
symbols.push({
|
|
238
|
-
name: left.text,
|
|
239
|
-
kind: 'variable',
|
|
240
|
-
startLine,
|
|
241
|
-
endLine,
|
|
242
|
-
signature: firstLine(node.text),
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
return symbols;
|
|
248
|
-
}
|
|
249
|
-
function extractRustSymbols(tree) {
|
|
250
|
-
const symbols = [];
|
|
251
|
-
const root = tree.rootNode;
|
|
252
|
-
for (let i = 0; i < root.childCount; i++) {
|
|
253
|
-
const node = root.child(i);
|
|
254
|
-
const startLine = node.startPosition.row + 1;
|
|
255
|
-
const endLine = node.endPosition.row + 1;
|
|
256
|
-
if (node.type === 'function_item') {
|
|
257
|
-
const name = extractName(node);
|
|
258
|
-
if (name) {
|
|
259
|
-
symbols.push({
|
|
260
|
-
name,
|
|
261
|
-
kind: 'function',
|
|
262
|
-
startLine,
|
|
263
|
-
endLine,
|
|
264
|
-
signature: firstLine(node.text),
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
else if (node.type === 'struct_item') {
|
|
269
|
-
const name = extractName(node);
|
|
270
|
-
if (name) {
|
|
271
|
-
symbols.push({
|
|
272
|
-
name,
|
|
273
|
-
kind: 'class',
|
|
274
|
-
startLine,
|
|
275
|
-
endLine,
|
|
276
|
-
signature: firstLine(node.text),
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
else if (node.type === 'enum_item') {
|
|
281
|
-
const name = extractName(node);
|
|
282
|
-
if (name) {
|
|
283
|
-
symbols.push({
|
|
284
|
-
name,
|
|
285
|
-
kind: 'class',
|
|
286
|
-
startLine,
|
|
287
|
-
endLine,
|
|
288
|
-
signature: firstLine(node.text),
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
else if (node.type === 'trait_item') {
|
|
293
|
-
const name = extractName(node);
|
|
294
|
-
if (name) {
|
|
295
|
-
symbols.push({
|
|
296
|
-
name,
|
|
297
|
-
kind: 'interface',
|
|
298
|
-
startLine,
|
|
299
|
-
endLine,
|
|
300
|
-
signature: firstLine(node.text),
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
else if (node.type === 'impl_item') {
|
|
305
|
-
// impl Type { ... } or impl Trait for Type { ... }
|
|
306
|
-
const typeName = node.childForFieldName('type')?.text;
|
|
307
|
-
if (!typeName)
|
|
308
|
-
continue;
|
|
309
|
-
const body = node.childForFieldName('body');
|
|
310
|
-
if (!body)
|
|
311
|
-
continue;
|
|
312
|
-
for (let j = 0; j < body.namedChildCount; j++) {
|
|
313
|
-
const member = body.namedChild(j);
|
|
314
|
-
if (member.type === 'function_item') {
|
|
315
|
-
const name = extractName(member);
|
|
316
|
-
if (name) {
|
|
317
|
-
symbols.push({
|
|
318
|
-
name,
|
|
319
|
-
kind: 'method',
|
|
320
|
-
parent: typeName,
|
|
321
|
-
startLine: member.startPosition.row + 1,
|
|
322
|
-
endLine: member.endPosition.row + 1,
|
|
323
|
-
signature: firstLine(member.text),
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
else if (node.type === 'const_item') {
|
|
330
|
-
const name = extractName(node);
|
|
331
|
-
if (name) {
|
|
332
|
-
symbols.push({
|
|
333
|
-
name,
|
|
334
|
-
kind: 'const',
|
|
335
|
-
startLine,
|
|
336
|
-
endLine,
|
|
337
|
-
signature: firstLine(node.text),
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
else if (node.type === 'static_item') {
|
|
342
|
-
const name = extractName(node);
|
|
343
|
-
if (name) {
|
|
344
|
-
symbols.push({
|
|
345
|
-
name,
|
|
346
|
-
kind: 'variable',
|
|
347
|
-
startLine,
|
|
348
|
-
endLine,
|
|
349
|
-
signature: firstLine(node.text),
|
|
350
|
-
});
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
else if (node.type === 'type_item') {
|
|
354
|
-
const name = extractName(node);
|
|
355
|
-
if (name) {
|
|
356
|
-
symbols.push({
|
|
357
|
-
name,
|
|
358
|
-
kind: 'type',
|
|
359
|
-
startLine,
|
|
360
|
-
endLine,
|
|
361
|
-
signature: firstLine(node.text),
|
|
362
|
-
});
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
return symbols;
|
|
367
|
-
}
|
|
368
|
-
/**
|
|
369
|
-
* Extract the receiver type name from a Go method declaration's receiver node.
|
|
370
|
-
* Handles both value receivers (Greeter) and pointer receivers (*Greeter).
|
|
371
|
-
*/
|
|
372
|
-
function goReceiverType(receiverNode) {
|
|
373
|
-
const param = receiverNode.namedChild(0);
|
|
374
|
-
if (!param)
|
|
375
|
-
return null;
|
|
376
|
-
const typeNode = param.childForFieldName('type');
|
|
377
|
-
if (!typeNode)
|
|
378
|
-
return null;
|
|
379
|
-
// pointer_type -> child is the actual type name
|
|
380
|
-
if (typeNode.type === 'pointer_type') {
|
|
381
|
-
return typeNode.namedChild(0)?.text ?? null;
|
|
382
|
-
}
|
|
383
|
-
return typeNode.text;
|
|
384
|
-
}
|
|
385
|
-
function extractGoSymbols(tree) {
|
|
386
|
-
const symbols = [];
|
|
387
|
-
const root = tree.rootNode;
|
|
388
|
-
for (let i = 0; i < root.childCount; i++) {
|
|
389
|
-
const node = root.child(i);
|
|
390
|
-
const startLine = node.startPosition.row + 1;
|
|
391
|
-
const endLine = node.endPosition.row + 1;
|
|
392
|
-
if (node.type === 'function_declaration') {
|
|
393
|
-
const name = extractName(node);
|
|
394
|
-
if (name) {
|
|
395
|
-
symbols.push({
|
|
396
|
-
name,
|
|
397
|
-
kind: 'function',
|
|
398
|
-
startLine,
|
|
399
|
-
endLine,
|
|
400
|
-
signature: firstLine(node.text),
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
else if (node.type === 'method_declaration') {
|
|
405
|
-
const name = extractName(node);
|
|
406
|
-
const receiver = node.childForFieldName('receiver');
|
|
407
|
-
const typeName = receiver ? goReceiverType(receiver) : null;
|
|
408
|
-
if (name && typeName) {
|
|
409
|
-
symbols.push({
|
|
410
|
-
name,
|
|
411
|
-
kind: 'method',
|
|
412
|
-
parent: typeName,
|
|
413
|
-
startLine,
|
|
414
|
-
endLine,
|
|
415
|
-
signature: firstLine(node.text),
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
else if (node.type === 'type_declaration') {
|
|
420
|
-
for (let j = 0; j < node.namedChildCount; j++) {
|
|
421
|
-
const spec = node.namedChild(j);
|
|
422
|
-
if (spec.type !== 'type_spec')
|
|
423
|
-
continue;
|
|
424
|
-
const name = spec.childForFieldName('name')?.text;
|
|
425
|
-
if (!name)
|
|
426
|
-
continue;
|
|
427
|
-
const typeNode = spec.childForFieldName('type');
|
|
428
|
-
const kind = typeNode?.type === 'interface_type' ? 'interface' : 'class';
|
|
429
|
-
symbols.push({
|
|
430
|
-
name,
|
|
431
|
-
kind,
|
|
432
|
-
startLine: spec.startPosition.row + 1,
|
|
433
|
-
endLine: spec.endPosition.row + 1,
|
|
434
|
-
signature: firstLine(node.text),
|
|
435
|
-
});
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
else if (node.type === 'const_declaration') {
|
|
439
|
-
for (let j = 0; j < node.namedChildCount; j++) {
|
|
440
|
-
const spec = node.namedChild(j);
|
|
441
|
-
if (spec.type !== 'const_spec')
|
|
442
|
-
continue;
|
|
443
|
-
const name = spec.childForFieldName('name')?.text;
|
|
444
|
-
if (name) {
|
|
445
|
-
symbols.push({
|
|
446
|
-
name,
|
|
447
|
-
kind: 'const',
|
|
448
|
-
startLine: spec.startPosition.row + 1,
|
|
449
|
-
endLine: spec.endPosition.row + 1,
|
|
450
|
-
signature: firstLine(node.text),
|
|
451
|
-
});
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
else if (node.type === 'var_declaration') {
|
|
456
|
-
for (let j = 0; j < node.namedChildCount; j++) {
|
|
457
|
-
const spec = node.namedChild(j);
|
|
458
|
-
if (spec.type !== 'var_spec')
|
|
459
|
-
continue;
|
|
460
|
-
const name = spec.childForFieldName('name')?.text;
|
|
461
|
-
if (name) {
|
|
462
|
-
symbols.push({
|
|
463
|
-
name,
|
|
464
|
-
kind: 'variable',
|
|
465
|
-
startLine: spec.startPosition.row + 1,
|
|
466
|
-
endLine: spec.endPosition.row + 1,
|
|
467
|
-
signature: firstLine(node.text),
|
|
468
|
-
});
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
return symbols;
|
|
474
|
-
}
|
|
475
|
-
/**
|
|
476
|
-
* Extract the declarator name from a C function_declarator node.
|
|
477
|
-
* Handles plain identifiers and pointer declarators (*name).
|
|
478
|
-
*/
|
|
479
|
-
function cFuncName(declarator) {
|
|
480
|
-
// Unwrap pointer_declarator layers (for functions returning pointers,
|
|
481
|
-
// e.g. `JSRuntime *JS_NewRuntime(void)` → pointer_declarator > function_declarator)
|
|
482
|
-
let node = declarator;
|
|
483
|
-
while (node.type === 'pointer_declarator') {
|
|
484
|
-
const child = node.childForFieldName('declarator');
|
|
485
|
-
if (!child)
|
|
486
|
-
return null;
|
|
487
|
-
node = child;
|
|
488
|
-
}
|
|
489
|
-
if (node.type === 'function_declarator') {
|
|
490
|
-
const inner = node.childForFieldName('declarator');
|
|
491
|
-
if (!inner)
|
|
492
|
-
return null;
|
|
493
|
-
if (inner.type === 'identifier')
|
|
494
|
-
return inner.text;
|
|
495
|
-
if (inner.type === 'pointer_declarator') {
|
|
496
|
-
// *name — dig through pointer layers
|
|
497
|
-
let cur = inner;
|
|
498
|
-
while (cur.type === 'pointer_declarator') {
|
|
499
|
-
const child = cur.childForFieldName('declarator');
|
|
500
|
-
if (!child)
|
|
501
|
-
return null;
|
|
502
|
-
cur = child;
|
|
503
|
-
}
|
|
504
|
-
return cur.type === 'identifier' ? cur.text : null;
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
return null;
|
|
508
|
-
}
|
|
509
|
-
/**
|
|
510
|
-
* Extract the variable name from a C init_declarator or plain declarator.
|
|
511
|
-
* Handles pointers like `*DEFAULT_NAME = "World"`.
|
|
512
|
-
*/
|
|
513
|
-
function cVarName(declarator) {
|
|
514
|
-
let node = declarator;
|
|
515
|
-
// Unwrap init_declarator to get the declarator part
|
|
516
|
-
if (node.type === 'init_declarator') {
|
|
517
|
-
const inner = node.childForFieldName('declarator');
|
|
518
|
-
if (!inner)
|
|
519
|
-
return null;
|
|
520
|
-
node = inner;
|
|
521
|
-
}
|
|
522
|
-
// Unwrap array_declarator (e.g. `char js_version[]`)
|
|
523
|
-
if (node.type === 'array_declarator') {
|
|
524
|
-
const inner = node.childForFieldName('declarator');
|
|
525
|
-
if (!inner)
|
|
526
|
-
return null;
|
|
527
|
-
node = inner;
|
|
528
|
-
}
|
|
529
|
-
if (node.type === 'identifier')
|
|
530
|
-
return node.text;
|
|
531
|
-
if (node.type === 'pointer_declarator') {
|
|
532
|
-
let cur = node;
|
|
533
|
-
while (cur.type === 'pointer_declarator') {
|
|
534
|
-
const child = cur.childForFieldName('declarator');
|
|
535
|
-
if (!child)
|
|
536
|
-
return null;
|
|
537
|
-
cur = child;
|
|
538
|
-
}
|
|
539
|
-
return cur.type === 'identifier' ? cur.text : null;
|
|
540
|
-
}
|
|
541
|
-
return null;
|
|
542
|
-
}
|
|
543
|
-
function extractCSymbols(tree) {
|
|
544
|
-
const symbols = [];
|
|
545
|
-
collectCNodes(tree.rootNode, symbols);
|
|
546
|
-
return symbols;
|
|
547
|
-
}
|
|
548
|
-
/**
|
|
549
|
-
* Walk C AST nodes, collecting symbols. Recurses into preprocessor
|
|
550
|
-
* conditional blocks (ifdef/ifndef/if), linkage specifications
|
|
551
|
-
* (extern "C" { ... }), and declaration lists so that include guards
|
|
552
|
-
* and conditional compilation don't hide declarations.
|
|
553
|
-
*
|
|
554
|
-
* For #if/#ifdef/#ifndef, only the "then" branch is traversed —
|
|
555
|
-
* preproc_else and preproc_elif children are skipped.
|
|
556
|
-
*/
|
|
557
|
-
function collectCNodes(parent, symbols) {
|
|
558
|
-
for (let i = 0; i < parent.childCount; i++) {
|
|
559
|
-
const node = parent.child(i);
|
|
560
|
-
const startLine = node.startPosition.row + 1;
|
|
561
|
-
const endLine = node.endPosition.row + 1;
|
|
562
|
-
if (node.type === 'function_definition') {
|
|
563
|
-
const declarator = node.childForFieldName('declarator');
|
|
564
|
-
const name = declarator ? cFuncName(declarator) : null;
|
|
565
|
-
if (name) {
|
|
566
|
-
symbols.push({
|
|
567
|
-
name,
|
|
568
|
-
kind: 'function',
|
|
569
|
-
startLine,
|
|
570
|
-
endLine,
|
|
571
|
-
signature: firstLine(node.text),
|
|
572
|
-
});
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
else if (node.type === 'struct_specifier') {
|
|
576
|
-
const name = extractName(node);
|
|
577
|
-
if (name) {
|
|
578
|
-
symbols.push({
|
|
579
|
-
name,
|
|
580
|
-
kind: 'class',
|
|
581
|
-
startLine,
|
|
582
|
-
endLine,
|
|
583
|
-
signature: firstLine(node.text),
|
|
584
|
-
});
|
|
585
|
-
collectCStructFields(node, name, symbols);
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
else if (node.type === 'enum_specifier') {
|
|
589
|
-
const name = extractName(node);
|
|
590
|
-
if (name) {
|
|
591
|
-
symbols.push({
|
|
592
|
-
name,
|
|
593
|
-
kind: 'class',
|
|
594
|
-
startLine,
|
|
595
|
-
endLine,
|
|
596
|
-
signature: firstLine(node.text),
|
|
597
|
-
});
|
|
598
|
-
}
|
|
599
|
-
collectCEnumMembers(node, symbols, name ?? undefined);
|
|
600
|
-
}
|
|
601
|
-
else if (node.type === 'type_definition') {
|
|
602
|
-
let declarator = node.childForFieldName('declarator');
|
|
603
|
-
// Unwrap pointer_declarator for pointer typedefs
|
|
604
|
-
// e.g. `typedef struct __JSValue *JSValue;`
|
|
605
|
-
while (declarator?.type === 'pointer_declarator') {
|
|
606
|
-
declarator = declarator.childForFieldName('declarator') ?? null;
|
|
607
|
-
}
|
|
608
|
-
const name = declarator?.type === 'type_identifier' ? declarator.text : null;
|
|
609
|
-
if (name) {
|
|
610
|
-
symbols.push({
|
|
611
|
-
name,
|
|
612
|
-
kind: 'type',
|
|
613
|
-
startLine,
|
|
614
|
-
endLine,
|
|
615
|
-
signature: firstLine(node.text),
|
|
616
|
-
});
|
|
617
|
-
}
|
|
618
|
-
for (const child of node.namedChildren) {
|
|
619
|
-
if (child.type === 'enum_specifier') {
|
|
620
|
-
collectCEnumMembers(child, symbols, name ?? extractName(child) ?? undefined);
|
|
621
|
-
}
|
|
622
|
-
else if (child.type === 'struct_specifier' && name) {
|
|
623
|
-
collectCStructFields(child, name, symbols);
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
else if (node.type === 'declaration') {
|
|
628
|
-
const declarator = node.childForFieldName('declarator');
|
|
629
|
-
// Try as function declaration first (e.g. `void greet(const char *name);`
|
|
630
|
-
// in headers), then fall back to variable.
|
|
631
|
-
const funcName = declarator ? cFuncName(declarator) : null;
|
|
632
|
-
if (funcName) {
|
|
633
|
-
symbols.push({
|
|
634
|
-
name: funcName,
|
|
635
|
-
kind: 'function',
|
|
636
|
-
startLine,
|
|
637
|
-
endLine,
|
|
638
|
-
signature: firstLine(node.text),
|
|
639
|
-
});
|
|
640
|
-
}
|
|
641
|
-
else {
|
|
642
|
-
const name = declarator ? cVarName(declarator) : null;
|
|
643
|
-
if (name) {
|
|
644
|
-
symbols.push({
|
|
645
|
-
name,
|
|
646
|
-
kind: 'variable',
|
|
647
|
-
startLine,
|
|
648
|
-
endLine,
|
|
649
|
-
signature: firstLine(node.text),
|
|
650
|
-
});
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
else if (node.type === 'preproc_def' ||
|
|
655
|
-
node.type === 'preproc_function_def') {
|
|
656
|
-
const name = extractName(node);
|
|
657
|
-
if (name) {
|
|
658
|
-
symbols.push({
|
|
659
|
-
name,
|
|
660
|
-
kind: 'const',
|
|
661
|
-
startLine,
|
|
662
|
-
endLine,
|
|
663
|
-
signature: firstLine(node.text),
|
|
664
|
-
});
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
else if (node.type === 'preproc_ifdef' ||
|
|
668
|
-
node.type === 'preproc_ifndef' ||
|
|
669
|
-
node.type === 'preproc_if') {
|
|
670
|
-
// Recurse into conditional blocks (then-branch only).
|
|
671
|
-
// preproc_else / preproc_elif children are skipped.
|
|
672
|
-
collectCNodes(node, symbols);
|
|
673
|
-
}
|
|
674
|
-
else if (node.type === 'linkage_specification' ||
|
|
675
|
-
node.type === 'declaration_list') {
|
|
676
|
-
// extern "C" { ... } wraps declarations in linkage_specification
|
|
677
|
-
// containing a declaration_list — recurse through both.
|
|
678
|
-
collectCNodes(node, symbols);
|
|
679
|
-
}
|
|
680
|
-
else if (node.type === 'preproc_else' || node.type === 'preproc_elif') {
|
|
681
|
-
// Skip else/elif branches of preprocessor conditionals.
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
function collectCEnumMembers(enumSpecifier, symbols, enumName) {
|
|
686
|
-
for (const child of enumSpecifier.namedChildren) {
|
|
687
|
-
if (child.type !== 'enumerator_list')
|
|
688
|
-
continue;
|
|
689
|
-
for (const enumerator of child.namedChildren) {
|
|
690
|
-
if (enumerator.type !== 'enumerator')
|
|
691
|
-
continue;
|
|
692
|
-
const name = extractName(enumerator);
|
|
693
|
-
if (!name)
|
|
694
|
-
continue;
|
|
695
|
-
const sym = {
|
|
696
|
-
name,
|
|
697
|
-
kind: 'const',
|
|
698
|
-
startLine: enumerator.startPosition.row + 1,
|
|
699
|
-
endLine: enumerator.endPosition.row + 1,
|
|
700
|
-
signature: firstLine(enumerator.text),
|
|
701
|
-
};
|
|
702
|
-
// Emit without parent (standalone lookup like #GREEN)
|
|
703
|
-
symbols.push(sym);
|
|
704
|
-
// Also emit with parent so #Color#GREEN works
|
|
705
|
-
if (enumName) {
|
|
706
|
-
symbols.push({ ...sym, parent: enumName });
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
/**
|
|
712
|
-
* Extract struct field/member names from a struct_specifier and emit
|
|
713
|
-
* them as symbols with `parent` set to the struct name.
|
|
714
|
-
* Handles plain identifiers, pointers, arrays, bitfields, and
|
|
715
|
-
* anonymous union/struct members (recurses into them).
|
|
716
|
-
*/
|
|
717
|
-
function collectCStructFields(structNode, structName, symbols) {
|
|
718
|
-
for (const child of structNode.namedChildren) {
|
|
719
|
-
if (child.type !== 'field_declaration_list')
|
|
720
|
-
continue;
|
|
721
|
-
collectFieldsFromList(child, structName, symbols);
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
function collectFieldsFromList(fieldList, structName, symbols) {
|
|
725
|
-
for (const field of fieldList.namedChildren) {
|
|
726
|
-
if (field.type !== 'field_declaration')
|
|
727
|
-
continue;
|
|
728
|
-
const declarator = field.childForFieldName('declarator');
|
|
729
|
-
if (declarator) {
|
|
730
|
-
const name = cFieldName(declarator);
|
|
731
|
-
if (!name)
|
|
732
|
-
continue;
|
|
733
|
-
symbols.push({
|
|
734
|
-
name,
|
|
735
|
-
kind: 'variable',
|
|
736
|
-
parent: structName,
|
|
737
|
-
startLine: field.startPosition.row + 1,
|
|
738
|
-
endLine: field.endPosition.row + 1,
|
|
739
|
-
signature: firstLine(field.text),
|
|
740
|
-
});
|
|
741
|
-
}
|
|
742
|
-
else {
|
|
743
|
-
// Anonymous union/struct member — recurse into its field list
|
|
744
|
-
for (const inner of field.namedChildren) {
|
|
745
|
-
if ((inner.type === 'union_specifier' ||
|
|
746
|
-
inner.type === 'struct_specifier') &&
|
|
747
|
-
!extractName(inner)) {
|
|
748
|
-
for (const sub of inner.namedChildren) {
|
|
749
|
-
if (sub.type === 'field_declaration_list') {
|
|
750
|
-
collectFieldsFromList(sub, structName, symbols);
|
|
751
|
-
}
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
/**
|
|
759
|
-
* Extract the field name from a C struct field declarator.
|
|
760
|
-
* Handles field_identifier, pointer_declarator, array_declarator,
|
|
761
|
-
* and bitfield_clause (e.g. `uint8_t extensible : 1`).
|
|
762
|
-
*/
|
|
763
|
-
function cFieldName(declarator) {
|
|
764
|
-
let node = declarator;
|
|
765
|
-
// Unwrap pointer_declarator layers (e.g. `JSShape *shape`)
|
|
766
|
-
while (node.type === 'pointer_declarator') {
|
|
767
|
-
const child = node.childForFieldName('declarator');
|
|
768
|
-
if (!child)
|
|
769
|
-
return null;
|
|
770
|
-
node = child;
|
|
771
|
-
}
|
|
772
|
-
// Unwrap array_declarator (e.g. `char name[32]`)
|
|
773
|
-
if (node.type === 'array_declarator') {
|
|
774
|
-
const inner = node.childForFieldName('declarator');
|
|
775
|
-
if (!inner)
|
|
776
|
-
return null;
|
|
777
|
-
node = inner;
|
|
778
|
-
}
|
|
779
|
-
if (node.type === 'field_identifier')
|
|
780
|
-
return node.text;
|
|
781
|
-
return null;
|
|
782
|
-
}
|
|
783
|
-
function firstLine(text) {
|
|
784
|
-
const nl = text.indexOf('\n');
|
|
785
|
-
return nl === -1 ? text : text.slice(0, nl);
|
|
786
|
-
}
|
|
787
|
-
export async function parseSourceSymbols(filePath, content) {
|
|
788
|
-
const ext = filePath.match(/\.[^.]+$/)?.[0] ?? '';
|
|
789
|
-
const lang = await getLanguage(ext);
|
|
790
|
-
if (!lang)
|
|
791
|
-
return [];
|
|
792
|
-
const p = await ensureParser();
|
|
793
|
-
p.setLanguage(lang);
|
|
794
|
-
const tree = p.parse(content);
|
|
795
|
-
if (!tree)
|
|
796
|
-
return [];
|
|
797
|
-
try {
|
|
798
|
-
if (ext === '.py') {
|
|
799
|
-
return extractPySymbols(tree);
|
|
800
|
-
}
|
|
801
|
-
if (ext === '.rs') {
|
|
802
|
-
return extractRustSymbols(tree);
|
|
803
|
-
}
|
|
804
|
-
if (ext === '.go') {
|
|
805
|
-
return extractGoSymbols(tree);
|
|
806
|
-
}
|
|
807
|
-
if (ext === '.c' || ext === '.h') {
|
|
808
|
-
return extractCSymbols(tree);
|
|
809
|
-
}
|
|
810
|
-
return extractTsSymbols(tree);
|
|
811
|
-
}
|
|
812
|
-
finally {
|
|
813
|
-
tree.delete();
|
|
814
|
-
}
|
|
815
|
-
}
|
|
816
|
-
// Per-invocation cache for parsed source symbols, keyed by absolute file path.
|
|
817
|
-
// Prevents re-parsing the same file when multiple wiki links reference it
|
|
818
|
-
// (e.g. 20+ links to quickjs.c would otherwise parse a 60K-line file 20 times).
|
|
819
|
-
const symbolCache = new Map();
|
|
820
|
-
/** Clear the symbol cache. Call between top-level operations. */
|
|
821
|
-
export function clearSymbolCache() {
|
|
822
|
-
symbolCache.clear();
|
|
823
|
-
}
|
|
824
|
-
/**
|
|
825
|
-
* Check whether a source file path (relative to projectRoot) has a given symbol.
|
|
826
|
-
* Used by lat check to validate source code wiki links lazily.
|
|
827
|
-
*/
|
|
828
|
-
export async function resolveSourceSymbol(filePath, symbolPath, projectRoot) {
|
|
829
|
-
const absPath = join(projectRoot, filePath);
|
|
830
|
-
let cached = symbolCache.get(absPath);
|
|
831
|
-
if (!cached) {
|
|
832
|
-
let content;
|
|
833
|
-
try {
|
|
834
|
-
content = readFileSync(absPath, 'utf-8');
|
|
835
|
-
}
|
|
836
|
-
catch {
|
|
837
|
-
cached = { symbols: [] };
|
|
838
|
-
symbolCache.set(absPath, cached);
|
|
839
|
-
return { found: false, symbols: [] };
|
|
840
|
-
}
|
|
841
|
-
try {
|
|
842
|
-
const symbols = await parseSourceSymbols(filePath, content);
|
|
843
|
-
cached = { symbols };
|
|
844
|
-
}
|
|
845
|
-
catch (err) {
|
|
846
|
-
cached = {
|
|
847
|
-
symbols: [],
|
|
848
|
-
error: `failed to parse "${filePath}": ${err instanceof Error ? err.message : String(err)}`,
|
|
849
|
-
};
|
|
850
|
-
}
|
|
851
|
-
symbolCache.set(absPath, cached);
|
|
852
|
-
}
|
|
853
|
-
if (cached.error) {
|
|
854
|
-
return { found: false, symbols: cached.symbols, error: cached.error };
|
|
855
|
-
}
|
|
856
|
-
const { symbols } = cached;
|
|
857
|
-
const parts = symbolPath.split('#');
|
|
858
|
-
if (parts.length === 1) {
|
|
859
|
-
// Simple symbol: getConfigDir
|
|
860
|
-
const found = symbols.some((s) => s.name === parts[0] && !s.parent);
|
|
861
|
-
return { found, symbols };
|
|
862
|
-
}
|
|
863
|
-
if (parts.length === 2) {
|
|
864
|
-
// Nested symbol: MyClass#myMethod
|
|
865
|
-
const found = symbols.some((s) => s.name === parts[1] && s.parent === parts[0]);
|
|
866
|
-
return { found, symbols };
|
|
867
|
-
}
|
|
868
|
-
return { found: false, symbols };
|
|
869
|
-
}
|
|
870
|
-
/**
|
|
871
|
-
* Convert source symbols to Section objects for uniform handling.
|
|
872
|
-
*/
|
|
873
|
-
export function sourceSymbolsToSections(symbols, filePath) {
|
|
874
|
-
const sections = [];
|
|
875
|
-
const classMap = new Map();
|
|
876
|
-
for (const sym of symbols) {
|
|
877
|
-
if (sym.parent)
|
|
878
|
-
continue; // Handle methods after their class
|
|
879
|
-
const section = {
|
|
880
|
-
id: `${filePath}#${sym.name}`,
|
|
881
|
-
heading: sym.name,
|
|
882
|
-
depth: 1,
|
|
883
|
-
file: filePath,
|
|
884
|
-
filePath,
|
|
885
|
-
children: [],
|
|
886
|
-
startLine: sym.startLine,
|
|
887
|
-
endLine: sym.endLine,
|
|
888
|
-
firstParagraph: sym.signature,
|
|
889
|
-
};
|
|
890
|
-
sections.push(section);
|
|
891
|
-
if (sym.kind === 'class') {
|
|
892
|
-
classMap.set(sym.name, section);
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
|
-
// Add methods as children
|
|
896
|
-
for (const sym of symbols) {
|
|
897
|
-
if (!sym.parent)
|
|
898
|
-
continue;
|
|
899
|
-
const parentSection = classMap.get(sym.parent);
|
|
900
|
-
if (!parentSection)
|
|
901
|
-
continue;
|
|
902
|
-
const section = {
|
|
903
|
-
id: `${filePath}#${sym.parent}#${sym.name}`,
|
|
904
|
-
heading: sym.name,
|
|
905
|
-
depth: 2,
|
|
906
|
-
file: filePath,
|
|
907
|
-
filePath,
|
|
908
|
-
children: [],
|
|
909
|
-
startLine: sym.startLine,
|
|
910
|
-
endLine: sym.endLine,
|
|
911
|
-
firstParagraph: sym.signature,
|
|
912
|
-
};
|
|
913
|
-
parentSection.children.push(section);
|
|
914
|
-
}
|
|
915
|
-
return sections;
|
|
916
|
-
}
|