@stackwright-pro/launch-stackwright-pro 0.4.0-alpha.82 ā 0.4.0-alpha.84
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/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.js
CHANGED
|
@@ -31,7 +31,7 @@ var require_package = __commonJS({
|
|
|
31
31
|
"package.json"(exports2, module2) {
|
|
32
32
|
module2.exports = {
|
|
33
33
|
name: "@stackwright-pro/launch-stackwright-pro",
|
|
34
|
-
version: "0.4.0-alpha.
|
|
34
|
+
version: "0.4.0-alpha.84",
|
|
35
35
|
description: "Launch a new Stackwright Pro project with OpenAPI integration, auth, and the otter raft",
|
|
36
36
|
license: "SEE LICENSE IN LICENSE",
|
|
37
37
|
publishConfig: {
|
|
@@ -110,9 +110,9 @@ var PRO_VERSIONS = {
|
|
|
110
110
|
"@stackwright-pro/auth": "0.2.0-alpha.11",
|
|
111
111
|
"@stackwright-pro/auth-nextjs": "0.2.0-alpha.13",
|
|
112
112
|
"@stackwright-pro/display-components": "0.2.0-alpha.9",
|
|
113
|
-
"@stackwright-pro/mcp": "0.2.0-alpha.
|
|
113
|
+
"@stackwright-pro/mcp": "0.2.0-alpha.50",
|
|
114
114
|
"@stackwright-pro/openapi": "0.3.0-alpha.23",
|
|
115
|
-
"@stackwright-pro/otters": "1.0.0-alpha.
|
|
115
|
+
"@stackwright-pro/otters": "1.0.0-alpha.39",
|
|
116
116
|
"@stackwright-pro/pulse": "0.3.0-alpha.15",
|
|
117
117
|
"@stackwright-pro/workflow": "0.1.0-alpha.15",
|
|
118
118
|
"@stackwright-pro/workflow-components": "0.1.0-alpha.17"
|
|
@@ -198,18 +198,18 @@ async function addIntegrationToStackwrightYml(targetDir, specName, specFilename,
|
|
|
198
198
|
await import_fs_extra.default.writeFile(ymlPath, import_js_yaml.default.dump(config, { lineWidth: 120 }));
|
|
199
199
|
}
|
|
200
200
|
async function scaffoldWorkspaceConfig(targetDir) {
|
|
201
|
-
const workspaceDir = import_path.default.join(targetDir, ".
|
|
201
|
+
const workspaceDir = import_path.default.join(targetDir, ".code_puppy");
|
|
202
202
|
await import_fs_extra.default.ensureDir(workspaceDir);
|
|
203
203
|
const workspaceStats = await import_fs_extra.default.lstat(workspaceDir);
|
|
204
204
|
if (workspaceStats.isSymbolicLink()) {
|
|
205
|
-
throw new Error(".
|
|
205
|
+
throw new Error(".code_puppy/ is a symlink \u2014 refusing to write. Check for tampering.");
|
|
206
206
|
}
|
|
207
207
|
const agentsDir = import_path.default.join(workspaceDir, "agents");
|
|
208
208
|
await import_fs_extra.default.ensureDir(agentsDir);
|
|
209
209
|
if (await import_fs_extra.default.pathExists(agentsDir)) {
|
|
210
210
|
const agentsStats = await import_fs_extra.default.lstat(agentsDir);
|
|
211
211
|
if (agentsStats.isSymbolicLink()) {
|
|
212
|
-
throw new Error(".
|
|
212
|
+
throw new Error(".code_puppy/agents is a symlink \u2014 refusing to write. Check for tampering.");
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
const configPath = import_path.default.join(workspaceDir, "config.json");
|
|
@@ -224,7 +224,7 @@ async function scaffoldWorkspaceConfig(targetDir) {
|
|
|
224
224
|
const configStats = await import_fs_extra.default.lstat(configPath);
|
|
225
225
|
if (configStats.isSymbolicLink()) {
|
|
226
226
|
throw new Error(
|
|
227
|
-
".
|
|
227
|
+
".code_puppy/config.json is a symlink \u2014 refusing to write. Check for tampering."
|
|
228
228
|
);
|
|
229
229
|
}
|
|
230
230
|
}
|
|
@@ -238,7 +238,7 @@ async function scaffoldWorkspaceConfig(targetDir) {
|
|
|
238
238
|
const mcpStats = await import_fs_extra.default.lstat(mcpServersPath);
|
|
239
239
|
if (mcpStats.isSymbolicLink()) {
|
|
240
240
|
throw new Error(
|
|
241
|
-
".
|
|
241
|
+
".code_puppy/mcp_servers.json is a symlink \u2014 refusing to write. Check for tampering."
|
|
242
242
|
);
|
|
243
243
|
}
|
|
244
244
|
}
|
|
@@ -671,7 +671,7 @@ async function launch(targetDir, options) {
|
|
|
671
671
|
"utf-8"
|
|
672
672
|
);
|
|
673
673
|
await scaffoldWorkspaceConfig(targetDir);
|
|
674
|
-
console.log(import_chalk.default.green("\u{1F43E} .
|
|
674
|
+
console.log(import_chalk.default.green("\u{1F43E} .code_puppy/ workspace scaffolded (projectOnly: true)"));
|
|
675
675
|
const relDir = import_path2.default.relative(process.cwd(), targetDir) || ".";
|
|
676
676
|
console.log(import_chalk.default.cyan.bold("\n\u{1F389} All set! Here's what to do next:\n"));
|
|
677
677
|
console.log(import_chalk.default.white(` 1. cd ${relDir}`));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/index.ts","../src/scaffold.ts","../src/generated/workspace-versions.ts"],"sourcesContent":["{\n \"name\": \"@stackwright-pro/launch-stackwright-pro\",\n \"version\": \"0.4.0-alpha.82\",\n \"description\": \"Launch a new Stackwright Pro project with OpenAPI integration, auth, and the otter raft\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Per-Aspera-LLC/stackwright-pro\"\n },\n \"keywords\": [\n \"stackwright\",\n \"stackwright-pro\",\n \"scaffolding\",\n \"openapi\",\n \"government\",\n \"hackathon\"\n ],\n \"files\": [\n \"dist\",\n \"templates\"\n ],\n \"bin\": {\n \"launch-stackwright-pro\": \"dist/index.js\"\n },\n \"scripts\": {\n \"build\": \"node ../../scripts/sync-versions.mjs && tsup\",\n \"sync-versions\": \"node ../../scripts/sync-versions.mjs\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:coverage\": \"vitest run --coverage\"\n },\n \"dependencies\": {\n \"@stackwright-pro/auth\": \"workspace:*\",\n \"@stackwright-pro/auth-nextjs\": \"workspace:*\",\n \"@stackwright-pro/mcp\": \"workspace:*\",\n \"@stackwright-pro/openapi\": \"workspace:*\",\n \"@stackwright-pro/otters\": \"workspace:*\",\n \"@stackwright-pro/scaffold-hooks\": \"workspace:*\",\n \"@stackwright/cli\": \"^0.8.6\",\n \"@stackwright/scaffold-core\": \"^0.3.1\",\n \"chalk\": \"^5.6.2\",\n \"commander\": \"^15.0.0\",\n \"fs-extra\": \"^11.3.5\",\n \"js-yaml\": \"^4.1.0\"\n },\n \"devDependencies\": {\n \"@types/fs-extra\": \"^11.0\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"catalog:\",\n \"typescript\": \"catalog:\",\n \"tsup\": \"catalog:\",\n \"vitest\": \"catalog:\"\n }\n}\n","import { Command } from 'commander';\nimport path from 'path';\nimport os from 'os';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\n\nimport { scaffold, ScaffoldOptions } from '@stackwright/cli';\nimport { runScaffoldHooks } from '@stackwright/scaffold-core';\nimport { registerProScaffoldHooks } from '@stackwright-pro/scaffold-hooks';\nimport {\n addProDepsToPackageJson,\n addAuthToStackwrightYml,\n scaffoldWorkspaceConfig,\n addIntegrationToStackwrightYml,\n generateReadme,\n} from './scaffold.js';\n// Register Pro hooks (adds deps, MCP config, etc.)\n// Must be called before scaffold() to ensure hooks run in the CLI's scaffold-core context\nregisterProScaffoldHooks();\n\nconst { version } = require('../package.json') as { version: string };\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface LaunchProOptions {\n name?: string;\n title?: string;\n theme?: string;\n force?: boolean;\n skipOtters?: boolean;\n skipInstall?: boolean;\n yes?: boolean;\n spec?: string[];\n specName?: string;\n mock?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Template copying (Pro-specific - hooks can't handle these)\n// ---------------------------------------------------------------------------\n\nasync function copyProTemplate(templateName: string, destPath: string): Promise<void> {\n const src = path.resolve(__dirname, '..', 'templates', 'pro', templateName);\n await fs.copy(src, destPath);\n}\n\n// ---------------------------------------------------------------------------\n// Spec handling (Pro-specific - hooks can't handle these)\n// ---------------------------------------------------------------------------\n\nasync function handleSpec(\n targetDir: string,\n specPath: string,\n specName?: string\n): Promise<{ specFilename: string; derivedName: string }> {\n const resolvedSpec = path.resolve(specPath);\n\n if (!fs.existsSync(resolvedSpec)) {\n throw new Error(`Spec file not found: ${resolvedSpec}`);\n }\n\n const specFilename = path.basename(resolvedSpec);\n const derivedName = specName || path.basename(specFilename, path.extname(specFilename));\n\n const specsDir = path.join(targetDir, 'specs');\n await fs.ensureDir(specsDir);\n await fs.copy(resolvedSpec, path.join(specsDir, specFilename));\n\n return { specFilename, derivedName };\n}\n\n// ---------------------------------------------------------------------------\n// Main launch flow\n// ---------------------------------------------------------------------------\n\nasync function launch(targetDir: string, options: LaunchProOptions): Promise<void> {\n const dirName = path.basename(targetDir);\n\n console.log(chalk.cyan.bold('\\nš¢ Launching Stackwright Pro...\\n'));\n\n // ------------------------------------------------------------------\n // 1. Scaffold base OSS project via @stackwright/cli\n // Hooks auto-handle: Pro deps, MCP config, role-based scripts\n // ------------------------------------------------------------------\n\n const scaffoldOpts: ScaffoldOptions = {\n name: options.name || dirName,\n standalone: true, // prevents `workspace:*` refs when CLI runs inside the Pro monorepo\n ...(options.title !== undefined && { title: options.title }),\n ...(options.theme !== undefined && { theme: options.theme }),\n ...(options.force !== undefined && { force: options.force }),\n ...(options.yes !== undefined && { noInteractive: options.yes }),\n };\n\n await scaffold(targetDir, scaffoldOpts);\n console.log(chalk.green('ā
Base project scaffolded (hooks added Pro deps + MCP config)'));\n\n // ------------------------------------------------------------------\n // 1b. Run pnpm install ā citizen devs shouldn't need to know this step exists\n // ------------------------------------------------------------------\n\n // Patch Pro packages directly into package.json before install.\n // This bypasses the scaffold hooks system (which has a known version-resolution\n // issue) and guarantees pro deps land regardless of hook execution order.\n await addProDepsToPackageJson(targetDir);\n console.log(chalk.green('𦦠Pro packages added to package.json'));\n\n // Verify package.json has Pro deps before installing\n const verifyPkg = JSON.parse(\n await fs.readFile(path.join(targetDir, 'package.json'), 'utf-8')\n ) as Record<string, unknown>;\n const proDepCount = Object.keys(\n typeof verifyPkg.dependencies === 'object' && verifyPkg.dependencies !== null\n ? (verifyPkg.dependencies as Record<string, string>)\n : {}\n ).filter((k) => k.startsWith('@stackwright-pro')).length;\n console.log(chalk.dim(` ā package.json verified: ${proDepCount} @stackwright-pro/* deps ready`));\n\n console.log(chalk.cyan('\\nš¦ Installing dependencies (this takes a moment)...'));\n if (!options.skipInstall) {\n try {\n execSync('pnpm install --ignore-workspace', {\n cwd: targetDir,\n stdio: 'inherit',\n timeout: 120_000,\n });\n console.log(chalk.green('ā
Dependencies installed'));\n } catch (err: unknown) {\n const isTimeout =\n err instanceof Error &&\n (err.message.includes('ETIMEDOUT') || err.message.includes('timeout'));\n console.error(\n chalk.red('\\nā pnpm install failed. Auth and Pro packages are NOT installed.')\n );\n console.error(\n chalk.red(' Your project is in an incomplete state ā do NOT run or deploy it.')\n );\n if (isTimeout) {\n console.error(\n chalk.yellow(' The install timed out (>2 min). Check your network connection.')\n );\n }\n console.error(\n chalk.yellow(` Fix the error above, then run: pnpm install --ignore-workspace`)\n );\n process.exit(1);\n }\n } else {\n console.log(chalk.dim('ā¹ļø Skipping install (--skip-install). Run: pnpm install'));\n }\n\n // Fire postInstall hooks now that install has run\n const dependencyMode: 'workspace' | 'standalone' = 'standalone';\n await runScaffoldHooks('postInstall', {\n targetDir,\n projectName: options.name || path.basename(targetDir),\n siteTitle: options.title || options.name || path.basename(targetDir),\n themeId: options.theme || 'corporate',\n packageJson: {},\n dependencyMode,\n });\n\n // ------------------------------------------------------------------\n // 2. Copy Pro templates (hooks can't handle these)\n // ------------------------------------------------------------------\n\n // Replace _app.tsx with Pro version (AuthProvider, shadcn, etc.)\n await copyProTemplate('_app.tsx', path.join(targetDir, 'pages', '_app.tsx'));\n\n // Add root content.yml for the home page\n await copyProTemplate('content.yml', path.join(targetDir, 'pages', 'content.yml'));\n\n // Replace next.config.js with Pro version (transpile pro pkgs)\n await copyProTemplate('next.config.js', path.join(targetDir, 'next.config.js'));\n\n // Add lib/mock-auth.ts\n await fs.ensureDir(path.join(targetDir, 'lib'));\n await copyProTemplate('mock-auth.ts', path.join(targetDir, 'lib', 'mock-auth.ts'));\n\n // Add yaml.d.ts for TypeScript support\n await copyProTemplate('yaml.d.ts', path.join(targetDir, 'yaml.d.ts'));\n\n // Add scripts/prebuild.js + scripts/pro-content-plugin.js\n await fs.ensureDir(path.join(targetDir, 'scripts'));\n await copyProTemplate('prebuild.js', path.join(targetDir, 'scripts', 'prebuild.js'));\n await copyProTemplate(\n 'scripts/pro-content-plugin.js',\n path.join(targetDir, 'scripts', 'pro-content-plugin.js')\n );\n\n console.log(chalk.green('š Auth integration added (RBAC with 3 roles)'));\n\n // ------------------------------------------------------------------\n // 3. Add auth section to stackwright.yml\n // ------------------------------------------------------------------\n\n await addAuthToStackwrightYml(targetDir);\n\n // ------------------------------------------------------------------\n // 4. Handle --spec if provided\n // ------------------------------------------------------------------\n\n let specInfo: { specFilename: string; derivedName: string } | null = null;\n const MOCK_URL = 'http://localhost:4010';\n\n if (options.spec && options.spec.length > 0) {\n for (const specPath of options.spec) {\n specInfo = await handleSpec(targetDir, specPath, options.specName);\n await addIntegrationToStackwrightYml(\n targetDir,\n specInfo.derivedName,\n specInfo.specFilename,\n options.mock ? MOCK_URL : undefined\n );\n }\n console.log(chalk.green(`š” ${options.spec.length} OpenAPI integration(s) wired up`));\n if (options.mock) {\n console.log(chalk.green('š Prism mock server configured'));\n }\n } else if (options.mock) {\n // --mock without --spec: use sample Petstore spec for demo\n console.log(\n chalk.yellow(\n 'ā ļø No spec provided with --mock. Using sample Petstore spec for demo. Replace with your API spec.'\n )\n );\n\n const specsDir = path.join(targetDir, 'specs');\n await fs.ensureDir(specsDir);\n await copyProTemplate('petstore.yaml', path.join(specsDir, 'petstore.yaml'));\n\n specInfo = { specFilename: 'petstore.yaml', derivedName: 'petstore' };\n\n await addIntegrationToStackwrightYml(\n targetDir,\n specInfo.derivedName,\n specInfo.specFilename,\n MOCK_URL\n );\n console.log(chalk.green('š” Sample Petstore spec wired up'));\n console.log(chalk.green('š Prism mock server configured'));\n }\n\n // ------------------------------------------------------------------\n // 5. Generate README\n // ------------------------------------------------------------------\n\n const readmeContent = generateReadme({\n projectName: options.name || dirName,\n hasSpec: !!specInfo,\n ...(specInfo?.derivedName !== undefined && { specName: specInfo.derivedName }),\n ...(specInfo?.specFilename !== undefined && { specFilename: specInfo.specFilename }),\n hasOtters: !options.skipOtters,\n hasMock: !!options.mock,\n });\n\n await fs.writeFile(path.join(targetDir, 'README.md'), readmeContent);\n console.log(chalk.green('š README.md created'));\n\n // ------------------------------------------------------------------\n // 5b. Write init-context.json for raft launcher\n // ------------------------------------------------------------------\n\n const initContext: Record<string, unknown> = {\n projectRoot: targetDir,\n projectName: options.name || dirName,\n generatedBy: 'launch-stackwright-pro',\n version: '1.0',\n };\n\n if (specInfo) {\n initContext.specPath = `specs/${specInfo.specFilename}`;\n initContext.specName = specInfo.derivedName;\n }\n\n initContext.theme = options.theme || 'corporate';\n\n const stackwrightDir = path.join(targetDir, '.stackwright');\n await fs.ensureDir(stackwrightDir);\n await fs.writeFile(\n path.join(stackwrightDir, 'init-context.json'),\n JSON.stringify(initContext, null, 2) + '\\n',\n 'utf-8'\n );\n\n // ------------------------------------------------------------------\n // 5c. Scaffold .code-puppy/ workspace directory\n // Creates config.json (projectOnly: true), mcp_servers.json,\n // and agents/ dir. raft-puppy discovers this via walk-up from cwd\n // on first startup ā no CLI flags needed.\n // ------------------------------------------------------------------\n\n await scaffoldWorkspaceConfig(targetDir);\n console.log(chalk.green('š¾ .code-puppy/ workspace scaffolded (projectOnly: true)'));\n\n // ------------------------------------------------------------------\n // 6. Print next steps\n // ------------------------------------------------------------------\n\n const relDir = path.relative(process.cwd(), targetDir) || '.';\n\n console.log(chalk.cyan.bold(\"\\nš All set! Here's what to do next:\\n\"));\n console.log(chalk.white(` 1. cd ${relDir}`));\n console.log(chalk.white(' 2. npx @stackwright-pro/raft'));\n console.log(chalk.dim(' (use --verbose for troubleshooting)'));\n\n if (specInfo) {\n console.log(chalk.cyan(`\\nš” Your API spec was copied to specs/${specInfo.specFilename}`));\n console.log(chalk.dim(' The prebuild will generate types & client on first `pnpm dev`.'));\n }\n\n if (options.mock) {\n console.log(chalk.cyan('\\nš Run with mock server:'));\n console.log(chalk.white(' pnpm dev:mock # Starts Prism + Next.js'));\n }\n\n if (!options.skipOtters) {\n console.log(chalk.cyan.bold('\\n𦦠The otter raft is ready to build your site!'));\n console.log(chalk.dim(' Run the command above to get started.\\n'));\n }\n}\n\n// ---------------------------------------------------------------------------\n// CLI definition\n// ---------------------------------------------------------------------------\n\nasync function main(): Promise<void> {\n const program = new Command();\n\n program\n .name('launch-stackwright-pro')\n .description('š¢ Launch a new Stackwright Pro project with auth, OpenAPI, and the otter raft')\n .version(version)\n .argument('[directory]', 'Project directory', '.')\n .option('--name <name>', 'Project name (used in package.json)')\n .option('--title <title>', 'Site title shown in the app bar and browser tab')\n .option('--theme <themeId>', 'Theme ID (e.g., corporate, creative, minimal)')\n .option('--force', 'Launch even if the target directory is not empty')\n .option('--skip-otters', 'Skip copying otter raft configs')\n .option('-y, --yes', 'Skip all prompts, use defaults')\n .option('--mock', 'Configure Prism mock server for API development (runs on port 4010)')\n .option(\n '--spec <paths...>',\n 'Paths to OpenAPI specs (YAML or JSON) ā copies into project and wires up integrations (can be specified multiple times)'\n )\n .option(\n '--spec-name <name>',\n 'Name for the API integration (default: derived from spec filename)'\n )\n .option(\n '--skip-install',\n 'Skip automatic pnpm install (useful in CI or when using a different package manager)'\n )\n .action(async (directory: string, options: LaunchProOptions) => {\n const homeDir = os.homedir();\n const targetDir =\n directory !== '.'\n ? path.resolve(process.cwd(), directory)\n : options.name\n ? path.resolve(process.cwd(), options.name)\n : process.cwd(); // last resort ā same as old behaviour, only hit if neither arg nor --name\n\n // Warn (don't block) when scaffolding outside home dir ā unusual for a user-facing CLI\n if (!targetDir.startsWith(homeDir + path.sep) && targetDir !== homeDir) {\n console.warn(chalk.yellow(`ā ļø Scaffolding outside your home directory: ${targetDir}`));\n }\n\n await launch(targetDir, options);\n });\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((err: unknown) => {\n console.error(chalk.red('\\nā Launch failed:'), err);\n process.exit(1);\n});\n","/**\n * scaffold.ts ā Pro-specific scaffold mutation helpers\n *\n * Extracted from src/index.ts so these pure filesystem transforms can be\n * imported and tested independently (no __dirname, no fs.copy, no chalk).\n *\n * Every function here:\n * - Accepts a targetDir and operates on real files\n * - Is async/await throughout\n * - Has no side effects beyond writing to targetDir\n * - Is fully unit-testable with a real temp filesystem\n */\n\nimport fs from 'fs-extra';\nimport yaml from 'js-yaml';\nimport path from 'path';\nimport { PRO_VERSIONS, OSS_VERSIONS } from './generated/workspace-versions.js';\n\n// ---------------------------------------------------------------------------\n// Package.json mutations\n// ---------------------------------------------------------------------------\n\n/**\n * Inject Pro runtime dependencies and scripts into an existing package.json.\n * Enforces OSS version floors and adds Pro-specific dev scripts (prebuild/predev).\n * Safe to call multiple times ā idempotent for dep keys.\n */\nexport async function addProDepsToPackageJson(targetDir: string): Promise<void> {\n const pkgPath = path.join(targetDir, 'package.json');\n const content = await fs.readFile(pkgPath, 'utf-8');\n const pkg = JSON.parse(content) as Record<string, unknown>;\n\n const dependencies: Record<string, string> =\n typeof pkg.dependencies === 'object' && pkg.dependencies !== null\n ? { ...(pkg.dependencies as Record<string, string>) }\n : {};\n const devDependencies: Record<string, string> =\n typeof pkg.devDependencies === 'object' && pkg.devDependencies !== null\n ? { ...(pkg.devDependencies as Record<string, string>) }\n : {};\n const scripts: Record<string, string> =\n typeof pkg.scripts === 'object' && pkg.scripts !== null\n ? { ...(pkg.scripts as Record<string, string>) }\n : {};\n\n // Enforce OSS version floors ā replace workspace:* refs AND upgrade any stale version\n // pinned by the OSS scaffold template to our tested minimum.\n // OSS_VERSIONS = \"minimum tested versions\" ā we always want them to win.\n for (const [pkgName, pinnedVersion] of Object.entries(OSS_VERSIONS)) {\n if (pkgName in dependencies) {\n dependencies[pkgName] = pinnedVersion;\n }\n if (pkgName in devDependencies) {\n devDependencies[pkgName] = pinnedVersion;\n }\n }\n\n // Pro runtime dependencies ā exact versions from workspace at build time\n Object.assign(dependencies, {\n '@stackwright-pro/display-components': PRO_VERSIONS['@stackwright-pro/display-components'],\n '@stackwright-pro/mcp': PRO_VERSIONS['@stackwright-pro/mcp'],\n '@stackwright-pro/otters': PRO_VERSIONS['@stackwright-pro/otters'],\n '@stackwright-pro/openapi': PRO_VERSIONS['@stackwright-pro/openapi'],\n '@stackwright-pro/auth': PRO_VERSIONS['@stackwright-pro/auth'],\n '@stackwright-pro/auth-nextjs': PRO_VERSIONS['@stackwright-pro/auth-nextjs'],\n '@stackwright-pro/pulse': PRO_VERSIONS['@stackwright-pro/pulse'],\n '@stackwright-pro/workflow-components': PRO_VERSIONS['@stackwright-pro/workflow-components'],\n '@stackwright-pro/workflow': PRO_VERSIONS['@stackwright-pro/workflow'],\n '@stackwright/build-scripts': OSS_VERSIONS['@stackwright/build-scripts'],\n zod: '^4.0.0',\n });\n\n // Pro dev dependencies\n Object.assign(devDependencies, {\n '@stoplight/prism-cli': '^5.15.10',\n });\n\n // Role-based dev scripts\n Object.assign(scripts, {\n 'dev:admin': 'MOCK_USER=admin next dev',\n 'dev:analyst': 'MOCK_USER=analyst next dev',\n 'dev:viewer': 'MOCK_USER=viewer next dev',\n prebuild: 'node scripts/prebuild.js',\n predev: 'node scripts/prebuild.js',\n });\n\n pkg.dependencies = dependencies;\n pkg.devDependencies = devDependencies;\n pkg.scripts = scripts;\n\n await fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n}\n\n// ---------------------------------------------------------------------------\n// stackwright.yml mutations\n// ---------------------------------------------------------------------------\n\n/**\n * Add an empty `auth:` key to an existing stackwright.yml.\n * The auth key is the hook point for Pro RBAC configuration.\n */\nexport async function addAuthToStackwrightYml(targetDir: string): Promise<void> {\n const ymlPath = path.join(targetDir, 'stackwright.yml');\n const content = await fs.readFile(ymlPath, 'utf-8');\n const config = yaml.load(content, { schema: yaml.CORE_SCHEMA }) as Record<string, unknown>;\n\n config.auth = {};\n\n await fs.writeFile(ymlPath, yaml.dump(config, { lineWidth: 120 }));\n}\n\n/**\n * Append an OpenAPI integration entry to the `integrations:` array in stackwright.yml.\n * Creates the array if it does not exist. Safe to call multiple times for different specs.\n */\nexport async function addIntegrationToStackwrightYml(\n targetDir: string,\n specName: string,\n specFilename: string,\n mockUrl?: string\n): Promise<void> {\n const ymlPath = path.join(targetDir, 'stackwright.yml');\n const content = await fs.readFile(ymlPath, 'utf-8');\n const config = yaml.load(content, { schema: yaml.CORE_SCHEMA }) as Record<string, unknown>;\n\n const integration: Record<string, unknown> = {\n type: 'openapi',\n name: specName,\n spec: `./specs/${specFilename}`,\n collections: [],\n };\n\n if (mockUrl) {\n integration.mockUrl = mockUrl;\n }\n\n config.integrations = [\n ...(Array.isArray(config.integrations) ? config.integrations : []),\n integration,\n ];\n\n await fs.writeFile(ymlPath, yaml.dump(config, { lineWidth: 120 }));\n}\n\n// ---------------------------------------------------------------------------\n// .code-puppy/ workspace config scaffolding\n// ---------------------------------------------------------------------------\n\n/**\n * Create (or idempotently update) the .code-puppy/ workspace directory.\n *\n * Creates:\n * - .code-puppy/config.json { projectOnly: true } (merges with existing)\n * - .code-puppy/mcp_servers.json stackwright-pro-mcp stdio server entry\n * - .code-puppy/agents/ empty directory for future agent configs\n *\n * Symlink guard: refuses to write if any of the managed paths is a symlink,\n * consistent with raft/src/lib.ts ensureWorkspaceConfig.\n */\nexport async function scaffoldWorkspaceConfig(targetDir: string): Promise<void> {\n const workspaceDir = path.join(targetDir, '.code-puppy');\n await fs.ensureDir(workspaceDir);\n // Symlink guard ā consistent with raft/src/lib.ts ensureWorkspaceConfig\n const workspaceStats = await fs.lstat(workspaceDir);\n if (workspaceStats.isSymbolicLink()) {\n throw new Error('.code-puppy/ is a symlink ā refusing to write. Check for tampering.');\n }\n\n const agentsDir = path.join(workspaceDir, 'agents');\n await fs.ensureDir(agentsDir);\n if (await fs.pathExists(agentsDir)) {\n const agentsStats = await fs.lstat(agentsDir);\n if (agentsStats.isSymbolicLink()) {\n throw new Error('.code-puppy/agents is a symlink ā refusing to write. Check for tampering.');\n }\n }\n\n // config.json ā projectOnly: true\n // Merge with existing so we don't clobber user customizations on re-scaffold\n const configPath = path.join(workspaceDir, 'config.json');\n let existingConfig: Record<string, unknown> = {};\n if (fs.existsSync(configPath)) {\n try {\n existingConfig = JSON.parse(await fs.readFile(configPath, 'utf-8')) as Record<\n string,\n unknown\n >;\n } catch {\n // Malformed ā start fresh\n }\n }\n if (await fs.pathExists(configPath)) {\n const configStats = await fs.lstat(configPath);\n if (configStats.isSymbolicLink()) {\n throw new Error(\n '.code-puppy/config.json is a symlink ā refusing to write. Check for tampering.'\n );\n }\n }\n await fs.writeFile(\n configPath,\n JSON.stringify({ ...existingConfig, projectOnly: true }, null, 2) + '\\n',\n 'utf-8'\n );\n\n // mcp_servers.json ā pnpm-based stackwright-pro-mcp server\n // ${PROJECT_ROOT} is a literal ā raft-puppy expands it at runtime to the\n // directory containing .code-puppy/ (walk-up discovery root).\n const mcpServersPath = path.join(workspaceDir, 'mcp_servers.json');\n if (await fs.pathExists(mcpServersPath)) {\n const mcpStats = await fs.lstat(mcpServersPath);\n if (mcpStats.isSymbolicLink()) {\n throw new Error(\n '.code-puppy/mcp_servers.json is a symlink ā refusing to write. Check for tampering.'\n );\n }\n }\n if (!fs.existsSync(mcpServersPath)) {\n const mcpConfig = {\n mcp_servers: {\n 'stackwright-pro-mcp': {\n type: 'stdio',\n command: 'pnpm',\n args: ['exec', 'stackwright-pro-mcp'],\n enabled: true,\n cwd: '${PROJECT_ROOT}',\n },\n },\n };\n await fs.writeFile(mcpServersPath, JSON.stringify(mcpConfig, null, 2) + '\\n', 'utf-8');\n }\n}\n\n// ---------------------------------------------------------------------------\n// README generation\n// ---------------------------------------------------------------------------\n\nexport interface GenerateReadmeOptions {\n projectName: string;\n hasSpec: boolean;\n specName?: string;\n specFilename?: string;\n hasOtters: boolean;\n hasMock: boolean;\n}\n\n/**\n * Generate a project README.md with conditional sections based on which\n * Pro features are enabled (spec, mock server, otter raft).\n */\nexport function generateReadme(options: GenerateReadmeOptions): string {\n const { projectName, hasSpec, specName, specFilename, hasOtters, hasMock } = options;\n\n // Build API Integration section if spec is present\n const apiIntegrationSection = hasSpec\n ? `## š” API Integration\\n\\nYour OpenAPI spec was copied to \\`specs/${specFilename}\\` and wired up in \\`stackwright.yml\\`.\\n\\n**What gets generated:**\\n\\n\\`\\`\\`typescript\\n// src/generated/${specName}/schemas.ts\\nexport const EquipmentSchema = z.object({\\n id: z.string(),\\n name: z.string(),\\n status: z.enum(['operational', 'maintenance', 'retired']),\\n // ... Zod validation for runtime safety\\n});\\n\\n// src/generated/${specName}/types.ts\\nexport type Equipment = z.infer<typeof EquipmentSchema>;\\n\\n// src/generated/${specName}/client.ts\\nexport class ${(specName ?? 'api').charAt(0).toUpperCase() + (specName ?? 'api').slice(1)}Client {\\n async getEquipment(id: string): Promise<Equipment> {\\n // Auto-wired with auth, validation, error handling\\n }\\n}\\n\\`\\`\\`\\n\\n**How it works:**\\n1. The \\`predev\\` script in \\`package.json\\` runs \\`prebuild.js\\` before every \\`pnpm dev\\`\\n2. Prebuild reads your spec and generates type-safe code\\n3. You import and use it:\\n\\n\\`\\`\\`typescript\\nimport { ${(specName ?? 'api').charAt(0).toUpperCase() + (specName ?? 'api').slice(1)}Client } from '@/generated/${specName}/client';\\nimport type { Equipment } from '@/generated/${specName}/types';\\n\\nconst client = new ${(specName ?? 'api').charAt(0).toUpperCase() + (specName ?? 'api').slice(1)}Client();\\nconst gear: Equipment = await client.getEquipment('123');\\n\\`\\`\\`\\n\\nNo manual typing. No drift. No runtime surprises.\\n\\n`\n : '';\n\n // Build mock server section if enabled\n const mockSection = hasMock\n ? `## š Mock Server\\n\\nPrism mock server is configured to serve your API at **http://localhost:4010**.\\n\\n\\`\\`\\`bash\\npnpm dev:mock # Starts Prism + Next.js together\\n\\`\\`\\`\\n\\nThis starts:\\n1. Prism mock server on port 4010 (serves your OpenAPI spec)\\n2. Next.js dev server on port 3000\\n\\nThe generated API client is automatically configured to use the mock server.\\n\\n`\n : '';\n\n // Build AI Agents section if otters are present\n const aiAgentsSection = hasOtters\n ? `## 𦦠AI Agents (The Otter Raft)\\n\\nYour project includes **SIX specialized AI agents** in \\`node_modules/@stackwright-pro/otters/\\`:\\n\\n- \\`stackwright-pro-foreman-otter\\` - Master coordinator that orchestrates all specialist otters\\n- \\`stackwright-pro-api-otter\\` - Discovers entities from OpenAPI specs\\n- \\`stackwright-pro-auth-otter\\` - Configures CAC/OIDC auth, RBAC rules, and audit middleware\\n- \\`stackwright-pro-data-otter\\` - Configures endpoint filters & ISR revalidation\\n- \\`stackwright-pro-page-otter\\` - Generates pages auto-wired with data, theme, and auth\\n- \\`stackwright-pro-dashboard-otter\\` - Builds live data dashboards\\n\\n**Start the otter raft:**\\n\\n\\`\\`\\`bash\\nnpx @stackwright-pro/raft\\n\\`\\`\\`\\n\\nThe raft verifies otter integrity, writes project context, and spawns code-puppy in foreman mode. The foreman asks questions about your brand, auth, and data preferences, then coordinates specialist otters to build your app. All state lives in \\`.stackwright/\\` ā interrupt and resume anytime.\\n\\n**Example session prompt:**\\n\\n\"Build me a logistics dashboard from our OpenAPI spec. Connect to /equipment and /supplies endpoints.\"\\n\\n`\n : '';\n\n return `# ${projectName}\\n\\nA Stackwright Pro application with role-based auth, OpenAPI integration, and intelligent AI agents.\\n\\n## š Quick Start\\n\\n\\`\\`\\`bash\\n# Start development server\\npnpm dev\\n\\n# Open your browser\\nopen http://localhost:3000\\n\\`\\`\\`\\n\\n## š„ Role-Based Development\\n\\nStackwright Pro includes **mock authentication** for local development with three pre-configured roles:\\n\\n\\`\\`\\`bash\\npnpm dev:admin # Full permissions (*)\\npnpm dev:analyst # Read & write data\\npnpm dev:viewer # Read-only access\\n\\`\\`\\`\\n\\n**How it works:**\\n- Each script sets the \\`MOCK_USER\\` environment variable\\n- \\`lib/mock-auth.ts\\` intercepts requests and injects the appropriate user context\\n- Your pages & API routes respect the RBAC rules in \\`stackwright.yml\\`\\n- No backend required for testing auth flows! š\\n\\n**Pro tip:** Test your UI for all three roles to ensure proper permissions enforcement.\\n\\n${mockSection}## š Project Structure\\n\\n\\`\\`\\`\\n.\\nāāā pages/\\nā āāā _app.tsx # Pro version with AuthProvider + shadcn\\nā āāā index.tsx # Home page (auto-generated by Stackwright)\\nā āāā about/\\nā ā āāā content.yml # Page content in YAML\\nā āāā ...\\nāāā lib/\\nā āāā mock-auth.ts # Dev-only auth mocking (no backend needed)\\nāāā scripts/\\nā āāā prebuild.js # Auto-generates code from OpenAPI specs\\nāāā specs/ # OpenAPI spec files (if --spec was used)\\nāāā src/\\nā āāā generated/ # Auto-generated types & clients\\nā āāā {specName}/\\nā āāā schemas.ts # Zod schemas for runtime validation\\nā āāā types.ts # TypeScript types\\nā āāā client.ts # API client with auth\\nā āāā provider.ts # CollectionProvider for Stackwright\\nāāā .stackwright/\\nā āāā otters/ # AI agent configs (4 specialized otters)\\nāāā stackwright.yml # Theme, auth, API integrations\\nāāā package.json\\n\\`\\`\\`\\n\\n**Key Files:**\\n- \\`pages/_app.tsx\\` - Wraps your app with \\`AuthProvider\\` for RBAC\\n- \\`stackwright.yml\\` - Single source of truth for theme, auth roles, and API wiring\\n- \\`lib/mock-auth.ts\\` - Mocks CAC/PIV headers locally so you can test auth flows\\n- \\`scripts/prebuild.js\\` - Runs before dev/build to generate types from your OpenAPI spec\\n\\n## š Adding Pages\\n\\nStackwright uses **YAML for content**, so you never touch JSX unless you want to.\\n\\n**Example:** Create \\`pages/about/content.yml\\`:\\n\\n\\`\\`\\`yaml\\ntitle: About Us\\ndescription: Learn more about our mission\\n\\nsections:\\n - type: main\\n heading: Who We Are\\n body: |\\n We build mission-critical logistics systems for the Marine Corps.\\n\\n - type: feature_list\\n title: Our Capabilities\\n features:\\n - icon: Security\\n title: Zero Trust\\n description: PKI-based auth with CAC/PIV\\n - icon: Api\\n title: Real-time Data\\n description: OpenAPI-backed, Zod-validated\\n\\`\\`\\`\\n\\nThat's it. Navigate to \\`/about\\` and it just works. No routing config, no React components.\\n\\n${apiIntegrationSection}## šØ Customizing Theme\\n\\nEdit \\`stackwright.yml\\` to change colors, fonts, spacing ā applies everywhere instantly.\\n\\n\\`\\`\\`yaml\\ntheme:\\n id: my-theme\\n name: My Custom Theme\\n colors:\\n primary: \"#C41E3A\" # Marine Corps red\\n background: \"#FFFFFF\"\\n text: \"#1A1A1A\"\\n accent: \"#FFD700\" # Gold\\n typography:\\n fontFamily: \"'Inter', sans-serif\"\\n h1Size: \"2.5rem\"\\n spacing:\\n unit: 8\\n\\`\\`\\`\\n\\nNo CSS files. No theme provider boilerplate. Just YAML. Stackwright handles the rest.\\n\\n## š Auth Configuration\\n\\nStackwright Pro comes with **3 pre-configured roles** in \\`stackwright.yml\\`:\\n\\n\\`\\`\\`yaml\\nauth:\\n roles:\\n - name: ADMIN\\n permissions: ['*'] # Full access\\n - name: ANALYST \\n permissions: ['data:read', 'data:write'] # Read/write data\\n - name: VIEWER\\n permissions: ['data:read'] # Read-only\\n\\`\\`\\`\\n\\n**Gate content in your YAML:**\\n\\n\\`\\`\\`yaml\\nsections:\\n - type: button\\n label: Delete Equipment\\n action: /api/equipment/delete\\n auth:\\n required_roles: [ADMIN]\\n fallback: hide # Options: hide, disable, show_message\\n\\`\\`\\`\\n\\nOnly admins see the button. Analysts and viewers? Button doesn't exist in the DOM.\\n\\n**Route protection:**\\n\\n\\`\\`\\`yaml\\nauth:\\n protected_routes:\\n - path: /admin/*\\n roles: [ADMIN]\\n - path: /equipment/* \\n roles: [ANALYST, ADMIN]\\n public_routes:\\n - /\\n - /about\\n\\`\\`\\`\\n\\nNo middleware to write. No useAuth hooks to remember. RBAC is declarative.\\n\\n${aiAgentsSection}## š Learn More\\n\\n- **Stackwright Docs:** [https://stackwright.dev](https://stackwright.dev)\\n- **OSS Repo:** [https://github.com/Per-Aspera-LLC/stackwright](https://github.com/Per-Aspera-LLC/stackwright)\\n- **Pro Repo:** [https://github.com/Per-Aspera-LLC/stackwright-pro](https://github.com/Per-Aspera-LLC/stackwright-pro)\\n\\n**Questions?** File an issue or ping us in the discussions. We're here to help you ship faster.\\n`;\n}\n","// AUTO-GENERATED ā do not edit manually.\n// Run `pnpm sync-versions` or `pnpm build` to regenerate.\n//\n// PRO_VERSIONS: exact versions of @stackwright-pro/* packages in this workspace.\n// OSS_VERSIONS: minimum tested versions of @stackwright/* OSS packages (caret range).\n\n/**\n * Exact versions of every @stackwright-pro/* package currently in the workspace.\n * Used by launch-stackwright-pro and scaffold-hooks to pin deps in scaffolded projects.\n * Updated automatically on every build ā never edit this file by hand.\n */\nexport const PRO_VERSIONS = {\n '@stackwright-pro/auth': '0.2.0-alpha.11',\n '@stackwright-pro/auth-nextjs': '0.2.0-alpha.13',\n '@stackwright-pro/display-components': '0.2.0-alpha.9',\n '@stackwright-pro/mcp': '0.2.0-alpha.49',\n '@stackwright-pro/openapi': '0.3.0-alpha.23',\n '@stackwright-pro/otters': '1.0.0-alpha.38',\n '@stackwright-pro/pulse': '0.3.0-alpha.15',\n '@stackwright-pro/workflow': '0.1.0-alpha.15',\n '@stackwright-pro/workflow-components': '0.1.0-alpha.17',\n} as const satisfies Record<string, string>;\n\n/**\n * Minimum tested versions of @stackwright/* OSS packages.\n * Caret ranges anchored to the last version resolved in pnpm-lock.yaml.\n * Updated automatically on every build.\n */\nexport const OSS_VERSIONS = {\n '@stackwright/build-scripts': '^0.7.2',\n '@stackwright/core': '^0.8.5',\n '@stackwright/icons': '^0.5.2',\n '@stackwright/mcp': '^0.4.6',\n '@stackwright/nextjs': '^0.5.4',\n '@stackwright/otters': '^0.2.0',\n '@stackwright/ui-shadcn': '^0.1.3',\n} as const satisfies Record<string, string>;\n"],"mappings":"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","names":["exports","module","import_path","import_fs_extra","path","fs","yaml","path","fs","chalk","os"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/index.ts","../src/scaffold.ts","../src/generated/workspace-versions.ts"],"sourcesContent":["{\n \"name\": \"@stackwright-pro/launch-stackwright-pro\",\n \"version\": \"0.4.0-alpha.84\",\n \"description\": \"Launch a new Stackwright Pro project with OpenAPI integration, auth, and the otter raft\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Per-Aspera-LLC/stackwright-pro\"\n },\n \"keywords\": [\n \"stackwright\",\n \"stackwright-pro\",\n \"scaffolding\",\n \"openapi\",\n \"government\",\n \"hackathon\"\n ],\n \"files\": [\n \"dist\",\n \"templates\"\n ],\n \"bin\": {\n \"launch-stackwright-pro\": \"dist/index.js\"\n },\n \"scripts\": {\n \"build\": \"node ../../scripts/sync-versions.mjs && tsup\",\n \"sync-versions\": \"node ../../scripts/sync-versions.mjs\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:coverage\": \"vitest run --coverage\"\n },\n \"dependencies\": {\n \"@stackwright-pro/auth\": \"workspace:*\",\n \"@stackwright-pro/auth-nextjs\": \"workspace:*\",\n \"@stackwright-pro/mcp\": \"workspace:*\",\n \"@stackwright-pro/openapi\": \"workspace:*\",\n \"@stackwright-pro/otters\": \"workspace:*\",\n \"@stackwright-pro/scaffold-hooks\": \"workspace:*\",\n \"@stackwright/cli\": \"^0.8.6\",\n \"@stackwright/scaffold-core\": \"^0.3.1\",\n \"chalk\": \"^5.6.2\",\n \"commander\": \"^15.0.0\",\n \"fs-extra\": \"^11.3.5\",\n \"js-yaml\": \"^4.1.0\"\n },\n \"devDependencies\": {\n \"@types/fs-extra\": \"^11.0\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"catalog:\",\n \"typescript\": \"catalog:\",\n \"tsup\": \"catalog:\",\n \"vitest\": \"catalog:\"\n }\n}\n","import { Command } from 'commander';\nimport path from 'path';\nimport os from 'os';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\n\nimport { scaffold, ScaffoldOptions } from '@stackwright/cli';\nimport { runScaffoldHooks } from '@stackwright/scaffold-core';\nimport { registerProScaffoldHooks } from '@stackwright-pro/scaffold-hooks';\nimport {\n addProDepsToPackageJson,\n addAuthToStackwrightYml,\n scaffoldWorkspaceConfig,\n addIntegrationToStackwrightYml,\n generateReadme,\n} from './scaffold.js';\n// Register Pro hooks (adds deps, MCP config, etc.)\n// Must be called before scaffold() to ensure hooks run in the CLI's scaffold-core context\nregisterProScaffoldHooks();\n\nconst { version } = require('../package.json') as { version: string };\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface LaunchProOptions {\n name?: string;\n title?: string;\n theme?: string;\n force?: boolean;\n skipOtters?: boolean;\n skipInstall?: boolean;\n yes?: boolean;\n spec?: string[];\n specName?: string;\n mock?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Template copying (Pro-specific - hooks can't handle these)\n// ---------------------------------------------------------------------------\n\nasync function copyProTemplate(templateName: string, destPath: string): Promise<void> {\n const src = path.resolve(__dirname, '..', 'templates', 'pro', templateName);\n await fs.copy(src, destPath);\n}\n\n// ---------------------------------------------------------------------------\n// Spec handling (Pro-specific - hooks can't handle these)\n// ---------------------------------------------------------------------------\n\nasync function handleSpec(\n targetDir: string,\n specPath: string,\n specName?: string\n): Promise<{ specFilename: string; derivedName: string }> {\n const resolvedSpec = path.resolve(specPath);\n\n if (!fs.existsSync(resolvedSpec)) {\n throw new Error(`Spec file not found: ${resolvedSpec}`);\n }\n\n const specFilename = path.basename(resolvedSpec);\n const derivedName = specName || path.basename(specFilename, path.extname(specFilename));\n\n const specsDir = path.join(targetDir, 'specs');\n await fs.ensureDir(specsDir);\n await fs.copy(resolvedSpec, path.join(specsDir, specFilename));\n\n return { specFilename, derivedName };\n}\n\n// ---------------------------------------------------------------------------\n// Main launch flow\n// ---------------------------------------------------------------------------\n\nasync function launch(targetDir: string, options: LaunchProOptions): Promise<void> {\n const dirName = path.basename(targetDir);\n\n console.log(chalk.cyan.bold('\\nš¢ Launching Stackwright Pro...\\n'));\n\n // ------------------------------------------------------------------\n // 1. Scaffold base OSS project via @stackwright/cli\n // Hooks auto-handle: Pro deps, MCP config, role-based scripts\n // ------------------------------------------------------------------\n\n const scaffoldOpts: ScaffoldOptions = {\n name: options.name || dirName,\n standalone: true, // prevents `workspace:*` refs when CLI runs inside the Pro monorepo\n ...(options.title !== undefined && { title: options.title }),\n ...(options.theme !== undefined && { theme: options.theme }),\n ...(options.force !== undefined && { force: options.force }),\n ...(options.yes !== undefined && { noInteractive: options.yes }),\n };\n\n await scaffold(targetDir, scaffoldOpts);\n console.log(chalk.green('ā
Base project scaffolded (hooks added Pro deps + MCP config)'));\n\n // ------------------------------------------------------------------\n // 1b. Run pnpm install ā citizen devs shouldn't need to know this step exists\n // ------------------------------------------------------------------\n\n // Patch Pro packages directly into package.json before install.\n // This bypasses the scaffold hooks system (which has a known version-resolution\n // issue) and guarantees pro deps land regardless of hook execution order.\n await addProDepsToPackageJson(targetDir);\n console.log(chalk.green('𦦠Pro packages added to package.json'));\n\n // Verify package.json has Pro deps before installing\n const verifyPkg = JSON.parse(\n await fs.readFile(path.join(targetDir, 'package.json'), 'utf-8')\n ) as Record<string, unknown>;\n const proDepCount = Object.keys(\n typeof verifyPkg.dependencies === 'object' && verifyPkg.dependencies !== null\n ? (verifyPkg.dependencies as Record<string, string>)\n : {}\n ).filter((k) => k.startsWith('@stackwright-pro')).length;\n console.log(chalk.dim(` ā package.json verified: ${proDepCount} @stackwright-pro/* deps ready`));\n\n console.log(chalk.cyan('\\nš¦ Installing dependencies (this takes a moment)...'));\n if (!options.skipInstall) {\n try {\n execSync('pnpm install --ignore-workspace', {\n cwd: targetDir,\n stdio: 'inherit',\n timeout: 120_000,\n });\n console.log(chalk.green('ā
Dependencies installed'));\n } catch (err: unknown) {\n const isTimeout =\n err instanceof Error &&\n (err.message.includes('ETIMEDOUT') || err.message.includes('timeout'));\n console.error(\n chalk.red('\\nā pnpm install failed. Auth and Pro packages are NOT installed.')\n );\n console.error(\n chalk.red(' Your project is in an incomplete state ā do NOT run or deploy it.')\n );\n if (isTimeout) {\n console.error(\n chalk.yellow(' The install timed out (>2 min). Check your network connection.')\n );\n }\n console.error(\n chalk.yellow(` Fix the error above, then run: pnpm install --ignore-workspace`)\n );\n process.exit(1);\n }\n } else {\n console.log(chalk.dim('ā¹ļø Skipping install (--skip-install). Run: pnpm install'));\n }\n\n // Fire postInstall hooks now that install has run\n const dependencyMode: 'workspace' | 'standalone' = 'standalone';\n await runScaffoldHooks('postInstall', {\n targetDir,\n projectName: options.name || path.basename(targetDir),\n siteTitle: options.title || options.name || path.basename(targetDir),\n themeId: options.theme || 'corporate',\n packageJson: {},\n dependencyMode,\n });\n\n // ------------------------------------------------------------------\n // 2. Copy Pro templates (hooks can't handle these)\n // ------------------------------------------------------------------\n\n // Replace _app.tsx with Pro version (AuthProvider, shadcn, etc.)\n await copyProTemplate('_app.tsx', path.join(targetDir, 'pages', '_app.tsx'));\n\n // Add root content.yml for the home page\n await copyProTemplate('content.yml', path.join(targetDir, 'pages', 'content.yml'));\n\n // Replace next.config.js with Pro version (transpile pro pkgs)\n await copyProTemplate('next.config.js', path.join(targetDir, 'next.config.js'));\n\n // Add lib/mock-auth.ts\n await fs.ensureDir(path.join(targetDir, 'lib'));\n await copyProTemplate('mock-auth.ts', path.join(targetDir, 'lib', 'mock-auth.ts'));\n\n // Add yaml.d.ts for TypeScript support\n await copyProTemplate('yaml.d.ts', path.join(targetDir, 'yaml.d.ts'));\n\n // Add scripts/prebuild.js + scripts/pro-content-plugin.js\n await fs.ensureDir(path.join(targetDir, 'scripts'));\n await copyProTemplate('prebuild.js', path.join(targetDir, 'scripts', 'prebuild.js'));\n await copyProTemplate(\n 'scripts/pro-content-plugin.js',\n path.join(targetDir, 'scripts', 'pro-content-plugin.js')\n );\n\n console.log(chalk.green('š Auth integration added (RBAC with 3 roles)'));\n\n // ------------------------------------------------------------------\n // 3. Add auth section to stackwright.yml\n // ------------------------------------------------------------------\n\n await addAuthToStackwrightYml(targetDir);\n\n // ------------------------------------------------------------------\n // 4. Handle --spec if provided\n // ------------------------------------------------------------------\n\n let specInfo: { specFilename: string; derivedName: string } | null = null;\n const MOCK_URL = 'http://localhost:4010';\n\n if (options.spec && options.spec.length > 0) {\n for (const specPath of options.spec) {\n specInfo = await handleSpec(targetDir, specPath, options.specName);\n await addIntegrationToStackwrightYml(\n targetDir,\n specInfo.derivedName,\n specInfo.specFilename,\n options.mock ? MOCK_URL : undefined\n );\n }\n console.log(chalk.green(`š” ${options.spec.length} OpenAPI integration(s) wired up`));\n if (options.mock) {\n console.log(chalk.green('š Prism mock server configured'));\n }\n } else if (options.mock) {\n // --mock without --spec: use sample Petstore spec for demo\n console.log(\n chalk.yellow(\n 'ā ļø No spec provided with --mock. Using sample Petstore spec for demo. Replace with your API spec.'\n )\n );\n\n const specsDir = path.join(targetDir, 'specs');\n await fs.ensureDir(specsDir);\n await copyProTemplate('petstore.yaml', path.join(specsDir, 'petstore.yaml'));\n\n specInfo = { specFilename: 'petstore.yaml', derivedName: 'petstore' };\n\n await addIntegrationToStackwrightYml(\n targetDir,\n specInfo.derivedName,\n specInfo.specFilename,\n MOCK_URL\n );\n console.log(chalk.green('š” Sample Petstore spec wired up'));\n console.log(chalk.green('š Prism mock server configured'));\n }\n\n // ------------------------------------------------------------------\n // 5. Generate README\n // ------------------------------------------------------------------\n\n const readmeContent = generateReadme({\n projectName: options.name || dirName,\n hasSpec: !!specInfo,\n ...(specInfo?.derivedName !== undefined && { specName: specInfo.derivedName }),\n ...(specInfo?.specFilename !== undefined && { specFilename: specInfo.specFilename }),\n hasOtters: !options.skipOtters,\n hasMock: !!options.mock,\n });\n\n await fs.writeFile(path.join(targetDir, 'README.md'), readmeContent);\n console.log(chalk.green('š README.md created'));\n\n // ------------------------------------------------------------------\n // 5b. Write init-context.json for raft launcher\n // ------------------------------------------------------------------\n\n const initContext: Record<string, unknown> = {\n projectRoot: targetDir,\n projectName: options.name || dirName,\n generatedBy: 'launch-stackwright-pro',\n version: '1.0',\n };\n\n if (specInfo) {\n initContext.specPath = `specs/${specInfo.specFilename}`;\n initContext.specName = specInfo.derivedName;\n }\n\n initContext.theme = options.theme || 'corporate';\n\n const stackwrightDir = path.join(targetDir, '.stackwright');\n await fs.ensureDir(stackwrightDir);\n await fs.writeFile(\n path.join(stackwrightDir, 'init-context.json'),\n JSON.stringify(initContext, null, 2) + '\\n',\n 'utf-8'\n );\n\n // ------------------------------------------------------------------\n // 5c. Scaffold .code_puppy/ workspace directory\n // Creates config.json (projectOnly: true), mcp_servers.json,\n // and agents/ dir. raft-puppy discovers this via walk-up from cwd\n // on first startup ā no CLI flags needed.\n // ------------------------------------------------------------------\n\n await scaffoldWorkspaceConfig(targetDir);\n console.log(chalk.green('š¾ .code_puppy/ workspace scaffolded (projectOnly: true)'));\n\n // ------------------------------------------------------------------\n // 6. Print next steps\n // ------------------------------------------------------------------\n\n const relDir = path.relative(process.cwd(), targetDir) || '.';\n\n console.log(chalk.cyan.bold(\"\\nš All set! Here's what to do next:\\n\"));\n console.log(chalk.white(` 1. cd ${relDir}`));\n console.log(chalk.white(' 2. npx @stackwright-pro/raft'));\n console.log(chalk.dim(' (use --verbose for troubleshooting)'));\n\n if (specInfo) {\n console.log(chalk.cyan(`\\nš” Your API spec was copied to specs/${specInfo.specFilename}`));\n console.log(chalk.dim(' The prebuild will generate types & client on first `pnpm dev`.'));\n }\n\n if (options.mock) {\n console.log(chalk.cyan('\\nš Run with mock server:'));\n console.log(chalk.white(' pnpm dev:mock # Starts Prism + Next.js'));\n }\n\n if (!options.skipOtters) {\n console.log(chalk.cyan.bold('\\n𦦠The otter raft is ready to build your site!'));\n console.log(chalk.dim(' Run the command above to get started.\\n'));\n }\n}\n\n// ---------------------------------------------------------------------------\n// CLI definition\n// ---------------------------------------------------------------------------\n\nasync function main(): Promise<void> {\n const program = new Command();\n\n program\n .name('launch-stackwright-pro')\n .description('š¢ Launch a new Stackwright Pro project with auth, OpenAPI, and the otter raft')\n .version(version)\n .argument('[directory]', 'Project directory', '.')\n .option('--name <name>', 'Project name (used in package.json)')\n .option('--title <title>', 'Site title shown in the app bar and browser tab')\n .option('--theme <themeId>', 'Theme ID (e.g., corporate, creative, minimal)')\n .option('--force', 'Launch even if the target directory is not empty')\n .option('--skip-otters', 'Skip copying otter raft configs')\n .option('-y, --yes', 'Skip all prompts, use defaults')\n .option('--mock', 'Configure Prism mock server for API development (runs on port 4010)')\n .option(\n '--spec <paths...>',\n 'Paths to OpenAPI specs (YAML or JSON) ā copies into project and wires up integrations (can be specified multiple times)'\n )\n .option(\n '--spec-name <name>',\n 'Name for the API integration (default: derived from spec filename)'\n )\n .option(\n '--skip-install',\n 'Skip automatic pnpm install (useful in CI or when using a different package manager)'\n )\n .action(async (directory: string, options: LaunchProOptions) => {\n const homeDir = os.homedir();\n const targetDir =\n directory !== '.'\n ? path.resolve(process.cwd(), directory)\n : options.name\n ? path.resolve(process.cwd(), options.name)\n : process.cwd(); // last resort ā same as old behaviour, only hit if neither arg nor --name\n\n // Warn (don't block) when scaffolding outside home dir ā unusual for a user-facing CLI\n if (!targetDir.startsWith(homeDir + path.sep) && targetDir !== homeDir) {\n console.warn(chalk.yellow(`ā ļø Scaffolding outside your home directory: ${targetDir}`));\n }\n\n await launch(targetDir, options);\n });\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((err: unknown) => {\n console.error(chalk.red('\\nā Launch failed:'), err);\n process.exit(1);\n});\n","/**\n * scaffold.ts ā Pro-specific scaffold mutation helpers\n *\n * Extracted from src/index.ts so these pure filesystem transforms can be\n * imported and tested independently (no __dirname, no fs.copy, no chalk).\n *\n * Every function here:\n * - Accepts a targetDir and operates on real files\n * - Is async/await throughout\n * - Has no side effects beyond writing to targetDir\n * - Is fully unit-testable with a real temp filesystem\n */\n\nimport fs from 'fs-extra';\nimport yaml from 'js-yaml';\nimport path from 'path';\nimport { PRO_VERSIONS, OSS_VERSIONS } from './generated/workspace-versions.js';\n\n// ---------------------------------------------------------------------------\n// Package.json mutations\n// ---------------------------------------------------------------------------\n\n/**\n * Inject Pro runtime dependencies and scripts into an existing package.json.\n * Enforces OSS version floors and adds Pro-specific dev scripts (prebuild/predev).\n * Safe to call multiple times ā idempotent for dep keys.\n */\nexport async function addProDepsToPackageJson(targetDir: string): Promise<void> {\n const pkgPath = path.join(targetDir, 'package.json');\n const content = await fs.readFile(pkgPath, 'utf-8');\n const pkg = JSON.parse(content) as Record<string, unknown>;\n\n const dependencies: Record<string, string> =\n typeof pkg.dependencies === 'object' && pkg.dependencies !== null\n ? { ...(pkg.dependencies as Record<string, string>) }\n : {};\n const devDependencies: Record<string, string> =\n typeof pkg.devDependencies === 'object' && pkg.devDependencies !== null\n ? { ...(pkg.devDependencies as Record<string, string>) }\n : {};\n const scripts: Record<string, string> =\n typeof pkg.scripts === 'object' && pkg.scripts !== null\n ? { ...(pkg.scripts as Record<string, string>) }\n : {};\n\n // Enforce OSS version floors ā replace workspace:* refs AND upgrade any stale version\n // pinned by the OSS scaffold template to our tested minimum.\n // OSS_VERSIONS = \"minimum tested versions\" ā we always want them to win.\n for (const [pkgName, pinnedVersion] of Object.entries(OSS_VERSIONS)) {\n if (pkgName in dependencies) {\n dependencies[pkgName] = pinnedVersion;\n }\n if (pkgName in devDependencies) {\n devDependencies[pkgName] = pinnedVersion;\n }\n }\n\n // Pro runtime dependencies ā exact versions from workspace at build time\n Object.assign(dependencies, {\n '@stackwright-pro/display-components': PRO_VERSIONS['@stackwright-pro/display-components'],\n '@stackwright-pro/mcp': PRO_VERSIONS['@stackwright-pro/mcp'],\n '@stackwright-pro/otters': PRO_VERSIONS['@stackwright-pro/otters'],\n '@stackwright-pro/openapi': PRO_VERSIONS['@stackwright-pro/openapi'],\n '@stackwright-pro/auth': PRO_VERSIONS['@stackwright-pro/auth'],\n '@stackwright-pro/auth-nextjs': PRO_VERSIONS['@stackwright-pro/auth-nextjs'],\n '@stackwright-pro/pulse': PRO_VERSIONS['@stackwright-pro/pulse'],\n '@stackwright-pro/workflow-components': PRO_VERSIONS['@stackwright-pro/workflow-components'],\n '@stackwright-pro/workflow': PRO_VERSIONS['@stackwright-pro/workflow'],\n '@stackwright/build-scripts': OSS_VERSIONS['@stackwright/build-scripts'],\n zod: '^4.0.0',\n });\n\n // Pro dev dependencies\n Object.assign(devDependencies, {\n '@stoplight/prism-cli': '^5.15.10',\n });\n\n // Role-based dev scripts\n Object.assign(scripts, {\n 'dev:admin': 'MOCK_USER=admin next dev',\n 'dev:analyst': 'MOCK_USER=analyst next dev',\n 'dev:viewer': 'MOCK_USER=viewer next dev',\n prebuild: 'node scripts/prebuild.js',\n predev: 'node scripts/prebuild.js',\n });\n\n pkg.dependencies = dependencies;\n pkg.devDependencies = devDependencies;\n pkg.scripts = scripts;\n\n await fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n}\n\n// ---------------------------------------------------------------------------\n// stackwright.yml mutations\n// ---------------------------------------------------------------------------\n\n/**\n * Add an empty `auth:` key to an existing stackwright.yml.\n * The auth key is the hook point for Pro RBAC configuration.\n */\nexport async function addAuthToStackwrightYml(targetDir: string): Promise<void> {\n const ymlPath = path.join(targetDir, 'stackwright.yml');\n const content = await fs.readFile(ymlPath, 'utf-8');\n const config = yaml.load(content, { schema: yaml.CORE_SCHEMA }) as Record<string, unknown>;\n\n config.auth = {};\n\n await fs.writeFile(ymlPath, yaml.dump(config, { lineWidth: 120 }));\n}\n\n/**\n * Append an OpenAPI integration entry to the `integrations:` array in stackwright.yml.\n * Creates the array if it does not exist. Safe to call multiple times for different specs.\n */\nexport async function addIntegrationToStackwrightYml(\n targetDir: string,\n specName: string,\n specFilename: string,\n mockUrl?: string\n): Promise<void> {\n const ymlPath = path.join(targetDir, 'stackwright.yml');\n const content = await fs.readFile(ymlPath, 'utf-8');\n const config = yaml.load(content, { schema: yaml.CORE_SCHEMA }) as Record<string, unknown>;\n\n const integration: Record<string, unknown> = {\n type: 'openapi',\n name: specName,\n spec: `./specs/${specFilename}`,\n collections: [],\n };\n\n if (mockUrl) {\n integration.mockUrl = mockUrl;\n }\n\n config.integrations = [\n ...(Array.isArray(config.integrations) ? config.integrations : []),\n integration,\n ];\n\n await fs.writeFile(ymlPath, yaml.dump(config, { lineWidth: 120 }));\n}\n\n// ---------------------------------------------------------------------------\n// .code_puppy/ workspace config scaffolding\n// ---------------------------------------------------------------------------\n\n/**\n * Create (or idempotently update) the .code_puppy/ workspace directory.\n *\n * Creates:\n * - .code_puppy/config.json { projectOnly: true } (merges with existing)\n * - .code_puppy/mcp_servers.json stackwright-pro-mcp stdio server entry\n * - .code_puppy/agents/ empty directory for future agent configs\n *\n * Symlink guard: refuses to write if any of the managed paths is a symlink,\n * consistent with raft/src/lib.ts ensureWorkspaceConfig.\n */\nexport async function scaffoldWorkspaceConfig(targetDir: string): Promise<void> {\n const workspaceDir = path.join(targetDir, '.code_puppy');\n await fs.ensureDir(workspaceDir);\n // Symlink guard ā consistent with raft/src/lib.ts ensureWorkspaceConfig\n const workspaceStats = await fs.lstat(workspaceDir);\n if (workspaceStats.isSymbolicLink()) {\n throw new Error('.code_puppy/ is a symlink ā refusing to write. Check for tampering.');\n }\n\n const agentsDir = path.join(workspaceDir, 'agents');\n await fs.ensureDir(agentsDir);\n if (await fs.pathExists(agentsDir)) {\n const agentsStats = await fs.lstat(agentsDir);\n if (agentsStats.isSymbolicLink()) {\n throw new Error('.code_puppy/agents is a symlink ā refusing to write. Check for tampering.');\n }\n }\n\n // config.json ā projectOnly: true\n // Merge with existing so we don't clobber user customizations on re-scaffold\n const configPath = path.join(workspaceDir, 'config.json');\n let existingConfig: Record<string, unknown> = {};\n if (fs.existsSync(configPath)) {\n try {\n existingConfig = JSON.parse(await fs.readFile(configPath, 'utf-8')) as Record<\n string,\n unknown\n >;\n } catch {\n // Malformed ā start fresh\n }\n }\n if (await fs.pathExists(configPath)) {\n const configStats = await fs.lstat(configPath);\n if (configStats.isSymbolicLink()) {\n throw new Error(\n '.code_puppy/config.json is a symlink ā refusing to write. Check for tampering.'\n );\n }\n }\n await fs.writeFile(\n configPath,\n JSON.stringify({ ...existingConfig, projectOnly: true }, null, 2) + '\\n',\n 'utf-8'\n );\n\n // mcp_servers.json ā pnpm-based stackwright-pro-mcp server\n // ${PROJECT_ROOT} is a literal ā raft-puppy expands it at runtime to the\n // directory containing .code_puppy/ (walk-up discovery root).\n const mcpServersPath = path.join(workspaceDir, 'mcp_servers.json');\n if (await fs.pathExists(mcpServersPath)) {\n const mcpStats = await fs.lstat(mcpServersPath);\n if (mcpStats.isSymbolicLink()) {\n throw new Error(\n '.code_puppy/mcp_servers.json is a symlink ā refusing to write. Check for tampering.'\n );\n }\n }\n if (!fs.existsSync(mcpServersPath)) {\n const mcpConfig = {\n mcp_servers: {\n 'stackwright-pro-mcp': {\n type: 'stdio',\n command: 'pnpm',\n args: ['exec', 'stackwright-pro-mcp'],\n enabled: true,\n cwd: '${PROJECT_ROOT}',\n },\n },\n };\n await fs.writeFile(mcpServersPath, JSON.stringify(mcpConfig, null, 2) + '\\n', 'utf-8');\n }\n}\n\n// ---------------------------------------------------------------------------\n// README generation\n// ---------------------------------------------------------------------------\n\nexport interface GenerateReadmeOptions {\n projectName: string;\n hasSpec: boolean;\n specName?: string;\n specFilename?: string;\n hasOtters: boolean;\n hasMock: boolean;\n}\n\n/**\n * Generate a project README.md with conditional sections based on which\n * Pro features are enabled (spec, mock server, otter raft).\n */\nexport function generateReadme(options: GenerateReadmeOptions): string {\n const { projectName, hasSpec, specName, specFilename, hasOtters, hasMock } = options;\n\n // Build API Integration section if spec is present\n const apiIntegrationSection = hasSpec\n ? `## š” API Integration\\n\\nYour OpenAPI spec was copied to \\`specs/${specFilename}\\` and wired up in \\`stackwright.yml\\`.\\n\\n**What gets generated:**\\n\\n\\`\\`\\`typescript\\n// src/generated/${specName}/schemas.ts\\nexport const EquipmentSchema = z.object({\\n id: z.string(),\\n name: z.string(),\\n status: z.enum(['operational', 'maintenance', 'retired']),\\n // ... Zod validation for runtime safety\\n});\\n\\n// src/generated/${specName}/types.ts\\nexport type Equipment = z.infer<typeof EquipmentSchema>;\\n\\n// src/generated/${specName}/client.ts\\nexport class ${(specName ?? 'api').charAt(0).toUpperCase() + (specName ?? 'api').slice(1)}Client {\\n async getEquipment(id: string): Promise<Equipment> {\\n // Auto-wired with auth, validation, error handling\\n }\\n}\\n\\`\\`\\`\\n\\n**How it works:**\\n1. The \\`predev\\` script in \\`package.json\\` runs \\`prebuild.js\\` before every \\`pnpm dev\\`\\n2. Prebuild reads your spec and generates type-safe code\\n3. You import and use it:\\n\\n\\`\\`\\`typescript\\nimport { ${(specName ?? 'api').charAt(0).toUpperCase() + (specName ?? 'api').slice(1)}Client } from '@/generated/${specName}/client';\\nimport type { Equipment } from '@/generated/${specName}/types';\\n\\nconst client = new ${(specName ?? 'api').charAt(0).toUpperCase() + (specName ?? 'api').slice(1)}Client();\\nconst gear: Equipment = await client.getEquipment('123');\\n\\`\\`\\`\\n\\nNo manual typing. No drift. No runtime surprises.\\n\\n`\n : '';\n\n // Build mock server section if enabled\n const mockSection = hasMock\n ? `## š Mock Server\\n\\nPrism mock server is configured to serve your API at **http://localhost:4010**.\\n\\n\\`\\`\\`bash\\npnpm dev:mock # Starts Prism + Next.js together\\n\\`\\`\\`\\n\\nThis starts:\\n1. Prism mock server on port 4010 (serves your OpenAPI spec)\\n2. Next.js dev server on port 3000\\n\\nThe generated API client is automatically configured to use the mock server.\\n\\n`\n : '';\n\n // Build AI Agents section if otters are present\n const aiAgentsSection = hasOtters\n ? `## 𦦠AI Agents (The Otter Raft)\\n\\nYour project includes **SIX specialized AI agents** in \\`node_modules/@stackwright-pro/otters/\\`:\\n\\n- \\`stackwright-pro-foreman-otter\\` - Master coordinator that orchestrates all specialist otters\\n- \\`stackwright-pro-api-otter\\` - Discovers entities from OpenAPI specs\\n- \\`stackwright-pro-auth-otter\\` - Configures CAC/OIDC auth, RBAC rules, and audit middleware\\n- \\`stackwright-pro-data-otter\\` - Configures endpoint filters & ISR revalidation\\n- \\`stackwright-pro-page-otter\\` - Generates pages auto-wired with data, theme, and auth\\n- \\`stackwright-pro-dashboard-otter\\` - Builds live data dashboards\\n\\n**Start the otter raft:**\\n\\n\\`\\`\\`bash\\nnpx @stackwright-pro/raft\\n\\`\\`\\`\\n\\nThe raft verifies otter integrity, writes project context, and spawns code-puppy in foreman mode. The foreman asks questions about your brand, auth, and data preferences, then coordinates specialist otters to build your app. All state lives in \\`.stackwright/\\` ā interrupt and resume anytime.\\n\\n**Example session prompt:**\\n\\n\"Build me a logistics dashboard from our OpenAPI spec. Connect to /equipment and /supplies endpoints.\"\\n\\n`\n : '';\n\n return `# ${projectName}\\n\\nA Stackwright Pro application with role-based auth, OpenAPI integration, and intelligent AI agents.\\n\\n## š Quick Start\\n\\n\\`\\`\\`bash\\n# Start development server\\npnpm dev\\n\\n# Open your browser\\nopen http://localhost:3000\\n\\`\\`\\`\\n\\n## š„ Role-Based Development\\n\\nStackwright Pro includes **mock authentication** for local development with three pre-configured roles:\\n\\n\\`\\`\\`bash\\npnpm dev:admin # Full permissions (*)\\npnpm dev:analyst # Read & write data\\npnpm dev:viewer # Read-only access\\n\\`\\`\\`\\n\\n**How it works:**\\n- Each script sets the \\`MOCK_USER\\` environment variable\\n- \\`lib/mock-auth.ts\\` intercepts requests and injects the appropriate user context\\n- Your pages & API routes respect the RBAC rules in \\`stackwright.yml\\`\\n- No backend required for testing auth flows! š\\n\\n**Pro tip:** Test your UI for all three roles to ensure proper permissions enforcement.\\n\\n${mockSection}## š Project Structure\\n\\n\\`\\`\\`\\n.\\nāāā pages/\\nā āāā _app.tsx # Pro version with AuthProvider + shadcn\\nā āāā index.tsx # Home page (auto-generated by Stackwright)\\nā āāā about/\\nā ā āāā content.yml # Page content in YAML\\nā āāā ...\\nāāā lib/\\nā āāā mock-auth.ts # Dev-only auth mocking (no backend needed)\\nāāā scripts/\\nā āāā prebuild.js # Auto-generates code from OpenAPI specs\\nāāā specs/ # OpenAPI spec files (if --spec was used)\\nāāā src/\\nā āāā generated/ # Auto-generated types & clients\\nā āāā {specName}/\\nā āāā schemas.ts # Zod schemas for runtime validation\\nā āāā types.ts # TypeScript types\\nā āāā client.ts # API client with auth\\nā āāā provider.ts # CollectionProvider for Stackwright\\nāāā .stackwright/\\nā āāā otters/ # AI agent configs (4 specialized otters)\\nāāā stackwright.yml # Theme, auth, API integrations\\nāāā package.json\\n\\`\\`\\`\\n\\n**Key Files:**\\n- \\`pages/_app.tsx\\` - Wraps your app with \\`AuthProvider\\` for RBAC\\n- \\`stackwright.yml\\` - Single source of truth for theme, auth roles, and API wiring\\n- \\`lib/mock-auth.ts\\` - Mocks CAC/PIV headers locally so you can test auth flows\\n- \\`scripts/prebuild.js\\` - Runs before dev/build to generate types from your OpenAPI spec\\n\\n## š Adding Pages\\n\\nStackwright uses **YAML for content**, so you never touch JSX unless you want to.\\n\\n**Example:** Create \\`pages/about/content.yml\\`:\\n\\n\\`\\`\\`yaml\\ntitle: About Us\\ndescription: Learn more about our mission\\n\\nsections:\\n - type: main\\n heading: Who We Are\\n body: |\\n We build mission-critical logistics systems for the Marine Corps.\\n\\n - type: feature_list\\n title: Our Capabilities\\n features:\\n - icon: Security\\n title: Zero Trust\\n description: PKI-based auth with CAC/PIV\\n - icon: Api\\n title: Real-time Data\\n description: OpenAPI-backed, Zod-validated\\n\\`\\`\\`\\n\\nThat's it. Navigate to \\`/about\\` and it just works. No routing config, no React components.\\n\\n${apiIntegrationSection}## šØ Customizing Theme\\n\\nEdit \\`stackwright.yml\\` to change colors, fonts, spacing ā applies everywhere instantly.\\n\\n\\`\\`\\`yaml\\ntheme:\\n id: my-theme\\n name: My Custom Theme\\n colors:\\n primary: \"#C41E3A\" # Marine Corps red\\n background: \"#FFFFFF\"\\n text: \"#1A1A1A\"\\n accent: \"#FFD700\" # Gold\\n typography:\\n fontFamily: \"'Inter', sans-serif\"\\n h1Size: \"2.5rem\"\\n spacing:\\n unit: 8\\n\\`\\`\\`\\n\\nNo CSS files. No theme provider boilerplate. Just YAML. Stackwright handles the rest.\\n\\n## š Auth Configuration\\n\\nStackwright Pro comes with **3 pre-configured roles** in \\`stackwright.yml\\`:\\n\\n\\`\\`\\`yaml\\nauth:\\n roles:\\n - name: ADMIN\\n permissions: ['*'] # Full access\\n - name: ANALYST \\n permissions: ['data:read', 'data:write'] # Read/write data\\n - name: VIEWER\\n permissions: ['data:read'] # Read-only\\n\\`\\`\\`\\n\\n**Gate content in your YAML:**\\n\\n\\`\\`\\`yaml\\nsections:\\n - type: button\\n label: Delete Equipment\\n action: /api/equipment/delete\\n auth:\\n required_roles: [ADMIN]\\n fallback: hide # Options: hide, disable, show_message\\n\\`\\`\\`\\n\\nOnly admins see the button. Analysts and viewers? Button doesn't exist in the DOM.\\n\\n**Route protection:**\\n\\n\\`\\`\\`yaml\\nauth:\\n protected_routes:\\n - path: /admin/*\\n roles: [ADMIN]\\n - path: /equipment/* \\n roles: [ANALYST, ADMIN]\\n public_routes:\\n - /\\n - /about\\n\\`\\`\\`\\n\\nNo middleware to write. No useAuth hooks to remember. RBAC is declarative.\\n\\n${aiAgentsSection}## š Learn More\\n\\n- **Stackwright Docs:** [https://stackwright.dev](https://stackwright.dev)\\n- **OSS Repo:** [https://github.com/Per-Aspera-LLC/stackwright](https://github.com/Per-Aspera-LLC/stackwright)\\n- **Pro Repo:** [https://github.com/Per-Aspera-LLC/stackwright-pro](https://github.com/Per-Aspera-LLC/stackwright-pro)\\n\\n**Questions?** File an issue or ping us in the discussions. We're here to help you ship faster.\\n`;\n}\n","// AUTO-GENERATED ā do not edit manually.\n// Run `pnpm sync-versions` or `pnpm build` to regenerate.\n//\n// PRO_VERSIONS: exact versions of @stackwright-pro/* packages in this workspace.\n// OSS_VERSIONS: minimum tested versions of @stackwright/* OSS packages (caret range).\n\n/**\n * Exact versions of every @stackwright-pro/* package currently in the workspace.\n * Used by launch-stackwright-pro and scaffold-hooks to pin deps in scaffolded projects.\n * Updated automatically on every build ā never edit this file by hand.\n */\nexport const PRO_VERSIONS = {\n '@stackwright-pro/auth': '0.2.0-alpha.11',\n '@stackwright-pro/auth-nextjs': '0.2.0-alpha.13',\n '@stackwright-pro/display-components': '0.2.0-alpha.9',\n '@stackwright-pro/mcp': '0.2.0-alpha.50',\n '@stackwright-pro/openapi': '0.3.0-alpha.23',\n '@stackwright-pro/otters': '1.0.0-alpha.39',\n '@stackwright-pro/pulse': '0.3.0-alpha.15',\n '@stackwright-pro/workflow': '0.1.0-alpha.15',\n '@stackwright-pro/workflow-components': '0.1.0-alpha.17',\n} as const satisfies Record<string, string>;\n\n/**\n * Minimum tested versions of @stackwright/* OSS packages.\n * Caret ranges anchored to the last version resolved in pnpm-lock.yaml.\n * Updated automatically on every build.\n */\nexport const OSS_VERSIONS = {\n '@stackwright/build-scripts': '^0.7.2',\n '@stackwright/core': '^0.8.5',\n '@stackwright/icons': '^0.5.2',\n '@stackwright/mcp': '^0.4.6',\n '@stackwright/nextjs': '^0.5.4',\n '@stackwright/otters': '^0.2.0',\n '@stackwright/ui-shadcn': '^0.1.3',\n} as const satisfies Record<string, string>;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,iBAAAA,UAAAC,SAAA;AAAA,IAAAA,QAAA;AAAA,MACE,MAAQ;AAAA,MACR,SAAW;AAAA,MACX,aAAe;AAAA,MACf,SAAW;AAAA,MACX,eAAiB;AAAA,QACf,QAAU;AAAA,MACZ;AAAA,MACA,YAAc;AAAA,QACZ,MAAQ;AAAA,QACR,KAAO;AAAA,MACT;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,QACP;AAAA,QACA;AAAA,MACF;AAAA,MACA,KAAO;AAAA,QACL,0BAA0B;AAAA,MAC5B;AAAA,MACA,SAAW;AAAA,QACT,OAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,KAAO;AAAA,QACP,MAAQ;AAAA,QACR,iBAAiB;AAAA,MACnB;AAAA,MACA,cAAgB;AAAA,QACd,yBAAyB;AAAA,QACzB,gCAAgC;AAAA,QAChC,wBAAwB;AAAA,QACxB,4BAA4B;AAAA,QAC5B,2BAA2B;AAAA,QAC3B,mCAAmC;AAAA,QACnC,oBAAoB;AAAA,QACpB,8BAA8B;AAAA,QAC9B,OAAS;AAAA,QACT,WAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,MACA,iBAAmB;AAAA,QACjB,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,QAClB,eAAe;AAAA,QACf,YAAc;AAAA,QACd,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,IACF;AAAA;AAAA;;;ACxDA,uBAAwB;AACxB,IAAAC,eAAiB;AACjB,gBAAe;AACf,IAAAC,mBAAe;AACf,mBAAkB;AAClB,2BAAyB;AAEzB,iBAA0C;AAC1C,2BAAiC;AACjC,4BAAyC;;;ACIzC,sBAAe;AACf,qBAAiB;AACjB,kBAAiB;;;ACJV,IAAM,eAAe;AAAA,EAC1B,yBAAyB;AAAA,EACzB,gCAAgC;AAAA,EAChC,uCAAuC;AAAA,EACvC,wBAAwB;AAAA,EACxB,4BAA4B;AAAA,EAC5B,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,wCAAwC;AAC1C;AAOO,IAAM,eAAe;AAAA,EAC1B,8BAA8B;AAAA,EAC9B,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,0BAA0B;AAC5B;;;ADTA,eAAsB,wBAAwB,WAAkC;AAC9E,QAAM,UAAU,YAAAC,QAAK,KAAK,WAAW,cAAc;AACnD,QAAM,UAAU,MAAM,gBAAAC,QAAG,SAAS,SAAS,OAAO;AAClD,QAAM,MAAM,KAAK,MAAM,OAAO;AAE9B,QAAM,eACJ,OAAO,IAAI,iBAAiB,YAAY,IAAI,iBAAiB,OACzD,EAAE,GAAI,IAAI,aAAwC,IAClD,CAAC;AACP,QAAM,kBACJ,OAAO,IAAI,oBAAoB,YAAY,IAAI,oBAAoB,OAC/D,EAAE,GAAI,IAAI,gBAA2C,IACrD,CAAC;AACP,QAAM,UACJ,OAAO,IAAI,YAAY,YAAY,IAAI,YAAY,OAC/C,EAAE,GAAI,IAAI,QAAmC,IAC7C,CAAC;AAKP,aAAW,CAAC,SAAS,aAAa,KAAK,OAAO,QAAQ,YAAY,GAAG;AACnE,QAAI,WAAW,cAAc;AAC3B,mBAAa,OAAO,IAAI;AAAA,IAC1B;AACA,QAAI,WAAW,iBAAiB;AAC9B,sBAAgB,OAAO,IAAI;AAAA,IAC7B;AAAA,EACF;AAGA,SAAO,OAAO,cAAc;AAAA,IAC1B,uCAAuC,aAAa,qCAAqC;AAAA,IACzF,wBAAwB,aAAa,sBAAsB;AAAA,IAC3D,2BAA2B,aAAa,yBAAyB;AAAA,IACjE,4BAA4B,aAAa,0BAA0B;AAAA,IACnE,yBAAyB,aAAa,uBAAuB;AAAA,IAC7D,gCAAgC,aAAa,8BAA8B;AAAA,IAC3E,0BAA0B,aAAa,wBAAwB;AAAA,IAC/D,wCAAwC,aAAa,sCAAsC;AAAA,IAC3F,6BAA6B,aAAa,2BAA2B;AAAA,IACrE,8BAA8B,aAAa,4BAA4B;AAAA,IACvE,KAAK;AAAA,EACP,CAAC;AAGD,SAAO,OAAO,iBAAiB;AAAA,IAC7B,wBAAwB;AAAA,EAC1B,CAAC;AAGD,SAAO,OAAO,SAAS;AAAA,IACrB,aAAa;AAAA,IACb,eAAe;AAAA,IACf,cAAc;AAAA,IACd,UAAU;AAAA,IACV,QAAQ;AAAA,EACV,CAAC;AAED,MAAI,eAAe;AACnB,MAAI,kBAAkB;AACtB,MAAI,UAAU;AAEd,QAAM,gBAAAA,QAAG,UAAU,SAAS,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,MAAM,OAAO;AAC1E;AAUA,eAAsB,wBAAwB,WAAkC;AAC9E,QAAM,UAAU,YAAAD,QAAK,KAAK,WAAW,iBAAiB;AACtD,QAAM,UAAU,MAAM,gBAAAC,QAAG,SAAS,SAAS,OAAO;AAClD,QAAM,SAAS,eAAAC,QAAK,KAAK,SAAS,EAAE,QAAQ,eAAAA,QAAK,YAAY,CAAC;AAE9D,SAAO,OAAO,CAAC;AAEf,QAAM,gBAAAD,QAAG,UAAU,SAAS,eAAAC,QAAK,KAAK,QAAQ,EAAE,WAAW,IAAI,CAAC,CAAC;AACnE;AAMA,eAAsB,+BACpB,WACA,UACA,cACA,SACe;AACf,QAAM,UAAU,YAAAF,QAAK,KAAK,WAAW,iBAAiB;AACtD,QAAM,UAAU,MAAM,gBAAAC,QAAG,SAAS,SAAS,OAAO;AAClD,QAAM,SAAS,eAAAC,QAAK,KAAK,SAAS,EAAE,QAAQ,eAAAA,QAAK,YAAY,CAAC;AAE9D,QAAM,cAAuC;AAAA,IAC3C,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,WAAW,YAAY;AAAA,IAC7B,aAAa,CAAC;AAAA,EAChB;AAEA,MAAI,SAAS;AACX,gBAAY,UAAU;AAAA,EACxB;AAEA,SAAO,eAAe;AAAA,IACpB,GAAI,MAAM,QAAQ,OAAO,YAAY,IAAI,OAAO,eAAe,CAAC;AAAA,IAChE;AAAA,EACF;AAEA,QAAM,gBAAAD,QAAG,UAAU,SAAS,eAAAC,QAAK,KAAK,QAAQ,EAAE,WAAW,IAAI,CAAC,CAAC;AACnE;AAiBA,eAAsB,wBAAwB,WAAkC;AAC9E,QAAM,eAAe,YAAAF,QAAK,KAAK,WAAW,aAAa;AACvD,QAAM,gBAAAC,QAAG,UAAU,YAAY;AAE/B,QAAM,iBAAiB,MAAM,gBAAAA,QAAG,MAAM,YAAY;AAClD,MAAI,eAAe,eAAe,GAAG;AACnC,UAAM,IAAI,MAAM,0EAAqE;AAAA,EACvF;AAEA,QAAM,YAAY,YAAAD,QAAK,KAAK,cAAc,QAAQ;AAClD,QAAM,gBAAAC,QAAG,UAAU,SAAS;AAC5B,MAAI,MAAM,gBAAAA,QAAG,WAAW,SAAS,GAAG;AAClC,UAAM,cAAc,MAAM,gBAAAA,QAAG,MAAM,SAAS;AAC5C,QAAI,YAAY,eAAe,GAAG;AAChC,YAAM,IAAI,MAAM,gFAA2E;AAAA,IAC7F;AAAA,EACF;AAIA,QAAM,aAAa,YAAAD,QAAK,KAAK,cAAc,aAAa;AACxD,MAAI,iBAA0C,CAAC;AAC/C,MAAI,gBAAAC,QAAG,WAAW,UAAU,GAAG;AAC7B,QAAI;AACF,uBAAiB,KAAK,MAAM,MAAM,gBAAAA,QAAG,SAAS,YAAY,OAAO,CAAC;AAAA,IAIpE,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,MAAM,gBAAAA,QAAG,WAAW,UAAU,GAAG;AACnC,UAAM,cAAc,MAAM,gBAAAA,QAAG,MAAM,UAAU;AAC7C,QAAI,YAAY,eAAe,GAAG;AAChC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,gBAAAA,QAAG;AAAA,IACP;AAAA,IACA,KAAK,UAAU,EAAE,GAAG,gBAAgB,aAAa,KAAK,GAAG,MAAM,CAAC,IAAI;AAAA,IACpE;AAAA,EACF;AAKA,QAAM,iBAAiB,YAAAD,QAAK,KAAK,cAAc,kBAAkB;AACjE,MAAI,MAAM,gBAAAC,QAAG,WAAW,cAAc,GAAG;AACvC,UAAM,WAAW,MAAM,gBAAAA,QAAG,MAAM,cAAc;AAC9C,QAAI,SAAS,eAAe,GAAG;AAC7B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,gBAAAA,QAAG,WAAW,cAAc,GAAG;AAClC,UAAM,YAAY;AAAA,MAChB,aAAa;AAAA,QACX,uBAAuB;AAAA,UACrB,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM,CAAC,QAAQ,qBAAqB;AAAA,UACpC,SAAS;AAAA,UACT,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AACA,UAAM,gBAAAA,QAAG,UAAU,gBAAgB,KAAK,UAAU,WAAW,MAAM,CAAC,IAAI,MAAM,OAAO;AAAA,EACvF;AACF;AAmBO,SAAS,eAAe,SAAwC;AACrE,QAAM,EAAE,aAAa,SAAS,UAAU,cAAc,WAAW,QAAQ,IAAI;AAG7E,QAAM,wBAAwB,UAC1B;AAAA;AAAA,0CAAoE,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA6G,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAqO,QAAQ;AAAA;AAAA;AAAA,mBAA2F,QAAQ;AAAA,gBAA6B,YAAY,OAAO,OAAO,CAAC,EAAE,YAAY,KAAK,YAAY,OAAO,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAmX,YAAY,OAAO,OAAO,CAAC,EAAE,YAAY,KAAK,YAAY,OAAO,MAAM,CAAC,CAAC,8BAA8B,QAAQ;AAAA,8CAA0D,QAAQ;AAAA;AAAA,sBAAmC,YAAY,OAAO,OAAO,CAAC,EAAE,YAAY,KAAK,YAAY,OAAO,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAC3wC;AAGJ,QAAM,cAAc,UAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IACA;AAGJ,QAAM,kBAAkB,YACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IACA;AAEJ,SAAO,KAAK,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAw4B,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAinE,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAA4iD,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC7mJ;;;ID1PA,gDAAyB;AAEzB,IAAM,EAAE,QAAQ,IAAI;AAuBpB,eAAe,gBAAgB,cAAsB,UAAiC;AACpF,QAAM,MAAM,aAAAE,QAAK,QAAQ,WAAW,MAAM,aAAa,OAAO,YAAY;AAC1E,QAAM,iBAAAC,QAAG,KAAK,KAAK,QAAQ;AAC7B;AAMA,eAAe,WACb,WACA,UACA,UACwD;AACxD,QAAM,eAAe,aAAAD,QAAK,QAAQ,QAAQ;AAE1C,MAAI,CAAC,iBAAAC,QAAG,WAAW,YAAY,GAAG;AAChC,UAAM,IAAI,MAAM,wBAAwB,YAAY,EAAE;AAAA,EACxD;AAEA,QAAM,eAAe,aAAAD,QAAK,SAAS,YAAY;AAC/C,QAAM,cAAc,YAAY,aAAAA,QAAK,SAAS,cAAc,aAAAA,QAAK,QAAQ,YAAY,CAAC;AAEtF,QAAM,WAAW,aAAAA,QAAK,KAAK,WAAW,OAAO;AAC7C,QAAM,iBAAAC,QAAG,UAAU,QAAQ;AAC3B,QAAM,iBAAAA,QAAG,KAAK,cAAc,aAAAD,QAAK,KAAK,UAAU,YAAY,CAAC;AAE7D,SAAO,EAAE,cAAc,YAAY;AACrC;AAMA,eAAe,OAAO,WAAmB,SAA0C;AACjF,QAAM,UAAU,aAAAA,QAAK,SAAS,SAAS;AAEvC,UAAQ,IAAI,aAAAE,QAAM,KAAK,KAAK,4CAAqC,CAAC;AAOlE,QAAM,eAAgC;AAAA,IACpC,MAAM,QAAQ,QAAQ;AAAA,IACtB,YAAY;AAAA;AAAA,IACZ,GAAI,QAAQ,UAAU,UAAa,EAAE,OAAO,QAAQ,MAAM;AAAA,IAC1D,GAAI,QAAQ,UAAU,UAAa,EAAE,OAAO,QAAQ,MAAM;AAAA,IAC1D,GAAI,QAAQ,UAAU,UAAa,EAAE,OAAO,QAAQ,MAAM;AAAA,IAC1D,GAAI,QAAQ,QAAQ,UAAa,EAAE,eAAe,QAAQ,IAAI;AAAA,EAChE;AAEA,YAAM,qBAAS,WAAW,YAAY;AACtC,UAAQ,IAAI,aAAAA,QAAM,MAAM,oEAA+D,CAAC;AASxF,QAAM,wBAAwB,SAAS;AACvC,UAAQ,IAAI,aAAAA,QAAM,MAAM,8CAAuC,CAAC;AAGhE,QAAM,YAAY,KAAK;AAAA,IACrB,MAAM,iBAAAD,QAAG,SAAS,aAAAD,QAAK,KAAK,WAAW,cAAc,GAAG,OAAO;AAAA,EACjE;AACA,QAAM,cAAc,OAAO;AAAA,IACzB,OAAO,UAAU,iBAAiB,YAAY,UAAU,iBAAiB,OACpE,UAAU,eACX,CAAC;AAAA,EACP,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,kBAAkB,CAAC,EAAE;AAClD,UAAQ,IAAI,aAAAE,QAAM,IAAI,mCAA8B,WAAW,gCAAgC,CAAC;AAEhG,UAAQ,IAAI,aAAAA,QAAM,KAAK,8DAAuD,CAAC;AAC/E,MAAI,CAAC,QAAQ,aAAa;AACxB,QAAI;AACF,yCAAS,mCAAmC;AAAA,QAC1C,KAAK;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AACD,cAAQ,IAAI,aAAAA,QAAM,MAAM,+BAA0B,CAAC;AAAA,IACrD,SAAS,KAAc;AACrB,YAAM,YACJ,eAAe,UACd,IAAI,QAAQ,SAAS,WAAW,KAAK,IAAI,QAAQ,SAAS,SAAS;AACtE,cAAQ;AAAA,QACN,aAAAA,QAAM,IAAI,wEAAmE;AAAA,MAC/E;AACA,cAAQ;AAAA,QACN,aAAAA,QAAM,IAAI,2EAAsE;AAAA,MAClF;AACA,UAAI,WAAW;AACb,gBAAQ;AAAA,UACN,aAAAA,QAAM,OAAO,mEAAmE;AAAA,QAClF;AAAA,MACF;AACA,cAAQ;AAAA,QACN,aAAAA,QAAM,OAAO,mEAAmE;AAAA,MAClF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,aAAAA,QAAM,IAAI,oEAA0D,CAAC;AAAA,EACnF;AAGA,QAAM,iBAA6C;AACnD,YAAM,uCAAiB,eAAe;AAAA,IACpC;AAAA,IACA,aAAa,QAAQ,QAAQ,aAAAF,QAAK,SAAS,SAAS;AAAA,IACpD,WAAW,QAAQ,SAAS,QAAQ,QAAQ,aAAAA,QAAK,SAAS,SAAS;AAAA,IACnE,SAAS,QAAQ,SAAS;AAAA,IAC1B,aAAa,CAAC;AAAA,IACd;AAAA,EACF,CAAC;AAOD,QAAM,gBAAgB,YAAY,aAAAA,QAAK,KAAK,WAAW,SAAS,UAAU,CAAC;AAG3E,QAAM,gBAAgB,eAAe,aAAAA,QAAK,KAAK,WAAW,SAAS,aAAa,CAAC;AAGjF,QAAM,gBAAgB,kBAAkB,aAAAA,QAAK,KAAK,WAAW,gBAAgB,CAAC;AAG9E,QAAM,iBAAAC,QAAG,UAAU,aAAAD,QAAK,KAAK,WAAW,KAAK,CAAC;AAC9C,QAAM,gBAAgB,gBAAgB,aAAAA,QAAK,KAAK,WAAW,OAAO,cAAc,CAAC;AAGjF,QAAM,gBAAgB,aAAa,aAAAA,QAAK,KAAK,WAAW,WAAW,CAAC;AAGpE,QAAM,iBAAAC,QAAG,UAAU,aAAAD,QAAK,KAAK,WAAW,SAAS,CAAC;AAClD,QAAM,gBAAgB,eAAe,aAAAA,QAAK,KAAK,WAAW,WAAW,aAAa,CAAC;AACnF,QAAM;AAAA,IACJ;AAAA,IACA,aAAAA,QAAK,KAAK,WAAW,WAAW,uBAAuB;AAAA,EACzD;AAEA,UAAQ,IAAI,aAAAE,QAAM,MAAM,sDAA+C,CAAC;AAMxE,QAAM,wBAAwB,SAAS;AAMvC,MAAI,WAAiE;AACrE,QAAM,WAAW;AAEjB,MAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC3C,eAAW,YAAY,QAAQ,MAAM;AACnC,iBAAW,MAAM,WAAW,WAAW,UAAU,QAAQ,QAAQ;AACjE,YAAM;AAAA,QACJ;AAAA,QACA,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ,OAAO,WAAW;AAAA,MAC5B;AAAA,IACF;AACA,YAAQ,IAAI,aAAAA,QAAM,MAAM,aAAM,QAAQ,KAAK,MAAM,kCAAkC,CAAC;AACpF,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,aAAAA,QAAM,MAAM,wCAAiC,CAAC;AAAA,IAC5D;AAAA,EACF,WAAW,QAAQ,MAAM;AAEvB,YAAQ;AAAA,MACN,aAAAA,QAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,aAAAF,QAAK,KAAK,WAAW,OAAO;AAC7C,UAAM,iBAAAC,QAAG,UAAU,QAAQ;AAC3B,UAAM,gBAAgB,iBAAiB,aAAAD,QAAK,KAAK,UAAU,eAAe,CAAC;AAE3E,eAAW,EAAE,cAAc,iBAAiB,aAAa,WAAW;AAEpE,UAAM;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACT;AAAA,IACF;AACA,YAAQ,IAAI,aAAAE,QAAM,MAAM,yCAAkC,CAAC;AAC3D,YAAQ,IAAI,aAAAA,QAAM,MAAM,wCAAiC,CAAC;AAAA,EAC5D;AAMA,QAAM,gBAAgB,eAAe;AAAA,IACnC,aAAa,QAAQ,QAAQ;AAAA,IAC7B,SAAS,CAAC,CAAC;AAAA,IACX,GAAI,UAAU,gBAAgB,UAAa,EAAE,UAAU,SAAS,YAAY;AAAA,IAC5E,GAAI,UAAU,iBAAiB,UAAa,EAAE,cAAc,SAAS,aAAa;AAAA,IAClF,WAAW,CAAC,QAAQ;AAAA,IACpB,SAAS,CAAC,CAAC,QAAQ;AAAA,EACrB,CAAC;AAED,QAAM,iBAAAD,QAAG,UAAU,aAAAD,QAAK,KAAK,WAAW,WAAW,GAAG,aAAa;AACnE,UAAQ,IAAI,aAAAE,QAAM,MAAM,6BAAsB,CAAC;AAM/C,QAAM,cAAuC;AAAA,IAC3C,aAAa;AAAA,IACb,aAAa,QAAQ,QAAQ;AAAA,IAC7B,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAEA,MAAI,UAAU;AACZ,gBAAY,WAAW,SAAS,SAAS,YAAY;AACrD,gBAAY,WAAW,SAAS;AAAA,EAClC;AAEA,cAAY,QAAQ,QAAQ,SAAS;AAErC,QAAM,iBAAiB,aAAAF,QAAK,KAAK,WAAW,cAAc;AAC1D,QAAM,iBAAAC,QAAG,UAAU,cAAc;AACjC,QAAM,iBAAAA,QAAG;AAAA,IACP,aAAAD,QAAK,KAAK,gBAAgB,mBAAmB;AAAA,IAC7C,KAAK,UAAU,aAAa,MAAM,CAAC,IAAI;AAAA,IACvC;AAAA,EACF;AASA,QAAM,wBAAwB,SAAS;AACvC,UAAQ,IAAI,aAAAE,QAAM,MAAM,iEAA0D,CAAC;AAMnF,QAAM,SAAS,aAAAF,QAAK,SAAS,QAAQ,IAAI,GAAG,SAAS,KAAK;AAE1D,UAAQ,IAAI,aAAAE,QAAM,KAAK,KAAK,gDAAyC,CAAC;AACtE,UAAQ,IAAI,aAAAA,QAAM,MAAM,WAAW,MAAM,EAAE,CAAC;AAC5C,UAAQ,IAAI,aAAAA,QAAM,MAAM,gCAAgC,CAAC;AACzD,UAAQ,IAAI,aAAAA,QAAM,IAAI,0CAA0C,CAAC;AAEjE,MAAI,UAAU;AACZ,YAAQ,IAAI,aAAAA,QAAM,KAAK;AAAA,8CAA0C,SAAS,YAAY,EAAE,CAAC;AACzF,YAAQ,IAAI,aAAAA,QAAM,IAAI,mEAAmE,CAAC;AAAA,EAC5F;AAEA,MAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,aAAAA,QAAM,KAAK,mCAA4B,CAAC;AACpD,YAAQ,IAAI,aAAAA,QAAM,MAAM,4CAA4C,CAAC;AAAA,EACvE;AAEA,MAAI,CAAC,QAAQ,YAAY;AACvB,YAAQ,IAAI,aAAAA,QAAM,KAAK,KAAK,yDAAkD,CAAC;AAC/E,YAAQ,IAAI,aAAAA,QAAM,IAAI,4CAA4C,CAAC;AAAA,EACrE;AACF;AAMA,eAAe,OAAsB;AACnC,QAAM,UAAU,IAAI,yBAAQ;AAE5B,UACG,KAAK,wBAAwB,EAC7B,YAAY,uFAAgF,EAC5F,QAAQ,OAAO,EACf,SAAS,eAAe,qBAAqB,GAAG,EAChD,OAAO,iBAAiB,qCAAqC,EAC7D,OAAO,mBAAmB,iDAAiD,EAC3E,OAAO,qBAAqB,+CAA+C,EAC3E,OAAO,WAAW,kDAAkD,EACpE,OAAO,iBAAiB,iCAAiC,EACzD,OAAO,aAAa,gCAAgC,EACpD,OAAO,UAAU,qEAAqE,EACtF;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,OAAO,WAAmB,YAA8B;AAC9D,UAAM,UAAU,UAAAC,QAAG,QAAQ;AAC3B,UAAM,YACJ,cAAc,MACV,aAAAH,QAAK,QAAQ,QAAQ,IAAI,GAAG,SAAS,IACrC,QAAQ,OACN,aAAAA,QAAK,QAAQ,QAAQ,IAAI,GAAG,QAAQ,IAAI,IACxC,QAAQ,IAAI;AAGpB,QAAI,CAAC,UAAU,WAAW,UAAU,aAAAA,QAAK,GAAG,KAAK,cAAc,SAAS;AACtE,cAAQ,KAAK,aAAAE,QAAM,OAAO,0DAAgD,SAAS,EAAE,CAAC;AAAA,IACxF;AAEA,UAAM,OAAO,WAAW,OAAO;AAAA,EACjC,CAAC;AAEH,QAAM,QAAQ,WAAW,QAAQ,IAAI;AACvC;AAEA,KAAK,EAAE,MAAM,CAAC,QAAiB;AAC7B,UAAQ,MAAM,aAAAA,QAAM,IAAI,yBAAoB,GAAG,GAAG;AAClD,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["exports","module","import_path","import_fs_extra","path","fs","yaml","path","fs","chalk","os"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stackwright-pro/launch-stackwright-pro",
|
|
3
|
-
"version": "0.4.0-alpha.
|
|
3
|
+
"version": "0.4.0-alpha.84",
|
|
4
4
|
"description": "Launch a new Stackwright Pro project with OpenAPI integration, auth, and the otter raft",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"publishConfig": {
|
|
@@ -32,12 +32,12 @@
|
|
|
32
32
|
"commander": "^15.0.0",
|
|
33
33
|
"fs-extra": "^11.3.5",
|
|
34
34
|
"js-yaml": "^4.1.0",
|
|
35
|
-
"@stackwright-pro/auth": "0.2.0-alpha.11",
|
|
36
35
|
"@stackwright-pro/auth-nextjs": "0.2.0-alpha.13",
|
|
37
|
-
"@stackwright-pro/mcp": "0.2.0-alpha.
|
|
36
|
+
"@stackwright-pro/mcp": "0.2.0-alpha.50",
|
|
38
37
|
"@stackwright-pro/openapi": "0.3.0-alpha.23",
|
|
39
|
-
"@stackwright-pro/
|
|
40
|
-
"@stackwright-pro/
|
|
38
|
+
"@stackwright-pro/auth": "0.2.0-alpha.11",
|
|
39
|
+
"@stackwright-pro/otters": "1.0.0-alpha.39",
|
|
40
|
+
"@stackwright-pro/scaffold-hooks": "1.0.0-alpha.14"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/fs-extra": "^11.0",
|