codebase-onboarder 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +275 -0
  3. package/bin/onboarder.js +14 -0
  4. package/bin/postinstall.js +6 -0
  5. package/cli/commands.js +436 -0
  6. package/cli/main.js +129 -0
  7. package/cli/prompt.js +101 -0
  8. package/cli/ui.js +55 -0
  9. package/cli/wizard.js +325 -0
  10. package/package.json +48 -0
  11. package/public/app.js +1339 -0
  12. package/public/index.html +455 -0
  13. package/public/js/about.js +284 -0
  14. package/public/js/aiDraft.js +163 -0
  15. package/public/js/analysisPanel.js +270 -0
  16. package/public/js/analysisReport.js +154 -0
  17. package/public/js/api.js +264 -0
  18. package/public/js/atlas.js +98 -0
  19. package/public/js/blameView.js +41 -0
  20. package/public/js/codeTab.js +256 -0
  21. package/public/js/codeViewer.js +184 -0
  22. package/public/js/components/FileChip.js +102 -0
  23. package/public/js/components/MetricSparkline.js +89 -0
  24. package/public/js/components/RiskBadge.js +105 -0
  25. package/public/js/deepAnalysisView.js +496 -0
  26. package/public/js/diagramPane.js +154 -0
  27. package/public/js/diffView.js +352 -0
  28. package/public/js/docsView.js +566 -0
  29. package/public/js/fileSourceBrowser.js +47 -0
  30. package/public/js/flameGraph.js +75 -0
  31. package/public/js/forceGraph.js +592 -0
  32. package/public/js/heatmap.js +185 -0
  33. package/public/js/highlight.js +122 -0
  34. package/public/js/html.js +50 -0
  35. package/public/js/insightsView.js +236 -0
  36. package/public/js/inspector.js +535 -0
  37. package/public/js/llm.js +345 -0
  38. package/public/js/mapView.js +159 -0
  39. package/public/js/markdown.js +119 -0
  40. package/public/js/mindmap.js +289 -0
  41. package/public/js/repoFiles.js +44 -0
  42. package/public/js/sbomView.js +142 -0
  43. package/public/js/scanCache.js +76 -0
  44. package/public/js/search.js +874 -0
  45. package/public/js/serverSettings.js +169 -0
  46. package/public/js/state.js +192 -0
  47. package/public/js/tour.js +17 -0
  48. package/public/js/transitions.js +15 -0
  49. package/public/js/tree.js +200 -0
  50. package/public/js/workflowsView.js +95 -0
  51. package/public/styles.css +2767 -0
  52. package/public/vendor/mermaid.min.js +3587 -0
  53. package/public/vendor/monaco/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  54. package/public/vendor/monaco/vs/base/worker/workerMain.js +31 -0
  55. package/public/vendor/monaco/vs/basic-languages/abap/abap.js +10 -0
  56. package/public/vendor/monaco/vs/basic-languages/apex/apex.js +10 -0
  57. package/public/vendor/monaco/vs/basic-languages/azcli/azcli.js +10 -0
  58. package/public/vendor/monaco/vs/basic-languages/bat/bat.js +10 -0
  59. package/public/vendor/monaco/vs/basic-languages/bicep/bicep.js +11 -0
  60. package/public/vendor/monaco/vs/basic-languages/cameligo/cameligo.js +10 -0
  61. package/public/vendor/monaco/vs/basic-languages/clojure/clojure.js +10 -0
  62. package/public/vendor/monaco/vs/basic-languages/coffee/coffee.js +10 -0
  63. package/public/vendor/monaco/vs/basic-languages/cpp/cpp.js +10 -0
  64. package/public/vendor/monaco/vs/basic-languages/csharp/csharp.js +10 -0
  65. package/public/vendor/monaco/vs/basic-languages/csp/csp.js +10 -0
  66. package/public/vendor/monaco/vs/basic-languages/css/css.js +12 -0
  67. package/public/vendor/monaco/vs/basic-languages/cypher/cypher.js +10 -0
  68. package/public/vendor/monaco/vs/basic-languages/dart/dart.js +10 -0
  69. package/public/vendor/monaco/vs/basic-languages/dockerfile/dockerfile.js +10 -0
  70. package/public/vendor/monaco/vs/basic-languages/ecl/ecl.js +10 -0
  71. package/public/vendor/monaco/vs/basic-languages/elixir/elixir.js +10 -0
  72. package/public/vendor/monaco/vs/basic-languages/flow9/flow9.js +10 -0
  73. package/public/vendor/monaco/vs/basic-languages/freemarker2/freemarker2.js +12 -0
  74. package/public/vendor/monaco/vs/basic-languages/fsharp/fsharp.js +10 -0
  75. package/public/vendor/monaco/vs/basic-languages/go/go.js +10 -0
  76. package/public/vendor/monaco/vs/basic-languages/graphql/graphql.js +10 -0
  77. package/public/vendor/monaco/vs/basic-languages/handlebars/handlebars.js +10 -0
  78. package/public/vendor/monaco/vs/basic-languages/hcl/hcl.js +10 -0
  79. package/public/vendor/monaco/vs/basic-languages/html/html.js +10 -0
  80. package/public/vendor/monaco/vs/basic-languages/ini/ini.js +10 -0
  81. package/public/vendor/monaco/vs/basic-languages/java/java.js +10 -0
  82. package/public/vendor/monaco/vs/basic-languages/javascript/javascript.js +10 -0
  83. package/public/vendor/monaco/vs/basic-languages/julia/julia.js +10 -0
  84. package/public/vendor/monaco/vs/basic-languages/kotlin/kotlin.js +10 -0
  85. package/public/vendor/monaco/vs/basic-languages/less/less.js +11 -0
  86. package/public/vendor/monaco/vs/basic-languages/lexon/lexon.js +10 -0
  87. package/public/vendor/monaco/vs/basic-languages/liquid/liquid.js +10 -0
  88. package/public/vendor/monaco/vs/basic-languages/lua/lua.js +10 -0
  89. package/public/vendor/monaco/vs/basic-languages/m3/m3.js +10 -0
  90. package/public/vendor/monaco/vs/basic-languages/markdown/markdown.js +10 -0
  91. package/public/vendor/monaco/vs/basic-languages/mdx/mdx.js +10 -0
  92. package/public/vendor/monaco/vs/basic-languages/mips/mips.js +10 -0
  93. package/public/vendor/monaco/vs/basic-languages/msdax/msdax.js +10 -0
  94. package/public/vendor/monaco/vs/basic-languages/mysql/mysql.js +10 -0
  95. package/public/vendor/monaco/vs/basic-languages/objective-c/objective-c.js +10 -0
  96. package/public/vendor/monaco/vs/basic-languages/pascal/pascal.js +10 -0
  97. package/public/vendor/monaco/vs/basic-languages/pascaligo/pascaligo.js +10 -0
  98. package/public/vendor/monaco/vs/basic-languages/perl/perl.js +10 -0
  99. package/public/vendor/monaco/vs/basic-languages/pgsql/pgsql.js +10 -0
  100. package/public/vendor/monaco/vs/basic-languages/php/php.js +10 -0
  101. package/public/vendor/monaco/vs/basic-languages/pla/pla.js +10 -0
  102. package/public/vendor/monaco/vs/basic-languages/postiats/postiats.js +10 -0
  103. package/public/vendor/monaco/vs/basic-languages/powerquery/powerquery.js +10 -0
  104. package/public/vendor/monaco/vs/basic-languages/powershell/powershell.js +10 -0
  105. package/public/vendor/monaco/vs/basic-languages/protobuf/protobuf.js +11 -0
  106. package/public/vendor/monaco/vs/basic-languages/pug/pug.js +10 -0
  107. package/public/vendor/monaco/vs/basic-languages/python/python.js +10 -0
  108. package/public/vendor/monaco/vs/basic-languages/qsharp/qsharp.js +10 -0
  109. package/public/vendor/monaco/vs/basic-languages/r/r.js +10 -0
  110. package/public/vendor/monaco/vs/basic-languages/razor/razor.js +10 -0
  111. package/public/vendor/monaco/vs/basic-languages/redis/redis.js +10 -0
  112. package/public/vendor/monaco/vs/basic-languages/redshift/redshift.js +10 -0
  113. package/public/vendor/monaco/vs/basic-languages/restructuredtext/restructuredtext.js +10 -0
  114. package/public/vendor/monaco/vs/basic-languages/ruby/ruby.js +10 -0
  115. package/public/vendor/monaco/vs/basic-languages/rust/rust.js +10 -0
  116. package/public/vendor/monaco/vs/basic-languages/sb/sb.js +10 -0
  117. package/public/vendor/monaco/vs/basic-languages/scala/scala.js +10 -0
  118. package/public/vendor/monaco/vs/basic-languages/scheme/scheme.js +10 -0
  119. package/public/vendor/monaco/vs/basic-languages/scss/scss.js +12 -0
  120. package/public/vendor/monaco/vs/basic-languages/shell/shell.js +10 -0
  121. package/public/vendor/monaco/vs/basic-languages/solidity/solidity.js +10 -0
  122. package/public/vendor/monaco/vs/basic-languages/sophia/sophia.js +10 -0
  123. package/public/vendor/monaco/vs/basic-languages/sparql/sparql.js +10 -0
  124. package/public/vendor/monaco/vs/basic-languages/sql/sql.js +10 -0
  125. package/public/vendor/monaco/vs/basic-languages/st/st.js +10 -0
  126. package/public/vendor/monaco/vs/basic-languages/swift/swift.js +13 -0
  127. package/public/vendor/monaco/vs/basic-languages/systemverilog/systemverilog.js +10 -0
  128. package/public/vendor/monaco/vs/basic-languages/tcl/tcl.js +10 -0
  129. package/public/vendor/monaco/vs/basic-languages/twig/twig.js +10 -0
  130. package/public/vendor/monaco/vs/basic-languages/typescript/typescript.js +10 -0
  131. package/public/vendor/monaco/vs/basic-languages/typespec/typespec.js +10 -0
  132. package/public/vendor/monaco/vs/basic-languages/vb/vb.js +10 -0
  133. package/public/vendor/monaco/vs/basic-languages/wgsl/wgsl.js +307 -0
  134. package/public/vendor/monaco/vs/basic-languages/xml/xml.js +10 -0
  135. package/public/vendor/monaco/vs/basic-languages/yaml/yaml.js +10 -0
  136. package/public/vendor/monaco/vs/editor/editor.main.css +8 -0
  137. package/public/vendor/monaco/vs/editor/editor.main.js +798 -0
  138. package/public/vendor/monaco/vs/language/css/cssMode.js +13 -0
  139. package/public/vendor/monaco/vs/language/css/cssWorker.js +77 -0
  140. package/public/vendor/monaco/vs/language/html/htmlMode.js +13 -0
  141. package/public/vendor/monaco/vs/language/html/htmlWorker.js +454 -0
  142. package/public/vendor/monaco/vs/language/json/jsonMode.js +19 -0
  143. package/public/vendor/monaco/vs/language/json/jsonWorker.js +42 -0
  144. package/public/vendor/monaco/vs/language/typescript/tsMode.js +20 -0
  145. package/public/vendor/monaco/vs/language/typescript/tsWorker.js +51328 -0
  146. package/public/vendor/monaco/vs/loader.js +11 -0
  147. package/public/vendor/monaco/worker-boot.js +9 -0
  148. package/server/.fuse_hidden0000000800000001 +36 -0
  149. package/server/apiDiff.js +25 -0
  150. package/server/apiDocs.js +67 -0
  151. package/server/apiFile.js +36 -0
  152. package/server/apiGitBlame.js +63 -0
  153. package/server/apiMcp.js +110 -0
  154. package/server/apiScan.js +119 -0
  155. package/server/apiSearch.js +253 -0
  156. package/server/apiSettings.js +118 -0
  157. package/server/apiTools.js +90 -0
  158. package/server/config.js +227 -0
  159. package/server/fileSourceNode.js +44 -0
  160. package/server/gitClone.js +95 -0
  161. package/server/gitDiff.js +184 -0
  162. package/server/gitHistory.js +110 -0
  163. package/server/htmlText.js +44 -0
  164. package/server/http.js +55 -0
  165. package/server/httpGuards.js +87 -0
  166. package/server/index.js +156 -0
  167. package/server/llmProxy.js +162 -0
  168. package/server/logger.js +29 -0
  169. package/server/mcp/analysis.js +209 -0
  170. package/server/mcp/http.js +213 -0
  171. package/server/mcp/runner.js +278 -0
  172. package/server/mcp/server.js +241 -0
  173. package/server/mcp/standalone.js +42 -0
  174. package/server/mcp/tools.js +683 -0
  175. package/server/paths.js +39 -0
  176. package/server/router.js +218 -0
  177. package/server/searchIndex.js +118 -0
  178. package/server/sessions.js +163 -0
  179. package/server/static.js +59 -0
  180. package/server/tools/install.js +246 -0
  181. package/server/tools/parse.js +170 -0
  182. package/server/tools/platform.js +91 -0
  183. package/server/tools/registry.js +212 -0
  184. package/server/tools/scan.js +136 -0
  185. package/server/tools.js +212 -0
  186. package/server/tunnel.js +92 -0
  187. package/shared/analyzer/docs.js +135 -0
  188. package/shared/analyzer/explainLocal.js +163 -0
  189. package/shared/analyzer/graph.js +461 -0
  190. package/shared/analyzer/health.js +215 -0
  191. package/shared/analyzer/history.js +146 -0
  192. package/shared/analyzer/languages/csharp.js +39 -0
  193. package/shared/analyzer/languages/generic.js +131 -0
  194. package/shared/analyzer/languages/go.js +70 -0
  195. package/shared/analyzer/languages/index.js +43 -0
  196. package/shared/analyzer/languages/java.js +39 -0
  197. package/shared/analyzer/languages/javascript.js +240 -0
  198. package/shared/analyzer/languages/python.js +120 -0
  199. package/shared/analyzer/languages/rust.js +42 -0
  200. package/shared/analyzer/languages/typescript.js +138 -0
  201. package/shared/analyzer/licenses.js +151 -0
  202. package/shared/analyzer/metrics.js +120 -0
  203. package/shared/analyzer/pathUtil.js +69 -0
  204. package/shared/analyzer/patterns.js +272 -0
  205. package/shared/analyzer/scan.js +473 -0
  206. package/shared/analyzer/security.js +187 -0
  207. package/shared/analyzer/services.js +157 -0
  208. package/shared/analyzer/stack.js +173 -0
  209. package/shared/analyzer/tour.js +69 -0
  210. package/shared/analyzer/util.js +123 -0
  211. package/shared/analyzer/workflows.js +143 -0
  212. package/shared/diagram/aiFacts.js +145 -0
  213. package/shared/diagram/aiMermaid.js +59 -0
  214. package/shared/diagram/atlas.js +93 -0
  215. package/shared/diagram/mermaid.js +459 -0
  216. package/shared/search/query.js +518 -0
