@shepai/cli 1.41.1 → 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 (107) hide show
  1. package/dist/packages/core/src/application/use-cases/settings/check-onboarding-status.use-case.d.ts +16 -0
  2. package/dist/packages/core/src/application/use-cases/settings/check-onboarding-status.use-case.d.ts.map +1 -0
  3. package/dist/packages/core/src/application/use-cases/settings/check-onboarding-status.use-case.js +17 -0
  4. package/dist/packages/core/src/application/use-cases/settings/complete-onboarding.use-case.d.ts +38 -0
  5. package/dist/packages/core/src/application/use-cases/settings/complete-onboarding.use-case.d.ts.map +1 -0
  6. package/dist/packages/core/src/application/use-cases/settings/complete-onboarding.use-case.js +69 -0
  7. package/dist/packages/core/src/application/use-cases/settings/index.d.ts +3 -0
  8. package/dist/packages/core/src/application/use-cases/settings/index.d.ts.map +1 -1
  9. package/dist/packages/core/src/application/use-cases/settings/index.js +2 -0
  10. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  11. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +8 -1
  12. package/dist/packages/core/src/domain/generated/output.d.ts +27 -2
  13. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  14. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/di/container.js +2 -0
  16. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +5 -1
  17. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +16 -2
  19. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +14 -0
  21. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +13 -3
  23. package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts +12 -0
  24. package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts.map +1 -0
  25. package/dist/packages/core/src/infrastructure/services/browser-opener.service.js +29 -0
  26. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  27. package/dist/src/presentation/cli/commands/feat/new.command.js +11 -9
  28. package/dist/src/presentation/cli/commands/settings/index.d.ts +7 -3
  29. package/dist/src/presentation/cli/commands/settings/index.d.ts.map +1 -1
  30. package/dist/src/presentation/cli/commands/settings/index.js +25 -5
  31. package/dist/src/presentation/cli/commands/settings/workflow.command.d.ts +16 -0
  32. package/dist/src/presentation/cli/commands/settings/workflow.command.d.ts.map +1 -0
  33. package/dist/src/presentation/cli/commands/settings/workflow.command.js +116 -0
  34. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  35. package/dist/src/presentation/cli/commands/ui.command.js +11 -2
  36. package/dist/src/presentation/cli/index.js +11 -0
  37. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.d.ts +21 -0
  38. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.d.ts.map +1 -0
  39. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.js +66 -0
  40. package/dist/src/presentation/tui/wizards/onboarding/steps/agent.step.d.ts +12 -0
  41. package/dist/src/presentation/tui/wizards/onboarding/steps/agent.step.d.ts.map +1 -0
  42. package/dist/src/presentation/tui/wizards/onboarding/steps/agent.step.js +13 -0
  43. package/dist/src/presentation/tui/wizards/onboarding/steps/ide.step.d.ts +11 -0
  44. package/dist/src/presentation/tui/wizards/onboarding/steps/ide.step.d.ts.map +1 -0
  45. package/dist/src/presentation/tui/wizards/onboarding/steps/ide.step.js +14 -0
  46. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.d.ts +101 -0
  47. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.d.ts.map +1 -0
  48. package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.js +70 -0
  49. package/dist/src/presentation/tui/wizards/onboarding/types.d.ts +25 -0
  50. package/dist/src/presentation/tui/wizards/onboarding/types.d.ts.map +1 -0
  51. package/dist/src/presentation/tui/wizards/onboarding/types.js +6 -0
  52. package/dist/tsconfig.build.tsbuildinfo +1 -1
  53. package/package.json +1 -1
  54. package/web/.next/BUILD_ID +1 -1
  55. package/web/.next/build-manifest.json +2 -2
  56. package/web/.next/cache/.previewinfo +1 -1
  57. package/web/.next/cache/.rscinfo +1 -1
  58. package/web/.next/cache/.tsbuildinfo +1 -1
  59. package/web/.next/cache/config.json +3 -3
  60. package/web/.next/fallback-build-manifest.json +2 -2
  61. package/web/.next/prerender-manifest.json +3 -3
  62. package/web/.next/required-server-files.js +1 -1
  63. package/web/.next/required-server-files.json +1 -1
  64. package/web/.next/server/app/_global-error.html +2 -2
  65. package/web/.next/server/app/_global-error.rsc +1 -1
  66. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  67. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  68. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  69. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  70. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  71. package/web/.next/server/app/page/server-reference-manifest.json +9 -9
  72. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +1 -1
  74. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +1 -1
  75. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  76. package/web/.next/server/chunks/ssr/[root-of-the-server]__77c0dfc4._.js +2 -2
  77. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  78. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  79. package/web/.next/server/pages/500.html +2 -2
  80. package/web/.next/server/server-reference-manifest.js +1 -1
  81. package/web/.next/server/server-reference-manifest.json +10 -10
  82. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  83. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  84. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  85. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  86. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  87. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  88. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  89. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  90. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  91. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  92. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  93. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +9 -9
  94. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  95. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +1 -1
  96. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  97. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__77c0dfc4._.js +2 -2
  98. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  99. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  100. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +10 -10
  101. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  102. package/web/.next/static/chunks/{5ac5e119f2c50fe5.js → ac2bd2a7ffc02cd4.js} +1 -1
  103. package/web/.next/trace +1 -1
  104. package/web/.next/trace-build +1 -1
  105. /package/web/.next/static/{qwpWWdjIzP2dEFkcjelT- → qVAyP83VDRO7ohQMjLw8T}/_buildManifest.js +0 -0
  106. /package/web/.next/static/{qwpWWdjIzP2dEFkcjelT- → qVAyP83VDRO7ohQMjLw8T}/_clientMiddlewareManifest.json +0 -0
  107. /package/web/.next/static/{qwpWWdjIzP2dEFkcjelT- → qVAyP83VDRO7ohQMjLw8T}/_ssgManifest.js +0 -0
