velloo 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/BUN-LICENSE.md +4 -3
  2. package/README.md +112 -128
  3. package/THIRD-PARTY-NOTICES.md +61 -61
  4. package/canvas/assets/InitWizard-C1CkcS7C.js +3 -0
  5. package/canvas/assets/index-CZPX0col.css +2 -0
  6. package/canvas/assets/index-D7gy-ZUv.js +49 -0
  7. package/canvas/assets/lucide-all-B49qZ9YE.js +1 -0
  8. package/canvas/assets/radix-CuVEihKE.js +41 -0
  9. package/canvas/assets/react-C1iE8mnY.js +9 -0
  10. package/canvas/assets/rolldown-runtime-XKyaHtl9.js +1 -0
  11. package/canvas/assets/vendor-DXkvBgGY.js +58 -0
  12. package/canvas/assets/wand-sparkles-BxGgFkAt.js +1 -0
  13. package/canvas/index.html +6 -6
  14. package/{chunk-32cq4wpr.js → chunk-0rvdh1j3.js} +1 -1
  15. package/chunk-12pgt83m.js +8 -0
  16. package/chunk-12vc3f1h.js +3 -0
  17. package/{chunk-majd3gx9.js → chunk-28mhcvw2.js} +1 -1
  18. package/{chunk-ez720ked.js → chunk-3zm7ydna.js} +1 -1
  19. package/chunk-457fm9yy.js +7 -0
  20. package/chunk-46jg9aqy.js +40 -0
  21. package/chunk-5gwh0zpn.js +3 -0
  22. package/{chunk-q7wwqn03.js → chunk-5hb1e233.js} +1 -1
  23. package/{chunk-w30zfv3m.js → chunk-5ts4fvd9.js} +1 -1
  24. package/{chunk-rg86bhtb.js → chunk-62amy8bj.js} +1 -1
  25. package/{chunk-nrxqr4v5.js → chunk-6p8zwxxx.js} +1 -1
  26. package/{chunk-45wv1fs5.js → chunk-75gfv9g4.js} +11 -12
  27. package/chunk-84qjmqmz.js +2 -0
  28. package/{chunk-esg0x95a.js → chunk-85m9p67t.js} +2 -2
  29. package/chunk-91qesxwh.js +2 -0
  30. package/{chunk-hsk91jms.js → chunk-976rm76x.js} +1 -1
  31. package/chunk-99ccjbaa.js +4 -0
  32. package/{chunk-asqpx5v7.js → chunk-9hc7m55p.js} +3 -4
  33. package/{chunk-h3ser37q.js → chunk-a7xka0bj.js} +1 -1
  34. package/chunk-ak57bgnh.js +2 -0
  35. package/chunk-bf5808x5.js +2 -0
  36. package/{chunk-mqtnj8ws.js → chunk-bj47gjs9.js} +1 -1
  37. package/chunk-d0m56cjx.js +2 -0
  38. package/chunk-d6a6198y.js +3 -0
  39. package/{chunk-aefn23tr.js → chunk-etv7qsw7.js} +1 -1
  40. package/chunk-f2793pj6.js +85 -0
  41. package/{chunk-3612470d.js → chunk-fnv123mm.js} +1 -1
  42. package/{chunk-pjtg3wnm.js → chunk-fzevxpdz.js} +1 -1
  43. package/chunk-ghwy99py.js +68 -0
  44. package/chunk-gtt1qww8.js +2 -0
  45. package/chunk-hhkjqvww.js +1501 -0
  46. package/{chunk-d19ttv1a.js → chunk-hrvqwp8z.js} +1 -1
  47. package/{chunk-v6ks5v53.js → chunk-hxk0wkt3.js} +1 -1
  48. package/{chunk-qgbat4fv.js → chunk-jc95phff.js} +2 -2
  49. package/chunk-kwym0g80.js +11 -0
  50. package/chunk-kxcjme3n.js +6 -0
  51. package/{chunk-dy7qwj3t.js → chunk-mkctjrrz.js} +2 -2
  52. package/{chunk-z6r6wxm6.js → chunk-mknhfnkn.js} +1 -1
  53. package/chunk-mseawt58.js +849 -0
  54. package/{chunk-cg0sjdqt.js → chunk-nccfyeyy.js} +1 -1
  55. package/{chunk-c4164x55.js → chunk-npnxs0fy.js} +1 -1
  56. package/{chunk-ffm2jpxp.js → chunk-p9p2vbat.js} +2 -2
  57. package/chunk-pqc7dbhc.js +2 -0
  58. package/{chunk-g3k8k6fq.js → chunk-qc7c328q.js} +1 -1
  59. package/chunk-qe6pp4p6.js +72 -0
  60. package/{chunk-zgwvkgsz.js → chunk-qwy0jba8.js} +1 -1
  61. package/{chunk-mqx96m2g.js → chunk-s26bgjqz.js} +1 -1
  62. package/{chunk-8n07n0cr.js → chunk-s8pqbr4n.js} +2 -2
  63. package/{chunk-p93x4pn2.js → chunk-tjy12q19.js} +1 -1
  64. package/{chunk-cq2q36d1.js → chunk-v1by80c5.js} +1 -1
  65. package/chunk-vdy4ave9.js +2 -0
  66. package/chunk-vwhee991.js +3 -0
  67. package/chunk-wf7r45wh.js +12 -0
  68. package/chunk-x4jsr5et.js +17 -0
  69. package/{chunk-8qf0ne1p.js → chunk-x9gk2n9v.js} +1 -1
  70. package/chunk-xxjevh62.js +2 -0
  71. package/{chunk-s1cwck4c.js → chunk-y2y1b3zm.js} +1 -1
  72. package/chunk-y6jq6y8t.js +2 -0
  73. package/cli.js +1 -1
  74. package/package.json +11 -11
  75. package/pkgs/helpers/src/icon-data.ts +868 -172
  76. package/pkgs/schema/src/index.ts +1 -0
  77. package/pkgs/schema/src/snippet-resolve.ts +43 -0
  78. package/pkgs/shadcn-snapshot/dist/manifest.json +348 -0
  79. package/pkgs/shadcn-snapshot/src/components/canvas-portal.tsx +3 -3
  80. package/plugins/claude/velloo/.claude-plugin/plugin.json +5 -2
  81. package/plugins/gemini/gemini-extension.json +7 -2
  82. package/canvas/assets/index-CcPwhD7W.js +0 -31
  83. package/canvas/assets/index-CkVteRZ9.css +0 -2
  84. package/canvas/assets/lucide-all-Cezxn40A.js +0 -1
  85. package/canvas/assets/radix-gmpYzWRH.js +0 -41
  86. package/canvas/assets/react-D0Ec-185.js +0 -9
  87. package/canvas/assets/rolldown-runtime-hePW80VL.js +0 -1
  88. package/canvas/assets/vendor-CKmQ-Zst.js +0 -53
  89. package/chunk-07fxzrx2.js +0 -40
  90. package/chunk-4g4c9h7k.js +0 -2
  91. package/chunk-6w42sr61.js +0 -6
  92. package/chunk-80fjfyha.js +0 -86
  93. package/chunk-8ztgcajz.js +0 -8
  94. package/chunk-9g45c5md.js +0 -815
  95. package/chunk-b4hny6hw.js +0 -3
  96. package/chunk-bntsn3wj.js +0 -2
  97. package/chunk-djwvt6jx.js +0 -2
  98. package/chunk-dqqpbmxt.js +0 -22
  99. package/chunk-ejpccmcj.js +0 -18
  100. package/chunk-emty5315.js +0 -2
  101. package/chunk-jxgwdz2r.js +0 -5
  102. package/chunk-kvq7pcph.js +0 -2
  103. package/chunk-m0v3d581.js +0 -2
  104. package/chunk-nx0ex7qw.js +0 -2
  105. package/chunk-qqagacne.js +0 -4
  106. package/chunk-qx83fdv2.js +0 -85
  107. package/chunk-r5y1sh4f.js +0 -12
  108. package/chunk-rhfzy9c0.js +0 -2
  109. package/chunk-rrrn1mkq.js +0 -3
  110. package/chunk-sjxp2bx3.js +0 -2
  111. package/chunk-t08391mh.js +0 -3
  112. package/chunk-t61vyqpd.js +0 -2
  113. package/chunk-vbk1qhdz.js +0 -3
  114. package/chunk-x84qrz4q.js +0 -6
  115. package/chunk-xg49s85z.js +0 -1491
  116. package/chunk-xxw67jpk.js +0 -63
  117. package/chunk-yjwtdm71.js +0 -2
