fivocell 4.2.4 → 4.3.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/dist/__tests__/repl.test.d.ts +2 -0
- package/dist/__tests__/repl.test.d.ts.map +1 -0
- package/dist/__tests__/repl.test.js +77 -0
- package/dist/__tests__/repl.test.js.map +1 -0
- package/dist/__tests__/setup.test.d.ts +2 -0
- package/dist/__tests__/setup.test.d.ts.map +1 -0
- package/dist/__tests__/setup.test.js +186 -0
- package/dist/__tests__/setup.test.js.map +1 -0
- package/dist/cli-repl.d.ts +27 -0
- package/dist/cli-repl.d.ts.map +1 -0
- package/dist/cli-repl.js +65 -0
- package/dist/cli-repl.js.map +1 -0
- package/dist/cli.js +348 -53
- package/dist/cli.js.map +1 -1
- package/dist/core/setup.d.ts +53 -0
- package/dist/core/setup.d.ts.map +1 -0
- package/dist/core/setup.js +371 -0
- package/dist/core/setup.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/repl.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const cli_repl_1 = require("../cli-repl");
|
|
4
|
+
describe('repl (interactive mode)', () => {
|
|
5
|
+
describe('replCompleter', () => {
|
|
6
|
+
it('returns all commands when user types just /', () => {
|
|
7
|
+
const [matches, original] = (0, cli_repl_1.replCompleter)('/');
|
|
8
|
+
expect(matches).toEqual(cli_repl_1.REPL_COMMAND_NAMES);
|
|
9
|
+
expect(original).toBe('/');
|
|
10
|
+
});
|
|
11
|
+
it('filters commands by prefix after /', () => {
|
|
12
|
+
const [matches] = (0, cli_repl_1.replCompleter)('/s');
|
|
13
|
+
expect(matches).toContain('start');
|
|
14
|
+
expect(matches).toContain('setup');
|
|
15
|
+
expect(matches).toContain('scan');
|
|
16
|
+
expect(matches).toContain('stop');
|
|
17
|
+
expect(matches).toContain('status');
|
|
18
|
+
expect(matches).toContain('session');
|
|
19
|
+
expect(matches).not.toContain('help');
|
|
20
|
+
expect(matches).not.toContain('exit');
|
|
21
|
+
});
|
|
22
|
+
it('narrows to a single match for exact prefix', () => {
|
|
23
|
+
const [matches] = (0, cli_repl_1.replCompleter)('/set');
|
|
24
|
+
expect(matches).toEqual(['setup']);
|
|
25
|
+
});
|
|
26
|
+
it('falls back to all commands when no match', () => {
|
|
27
|
+
const [matches] = (0, cli_repl_1.replCompleter)('/xyz');
|
|
28
|
+
expect(matches).toEqual(cli_repl_1.REPL_COMMAND_NAMES);
|
|
29
|
+
});
|
|
30
|
+
it('returns no matches when input does not start with /', () => {
|
|
31
|
+
const [matches] = (0, cli_repl_1.replCompleter)('scan');
|
|
32
|
+
expect(matches).toEqual([]);
|
|
33
|
+
});
|
|
34
|
+
it('handles /help', () => {
|
|
35
|
+
const [matches] = (0, cli_repl_1.replCompleter)('/help');
|
|
36
|
+
expect(matches).toEqual(['help']);
|
|
37
|
+
});
|
|
38
|
+
it('handles /exit', () => {
|
|
39
|
+
const [matches] = (0, cli_repl_1.replCompleter)('/exit');
|
|
40
|
+
expect(matches).toEqual(['exit']);
|
|
41
|
+
});
|
|
42
|
+
it('handles /context (multi-char match)', () => {
|
|
43
|
+
const [matches] = (0, cli_repl_1.replCompleter)('/co');
|
|
44
|
+
expect(matches).toContain('community');
|
|
45
|
+
expect(matches).toContain('context');
|
|
46
|
+
expect(matches).not.toContain('start');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('REPL_COMMANDS registry', () => {
|
|
50
|
+
it('contains all 17 top-level commands', () => {
|
|
51
|
+
expect(cli_repl_1.REPL_COMMANDS.length).toBe(17);
|
|
52
|
+
});
|
|
53
|
+
it('every entry has a non-empty name and description', () => {
|
|
54
|
+
for (const [name, desc] of cli_repl_1.REPL_COMMANDS) {
|
|
55
|
+
expect(name).toBeTruthy();
|
|
56
|
+
expect(desc).toBeTruthy();
|
|
57
|
+
expect(name.length).toBeGreaterThan(0);
|
|
58
|
+
expect(desc.length).toBeGreaterThan(5);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
it('names are unique', () => {
|
|
62
|
+
const names = cli_repl_1.REPL_COMMANDS.map(([n]) => n);
|
|
63
|
+
expect(new Set(names).size).toBe(names.length);
|
|
64
|
+
});
|
|
65
|
+
it('REPL_COMMAND_NAMES matches REPL_COMMANDS in order', () => {
|
|
66
|
+
const fromPairs = cli_repl_1.REPL_COMMANDS.map(([n]) => n);
|
|
67
|
+
expect(cli_repl_1.REPL_COMMAND_NAMES).toEqual(fromPairs);
|
|
68
|
+
});
|
|
69
|
+
it('includes all major commands', () => {
|
|
70
|
+
const required = ['start', 'stop', 'setup', 'scan', 'status', 'watch', 'context', 'mcp-config', 'help', 'exit'];
|
|
71
|
+
for (const r of required) {
|
|
72
|
+
expect(cli_repl_1.REPL_COMMAND_NAMES).toContain(r);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=repl.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.test.js","sourceRoot":"","sources":["../../src/__tests__/repl.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const fs = __importStar(require("fs"));
|
|
37
|
+
const os = __importStar(require("os"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const setup_1 = require("../core/setup");
|
|
40
|
+
describe('setup (idempotency checks)', () => {
|
|
41
|
+
let tmpDir;
|
|
42
|
+
let homedir;
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cell-setup-'));
|
|
45
|
+
homedir = fs.mkdtempSync(path.join(os.tmpdir(), 'cell-setup-home-'));
|
|
46
|
+
});
|
|
47
|
+
afterEach(() => {
|
|
48
|
+
try {
|
|
49
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
50
|
+
}
|
|
51
|
+
catch { }
|
|
52
|
+
try {
|
|
53
|
+
fs.rmSync(homedir, { recursive: true, force: true });
|
|
54
|
+
}
|
|
55
|
+
catch { }
|
|
56
|
+
});
|
|
57
|
+
describe('detectProject', () => {
|
|
58
|
+
it('uses package.json name when present', () => {
|
|
59
|
+
const pkg = { name: 'my-cool-app', version: '1.0.0' };
|
|
60
|
+
fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify(pkg), 'utf8');
|
|
61
|
+
const result = (0, setup_1.detectProject)(tmpDir);
|
|
62
|
+
expect(result.name).toBe('my-cool-app');
|
|
63
|
+
expect(result.source).toBe('package.json');
|
|
64
|
+
expect(result.packageJsonPath).toBe(path.join(tmpDir, 'package.json'));
|
|
65
|
+
});
|
|
66
|
+
it('falls back to folder basename when no package.json', () => {
|
|
67
|
+
const subdir = path.join(tmpDir, 'no-pkg-here');
|
|
68
|
+
fs.mkdirSync(subdir);
|
|
69
|
+
const result = (0, setup_1.detectProject)(subdir);
|
|
70
|
+
expect(result.name).toBe('no-pkg-here');
|
|
71
|
+
expect(result.source).toBe('folder-basename');
|
|
72
|
+
});
|
|
73
|
+
it('uses override when provided', () => {
|
|
74
|
+
fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ name: 'real-name' }), 'utf8');
|
|
75
|
+
const result = (0, setup_1.detectProject)(tmpDir, 'override-name');
|
|
76
|
+
expect(result.name).toBe('override-name');
|
|
77
|
+
expect(result.source).toBe('override');
|
|
78
|
+
});
|
|
79
|
+
it('ignores malformed package.json', () => {
|
|
80
|
+
fs.writeFileSync(path.join(tmpDir, 'package.json'), '{ not valid json', 'utf8');
|
|
81
|
+
const result = (0, setup_1.detectProject)(tmpDir);
|
|
82
|
+
expect(result.source).toBe('folder-basename');
|
|
83
|
+
});
|
|
84
|
+
it('ignores package.json without a name field', () => {
|
|
85
|
+
fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ version: '1.0.0' }), 'utf8');
|
|
86
|
+
const result = (0, setup_1.detectProject)(tmpDir);
|
|
87
|
+
expect(result.source).toBe('folder-basename');
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe('checkScanState', () => {
|
|
91
|
+
it('returns done=true when .cell/personal/ has files', () => {
|
|
92
|
+
const personalDir = path.join(tmpDir, '.cell', 'personal');
|
|
93
|
+
fs.mkdirSync(personalDir, { recursive: true });
|
|
94
|
+
fs.writeFileSync(path.join(personalDir, 'profile.json'), '{}', 'utf8');
|
|
95
|
+
const state = (0, setup_1.checkScanState)(tmpDir);
|
|
96
|
+
expect(state.done).toBe(true);
|
|
97
|
+
expect(state.reason).toContain('1 files');
|
|
98
|
+
expect(state.personalDir).toBe(personalDir);
|
|
99
|
+
expect(state.scannedAt).toBeTruthy();
|
|
100
|
+
});
|
|
101
|
+
it('returns done=true when AGENTS.md exists (even with no .cell/personal)', () => {
|
|
102
|
+
fs.writeFileSync(path.join(tmpDir, 'AGENTS.md'), '# user content', 'utf8');
|
|
103
|
+
const state = (0, setup_1.checkScanState)(tmpDir);
|
|
104
|
+
expect(state.done).toBe(true);
|
|
105
|
+
expect(state.reason).toContain('AGENTS.md');
|
|
106
|
+
});
|
|
107
|
+
it('returns done=false when neither exists', () => {
|
|
108
|
+
const state = (0, setup_1.checkScanState)(tmpDir);
|
|
109
|
+
expect(state.done).toBe(false);
|
|
110
|
+
expect(state.reason).toContain('no ');
|
|
111
|
+
});
|
|
112
|
+
it('returns done=false when .cell/personal exists but is empty', () => {
|
|
113
|
+
fs.mkdirSync(path.join(tmpDir, '.cell', 'personal'), { recursive: true });
|
|
114
|
+
const state = (0, setup_1.checkScanState)(tmpDir);
|
|
115
|
+
expect(state.done).toBe(false);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('checkMcpState', () => {
|
|
119
|
+
it('reports all IDEs as needsWrite when no config files exist', () => {
|
|
120
|
+
// homedir is empty -> none of the IDE config paths exist
|
|
121
|
+
const state = (0, setup_1.checkMcpState)(homedir);
|
|
122
|
+
expect(state.total).toBeGreaterThan(0);
|
|
123
|
+
expect(state.done).toBe(0);
|
|
124
|
+
expect(state.skipped).toBe(0);
|
|
125
|
+
expect(state.needsWrite.length).toBe(state.total);
|
|
126
|
+
expect(state.needsWrite).toContain('Cursor');
|
|
127
|
+
});
|
|
128
|
+
it('reports done=N when N IDE config files have fivo-cell wired', () => {
|
|
129
|
+
// Write a Cursor config with fivo-cell already wired
|
|
130
|
+
const cursorDir = path.join(homedir, '.cursor');
|
|
131
|
+
fs.mkdirSync(cursorDir, { recursive: true });
|
|
132
|
+
fs.writeFileSync(path.join(cursorDir, 'mcp.json'), JSON.stringify({ mcpServers: { 'fivo-cell': { url: 'http://localhost:9876/mcp' } } }), 'utf8');
|
|
133
|
+
const state = (0, setup_1.checkMcpState)(homedir);
|
|
134
|
+
expect(state.done).toBe(1);
|
|
135
|
+
expect(state.needsWrite).not.toContain('Cursor');
|
|
136
|
+
// Other IDEs should still need write
|
|
137
|
+
expect(state.needsWrite.length).toBe(state.total - 1);
|
|
138
|
+
});
|
|
139
|
+
it('counts skipped when config file has parse errors', () => {
|
|
140
|
+
const cursorDir = path.join(homedir, '.cursor');
|
|
141
|
+
fs.mkdirSync(cursorDir, { recursive: true });
|
|
142
|
+
fs.writeFileSync(path.join(cursorDir, 'mcp.json'), '{ not valid json', 'utf8');
|
|
143
|
+
const state = (0, setup_1.checkMcpState)(homedir);
|
|
144
|
+
expect(state.skipped).toBe(1);
|
|
145
|
+
expect(state.done).toBe(0);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
describe('isDaemonRunning', () => {
|
|
149
|
+
it('returns false when nothing is listening on a random port', async () => {
|
|
150
|
+
// Use a random high port that nothing should be on
|
|
151
|
+
const result = await (0, setup_1.isDaemonRunning)(19878, 500);
|
|
152
|
+
expect(result).toBe(false);
|
|
153
|
+
});
|
|
154
|
+
it('returns true when an HTTP server responds on the port', async () => {
|
|
155
|
+
const http = require('http');
|
|
156
|
+
const server = http.createServer((_req, res) => {
|
|
157
|
+
res.statusCode = 200;
|
|
158
|
+
res.end('OK');
|
|
159
|
+
});
|
|
160
|
+
await new Promise((resolve) => server.listen(19876, '127.0.0.1', resolve));
|
|
161
|
+
try {
|
|
162
|
+
const result = await (0, setup_1.isDaemonRunning)(19876, 1000);
|
|
163
|
+
expect(result).toBe(true);
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
it('returns false when server returns non-200', async () => {
|
|
170
|
+
const http = require('http');
|
|
171
|
+
const server = http.createServer((_req, res) => {
|
|
172
|
+
res.statusCode = 500;
|
|
173
|
+
res.end('error');
|
|
174
|
+
});
|
|
175
|
+
await new Promise((resolve) => server.listen(19877, '127.0.0.1', resolve));
|
|
176
|
+
try {
|
|
177
|
+
const result = await (0, setup_1.isDaemonRunning)(19877, 1000);
|
|
178
|
+
expect(result).toBe(false);
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
//# sourceMappingURL=setup.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.test.js","sourceRoot":"","sources":["../../src/__tests__/setup.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive REPL support — extracted from cli.ts so it can be unit tested
|
|
3
|
+
* without spawning a process. The actual `doRepl()` function (which uses
|
|
4
|
+
* readline and spawns child processes) still lives in cli.ts; this module
|
|
5
|
+
* holds the pure pieces: command registry + tab-completion logic.
|
|
6
|
+
*/
|
|
7
|
+
export declare const REPL_COMMANDS: Array<[string, string]>;
|
|
8
|
+
export declare const REPL_COMMAND_NAMES: string[];
|
|
9
|
+
/**
|
|
10
|
+
* Tab-completion for the REPL. When the input starts with `/`, returns the
|
|
11
|
+
* matching commands. Otherwise returns no completions (the user is typing
|
|
12
|
+
* a command name without the prefix).
|
|
13
|
+
*
|
|
14
|
+
* @returns Tuple of [matches, originalString] per the Node readline API.
|
|
15
|
+
*/
|
|
16
|
+
export declare function replCompleter(line: string): [string[], string];
|
|
17
|
+
/**
|
|
18
|
+
* Strip a leading `/` from a command line (so users can type either
|
|
19
|
+
* `/scan` or `scan`).
|
|
20
|
+
*/
|
|
21
|
+
export declare function stripSlash(line: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Return true if the given first token matches a known REPL command.
|
|
24
|
+
* Used to validate user input and surface typos with a helpful hint.
|
|
25
|
+
*/
|
|
26
|
+
export declare function isKnownCommand(firstToken: string): boolean;
|
|
27
|
+
//# sourceMappingURL=cli-repl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-repl.d.ts","sourceRoot":"","sources":["../src/cli-repl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBjD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,EAAkC,CAAC;AAE1E;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAU9D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE1D"}
|
package/dist/cli-repl.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Interactive REPL support — extracted from cli.ts so it can be unit tested
|
|
4
|
+
* without spawning a process. The actual `doRepl()` function (which uses
|
|
5
|
+
* readline and spawns child processes) still lives in cli.ts; this module
|
|
6
|
+
* holds the pure pieces: command registry + tab-completion logic.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.REPL_COMMAND_NAMES = exports.REPL_COMMANDS = void 0;
|
|
10
|
+
exports.replCompleter = replCompleter;
|
|
11
|
+
exports.stripSlash = stripSlash;
|
|
12
|
+
exports.isKnownCommand = isKnownCommand;
|
|
13
|
+
exports.REPL_COMMANDS = [
|
|
14
|
+
['start', 'Start daemon + MCP (re-run safe)'],
|
|
15
|
+
['stop', 'Stop daemon'],
|
|
16
|
+
['setup', 'One-time project setup (idempotent)'],
|
|
17
|
+
['scan', 'Scan codebase + build layers'],
|
|
18
|
+
['analyze', 'AI prompts from scan data'],
|
|
19
|
+
['status', 'What Cell knows about you'],
|
|
20
|
+
['session', 'Last touched file + patterns'],
|
|
21
|
+
['decisions', 'Recent decisions with verdict'],
|
|
22
|
+
['team', 'Team collaboration (git-based)'],
|
|
23
|
+
['community', 'Community patterns + benchmarks'],
|
|
24
|
+
['watch', 'Live file watcher'],
|
|
25
|
+
['blindspots', 'Scan for blind spots (15+ types)'],
|
|
26
|
+
['context', 'Inject @cell context block'],
|
|
27
|
+
['mcp-config', 'Auto-register MCP in Cursor/Antigravity/Codex/OpenCode'],
|
|
28
|
+
['help', 'Show this help (in REPL)'],
|
|
29
|
+
['version', 'Show Cell version'],
|
|
30
|
+
['exit', 'Exit REPL'],
|
|
31
|
+
];
|
|
32
|
+
exports.REPL_COMMAND_NAMES = exports.REPL_COMMANDS.map(([n]) => n);
|
|
33
|
+
/**
|
|
34
|
+
* Tab-completion for the REPL. When the input starts with `/`, returns the
|
|
35
|
+
* matching commands. Otherwise returns no completions (the user is typing
|
|
36
|
+
* a command name without the prefix).
|
|
37
|
+
*
|
|
38
|
+
* @returns Tuple of [matches, originalString] per the Node readline API.
|
|
39
|
+
*/
|
|
40
|
+
function replCompleter(line) {
|
|
41
|
+
if (line.startsWith('/')) {
|
|
42
|
+
const query = line.slice(1);
|
|
43
|
+
if (!query) {
|
|
44
|
+
return [exports.REPL_COMMAND_NAMES, line];
|
|
45
|
+
}
|
|
46
|
+
const hits = exports.REPL_COMMAND_NAMES.filter((c) => c.startsWith(query));
|
|
47
|
+
return [hits.length ? hits : exports.REPL_COMMAND_NAMES, line];
|
|
48
|
+
}
|
|
49
|
+
return [[], line];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Strip a leading `/` from a command line (so users can type either
|
|
53
|
+
* `/scan` or `scan`).
|
|
54
|
+
*/
|
|
55
|
+
function stripSlash(line) {
|
|
56
|
+
return line.replace(/^\//, '');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Return true if the given first token matches a known REPL command.
|
|
60
|
+
* Used to validate user input and surface typos with a helpful hint.
|
|
61
|
+
*/
|
|
62
|
+
function isKnownCommand(firstToken) {
|
|
63
|
+
return exports.REPL_COMMAND_NAMES.includes(firstToken);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=cli-repl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-repl.js","sourceRoot":"","sources":["../src/cli-repl.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AA+BH,sCAUC;AAMD,gCAEC;AAMD,wCAEC;AAvDY,QAAA,aAAa,GAA4B;IACpD,CAAC,OAAO,EAAE,kCAAkC,CAAC;IAC7C,CAAC,MAAM,EAAE,aAAa,CAAC;IACvB,CAAC,OAAO,EAAE,qCAAqC,CAAC;IAChD,CAAC,MAAM,EAAE,8BAA8B,CAAC;IACxC,CAAC,SAAS,EAAE,2BAA2B,CAAC;IACxC,CAAC,QAAQ,EAAE,2BAA2B,CAAC;IACvC,CAAC,SAAS,EAAE,8BAA8B,CAAC;IAC3C,CAAC,WAAW,EAAE,+BAA+B,CAAC;IAC9C,CAAC,MAAM,EAAE,gCAAgC,CAAC;IAC1C,CAAC,WAAW,EAAE,iCAAiC,CAAC;IAChD,CAAC,OAAO,EAAE,mBAAmB,CAAC;IAC9B,CAAC,YAAY,EAAE,kCAAkC,CAAC;IAClD,CAAC,SAAS,EAAE,4BAA4B,CAAC;IACzC,CAAC,YAAY,EAAE,wDAAwD,CAAC;IACxE,CAAC,MAAM,EAAE,0BAA0B,CAAC;IACpC,CAAC,SAAS,EAAE,mBAAmB,CAAC;IAChC,CAAC,MAAM,EAAE,WAAW,CAAC;CACtB,CAAC;AAEW,QAAA,kBAAkB,GAAa,qBAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAE1E;;;;;;GAMG;AACH,SAAgB,aAAa,CAAC,IAAY;IACxC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,0BAAkB,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,IAAI,GAAG,0BAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,0BAAkB,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,UAAkB;IAC/C,OAAO,0BAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACjD,CAAC"}
|