codebase-onboarder 1.0.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/cli/chat/app.js CHANGED
@@ -5,6 +5,7 @@ import { TerminalComposer } from './composer.js';
5
5
  import { profileDisplay } from './profile.js';
6
6
  import { HermesModels } from './models.js';
7
7
  import { ChatSources } from './source.js';
8
+ import { ChatAnalysis } from './analysis.js';
8
9
  import { chatBanner, ChatRenderer } from './render.js';
9
10
  import { AGENT_MODES } from '../agent/contracts.js';
10
11
  import { agentCommand } from '../agent/command.js';
@@ -28,6 +29,9 @@ export const CHAT_HELP = `
28
29
  /review 42 · /triage 12 · /implement <task> · /pr <task> · /github <task>
29
30
  /model opens a searchable model picker. /model configure opens full Hermes setup.
30
31
  /permissions checks on permits repository test execution.
32
+ /deep opens the web UI's analyzer picker; /engines lists availability.
33
+ /deep all · /deep security · /deep options semgrep · /deep results high
34
+ /deep explain asks Hermes about the report; /deep export saves private JSON.
31
35
  /permissions github on permits GitHub writes explicitly requested in a task.
32
36
  /new starts fresh; /history and /resume restore conversations.
33
37
  /repo <GitHub URL> or a pasted URL clones and opens a repository.
@@ -114,7 +118,7 @@ export async function runChat({ target = null, flags = {}, out = console.log, er
114
118
  const theme = { accent: text => paint(text, 'yellow', 'bold'), muted: dim, strong: bold, success: ok, error: bad,
115
119
  status: text => colorEnabled() ? '\x1b[48;5;234m\x1b[38;5;220m' + text + '\x1b[0m' : text };
116
120
  let composer = null, handingOff = false, exiting = false, active = null;
117
- let display = await profileDisplay(), startedAt = 0, toolCalls = 0, lastTool = '';
121
+ let display = await profileDisplay(), startedAt = 0, toolCalls = 0, lastTool = '', analysisRunning = false;
118
122
  let resolveDone;
119
123
  const done = new Promise(resolve => { resolveDone = resolve; });
120
124
  const safe = (text) => terminalText(redact(text));
@@ -126,6 +130,10 @@ export async function runChat({ target = null, flags = {}, out = console.log, er
126
130
  };
127
131
  const browser = repositoryBrowser(flags, text => print(dim(text)), version);
128
132
  const renderer = new ChatRenderer(print, theme);
133
+ const analysis = new ChatAnalysis({ progress: text => print(dim(safe(text))),
134
+ choose: (choices, signal) => composer.choose({ title: 'Deep Analysis — Select Engines',
135
+ hint: 'Same engines as the web UI · /deep options <engine> for settings', choices, signal }),
136
+ });
129
137
  const models = new HermesModels();
130
138
  const configureModel = async (signal) => {
131
139
  // Give the official wizard exclusive terminal ownership, then restore chat.
@@ -235,6 +243,16 @@ export async function runChat({ target = null, flags = {}, out = console.log, er
235
243
  checks: flags.allowChecks === true, github: flags.allowGithubWrites === true, timeout, maxTurns, base: flags.base }, {
236
244
  output: onOutput,
237
245
  sources,
246
+ analysis: async (name, args, folder, signal, checks) => {
247
+ analysisRunning = true;
248
+ startedAt = Date.now();
249
+ try {
250
+ return await analysis.execute(name, args, folder, signal, checks);
251
+ }
252
+ finally {
253
+ analysisRunning = false;
254
+ }
255
+ },
238
256
  chooseModel,
239
257
  browse: (name, args, folder, signal) => browser.run(name, args, folder, signal),
240
258
  utility: async (name, signal) => {
@@ -270,7 +288,7 @@ export async function runChat({ target = null, flags = {}, out = console.log, er
270
288
  const repo = s.sourceUrl?.split('/').at(-1) || path.basename(s.root);
271
289
  const tokens = controller.lastResult?.tokens?.total;
272
290
  const status = [model, repo, s.mode, `${catalog.length} tools`, tokens === undefined ? 'tokens —' : `${tokens} tokens`,
273
- controller.busy && startedAt ? `${Math.floor((Date.now() - startedAt) / 1000)}s · ${toolCalls} calls${lastTool ? ' · ' + lastTool : ''}` : `${controller.record.turns.length} turns`].join(' │ ');
291
+ controller.busy && startedAt ? `${Math.floor((Date.now() - startedAt) / 1000)}s · ${analysisRunning ? 'deep analysis' : `${toolCalls} calls${lastTool ? ' · ' + lastTool : ''}`}` : `${controller.record.turns.length} turns`].join(' │ ');
274
292
  return { mode: s.mode, status: safe(status), busy: controller.busy, pasting: controller.pasting, files: browser.files };
275
293
  },
276
294
  submit: line => {
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/chat/app.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { ChatController, type ChatOutput } from './controller.js';\nimport { TerminalComposer } from './composer.js';\nimport { profileDisplay } from './profile.js';\nimport { HermesModels } from './models.js';\nimport { ChatSources } from './source.js';\nimport { chatBanner, ChatRenderer, type ChatTheme } from './render.js';\nimport { AGENT_MODES, type AgentMode } from '../agent/contracts.js';\nimport { agentCommand } from '../agent/command.js';\nimport { terminalText, redact } from '../agent/process.js';\nimport { repositoryFromRemote } from '../agent/github.js';\nimport type { RunManifest } from '../agent/contracts.js';\nimport { scanOptionsFromFlags } from '../scanOptions.js';\nimport { dim, bold, ok, bad, paint, colorEnabled } from '../ui.js';\n\nexport const CHAT_HELP = `\n Onboarder chat — a repository agent in your terminal\n\n onboarder Chat about the current repository\n onboarder chat [folder|GitHub URL] Open the chat harness (alias: tui)\n onboarder chat https://github.com/owner/repo Clone a repository, then ask questions\n onboarder chat --resume <chat-id> Continue a saved conversation\n onboarder chat --mode review Start in a specific workflow\n onboarder explore [folder|url] Open the original offline explorer\n\n Type / to see live commands. ↑/↓ select; Tab or Enter inserts; Esc dismisses.\n Chat fills the terminal and adjusts on resize. PgUp/PgDn scroll the conversation.\n Alt-Enter adds a line. Pasted multiline messages stay in the composer.\n /review 42 · /triage 12 · /implement <task> · /pr <task> · /github <task>\n /model opens a searchable model picker. /model configure opens full Hermes setup.\n /permissions checks on permits repository test execution.\n /permissions github on permits GitHub writes explicitly requested in a task.\n /new starts fresh; /history and /resume restore conversations.\n /repo <GitHub URL> or a pasted URL clones and opens a repository.\n /clone <GitHub URL> also works; /pull refreshes a clean saved checkout.\n /paste enters multiline input; /send submits it; /discard cancels it.\n Ctrl-C cancels an active task. Ctrl-D saves and exits.\n\n Flags: --mode, --model, --provider, --allow-checks, --allow-github-writes,\n --timeout, --max-turns, --resume, --base, --no-color\n For scripts: onboarder agent <workflow> --task \"...\" --json\n`;\ninterface ChatOptions { target?: string | null; flags?: Record<string, any>; out?: (text: string) => void; err?: (text: string) => void; version?: string }\n\n/** Analysis modules are loaded only when a browsing command actually needs them. */\nexport function repositoryBrowser(flags: Record<string, any>, progress: (text: string) => void, version = '') {\n let cached: any = null;\n return {\n get files(): string[] { return cached?.scan?.files?.map((f: any) => f.path) || []; },\n invalidate() { cached = null; },\n async run(name: string, args: string[], root: string, signal: AbortSignal): Promise<string> {\n const [{ openRepo }, { lookup }, { getGitDiff }, { formatDiff }] = await Promise.all([\n import('../explorer/session.js'), import('../explorer/commands.js'), import('../../server/gitDiff.js'), import('../explorer/featureViews.js'),\n ]);\n signal.throwIfAborted();\n if (!cached || cached.root !== root || name === 'rescan') {\n progress('Indexing repository…');\n const repo = await openRepo(root, { ...scanOptionsFromFlags(flags), signal });\n signal.throwIfAborted(); cached = repo;\n }\n if (name === 'rescan') return 'Repository analysis refreshed.';\n const ctx = { repo: cached, flags, version,\n diff: async (base: string, head: string, file: string) => formatDiff(await getGitDiff(root, { base, head, file, signal }), cached.facts.importers || {}, cached.scan.files.length, file),\n engines: async () => { const [{ toolsStatus }, { formatEngines }] = await Promise.all([import('../../server/tools/scan.js'), import('../explorer/featureViews.js')]); return formatEngines(toolsStatus()); },\n deep: async (tool: string) => {\n const [{ toolsStatus, runExternalAnalysis }, { formatDeepAnalysis }] = await Promise.all([import('../../server/tools/scan.js'), import('../explorer/featureViews.js')]);\n if (tool !== 'all' && !Object.hasOwn(toolsStatus(), tool)) throw new Error('Unknown analyzer. Use /engines.');\n return formatDeepAnalysis(await runExternalAnalysis(root, tool === 'all' ? { signal } : { signal, tools: [tool] }));\n },\n web: async () => { const { startWeb } = await import('../explorer/app.js'); return (await startWeb({ flags, repo: cached })) + '\\nRepository path: ' + root; },\n };\n const command = lookup(name);\n if (!command) throw new Error('Unknown repository command.');\n return String(await command.run(ctx, args));\n },\n };\n}\nexport async function runChat({ target = null, flags = {}, out = console.log, err = console.error, version = '' }: ChatOptions = {}): Promise<number> {\n if (flags.help) { out(CHAT_HELP); return 0; }\n if (!process.stdin.isTTY || !process.stdout.isTTY) { out('The chat harness needs an interactive terminal. For scripts use onboarder agent <workflow> --task \"...\" --json.'); return 0; }\n if (flags.task || flags.json || flags.dryRun) throw new Error('Use onboarder agent <workflow> --task \"...\" for one-shot or JSON requests.');\n const mode = flags.mode || 'ask';\n if (!AGENT_MODES.includes(mode)) throw new Error('Choose --mode ' + AGENT_MODES.join('|'));\n const timeout = Number(flags.timeout ?? 300), maxTurns = Number(flags.maxTurns ?? 24);\n if (!Number.isInteger(timeout) || timeout < 15 || timeout > 3600 || !Number.isInteger(maxTurns) || maxTurns < 1 || maxTurns > 100) throw new Error('Use --timeout 15–3600 and --max-turns 1–100.');\n const sources = new ChatSources(), startup = new AbortController(), cancelStartup = () => startup.abort();\n process.on('SIGINT', cancelStartup); process.on('SIGTERM', cancelStartup);\n let source: Awaited<ReturnType<ChatSources['open']>>;\n try { source = await sources.open(target || '.', process.cwd(), startup.signal, text => out(dim(terminalText(redact(text))))); }\n catch (e) { if (startup.signal.aborted) { out('Repository loading cancelled.'); return 130; } throw e; }\n finally { process.off('SIGINT', cancelStartup); process.off('SIGTERM', cancelStartup); }\n const root = source.root;\n const theme: ChatTheme = { accent: text => paint(text, 'yellow', 'bold'), muted: dim, strong: bold, success: ok, error: bad,\n status: text => colorEnabled() ? '\\x1b[48;5;234m\\x1b[38;5;220m' + text + '\\x1b[0m' : text };\n let composer: TerminalComposer | null = null, handingOff = false, exiting = false, active: Promise<void> | null = null;\n let display = await profileDisplay(), startedAt = 0, toolCalls = 0, lastTool = '';\n let resolveDone: () => void;\n const done = new Promise<void>(resolve => { resolveDone = resolve; });\n const safe = (text: string) => terminalText(redact(text));\n const print = (text: string) => {\n if (composer && !handingOff && !exiting) composer.print(text); else out(text);\n };\n const browser = repositoryBrowser(flags, text => print(dim(text)), version);\n const renderer = new ChatRenderer(print, theme);\n const models = new HermesModels();\n const configureModel = async (signal: AbortSignal): Promise<boolean> => {\n // Give the official wizard exclusive terminal ownership, then restore chat.\n const before = await profileDisplay();\n handingOff = true; composer?.suspend();\n try {\n const code = await agentCommand('model', [], {}, { root: controller.settings.root, signal });\n if (code !== 0) throw new Error('Model setup did not complete. Existing settings remain available.');\n display = await profileDisplay();\n if (!display.model) { print(dim('Choose a provider and model to enable AI chat. Offline commands are ready.')); return false; }\n return display.model !== before.model || display.provider !== before.provider;\n } finally { display = await profileDisplay(); handingOff = false; if (!exiting) composer?.start(); }\n };\n const chooseModel = async (configure: boolean, signal: AbortSignal): Promise<boolean> => {\n if (configure) return configureModel(signal);\n print(dim('Loading Hermes model catalog…'));\n let providers: Awaited<ReturnType<HermesModels['catalog']>> = [];\n try { providers = await models.catalog(signal); }\n catch (e) { signal.throwIfAborted(); print(dim(safe(e instanceof Error ? e.message : String(e)))); }\n signal.throwIfAborted();\n while (!exiting) {\n const provider = await composer!.choose({ title: 'Model Picker — Select Provider',\n hint: `Current: ${controller.settings.model || display.model || 'not configured'} · ${controller.settings.provider || display.provider || 'choose a provider'}`,\n selected: controller.settings.provider || display.provider,\n choices: [...providers.map(p => ({ value: p.id, label: p.name, detail: `${p.models.length} models` })),\n { value: ':configure', label: 'Configure provider / authentication', detail: 'Full Hermes setup · all supported providers' },\n { value: ':cancel', label: 'Keep current settings' }], signal });\n if (provider === null || provider === ':cancel') return false;\n if (provider === ':configure') return configureModel(signal);\n const selectedProvider = providers.find(p => p.id === provider)!;\n const model = await composer!.choose({ title: 'Model Picker — ' + selectedProvider.name,\n hint: 'Type to search models · changes are saved to your Onboarder Hermes profile',\n selected: controller.settings.model || display.model,\n choices: [...selectedProvider.models.map(m => ({ value: m, label: m })),\n { value: ':back', label: '← Back to providers' }, { value: ':configure', label: 'Configure another model / endpoint' }], signal });\n if (model === null) return false;\n if (model === ':back') continue;\n if (model === ':configure') return configureModel(signal);\n print(dim('Activating ' + model + '…'));\n try {\n const selected = await models.select(model, provider, signal);\n display = await profileDisplay();\n print(ok('Model: ' + selected.model + ' · Provider: ' + selected.provider));\n return true;\n } catch (e) {\n signal.throwIfAborted();\n print(bad(safe(e instanceof Error ? e.message : String(e))));\n const next = await composer!.choose({ title: 'Model needs configuration',\n hint: 'Your current model and conversation are kept until a selection succeeds.', signal,\n choices: [{ value: 'configure', label: 'Configure provider / authentication', detail: 'Continue in the official Hermes wizard' },\n { value: 'back', label: 'Choose a different provider or model' }, { value: 'cancel', label: 'Keep current settings' }] });\n if (next === 'configure') return configureModel(signal);\n if (next !== 'back') return false;\n }\n }\n return false;\n };\n const onOutput = (event: ChatOutput) => {\n if (event.type === 'start') { startedAt = Date.now(); toolCalls = 0; lastTool = ''; }\n if (event.type === 'event' && event.event.type === 'tool_use') { toolCalls++; lastTool = safe(event.event.name || '').replace(/^mcp__onboarder__/, ''); }\n if (event.type === 'end') browser.invalidate();\n if (event.type === 'clear') composer?.clear();\n else if (event.type === 'exit') { exiting = true; composer?.close(); resolveDone!(); }\n else renderer.handle(event);\n composer?.refresh();\n };\n const controller = new ChatController({ root, sourceUrl: source.sourceUrl, mode: mode as AgentMode, model: flags.model, provider: flags.provider,\n checks: flags.allowChecks === true, github: flags.allowGithubWrites === true, timeout, maxTurns, base: flags.base }, {\n output: onOutput,\n sources,\n chooseModel,\n browse: (name, args, folder, signal) => browser.run(name, args, folder, signal),\n utility: async (name, signal) => {\n if (name === 'model') {\n await configureModel(signal); return 'Hermes model setup closed.';\n }\n if (name === 'tools') return `Hermes tools (${catalog.length})\\n\\n` + catalog.map(tool => `${tool.name}\\n ${tool.description}`).join('\\n\\n');\n const lines: string[] = [];\n const code = await agentCommand(name, [], {}, { root: controller.settings.root, signal, out: t => lines.push(t), err: t => lines.push(t) });\n return lines.join('\\n') + (code ? '\\nCheck the details above before running a task.' : '');\n },\n });\n const { scopedTools } = await import('../agent/mcp.js');\n const catalog = scopedTools({ schemaVersion: 1, id: randomUUID(), mode: controller.settings.mode, root, sourceRoot: root,\n repository: source.sourceUrl ? repositoryFromRemote(source.sourceUrl) : null, remote: source.sourceUrl || null, branch: null, baseBranch: null,\n task: '', permissions: { files: false, checks: false, github: false }, startedAt: '', timeoutSeconds: timeout, maxTurns, auditFile: '',\n } satisfies RunManifest).map(({ name, description }) => ({ name, description }));\n let bannerKey = '', bannerText = '';\n const banner = (columns: number, rows: number) => {\n const key = JSON.stringify([controller.settings, display, columns, rows]);\n if (key !== bannerKey) { bannerKey = key; bannerText = chatBanner(controller.settings, columns, theme, version, { ...display, tools: catalog.length, catalog, session: controller.record.id, rows, fullscreen: true }); }\n return bannerText;\n };\n composer = new TerminalComposer({ input: process.stdin, output: process.stdout, theme, fullscreen: true, welcome: banner,\n header: () => theme.accent('◈ ONBOARDER') + dim(' · ' + controller.settings.mode + ' · ' + (controller.settings.sourceUrl || controller.settings.root)),\n state: () => {\n const s = controller.settings, model = s.model || display.model || 'model not configured';\n const repo = s.sourceUrl?.split('/').at(-1) || path.basename(s.root);\n const tokens = controller.lastResult?.tokens?.total;\n const status = [model, repo, s.mode, `${catalog.length} tools`, tokens === undefined ? 'tokens —' : `${tokens} tokens`,\n controller.busy && startedAt ? `${Math.floor((Date.now() - startedAt) / 1000)}s · ${toolCalls} calls${lastTool ? ' · ' + lastTool : ''}` : `${controller.record.turns.length} turns`].join(' │ ');\n return { mode: s.mode, status: safe(status), busy: controller.busy, pasting: controller.pasting, files: browser.files };\n },\n submit: line => {\n if (exiting) return;\n if (controller.busy) { void controller.accept(line); composer?.refresh(); return; }\n // Only one task owns the controller; cancellation/exit remain available while it runs.\n const task = controller.accept(line); active = task;\n composer?.refresh();\n void task.catch(e => print(bad(safe(e instanceof Error ? e.message : String(e))))).finally(() => {\n renderer.finish(); if (active === task) active = null;\n composer?.refresh();\n });\n },\n cancel: () => {\n if (controller.busy) { controller.cancel(); print(dim('Cancelling…')); }\n else if (controller.pasting) { void controller.accept('/discard'); composer?.refresh(); }\n else print(dim('Use /exit or Ctrl-D to leave.'));\n }, exit: () => controller.close(),\n });\n const terminate = () => controller.close();\n const interrupt = () => { if (controller.busy) controller.cancel(); else controller.close(); };\n const ticker = setInterval(() => { if (controller.busy && !composer?.choosing) composer?.refresh(); }, 1000); ticker.unref();\n process.on('SIGTERM', terminate); process.on('SIGINT', interrupt);\n try {\n if (flags.resume) await controller.resume(flags.resume);\n composer.start();\n if (!controller.settings.model && !display.model) {\n const answer = await composer.choose({ title: 'Welcome — Model & Provider', hint: 'Set up AI chat now, or use repository commands offline.',\n choices: [{ value: 'configure', label: 'Choose a provider and model', detail: 'Open full Hermes configuration' },\n { value: 'offline', label: 'Continue offline', detail: '/map · /tree · /find · set up later with /model' }], signal: startup.signal });\n if (answer === 'configure' && !exiting) await controller.accept('/model configure');\n }\n await done; if (active) await active;\n if (await controller.save()) out(dim('Conversation saved. Resume it with /resume ' + controller.record.id));\n return 0;\n } finally {\n controller.cancel(); process.off('SIGTERM', terminate); process.off('SIGINT', interrupt); clearInterval(ticker);\n exiting = true; composer.close();\n }\n}\n"]}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/chat/app.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { ChatController, type ChatOutput } from './controller.js';\nimport { TerminalComposer } from './composer.js';\nimport { profileDisplay } from './profile.js';\nimport { HermesModels } from './models.js';\nimport { ChatSources } from './source.js';\nimport { ChatAnalysis } from './analysis.js';\nimport { chatBanner, ChatRenderer, type ChatTheme } from './render.js';\nimport { AGENT_MODES, type AgentMode } from '../agent/contracts.js';\nimport { agentCommand } from '../agent/command.js';\nimport { terminalText, redact } from '../agent/process.js';\nimport { repositoryFromRemote } from '../agent/github.js';\nimport type { RunManifest } from '../agent/contracts.js';\nimport { scanOptionsFromFlags } from '../scanOptions.js';\nimport { dim, bold, ok, bad, paint, colorEnabled } from '../ui.js';\n\nexport const CHAT_HELP = `\n Onboarder chat — a repository agent in your terminal\n\n onboarder Chat about the current repository\n onboarder chat [folder|GitHub URL] Open the chat harness (alias: tui)\n onboarder chat https://github.com/owner/repo Clone a repository, then ask questions\n onboarder chat --resume <chat-id> Continue a saved conversation\n onboarder chat --mode review Start in a specific workflow\n onboarder explore [folder|url] Open the original offline explorer\n\n Type / to see live commands. ↑/↓ select; Tab or Enter inserts; Esc dismisses.\n Chat fills the terminal and adjusts on resize. PgUp/PgDn scroll the conversation.\n Alt-Enter adds a line. Pasted multiline messages stay in the composer.\n /review 42 · /triage 12 · /implement <task> · /pr <task> · /github <task>\n /model opens a searchable model picker. /model configure opens full Hermes setup.\n /permissions checks on permits repository test execution.\n /deep opens the web UI's analyzer picker; /engines lists availability.\n /deep all · /deep security · /deep options semgrep · /deep results high\n /deep explain asks Hermes about the report; /deep export saves private JSON.\n /permissions github on permits GitHub writes explicitly requested in a task.\n /new starts fresh; /history and /resume restore conversations.\n /repo <GitHub URL> or a pasted URL clones and opens a repository.\n /clone <GitHub URL> also works; /pull refreshes a clean saved checkout.\n /paste enters multiline input; /send submits it; /discard cancels it.\n Ctrl-C cancels an active task. Ctrl-D saves and exits.\n\n Flags: --mode, --model, --provider, --allow-checks, --allow-github-writes,\n --timeout, --max-turns, --resume, --base, --no-color\n For scripts: onboarder agent <workflow> --task \"...\" --json\n`;\ninterface ChatOptions { target?: string | null; flags?: Record<string, any>; out?: (text: string) => void; err?: (text: string) => void; version?: string }\n\n/** Analysis modules are loaded only when a browsing command actually needs them. */\nexport function repositoryBrowser(flags: Record<string, any>, progress: (text: string) => void, version = '') {\n let cached: any = null;\n return {\n get files(): string[] { return cached?.scan?.files?.map((f: any) => f.path) || []; },\n invalidate() { cached = null; },\n async run(name: string, args: string[], root: string, signal: AbortSignal): Promise<string> {\n const [{ openRepo }, { lookup }, { getGitDiff }, { formatDiff }] = await Promise.all([\n import('../explorer/session.js'), import('../explorer/commands.js'), import('../../server/gitDiff.js'), import('../explorer/featureViews.js'),\n ]);\n signal.throwIfAborted();\n if (!cached || cached.root !== root || name === 'rescan') {\n progress('Indexing repository…');\n const repo = await openRepo(root, { ...scanOptionsFromFlags(flags), signal });\n signal.throwIfAborted(); cached = repo;\n }\n if (name === 'rescan') return 'Repository analysis refreshed.';\n const ctx = { repo: cached, flags, version,\n diff: async (base: string, head: string, file: string) => formatDiff(await getGitDiff(root, { base, head, file, signal }), cached.facts.importers || {}, cached.scan.files.length, file),\n engines: async () => { const [{ toolsStatus }, { formatEngines }] = await Promise.all([import('../../server/tools/scan.js'), import('../explorer/featureViews.js')]); return formatEngines(toolsStatus()); },\n deep: async (tool: string) => {\n const [{ toolsStatus, runExternalAnalysis }, { formatDeepAnalysis }] = await Promise.all([import('../../server/tools/scan.js'), import('../explorer/featureViews.js')]);\n if (tool !== 'all' && !Object.hasOwn(toolsStatus(), tool)) throw new Error('Unknown analyzer. Use /engines.');\n return formatDeepAnalysis(await runExternalAnalysis(root, tool === 'all' ? { signal } : { signal, tools: [tool] }));\n },\n web: async () => { const { startWeb } = await import('../explorer/app.js'); return (await startWeb({ flags, repo: cached })) + '\\nRepository path: ' + root; },\n };\n const command = lookup(name);\n if (!command) throw new Error('Unknown repository command.');\n return String(await command.run(ctx, args));\n },\n };\n}\nexport async function runChat({ target = null, flags = {}, out = console.log, err = console.error, version = '' }: ChatOptions = {}): Promise<number> {\n if (flags.help) { out(CHAT_HELP); return 0; }\n if (!process.stdin.isTTY || !process.stdout.isTTY) { out('The chat harness needs an interactive terminal. For scripts use onboarder agent <workflow> --task \"...\" --json.'); return 0; }\n if (flags.task || flags.json || flags.dryRun) throw new Error('Use onboarder agent <workflow> --task \"...\" for one-shot or JSON requests.');\n const mode = flags.mode || 'ask';\n if (!AGENT_MODES.includes(mode)) throw new Error('Choose --mode ' + AGENT_MODES.join('|'));\n const timeout = Number(flags.timeout ?? 300), maxTurns = Number(flags.maxTurns ?? 24);\n if (!Number.isInteger(timeout) || timeout < 15 || timeout > 3600 || !Number.isInteger(maxTurns) || maxTurns < 1 || maxTurns > 100) throw new Error('Use --timeout 15–3600 and --max-turns 1–100.');\n const sources = new ChatSources(), startup = new AbortController(), cancelStartup = () => startup.abort();\n process.on('SIGINT', cancelStartup); process.on('SIGTERM', cancelStartup);\n let source: Awaited<ReturnType<ChatSources['open']>>;\n try { source = await sources.open(target || '.', process.cwd(), startup.signal, text => out(dim(terminalText(redact(text))))); }\n catch (e) { if (startup.signal.aborted) { out('Repository loading cancelled.'); return 130; } throw e; }\n finally { process.off('SIGINT', cancelStartup); process.off('SIGTERM', cancelStartup); }\n const root = source.root;\n const theme: ChatTheme = { accent: text => paint(text, 'yellow', 'bold'), muted: dim, strong: bold, success: ok, error: bad,\n status: text => colorEnabled() ? '\\x1b[48;5;234m\\x1b[38;5;220m' + text + '\\x1b[0m' : text };\n let composer: TerminalComposer | null = null, handingOff = false, exiting = false, active: Promise<void> | null = null;\n let display = await profileDisplay(), startedAt = 0, toolCalls = 0, lastTool = '', analysisRunning = false;\n let resolveDone: () => void;\n const done = new Promise<void>(resolve => { resolveDone = resolve; });\n const safe = (text: string) => terminalText(redact(text));\n const print = (text: string) => {\n if (composer && !handingOff && !exiting) composer.print(text); else out(text);\n };\n const browser = repositoryBrowser(flags, text => print(dim(text)), version);\n const renderer = new ChatRenderer(print, theme);\n const analysis = new ChatAnalysis({ progress: text => print(dim(safe(text))),\n choose: (choices, signal) => composer!.choose({ title: 'Deep Analysis — Select Engines',\n hint: 'Same engines as the web UI · /deep options <engine> for settings', choices, signal }),\n });\n const models = new HermesModels();\n const configureModel = async (signal: AbortSignal): Promise<boolean> => {\n // Give the official wizard exclusive terminal ownership, then restore chat.\n const before = await profileDisplay();\n handingOff = true; composer?.suspend();\n try {\n const code = await agentCommand('model', [], {}, { root: controller.settings.root, signal });\n if (code !== 0) throw new Error('Model setup did not complete. Existing settings remain available.');\n display = await profileDisplay();\n if (!display.model) { print(dim('Choose a provider and model to enable AI chat. Offline commands are ready.')); return false; }\n return display.model !== before.model || display.provider !== before.provider;\n } finally { display = await profileDisplay(); handingOff = false; if (!exiting) composer?.start(); }\n };\n const chooseModel = async (configure: boolean, signal: AbortSignal): Promise<boolean> => {\n if (configure) return configureModel(signal);\n print(dim('Loading Hermes model catalog…'));\n let providers: Awaited<ReturnType<HermesModels['catalog']>> = [];\n try { providers = await models.catalog(signal); }\n catch (e) { signal.throwIfAborted(); print(dim(safe(e instanceof Error ? e.message : String(e)))); }\n signal.throwIfAborted();\n while (!exiting) {\n const provider = await composer!.choose({ title: 'Model Picker — Select Provider',\n hint: `Current: ${controller.settings.model || display.model || 'not configured'} · ${controller.settings.provider || display.provider || 'choose a provider'}`,\n selected: controller.settings.provider || display.provider,\n choices: [...providers.map(p => ({ value: p.id, label: p.name, detail: `${p.models.length} models` })),\n { value: ':configure', label: 'Configure provider / authentication', detail: 'Full Hermes setup · all supported providers' },\n { value: ':cancel', label: 'Keep current settings' }], signal });\n if (provider === null || provider === ':cancel') return false;\n if (provider === ':configure') return configureModel(signal);\n const selectedProvider = providers.find(p => p.id === provider)!;\n const model = await composer!.choose({ title: 'Model Picker — ' + selectedProvider.name,\n hint: 'Type to search models · changes are saved to your Onboarder Hermes profile',\n selected: controller.settings.model || display.model,\n choices: [...selectedProvider.models.map(m => ({ value: m, label: m })),\n { value: ':back', label: '← Back to providers' }, { value: ':configure', label: 'Configure another model / endpoint' }], signal });\n if (model === null) return false;\n if (model === ':back') continue;\n if (model === ':configure') return configureModel(signal);\n print(dim('Activating ' + model + '…'));\n try {\n const selected = await models.select(model, provider, signal);\n display = await profileDisplay();\n print(ok('Model: ' + selected.model + ' · Provider: ' + selected.provider));\n return true;\n } catch (e) {\n signal.throwIfAborted();\n print(bad(safe(e instanceof Error ? e.message : String(e))));\n const next = await composer!.choose({ title: 'Model needs configuration',\n hint: 'Your current model and conversation are kept until a selection succeeds.', signal,\n choices: [{ value: 'configure', label: 'Configure provider / authentication', detail: 'Continue in the official Hermes wizard' },\n { value: 'back', label: 'Choose a different provider or model' }, { value: 'cancel', label: 'Keep current settings' }] });\n if (next === 'configure') return configureModel(signal);\n if (next !== 'back') return false;\n }\n }\n return false;\n };\n const onOutput = (event: ChatOutput) => {\n if (event.type === 'start') { startedAt = Date.now(); toolCalls = 0; lastTool = ''; }\n if (event.type === 'event' && event.event.type === 'tool_use') { toolCalls++; lastTool = safe(event.event.name || '').replace(/^mcp__onboarder__/, ''); }\n if (event.type === 'end') browser.invalidate();\n if (event.type === 'clear') composer?.clear();\n else if (event.type === 'exit') { exiting = true; composer?.close(); resolveDone!(); }\n else renderer.handle(event);\n composer?.refresh();\n };\n const controller = new ChatController({ root, sourceUrl: source.sourceUrl, mode: mode as AgentMode, model: flags.model, provider: flags.provider,\n checks: flags.allowChecks === true, github: flags.allowGithubWrites === true, timeout, maxTurns, base: flags.base }, {\n output: onOutput,\n sources,\n analysis: async (name, args, folder, signal, checks) => {\n analysisRunning = true; startedAt = Date.now();\n try { return await analysis.execute(name, args, folder, signal, checks); }\n finally { analysisRunning = false; }\n },\n chooseModel,\n browse: (name, args, folder, signal) => browser.run(name, args, folder, signal),\n utility: async (name, signal) => {\n if (name === 'model') {\n await configureModel(signal); return 'Hermes model setup closed.';\n }\n if (name === 'tools') return `Hermes tools (${catalog.length})\\n\\n` + catalog.map(tool => `${tool.name}\\n ${tool.description}`).join('\\n\\n');\n const lines: string[] = [];\n const code = await agentCommand(name, [], {}, { root: controller.settings.root, signal, out: t => lines.push(t), err: t => lines.push(t) });\n return lines.join('\\n') + (code ? '\\nCheck the details above before running a task.' : '');\n },\n });\n const { scopedTools } = await import('../agent/mcp.js');\n const catalog = scopedTools({ schemaVersion: 1, id: randomUUID(), mode: controller.settings.mode, root, sourceRoot: root,\n repository: source.sourceUrl ? repositoryFromRemote(source.sourceUrl) : null, remote: source.sourceUrl || null, branch: null, baseBranch: null,\n task: '', permissions: { files: false, checks: false, github: false }, startedAt: '', timeoutSeconds: timeout, maxTurns, auditFile: '',\n } satisfies RunManifest).map(({ name, description }) => ({ name, description }));\n let bannerKey = '', bannerText = '';\n const banner = (columns: number, rows: number) => {\n const key = JSON.stringify([controller.settings, display, columns, rows]);\n if (key !== bannerKey) { bannerKey = key; bannerText = chatBanner(controller.settings, columns, theme, version, { ...display, tools: catalog.length, catalog, session: controller.record.id, rows, fullscreen: true }); }\n return bannerText;\n };\n composer = new TerminalComposer({ input: process.stdin, output: process.stdout, theme, fullscreen: true, welcome: banner,\n header: () => theme.accent('◈ ONBOARDER') + dim(' · ' + controller.settings.mode + ' · ' + (controller.settings.sourceUrl || controller.settings.root)),\n state: () => {\n const s = controller.settings, model = s.model || display.model || 'model not configured';\n const repo = s.sourceUrl?.split('/').at(-1) || path.basename(s.root);\n const tokens = controller.lastResult?.tokens?.total;\n const status = [model, repo, s.mode, `${catalog.length} tools`, tokens === undefined ? 'tokens —' : `${tokens} tokens`,\n controller.busy && startedAt ? `${Math.floor((Date.now() - startedAt) / 1000)}s · ${analysisRunning ? 'deep analysis' : `${toolCalls} calls${lastTool ? ' · ' + lastTool : ''}`}` : `${controller.record.turns.length} turns`].join(' │ ');\n return { mode: s.mode, status: safe(status), busy: controller.busy, pasting: controller.pasting, files: browser.files };\n },\n submit: line => {\n if (exiting) return;\n if (controller.busy) { void controller.accept(line); composer?.refresh(); return; }\n // Only one task owns the controller; cancellation/exit remain available while it runs.\n const task = controller.accept(line); active = task;\n composer?.refresh();\n void task.catch(e => print(bad(safe(e instanceof Error ? e.message : String(e))))).finally(() => {\n renderer.finish(); if (active === task) active = null;\n composer?.refresh();\n });\n },\n cancel: () => {\n if (controller.busy) { controller.cancel(); print(dim('Cancelling…')); }\n else if (controller.pasting) { void controller.accept('/discard'); composer?.refresh(); }\n else print(dim('Use /exit or Ctrl-D to leave.'));\n }, exit: () => controller.close(),\n });\n const terminate = () => controller.close();\n const interrupt = () => { if (controller.busy) controller.cancel(); else controller.close(); };\n const ticker = setInterval(() => { if (controller.busy && !composer?.choosing) composer?.refresh(); }, 1000); ticker.unref();\n process.on('SIGTERM', terminate); process.on('SIGINT', interrupt);\n try {\n if (flags.resume) await controller.resume(flags.resume);\n composer.start();\n if (!controller.settings.model && !display.model) {\n const answer = await composer.choose({ title: 'Welcome — Model & Provider', hint: 'Set up AI chat now, or use repository commands offline.',\n choices: [{ value: 'configure', label: 'Choose a provider and model', detail: 'Open full Hermes configuration' },\n { value: 'offline', label: 'Continue offline', detail: '/map · /tree · /find · set up later with /model' }], signal: startup.signal });\n if (answer === 'configure' && !exiting) await controller.accept('/model configure');\n }\n await done; if (active) await active;\n if (await controller.save()) out(dim('Conversation saved. Resume it with /resume ' + controller.record.id));\n return 0;\n } finally {\n controller.cancel(); process.off('SIGTERM', terminate); process.off('SIGINT', interrupt); clearInterval(ticker);\n exiting = true; composer.close();\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- export declare const CHAT_COMMANDS: readonly [readonly ['help', '[command]', 'Show commands and examples'], readonly ['ask', '<question>', 'Ask about this repository'], readonly ['review', '[PR number] [task]', 'Review local changes or a GitHub PR'], readonly ['triage', '[issue number] [task]', 'Investigate issues and suggest fixes'], readonly ['implement', '<task>', 'Make changes in an isolated Git workspace'], readonly ['pr', '<task>', 'Prepare a draft PR; publish when GitHub writes are enabled'], readonly ['github', '<task>', 'Work with GitHub issues, reviews, labels, and CI'], readonly ['mode', '[ask|review|triage|implement|pr|github]', 'Choose the workflow for following messages'], readonly ['permissions', '[checks|github] [on|off]', 'Control test execution and GitHub writes'], readonly ['model', '[name] [provider]', 'Open the provider/model picker; configure opens full Hermes setup'], readonly ['limits', '[seconds] [turns]', 'Set the run timeout and tool-turn budget'], readonly ['repo', '[folder|GitHub URL]', 'Show or switch the repository; clone GitHub URLs'], readonly ['clone', '<GitHub URL>', 'Clone a repository into a saved local checkout'], readonly ['pull', '', 'Update the saved checkout without overwriting local changes'], readonly ['new', '', 'Start a fresh conversation'], readonly ['history', '', 'List saved conversations for this repository'], readonly ['resume', '<conversation ID>', 'Continue a saved conversation'], readonly ['status', '', 'Show model, permissions, workspace, and last run'], readonly ['paste', '', 'Enter a multiline message; finish with /send or /discard'], readonly ['cancel', '', 'Stop the active task (Ctrl-C also works)'], readonly ['map', '', 'Repository overview, available offline'], readonly ['tree', '[folder] [depth]', 'Browse repository files'], readonly ['find', '<query>', 'Search files, symbols, and contents'], readonly ['show', '<file> [from] [count]', 'Read a file'], readonly ['diff', '[base] [head] [file]', 'Inspect changes in the current workspace'], readonly ['health', '', 'Inspect repository health'], readonly ['rescan', '', 'Refresh the cached repository analysis'], readonly ['tour', '', 'Find the best reading order for this codebase'], readonly ['explain', '[file|folder]', 'Explain a module using local analysis'], readonly ['deps', '<file>', 'Trace imports and reverse dependencies'], readonly ['inspect', '<file>', 'Inspect role, complexity, exports, and findings'], readonly ['graph', '<file> [depth]', 'Explore the dependency graph'], readonly ['blast', '<file>', 'Show the impact of changing a file'], readonly ['symbols', '<file>', 'List functions, classes, and exports'], readonly ['hubs', '', 'Find the most depended-on modules'], readonly ['layers', '', 'Inspect architecture layers'], readonly ['patterns', '', 'Discover architecture patterns'], readonly ['stats', '', 'Inspect language and complexity statistics'], readonly ['security', '', 'Show local security findings'], readonly ['stack', '', 'Inspect frameworks and dependencies'], readonly ['entry', '', 'Locate application entry points'], readonly ['externals', '', 'Inspect external dependencies and drift'], readonly ['coupling', '', 'Explore traffic between folders'], readonly ['clusters', '', 'Find groups of related modules'], readonly ['risks', '', 'Inspect code and architecture risks'], readonly ['log', '[count]', 'Read recent Git commits'], readonly ['hotspots', '[count]', 'Find frequently changed complex files'], readonly ['blame', '<file>', 'Read line authorship'], readonly ['diagram', '[file|folder]', 'Generate Mermaid diagram source'], readonly ['layers-diagram', '', 'Generate an architecture layer diagram'], readonly ['atlas', '', 'Browse available diagrams'], readonly ['docs', '[file|folder] [--write]', 'Read or explicitly generate repository documentation'], readonly ['workflows', '', 'Inspect GitHub Actions workflows'], readonly ['sbom', '[package]', 'Inspect dependencies and licenses'], readonly ['engines', '', 'Show available optional analyzers'], readonly ['deep', '<engine|all>', 'Run an optional analyzer when checks are enabled'], readonly ['web', '', 'Open the repository in the web interface'], readonly ['about', '', 'Show repository and application information'], readonly ['tools', '', 'List the actual tools available to Hermes'], readonly ['skills', '', 'Discover the six built-in agent workflows'], readonly ['runs', '', 'List saved agent runs'], readonly ['run', '<run ID>', 'Read a saved result from this repository'], readonly ['export', '', 'Save this conversation as Markdown'], readonly ['send', '', 'Submit the message composed with /paste'], readonly ['discard', '', 'Discard the message composed with /paste'], readonly ['doctor', '', 'Check the Hermes runtime and profile'], readonly ['setup', '', 'Prepare the dedicated Hermes profile'], readonly ['clear', '', 'Clear the screen; keep the conversation'], readonly ['exit', '', 'Save and exit (Ctrl-D also works)']];
1
+ export declare const CHAT_COMMANDS: readonly [readonly ['help', '[command]', 'Show commands and examples'], readonly ['ask', '<question>', 'Ask about this repository'], readonly ['review', '[PR number] [task]', 'Review local changes or a GitHub PR'], readonly ['triage', '[issue number] [task]', 'Investigate issues and suggest fixes'], readonly ['implement', '<task>', 'Make changes in an isolated Git workspace'], readonly ['pr', '<task>', 'Prepare a draft PR; publish when GitHub writes are enabled'], readonly ['github', '<task>', 'Work with GitHub issues, reviews, labels, and CI'], readonly ['mode', '[ask|review|triage|implement|pr|github]', 'Choose the workflow for following messages'], readonly ['permissions', '[checks|github] [on|off]', 'Control test execution and GitHub writes'], readonly ['model', '[name] [provider]', 'Open the provider/model picker; configure opens full Hermes setup'], readonly ['limits', '[seconds] [turns]', 'Set the run timeout and tool-turn budget'], readonly ['repo', '[folder|GitHub URL]', 'Show or switch the repository; clone GitHub URLs'], readonly ['clone', '<GitHub URL>', 'Clone a repository into a saved local checkout'], readonly ['pull', '', 'Update the saved checkout without overwriting local changes'], readonly ['new', '', 'Start a fresh conversation'], readonly ['history', '', 'List saved conversations for this repository'], readonly ['resume', '<conversation ID>', 'Continue a saved conversation'], readonly ['status', '', 'Show model, permissions, workspace, and last run'], readonly ['paste', '', 'Enter a multiline message; finish with /send or /discard'], readonly ['cancel', '', 'Stop the active task (Ctrl-C also works)'], readonly ['map', '', 'Repository overview, available offline'], readonly ['tree', '[folder] [depth]', 'Browse repository files'], readonly ['find', '<query>', 'Search files, symbols, and contents'], readonly ['show', '<file> [from] [count]', 'Read a file'], readonly ['diff', '[base] [head] [file]', 'Inspect changes in the current workspace'], readonly ['health', '', 'Inspect repository health'], readonly ['rescan', '', 'Refresh the cached repository analysis'], readonly ['tour', '', 'Find the best reading order for this codebase'], readonly ['explain', '[file|folder]', 'Explain a module using local analysis'], readonly ['deps', '<file>', 'Trace imports and reverse dependencies'], readonly ['inspect', '<file>', 'Inspect role, complexity, exports, and findings'], readonly ['graph', '<file> [depth]', 'Explore the dependency graph'], readonly ['blast', '<file>', 'Show the impact of changing a file'], readonly ['symbols', '<file>', 'List functions, classes, and exports'], readonly ['hubs', '', 'Find the most depended-on modules'], readonly ['layers', '', 'Inspect architecture layers'], readonly ['patterns', '', 'Discover architecture patterns'], readonly ['stats', '', 'Inspect language and complexity statistics'], readonly ['security', '', 'Show local security findings'], readonly ['stack', '', 'Inspect frameworks and dependencies'], readonly ['entry', '', 'Locate application entry points'], readonly ['externals', '', 'Inspect external dependencies and drift'], readonly ['coupling', '', 'Explore traffic between folders'], readonly ['clusters', '', 'Find groups of related modules'], readonly ['risks', '', 'Inspect code and architecture risks'], readonly ['log', '[count]', 'Read recent Git commits'], readonly ['hotspots', '[count]', 'Find frequently changed complex files'], readonly ['blame', '<file>', 'Read line authorship'], readonly ['diagram', '[file|folder]', 'Generate Mermaid diagram source'], readonly ['layers-diagram', '', 'Generate an architecture layer diagram'], readonly ['atlas', '', 'Browse available diagrams'], readonly ['docs', '[file|folder] [--write]', 'Read or explicitly generate repository documentation'], readonly ['workflows', '', 'Inspect GitHub Actions workflows'], readonly ['sbom', '[package]', 'Inspect dependencies and licenses'], readonly ['engines', '', 'Show available optional analyzers'], readonly ['deep', '[engine|all|security|dead-code|results|explain|export|options]', 'Choose web UI analyzers, configure scans, and explain saved results'], readonly ['web', '', 'Open the repository in the web interface'], readonly ['about', '', 'Show repository and application information'], readonly ['tools', '', 'List the actual tools available to Hermes'], readonly ['skills', '', 'Discover the six built-in agent workflows'], readonly ['runs', '', 'List saved agent runs'], readonly ['run', '<run ID>', 'Read a saved result from this repository'], readonly ['export', '', 'Save this conversation as Markdown'], readonly ['send', '', 'Submit the message composed with /paste'], readonly ['discard', '', 'Discard the message composed with /paste'], readonly ['doctor', '', 'Check the Hermes runtime and profile'], readonly ['setup', '', 'Prepare the dedicated Hermes profile'], readonly ['clear', '', 'Clear the screen; keep the conversation'], readonly ['exit', '', 'Save and exit (Ctrl-D also works)']];
2
2
  export type ChatCommand = typeof CHAT_COMMANDS[number][0];
