@shepai/cli 1.42.0 → 1.43.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/packages/core/src/infrastructure/services/browser-opener.service.d.ts +12 -0
- package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/browser-opener.service.js +29 -0
- package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/ui.command.js +11 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__77c0dfc4._.js +2 -2
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +10 -10
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +9 -9
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__77c0dfc4._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +10 -10
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/{c946ff76b4c41d8e.js → ac2bd2a7ffc02cd4.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- /package/web/.next/static/{5JQYq5TSfNVv88GQx6dTr → qVAyP83VDRO7ohQMjLw8T}/_buildManifest.js +0 -0
- /package/web/.next/static/{5JQYq5TSfNVv88GQx6dTr → qVAyP83VDRO7ohQMjLw8T}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{5JQYq5TSfNVv88GQx6dTr → qVAyP83VDRO7ohQMjLw8T}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ChildProcess } from 'node:child_process';
|
|
2
|
+
export interface BrowserOpenerDeps {
|
|
3
|
+
platform: NodeJS.Platform;
|
|
4
|
+
execFile: (cmd: string, args: readonly string[], callback: (error: Error | null) => void) => ChildProcess;
|
|
5
|
+
warn: (msg: string) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare class BrowserOpenerService {
|
|
8
|
+
private deps;
|
|
9
|
+
constructor(deps?: Partial<BrowserOpenerDeps>);
|
|
10
|
+
open(url: string): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=browser-opener.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-opener.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/browser-opener.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE/E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,QAAQ,EAAE,CACR,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,KACpC,YAAY,CAAC;IAClB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAeD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,IAAI,CAAoB;gBAEpB,IAAI,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAIjD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAWxB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { execFile as cpExecFile } from 'node:child_process';
|
|
2
|
+
const defaultDeps = {
|
|
3
|
+
platform: process.platform,
|
|
4
|
+
execFile: cpExecFile,
|
|
5
|
+
// eslint-disable-next-line no-console
|
|
6
|
+
warn: (msg) => console.warn(msg),
|
|
7
|
+
};
|
|
8
|
+
const PLATFORM_COMMANDS = {
|
|
9
|
+
darwin: { cmd: 'open', args: (url) => [url] },
|
|
10
|
+
linux: { cmd: 'xdg-open', args: (url) => [url] },
|
|
11
|
+
win32: { cmd: 'cmd', args: (url) => ['/c', 'start', '', url] },
|
|
12
|
+
};
|
|
13
|
+
export class BrowserOpenerService {
|
|
14
|
+
deps;
|
|
15
|
+
constructor(deps = {}) {
|
|
16
|
+
this.deps = { ...defaultDeps, ...deps };
|
|
17
|
+
}
|
|
18
|
+
open(url) {
|
|
19
|
+
const entry = PLATFORM_COMMANDS[this.deps.platform];
|
|
20
|
+
if (!entry)
|
|
21
|
+
return;
|
|
22
|
+
const child = this.deps.execFile(entry.cmd, entry.args(url), (error) => {
|
|
23
|
+
if (error) {
|
|
24
|
+
this.deps.warn(`Failed to open browser: ${error.message}`);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
child.unref();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAyB1D;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CA2EzC"}
|
|
@@ -20,6 +20,7 @@ import { container } from '../../../../packages/core/src/infrastructure/di/conta
|
|
|
20
20
|
import { setVersionEnvVars } from '../../../../packages/core/src/infrastructure/services/version.service.js';
|
|
21
21
|
import { resolveWebDir } from '../../../../packages/core/src/infrastructure/services/web-server.service.js';
|
|
22
22
|
import { initializeNotificationWatcher, getNotificationWatcher, } from '../../../../packages/core/src/infrastructure/services/notifications/notification-watcher.service.js';
|
|
23
|
+
import { BrowserOpenerService } from '../../../../packages/core/src/infrastructure/services/browser-opener.service.js';
|
|
23
24
|
import { colors, fmt, messages } from '../ui/index.js';
|
|
24
25
|
function parsePort(value) {
|
|
25
26
|
const port = parseInt(value, 10);
|
|
@@ -35,10 +36,12 @@ export function createUiCommand() {
|
|
|
35
36
|
return new Command('ui')
|
|
36
37
|
.description('Start the Shep web UI')
|
|
37
38
|
.option('-p, --port <number>', 'Port number (1024-65535)', parsePort)
|
|
39
|
+
.option('--no-open', 'Do not auto-open browser')
|
|
38
40
|
.addHelpText('after', `
|
|
39
41
|
Examples:
|
|
40
42
|
$ shep ui Start on default port (4050)
|
|
41
|
-
$ shep ui --port 8080 Start on custom port
|
|
43
|
+
$ shep ui --port 8080 Start on custom port
|
|
44
|
+
$ shep ui --no-open Start without opening browser`)
|
|
42
45
|
.action(async (options) => {
|
|
43
46
|
try {
|
|
44
47
|
const startPort = options.port ?? DEFAULT_PORT;
|
|
@@ -59,9 +62,15 @@ Examples:
|
|
|
59
62
|
const notificationService = container.resolve('INotificationService');
|
|
60
63
|
initializeNotificationWatcher(runRepo, phaseTimingRepo, notificationService);
|
|
61
64
|
getNotificationWatcher().start();
|
|
62
|
-
|
|
65
|
+
const url = `http://localhost:${port}`;
|
|
66
|
+
messages.success(`Server ready at ${fmt.code(url)}`);
|
|
63
67
|
messages.info('Press Ctrl+C to stop');
|
|
64
68
|
messages.newline();
|
|
69
|
+
// Auto-open browser (unless --no-open)
|
|
70
|
+
if (options.open !== false) {
|
|
71
|
+
const opener = new BrowserOpenerService({ warn: messages.warning });
|
|
72
|
+
opener.open(url);
|
|
73
|
+
}
|
|
65
74
|
// Handle graceful shutdown via SIGINT/SIGTERM
|
|
66
75
|
// The HTTP server keeps the event loop alive — no explicit wait needed
|
|
67
76
|
let isShuttingDown = false;
|