@shepai/cli 1.41.1 → 1.42.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/application/use-cases/settings/check-onboarding-status.use-case.d.ts +16 -0
- package/dist/packages/core/src/application/use-cases/settings/check-onboarding-status.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/settings/check-onboarding-status.use-case.js +17 -0
- package/dist/packages/core/src/application/use-cases/settings/complete-onboarding.use-case.d.ts +38 -0
- package/dist/packages/core/src/application/use-cases/settings/complete-onboarding.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/settings/complete-onboarding.use-case.js +69 -0
- package/dist/packages/core/src/application/use-cases/settings/index.d.ts +3 -0
- package/dist/packages/core/src/application/use-cases/settings/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/settings/index.js +2 -0
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +8 -1
- package/dist/packages/core/src/domain/generated/output.d.ts +27 -2
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +2 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +5 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +16 -2
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +14 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +13 -3
- package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/new.command.js +11 -9
- package/dist/src/presentation/cli/commands/settings/index.d.ts +7 -3
- package/dist/src/presentation/cli/commands/settings/index.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/settings/index.js +25 -5
- package/dist/src/presentation/cli/commands/settings/workflow.command.d.ts +16 -0
- package/dist/src/presentation/cli/commands/settings/workflow.command.d.ts.map +1 -0
- package/dist/src/presentation/cli/commands/settings/workflow.command.js +116 -0
- package/dist/src/presentation/cli/index.js +11 -0
- package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.d.ts +21 -0
- package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.d.ts.map +1 -0
- package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.js +66 -0
- package/dist/src/presentation/tui/wizards/onboarding/steps/agent.step.d.ts +12 -0
- package/dist/src/presentation/tui/wizards/onboarding/steps/agent.step.d.ts.map +1 -0
- package/dist/src/presentation/tui/wizards/onboarding/steps/agent.step.js +13 -0
- package/dist/src/presentation/tui/wizards/onboarding/steps/ide.step.d.ts +11 -0
- package/dist/src/presentation/tui/wizards/onboarding/steps/ide.step.d.ts.map +1 -0
- package/dist/src/presentation/tui/wizards/onboarding/steps/ide.step.js +14 -0
- package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.d.ts +101 -0
- package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.d.ts.map +1 -0
- package/dist/src/presentation/tui/wizards/onboarding/steps/workflow-defaults.step.js +70 -0
- package/dist/src/presentation/tui/wizards/onboarding/types.d.ts +25 -0
- package/dist/src/presentation/tui/wizards/onboarding/types.d.ts.map +1 -0
- package/dist/src/presentation/tui/wizards/onboarding/types.js +6 -0
- 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/.tsbuildinfo +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/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
- 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/{5ac5e119f2c50fe5.js → c946ff76b4c41d8e.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- /package/web/.next/static/{qwpWWdjIzP2dEFkcjelT- → 5JQYq5TSfNVv88GQx6dTr}/_buildManifest.js +0 -0
- /package/web/.next/static/{qwpWWdjIzP2dEFkcjelT- → 5JQYq5TSfNVv88GQx6dTr}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{qwpWWdjIzP2dEFkcjelT- → 5JQYq5TSfNVv88GQx6dTr}/_ssgManifest.js +0 -0
|
@@ -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
|
+
}
|
|
@@ -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"}
|