codebase-onboarder 0.7.0 → 1.0.1
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 +140 -12
- package/bin/onboarder.js +0 -0
- package/cli/agent/command.d.ts +71 -0
- package/cli/agent/command.js +177 -0
- package/cli/agent/command.js.map +1 -0
- package/cli/agent/config.d.ts +31 -0
- package/cli/agent/config.js +98 -0
- package/cli/agent/config.js.map +1 -0
- package/cli/agent/contracts.d.ts +77 -0
- package/cli/agent/contracts.js +2 -0
- package/cli/agent/contracts.js.map +1 -0
- package/cli/agent/files.d.ts +19 -0
- package/cli/agent/files.js +109 -0
- package/cli/agent/files.js.map +1 -0
- package/cli/agent/gitSource.d.ts +18 -0
- package/cli/agent/gitSource.js +69 -0
- package/cli/agent/gitSource.js.map +1 -0
- package/cli/agent/github.d.ts +21 -0
- package/cli/agent/github.js +94 -0
- package/cli/agent/github.js.map +1 -0
- package/cli/agent/mcp.d.ts +15 -0
- package/cli/agent/mcp.js +78 -0
- package/cli/agent/mcp.js.map +1 -0
- package/cli/agent/process.d.ts +18 -0
- package/cli/agent/process.js +118 -0
- package/cli/agent/process.js.map +1 -0
- package/cli/agent/protocol.d.ts +3 -0
- package/cli/agent/protocol.js +26 -0
- package/cli/agent/protocol.js.map +1 -0
- package/cli/agent/runner.d.ts +34 -0
- package/cli/agent/runner.js +152 -0
- package/cli/agent/runner.js.map +1 -0
- package/cli/agent/stdio.d.ts +1 -0
- package/cli/agent/stdio.js +62 -0
- package/cli/agent/stdio.js.map +1 -0
- package/cli/agent/tools.d.ts +7 -0
- package/cli/agent/tools.js +225 -0
- package/cli/agent/tools.js.map +1 -0
- package/cli/chat/analysis.d.ts +26 -0
- package/cli/chat/analysis.js +188 -0
- package/cli/chat/analysis.js.map +1 -0
- package/cli/chat/app.d.ts +16 -0
- package/cli/chat/app.js +363 -0
- package/cli/chat/app.js.map +1 -0
- package/cli/chat/commands.d.ts +11 -0
- package/cli/chat/commands.js +122 -0
- package/cli/chat/commands.js.map +1 -0
- package/cli/chat/composer.d.ts +75 -0
- package/cli/chat/composer.js +467 -0
- package/cli/chat/composer.js.map +1 -0
- package/cli/chat/controller.d.ts +64 -0
- package/cli/chat/controller.js +402 -0
- package/cli/chat/controller.js.map +1 -0
- package/cli/chat/logo.d.ts +3 -0
- package/cli/chat/logo.js +14 -0
- package/cli/chat/logo.js.map +1 -0
- package/cli/chat/models.d.ts +18 -0
- package/cli/chat/models.js +88 -0
- package/cli/chat/models.js.map +1 -0
- package/cli/chat/profile.d.ts +5 -0
- package/cli/chat/profile.js +98 -0
- package/cli/chat/profile.js.map +1 -0
- package/cli/chat/render.d.ts +40 -0
- package/cli/chat/render.js +259 -0
- package/cli/chat/render.js.map +1 -0
- package/cli/chat/screen.d.ts +26 -0
- package/cli/chat/screen.js +117 -0
- package/cli/chat/screen.js.map +1 -0
- package/cli/chat/source.d.ts +29 -0
- package/cli/chat/source.js +116 -0
- package/cli/chat/source.js.map +1 -0
- package/cli/chat/store.d.ts +43 -0
- package/cli/chat/store.js +94 -0
- package/cli/chat/store.js.map +1 -0
- package/cli/chat/text.d.ts +4 -0
- package/cli/chat/text.js +27 -0
- package/cli/chat/text.js.map +1 -0
- package/cli/explorer/app.d.ts +1 -0
- package/cli/explorer/app.js +20 -1
- package/cli/explorer/app.js.map +1 -1
- package/cli/explorer/commands.js +5 -0
- package/cli/explorer/commands.js.map +1 -1
- package/cli/explorer/featureViews.d.ts +1 -0
- package/cli/explorer/featureViews.js +4 -0
- package/cli/explorer/featureViews.js.map +1 -1
- package/cli/main.js +47 -13
- package/cli/main.js.map +1 -1
- package/docs/HERMES_RESEARCH.md +51 -0
- package/package.json +2 -1
- package/public/app.js +98 -24
- package/public/app.js.map +1 -1
- package/public/assets/onboarder-mark.svg +11 -0
- package/public/browser.d.ts +3 -0
- package/public/browser.js.map +1 -1
- package/public/index.html +24 -7
- package/public/js/about.js +2 -2
- package/public/js/about.js.map +1 -1
- package/public/js/aiDraft.d.ts +1 -0
- package/public/js/aiDraft.js +66 -17
- package/public/js/aiDraft.js.map +1 -1
- package/public/js/api.d.ts +8 -5
- package/public/js/api.js +45 -22
- package/public/js/api.js.map +1 -1
- package/public/js/deepAnalysisView.js +2 -2
- package/public/js/deepAnalysisView.js.map +1 -1
- package/public/js/diagramPane.d.ts +1 -0
- package/public/js/diagramPane.js +5 -0
- package/public/js/diagramPane.js.map +1 -1
- package/public/js/docsView.js +6 -6
- package/public/js/docsView.js.map +1 -1
- package/public/js/dom.d.ts +8 -0
- package/public/js/dom.js.map +1 -1
- package/public/js/llm.d.ts +3 -1
- package/public/js/llm.js +15 -8
- package/public/js/llm.js.map +1 -1
- package/public/js/repoFiles.js +1 -1
- package/public/js/repoFiles.js.map +1 -1
- package/public/js/reviewView.js +1 -1
- package/public/js/reviewView.js.map +1 -1
- package/public/styles.css +25 -0
- package/server/gitDiff.d.ts +1 -1
- package/server/hermesChat.d.ts +13 -0
- package/server/hermesChat.js +145 -0
- package/server/hermesChat.js.map +1 -0
- package/server/http.d.ts +5 -4
- package/server/http.js +0 -4
- package/server/http.js.map +1 -1
- package/server/mcp/server.d.ts +1 -1
- package/server/mcp/server.js +2 -2
- package/server/mcp/server.js.map +1 -1
- package/server/router.js +7 -3
- package/server/router.js.map +1 -1
- package/server/tools/scan.js +16 -2
- package/server/tools/scan.js.map +1 -1
- package/server/tools.d.ts +1 -0
- package/server/tools.js +46 -6
- package/server/tools.js.map +1 -1
- package/shared/diagram/aiMermaid.js +16 -13
- package/shared/diagram/aiMermaid.js.map +1 -1
package/cli/explorer/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/explorer/app.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ScanProgress } from '../../shared/contracts.js';\nimport { scanOptionsFromFlags } from '../scanOptions.js';\n// The interactive session.\n//\n// This is a prompt, not a full-screen TUI, and that is a deliberate choice.\n// A curses app takes the scrollback, the selection, and copy-paste away, and it\n// behaves badly over SSH and inside a tmux pane — which is exactly where people\n// read a codebase. A readline session keeps all of that, prints scrollable\n// output you can select, and degrades to something scriptable. The research\n// agrees: a CLI is a conversation, and a TUI earns its cost only when you are\n// manipulating state with the keyboard rather than reading.\n//\n// Two rules from the design research are load-bearing here:\n// * TTY detection. A session that needs a terminal must never be started by a\n// pipe, a cron job, or CI — so `runExplore` refuses and explains instead of\n// hanging forever waiting for input nobody is there to type.\n// * Flags → env → config precedence. `NO_COLOR` and `COLUMNS` are honored\n// before anything is drawn, so a redirect gets plain, fitted text.\n\nimport readline from 'node:readline';\nimport readlinePromises from 'node:readline/promises';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { openRepo, openRepoOrClone, isGitUrl, remoteUrlFor, closeRemote, searchRepo, explainRepoOverview } from './session.js';\nimport { fetchRepoFacts } from './github.js';\nimport { CLEAR, EXIT, commandNames, completer, helpText, lookup, shellEscape, tokenize } from './commands.js';\nimport { overview, github as githubView } from './views.js';\nimport { bold, cyan, dim, ok, bad, paint } from '../ui.js';\nimport { configPath, readSettings, serverUrls } from '../../server/config.js';\nimport { readPidFile, pidIsAlive } from '../../server/pidfile.js';\nimport { expandHome } from '../../server/paths.js';\nimport { SourcePicker } from './picker.js';\nimport { getGitDiff } from '../../server/gitDiff.js';\nimport { runExternalAnalysis, toolsStatus } from '../../server/tools/scan.js';\nimport { formatDiff, formatDeepAnalysis, formatEngines } from './featureViews.js';\nimport { askConfig, askModel, askSetupMessage } from './assistant.js';\nimport { wrapText } from './wrap.js';\n\nconst VERSION = JSON.parse(\n fs.readFileSync(new URL('../../package.json', import.meta.url), 'utf8')\n).version;\n\n// The one-time note. `onboarder` used to start a web server; now it opens this.\n// Someone who upgrades and has muscle memory for the old thing deserves to be\n// told once where the server went, and then never again.\nconst HINT_MARKER = 'explorer-hint-v1';\n\nexport async function runExplore({ target = null, flags = {}, out = console.log, err = console.error, version = VERSION }: Record<string, any> = {}) {\n // The guard. `stdin` matters as much as `stdout`: a session with no input\n // source is a hang, and a hang in CI is worse than any error.\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n out('');\n out(' The terminal explorer needs an interactive terminal.');\n out(dim(' In a script or a pipe, use these instead:'));\n out(dim(' onboarder start start the web UI'));\n out(dim(' onboarder start background start it detached'));\n out(dim(' onboarder status | stop manage a running one'));\n out(dim(' onboarder --help everything else'));\n out('');\n return 0;\n }\n\n if (!target) {\n target = await chooseInitialSource(out);\n if (!target) return 0;\n }\n\n let repo;\n try {\n // The launch argument accepts a URL for the same reason `cd` does: someone\n // who has never seen this repo should be able to name it and read it. A\n // silent ten-second clone looks like a hang, so the URL case says what it\n // is doing before it starts.\n if (isGitUrl(target)) out(dim(` cloning ${target}…`));\n repo = await openRepoOrClone(target, { ...scanOptionsFromFlags(flags), onProgress: progressReporter(out) });\n } catch (e) {\n err(' ' + bad((e.message || String(e))));\n err(dim(' Point it at a folder: onboarder explore /path/to/repo'));\n err(dim(' …or a git URL: onboarder explore https://github.com/org/repo'));\n return 1;\n }\n\n out('');\n out(overview(repo));\n out('');\n if (await shouldShowHint(flags)) {\n out(dim(' Note: `onboarder` used to start the web server. That is now `onboarder start`'));\n out(dim(' (or the `web` command here) — this session reads the repo directly,'));\n out(dim(' so it needs no server and works offline.'));\n out('');\n }\n return session({ repo, flags, out, err, version });\n}\n\nasync function chooseInitialSource(out) {\n const picker = new SourcePicker();\n const rl = readlinePromises.createInterface({ input: process.stdin, output: process.stdout });\n try {\n out(await picker.view());\n for (;;) {\n const result = await picker.choose(await rl.question(picker.prompt));\n if (result.message) out(result.message);\n if (result.done) return result.target;\n }\n } catch {\n return null;\n } finally {\n rl.close();\n }\n}\n\n// Scanning a large monorepo is the one genuinely slow thing this does, so it\n// says so. A silent eight seconds is indistinguishable from a hang.\nfunction progressReporter(out: (message: string) => void) {\n let last = 0;\n return (progress: ScanProgress) => {\n if (!process.stdout.isTTY) return;\n const now = Date.now();\n if (progress.phase === 'parse' && progress.done && now - last > 400) {\n last = now;\n out(dim(`\\r scanning… ${progress.done} files`));\n }\n };\n}\n\nasync function shouldShowHint(flags) {\n if (process.env.ONBOARDER_NO_HINT) return false;\n try {\n const marker = path.join(path.dirname(flags.config || configPath()), HINT_MARKER);\n const seen = await fs.promises.stat(marker).then(() => true).catch(() => false);\n if (seen) return false;\n await fs.promises.mkdir(path.dirname(marker), { recursive: true });\n await fs.promises.writeFile(marker, 'shown\\n');\n return true;\n } catch {\n // A read-only config home is not a reason to nag on every launch.\n return false;\n }\n}\n\n// The read loop. Commands are queued rather than awaited inline, because\n// readline emits the next line while a slow command is still running and two\n// interleaved `cd`s would leave the session pointing at a repo nobody asked\n// for.\nfunction session({ repo, flags, out, err, version }) {\n const ctx = {\n picker: null as SourcePicker | null,\n repo,\n version,\n flags,\n help: (topic) => helpText(ctx, topic),\n rescan: () => reload(ctx, ctx.repo.root),\n loadRepo: (where) => reload(ctx, where),\n selectSource: async () => {\n ctx.picker = new SourcePicker(ctx.repo.cloneDir ? process.cwd() : ctx.repo.root);\n return ctx.picker.view();\n },\n github: () => askGithub(ctx),\n web: () => startWeb(ctx),\n diff: async (base = 'HEAD', head = '', file = '') => formatDiff(\n await getGitDiff(ctx.repo.root, { base, head, file }),\n ctx.repo.facts.importers || {}, ctx.repo.scan.files.length, file,\n ),\n engines: () => formatEngines(toolsStatus()),\n deep: async (tool) => {\n const known = toolsStatus();\n if (tool !== 'all' && !Object.hasOwn(known, tool)) {\n return ' Unknown engine: ' + tool + '. Run `engines` to see the available names.';\n }\n return formatDeepAnalysis(await runExternalAnalysis(ctx.repo.root,\n tool === 'all' ? {} : { tools: [tool] }));\n },\n ask: async (question) => {\n if (!question.trim()) return ' Ask a question, for example: ask Where should I start?';\n const config = askConfig();\n if (!config) return askSetupMessage();\n const hits = searchRepo(ctx.repo, question, { limit: 8 });\n const lines = [\n explainRepoOverview(ctx.repo),\n `Health: ${ctx.repo.health.grade} (${ctx.repo.health.score}/100).`,\n `Entries: ${ctx.repo.facts.entries.slice(0, 10).join(', ') || 'none detected'}.`,\n `Hubs: ${ctx.repo.facts.hubs.slice(0, 10).map((hub) => hub.path).join(', ') || 'none detected'}.`,\n 'Search matches:',\n ...(hits.results || []).map((hit) => `${hit.path}${hit.line ? ':' + hit.line : ''} ${hit.snippet || ''}`),\n ];\n return '\\n AI answer\\n' + wrapText(await askModel(question, lines.join('\\n'), config), ' ');\n },\n };\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: promptFor(repo),\n terminal: true,\n historySize: 200,\n // The completer closes over the *current* repo rather than the one captured\n // here, so after a `cd` it completes paths in the new repository. Reading\n // `ctx.repo` at completion time is the whole trick.\n completer: (line) => completer(ctx.repo)(line),\n });\n\n let queue = Promise.resolve();\n let closed = false;\n let interrupts = 0;\n let onResize = null;\n\n // One poisoned promise must not end the session. `handleLine` catches its own\n // errors, but anything thrown outside it — a prompt write to a closed stream,\n // an error in a command's argument handling — would otherwise reject this\n // chain and silently swallow every command typed afterwards. The session would\n // look alive and do nothing, which is the worst failure mode a REPL has.\n rl.on('line', (line) => {\n queue = queue\n .then(() => handleLine(ctx, line, rl, out, err))\n .catch((e) => {\n err(' ' + bad((e?.message || String(e))));\n if (!closed) {\n try {\n rl.setPrompt(promptFor(ctx.repo));\n rl.prompt();\n } catch {\n // The stream is gone; the close handler finishes the session.\n }\n }\n });\n });\n\n // Ctrl-D on an empty line is the universal \"I'm done\". On a line with text,\n // readline handles it itself; this only sees the empty-line case.\n //\n // Closing does NOT end the session. A piped or fast-typed sequence of commands\n // can already be queued when the last line arrives, and resolving here would\n // throw those away mid-flight — which is exactly what happens to `tour` when\n // its input is followed immediately by `exit`. The exit waits on the queue.\n rl.on('close', () => {\n closed = true;\n // The listener is removed on every exit path, including the interval one\n // below, so a session that ends by any route leaves stdout as it found it.\n if (onResize) process.stdout.off('resize', onResize);\n });\n\n // Ctrl-C twice leaves. Once clears the line, which is what readline already\n // does, and matches every other REPL people use.\n rl.on('SIGINT', () => {\n if (closed) return;\n if (ctx.picker) {\n ctx.picker = null;\n out(dim('\\n Selection cancelled.'));\n rl.setPrompt(promptFor(ctx.repo));\n rl.prompt();\n return;\n }\n interrupts++;\n if (interrupts >= 2) {\n rl.close();\n return;\n }\n out(dim('\\n Ctrl-C again to leave.'));\n rl.setPrompt(promptFor(ctx.repo));\n rl.prompt();\n });\n\n // A resize redraws rather than leaving the prompt stranded mid-wrap.\n onResize = () => {\n if (!closed) rl.write(null, { ctrl: true, name: 'l' });\n };\n process.stdout.on('resize', onResize);\n\n queue = queue.then(() => rl.prompt());\n\n return new Promise((resolve) => {\n const poll = setInterval(() => {\n if (!closed) return;\n clearInterval(poll);\n // Drain whatever is still running, then say goodbye. A command that throws\n // has already been caught in `handleLine`, so this cannot reject.\n queue.then(() => {\n out('');\n out(dim(' bye.'));\n // A clone this session made is a temp directory, and the session is the\n // only thing that knows about it. Removing it last — after the last\n // command has finished reading files out of it — is the only ordering\n // that cannot pull the ground out from under a command still running.\n closeRemote(ctx.repo).catch((..._args: unknown[]) => {});\n resolve(0);\n });\n }, 20);\n });\n}\n\nfunction promptFor(repo) {\n return paint(' ', 'cyan') + bold(repo.name.slice(0, 24)) + paint(' > ', 'gray');\n}\n\nasync function handleLine(ctx, line, rl, out, err) {\n if (ctx.picker) {\n const result = await ctx.picker.choose(line);\n if (result.done) {\n ctx.picker = null;\n if (result.target) {\n try { out(await reload(ctx, result.target)); }\n catch (e) { err(' ' + bad(e.message || String(e))); }\n } else if (result.message) out(dim(result.message));\n } else if (result.message) out(result.message);\n rl.setPrompt(ctx.picker ? ctx.picker.prompt : promptFor(ctx.repo));\n rl.prompt();\n return;\n }\n const words = tokenize(line);\n if (!words.length) {\n rl.prompt();\n return;\n }\n const [name, ...args] = words;\n\n // `!cmd` runs a shell command from inside the session and prints its output.\n // It is the only way out to a shell, which is the point: the set of things\n // that can happen here stays small enough to remember.\n if (name.startsWith('!') && name.length > 1) {\n const result = await shellEscape(line.replace(/^!\\s*/, ''), ctx.repo.root);\n if (result) out(result);\n rl.setPrompt(promptFor(ctx.repo));\n rl.prompt();\n return;\n }\n\n const cmd = lookup(name);\n\n if (!cmd) {\n // The nearest command by edit distance is almost always what was meant, and\n // a one-line \"did you mean\" beats a paragraph about `help`.\n const near = nearest(name);\n err(' ' + bad('Unknown command: ' + name) + (near ? dim(' did you mean `' + near + '`?') : dim(' try `help`')));\n rl.prompt();\n return;\n }\n\n try {\n const result = await cmd.run(ctx, args);\n if (result === EXIT) {\n rl.close();\n return;\n }\n if (result === CLEAR) {\n out('\\x1b[2J\\x1b[3J\\x1b[H');\n } else if (result) {\n out(result);\n }\n } catch (e) {\n err(' ' + bad((e.message || String(e))));\n }\n // The prompt carries the repo name, and `cd` can change which repo that is.\n // Re-reading it after every command is cheaper than tracking which commands\n // swap the repo, and it cannot go stale.\n rl.setPrompt(ctx.picker ? ctx.picker.prompt : promptFor(ctx.repo));\n rl.prompt();\n}\n\n// Swap the loaded repo. Used by `cd` and `rescan`; the scan is the slow part,\n// so the new name reaches the prompt only after it succeeds.\nasync function reload(ctx, where) {\n const target = String(where || '').trim();\n if (!target) {\n return ' cd needs a folder or a URL — `cd ../other-repo`, `cd https://github.com/org/repo`.';\n }\n\n // `rescan` re-reads the folder the session is already in. Re-cloning the URL\n // to get the same bytes back would be slow and would change the temp\n // directory out from under the session, so a target that resolves to the\n // current root takes the local path even when the repo remembers a URL.\n const reloadingCurrent = !isGitUrl(target) && path.resolve(expandHome(target)) === path.resolve(ctx.repo.root);\n const previous = ctx.repo;\n const options = scanOptionsFromFlags(ctx.flags || {});\n const next = reloadingCurrent\n ? await openRepo(previous.root, options)\n : await openRepoOrClone(target, options);\n\n // A reload of the current folder produces a repo that has never heard of the\n // URL it was cloned from: `openRepo` reads a directory, and a directory does\n // not know where it came from. Carrying the three fields across is what keeps\n // `rescan` from silently demoting a clone to a nameless temp folder — the\n // prompt, `about` and `github` all read them.\n if (reloadingCurrent) {\n next.gitUrl = previous.gitUrl;\n next.cloneDir = previous.cloneDir;\n next.tempId = previous.tempId;\n if (previous.name !== next.name && !previous.cloneDir) next.name = previous.name;\n }\n\n // The old clone is only dropped once the new one has loaded. Doing it the\n // other way round means a typo in a URL leaves you with nothing loaded *and*\n // the repo you were reading deleted from under you.\n if (!reloadingCurrent) await closeRemote(previous);\n ctx.repo = next;\n return '\\n' + overview(next);\n}\n\n// Ask GitHub about the loaded repo and print the answer. Network failures are\n// the expected case, not the exception — this is a command someone types on a\n// plane — so every one of them comes back as a line of text.\nasync function askGithub(ctx) {\n const url = await remoteUrlFor(ctx.repo);\n if (!url) {\n return githubView(ctx.repo, { ok: false, reason: 'This folder has no GitHub remote — there is nothing to ask about.' });\n }\n return githubView(ctx.repo, await fetchRepoFacts(url));\n}\n\n// The bridge between the two surfaces. If the server is already up this just\n// prints where it is; if not, it starts it detached, so the person keeps their\n// session. The URL is the same one `onboarder start` would print, because it\n// comes from the same `serverUrls` the CLI and the banner use.\nasync function startWeb(ctx) {\n const file = ctx.flags.config || configPath();\n const settings = await readSettings(file).catch(() => null);\n const urls = serverUrls(settings || undefined);\n const recorded = readPidFile(file);\n\n if (recorded && pidIsAlive(recorded)) {\n return [' ' + ok('Already running.') + dim(` PID ${recorded}`), ' ' + cyan(urls.local)].join('\\n');\n }\n\n const { runStartBackground } = await import('../commands.js');\n const code = await runStartBackground({\n // `nonInteractive` is not optional here. With no config on disk,\n // `runStartBackground` hands off to `runSetup`, which opens its own readline\n // on the same stdin this session is already reading — the wizard and the\n // explorer would then compete for keystrokes, and the explorer could process\n // a wizard answer as a command. Inside a session the server either starts\n // from the config that exists or reports that there is none; the person can\n // run `onboarder setup` deliberately if they want the wizard.\n flags: { ...ctx.flags, json: true, nonInteractive: true },\n out: (..._args: unknown[]) => {},\n err: (..._args: unknown[]) => {},\n });\n if (code !== 0) return ' ' + bad('Could not start the web UI.') + dim(' Try `onboarder doctor`.');\n return [\n ' ' + ok('Web UI started in the background.'),\n ' ' + cyan(urls.local),\n dim(' onboarder logs -f to watch it · onboarder stop to shut it down'),\n ].join('\\n');\n}\n\n// Cheap \"did you mean\": plain Levenshtein over the command names, with a\n// distance cap of 2 so a wildly misspelled word gets \"try `help`\" instead of a\n// confident wrong suggestion. A wrong suggestion is worse than none.\nfunction nearest(word) {\n const w = String(word).toLowerCase();\n let best = null;\n let bestScore = Infinity;\n for (const name of commandNames()) {\n const d = distance(w, name);\n if (d < bestScore) {\n bestScore = d;\n best = name;\n }\n }\n return bestScore <= 2 ? best : null;\n}\n\nfunction distance(a, b) {\n let prev = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 1; i <= a.length; i++) {\n const cur = [i];\n for (let j = 1; j <= b.length; j++) {\n cur[j] = Math.min(\n prev[j] + 1,\n cur[j - 1] + 1,\n prev[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1),\n );\n }\n prev = cur;\n }\n return prev[b.length];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/explorer/app.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ScanProgress } from '../../shared/contracts.js';\nimport { scanOptionsFromFlags } from '../scanOptions.js';\n// The interactive session.\n//\n// This is a prompt, not a full-screen TUI, and that is a deliberate choice.\n// A curses app takes the scrollback, the selection, and copy-paste away, and it\n// behaves badly over SSH and inside a tmux pane — which is exactly where people\n// read a codebase. A readline session keeps all of that, prints scrollable\n// output you can select, and degrades to something scriptable. The research\n// agrees: a CLI is a conversation, and a TUI earns its cost only when you are\n// manipulating state with the keyboard rather than reading.\n//\n// Two rules from the design research are load-bearing here:\n// * TTY detection. A session that needs a terminal must never be started by a\n// pipe, a cron job, or CI — so `runExplore` refuses and explains instead of\n// hanging forever waiting for input nobody is there to type.\n// * Flags → env → config precedence. `NO_COLOR` and `COLUMNS` are honored\n// before anything is drawn, so a redirect gets plain, fitted text.\n\nimport readline from 'node:readline';\nimport { explorerAgent } from '../agent/command.js';\nimport readlinePromises from 'node:readline/promises';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { openRepo, openRepoOrClone, isGitUrl, remoteUrlFor, closeRemote, searchRepo, explainRepoOverview } from './session.js';\nimport { fetchRepoFacts } from './github.js';\nimport { CLEAR, EXIT, commandNames, completer, helpText, lookup, shellEscape, tokenize } from './commands.js';\nimport { overview, github as githubView } from './views.js';\nimport { bold, cyan, dim, ok, bad, paint } from '../ui.js';\nimport { configPath, readSettings, serverUrls } from '../../server/config.js';\nimport { readPidFile, pidIsAlive } from '../../server/pidfile.js';\nimport { expandHome } from '../../server/paths.js';\nimport { SourcePicker } from './picker.js';\nimport { getGitDiff } from '../../server/gitDiff.js';\nimport { runExternalAnalysis, toolsStatus } from '../../server/tools/scan.js';\nimport { formatDiff, formatDeepAnalysis, formatEngines } from './featureViews.js';\nimport { askConfig, askModel, askSetupMessage } from './assistant.js';\nimport { wrapText } from './wrap.js';\n\nconst VERSION = JSON.parse(\n fs.readFileSync(new URL('../../package.json', import.meta.url), 'utf8')\n).version;\n\n// The one-time note. `onboarder` used to start a web server; now it opens this.\n// Someone who upgrades and has muscle memory for the old thing deserves to be\n// told once where the server went, and then never again.\nconst HINT_MARKER = 'explorer-hint-v1';\n\nexport async function runExplore({ target = null, flags = {}, out = console.log, err = console.error, version = VERSION }: Record<string, any> = {}) {\n // The guard. `stdin` matters as much as `stdout`: a session with no input\n // source is a hang, and a hang in CI is worse than any error.\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n out('');\n out(' The terminal explorer needs an interactive terminal.');\n out(dim(' In a script or a pipe, use these instead:'));\n out(dim(' onboarder start start the web UI'));\n out(dim(' onboarder start background start it detached'));\n out(dim(' onboarder status | stop manage a running one'));\n out(dim(' onboarder --help everything else'));\n out('');\n return 0;\n }\n\n if (!target) {\n target = await chooseInitialSource(out);\n if (!target) return 0;\n }\n\n let repo;\n try {\n // The launch argument accepts a URL for the same reason `cd` does: someone\n // who has never seen this repo should be able to name it and read it. A\n // silent ten-second clone looks like a hang, so the URL case says what it\n // is doing before it starts.\n if (isGitUrl(target)) out(dim(` cloning ${target}…`));\n repo = await openRepoOrClone(target, { ...scanOptionsFromFlags(flags), onProgress: progressReporter(out) });\n } catch (e) {\n err(' ' + bad((e.message || String(e))));\n err(dim(' Point it at a folder: onboarder explore /path/to/repo'));\n err(dim(' …or a git URL: onboarder explore https://github.com/org/repo'));\n return 1;\n }\n\n out('');\n out(overview(repo));\n out('');\n if (await shouldShowHint(flags)) {\n out(dim(' Note: `onboarder` used to start the web server. That is now `onboarder start`'));\n out(dim(' (or the `web` command here) — this session reads the repo directly,'));\n out(dim(' so it needs no server and works offline.'));\n out('');\n }\n return session({ repo, flags, out, err, version });\n}\n\nasync function chooseInitialSource(out) {\n const picker = new SourcePicker();\n const rl = readlinePromises.createInterface({ input: process.stdin, output: process.stdout });\n try {\n out(await picker.view());\n for (;;) {\n const result = await picker.choose(await rl.question(picker.prompt));\n if (result.message) out(result.message);\n if (result.done) return result.target;\n }\n } catch {\n return null;\n } finally {\n rl.close();\n }\n}\n\n// Scanning a large monorepo is the one genuinely slow thing this does, so it\n// says so. A silent eight seconds is indistinguishable from a hang.\nfunction progressReporter(out: (message: string) => void) {\n let last = 0;\n return (progress: ScanProgress) => {\n if (!process.stdout.isTTY) return;\n const now = Date.now();\n if (progress.phase === 'parse' && progress.done && now - last > 400) {\n last = now;\n out(dim(`\\r scanning… ${progress.done} files`));\n }\n };\n}\n\nasync function shouldShowHint(flags) {\n if (process.env.ONBOARDER_NO_HINT) return false;\n try {\n const marker = path.join(path.dirname(flags.config || configPath()), HINT_MARKER);\n const seen = await fs.promises.stat(marker).then(() => true).catch(() => false);\n if (seen) return false;\n await fs.promises.mkdir(path.dirname(marker), { recursive: true });\n await fs.promises.writeFile(marker, 'shown\\n');\n return true;\n } catch {\n // A read-only config home is not a reason to nag on every launch.\n return false;\n }\n}\n\n// The read loop. Commands are queued rather than awaited inline, because\n// readline emits the next line while a slow command is still running and two\n// interleaved `cd`s would leave the session pointing at a repo nobody asked\n// for.\nfunction session({ repo, flags, out, err, version }) {\n let agentAbort: AbortController | null = null;\n const ctx = {\n picker: null as SourcePicker | null,\n repo,\n version,\n flags,\n help: (topic) => helpText(ctx, topic),\n rescan: () => reload(ctx, ctx.repo.root),\n loadRepo: (where) => reload(ctx, where),\n selectSource: async () => {\n ctx.picker = new SourcePicker(ctx.repo.cloneDir ? process.cwd() : ctx.repo.root);\n return ctx.picker.view();\n },\n github: () => askGithub(ctx),\n agent: async (args: string[]) => {\n if (ctx.repo.cloneDir && ['implement', 'pr'].includes(args[0])) throw new Error('Open a persistent local checkout before implementing changes or creating a PR. This explorer clone is removed when the session ends.');\n agentAbort = new AbortController();\n try { return await explorerAgent(args, ctx.repo.root, agentAbort.signal, out, err); }\n finally { agentAbort = null; }\n },\n web: () => startWeb(ctx),\n diff: async (base = 'HEAD', head = '', file = '') => formatDiff(\n await getGitDiff(ctx.repo.root, { base, head, file }),\n ctx.repo.facts.importers || {}, ctx.repo.scan.files.length, file,\n ),\n engines: () => formatEngines(toolsStatus()),\n deep: async (tool) => {\n const known = toolsStatus();\n if (tool !== 'all' && !Object.hasOwn(known, tool)) {\n return ' Unknown engine: ' + tool + '. Run `engines` to see the available names.';\n }\n return formatDeepAnalysis(await runExternalAnalysis(ctx.repo.root,\n tool === 'all' ? {} : { tools: [tool] }));\n },\n ask: async (question) => {\n if (!question.trim()) return ' Ask a question, for example: ask Where should I start?';\n const config = askConfig();\n if (!config) return askSetupMessage();\n const hits = searchRepo(ctx.repo, question, { limit: 8 });\n const lines = [\n explainRepoOverview(ctx.repo),\n `Health: ${ctx.repo.health.grade} (${ctx.repo.health.score}/100).`,\n `Entries: ${ctx.repo.facts.entries.slice(0, 10).join(', ') || 'none detected'}.`,\n `Hubs: ${ctx.repo.facts.hubs.slice(0, 10).map((hub) => hub.path).join(', ') || 'none detected'}.`,\n 'Search matches:',\n ...(hits.results || []).map((hit) => `${hit.path}${hit.line ? ':' + hit.line : ''} ${hit.snippet || ''}`),\n ];\n return '\\n AI answer\\n' + wrapText(await askModel(question, lines.join('\\n'), config), ' ');\n },\n };\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: promptFor(repo),\n terminal: true,\n historySize: 200,\n // The completer closes over the *current* repo rather than the one captured\n // here, so after a `cd` it completes paths in the new repository. Reading\n // `ctx.repo` at completion time is the whole trick.\n completer: (line) => completer(ctx.repo)(line),\n });\n\n let queue = Promise.resolve();\n let closed = false;\n let interrupts = 0;\n let onResize = null;\n\n // One poisoned promise must not end the session. `handleLine` catches its own\n // errors, but anything thrown outside it — a prompt write to a closed stream,\n // an error in a command's argument handling — would otherwise reject this\n // chain and silently swallow every command typed afterwards. The session would\n // look alive and do nothing, which is the worst failure mode a REPL has.\n rl.on('line', (line) => {\n queue = queue\n .then(() => handleLine(ctx, line, rl, out, err))\n .catch((e) => {\n err(' ' + bad((e?.message || String(e))));\n if (!closed) {\n try {\n rl.setPrompt(promptFor(ctx.repo));\n rl.prompt();\n } catch {\n // The stream is gone; the close handler finishes the session.\n }\n }\n });\n });\n\n // Ctrl-D on an empty line is the universal \"I'm done\". On a line with text,\n // readline handles it itself; this only sees the empty-line case.\n //\n // Closing does NOT end the session. A piped or fast-typed sequence of commands\n // can already be queued when the last line arrives, and resolving here would\n // throw those away mid-flight — which is exactly what happens to `tour` when\n // its input is followed immediately by `exit`. The exit waits on the queue.\n rl.on('close', () => {\n closed = true;\n agentAbort?.abort();\n // The listener is removed on every exit path, including the interval one\n // below, so a session that ends by any route leaves stdout as it found it.\n if (onResize) process.stdout.off('resize', onResize);\n });\n\n // Ctrl-C twice leaves. Once clears the line, which is what readline already\n // does, and matches every other REPL people use.\n rl.on('SIGINT', () => {\n if (closed) return;\n if (agentAbort) { agentAbort.abort(); out(dim('\\n Cancelling agent…')); return; }\n if (ctx.picker) {\n ctx.picker = null;\n out(dim('\\n Selection cancelled.'));\n rl.setPrompt(promptFor(ctx.repo));\n rl.prompt();\n return;\n }\n interrupts++;\n if (interrupts >= 2) {\n rl.close();\n return;\n }\n out(dim('\\n Ctrl-C again to leave.'));\n rl.setPrompt(promptFor(ctx.repo));\n rl.prompt();\n });\n\n // A resize redraws rather than leaving the prompt stranded mid-wrap.\n onResize = () => {\n if (!closed) rl.write(null, { ctrl: true, name: 'l' });\n };\n process.stdout.on('resize', onResize);\n\n queue = queue.then(() => rl.prompt());\n\n return new Promise((resolve) => {\n const poll = setInterval(() => {\n if (!closed) return;\n clearInterval(poll);\n // Drain whatever is still running, then say goodbye. A command that throws\n // has already been caught in `handleLine`, so this cannot reject.\n queue.then(() => {\n out('');\n out(dim(' bye.'));\n // A clone this session made is a temp directory, and the session is the\n // only thing that knows about it. Removing it last — after the last\n // command has finished reading files out of it — is the only ordering\n // that cannot pull the ground out from under a command still running.\n closeRemote(ctx.repo).catch((..._args: unknown[]) => {});\n resolve(0);\n });\n }, 20);\n });\n}\n\nfunction promptFor(repo) {\n return paint(' ', 'cyan') + bold(repo.name.slice(0, 24)) + paint(' > ', 'gray');\n}\n\nasync function handleLine(ctx, line, rl, out, err) {\n if (ctx.picker) {\n const result = await ctx.picker.choose(line);\n if (result.done) {\n ctx.picker = null;\n if (result.target) {\n try { out(await reload(ctx, result.target)); }\n catch (e) { err(' ' + bad(e.message || String(e))); }\n } else if (result.message) out(dim(result.message));\n } else if (result.message) out(result.message);\n rl.setPrompt(ctx.picker ? ctx.picker.prompt : promptFor(ctx.repo));\n rl.prompt();\n return;\n }\n const words = tokenize(line);\n if (!words.length) {\n rl.prompt();\n return;\n }\n const [name, ...args] = words;\n\n // `!cmd` runs a shell command from inside the session and prints its output.\n // It is the only way out to a shell, which is the point: the set of things\n // that can happen here stays small enough to remember.\n if (name.startsWith('!') && name.length > 1) {\n const result = await shellEscape(line.replace(/^!\\s*/, ''), ctx.repo.root);\n if (result) out(result);\n rl.setPrompt(promptFor(ctx.repo));\n rl.prompt();\n return;\n }\n\n const cmd = lookup(name);\n\n if (!cmd) {\n // The nearest command by edit distance is almost always what was meant, and\n // a one-line \"did you mean\" beats a paragraph about `help`.\n const near = nearest(name);\n err(' ' + bad('Unknown command: ' + name) + (near ? dim(' did you mean `' + near + '`?') : dim(' try `help`')));\n rl.prompt();\n return;\n }\n\n try {\n const result = await cmd.run(ctx, args);\n if (result === EXIT) {\n rl.close();\n return;\n }\n if (result === CLEAR) {\n out('\\x1b[2J\\x1b[3J\\x1b[H');\n } else if (result) {\n out(result);\n }\n } catch (e) {\n err(' ' + bad((e.message || String(e))));\n }\n // The prompt carries the repo name, and `cd` can change which repo that is.\n // Re-reading it after every command is cheaper than tracking which commands\n // swap the repo, and it cannot go stale.\n rl.setPrompt(ctx.picker ? ctx.picker.prompt : promptFor(ctx.repo));\n rl.prompt();\n}\n\n// Swap the loaded repo. Used by `cd` and `rescan`; the scan is the slow part,\n// so the new name reaches the prompt only after it succeeds.\nasync function reload(ctx, where) {\n const target = String(where || '').trim();\n if (!target) {\n return ' cd needs a folder or a URL — `cd ../other-repo`, `cd https://github.com/org/repo`.';\n }\n\n // `rescan` re-reads the folder the session is already in. Re-cloning the URL\n // to get the same bytes back would be slow and would change the temp\n // directory out from under the session, so a target that resolves to the\n // current root takes the local path even when the repo remembers a URL.\n const reloadingCurrent = !isGitUrl(target) && path.resolve(expandHome(target)) === path.resolve(ctx.repo.root);\n const previous = ctx.repo;\n const options = scanOptionsFromFlags(ctx.flags || {});\n const next = reloadingCurrent\n ? await openRepo(previous.root, options)\n : await openRepoOrClone(target, options);\n\n // A reload of the current folder produces a repo that has never heard of the\n // URL it was cloned from: `openRepo` reads a directory, and a directory does\n // not know where it came from. Carrying the three fields across is what keeps\n // `rescan` from silently demoting a clone to a nameless temp folder — the\n // prompt, `about` and `github` all read them.\n if (reloadingCurrent) {\n next.gitUrl = previous.gitUrl;\n next.cloneDir = previous.cloneDir;\n next.tempId = previous.tempId;\n if (previous.name !== next.name && !previous.cloneDir) next.name = previous.name;\n }\n\n // The old clone is only dropped once the new one has loaded. Doing it the\n // other way round means a typo in a URL leaves you with nothing loaded *and*\n // the repo you were reading deleted from under you.\n if (!reloadingCurrent) await closeRemote(previous);\n ctx.repo = next;\n return '\\n' + overview(next);\n}\n\n// Ask GitHub about the loaded repo and print the answer. Network failures are\n// the expected case, not the exception — this is a command someone types on a\n// plane — so every one of them comes back as a line of text.\nasync function askGithub(ctx) {\n const url = await remoteUrlFor(ctx.repo);\n if (!url) {\n return githubView(ctx.repo, { ok: false, reason: 'This folder has no GitHub remote — there is nothing to ask about.' });\n }\n return githubView(ctx.repo, await fetchRepoFacts(url));\n}\n\n// The bridge between the two surfaces. If the server is already up this just\n// prints where it is; if not, it starts it detached, so the person keeps their\n// session. The URL is the same one `onboarder start` would print, because it\n// comes from the same `serverUrls` the CLI and the banner use.\nexport async function startWeb(ctx) {\n const file = ctx.flags.config || configPath();\n const settings = await readSettings(file).catch(() => null);\n const urls = serverUrls(settings || undefined);\n const recorded = readPidFile(file);\n\n if (recorded && pidIsAlive(recorded)) {\n return [' ' + ok('Already running.') + dim(` PID ${recorded}`), ' ' + cyan(urls.local)].join('\\n');\n }\n\n const { runStartBackground } = await import('../commands.js');\n const code = await runStartBackground({\n // `nonInteractive` is not optional here. With no config on disk,\n // `runStartBackground` hands off to `runSetup`, which opens its own readline\n // on the same stdin this session is already reading — the wizard and the\n // explorer would then compete for keystrokes, and the explorer could process\n // a wizard answer as a command. Inside a session the server either starts\n // from the config that exists or reports that there is none; the person can\n // run `onboarder setup` deliberately if they want the wizard.\n flags: { ...ctx.flags, json: true, nonInteractive: true },\n out: (..._args: unknown[]) => {},\n err: (..._args: unknown[]) => {},\n });\n if (code !== 0) return ' ' + bad('Could not start the web UI.') + dim(' Try `onboarder doctor`.');\n return [\n ' ' + ok('Web UI started in the background.'),\n ' ' + cyan(urls.local),\n dim(' onboarder logs -f to watch it · onboarder stop to shut it down'),\n ].join('\\n');\n}\n\n// Cheap \"did you mean\": plain Levenshtein over the command names, with a\n// distance cap of 2 so a wildly misspelled word gets \"try `help`\" instead of a\n// confident wrong suggestion. A wrong suggestion is worse than none.\nfunction nearest(word) {\n const w = String(word).toLowerCase();\n let best = null;\n let bestScore = Infinity;\n for (const name of commandNames()) {\n const d = distance(w, name);\n if (d < bestScore) {\n bestScore = d;\n best = name;\n }\n }\n return bestScore <= 2 ? best : null;\n}\n\nfunction distance(a, b) {\n let prev = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 1; i <= a.length; i++) {\n const cur = [i];\n for (let j = 1; j <= b.length; j++) {\n cur[j] = Math.min(\n prev[j] + 1,\n cur[j - 1] + 1,\n prev[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1),\n );\n }\n prev = cur;\n }\n return prev[b.length];\n}\n"]}
|
package/cli/explorer/commands.js
CHANGED
|
@@ -21,6 +21,11 @@ const run = promisify(execFile);
|
|
|
21
21
|
export const EXIT = Symbol('exit');
|
|
22
22
|
export const CLEAR = Symbol('clear');
|
|
23
23
|
export const COMMANDS = [
|
|
24
|
+
{
|
|
25
|
+
name: 'agent', aliases: [], group: 'basics',
|
|
26
|
+
usage: 'agent <workflow> --task "..."', summary: 'Hermes: repository Q&A, review, triage, implementation, and GitHub tasks.',
|
|
27
|
+
run: (ctx, args) => ctx.agent(args),
|
|
28
|
+
},
|
|
24
29
|
{
|
|
25
30
|
name: 'help', aliases: ['?'], group: 'basics',
|
|
26
31
|
usage: 'help [command]', summary: 'This list, or everything about one command.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/explorer/commands.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,EAAE;AACF,iFAAiF;AACjF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,wEAAwE;AACxE,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,yEAAyE;AAEzE,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC;AAChC,OAAO,KAAK,CAAC,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AAErC,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB;QACE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ;QAC7C,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,6CAA6C;QAC/E,4EAA4E;QAC5E,0DAA0D;QAC1D,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC7C;IACD;QACE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ;QAC3D,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,wCAAwC;QAC/D,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;KACnC;IACD;QACE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ;QAC/D,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,iDAAiD;QACzE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;KAC/B;IACD;QACE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ;QAC1D,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,4DAA4D;QACrG,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;KACpE;IACD;QACE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU;QACzD,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,8CAA8C;QACvF,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACjB,wEAAwE;YACxE,+DAA+D;YAC/D,2EAA2E;YAC3E,yDAAyD;YACzD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;gBACtB,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;gBAC3B,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aAC5D,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU;QAC5D,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,wDAAwD;QACxF,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;KAChE;IACD;QACE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU;QACzE,KAAK,EAAE,4BAA4B,EAAE,OAAO,EAAE,uDAAuD;QACrG,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YACnC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;YACrB,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5B,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC9B,CAAC;KACH;IACD;QACE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,UAAU;QACzD,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,2CAA2C;QAC1E,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;KACjE;IACD;QACE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAU;QACvD,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,gDAAgD;QAClF,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACjB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM;gBAAE,OAAO,wCAAwC,CAAC;YAC7D,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC9C,IAAI,KAAK,CAAC,KAAK;gBAAE,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACxD,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,OAAO,eAAe,CAAC;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI;gBACpC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;gBAClB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;gBAChC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC;gBAChF,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAClD,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBACpD,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;aAC9B,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS;QACpD,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,qCAAqC;QAC/D,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;KACjC;IACD;QACE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS;QACjD,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,6BAA6B;QACrD,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;KAC/B;IACD;QACE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS;QACpD,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,iCAAiC;QAC3D,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;KACjC;IACD;QACE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS;QAC7D,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,6CAA6C;QACzE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;KACnC;IACD;QACE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS;QACrD,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,mDAAmD;QAC5E,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;KAChC;IACD;QACE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS;QACtD,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,6CAA6C;QACzE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;KACnC;IACD;QACE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS;QAClE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,uCAAuC;QAChE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;KAChC;IACD;QACE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS;QACrD,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,iDAAiD;QAC1E,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;KAChC;IACD;QACE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS;QACvD,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,2CAA2C;QACxE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;KACpC;IACD;QACE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU;QACzD,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,+CAA+C;QACvF,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;KAC9F;IACD;QACE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAU;QAC/D,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,gDAAgD;QAChF,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;KAClE;IACD;QACE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,UAAU;QACrE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,2CAA2C;QAC7E,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;KACpE;IACD;QACE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS;QACrD,KAAK,EAAE,mCAAmC,EAAE,OAAO,EAAE,+CAA+C;QACpG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACvB,uEAAuE;YACvE,wEAAwE;YACxE,oEAAoE;YACpE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC;gBACnE,OAAO,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;KACF;IACD;QACE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK;QAC1D,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,qCAAqC;QACpE,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;KACtE;IACD;QACE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK;QAClD,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,qDAAqD;QACzF,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;KAC3E;IACD;QACE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK;QACjD,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,gCAAgC;QAChE,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;KAClE;IACD;QACE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS;QAClE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,kDAAkD;QAC9E,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;KACnC;IACD;QACE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS;QACvE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,4DAA4D;QACxF,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;KACnC;IACD;QACE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS;QACvD,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,2CAA2C;QAC7E,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;KACpE;IACD;QACE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS;QACrD,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,qCAAqC;QACvE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;KACvC;IACD;QACE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS;QAC5E,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,qDAAqD;QAC9E,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;KAChC;IACD;QACE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS;QACjE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,2CAA2C;QACxE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;KAC7D;IACD;QACE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS;QACtD,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,kDAAkD;QAC3E,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;KAC9F;IACD;QACE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS;QAClE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,uDAAuD;QACxF,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC5E;IACD;QACE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK;QAChD,KAAK,EAAE,2BAA2B,EAAE,OAAO,EAAE,gDAAgD;QAC7F,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KAC9E;IACD;QACE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS;QACzD,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,4DAA4D;QACvF,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE;KAC5B;IACD;QACE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,SAAS;QAC1D,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,iDAAiD;QACtF,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE;KAChE;IACD;QACE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ;QAC7C,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,0DAA0D;QAC5F,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC5C;IACD;QACE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS;QACrD,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,0CAA0C;QACnE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC;KAC7C;IACD;QACE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS;QACrD,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,6BAA6B;QACvD,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;KAC3B;IACD;QACE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS;QAC7D,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,4DAA4D;QACtF,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;KAC3B;IACD;QACE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS;QAC3D,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,kDAAkD;QACrF,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE;KACpF;IACD;QACE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS;QACnD,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,2CAA2C;QACnE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,EAAE;KACjC;IACD;QACE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS;QACzD,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,qCAAqC;QAC5D,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE;KACxB;IACD;QACE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS;QACjD,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB;QAC5C,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK;KACjB;IACD;QACE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS;QACtD,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,8BAA8B;QACtD,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;KAChB;CACF,CAAC;AAEF,2EAA2E;AAC3E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;AAC1B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAI;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,8EAA8E;AAC9E,2EAA2E;AAC3E,+DAA+D;AAC/D,MAAM,UAAU,YAAY;IAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,iFAAiF;AACjF,0EAA0E;AAC1E,4EAA4E;AAC5E,yCAAyC;AACzC,MAAM,UAAU,QAAQ,CAAC,GAAG,EAAE,KAAK,GAAG,EAAE;IACtC,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;IACtB,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,OAAO,GAAG,CAAC,wBAAwB,KAAK,kBAAkB,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3F,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,OAAO;YACL,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACjD,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC;SAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,8EAA8E;IAC9E,8EAA8E;IAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;QACnC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;UACzD,qDAAqD,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,8EAA8E;AAC9E,0EAA0E;AAC1E,kCAAkC;AAClC,MAAM,UAAU,QAAQ,CAAC,IAAI;IAC3B,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,MAAM,EAAE,GAAG,4BAA4B,CAAC;IACxC,IAAI,CAAC,CAAC;IACN,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AACjF,sDAAsD;AACtD,EAAE;AACF,kFAAkF;AAClF,2EAA2E;AAC3E,kFAAkF;AAClF,iFAAiF;AACjF,yEAAyE;AACzE,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,6EAA6E;AAC7E,qDAAqD;AACrD,SAAS,SAAS,CAAC,IAAI;IACrB,OAAO,SAAS,QAAQ,CAAC,IAAI;QAC3B,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,yEAAyE;QACzE,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACpF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,4EAA4E;QAC5E,4EAA4E;QAC5E,sEAAsE;QACtE,2EAA2E;QAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACtD,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACxC,oEAAoE;YACpE,sEAAsE;YACtE,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,SAAS;YACrC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;gBAAE,MAAM;QAChC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,gEAAgE;AAChE,KAAK,UAAU,WAAW,CAAC,IAAI,EAAE,GAAG;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;QACpG,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAClF,OAAO,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC","sourcesContent":["// The command table.\n//\n// One list, used three ways: to dispatch what someone typed, to build the `help`\n// screen, and to assert in the tests that every command is reachable, has a\n// summary, and is wired to a real view. A command that exists in one of those\n// places but not the others is the kind of thing nobody notices until a user\n// types it, so the table is the only place a command is defined at all.\n//\n// `run(ctx, args)` returns a string to print, or a marker the app layer acts on\n// (`EXIT`, `CLEAR`). `args` is an array of already-parsed words, so quoting is\n// handled once, in the tokenizer, and every command sees the same shape.\n\nimport * as V from './views.js';\nimport * as A from './advanced.js';\nimport { lineNumber, resolveTarget, fileFacts } from './session.js';\nimport { bold, cyan, dim, ok, fit, termWidth } from '../ui.js';\nimport { wrapText } from './wrap.js';\nimport { formatSbom, formatWorkflows, formatAtlas, formatInspector } from './featureViews.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst run = promisify(execFile);\n\nexport const EXIT = Symbol('exit');\nexport const CLEAR = Symbol('clear');\n\nexport const COMMANDS = [\n {\n name: 'help', aliases: ['?'], group: 'basics',\n usage: 'help [command]', summary: 'This list, or everything about one command.',\n // The topic is forwarded. `help find` used to ignore its argument and print\n // the whole list, which reads as the command not working.\n run: (ctx, args) => ctx.help(args.join(' ')),\n },\n {\n name: 'map', aliases: ['overview', 'home'], group: 'basics',\n usage: 'map', summary: 'What this repo is, and where to start.',\n run: (ctx) => V.overview(ctx.repo),\n },\n {\n name: 'tour', aliases: ['start', 'onboarding'], group: 'basics',\n usage: 'tour', summary: 'The reading order a new teammate should follow.',\n run: (ctx) => V.tour(ctx.repo),\n },\n {\n name: 'explain', aliases: ['why', 'what'], group: 'basics',\n usage: 'explain [file|folder]', summary: 'This repo, or one file/folder, in prose. No AI key needed.',\n run: (ctx, args) => V.explain(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'tree', aliases: ['ls', 'files'], group: 'navigate',\n usage: 'tree [folder] [depth]', summary: 'The file tree, with entries and hubs marked.',\n run: (ctx, args) => {\n // A lone number is the depth, not a folder called \"2\". `tree 3` is what\n // everyone types when they want to see more; making them spell\n // `tree . 3` would be pedantry in a tool built to be forgiving. `.` is the\n // root, so it must not be taken as a folder name either.\n const onlyDepth = args.length === 1 && /^\\d+$/.test(args[0]);\n const sub = onlyDepth ? '' : (args[0] || '');\n return V.tree(ctx.repo, {\n sub: sub === '.' ? '' : sub,\n depth: onlyDepth ? Number(args[0]) : (Number(args[1]) || 2),\n });\n },\n },\n {\n name: 'find', aliases: ['search', 'grep'], group: 'navigate',\n usage: 'find <query>', summary: 'Search. Supports ext:js, -exclude, \"phrases\", /regex/.',\n run: (ctx, args) => V.find(ctx.repo, { query: args.join(' ') }),\n },\n {\n name: 'show', aliases: ['open', 'cat', 'read', 'code'], group: 'navigate',\n usage: 'show <file> [from] [count]', summary: 'Read a file. Name it loosely: `show logger.js` works.',\n run: (ctx, args) => V.show(ctx.repo, {\n target: args[0] || '',\n from: lineNumber(args[1], 0),\n count: lineNumber(args[2], 0),\n }),\n },\n {\n name: 'deps', aliases: ['connections'], group: 'navigate',\n usage: 'deps <file>', summary: 'What a file imports, and what imports it.',\n run: (ctx, args) => V.deps(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'inspect', aliases: ['detail'], group: 'navigate',\n usage: 'inspect <file>', summary: 'One file’s role, links, exports, and findings.',\n run: (ctx, args) => {\n const target = args.join(' ');\n if (!target) return ' Name a file: inspect path/to/file.js';\n const found = resolveTarget(ctx.repo, target);\n if (found.error) return V.explain(ctx.repo, { target });\n if (found.folder) return V.explain(ctx.repo, { target });\n const file = found.file;\n return formatInspector({\n path: file.path,\n role: fileFacts(ctx.repo, file).role,\n loc: file.loc || 0,\n complexity: file.complexity || 0,\n risk: ctx.repo.health.perFile.find((item) => item.path === file.path)?.risk || 0,\n imports: ctx.repo.facts.importsOf[file.path] || [],\n importers: ctx.repo.facts.importers[file.path] || [],\n exports: file.exports || [],\n findings: file.findings || [],\n });\n },\n },\n {\n name: 'health', aliases: ['grade'], group: 'analyze',\n usage: 'health', summary: 'Health grade, riskiest files, debt.',\n run: (ctx) => V.health(ctx.repo),\n },\n {\n name: 'hubs', aliases: ['core'], group: 'analyze',\n usage: 'hubs', summary: 'The most depended-on files.',\n run: (ctx) => V.hubs(ctx.repo),\n },\n {\n name: 'layers', aliases: ['depth'], group: 'analyze',\n usage: 'layers', summary: 'Import depth, shallowest first.',\n run: (ctx) => V.layers(ctx.repo),\n },\n {\n name: 'patterns', aliases: ['architecture'], group: 'analyze',\n usage: 'patterns', summary: 'What the architecture looks like, in prose.',\n run: (ctx) => V.patterns(ctx.repo),\n },\n {\n name: 'stats', aliases: ['numbers'], group: 'analyze',\n usage: 'stats', summary: 'Languages, biggest folders and files, complexity.',\n run: (ctx) => V.stats(ctx.repo),\n },\n {\n name: 'security', aliases: ['audit'], group: 'analyze',\n usage: 'security', summary: 'Heuristic findings from the built-in rules.',\n run: (ctx) => V.security(ctx.repo),\n },\n {\n name: 'stack', aliases: ['packages', 'services'], group: 'analyze',\n usage: 'stack', summary: 'Declared dependencies and frameworks.',\n run: (ctx) => V.stack(ctx.repo),\n },\n {\n name: 'entry', aliases: ['entries'], group: 'analyze',\n usage: 'entry', summary: 'Recognized entry points and how far they reach.',\n run: (ctx) => V.entry(ctx.repo),\n },\n {\n name: 'externals', aliases: ['drift'], group: 'analyze',\n usage: 'externals', summary: 'External packages, plus dependency drift.',\n run: (ctx) => V.externals(ctx.repo),\n },\n {\n name: 'graph', aliases: ['tree-graph'], group: 'navigate',\n usage: 'graph <file> [depth]', summary: 'The dependency tree around a file, as arrows.',\n run: (ctx, args) => A.graph(ctx.repo, { target: args[0] || '', depth: Number(args[1]) || 2 }),\n },\n {\n name: 'blast', aliases: ['impact', 'radius'], group: 'navigate',\n usage: 'blast <file>', summary: 'What breaks if this file breaks, transitively.',\n run: (ctx, args) => A.blast(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'symbols', aliases: ['outline', 'functions'], group: 'navigate',\n usage: 'symbols <file>', summary: 'Functions, classes and exports in a file.',\n run: (ctx, args) => A.symbols(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'docs', aliases: ['document'], group: 'analyze',\n usage: 'docs [file|folder] | docs --write', summary: 'Prose docs for a file, or write ONBOARDER.md.',\n run: async (ctx, args) => {\n // `--write` is the one command here that touches the filesystem. It is\n // opt-in, explicit, and prints where it wrote — a map tool should never\n // leave a file behind just because someone asked what the docs say.\n if (args[0] === '--write') {\n const abs = await A.writeDocs(ctx.repo, args[1] || 'ONBOARDER.md');\n return ' ' + ok('Wrote ') + cyan(abs);\n }\n return A.docs(ctx.repo, { target: args.filter((a) => a !== '--write').join(' ') });\n },\n },\n {\n name: 'log', aliases: ['history', 'commits'], group: 'git',\n usage: 'log [count]', summary: 'Recent commits, and who wrote them.',\n run: (ctx, args) => A.log(ctx.repo, { limit: Number(args[0]) || 15 }),\n },\n {\n name: 'hotspots', aliases: ['churn'], group: 'git',\n usage: 'hotspots [count]', summary: 'Files that are both complex and frequently changed.',\n run: (ctx, args) => A.hotspots(ctx.repo, { limit: Number(args[0]) || 12 }),\n },\n {\n name: 'blame', aliases: ['authors'], group: 'git',\n usage: 'blame <file>', summary: 'Who wrote each line of a file.',\n run: (ctx, args) => A.blame(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'coupling', aliases: ['matrix', 'heatmap'], group: 'analyze',\n usage: 'coupling', summary: 'Folder-to-folder import traffic, as a heat grid.',\n run: (ctx) => A.coupling(ctx.repo),\n },\n {\n name: 'clusters', aliases: ['communities', 'modules'], group: 'analyze',\n usage: 'clusters', summary: 'Groups of files that import each other more than the rest.',\n run: (ctx) => A.clusters(ctx.repo),\n },\n {\n name: 'diagram', aliases: ['mermaid'], group: 'analyze',\n usage: 'diagram [file]', summary: 'Mermaid source for the repo, or one file.',\n run: (ctx, args) => A.diagram(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'layers-diagram', aliases: [], group: 'analyze',\n usage: 'layers-diagram', summary: 'Mermaid source for the layer stack.',\n run: (ctx) => A.layerDiagram(ctx.repo),\n },\n {\n name: 'risks', aliases: ['problems', 'smells', 'insights'], group: 'analyze',\n usage: 'risks', summary: 'Cycles, orphans, dead exports, drift — in one list.',\n run: (ctx) => A.risks(ctx.repo),\n },\n {\n name: 'workflows', aliases: ['ci', 'pipelines'], group: 'analyze',\n usage: 'workflows', summary: 'GitHub Actions triggers, jobs, and steps.',\n run: (ctx) => formatWorkflows(ctx.repo.scan.workflows || []),\n },\n {\n name: 'atlas', aliases: ['diagrams'], group: 'analyze',\n usage: 'atlas', summary: 'An index of useful repository and file diagrams.',\n run: (ctx) => formatAtlas(ctx.repo.facts.entries, ctx.repo.facts.hubs, ctx.repo.scan.folders),\n },\n {\n name: 'sbom', aliases: ['licenses', 'inventory'], group: 'analyze',\n usage: 'sbom [filter]', summary: 'Declared dependencies and inferred license inventory.',\n run: (ctx, args) => formatSbom(ctx.repo.scan.licenseReport, args.join(' ')),\n },\n {\n name: 'diff', aliases: ['changes'], group: 'git',\n usage: 'diff [base] [head] [file]', summary: 'Git changes, patch, and dependent-file impact.',\n run: (ctx, args) => ctx.diff(args[0] || 'HEAD', args[1] || '', args[2] || ''),\n },\n {\n name: 'engines', aliases: ['analyzers'], group: 'analyze',\n usage: 'engines', summary: 'Show available external analyzers and how to install them.',\n run: (ctx) => ctx.engines(),\n },\n {\n name: 'deep', aliases: ['deep-analysis'], group: 'analyze',\n usage: 'deep <engine|all>', summary: 'Run an optional analyzer and show its findings.',\n run: (ctx, args) => args[0] ? ctx.deep(args[0]) : ctx.engines(),\n },\n {\n name: 'ask', aliases: ['ai'], group: 'basics',\n usage: 'ask <question>', summary: 'Ask an optional OpenAI-compatible model about this repo.',\n run: (ctx, args) => ctx.ask(args.join(' ')),\n },\n {\n name: 'about', aliases: ['version'], group: 'session',\n usage: 'about', summary: 'Version, repo path, and what is indexed.',\n run: (ctx) => V.about(ctx.repo, ctx.version),\n },\n {\n name: 'rescan', aliases: ['reload'], group: 'session',\n usage: 'rescan', summary: 'Re-read the repo from disk.',\n run: (ctx) => ctx.rescan(),\n },\n {\n name: 'github', aliases: ['remote', 'repo'], group: 'session',\n usage: 'github', summary: \"What GitHub says about this repo — stars, issues, license.\",\n run: (ctx) => ctx.github(),\n },\n {\n name: 'cd', aliases: ['open-repo', 'use'], group: 'session',\n usage: 'cd [folder|url]', summary: 'Choose a folder, or load one by path or Git URL.',\n run: (ctx, args) => args.length ? ctx.loadRepo(args.join(' ')) : ctx.selectSource(),\n },\n {\n name: 'pick', aliases: ['browse'], group: 'session',\n usage: 'pick', summary: 'Browse device folders or paste a Git URL.',\n run: (ctx) => ctx.selectSource(),\n },\n {\n name: 'web', aliases: ['site', 'serve'], group: 'session',\n usage: 'web', summary: 'Start the web UI and print its URL.',\n run: (ctx) => ctx.web(),\n },\n {\n name: 'clear', aliases: ['cls'], group: 'session',\n usage: 'clear', summary: 'Clear the screen.',\n run: () => CLEAR,\n },\n {\n name: 'exit', aliases: ['quit', 'q'], group: 'session',\n usage: 'exit', summary: 'Leave. Ctrl-D does the same.',\n run: () => EXIT,\n },\n];\n\n// One lookup for every spelling a person might type, built once at import.\nconst BY_NAME = new Map();\nfor (const cmd of COMMANDS) {\n BY_NAME.set(cmd.name, cmd);\n for (const a of cmd.aliases) BY_NAME.set(a, cmd);\n}\n\nexport function lookup(word) {\n return BY_NAME.get(String(word || '').toLowerCase());\n}\n\n// Every canonical name, for \"did you mean\" matching. Aliases are deliberately\n// excluded: suggesting `open` when someone typed `sho` is less useful than\n// suggesting `show`, which is the word they were reaching for.\nexport function commandNames() {\n return COMMANDS.map((c) => c.name);\n}\n\n// `help <command>` answers about one command; bare `help` lists them, grouped so\n// the shape of the tool is visible rather than alphabetical. Every row is\n// fitted, because a long summary on a narrow terminal used to wrap into the\n// next row and make the list unreadable.\nexport function helpText(ctx, topic = '') {\n const w = termWidth();\n if (topic) {\n const cmd = lookup(topic);\n if (!cmd) return fit(` No command called \"${topic}\". Try \\`help\\`.`, Math.max(10, w - 2));\n const also = cmd.aliases.length ? ` (also: ${cmd.aliases.join(', ')})` : '';\n return [\n fit(' ' + cmd.usage + also, Math.max(10, w - 2)),\n wrapText(cmd.summary, ' '),\n ].join('\\n');\n }\n const groups = new Map();\n for (const cmd of COMMANDS) {\n if (!groups.has(cmd.group)) groups.set(cmd.group, []);\n groups.get(cmd.group).push(cmd);\n }\n // Two cells of indent, two of gap, and the summary gets whatever is left. The\n // usage column shrinks with the terminal rather than pushing the text off it.\n const longest = Math.max(...COMMANDS.map((c) => c.usage.length));\n const usageRoom = Math.max(8, Math.min(longest, Math.floor(w * 0.4)));\n const out = [];\n for (const [group, list] of groups) {\n out.push(fit(' ' + group.toUpperCase(), Math.max(10, w - 2)));\n for (const c of list) {\n const left = ' ' + fit(c.usage, usageRoom);\n const room = w - left.length - 2;\n out.push(room > 8 ? left + ' ' + fit(c.summary, room, { tail: false }) : left);\n }\n }\n out.push('');\n out.push(fit(' ' + (ctx?.repo ? ctx.repo.name : 'onboarder')\n + ' · Ctrl-D or `exit` to leave · Ctrl-C twice to quit', Math.max(10, w - 2)));\n return out.join('\\n');\n}\n\n// Split a typed line into words, honoring quotes so `find \"exact phrase\"` and\n// `show \"my file.js\"` arrive as one argument each. Done once, here, so no\n// command has to re-implement it.\nexport function tokenize(line) {\n const out = [];\n const re = /\"([^\"]*)\"|'([^']*)'|(\\S+)/g;\n let m;\n while ((m = re.exec(String(line || '')))) out.push(m[1] ?? m[2] ?? m[3]);\n return out;\n}\n\n// Tab completion, because a REPL where you retype `shared/analyzer/graph.js` one\n// letter at a time is not a REPL, it is a punishment.\n//\n// Two contexts, chosen by what is already typed. Before the first space, the line\n// is a command name, so it completes against the command table — including\n// aliases, because a person who types `ls` wants `tree` to finish. After a space,\n// it is an argument, so it completes against real file paths in the loaded repo,\n// which is the thing that is tedious to type and impossible to remember.\n//\n// `shellEscape` is the other half of a good REPL: `!git status` runs a shell\n// command and hands the output back, so nobody has to leave the session to run\n// one thing. It is deliberately the *only* way out to a shell, so the set of\n// things that can happen in a session stays legible.\nfunction completer(repo) {\n return function complete(line) {\n const trailingSpace = /\\s$/.test(line);\n const parts = line.split(/\\s+/);\n // Completing a command (no space yet, or trailing space after one word).\n if (parts.length <= 1 || (parts.length === 2 && trailingSpace)) {\n const hits = [...BY_NAME.keys()].filter((n) => n.startsWith(parts[0] || '')).sort();\n return [hits.length ? hits : parts, parts[0] || ''];\n }\n // Completing a path argument against the loaded repo. Matches at any depth,\n // not just from the root: `show rend` should find `src/render.js`, which is\n // the case the resolver's forgiving path lookup already handles — the\n // completer has to agree with it or Tab contradicts what the command does.\n const frag = parts[parts.length - 1] || '';\n const slash = frag.lastIndexOf('/');\n const dir = slash === -1 ? '' : frag.slice(0, slash + 1);\n const base = slash === -1 ? frag : frag.slice(slash + 1);\n const seen = new Set();\n const hits = [];\n for (const f of repo.scan.allFiles || repo.scan.files) {\n if (dir && !f.startsWith(dir)) continue;\n // With no directory typed, match the *last* segment so `rend` finds\n // `src/render.js`; with one typed, match the segment being completed.\n const name = dir ? f.slice(dir.length) : f.slice(f.lastIndexOf('/') + 1);\n if (!name.startsWith(base)) continue;\n if (seen.has(name)) continue;\n seen.add(name);\n hits.push(name);\n if (hits.length >= 200) break;\n }\n return [hits.length ? hits : [frag], frag];\n };\n}\n\n// Run a shell command and capture its output. A non-zero exit is not a crash —\n// `grep` that finds nothing is a normal answer — so the code is reported, not\n// thrown. There is no `shell: true`: the whole line is the argument vector, so\n// nothing in a filename can be interpreted as a second command.\nasync function shellEscape(line, cwd) {\n const parts = tokenize(line);\n if (!parts.length) return null;\n try {\n const { stdout, stderr } = await run(parts[0], parts.slice(1), { cwd, maxBuffer: 8 * 1024 * 1024 });\n const out = String(stdout || '').trimEnd();\n const err = String(stderr || '').trimEnd();\n return [out, err].filter(Boolean).join('\\n') || dim(' (no output)');\n } catch (e) {\n const code = e.code ?? e.status;\n const err = String(e.stderr || '').trimEnd() || String(e.message || '').trimEnd();\n return dim(' exit ' + (code ?? '?') + (err ? '\\n ' + err : ''));\n }\n}\n\nexport { completer, shellEscape };\n"]}
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/explorer/commands.ts"],"names":[],"mappings":"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","sourcesContent":["// The command table.\n//\n// One list, used three ways: to dispatch what someone typed, to build the `help`\n// screen, and to assert in the tests that every command is reachable, has a\n// summary, and is wired to a real view. A command that exists in one of those\n// places but not the others is the kind of thing nobody notices until a user\n// types it, so the table is the only place a command is defined at all.\n//\n// `run(ctx, args)` returns a string to print, or a marker the app layer acts on\n// (`EXIT`, `CLEAR`). `args` is an array of already-parsed words, so quoting is\n// handled once, in the tokenizer, and every command sees the same shape.\n\nimport * as V from './views.js';\nimport * as A from './advanced.js';\nimport { lineNumber, resolveTarget, fileFacts } from './session.js';\nimport { bold, cyan, dim, ok, fit, termWidth } from '../ui.js';\nimport { wrapText } from './wrap.js';\nimport { formatSbom, formatWorkflows, formatAtlas, formatInspector } from './featureViews.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst run = promisify(execFile);\n\nexport const EXIT = Symbol('exit');\nexport const CLEAR = Symbol('clear');\n\nexport const COMMANDS = [\n {\n name: 'agent', aliases: [], group: 'basics',\n usage: 'agent <workflow> --task \"...\"', summary: 'Hermes: repository Q&A, review, triage, implementation, and GitHub tasks.',\n run: (ctx, args) => ctx.agent(args),\n },\n {\n name: 'help', aliases: ['?'], group: 'basics',\n usage: 'help [command]', summary: 'This list, or everything about one command.',\n // The topic is forwarded. `help find` used to ignore its argument and print\n // the whole list, which reads as the command not working.\n run: (ctx, args) => ctx.help(args.join(' ')),\n },\n {\n name: 'map', aliases: ['overview', 'home'], group: 'basics',\n usage: 'map', summary: 'What this repo is, and where to start.',\n run: (ctx) => V.overview(ctx.repo),\n },\n {\n name: 'tour', aliases: ['start', 'onboarding'], group: 'basics',\n usage: 'tour', summary: 'The reading order a new teammate should follow.',\n run: (ctx) => V.tour(ctx.repo),\n },\n {\n name: 'explain', aliases: ['why', 'what'], group: 'basics',\n usage: 'explain [file|folder]', summary: 'This repo, or one file/folder, in prose. No AI key needed.',\n run: (ctx, args) => V.explain(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'tree', aliases: ['ls', 'files'], group: 'navigate',\n usage: 'tree [folder] [depth]', summary: 'The file tree, with entries and hubs marked.',\n run: (ctx, args) => {\n // A lone number is the depth, not a folder called \"2\". `tree 3` is what\n // everyone types when they want to see more; making them spell\n // `tree . 3` would be pedantry in a tool built to be forgiving. `.` is the\n // root, so it must not be taken as a folder name either.\n const onlyDepth = args.length === 1 && /^\\d+$/.test(args[0]);\n const sub = onlyDepth ? '' : (args[0] || '');\n return V.tree(ctx.repo, {\n sub: sub === '.' ? '' : sub,\n depth: onlyDepth ? Number(args[0]) : (Number(args[1]) || 2),\n });\n },\n },\n {\n name: 'find', aliases: ['search', 'grep'], group: 'navigate',\n usage: 'find <query>', summary: 'Search. Supports ext:js, -exclude, \"phrases\", /regex/.',\n run: (ctx, args) => V.find(ctx.repo, { query: args.join(' ') }),\n },\n {\n name: 'show', aliases: ['open', 'cat', 'read', 'code'], group: 'navigate',\n usage: 'show <file> [from] [count]', summary: 'Read a file. Name it loosely: `show logger.js` works.',\n run: (ctx, args) => V.show(ctx.repo, {\n target: args[0] || '',\n from: lineNumber(args[1], 0),\n count: lineNumber(args[2], 0),\n }),\n },\n {\n name: 'deps', aliases: ['connections'], group: 'navigate',\n usage: 'deps <file>', summary: 'What a file imports, and what imports it.',\n run: (ctx, args) => V.deps(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'inspect', aliases: ['detail'], group: 'navigate',\n usage: 'inspect <file>', summary: 'One file’s role, links, exports, and findings.',\n run: (ctx, args) => {\n const target = args.join(' ');\n if (!target) return ' Name a file: inspect path/to/file.js';\n const found = resolveTarget(ctx.repo, target);\n if (found.error) return V.explain(ctx.repo, { target });\n if (found.folder) return V.explain(ctx.repo, { target });\n const file = found.file;\n return formatInspector({\n path: file.path,\n role: fileFacts(ctx.repo, file).role,\n loc: file.loc || 0,\n complexity: file.complexity || 0,\n risk: ctx.repo.health.perFile.find((item) => item.path === file.path)?.risk || 0,\n imports: ctx.repo.facts.importsOf[file.path] || [],\n importers: ctx.repo.facts.importers[file.path] || [],\n exports: file.exports || [],\n findings: file.findings || [],\n });\n },\n },\n {\n name: 'health', aliases: ['grade'], group: 'analyze',\n usage: 'health', summary: 'Health grade, riskiest files, debt.',\n run: (ctx) => V.health(ctx.repo),\n },\n {\n name: 'hubs', aliases: ['core'], group: 'analyze',\n usage: 'hubs', summary: 'The most depended-on files.',\n run: (ctx) => V.hubs(ctx.repo),\n },\n {\n name: 'layers', aliases: ['depth'], group: 'analyze',\n usage: 'layers', summary: 'Import depth, shallowest first.',\n run: (ctx) => V.layers(ctx.repo),\n },\n {\n name: 'patterns', aliases: ['architecture'], group: 'analyze',\n usage: 'patterns', summary: 'What the architecture looks like, in prose.',\n run: (ctx) => V.patterns(ctx.repo),\n },\n {\n name: 'stats', aliases: ['numbers'], group: 'analyze',\n usage: 'stats', summary: 'Languages, biggest folders and files, complexity.',\n run: (ctx) => V.stats(ctx.repo),\n },\n {\n name: 'security', aliases: ['audit'], group: 'analyze',\n usage: 'security', summary: 'Heuristic findings from the built-in rules.',\n run: (ctx) => V.security(ctx.repo),\n },\n {\n name: 'stack', aliases: ['packages', 'services'], group: 'analyze',\n usage: 'stack', summary: 'Declared dependencies and frameworks.',\n run: (ctx) => V.stack(ctx.repo),\n },\n {\n name: 'entry', aliases: ['entries'], group: 'analyze',\n usage: 'entry', summary: 'Recognized entry points and how far they reach.',\n run: (ctx) => V.entry(ctx.repo),\n },\n {\n name: 'externals', aliases: ['drift'], group: 'analyze',\n usage: 'externals', summary: 'External packages, plus dependency drift.',\n run: (ctx) => V.externals(ctx.repo),\n },\n {\n name: 'graph', aliases: ['tree-graph'], group: 'navigate',\n usage: 'graph <file> [depth]', summary: 'The dependency tree around a file, as arrows.',\n run: (ctx, args) => A.graph(ctx.repo, { target: args[0] || '', depth: Number(args[1]) || 2 }),\n },\n {\n name: 'blast', aliases: ['impact', 'radius'], group: 'navigate',\n usage: 'blast <file>', summary: 'What breaks if this file breaks, transitively.',\n run: (ctx, args) => A.blast(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'symbols', aliases: ['outline', 'functions'], group: 'navigate',\n usage: 'symbols <file>', summary: 'Functions, classes and exports in a file.',\n run: (ctx, args) => A.symbols(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'docs', aliases: ['document'], group: 'analyze',\n usage: 'docs [file|folder] | docs --write', summary: 'Prose docs for a file, or write ONBOARDER.md.',\n run: async (ctx, args) => {\n // `--write` is the one command here that touches the filesystem. It is\n // opt-in, explicit, and prints where it wrote — a map tool should never\n // leave a file behind just because someone asked what the docs say.\n if (args[0] === '--write') {\n const abs = await A.writeDocs(ctx.repo, args[1] || 'ONBOARDER.md');\n return ' ' + ok('Wrote ') + cyan(abs);\n }\n return A.docs(ctx.repo, { target: args.filter((a) => a !== '--write').join(' ') });\n },\n },\n {\n name: 'log', aliases: ['history', 'commits'], group: 'git',\n usage: 'log [count]', summary: 'Recent commits, and who wrote them.',\n run: (ctx, args) => A.log(ctx.repo, { limit: Number(args[0]) || 15 }),\n },\n {\n name: 'hotspots', aliases: ['churn'], group: 'git',\n usage: 'hotspots [count]', summary: 'Files that are both complex and frequently changed.',\n run: (ctx, args) => A.hotspots(ctx.repo, { limit: Number(args[0]) || 12 }),\n },\n {\n name: 'blame', aliases: ['authors'], group: 'git',\n usage: 'blame <file>', summary: 'Who wrote each line of a file.',\n run: (ctx, args) => A.blame(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'coupling', aliases: ['matrix', 'heatmap'], group: 'analyze',\n usage: 'coupling', summary: 'Folder-to-folder import traffic, as a heat grid.',\n run: (ctx) => A.coupling(ctx.repo),\n },\n {\n name: 'clusters', aliases: ['communities', 'modules'], group: 'analyze',\n usage: 'clusters', summary: 'Groups of files that import each other more than the rest.',\n run: (ctx) => A.clusters(ctx.repo),\n },\n {\n name: 'diagram', aliases: ['mermaid'], group: 'analyze',\n usage: 'diagram [file]', summary: 'Mermaid source for the repo, or one file.',\n run: (ctx, args) => A.diagram(ctx.repo, { target: args.join(' ') }),\n },\n {\n name: 'layers-diagram', aliases: [], group: 'analyze',\n usage: 'layers-diagram', summary: 'Mermaid source for the layer stack.',\n run: (ctx) => A.layerDiagram(ctx.repo),\n },\n {\n name: 'risks', aliases: ['problems', 'smells', 'insights'], group: 'analyze',\n usage: 'risks', summary: 'Cycles, orphans, dead exports, drift — in one list.',\n run: (ctx) => A.risks(ctx.repo),\n },\n {\n name: 'workflows', aliases: ['ci', 'pipelines'], group: 'analyze',\n usage: 'workflows', summary: 'GitHub Actions triggers, jobs, and steps.',\n run: (ctx) => formatWorkflows(ctx.repo.scan.workflows || []),\n },\n {\n name: 'atlas', aliases: ['diagrams'], group: 'analyze',\n usage: 'atlas', summary: 'An index of useful repository and file diagrams.',\n run: (ctx) => formatAtlas(ctx.repo.facts.entries, ctx.repo.facts.hubs, ctx.repo.scan.folders),\n },\n {\n name: 'sbom', aliases: ['licenses', 'inventory'], group: 'analyze',\n usage: 'sbom [filter]', summary: 'Declared dependencies and inferred license inventory.',\n run: (ctx, args) => formatSbom(ctx.repo.scan.licenseReport, args.join(' ')),\n },\n {\n name: 'diff', aliases: ['changes'], group: 'git',\n usage: 'diff [base] [head] [file]', summary: 'Git changes, patch, and dependent-file impact.',\n run: (ctx, args) => ctx.diff(args[0] || 'HEAD', args[1] || '', args[2] || ''),\n },\n {\n name: 'engines', aliases: ['analyzers'], group: 'analyze',\n usage: 'engines', summary: 'Show available external analyzers and how to install them.',\n run: (ctx) => ctx.engines(),\n },\n {\n name: 'deep', aliases: ['deep-analysis'], group: 'analyze',\n usage: 'deep <engine|all>', summary: 'Run an optional analyzer and show its findings.',\n run: (ctx, args) => args[0] ? ctx.deep(args[0]) : ctx.engines(),\n },\n {\n name: 'ask', aliases: ['ai'], group: 'basics',\n usage: 'ask <question>', summary: 'Ask an optional OpenAI-compatible model about this repo.',\n run: (ctx, args) => ctx.ask(args.join(' ')),\n },\n {\n name: 'about', aliases: ['version'], group: 'session',\n usage: 'about', summary: 'Version, repo path, and what is indexed.',\n run: (ctx) => V.about(ctx.repo, ctx.version),\n },\n {\n name: 'rescan', aliases: ['reload'], group: 'session',\n usage: 'rescan', summary: 'Re-read the repo from disk.',\n run: (ctx) => ctx.rescan(),\n },\n {\n name: 'github', aliases: ['remote', 'repo'], group: 'session',\n usage: 'github', summary: \"What GitHub says about this repo — stars, issues, license.\",\n run: (ctx) => ctx.github(),\n },\n {\n name: 'cd', aliases: ['open-repo', 'use'], group: 'session',\n usage: 'cd [folder|url]', summary: 'Choose a folder, or load one by path or Git URL.',\n run: (ctx, args) => args.length ? ctx.loadRepo(args.join(' ')) : ctx.selectSource(),\n },\n {\n name: 'pick', aliases: ['browse'], group: 'session',\n usage: 'pick', summary: 'Browse device folders or paste a Git URL.',\n run: (ctx) => ctx.selectSource(),\n },\n {\n name: 'web', aliases: ['site', 'serve'], group: 'session',\n usage: 'web', summary: 'Start the web UI and print its URL.',\n run: (ctx) => ctx.web(),\n },\n {\n name: 'clear', aliases: ['cls'], group: 'session',\n usage: 'clear', summary: 'Clear the screen.',\n run: () => CLEAR,\n },\n {\n name: 'exit', aliases: ['quit', 'q'], group: 'session',\n usage: 'exit', summary: 'Leave. Ctrl-D does the same.',\n run: () => EXIT,\n },\n];\n\n// One lookup for every spelling a person might type, built once at import.\nconst BY_NAME = new Map();\nfor (const cmd of COMMANDS) {\n BY_NAME.set(cmd.name, cmd);\n for (const a of cmd.aliases) BY_NAME.set(a, cmd);\n}\n\nexport function lookup(word) {\n return BY_NAME.get(String(word || '').toLowerCase());\n}\n\n// Every canonical name, for \"did you mean\" matching. Aliases are deliberately\n// excluded: suggesting `open` when someone typed `sho` is less useful than\n// suggesting `show`, which is the word they were reaching for.\nexport function commandNames() {\n return COMMANDS.map((c) => c.name);\n}\n\n// `help <command>` answers about one command; bare `help` lists them, grouped so\n// the shape of the tool is visible rather than alphabetical. Every row is\n// fitted, because a long summary on a narrow terminal used to wrap into the\n// next row and make the list unreadable.\nexport function helpText(ctx, topic = '') {\n const w = termWidth();\n if (topic) {\n const cmd = lookup(topic);\n if (!cmd) return fit(` No command called \"${topic}\". Try \\`help\\`.`, Math.max(10, w - 2));\n const also = cmd.aliases.length ? ` (also: ${cmd.aliases.join(', ')})` : '';\n return [\n fit(' ' + cmd.usage + also, Math.max(10, w - 2)),\n wrapText(cmd.summary, ' '),\n ].join('\\n');\n }\n const groups = new Map();\n for (const cmd of COMMANDS) {\n if (!groups.has(cmd.group)) groups.set(cmd.group, []);\n groups.get(cmd.group).push(cmd);\n }\n // Two cells of indent, two of gap, and the summary gets whatever is left. The\n // usage column shrinks with the terminal rather than pushing the text off it.\n const longest = Math.max(...COMMANDS.map((c) => c.usage.length));\n const usageRoom = Math.max(8, Math.min(longest, Math.floor(w * 0.4)));\n const out = [];\n for (const [group, list] of groups) {\n out.push(fit(' ' + group.toUpperCase(), Math.max(10, w - 2)));\n for (const c of list) {\n const left = ' ' + fit(c.usage, usageRoom);\n const room = w - left.length - 2;\n out.push(room > 8 ? left + ' ' + fit(c.summary, room, { tail: false }) : left);\n }\n }\n out.push('');\n out.push(fit(' ' + (ctx?.repo ? ctx.repo.name : 'onboarder')\n + ' · Ctrl-D or `exit` to leave · Ctrl-C twice to quit', Math.max(10, w - 2)));\n return out.join('\\n');\n}\n\n// Split a typed line into words, honoring quotes so `find \"exact phrase\"` and\n// `show \"my file.js\"` arrive as one argument each. Done once, here, so no\n// command has to re-implement it.\nexport function tokenize(line) {\n const out = [];\n const re = /\"([^\"]*)\"|'([^']*)'|(\\S+)/g;\n let m;\n while ((m = re.exec(String(line || '')))) out.push(m[1] ?? m[2] ?? m[3]);\n return out;\n}\n\n// Tab completion, because a REPL where you retype `shared/analyzer/graph.js` one\n// letter at a time is not a REPL, it is a punishment.\n//\n// Two contexts, chosen by what is already typed. Before the first space, the line\n// is a command name, so it completes against the command table — including\n// aliases, because a person who types `ls` wants `tree` to finish. After a space,\n// it is an argument, so it completes against real file paths in the loaded repo,\n// which is the thing that is tedious to type and impossible to remember.\n//\n// `shellEscape` is the other half of a good REPL: `!git status` runs a shell\n// command and hands the output back, so nobody has to leave the session to run\n// one thing. It is deliberately the *only* way out to a shell, so the set of\n// things that can happen in a session stays legible.\nfunction completer(repo) {\n return function complete(line) {\n const trailingSpace = /\\s$/.test(line);\n const parts = line.split(/\\s+/);\n // Completing a command (no space yet, or trailing space after one word).\n if (parts.length <= 1 || (parts.length === 2 && trailingSpace)) {\n const hits = [...BY_NAME.keys()].filter((n) => n.startsWith(parts[0] || '')).sort();\n return [hits.length ? hits : parts, parts[0] || ''];\n }\n // Completing a path argument against the loaded repo. Matches at any depth,\n // not just from the root: `show rend` should find `src/render.js`, which is\n // the case the resolver's forgiving path lookup already handles — the\n // completer has to agree with it or Tab contradicts what the command does.\n const frag = parts[parts.length - 1] || '';\n const slash = frag.lastIndexOf('/');\n const dir = slash === -1 ? '' : frag.slice(0, slash + 1);\n const base = slash === -1 ? frag : frag.slice(slash + 1);\n const seen = new Set();\n const hits = [];\n for (const f of repo.scan.allFiles || repo.scan.files) {\n if (dir && !f.startsWith(dir)) continue;\n // With no directory typed, match the *last* segment so `rend` finds\n // `src/render.js`; with one typed, match the segment being completed.\n const name = dir ? f.slice(dir.length) : f.slice(f.lastIndexOf('/') + 1);\n if (!name.startsWith(base)) continue;\n if (seen.has(name)) continue;\n seen.add(name);\n hits.push(name);\n if (hits.length >= 200) break;\n }\n return [hits.length ? hits : [frag], frag];\n };\n}\n\n// Run a shell command and capture its output. A non-zero exit is not a crash —\n// `grep` that finds nothing is a normal answer — so the code is reported, not\n// thrown. There is no `shell: true`: the whole line is the argument vector, so\n// nothing in a filename can be interpreted as a second command.\nasync function shellEscape(line, cwd) {\n const parts = tokenize(line);\n if (!parts.length) return null;\n try {\n const { stdout, stderr } = await run(parts[0], parts.slice(1), { cwd, maxBuffer: 8 * 1024 * 1024 });\n const out = String(stdout || '').trimEnd();\n const err = String(stderr || '').trimEnd();\n return [out, err].filter(Boolean).join('\\n') || dim(' (no output)');\n } catch (e) {\n const code = e.code ?? e.status;\n const err = String(e.stderr || '').trimEnd() || String(e.message || '').trimEnd();\n return dim(' exit ' + (code ?? '?') + (err ? '\\n ' + err : ''));\n }\n}\n\nexport { completer, shellEscape };\n"]}
|
|
@@ -118,6 +118,8 @@ export function formatEngines(status) {
|
|
|
118
118
|
for (const [id, tool] of Object.entries(status)) {
|
|
119
119
|
const state = !tool.available ? 'missing' : tool.how === 'path' ? 'installed' : 'runnable';
|
|
120
120
|
lines.push(` ${state} ${tool.label} (${id}) · ${tool.kind}`);
|
|
121
|
+
if (tool.purpose)
|
|
122
|
+
lines.push(` ${tool.purpose}`);
|
|
121
123
|
lines.push(` ${tool.available ? tool.how || 'available' : tool.reason || 'Not installed'}`);
|
|
122
124
|
}
|
|
123
125
|
lines.push('', ' Run: deep <engine> or deep all');
|
|
@@ -167,6 +169,8 @@ export function formatDeepAnalysis(report) {
|
|
|
167
169
|
for (const finding of report.findings.slice(0, 40)) {
|
|
168
170
|
const place = finding.path || finding.file || '(repository)';
|
|
169
171
|
lines.push(` ${finding.severity || 'info'} ${place}${finding.line ? `:${finding.line}` : ''} ${finding.rule || finding.message || ''}`);
|
|
172
|
+
if (finding.message && finding.rule)
|
|
173
|
+
lines.push(` ${finding.message}`);
|
|
170
174
|
}
|
|
171
175
|
if (report.findings.length > 40)
|
|
172
176
|
lines.push(` … ${report.findings.length - 40} more findings.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureViews.js","sourceRoot":"","sources":["../../src/cli/explorer/featureViews.ts"],"names":[],"mappings":"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","sourcesContent":["/** Terminal projections of data already used by the web views. */\n\ninterface WorkflowStep { name: string; uses?: string | null }\ninterface WorkflowJob { name: string; runsOn?: string; needs?: string[]; steps?: WorkflowStep[] }\ninterface Workflow { name: string; file: string; triggers?: string[]; jobs?: WorkflowJob[] }\n\ninterface License { id: string; name?: string; type?: string }\ninterface Package { name: string; version: string; ecosystem: string; isDev: boolean; license?: License }\ninterface LicenseReport {\n projectLicense: License;\n sbom: Package[];\n counts: { total: number; permissive: number; copyleft: number; weakCopyleft: number; unknown: number };\n complianceStatus: string;\n}\n\ninterface DiffLine { type: 'add' | 'del' | 'context'; text: string }\ninterface DiffHunk { header: string; lines: DiffLine[] }\ninterface DiffFile {\n oldPath: string; newPath: string; status: string;\n additions: number; deletions: number; hunks: DiffHunk[];\n}\ninterface GitDiff {\n files: DiffFile[];\n stats: { additions: number; deletions: number };\n}\n\ninterface ToolStatus {\n label: string; kind: string; available: boolean;\n how?: string | null; reason?: string | null;\n}\ninterface Finding {\n path?: string; file?: string; line?: number;\n severity?: string; rule?: string; message?: string; tool?: string;\n}\ninterface AnalysisPass {\n id: string; label: string; ok: boolean; available: boolean;\n findings: Finding[]; reason?: string; ms?: number;\n}\ninterface AnalysisReport { passes: AnalysisPass[]; findings: Finding[]; ms: number }\n\nfunction columns(): number {\n const env = Number(process.env.COLUMNS);\n return Number.isInteger(env) && env > 0 ? env : process.stdout.columns || 80;\n}\n\nfunction fit(value: unknown, width = columns()): string {\n const text = String(value ?? '').replace(/[\\r\\n\\t]/g, ' ');\n if (width <= 0) return '';\n const points = [...text];\n return points.length <= width ? text : points.slice(0, Math.max(0, width - 1)).join('') + (width > 1 ? '…' : '');\n}\n\nfunction screen(title: string, lines: string[]): string {\n const width = columns();\n const rule = '─'.repeat(Math.max(0, Math.min(width - 2, 48)));\n return ['', fit(` ${title.toUpperCase()}`), fit(` ${rule}`), ...lines.map((line) => fit(line)), ''].join('\\n');\n}\n\nexport function formatWorkflows(workflows: Workflow[]): string {\n if (!workflows.length) return screen('Workflows', [\n ' No GitHub Actions workflows found in .github/workflows/.',\n ]);\n const lines: string[] = [` ${workflows.length} workflow${workflows.length === 1 ? '' : 's'}`];\n for (const workflow of workflows) {\n lines.push('', ` ${workflow.name} · ${workflow.file}`);\n lines.push(` Triggers: ${(workflow.triggers || []).join(', ') || 'none detected'}`);\n for (const job of workflow.jobs || []) {\n lines.push(` ${job.name} ${job.runsOn || ''}`);\n if (job.needs?.length) lines.push(` After: ${job.needs.join(', ')}`);\n for (const step of job.steps || []) lines.push(` · ${step.name}${step.uses ? ` (${step.uses})` : ''}`);\n }\n if (!workflow.jobs?.length) lines.push(' No jobs parsed.');\n }\n return screen('Workflows', lines);\n}\n\nexport function formatSbom(report: LicenseReport | null | undefined, filter = ''): string {\n if (!report) return screen('Software bill of materials', [' Dependency inventory is unavailable for this scan.']);\n const packages = report.sbom || [];\n const q = filter.toLowerCase().trim();\n const selected = q ? packages.filter((item) =>\n item.name.toLowerCase().includes(q) || item.ecosystem.toLowerCase().includes(q)\n || item.license?.id.toLowerCase().includes(q)) : packages;\n const lines = [\n ` Project license ${report.projectLicense?.id || 'unknown'}`,\n ` Dependencies ${report.counts.total} declared · ${report.counts.copyleft} copyleft · ${report.counts.unknown} unknown`,\n ` License review ${report.complianceStatus}${report.counts.unknown ? ' (unknown licenses need checking)' : ''}`,\n '',\n ];\n if (!selected.length) lines.push(q ? ` No dependency matches \"${filter}\".` : ' No dependencies declared.');\n else {\n for (const item of selected.slice(0, 100)) {\n lines.push(` ${item.name} ${item.version} ${item.ecosystem} ${item.isDev ? 'dev' : 'prod'} ${item.license?.id || 'unknown'}`);\n }\n if (selected.length > 100) lines.push(` … ${selected.length - 100} more; use sbom <filter> to narrow the list.`);\n }\n lines.push('', ' Licenses for some packages are inferred; verify them before compliance decisions.');\n return screen('Software bill of materials', lines);\n}\n\nexport function formatDiff(diff: GitDiff, importers: Record<string, string[]>, totalFiles: number, selectedPath = ''): string {\n const files = diff.files || [];\n const changed = new Set(files.map((file) => file.newPath || file.oldPath));\n const impacted = new Set<string>();\n const queue = [...changed];\n for (let cursor = 0; cursor < queue.length; cursor++) {\n for (const dependent of importers[queue[cursor]] || []) {\n if (!changed.has(dependent) && !impacted.has(dependent)) {\n impacted.add(dependent);\n queue.push(dependent);\n }\n }\n }\n const lines = [\n ` ${files.length} changed files · +${diff.stats.additions} / -${diff.stats.deletions}`,\n ` ${impacted.size} dependent files may be affected (${Math.round(impacted.size / Math.max(1, totalFiles) * 100)}% of scanned files)`,\n '',\n ];\n if (!files.length) lines.push(' No tracked changes found for these refs.');\n for (const file of files.slice(0, 100)) {\n lines.push(` ${file.status.padEnd(8)} ${file.newPath || file.oldPath} +${file.additions}/-${file.deletions}`);\n }\n if (files.length > 100) lines.push(` … ${files.length - 100} more files.`);\n if (selectedPath) {\n const file = files.find((item) => item.newPath === selectedPath || item.oldPath === selectedPath);\n lines.push('');\n if (!file) lines.push(` ${selectedPath} is not in this diff.`);\n else {\n lines.push(` PATCH ${selectedPath}`);\n let budget = 120;\n for (const hunk of file.hunks) {\n if (budget-- <= 0) break;\n lines.push(` ${hunk.header}`);\n for (const line of hunk.lines) {\n if (budget-- <= 0) break;\n const marker = line.type === 'add' ? '+' : line.type === 'del' ? '-' : ' ';\n lines.push(` ${marker}${line.text}`);\n }\n }\n if (budget <= 0) lines.push(' … patch output limited to 120 lines.');\n }\n } else if (files.length) lines.push('', ' Use diff <base> <head> <file> to read a patch.');\n return screen('Diff and blast radius', lines);\n}\n\nexport function formatEngines(status: Record<string, ToolStatus>): string {\n const lines: string[] = [];\n for (const [id, tool] of Object.entries(status)) {\n const state = !tool.available ? 'missing' : tool.how === 'path' ? 'installed' : 'runnable';\n lines.push(` ${state} ${tool.label} (${id}) · ${tool.kind}`);\n lines.push(` ${tool.available ? tool.how || 'available' : tool.reason || 'Not installed'}`);\n }\n lines.push('', ' Run: deep <engine> or deep all');\n lines.push(' npx/uvx runners may fetch a tool when you run it.');\n return screen('Deep analysis engines', lines);\n}\n\nexport function formatAtlas(entries: string[], hubs: Array<{ path: string }>, folders: Array<{ path: string }>): string {\n const paths = [...new Set([...entries, ...hubs.map((hub) => hub.path)])].slice(0, 12);\n const lines = [\n ' Whole repository diagram',\n ' Architecture layers layers-diagram',\n ' Folder traffic coupling',\n ' Dependency impact graph <file> / blast <file>',\n '',\n ' SUGGESTED FILE DIAGRAMS',\n ...paths.map((path) => ` ${path} → diagram ${path}`),\n '',\n ` ${folders.length} folders available; use tree <folder> or find <query> to navigate.`,\n ];\n return screen('Diagram atlas', lines);\n}\n\ninterface FileInspector {\n path: string; role: string; loc: number; complexity: number; risk: number;\n imports: string[]; importers: string[];\n exports: Array<{ name: string }>;\n findings: Array<{ severity?: string; rule?: string; message?: string; line?: number }>;\n}\n\nexport function formatInspector(file: FileInspector): string {\n const lines = [\n ` Role ${file.role} · ${file.loc} lines · complexity ${file.complexity} · risk ${file.risk}/100`,\n '',\n ` IMPORTS (${file.imports.length})`,\n ...file.imports.slice(0, 12).map((path) => ` → ${path}`),\n ` IMPORTED BY (${file.importers.length})`,\n ...file.importers.slice(0, 12).map((path) => ` ← ${path}`),\n ` EXPORTS (${file.exports.length})`,\n ...file.exports.slice(0, 12).map((symbol) => ` ${symbol.name}`),\n ` HEURISTIC FINDINGS (${file.findings.length})`,\n ...file.findings.slice(0, 8).map((finding) => ` ${finding.severity || 'info'}${finding.line ? ':' + finding.line : ''} ${finding.rule || finding.message || ''}`),\n '',\n ` Next: show ${file.path} · graph ${file.path} · blame ${file.path}`,\n ];\n return screen(`File inspector ${file.path}`, lines);\n}\n\nexport function formatDeepAnalysis(report: AnalysisReport): string {\n const lines = [` ${report.passes.filter((pass) => pass.ok).length}/${report.passes.length} engines ran · ${report.findings.length} findings · ${report.ms} ms`];\n for (const pass of report.passes) {\n const state = pass.ok ? `${pass.findings.length} findings` : pass.available ? `failed: ${pass.reason || 'unknown error'}` : `unavailable: ${pass.reason || 'not installed'}`;\n lines.push(` ${pass.label} ${state}`);\n }\n if (report.findings.length) {\n lines.push('', ' FINDINGS');\n for (const finding of report.findings.slice(0, 40)) {\n const place = finding.path || finding.file || '(repository)';\n lines.push(` ${finding.severity || 'info'} ${place}${finding.line ? `:${finding.line}` : ''} ${finding.rule || finding.message || ''}`);\n }\n if (report.findings.length > 40) lines.push(` … ${report.findings.length - 40} more findings.`);\n lines.push('', ' Findings are candidates; review test and vendored files before acting.');\n }\n if (!report.passes.some((pass) => pass.ok)) lines.push('', ' No external engine ran; built-in security remains available with `security`.');\n return screen('Deep analysis', lines);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"featureViews.js","sourceRoot":"","sources":["../../src/cli/explorer/featureViews.ts"],"names":[],"mappings":"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","sourcesContent":["/** Terminal projections of data already used by the web views. */\n\ninterface WorkflowStep { name: string; uses?: string | null }\ninterface WorkflowJob { name: string; runsOn?: string; needs?: string[]; steps?: WorkflowStep[] }\ninterface Workflow { name: string; file: string; triggers?: string[]; jobs?: WorkflowJob[] }\n\ninterface License { id: string; name?: string; type?: string }\ninterface Package { name: string; version: string; ecosystem: string; isDev: boolean; license?: License }\ninterface LicenseReport {\n projectLicense: License;\n sbom: Package[];\n counts: { total: number; permissive: number; copyleft: number; weakCopyleft: number; unknown: number };\n complianceStatus: string;\n}\n\ninterface DiffLine { type: 'add' | 'del' | 'context'; text: string }\ninterface DiffHunk { header: string; lines: DiffLine[] }\ninterface DiffFile {\n oldPath: string; newPath: string; status: string;\n additions: number; deletions: number; hunks: DiffHunk[];\n}\ninterface GitDiff {\n files: DiffFile[];\n stats: { additions: number; deletions: number };\n}\n\ninterface ToolStatus {\n label: string; kind: string; available: boolean;\n how?: string | null; reason?: string | null; purpose?: string;\n}\ninterface Finding {\n path?: string; file?: string; line?: number;\n severity?: string; rule?: string; message?: string; tool?: string;\n}\ninterface AnalysisPass {\n id: string; label: string; ok: boolean; available: boolean;\n findings: Finding[]; reason?: string; ms?: number;\n}\ninterface AnalysisReport { passes: AnalysisPass[]; findings: Finding[]; ms: number }\n\nfunction columns(): number {\n const env = Number(process.env.COLUMNS);\n return Number.isInteger(env) && env > 0 ? env : process.stdout.columns || 80;\n}\n\nfunction fit(value: unknown, width = columns()): string {\n const text = String(value ?? '').replace(/[\\r\\n\\t]/g, ' ');\n if (width <= 0) return '';\n const points = [...text];\n return points.length <= width ? text : points.slice(0, Math.max(0, width - 1)).join('') + (width > 1 ? '…' : '');\n}\n\nfunction screen(title: string, lines: string[]): string {\n const width = columns();\n const rule = '─'.repeat(Math.max(0, Math.min(width - 2, 48)));\n return ['', fit(` ${title.toUpperCase()}`), fit(` ${rule}`), ...lines.map((line) => fit(line)), ''].join('\\n');\n}\n\nexport function formatWorkflows(workflows: Workflow[]): string {\n if (!workflows.length) return screen('Workflows', [\n ' No GitHub Actions workflows found in .github/workflows/.',\n ]);\n const lines: string[] = [` ${workflows.length} workflow${workflows.length === 1 ? '' : 's'}`];\n for (const workflow of workflows) {\n lines.push('', ` ${workflow.name} · ${workflow.file}`);\n lines.push(` Triggers: ${(workflow.triggers || []).join(', ') || 'none detected'}`);\n for (const job of workflow.jobs || []) {\n lines.push(` ${job.name} ${job.runsOn || ''}`);\n if (job.needs?.length) lines.push(` After: ${job.needs.join(', ')}`);\n for (const step of job.steps || []) lines.push(` · ${step.name}${step.uses ? ` (${step.uses})` : ''}`);\n }\n if (!workflow.jobs?.length) lines.push(' No jobs parsed.');\n }\n return screen('Workflows', lines);\n}\n\nexport function formatSbom(report: LicenseReport | null | undefined, filter = ''): string {\n if (!report) return screen('Software bill of materials', [' Dependency inventory is unavailable for this scan.']);\n const packages = report.sbom || [];\n const q = filter.toLowerCase().trim();\n const selected = q ? packages.filter((item) =>\n item.name.toLowerCase().includes(q) || item.ecosystem.toLowerCase().includes(q)\n || item.license?.id.toLowerCase().includes(q)) : packages;\n const lines = [\n ` Project license ${report.projectLicense?.id || 'unknown'}`,\n ` Dependencies ${report.counts.total} declared · ${report.counts.copyleft} copyleft · ${report.counts.unknown} unknown`,\n ` License review ${report.complianceStatus}${report.counts.unknown ? ' (unknown licenses need checking)' : ''}`,\n '',\n ];\n if (!selected.length) lines.push(q ? ` No dependency matches \"${filter}\".` : ' No dependencies declared.');\n else {\n for (const item of selected.slice(0, 100)) {\n lines.push(` ${item.name} ${item.version} ${item.ecosystem} ${item.isDev ? 'dev' : 'prod'} ${item.license?.id || 'unknown'}`);\n }\n if (selected.length > 100) lines.push(` … ${selected.length - 100} more; use sbom <filter> to narrow the list.`);\n }\n lines.push('', ' Licenses for some packages are inferred; verify them before compliance decisions.');\n return screen('Software bill of materials', lines);\n}\n\nexport function formatDiff(diff: GitDiff, importers: Record<string, string[]>, totalFiles: number, selectedPath = ''): string {\n const files = diff.files || [];\n const changed = new Set(files.map((file) => file.newPath || file.oldPath));\n const impacted = new Set<string>();\n const queue = [...changed];\n for (let cursor = 0; cursor < queue.length; cursor++) {\n for (const dependent of importers[queue[cursor]] || []) {\n if (!changed.has(dependent) && !impacted.has(dependent)) {\n impacted.add(dependent);\n queue.push(dependent);\n }\n }\n }\n const lines = [\n ` ${files.length} changed files · +${diff.stats.additions} / -${diff.stats.deletions}`,\n ` ${impacted.size} dependent files may be affected (${Math.round(impacted.size / Math.max(1, totalFiles) * 100)}% of scanned files)`,\n '',\n ];\n if (!files.length) lines.push(' No tracked changes found for these refs.');\n for (const file of files.slice(0, 100)) {\n lines.push(` ${file.status.padEnd(8)} ${file.newPath || file.oldPath} +${file.additions}/-${file.deletions}`);\n }\n if (files.length > 100) lines.push(` … ${files.length - 100} more files.`);\n if (selectedPath) {\n const file = files.find((item) => item.newPath === selectedPath || item.oldPath === selectedPath);\n lines.push('');\n if (!file) lines.push(` ${selectedPath} is not in this diff.`);\n else {\n lines.push(` PATCH ${selectedPath}`);\n let budget = 120;\n for (const hunk of file.hunks) {\n if (budget-- <= 0) break;\n lines.push(` ${hunk.header}`);\n for (const line of hunk.lines) {\n if (budget-- <= 0) break;\n const marker = line.type === 'add' ? '+' : line.type === 'del' ? '-' : ' ';\n lines.push(` ${marker}${line.text}`);\n }\n }\n if (budget <= 0) lines.push(' … patch output limited to 120 lines.');\n }\n } else if (files.length) lines.push('', ' Use diff <base> <head> <file> to read a patch.');\n return screen('Diff and blast radius', lines);\n}\n\nexport function formatEngines(status: Record<string, ToolStatus>): string {\n const lines: string[] = [];\n for (const [id, tool] of Object.entries(status)) {\n const state = !tool.available ? 'missing' : tool.how === 'path' ? 'installed' : 'runnable';\n lines.push(` ${state} ${tool.label} (${id}) · ${tool.kind}`);\n if (tool.purpose) lines.push(` ${tool.purpose}`);\n lines.push(` ${tool.available ? tool.how || 'available' : tool.reason || 'Not installed'}`);\n }\n lines.push('', ' Run: deep <engine> or deep all');\n lines.push(' npx/uvx runners may fetch a tool when you run it.');\n return screen('Deep analysis engines', lines);\n}\n\nexport function formatAtlas(entries: string[], hubs: Array<{ path: string }>, folders: Array<{ path: string }>): string {\n const paths = [...new Set([...entries, ...hubs.map((hub) => hub.path)])].slice(0, 12);\n const lines = [\n ' Whole repository diagram',\n ' Architecture layers layers-diagram',\n ' Folder traffic coupling',\n ' Dependency impact graph <file> / blast <file>',\n '',\n ' SUGGESTED FILE DIAGRAMS',\n ...paths.map((path) => ` ${path} → diagram ${path}`),\n '',\n ` ${folders.length} folders available; use tree <folder> or find <query> to navigate.`,\n ];\n return screen('Diagram atlas', lines);\n}\n\ninterface FileInspector {\n path: string; role: string; loc: number; complexity: number; risk: number;\n imports: string[]; importers: string[];\n exports: Array<{ name: string }>;\n findings: Array<{ severity?: string; rule?: string; message?: string; line?: number }>;\n}\n\nexport function formatInspector(file: FileInspector): string {\n const lines = [\n ` Role ${file.role} · ${file.loc} lines · complexity ${file.complexity} · risk ${file.risk}/100`,\n '',\n ` IMPORTS (${file.imports.length})`,\n ...file.imports.slice(0, 12).map((path) => ` → ${path}`),\n ` IMPORTED BY (${file.importers.length})`,\n ...file.importers.slice(0, 12).map((path) => ` ← ${path}`),\n ` EXPORTS (${file.exports.length})`,\n ...file.exports.slice(0, 12).map((symbol) => ` ${symbol.name}`),\n ` HEURISTIC FINDINGS (${file.findings.length})`,\n ...file.findings.slice(0, 8).map((finding) => ` ${finding.severity || 'info'}${finding.line ? ':' + finding.line : ''} ${finding.rule || finding.message || ''}`),\n '',\n ` Next: show ${file.path} · graph ${file.path} · blame ${file.path}`,\n ];\n return screen(`File inspector ${file.path}`, lines);\n}\n\nexport function formatDeepAnalysis(report: AnalysisReport): string {\n const lines = [` ${report.passes.filter((pass) => pass.ok).length}/${report.passes.length} engines ran · ${report.findings.length} findings · ${report.ms} ms`];\n for (const pass of report.passes) {\n const state = pass.ok ? `${pass.findings.length} findings` : pass.available ? `failed: ${pass.reason || 'unknown error'}` : `unavailable: ${pass.reason || 'not installed'}`;\n lines.push(` ${pass.label} ${state}`);\n }\n if (report.findings.length) {\n lines.push('', ' FINDINGS');\n for (const finding of report.findings.slice(0, 40)) {\n const place = finding.path || finding.file || '(repository)';\n lines.push(` ${finding.severity || 'info'} ${place}${finding.line ? `:${finding.line}` : ''} ${finding.rule || finding.message || ''}`);\n if (finding.message && finding.rule) lines.push(` ${finding.message}`);\n }\n if (report.findings.length > 40) lines.push(` … ${report.findings.length - 40} more findings.`);\n lines.push('', ' Findings are candidates; review test and vendored files before acting.');\n }\n if (!report.passes.some((pass) => pass.ok)) lines.push('', ' No external engine ran; built-in security remains available with `security`.');\n return screen('Deep analysis', lines);\n}\n"]}
|