@wix/web50-cli 0.1.0 → 0.1.2
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/bin/web5.js +1 -2
- package/dist/cjs/auth/deviceFlow.js +175 -16
- package/dist/cjs/auth/deviceFlow.js.map +1 -1
- package/dist/cjs/auth/index.js +93 -10
- package/dist/cjs/auth/index.js.map +1 -1
- package/dist/cjs/auth/secretStore.js.map +1 -1
- package/dist/cjs/cli.js +29 -1
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/commands/bundle.js +103 -0
- package/dist/cjs/commands/bundle.js.map +1 -0
- package/dist/cjs/commands/conversation.js +50 -0
- package/dist/cjs/commands/conversation.js.map +1 -0
- package/dist/cjs/commands/conversationWizard.js +528 -0
- package/dist/cjs/commands/conversationWizard.js.map +1 -0
- package/dist/cjs/commands/deploy.js +237 -0
- package/dist/cjs/commands/deploy.js.map +1 -0
- package/dist/cjs/commands/ecom.js +239 -0
- package/dist/cjs/commands/ecom.js.map +1 -0
- package/dist/cjs/commands/embed.js +118 -0
- package/dist/cjs/commands/embed.js.map +1 -0
- package/dist/cjs/commands/init.js +65 -29
- package/dist/cjs/commands/init.js.map +1 -1
- package/dist/cjs/commands/instructions.js +456 -0
- package/dist/cjs/commands/instructions.js.map +1 -0
- package/dist/cjs/commands/login.js +63 -4
- package/dist/cjs/commands/login.js.map +1 -1
- package/dist/cjs/commands/logout.js +16 -0
- package/dist/cjs/commands/logout.js.map +1 -0
- package/dist/cjs/commands/serve.js +122 -0
- package/dist/cjs/commands/serve.js.map +1 -0
- package/dist/cjs/commands/storybook.js +102 -0
- package/dist/cjs/commands/storybook.js.map +1 -0
- package/dist/cjs/commands/validate.js +617 -17
- package/dist/cjs/commands/validate.js.map +1 -1
- package/dist/cjs/commands/whoami.js +48 -0
- package/dist/cjs/commands/whoami.js.map +1 -0
- package/dist/cjs/templates/aiInstructionsSchema.js +5 -1
- package/dist/cjs/templates/aiInstructionsSchema.js.map +1 -1
- package/dist/cjs/templates/cmsMappingSchema.js +132 -0
- package/dist/cjs/templates/cmsMappingSchema.js.map +1 -0
- package/dist/cjs/utils/print.js +12 -0
- package/dist/cjs/utils/print.js.map +1 -1
- package/dist/cjs/utils/project.js +24 -0
- package/dist/cjs/utils/project.js.map +1 -1
- package/dist/cjs/utils/wixApi.js +57 -0
- package/dist/cjs/utils/wixApi.js.map +1 -0
- package/dist/esm/auth/deviceFlow.js +182 -17
- package/dist/esm/auth/deviceFlow.js.map +1 -1
- package/dist/esm/auth/index.js +98 -11
- package/dist/esm/auth/index.js.map +1 -1
- package/dist/esm/auth/secretStore.js.map +1 -1
- package/dist/esm/cli.js +29 -1
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/commands/bundle.js +100 -0
- package/dist/esm/commands/bundle.js.map +1 -0
- package/dist/esm/commands/conversation.js +44 -0
- package/dist/esm/commands/conversation.js.map +1 -0
- package/dist/esm/commands/conversationWizard.js +529 -0
- package/dist/esm/commands/conversationWizard.js.map +1 -0
- package/dist/esm/commands/deploy.js +239 -0
- package/dist/esm/commands/deploy.js.map +1 -0
- package/dist/esm/commands/ecom.js +234 -0
- package/dist/esm/commands/ecom.js.map +1 -0
- package/dist/esm/commands/embed.js +112 -0
- package/dist/esm/commands/embed.js.map +1 -0
- package/dist/esm/commands/init.js +66 -30
- package/dist/esm/commands/init.js.map +1 -1
- package/dist/esm/commands/instructions.js +459 -0
- package/dist/esm/commands/instructions.js.map +1 -0
- package/dist/esm/commands/login.js +66 -6
- package/dist/esm/commands/login.js.map +1 -1
- package/dist/esm/commands/logout.js +12 -0
- package/dist/esm/commands/logout.js.map +1 -0
- package/dist/esm/commands/serve.js +117 -0
- package/dist/esm/commands/serve.js.map +1 -0
- package/dist/esm/commands/storybook.js +97 -0
- package/dist/esm/commands/storybook.js.map +1 -0
- package/dist/esm/commands/validate.js +623 -19
- package/dist/esm/commands/validate.js.map +1 -1
- package/dist/esm/commands/whoami.js +44 -0
- package/dist/esm/commands/whoami.js.map +1 -0
- package/dist/esm/templates/aiInstructionsSchema.js +5 -1
- package/dist/esm/templates/aiInstructionsSchema.js.map +1 -1
- package/dist/esm/templates/cmsMappingSchema.js +128 -0
- package/dist/esm/templates/cmsMappingSchema.js.map +1 -0
- package/dist/esm/utils/print.js +10 -0
- package/dist/esm/utils/print.js.map +1 -1
- package/dist/esm/utils/project.js +23 -0
- package/dist/esm/utils/project.js.map +1 -1
- package/dist/esm/utils/wixApi.js +53 -0
- package/dist/esm/utils/wixApi.js.map +1 -0
- package/dist/types/auth/deviceFlow.d.ts +3 -1
- package/dist/types/auth/deviceFlow.d.ts.map +1 -1
- package/dist/types/auth/index.d.ts +6 -1
- package/dist/types/auth/index.d.ts.map +1 -1
- package/dist/types/auth/secretStore.d.ts +2 -0
- package/dist/types/auth/secretStore.d.ts.map +1 -1
- package/dist/types/commands/bundle.d.ts +10 -0
- package/dist/types/commands/bundle.d.ts.map +1 -0
- package/dist/types/commands/conversation.d.ts +3 -0
- package/dist/types/commands/conversation.d.ts.map +1 -0
- package/dist/types/commands/conversationWizard.d.ts +3 -0
- package/dist/types/commands/conversationWizard.d.ts.map +1 -0
- package/dist/types/commands/deploy.d.ts +3 -0
- package/dist/types/commands/deploy.d.ts.map +1 -0
- package/dist/types/commands/ecom.d.ts +3 -0
- package/dist/types/commands/ecom.d.ts.map +1 -0
- package/dist/types/commands/embed.d.ts +3 -0
- package/dist/types/commands/embed.d.ts.map +1 -0
- package/dist/types/commands/init.d.ts.map +1 -1
- package/dist/types/commands/instructions.d.ts +3 -0
- package/dist/types/commands/instructions.d.ts.map +1 -0
- package/dist/types/commands/login.d.ts.map +1 -1
- package/dist/types/commands/logout.d.ts +3 -0
- package/dist/types/commands/logout.d.ts.map +1 -0
- package/dist/types/commands/serve.d.ts +3 -0
- package/dist/types/commands/serve.d.ts.map +1 -0
- package/dist/types/commands/storybook.d.ts +3 -0
- package/dist/types/commands/storybook.d.ts.map +1 -0
- package/dist/types/commands/validate.d.ts +7 -0
- package/dist/types/commands/validate.d.ts.map +1 -1
- package/dist/types/commands/whoami.d.ts +3 -0
- package/dist/types/commands/whoami.d.ts.map +1 -0
- package/dist/types/templates/aiInstructionsSchema.d.ts.map +1 -1
- package/dist/types/templates/cmsMappingSchema.d.ts +2 -0
- package/dist/types/templates/cmsMappingSchema.d.ts.map +1 -0
- package/dist/types/utils/print.d.ts +3 -0
- package/dist/types/utils/print.d.ts.map +1 -1
- package/dist/types/utils/project.d.ts +12 -0
- package/dist/types/utils/project.d.ts.map +1 -1
- package/dist/types/utils/wixApi.d.ts +9 -0
- package/dist/types/utils/wixApi.d.ts.map +1 -0
- package/package.json +5 -5
- package/defaults/package.json +0 -42
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Command","readline","execSync","inquirer","wixRequest","isJsonMode","findProjectRoot","readConfig","writeConfig","copyToClipboard","text","cmd","process","platform","undefined","input","promptCopyToClipboard","rl","createInterface","stdin","output","stdout","Promise","resolve","question","close","console","log","promptForType","type","prompt","name","message","choices","value","getOrCreateClientId","_createData$oAuthApp","queryData","path","method","body","apps","oAuthApps","existing","find","app","id","createData","oAuthApp","application_type","Error","embedCommand","description","option","action","opts","root","cwd","config","clientId","embedScript","JSON","stringify","embedCode","clipboard","isTTY","err","error","exit"],"sources":["../../../src/commands/embed.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as readline from 'readline';\nimport { execSync } from 'child_process';\nimport inquirer from 'inquirer';\nimport { wixRequest } from '../utils/wixApi';\nimport { isJsonMode } from '../utils/print';\nimport { findProjectRoot, readConfig, writeConfig } from '../utils/project';\n\nfunction copyToClipboard(text: string): void {\n const cmd =\n process.platform === 'win32'\n ? `echo ${text} | clip`\n : process.platform === 'darwin'\n ? 'pbcopy'\n : 'xclip -selection clipboard';\n\n execSync(\n process.platform === 'win32' ? `echo ${text} | clip` : cmd,\n process.platform === 'win32' ? undefined : { input: text },\n );\n}\n\nasync function promptCopyToClipboard(text: string): Promise<void> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return new Promise((resolve) => {\n rl.question('\\nPress Enter to copy to clipboard...', () => {\n rl.close();\n copyToClipboard(text);\n console.log('Copied to clipboard.');\n resolve();\n });\n });\n}\n\ntype EmbedType = 'script' | 'react';\n\ninterface OAuthApp {\n id: string;\n name: string;\n}\n\ninterface QueryResponse {\n oAuthApps?: OAuthApp[];\n}\n\ninterface CreateResponse {\n oAuthApp?: OAuthApp;\n}\n\nasync function promptForType(): Promise<EmbedType> {\n const { type } = await inquirer.prompt<{ type: EmbedType }>([\n {\n type: 'list',\n name: 'type',\n message: 'Select embed type:',\n choices: [\n { name: 'Script tag', value: 'script' },\n { name: 'React component', value: 'react' },\n ],\n },\n ]);\n return type;\n}\n\nasync function getOrCreateClientId(): Promise<string> {\n console.log('Searching for client ID...');\n\n const queryData = await wixRequest<QueryResponse>({\n path: '/oauth-app/v1/oauth-apps/query',\n method: 'POST',\n body: {},\n });\n\n const apps = queryData.oAuthApps ?? [];\n const existing = apps.find((app) => app.name === 'web5');\n\n if (existing) {\n console.log(`Found client ID: ${existing.id}`);\n return existing.id;\n }\n\n console.log('Client ID not found, creating...');\n\n const createData = await wixRequest<CreateResponse>({\n path: '/oauth-app/v1/oauth-apps',\n method: 'POST',\n body: { oAuthApp: { name: 'web5', application_type: 'WEB_APP' } },\n });\n\n const id = createData.oAuthApp?.id;\n if (!id) {\n throw new Error('Failed to create OAuth app — no ID returned');\n }\n\n console.log(`Client ID created: ${id}`);\n return id;\n}\n\nexport const embedCommand = new Command('embed')\n .description('Generate embed code for a Web5 component')\n .option('--type <type>', 'Embed type: script or react')\n .option(\n '--client-id <id>',\n 'Use this client ID instead of fetching from the API',\n )\n .option('--no-clipboard', 'Print to stdout only — skip the clipboard prompt')\n .action(\n async (opts: { type?: string; clientId?: string; clipboard: boolean }) => {\n try {\n const type: EmbedType =\n (opts.type as EmbedType) ?? (await promptForType());\n\n if (type === 'react') {\n console.log('no react for now');\n return;\n }\n\n const root = findProjectRoot(process.cwd());\n const config = root ? readConfig(root) : null;\n\n const clientId =\n opts.clientId ??\n (config?.clientId || undefined) ??\n (await getOrCreateClientId());\n\n if (root && config && config.clientId !== clientId) {\n writeConfig(root, { ...config, clientId });\n }\n\n const embedScript = `<script src=\"https://www.wix.com/embed/v1/component.js\" data-client-id=\"${clientId}\"></script>`;\n\n if (isJsonMode()) {\n console.log(\n JSON.stringify({ type, clientId, embedCode: embedScript }),\n );\n return;\n }\n\n console.log('\\nEmbed script:\\n');\n console.log(embedScript);\n\n if (opts.clipboard !== false && process.stdout.isTTY) {\n await promptCopyToClipboard(embedScript);\n }\n } catch (err) {\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n },\n );\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,WAAW;AACnC,OAAO,KAAKC,QAAQ,MAAM,UAAU;AACpC,SAASC,QAAQ,QAAQ,eAAe;AACxC,OAAOC,QAAQ,MAAM,UAAU;AAC/B,SAASC,UAAU,QAAQ,iBAAiB;AAC5C,SAASC,UAAU,QAAQ,gBAAgB;AAC3C,SAASC,eAAe,EAAEC,UAAU,EAAEC,WAAW,QAAQ,kBAAkB;AAE3E,SAASC,eAAeA,CAACC,IAAY,EAAQ;EAC3C,MAAMC,GAAG,GACPC,OAAO,CAACC,QAAQ,KAAK,OAAO,GACxB,QAAQH,IAAI,SAAS,GACrBE,OAAO,CAACC,QAAQ,KAAK,QAAQ,GAC7B,QAAQ,GACR,4BAA4B;EAElCX,QAAQ,CACNU,OAAO,CAACC,QAAQ,KAAK,OAAO,GAAG,QAAQH,IAAI,SAAS,GAAGC,GAAG,EAC1DC,OAAO,CAACC,QAAQ,KAAK,OAAO,GAAGC,SAAS,GAAG;IAAEC,KAAK,EAAEL;EAAK,CAC3D,CAAC;AACH;AAEA,eAAeM,qBAAqBA,CAACN,IAAY,EAAiB;EAChE,MAAMO,EAAE,GAAGhB,QAAQ,CAACiB,eAAe,CAAC;IAClCH,KAAK,EAAEH,OAAO,CAACO,KAAK;IACpBC,MAAM,EAAER,OAAO,CAACS;EAClB,CAAC,CAAC;EACF,OAAO,IAAIC,OAAO,CAAEC,OAAO,IAAK;IAC9BN,EAAE,CAACO,QAAQ,CAAC,uCAAuC,EAAE,MAAM;MACzDP,EAAE,CAACQ,KAAK,CAAC,CAAC;MACVhB,eAAe,CAACC,IAAI,CAAC;MACrBgB,OAAO,CAACC,GAAG,CAAC,sBAAsB,CAAC;MACnCJ,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ;AAiBA,eAAeK,aAAaA,CAAA,EAAuB;EACjD,MAAM;IAAEC;EAAK,CAAC,GAAG,MAAM1B,QAAQ,CAAC2B,MAAM,CAAsB,CAC1D;IACED,IAAI,EAAE,MAAM;IACZE,IAAI,EAAE,MAAM;IACZC,OAAO,EAAE,oBAAoB;IAC7BC,OAAO,EAAE,CACP;MAAEF,IAAI,EAAE,YAAY;MAAEG,KAAK,EAAE;IAAS,CAAC,EACvC;MAAEH,IAAI,EAAE,iBAAiB;MAAEG,KAAK,EAAE;IAAQ,CAAC;EAE/C,CAAC,CACF,CAAC;EACF,OAAOL,IAAI;AACb;AAEA,eAAeM,mBAAmBA,CAAA,EAAoB;EAAA,IAAAC,oBAAA;EACpDV,OAAO,CAACC,GAAG,CAAC,4BAA4B,CAAC;EAEzC,MAAMU,SAAS,GAAG,MAAMjC,UAAU,CAAgB;IAChDkC,IAAI,EAAE,gCAAgC;IACtCC,MAAM,EAAE,MAAM;IACdC,IAAI,EAAE,CAAC;EACT,CAAC,CAAC;EAEF,MAAMC,IAAI,GAAGJ,SAAS,CAACK,SAAS,IAAI,EAAE;EACtC,MAAMC,QAAQ,GAAGF,IAAI,CAACG,IAAI,CAAEC,GAAG,IAAKA,GAAG,CAACd,IAAI,KAAK,MAAM,CAAC;EAExD,IAAIY,QAAQ,EAAE;IACZjB,OAAO,CAACC,GAAG,CAAC,oBAAoBgB,QAAQ,CAACG,EAAE,EAAE,CAAC;IAC9C,OAAOH,QAAQ,CAACG,EAAE;EACpB;EAEApB,OAAO,CAACC,GAAG,CAAC,kCAAkC,CAAC;EAE/C,MAAMoB,UAAU,GAAG,MAAM3C,UAAU,CAAiB;IAClDkC,IAAI,EAAE,0BAA0B;IAChCC,MAAM,EAAE,MAAM;IACdC,IAAI,EAAE;MAAEQ,QAAQ,EAAE;QAAEjB,IAAI,EAAE,MAAM;QAAEkB,gBAAgB,EAAE;MAAU;IAAE;EAClE,CAAC,CAAC;EAEF,MAAMH,EAAE,IAAAV,oBAAA,GAAGW,UAAU,CAACC,QAAQ,qBAAnBZ,oBAAA,CAAqBU,EAAE;EAClC,IAAI,CAACA,EAAE,EAAE;IACP,MAAM,IAAII,KAAK,CAAC,6CAA6C,CAAC;EAChE;EAEAxB,OAAO,CAACC,GAAG,CAAC,sBAAsBmB,EAAE,EAAE,CAAC;EACvC,OAAOA,EAAE;AACX;AAEA,OAAO,MAAMK,YAAY,GAAG,IAAInD,OAAO,CAAC,OAAO,CAAC,CAC7CoD,WAAW,CAAC,0CAA0C,CAAC,CACvDC,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC,CACtDA,MAAM,CACL,kBAAkB,EAClB,qDACF,CAAC,CACAA,MAAM,CAAC,gBAAgB,EAAE,kDAAkD,CAAC,CAC5EC,MAAM,CACL,MAAOC,IAA8D,IAAK;EACxE,IAAI;IACF,MAAM1B,IAAe,GAClB0B,IAAI,CAAC1B,IAAI,KAAmB,MAAMD,aAAa,CAAC,CAAC,CAAC;IAErD,IAAIC,IAAI,KAAK,OAAO,EAAE;MACpBH,OAAO,CAACC,GAAG,CAAC,kBAAkB,CAAC;MAC/B;IACF;IAEA,MAAM6B,IAAI,GAAGlD,eAAe,CAACM,OAAO,CAAC6C,GAAG,CAAC,CAAC,CAAC;IAC3C,MAAMC,MAAM,GAAGF,IAAI,GAAGjD,UAAU,CAACiD,IAAI,CAAC,GAAG,IAAI;IAE7C,MAAMG,QAAQ,GACZJ,IAAI,CAACI,QAAQ,KACZ,CAAAD,MAAM,oBAANA,MAAM,CAAEC,QAAQ,KAAI7C,SAAS,CAAC,KAC9B,MAAMqB,mBAAmB,CAAC,CAAC,CAAC;IAE/B,IAAIqB,IAAI,IAAIE,MAAM,IAAIA,MAAM,CAACC,QAAQ,KAAKA,QAAQ,EAAE;MAClDnD,WAAW,CAACgD,IAAI,EAAE;QAAE,GAAGE,MAAM;QAAEC;MAAS,CAAC,CAAC;IAC5C;IAEA,MAAMC,WAAW,GAAG,2EAA2ED,QAAQ,aAAa;IAEpH,IAAItD,UAAU,CAAC,CAAC,EAAE;MAChBqB,OAAO,CAACC,GAAG,CACTkC,IAAI,CAACC,SAAS,CAAC;QAAEjC,IAAI;QAAE8B,QAAQ;QAAEI,SAAS,EAAEH;MAAY,CAAC,CAC3D,CAAC;MACD;IACF;IAEAlC,OAAO,CAACC,GAAG,CAAC,mBAAmB,CAAC;IAChCD,OAAO,CAACC,GAAG,CAACiC,WAAW,CAAC;IAExB,IAAIL,IAAI,CAACS,SAAS,KAAK,KAAK,IAAIpD,OAAO,CAACS,MAAM,CAAC4C,KAAK,EAAE;MACpD,MAAMjD,qBAAqB,CAAC4C,WAAW,CAAC;IAC1C;EACF,CAAC,CAAC,OAAOM,GAAG,EAAE;IACZxC,OAAO,CAACyC,KAAK,CAAC,QAAQ,EAAGD,GAAG,CAAWlC,OAAO,CAAC;IAC/CpB,OAAO,CAACwD,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CACF,CAAC","ignoreList":[]}
|
|
@@ -2,10 +2,25 @@ import { Command } from 'commander';
|
|
|
2
2
|
import inquirer from 'inquirer';
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import * as fs from 'fs';
|
|
5
|
-
import { readFile } from 'fs/promises';
|
|
5
|
+
import { readFile, cp } from 'fs/promises';
|
|
6
|
+
import chalk from 'chalk';
|
|
6
7
|
import { success, error, info, warn } from '../utils/print';
|
|
7
8
|
import { atomicWrite, ensureDir } from '../utils/fs';
|
|
9
|
+
import { isAuthenticated, getToken } from '../auth';
|
|
10
|
+
import { promptSiteSelection } from '../auth/deviceFlow';
|
|
8
11
|
const DEFAULTS_DIR = path.join(__dirname, '../../../defaults');
|
|
12
|
+
function printBanner() {
|
|
13
|
+
const logo = ['██╗ ██╗ ███████╗ ██████╗ ███████╗', '██║ ██║ ██╔════╝ ██╔══██╗ ██╔════╝', '██║ █╗ ██║ █████╗ ██████╔╝ ███████╗', '██║███╗██║ ██╔══╝ ██╔══██╗ ╚════██║', '╚███╔███╔╝ ███████╗ ██████╔╝ ███████║', ' ╚══╝╚══╝ ╚══════╝ ╚═════╝ ╚══════╝'];
|
|
14
|
+
console.log('');
|
|
15
|
+
for (const line of logo) {
|
|
16
|
+
console.log(chalk.cyan(line));
|
|
17
|
+
}
|
|
18
|
+
console.log('');
|
|
19
|
+
console.log(chalk.dim(' Build AI-powered client components for the Wix platform.'));
|
|
20
|
+
console.log(chalk.dim(' Define sections, actions, and AI instructions —'));
|
|
21
|
+
console.log(chalk.dim(' the platform interprets user intent and delivers personalized experiences.'));
|
|
22
|
+
console.log('');
|
|
23
|
+
}
|
|
9
24
|
async function copyDefault(srcRelative, destAbsolute, substitutions) {
|
|
10
25
|
if (substitutions === void 0) {
|
|
11
26
|
substitutions = {};
|
|
@@ -17,6 +32,13 @@ async function copyDefault(srcRelative, destAbsolute, substitutions) {
|
|
|
17
32
|
}
|
|
18
33
|
await atomicWrite(destAbsolute, content);
|
|
19
34
|
}
|
|
35
|
+
async function copyDefaultTree(srcRelative, destAbsolute, filter) {
|
|
36
|
+
const srcPath = path.join(DEFAULTS_DIR, srcRelative);
|
|
37
|
+
await cp(srcPath, destAbsolute, {
|
|
38
|
+
recursive: true,
|
|
39
|
+
filter
|
|
40
|
+
});
|
|
41
|
+
}
|
|
20
42
|
function findExistingConfig(startDir) {
|
|
21
43
|
let current = startDir;
|
|
22
44
|
let parent = path.dirname(current);
|
|
@@ -53,8 +75,14 @@ async function resolveString(flag, isTTY, question, opts) {
|
|
|
53
75
|
const answers = await inquirer.prompt(question);
|
|
54
76
|
return answers.value ?? opts.defaultValue ?? '';
|
|
55
77
|
}
|
|
56
|
-
export const initCommand = new Command('init').description('Scaffold a new Web5 client component library').option('--mode <mode>', 'scaffold mode: defaults or scratch', 'defaults').option('--name <name>', 'npm package name (e.g. @wix/my-components)').option('--display-name <displayName>', 'human-readable display name').option('--dir <dir>', 'output directory (default: derived from package name)').action(async opts => {
|
|
78
|
+
export const initCommand = new Command('init').description('Scaffold a new Web5 client component library').option('--mode <mode>', 'scaffold mode: defaults or scratch', 'defaults').option('--name <name>', 'npm package name (e.g. @wix/my-components)').option('--display-name <displayName>', 'human-readable display name').option('--dir <dir>', 'output directory (default: derived from package name)').option('--msid <msid>', 'Wix site ID to bind this project to').action(async opts => {
|
|
57
79
|
try {
|
|
80
|
+
const authed = await isAuthenticated();
|
|
81
|
+
if (!authed) {
|
|
82
|
+
error('You must be logged in. Run `web5 login` first.');
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
printBanner();
|
|
58
86
|
const existing = findExistingConfig(process.cwd());
|
|
59
87
|
if (existing) {
|
|
60
88
|
warn(`web5.config.json already exists at ${existing}`);
|
|
@@ -73,27 +101,32 @@ export const initCommand = new Command('init').description('Scaffold a new Web5
|
|
|
73
101
|
exitMsg: '--name is required in non-interactive mode'
|
|
74
102
|
});
|
|
75
103
|
|
|
76
|
-
// ──
|
|
77
|
-
const
|
|
78
|
-
const displayName =
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
104
|
+
// ── Derive: display name and output directory from package name ───────
|
|
105
|
+
const stem = name.split('/').pop();
|
|
106
|
+
const displayName = opts.displayName ?? stem.replace(/-/g, ' ');
|
|
107
|
+
const dir = opts.dir ?? stem;
|
|
108
|
+
let msid;
|
|
109
|
+
if (opts.msid) {
|
|
110
|
+
msid = opts.msid;
|
|
111
|
+
} else if (isTTY) {
|
|
112
|
+
const token = await getToken();
|
|
113
|
+
msid = await promptSiteSelection(token);
|
|
114
|
+
} else {
|
|
115
|
+
error('--msid is required in non-interactive mode');
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
let platformType;
|
|
119
|
+
if (isTTY) {
|
|
120
|
+
const answers = await inquirer.prompt([{
|
|
121
|
+
type: 'list',
|
|
122
|
+
name: 'value',
|
|
123
|
+
message: 'Platform type:',
|
|
124
|
+
choices: ['Content', 'Ecommerce']
|
|
125
|
+
}]);
|
|
126
|
+
platformType = answers.value;
|
|
127
|
+
} else {
|
|
128
|
+
platformType = 'Content';
|
|
129
|
+
}
|
|
97
130
|
const outDir = path.resolve(process.cwd(), dir);
|
|
98
131
|
if (fs.existsSync(outDir) && fs.readdirSync(outDir).length > 0) {
|
|
99
132
|
warn(`Directory ${outDir} already exists and is not empty`);
|
|
@@ -102,21 +135,24 @@ export const initCommand = new Command('init').description('Scaffold a new Web5
|
|
|
102
135
|
void mode;
|
|
103
136
|
const subs = {
|
|
104
137
|
NAME: name,
|
|
105
|
-
DISPLAY_NAME: displayName
|
|
138
|
+
DISPLAY_NAME: displayName,
|
|
139
|
+
MSID: msid,
|
|
140
|
+
PLATFORM_TYPE: platformType
|
|
106
141
|
};
|
|
107
142
|
|
|
108
143
|
// ── Root config files ─────────────────────────────────────────────────
|
|
109
|
-
await copyDefault('web5.config.json', path.join(outDir, 'web5.config.json'), subs);
|
|
110
|
-
await copyDefault('package.json', path.join(outDir, 'package.json'), subs);
|
|
144
|
+
await copyDefault('.web5.config.json', path.join(outDir, 'web5.config.json'), subs);
|
|
145
|
+
await copyDefault('package.template.json', path.join(outDir, 'package.json'), subs);
|
|
111
146
|
await copyDefault('tsconfig.json', path.join(outDir, 'tsconfig.json'));
|
|
112
147
|
|
|
113
148
|
// ── src/ ──────────────────────────────────────────────────────────────
|
|
114
149
|
await copyDefault('src/index.ts', path.join(outDir, 'src', 'index.ts'), subs);
|
|
115
150
|
await copyDefault('src/createRegistry.ts', path.join(outDir, 'src', 'createRegistry.ts'));
|
|
116
|
-
await
|
|
117
|
-
|
|
151
|
+
await copyDefaultTree('src/components', path.join(outDir, 'src', 'components'));
|
|
152
|
+
await copyDefaultTree('.storybook', path.join(outDir, '.storybook'));
|
|
153
|
+
await copyDefault('src/vite.cdn.config.ts', path.join(outDir, 'src', 'vite.cdn.config.ts'));
|
|
118
154
|
// ── src/configuration/ ────────────────────────────────────────────────
|
|
119
|
-
await copyDefault('src/
|
|
155
|
+
await copyDefault('src/client.config.ts', path.join(outDir, 'src', 'client.config.ts'));
|
|
120
156
|
await copyDefault('src/configuration/ai/prompt-instructions.yaml', path.join(outDir, 'src', 'configuration', 'ai', 'prompt-instructions.yaml'));
|
|
121
157
|
await copyDefault('src/configuration/cms/cms-mapping.yaml', path.join(outDir, 'src', 'configuration', 'cms', 'cms-mapping.yaml'));
|
|
122
158
|
await copyDefault('src/configuration/cms/cms-schema.yaml', path.join(outDir, 'src', 'configuration', 'cms', 'cms-schema.yaml'));
|
|
@@ -152,7 +188,7 @@ export const initCommand = new Command('init').description('Scaffold a new Web5
|
|
|
152
188
|
console.log('');
|
|
153
189
|
info('Next steps:');
|
|
154
190
|
info(` cd ${dir}`);
|
|
155
|
-
info('
|
|
191
|
+
info(' npm install');
|
|
156
192
|
} catch (err_) {
|
|
157
193
|
error(err_ instanceof Error ? err_.message : String(err_));
|
|
158
194
|
process.exit(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Command","inquirer","path","fs","readFile","success","error","info","warn","atomicWrite","ensureDir","DEFAULTS_DIR","join","__dirname","copyDefault","srcRelative","destAbsolute","substitutions","srcPath","content","token","value","Object","entries","replaceAll","findExistingConfig","startDir","current","parent","dirname","candidate","existsSync","resolveString","flag","isTTY","question","opts","defaultValue","undefined","exitMsg","process","exit","answers","prompt","initCommand","description","option","action","existing","cwd","Boolean","stdin","mode","name","type","message","validate","v","trim","length","defaultDisplay","split","pop","replace","displayName","default","defaultDir","dir","outDir","resolve","readdirSync","subs","NAME","DISPLAY_NAME","skill","folder","componentDir","console","log","err_","Error","String"],"sources":["../../../src/commands/init.ts"],"sourcesContent":["import { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { readFile } from 'fs/promises';\nimport { success, error, info, warn } from '../utils/print';\nimport { atomicWrite, ensureDir } from '../utils/fs';\n\nconst DEFAULTS_DIR = path.join(__dirname, '../../../defaults');\n\ntype Mode = 'defaults' | 'scratch';\n\ninterface InitOptions {\n mode?: Mode;\n name?: string;\n displayName?: string;\n dir?: string;\n}\n\nasync function copyDefault(\n srcRelative: string,\n destAbsolute: string,\n substitutions: Record<string, string> = {},\n): Promise<void> {\n const srcPath = path.join(DEFAULTS_DIR, srcRelative);\n let content = await readFile(srcPath, 'utf8');\n for (const [token, value] of Object.entries(substitutions)) {\n content = content.replaceAll(`{{${token}}}`, value);\n }\n await atomicWrite(destAbsolute, content);\n}\n\nfunction findExistingConfig(startDir: string): string | null {\n let current = startDir;\n let parent = path.dirname(current);\n while (current !== parent) {\n const candidate = path.join(current, 'web5.config.json');\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n current = parent;\n parent = path.dirname(current);\n }\n const candidate = path.join(current, 'web5.config.json');\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n return null;\n}\n\nasync function resolveString(\n flag: string | undefined,\n isTTY: boolean,\n question: Parameters<typeof inquirer.prompt>[0],\n opts: { defaultValue?: string; exitMsg?: string } = {},\n): Promise<string> {\n if (flag) {\n return flag;\n }\n if (!isTTY) {\n if (opts.defaultValue !== undefined) {\n return opts.defaultValue;\n }\n if (opts.exitMsg) {\n error(opts.exitMsg);\n }\n process.exit(1);\n }\n const answers = await inquirer.prompt<{ value: string }>(question);\n return answers.value ?? opts.defaultValue ?? '';\n}\n\nexport const initCommand = new Command('init')\n .description('Scaffold a new Web5 client component library')\n .option('--mode <mode>', 'scaffold mode: defaults or scratch', 'defaults')\n .option('--name <name>', 'npm package name (e.g. @wix/my-components)')\n .option('--display-name <displayName>', 'human-readable display name')\n .option(\n '--dir <dir>',\n 'output directory (default: derived from package name)',\n )\n .action(async (opts: InitOptions) => {\n try {\n const existing = findExistingConfig(process.cwd());\n if (existing) {\n warn(`web5.config.json already exists at ${existing}`);\n warn('Proceeding will create a nested project.');\n }\n\n const isTTY = Boolean(process.stdin.isTTY);\n const mode: Mode = opts.mode ?? 'defaults';\n\n // ── Collect: package name ─────────────────────────────────────────────\n const name = await resolveString(\n opts.name,\n isTTY,\n [\n {\n type: 'input',\n name: 'value',\n message: 'Package name (e.g. @wix/my-components):',\n validate: (v: string) =>\n v.trim().length > 0 ? true : 'Package name is required',\n },\n ],\n { exitMsg: '--name is required in non-interactive mode' },\n );\n\n // ── Collect: display name ─────────────────────────────────────────────\n const defaultDisplay = name.split('/').pop()!.replace(/-/g, ' ');\n const displayName = await resolveString(\n opts.displayName,\n isTTY,\n [\n {\n type: 'input',\n name: 'value',\n message: 'Display name:',\n default: defaultDisplay,\n },\n ],\n { defaultValue: defaultDisplay },\n );\n\n // ── Collect: output directory ─────────────────────────────────────────\n const defaultDir = name.split('/').pop()!;\n const dir = await resolveString(\n opts.dir,\n isTTY,\n [\n {\n type: 'input',\n name: 'value',\n message: 'Output directory:',\n default: defaultDir,\n },\n ],\n { defaultValue: defaultDir },\n );\n\n const outDir = path.resolve(process.cwd(), dir);\n\n if (fs.existsSync(outDir) && fs.readdirSync(outDir).length > 0) {\n warn(`Directory ${outDir} already exists and is not empty`);\n }\n\n info(`Scaffolding ${name} \\u2192 ${outDir}`);\n void mode;\n\n const subs = { NAME: name, DISPLAY_NAME: displayName };\n\n // ── Root config files ─────────────────────────────────────────────────\n await copyDefault(\n 'web5.config.json',\n path.join(outDir, 'web5.config.json'),\n subs,\n );\n await copyDefault(\n 'package.json',\n path.join(outDir, 'package.json'),\n subs,\n );\n await copyDefault('tsconfig.json', path.join(outDir, 'tsconfig.json'));\n\n // ── src/ ──────────────────────────────────────────────────────────────\n await copyDefault(\n 'src/index.ts',\n path.join(outDir, 'src', 'index.ts'),\n subs,\n );\n await copyDefault(\n 'src/createRegistry.ts',\n path.join(outDir, 'src', 'createRegistry.ts'),\n );\n await copyDefault(\n 'src/components/types.ts',\n path.join(outDir, 'src', 'components', 'types.ts'),\n );\n\n // ── src/configuration/ ────────────────────────────────────────────────\n await copyDefault(\n 'src/configuration/client.config.ts',\n path.join(outDir, 'src', 'configuration', 'client.config.ts'),\n );\n await copyDefault(\n 'src/configuration/ai/prompt-instructions.yaml',\n path.join(\n outDir,\n 'src',\n 'configuration',\n 'ai',\n 'prompt-instructions.yaml',\n ),\n );\n await copyDefault(\n 'src/configuration/cms/cms-mapping.yaml',\n path.join(outDir, 'src', 'configuration', 'cms', 'cms-mapping.yaml'),\n );\n await copyDefault(\n 'src/configuration/cms/cms-schema.yaml',\n path.join(outDir, 'src', 'configuration', 'cms', 'cms-schema.yaml'),\n );\n\n // ── src/actions/ ──────────────────────────────────────────────────────\n await copyDefault(\n 'src/actions/index.ts',\n path.join(outDir, 'src', 'actions', 'index.ts'),\n );\n await copyDefault(\n 'src/actions/bookDemoAction.ts',\n path.join(outDir, 'src', 'actions', 'bookDemoAction.ts'),\n );\n await copyDefault(\n 'src/actions/book-demo.yaml',\n path.join(outDir, 'src', 'actions', 'book-demo.yaml'),\n );\n await copyDefault(\n 'src/actions/contactAction.ts',\n path.join(outDir, 'src', 'actions', 'contactAction.ts'),\n );\n await copyDefault(\n 'src/actions/contact-action.yaml',\n path.join(outDir, 'src', 'actions', 'contact-action.yaml'),\n );\n\n // ── AGENTS.md ─────────────────────────────────────────────────────────\n await copyDefault('AGENTS.md', path.join(outDir, 'AGENTS.md'), subs);\n\n // ── docs/ ─────────────────────────────────────────────────────────────\n await copyDefault(\n 'docs/architecture.md',\n path.join(outDir, 'docs', 'architecture.md'),\n subs,\n );\n await copyDefault(\n 'docs/api-reference.md',\n path.join(outDir, 'docs', 'api-reference.md'),\n subs,\n );\n\n // ── skills/ ───────────────────────────────────────────────────────────\n for (const skill of [\n 'action-add',\n 'action-remove',\n 'action-update',\n 'section-add',\n 'section-remove',\n 'section-update',\n 'slot-add',\n ]) {\n await copyDefault(\n `skills/${skill}.md`,\n path.join(outDir, 'skills', `${skill}.md`),\n );\n }\n\n // ── Component subdirectories ──────────────────────────────────────────\n for (const folder of ['base', 'slots', 'sections']) {\n const componentDir = path.join(outDir, 'src', 'components', folder);\n await ensureDir(componentDir);\n await atomicWrite(path.join(componentDir, '.gitkeep'), '');\n }\n\n // ── Done ──────────────────────────────────────────────────────────────\n success(`Created ${name}`);\n console.log('');\n info('Next steps:');\n info(` cd ${dir}`);\n info(' yarn install');\n } catch (err_) {\n error(err_ instanceof Error ? err_.message : String(err_));\n process.exit(1);\n }\n });\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Command","inquirer","path","fs","readFile","cp","chalk","success","error","info","warn","atomicWrite","ensureDir","isAuthenticated","getToken","promptSiteSelection","DEFAULTS_DIR","join","__dirname","printBanner","logo","console","log","line","cyan","dim","copyDefault","srcRelative","destAbsolute","substitutions","srcPath","content","token","value","Object","entries","replaceAll","copyDefaultTree","filter","recursive","findExistingConfig","startDir","current","parent","dirname","candidate","existsSync","resolveString","flag","isTTY","question","opts","defaultValue","undefined","exitMsg","process","exit","answers","prompt","initCommand","description","option","action","authed","existing","cwd","Boolean","stdin","mode","name","type","message","validate","v","trim","length","stem","split","pop","displayName","replace","dir","msid","platformType","choices","outDir","resolve","readdirSync","subs","NAME","DISPLAY_NAME","MSID","PLATFORM_TYPE","skill","folder","componentDir","err_","Error","String"],"sources":["../../../src/commands/init.ts"],"sourcesContent":["import { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { readFile, cp } from 'fs/promises';\nimport chalk from 'chalk';\nimport { success, error, info, warn } from '../utils/print';\nimport { atomicWrite, ensureDir } from '../utils/fs';\nimport { isAuthenticated, getToken } from '../auth';\nimport { promptSiteSelection } from '../auth/deviceFlow';\n\nconst DEFAULTS_DIR = path.join(__dirname, '../../../defaults');\n\nfunction printBanner(): void {\n const logo = [\n '██╗ ██╗ ███████╗ ██████╗ ███████╗',\n '██║ ██║ ██╔════╝ ██╔══██╗ ██╔════╝',\n '██║ █╗ ██║ █████╗ ██████╔╝ ███████╗',\n '██║███╗██║ ██╔══╝ ██╔══██╗ ╚════██║',\n '╚███╔███╔╝ ███████╗ ██████╔╝ ███████║',\n ' ╚══╝╚══╝ ╚══════╝ ╚═════╝ ╚══════╝',\n ];\n console.log('');\n for (const line of logo) {\n console.log(chalk.cyan(line));\n }\n console.log('');\n console.log(\n chalk.dim(' Build AI-powered client components for the Wix platform.'),\n );\n console.log(chalk.dim(' Define sections, actions, and AI instructions —'));\n console.log(\n chalk.dim(\n ' the platform interprets user intent and delivers personalized experiences.',\n ),\n );\n console.log('');\n}\n\ntype Mode = 'defaults' | 'scratch';\n\ninterface InitOptions {\n mode?: Mode;\n name?: string;\n displayName?: string;\n dir?: string;\n msid?: string;\n}\n\nasync function copyDefault(\n srcRelative: string,\n destAbsolute: string,\n substitutions: Record<string, string> = {},\n): Promise<void> {\n const srcPath = path.join(DEFAULTS_DIR, srcRelative);\n let content = await readFile(srcPath, 'utf8');\n for (const [token, value] of Object.entries(substitutions)) {\n content = content.replaceAll(`{{${token}}}`, value);\n }\n await atomicWrite(destAbsolute, content);\n}\n\nasync function copyDefaultTree(\n srcRelative: string,\n destAbsolute: string,\n filter?: (src: string, dest: string) => boolean,\n): Promise<void> {\n const srcPath = path.join(DEFAULTS_DIR, srcRelative);\n await cp(srcPath, destAbsolute, { recursive: true, filter });\n}\n\nfunction findExistingConfig(startDir: string): string | null {\n let current = startDir;\n let parent = path.dirname(current);\n while (current !== parent) {\n const candidate = path.join(current, 'web5.config.json');\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n current = parent;\n parent = path.dirname(current);\n }\n const candidate = path.join(current, 'web5.config.json');\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n return null;\n}\n\nasync function resolveString(\n flag: string | undefined,\n isTTY: boolean,\n question: Parameters<typeof inquirer.prompt>[0],\n opts: { defaultValue?: string; exitMsg?: string } = {},\n): Promise<string> {\n if (flag) {\n return flag;\n }\n if (!isTTY) {\n if (opts.defaultValue !== undefined) {\n return opts.defaultValue;\n }\n if (opts.exitMsg) {\n error(opts.exitMsg);\n }\n process.exit(1);\n }\n const answers = await inquirer.prompt<{ value: string }>(question);\n return answers.value ?? opts.defaultValue ?? '';\n}\n\nexport const initCommand = new Command('init')\n .description('Scaffold a new Web5 client component library')\n .option('--mode <mode>', 'scaffold mode: defaults or scratch', 'defaults')\n .option('--name <name>', 'npm package name (e.g. @wix/my-components)')\n .option('--display-name <displayName>', 'human-readable display name')\n .option(\n '--dir <dir>',\n 'output directory (default: derived from package name)',\n )\n .option('--msid <msid>', 'Wix site ID to bind this project to')\n .action(async (opts: InitOptions) => {\n try {\n const authed = await isAuthenticated();\n if (!authed) {\n error('You must be logged in. Run `web5 login` first.');\n process.exit(1);\n }\n\n printBanner();\n\n const existing = findExistingConfig(process.cwd());\n if (existing) {\n warn(`web5.config.json already exists at ${existing}`);\n warn('Proceeding will create a nested project.');\n }\n\n const isTTY = Boolean(process.stdin.isTTY);\n const mode: Mode = opts.mode ?? 'defaults';\n\n // ── Collect: package name ─────────────────────────────────────────────\n const name = await resolveString(\n opts.name,\n isTTY,\n [\n {\n type: 'input',\n name: 'value',\n message: 'Package name (e.g. @wix/my-components):',\n validate: (v: string) =>\n v.trim().length > 0 ? true : 'Package name is required',\n },\n ],\n { exitMsg: '--name is required in non-interactive mode' },\n );\n\n // ── Derive: display name and output directory from package name ───────\n const stem = name.split('/').pop()!;\n const displayName = opts.displayName ?? stem.replace(/-/g, ' ');\n const dir = opts.dir ?? stem;\n\n let msid: string;\n if (opts.msid) {\n msid = opts.msid;\n } else if (isTTY) {\n const token = await getToken();\n msid = await promptSiteSelection(token!);\n } else {\n error('--msid is required in non-interactive mode');\n process.exit(1);\n }\n\n let platformType: string;\n if (isTTY) {\n const answers = await inquirer.prompt<{ value: string }>([\n {\n type: 'list',\n name: 'value',\n message: 'Platform type:',\n choices: ['Content', 'Ecommerce'],\n },\n ]);\n platformType = answers.value;\n } else {\n platformType = 'Content';\n }\n\n const outDir = path.resolve(process.cwd(), dir);\n\n if (fs.existsSync(outDir) && fs.readdirSync(outDir).length > 0) {\n warn(`Directory ${outDir} already exists and is not empty`);\n }\n\n info(`Scaffolding ${name} \\u2192 ${outDir}`);\n void mode;\n\n const subs = {\n NAME: name,\n DISPLAY_NAME: displayName,\n MSID: msid,\n PLATFORM_TYPE: platformType,\n };\n\n // ── Root config files ─────────────────────────────────────────────────\n await copyDefault(\n '.web5.config.json',\n path.join(outDir, 'web5.config.json'),\n subs,\n );\n await copyDefault(\n 'package.template.json',\n path.join(outDir, 'package.json'),\n subs,\n );\n await copyDefault('tsconfig.json', path.join(outDir, 'tsconfig.json'));\n\n // ── src/ ──────────────────────────────────────────────────────────────\n await copyDefault(\n 'src/index.ts',\n path.join(outDir, 'src', 'index.ts'),\n subs,\n );\n await copyDefault(\n 'src/createRegistry.ts',\n path.join(outDir, 'src', 'createRegistry.ts'),\n );\n await copyDefaultTree(\n 'src/components',\n path.join(outDir, 'src', 'components'),\n );\n await copyDefaultTree('.storybook', path.join(outDir, '.storybook'));\n await copyDefault(\n 'src/vite.cdn.config.ts',\n path.join(outDir, 'src', 'vite.cdn.config.ts'),\n );\n // ── src/configuration/ ────────────────────────────────────────────────\n await copyDefault(\n 'src/client.config.ts',\n path.join(outDir, 'src', 'client.config.ts'),\n );\n await copyDefault(\n 'src/configuration/ai/prompt-instructions.yaml',\n path.join(\n outDir,\n 'src',\n 'configuration',\n 'ai',\n 'prompt-instructions.yaml',\n ),\n );\n await copyDefault(\n 'src/configuration/cms/cms-mapping.yaml',\n path.join(outDir, 'src', 'configuration', 'cms', 'cms-mapping.yaml'),\n );\n await copyDefault(\n 'src/configuration/cms/cms-schema.yaml',\n path.join(outDir, 'src', 'configuration', 'cms', 'cms-schema.yaml'),\n );\n\n // ── src/actions/ ──────────────────────────────────────────────────────\n await copyDefault(\n 'src/actions/index.ts',\n path.join(outDir, 'src', 'actions', 'index.ts'),\n );\n await copyDefault(\n 'src/actions/bookDemoAction.ts',\n path.join(outDir, 'src', 'actions', 'bookDemoAction.ts'),\n );\n await copyDefault(\n 'src/actions/book-demo.yaml',\n path.join(outDir, 'src', 'actions', 'book-demo.yaml'),\n );\n await copyDefault(\n 'src/actions/contactAction.ts',\n path.join(outDir, 'src', 'actions', 'contactAction.ts'),\n );\n await copyDefault(\n 'src/actions/contact-action.yaml',\n path.join(outDir, 'src', 'actions', 'contact-action.yaml'),\n );\n\n // ── AGENTS.md ─────────────────────────────────────────────────────────\n await copyDefault('AGENTS.md', path.join(outDir, 'AGENTS.md'), subs);\n\n // ── docs/ ─────────────────────────────────────────────────────────────\n await copyDefault(\n 'docs/architecture.md',\n path.join(outDir, 'docs', 'architecture.md'),\n subs,\n );\n await copyDefault(\n 'docs/api-reference.md',\n path.join(outDir, 'docs', 'api-reference.md'),\n subs,\n );\n\n // ── skills/ ───────────────────────────────────────────────────────────\n for (const skill of [\n 'action-add',\n 'action-remove',\n 'action-update',\n 'section-add',\n 'section-remove',\n 'section-update',\n 'slot-add',\n ]) {\n await copyDefault(\n `skills/${skill}.md`,\n path.join(outDir, 'skills', `${skill}.md`),\n );\n }\n\n // ── Component subdirectories ──────────────────────────────────────────\n for (const folder of ['base', 'slots', 'sections']) {\n const componentDir = path.join(outDir, 'src', 'components', folder);\n await ensureDir(componentDir);\n await atomicWrite(path.join(componentDir, '.gitkeep'), '');\n }\n\n // ── Done ──────────────────────────────────────────────────────────────\n success(`Created ${name}`);\n console.log('');\n info('Next steps:');\n info(` cd ${dir}`);\n info(' npm install');\n } catch (err_) {\n error(err_ instanceof Error ? err_.message : String(err_));\n process.exit(1);\n }\n });\n"],"mappings":"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","ignoreList":[]}
|