package/chunk-r5y1sh4f.js DELETED
@@ -1,12 +0,0 @@
1
- // @bun
2
- import{emitCode,emitHtml,classNamesInJsx,hostTailwindAdvisory,loadDesignFolder,registryForScreen,emitFrameworkContextFor,hostAppRootFrom,createServerProviderLoader,resolveProviders}from"./chunk-9g45c5md.js";import{ScreenSchema}from"./chunk-xxw67jpk.js";import"./chunk-xg49s85z.js";import"./chunk-bntsn3wj.js";import"./chunk-80fjfyha.js";import{fail}from"./chunk-s23gtejf.js";import"./chunk-p93x4pn2.js";import"./chunk-rrrn1mkq.js";import{findDesignConfig}from"./chunk-8qf0ne1p.js";import{createProgress}from"./chunk-pjtg3wnm.js";import{buildDefaultConfig}from"./chunk-z6r6wxm6.js";import{DESIGN_ARG_DESCRIPTION,resolveDesign,pickScreen}from"./chunk-6w42sr61.js";import{defineCommand}from"./chunk-2smsg2ct.js";import{readFile,writeFile}from"fs/promises";import{dirname,extname,isAbsolute,resolve}from"path";import{stdout}from"process";async function folderEmitContext(screenPath,screen){let found=await findDesignConfig(screenPath),design=found?await loadDesignFolder(found.folder):void 0,config=design?.config??buildDefaultConfig(),{providers,defaultProvider}=found?await resolveProviders(config,found.folder):await resolveProviders(config,dirname(screenPath),createServerProviderLoader()),framework=await emitFrameworkContextFor(screen,providers,defaultProvider,config.styling?.framework);if(framework.html){let registry=registryForScreen(screen,providers,defaultProvider,config.extensions??{},config.styling?.framework);return{emit:{},html:await emitHtml(screen,{registry,...design?{snippets:design.snippets}:{}}),tailwind:framework.tailwind}}return{emit:{...design?{snippets:design.snippets}:{},...config.extensions?{extensions:config.extensions}:{},...framework.emit},tailwind:framework.tailwind}}var emit_default=defineCommand({meta:{name:"emit",description:"Print or write agent-consumed IR for a screen."},args:{screen:{type:"positional",required:!1,description:"Screen id, or a path to a screen JSON. Omit to pick interactively."},design:{type:"string",description:DESIGN_ARG_DESCRIPTION},to:{type:"string",description:"Write IR as JSON to this path; for HTML screens, a .html path writes native markup. Omit to print the native body to stdout."},"components-alias":{type:"string",description:'Override the import prefix the IR mentions in snippet identifiers. Defaults to .design/config.json#codegen.componentsAlias, else "@/components/ui".'}},async run({args}){let interactive=Boolean(process.stdin.isTTY),screenArg=args.screen,screenPath=!!screenArg&&(screenArg.includes("/")||screenArg.endsWith(".json"))?resolve(screenArg):(await pickScreen(await resolveDesign(args.design,"emit",{designFlag:"--design"}),screenArg,interactive,"emit")).path,screenJson=JSON.parse(await readFile(screenPath,"utf8")),screen=ScreenSchema.parse(screenJson),progress=createProgress();progress.start("preparing code");try{let componentsAlias=args["components-alias"]??await readConfigAlias(screenPath),context=await folderEmitContext(screenPath,screen);if(progress.step("generating code"),context.html){let ir=context.html;if(progress.succeed("generated HTML"),args.to){let outPath=isAbsolute(args.to)?args.to:resolve(args.to),asMarkup=extname(outPath).toLowerCase()===".html";await writeFile(outPath,asMarkup?ir.html:JSON.stringify(ir,null,2),"utf8"),console.log(`velloo emit: wrote ${outPath}`);for(let warning of ir.warnings)console.log(` note: ${warning}`)}else stdout.write(`${ir.html}
3
- `);return}let result=await emitCode(screen,{...componentsAlias?{componentsAlias}:{},...context.emit});if(!result.ok){progress.fail("code generation failed");let e=result.error;if(e.kind==="UnknownComponent")fail("emit",`unknown component: ${JSON.stringify(e.ref)}`);else if(e.kind==="SnippetNotFound")fail("emit",`snippet not found: ${JSON.stringify(e.snippetId)}`);else fail("emit",`screen not found: ${JSON.stringify(e.screenId)}`)}let found=await findDesignConfig(screenPath),advisory=found&&context.tailwind?hostTailwindAdvisory(hostAppRootFrom(found.folder,found.config.hostApp),[...result.value.classesUsed,...result.value.snippetsUsed.flatMap((s)=>classNamesInJsx(s.jsx))],[found.folder]):{v3Compat:[],warnings:[]},tailwindV3Compat=advisory.v3Compat;if(args.to){progress.step("writing code");let outPath=isAbsolute(args.to)?args.to:resolve(args.to),ir={...result.value,warnings:[...result.value.warnings,...advisory.warnings],...tailwindV3Compat.length>0?{tailwindV3Compat}:{}};await writeFile(outPath,JSON.stringify(ir,null,2),"utf8"),progress.succeed("generated code"),console.log(`velloo emit: wrote ${outPath}`);for(let warning of advisory.warnings)console.log(` note: ${warning}`);return}if(progress.succeed("generated code"),stdout.write(`// screen: ${result.value.screen.id} (${result.value.screen.name})
4
- `),stdout.write(`// components: ${result.value.componentNames.join(", ")||"(none)"}
5
- `),result.value.iconsUsed.length>0)stdout.write(`// icons (lucide): ${result.value.iconsUsed.join(", ")}
6
- `);if(result.value.snippetsUsed.length>0)stdout.write(`// snippets: ${result.value.snippetsUsed.map((s)=>`${s.componentName}(${s.id})`).join(", ")}
7
- `);for(let issue of tailwindV3Compat)stdout.write(issue.v3?`// tailwind v3 host: \`${issue.class}\` \u2192 \`${issue.v3}\` (${issue.note})
8
- `:`// tailwind v3 host: \`${issue.class}\` \u2014 ${issue.note}
9
- `);for(let warning of advisory.warnings)stdout.write(`// note: ${warning}
10
- `);stdout.write(`
11
- `),stdout.write(`${result.value.jsx}
12
- `)}catch(error){throw progress.fail("code generation failed"),error}}});async function readConfigAlias(screenPath){return(await findDesignConfig(screenPath))?.config.codegen?.componentsAlias}export{emit_default as default};
package/chunk-rhfzy9c0.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import"./chunk-bntsn3wj.js";import"./chunk-xxw67jpk.js";import{loadCredential,verifyCredential}from"./chunk-rg86bhtb.js";import"./chunk-9g45c5md.js";import"./chunk-xg49s85z.js";import"./chunk-rrrn1mkq.js";import{listDaemons}from"./chunk-qgbat4fv.js";import"./chunk-80fjfyha.js";import"./chunk-s23gtejf.js";import"./chunk-dy7qwj3t.js";import"./chunk-32cq4wpr.js";import"./chunk-p93x4pn2.js";import"./chunk-45wv1fs5.js";import{designWithFolder}from"./chunk-cq2q36d1.js";import"./chunk-z6r6wxm6.js";import"./chunk-asqpx5v7.js";import{defaultCloudUrl}from"./chunk-w30zfv3m.js";import{require_picocolors}from"./chunk-jrsknzjt.js";import{__toESM,defineCommand}from"./chunk-2smsg2ct.js";var import_picocolors=__toESM(require_picocolors(),1);var status_default=defineCommand({meta:{name:"status",description:"List the velloo canvas daemons running on this machine + cloud sign-in"},args:{},async run(){let daemons=await listDaemons();if(daemons.length===0)console.log("velloo: no canvas daemons running.");else for(let d of daemons)console.log(`${d.canvasUrl} ${designWithFolder(d.root,void 0,{absolute:!0})} (pid ${d.pid}, since ${d.startedAt})`);let cloudUrl=defaultCloudUrl(),cred=await loadCredential(cloudUrl);if(!cred){console.log(import_picocolors.default.dim(`cloud: not signed in (${cloudUrl}) \u2014 run \`velloo login\` to share.`));return}let email=await verifyCredential(cloudUrl,cred.token,3000);console.log(email?`cloud: signed in as ${email} (${cloudUrl})`:import_picocolors.default.dim(`cloud: stored credential for ${cred.email} (${cloudUrl}) \u2014 expired or cloud unreachable; \`velloo login\` to refresh.`))}});export{status_default as default};
package/chunk-rrrn1mkq.js DELETED
@@ -1,3 +0,0 @@
1
- // @bun
2
- var package_default={name:"@velloo/cli",version:"0.8.0",license:"Apache-2.0",private:!0,type:"module",description:"Velloo CLI",bin:{velloo:"./src/cli.ts"},exports:{".":"./src/cli.ts"},engines:{bun:">=1.4.0"},scripts:{build:"bun run build.ts"},dependencies:{"@clack/prompts":"1.7.0","@velloo/canvas":"workspace:*","@velloo/codegen":"workspace:*","@velloo/protocol":"workspace:*","@velloo/provider":"workspace:*","@velloo/provider-antd":"workspace:*","@velloo/provider-chakra":"workspace:*","@velloo/provider-html":"workspace:*","@velloo/provider-mui":"workspace:*","@velloo/provider-none":"workspace:*","@velloo/renderer":"workspace:*","@velloo/result":"workspace:*","@velloo/schema":"workspace:*","@velloo/server":"workspace:*","@velloo/shadcn-snapshot":"workspace:*",citty:"0.2.2",picocolors:"1.1.1",zod:"4.5.4"},devDependencies:{"@types/pngjs":"6.0.5",pngjs:"7.0.0",react:"19.2.8","react-dom":"19.2.8"}};var PACKAGE_VERSION=package_default.version,TOOL_VERSION="0.8.0",BUILD_TIME_MS=1791986202380;
3
- export{PACKAGE_VERSION,TOOL_VERSION,BUILD_TIME_MS};
package/chunk-sjxp2bx3.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{recordedDesignName}from"./chunk-9g45c5md.js";import"./chunk-xxw67jpk.js";import"./chunk-xg49s85z.js";import"./chunk-bntsn3wj.js";import"./chunk-rrrn1mkq.js";import{assertLoopbackHost,daemonRoot,isLive,ensureDaemon,stopDaemon}from"./chunk-qgbat4fv.js";import"./chunk-80fjfyha.js";import{fail}from"./chunk-s23gtejf.js";import"./chunk-dy7qwj3t.js";import"./chunk-32cq4wpr.js";import"./chunk-p93x4pn2.js";import"./chunk-45wv1fs5.js";import{openUrl}from"./chunk-hggap8fq.js";import{createProgress}from"./chunk-pjtg3wnm.js";import{designWithFolder}from"./chunk-cq2q36d1.js";import"./chunk-z6r6wxm6.js";import"./chunk-asqpx5v7.js";import{findDesigns,DESIGN_ARG_DESCRIPTION,resolveDesign}from"./chunk-6w42sr61.js";import"./chunk-w30zfv3m.js";import{traceEnabled}from"./chunk-6tx68d90.js";import{require_picocolors}from"./chunk-jrsknzjt.js";import{__toESM,defineCommand}from"./chunk-2smsg2ct.js";import{basename,join}from"path";var import_picocolors=__toESM(require_picocolors(),1);function actionForRunKey(key,targetCount=1){if(key==="b")return{kind:"background"};if(key==="q"||key==="\x03")return{kind:"stop"};if(targetCount<=1)return key==="o"?{kind:"open"}:null;if(key==="a"||key==="o")return{kind:"open"};if(/^[1-9]$/.test(key)){let index=Number(key);return index<=targetCount?{kind:"open",index}:null}return null}function shouldStayForeground(opts){return!opts.background&&opts.stdinIsTTY}function bindRunKeys(onKey){let stdin=process.stdin;if(!stdin.isTTY)return()=>{};stdin.setRawMode(!0),stdin.resume(),stdin.setEncoding("utf8");let onData=(chunk)=>{onKey(chunk)};return stdin.on("data",onData),()=>{if(stdin.off("data",onData),stdin.isTTY)stdin.setRawMode(!1);stdin.pause()}}var LIVE_POLL_MS=2000;async function waitInForeground(opts){return await new Promise((resolve)=>{let settled=!1,unbind=()=>{},timer,finish=(outcome)=>{if(settled)return;if(settled=!0,unbind(),timer!==void 0)clearInterval(timer);process.off("SIGINT",onStop),process.off("SIGTERM",onStop),resolve(outcome)},onStop=()=>finish("stop");unbind=bindRunKeys((key)=>{let action=actionForRunKey(key,opts.targetCount??1);if(!action)return;if(action.kind==="open")opts.onOpen(action.index);else finish(action.kind)}),process.on("SIGINT",onStop),process.on("SIGTERM",onStop),timer=setInterval(()=>{opts.isLive().then((live)=>{if(!live)finish("died")})},LIVE_POLL_MS)})}import{resolve}from"path";async function resolveRunTargets(arg,opts={}){let cwd=resolve(opts.cwd??"."),single=async()=>{let folder=await resolveDesign(arg,"run",{interactive:!0,requireConfig:!0,cwd});return[{name:recordedDesignName(folder)??void 0,folder}]};if(arg)return single();let found;try{found=await findDesigns(cwd)}catch{return single()}if(!found||found.designs.length<2)return single();let targets=[];for(let design of found.designs)if(design.exists&&!design.outsideRepo)targets.push({name:design.name,folder:design.root});if(targets.length===0)return single();if(targets.length===1)return targets;let defaultDesign=found.defaultDesign;if(defaultDesign)targets.sort((a,b)=>a.name===defaultDesign?-1:b.name===defaultDesign?1:0);return targets}function label(target){return recordedDesignName(target.folder)??target.name??basename(target.folder)}function printKeys(attached){if(console.log(""),attached.length>1)attached.forEach(({target},i)=>{console.log(` ${import_picocolors.default.cyan(String(i+1))} open ${label(target)}`)}),console.log(` ${import_picocolors.default.cyan("a")} open all`);else console.log(` ${import_picocolors.default.cyan("o")} open the browser`);console.log(` ${import_picocolors.default.cyan("b")} run in the background`),console.log(` ${import_picocolors.default.cyan("q")} stop`),console.log("")}function printBackgroundStay(designArg){console.log(`velloo: it keeps running in the background \u2014 awake while the canvas is open or an agent is connected. Stop it anytime with \`velloo stop${designArg}\`.`)}var run_default=defineCommand({meta:{name:"run",description:"Open the canvas for a design folder and stay in the foreground (starts a persistent canvas if none is running)"},args:{design:{type:"positional",required:!1,description:DESIGN_ARG_DESCRIPTION},port:{type:"string",description:"Preferred canvas port when starting fresh (default: the port this folder ran on last, else 7300)"},host:{type:"string",description:"Loopback bind hostname: 127.0.0.1 (default), localhost or ::1"},open:{type:"boolean",default:!1,description:"Open the canvas in your browser"},background:{type:"boolean",default:!1,description:"Leave the canvas running and return to the shell (the default when stdin is not a TTY)"}},async run({args}){assertLoopbackHost(args.host??"127.0.0.1");let targets=await resolveRunTargets(args.design,{}),preferredPort=args.port?Number(args.port):void 0;if(preferredPort!==void 0&&(!Number.isFinite(preferredPort)||preferredPort<0))fail("run",`invalid --port ${JSON.stringify(args.port)}`);let progress=createProgress();progress.start(targets.length>1?"starting canvases":"starting canvas");let spawned=0,running=[];try{for(let[index,target]of targets.entries()){if(targets.length>1)progress.step(`starting ${label(target)}`);let rec=await ensureDaemon(target.folder,{...preferredPort!==void 0&&index===0?{preferredPort}:{},host:args.host,onSpawn:()=>{spawned++,progress.step(`waiting for ${label(target)}`)}});running.push({target,rec})}progress.succeed(spawned===0?targets.length>1?"connected to running canvases":"connected to running canvas":targets.length>1?`started ${targets.length} canvases`:"started canvas")}catch(error){throw progress.fail("could not start canvas"),error}let designArg=args.design?` ${args.design}`:"",first=running[0];if(running.length===1)console.log(`velloo: design ${designWithFolder(first.target.folder,first.target.name)}`),console.log(`velloo: canvas at ${first.rec.canvasUrl}`);else{console.log("velloo: canvases");let rows=running.map(({target,rec})=>({design:designWithFolder(target.folder,target.name),url:rec.canvasUrl})),width=Math.max(...rows.map((row)=>row.design.length));for(let row of rows)console.log(` ${import_picocolors.default.bold(row.design.padEnd(width))} ${row.url}`)}if(traceEnabled())if(spawned>0)console.log(`velloo: \u29BF trace recording ON \u2014 agent MCP calls tape to ${join(first.target.folder,".velloo","trace")} (view with \`velloo trace\`)`);else console.log(`velloo: VELLOO_TRACE is set, but a canvas was already running \u2014 recording is NOT active on it. Run \`velloo stop${designArg}\`, then re-run to record. The agent must also connect through this same (trace-enabled) velloo.`);let foreground=shouldStayForeground({background:Boolean(args.background),stdinIsTTY:Boolean(process.stdin.isTTY)});if(foreground)printKeys(running);else printBackgroundStay(designArg);let attached=running,openTarget=(index)=>{let picked=index===void 0?attached:[attached[index-1]];for(let entry of picked)if(entry)openUrl(entry.rec.canvasUrl)};if(args.open)openTarget(running.length>1?void 0:1);if(!foreground)return;for(;;){let outcome=await waitInForeground({isLive:async()=>{for(let{rec}of attached)if(!await isLive(rec))return!1;return!0},onOpen:openTarget,targetCount:attached.length});if(outcome==="background"){printBackgroundStay(designArg);return}if(outcome==="died"){let alive=[];for(let entry of attached)if(await isLive(entry.rec))alive.push(entry);else console.log(`velloo: the canvas for "${label(entry.target)}" stopped.`);if(attached=alive,attached.length===0){console.log(`velloo: no canvases left. Start again with \`velloo run${designArg}\`.`);return}console.log(import_picocolors.default.dim(` Still running: ${attached.map(({target})=>label(target)).join(", ")}.`)),printKeys(attached);continue}for(let{target}of attached){let stopped=await stopDaemon(daemonRoot(target.folder));console.log(stopped?`velloo: stopped ${designWithFolder(target.folder)}`:`velloo: no canvas running for ${designWithFolder(target.folder)}`)}return}}});export{run_default as default};
package/chunk-t08391mh.js DELETED
@@ -1,3 +0,0 @@
1
- // @bun
2
- import{isCancel,select}from"./chunk-80fjfyha.js";import"./chunk-xxw67jpk.js";import"./chunk-9g45c5md.js";import"./chunk-xg49s85z.js";import"./chunk-bntsn3wj.js";import"./chunk-rrrn1mkq.js";import{daemonRoot,listDaemons,stopDaemon}from"./chunk-qgbat4fv.js";import{fail}from"./chunk-s23gtejf.js";import"./chunk-dy7qwj3t.js";import"./chunk-32cq4wpr.js";import"./chunk-p93x4pn2.js";import"./chunk-45wv1fs5.js";import{designWithFolder}from"./chunk-cq2q36d1.js";import"./chunk-z6r6wxm6.js";import"./chunk-asqpx5v7.js";import{DESIGN_ARG_DESCRIPTION,resolveDesign}from"./chunk-6w42sr61.js";import"./chunk-w30zfv3m.js";import{require_picocolors}from"./chunk-jrsknzjt.js";import{__toESM,defineCommand}from"./chunk-2smsg2ct.js";import{resolve}from"path";var import_picocolors=__toESM(require_picocolors(),1);var ALL="__all__",canvasLine=(d)=>`${designWithFolder(d.root,void 0,{absolute:!0})} \u2014 ${d.canvasUrl}`;async function stopEach(daemons){for(let d of daemons)await stopDaemon(d.root),console.log(`velloo: stopped ${canvasLine(d)}`)}async function designHere(){try{return await resolveDesign(void 0,"stop",{onFail:()=>{throw Error("no design here")}})}catch{return}}function runningFor(daemons,folder){if(!folder)return;let root=resolve(daemonRoot(folder));return daemons.find((d)=>resolve(d.root)===root)?.root}var stop_default=defineCommand({meta:{name:"stop",description:"Stop a running canvas (picks from the running ones when none is named)"},args:{design:{type:"positional",required:!1,description:DESIGN_ARG_DESCRIPTION},all:{type:"boolean",default:!1,description:"Stop every running velloo canvas on this machine"}},async run({args}){if(args.all){let daemons=await listDaemons();if(daemons.length===0)console.log("velloo: no canvas daemons running.");else await stopEach(daemons);return}if(!args.design&&process.stdin.isTTY){let daemons=await listDaemons();if(daemons.length===0){console.log("velloo: no canvas daemons running.");return}if(daemons.length===1){await stopEach(daemons);return}let here=runningFor(daemons,await designHere()),ordered=[...daemons].sort((a,b)=>a.root===here?-1:b.root===here?1:0),chosen=await select({message:"Stop which canvas?",options:[...ordered.map((d)=>({value:d.root,label:designWithFolder(d.root,void 0,{absolute:!0}),hint:d.root===here?`${d.canvasUrl} \xB7 this directory`:d.canvasUrl})),{value:ALL,label:`All ${daemons.length} canvases`}],...here?{initialValue:here}:{}});if(isCancel(chosen))fail("stop","cancelled.");await stopEach(chosen===ALL?daemons:daemons.filter((d)=>d.root===chosen));return}if(!args.design&&!await designHere()){let daemons=await listDaemons();if(daemons.length===0){console.log("velloo: no canvas daemons running.");return}fail("stop",[`there is no design in this directory. ${daemons.length} canvas${daemons.length===1?" is":"es are"} running \u2014 stop one by its design folder, or all of them with \`velloo stop --all\`:`,...daemons.map((d)=>` ${canvasLine(d)}`)].join(`
3
- `))}let folder=await resolveDesign(args.design,"stop"),root=daemonRoot(folder);if(await stopDaemon(root)){console.log(`velloo: stopped ${designWithFolder(folder)}`);return}console.log(`velloo: no canvas running for ${designWithFolder(folder)}`);let others=await listDaemons();if(others.length===0)return;console.log(import_picocolors.default.dim(` ${others.length} canvas${others.length===1?"":"es"} running elsewhere \u2014 run \`velloo stop\` to pick, or \`velloo stop --all\`:`));for(let d of others)console.log(import_picocolors.default.dim(` ${canvasLine(d)}`))}});export{stop_default as default};
package/chunk-t61vyqpd.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{registry2,loadManifest2}from"./chunk-qx83fdv2.js";import{snapshotVersion2,entryCssPath3,componentsDir3}from"./chunk-p93x4pn2.js";import"./chunk-8ztgcajz.js";import"./chunk-xxw67jpk.js";export{componentsDir3 as componentsDir,entryCssPath3 as entryCssPath,loadManifest2 as loadManifest,registry2 as registry,snapshotVersion2 as snapshotVersion};
package/chunk-vbk1qhdz.js DELETED
@@ -1,3 +0,0 @@
1
- // @bun
2
- async function copyToClipboard(text){let candidates=process.platform==="darwin"?[["pbcopy"]]:process.platform==="win32"?[["clip"]]:[["wl-copy"],["xclip","-selection","clipboard"],["xsel","--clipboard","--input"]];for(let argv of candidates){let bin=argv[0];if(!bin||!Bun.which(bin))continue;let proc=Bun.spawn(argv,{stdin:"pipe",stdout:"ignore",stderr:"ignore"});if(proc.stdin.write(text),await proc.stdin.end(),await proc.exited===0)return!0}return!1}
3
- export{copyToClipboard};
package/chunk-x84qrz4q.js DELETED
@@ -1,6 +0,0 @@
1
- // @bun
2
- import{isCancel,confirm,select}from"./chunk-80fjfyha.js";import{designNameIssue}from"./chunk-xxw67jpk.js";import{managedDesignId,localDesignOf,removeLocalDesign,recordedDesignName,designRenameConflict,followDesignRename,loadDesignFolder}from"./chunk-9g45c5md.js";import"./chunk-xg49s85z.js";import"./chunk-bntsn3wj.js";import{agentRootCandidates}from"./chunk-07fxzrx2.js";import"./chunk-rrrn1mkq.js";import{daemonRoot,readLock,isLive,stopDaemon}from"./chunk-qgbat4fv.js";import{fail}from"./chunk-s23gtejf.js";import"./chunk-dy7qwj3t.js";import"./chunk-32cq4wpr.js";import"./chunk-p93x4pn2.js";import{displayPath}from"./chunk-45wv1fs5.js";import"./chunk-cg0sjdqt.js";import"./chunk-d19ttv1a.js";import{recordedAppRoot,planAppRootChange,applyAppRootChange,promptAppRootChoice,planRelocation,relocateDesign,runInit2}from"./chunk-dqqpbmxt.js";import"./chunk-rg86bhtb.js";import{repinAgentConfigs,migrateFolder2}from"./chunk-mqx96m2g.js";import"./chunk-pjtg3wnm.js";import"./chunk-ez720ked.js";import"./chunk-z6r6wxm6.js";import"./chunk-asqpx5v7.js";import{findManifest,manifestListing,findDesigns,unregisterDesign,isWithin,writeDesignName,registerLocalDesign,DESIGN_ARG_DESCRIPTION,hasDesignConfig,DESIGN_ID_ARG,resolveDesign,checkoutDesigns}from"./chunk-6w42sr61.js";import"./chunk-w30zfv3m.js";import{require_picocolors}from"./chunk-jrsknzjt.js";import{__toESM,defineCommand}from"./chunk-2smsg2ct.js";import{randomUUID}from"crypto";import{existsSync,realpathSync}from"fs";import{readdir,rm}from"fs/promises";import{join,relative,resolve}from"path";var import_picocolors=__toESM(require_picocolors(),1);async function countJson(dir,skipSuffix){try{return(await readdir(dir)).filter((f)=>f.endsWith(".json")&&!(skipSuffix&&f.endsWith(skipSuffix))).length}catch{return 0}}async function daemonState(folder){let rec=await readLock(daemonRoot(folder));if(!rec)return"stopped";return await isLive(rec)?`running :${rec.canvasPort}`:"stopped"}var list=defineCommand({meta:{name:"list",description:"List the repo's designs"},async run(){let cwd=resolve("."),found=await findDesigns(cwd).catch((err)=>{fail("design list",err.message)});if(!found||found.designs.length===0){let only=await resolveDesign(void 0,"design list",{requireConfig:!0,cwd,takesDesign:!1,onFail:(message)=>fail("design list",message)}),name=recordedDesignName(only)??"(unnamed)",owner=await manifestListing(only).catch(()=>null);if(owner&&owner.dir!==cwd){console.log(`velloo design: "${name}" (${relative(cwd,only)||only}) is listed in \`${relative(cwd,owner.path)}\`. Run \`velloo design list\` from \`${relative(cwd,owner.dir)||"."}\` to see that project's designs.`);return}console.log("velloo design: 1 design (no velloo.json yet)"),console.log(` ${import_picocolors.default.dim("1")} ${import_picocolors.default.bold(name)} ${relative(cwd,only)||only} ${await daemonState(only)}`),console.log(import_picocolors.default.dim(" `velloo design add` creates a second design and lists both."));return}let base=found.repo?.dir??found.local[0]?.root??cwd,rows=[];for(let design of found.designs){let live=design.exists&&!design.outsideRepo;rows.push({name:found.conflicts.has(design.name)?`${design.name} (duplicate)`:design.name,path:design.local?`${displayPath(design.root)} (local)`:relative(base,design.root)||".",boards:live?await countJson(join(design.root,"boards"),".notes.json"):0,state:design.outsideRepo?import_picocolors.default.yellow("outside the repo"):live?await daemonState(design.root):import_picocolors.default.yellow("missing"),live})}let pad=(text,width)=>text+" ".repeat(Math.max(0,width-Bun.stringWidth(text))),width=Math.max(...rows.map((r)=>Bun.stringWidth(r.name))),pathWidth=Math.max(...rows.map((r)=>Bun.stringWidth(r.path))),idWidth=String(rows.length).length;console.log(`velloo design: ${rows.length} in ${base}`);for(let[index,row]of rows.entries()){let marker=row.name===found.defaultDesign?import_picocolors.default.cyan("\u25CF"):" ",id=import_picocolors.default.dim(String(index+1).padStart(idWidth)),boards=row.live?`${row.boards} board${row.boards===1?"":"s"}`:"\u2014";console.log(` ${id} ${marker} ${import_picocolors.default.bold(pad(row.name,width))} ${import_picocolors.default.dim(pad(row.path,pathWidth))} ${boards.padEnd(9)} ${row.state}`)}console.log(import_picocolors.default.dim(" Pass a number as --id to the other `velloo design` commands."));for(let[name,designs]of found.conflicts)console.log(import_picocolors.default.yellow(` ! ${designs.length} designs are named "${name}" \u2014 rename one with \`velloo design rename <path> <new-name>\`.`))}}),add=defineCommand({meta:{name:"add",description:"Create another design in this repo (the init wizard, folder pre-chosen)"},args:{path:{type:"positional",required:!1,description:"Where the new design folder goes, relative to the repo (asked when omitted)"},external:{type:"boolean",description:"Create in Velloo-managed external storage"},nonInteractive:{type:"boolean",description:"Use defaults without prompting"},connect:{type:"boolean",default:!0,description:"Wire project agents"},library:{type:"string",description:"Component library (default: the sibling folder's)"},name:{type:"string",description:"The design's name (default: derived from its folder)"}},async run({args}){await runInit2({addFolder:!0,external:args.external,nonInteractive:args.nonInteractive,connect:args.connect,...args.path?{designFolder:args.path}:{},...args.library?{library:args.library}:{},...args.name?{name:args.name}:{}})}}),remove=defineCommand({meta:{name:"remove",description:"Remove a design \u2014 one outside the repo can keep its files (asked, or --delete-content)"},args:{design:{type:"positional",required:!1,description:DESIGN_ARG_DESCRIPTION},id:DESIGN_ID_ARG,deleteContent:{type:"boolean",description:"Also delete the files of a design outside the repo (with --yes, or to skip the question)"},yes:{type:"boolean",description:"Skip the confirmation (required without an interactive terminal)"}},async run({args}){let cwd=resolve("."),folder=await resolveDesign(args.design,"design remove",{id:args.id,interactive:!0,requireConfig:!0,cwd}),local=localDesignOf(folder);if(!Boolean(process.stdin.isTTY)&&args.yes!==!0)fail("design remove","refusing to delete a design folder without --yes");let boards=await countJson(join(folder,"boards"),".notes.json"),screens=await countJson(join(folder,"screens"),".annotations.json"),name=recordedDesignName(folder)??folder;console.log(`velloo design: ${name} (${folder})`),console.log(import_picocolors.default.dim(` ${boards} board${boards===1?"":"s"}, ${screens} screen${screens===1?"":"s"}`));let keepContent=local!==null&&args.deleteContent!==!0;if(args.yes!==!0)if(local&&args.deleteContent!==!0){let managed=managedDesignId(folder)!==null,choice=await select({message:"Remove this design?",initialValue:managed?"delete":"keep",options:[{value:"delete",label:"Delete it and its files",hint:managed?"in Velloo's storage":folder},{value:"keep",label:"Forget it, keep the files",hint:folder},{value:"cancel",label:"Cancel"}]});if(isCancel(choice)||choice==="cancel"){console.log(import_picocolors.default.dim(" Nothing changed."));return}keepContent=choice==="keep"}else{let approved=await confirm({message:"Delete this design folder and everything in it?",initialValue:!1});if(isCancel(approved)||!approved){console.log(import_picocolors.default.dim(" Nothing changed."));return}}if(await stopDaemon(daemonRoot(folder)))console.log(import_picocolors.default.dim(" Stopped its canvas."));let dropped=local?null:await unregisterDesign(folder,cwd).catch((err)=>fail("design remove",err.message));if(local)await removeLocalDesign(local.id);if(!keepContent)await rm(folder,{recursive:!0,force:!0});if(console.log(`velloo design: ${keepContent?"retained content at":"removed"} ${folder}`),local)console.log(import_picocolors.default.dim(` Forgot the local design "${name}".`));if(dropped?.name)console.log(import_picocolors.default.dim(dropped.removedManifest?` Dropped "${dropped.name}" \u2014 velloo.json listed no other designs, so it's gone too.`:` Dropped "${dropped.name}" from velloo.json.`))}}),move=defineCommand({meta:{name:"move",description:"Preview moving a design between the repository, managed storage and another directory; --yes applies"},args:{design:{type:"positional",required:!1,description:DESIGN_ARG_DESCRIPTION},id:DESIGN_ID_ARG,external:{type:"boolean",description:"Move to managed storage (a local design)"},to:{type:"string",description:"New directory \u2014 inside the repository it goes in velloo.json, outside it is local"},yes:{type:"boolean",description:"Apply the displayed move"}},async run({args}){let source=await resolveDesign(args.design,"design move",{id:args.id,interactive:!0,requireConfig:!0}),plan=await planRelocation(source,resolve("."),args.to,args.external===!0).catch((err)=>fail("design move",err.message)),local="a local design on this machine",recorded=plan.sourceManifestPath?plan.destinationLocal?`velloo.json path "${plan.sourceManifestPath}" \u2192 ${"a local design on this machine"}`:`velloo.json path "${plan.sourceManifestPath}" \u2192 "${plan.destinationManifestPath}"`:plan.destinationLocal?"stays a local design on this machine":`${"a local design on this machine"} \u2192 velloo.json path "${plan.destinationManifestPath}"`;if(console.log(`Source: ${plan.source}
3
- Destination: ${plan.destination}
4
- Design "${plan.designName}": ${recorded}`),!args.yes){console.log("Preview only. Add --yes to apply the move.");return}await relocateDesign(plan),console.log(`Moved ${plan.designName} to ${plan.destination}. Run velloo connect to refresh existing agent guidance.`)}});async function renameThroughCanvas(folder,name){let rec=await readLock(daemonRoot(folder));if(!rec||!await isLive(rec))return!1;let res;try{res=await fetch(`http://127.0.0.1:${rec.canvasPort}/api/mutate/update_design_name`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({name}),signal:AbortSignal.timeout(1e4)})}catch(err){fail("design rename",`the running canvas didn't answer (${err.message}).`)}if(res.ok)return!0;let body=await res.json().catch(()=>null);fail("design rename",body?.error?.message??`the running canvas refused (HTTP ${res.status}).`)}var rename=defineCommand({meta:{name:"rename",description:"Rename a design"},args:{design:{type:"positional",required:!1,description:"The design to rename \u2014 its current name or its folder path (or use --id)"},name:{type:"positional",required:!1,description:"The new name"},id:DESIGN_ID_ARG},async run({args}){let cwd=resolve("."),newName=args.id!==void 0&&args.name===void 0?args.design:args.name,target=args.id!==void 0&&args.name===void 0?void 0:args.design;if(newName===void 0)fail("design rename","pass the design and its new name: `velloo design rename <design> <new name>`.");let folder=await resolveDesign(target,"design rename",{id:args.id,requireConfig:!0,cwd}),previous=recordedDesignName(folder);if(previous===newName){console.log(import_picocolors.default.dim(` Already named "${newName}" \u2014 nothing changed.`));return}let conflict=await designRenameConflict(folder,newName).catch((err)=>fail("design rename",err.message));if(conflict)fail("design rename",conflict);if(!await renameThroughCanvas(folder,newName)){if(await writeDesignName(folder,newName),previous&&await followDesignRename(folder,previous,newName))console.log(import_picocolors.default.dim(` velloo.json defaultDesign \u2192 "${newName}"`))}console.log(`velloo design: renamed ${previous?`"${previous}" `:""}to "${newName}".`);let repinned=previous?await repinAgentConfigs({projectRoots:await agentRootCandidates(folder),designFolder:folder,names:[previous]}).catch(()=>[]):[];for(let path of repinned)console.log(import_picocolors.default.dim(` ${relative(cwd,path)||path}: no longer names the design`))}}),upgrade=defineCommand({meta:{name:"upgrade",description:"Migrate a design to this Velloo's format, without upgrading Velloo itself"},args:{design:{type:"positional",required:!1,description:DESIGN_ARG_DESCRIPTION},id:DESIGN_ID_ARG,all:{type:"boolean",description:"Migrate every design in this checkout"},"dry-run":{type:"boolean",default:!1,description:"Show what would change without writing"},skills:{type:"boolean",default:!0,description:"Also refresh the installed agent skills / plugin / rules to this velloo's versions"}},async run({args}){if(args.all&&(args.design||args.id!==void 0))fail("design upgrade","pass a design or --all, not both.");let folders=args.all?await checkoutDesigns(resolve(".")):[await resolveDesign(args.design,"design upgrade",{id:args.id,interactive:!0,requireConfig:!0})];if(folders.length===0)fail("design upgrade","no designs here \u2014 `velloo init` creates one.");for(let folder of folders)await migrateFolder2(folder,{dryRun:args["dry-run"],skills:args.skills})}}),bind=defineCommand({meta:{name:"bind",description:"Attach a design folder outside this checkout to it, on this machine only"},args:{design:{type:"positional",required:!0,description:"The design folder (in managed storage or anywhere outside the checkout)"},name:{type:"string",description:"Rename the design as it is bound"},yes:{type:"boolean",description:"Confirm the local binding"}},async run({args}){let cwd=resolve("."),folder=resolve(args.design);if(!await hasDesignConfig(folder))fail("design bind",`${folder} is not a velloo design folder (no .design/config.json).`);let root=cwd;if(isWithin(root,folder))fail("design bind",`${folder} is inside this checkout (${root}); a design here belongs in velloo.json \u2014 see \`velloo design add\`.`);let name=args.name??recordedDesignName(folder);if(!name)fail("design bind",`${folder} has no design name \u2014 run \`velloo upgrade ${folder}\` first.`);let issue=designNameIssue(name);if(issue)fail("design bind",`invalid --name ${JSON.stringify(name)} \u2014 ${issue}`);let clash=(await findDesigns(root).catch((err)=>fail("design bind",err.message)))?.designs.find((d)=>d.name===name&&!(existsSync(d.root)&&realpathSync(d.root)===realpathSync(folder)));if(clash)fail("design bind",`a design named "${name}" already exists at ${clash.root} \u2014 pass --name to bind this one under another.`);let existing=localDesignOf(folder),appRoot=existing?join(root,relative(existing.root,existing.appRoot)):root,listed=(await findManifest(cwd).catch(()=>null))?.folders.some((path)=>existsSync(path)&&realpathSync(path)===realpathSync(folder));if(console.log(`Design: ${name} (${folder})
5
- Checkout: ${root}
6
- Application: ${appRoot}`),listed)console.log("velloo.json: drops its entry, which cannot point outside the repo");if(!args.yes){console.log("Preview only. Add --yes to confirm this local binding.");return}if(await loadDesignFolder(folder,{preferences:!1}),await stopDaemon(daemonRoot(folder)),listed)await unregisterDesign(folder,cwd).catch((err)=>fail("design bind",err.message));if(name!==recordedDesignName(folder))await writeDesignName(folder,name);await registerLocalDesign({id:existing?.id??managedDesignId(folder)??randomUUID(),root,appRoot:existsSync(appRoot)?appRoot:root,...managedDesignId(folder)?{}:{designPath:folder}}).catch((err)=>fail("design bind",err.message)),console.log(`Bound "${name}" to ${root} on this machine.`)}}),setAppRoot=defineCommand({meta:{name:"set-app-root",description:"Point a design at a different application root"},args:{design:{type:"positional",required:!1,description:DESIGN_ARG_DESCRIPTION},id:DESIGN_ID_ARG,to:{type:"string",description:"New application root (asked from the repo's apps when omitted)"},yes:{type:"boolean",description:"Apply the displayed change"}},async run({args}){let folder=await resolveDesign(args.design,"design set-app-root",{id:args.id,interactive:!0,requireConfig:!0}),current=await recordedAppRoot(folder);console.log(`Design: ${folder}`),console.log(`Application: ${current.path}${current.exists?current.looksLikeApp?"":import_picocolors.default.yellow(" (no package.json)"):import_picocolors.default.yellow(" (missing)")}`);let target=args.to?resolve(args.to):await promptAppRootChoice(current.path);if(!target){console.log(import_picocolors.default.dim(" No other application found in this repo \u2014 pass --to <path>."));return}let change=await planAppRootChange(folder,target).catch((err)=>fail("design set-app-root",err.message));if(resolve(change.to)===resolve(change.from)){console.log(import_picocolors.default.dim(" Already pointing there \u2014 nothing changed."));return}if(!existsSync(change.to))fail("design set-app-root",`${change.to} does not exist.`);if(console.log(`New application: ${change.to}`),!existsSync(join(change.to,"package.json")))console.log(import_picocolors.default.yellow(" ! no package.json there \u2014 codegen and live islands will not resolve"));if(change.local)console.log(import_picocolors.default.dim(` local design record: appRoot \u2192 ${change.to}`));for(let r of change.rewritten)console.log(import_picocolors.default.dim(` ${r.field}: ${r.from} \u2192 ${r.to}`));if(!args.yes){console.log("Preview only. Add --yes to apply.");return}await stopDaemon(daemonRoot(folder)),await applyAppRootChange(folder,change),console.log(`velloo design: application root is now ${change.to}`)}}),design_default=defineCommand({meta:{name:"design",description:"Manage this repo's designs (list, add, remove, move, rename, upgrade, \u2026)"},subCommands:{list,add,remove,move,rename,upgrade,bind,"set-app-root":setAppRoot},run:({args})=>args._?.length?void 0:list.run?.({args,cmd:list,rawArgs:[]})});export{design_default as default};