@@ -0,0 +1,455 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Onboarder — a map for any codebase</title>
7
+ <link rel="stylesheet" href="/styles.css">
8
+ <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' fill='%23f7f4ed'/%3E%3Ccircle cx='9' cy='16' r='4' fill='none' stroke='%232a2721' stroke-width='2'/%3E%3Ccircle cx='24' cy='8' r='3.2' fill='none' stroke='%232e5d43' stroke-width='2'/%3E%3Ccircle cx='24' cy='24' r='3.2' fill='none' stroke='%232a2721' stroke-width='2'/%3E%3Cpath d='M13 14 L21 9 M13 18 L21 23' stroke='%232a2721' stroke-width='1.6'/%3E%3C/svg%3E">
9
+ </head>
10
+ <body>
11
+
12
+ <header class="topbar">
13
+ <div class="brand">
14
+ <span class="brand-mark">onboarder</span>
15
+ <span class="brand-note" id="brandNote">a map for any codebase</span>
16
+ </div>
17
+ <nav class="views" id="viewTabs" hidden>
18
+ <button class="view-tab is-active" data-view="explorer">Explorer</button>
19
+ <button class="view-tab" data-view="analysis">Deep Analysis</button>
20
+ <button class="view-tab" data-view="graph">Graph</button>
21
+ <button class="view-tab" data-view="heatmap">Heatmap</button>
22
+ <button class="view-tab" data-view="insights">Insights</button>
23
+ <button class="view-tab" data-view="diff">Diff</button>
24
+ <button class="view-tab" data-view="workflows">Workflows</button>
25
+ <button class="view-tab" data-view="sbom">SBOM</button>
26
+ <button class="view-tab" data-view="code">Code</button>
27
+ <button class="view-tab" data-view="docs">Docs</button>
28
+ <button class="view-tab" data-view="about">About</button>
29
+ </nav>
30
+ <div class="topbar-right">
31
+ <button class="btn btn-ghost btn-search-trigger" id="searchTriggerBtn" title="Search files, symbols and contents — ext:, path:, is:test, &quot;phrases&quot;, /regex/ (Cmd+K / Ctrl+K)" hidden>
32
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="vertical-align:middle;margin-right:4px;"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg><span class="search-trigger-label">Search</span><span class="search-key-hint">⌘K</span>
33
+ </button>
34
+ <span class="repo-chip" id="repoChip" hidden></span>
35
+ <button class="btn btn-ghost" id="mcpBtn" title="Expose this repository to any AI agent through the Model Context Protocol">
36
+ <span class="mcp-dot" id="mcpDot" aria-hidden="true"></span><span id="mcpBtnLabel">MCP</span>
37
+ </button>
38
+ <button class="btn btn-ghost" id="themeBtn" title="Switch theme">Dark</button>
39
+ <button class="btn btn-ghost" id="newRepoBtn" hidden>New repo</button>
40
+ <button class="btn btn-ghost" id="settingsBtn">API key</button>
41
+ <button class="btn btn-ghost" id="serverBtn" title="Server mode, network, access key, and tunnels">Server</button>
42
+ <span class="me-links" title="Built by Amit Pandey">
43
+ <a class="me-link" href="https://github.com/Amitpandey88" target="_blank" rel="noopener" title="Amit on GitHub" aria-label="Amit Pandey on GitHub">
44
+ <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>
45
+ </a>
46
+ <a class="me-link" href="https://theamit.me" target="_blank" rel="noopener" title="theamit.me — portfolio" aria-label="Amit Pandey's portfolio">
47
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M3 12h18"/><path d="M12 3c2.6 2.6 4 5.7 4 9s-1.4 6.4-4 9c-2.6-2.6-4-5.7-4-9s1.4-6.4 4-9z"/></svg>
48
+ </a>
49
+ </span>
50
+ </div>
51
+ </header>
52
+
53
+ <!-- ============================ LANDING ============================ -->
54
+ <main class="landing" id="landing">
55
+ <div class="landing-inner">
56
+ <h1 class="landing-title">Drop a path.<br>Get a map.</h1>
57
+ <p class="landing-sub">
58
+ Onboarder reads a repository the way a new teammate would — starting at the
59
+ front door, following the imports, noting who depends on whom — then draws
60
+ the whole thing as flow diagrams you can actually navigate.
61
+ </p>
62
+
63
+ <div class="load-grid">
64
+ <section class="load-card">
65
+ <h2 class="load-card-title">A folder on this machine</h2>
66
+ <p class="load-card-note">The server reads it in place. Nothing is copied.</p>
67
+ <form id="pathForm" class="load-form">
68
+ <input type="text" id="pathInput" class="text-input" placeholder="~/work/some-repo"
69
+ spellcheck="false" autocomplete="off">
70
+ <button type="submit" class="btn btn-ink">Scan it</button>
71
+ </form>
72
+ </section>
73
+
74
+ <section class="load-card">
75
+ <h2 class="load-card-title">A git URL</h2>
76
+ <p class="load-card-note">Shallow-cloned to a temp folder, removed when you’re done.</p>
77
+ <form id="gitForm" class="load-form">
78
+ <input type="url" id="gitInput" class="text-input" placeholder="https://github.com/…"
79
+ spellcheck="false" autocomplete="off">
80
+ <button type="submit" class="btn btn-ink">Clone &amp; scan</button>
81
+ </form>
82
+ </section>
83
+
84
+ <section class="load-card" id="pickCard">
85
+ <h2 class="load-card-title">Pick it in the browser</h2>
86
+ <p class="load-card-note">Your files never leave this tab. Chromium browsers only.</p>
87
+ <button class="btn btn-outline" id="pickBtn">Choose a folder…</button>
88
+ </section>
89
+ </div>
90
+
91
+ <p class="landing-alt">
92
+ Just looking? <button class="linklike" id="demoBtn">Scan this app’s own source</button> and see what it makes of itself.
93
+ </p>
94
+
95
+ <section class="landing-about" id="landingAbout">
96
+ <div class="la-actions">
97
+ <button class="la-hide" id="creditsHide" title="Hide this card">hide</button>
98
+ <button class="la-hide la-remove" id="creditsRemove" title="Permanently remove">remove</button>
99
+ </div>
100
+ <div class="la-col">
101
+ <div class="la-name">onboarder</div>
102
+ <p class="la-note">a map for any codebase — runs locally, follows the imports, draws the flow.</p>
103
+ <div class="about-tool-links">
104
+ <a class="tool-link" href="https://onboarder.theamit.me" target="_blank" rel="noopener">
105
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M15.5 8.5l-2.2 5-5 2.2 2.2-5z" fill="currentColor" stroke="none"/></svg>
106
+ onboarder.theamit.me
107
+ </a>
108
+ </div>
109
+ </div>
110
+ <div class="la-rule" aria-hidden="true"></div>
111
+ <div class="la-col">
112
+ <div class="la-name">Amit Pandey</div>
113
+ <p class="la-role">AI, Data &amp; Software Engineer · Computer &amp; Data Science student · India</p>
114
+ <p class="la-note">Carving a path at the intersection of artificial intelligence, data engineering,
115
+ and software development — training models, wrangling datasets, shipping clean code.</p>
116
+ <div class="about-tool-links">
117
+ <a class="tool-link" href="https://theamit.me" target="_blank" rel="noopener">
118
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M3 12h18"/><path d="M12 3c2.6 2.6 4 5.7 4 9s-1.4 6.4-4 9c-2.6-2.6-4-5.7-4-9s1.4-6.4 4-9z"/></svg>
119
+ theamit.me
120
+ </a>
121
+ <a class="tool-link" href="https://theamit.me/projects.html" target="_blank" rel="noopener">
122
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/></svg>
123
+ projects
124
+ </a>
125
+ <a class="tool-link" href="https://theamit.me/blog/index.html" target="_blank" rel="noopener">
126
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><path d="M12 20h9"/><path d="M16.5 3.5a2.1 2.1 0 013 3L7 19l-4 1 1-4z"/></svg>
127
+ blog
128
+ </a>
129
+ <a class="tool-link" href="https://github.com/Amitpandey88" target="_blank" rel="noopener">
130
+ <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>
131
+ Amitpandey88
132
+ </a>
133
+ <a class="tool-link" href="https://www.linkedin.com/in/theamitpandey" target="_blank" rel="noopener">
134
+ <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>
135
+ theamitpandey
136
+ </a>
137
+ <a class="tool-link" href="mailto:hello@theamit.me">
138
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="M3 7l9 6 9-6"/></svg>
139
+ hello@theamit.me
140
+ </a>
141
+ </div>
142
+ </div>
143
+ </section>
144
+ <p class="credits-bar" id="creditsBar" hidden>
145
+ <button class="btn credits-show" id="creditsShow">about the tool &amp; the maker</button>
146
+ <button class="btn btn-ghost credits-bar-remove" id="creditsBarRemove" title="Permanently remove">remove</button>
147
+ </p>
148
+
149
+ <p class="landing-error" id="landingError" hidden></p>
150
+ <p class="landing-status" id="landingStatus" hidden></p>
151
+ </div>
152
+ <footer class="landing-foot" id="landingFoot">
153
+ <span>Everything runs locally.</span>
154
+ <span>Diagrams export as Mermaid or SVG.</span>
155
+ <span>Explanations optional — bring any OpenAI-compatible key.</span>
156
+ <span class="foot-license" id="footCredit">MIT licensed · created by <a href="https://theamit.me" target="_blank" rel="noopener">Amit</a></span>
157
+ </footer>
158
+ </main>
159
+ <!-- ============================ EXPLORER ============================ -->
160
+ <main class="explorer" id="explorer" hidden>
161
+ <aside class="sidebar">
162
+ <div class="sidebar-head">
163
+ <input type="search" id="treeFilter" class="tree-filter" placeholder="Filter files…" spellcheck="false">
164
+ </div>
165
+ <div class="tree" id="fileTree"></div>
166
+ </aside>
167
+
168
+ <section class="stage">
169
+ <div class="stage-head">
170
+ <div class="crumbs" id="crumbs"></div>
171
+ <div class="stage-actions">
172
+ <button class="btn btn-ghost btn-sm" id="mmToggleBtn" hidden>Open folders</button>
173
+ <button class="btn btn-ghost btn-sm" id="aiDrawBtn">AI draft</button>
174
+ <button class="btn btn-ghost btn-sm" id="copyMermaidBtn">Copy Mermaid</button>
175
+ <button class="btn btn-ghost btn-sm" id="svgBtn">Save SVG</button>
176
+ <button class="btn btn-ghost btn-sm" id="fitBtn">Fit</button>
177
+ </div>
178
+ </div>
179
+ <div class="stage-filters" id="stageFilters" hidden>
180
+ <div class="mode-switch" id="modeSwitch">
181
+ <button class="mode-chip is-active" data-mode="map">Tree</button>
182
+ <button class="mode-chip" data-mode="files">Files</button>
183
+ <button class="mode-chip" data-mode="patterns">Layers</button>
184
+ <button class="mode-chip" data-mode="health">Health</button>
185
+ <button class="mode-chip" data-mode="security">Security</button>
186
+ <button class="mode-chip" data-mode="history">History</button>
187
+ <button class="mode-chip" data-mode="services">Services</button>
188
+ <button class="mode-chip" data-mode="tour">Tour</button>
189
+ <button class="mode-chip" data-mode="atlas">Atlas</button>
190
+ </div>
191
+ <input type="search" id="nodeFilter" class="node-filter" placeholder="Filter nodes…" spellcheck="false" autocomplete="off">
192
+ <button class="chip-toggle is-on" id="testsToggle" title="Show or hide test files">tests</button>
193
+ <select id="depthSelect" class="depth-select" title="How deep the tree opens by itself">
194
+ <option value="0">manual depth</option>
195
+ <option value="1">open depth 1</option>
196
+ <option value="2">open depth 2</option>
197
+ <option value="3">open depth 3</option>
198
+ </select>
199
+ </div>
200
+ <div class="docview" id="docView" hidden></div>
201
+ <div class="docview" id="aboutView" hidden></div>
202
+ <div class="docview" id="insightsView" hidden></div>
203
+ <div class="docview" id="diffView" hidden></div>
204
+ <div class="docview" id="workflowsView" hidden></div>
205
+ <div class="docview" id="sbomView" hidden></div>
206
+ <div class="docview" id="analysisView" hidden></div>
207
+ <div class="code-tab-container" id="codeTabContainer" hidden>
208
+ <div class="blame-gutter" id="blameGutter" hidden></div>
209
+ <div class="docview code-docview" id="codeView"></div>
210
+ </div>
211
+ <section class="graph-view" id="graphView" hidden style="flex:1; position:relative;">
212
+ <canvas class="graph-canvas" id="graphCanvas"></canvas>
213
+ <div class="graph-controls" id="graphControls">
214
+ <input type="search" class="graph-search-input" id="graphSearchInput" placeholder="Filter graph nodes…" style="font-family:var(--mono);font-size:11px;padding:4px 8px;border:1.5px solid var(--ink);border-radius:4px;background:var(--card);color:var(--ink);width:130px;" />
215
+ <button class="btn btn-ghost" id="graphReset" title="Reset layout">Reset</button>
216
+ <button class="btn btn-ghost" id="graphZoomIn" title="Zoom in">+</button>
217
+ <button class="btn btn-ghost" id="graphZoomOut" title="Zoom out">−</button>
218
+ <button class="btn btn-ghost" id="graphFit" title="Fit graph to screen">Fit</button>
219
+ </div>
220
+ <div class="graph-tooltip" id="graphTooltip" hidden></div>
221
+ </section>
222
+ <section class="heatmap-view" id="heatmapView" hidden style="flex:1; position:relative;">
223
+ <canvas class="heatmap-canvas" id="heatmapCanvas"></canvas>
224
+ <div class="heatmap-tooltip" id="heatmapTooltip" hidden></div>
225
+ </section>
226
+ <div class="canvas" id="canvas">
227
+ <div class="canvas-content" id="canvasContent"></div>
228
+ <div class="canvas-empty" id="canvasEmpty" hidden></div>
229
+ </div>
230
+ <div class="stage-foot" id="stageFoot"></div>
231
+ </section>
232
+
233
+ <aside class="inspector" id="inspector">
234
+ <div class="inspector-empty" id="inspectorEmpty">
235
+ <p class="inspector-empty-line">Click anything on the map<br>to read its mail.</p>
236
+ </div>
237
+ <div class="inspector-body" id="inspectorBody" hidden>
238
+ <header class="inspector-head">
239
+ <h2 class="inspector-title" id="inspTitle"></h2>
240
+ <span class="role-chip" id="inspRole"></span>
241
+ <button class="insp-back" id="inspBack" hidden></button>
242
+ </header>
243
+ <p class="inspector-path" id="inspPath"></p>
244
+ <div class="inspector-stats" id="inspStats"></div>
245
+ <section class="inspector-section">
246
+ <h3 class="inspector-h">What it does · ask the AI</h3>
247
+ <div class="explain" id="inspExplain"></div>
248
+ <div class="ask-row">
249
+ <input type="text" id="askInput" class="text-input ask-input"
250
+ placeholder="Ask anything about this repo…" spellcheck="false" autocomplete="off">
251
+ <button class="btn btn-ink btn-sm" id="askBtn">Ask</button>
252
+ </div>
253
+ <button class="linklike ask-auto" id="aiExplainBtn">no question — just explain this file →</button>
254
+ </section>
255
+ <section class="inspector-section" id="inspSecurityTools"></section>
256
+ <section class="inspector-section" id="inspLists"></section>
257
+ </div>
258
+ </aside>
259
+ </main>
260
+
261
+ <!-- ============================ TOUR ============================ -->
262
+ <div class="tourbar" id="tourbar" hidden>
263
+ <div class="tourbar-info">
264
+ <span class="tourbar-kicker">The guided walk</span>
265
+ <span class="tourbar-title" id="tourTitle"></span>
266
+ </div>
267
+ <div class="tourbar-controls">
268
+ <button class="btn btn-ghost btn-sm" id="tourPrev">← Prev</button>
269
+ <span class="tourbar-count" id="tourCount"></span>
270
+ <button class="btn btn-ghost btn-sm" id="tourNext">Next →</button>
271
+ <button class="btn btn-ghost btn-sm" id="tourExit">Leave the tour</button>
272
+ </div>
273
+ </div>
274
+
275
+ <!-- ============================ SETTINGS ============================ -->
276
+ <div class="drawer-scrim" id="drawerScrim" hidden></div>
277
+ <aside class="drawer" id="settingsDrawer" hidden>
278
+ <header class="drawer-head">
279
+ <h2>Explain with AI</h2>
280
+ <button class="btn btn-ghost btn-sm" id="drawerClose">Close</button>
281
+ </header>
282
+ <p class="drawer-note">
283
+ Nothing is preconfigured — no endpoint, model, or key ships with the repo.
284
+ Point this at any OpenAI-compatible endpoint (OpenAI proper, Groq,
285
+ OpenRouter, Ollama, LM Studio…). Without one you still get the offline notes.
286
+ </p>
287
+ <label class="field">
288
+ <span class="field-label">Base URL</span>
289
+ <input type="text" id="setBaseUrl" class="text-input" placeholder="https://api.openai.com/v1" spellcheck="false">
290
+ </label>
291
+ <label class="field">
292
+ <span class="field-label">API key</span>
293
+ <input type="password" id="setApiKey" class="text-input" placeholder="sk-… or leave empty for local servers">
294
+ </label>
295
+ <label class="field">
296
+ <span class="field-label">Model</span>
297
+ <input type="text" id="setModel" class="text-input" placeholder="gpt-4o-mini" spellcheck="false">
298
+ </label>
299
+ <div class="drawer-actions">
300
+ <button class="btn btn-ink" id="saveSettings">Save</button>
301
+ <button class="btn btn-outline" id="testSettings">Test connection</button>
302
+ </div>
303
+ <p class="drawer-status" id="settingsStatus"></p>
304
+ <p class="drawer-fine">
305
+ Stored in this browser’s localStorage, forwarded through your local server,
306
+ never written to disk or logged. Close the tab and it stays here; clear site
307
+ data and it’s gone.
308
+ </p>
309
+ </aside>
310
+
311
+ <div class="search-overlay" id="searchOverlay" hidden></div>
312
+
313
+ <!-- ============================ MCP ============================ -->
314
+ <!--
315
+ Its own drawer rather than a tab inside the settings one, for one reason: the
316
+ settings drawer is about this browser talking to an LLM with a key, and MCP is
317
+ about other programs talking to Onboarder with no key at all. They share a
318
+ shape, not a subject.
319
+ -->
320
+ <div class="drawer-scrim" id="mcpScrim" hidden></div>
321
+ <aside class="drawer" id="mcpDrawer" hidden>
322
+ <header class="drawer-head">
323
+ <h2>MCP server</h2>
324
+ <button class="btn btn-ghost btn-sm" id="mcpClose">Close</button>
325
+ </header>
326
+ <p class="drawer-note">
327
+ Runs Onboarder as a Model Context Protocol server, so any AI agent or harness
328
+ on this machine can ask it about a repository — its structure, architecture,
329
+ health, security, history, and every file in it — by talking to it. The server
330
+ reads repositories and never writes to them.
331
+ </p>
332
+
333
+ <div class="mcp-state" id="mcpStateRow">
334
+ <span class="mcp-dot mcp-dot-lg" id="mcpPanelDot" aria-hidden="true"></span>
335
+ <span class="mcp-state-text" id="mcpPanelState">Checking…</span>
336
+ </div>
337
+
338
+ <div class="drawer-actions">
339
+ <button class="btn btn-ink" id="mcpStart">Start server</button>
340
+ <button class="btn btn-outline" id="mcpStop" disabled>Stop</button>
341
+ </div>
342
+ <p class="drawer-status" id="mcpStatus"></p>
343
+
344
+ <div class="mcp-config" id="mcpConfig" hidden>
345
+ <span class="field-label">Configure your agent with</span>
346
+ <div class="mcp-config-row">
347
+ <input type="text" class="text-input mcp-config-input" id="mcpCommandInput" readonly spellcheck="false">
348
+ <button class="btn btn-ghost btn-sm" id="mcpCopy" title="Copy this command">Copy</button>
349
+ </div>
350
+ <div class="mcp-tabs" role="tablist" aria-label="Configuration format">
351
+ <button class="mcp-tab is-on" id="mcpTabJson" role="tab" aria-selected="true">JSON</button>
352
+ <button class="mcp-tab" id="mcpTabToml" role="tab" aria-selected="false">TOML</button>
353
+ </div>
354
+ <pre class="mcp-config-block" id="mcpConfigBlock"></pre>
355
+ <p class="drawer-fine" id="mcpToolsHint"></p>
356
+ </div>
357
+ </aside>
358
+
359
+ <!-- ============================ SERVER ============================ -->
360
+ <!--
361
+ The third drawer: this browser talking to the Onboarder server itself. The AI
362
+ drawer holds an LLM key; this one holds the server's own mode, bind, domain,
363
+ and access key, and the tunnel switches. Everything here lands in the same
364
+ config file the CLI wizard writes — one file, three editors.
365
+ -->
366
+ <div class="drawer-scrim" id="serverScrim" hidden></div>
367
+ <aside class="drawer" id="serverDrawer" hidden>
368
+ <header class="drawer-head">
369
+ <h2>Server</h2>
370
+ <button class="btn btn-ghost btn-sm" id="serverClose">Close</button>
371
+ </header>
372
+ <p class="drawer-note" id="serverModeNote"></p>
373
+
374
+ <label class="field">
375
+ <span class="field-label">Mode</span>
376
+ <select id="srvMode" class="text-input">
377
+ <option value="local">Local — this machine only, no key</option>
378
+ <option value="self-hosted">Self-hosted — reachable, key required</option>
379
+ </select>
380
+ </label>
381
+ <div class="server-grid">
382
+ <label class="field">
383
+ <span class="field-label">Bind host</span>
384
+ <input type="text" id="srvHost" class="text-input" placeholder="127.0.0.1" spellcheck="false">
385
+ </label>
386
+ <label class="field">
387
+ <span class="field-label">Port</span>
388
+ <input type="number" id="srvPort" class="text-input" min="1" max="65535" placeholder="4310">
389
+ </label>
390
+ </div>
391
+ <label class="field" id="srvDomainField">
392
+ <span class="field-label">Domain (optional for LAN, required for a public name)</span>
393
+ <input type="text" id="srvDomain" class="text-input" placeholder="map.example.com" spellcheck="false">
394
+ </label>
395
+ <label class="check-row">
396
+ <input type="checkbox" id="srvAutoOpen">
397
+ <span>Open the browser when the server starts</span>
398
+ </label>
399
+
400
+ <div class="server-section" id="srvKeySection" hidden>
401
+ <span class="field-label">Access key</span>
402
+ <div class="mcp-config-row">
403
+ <input type="text" class="text-input mcp-config-input" id="srvKeyMasked" readonly spellcheck="false">
404
+ <button class="btn btn-ghost btn-sm" id="srvRotate" title="Mint a new key; the old one dies immediately">Rotate</button>
405
+ </div>
406
+ <div class="server-fresh-key" id="srvFreshKeyRow" hidden>
407
+ <p class="drawer-fine">New key — shown once. It is already saved in this browser:</p>
408
+ <div class="mcp-config-row">
409
+ <input type="text" class="text-input mcp-config-input" id="srvFreshKey" readonly spellcheck="false">
410
+ <button class="btn btn-ghost btn-sm" id="srvCopyKey">Copy</button>
411
+ </div>
412
+ </div>
413
+ <p class="drawer-fine" id="srvKeyHint"></p>
414
+ </div>
415
+
416
+ <div class="server-section">
417
+ <span class="field-label">Profile</span>
418
+ <div class="server-grid">
419
+ <input type="text" id="srvName" class="text-input" placeholder="Your name" spellcheck="false">
420
+ <input type="email" id="srvEmail" class="text-input" placeholder="you@example.com" spellcheck="false">
421
+ </div>
422
+ </div>
423
+
424
+ <div class="server-section">
425
+ <span class="field-label">Tunnels</span>
426
+ <label class="check-row">
427
+ <input type="checkbox" id="srvTunnelCloudflare">
428
+ <span>Cloudflare quick tunnel</span>
429
+ </label>
430
+ <p class="drawer-fine" id="srvTunnelCloudflareStatus"></p>
431
+ <label class="check-row">
432
+ <input type="checkbox" id="srvTunnelTailscale">
433
+ <span>Tailscale</span>
434
+ </label>
435
+ <p class="drawer-fine" id="srvTunnelTailscaleStatus"></p>
436
+ </div>
437
+
438
+ <div class="drawer-actions">
439
+ <button class="btn btn-ink" id="srvSave">Save</button>
440
+ </div>
441
+ <p class="drawer-status" id="srvStatus"></p>
442
+ <p class="drawer-fine" id="srvConfigPath"></p>
443
+ </aside>
444
+
445
+ <div class="toast" id="toast" hidden></div>
446
+ <div class="toast" id="toast" hidden></div>
447
+
448
+ <script src="/vendor/monaco/vs/loader.js"></script>
449
+ <script src="/vendor/mermaid.min.js"></script>
450
+ <script type="module" src="/js/components/RiskBadge.js"></script>
451
+ <script type="module" src="/js/components/MetricSparkline.js"></script>
452
+ <script type="module" src="/js/components/FileChip.js"></script>
453
+ <script type="module" src="/app.js"></script>
454
+ </body>
455
+ </html>