proofscan 0.5.11 → 0.6.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/dist/cli.js +9 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +2 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/shell.d.ts +6 -0
- package/dist/commands/shell.d.ts.map +1 -0
- package/dist/commands/shell.js +33 -0
- package/dist/commands/shell.js.map +1 -0
- package/dist/shell/completer.d.ts +18 -0
- package/dist/shell/completer.d.ts.map +1 -0
- package/dist/shell/completer.js +136 -0
- package/dist/shell/completer.js.map +1 -0
- package/dist/shell/history.d.ts +20 -0
- package/dist/shell/history.d.ts.map +1 -0
- package/dist/shell/history.js +75 -0
- package/dist/shell/history.js.map +1 -0
- package/dist/shell/index.d.ts +11 -0
- package/dist/shell/index.d.ts.map +1 -0
- package/dist/shell/index.js +10 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/shell/prompt.d.ts +34 -0
- package/dist/shell/prompt.d.ts.map +1 -0
- package/dist/shell/prompt.js +87 -0
- package/dist/shell/prompt.js.map +1 -0
- package/dist/shell/repl.d.ts +76 -0
- package/dist/shell/repl.d.ts.map +1 -0
- package/dist/shell/repl.js +490 -0
- package/dist/shell/repl.js.map +1 -0
- package/dist/shell/selector.d.ts +23 -0
- package/dist/shell/selector.d.ts.map +1 -0
- package/dist/shell/selector.js +86 -0
- package/dist/shell/selector.js.map +1 -0
- package/dist/shell/types.d.ts +47 -0
- package/dist/shell/types.d.ts.map +1 -0
- package/dist/shell/types.js +71 -0
- package/dist/shell/types.js.map +1 -0
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -25,7 +25,7 @@ import { setOutputOptions } from './utils/output.js';
|
|
|
25
25
|
const require = createRequire(import.meta.url);
|
|
26
26
|
const packageJson = require('../package.json');
|
|
27
27
|
const VERSION = packageJson.version;
|
|
28
|
-
import { createConfigCommand, createConnectorsCommand, createScanCommand, createMonitorCommand, createSessionsCommand, createArchiveCommand, createViewCommand, createTreeCommand, createExploreCommand, createStatusCommand, createEventsCommand, createRpcCommand, createSummaryCommand, createPermissionsCommand, createRecordCommand, createDoctorCommand, } from './commands/index.js';
|
|
28
|
+
import { createConfigCommand, createConnectorsCommand, createScanCommand, createMonitorCommand, createSessionsCommand, createArchiveCommand, createViewCommand, createTreeCommand, createExploreCommand, createStatusCommand, createEventsCommand, createRpcCommand, createSummaryCommand, createPermissionsCommand, createRecordCommand, createDoctorCommand, createShellCommand, } from './commands/index.js';
|
|
29
29
|
const program = new Command();
|
|
30
30
|
// Global state for config path
|
|
31
31
|
let globalConfigPath;
|
|
@@ -43,9 +43,10 @@ Common Commands:
|
|
|
43
43
|
explore, e Interactive data browser
|
|
44
44
|
scan, s Run a new scan
|
|
45
45
|
status, st Show system status
|
|
46
|
+
shell Interactive shell (REPL) with TAB completion
|
|
46
47
|
rpc View RPC call details (list, show)
|
|
47
|
-
summary Show session summary
|
|
48
|
-
permissions Show permission stats per category
|
|
48
|
+
summary Show session summary
|
|
49
|
+
permissions Show permission stats per category
|
|
49
50
|
|
|
50
51
|
Management:
|
|
51
52
|
archive, a Archive and prune old data
|
|
@@ -58,12 +59,11 @@ Shortcuts:
|
|
|
58
59
|
|
|
59
60
|
Examples:
|
|
60
61
|
pfscan # View recent events (default)
|
|
62
|
+
pfscan shell # Start interactive shell
|
|
61
63
|
pfscan view --limit 50 # View last 50 events
|
|
62
64
|
pfscan view --pairs # View request/response pairs
|
|
63
|
-
pfscan rpc list --session <ses> # List RPCs for a session
|
|
64
|
-
pfscan rpc show --session <ses> --id <rpc> # Show RPC details
|
|
65
65
|
pfscan tree # Show structure overview
|
|
66
|
-
pfscan scan start
|
|
66
|
+
pfscan scan start mcp # Start scanning connector 'mcp'
|
|
67
67
|
`;
|
|
68
68
|
program
|
|
69
69
|
.name('pfscan')
|
|
@@ -158,6 +158,8 @@ program.addCommand(createPermissionsCommand(getConfigPath));
|
|
|
158
158
|
program.addCommand(createRecordCommand(getConfigPath));
|
|
159
159
|
// doctor (Phase 3.4: diagnostics and repair)
|
|
160
160
|
program.addCommand(createDoctorCommand(getConfigPath));
|
|
161
|
+
// shell (Phase 4: interactive REPL)
|
|
162
|
+
program.addCommand(createShellCommand(getConfigPath));
|
|
161
163
|
// ============================================================
|
|
162
164
|
// Default action: pfscan → pfscan view
|
|
163
165
|
// ============================================================
|
|
@@ -170,7 +172,7 @@ function hasSubcommand() {
|
|
|
170
172
|
const knownCommands = new Set([
|
|
171
173
|
'view', 'v', 'tree', 't', 'explore', 'e', 'status', 'st',
|
|
172
174
|
'scan', 's', 'archive', 'a', 'config', 'c',
|
|
173
|
-
'connectors', 'connector', 'sessions', 'monitor', 'events', 'rpc', 'summary', 'permissions', 'record', 'doctor', 'help'
|
|
175
|
+
'connectors', 'connector', 'sessions', 'monitor', 'events', 'rpc', 'summary', 'permissions', 'record', 'doctor', 'shell', 'help'
|
|
174
176
|
]);
|
|
175
177
|
for (let i = 2; i < process.argv.length; i++) {
|
|
176
178
|
const arg = process.argv[i];
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,iCAAiC;AACjC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAC/C,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;AACpC,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAG7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAG5B,cAAc,UAAU,CAAC;AAGzB,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAG7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAG5B,cAAc,UAAU,CAAC;AAGzB,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAG5B,cAAc,YAAY,CAAC"}
|
package/dist/commands/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAE7B,yBAAyB;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAE5B,yBAAyB;AACzB,cAAc,UAAU,CAAC;AAEzB,uBAAuB;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAE7B,yBAAyB;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAE5B,yBAAyB;AACzB,cAAc,UAAU,CAAC;AAEzB,uBAAuB;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAE5B,sBAAsB;AACtB,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/commands/shell.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,MAAM,GAAG,OAAO,CA6BvE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell command - interactive REPL for proofscan
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { ShellRepl } from '../shell/index.js';
|
|
6
|
+
export function createShellCommand(getConfigPath) {
|
|
7
|
+
const cmd = new Command('shell')
|
|
8
|
+
.description('Start interactive shell (REPL)')
|
|
9
|
+
.action(async () => {
|
|
10
|
+
// Check if stdin is a TTY
|
|
11
|
+
if (!process.stdin.isTTY) {
|
|
12
|
+
console.error('Error: Shell requires an interactive terminal (TTY)');
|
|
13
|
+
console.error('');
|
|
14
|
+
console.error('The shell command cannot be used in non-interactive mode.');
|
|
15
|
+
console.error('Use individual commands instead, e.g.:');
|
|
16
|
+
console.error(' pfscan view');
|
|
17
|
+
console.error(' pfscan tree');
|
|
18
|
+
console.error(' pfscan scan start --id <connector>');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
// Check if stdout is a TTY
|
|
22
|
+
if (!process.stdout.isTTY) {
|
|
23
|
+
console.error('Error: Shell requires an interactive terminal (TTY)');
|
|
24
|
+
console.error('');
|
|
25
|
+
console.error('Output is being redirected. Use individual commands instead.');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const repl = new ShellRepl(getConfigPath());
|
|
29
|
+
await repl.start();
|
|
30
|
+
});
|
|
31
|
+
return cmd;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/commands/shell.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,UAAU,kBAAkB,CAAC,aAA2B;IAC5D,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;SAC7B,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,0BAA0B;QAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACrE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC3E,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACrE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5C,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell TAB completion
|
|
3
|
+
*/
|
|
4
|
+
import type { ShellContext } from './types.js';
|
|
5
|
+
export type DynamicDataProvider = {
|
|
6
|
+
getConnectorIds: () => string[];
|
|
7
|
+
getSessionPrefixes: (connectorId?: string, limit?: number) => string[];
|
|
8
|
+
getRpcIds: (sessionId?: string) => string[];
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Get completions for the current input
|
|
12
|
+
*/
|
|
13
|
+
export declare function getCompletions(line: string, context: ShellContext, dataProvider: DynamicDataProvider): [string[], string];
|
|
14
|
+
/**
|
|
15
|
+
* Create a readline completer function
|
|
16
|
+
*/
|
|
17
|
+
export declare function createCompleter(context: ShellContext, dataProvider: DynamicDataProvider): (line: string) => [string[], string];
|
|
18
|
+
//# sourceMappingURL=completer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completer.d.ts","sourceRoot":"","sources":["../../src/shell/completer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS/C,MAAM,MAAM,mBAAmB,GAAG;IAChC,eAAe,EAAE,MAAM,MAAM,EAAE,CAAC;IAChC,kBAAkB,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACvE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;CAC7C,CAAC;AAUF;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,mBAAmB,GAChC,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAgBpB;AA2ID;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,mBAAmB,GAChC,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAEtC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell TAB completion
|
|
3
|
+
*/
|
|
4
|
+
import { TOP_LEVEL_COMMANDS, COMMAND_SUBCOMMANDS, COMMAND_OPTIONS, COMMON_OPTIONS, SHELL_BUILTINS, } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Parse input line into tokens
|
|
7
|
+
*/
|
|
8
|
+
function tokenize(line) {
|
|
9
|
+
// Simple tokenization by whitespace
|
|
10
|
+
return line.trim().split(/\s+/).filter(t => t !== '');
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get completions for the current input
|
|
14
|
+
*/
|
|
15
|
+
export function getCompletions(line, context, dataProvider) {
|
|
16
|
+
const tokens = tokenize(line);
|
|
17
|
+
const currentToken = tokens.length > 0 ? tokens[tokens.length - 1] : '';
|
|
18
|
+
const isNewToken = line.endsWith(' ') || tokens.length === 0;
|
|
19
|
+
// If line ends with space, we're completing a new token
|
|
20
|
+
const tokenToComplete = isNewToken ? '' : currentToken;
|
|
21
|
+
const completedTokens = isNewToken ? tokens : tokens.slice(0, -1);
|
|
22
|
+
// Determine what to complete based on context
|
|
23
|
+
const candidates = getCandidates(completedTokens, tokenToComplete, context, dataProvider);
|
|
24
|
+
// Filter candidates by prefix
|
|
25
|
+
const matches = candidates.filter(c => c.startsWith(tokenToComplete));
|
|
26
|
+
return [matches, tokenToComplete];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get candidate completions based on parsed tokens
|
|
30
|
+
*/
|
|
31
|
+
function getCandidates(completedTokens, currentToken, context, dataProvider) {
|
|
32
|
+
// No tokens yet - complete top-level commands + builtins
|
|
33
|
+
if (completedTokens.length === 0) {
|
|
34
|
+
return [...SHELL_BUILTINS, ...TOP_LEVEL_COMMANDS];
|
|
35
|
+
}
|
|
36
|
+
const firstToken = completedTokens[0];
|
|
37
|
+
// Handle shell builtins
|
|
38
|
+
if (SHELL_BUILTINS.includes(firstToken)) {
|
|
39
|
+
return getBuiltinCompletions(firstToken, completedTokens, currentToken, context, dataProvider);
|
|
40
|
+
}
|
|
41
|
+
// Handle command completions
|
|
42
|
+
return getCommandCompletions(completedTokens, currentToken, context, dataProvider);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get completions for shell builtins
|
|
46
|
+
*/
|
|
47
|
+
function getBuiltinCompletions(command, tokens, _currentToken, _context, dataProvider) {
|
|
48
|
+
switch (command) {
|
|
49
|
+
case 'use':
|
|
50
|
+
if (tokens.length === 1) {
|
|
51
|
+
// `use <connector>` or `use session`
|
|
52
|
+
return ['session', ...dataProvider.getConnectorIds()];
|
|
53
|
+
}
|
|
54
|
+
if (tokens.length === 2 && tokens[1] === 'session') {
|
|
55
|
+
// `use session <sessionPrefix>`
|
|
56
|
+
return dataProvider.getSessionPrefixes(undefined, 50);
|
|
57
|
+
}
|
|
58
|
+
return [];
|
|
59
|
+
case 'help':
|
|
60
|
+
if (tokens.length === 1) {
|
|
61
|
+
return [...SHELL_BUILTINS, ...TOP_LEVEL_COMMANDS];
|
|
62
|
+
}
|
|
63
|
+
return [];
|
|
64
|
+
default:
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get completions for regular commands
|
|
70
|
+
*/
|
|
71
|
+
function getCommandCompletions(tokens, currentToken, context, dataProvider) {
|
|
72
|
+
const firstToken = tokens[0];
|
|
73
|
+
const candidates = [];
|
|
74
|
+
// Check if this command has subcommands
|
|
75
|
+
const subcommands = COMMAND_SUBCOMMANDS[firstToken];
|
|
76
|
+
if (subcommands && tokens.length === 1) {
|
|
77
|
+
candidates.push(...subcommands);
|
|
78
|
+
}
|
|
79
|
+
// Get options for the command
|
|
80
|
+
const commandKey = tokens.slice(0, 2).join(' ');
|
|
81
|
+
const options = COMMAND_OPTIONS[commandKey] || COMMAND_OPTIONS[firstToken] || [];
|
|
82
|
+
candidates.push(...options, ...COMMON_OPTIONS);
|
|
83
|
+
// Check if we're completing an option value
|
|
84
|
+
const prevToken = tokens[tokens.length - 1];
|
|
85
|
+
if (prevToken) {
|
|
86
|
+
// --id expects connector id for certain commands
|
|
87
|
+
if (prevToken === '--id') {
|
|
88
|
+
if (['scan', 's', 'connectors', 'connector'].includes(firstToken)) {
|
|
89
|
+
return dataProvider.getConnectorIds();
|
|
90
|
+
}
|
|
91
|
+
if (['rpc'].includes(firstToken)) {
|
|
92
|
+
return dataProvider.getRpcIds(context.session);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// --session expects session prefix
|
|
96
|
+
if (prevToken === '--session') {
|
|
97
|
+
return dataProvider.getSessionPrefixes(context.connector, 50);
|
|
98
|
+
}
|
|
99
|
+
// --connector expects connector id
|
|
100
|
+
if (prevToken === '--connector') {
|
|
101
|
+
return dataProvider.getConnectorIds();
|
|
102
|
+
}
|
|
103
|
+
// --status expects ok/err/all
|
|
104
|
+
if (prevToken === '--status') {
|
|
105
|
+
return ['ok', 'err', 'all'];
|
|
106
|
+
}
|
|
107
|
+
// --format expects format options
|
|
108
|
+
if (prevToken === '--format') {
|
|
109
|
+
return ['json', 'yaml', 'table'];
|
|
110
|
+
}
|
|
111
|
+
// --from expects import format
|
|
112
|
+
if (prevToken === '--from') {
|
|
113
|
+
return ['mcpServers'];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// For scan start without --id, suggest connector ids as positional
|
|
117
|
+
if (tokens.length >= 2 && (firstToken === 'scan' || firstToken === 's') && tokens[1] === 'start') {
|
|
118
|
+
if (!tokens.includes('--id') && !currentToken.startsWith('-')) {
|
|
119
|
+
candidates.push(...dataProvider.getConnectorIds());
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// For tree command, suggest connector ids as positional argument
|
|
123
|
+
if ((firstToken === 'tree' || firstToken === 't') && tokens.length === 1) {
|
|
124
|
+
if (!currentToken.startsWith('-')) {
|
|
125
|
+
candidates.push(...dataProvider.getConnectorIds());
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return [...new Set(candidates)]; // Deduplicate
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create a readline completer function
|
|
132
|
+
*/
|
|
133
|
+
export function createCompleter(context, dataProvider) {
|
|
134
|
+
return (line) => getCompletions(line, context, dataProvider);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=completer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completer.js","sourceRoot":"","sources":["../../src/shell/completer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell history management
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get the history file path (OS-specific)
|
|
6
|
+
*/
|
|
7
|
+
export declare function getHistoryPath(): string;
|
|
8
|
+
/**
|
|
9
|
+
* Load history from file
|
|
10
|
+
*/
|
|
11
|
+
export declare function loadHistory(): string[];
|
|
12
|
+
/**
|
|
13
|
+
* Save history to file
|
|
14
|
+
*/
|
|
15
|
+
export declare function saveHistory(history: string[]): void;
|
|
16
|
+
/**
|
|
17
|
+
* Add a line to history (deduplicates consecutive entries)
|
|
18
|
+
*/
|
|
19
|
+
export declare function addToHistory(history: string[], line: string): string[];
|
|
20
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/shell/history.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAevC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAatC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAiBnD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAYtE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell history management
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
5
|
+
import { homedir, platform } from 'os';
|
|
6
|
+
import { join, dirname } from 'path';
|
|
7
|
+
const MAX_HISTORY_SIZE = 1000;
|
|
8
|
+
/**
|
|
9
|
+
* Get the history file path (OS-specific)
|
|
10
|
+
*/
|
|
11
|
+
export function getHistoryPath() {
|
|
12
|
+
const home = homedir();
|
|
13
|
+
const os = platform();
|
|
14
|
+
switch (os) {
|
|
15
|
+
case 'win32':
|
|
16
|
+
// Windows: %APPDATA%\proofscan\shell_history
|
|
17
|
+
return join(process.env.APPDATA || join(home, 'AppData', 'Roaming'), 'proofscan', 'shell_history');
|
|
18
|
+
case 'darwin':
|
|
19
|
+
// macOS: ~/.config/proofscan/shell_history
|
|
20
|
+
return join(home, '.config', 'proofscan', 'shell_history');
|
|
21
|
+
default:
|
|
22
|
+
// Linux: ~/.config/proofscan/shell_history
|
|
23
|
+
return join(process.env.XDG_CONFIG_HOME || join(home, '.config'), 'proofscan', 'shell_history');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load history from file
|
|
28
|
+
*/
|
|
29
|
+
export function loadHistory() {
|
|
30
|
+
const path = getHistoryPath();
|
|
31
|
+
if (!existsSync(path)) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const content = readFileSync(path, 'utf-8');
|
|
36
|
+
return content.split('\n').filter(line => line.trim() !== '');
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Save history to file
|
|
44
|
+
*/
|
|
45
|
+
export function saveHistory(history) {
|
|
46
|
+
const path = getHistoryPath();
|
|
47
|
+
const dir = dirname(path);
|
|
48
|
+
// Ensure directory exists
|
|
49
|
+
if (!existsSync(dir)) {
|
|
50
|
+
mkdirSync(dir, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
// Limit history size
|
|
53
|
+
const trimmed = history.slice(-MAX_HISTORY_SIZE);
|
|
54
|
+
try {
|
|
55
|
+
writeFileSync(path, trimmed.join('\n') + '\n', 'utf-8');
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Ignore errors during save
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Add a line to history (deduplicates consecutive entries)
|
|
63
|
+
*/
|
|
64
|
+
export function addToHistory(history, line) {
|
|
65
|
+
const trimmed = line.trim();
|
|
66
|
+
if (trimmed === '') {
|
|
67
|
+
return history;
|
|
68
|
+
}
|
|
69
|
+
// Don't add if same as last entry
|
|
70
|
+
if (history.length > 0 && history[history.length - 1] === trimmed) {
|
|
71
|
+
return history;
|
|
72
|
+
}
|
|
73
|
+
return [...history, trimmed];
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/shell/history.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IAEtB,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,OAAO;YACV,6CAA6C;YAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;QACrG,KAAK,QAAQ;YACX,2CAA2C;YAC3C,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;QAC7D;YACE,2CAA2C;YAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAE9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAiB;IAC3C,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B,0BAA0B;IAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,qBAAqB;IACrB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,4BAA4B;IAC9B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAiB,EAAE,IAAY;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,kCAAkC;IAClC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QAClE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell module exports
|
|
3
|
+
*/
|
|
4
|
+
export { ShellRepl, isValidArg } from './repl.js';
|
|
5
|
+
export { generatePrompt, supportsColor } from './prompt.js';
|
|
6
|
+
export { getHistoryPath, loadHistory, saveHistory } from './history.js';
|
|
7
|
+
export { createCompleter, getCompletions, type DynamicDataProvider } from './completer.js';
|
|
8
|
+
export { selectConnector, selectSession, canInteract } from './selector.js';
|
|
9
|
+
export type { ShellContext, CompletionResult } from './types.js';
|
|
10
|
+
export { TOP_LEVEL_COMMANDS, COMMAND_SUBCOMMANDS, SHELL_BUILTINS } from './types.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shell/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5E,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell module exports
|
|
3
|
+
*/
|
|
4
|
+
export { ShellRepl, isValidArg } from './repl.js';
|
|
5
|
+
export { generatePrompt, supportsColor } from './prompt.js';
|
|
6
|
+
export { getHistoryPath, loadHistory, saveHistory } from './history.js';
|
|
7
|
+
export { createCompleter, getCompletions } from './completer.js';
|
|
8
|
+
export { selectConnector, selectSession, canInteract } from './selector.js';
|
|
9
|
+
export { TOP_LEVEL_COMMANDS, COMMAND_SUBCOMMANDS, SHELL_BUILTINS } from './types.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shell/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,cAAc,EAA4B,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell prompt generation with color support
|
|
3
|
+
*/
|
|
4
|
+
import type { ShellContext } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Check if color output is supported
|
|
7
|
+
*/
|
|
8
|
+
export declare function supportsColor(): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Shorten session ID to prefix
|
|
11
|
+
*/
|
|
12
|
+
export declare function shortenSessionId(sessionId: string, length?: number): string;
|
|
13
|
+
/**
|
|
14
|
+
* Generate the shell prompt string
|
|
15
|
+
* Format: proofscan|<connector>|<sessionPrefix>>
|
|
16
|
+
*/
|
|
17
|
+
export declare function generatePrompt(context: ShellContext): string;
|
|
18
|
+
/**
|
|
19
|
+
* Generate a plain prompt (no colors)
|
|
20
|
+
*/
|
|
21
|
+
export declare function generatePlainPrompt(context: ShellContext): string;
|
|
22
|
+
/**
|
|
23
|
+
* Print success message
|
|
24
|
+
*/
|
|
25
|
+
export declare function printSuccess(message: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* Print error message
|
|
28
|
+
*/
|
|
29
|
+
export declare function printError(message: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* Print info message
|
|
32
|
+
*/
|
|
33
|
+
export declare function printInfo(message: string): void;
|
|
34
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/shell/prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAc/C;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAQvC;AAYD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM,CAE9E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAgB5D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAUjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell prompt generation with color support
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* ANSI color codes
|
|
6
|
+
*/
|
|
7
|
+
const COLORS = {
|
|
8
|
+
reset: '\x1b[0m',
|
|
9
|
+
dim: '\x1b[2m',
|
|
10
|
+
cyan: '\x1b[36m',
|
|
11
|
+
yellow: '\x1b[33m',
|
|
12
|
+
green: '\x1b[32m',
|
|
13
|
+
red: '\x1b[31m',
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Check if color output is supported
|
|
17
|
+
*/
|
|
18
|
+
export function supportsColor() {
|
|
19
|
+
// Respect NO_COLOR environment variable
|
|
20
|
+
if (process.env.NO_COLOR !== undefined) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
// Check if stdout is a TTY
|
|
24
|
+
return process.stdout.isTTY === true;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Apply color if supported
|
|
28
|
+
*/
|
|
29
|
+
function color(text, colorCode) {
|
|
30
|
+
if (!supportsColor()) {
|
|
31
|
+
return text;
|
|
32
|
+
}
|
|
33
|
+
return `${colorCode}${text}${COLORS.reset}`;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Shorten session ID to prefix
|
|
37
|
+
*/
|
|
38
|
+
export function shortenSessionId(sessionId, length = 8) {
|
|
39
|
+
return sessionId.slice(0, length);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Generate the shell prompt string
|
|
43
|
+
* Format: proofscan|<connector>|<sessionPrefix>>
|
|
44
|
+
*/
|
|
45
|
+
export function generatePrompt(context) {
|
|
46
|
+
const parts = [];
|
|
47
|
+
// proofscan (dim)
|
|
48
|
+
parts.push(color('proofscan', COLORS.dim));
|
|
49
|
+
// connector (cyan) or * if not set
|
|
50
|
+
const connector = context.connector || '*';
|
|
51
|
+
parts.push(color(connector, COLORS.cyan));
|
|
52
|
+
// session prefix (yellow) if set
|
|
53
|
+
if (context.session) {
|
|
54
|
+
parts.push(color(shortenSessionId(context.session), COLORS.yellow));
|
|
55
|
+
}
|
|
56
|
+
return parts.join('|') + '> ';
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generate a plain prompt (no colors)
|
|
60
|
+
*/
|
|
61
|
+
export function generatePlainPrompt(context) {
|
|
62
|
+
const parts = ['proofscan'];
|
|
63
|
+
parts.push(context.connector || '*');
|
|
64
|
+
if (context.session) {
|
|
65
|
+
parts.push(shortenSessionId(context.session));
|
|
66
|
+
}
|
|
67
|
+
return parts.join('|') + '> ';
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Print success message
|
|
71
|
+
*/
|
|
72
|
+
export function printSuccess(message) {
|
|
73
|
+
console.log(color('✓ ' + message, COLORS.green));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Print error message
|
|
77
|
+
*/
|
|
78
|
+
export function printError(message) {
|
|
79
|
+
console.error(color('✗ ' + message, COLORS.red));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Print info message
|
|
83
|
+
*/
|
|
84
|
+
export function printInfo(message) {
|
|
85
|
+
console.log(color(message, COLORS.dim));
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/shell/prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,UAAU;IAClB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,wCAAwC;IACxC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2BAA2B;IAC3B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,SAAS,KAAK,CAAC,IAAY,EAAE,SAAiB;IAC5C,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,SAAiB,CAAC;IACpE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAqB;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,kBAAkB;IAClB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAE3C,mCAAmC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1C,iCAAiC;IACjC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAqB;IACvD,MAAM,KAAK,GAAa,CAAC,WAAW,CAAC,CAAC;IAEtC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;IAErC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC"}
|