@@ -2,25 +2,45 @@
2
2
  * Settings Command Group
3
3
  *
4
4
  * Provides subcommands for managing Shep global settings.
5
+ * Running `shep settings` with no subcommand launches the full setup wizard.
5
6
  *
6
7
  * Usage:
7
- * shep settings show # Display current settings
8
- * shep settings init # Initialize settings to defaults
9
- * shep settings agent # Configure AI coding agent
8
+ * shep settings # Launch full setup wizard (agent + IDE + workflow)
9
+ * shep settings show # Display current settings
10
+ * shep settings init # Initialize settings to defaults
11
+ * shep settings agent # Configure AI coding agent
12
+ * shep settings ide # Configure preferred IDE
13
+ * shep settings workflow # Configure workflow defaults
10
14
  */
11
15
  import { Command } from 'commander';
12
16
  import { createShowCommand } from './show.command.js';
13
17
  import { createInitCommand } from './init.command.js';
14
18
  import { createAgentCommand } from './agent.command.js';
15
19
  import { createIdeCommand } from './ide.command.js';
20
+ import { createWorkflowCommand } from './workflow.command.js';
21
+ import { onboardingWizard } from '../../../tui/wizards/onboarding/onboarding.wizard.js';
22
+ import { messages } from '../../ui/index.js';
16
23
  /**
17
24
  * Create the settings command group
18
25
  */
