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
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { AGENT_MODES } from '../agent/contracts.js';
|
|
2
|
+
export const CHAT_COMMANDS = [
|
|
3
|
+
['help', '[command]', 'Show commands and examples'],
|
|
4
|
+
['ask', '<question>', 'Ask about this repository'],
|
|
5
|
+
['review', '[PR number] [task]', 'Review local changes or a GitHub PR'],
|
|
6
|
+
['triage', '[issue number] [task]', 'Investigate issues and suggest fixes'],
|
|
7
|
+
['implement', '<task>', 'Make changes in an isolated Git workspace'],
|
|
8
|
+
['pr', '<task>', 'Prepare a draft PR; publish when GitHub writes are enabled'],
|
|
9
|
+
['github', '<task>', 'Work with GitHub issues, reviews, labels, and CI'],
|
|
10
|
+
['mode', '[ask|review|triage|implement|pr|github]', 'Choose the workflow for following messages'],
|
|
11
|
+
['permissions', '[checks|github] [on|off]', 'Control test execution and GitHub writes'],
|
|
12
|
+
['model', '[name] [provider]', 'Open the provider/model picker; configure opens full Hermes setup'],
|
|
13
|
+
['limits', '[seconds] [turns]', 'Set the run timeout and tool-turn budget'],
|
|
14
|
+
['repo', '[folder|GitHub URL]', 'Show or switch the repository; clone GitHub URLs'],
|
|
15
|
+
['clone', '<GitHub URL>', 'Clone a repository into a saved local checkout'],
|
|
16
|
+
['pull', '', 'Update the saved checkout without overwriting local changes'],
|
|
17
|
+
['new', '', 'Start a fresh conversation'],
|
|
18
|
+
['history', '', 'List saved conversations for this repository'],
|
|
19
|
+
['resume', '<conversation ID>', 'Continue a saved conversation'],
|
|
20
|
+
['status', '', 'Show model, permissions, workspace, and last run'],
|
|
21
|
+
['paste', '', 'Enter a multiline message; finish with /send or /discard'],
|
|
22
|
+
['cancel', '', 'Stop the active task (Ctrl-C also works)'],
|
|
23
|
+
['map', '', 'Repository overview, available offline'],
|
|
24
|
+
['tree', '[folder] [depth]', 'Browse repository files'],
|
|
25
|
+
['find', '<query>', 'Search files, symbols, and contents'],
|
|
26
|
+
['show', '<file> [from] [count]', 'Read a file'],
|
|
27
|
+
['diff', '[base] [head] [file]', 'Inspect changes in the current workspace'],
|
|
28
|
+
['health', '', 'Inspect repository health'],
|
|
29
|
+
['rescan', '', 'Refresh the cached repository analysis'],
|
|
30
|
+
['tour', '', 'Find the best reading order for this codebase'],
|
|
31
|
+
['explain', '[file|folder]', 'Explain a module using local analysis'],
|
|
32
|
+
['deps', '<file>', 'Trace imports and reverse dependencies'],
|
|
33
|
+
['inspect', '<file>', 'Inspect role, complexity, exports, and findings'],
|
|
34
|
+
['graph', '<file> [depth]', 'Explore the dependency graph'],
|
|
35
|
+
['blast', '<file>', 'Show the impact of changing a file'],
|
|
36
|
+
['symbols', '<file>', 'List functions, classes, and exports'],
|
|
37
|
+
['hubs', '', 'Find the most depended-on modules'],
|
|
38
|
+
['layers', '', 'Inspect architecture layers'],
|
|
39
|
+
['patterns', '', 'Discover architecture patterns'],
|
|
40
|
+
['stats', '', 'Inspect language and complexity statistics'],
|
|
41
|
+
['security', '', 'Show local security findings'],
|
|
42
|
+
['stack', '', 'Inspect frameworks and dependencies'],
|
|
43
|
+
['entry', '', 'Locate application entry points'],
|
|
44
|
+
['externals', '', 'Inspect external dependencies and drift'],
|
|
45
|
+
['coupling', '', 'Explore traffic between folders'],
|
|
46
|
+
['clusters', '', 'Find groups of related modules'],
|
|
47
|
+
['risks', '', 'Inspect code and architecture risks'],
|
|
48
|
+
['log', '[count]', 'Read recent Git commits'],
|
|
49
|
+
['hotspots', '[count]', 'Find frequently changed complex files'],
|
|
50
|
+
['blame', '<file>', 'Read line authorship'],
|
|
51
|
+
['diagram', '[file|folder]', 'Generate Mermaid diagram source'],
|
|
52
|
+
['layers-diagram', '', 'Generate an architecture layer diagram'],
|
|
53
|
+
['atlas', '', 'Browse available diagrams'],
|
|
54
|
+
['docs', '[file|folder] [--write]', 'Read or explicitly generate repository documentation'],
|
|
55
|
+
['workflows', '', 'Inspect GitHub Actions workflows'],
|
|
56
|
+
['sbom', '[package]', 'Inspect dependencies and licenses'],
|
|
57
|
+
['engines', '', 'Show available optional analyzers'],
|
|
58
|
+
['deep', '[engine|all|security|dead-code|results|explain|export|options]', 'Choose web UI analyzers, configure scans, and explain saved results'],
|
|
59
|
+
['web', '', 'Open the repository in the web interface'],
|
|
60
|
+
['about', '', 'Show repository and application information'],
|
|
61
|
+
['tools', '', 'List the actual tools available to Hermes'],
|
|
62
|
+
['skills', '', 'Discover the six built-in agent workflows'],
|
|
63
|
+
['runs', '', 'List saved agent runs'],
|
|
64
|
+
['run', '<run ID>', 'Read a saved result from this repository'],
|
|
65
|
+
['export', '', 'Save this conversation as Markdown'],
|
|
66
|
+
['send', '', 'Submit the message composed with /paste'],
|
|
67
|
+
['discard', '', 'Discard the message composed with /paste'],
|
|
68
|
+
['doctor', '', 'Check the Hermes runtime and profile'],
|
|
69
|
+
['setup', '', 'Prepare the dedicated Hermes profile'],
|
|
70
|
+
['clear', '', 'Clear the screen; keep the conversation'],
|
|
71
|
+
['exit', '', 'Save and exit (Ctrl-D also works)'],
|
|
72
|
+
];
|
|
73
|
+
export 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'];
|
|
74
|
+
export function suggestCommands(line) {
|
|
75
|
+
if (!/^\/[\w-]*$/.test(line))
|
|
76
|
+
return [];
|
|
77
|
+
const query = line.slice(1).toLowerCase();
|
|
78
|
+
return CHAT_COMMANDS.filter(([name, , summary]) => name.startsWith(query) || query.length > 1 && summary.toLowerCase().includes(query))
|
|
79
|
+
.sort((a, b) => Number(b[0].startsWith(query)) - Number(a[0].startsWith(query)));
|
|
80
|
+
}
|
|
81
|
+
export function slashInput(line) {
|
|
82
|
+
const match = /^\/([\w-]*)(?:\s+([\s\S]*))?$/.exec(line.trim());
|
|
83
|
+
if (!match)
|
|
84
|
+
return null;
|
|
85
|
+
const body = match[2] || '';
|
|
86
|
+
// Quotes are useful for file paths. Workflow tasks retain the original body.
|
|
87
|
+
const args = [...body.matchAll(/"([^"]*)"|'([^']*)'|(\S+)/g)].map(m => m[1] ?? m[2] ?? m[3]);
|
|
88
|
+
return { name: match[1], args, body };
|
|
89
|
+
}
|
|
90
|
+
export function chatHelp(topic = '') {
|
|
91
|
+
const commands = topic ? CHAT_COMMANDS.filter(c => c[0] === topic.replace(/^\//, '')) : CHAT_COMMANDS;
|
|
92
|
+
if (!commands.length)
|
|
93
|
+
return `Unknown command /${topic}. Use /help.`;
|
|
94
|
+
return ['Slash commands', '', ...commands.map(([name, args, detail]) => ` /${name}${args ? ' ' + args : ''}\n ${detail}`), '',
|
|
95
|
+
'Type / for live suggestions. ↑/↓ select; Tab or Enter fills the command. Esc dismisses.',
|
|
96
|
+
'Alt-Enter adds a line. Bracketed paste preserves multiline text. Ctrl-C cancels a task.',
|
|
97
|
+
'/review 42 /triage 12 /implement Fix the failing test',
|
|
98
|
+
'/permissions checks on /permissions github on',
|
|
99
|
+
'Paste a GitHub URL to clone and open it, then type your question.',
|
|
100
|
+
'Follow-ups reuse the Hermes session. Mode, target, model, or permission changes start a new session.',
|
|
101
|
+
'Use /paste for multiline text. /new resets context; /clear only clears the screen.'].join('\n');
|
|
102
|
+
}
|
|
103
|
+
export function completeChat(line, files = []) {
|
|
104
|
+
if (!line.startsWith('/'))
|
|
105
|
+
return [[], line];
|
|
106
|
+
if (!line.includes(' '))
|
|
107
|
+
return [CHAT_COMMANDS.map(c => '/' + c[0]).filter(c => c.startsWith(line)), line];
|
|
108
|
+
const [command, ...args] = line.split(/\s+/), fragment = args.at(-1) || '';
|
|
109
|
+
let candidates = [];
|
|
110
|
+
if (command === '/mode')
|
|
111
|
+
candidates = AGENT_MODES;
|
|
112
|
+
if (command === '/permissions')
|
|
113
|
+
candidates = args.length === 1 ? ['checks', 'github'] : ['on', 'off'];
|
|
114
|
+
if (command === '/model' && args.length === 1)
|
|
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'] : [];
|
|
118
|
+
if (['/show', '/tree', '/repo', '/deps', '/inspect', '/graph', '/blast', '/symbols', '/explain', '/blame', '/docs', '/diagram'].includes(command))
|
|
119
|
+
candidates = files;
|
|
120
|
+
return [candidates.filter(c => c.startsWith(fragment)).slice(0, 100), fragment];
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +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|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"]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import readline from 'node:readline';
|
|
2
|
+
import { type ChatTheme } from './render.js';
|
|
3
|
+
export interface ComposerOptions {
|
|
4
|
+
input: NodeJS.ReadStream;
|
|
5
|
+
output: NodeJS.WriteStream;
|
|
6
|
+
theme?: ChatTheme;
|
|
7
|
+
state: () => {
|
|
8
|
+
mode: string;
|
|
9
|
+
status: string;
|
|
10
|
+
busy: boolean;
|
|
11
|
+
pasting: boolean;
|
|
12
|
+
files: string[];
|
|
13
|
+
};
|
|
14
|
+
submit: (message: string) => void;
|
|
15
|
+
cancel: () => void;
|
|
16
|
+
exit: () => void;
|
|
17
|
+
fullscreen?: boolean;
|
|
18
|
+
welcome?: (columns: number, rows: number) => string;
|
|
19
|
+
header?: () => string;
|
|
20
|
+
}
|
|
21
|
+
export interface PickerChoice {
|
|
22
|
+
value: string;
|
|
23
|
+
label: string;
|
|
24
|
+
detail?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface PickerOptions {
|
|
27
|
+
title: string;
|
|
28
|
+
hint?: string;
|
|
29
|
+
choices: PickerChoice[];
|
|
30
|
+
selected?: string;
|
|
31
|
+
signal?: AbortSignal;
|
|
32
|
+
}
|
|
33
|
+
/** Raw-input composer with a full-screen viewport or an inline terminal footer. */
|
|
34
|
+
export declare class TerminalComposer {
|
|
35
|
+
private options;
|
|
36
|
+
value: string;
|
|
37
|
+
private cursor;
|
|
38
|
+
private selected;
|
|
39
|
+
private dismissed;
|
|
40
|
+
private history;
|
|
41
|
+
private historyIndex;
|
|
42
|
+
private draft;
|
|
43
|
+
private paste;
|
|
44
|
+
private pasteCR;
|
|
45
|
+
private suspended;
|
|
46
|
+
private attached;
|
|
47
|
+
private drawnRows;
|
|
48
|
+
private cursorRow;
|
|
49
|
+
private timer;
|
|
50
|
+
private rawBefore;
|
|
51
|
+
private theme;
|
|
52
|
+
private screen;
|
|
53
|
+
private viewHeight;
|
|
54
|
+
private picker;
|
|
55
|
+
private onKey;
|
|
56
|
+
private onResize;
|
|
57
|
+
constructor(options: ComposerOptions);
|
|
58
|
+
get choosing(): boolean;
|
|
59
|
+
start(): void;
|
|
60
|
+
suspend(): void;
|
|
61
|
+
close(): void;
|
|
62
|
+
refresh(): void;
|
|
63
|
+
print(text: string): void;
|
|
64
|
+
clear(): void;
|
|
65
|
+
choose(options: PickerOptions): Promise<string | null>;
|
|
66
|
+
private pickerChoices;
|
|
67
|
+
private pickerKey;
|
|
68
|
+
private erase;
|
|
69
|
+
private replace;
|
|
70
|
+
private insert;
|
|
71
|
+
private suggestions;
|
|
72
|
+
key(text: string, key?: readline.Key): void;
|
|
73
|
+
private deleteNext;
|
|
74
|
+
private render;
|
|
75
|
+
}
|