@monoes/monobrowse 1.0.11 → 1.0.12
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/src/__tests__/adapters.test.js +5 -2
- package/dist/src/__tests__/adapters.test.js.map +1 -1
- package/dist/src/__tests__/batch-eval-parsing.test.js +4 -2
- package/dist/src/__tests__/batch-eval-parsing.test.js.map +1 -1
- package/dist/src/__tests__/box-model.test.js +9 -5
- package/dist/src/__tests__/box-model.test.js.map +1 -1
- package/dist/src/__tests__/browser-launch.test.d.ts +10 -0
- package/dist/src/__tests__/browser-launch.test.d.ts.map +1 -1
- package/dist/src/__tests__/browser-launch.test.js +17 -10
- package/dist/src/__tests__/browser-launch.test.js.map +1 -1
- package/dist/src/__tests__/cdp-client.test.js +9 -3
- package/dist/src/__tests__/cdp-client.test.js.map +1 -1
- package/dist/src/__tests__/close-browser.test.d.ts +13 -0
- package/dist/src/__tests__/close-browser.test.d.ts.map +1 -1
- package/dist/src/__tests__/close-browser.test.js +5 -5
- package/dist/src/__tests__/close-browser.test.js.map +1 -1
- package/dist/src/__tests__/console-log.test.js +17 -6
- package/dist/src/__tests__/console-log.test.js.map +1 -1
- package/dist/src/__tests__/find.test.js +26 -6
- package/dist/src/__tests__/find.test.js.map +1 -1
- package/dist/src/__tests__/frame-command.test.js +9 -3
- package/dist/src/__tests__/frame-command.test.js.map +1 -1
- package/dist/src/__tests__/open-url-navigate-error.test.js +1 -3
- package/dist/src/__tests__/open-url-navigate-error.test.js.map +1 -1
- package/dist/src/__tests__/output.test.js +1 -1
- package/dist/src/__tests__/output.test.js.map +1 -1
- package/dist/src/__tests__/reap-idle-browser.test.d.ts +15 -0
- package/dist/src/__tests__/reap-idle-browser.test.d.ts.map +1 -0
- package/dist/src/__tests__/reap-idle-browser.test.js +238 -0
- package/dist/src/__tests__/reap-idle-browser.test.js.map +1 -0
- package/dist/src/__tests__/ref-cache.test.js +18 -10
- package/dist/src/__tests__/ref-cache.test.js.map +1 -1
- package/dist/src/__tests__/session-state.test.d.ts +8 -0
- package/dist/src/__tests__/session-state.test.d.ts.map +1 -1
- package/dist/src/__tests__/session-state.test.js +10 -10
- package/dist/src/__tests__/session-state.test.js.map +1 -1
- package/dist/src/__tests__/snapshot.test.js +44 -14
- package/dist/src/__tests__/snapshot.test.js.map +1 -1
- package/dist/src/__tests__/storage-eval.test.js +14 -6
- package/dist/src/__tests__/storage-eval.test.js.map +1 -1
- package/dist/src/__tests__/tabs.test.js +25 -9
- package/dist/src/__tests__/tabs.test.js.map +1 -1
- package/dist/src/browser/action-builder/analyzer.d.ts +1 -1
- package/dist/src/browser/action-builder/analyzer.d.ts.map +1 -1
- package/dist/src/browser/action-builder/analyzer.js +25 -9
- package/dist/src/browser/action-builder/analyzer.js.map +1 -1
- package/dist/src/browser/action-builder/types.d.ts.map +1 -1
- package/dist/src/browser/actions.d.ts +1 -1
- package/dist/src/browser/actions.d.ts.map +1 -1
- package/dist/src/browser/actions.js +16 -6
- package/dist/src/browser/actions.js.map +1 -1
- package/dist/src/browser/adapters/gemini.d.ts.map +1 -1
- package/dist/src/browser/adapters/gemini.js.map +1 -1
- package/dist/src/browser/adapters/google.d.ts.map +1 -1
- package/dist/src/browser/adapters/google.js.map +1 -1
- package/dist/src/browser/adapters/index.d.ts.map +1 -1
- package/dist/src/browser/adapters/index.js +3 -3
- package/dist/src/browser/adapters/index.js.map +1 -1
- package/dist/src/browser/adapters/instagram.d.ts.map +1 -1
- package/dist/src/browser/adapters/instagram.js.map +1 -1
- package/dist/src/browser/adapters/linkedin.d.ts.map +1 -1
- package/dist/src/browser/adapters/linkedin.js.map +1 -1
- package/dist/src/browser/adapters/microsoft.d.ts.map +1 -1
- package/dist/src/browser/adapters/microsoft.js.map +1 -1
- package/dist/src/browser/adapters/x.d.ts.map +1 -1
- package/dist/src/browser/adapters/x.js.map +1 -1
- package/dist/src/browser/browser.d.ts +30 -0
- package/dist/src/browser/browser.d.ts.map +1 -1
- package/dist/src/browser/browser.js +122 -15
- package/dist/src/browser/browser.js.map +1 -1
- package/dist/src/browser/cdp.d.ts.map +1 -1
- package/dist/src/browser/cdp.js +21 -8
- package/dist/src/browser/cdp.js.map +1 -1
- package/dist/src/browser/console-log.d.ts.map +1 -1
- package/dist/src/browser/console-log.js +2 -2
- package/dist/src/browser/console-log.js.map +1 -1
- package/dist/src/browser/dashboard/server.d.ts.map +1 -1
- package/dist/src/browser/dashboard/server.js +29 -19
- package/dist/src/browser/dashboard/server.js.map +1 -1
- package/dist/src/browser/dashboard/ui.html +153 -165
- package/dist/src/browser/dialog.d.ts.map +1 -1
- package/dist/src/browser/dialog.js +3 -1
- package/dist/src/browser/dialog.js.map +1 -1
- package/dist/src/browser/emulation.d.ts.map +1 -1
- package/dist/src/browser/emulation.js +21 -6
- package/dist/src/browser/emulation.js.map +1 -1
- package/dist/src/browser/find.d.ts +4 -4
- package/dist/src/browser/find.d.ts.map +1 -1
- package/dist/src/browser/find.js +14 -6
- package/dist/src/browser/find.js.map +1 -1
- package/dist/src/browser/har.d.ts.map +1 -1
- package/dist/src/browser/har.js +14 -7
- package/dist/src/browser/har.js.map +1 -1
- package/dist/src/browser/index.d.ts +16 -16
- package/dist/src/browser/index.d.ts.map +1 -1
- package/dist/src/browser/index.js +16 -16
- package/dist/src/browser/index.js.map +1 -1
- package/dist/src/browser/network.d.ts.map +1 -1
- package/dist/src/browser/network.js +14 -4
- package/dist/src/browser/network.js.map +1 -1
- package/dist/src/browser/pdf.d.ts.map +1 -1
- package/dist/src/browser/pdf.js +3 -3
- package/dist/src/browser/pdf.js.map +1 -1
- package/dist/src/browser/profiler.d.ts.map +1 -1
- package/dist/src/browser/profiler.js +10 -5
- package/dist/src/browser/profiler.js.map +1 -1
- package/dist/src/browser/record.d.ts +1 -1
- package/dist/src/browser/record.d.ts.map +1 -1
- package/dist/src/browser/record.js +18 -7
- package/dist/src/browser/record.js.map +1 -1
- package/dist/src/browser/ref-cache.d.ts.map +1 -1
- package/dist/src/browser/ref-cache.js +9 -4
- package/dist/src/browser/ref-cache.js.map +1 -1
- package/dist/src/browser/screenshot.d.ts.map +1 -1
- package/dist/src/browser/screenshot.js +11 -7
- package/dist/src/browser/screenshot.js.map +1 -1
- package/dist/src/browser/session.d.ts +1 -1
- package/dist/src/browser/session.d.ts.map +1 -1
- package/dist/src/browser/session.js +27 -8
- package/dist/src/browser/session.js.map +1 -1
- package/dist/src/browser/snapshot.d.ts +1 -1
- package/dist/src/browser/snapshot.d.ts.map +1 -1
- package/dist/src/browser/snapshot.js +8 -4
- package/dist/src/browser/snapshot.js.map +1 -1
- package/dist/src/browser/storage.d.ts.map +1 -1
- package/dist/src/browser/storage.js.map +1 -1
- package/dist/src/browser/tabs.d.ts.map +1 -1
- package/dist/src/browser/tabs.js +9 -3
- package/dist/src/browser/tabs.js.map +1 -1
- package/dist/src/browser/trace.d.ts.map +1 -1
- package/dist/src/browser/trace.js +3 -3
- package/dist/src/browser/trace.js.map +1 -1
- package/dist/src/browser/types.d.ts.map +1 -1
- package/dist/src/browser/types.js +23 -4
- package/dist/src/browser/types.js.map +1 -1
- package/dist/src/browser/vitals.d.ts.map +1 -1
- package/dist/src/browser/vitals.js +1 -1
- package/dist/src/browser/vitals.js.map +1 -1
- package/dist/src/browser/wait.d.ts.map +1 -1
- package/dist/src/browser/wait.js +11 -5
- package/dist/src/browser/wait.js.map +1 -1
- package/dist/src/cli/action.d.ts.map +1 -1
- package/dist/src/cli/action.js +14 -11
- package/dist/src/cli/action.js.map +1 -1
- package/dist/src/cli/commands.d.ts.map +1 -1
- package/dist/src/cli/commands.js +453 -159
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/output.js +5 -5
- package/dist/src/cli/output.js.map +1 -1
- package/dist/src/cli/platform.d.ts.map +1 -1
- package/dist/src/cli/platform.js +15 -11
- package/dist/src/cli/platform.js.map +1 -1
- package/dist/src/cli/types.d.ts +1 -1
- package/dist/src/cli/types.d.ts.map +1 -1
- package/dist/src/cli.js +21 -9
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/__tests__/adapters.test.ts +15 -8
- package/src/__tests__/batch-eval-parsing.test.ts +4 -2
- package/src/__tests__/box-model.test.ts +9 -5
- package/src/__tests__/browser-launch.test.ts +26 -15
- package/src/__tests__/cdp-client.test.ts +25 -9
- package/src/__tests__/close-browser.test.ts +11 -6
- package/src/__tests__/console-log.test.ts +36 -13
- package/src/__tests__/find.test.ts +58 -20
- package/src/__tests__/frame-command.test.ts +12 -6
- package/src/__tests__/open-url-navigate-error.test.ts +2 -4
- package/src/__tests__/output.test.ts +1 -1
- package/src/__tests__/reap-idle-browser.test.ts +276 -0
- package/src/__tests__/ref-cache.test.ts +25 -12
- package/src/__tests__/session-state.test.ts +40 -28
- package/src/__tests__/snapshot.test.ts +60 -21
- package/src/__tests__/storage-eval.test.ts +30 -16
- package/src/__tests__/tabs.test.ts +26 -10
- package/src/browser/action-builder/analyzer.ts +39 -15
- package/src/browser/action-builder/types.ts +45 -8
- package/src/browser/actions.ts +288 -123
- package/src/browser/adapters/gemini.ts +7 -3
- package/src/browser/adapters/google.ts +5 -3
- package/src/browser/adapters/index.ts +5 -4
- package/src/browser/adapters/instagram.ts +4 -2
- package/src/browser/adapters/linkedin.ts +4 -2
- package/src/browser/adapters/microsoft.ts +9 -5
- package/src/browser/adapters/x.ts +7 -3
- package/src/browser/browser.ts +188 -42
- package/src/browser/cdp.ts +43 -11
- package/src/browser/console-log.ts +24 -7
- package/src/browser/dashboard/server.ts +44 -25
- package/src/browser/dashboard/ui.html +153 -165
- package/src/browser/dialog.ts +25 -8
- package/src/browser/emulation.ts +86 -36
- package/src/browser/find.ts +110 -47
- package/src/browser/har.ts +58 -26
- package/src/browser/index.ts +16 -16
- package/src/browser/network.ts +147 -46
- package/src/browser/pdf.ts +4 -4
- package/src/browser/profiler.ts +23 -10
- package/src/browser/record.ts +38 -19
- package/src/browser/ref-cache.ts +38 -17
- package/src/browser/screenshot.ts +58 -32
- package/src/browser/session.ts +51 -18
- package/src/browser/snapshot.ts +34 -20
- package/src/browser/storage.ts +73 -17
- package/src/browser/tabs.ts +29 -17
- package/src/browser/trace.ts +14 -10
- package/src/browser/types.ts +23 -4
- package/src/browser/vitals.ts +33 -16
- package/src/browser/wait.ts +47 -21
- package/src/cli/action.ts +52 -21
- package/src/cli/commands.ts +1093 -385
- package/src/cli/output.ts +5 -5
- package/src/cli/platform.ts +44 -23
- package/src/cli/types.ts +1 -1
- package/src/cli.ts +34 -18
- package/src/index.ts +2 -2
package/src/cli/output.ts
CHANGED
|
@@ -17,20 +17,20 @@ class OutputFormatter {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
printSuccess(message: string): void {
|
|
20
|
-
console.log(this.c('green', '✓')
|
|
20
|
+
console.log(`${this.c('green', '✓')} ${message}`);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
printError(message: string, details?: string): void {
|
|
24
|
-
console.error(this.c('red', '✗')
|
|
25
|
-
if (details) console.error(this.c('red',
|
|
24
|
+
console.error(`${this.c('red', '✗')} ${message}`);
|
|
25
|
+
if (details) console.error(this.c('red', ` ${details}`));
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
printWarning(message: string): void {
|
|
29
|
-
console.warn(this.c('yellow', '⚠')
|
|
29
|
+
console.warn(`${this.c('yellow', '⚠')} ${message}`);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
printInfo(message: string): void {
|
|
33
|
-
console.log(this.c('cyan', 'ℹ')
|
|
33
|
+
console.log(`${this.c('cyan', 'ℹ')} ${message}`);
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
|
package/src/cli/platform.ts
CHANGED
|
@@ -3,22 +3,22 @@
|
|
|
3
3
|
* Sessions stored as JSON at ~/.monomind/sessions.json
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { Command } from 'commander';
|
|
7
|
-
import { readFile, writeFile, mkdir, chmod } from 'node:fs/promises';
|
|
8
6
|
import { existsSync } from 'node:fs';
|
|
9
|
-
import {
|
|
7
|
+
import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
10
8
|
import { homedir } from 'node:os';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { Command } from 'commander';
|
|
11
11
|
import { getAdapter } from '../index.js';
|
|
12
12
|
|
|
13
|
-
const CDP_PORT = Number(process.env
|
|
13
|
+
const CDP_PORT = Number(process.env.MONOMIND_CDP_PORT ?? 9222);
|
|
14
14
|
|
|
15
15
|
const SESSIONS_FILE = join(homedir(), '.monomind', 'sessions.json');
|
|
16
16
|
|
|
17
17
|
interface Session {
|
|
18
|
-
id: string;
|
|
18
|
+
id: string; // "platform:username"
|
|
19
19
|
platform: string;
|
|
20
20
|
username: string;
|
|
21
|
-
cookies: string;
|
|
21
|
+
cookies: string; // JSON-serialized
|
|
22
22
|
userAgent: string;
|
|
23
23
|
createdAt: number;
|
|
24
24
|
lastUsedAt: number;
|
|
@@ -46,7 +46,9 @@ export function createPlatformCommand(): Command {
|
|
|
46
46
|
|
|
47
47
|
cmd
|
|
48
48
|
.command('connect <platform>')
|
|
49
|
-
.description(
|
|
49
|
+
.description(
|
|
50
|
+
'Connect a platform account via browser — opens Chrome, waits for login, saves session',
|
|
51
|
+
)
|
|
50
52
|
.option('--port <number>', 'CDP port of running Chrome instance', String(CDP_PORT))
|
|
51
53
|
.option('--timeout <seconds>', 'Login timeout in seconds', '300')
|
|
52
54
|
.action(async (platform: string, opts: { port: string; timeout: string }) => {
|
|
@@ -57,7 +59,9 @@ export function createPlatformCommand(): Command {
|
|
|
57
59
|
}
|
|
58
60
|
|
|
59
61
|
let adapter: ReturnType<typeof getAdapter>;
|
|
60
|
-
try {
|
|
62
|
+
try {
|
|
63
|
+
adapter = getAdapter(platform);
|
|
64
|
+
} catch (err) {
|
|
61
65
|
console.error(err instanceof Error ? err.message : String(err));
|
|
62
66
|
process.exit(1);
|
|
63
67
|
}
|
|
@@ -67,7 +71,9 @@ export function createPlatformCommand(): Command {
|
|
|
67
71
|
|
|
68
72
|
// Lazy-load browser module
|
|
69
73
|
let browser: typeof import('@monoes/monobrowse');
|
|
70
|
-
try {
|
|
74
|
+
try {
|
|
75
|
+
browser = await import('@monoes/monobrowse');
|
|
76
|
+
} catch (err) {
|
|
71
77
|
console.error('Browser module unavailable:', err);
|
|
72
78
|
process.exit(1);
|
|
73
79
|
}
|
|
@@ -91,16 +97,18 @@ export function createPlatformCommand(): Command {
|
|
|
91
97
|
const { client, sessionId: sid } = conn;
|
|
92
98
|
|
|
93
99
|
try {
|
|
94
|
-
const
|
|
100
|
+
const _refs = new Map();
|
|
95
101
|
|
|
96
102
|
// Restore any existing cookies first so the user might already be logged in
|
|
97
103
|
const sessions = await loadSessions();
|
|
98
|
-
const existingSession = sessions.find(s => s.platform === platform);
|
|
104
|
+
const existingSession = sessions.find((s) => s.platform === platform);
|
|
99
105
|
if (existingSession?.cookies) {
|
|
100
106
|
try {
|
|
101
107
|
const cookies = JSON.parse(existingSession.cookies);
|
|
102
108
|
if (cookies.length > 0) await browser.setCookies(client, sid, cookies);
|
|
103
|
-
} catch {
|
|
109
|
+
} catch {
|
|
110
|
+
/* ignore */
|
|
111
|
+
}
|
|
104
112
|
}
|
|
105
113
|
|
|
106
114
|
// Navigate to login URL
|
|
@@ -120,25 +128,31 @@ export function createPlatformCommand(): Command {
|
|
|
120
128
|
console.log(`│ Please sign in to ${platform.padEnd(34)}│`);
|
|
121
129
|
console.log('│ │');
|
|
122
130
|
console.log('│ Complete the login in the browser window. │');
|
|
123
|
-
console.log(
|
|
131
|
+
console.log(
|
|
132
|
+
`│ Waiting up to ${Math.round(timeoutMs / 60000)} minutes for login… │`,
|
|
133
|
+
);
|
|
124
134
|
console.log('└──────────────────────────────────────────────────────┘');
|
|
125
135
|
console.log('');
|
|
126
136
|
|
|
127
137
|
const deadline = Date.now() + timeoutMs;
|
|
128
138
|
while (Date.now() < deadline) {
|
|
129
|
-
await new Promise(r => setTimeout(r, 2000));
|
|
139
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
130
140
|
isLoggedIn = await adapter.isLoggedIn(pageIface).catch(() => false);
|
|
131
141
|
if (isLoggedIn) break;
|
|
132
142
|
// Navigate to app URL if user manually browsed away from login
|
|
133
143
|
const currentUrl = await browser.getCurrentUrl(client, sid).catch(() => '');
|
|
134
|
-
if (
|
|
135
|
-
|
|
144
|
+
if (
|
|
145
|
+
!currentUrl.includes(new URL(adapter.loginURL()).hostname) &&
|
|
146
|
+
!currentUrl.includes(new URL(adapter.baseURL).hostname)
|
|
147
|
+
) {
|
|
136
148
|
await browser.openUrl(client, sid, adapter.loginURL());
|
|
137
149
|
}
|
|
138
150
|
}
|
|
139
151
|
|
|
140
152
|
if (!isLoggedIn) {
|
|
141
|
-
console.error(
|
|
153
|
+
console.error(
|
|
154
|
+
`\nLogin timeout after ${Math.round(timeoutMs / 1000)}s. Session not saved.`,
|
|
155
|
+
);
|
|
142
156
|
process.exit(1);
|
|
143
157
|
}
|
|
144
158
|
}
|
|
@@ -147,7 +161,9 @@ export function createPlatformCommand(): Command {
|
|
|
147
161
|
|
|
148
162
|
// Capture cookies and user agent
|
|
149
163
|
const liveCookies = await browser.getCookies(client, sid).catch(() => []);
|
|
150
|
-
const userAgent = await browser
|
|
164
|
+
const userAgent = (await browser
|
|
165
|
+
.evaluateJs(client, sid, 'navigator.userAgent')
|
|
166
|
+
.catch(() => 'unknown')) as string;
|
|
151
167
|
const username = await adapter.extractUsername(pageIface).catch(() => `${platform}-user`);
|
|
152
168
|
|
|
153
169
|
// Save to sessions file
|
|
@@ -160,8 +176,9 @@ export function createPlatformCommand(): Command {
|
|
|
160
176
|
createdAt: existingSession?.createdAt ?? Date.now(),
|
|
161
177
|
lastUsedAt: Date.now(),
|
|
162
178
|
};
|
|
163
|
-
const idx = sessions.findIndex(s => s.platform === platform);
|
|
164
|
-
if (idx >= 0) sessions[idx] = sessionEntry;
|
|
179
|
+
const idx = sessions.findIndex((s) => s.platform === platform);
|
|
180
|
+
if (idx >= 0) sessions[idx] = sessionEntry;
|
|
181
|
+
else sessions.push(sessionEntry);
|
|
165
182
|
await saveSessions(sessions);
|
|
166
183
|
|
|
167
184
|
console.log(`\n✓ Session saved: ${sessionEntry.id}`);
|
|
@@ -183,11 +200,15 @@ export function createPlatformCommand(): Command {
|
|
|
183
200
|
console.log('No connected accounts. Run: browse platform connect <platform>');
|
|
184
201
|
return;
|
|
185
202
|
}
|
|
186
|
-
console.log(
|
|
203
|
+
console.log(
|
|
204
|
+
`\n${'ID'.padEnd(40)} ${'PLATFORM'.padEnd(12)} ${'USERNAME'.padEnd(30)} LAST USED`,
|
|
205
|
+
);
|
|
187
206
|
console.log('─'.repeat(95));
|
|
188
207
|
for (const s of sessions) {
|
|
189
208
|
const lastUsed = new Date(s.lastUsedAt).toLocaleString();
|
|
190
|
-
console.log(
|
|
209
|
+
console.log(
|
|
210
|
+
`${s.id.padEnd(40)} ${s.platform.padEnd(12)} ${s.username.padEnd(30)} ${lastUsed}`,
|
|
211
|
+
);
|
|
191
212
|
}
|
|
192
213
|
});
|
|
193
214
|
|
|
@@ -196,7 +217,7 @@ export function createPlatformCommand(): Command {
|
|
|
196
217
|
.description('Remove a saved platform session')
|
|
197
218
|
.action(async (id: string) => {
|
|
198
219
|
const sessions = await loadSessions();
|
|
199
|
-
const idx = sessions.findIndex(s => s.id === id);
|
|
220
|
+
const idx = sessions.findIndex((s) => s.id === id);
|
|
200
221
|
if (idx < 0) {
|
|
201
222
|
console.error(`Session not found: ${id}`);
|
|
202
223
|
console.log('Run "browse platform list" to see available sessions.');
|
package/src/cli/types.ts
CHANGED
|
@@ -37,7 +37,7 @@ export interface CommandExample {
|
|
|
37
37
|
description: string;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
export type CommandAction = (ctx: CommandContext) => Promise<CommandResult |
|
|
40
|
+
export type CommandAction = (ctx: CommandContext) => Promise<CommandResult | undefined>;
|
|
41
41
|
|
|
42
42
|
export interface CommandResult {
|
|
43
43
|
success: boolean;
|
package/src/cli.ts
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* Dispatches to the same command tree used by `monomind browse`
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { createRequire } from 'module';
|
|
7
|
+
import { createRequire } from 'node:module';
|
|
8
8
|
import browseCommand from './cli/commands.js';
|
|
9
9
|
import { output } from './cli/output.js';
|
|
10
|
-
import type { Command, CommandContext,
|
|
10
|
+
import type { Command, CommandContext, ParsedFlags } from './cli/types.js';
|
|
11
11
|
|
|
12
12
|
const _require = createRequire(import.meta.url);
|
|
13
13
|
|
|
@@ -16,7 +16,7 @@ const _require = createRequire(import.meta.url);
|
|
|
16
16
|
// ---------------------------------------------------------------------------
|
|
17
17
|
|
|
18
18
|
function findSub(name: string, subs: Command[]): Command | undefined {
|
|
19
|
-
return subs.find(s => s.name === name || s.aliases?.includes(name));
|
|
19
|
+
return subs.find((s) => s.name === name || s.aliases?.includes(name));
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
// ---------------------------------------------------------------------------
|
|
@@ -33,11 +33,14 @@ function buildShortMap(cmd: Command | undefined): Record<string, string> {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
function isBooleanOpt(name: string, cmd: Command | undefined): boolean {
|
|
36
|
-
const opt = cmd?.options?.find(o => o.name === name);
|
|
36
|
+
const opt = cmd?.options?.find((o) => o.name === name);
|
|
37
37
|
return opt?.type === 'boolean';
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
function parseArgv(
|
|
40
|
+
function parseArgv(
|
|
41
|
+
argv: string[],
|
|
42
|
+
sub: Command | undefined,
|
|
43
|
+
): { args: string[]; flags: ParsedFlags } {
|
|
41
44
|
const shortMap = buildShortMap(sub);
|
|
42
45
|
const flags: ParsedFlags = { _: [] };
|
|
43
46
|
const positional: string[] = [];
|
|
@@ -81,7 +84,7 @@ function parseArgv(argv: string[], sub: Command | undefined): { args: string[];
|
|
|
81
84
|
}
|
|
82
85
|
|
|
83
86
|
// Coerce number options
|
|
84
|
-
for (const opt of
|
|
87
|
+
for (const opt of sub?.options ?? []) {
|
|
85
88
|
if (opt.type === 'number' && typeof flags[opt.name] === 'string') {
|
|
86
89
|
flags[opt.name] = Number(flags[opt.name]);
|
|
87
90
|
}
|
|
@@ -95,11 +98,12 @@ function parseArgv(argv: string[], sub: Command | undefined): { args: string[];
|
|
|
95
98
|
// ---------------------------------------------------------------------------
|
|
96
99
|
|
|
97
100
|
function printHelp(cmd: Command, prefix = 'monobrowse'): void {
|
|
98
|
-
const usage =
|
|
99
|
-
|
|
100
|
-
|
|
101
|
+
const usage =
|
|
102
|
+
cmd.name === 'browse'
|
|
103
|
+
? `${prefix} <subcommand> [options]`
|
|
104
|
+
: `${prefix} ${cmd.name} [subcommand] [options]`;
|
|
101
105
|
console.log(`\nUsage: ${usage}\n`);
|
|
102
|
-
console.log(cmd.description
|
|
106
|
+
console.log(`${cmd.description}\n`);
|
|
103
107
|
|
|
104
108
|
if (cmd.subcommands?.length) {
|
|
105
109
|
console.log('Subcommands:');
|
|
@@ -160,7 +164,12 @@ async function dispatch(cmd: Command, argv: string[]): Promise<void> {
|
|
|
160
164
|
const nested = findSub(rest[0], sub.subcommands);
|
|
161
165
|
if (nested?.action) {
|
|
162
166
|
const { args, flags } = parseArgv(rest.slice(1), nested);
|
|
163
|
-
const ctx: CommandContext = {
|
|
167
|
+
const ctx: CommandContext = {
|
|
168
|
+
args,
|
|
169
|
+
flags,
|
|
170
|
+
cwd: process.cwd(),
|
|
171
|
+
interactive: !!process.stdout.isTTY,
|
|
172
|
+
};
|
|
164
173
|
const result = await nested.action(ctx);
|
|
165
174
|
if (result && !result.success) process.exitCode = result.exitCode ?? 1;
|
|
166
175
|
return;
|
|
@@ -174,7 +183,12 @@ async function dispatch(cmd: Command, argv: string[]): Promise<void> {
|
|
|
174
183
|
}
|
|
175
184
|
|
|
176
185
|
const { args, flags } = parseArgv(rest, sub);
|
|
177
|
-
const ctx: CommandContext = {
|
|
186
|
+
const ctx: CommandContext = {
|
|
187
|
+
args,
|
|
188
|
+
flags,
|
|
189
|
+
cwd: process.cwd(),
|
|
190
|
+
interactive: !!process.stdout.isTTY,
|
|
191
|
+
};
|
|
178
192
|
const result = await sub.action(ctx);
|
|
179
193
|
if (result && !result.success) process.exitCode = result.exitCode ?? 1;
|
|
180
194
|
}
|
|
@@ -200,9 +214,11 @@ async function main(): Promise<void> {
|
|
|
200
214
|
await dispatch(browseCommand, userArgs);
|
|
201
215
|
}
|
|
202
216
|
|
|
203
|
-
main()
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
217
|
+
main()
|
|
218
|
+
.then(() => {
|
|
219
|
+
process.exit(process.exitCode ?? 0);
|
|
220
|
+
})
|
|
221
|
+
.catch((err) => {
|
|
222
|
+
output.printError(err instanceof Error ? err.message : String(err));
|
|
223
|
+
process.exit(1);
|
|
224
|
+
});
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export * from './browser/index.js';
|
|
2
1
|
export * from './browser/action-builder/analyzer.js';
|
|
3
2
|
export * from './browser/action-builder/types.js';
|
|
4
3
|
export * from './browser/adapters/index.js';
|
|
5
|
-
export {
|
|
4
|
+
export { getDashboard, startDashboard } from './browser/dashboard/server.js';
|
|
5
|
+
export * from './browser/index.js';
|