3
3
  export declare const BROWSE_COMMANDS: readonly ['map', 'tree', 'find', 'show', 'diff', 'health', 'rescan', 'tour', 'explain', 'deps', 'inspect', 'graph', 'blast', 'symbols', 'hubs', 'layers', 'patterns', 'stats', 'security', 'stack', 'entry', 'externals', 'coupling', 'clusters', 'risks', 'log', 'hotspots', 'blame', 'diagram', 'layers-diagram', 'atlas', 'docs', 'workflows', 'sbom', 'engines', 'deep', 'web', 'about'];
4
4
  export declare function suggestCommands(line: string): typeof CHAT_COMMANDS[number][];
@@ -55,7 +55,7 @@ export const CHAT_COMMANDS = [
55
55
  ['workflows', '', 'Inspect GitHub Actions workflows'],
56
56
  ['sbom', '[package]', 'Inspect dependencies and licenses'],
57
57
  ['engines', '', 'Show available optional analyzers'],
58
- ['deep', '<engine|all>', 'Run an optional analyzer when checks are enabled'],
58
+ ['deep', '[engine|all|security|dead-code|results|explain|export|options]', 'Choose web UI analyzers, configure scans, and explain saved results'],
59
59
  ['web', '', 'Open the repository in the web interface'],
60
60
  ['about', '', 'Show repository and application information'],
61
61
  ['tools', '', 'List the actual tools available to Hermes'],
@@ -113,6 +113,8 @@ export function completeChat(line, files = []) {
113
113
  candidates = args.length === 1 ? ['checks', 'github'] : ['on', 'off'];
114
114
  if (command === '/model' && args.length === 1)
115
115
  candidates = ['configure', 'default'];
116
+ if (command === '/deep')
117
+ candidates = args.length === 1 ? ['all', 'security', 'dead-code', 'semgrep', 'gitleaks', 'knip', 'vulture', 'depcheck', 'results', 'explain', 'export', 'options', 'help'] : args[0] === 'options' ? ['semgrep', 'gitleaks', 'knip', 'vulture', 'depcheck'] : args[0] === 'results' ? ['critical', 'high', 'medium', 'low', 'info', 'semgrep', 'gitleaks', 'knip', 'vulture', 'depcheck'] : [];
116
118
  if (['/show', '/tree', '/repo', '/deps', '/inspect', '/graph', '/blast', '/symbols', '/explain', '/blame', '/docs', '/diagram'].includes(command))
117
119
  candidates = files;
118
120
  return [candidates.filter(c => c.startsWith(fragment)).slice(0, 100), fragment];
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/chat/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import { AGENT_MODES } from '../agent/contracts.js';\n\nexport const CHAT_COMMANDS = [\n ['help', '[command]', 'Show commands and examples'],\n ['ask', '<question>', 'Ask about this repository'],\n ['review', '[PR number] [task]', 'Review local changes or a GitHub PR'],\n ['triage', '[issue number] [task]', 'Investigate issues and suggest fixes'],\n ['implement', '<task>', 'Make changes in an isolated Git workspace'],\n ['pr', '<task>', 'Prepare a draft PR; publish when GitHub writes are enabled'],\n ['github', '<task>', 'Work with GitHub issues, reviews, labels, and CI'],\n ['mode', '[ask|review|triage|implement|pr|github]', 'Choose the workflow for following messages'],\n ['permissions', '[checks|github] [on|off]', 'Control test execution and GitHub writes'],\n ['model', '[name] [provider]', 'Open the provider/model picker; configure opens full Hermes setup'],\n ['limits', '[seconds] [turns]', 'Set the run timeout and tool-turn budget'],\n ['repo', '[folder|GitHub URL]', 'Show or switch the repository; clone GitHub URLs'],\n ['clone', '<GitHub URL>', 'Clone a repository into a saved local checkout'],\n ['pull', '', 'Update the saved checkout without overwriting local changes'],\n ['new', '', 'Start a fresh conversation'],\n ['history', '', 'List saved conversations for this repository'],\n ['resume', '<conversation ID>', 'Continue a saved conversation'],\n ['status', '', 'Show model, permissions, workspace, and last run'],\n ['paste', '', 'Enter a multiline message; finish with /send or /discard'],\n ['cancel', '', 'Stop the active task (Ctrl-C also works)'],\n ['map', '', 'Repository overview, available offline'],\n ['tree', '[folder] [depth]', 'Browse repository files'],\n ['find', '<query>', 'Search files, symbols, and contents'],\n ['show', '<file> [from] [count]', 'Read a file'],\n ['diff', '[base] [head] [file]', 'Inspect changes in the current workspace'],\n ['health', '', 'Inspect repository health'],\n ['rescan', '', 'Refresh the cached repository analysis'],\n ['tour', '', 'Find the best reading order for this codebase'],\n ['explain', '[file|folder]', 'Explain a module using local analysis'],\n ['deps', '<file>', 'Trace imports and reverse dependencies'],\n ['inspect', '<file>', 'Inspect role, complexity, exports, and findings'],\n ['graph', '<file> [depth]', 'Explore the dependency graph'],\n ['blast', '<file>', 'Show the impact of changing a file'],\n ['symbols', '<file>', 'List functions, classes, and exports'],\n ['hubs', '', 'Find the most depended-on modules'],\n ['layers', '', 'Inspect architecture layers'],\n ['patterns', '', 'Discover architecture patterns'],\n ['stats', '', 'Inspect language and complexity statistics'],\n ['security', '', 'Show local security findings'],\n ['stack', '', 'Inspect frameworks and dependencies'],\n ['entry', '', 'Locate application entry points'],\n ['externals', '', 'Inspect external dependencies and drift'],\n ['coupling', '', 'Explore traffic between folders'],\n ['clusters', '', 'Find groups of related modules'],\n ['risks', '', 'Inspect code and architecture risks'],\n ['log', '[count]', 'Read recent Git commits'],\n ['hotspots', '[count]', 'Find frequently changed complex files'],\n ['blame', '<file>', 'Read line authorship'],\n ['diagram', '[file|folder]', 'Generate Mermaid diagram source'],\n ['layers-diagram', '', 'Generate an architecture layer diagram'],\n ['atlas', '', 'Browse available diagrams'],\n ['docs', '[file|folder] [--write]', 'Read or explicitly generate repository documentation'],\n ['workflows', '', 'Inspect GitHub Actions workflows'],\n ['sbom', '[package]', 'Inspect dependencies and licenses'],\n ['engines', '', 'Show available optional analyzers'],\n ['deep', '<engine|all>', 'Run an optional analyzer when checks are enabled'],\n ['web', '', 'Open the repository in the web interface'],\n ['about', '', 'Show repository and application information'],\n ['tools', '', 'List the actual tools available to Hermes'],\n ['skills', '', 'Discover the six built-in agent workflows'],\n ['runs', '', 'List saved agent runs'],\n ['run', '<run ID>', 'Read a saved result from this repository'],\n ['export', '', 'Save this conversation as Markdown'],\n ['send', '', 'Submit the message composed with /paste'],\n ['discard', '', 'Discard the message composed with /paste'],\n ['doctor', '', 'Check the Hermes runtime and profile'],\n ['setup', '', 'Prepare the dedicated Hermes profile'],\n ['clear', '', 'Clear the screen; keep the conversation'],\n ['exit', '', 'Save and exit (Ctrl-D also works)'],\n] as const;\nexport type ChatCommand = typeof CHAT_COMMANDS[number][0];\nexport const BROWSE_COMMANDS = ['map', 'tree', 'find', 'show', 'diff', 'health', 'rescan', 'tour', 'explain', 'deps', 'inspect', 'graph', 'blast', 'symbols', 'hubs', 'layers', 'patterns', 'stats', 'security', 'stack', 'entry', 'externals', 'coupling', 'clusters', 'risks', 'log', 'hotspots', 'blame', 'diagram', 'layers-diagram', 'atlas', 'docs', 'workflows', 'sbom', 'engines', 'deep', 'web', 'about'] as const;\n\nexport function suggestCommands(line: string): typeof CHAT_COMMANDS[number][] {\n if (!/^\\/[\\w-]*$/.test(line)) return [];\n const query = line.slice(1).toLowerCase();\n return CHAT_COMMANDS.filter(([name, , summary]) => name.startsWith(query) || query.length > 1 && summary.toLowerCase().includes(query))\n .sort((a, b) => Number(b[0].startsWith(query)) - Number(a[0].startsWith(query)));\n}\n\nexport function slashInput(line: string): { name: string; args: string[]; body: string } | null {\n const match = /^\\/([\\w-]*)(?:\\s+([\\s\\S]*))?$/.exec(line.trim());\n if (!match) return null;\n const body = match[2] || '';\n // Quotes are useful for file paths. Workflow tasks retain the original body.\n const args = [...body.matchAll(/\"([^\"]*)\"|'([^']*)'|(\\S+)/g)].map(m => m[1] ?? m[2] ?? m[3]!);\n return { name: match[1]!, args, body };\n}\nexport function chatHelp(topic = ''): string {\n const commands = topic ? CHAT_COMMANDS.filter(c => c[0] === topic.replace(/^\\//, '')) : CHAT_COMMANDS;\n if (!commands.length) return `Unknown command /${topic}. Use /help.`;\n return ['Slash commands', '', ...commands.map(([name, args, detail]) => ` /${name}${args ? ' ' + args : ''}\\n ${detail}`), '',\n 'Type / for live suggestions. ↑/↓ select; Tab or Enter fills the command. Esc dismisses.',\n 'Alt-Enter adds a line. Bracketed paste preserves multiline text. Ctrl-C cancels a task.',\n '/review 42 /triage 12 /implement Fix the failing test',\n '/permissions checks on /permissions github on',\n 'Paste a GitHub URL to clone and open it, then type your question.',\n 'Follow-ups reuse the Hermes session. Mode, target, model, or permission changes start a new session.',\n 'Use /paste for multiline text. /new resets context; /clear only clears the screen.'].join('\\n');\n}\nexport function completeChat(line: string, files: string[] = []): [string[], string] {\n if (!line.startsWith('/')) return [[], line];\n if (!line.includes(' ')) return [CHAT_COMMANDS.map(c => '/' + c[0]).filter(c => c.startsWith(line)), line];\n const [command, ...args] = line.split(/\\s+/), fragment = args.at(-1) || '';\n let candidates: readonly string[] = [];\n if (command === '/mode') candidates = AGENT_MODES;\n if (command === '/permissions') candidates = args.length === 1 ? ['checks', 'github'] : ['on', 'off'];\n if (command === '/model' && args.length === 1) candidates = ['configure', 'default'];\n if (['/show', '/tree', '/repo', '/deps', '/inspect', '/graph', '/blast', '/symbols', '/explain', '/blame', '/docs', '/diagram'].includes(command!)) candidates = files;\n return [candidates.filter(c => c.startsWith(fragment)).slice(0, 100), fragment];\n}\n"]}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/chat/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import { AGENT_MODES } from '../agent/contracts.js';\n\nexport const CHAT_COMMANDS = [\n ['help', '[command]', 'Show commands and examples'],\n ['ask', '<question>', 'Ask about this repository'],\n ['review', '[PR number] [task]', 'Review local changes or a GitHub PR'],\n ['triage', '[issue number] [task]', 'Investigate issues and suggest fixes'],\n ['implement', '<task>', 'Make changes in an isolated Git workspace'],\n ['pr', '<task>', 'Prepare a draft PR; publish when GitHub writes are enabled'],\n ['github', '<task>', 'Work with GitHub issues, reviews, labels, and CI'],\n ['mode', '[ask|review|triage|implement|pr|github]', 'Choose the workflow for following messages'],\n ['permissions', '[checks|github] [on|off]', 'Control test execution and GitHub writes'],\n ['model', '[name] [provider]', 'Open the provider/model picker; configure opens full Hermes setup'],\n ['limits', '[seconds] [turns]', 'Set the run timeout and tool-turn budget'],\n ['repo', '[folder|GitHub URL]', 'Show or switch the repository; clone GitHub URLs'],\n ['clone', '<GitHub URL>', 'Clone a repository into a saved local checkout'],\n ['pull', '', 'Update the saved checkout without overwriting local changes'],\n ['new', '', 'Start a fresh conversation'],\n ['history', '', 'List saved conversations for this repository'],\n ['resume', '<conversation ID>', 'Continue a saved conversation'],\n ['status', '', 'Show model, permissions, workspace, and last run'],\n ['paste', '', 'Enter a multiline message; finish with /send or /discard'],\n ['cancel', '', 'Stop the active task (Ctrl-C also works)'],\n ['map', '', 'Repository overview, available offline'],\n ['tree', '[folder] [depth]', 'Browse repository files'],\n ['find', '<query>', 'Search files, symbols, and contents'],\n ['show', '<file> [from] [count]', 'Read a file'],\n ['diff', '[base] [head] [file]', 'Inspect changes in the current workspace'],\n ['health', '', 'Inspect repository health'],\n ['rescan', '', 'Refresh the cached repository analysis'],\n ['tour', '', 'Find the best reading order for this codebase'],\n ['explain', '[file|folder]', 'Explain a module using local analysis'],\n ['deps', '<file>', 'Trace imports and reverse dependencies'],\n ['inspect', '<file>', 'Inspect role, complexity, exports, and findings'],\n ['graph', '<file> [depth]', 'Explore the dependency graph'],\n ['blast', '<file>', 'Show the impact of changing a file'],\n ['symbols', '<file>', 'List functions, classes, and exports'],\n ['hubs', '', 'Find the most depended-on modules'],\n ['layers', '', 'Inspect architecture layers'],\n ['patterns', '', 'Discover architecture patterns'],\n ['stats', '', 'Inspect language and complexity statistics'],\n ['security', '', 'Show local security findings'],\n ['stack', '', 'Inspect frameworks and dependencies'],\n ['entry', '', 'Locate application entry points'],\n ['externals', '', 'Inspect external dependencies and drift'],\n ['coupling', '', 'Explore traffic between folders'],\n ['clusters', '', 'Find groups of related modules'],\n ['risks', '', 'Inspect code and architecture risks'],\n ['log', '[count]', 'Read recent Git commits'],\n ['hotspots', '[count]', 'Find frequently changed complex files'],\n ['blame', '<file>', 'Read line authorship'],\n ['diagram', '[file|folder]', 'Generate Mermaid diagram source'],\n ['layers-diagram', '', 'Generate an architecture layer diagram'],\n ['atlas', '', 'Browse available diagrams'],\n ['docs', '[file|folder] [--write]', 'Read or explicitly generate repository documentation'],\n ['workflows', '', 'Inspect GitHub Actions workflows'],\n ['sbom', '[package]', 'Inspect dependencies and licenses'],\n ['engines', '', 'Show available optional analyzers'],\n ['deep', '[engine|all|security|dead-code|results|explain|export|options]', 'Choose web UI analyzers, configure scans, and explain saved results'],\n ['web', '', 'Open the repository in the web interface'],\n ['about', '', 'Show repository and application information'],\n ['tools', '', 'List the actual tools available to Hermes'],\n ['skills', '', 'Discover the six built-in agent workflows'],\n ['runs', '', 'List saved agent runs'],\n ['run', '<run ID>', 'Read a saved result from this repository'],\n ['export', '', 'Save this conversation as Markdown'],\n ['send', '', 'Submit the message composed with /paste'],\n ['discard', '', 'Discard the message composed with /paste'],\n ['doctor', '', 'Check the Hermes runtime and profile'],\n ['setup', '', 'Prepare the dedicated Hermes profile'],\n ['clear', '', 'Clear the screen; keep the conversation'],\n ['exit', '', 'Save and exit (Ctrl-D also works)'],\n] as const;\nexport type ChatCommand = typeof CHAT_COMMANDS[number][0];\nexport const BROWSE_COMMANDS = ['map', 'tree', 'find', 'show', 'diff', 'health', 'rescan', 'tour', 'explain', 'deps', 'inspect', 'graph', 'blast', 'symbols', 'hubs', 'layers', 'patterns', 'stats', 'security', 'stack', 'entry', 'externals', 'coupling', 'clusters', 'risks', 'log', 'hotspots', 'blame', 'diagram', 'layers-diagram', 'atlas', 'docs', 'workflows', 'sbom', 'engines', 'deep', 'web', 'about'] as const;\n\nexport function suggestCommands(line: string): typeof CHAT_COMMANDS[number][] {\n if (!/^\\/[\\w-]*$/.test(line)) return [];\n const query = line.slice(1).toLowerCase();\n return CHAT_COMMANDS.filter(([name, , summary]) => name.startsWith(query) || query.length > 1 && summary.toLowerCase().includes(query))\n .sort((a, b) => Number(b[0].startsWith(query)) - Number(a[0].startsWith(query)));\n}\n\nexport function slashInput(line: string): { name: string; args: string[]; body: string } | null {\n const match = /^\\/([\\w-]*)(?:\\s+([\\s\\S]*))?$/.exec(line.trim());\n if (!match) return null;\n const body = match[2] || '';\n // Quotes are useful for file paths. Workflow tasks retain the original body.\n const args = [...body.matchAll(/\"([^\"]*)\"|'([^']*)'|(\\S+)/g)].map(m => m[1] ?? m[2] ?? m[3]!);\n return { name: match[1]!, args, body };\n}\nexport function chatHelp(topic = ''): string {\n const commands = topic ? CHAT_COMMANDS.filter(c => c[0] === topic.replace(/^\\//, '')) : CHAT_COMMANDS;\n if (!commands.length) return `Unknown command /${topic}. Use /help.`;\n return ['Slash commands', '', ...commands.map(([name, args, detail]) => ` /${name}${args ? ' ' + args : ''}\\n ${detail}`), '',\n 'Type / for live suggestions. ↑/↓ select; Tab or Enter fills the command. Esc dismisses.',\n 'Alt-Enter adds a line. Bracketed paste preserves multiline text. Ctrl-C cancels a task.',\n '/review 42 /triage 12 /implement Fix the failing test',\n '/permissions checks on /permissions github on',\n 'Paste a GitHub URL to clone and open it, then type your question.',\n 'Follow-ups reuse the Hermes session. Mode, target, model, or permission changes start a new session.',\n 'Use /paste for multiline text. /new resets context; /clear only clears the screen.'].join('\\n');\n}\nexport function completeChat(line: string, files: string[] = []): [string[], string] {\n if (!line.startsWith('/')) return [[], line];\n if (!line.includes(' ')) return [CHAT_COMMANDS.map(c => '/' + c[0]).filter(c => c.startsWith(line)), line];\n const [command, ...args] = line.split(/\\s+/), fragment = args.at(-1) || '';\n let candidates: readonly string[] = [];\n if (command === '/mode') candidates = AGENT_MODES;\n if (command === '/permissions') candidates = args.length === 1 ? ['checks', 'github'] : ['on', 'off'];\n if (command === '/model' && args.length === 1) candidates = ['configure', 'default'];\n if (command === '/deep') candidates = args.length === 1 ? ['all', 'security', 'dead-code', 'semgrep', 'gitleaks', 'knip', 'vulture', 'depcheck', 'results', 'explain', 'export', 'options', 'help'] : args[0] === 'options' ? ['semgrep', 'gitleaks', 'knip', 'vulture', 'depcheck'] : args[0] === 'results' ? ['critical', 'high', 'medium', 'low', 'info', 'semgrep', 'gitleaks', 'knip', 'vulture', 'depcheck'] : [];\n if (['/show', '/tree', '/repo', '/deps', '/inspect', '/graph', '/blast', '/symbols', '/explain', '/blame', '/docs', '/diagram'].includes(command!)) candidates = files;\n return [candidates.filter(c => c.startsWith(fragment)).slice(0, 100), fragment];\n}\n"]}
@@ -25,6 +25,10 @@ export interface ChatPorts {
25
25
  browse?: (name: string, args: string[], root: string, signal: AbortSignal) => Promise<string>;
26
26
  utility?: (name: ChatUtility, signal: AbortSignal) => Promise<string>;
27
27
  chooseModel?: (configure: boolean, signal: AbortSignal) => Promise<boolean>;
28
+ analysis?: (name: string, args: string[], root: string, signal: AbortSignal, checks: boolean) => Promise<{
29
+ text: string;
30
+ explain?: string;
31
+ }>;
28
32
  store?: ChatStore;
29
33
  runner?: Omit<RunnerOptions, 'onEvent' | 'signal'>;
30
34
  sources?: ChatSources;
@@ -258,6 +258,15 @@ export class ChatController {
258
258
  this.say(await this.utility(name));
259
259
  return;
260
260
  }
261
+ if ((name === 'deep' || name === 'engines') && this.ports.analysis) {
262
+ const result = await this.ports.analysis(name, args, this.workspace, this.abort.signal, this.settings.checks);
263
+ this.abort.signal.throwIfAborted();
264
+ if (result.explain)
265
+ await this.run(result.explain, result.text);
266
+ else
267
+ this.say(result.text);
268
+ return;
269
+ }
261
270
  if (BROWSE_COMMANDS.includes(name)) {
262
271
  if (name === 'deep' && !this.settings.checks)
263
272
  throw new Error('Enable /permissions checks on before running an external analyzer.');
@@ -292,7 +301,7 @@ export class ChatController {
292
301
  throw new Error(`Unknown command /${name}. Use /help; Tab completes commands.`);
293
302
  }
294
303
  catch (e) {
295
- this.say(e instanceof Error ? e.message : String(e));
304
+ this.say(this.abort?.signal.aborted ? 'Task cancelled.' : e instanceof Error ? e.message : String(e));
296
305
  }
297
306
  finally {
298
307
  this.busy = false;
@@ -355,14 +364,14 @@ export class ChatController {
355
364
  if (last)
356
365
  this.say('Last answer\n' + last.answer);
357
366
  }
358
- async run(task) {
367
+ async run(task, displayPrompt = task) {
359
368
  if (!task.trim() || task.length > 16000)
360
369
  throw new Error('Messages must contain 1–16000 characters.');
361
370
  const s = this.settings, start = Date.now();
362
371
  const request = { root: s.root, mode: s.mode, task, model: s.model, provider: s.provider, pr: s.pr, issue: s.issue,
363
372
  base: s.base, allowChecks: s.checks, allowGithubWrites: s.github, timeoutSeconds: s.timeout, maxTurns: s.maxTurns,
364
373
  ...(this.record.lastRun ? { resume: this.record.lastRun } : {}) };
365
- this.ports.output({ type: 'start', prompt: terminalText(redact(task, this.ports.runner?.env)), mode: s.mode });
374
+ this.ports.output({ type: 'start', prompt: terminalText(redact(displayPrompt, this.ports.runner?.env)), mode: s.mode });
366
375
  let result, sessionStarted = false;
367
376
  try {
368
377
  result = await (this.ports.run || runAgent)(request, { ...this.ports.runner, signal: this.abort.signal,
@@ -384,7 +393,7 @@ export class ChatController {
384
393
  // Keep the previous working session on failure; new failures start fresh.
385
394
  if (result.sessionId && (result.status === 'completed' || result.status === 'cancelled' && sessionStarted))
386
395
  this.record.lastRun = result.id;
387
- this.record.turns.push({ at: new Date().toISOString(), prompt: task, answer: result.answer, run: result.id, status: result.status });
396
+ this.record.turns.push({ at: new Date().toISOString(), prompt: displayPrompt, answer: result.answer, run: result.id, status: result.status });
388
397
  this.record.turns = this.record.turns.slice(-100);
389
398
  this.ports.output({ type: 'end', result, elapsed: Date.now() - start });
390
399
  await this.persist();