@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.
Files changed (58) hide show
  1. package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts +12 -0
  2. package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts.map +1 -0
  3. package/dist/packages/core/src/infrastructure/services/browser-opener.service.js +29 -0
  4. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  5. package/dist/src/presentation/cli/commands/ui.command.js +11 -2
  6. package/dist/tsconfig.build.tsbuildinfo +1 -1
  7. package/package.json +1 -1
  8. package/web/.next/BUILD_ID +1 -1
  9. package/web/.next/build-manifest.json +2 -2
  10. package/web/.next/cache/.previewinfo +1 -1
  11. package/web/.next/cache/.rscinfo +1 -1
  12. package/web/.next/cache/config.json +3 -3
  13. package/web/.next/fallback-build-manifest.json +2 -2
  14. package/web/.next/prerender-manifest.json +3 -3
  15. package/web/.next/required-server-files.js +1 -1
  16. package/web/.next/required-server-files.json +1 -1
  17. package/web/.next/server/app/_global-error.html +2 -2
  18. package/web/.next/server/app/_global-error.rsc +1 -1
  19. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  20. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  21. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  22. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  23. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  24. package/web/.next/server/app/page/server-reference-manifest.json +9 -9
  25. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  26. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +1 -1
  27. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +1 -1
  28. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  29. package/web/.next/server/chunks/ssr/[root-of-the-server]__77c0dfc4._.js +2 -2
  30. package/web/.next/server/pages/500.html +2 -2
  31. package/web/.next/server/server-reference-manifest.js +1 -1
  32. package/web/.next/server/server-reference-manifest.json +10 -10
  33. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  34. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  35. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  36. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  37. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  38. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  39. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  40. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  41. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  42. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  43. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  44. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +9 -9
  45. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  46. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +1 -1
  47. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  48. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__77c0dfc4._.js +2 -2
  49. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  50. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  51. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +10 -10
  52. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  53. package/web/.next/static/chunks/{c946ff76b4c41d8e.js → ac2bd2a7ffc02cd4.js} +1 -1
  54. package/web/.next/trace +1 -1
  55. package/web/.next/trace-build +1 -1
  56. /package/web/.next/static/{5JQYq5TSfNVv88GQx6dTr → qVAyP83VDRO7ohQMjLw8T}/_buildManifest.js +0 -0
  57. /package/web/.next/static/{5JQYq5TSfNVv88GQx6dTr → qVAyP83VDRO7ohQMjLw8T}/_clientMiddlewareManifest.json +0 -0
  58. /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;AAwB1D;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAkEzC"}
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
- messages.success(`Server ready at ${fmt.code(`http://localhost:${port}`)}`);
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;