@mr.dj2u/cli 0.1.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/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +475 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/agent.d.ts +41 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +661 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/continue.d.ts +59 -0
- package/dist/commands/continue.d.ts.map +1 -0
- package/dist/commands/continue.js +336 -0
- package/dist/commands/continue.js.map +1 -0
- package/dist/commands/dev-tools.d.ts +14 -0
- package/dist/commands/dev-tools.d.ts.map +1 -0
- package/dist/commands/dev-tools.js +283 -0
- package/dist/commands/dev-tools.js.map +1 -0
- package/dist/commands/explain.d.ts +29 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +216 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/mcp-install.d.ts +28 -0
- package/dist/commands/mcp-install.d.ts.map +1 -0
- package/dist/commands/mcp-install.js +265 -0
- package/dist/commands/mcp-install.js.map +1 -0
- package/dist/commands/onboard.d.ts +71 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +552 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/report.d.ts +12 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +70 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/skills.d.ts +19 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +81 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/test-and-iterate.d.ts +9 -0
- package/dist/commands/test-and-iterate.d.ts.map +1 -0
- package/dist/commands/test-and-iterate.js +90 -0
- package/dist/commands/test-and-iterate.js.map +1 -0
- package/dist/continue.d.ts +3 -0
- package/dist/continue.d.ts.map +1 -0
- package/dist/continue.js +2 -0
- package/dist/continue.js.map +1 -0
- package/dist/project-memory.d.ts +58 -0
- package/dist/project-memory.d.ts.map +1 -0
- package/dist/project-memory.js +2161 -0
- package/dist/project-memory.js.map +1 -0
- package/package.json +64 -0
- package/templates/project/guidelines.md +88 -0
|
@@ -0,0 +1,552 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { access } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { cancel, intro, isCancel, log, multiselect, note, outro, select, text } from '@clack/prompts';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { scaffoldProjectMemory } from '../project-memory.js';
|
|
7
|
+
import { writeMcpJsonToProject } from './mcp-install.js';
|
|
8
|
+
const EXPO_SERVER_ADAPTER_OPTIONS = [
|
|
9
|
+
{ value: 'eas', label: 'EAS hosting', hint: 'Managed by Expo — use npx expo serve locally' },
|
|
10
|
+
{ value: 'express', label: 'Express adapter', hint: 'Self-hosted via node server.js on port 3000' },
|
|
11
|
+
{ value: 'bun', label: 'Bun adapter', hint: 'Self-hosted with Bun runtime' },
|
|
12
|
+
{ value: 'other', label: 'Other / not sure yet', hint: 'You can update this in project/info.md later' },
|
|
13
|
+
];
|
|
14
|
+
const EXPO_SERVER_ADAPTER_EXPLANATION = 'The Express adapter (expo-server/adapter/express) lets you self-host Expo Router on your own server (Plesk, VPS, etc.). EAS is Expo\'s managed cloud hosting. Both start the same way locally — `node server.js` or `npx expo serve`.';
|
|
15
|
+
const CUSTOM_BACKEND_EXPLANATION = 'A separate backend API server runs alongside Expo (not through Expo Router API routes). Example: a TypeScript/Node API server that your app calls directly. This requires starting two processes in development.';
|
|
16
|
+
const EXPLAIN_CHOICE = '__mds_explain__';
|
|
17
|
+
const PLATFORM_OPTIONS = ['web', 'android', 'ios', 'apple-tv', 'android-tv'];
|
|
18
|
+
const EAS_USE_OPTIONS = [
|
|
19
|
+
'building mobile applications',
|
|
20
|
+
'hosting a deployed server',
|
|
21
|
+
'hosting web apps',
|
|
22
|
+
'publishing mobile applications',
|
|
23
|
+
];
|
|
24
|
+
export const OTHER_DATA_NEEDS = '__mds_other_data_needs__';
|
|
25
|
+
export const DATA_NEED_OPTIONS = [
|
|
26
|
+
'Local UI/app state',
|
|
27
|
+
'User accounts/authentication',
|
|
28
|
+
'Backend database records',
|
|
29
|
+
'File/image uploads or storage',
|
|
30
|
+
'External APIs/integrations',
|
|
31
|
+
'Analytics/events',
|
|
32
|
+
'Payments/subscriptions',
|
|
33
|
+
'Realtime/collaboration',
|
|
34
|
+
'Push/email notifications',
|
|
35
|
+
'Offline sync/cache',
|
|
36
|
+
'Admin/moderation tools',
|
|
37
|
+
];
|
|
38
|
+
export const PROJECT_INFO_EXPLANATION = 'project/info.md is the product brief for the app: purpose, users, goals, features, data, platforms, monetization, team context, release plan, and questions to revisit. Agents use it to avoid guessing what to build.';
|
|
39
|
+
export const PROJECT_STYLE_EXPLANATION = 'project/style.md is only for visual direction: brand references, colors, typography, spacing, motion, accessibility, and style questions. Technical rules belong in project/guidelines.md.';
|
|
40
|
+
export const DATA_START_EXPLANATION = 'Local dummy data is fastest for early UI work. Supabase from the start is better when auth, synced data, storage, or real backend tables are already central to the product.';
|
|
41
|
+
export const EAS_EXPLANATION = 'EAS is Expo Application Services. You might use it for cloud native builds, app store submission, update channels, or hosting. This question records future intent; it does not set EAS up.';
|
|
42
|
+
export const TEST_TO_MAIN_EXPLANATION = 'Test-to-main means feature branches merge into a test branch first, using staging data and PR checks. Only validated work is promoted from test to main/production.';
|
|
43
|
+
export const SERVER_OUTPUT_EXPLANATION = 'Expo Router API routes require Expo web output set to server. Static and SPA exports can still call Supabase, external APIs, serverless functions, or a separate custom backend, but they cannot host Expo Router API routes inside the static export.';
|
|
44
|
+
export const AGENT_DERIVED_CORE_FLOWS = 'Agent should derive the first core user flows from project/info.md during intake.';
|
|
45
|
+
export const SUPER_STACK_ONBOARDING_INTRO = 'Super Stack onboarding by Mr. DJ';
|
|
46
|
+
export const SUPER_STACK_ONBOARDING_NOTE_TITLE = "Let's plan the app";
|
|
47
|
+
export const SUPER_STACK_ONBOARDING_NOTE = 'We will spend time defining the application and business now so the generated project memory gives agents real context.';
|
|
48
|
+
export const SUPER_STACK_SUCCESS_MESSAGE = "You did it! You and your app are set up for success by completing this extensive onboarding. You're amazing. Mr. DJ thanks you for using this tool and any feedback can be given at MDS@DavidJGrimsley.com or by raising an issue on Github at github.com/mds-dev-suite/issues.";
|
|
49
|
+
const CHECKBOX_PROMPT_HINT = 'Use Space to select options, then Enter to continue.';
|
|
50
|
+
export async function runOnboardCommand(argv) {
|
|
51
|
+
const projectPath = path.resolve(argv.project ?? '.');
|
|
52
|
+
const plan = argv.yes
|
|
53
|
+
? defaultOnboardPlan(argv, projectPath)
|
|
54
|
+
: await collectOnboardPlan(argv, projectPath);
|
|
55
|
+
const written = await scaffoldProjectMemory(projectPath, plan.answers, {
|
|
56
|
+
force: Boolean(argv.force),
|
|
57
|
+
guidelinesTemplate: plan.guidelinesTemplate,
|
|
58
|
+
guidelinesTemplatePath: plan.guidelinesTemplatePath,
|
|
59
|
+
richBoilerplate: plan.richBoilerplate,
|
|
60
|
+
});
|
|
61
|
+
await writeMcpJsonToProject(projectPath);
|
|
62
|
+
console.log(chalk.bold('mds onboard'));
|
|
63
|
+
console.log(chalk.dim(projectPath));
|
|
64
|
+
console.log();
|
|
65
|
+
for (const result of written) {
|
|
66
|
+
console.log(`${result.wrote ? chalk.green('CREATED') : chalk.gray('KEPT')} ${result.filePath}`);
|
|
67
|
+
}
|
|
68
|
+
console.log();
|
|
69
|
+
console.log('Selected defaults:', plan.answers.defaults.join(', '));
|
|
70
|
+
printOnboardingNextSteps();
|
|
71
|
+
}
|
|
72
|
+
export async function collectOnboardPlan(argv, projectPath = path.resolve(argv.project ?? '.')) {
|
|
73
|
+
const seed = defaultAnswers(argv, projectPath);
|
|
74
|
+
intro(SUPER_STACK_ONBOARDING_INTRO);
|
|
75
|
+
note(SUPER_STACK_ONBOARDING_NOTE, SUPER_STACK_ONBOARDING_NOTE_TITLE);
|
|
76
|
+
const projectInfoReady = await askProjectMemoryReadiness(projectPath, 'info.md');
|
|
77
|
+
const projectStyleReady = await askProjectMemoryReadiness(projectPath, 'style.md');
|
|
78
|
+
log.success('Project memory is queued up. Nice start.');
|
|
79
|
+
const appName = argv.appName ?? (await askText('What is the app name?', seed.appName));
|
|
80
|
+
const audience = argv.audience ??
|
|
81
|
+
(await askText('Who is this app for? Include user type, demographic, role, or context if you know it.', seed.audience));
|
|
82
|
+
log.success('Great, the agent has a real audience now. Halfway there soon.');
|
|
83
|
+
const coreFlows = argv.coreFlows ??
|
|
84
|
+
(await askText('If you know it already, what should users be able to do first? Examples: sign up, create a project, invite teammates, checkout. Press Enter to let the agent derive this later.', seed.coreFlows));
|
|
85
|
+
const dataNeeds = argv.dataNeeds ??
|
|
86
|
+
(await askDataNeeds(seed.dataNeeds));
|
|
87
|
+
const targetPlatforms = await askTargetPlatforms(argv, seed.targetPlatforms);
|
|
88
|
+
const firstTargetPlatform = argv.firstPlatform && targetPlatforms.includes(argv.firstPlatform)
|
|
89
|
+
? argv.firstPlatform
|
|
90
|
+
: await askChoice('Which selected platform should be the first MVP target?', toOptions(targetPlatforms), seed.firstTargetPlatform);
|
|
91
|
+
const platformFileStrategy = targetPlatforms.length > 1
|
|
92
|
+
? await askChoice('When platforms diverge, how should platform-specific code be organized?', [
|
|
93
|
+
{ value: 'files-only', label: 'File suffixes only', hint: 'Example: screen.web.tsx' },
|
|
94
|
+
{ value: 'folders', label: 'Platform folders', hint: 'Use when platform code gets larger' },
|
|
95
|
+
], seed.platformFileStrategy)
|
|
96
|
+
: seed.platformFileStrategy;
|
|
97
|
+
const appDirectory = argv.appDirectory ??
|
|
98
|
+
(await askChoice('Where should MDS place Expo Router route files it generates?', [
|
|
99
|
+
{ value: 'src', label: 'src/app', hint: 'Default for new Super Stack apps' },
|
|
100
|
+
{ value: 'root', label: 'app', hint: 'Use when the existing project already keeps routes at the root' },
|
|
101
|
+
], seed.appDirectory));
|
|
102
|
+
const platformLayoutMode = targetPlatforms.length > 1
|
|
103
|
+
? argv.platformLayouts ??
|
|
104
|
+
(await askChoice('Do selected platforms need their own layouts?', [
|
|
105
|
+
{ value: 'shared', label: 'Shared layouts', hint: 'Default; use platform files only where needed' },
|
|
106
|
+
{
|
|
107
|
+
value: 'platform-specific',
|
|
108
|
+
label: 'Platform-specific layouts',
|
|
109
|
+
hint: 'Use when TV, web, or native shells should diverge early',
|
|
110
|
+
},
|
|
111
|
+
], seed.platformLayoutMode))
|
|
112
|
+
: 'shared';
|
|
113
|
+
const webOutput = targetPlatforms.includes('web')
|
|
114
|
+
? await askChoice('For web output, choose the mode that fits the app.', [
|
|
115
|
+
{ value: 'static', label: 'Static', hint: 'Best for most marketing/content/app-shell web exports' },
|
|
116
|
+
{ value: 'server', label: 'Server', hint: 'Use Expo Router server output/API routes' },
|
|
117
|
+
{ value: 'spa', label: 'SPA', hint: 'Single-page web app behavior' },
|
|
118
|
+
], seed.webOutput === 'none' ? 'static' : seed.webOutput)
|
|
119
|
+
: 'none';
|
|
120
|
+
// Q1: Expo server adapter (only when webOutput === 'server')
|
|
121
|
+
const expoServerAdapter = argv.expoServerAdapter ??
|
|
122
|
+
(webOutput === 'server'
|
|
123
|
+
? await askExplainedChoice('How will your Expo Router server be hosted in production?', EXPO_SERVER_ADAPTER_OPTIONS, seed.expoServerAdapter === 'none' ? 'eas' : seed.expoServerAdapter, EXPO_SERVER_ADAPTER_EXPLANATION)
|
|
124
|
+
: 'none');
|
|
125
|
+
// Q2: Separate custom backend API server (any platform)
|
|
126
|
+
const hasWebOrNative = webOutput !== 'none' || targetPlatforms.some((p) => p !== 'web');
|
|
127
|
+
const customBackend = argv.customBackend ??
|
|
128
|
+
(hasWebOrNative
|
|
129
|
+
? await askYesNoWithExplain('Does this project need a separate backend API server running alongside Expo (not Expo Router API routes)?', seed.customBackend, CUSTOM_BACKEND_EXPLANATION)
|
|
130
|
+
: false);
|
|
131
|
+
const customBackendEntry = customBackend
|
|
132
|
+
? (argv.customBackendEntry ?? await askText('What is the backend server entry point?', seed.customBackendEntry))
|
|
133
|
+
: 'server.js';
|
|
134
|
+
const deployedServer = deriveDeployedServer(webOutput, expoServerAdapter, customBackend, argv.deployedServer);
|
|
135
|
+
const deploymentTarget = argv.deploymentTarget ??
|
|
136
|
+
(await askText('How will the first version reach its users? Examples: TestFlight to friends, internal client demo, App Store / Play Store launch, web hosting, side-loaded APK, internal-only.', seed.deploymentTarget));
|
|
137
|
+
log.success('Product context captured. Just a few more questions.');
|
|
138
|
+
const hasMobileTarget = targetPlatforms.some((platform) => ['android', 'ios'].includes(platform));
|
|
139
|
+
const includeCreateExpoComponents = argv.createExpoComponents ??
|
|
140
|
+
(await askYesNo('Keep or generate the starter components that come with create-expo-app?', seed.includeCreateExpoComponents));
|
|
141
|
+
const useLatestExpoSdk = argv.latestExpoSdk ??
|
|
142
|
+
(await askYesNo('Use the latest Expo SDK even if Expo Go availability may lag?', seed.useLatestExpoSdk));
|
|
143
|
+
const usesExpoUi = hasMobileTarget &&
|
|
144
|
+
(argv.expoUi ?? (await askYesNo('Will you use Expo UI for native-feeling screens?', seed.usesExpoUi)));
|
|
145
|
+
const usesExpoNativeTabs = hasMobileTarget &&
|
|
146
|
+
(argv.expoNativeTabs ??
|
|
147
|
+
(await askYesNo('Will you use Expo Native Tabs?', seed.usesExpoNativeTabs)));
|
|
148
|
+
const easSelected = await askEasIntent(argv, seed.easUses.length > 0);
|
|
149
|
+
const easUses = easSelected
|
|
150
|
+
? parseList(argv.easUses, await askMultiSelect('Which EAS uses should the roadmap remember?', EAS_USE_OPTIONS, seed.easUses))
|
|
151
|
+
: [];
|
|
152
|
+
log.success('Platform and release context are in place. Almost done.');
|
|
153
|
+
const guidelinesTemplate = argv.guidelinesTemplate ??
|
|
154
|
+
(await askYesNo('Use the bundled MDS project/guidelines.md template?', true));
|
|
155
|
+
const dataStart = argv.dataStart ??
|
|
156
|
+
(await askExplainedChoice('Would you like to start with local dummy data or go straight to Supabase?', [
|
|
157
|
+
{ value: 'local', label: 'Local dummy data', hint: 'Fastest for early UI and flow work' },
|
|
158
|
+
{ value: 'supabase', label: 'Supabase', hint: 'Use when backend/auth is already central' },
|
|
159
|
+
], seed.dataStart, DATA_START_EXPLANATION));
|
|
160
|
+
const testToMainSafeguards = argv.testToMain ??
|
|
161
|
+
(await askYesNoWithExplain('Use test-to-main safeguards for this project?', seed.testToMainSafeguards, TEST_TO_MAIN_EXPLANATION));
|
|
162
|
+
const defaults = deriveDefaults(argv.defaults, seed.defaults, dataStart, testToMainSafeguards);
|
|
163
|
+
const advancedPackageSetup = argv.advancedSetup ?? true;
|
|
164
|
+
outro(SUPER_STACK_SUCCESS_MESSAGE);
|
|
165
|
+
return {
|
|
166
|
+
answers: {
|
|
167
|
+
appName,
|
|
168
|
+
audience,
|
|
169
|
+
coreFlows,
|
|
170
|
+
dataNeeds,
|
|
171
|
+
deploymentTarget,
|
|
172
|
+
advancedPackageSetup,
|
|
173
|
+
includeCreateExpoComponents,
|
|
174
|
+
useLatestExpoSdk,
|
|
175
|
+
targetPlatforms,
|
|
176
|
+
firstTargetPlatform,
|
|
177
|
+
platformFileStrategy,
|
|
178
|
+
webOutput,
|
|
179
|
+
deployedServer,
|
|
180
|
+
expoServerAdapter,
|
|
181
|
+
customBackend,
|
|
182
|
+
customBackendEntry,
|
|
183
|
+
usesExpoUi,
|
|
184
|
+
usesExpoNativeTabs,
|
|
185
|
+
easUses,
|
|
186
|
+
projectInfoReady,
|
|
187
|
+
projectStyleReady,
|
|
188
|
+
appDirectory,
|
|
189
|
+
platformLayoutMode,
|
|
190
|
+
dataStart,
|
|
191
|
+
testToMainSafeguards,
|
|
192
|
+
defaults,
|
|
193
|
+
},
|
|
194
|
+
guidelinesTemplate,
|
|
195
|
+
guidelinesTemplatePath: argv.guidelinesTemplatePath,
|
|
196
|
+
richBoilerplate: argv.rich ?? advancedPackageSetup,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
export function defaultOnboardPlan(argv, projectPath = path.resolve(argv.project ?? '.')) {
|
|
200
|
+
const answers = defaultAnswers(argv, projectPath);
|
|
201
|
+
return {
|
|
202
|
+
answers,
|
|
203
|
+
guidelinesTemplate: argv.guidelinesTemplate ?? true,
|
|
204
|
+
guidelinesTemplatePath: argv.guidelinesTemplatePath,
|
|
205
|
+
richBoilerplate: argv.rich ?? answers.advancedPackageSetup,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
export function validateRequiredInput(value, visibleDefault) {
|
|
209
|
+
if (value.trim() || visibleDefault) {
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
return 'Please enter a value, or choose an option with a visible default.';
|
|
213
|
+
}
|
|
214
|
+
export function getServerPrompt(webOutput, hasNativeTarget, fallback) {
|
|
215
|
+
if (webOutput === 'server') {
|
|
216
|
+
return {
|
|
217
|
+
message: 'What type of server will this app be using?',
|
|
218
|
+
defaultValue: fallback === 'none' ? 'standard-expo' : fallback,
|
|
219
|
+
shouldAsk: true,
|
|
220
|
+
choices: ['standard-expo', 'custom', 'none'],
|
|
221
|
+
explanation: 'A deployed server means something beyond static app files: Expo Router API routes, server rendering, background jobs, custom backend services, or hosted logic.',
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
if (hasNativeTarget) {
|
|
225
|
+
return {
|
|
226
|
+
message: 'Will this app require a separate deployed backend?',
|
|
227
|
+
defaultValue: fallback === 'custom' ? 'custom' : 'none',
|
|
228
|
+
shouldAsk: true,
|
|
229
|
+
choices: ['custom', 'none'],
|
|
230
|
+
explanation: SERVER_OUTPUT_EXPLANATION,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
message: 'No deployed server question needed.',
|
|
235
|
+
defaultValue: 'none',
|
|
236
|
+
shouldAsk: false,
|
|
237
|
+
choices: ['none'],
|
|
238
|
+
explanation: SERVER_OUTPUT_EXPLANATION,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
export function deriveDefaults(rawDefaults, fallback, dataStart, testToMainSafeguards) {
|
|
242
|
+
const selected = new Set(parseDefaults(rawDefaults, fallback));
|
|
243
|
+
selected.add('project-docs');
|
|
244
|
+
selected.add('guidelines');
|
|
245
|
+
selected.add('doctor');
|
|
246
|
+
if (dataStart === 'supabase') {
|
|
247
|
+
selected.add('supabase');
|
|
248
|
+
}
|
|
249
|
+
if (testToMainSafeguards) {
|
|
250
|
+
selected.add('test-to-main');
|
|
251
|
+
}
|
|
252
|
+
return Array.from(selected);
|
|
253
|
+
}
|
|
254
|
+
export function formatDataNeedsSelection(selected, customNotes) {
|
|
255
|
+
const needs = selected.filter((item) => item !== OTHER_DATA_NEEDS);
|
|
256
|
+
const lines = needs.map((item) => `- ${item}`);
|
|
257
|
+
const trimmedCustomNotes = customNotes?.trim();
|
|
258
|
+
if (trimmedCustomNotes) {
|
|
259
|
+
lines.push(`- Other/custom notes: ${trimmedCustomNotes}`);
|
|
260
|
+
}
|
|
261
|
+
return lines.length > 0 ? lines.join('\n') : '- Local UI/app state';
|
|
262
|
+
}
|
|
263
|
+
function defaultAnswers(argv, projectPath = path.resolve(argv.project ?? '.')) {
|
|
264
|
+
const targetPlatforms = parsePlatforms(argv.platforms, ['web', 'ios', 'android']);
|
|
265
|
+
const firstTargetPlatform = argv.firstPlatform && targetPlatforms.includes(argv.firstPlatform) ? argv.firstPlatform : targetPlatforms[0] ?? 'web';
|
|
266
|
+
const easUses = parseList(argv.easUses, []);
|
|
267
|
+
const dataStart = argv.dataStart ?? 'local';
|
|
268
|
+
const testToMainSafeguards = argv.testToMain ?? true;
|
|
269
|
+
const webOutput = argv.webOutput ?? (targetPlatforms.includes('web') ? 'static' : 'none');
|
|
270
|
+
const _deployedServer = normalizeDeployedServerChoice(argv.deployedServer, webOutput, targetPlatforms.some((platform) => platform !== 'web'));
|
|
271
|
+
const expoServerAdapter = argv.expoServerAdapter ?? 'none';
|
|
272
|
+
const customBackend = argv.customBackend ?? false;
|
|
273
|
+
const customBackendEntry = argv.customBackendEntry ?? 'server.js';
|
|
274
|
+
return {
|
|
275
|
+
appName: argv.appName ?? path.basename(projectPath),
|
|
276
|
+
audience: argv.audience ?? 'Expo app users',
|
|
277
|
+
coreFlows: argv.coreFlows ?? AGENT_DERIVED_CORE_FLOWS,
|
|
278
|
+
dataNeeds: argv.dataNeeds ?? 'Local state first; add backend only when needed',
|
|
279
|
+
deploymentTarget: argv.deploymentTarget ?? 'Expo web/native deployment',
|
|
280
|
+
advancedPackageSetup: argv.advancedSetup ?? true,
|
|
281
|
+
includeCreateExpoComponents: argv.createExpoComponents ?? false,
|
|
282
|
+
useLatestExpoSdk: argv.latestExpoSdk ?? true,
|
|
283
|
+
targetPlatforms,
|
|
284
|
+
firstTargetPlatform,
|
|
285
|
+
platformFileStrategy: argv.platformStrategy ?? 'files-only',
|
|
286
|
+
webOutput,
|
|
287
|
+
deployedServer: deriveDeployedServer(webOutput, expoServerAdapter, customBackend, argv.deployedServer),
|
|
288
|
+
expoServerAdapter,
|
|
289
|
+
customBackend,
|
|
290
|
+
customBackendEntry,
|
|
291
|
+
usesExpoUi: argv.expoUi ?? true,
|
|
292
|
+
usesExpoNativeTabs: argv.expoNativeTabs ?? true,
|
|
293
|
+
easUses,
|
|
294
|
+
projectInfoReady: false,
|
|
295
|
+
projectStyleReady: false,
|
|
296
|
+
appDirectory: argv.appDirectory ?? detectAppDirectory(projectPath),
|
|
297
|
+
platformLayoutMode: argv.platformLayouts ?? 'shared',
|
|
298
|
+
dataStart,
|
|
299
|
+
testToMainSafeguards,
|
|
300
|
+
defaults: deriveDefaults(argv.defaults, ['project-docs', 'guidelines', 'uniwind', 'doctor'], dataStart, testToMainSafeguards),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
function detectAppDirectory(projectPath) {
|
|
304
|
+
if (existsSync(path.join(projectPath, 'src', 'app'))) {
|
|
305
|
+
return 'src';
|
|
306
|
+
}
|
|
307
|
+
if (existsSync(path.join(projectPath, 'app'))) {
|
|
308
|
+
return 'root';
|
|
309
|
+
}
|
|
310
|
+
return 'src';
|
|
311
|
+
}
|
|
312
|
+
function normalizeDeployedServerChoice(value, webOutput, hasNativeTarget) {
|
|
313
|
+
if (webOutput === 'server') {
|
|
314
|
+
return value ?? 'standard-expo';
|
|
315
|
+
}
|
|
316
|
+
if (hasNativeTarget && value === 'custom') {
|
|
317
|
+
return 'custom';
|
|
318
|
+
}
|
|
319
|
+
return 'none';
|
|
320
|
+
}
|
|
321
|
+
export function deriveDeployedServer(webOutput, expoServerAdapter, customBackend, explicit) {
|
|
322
|
+
if (webOutput === 'server') {
|
|
323
|
+
// Honor explicit if it's meaningful; 'standard-expo' is the default for server mode
|
|
324
|
+
if (explicit && explicit !== 'none')
|
|
325
|
+
return explicit;
|
|
326
|
+
// 'none' or unset means not yet specified — derive from adapter
|
|
327
|
+
if (expoServerAdapter === 'eas' || expoServerAdapter === 'none')
|
|
328
|
+
return 'standard-expo';
|
|
329
|
+
return 'custom';
|
|
330
|
+
}
|
|
331
|
+
// Non-server output: 'standard-expo' is not applicable — ignore it
|
|
332
|
+
if (explicit === 'custom')
|
|
333
|
+
return 'custom';
|
|
334
|
+
if (customBackend)
|
|
335
|
+
return 'custom';
|
|
336
|
+
return 'none';
|
|
337
|
+
}
|
|
338
|
+
async function askProjectMemoryReadiness(projectPath, fileName) {
|
|
339
|
+
const filePath = path.join(projectPath, 'project', fileName);
|
|
340
|
+
const exists = await fileExists(filePath);
|
|
341
|
+
const explanation = fileName === 'info.md' ? PROJECT_INFO_EXPLANATION : PROJECT_STYLE_EXPLANATION;
|
|
342
|
+
if (!exists) {
|
|
343
|
+
for (;;) {
|
|
344
|
+
const answer = await askChoice(`project/${fileName} is missing. How should we handle it?`, [
|
|
345
|
+
{ value: 'create', label: 'Create a starter file for me' },
|
|
346
|
+
{ value: 'recheck', label: 'I added it; check again' },
|
|
347
|
+
{ value: EXPLAIN_CHOICE, label: 'Explain this' },
|
|
348
|
+
], 'create');
|
|
349
|
+
if (answer === 'create') {
|
|
350
|
+
log.success(`No problem, Mr. DJ's Super-Stack will create project/${fileName} from a template.`);
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
if (answer === 'recheck' && (await fileExists(filePath))) {
|
|
354
|
+
log.success(`Found project/${fileName}. We will normalize it safely.`);
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
if (answer === 'recheck') {
|
|
358
|
+
log.warn(`Still cannot find project/${fileName}.`);
|
|
359
|
+
}
|
|
360
|
+
note(explanation, `What is project/${fileName}?`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return askYesNoWithExplain(`Use existing project/${fileName} as intake context and normalize it?`, true, explanation);
|
|
364
|
+
}
|
|
365
|
+
async function askTargetPlatforms(argv, fallback) {
|
|
366
|
+
if (argv.platforms) {
|
|
367
|
+
return parsePlatforms(argv.platforms, fallback);
|
|
368
|
+
}
|
|
369
|
+
const selected = await askMultiSelect('Which platforms will this app target?', PLATFORM_OPTIONS, fallback);
|
|
370
|
+
return selected.length > 0 ? selected : ['web'];
|
|
371
|
+
}
|
|
372
|
+
async function askDataNeeds(fallback) {
|
|
373
|
+
const selected = await multiselect({
|
|
374
|
+
message: checkboxPromptMessage('Which data categories does the app need?'),
|
|
375
|
+
options: [
|
|
376
|
+
...DATA_NEED_OPTIONS.map((need) => ({ value: need, label: need })),
|
|
377
|
+
{
|
|
378
|
+
value: OTHER_DATA_NEEDS,
|
|
379
|
+
label: 'Other/custom notes',
|
|
380
|
+
hint: 'Add something this list missed',
|
|
381
|
+
},
|
|
382
|
+
],
|
|
383
|
+
initialValues: ['Local UI/app state'],
|
|
384
|
+
required: true,
|
|
385
|
+
});
|
|
386
|
+
const selectedNeeds = Array.from(handleCancel(selected));
|
|
387
|
+
const customNotes = selectedNeeds.includes(OTHER_DATA_NEEDS)
|
|
388
|
+
? await askText('What other data needs should MDS remember?', fallback)
|
|
389
|
+
: undefined;
|
|
390
|
+
return formatDataNeedsSelection(selectedNeeds, customNotes);
|
|
391
|
+
}
|
|
392
|
+
async function askEasIntent(argv, fallback) {
|
|
393
|
+
if (argv.easSelected === true) {
|
|
394
|
+
log.success("EAS setup was detected, so Mr. DJ's Super-Stack will remember EAS in the roadmap.");
|
|
395
|
+
return true;
|
|
396
|
+
}
|
|
397
|
+
if (argv.easSelected === false) {
|
|
398
|
+
return askYesNoWithExplain('Will you use EAS for this project? (not setup yet)', fallback, EAS_EXPLANATION);
|
|
399
|
+
}
|
|
400
|
+
return askYesNoWithExplain('Will you use EAS for this project? (not setup yet)', fallback, EAS_EXPLANATION);
|
|
401
|
+
}
|
|
402
|
+
async function askText(message, fallback) {
|
|
403
|
+
const answer = await text({
|
|
404
|
+
message,
|
|
405
|
+
placeholder: fallback,
|
|
406
|
+
defaultValue: fallback,
|
|
407
|
+
validate: (value) => validateRequiredInput(value, fallback),
|
|
408
|
+
});
|
|
409
|
+
return handleCancel(answer).trim() || fallback;
|
|
410
|
+
}
|
|
411
|
+
async function askYesNo(message, fallback) {
|
|
412
|
+
const answer = await select({
|
|
413
|
+
message,
|
|
414
|
+
options: [
|
|
415
|
+
{ value: true, label: 'Yes' },
|
|
416
|
+
{ value: false, label: 'No' },
|
|
417
|
+
],
|
|
418
|
+
initialValue: fallback,
|
|
419
|
+
});
|
|
420
|
+
return handleCancel(answer);
|
|
421
|
+
}
|
|
422
|
+
async function askYesNoWithExplain(message, fallback, explanation) {
|
|
423
|
+
for (;;) {
|
|
424
|
+
const answer = await select({
|
|
425
|
+
message,
|
|
426
|
+
options: [
|
|
427
|
+
{ value: true, label: 'Yes' },
|
|
428
|
+
{ value: false, label: 'No' },
|
|
429
|
+
{ value: EXPLAIN_CHOICE, label: 'Explain this' },
|
|
430
|
+
],
|
|
431
|
+
initialValue: fallback,
|
|
432
|
+
});
|
|
433
|
+
const selected = handleCancel(answer);
|
|
434
|
+
if (selected !== EXPLAIN_CHOICE) {
|
|
435
|
+
return selected;
|
|
436
|
+
}
|
|
437
|
+
note(explanation, 'Explanation');
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
async function askChoice(message, options, fallback) {
|
|
441
|
+
const answer = await select({
|
|
442
|
+
message,
|
|
443
|
+
options: options,
|
|
444
|
+
initialValue: fallback,
|
|
445
|
+
});
|
|
446
|
+
return handleCancel(answer);
|
|
447
|
+
}
|
|
448
|
+
async function askExplainedChoice(message, options, fallback, explanation) {
|
|
449
|
+
for (;;) {
|
|
450
|
+
const answer = await select({
|
|
451
|
+
message,
|
|
452
|
+
options: [...options, { value: EXPLAIN_CHOICE, label: 'Explain this' }],
|
|
453
|
+
initialValue: fallback,
|
|
454
|
+
});
|
|
455
|
+
const selected = handleCancel(answer);
|
|
456
|
+
if (selected !== EXPLAIN_CHOICE) {
|
|
457
|
+
return selected;
|
|
458
|
+
}
|
|
459
|
+
note(explanation, 'Explanation');
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
async function askMultiSelect(message, choices, fallback) {
|
|
463
|
+
const initialValues = fallback.filter((item) => choices.includes(item));
|
|
464
|
+
const answer = await multiselect({
|
|
465
|
+
message: checkboxPromptMessage(message),
|
|
466
|
+
options: choices.map((choice) => ({ value: choice, label: formatOptionLabel(choice) })),
|
|
467
|
+
initialValues,
|
|
468
|
+
required: true,
|
|
469
|
+
});
|
|
470
|
+
return Array.from(handleCancel(answer));
|
|
471
|
+
}
|
|
472
|
+
function checkboxPromptMessage(message) {
|
|
473
|
+
return `${message} ${CHECKBOX_PROMPT_HINT}`;
|
|
474
|
+
}
|
|
475
|
+
function handleCancel(value) {
|
|
476
|
+
if (isCancel(value)) {
|
|
477
|
+
cancel('Cancelled. You can rerun onboarding whenever you are ready.');
|
|
478
|
+
process.exit(0);
|
|
479
|
+
}
|
|
480
|
+
return value;
|
|
481
|
+
}
|
|
482
|
+
function printOnboardingNextSteps() {
|
|
483
|
+
console.log('Onboarding next steps:');
|
|
484
|
+
console.log('1. Play with styling in the style-guide page.');
|
|
485
|
+
console.log('2. Browse exposition pages to understand included base packages.');
|
|
486
|
+
console.log('3. Review project/ files for accuracy and planning adjustments.');
|
|
487
|
+
console.log('4. Tell the agent to commence development phase by phase.');
|
|
488
|
+
console.log('Then run mds doctor --ci, or use mds clear-expo-start when Metro gets stuck.');
|
|
489
|
+
}
|
|
490
|
+
function toOptions(values) {
|
|
491
|
+
return values.map((value) => ({ value, label: formatOptionLabel(value) }));
|
|
492
|
+
}
|
|
493
|
+
function _toServerOptions(values) {
|
|
494
|
+
return values.map((value) => {
|
|
495
|
+
switch (value) {
|
|
496
|
+
case 'standard-expo':
|
|
497
|
+
return {
|
|
498
|
+
value,
|
|
499
|
+
label: 'Standard Expo server/API routes',
|
|
500
|
+
hint: 'Requires Expo web output set to Server',
|
|
501
|
+
};
|
|
502
|
+
case 'custom':
|
|
503
|
+
return {
|
|
504
|
+
value,
|
|
505
|
+
label: 'Separate custom backend',
|
|
506
|
+
hint: 'Supabase, serverless functions, Node server, Rails, etc.',
|
|
507
|
+
};
|
|
508
|
+
case 'none':
|
|
509
|
+
return {
|
|
510
|
+
value,
|
|
511
|
+
label: 'No deployed server',
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
function formatOptionLabel(value) {
|
|
517
|
+
if (value === 'ios') {
|
|
518
|
+
return 'iOS';
|
|
519
|
+
}
|
|
520
|
+
if (value === 'apple-tv') {
|
|
521
|
+
return 'Apple TV';
|
|
522
|
+
}
|
|
523
|
+
if (value === 'android-tv') {
|
|
524
|
+
return 'Android TV';
|
|
525
|
+
}
|
|
526
|
+
return value.charAt(0).toUpperCase() + value.slice(1);
|
|
527
|
+
}
|
|
528
|
+
function parseDefaults(value, fallback) {
|
|
529
|
+
return parseList(value, fallback);
|
|
530
|
+
}
|
|
531
|
+
function parseList(value, fallback) {
|
|
532
|
+
if (!value) {
|
|
533
|
+
return fallback;
|
|
534
|
+
}
|
|
535
|
+
const raw = Array.isArray(value) ? value : value.split(',');
|
|
536
|
+
const parsed = raw.map((item) => item.trim()).filter(Boolean);
|
|
537
|
+
return parsed.length > 0 ? parsed : fallback;
|
|
538
|
+
}
|
|
539
|
+
function parsePlatforms(value, fallback) {
|
|
540
|
+
const parsed = parseList(value, fallback);
|
|
541
|
+
return parsed.filter((platform) => PLATFORM_OPTIONS.includes(platform));
|
|
542
|
+
}
|
|
543
|
+
async function fileExists(filePath) {
|
|
544
|
+
try {
|
|
545
|
+
await access(filePath);
|
|
546
|
+
return true;
|
|
547
|
+
}
|
|
548
|
+
catch {
|
|
549
|
+
return false;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
//# sourceMappingURL=onboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DoctorMode, DoctorReport } from '@mr.dj2u/doctor';
|
|
2
|
+
export interface ReportArgv {
|
|
3
|
+
path?: string;
|
|
4
|
+
mode?: DoctorMode;
|
|
5
|
+
scripts?: boolean;
|
|
6
|
+
json?: boolean;
|
|
7
|
+
output?: string;
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function runReportCommand(argv: ReportArgv): Promise<void>;
|
|
11
|
+
export declare function renderMarkdownReport(report: DoctorReport): string;
|
|
12
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAqB,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEnF,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBtE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAajE"}
|