viberag 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +219 -0
- package/dist/cli/__tests__/mcp-setup.test.d.ts +6 -0
- package/dist/cli/__tests__/mcp-setup.test.js +597 -0
- package/dist/cli/app.d.ts +2 -0
- package/dist/cli/app.js +238 -0
- package/dist/cli/commands/handlers.d.ts +57 -0
- package/dist/cli/commands/handlers.js +231 -0
- package/dist/cli/commands/index.d.ts +2 -0
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/mcp-setup.d.ts +107 -0
- package/dist/cli/commands/mcp-setup.js +509 -0
- package/dist/cli/commands/useRagCommands.d.ts +23 -0
- package/dist/cli/commands/useRagCommands.js +180 -0
- package/dist/cli/components/CleanWizard.d.ts +17 -0
- package/dist/cli/components/CleanWizard.js +169 -0
- package/dist/cli/components/InitWizard.d.ts +20 -0
- package/dist/cli/components/InitWizard.js +370 -0
- package/dist/cli/components/McpSetupWizard.d.ts +37 -0
- package/dist/cli/components/McpSetupWizard.js +387 -0
- package/dist/cli/components/SearchResultsDisplay.d.ts +13 -0
- package/dist/cli/components/SearchResultsDisplay.js +130 -0
- package/dist/cli/components/WelcomeBanner.d.ts +10 -0
- package/dist/cli/components/WelcomeBanner.js +26 -0
- package/dist/cli/components/index.d.ts +1 -0
- package/dist/cli/components/index.js +1 -0
- package/dist/cli/data/mcp-editors.d.ts +80 -0
- package/dist/cli/data/mcp-editors.js +270 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli-bundle.cjs +5269 -0
- package/dist/common/commands/terminalSetup.d.ts +2 -0
- package/dist/common/commands/terminalSetup.js +144 -0
- package/dist/common/components/CommandSuggestions.d.ts +9 -0
- package/dist/common/components/CommandSuggestions.js +20 -0
- package/dist/common/components/StaticWithResize.d.ts +23 -0
- package/dist/common/components/StaticWithResize.js +62 -0
- package/dist/common/components/StatusBar.d.ts +8 -0
- package/dist/common/components/StatusBar.js +64 -0
- package/dist/common/components/TextInput.d.ts +12 -0
- package/dist/common/components/TextInput.js +239 -0
- package/dist/common/components/index.d.ts +3 -0
- package/dist/common/components/index.js +3 -0
- package/dist/common/hooks/index.d.ts +4 -0
- package/dist/common/hooks/index.js +4 -0
- package/dist/common/hooks/useCommandHistory.d.ts +7 -0
- package/dist/common/hooks/useCommandHistory.js +51 -0
- package/dist/common/hooks/useCtrlC.d.ts +9 -0
- package/dist/common/hooks/useCtrlC.js +40 -0
- package/dist/common/hooks/useKittyKeyboard.d.ts +10 -0
- package/dist/common/hooks/useKittyKeyboard.js +26 -0
- package/dist/common/hooks/useStaticOutputBuffer.d.ts +31 -0
- package/dist/common/hooks/useStaticOutputBuffer.js +58 -0
- package/dist/common/hooks/useTerminalResize.d.ts +28 -0
- package/dist/common/hooks/useTerminalResize.js +51 -0
- package/dist/common/hooks/useTextBuffer.d.ts +13 -0
- package/dist/common/hooks/useTextBuffer.js +165 -0
- package/dist/common/index.d.ts +13 -0
- package/dist/common/index.js +17 -0
- package/dist/common/types.d.ts +162 -0
- package/dist/common/types.js +1 -0
- package/dist/mcp/index.d.ts +12 -0
- package/dist/mcp/index.js +66 -0
- package/dist/mcp/server.d.ts +25 -0
- package/dist/mcp/server.js +837 -0
- package/dist/mcp/watcher.d.ts +86 -0
- package/dist/mcp/watcher.js +334 -0
- package/dist/rag/__tests__/grammar-smoke.test.d.ts +9 -0
- package/dist/rag/__tests__/grammar-smoke.test.js +161 -0
- package/dist/rag/__tests__/helpers.d.ts +30 -0
- package/dist/rag/__tests__/helpers.js +67 -0
- package/dist/rag/__tests__/merkle.test.d.ts +5 -0
- package/dist/rag/__tests__/merkle.test.js +161 -0
- package/dist/rag/__tests__/metadata-extraction.test.d.ts +10 -0
- package/dist/rag/__tests__/metadata-extraction.test.js +202 -0
- package/dist/rag/__tests__/multi-language.test.d.ts +13 -0
- package/dist/rag/__tests__/multi-language.test.js +535 -0
- package/dist/rag/__tests__/rag.test.d.ts +10 -0
- package/dist/rag/__tests__/rag.test.js +311 -0
- package/dist/rag/__tests__/search-exhaustive.test.d.ts +9 -0
- package/dist/rag/__tests__/search-exhaustive.test.js +87 -0
- package/dist/rag/__tests__/search-filters.test.d.ts +10 -0
- package/dist/rag/__tests__/search-filters.test.js +250 -0
- package/dist/rag/__tests__/search-modes.test.d.ts +8 -0
- package/dist/rag/__tests__/search-modes.test.js +133 -0
- package/dist/rag/config/index.d.ts +61 -0
- package/dist/rag/config/index.js +111 -0
- package/dist/rag/constants.d.ts +41 -0
- package/dist/rag/constants.js +57 -0
- package/dist/rag/embeddings/fastembed.d.ts +62 -0
- package/dist/rag/embeddings/fastembed.js +124 -0
- package/dist/rag/embeddings/gemini.d.ts +26 -0
- package/dist/rag/embeddings/gemini.js +116 -0
- package/dist/rag/embeddings/index.d.ts +10 -0
- package/dist/rag/embeddings/index.js +9 -0
- package/dist/rag/embeddings/local-4b.d.ts +28 -0
- package/dist/rag/embeddings/local-4b.js +51 -0
- package/dist/rag/embeddings/local.d.ts +29 -0
- package/dist/rag/embeddings/local.js +119 -0
- package/dist/rag/embeddings/mistral.d.ts +22 -0
- package/dist/rag/embeddings/mistral.js +85 -0
- package/dist/rag/embeddings/openai.d.ts +22 -0
- package/dist/rag/embeddings/openai.js +85 -0
- package/dist/rag/embeddings/types.d.ts +37 -0
- package/dist/rag/embeddings/types.js +1 -0
- package/dist/rag/gitignore/index.d.ts +57 -0
- package/dist/rag/gitignore/index.js +178 -0
- package/dist/rag/index.d.ts +15 -0
- package/dist/rag/index.js +25 -0
- package/dist/rag/indexer/chunker.d.ts +129 -0
- package/dist/rag/indexer/chunker.js +1352 -0
- package/dist/rag/indexer/index.d.ts +6 -0
- package/dist/rag/indexer/index.js +6 -0
- package/dist/rag/indexer/indexer.d.ts +73 -0
- package/dist/rag/indexer/indexer.js +356 -0
- package/dist/rag/indexer/types.d.ts +68 -0
- package/dist/rag/indexer/types.js +47 -0
- package/dist/rag/logger/index.d.ts +20 -0
- package/dist/rag/logger/index.js +75 -0
- package/dist/rag/manifest/index.d.ts +50 -0
- package/dist/rag/manifest/index.js +97 -0
- package/dist/rag/merkle/diff.d.ts +26 -0
- package/dist/rag/merkle/diff.js +95 -0
- package/dist/rag/merkle/hash.d.ts +34 -0
- package/dist/rag/merkle/hash.js +165 -0
- package/dist/rag/merkle/index.d.ts +68 -0
- package/dist/rag/merkle/index.js +298 -0
- package/dist/rag/merkle/node.d.ts +51 -0
- package/dist/rag/merkle/node.js +69 -0
- package/dist/rag/search/filters.d.ts +21 -0
- package/dist/rag/search/filters.js +100 -0
- package/dist/rag/search/fts.d.ts +32 -0
- package/dist/rag/search/fts.js +61 -0
- package/dist/rag/search/hybrid.d.ts +17 -0
- package/dist/rag/search/hybrid.js +58 -0
- package/dist/rag/search/index.d.ts +89 -0
- package/dist/rag/search/index.js +367 -0
- package/dist/rag/search/types.d.ts +130 -0
- package/dist/rag/search/types.js +4 -0
- package/dist/rag/search/vector.d.ts +25 -0
- package/dist/rag/search/vector.js +44 -0
- package/dist/rag/storage/index.d.ts +92 -0
- package/dist/rag/storage/index.js +287 -0
- package/dist/rag/storage/lancedb-native.d.ts +7 -0
- package/dist/rag/storage/lancedb-native.js +10 -0
- package/dist/rag/storage/schema.d.ts +23 -0
- package/dist/rag/storage/schema.js +50 -0
- package/dist/rag/storage/types.d.ts +100 -0
- package/dist/rag/storage/types.js +68 -0
- package/package.json +67 -0
- package/scripts/check-node-version.js +37 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Editor Configuration Data
|
|
3
|
+
*
|
|
4
|
+
* Configuration for all supported AI coding tools and their MCP setup.
|
|
5
|
+
*/
|
|
6
|
+
import os from 'node:os';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
/**
|
|
9
|
+
* All supported editors with their MCP configurations.
|
|
10
|
+
* Sorted alphabetically by name.
|
|
11
|
+
*/
|
|
12
|
+
export const EDITORS = [
|
|
13
|
+
{
|
|
14
|
+
id: 'claude-code',
|
|
15
|
+
name: 'Claude Code',
|
|
16
|
+
configPath: '.mcp.json',
|
|
17
|
+
configFormat: 'json',
|
|
18
|
+
scope: 'project',
|
|
19
|
+
canAutoCreate: true,
|
|
20
|
+
cliCommand: 'claude mcp add viberag -- npx viberag-mcp',
|
|
21
|
+
docsUrl: 'https://code.claude.com/docs/en/mcp',
|
|
22
|
+
jsonKey: 'mcpServers',
|
|
23
|
+
description: 'auto-setup',
|
|
24
|
+
restartInstructions: 'Restart Claude Code or run: claude mcp restart viberag',
|
|
25
|
+
verificationSteps: [
|
|
26
|
+
'Run /mcp in Claude Code',
|
|
27
|
+
'Look for "viberag: connected"',
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: 'cursor',
|
|
32
|
+
name: 'Cursor',
|
|
33
|
+
configPath: '.cursor/mcp.json',
|
|
34
|
+
configFormat: 'json',
|
|
35
|
+
scope: 'project',
|
|
36
|
+
canAutoCreate: true,
|
|
37
|
+
cliCommand: null,
|
|
38
|
+
docsUrl: 'https://cursor.com/docs/context/mcp',
|
|
39
|
+
jsonKey: 'mcpServers',
|
|
40
|
+
description: 'auto-setup',
|
|
41
|
+
restartInstructions: 'Restart Cursor or reload window',
|
|
42
|
+
verificationSteps: [
|
|
43
|
+
'Settings → Cursor Settings → MCP',
|
|
44
|
+
'Verify "viberag" shows with toggle enabled',
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: 'gemini-cli',
|
|
49
|
+
name: 'Gemini CLI',
|
|
50
|
+
configPath: '~/.gemini/settings.json',
|
|
51
|
+
configFormat: 'json',
|
|
52
|
+
scope: 'global',
|
|
53
|
+
canAutoCreate: false, // Has CLI command
|
|
54
|
+
cliCommand: 'gemini mcp add viberag -- npx viberag-mcp',
|
|
55
|
+
docsUrl: 'https://geminicli.com/docs/tools/mcp-server/',
|
|
56
|
+
jsonKey: 'mcpServers',
|
|
57
|
+
description: 'global config',
|
|
58
|
+
restartInstructions: 'Restart Gemini CLI session',
|
|
59
|
+
verificationSteps: [
|
|
60
|
+
'Run /mcp in Gemini CLI',
|
|
61
|
+
'Look for "viberag" in server list',
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: 'jetbrains',
|
|
66
|
+
name: 'JetBrains IDEs',
|
|
67
|
+
configPath: null, // UI-only configuration
|
|
68
|
+
configFormat: 'ui',
|
|
69
|
+
scope: 'ui',
|
|
70
|
+
canAutoCreate: false,
|
|
71
|
+
cliCommand: null,
|
|
72
|
+
docsUrl: 'https://www.jetbrains.com/help/ai-assistant/mcp.html',
|
|
73
|
+
jsonKey: 'mcpServers',
|
|
74
|
+
description: 'manual setup',
|
|
75
|
+
restartInstructions: 'No restart needed - changes apply immediately',
|
|
76
|
+
verificationSteps: [
|
|
77
|
+
'Settings → Tools → AI Assistant → MCP',
|
|
78
|
+
'Verify "viberag" shows green in Status column',
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
id: 'codex',
|
|
83
|
+
name: 'OpenAI Codex',
|
|
84
|
+
configPath: '~/.codex/config.toml',
|
|
85
|
+
configFormat: 'toml',
|
|
86
|
+
scope: 'global',
|
|
87
|
+
canAutoCreate: false, // Has CLI command
|
|
88
|
+
cliCommand: 'codex mcp add viberag -- npx viberag-mcp',
|
|
89
|
+
docsUrl: 'https://developers.openai.com/codex/mcp/',
|
|
90
|
+
jsonKey: 'mcp_servers', // TOML section name
|
|
91
|
+
description: 'global config',
|
|
92
|
+
restartInstructions: 'Restart Codex session',
|
|
93
|
+
verificationSteps: [
|
|
94
|
+
'Run /mcp in Codex TUI',
|
|
95
|
+
'Look for "viberag" in server list',
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: 'opencode',
|
|
100
|
+
name: 'OpenCode',
|
|
101
|
+
configPath: '~/.config/opencode/opencode.json',
|
|
102
|
+
configFormat: 'json',
|
|
103
|
+
scope: 'global',
|
|
104
|
+
canAutoCreate: false,
|
|
105
|
+
cliCommand: null,
|
|
106
|
+
docsUrl: 'https://opencode.ai/docs/mcp-servers/',
|
|
107
|
+
jsonKey: 'mcp',
|
|
108
|
+
description: 'global config',
|
|
109
|
+
restartInstructions: 'Restart OpenCode session',
|
|
110
|
+
verificationSteps: [
|
|
111
|
+
'Check MCP servers list in OpenCode',
|
|
112
|
+
'Verify "viberag" appears and is enabled',
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: 'roo-code',
|
|
117
|
+
name: 'Roo Code',
|
|
118
|
+
configPath: '.roo/mcp.json',
|
|
119
|
+
configFormat: 'json',
|
|
120
|
+
scope: 'project',
|
|
121
|
+
canAutoCreate: true,
|
|
122
|
+
cliCommand: null,
|
|
123
|
+
docsUrl: 'https://docs.roocode.com/features/mcp/using-mcp-in-roo',
|
|
124
|
+
jsonKey: 'mcpServers',
|
|
125
|
+
description: 'auto-setup',
|
|
126
|
+
restartInstructions: 'Reload VS Code window',
|
|
127
|
+
verificationSteps: [
|
|
128
|
+
'Click MCP icon in Roo Code pane header',
|
|
129
|
+
'Verify "viberag" appears in server list',
|
|
130
|
+
],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
id: 'vscode',
|
|
134
|
+
name: 'VS Code Copilot',
|
|
135
|
+
configPath: '.vscode/mcp.json',
|
|
136
|
+
configFormat: 'json',
|
|
137
|
+
scope: 'project',
|
|
138
|
+
canAutoCreate: true,
|
|
139
|
+
cliCommand: null,
|
|
140
|
+
docsUrl: 'https://code.visualstudio.com/docs/copilot/customization/mcp-servers',
|
|
141
|
+
jsonKey: 'servers', // VS Code uses 'servers', not 'mcpServers'
|
|
142
|
+
description: 'auto-setup',
|
|
143
|
+
restartInstructions: 'Reload VS Code window (Cmd/Ctrl+Shift+P → "Reload Window")',
|
|
144
|
+
verificationSteps: [
|
|
145
|
+
'Cmd/Ctrl+Shift+P → "MCP: List Servers"',
|
|
146
|
+
'Verify "viberag" appears with status',
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
id: 'windsurf',
|
|
151
|
+
name: 'Windsurf',
|
|
152
|
+
configPath: '~/.codeium/windsurf/mcp_config.json',
|
|
153
|
+
configFormat: 'json',
|
|
154
|
+
scope: 'global',
|
|
155
|
+
canAutoCreate: false, // Needs merge with existing config
|
|
156
|
+
cliCommand: null,
|
|
157
|
+
docsUrl: 'https://docs.windsurf.com/windsurf/cascade/mcp',
|
|
158
|
+
jsonKey: 'mcpServers',
|
|
159
|
+
description: 'global config',
|
|
160
|
+
restartInstructions: 'Click refresh in Cascade Plugins panel, then restart',
|
|
161
|
+
verificationSteps: [
|
|
162
|
+
'Click Plugins icon in Cascade panel',
|
|
163
|
+
'Verify "viberag" shows in plugin list',
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
id: 'zed',
|
|
168
|
+
name: 'Zed',
|
|
169
|
+
configPath: '~/Library/Application Support/Zed/settings.json', // macOS default
|
|
170
|
+
configFormat: 'json',
|
|
171
|
+
scope: 'global',
|
|
172
|
+
canAutoCreate: false, // Needs merge with existing config
|
|
173
|
+
cliCommand: null,
|
|
174
|
+
docsUrl: 'https://zed.dev/docs/ai/mcp',
|
|
175
|
+
jsonKey: 'context_servers', // Different key!
|
|
176
|
+
description: 'global config',
|
|
177
|
+
restartInstructions: 'Restart Zed',
|
|
178
|
+
verificationSteps: [
|
|
179
|
+
'Open Agent Panel settings',
|
|
180
|
+
'Verify "viberag" shows green indicator',
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
];
|
|
184
|
+
/**
|
|
185
|
+
* Get editor by ID.
|
|
186
|
+
*/
|
|
187
|
+
export function getEditor(id) {
|
|
188
|
+
return EDITORS.find(e => e.id === id);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get editors that support auto-creation of project-level config.
|
|
192
|
+
*/
|
|
193
|
+
export function getAutoCreateEditors() {
|
|
194
|
+
return EDITORS.filter(e => e.canAutoCreate && e.scope === 'project');
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get editors that require global config merging.
|
|
198
|
+
*/
|
|
199
|
+
export function getGlobalConfigEditors() {
|
|
200
|
+
return EDITORS.filter(e => e.scope === 'global');
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get editors that have CLI commands.
|
|
204
|
+
*/
|
|
205
|
+
export function getCliCommandEditors() {
|
|
206
|
+
return EDITORS.filter(e => e.cliCommand !== null);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Expand ~ to home directory in path.
|
|
210
|
+
*/
|
|
211
|
+
export function expandPath(configPath) {
|
|
212
|
+
if (configPath.startsWith('~/')) {
|
|
213
|
+
return path.join(os.homedir(), configPath.slice(2));
|
|
214
|
+
}
|
|
215
|
+
return configPath;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get the absolute config path for an editor.
|
|
219
|
+
* For project-scope editors, projectRoot is required.
|
|
220
|
+
*/
|
|
221
|
+
export function getConfigPath(editor, projectRoot) {
|
|
222
|
+
if (!editor.configPath) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
if (editor.scope === 'project') {
|
|
226
|
+
if (!projectRoot) {
|
|
227
|
+
throw new Error(`Project root required for ${editor.name}`);
|
|
228
|
+
}
|
|
229
|
+
return path.join(projectRoot, editor.configPath);
|
|
230
|
+
}
|
|
231
|
+
return expandPath(editor.configPath);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Get Zed settings path based on platform.
|
|
235
|
+
*/
|
|
236
|
+
export function getZedSettingsPath() {
|
|
237
|
+
const platform = process.platform;
|
|
238
|
+
if (platform === 'darwin') {
|
|
239
|
+
return path.join(os.homedir(), 'Library/Application Support/Zed/settings.json');
|
|
240
|
+
}
|
|
241
|
+
else if (platform === 'linux') {
|
|
242
|
+
return path.join(os.homedir(), '.config/zed/settings.json');
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
// Windows - best guess
|
|
246
|
+
return path.join(os.homedir(), 'AppData/Roaming/Zed/settings.json');
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Get Windsurf config path based on platform.
|
|
251
|
+
*/
|
|
252
|
+
export function getWindsurfConfigPath() {
|
|
253
|
+
const platform = process.platform;
|
|
254
|
+
if (platform === 'win32') {
|
|
255
|
+
return path.join(os.homedir(), '.codeium/windsurf/mcp_config.json');
|
|
256
|
+
}
|
|
257
|
+
return path.join(os.homedir(), '.codeium/windsurf/mcp_config.json');
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Get OpenCode config path based on platform.
|
|
261
|
+
*/
|
|
262
|
+
export function getOpenCodeConfigPath() {
|
|
263
|
+
const platform = process.platform;
|
|
264
|
+
if (platform === 'win32') {
|
|
265
|
+
// Windows uses APPDATA for config
|
|
266
|
+
return path.join(os.homedir(), 'AppData/Roaming/opencode/opencode.json');
|
|
267
|
+
}
|
|
268
|
+
// macOS, Linux, etc. use ~/.config/opencode/
|
|
269
|
+
return path.join(os.homedir(), '.config/opencode/opencode.json');
|
|
270
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { render } from 'ink';
|
|
4
|
+
import meow from 'meow';
|
|
5
|
+
import App from './app.js';
|
|
6
|
+
const cli = meow(`
|
|
7
|
+
Usage
|
|
8
|
+
$ viberag
|
|
9
|
+
|
|
10
|
+
Options
|
|
11
|
+
--help Show help
|
|
12
|
+
--version Show version
|
|
13
|
+
|
|
14
|
+
Commands
|
|
15
|
+
/help Show available commands
|
|
16
|
+
/clear Clear the screen
|
|
17
|
+
/quit Exit the application
|
|
18
|
+
`, {
|
|
19
|
+
importMeta: import.meta,
|
|
20
|
+
flags: {},
|
|
21
|
+
});
|
|
22
|
+
// Suppress unused variable warning
|
|
23
|
+
void cli;
|
|
24
|
+
render(React.createElement(App, null), {
|
|
25
|
+
exitOnCtrlC: false, // We handle Ctrl+C ourselves
|
|
26
|
+
});
|