19
26
  export function createSettingsCommand() {
20
- return new Command('settings')
27
+ const cmd = new Command('settings')
21
28
  .description('Manage Shep global settings')
22
29
  .addCommand(createShowCommand())
23
30
  .addCommand(createInitCommand())
24
31
  .addCommand(createAgentCommand())
25
- .addCommand(createIdeCommand());
32
+ .addCommand(createIdeCommand())
33
+ .addCommand(createWorkflowCommand());
34
+ // Default action: launch the full setup wizard when no subcommand is given
35
+ cmd.action(async () => {
36
+ try {
37
+ await onboardingWizard();
38
+ }
39
+ catch (error) {
40
+ const err = error instanceof Error ? error : new Error(String(error));
41
+ messages.error('Settings wizard failed', err);
42
+ process.exitCode = 1;
43
+ }
44
+ });
45
+ return cmd;
26
46
  }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Workflow Defaults Configuration Command
3
+ *
4
+ * Configures default approval gates, push, and PR behavior for new features.
5
+ *
6
+ * Usage:
7
+ * shep settings workflow # Interactive checkbox wizard
8
+ * shep settings workflow --allow-prd --push # Non-interactive (set specific flags)
9
+ * shep settings workflow --allow-all --pr # Enable all gates + PR
10
+ */
11
+ import { Command } from 'commander';
12
+ /**
13
+ * Create the workflow configuration command.
14
+ */
15
+ export declare function createWorkflowCommand(): Command;
16
+ //# sourceMappingURL=workflow.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/settings/workflow.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CA4G/C"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Workflow Defaults Configuration Command
3
+ *
4
+ * Configures default approval gates, push, and PR behavior for new features.
5
+ *
6
+ * Usage:
7
+ * shep settings workflow # Interactive checkbox wizard
8
+ * shep settings workflow --allow-prd --push # Non-interactive (set specific flags)
9
+ * shep settings workflow --allow-all --pr # Enable all gates + PR
10
+ */
11
+ import { Command } from 'commander';
12
+ import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
13
+ import { UpdateSettingsUseCase } from '../../../../../packages/core/src/application/use-cases/settings/update-settings.use-case.js';
14
+ import { runWorkflowDefaultsStep } from '../../../tui/wizards/onboarding/steps/workflow-defaults.step.js';
15
+ import { getSettings, resetSettings, initializeSettings, } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
16
+ import { messages } from '../../ui/index.js';
17
+ /**
18
+ * Create the workflow configuration command.
19
+ */
20
+ export function createWorkflowCommand() {
21
+ return new Command('workflow')
22
+ .description('Configure default workflow behavior for new features')
23
+ .option('--allow-prd', 'Auto-approve requirements phase')
24
+ .option('--allow-plan', 'Auto-approve planning phase')
25
+ .option('--allow-merge', 'Auto-approve and auto-merge after implementation')
26
+ .option('--allow-all', 'Enable all approval gates')
27
+ .option('--push', 'Push branch to remote on completion')
28
+ .option('--no-push', 'Do not push branch on completion')
29
+ .option('--pr', 'Open PR on completion')
30
+ .option('--no-pr', 'Do not open PR on completion')
31
+ .addHelpText('after', `
32
+ Examples:
33
+ $ shep settings workflow Interactive wizard
34
+ $ shep settings workflow --allow-prd --push Set specific flags
35
+ $ shep settings workflow --allow-all --pr Full autonomous mode`)
36
+ .action(async (options) => {
37
+ try {
38
+ const hasFlags = options.allowPrd !== undefined ||
39
+ options.allowPlan !== undefined ||
40
+ options.allowMerge !== undefined ||
41
+ options.allowAll !== undefined ||
42
+ options.push !== undefined ||
43
+ options.pr !== undefined;
44
+ const settings = getSettings();
45
+ let workflowDefaults;
46
+ if (hasFlags) {
47
+ // Non-interactive: build from flags, using current settings as base
48
+ const current = settings.workflow;
49
+ const gates = current.approvalGateDefaults;
50
+ if (options.allowAll) {
51
+ workflowDefaults = {
52
+ allowPrd: true,
53
+ allowPlan: true,
54
+ allowMerge: true,
55
+ pushOnImplementationComplete: options.push ?? gates.pushOnImplementationComplete,
56
+ openPrOnImplementationComplete: options.pr ?? current.openPrOnImplementationComplete,
57
+ };
58
+ }
59
+ else {
60
+ workflowDefaults = {
61
+ allowPrd: options.allowPrd ?? gates.allowPrd,
62
+ allowPlan: options.allowPlan ?? gates.allowPlan,
63
+ allowMerge: options.allowMerge ?? gates.allowMerge,
64
+ pushOnImplementationComplete: options.push ?? gates.pushOnImplementationComplete,
65
+ openPrOnImplementationComplete: options.pr ?? current.openPrOnImplementationComplete,
66
+ };
67
+ }
68
+ }
69
+ else {
70
+ // Interactive: launch checkbox wizard with current values pre-checked
71
+ const current = settings.workflow;
72
+ const gates = current.approvalGateDefaults;
73
+ workflowDefaults = await runWorkflowDefaultsStep({
74
+ allowPrd: gates.allowPrd,
75
+ allowPlan: gates.allowPlan,
76
+ allowMerge: gates.allowMerge,
77
+ pushOnImplementationComplete: gates.pushOnImplementationComplete,
78
+ openPrOnImplementationComplete: current.openPrOnImplementationComplete,
79
+ });
80
+ }
81
+ // Apply to settings
82
+ settings.workflow.approvalGateDefaults = {
83
+ allowPrd: workflowDefaults.allowPrd,
84
+ allowPlan: workflowDefaults.allowPlan,
85
+ allowMerge: workflowDefaults.allowMerge,
86
+ pushOnImplementationComplete: workflowDefaults.pushOnImplementationComplete,
87
+ };
88
+ settings.workflow.openPrOnImplementationComplete =
89
+ workflowDefaults.openPrOnImplementationComplete;
90
+ // Persist
91
+ const useCase = container.resolve(UpdateSettingsUseCase);
92
+ const updatedSettings = await useCase.execute(settings);
93
+ // Refresh in-memory singleton
94
+ resetSettings();
95
+ initializeSettings(updatedSettings);
96
+ const enabled = [
97
+ workflowDefaults.allowPrd && 'Allow PRD',
98
+ workflowDefaults.allowPlan && 'Allow Plan',
99
+ workflowDefaults.allowMerge && 'Allow Merge',
100
+ workflowDefaults.pushOnImplementationComplete && 'Push',
101
+ workflowDefaults.openPrOnImplementationComplete && 'PR',
102
+ ].filter(Boolean);
103
+ const summary = enabled.length > 0 ? enabled.join(', ') : 'none';
104
+ messages.success(`Workflow defaults updated: ${summary}`);
105
+ }
106
+ catch (error) {
107
+ const err = error instanceof Error ? error : new Error(String(error));
108
+ if (err.message.includes('force closed') || err.message.includes('User force closed')) {
109
+ messages.info('Configuration cancelled.');
110
+ return;
111
+ }
112
+ messages.error('Failed to configure workflow defaults', err);
113
+ process.exitCode = 1;
114
+ }
115
+ });
116
+ }
@@ -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;
@@ -39,6 +39,8 @@ import { messages } from './ui/index.js';
39
39
  import { initializeContainer, container } from '../../../packages/core/src/infrastructure/di/container.js';
40
40
  import { InitializeSettingsUseCase } from '../../../packages/core/src/application/use-cases/settings/initialize-settings.use-case.js';
41
41
  import { initializeSettings } from '../../../packages/core/src/infrastructure/services/settings.service.js';
42
+ import { CheckOnboardingStatusUseCase } from '../../../packages/core/src/application/use-cases/settings/check-onboarding-status.use-case.js';
43
+ import { onboardingWizard } from '../tui/wizards/onboarding/onboarding.wizard.js';
42
44
  /**
43
45
  * Bootstrap function - initializes all dependencies before CLI starts.
44
46
  * Performs async initialization (database, settings) before parsing commands.
@@ -67,6 +69,15 @@ async function bootstrap() {
67
69
  messages.error('Failed to initialize settings', err);
68
70
  throw error;
69
71
  }
72
+ // Step 2.5: First-run onboarding gate
73
+ // Only run in interactive terminals (the wizard needs TTY for prompts)
74
+ if (process.stdin.isTTY) {
75
+ const onboardingCheck = new CheckOnboardingStatusUseCase();
76
+ const { isComplete } = await onboardingCheck.execute();
77
+ if (!isComplete) {
78
+ await onboardingWizard();
79
+ }
80
+ }
70
81
  // Step 3: Set up Commander CLI
71
82
  const versionService = container.resolve('IVersionService');
72
83
  const { version, description } = versionService.getVersion();
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Onboarding Wizard Orchestrator
3
+ *
4
+ * Composes the 3 onboarding steps in sequence with a welcome banner.
5
+ * After all steps, persists results via CompleteOnboardingUseCase
6
+ * and refreshes the in-memory settings singleton.
7
+ */
8
+ import type { AgentConfigResult } from '../agent-config.wizard.js';
9
+ import type { WorkflowDefaultsResult } from './types.js';
10
+ /**
11
+ * Runs the first-run onboarding wizard.
12
+ *
13
+ * Steps:
14
+ * 1. Agent configuration (type + auth)
15
+ * 2. IDE selection
16
+ * 3. Workflow defaults (checkboxes)
17
+ *
18
+ * Step functions are injectable via parameters for testability.
19
+ */
20
+ export declare function onboardingWizard(agentStep?: () => Promise<AgentConfigResult>, ideStep?: () => Promise<string>, workflowStep?: () => Promise<WorkflowDefaultsResult>): Promise<void>;
21
+ //# sourceMappingURL=onboarding.wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.wizard.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/tui/wizards/onboarding/onboarding.wizard.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAYzD;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,GAAE,MAAM,OAAO,CAAC,iBAAiB,CAAgB,EAC1D,OAAO,GAAE,MAAM,OAAO,CAAC,MAAM,CAAc,EAC3C,YAAY,GAAE,MAAM,OAAO,CAAC,sBAAsB,CAA2B,GAC5E,OAAO,CAAC,IAAI,CAAC,CAoCf"}
@@ -0,0 +1,66 @@
1
+ /* eslint-disable no-console */
2
+ /**
3
+ * Onboarding Wizard Orchestrator
4
+ *
5
+ * Composes the 3 onboarding steps in sequence with a welcome banner.
6
+ * After all steps, persists results via CompleteOnboardingUseCase
7
+ * and refreshes the in-memory settings singleton.
8
+ */
9
+ import pc from 'picocolors';
10
+ import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
11
+ import { CompleteOnboardingUseCase } from '../../../../../packages/core/src/application/use-cases/settings/complete-onboarding.use-case.js';
12
+ import { resetSettings, initializeSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
13
+ import { runAgentStep } from './steps/agent.step.js';
14
+ import { runIdeStep } from './steps/ide.step.js';
15
+ import { runWorkflowDefaultsStep } from './steps/workflow-defaults.step.js';
16
+ /**
17
+ * Display the welcome banner before the first wizard step.
18
+ */
19
+ function showWelcomeBanner() {
20
+ console.log();
21
+ console.log(pc.cyan(pc.bold(' Welcome to Shep AI CLI')));
22
+ console.log(pc.dim(" Let's set up your environment in 3 quick steps."));
23
+ console.log();
24
+ }
25
+ /**
26
+ * Runs the first-run onboarding wizard.
27
+ *
28
+ * Steps:
29
+ * 1. Agent configuration (type + auth)
30
+ * 2. IDE selection
31
+ * 3. Workflow defaults (checkboxes)
32
+ *
33
+ * Step functions are injectable via parameters for testability.
34
+ */
35
+ export async function onboardingWizard(agentStep = runAgentStep, ideStep = runIdeStep, workflowStep = runWorkflowDefaultsStep) {
36
+ try {
37
+ showWelcomeBanner();
38
+ // Step 1: Agent configuration
39
+ const agent = await agentStep();
40
+ // Step 2: IDE selection
41
+ const ide = await ideStep();
42
+ // Step 3: Workflow defaults
43
+ const workflowDefaults = await workflowStep();
44
+ // Persist all wizard results atomically
45
+ const useCase = container.resolve(CompleteOnboardingUseCase);
46
+ const updatedSettings = await useCase.execute({
47
+ agent,
48
+ ide,
49
+ workflowDefaults,
50
+ });
51
+ // Refresh in-memory settings singleton
52
+ resetSettings();
53
+ initializeSettings(updatedSettings);
54
+ console.log();
55
+ console.log(pc.green(" ✓ Setup complete! You're ready to use Shep."));
56
+ console.log();
57
+ }
58
+ catch (error) {
59
+ // Handle Ctrl+C gracefully (ExitPromptError from @inquirer/prompts)
60
+ if (error && typeof error === 'object' && 'name' in error && error.name === 'ExitPromptError') {
61
+ process.exit(0);
62
+ return;
63
+ }
64
+ throw error;
65
+ }
66
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Onboarding Step 1: Agent Configuration
3
+ *
4
+ * Wraps the existing agentConfigWizard() for use in the onboarding flow.
5
+ */
6
+ import { type AgentConfigResult } from '../../agent-config.wizard.js';
7
+ /**
8
+ * Runs the agent configuration step.
9
+ * Delegates to the existing agentConfigWizard.
10
+ */
11
+ export declare function runAgentStep(): Promise<AgentConfigResult>;
12
+ //# sourceMappingURL=agent.step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.step.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/tui/wizards/onboarding/steps/agent.step.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEzF;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAE/D"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Onboarding Step 1: Agent Configuration
3
+ *
4
+ * Wraps the existing agentConfigWizard() for use in the onboarding flow.
5
+ */
6
+ import { agentConfigWizard } from '../../agent-config.wizard.js';
7
+ /**
8
+ * Runs the agent configuration step.
9
+ * Delegates to the existing agentConfigWizard.
10
+ */
11
+ export async function runAgentStep() {
12
+ return agentConfigWizard();
13
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Onboarding Step 2: IDE Selection
3
+ *
4
+ * Wraps the existing IDE select prompt for use in the onboarding flow.
5
+ */
6
+ /**
7
+ * Runs the IDE selection step.
8
+ * Delegates to the existing IDE select config.
9
+ */
10
+ export declare function runIdeStep(): Promise<string>;
11
+ //# sourceMappingURL=ide.step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ide.step.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/tui/wizards/onboarding/steps/ide.step.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAElD"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Onboarding Step 2: IDE Selection
3
+ *
4
+ * Wraps the existing IDE select prompt for use in the onboarding flow.
5
+ */
6
+ import { select } from '@inquirer/prompts';
7
+ import { createIdeSelectConfig } from '../../../prompts/ide-select.prompt.js';
8
+ /**
9
+ * Runs the IDE selection step.
10
+ * Delegates to the existing IDE select config.
11
+ */
12
+ export async function runIdeStep() {
13
+ return select(createIdeSelectConfig());
14
+ }
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Onboarding Step 3: Workflow Defaults
3
+ *
4
+ * Checkbox prompt for selecting default workflow behaviors
5
+ * that will apply to all new features.
6
+ */
7
+ import type { WorkflowDefaultsResult } from '../types.js';
8
+ /** Keys used as checkbox values. */
9
+ export type WorkflowDefaultKey = 'allowPrd' | 'allowPlan' | 'allowMerge' | 'pushOnImplementationComplete' | 'openPrOnImplementationComplete';
10
+ /**
11
+ * Build checkbox configuration for workflow defaults.
12
+ * Accepts optional initial values to pre-check choices (for reconfiguration).
13
+ */
14
+ export declare function buildWorkflowDefaultsConfig(initial?: Partial<WorkflowDefaultsResult>): {
15
+ message: string;
16
+ instructions: string;
17
+ theme: {
18
+ readonly prefix: {
19
+ readonly idle: string;
20
+ readonly done: string;
21
+ };
22
+ readonly style: {
23
+ readonly highlight: import("picocolors/types.js").Formatter;
24
+ readonly answer: import("picocolors/types.js").Formatter;
25
+ };
26
+ };
27
+ choices: ({
28
+ name: string;
29
+ value: "allowPrd";
30
+ description: string;
31
+ checked: boolean;
32
+ } | {
33
+ name: string;
34
+ value: "allowPlan";
35
+ description: string;
36
+ checked: boolean;
37
+ } | {
38
+ name: string;
39
+ value: "allowMerge";
40
+ description: string;
41
+ checked: boolean;
42
+ } | {
43
+ name: string;
44
+ value: "pushOnImplementationComplete";
45
+ description: string;
46
+ checked: boolean;
47
+ } | {
48
+ name: string;
49
+ value: "openPrOnImplementationComplete";
50
+ description: string;
51
+ checked: boolean;
52
+ })[];
53
+ };
54
+ /** Static config with all defaults unchecked (used by onboarding). */
55
+ export declare const workflowDefaultsConfig: {
56
+ message: string;
57
+ instructions: string;
58
+ theme: {
59
+ readonly prefix: {
60
+ readonly idle: string;
61
+ readonly done: string;
62
+ };
63
+ readonly style: {
64
+ readonly highlight: import("picocolors/types.js").Formatter;
65
+ readonly answer: import("picocolors/types.js").Formatter;
66
+ };
67
+ };
68
+ choices: ({
69
+ name: string;
70
+ value: "allowPrd";
71
+ description: string;
72
+ checked: boolean;
73
+ } | {
74
+ name: string;
75
+ value: "allowPlan";
76
+ description: string;
77
+ checked: boolean;
78
+ } | {
79
+ name: string;
80
+ value: "allowMerge";
81
+ description: string;
82
+ checked: boolean;
83
+ } | {
84
+ name: string;
85
+ value: "pushOnImplementationComplete";
86
+ description: string;
87
+ checked: boolean;
88
+ } | {
89
+ name: string;
90
+ value: "openPrOnImplementationComplete";
91
+ description: string;
92
+ checked: boolean;
93
+ })[];
94
+ };
95
+ /**
96
+ * Runs the workflow defaults step.
97
+ * Accepts optional initial values to pre-check choices (for reconfiguration).
98
+ * Returns an object with all 5 boolean flags.
99
+ */
100
+ export declare function runWorkflowDefaultsStep(initial?: Partial<WorkflowDefaultsResult>): Promise<WorkflowDefaultsResult>;
101
+ //# sourceMappingURL=workflow-defaults.step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-defaults.step.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,oCAAoC;AACpC,MAAM,MAAM,kBAAkB,GAC1B,UAAU,GACV,WAAW,GACX,YAAY,GACZ,8BAA8B,GAC9B,gCAAgC,CAAC;AAErC;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCpF;AAED,sEAAsE;AACtE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAgC,CAAC;AAEpE;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACxC,OAAO,CAAC,sBAAsB,CAAC,CAYjC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Onboarding Step 3: Workflow Defaults
3
+ *
4
+ * Checkbox prompt for selecting default workflow behaviors
5
+ * that will apply to all new features.
6
+ */
7
+ import { checkbox } from '@inquirer/prompts';
8
+ import { shepTheme } from '../../../themes/shep.theme.js';
9
+ /**
10
+ * Build checkbox configuration for workflow defaults.
11
+ * Accepts optional initial values to pre-check choices (for reconfiguration).
12
+ */
13
+ export function buildWorkflowDefaultsConfig(initial) {
14
+ return {
15
+ message: 'Select workflow defaults for new features',
16
+ instructions: '(Space to toggle, Enter to confirm)',
17
+ theme: shepTheme,
18
+ choices: [
19
+ {
20
+ name: 'Allow PRD',
21
+ value: 'allowPrd',
22
+ description: 'Auto-approve requirements phase',
23
+ checked: initial?.allowPrd ?? false,
24
+ },
25
+ {
26
+ name: 'Allow Plan',
27
+ value: 'allowPlan',
28
+ description: 'Auto-approve planning phase',
29
+ checked: initial?.allowPlan ?? false,
30
+ },
31
+ {
32
+ name: 'Allow Merge',
33
+ value: 'allowMerge',
34
+ description: 'Auto-approve and auto-merge after implementation',
35
+ checked: initial?.allowMerge ?? false,
36
+ },
37
+ {
38
+ name: 'Push on finish',
39
+ value: 'pushOnImplementationComplete',
40
+ description: 'Push branch to remote when implementation completes',
41
+ checked: initial?.pushOnImplementationComplete ?? false,
42
+ },
43
+ {
44
+ name: 'Create PR',
45
+ value: 'openPrOnImplementationComplete',
46
+ description: 'Open pull request when implementation completes',
47
+ checked: initial?.openPrOnImplementationComplete ?? false,
48
+ },
49
+ ],
50
+ };
51
+ }
52
+ /** Static config with all defaults unchecked (used by onboarding). */
53
+ export const workflowDefaultsConfig = buildWorkflowDefaultsConfig();
54
+ /**
55
+ * Runs the workflow defaults step.
56
+ * Accepts optional initial values to pre-check choices (for reconfiguration).
57
+ * Returns an object with all 5 boolean flags.
58
+ */
59
+ export async function runWorkflowDefaultsStep(initial) {
60
+ const config = initial ? buildWorkflowDefaultsConfig(initial) : workflowDefaultsConfig;
61
+ const selected = await checkbox(config);
62
+ const selectedSet = new Set(selected);
63
+ return {
64
+ allowPrd: selectedSet.has('allowPrd'),
65
+ allowPlan: selectedSet.has('allowPlan'),
66
+ allowMerge: selectedSet.has('allowMerge'),
67
+ pushOnImplementationComplete: selectedSet.has('pushOnImplementationComplete'),
68
+ openPrOnImplementationComplete: selectedSet.has('openPrOnImplementationComplete'),
69
+ };
70
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Onboarding Wizard Types
3
+ *
4
+ * Contracts between wizard steps and the orchestrator.
5
+ */
6
+ import type { AgentConfigResult } from '../agent-config.wizard.js';
7
+ /**
8
+ * Result from the workflow defaults step (checkbox prompt).
9
+ */
10
+ export interface WorkflowDefaultsResult {
11
+ allowPrd: boolean;
12
+ allowPlan: boolean;
13
+ allowMerge: boolean;
14
+ pushOnImplementationComplete: boolean;
15
+ openPrOnImplementationComplete: boolean;
16
+ }
17
+ /**
18
+ * Combined result from all onboarding wizard steps.
19
+ */
20
+ export interface OnboardingResult {
21
+ agent: AgentConfigResult;
22
+ ide: string;
23
+ workflowDefaults: WorkflowDefaultsResult;
24
+ }
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/tui/wizards/onboarding/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,4BAA4B,EAAE,OAAO,CAAC;IACtC,8BAA8B,EAAE,OAAO,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,iBAAiB,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,EAAE,sBAAsB,CAAC;CAC1C"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Onboarding Wizard Types
3
+ *
4
+ * Contracts between wizard steps and the orchestrator.
5
+ */
6
+ export {};