@platforma-sdk/block-tools 2.10.16 → 2.10.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,24 +1,24 @@
1
1
  Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./config-xxVy3IQR.js`);let t=require(`@oclif/core`),n=require(`node:path`);n=e._t(n);let r=require(`node:fs`);r=e._t(r);let i=require(`@milaboratories/pl-model-middle-layer`),a=require(`@milaboratories/ts-helpers-oclif`),o=require(`yaml`);o=e._t(o);let s=require(`node:timers/promises`),c=require(`@inquirer/prompts`);var l=class i extends t.Command{static description=`Extracts meta information from blocks package.json and outputs meta.json with embedded binary and textual information linked from the meta section.`;static flags={modulePath:t.Flags.string({char:`i`,summary:`input module path`,helpValue:`<path>`,default:`.`}),destination:t.Flags.string({char:`o`,summary:`output meta.json file`,helpValue:`<path>`,required:!0})};async run(){let{flags:t}=await this.parse(i),a=n.default.resolve(t.modulePath),o=await e.et(await e.rt((await e.U(a)).meta,a));await r.default.promises.writeFile(n.default.resolve(t.destination),JSON.stringify(o))}};async function u(e){try{return await r.default.promises.readFile(e,`utf8`)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}}var d=class e extends t.Command{static description=`Extracts and outputs block model JSON from pre-built block model module`;static flags={modulePath:t.Flags.string({char:`i`,summary:`input module path`,helpValue:`<path>`,default:`.`}),sourceBundle:t.Flags.string({char:`b`,summary:`bundled model code to embed into the model for callback-based rendering to work`,helpValue:`<path>`,default:`./dist/bundle.js`}),destination:t.Flags.string({char:`o`,summary:`output model file`,helpValue:`<path>`,default:`./dist/model.json`})};async run(){let{flags:t}=await this.parse(e),i=n.default.resolve(t.modulePath),{model:a,platforma:o}=require(i);if(a||=o,!a)throw Error(`"model" export not found`);let{config:s}=a;if(!s)throw Error(`Malformed "model" object, check it is created with "BlockModel" and ".done()" is executed as the call in the chain.`);if(!(`outputs`in s)||!(`sections`in s))throw Error(`"config" has unexpected structure`);let c=await u(t.sourceBundle);c!==void 0&&(s.code={type:`plain`,content:c}),await r.default.promises.writeFile(n.default.resolve(t.destination),JSON.stringify(s))}},f=class n extends t.Command{static description=`List all available global overview snapshots in the registry`;static flags={registry:t.Flags.string({char:`r`,summary:`full address of the registry`,helpValue:`<address>`,env:`PL_REGISTRY`,required:!0}),json:t.Flags.boolean({summary:`output in JSON format`,default:!1})};async run(){let{flags:t}=await this.parse(n),r=await new e.b(e._(t.registry),new a.OclifLoggerAdapter(this)).listGlobalOverviewSnapshots();if(t.json)this.log(JSON.stringify(r,null,2));else if(r.length===0)this.log(`No snapshots found.`);else{this.log(`Found ${r.length} snapshot(s):\n`);for(let e of r)this.log(` ${e.timestamp}`),this.log(` Path: ${e.path}`),this.log(``)}}},ee=class r extends t.Command{static description=`Mark target block stable`;static flags={modulePath:t.Flags.string({char:`i`,summary:`input module path`,helpValue:`<path>`,default:`.`}),channel:t.Flags.string({char:`c`,hidden:!0,summary:`custom channel`,helpValue:`<channel name>`,default:i.StableChannel}),"version-override":t.Flags.file({char:`v`,summary:`override package version`}),registry:t.Flags.string({char:`r`,summary:`full address of the registry`,helpValue:`<address>`,env:`PL_REGISTRY`,required:!0}),refresh:t.Flags.boolean({summary:`refresh repository after adding the package`,default:!0,allowNo:!0,env:`PL_REGISTRY_REFRESH`}),unmark:t.Flags.boolean({summary:`reverses meaning of this command, flag can be used to remove "stable" flag from the package`,default:!1})};async run(){let{flags:t}=await this.parse(r),o=await e.U(n.default.resolve(t.modulePath));t[`version-override`]&&(o=(0,i.overrideDescriptionVersion)(o,t[`version-override`]));let s=new e.b(e._(t.registry),new a.OclifLoggerAdapter(this));t.unmark?await s.removePackageFromChannel(o.id,t.channel):await s.addPackageToChannel(o.id,t.channel),t.refresh&&await s.updateIfNeeded()}},te=class r extends t.Command{static description=`Builds block pack and outputs a block pack manifest consolidating all references assets into a single folder`;static flags={modulePath:t.Flags.string({char:`i`,summary:`input module path`,helpValue:`<path>`,default:`.`}),destinationPath:t.Flags.string({char:`o`,summary:`output folder`,helpValue:`<path>`,default:`./block-pack`})};async run(){let{flags:t}=await this.parse(r);await e.K(await e.H(n.default.resolve(t.modulePath)),n.default.resolve(t.destinationPath))}};function ne(e,t){let n={...e};for(let e in t)t[e]&&typeof t[e]==`object`&&!Array.isArray(t[e])&&n[e]&&typeof n[e]==`object`&&!Array.isArray(n[e])?n[e]=ne(n[e],t[e]):n[e]=t[e];return n}var re=class o extends t.Command{static description=`Publishes the block package and refreshes the registry (for v2 block-pack schema)`;static flags={registry:t.Flags.string({char:`r`,summary:`full address of the registry`,helpValue:`<address>`,env:`PL_REGISTRY`,required:!0}),manifest:t.Flags.file({char:`m`,summary:`manifest file path`,exists:!0,default:`./block-pack/${e.O}`}),"version-override":t.Flags.file({char:`v`,summary:`override package version`}),refresh:t.Flags.boolean({summary:`refresh repository after adding the package`,default:!0,allowNo:!0,env:`PL_REGISTRY_REFRESH`}),unstable:t.Flags.boolean({summary:`do not add the published package to stable channel`,default:!1,env:`PL_PUBLISH_UNSTABLE`})};async run(){let{flags:t}=await this.parse(o),s=n.default.resolve(t.manifest),c=JSON.parse(await r.default.promises.readFile(s,{encoding:`utf-8`})),l=i.BlockPackManifest.parse(c);l=ne(c,l);let u=n.default.dirname(s);this.log(`Manifest root = ${u}`),t[`version-override`]&&(l=(0,i.overrideManifestVersion)(l,t[`version-override`]));let d=new e.b(e._(t.registry),new a.OclifLoggerAdapter(this));await d.publishPackage(l,async e=>Buffer.from(await r.default.promises.readFile(n.default.resolve(u,e)))),t.unstable||(this.log(`Adding package to ${i.StableChannel} channel...`),await d.addPackageToChannel(l.description.id,i.StableChannel)),t.refresh&&await d.updateIfNeeded()}},ie=class n extends t.Command{static description=`Refresh overview files based on published but not proecessed artefacts`;static flags={registry:t.Flags.string({char:`r`,summary:`full address of the registry`,helpValue:`<address>`,env:`PL_REGISTRY`,required:!0}),mode:t.Flags.string({char:`m`,summary:`refresh mode (allowed valiues: "force", "normal", "dry-run")`,helpValue:`<mode>`,options:[`force`,`normal`,`dry-run`],env:`PL_REGISTRY_REFRESH_DRY_RUN`,default:`normal`})};async run(){let{flags:t}=await this.parse(n);await new e.b(e._(t.registry),new a.OclifLoggerAdapter(this)).updateIfNeeded(t.mode)}},ae=class n extends t.Command{static description=`Restore global overview from a snapshot`;static flags={registry:t.Flags.string({char:`r`,summary:`full address of the registry`,helpValue:`<address>`,env:`PL_REGISTRY`,required:!0}),snapshot:t.Flags.string({char:`s`,summary:`snapshot timestamp ID to restore from`,helpValue:`<timestamp>`,required:!0}),"skip-confirmation":t.Flags.boolean({summary:`skip confirmation prompt (use with caution)`,default:!1})};async run(){let{flags:t}=await this.parse(n),r=new e.b(e._(t.registry),new a.OclifLoggerAdapter(this)),i=await r.listGlobalOverviewSnapshots();if(i.find(e=>e.timestamp===t.snapshot)||this.error(`Snapshot '${t.snapshot}' not found. Available snapshots:\n${i.map(e=>` - ${e.timestamp}`).join(`
2
- `)||` (none)`}`),!t[`skip-confirmation`]){let e=(await import(`node:readline`)).createInterface({input:process.stdin,output:process.stdout}),n=await new Promise(n=>{e.question(`⚠️ This will overwrite the current global overview with snapshot '${t.snapshot}'.\nAre you sure you want to continue? (y/N): `,n)});if(e.close(),n.toLowerCase()!==`y`&&n.toLowerCase()!==`yes`){this.log(`Restore cancelled.`);return}}try{await r.restoreGlobalOverviewFromSnapshot(t.snapshot),this.log(`✅ Successfully restored global overview from snapshot '${t.snapshot}'`)}catch(e){this.error(`Failed to restore from snapshot: ${String(e)}`)}}},oe=class extends t.Command{static description="[DEPRECATED] Use `block-tools structure refresh --update-deps-only`. This alias delegates to it.";static examples=[`<%= config.bin %> <%= command.id %>`];async run(){this.warn("`block-tools update-deps` is deprecated and will be removed in a future release. Use `block-tools structure refresh --update-deps-only` instead. Delegating now."),await this.config.runCommand(`structure:refresh`,[`--update-deps-only`])}};function se(e){let t=e.match(/(?<destName>[^/\\]+)=(?<src>.*)/);if(t){let{src:e,destName:n}=t.groups;return{src:e,destName:n}}else return{src:e,destName:n.default.basename(e)}}var ce=t.Flags.custom({summary:`target files to upload`,helpValue:`file_path | package_name=file_path`,parse:async e=>se(e)}),le=[`registry`,`organization`,`package`,`version`],ue=class n extends t.Command{static description=`Uploads V1 package and refreshes the registry`;static flags={registry:t.Flags.string({char:`r`,summary:`full address of the registry or alias from .pl.reg`,helpValue:`<address|alias>`,env:`PL_REGISTRY`}),organization:t.Flags.string({char:`o`,summary:`target organisation`,env:`PL_PACKAGE_ORGANIZATION`}),package:t.Flags.string({char:`p`,summary:`target package`,env:`PL_PACKAGE_NAME`}),version:t.Flags.string({char:`v`,summary:`target version`,env:`PL_PACKAGE_VERSION`}),meta:t.Flags.file({char:`m`,summary:`json file containing meta information to associate with tha package`,exists:!0}),file:ce({char:`f`,summary:`package files`,multiple:!0,default:[]}),refresh:t.Flags.boolean({summary:`refresh repository after adding the package`,default:!0,allowNo:!0,env:`PL_REGISTRY_REFRESH`})};async run(){let{flags:t}=await this.parse(n),i=e.p.parse({});for(let e of le)t[e]&&(i[e]=t[e]);t.meta&&(t.meta.endsWith(`.json`)?i.meta=JSON.parse(await r.default.promises.readFile(t.meta,{encoding:`utf-8`})):t.meta.endsWith(`.yaml`)&&(i.meta=o.default.parse(await r.default.promises.readFile(t.meta,{encoding:`utf-8`}))));for(let e of t.file)i.files[e.destName]=e.src;let s=await e.n(i);this.log(o.default.stringify(s.conf));let c=s.createRegistry(new a.OclifLoggerAdapter(this)),l=s.fullPackageName,u=c.constructNewPackage(l);for(let[e,t]of Object.entries(s.conf.files)){this.log(`Uploading ${t} -> ${e} ...`);let n=await r.default.promises.readFile(t);await u.addFile(e,n)}this.log(`Uploading meta information...`),await u.writeMeta(s.conf.meta),await u.finish(),t.refresh&&await c.updateIfNeeded()}},de=class{constructor(e){this.root=e}abs(e){return n.default.resolve(this.root,e)}read(e){return r.default.readFileSync(this.abs(e),`utf-8`)}write(e,t){let i=this.abs(e);r.default.mkdirSync(n.default.dirname(i),{recursive:!0}),r.default.writeFileSync(i,t,`utf-8`)}writeBinary(e,t){let i=this.abs(e);r.default.mkdirSync(n.default.dirname(i),{recursive:!0}),r.default.writeFileSync(i,t)}exists(e){try{return r.default.statSync(this.abs(e)),!0}catch{return!1}}list(e){let t=this.abs(e);try{if(!r.default.statSync(t).isDirectory())return[]}catch{return[]}let i=[];function a(e,t){let o=r.default.readdirSync(t,{withFileTypes:!0});for(let r of o){let o=e?`${e}/${r.name}`:r.name,s=n.default.join(t,r.name);r.isDirectory()?a(o,s):r.isFile()&&i.push(o)}}return a(e===``||e===`.`?``:e,t),i.sort()}listDir(e){let t=this.abs(e),n;try{n=r.default.readdirSync(t,{withFileTypes:!0})}catch{return[]}return n.map(e=>({name:e.name,isDirectory:e.isDirectory()})).sort((e,t)=>e.name.localeCompare(t.name))}move(e,t){let i=this.abs(e),a=this.abs(t);r.default.mkdirSync(n.default.dirname(a),{recursive:!0}),r.default.renameSync(i,a)}delete(e){r.default.rmSync(this.abs(e),{recursive:!0,force:!0})}},fe=class{constructor(e){this.root=e}staticRead(e){return r.default.readFileSync(n.default.resolve(this.root,`static`,e),`utf-8`)}staticReadBinary(e){return r.default.readFileSync(n.default.resolve(this.root,`static`,e))}textRead(e){return r.default.readFileSync(n.default.resolve(this.root,`text`,e),`utf-8`)}};function pe(e,t){return e.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g,(e,n)=>t[n]??`\${${n}}`)}var me=[`default`,`init`];function he(e,t){if(!e)return t;if(!t)return e;let n=e.endsWith(`/`)?e.slice(0,-1):e,r=t.startsWith(`/`)?t.slice(1):t;return r?`${n}/${r}`:n}function ge(e,t){return e.filter(e=>e.scope===t).slice().sort((e,t)=>e.path.localeCompare(t.path))}function _e(e,t){let n=[];function r(e,i,a,o,s){if(e.kind===`scope`){let n=ge(t.modules,e.scope);for(let t of n)for(let n of e.children)r(n,e.scope,t.path,o,s);return}if(e.kind===`when`){let t=o.concat(e.trigger);for(let n of e.children)r(n,i,a,t,s);return}if(e.kind===`mode`){for(let t of e.children)r(t,i,a,o,e.modes);return}if(i===void 0||a===void 0)throw Error(`flatten: leaf '${ye(e)}' is not inside a scope() frame`);if(e.kind===`rename`){n.push({leaf:e,scope:i,modulePath:a,resolvedPath:he(a,e.from),resolvedTo:he(a,e.to),triggers:o,modes:s});return}n.push({leaf:e,scope:i,modulePath:a,resolvedPath:he(a,ve(e)),triggers:o,modes:s})}for(let t of e.children)r(t,void 0,void 0,[],me);return n}function ve(e){switch(e.kind){case`fixed`:case`managed`:case`scaffold`:case`seed`:case`remove`:return e.path;case`rename`:return e.from}}function ye(e){return e.kind===`rename`?`rename ${e.from} -> ${e.to}`:`${e.kind} ${e.path}`}var be=/[.+^${}()|[\]\\]/g;function xe(e){let t=``;for(let n=0;n<e.length;n++){let r=e[n];r===`*`?e[n+1]===`*`?(n++,e[n+1]===`/`?(n++,t+=`(?:.*/)?`):t+=`.*`):t+=`[^/]*`:r===`?`?t+=`[^/]`:t+=r.replace(be,`\\$&`)}return RegExp(`^${t}$`)}function Se(e,t){return xe(e).test(t)}var p,m;function Ce(e){if(!p)throw Error(`${e}() called outside defineStructure(). Builders must run inside the lambda passed to defineStructure(...).`);return p}function h(e,t){let n=Ce(e);n.stack[n.stack.length-1].push(t)}function we(e,t){let n=m;m=e;try{return t()}finally{m=n}}function Te(){return m}function g(){if(!m)throw Error(`getActiveRunContext() called outside engine.run(). Generators only see the run context during a run.`);return m}function Ee(e){if(p)throw Error(`defineStructure() cannot be called from inside another defineStructure().`);let t=[],n={root:t,stack:[t],inScope:!1};p=n;try{if(e(),n.stack.length!==1)throw Error(`defineStructure: builder body left ${n.stack.length-1} unclosed group frame(s)`);let r={children:t};return De(r),r}finally{p=void 0}}function De(e){let t=new Map;function n(e,r){if(e.kind===`scope`){for(let t of e.children)n(t,e.scope);return}if(e.kind===`when`||e.kind===`mode`){for(let t of e.children)n(t,r);return}if(e.kind===`rename`)return;let i=t.get(r);i||(i=new Map,t.set(r,i));let a=i.get(e.path);a||(a=new Set,i.set(e.path,a)),a.add(e.kind)}for(let t of e.children)n(t,`(top-level)`);for(let[e,n]of t)for(let[t,r]of n)if(r.has(`seed`)&&(r.has(`managed`)||r.has(`fixed`)||r.has(`scaffold`))){let n=[...r].filter(e=>e!==`seed`).sort().join(`, `);throw Error(`defineStructure validation: path '${t}' under scope '${e}' is declared as both seed and ${n}. Seeds are block-author territory (written once at init, untouched thereafter); engine-managed primitives (fixed/managed/scaffold) rewrite on every refresh. The two contracts cannot coexist on the same path.`)}}function _(e,t){let n=Ce(`scope`);if(n.inScope)throw Error(`scope() cannot nest. Already inside a scope.`);let r={kind:`scope`,scope:e,children:[]};n.stack[n.stack.length-1].push(r),n.stack.push(r.children),n.inScope=!0;try{t()}finally{n.stack.pop(),n.inScope=!1}}var Oe;function ke(e){Oe=e}function v(e,t){if(p){let n=p,r={kind:`when`,trigger:e,children:[]};n.stack[n.stack.length-1].push(r),n.stack.push(r.children);try{t()}finally{n.stack.pop()}return}if(!(Oe&&Oe(e,t)))throw Error(`when() called outside defineStructure() and outside any managed(...) body. Place this call inside one of the two.`)}function y(e){return t=>t.filesMatch(e)}function Ae(e,t,n){let r=Ce(e),i={kind:`mode`,modes:t,children:[]};r.stack[r.stack.length-1].push(i),r.stack.push(i.children);try{n()}finally{r.stack.pop()}}function je(e){Ae(`onInitOrUpdate`,[`init`,`updateDeps`],e)}function b(e,t){h(`fixed`,{kind:`fixed`,path:e,content:t})}function x(e,t,n){h(`managed`,{kind:`managed`,path:e,initial:t,body:n})}function Me(e,t){h(`scaffold`,{kind:`scaffold`,path:e,initial:t})}function S(e,t){h(`seed`,{kind:`seed`,path:e,initial:t})}function C(e){h(`remove`,{kind:`remove`,path:e})}function w(e){return{kind:`file`,path:e}}function Ne(e){return{kind:`binary`,path:e}}function Pe(e){return{kind:`text`,value:e}}function Fe(e,t){return{kind:`tpl`,path:e,vars:t}}function T(e){return{kind:`generate`,fn:e}}function Ie(){if(!m)throw Error(`blockVars() called outside engine.run(). Generators and managed bodies only see BlockVars during a run.`);return m.blockVars}function Le(e){return JSON.parse(e)}var Re=100,ze=2;function Be(e){return e.length===0?`[]`:`[`+e.map(Ve).join(`, `)+`]`}function Ve(e){if(Array.isArray(e))return Be(e);if(D(e)){let t=Object.entries(e);return t.length===0?`{}`:`{ `+t.map(([e,t])=>`${JSON.stringify(e)}: ${Ve(t)}`).join(`, `)+` }`}return JSON.stringify(e)}function He(e,t,n,r){let i=t+ze,a=` `.repeat(i);if(Array.isArray(e)){let o=Be(e);if(n+o.length+r<=Re)return o;let s=e.length-1;return`[
3
- `+e.map((e,t)=>a+He(e,i,i,t===s?0:1)).join(`,
2
+ `)||` (none)`}`),!t[`skip-confirmation`]){let e=(await import(`node:readline`)).createInterface({input:process.stdin,output:process.stdout}),n=await new Promise(n=>{e.question(`⚠️ This will overwrite the current global overview with snapshot '${t.snapshot}'.\nAre you sure you want to continue? (y/N): `,n)});if(e.close(),n.toLowerCase()!==`y`&&n.toLowerCase()!==`yes`){this.log(`Restore cancelled.`);return}}try{await r.restoreGlobalOverviewFromSnapshot(t.snapshot),this.log(`✅ Successfully restored global overview from snapshot '${t.snapshot}'`)}catch(e){this.error(`Failed to restore from snapshot: ${String(e)}`)}}},oe=class extends t.Command{static description="[DEPRECATED] Use `block-tools structure refresh --update-deps-only`. This alias delegates to it.";static examples=[`<%= config.bin %> <%= command.id %>`];async run(){this.warn("`block-tools update-deps` is deprecated and will be removed in a future release. Use `block-tools structure refresh --update-deps-only` instead. Delegating now."),await this.config.runCommand(`structure:refresh`,[`--update-deps-only`])}};function se(e){let t=e.match(/(?<destName>[^/\\]+)=(?<src>.*)/);if(t){let{src:e,destName:n}=t.groups;return{src:e,destName:n}}else return{src:e,destName:n.default.basename(e)}}var ce=t.Flags.custom({summary:`target files to upload`,helpValue:`file_path | package_name=file_path`,parse:async e=>se(e)}),le=[`registry`,`organization`,`package`,`version`],ue=class n extends t.Command{static description=`Uploads V1 package and refreshes the registry`;static flags={registry:t.Flags.string({char:`r`,summary:`full address of the registry or alias from .pl.reg`,helpValue:`<address|alias>`,env:`PL_REGISTRY`}),organization:t.Flags.string({char:`o`,summary:`target organisation`,env:`PL_PACKAGE_ORGANIZATION`}),package:t.Flags.string({char:`p`,summary:`target package`,env:`PL_PACKAGE_NAME`}),version:t.Flags.string({char:`v`,summary:`target version`,env:`PL_PACKAGE_VERSION`}),meta:t.Flags.file({char:`m`,summary:`json file containing meta information to associate with tha package`,exists:!0}),file:ce({char:`f`,summary:`package files`,multiple:!0,default:[]}),refresh:t.Flags.boolean({summary:`refresh repository after adding the package`,default:!0,allowNo:!0,env:`PL_REGISTRY_REFRESH`})};async run(){let{flags:t}=await this.parse(n),i=e.p.parse({});for(let e of le)t[e]&&(i[e]=t[e]);t.meta&&(t.meta.endsWith(`.json`)?i.meta=JSON.parse(await r.default.promises.readFile(t.meta,{encoding:`utf-8`})):t.meta.endsWith(`.yaml`)&&(i.meta=o.default.parse(await r.default.promises.readFile(t.meta,{encoding:`utf-8`}))));for(let e of t.file)i.files[e.destName]=e.src;let s=await e.n(i);this.log(o.default.stringify(s.conf));let c=s.createRegistry(new a.OclifLoggerAdapter(this)),l=s.fullPackageName,u=c.constructNewPackage(l);for(let[e,t]of Object.entries(s.conf.files)){this.log(`Uploading ${t} -> ${e} ...`);let n=await r.default.promises.readFile(t);await u.addFile(e,n)}this.log(`Uploading meta information...`),await u.writeMeta(s.conf.meta),await u.finish(),t.refresh&&await c.updateIfNeeded()}},de=class{constructor(e){this.root=e}abs(e){return n.default.resolve(this.root,e)}read(e){return r.default.readFileSync(this.abs(e),`utf-8`)}write(e,t){let i=this.abs(e);r.default.mkdirSync(n.default.dirname(i),{recursive:!0}),r.default.writeFileSync(i,t,`utf-8`)}writeBinary(e,t){let i=this.abs(e);r.default.mkdirSync(n.default.dirname(i),{recursive:!0}),r.default.writeFileSync(i,t)}exists(e){try{return r.default.statSync(this.abs(e)),!0}catch{return!1}}list(e){let t=this.abs(e);try{if(!r.default.statSync(t).isDirectory())return[]}catch{return[]}let i=[];function a(e,t){let o=r.default.readdirSync(t,{withFileTypes:!0});for(let r of o){let o=e?`${e}/${r.name}`:r.name,s=n.default.join(t,r.name);r.isDirectory()?a(o,s):r.isFile()&&i.push(o)}}return a(e===``||e===`.`?``:e,t),i.sort()}listDir(e){let t=this.abs(e),n;try{n=r.default.readdirSync(t,{withFileTypes:!0})}catch{return[]}return n.map(e=>({name:e.name,isDirectory:e.isDirectory()})).sort((e,t)=>e.name.localeCompare(t.name))}move(e,t){let i=this.abs(e),a=this.abs(t);r.default.mkdirSync(n.default.dirname(a),{recursive:!0}),r.default.renameSync(i,a)}delete(e){r.default.rmSync(this.abs(e),{recursive:!0,force:!0})}},fe=class{constructor(e){this.root=e}staticRead(e){return r.default.readFileSync(n.default.resolve(this.root,`static`,e),`utf-8`)}staticReadBinary(e){return r.default.readFileSync(n.default.resolve(this.root,`static`,e))}textRead(e){return r.default.readFileSync(n.default.resolve(this.root,`text`,e),`utf-8`)}};function pe(e,t){return e.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g,(e,n)=>t[n]??`\${${n}}`)}var me=[`default`,`init`];function he(e,t){if(!e)return t;if(!t)return e;let n=e.endsWith(`/`)?e.slice(0,-1):e,r=t.startsWith(`/`)?t.slice(1):t;return r?`${n}/${r}`:n}function ge(e,t){return e.filter(e=>e.scope===t).slice().sort((e,t)=>e.path.localeCompare(t.path))}function _e(e,t){let n=[];function r(e,i,a,o,s){if(e.kind===`scope`){let n=ge(t.modules,e.scope);for(let t of n)for(let n of e.children)r(n,e.scope,t.path,o,s);return}if(e.kind===`when`){let t=o.concat(e.trigger);for(let n of e.children)r(n,i,a,t,s);return}if(e.kind===`mode`){for(let t of e.children)r(t,i,a,o,e.modes);return}if(i===void 0||a===void 0)throw Error(`flatten: leaf '${ye(e)}' is not inside a scope() frame`);if(e.kind===`rename`){n.push({leaf:e,scope:i,modulePath:a,resolvedPath:he(a,e.from),resolvedTo:he(a,e.to),triggers:o,modes:s});return}n.push({leaf:e,scope:i,modulePath:a,resolvedPath:he(a,ve(e)),triggers:o,modes:s})}for(let t of e.children)r(t,void 0,void 0,[],me);return n}function ve(e){switch(e.kind){case`fixed`:case`managed`:case`scaffold`:case`seed`:case`remove`:return e.path;case`rename`:return e.from}}function ye(e){return e.kind===`rename`?`rename ${e.from} -> ${e.to}`:`${e.kind} ${e.path}`}var be=/[.+^${}()|[\]\\]/g;function xe(e){let t=``;for(let n=0;n<e.length;n++){let r=e[n];r===`*`?e[n+1]===`*`?(n++,e[n+1]===`/`?(n++,t+=`(?:.*/)?`):t+=`.*`):t+=`[^/]*`:r===`?`?t+=`[^/]`:t+=r.replace(be,`\\$&`)}return RegExp(`^${t}$`)}function Se(e,t){return xe(e).test(t)}var p,m;function Ce(e){if(!p)throw Error(`${e}() called outside defineStructure(). Builders must run inside the lambda passed to defineStructure(...).`);return p}function h(e,t){let n=Ce(e);n.stack[n.stack.length-1].push(t)}function we(e,t){let n=m;m=e;try{return t()}finally{m=n}}function Te(){return m}function g(){if(!m)throw Error(`getActiveRunContext() called outside engine.run(). Generators only see the run context during a run.`);return m}function Ee(e){if(p)throw Error(`defineStructure() cannot be called from inside another defineStructure().`);let t=[],n={root:t,stack:[t],inScope:!1};p=n;try{if(e(),n.stack.length!==1)throw Error(`defineStructure: builder body left ${n.stack.length-1} unclosed group frame(s)`);let r={children:t};return De(r),r}finally{p=void 0}}function De(e){let t=new Map;function n(e,r){if(e.kind===`scope`){for(let t of e.children)n(t,e.scope);return}if(e.kind===`when`||e.kind===`mode`){for(let t of e.children)n(t,r);return}if(e.kind===`rename`)return;let i=t.get(r);i||(i=new Map,t.set(r,i));let a=i.get(e.path);a||(a=new Set,i.set(e.path,a)),a.add(e.kind)}for(let t of e.children)n(t,`(top-level)`);for(let[e,n]of t)for(let[t,r]of n)if(r.has(`seed`)&&(r.has(`managed`)||r.has(`fixed`)||r.has(`scaffold`))){let n=[...r].filter(e=>e!==`seed`).sort().join(`, `);throw Error(`defineStructure validation: path '${t}' under scope '${e}' is declared as both seed and ${n}. Seeds are block-author territory (written once at init, untouched thereafter); engine-managed primitives (fixed/managed/scaffold) rewrite on every refresh. The two contracts cannot coexist on the same path.`)}}function _(e,t){let n=Ce(`scope`);if(n.inScope)throw Error(`scope() cannot nest. Already inside a scope.`);let r={kind:`scope`,scope:e,children:[]};n.stack[n.stack.length-1].push(r),n.stack.push(r.children),n.inScope=!0;try{t()}finally{n.stack.pop(),n.inScope=!1}}var Oe;function ke(e){Oe=e}function v(e,t,n){Ae(e,t),n&&Ae(t=>!e(t),n)}function Ae(e,t){if(p){je(e,t);return}if(!(Oe?.(e,t)??!1))throw Error(`when() called outside defineStructure() and outside any managed(...) body. Place this call inside one of the two.`)}function je(e,t){let n=p,r={kind:`when`,trigger:e,children:[]};n.stack[n.stack.length-1].push(r),n.stack.push(r.children);try{t()}finally{n.stack.pop()}}function y(e){return t=>t.filesMatch(e)}function Me(e,t,n){let r=Ce(e),i={kind:`mode`,modes:t,children:[]};r.stack[r.stack.length-1].push(i),r.stack.push(i.children);try{n()}finally{r.stack.pop()}}function Ne(e){Me(`onInitOrUpdate`,[`init`,`updateDeps`],e)}function b(e,t){h(`fixed`,{kind:`fixed`,path:e,content:t})}function x(e,t,n){h(`managed`,{kind:`managed`,path:e,initial:t,body:n})}function Pe(e,t){h(`scaffold`,{kind:`scaffold`,path:e,initial:t})}function S(e,t){h(`seed`,{kind:`seed`,path:e,initial:t})}function C(e){h(`remove`,{kind:`remove`,path:e})}function w(e){return{kind:`file`,path:e}}function Fe(e){return{kind:`binary`,path:e}}function Ie(e){return{kind:`text`,value:e}}function Le(e,t){return{kind:`tpl`,path:e,vars:t}}function T(e){return{kind:`generate`,fn:e}}function E(){if(!m)throw Error(`blockVars() called outside engine.run(). Generators and managed bodies only see BlockVars during a run.`);return m.blockVars}function Re(e){return JSON.parse(e)}var ze=100,Be=2;function Ve(e){return e.length===0?`[]`:`[`+e.map(He).join(`, `)+`]`}function He(e){if(Array.isArray(e))return Ve(e);if(k(e)){let t=Object.entries(e);return t.length===0?`{}`:`{ `+t.map(([e,t])=>`${JSON.stringify(e)}: ${He(t)}`).join(`, `)+` }`}return JSON.stringify(e)}function D(e,t,n,r){let i=t+Be,a=` `.repeat(i);if(Array.isArray(e)){let o=Ve(e);if(n+o.length+r<=ze)return o;let s=e.length-1;return`[
3
+ `+e.map((e,t)=>a+D(e,i,i,t===s?0:1)).join(`,
4
4
  `)+`
5
- `+` `.repeat(t)+`]`}if(D(e)){let n=Object.entries(e);if(n.length===0)return`{}`;let r=n.length-1;return`{
6
- `+n.map(([e,t],n)=>{let o=`${a}${JSON.stringify(e)}: `;return o+He(t,i,o.length,n===r?0:1)}).join(`,
5
+ `+` `.repeat(t)+`]`}if(k(e)){let n=Object.entries(e);if(n.length===0)return`{}`;let r=n.length-1;return`{
6
+ `+n.map(([e,t],n)=>{let o=`${a}${JSON.stringify(e)}: `;return o+D(t,i,o.length,n===r?0:1)}).join(`,
7
7
  `)+`
8
- `+` `.repeat(t)+`}`}return JSON.stringify(e)}function Ue(e,t){return t?.collapse?He(JSON.parse(JSON.stringify(e??null)),0,0,0)+`
8
+ `+` `.repeat(t)+`}`}return JSON.stringify(e)}function Ue(e,t){return t?.collapse?D(JSON.parse(JSON.stringify(e??null)),0,0,0)+`
9
9
  `:JSON.stringify(e,null,2)+`
10
- `}function E(e){return e===``||e===void 0?[]:e.split(`.`)}function D(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function We(e,t){let n=E(t),r=e;for(let e of n){if(!D(r))return;r=r[e]}return r}function Ge(e,t){let n=E(t);if(n.length===0)return!0;let r=e;for(let e=0;e<n.length-1;e++){if(!D(r))return!1;r=r[n[e]]}return D(r)?n[n.length-1]in r:!1}function Ke(e,t,n){let r=E(t);if(r.length===0)throw Error(`setAtPath: jsonPath must be non-empty`);let i=e;for(let e=0;e<r.length-1;e++){let t=r[e],n=i[t];if(n===void 0){let e={};i[t]=e,i=e}else if(D(n))i=n;else throw Error(`setAtPath: cannot descend into non-object at '${r.slice(0,e+1).join(`.`)}'`)}i[r[r.length-1]]=n}function qe(e,t){let n=E(t);if(n.length===0)throw Error(`deleteAtPath: jsonPath must be non-empty`);let r=e;for(let e=0;e<n.length-1;e++){if(!D(r))return;r=r[n[e]]}D(r)&&delete r[n[n.length-1]]}function Je(e,t){let n=new Set(t),r=Object.keys(e),i=new Map;i.set(``,[]);let a=``;for(let e of r)n.has(e)?(a=e,i.set(a,[])):i.get(a).push(e);let o={};for(let t of i.get(``))o[t]=e[t];for(let n of t)if(n in e){o[n]=e[n];for(let t of i.get(n)??[])o[t]=e[t]}return o}function Ye(e){let t=e.split(`
10
+ `}function O(e){return e===``||e===void 0?[]:e.split(`.`)}function k(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function We(e,t){let n=O(t),r=e;for(let e of n){if(!k(r))return;r=r[e]}return r}function Ge(e,t){let n=O(t);if(n.length===0)return!0;let r=e;for(let e=0;e<n.length-1;e++){if(!k(r))return!1;r=r[n[e]]}return k(r)?n[n.length-1]in r:!1}function Ke(e,t,n){let r=O(t);if(r.length===0)throw Error(`setAtPath: jsonPath must be non-empty`);let i=e;for(let e=0;e<r.length-1;e++){let t=r[e],n=i[t];if(n===void 0){let e={};i[t]=e,i=e}else if(k(n))i=n;else throw Error(`setAtPath: cannot descend into non-object at '${r.slice(0,e+1).join(`.`)}'`)}i[r[r.length-1]]=n}function qe(e,t){let n=O(t);if(n.length===0)throw Error(`deleteAtPath: jsonPath must be non-empty`);let r=e;for(let e=0;e<n.length-1;e++){if(!k(r))return;r=r[n[e]]}k(r)&&delete r[n[n.length-1]]}function Je(e,t){let n=new Set(t),r=Object.keys(e),i=new Map;i.set(``,[]);let a=``;for(let e of r)n.has(e)?(a=e,i.set(a,[])):i.get(a).push(e);let o={};for(let t of i.get(``))o[t]=e[t];for(let n of t)if(n in e){o[n]=e[n];for(let t of i.get(n)??[])o[t]=e[t]}return o}function Ye(e){let t=e.split(`
11
11
  `);return t.length>0&&t[t.length-1]===``&&t.pop(),t}function Xe(e){return e.join(`
12
12
  `)+`
13
- `}function Ze(e){return e.replace(/(^|\s)#.*$/,`$1`).trim()}function Qe(e,t){let n=Ze(e);return n===``?!1:n===t.trim()}function $e(e,t){for(let n of e)if(Qe(n,t))return!0;return!1}function et(e,t){return e===`sdk:`?t?`workspace:*`:`catalog:`:e}var tt=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`];function nt(e,t){if(j(e))for(let n of tt){let r=e[n];if(j(r))for(let e of Object.keys(r))r[e]===`sdk:`&&(r[e]=t?`workspace:*`:`catalog:`)}}var O;function rt(e){if(!O)throw Error(`${e}() only valid inside a managed(...) body. Move this call inside managed(path, initial, () => {...}).`);return O}function k(e){let t=rt(e);if(t.kind!==`json`)throw Error(`${e}() requires a JSON-managed body; got '${t.kind}'.`);return t}function it(e){let t=rt(e);if(t.kind!==`yaml`)throw Error(`${e}() requires a YAML-managed body; got '${t.kind}'.`);return t}function at(e){let t=rt(e);if(t.kind!==`lines`)throw Error(`${e}() requires a lines-managed body; got '${t.kind}'.`);return t}function A(e,t){let n=e.ctx??Te();if(!n)throw Error(`${t}() needs a RunContext but none is active. Pass { ctx } via the with-managed-* helper or run inside engine.run(...).`);return n}function j(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ot(e,t,n={}){if(O)throw Error(`Nested managed(...) body — engine bug.`);O={kind:`json`,obj:e,ctx:n.ctx,triggerContext:n.triggerContext};try{return t(),e}finally{O=void 0}}function st(e,t,n={}){if(O)throw Error(`Nested managed(...) body — engine bug.`);O={kind:`yaml`,doc:e,ctx:n.ctx,triggerContext:n.triggerContext,getLatestVersion:n.getLatestVersion};try{return t(),e}finally{O=void 0}}function ct(e,t,n={}){if(O)throw Error(`Nested managed(...) body — engine bug.`);O={kind:`lines`,lines:e,ctx:n.ctx,triggerContext:n.triggerContext};try{return t(),e}finally{O=void 0}}ke((e,t)=>{if(!O)return!1;let n=O.triggerContext;if(!n)throw Error("when() inside a managed(...) body requires a triggerContext. The runner supplies it via the `triggerContext` opt to with-managed-*; ensure your test/test helper passes one.");return e(n)&&t(),!0});function M(e,t){Ke(k(`ensureField`).obj,e,t)}function N(e,t){let n=k(`removeField`).obj;Ge(n,e)&&(t&&!t(We(n,e))||qe(n,e))}function P(e,t){M(`scripts.${e}`,t)}function lt(e){N(`scripts.${e}`)}var ut=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`];function F(e,t,n,r){let i=k(e),a=i.obj,o=n===`sdk:`?et(n,A(i,e).isSdkInternal):n;for(let e of ut){if(e===r)continue;let n=a[e];j(n)&&t in n&&delete n[t]}let s=a[r],c=j(s)?s:{};c[t]=o,j(s)||(a[r]=c)}function I(e,t){F(`ensureDep`,e,t,`dependencies`)}function L(e,t){F(`ensureDevDep`,e,t,`devDependencies`)}function dt(e,t){F(`ensurePeerDep`,e,t,`peerDependencies`)}function ft(e){let t=k(`removeDep`).obj;for(let n of ut){let r=t[n];j(r)&&e in r&&delete r[e]}}function R(e){for(let[t,n]of Object.entries(e))L(t,n)}function z(e){for(let[t,n]of Object.entries(e))dt(t,n)}function pt(e,t,n){let r=A(k(e),e);for(let i of r.modules)i.scope===t&&F(e,i.name,`workspace:*`,n)}function B(e){pt(`ensureWorkspaceScopeDeps`,e,`dependencies`)}function V(e){let t=k(`pruneKeysMatching`).obj;for(let n of Object.keys(t))e(n,t[n])&&delete t[n]}function mt(e,t){let n=Je(e,t);for(let t of Object.keys(e))delete e[t];for(let t of Object.keys(n))e[t]=n[t]}function H(e){mt(k(`enforceFieldOrder`).obj,e)}function U(e,t){let n=Object.keys(e).sort(),r={};for(let t of n)r[t]=e[t];for(let t of Object.keys(e))delete e[t];for(let i of n)e[i]=r[i],t&&j(e[i])&&U(e[i],!0)}function W(e=``,t={}){let n=t.recursive??!1;if(e===``&&!n)return;let r=k(`enforceAlphabeticalOrder`).obj;if(e===``){U(r,!0);return}let i=We(r,e);j(i)&&U(i,n)}function ht(){let e=it(`ensureWorkspaceModulePaths`),t=A(e,`ensureWorkspaceModulePaths`).modules.filter(e=>e.path!==``).map(e=>e.path).sort(),n=e.doc.toJSON()?.packages;Array.isArray(n)&&n.length===t.length&&n.every((e,n)=>e===t[n])||e.doc.setIn([`packages`],t)}function gt(e,t){let n=e.doc.getIn([`catalog`,t]);return typeof n==`string`?n:void 0}function _t(e,t){let n=it(`ensureCatalogVersion`);gt(n,e)===void 0&&n.doc.setIn([`catalog`,e],t)}function vt(e){let t=it(`ensureCatalogLatest`);if(!t.getLatestVersion)return;let n=t.getLatestVersion(e);n!==void 0&&gt(t,e)!==n&&t.doc.setIn([`catalog`,e],n)}function yt(e){let t=at(`ensureGitignoreEntries`);for(let n of e)$e(t.lines,n)||t.lines.push(n)}function bt(e){return(0,o.parseDocument)(e)}function xt(e){return e.toString()}var St=`.structure`;function Ct(e,t=0){if(e<t)throw new wt(e,t)}var wt=class extends Error{constructor(e,t){super(`Block .structure version is ${e}, below floor ${t}. Bootstrap via the legacy-migration skill, then re-run.`),this.version=e,this.floor=t,this.name=`StructureVersionFloorError`}};function Tt(e,t=1){let n={version:t};e.write(St,JSON.stringify(n))}var Et=class extends Error{constructor(e){super(`Post-run recheck: rule set not idempotent. Failing item: ${e.primitive} '${e.path}' (scope=${e.scope}, action=${e.action}). Engine bug.`),this.failing=e,this.name=`RecheckError`}};function Dt(e,t,n,r){switch(e.kind){case`text`:return e.value;case`file`:if(!n)throw Error(`file('${e.path}'): no TemplateProvider configured. Pass opts.templates to engine.run(...).`);return n.staticRead(e.path);case`tpl`:if(!n)throw Error(`tpl('${e.path}'): no TemplateProvider configured. Pass opts.templates to engine.run(...).`);return pe(n.textRead(e.path),typeof e.vars==`function`?e.vars():e.vars);case`generate`:{let n=e.fn();if(t.endsWith(`.json`))return nt(n,r),Ue(n,{collapse:!t.endsWith(`package.json`)});if(t.endsWith(`.yaml`)||t.endsWith(`.yml`))return(0,o.stringify)(n);if(typeof n!=`string`)throw Error(`generate() for '${t}' must return a string for non-JSON/YAML files; got ${typeof n}`);return n}case`binary`:throw Error(`binary('${e.path}') cannot be resolved to a string; it is only valid inside seed()/scaffold(), which copy it verbatim via fs.writeBinary.`)}}function Ot(e,t,n,r,i){if(n.kind===`binary`){if(!r)throw Error(`binary('${n.path}'): no TemplateProvider configured. Pass opts.templates to engine.run(...).`);e.writeBinary(t,r.staticReadBinary(n.path));return}e.write(t,Dt(n,t,r,i))}function kt(e,t,n,r,i){let a=e.split(`/`).pop()??e;if(e.endsWith(`.json`)){let i=Le(t);if(typeof i!=`object`||!i||Array.isArray(i))throw Error(`managed: parsed value at '${e}' is not a JSON object`);return ot(i,n,{triggerContext:r}),Ue(i,{collapse:a!==`package.json`})}if(e.endsWith(`.yaml`)||e.endsWith(`.yml`)){let e=bt(t);return st(e,n,{triggerContext:r,getLatestVersion:i}),xt(e)}if(a===`.gitignore`||a.endsWith(`.gitignore`)){let e=Ye(t);return ct(e,n,{triggerContext:r}),Xe(e)}throw Error(`managed('${e}'): unsupported file kind. Only .json, .yaml, .yml, .gitignore are dispatched.`)}function At(e){let t=e.list(``),n=new Set;for(let e of t){n.add(e);let t=e.split(`/`);for(let e=1;e<t.length;e++)n.add(t.slice(0,e).join(`/`))}return n}function jt(e,t){let n=t===``?t:t.endsWith(`/`)?t.slice(0,-1):t;return e.has(n)}function Mt(e,t,n){return{ctx:t,version:t.version,pathExists:t=>jt(e,t),pathMissing:t=>!jt(e,t),filesMatch:t=>{let r=n?`${n}/${t}`:t;for(let t of e)if(Se(r,t))return!0;return!1}}}function Nt(e,t){for(let n of e.triggers)if(!n(t))return!1;return!0}function Pt(e,t){return t?`init`:e.updateDepsOnly?`updateDeps`:`default`}function Ft(e,t){return e.filter(e=>e.modes.includes(t))}function It(e,t,n,r,i,a){let o=e.leaf;if(o.kind===`fixed`){let i=Dt(o.content,e.resolvedPath,r,a);return t.exists(e.resolvedPath)?t.read(e.resolvedPath)===i?void 0:(n||t.write(e.resolvedPath,i),{scope:e.scope,path:e.resolvedPath,primitive:`fixed`,action:`update`}):(n||t.write(e.resolvedPath,i),{scope:e.scope,path:e.resolvedPath,primitive:`fixed`,action:`create`})}if(o.kind===`scaffold`)return t.exists(e.resolvedPath)?void 0:(n||Ot(t,e.resolvedPath,o.initial,r,a),{scope:e.scope,path:e.resolvedPath,primitive:`scaffold`,action:`create`});if(o.kind===`seed`)return!i||t.exists(e.resolvedPath)?void 0:(n||Ot(t,e.resolvedPath,o.initial,r,a),{scope:e.scope,path:e.resolvedPath,primitive:`seed`,action:`create`});if(o.kind===`remove`)return t.exists(e.resolvedPath)?(n||t.delete(e.resolvedPath),{scope:e.scope,path:e.resolvedPath,primitive:`remove`,action:`delete`}):void 0;if(o.kind===`rename`){if(!t.exists(e.resolvedPath))return;let r=e.resolvedTo;return t.exists(r)?void 0:(n||t.move(e.resolvedPath,r),{scope:e.scope,path:e.resolvedPath,primitive:`rename`,action:`rename`})}}function Lt(e,t,n,r,i,a,o){if(e.leaf.kind!==`managed`)return;let s=e.leaf,c=e.resolvedPath,l=t.exists(c),u,d=!1;l?u=t.read(c):(u=Dt(s.initial,c,i,o),d=!0);let f=kt(c,u,s.body,r,a);if(d)return n||t.write(c,f),{scope:e.scope,path:c,primitive:`managed`,action:`create`};if(f!==u)return n||t.write(c,f),{scope:e.scope,path:c,primitive:`managed`,action:`update`}}function Rt(e,t,n,r,i,a,o){let s=Ft(e,Pt(n,a)),c=[],l=At(t);for(let e of s){if(e.leaf.kind===`managed`||!Nt(e,Mt(l,n,e.modulePath)))continue;let o=It(e,t,r,i,a,n.isSdkInternal);o&&c.push(o)}let u=At(t);for(let e of s){if(e.leaf.kind!==`managed`)continue;let a=Mt(u,n,e.modulePath);if(!Nt(e,a))continue;let s=Lt(e,t,r,a,i,o,n.isSdkInternal);s&&c.push(s)}return c}function zt(e,t,n,r={}){return we(n,()=>{let i=_e(e,n),a=!!r.initMode,o=Rt(i,t,n,n.dryRun,r.templates,a,r.registryLookup);if(!n.dryRun&&!n.updateDepsOnly&&!a){Tt(t);let i={...r.rediscover?r.rediscover(t):n,dryRun:!0},a=Rt(_e(e,i),t,i,!0,r.templates,!1,r.registryLookup).filter(e=>e.path!==St);if(a.length>0)throw new Et(a[0])}return a&&!n.dryRun&&Tt(t),{changes:o}})}var Bt=[`root`,`block`,`model`,`ui`,`workflow`,`test`,`software`],Vt=class extends Error{constructor(e,t){super(e),this.path=t,this.name=`DiscoveryError`}};function Ht(e){let t=new Set;for(let n of[e.dependencies,e.devDependencies,e.peerDependencies,e.optionalDependencies])if(n)for(let e of Object.keys(n))t.add(e);return t}function Ut(e){return e===``||e===`.`}function Wt(e,t){let n=e.pkg[`block-scope`];if(typeof n==`string`){if(!Bt.includes(n))throw new Vt(`package.json "block-scope" must be one of ${Bt.join(`, `)}, got '${n}'`,e.path);return n}if(Ut(e.path))return`root`;let r=Ht(e.pkg);if(e.pkg[`block-software`]!==void 0)return`software`;if(r.has(`@platforma-sdk/package-builder`)){for(let e of r)if(/^@platforma-open\/.*runenv/.test(e))return`software`}if(r.has(`@platforma-sdk/workflow-tengo`))return`workflow`;if((r.has(`@platforma-sdk/ui-vue`)||r.has(`vue`))&&!e.pkg.main)return`ui`;if(r.has(`@platforma-sdk/block-tools`)){if([...r].filter(e=>t.has(e)&&(e.endsWith(`.model`)||e.endsWith(`.ui`)||e.endsWith(`.workflow`))).length>=2)return`block`;let n=e.pkg.files;if(Array.isArray(n)&&n.length===2&&n.includes(`index.d.ts`)&&n.includes(`index.js`))return`block`}if(r.has(`@platforma-sdk/model`)&&e.pkg.main)return`model`;if(r.has(`@platforma-sdk/test`))return`test`}function Gt(e){let t=new Set;for(let n of e)typeof n.pkg.name==`string`&&t.add(n.pkg.name);let n=[];for(let r of e){let e=Wt(r,t);if(!e)throw new Vt(`Unclassified workspace package at '${r.path}'. Add a top-level "block-scope" string to its package.json.`,r.path);n.push({scope:e,name:r.pkg.name??r.path,path:Ut(r.path)?``:r.path})}return n}function G(e,t){return e.modules.filter(e=>e.scope===t)}function Kt(e,t){let n=G(e,t);if(n.length===0)throw Error(`findModule: expected one '${t}' module, found none`);if(n.length>1)throw Error(`findModule: expected exactly one '${t}' module, found ${n.length}`);return n[0]}function K(e,t){return{[Kt(e,t).name]:`workspace:*`}}function qt(e,t){let n={};for(let r of G(e,t))n[r.name]=`workspace:*`;return n}function Jt(e){let t=e.facadeName,n=[{scope:`root`,name:t,path:``},{scope:`block`,name:`${t}.block`,path:`block`},{scope:`model`,name:`${t}.model`,path:`model`},{scope:`ui`,name:`${t}.ui`,path:`ui`},{scope:`workflow`,name:`${t}.workflow`,path:`workflow`},{scope:`test`,name:`${t}.test`,path:`test`}];return e.softwarePlatform&&n.push({scope:`software`,name:`${t}.software`,path:`software`}),n}function Yt(e){return{isSdkInternal:e.isSdkInternal??!1,updateDepsOnly:e.updateDepsOnly??!1,modules:e.modules,blockVars:e.blockVars,version:e.version??0,dryRun:e.dryRun??!1}}var q=class extends Error{constructor(e){super(e),this.name=`StructureCliError`}};function J(e,t){return e===``?t:`${e}/${t}`}function Xt(e,t){try{return JSON.parse(e.read(t))}catch{return}}function Zt(e){if(e.includes(`*`))throw new q(`pnpm-workspace.yaml 'packages:' entry '${e}' contains a glob. The structurer requires literal package paths — replace the glob with one entry per package directory.`);let t=e.replace(/^\.\//,``).replace(/\/$/,``);return t===`.`?``:t}function Qt(e){let t;try{t=e.read(`pnpm-workspace.yaml`)}catch{throw new q(`No pnpm-workspace.yaml found. This directory is empty or unrecognisable as a block — run 'block-tools structure init' instead, or pass --sdk-internal for an in-monorepo block.`)}let n=(0,o.parse)(t)??{},r=Array.isArray(n.packages)?n.packages:[],i=new Set([``]);for(let t of r){let n=Zt(t);(n===``||e.exists(n))&&i.add(n)}let a=[];for(let t of i){let n=Xt(e,J(t,`package.json`));n&&a.push({path:t,pkg:n})}return a}function $t(e){let t=[],n=new Set([`node_modules`,`.turbo`,`dist`,`.git`,`block-pack`]);function r(i,a){let o=e.listDir(i);for(let s of o){if(!s.isDirectory||n.has(s.name))continue;let o=J(i,s.name),c=Xt(e,J(o,`package.json`));c&&t.push({path:o,pkg:c}),a<2&&r(o,a+1)}}return r(``,1),t}function en(e){let t=e.indexOf(`/`);if(!e.startsWith(`@`)||t<0)throw new q(`Cannot parse block name '${e}': expected '@npm-org/org-scope.short-name'.`);let n=e.slice(0,t),r=e.slice(t+1),i=r.indexOf(`.`);if(i<0)throw new q(`Cannot parse block name '${e}': base name '${r}' has no '.' separating org-scope from short-name.`);return{facadeName:e,baseName:r,npmOrg:n,orgScope:r.slice(0,i),shortName:r.slice(i+1)}}function tn(e){try{let t=JSON.parse(e.read(St));return typeof t.version==`number`?t.version:0}catch{return 0}}function nn(e){let{fs:t,isSdkInternal:n}=e,r=n?$t(t):Qt(t);if(r.length===0)throw new q(`No workspace packages found. Run 'block-tools structure init' to scaffold a block.`);let i=Gt(r),a=tn(t);Ct(a,0);let o=i.find(e=>e.scope===`block`)??i.find(e=>e.scope===`root`);if(!o)throw new q(`Could not find a 'block' (or root-as-block) package to derive BlockVars from.`);let s=en(o.name);return Yt({isSdkInternal:n,updateDepsOnly:e.updateDepsOnly??!1,modules:i,blockVars:s,version:a,dryRun:e.dryRun??!1})}var Y=[`name`,`version`,`private`,`description`,`keywords`,`files`,`type`,`main`,`module`,`types`,`exports`,`scripts`,`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`,`packageManager`,`pnpm`,`block`,`block-software`];function rn(e){return{version:`1.0.0`,private:!0,scripts:{fmt:`turbo run fmt`,check:`turbo run check`,build:`turbo run build`,"build:dev":`env PL_PKG_DEV=local turbo run build`,test:`env PL_PKG_DEV=local turbo run test --concurrency 1`,"test:dry-run":`env PL_PKG_DEV=local turbo run test --dry-run=json`,"mark-stable":`turbo run mark-stable`,"do-pack":`turbo run do-pack`,watch:`turbo watch build`,changeset:`changeset`,"version-packages":`changeset version`,"update-sdk":`block-tools structure refresh --update-deps-only`,update:`block-tools structure refresh --update-deps-only && pnpm i && block-tools structure refresh && pnpm fmt`},peerDependencies:{oxlint:`*`,oxfmt:`*`},devDependencies:{"@changesets/cli":`catalog:`,"@milaboratories/ts-builder":`sdk:`,"@platforma-sdk/block-tools":`sdk:`,shx:`catalog:`,turbo:`catalog:`},packageManager:`pnpm@9.12.0`}}function an(){M(`packageManager`,`pnpm@9.12.0`),N(`name`),P(`fmt`,`turbo run fmt`),P(`check`,`turbo run check`),P(`build`,`turbo run build`),P(`build:dev`,`env PL_PKG_DEV=local turbo run build`),P(`test`,`env PL_PKG_DEV=local turbo run test --concurrency 1`),P(`test:dry-run`,`env PL_PKG_DEV=local turbo run test --dry-run=json`),P(`mark-stable`,`turbo run mark-stable`),P(`do-pack`,`turbo run do-pack`),P(`watch`,`turbo watch build`),P(`changeset`,`changeset`),P(`version-packages`,`changeset version`),P(`update-sdk`,`block-tools structure refresh --update-deps-only`),P(`update`,`block-tools structure refresh --update-deps-only && pnpm i && block-tools structure refresh && pnpm fmt`),R({"@changesets/cli":`catalog:`,"@milaboratories/ts-builder":`sdk:`,"@platforma-sdk/block-tools":`sdk:`,shx:`catalog:`,turbo:`catalog:`}),z({oxlint:`*`,oxfmt:`*`}),V((e,t)=>{if(!/^(\/\/|--)/.test(e)||typeof t!=`object`||!t)return!1;let n=t;return n.pnpm!==void 0||n.overrides!==void 0}),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),H([...Y])}var on=2,sn=500,cn=3e4;function ln(e){if(!e)return null;let t=Number(e);if(Number.isFinite(t)&&t>0)return t*1e3;let n=Date.parse(e);return Number.isNaN(n)?null:Math.max(0,n-Date.now())}async function un(e){for(let t=1;;t++){let n;try{n=await fetch(e,{signal:AbortSignal.timeout(cn)})}catch(e){if(t>on)throw e;await(0,s.setTimeout)(sn*2**(t-1)*(.8+.4*Math.random()));continue}if(n.ok)return n;if(!(n.status===429||n.status>=500)||t>on)throw Error(`registry returned HTTP ${n.status}`);let r=ln(n.headers.get(`retry-after`));if(r!=null){await(0,s.setTimeout)(r);continue}await(0,s.setTimeout)(sn*2**(t-1)*(.8+.4*Math.random()))}}function dn(){return{async getLatestVersion(e){let t=(await(await un(`https://registry.npmjs.org/-/package/${e}/dist-tags`)).json()).latest;if(!t)throw Error(`no 'latest' dist-tag in registry response`);return t}}}async function fn(e,t){let n=await Promise.all(t.map(async t=>[t,await e.getLatestVersion(t)]));return new Map(n)}function pn(e){return t=>e.get(t)}var mn=[/^@platforma-sdk\//,/^@milaboratories\//];function hn(e){return mn.some(t=>t.test(e))}async function gn(e,t=dn()){return e.length===0?()=>void 0:pn(await fn(t,e))}var X=[`@platforma-sdk/model`,`@platforma-sdk/ui-vue`,`@platforma-sdk/workflow-tengo`,`@platforma-sdk/test`,`@platforma-sdk/block-tools`,`@platforma-sdk/tengo-builder`,`@platforma-sdk/package-builder`,`@milaboratories/ts-builder`,`@milaboratories/ts-configs`],_n=`0.0.0-init-must-fetch`;for(let e of X)if(!hn(e))throw Error(`SDK_CATALOG_PACKAGES entry '${e}' matches no catalog bump pattern; its placeholder would never be resolved to npm latest on init. Add it to CATALOG_BUMP_PATTERNS or move it to the infra floor.`);var vn={turbo:`~2.8.11`,shx:`~0.4.0`,"@changesets/cli":`~2.29.8`,vitest:`~4.0.18`,vue:`3.5.24`},yn=`@platforma-open/milaboratories.runenv-python-3`,bn=`1.8.2`;function xn(e){let t=e.modules.filter(e=>e.path!==``).map(e=>e.path).sort(),n={};for(let e of X)n[e]=_n;return Object.assign(n,vn),e.modules.some(e=>e.scope===`software`)&&(n[yn]=bn),{packages:t,catalog:n}}function Sn(){ht()}var Cn=[`.test_auth.json`,`node_modules/`,`dist/`,`block-pack/`,`dev/`,`work/`,`log/`,`.turbo`,`vite.config.*.timestamp-*`,`software/**/*.tgz`,`.DS_Store`,`.vscode/sftp.json`,`test-dry-run.json`];function wn(){yt(Cn)}function Tn(){_(`root`,()=>{v(({ctx:e})=>!e.isSdkInternal,()=>{b(`turbo.json`,w(`root/turbo.json`)),b(`.vscode/settings.json`,w(`root/.vscode/settings.json`)),x(`package.json`,T(()=>rn(g())),()=>{an()}),x(`pnpm-workspace.yaml`,T(()=>xn(g())),()=>{Sn()}),x(`.gitignore`,w(`root/.gitignore`),()=>{wn()})})})}function En(e){let t={};for(let n of G(e,`workflow`))t.workflow=`${n.name}/dist/tengo/tpl/main.plj.gz`;for(let n of G(e,`model`))t.model=`${n.name}/dist/model.json`;for(let n of G(e,`ui`))t.ui=`${n.name}/dist`;return t}function Dn(e){if(Object.keys(e.components).length===0)throw Error(`block.components is empty — no workflow/model/ui module was discovered`);let t=e.meta,n=[[`block.meta.title`,t.title],[`block.meta.description`,t.description],[`block.meta.logo`,t.logo],[`block.meta.organization.name`,t.organization?.name],[`block.meta.organization.url`,t.organization?.url],[`block.meta.organization.logo`,t.organization?.logo]];for(let[e,t]of n)if(typeof t!=`string`||t===``)throw Error(`required block field '${e}' is empty`)}function On(e){let t=e.blockVars,n={...K(e,`model`),...K(e,`ui`),...K(e,`workflow`)},r={components:En(e),meta:{title:t.shortName,description:`${t.shortName} block`,logo:`file:logos/block-logo.png`,organization:{name:t.orgScope,url:`https://example.com`,logo:`file:logos/organization-logo.png`}}};return Dn(r),{name:`${t.facadeName}.block`,version:`1.0.0`,files:[`index.d.ts`,`index.js`],scripts:{build:`shx rm -rf ./block-pack && block-tools pack`,"mark-stable":`block-tools mark-stable -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'`,prepublishOnly:`block-tools pack && block-tools publish -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'`,"do-pack":`shx rm -f *.tgz && block-tools pack && pnpm pack && shx mv *.tgz package.tgz`},dependencies:n,devDependencies:{"@platforma-sdk/block-tools":`sdk:`,shx:`catalog:`},block:r}}function kn(){M(`files`,[`index.d.ts`,`index.js`]),P(`build`,`shx rm -rf ./block-pack && block-tools pack`),P(`mark-stable`,`block-tools mark-stable -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'`),P(`prepublishOnly`,`block-tools pack && block-tools publish -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'`),P(`do-pack`,`shx rm -f *.tgz && block-tools pack && pnpm pack && shx mv *.tgz package.tgz`),B(`model`),B(`ui`),B(`workflow`),L(`@platforma-sdk/block-tools`,`sdk:`),L(`shx`,`catalog:`),M(`block.components`,En(g())),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),H([...Y])}function An(){_(`block`,()=>{b(`index.js`,w(`block/index.js`)),b(`index.d.ts`,w(`block/index.d.ts`)),S(`logos/block-logo.png`,Ne(`block/logos/block-logo.png`)),S(`logos/organization-logo.png`,Ne(`block/logos/organization-logo.png`)),x(`package.json`,T(()=>On(g())),()=>{kn()})})}var Z=`src/**/*.test.ts`;function jn(e){return{name:`${e.blockVars.facadeName}.model`,version:`1.0.0`,type:`module`,main:`dist/index.cjs`,module:`dist/index.js`,types:`dist/index.d.ts`,exports:{".":{types:`./dist/index.d.ts`,sources:`./src/index.ts`,import:`./dist/index.js`},"./dist/*":`./dist/*`},scripts:{fmt:`ts-builder format`,watch:`ts-builder build --target block-model --watch`,build:`ts-builder build --target block-model && block-tools build-model`,check:`ts-builder check --target block-model`},dependencies:{"@platforma-sdk/model":`sdk:`},devDependencies:{"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,"@platforma-sdk/block-tools":`sdk:`,vitest:`catalog:`},peerDependencies:{"@types/node":`*`,typescript:`*`}}}function Mn(){M(`type`,`module`),M(`main`,`dist/index.cjs`),M(`module`,`dist/index.js`),M(`types`,`dist/index.d.ts`),M(`exports`,{".":{types:`./dist/index.d.ts`,sources:`./src/index.ts`,import:`./dist/index.js`},"./dist/*":`./dist/*`}),P(`fmt`,`ts-builder format`),P(`watch`,`ts-builder build --target block-model --watch`),P(`build`,`ts-builder build --target block-model && block-tools build-model`),P(`check`,`ts-builder check --target block-model`),I(`@platforma-sdk/model`,`sdk:`),R({"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,"@platforma-sdk/block-tools":`sdk:`,vitest:`catalog:`}),z({"@types/node":`*`,typescript:`*`}),v(y(Z),()=>{P(`test`,`vitest run --passWithNoTests`),L(`@types/node`,`*`)}),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),H([...Y])}function Nn(){_(`model`,()=>{x(`tsconfig.json`,w(`model/tsconfig.json`),()=>{M(`extends`,`@milaboratories/ts-configs/block/model`),N(`compilerOptions`),v(y(Z),()=>{M(`compilerOptions.types`,[`node`])}),M(`include`,[`src/**/*`]),V(e=>e!==`extends`&&e!==`include`&&e!==`compilerOptions`)}),b(`.oxlintrc.json`,w(`model/.oxlintrc.json`)),b(`.oxfmtrc.json`,w(`model/.oxfmtrc.json`)),S(`src/index.ts`,w(`model/src/index.ts`)),x(`package.json`,T(()=>jn(g())),()=>{Mn()})})}function Pn(e){return{name:`${e.blockVars.facadeName}.ui`,version:`1.0.0`,type:`module`,scripts:{fmt:`ts-builder format`,dev:`ts-builder serve --target block-ui`,watch:`ts-builder build --target block-ui --watch`,build:`ts-builder build --target block-ui`,check:`ts-builder check --target block-ui`},dependencies:{"@platforma-sdk/ui-vue":`sdk:`,vue:`catalog:`,...K(e,`model`)},devDependencies:{"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,vitest:`catalog:`},peerDependencies:{typescript:`*`}}}function Fn(){M(`type`,`module`),P(`fmt`,`ts-builder format`),P(`dev`,`ts-builder serve --target block-ui`),P(`watch`,`ts-builder build --target block-ui --watch`),P(`build`,`ts-builder build --target block-ui`),P(`check`,`ts-builder check --target block-ui`),I(`@platforma-sdk/ui-vue`,`sdk:`),I(`vue`,`catalog:`),B(`model`),R({"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,vitest:`catalog:`}),z({typescript:`*`}),ft(`@types/node`),v(y(Z),()=>{P(`test`,`vitest run --passWithNoTests`),L(`@types/node`,`*`)}),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),H([...Y])}function In(){_(`ui`,()=>{x(`tsconfig.json`,w(`ui/tsconfig.json`),()=>{M(`extends`,`@milaboratories/ts-configs/block/ui`),N(`compilerOptions`),v(y(Z),()=>{M(`compilerOptions.types`,[`node`])}),M(`include`,[`src/**/*`]),V(e=>e!==`extends`&&e!==`include`&&e!==`compilerOptions`)}),b(`.oxlintrc.json`,w(`ui/.oxlintrc.json`)),b(`.oxfmtrc.json`,w(`ui/.oxfmtrc.json`)),Me(`index.html`,w(`ui/index.html`)),S(`src/main.ts`,w(`ui/src/main.ts`)),S(`src/app.ts`,Fe(`ui/src/app.tpl.ts`,()=>({modelPkg:`${Ie().facadeName}.model`}))),S(`src/MainPage.vue`,Fe(`ui/src/MainPage.tpl.vue`,()=>({shortName:Ie().shortName}))),x(`package.json`,T(()=>Pn(g())),()=>{Fn()})})}function Ln(e){return{name:`${e.blockVars.facadeName}.workflow`,version:`1.0.0`,type:`module`,scripts:{build:`shx rm -rf dist && pl-tengo build`,check:`pl-tengo check`,format:`/usr/bin/env emacs --script ./format.el || echo 'No emacs.'`},dependencies:{"@platforma-sdk/workflow-tengo":`sdk:`,...qt(e,`software`)},devDependencies:{"@platforma-sdk/tengo-builder":`sdk:`,"@platforma-sdk/test":`sdk:`,vitest:`catalog:`,shx:`catalog:`}}}function Rn(){M(`type`,`module`),P(`build`,`shx rm -rf dist && pl-tengo build`),P(`check`,`pl-tengo check`),P(`format`,`/usr/bin/env emacs --script ./format.el || echo 'No emacs.'`),v(y(Z),()=>{P(`test`,`vitest run --passWithNoTests`)}),I(`@platforma-sdk/workflow-tengo`,`sdk:`),B(`software`),R({"@platforma-sdk/tengo-builder":`sdk:`,"@platforma-sdk/test":`sdk:`,vitest:`catalog:`,shx:`catalog:`}),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),H([...Y])}function zn(){_(`workflow`,()=>{b(`tsconfig.json`,w(`workflow/tsconfig.json`)),b(`format.el`,w(`workflow/format.el`)),Me(`vitest.config.mts`,w(`workflow/vitest.config.mts`)),C(`index.js`),C(`index.d.ts`),S(`src/main.tpl.tengo`,Fe(`workflow/src/main.tpl.tengo`,()=>({shortName:Ie().shortName}))),x(`package.json`,T(()=>Ln(g())),()=>{Rn()})})}function Bn(e){return{name:`${e.blockVars.facadeName}.test`,version:`1.0.0`,private:!0,type:`module`,scripts:{check:`ts-builder type-check --target block-test`,test:`vitest run --passWithNoTests`},peerDependencies:{typescript:`*`},devDependencies:{"@platforma-sdk/test":`sdk:`,"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,vitest:`catalog:`}}}function Vn(){M(`type`,`module`),P(`check`,`ts-builder type-check --target block-test`),P(`test`,`vitest run --passWithNoTests`),R({"@platforma-sdk/test":`sdk:`,"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,vitest:`catalog:`}),z({typescript:`*`}),ft(`@types/node`),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),H([...Y])}function Hn(){_(`test`,()=>{b(`tsconfig.json`,w(`test/tsconfig.json`)),Me(`vitest.config.mts`,w(`test/vitest.config.mts`)),S(`src/demo.test.ts`,Pe(`import { expect, test } from "vitest";
13
+ `}function Ze(e){return e.replace(/(^|\s)#.*$/,`$1`).trim()}function Qe(e,t){let n=Ze(e);return n===``?!1:n===t.trim()}function $e(e,t){for(let n of e)if(Qe(n,t))return!0;return!1}function et(e,t){return e===`sdk:`?t?`workspace:*`:`catalog:`:e}var tt=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`];function nt(e,t){if(N(e))for(let n of tt){let r=e[n];if(N(r))for(let e of Object.keys(r))r[e]===`sdk:`&&(r[e]=t?`workspace:*`:`catalog:`)}}var A;function j(e){if(!A)throw Error(`${e}() only valid inside a managed(...) body. Move this call inside managed(path, initial, () => {...}).`);return A}function M(e){let t=j(e);if(t.kind!==`json`)throw Error(`${e}() requires a JSON-managed body; got '${t.kind}'.`);return t}function rt(e){let t=j(e);if(t.kind!==`yaml`)throw Error(`${e}() requires a YAML-managed body; got '${t.kind}'.`);return t}function it(e){let t=j(e);if(t.kind!==`lines`)throw Error(`${e}() requires a lines-managed body; got '${t.kind}'.`);return t}function at(e,t){let n=e.ctx??Te();if(!n)throw Error(`${t}() needs a RunContext but none is active. Pass { ctx } via the with-managed-* helper or run inside engine.run(...).`);return n}function N(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ot(e,t,n={}){if(A)throw Error(`Nested managed(...) body — engine bug.`);A={kind:`json`,obj:e,ctx:n.ctx,triggerContext:n.triggerContext};try{return t(),e}finally{A=void 0}}function st(e,t,n={}){if(A)throw Error(`Nested managed(...) body — engine bug.`);A={kind:`yaml`,doc:e,ctx:n.ctx,triggerContext:n.triggerContext,getLatestVersion:n.getLatestVersion};try{return t(),e}finally{A=void 0}}function ct(e,t,n={}){if(A)throw Error(`Nested managed(...) body — engine bug.`);A={kind:`lines`,lines:e,ctx:n.ctx,triggerContext:n.triggerContext};try{return t(),e}finally{A=void 0}}ke((e,t)=>{if(!A)return!1;let n=A.triggerContext;if(!n)throw Error("when() inside a managed(...) body requires a triggerContext. The runner supplies it via the `triggerContext` opt to with-managed-*; ensure your test/test helper passes one.");return e(n)&&t(),!0});function P(e,t){Ke(M(`ensureField`).obj,e,t)}function lt(e,t){let n=M(`removeField`).obj;Ge(n,e)&&(t&&!t(We(n,e))||qe(n,e))}function F(e,t){P(`scripts.${e}`,t)}function ut(e){lt(`scripts.${e}`)}var dt=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`];function I(e,t,n,r){let i=M(e),a=i.obj,o=n===`sdk:`?et(n,at(i,e).isSdkInternal):n;for(let e of dt){if(e===r)continue;let n=a[e];N(n)&&t in n&&delete n[t]}let s=a[r],c=N(s)?s:{};c[t]=o,N(s)||(a[r]=c)}function L(e,t){I(`ensureDep`,e,t,`dependencies`)}function R(e,t){I(`ensureDevDep`,e,t,`devDependencies`)}function ft(e,t){I(`ensurePeerDep`,e,t,`peerDependencies`)}function z(e){let t=M(`removeDep`).obj;for(let n of dt){let r=t[n];N(r)&&e in r&&delete r[e]}}function B(e){for(let[t,n]of Object.entries(e))R(t,n)}function V(e){for(let[t,n]of Object.entries(e))ft(t,n)}function pt(e,t,n){let r=at(M(e),e);for(let i of r.modules)i.scope===t&&I(e,i.name,`workspace:*`,n)}function H(e){pt(`ensureWorkspaceScopeDeps`,e,`dependencies`)}function mt(e){let t=M(`pruneKeysMatching`).obj;for(let n of Object.keys(t))e(n,t[n])&&delete t[n]}function ht(e,t){let n=Je(e,t);for(let t of Object.keys(e))delete e[t];for(let t of Object.keys(n))e[t]=n[t]}function U(e){ht(M(`enforceFieldOrder`).obj,e)}function W(e,t){let n=Object.keys(e).sort(),r={};for(let t of n)r[t]=e[t];for(let t of Object.keys(e))delete e[t];for(let i of n)e[i]=r[i],t&&N(e[i])&&W(e[i],!0)}function G(e=``,t={}){let n=t.recursive??!1;if(e===``&&!n)return;let r=M(`enforceAlphabeticalOrder`).obj;if(e===``){W(r,!0);return}let i=We(r,e);N(i)&&W(i,n)}function gt(){let e=rt(`ensureWorkspaceModulePaths`),t=at(e,`ensureWorkspaceModulePaths`).modules.filter(e=>e.path!==``).map(e=>e.path).sort(),n=e.doc.toJSON()?.packages;Array.isArray(n)&&n.length===t.length&&n.every((e,n)=>e===t[n])||e.doc.setIn([`packages`],t)}function _t(e,t){let n=e.doc.getIn([`catalog`,t]);return typeof n==`string`?n:void 0}function vt(e,t){let n=rt(`ensureCatalogVersion`);_t(n,e)===void 0&&n.doc.setIn([`catalog`,e],t)}function yt(e){let t=rt(`ensureCatalogLatest`);if(!t.getLatestVersion)return;let n=t.getLatestVersion(e);n!==void 0&&_t(t,e)!==n&&t.doc.setIn([`catalog`,e],n)}function bt(e){let t=it(`ensureGitignoreEntries`);for(let n of e)$e(t.lines,n)||t.lines.push(n)}function xt(e){return(0,o.parseDocument)(e)}function St(e){return e.toString()}var Ct=`.structure`;function wt(e,t=0){if(e<t)throw new Tt(e,t)}var Tt=class extends Error{constructor(e,t){super(`Block .structure version is ${e}, below floor ${t}. Bootstrap via the legacy-migration skill, then re-run.`),this.version=e,this.floor=t,this.name=`StructureVersionFloorError`}};function Et(e,t=1){let n={version:t};e.write(Ct,JSON.stringify(n))}var Dt=class extends Error{constructor(e){super(`Post-run recheck: rule set not idempotent. Failing item: ${e.primitive} '${e.path}' (scope=${e.scope}, action=${e.action}). Engine bug.`),this.failing=e,this.name=`RecheckError`}};function Ot(e,t,n,r){switch(e.kind){case`text`:return e.value;case`file`:if(!n)throw Error(`file('${e.path}'): no TemplateProvider configured. Pass opts.templates to engine.run(...).`);return n.staticRead(e.path);case`tpl`:if(!n)throw Error(`tpl('${e.path}'): no TemplateProvider configured. Pass opts.templates to engine.run(...).`);return pe(n.textRead(e.path),typeof e.vars==`function`?e.vars():e.vars);case`generate`:{let n=e.fn();if(t.endsWith(`.json`))return nt(n,r),Ue(n,{collapse:!t.endsWith(`package.json`)});if(t.endsWith(`.yaml`)||t.endsWith(`.yml`))return(0,o.stringify)(n);if(typeof n!=`string`)throw Error(`generate() for '${t}' must return a string for non-JSON/YAML files; got ${typeof n}`);return n}case`binary`:throw Error(`binary('${e.path}') cannot be resolved to a string; it is only valid inside seed()/scaffold(), which copy it verbatim via fs.writeBinary.`)}}function kt(e,t,n,r,i){if(n.kind===`binary`){if(!r)throw Error(`binary('${n.path}'): no TemplateProvider configured. Pass opts.templates to engine.run(...).`);e.writeBinary(t,r.staticReadBinary(n.path));return}e.write(t,Ot(n,t,r,i))}function At(e,t,n,r,i){let a=e.split(`/`).pop()??e;if(e.endsWith(`.json`)){let i=Re(t);if(typeof i!=`object`||!i||Array.isArray(i))throw Error(`managed: parsed value at '${e}' is not a JSON object`);return ot(i,n,{triggerContext:r}),Ue(i,{collapse:a!==`package.json`})}if(e.endsWith(`.yaml`)||e.endsWith(`.yml`)){let e=xt(t);return st(e,n,{triggerContext:r,getLatestVersion:i}),St(e)}if(a===`.gitignore`||a.endsWith(`.gitignore`)){let e=Ye(t);return ct(e,n,{triggerContext:r}),Xe(e)}throw Error(`managed('${e}'): unsupported file kind. Only .json, .yaml, .yml, .gitignore are dispatched.`)}function jt(e){let t=e.list(``),n=new Set;for(let e of t){n.add(e);let t=e.split(`/`);for(let e=1;e<t.length;e++)n.add(t.slice(0,e).join(`/`))}return n}function Mt(e,t){let n=t===``?t:t.endsWith(`/`)?t.slice(0,-1):t;return e.has(n)}function Nt(e,t,n){return{ctx:t,version:t.version,pathExists:t=>Mt(e,t),pathMissing:t=>!Mt(e,t),filesMatch:t=>{let r=n?`${n}/${t}`:t;for(let t of e)if(Se(r,t))return!0;return!1}}}function Pt(e,t){for(let n of e.triggers)if(!n(t))return!1;return!0}function Ft(e,t){return t?`init`:e.updateDepsOnly?`updateDeps`:`default`}function It(e,t){return e.filter(e=>e.modes.includes(t))}function Lt(e,t,n,r,i,a){let o=e.leaf;if(o.kind===`fixed`){let i=Ot(o.content,e.resolvedPath,r,a);return t.exists(e.resolvedPath)?t.read(e.resolvedPath)===i?void 0:(n||t.write(e.resolvedPath,i),{scope:e.scope,path:e.resolvedPath,primitive:`fixed`,action:`update`}):(n||t.write(e.resolvedPath,i),{scope:e.scope,path:e.resolvedPath,primitive:`fixed`,action:`create`})}if(o.kind===`scaffold`)return t.exists(e.resolvedPath)?void 0:(n||kt(t,e.resolvedPath,o.initial,r,a),{scope:e.scope,path:e.resolvedPath,primitive:`scaffold`,action:`create`});if(o.kind===`seed`)return!i||t.exists(e.resolvedPath)?void 0:(n||kt(t,e.resolvedPath,o.initial,r,a),{scope:e.scope,path:e.resolvedPath,primitive:`seed`,action:`create`});if(o.kind===`remove`)return t.exists(e.resolvedPath)?(n||t.delete(e.resolvedPath),{scope:e.scope,path:e.resolvedPath,primitive:`remove`,action:`delete`}):void 0;if(o.kind===`rename`){if(!t.exists(e.resolvedPath))return;let r=e.resolvedTo;return t.exists(r)?void 0:(n||t.move(e.resolvedPath,r),{scope:e.scope,path:e.resolvedPath,primitive:`rename`,action:`rename`})}}function Rt(e,t,n,r,i,a,o){if(e.leaf.kind!==`managed`)return;let s=e.leaf,c=e.resolvedPath,l=t.exists(c),u,d=!1;l?u=t.read(c):(u=Ot(s.initial,c,i,o),d=!0);let f=At(c,u,s.body,r,a);if(d)return n||t.write(c,f),{scope:e.scope,path:c,primitive:`managed`,action:`create`};if(f!==u)return n||t.write(c,f),{scope:e.scope,path:c,primitive:`managed`,action:`update`}}function zt(e,t,n,r,i,a,o){let s=It(e,Ft(n,a)),c=[],l=jt(t);for(let e of s){if(e.leaf.kind===`managed`||!Pt(e,Nt(l,n,e.modulePath)))continue;let o=Lt(e,t,r,i,a,n.isSdkInternal);o&&c.push(o)}let u=jt(t);for(let e of s){if(e.leaf.kind!==`managed`)continue;let a=Nt(u,n,e.modulePath);if(!Pt(e,a))continue;let s=Rt(e,t,r,a,i,o,n.isSdkInternal);s&&c.push(s)}return c}function Bt(e,t,n,r={}){return we(n,()=>{let i=_e(e,n),a=!!r.initMode,o=zt(i,t,n,n.dryRun,r.templates,a,r.registryLookup);if(!n.dryRun&&!n.updateDepsOnly&&!a){Et(t);let i={...r.rediscover?r.rediscover(t):n,dryRun:!0},a=zt(_e(e,i),t,i,!0,r.templates,!1,r.registryLookup).filter(e=>e.path!==Ct);if(a.length>0)throw new Dt(a[0])}return a&&!n.dryRun&&Et(t),{changes:o}})}var Vt=[`root`,`block`,`model`,`ui`,`workflow`,`test`,`software`],Ht=class extends Error{constructor(e,t){super(e),this.path=t,this.name=`DiscoveryError`}};function Ut(e){let t=new Set;for(let n of[e.dependencies,e.devDependencies,e.peerDependencies,e.optionalDependencies])if(n)for(let e of Object.keys(n))t.add(e);return t}function Wt(e){return e===``||e===`.`}function Gt(e,t){let n=e.pkg[`block-scope`];if(typeof n==`string`){if(!Vt.includes(n))throw new Ht(`package.json "block-scope" must be one of ${Vt.join(`, `)}, got '${n}'`,e.path);return n}if(Wt(e.path))return`root`;let r=Ut(e.pkg);if(e.pkg[`block-software`]!==void 0)return`software`;if(r.has(`@platforma-sdk/package-builder`)){for(let e of r)if(/^@platforma-open\/.*runenv/.test(e))return`software`}if(r.has(`@platforma-sdk/workflow-tengo`))return`workflow`;if((r.has(`@platforma-sdk/ui-vue`)||r.has(`vue`))&&!e.pkg.main)return`ui`;if(r.has(`@platforma-sdk/block-tools`)){if([...r].filter(e=>t.has(e)&&(e.endsWith(`.model`)||e.endsWith(`.ui`)||e.endsWith(`.workflow`))).length>=2)return`block`;let n=e.pkg.files;if(Array.isArray(n)&&n.length===2&&n.includes(`index.d.ts`)&&n.includes(`index.js`))return`block`}if(r.has(`@platforma-sdk/model`)&&e.pkg.main)return`model`;if(r.has(`@platforma-sdk/test`))return`test`}function Kt(e){let t=new Set;for(let n of e)typeof n.pkg.name==`string`&&t.add(n.pkg.name);let n=[];for(let r of e){let e=Gt(r,t);if(!e)throw new Ht(`Unclassified workspace package at '${r.path}'. Add a top-level "block-scope" string to its package.json.`,r.path);n.push({scope:e,name:r.pkg.name??r.path,path:Wt(r.path)?``:r.path})}return n}function K(e,t){return e.modules.filter(e=>e.scope===t)}function qt(e,t){let n=K(e,t);if(n.length===0)throw Error(`findModule: expected one '${t}' module, found none`);if(n.length>1)throw Error(`findModule: expected exactly one '${t}' module, found ${n.length}`);return n[0]}function q(e,t){return{[qt(e,t).name]:`workspace:*`}}function Jt(e,t){let n={};for(let r of K(e,t))n[r.name]=`workspace:*`;return n}function Yt(e){let t=e.facadeName,n=[{scope:`root`,name:t,path:``},{scope:`block`,name:`${t}.block`,path:`block`},{scope:`model`,name:`${t}.model`,path:`model`},{scope:`ui`,name:`${t}.ui`,path:`ui`},{scope:`workflow`,name:`${t}.workflow`,path:`workflow`},{scope:`test`,name:`${t}.test`,path:`test`}];return e.softwarePlatform&&n.push({scope:`software`,name:`${t}.software`,path:`software`}),n}function Xt(e){return{isSdkInternal:e.isSdkInternal??!1,updateDepsOnly:e.updateDepsOnly??!1,modules:e.modules,blockVars:e.blockVars,version:e.version??0,dryRun:e.dryRun??!1}}var J=class extends Error{constructor(e){super(e),this.name=`StructureCliError`}};function Zt(e,t){return e===``?t:`${e}/${t}`}function Qt(e,t){try{return JSON.parse(e.read(t))}catch{return}}function $t(e){if(e.includes(`*`))throw new J(`pnpm-workspace.yaml 'packages:' entry '${e}' contains a glob. The structurer requires literal package paths — replace the glob with one entry per package directory.`);let t=e.replace(/^\.\//,``).replace(/\/$/,``);return t===`.`?``:t}function en(e){let t;try{t=e.read(`pnpm-workspace.yaml`)}catch{throw new J(`No pnpm-workspace.yaml found. This directory is empty or unrecognisable as a block — run 'block-tools structure init' instead, or pass --sdk-internal for an in-monorepo block.`)}let n=(0,o.parse)(t)??{},r=Array.isArray(n.packages)?n.packages:[],i=new Set([``]);for(let t of r){let n=$t(t);(n===``||e.exists(n))&&i.add(n)}let a=[];for(let t of i){let n=Qt(e,Zt(t,`package.json`));n&&a.push({path:t,pkg:n})}return a}function tn(e){let t=[],n=new Set([`node_modules`,`.turbo`,`dist`,`.git`,`block-pack`]);function r(i,a){let o=e.listDir(i);for(let s of o){if(!s.isDirectory||n.has(s.name))continue;let o=Zt(i,s.name),c=Qt(e,Zt(o,`package.json`));c&&t.push({path:o,pkg:c}),a<2&&r(o,a+1)}}return r(``,1),t}function nn(e){let t=e.indexOf(`/`);if(!e.startsWith(`@`)||t<0)throw new J(`Cannot parse block name '${e}': expected '@npm-org/org-scope.short-name'.`);let n=e.slice(0,t),r=e.slice(t+1),i=r.indexOf(`.`);if(i<0)throw new J(`Cannot parse block name '${e}': base name '${r}' has no '.' separating org-scope from short-name.`);return{facadeName:e,baseName:r,npmOrg:n,orgScope:r.slice(0,i),shortName:r.slice(i+1)}}function rn(e){try{let t=JSON.parse(e.read(Ct));return typeof t.version==`number`?t.version:0}catch{return 0}}function an(e){let{fs:t,isSdkInternal:n}=e,r=n?tn(t):en(t);if(r.length===0)throw new J(`No workspace packages found. Run 'block-tools structure init' to scaffold a block.`);let i=Kt(r),a=rn(t);wt(a,0);let o=i.find(e=>e.scope===`block`)??i.find(e=>e.scope===`root`);if(!o)throw new J(`Could not find a 'block' (or root-as-block) package to derive BlockVars from.`);let s=nn(o.name);return Xt({isSdkInternal:n,updateDepsOnly:e.updateDepsOnly??!1,modules:i,blockVars:s,version:a,dryRun:e.dryRun??!1})}var Y=[`name`,`version`,`private`,`description`,`keywords`,`files`,`type`,`main`,`module`,`types`,`exports`,`scripts`,`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`,`packageManager`,`pnpm`,`block`,`block-software`];function on(e){return{version:`1.0.0`,private:!0,scripts:{fmt:`turbo run fmt`,check:`turbo run check`,build:`turbo run build`,"build:dev":`env PL_PKG_DEV=local turbo run build`,test:`env PL_PKG_DEV=local turbo run test --concurrency 1`,"test:dry-run":`env PL_PKG_DEV=local turbo run test --dry-run=json`,"mark-stable":`turbo run mark-stable`,"do-pack":`turbo run do-pack`,watch:`turbo watch build`,changeset:`changeset`,"version-packages":`changeset version`,"update-sdk":`block-tools structure refresh --update-deps-only`,update:`block-tools structure refresh --update-deps-only && pnpm i && block-tools structure refresh && pnpm fmt`},peerDependencies:{oxlint:`*`,oxfmt:`*`},devDependencies:{"@changesets/cli":`catalog:`,"@milaboratories/ts-builder":`sdk:`,"@platforma-sdk/block-tools":`sdk:`,shx:`catalog:`,turbo:`catalog:`},packageManager:`pnpm@9.12.0`}}function sn(){P(`packageManager`,`pnpm@9.12.0`),lt(`name`),F(`fmt`,`turbo run fmt`),F(`check`,`turbo run check`),F(`build`,`turbo run build`),F(`build:dev`,`env PL_PKG_DEV=local turbo run build`),F(`test`,`env PL_PKG_DEV=local turbo run test --concurrency 1`),F(`test:dry-run`,`env PL_PKG_DEV=local turbo run test --dry-run=json`),F(`mark-stable`,`turbo run mark-stable`),F(`do-pack`,`turbo run do-pack`),F(`watch`,`turbo watch build`),F(`changeset`,`changeset`),F(`version-packages`,`changeset version`),F(`update-sdk`,`block-tools structure refresh --update-deps-only`),F(`update`,`block-tools structure refresh --update-deps-only && pnpm i && block-tools structure refresh && pnpm fmt`),B({"@changesets/cli":`catalog:`,"@milaboratories/ts-builder":`sdk:`,"@platforma-sdk/block-tools":`sdk:`,shx:`catalog:`,turbo:`catalog:`}),V({oxlint:`*`,oxfmt:`*`}),mt((e,t)=>{if(!/^(\/\/|--)/.test(e)||typeof t!=`object`||!t)return!1;let n=t;return n.pnpm!==void 0||n.overrides!==void 0}),G(`dependencies`),G(`devDependencies`),G(`peerDependencies`),G(`optionalDependencies`),U([...Y])}var cn=2,ln=500,un=3e4;function dn(e){if(!e)return null;let t=Number(e);if(Number.isFinite(t)&&t>0)return t*1e3;let n=Date.parse(e);return Number.isNaN(n)?null:Math.max(0,n-Date.now())}async function fn(e){for(let t=1;;t++){let n;try{n=await fetch(e,{signal:AbortSignal.timeout(un)})}catch(e){if(t>cn)throw e;await(0,s.setTimeout)(ln*2**(t-1)*(.8+.4*Math.random()));continue}if(n.ok)return n;if(!(n.status===429||n.status>=500)||t>cn)throw Error(`registry returned HTTP ${n.status}`);let r=dn(n.headers.get(`retry-after`));if(r!=null){await(0,s.setTimeout)(r);continue}await(0,s.setTimeout)(ln*2**(t-1)*(.8+.4*Math.random()))}}function pn(){return{async getLatestVersion(e){let t=(await(await fn(`https://registry.npmjs.org/-/package/${e}/dist-tags`)).json()).latest;if(!t)throw Error(`no 'latest' dist-tag in registry response`);return t}}}async function mn(e,t){let n=await Promise.all(t.map(async t=>[t,await e.getLatestVersion(t)]));return new Map(n)}function hn(e){return t=>e.get(t)}var gn=[/^@platforma-sdk\//,/^@milaboratories\//];function _n(e){return gn.some(t=>t.test(e))}async function vn(e,t=pn()){return e.length===0?()=>void 0:hn(await mn(t,e))}var X=[`@platforma-sdk/model`,`@platforma-sdk/ui-vue`,`@platforma-sdk/workflow-tengo`,`@platforma-sdk/test`,`@platforma-sdk/block-tools`,`@platforma-sdk/tengo-builder`,`@platforma-sdk/package-builder`,`@milaboratories/ts-builder`,`@milaboratories/ts-configs`],yn=`0.0.0-init-must-fetch`;for(let e of X)if(!_n(e))throw Error(`SDK_CATALOG_PACKAGES entry '${e}' matches no catalog bump pattern; its placeholder would never be resolved to npm latest on init. Add it to CATALOG_BUMP_PATTERNS or move it to the infra floor.`);var bn={turbo:`~2.8.11`,shx:`~0.4.0`,"@changesets/cli":`~2.29.8`,vitest:`~4.0.18`,vue:`3.5.24`},xn=`@platforma-open/milaboratories.runenv-python-3`,Sn=`1.8.2`;function Cn(e){let t=e.modules.filter(e=>e.path!==``).map(e=>e.path).sort(),n={};for(let e of X)n[e]=yn;return Object.assign(n,bn),e.modules.some(e=>e.scope===`software`)&&(n[xn]=Sn),{packages:t,catalog:n}}function wn(){gt()}var Tn=[`.test_auth.json`,`node_modules/`,`dist/`,`block-pack/`,`dev/`,`work/`,`log/`,`.turbo`,`vite.config.*.timestamp-*`,`software/**/*.tgz`,`.DS_Store`,`.vscode/sftp.json`,`test-dry-run.json`];function En(){bt(Tn)}function Dn(){_(`root`,()=>{v(({ctx:e})=>!e.isSdkInternal,()=>{b(`turbo.json`,w(`root/turbo.json`)),b(`.vscode/settings.json`,w(`root/.vscode/settings.json`)),x(`package.json`,T(()=>on(g())),()=>{sn()}),x(`pnpm-workspace.yaml`,T(()=>Cn(g())),()=>{wn()}),x(`.gitignore`,w(`root/.gitignore`),()=>{En()})})})}function On(e){let t={};for(let n of K(e,`workflow`))t.workflow=`${n.name}/dist/tengo/tpl/main.plj.gz`;for(let n of K(e,`model`))t.model=`${n.name}/dist/model.json`;for(let n of K(e,`ui`))t.ui=`${n.name}/dist`;return t}function kn(e){if(Object.keys(e.components).length===0)throw Error(`block.components is empty — no workflow/model/ui module was discovered`);let t=e.meta,n=[[`block.meta.title`,t.title],[`block.meta.description`,t.description],[`block.meta.logo`,t.logo],[`block.meta.organization.name`,t.organization?.name],[`block.meta.organization.url`,t.organization?.url],[`block.meta.organization.logo`,t.organization?.logo]];for(let[e,t]of n)if(typeof t!=`string`||t===``)throw Error(`required block field '${e}' is empty`)}function An(e){let t=e.blockVars,n={...q(e,`model`),...q(e,`ui`),...q(e,`workflow`)},r={components:On(e),meta:{title:t.shortName,description:`${t.shortName} block`,logo:`file:logos/block-logo.png`,organization:{name:t.orgScope,url:`https://example.com`,logo:`file:logos/organization-logo.png`}}};return kn(r),{name:`${t.facadeName}.block`,version:`1.0.0`,files:[`index.d.ts`,`index.js`],scripts:{build:`shx rm -rf ./block-pack && block-tools pack`,"mark-stable":`block-tools mark-stable -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'`,prepublishOnly:`block-tools pack && block-tools publish -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'`,"do-pack":`shx rm -f *.tgz && block-tools pack && pnpm pack && shx mv *.tgz package.tgz`},dependencies:n,devDependencies:{"@platforma-sdk/block-tools":`sdk:`,shx:`catalog:`},block:r}}function jn(){P(`files`,[`index.d.ts`,`index.js`]),F(`build`,`shx rm -rf ./block-pack && block-tools pack`),F(`mark-stable`,`block-tools mark-stable -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'`),F(`prepublishOnly`,`block-tools pack && block-tools publish -r 's3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1'`),F(`do-pack`,`shx rm -f *.tgz && block-tools pack && pnpm pack && shx mv *.tgz package.tgz`),H(`model`),H(`ui`),H(`workflow`),R(`@platforma-sdk/block-tools`,`sdk:`),R(`shx`,`catalog:`),P(`block.components`,On(g())),G(`dependencies`),G(`devDependencies`),G(`peerDependencies`),G(`optionalDependencies`),U([...Y])}function Mn(){_(`block`,()=>{b(`index.js`,w(`block/index.js`)),b(`index.d.ts`,w(`block/index.d.ts`)),S(`logos/block-logo.png`,Fe(`block/logos/block-logo.png`)),S(`logos/organization-logo.png`,Fe(`block/logos/organization-logo.png`)),x(`package.json`,T(()=>An(g())),()=>{jn()})})}var Z=`src/**/*.test.ts`;function Nn(e){return{name:`${e.blockVars.facadeName}.model`,version:`1.0.0`,type:`module`,main:`dist/index.cjs`,module:`dist/index.js`,types:`dist/index.d.ts`,exports:{".":{types:`./dist/index.d.ts`,sources:`./src/index.ts`,import:`./dist/index.js`},"./dist/*":`./dist/*`},scripts:{fmt:`ts-builder format`,watch:`ts-builder build --target block-model --watch`,build:`ts-builder build --target block-model && block-tools build-model`,check:`ts-builder check --target block-model`},dependencies:{"@platforma-sdk/model":`sdk:`},devDependencies:{"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,"@platforma-sdk/block-tools":`sdk:`,vitest:`catalog:`},peerDependencies:{"@types/node":`*`,typescript:`*`}}}function Pn(){P(`type`,`module`),P(`main`,`dist/index.cjs`),P(`module`,`dist/index.js`),P(`types`,`dist/index.d.ts`),P(`exports`,{".":{types:`./dist/index.d.ts`,sources:`./src/index.ts`,import:`./dist/index.js`},"./dist/*":`./dist/*`}),F(`fmt`,`ts-builder format`),F(`watch`,`ts-builder build --target block-model --watch`),F(`build`,`ts-builder build --target block-model && block-tools build-model`),F(`check`,`ts-builder check --target block-model`),L(`@platforma-sdk/model`,`sdk:`),B({"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,"@platforma-sdk/block-tools":`sdk:`,vitest:`catalog:`}),V({"@types/node":`*`,typescript:`*`}),v(y(Z),()=>{F(`test`,`vitest run --passWithNoTests`),R(`@types/node`,`*`)}),G(`dependencies`),G(`devDependencies`),G(`peerDependencies`),G(`optionalDependencies`),U([...Y])}function Fn(){_(`model`,()=>{v(y(Z),()=>b(`tsconfig.json`,w(`model/tsconfig.node.json`)),()=>b(`tsconfig.json`,w(`model/tsconfig.json`))),b(`.oxlintrc.json`,w(`model/.oxlintrc.json`)),b(`.oxfmtrc.json`,w(`model/.oxfmtrc.json`)),S(`src/index.ts`,w(`model/src/index.ts`)),x(`package.json`,T(()=>Nn(g())),()=>{Pn()})})}function In(e){return{name:`${e.blockVars.facadeName}.ui`,version:`1.0.0`,type:`module`,scripts:{fmt:`ts-builder format`,dev:`ts-builder serve --target block-ui`,watch:`ts-builder build --target block-ui --watch`,build:`ts-builder build --target block-ui`,check:`ts-builder check --target block-ui`},dependencies:{"@platforma-sdk/ui-vue":`sdk:`,vue:`catalog:`,...q(e,`model`)},devDependencies:{"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,vitest:`catalog:`},peerDependencies:{typescript:`*`}}}function Ln(){P(`type`,`module`),F(`fmt`,`ts-builder format`),F(`dev`,`ts-builder serve --target block-ui`),F(`watch`,`ts-builder build --target block-ui --watch`),F(`build`,`ts-builder build --target block-ui`),F(`check`,`ts-builder check --target block-ui`),L(`@platforma-sdk/ui-vue`,`sdk:`),L(`vue`,`catalog:`),H(`model`),B({"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,vitest:`catalog:`}),z(`vue-tsc`),V({typescript:`*`}),z(`@types/node`),v(y(Z),()=>{F(`test`,`vitest run --passWithNoTests`),R(`@types/node`,`*`)}),G(`dependencies`),G(`devDependencies`),G(`peerDependencies`),G(`optionalDependencies`),U([...Y])}function Rn(){_(`ui`,()=>{v(y(Z),()=>b(`tsconfig.json`,w(`ui/tsconfig.node.json`)),()=>b(`tsconfig.json`,w(`ui/tsconfig.json`))),b(`.oxlintrc.json`,w(`ui/.oxlintrc.json`)),b(`.oxfmtrc.json`,w(`ui/.oxfmtrc.json`)),Pe(`index.html`,w(`ui/index.html`)),S(`src/main.ts`,w(`ui/src/main.ts`)),S(`src/app.ts`,Le(`ui/src/app.tpl.ts`,()=>({modelPkg:`${E().facadeName}.model`}))),S(`src/MainPage.vue`,Le(`ui/src/MainPage.tpl.vue`,()=>({shortName:E().shortName}))),x(`package.json`,T(()=>In(g())),()=>{Ln()})})}function zn(e){return{name:`${e.blockVars.facadeName}.workflow`,version:`1.0.0`,type:`module`,scripts:{build:`shx rm -rf dist && pl-tengo build`,check:`pl-tengo check`,format:`/usr/bin/env emacs --script ./format.el || echo 'No emacs.'`},dependencies:{"@platforma-sdk/workflow-tengo":`sdk:`,...Jt(e,`software`)},devDependencies:{"@platforma-sdk/tengo-builder":`sdk:`,"@platforma-sdk/test":`sdk:`,vitest:`catalog:`,shx:`catalog:`}}}function Bn(){P(`type`,`module`),F(`build`,`shx rm -rf dist && pl-tengo build`),F(`check`,`pl-tengo check`),F(`format`,`/usr/bin/env emacs --script ./format.el || echo 'No emacs.'`),v(y(Z),()=>{F(`test`,`vitest run --passWithNoTests`)}),L(`@platforma-sdk/workflow-tengo`,`sdk:`),H(`software`),B({"@platforma-sdk/tengo-builder":`sdk:`,"@platforma-sdk/test":`sdk:`,vitest:`catalog:`,shx:`catalog:`}),G(`dependencies`),G(`devDependencies`),G(`peerDependencies`),G(`optionalDependencies`),U([...Y])}function Vn(){_(`workflow`,()=>{b(`tsconfig.json`,w(`workflow/tsconfig.json`)),b(`format.el`,w(`workflow/format.el`)),Pe(`vitest.config.mts`,w(`workflow/vitest.config.mts`)),C(`index.js`),C(`index.d.ts`),S(`src/main.tpl.tengo`,Le(`workflow/src/main.tpl.tengo`,()=>({shortName:E().shortName}))),x(`package.json`,T(()=>zn(g())),()=>{Bn()})})}function Hn(e){return{name:`${e.blockVars.facadeName}.test`,version:`1.0.0`,private:!0,type:`module`,scripts:{check:`ts-builder type-check --target block-test`,test:`vitest run --passWithNoTests`},peerDependencies:{typescript:`*`},devDependencies:{"@platforma-sdk/test":`sdk:`,"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,vitest:`catalog:`}}}function Un(){P(`type`,`module`),F(`check`,`ts-builder type-check --target block-test`),F(`test`,`vitest run --passWithNoTests`),B({"@platforma-sdk/test":`sdk:`,"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,vitest:`catalog:`}),V({typescript:`*`}),z(`@types/node`),G(`dependencies`),G(`devDependencies`),G(`peerDependencies`),G(`optionalDependencies`),U([...Y])}function Wn(){_(`test`,()=>{b(`tsconfig.json`,w(`test/tsconfig.json`)),Pe(`vitest.config.mts`,w(`test/vitest.config.mts`)),S(`src/demo.test.ts`,Ie(`import { expect, test } from "vitest";
14
14
 
15
15
  test("scaffolded block sanity check", () => {
16
16
  expect(true).toBe(true);
17
17
  });
18
- `)),x(`package.json`,T(()=>Bn(g())),()=>{Vn()})})}function Un(){return{entrypoints:{main:{binary:{artifact:{type:`python`,registry:`platforma-open`,environment:`@platforma-open/milaboratories.runenv-python-3:3.12.10`,dependencies:{toolset:`pip`,requirements:`requirements.txt`},root:`./src`},cmd:[`python`,`{pkg}/main.py`]}}}}}function Wn(e){return{name:`${e.blockVars.facadeName}.software`,version:`1.0.0`,type:`module`,description:`Block Software`,files:[`./dist/**/*`],scripts:{build:`pl-pkg build`,prepublishOnly:`pl-pkg prepublish`,changeset:`changeset`,"version-packages":`changeset version`},"block-software":Un(),devDependencies:{"@platforma-open/milaboratories.runenv-python-3":`catalog:`,"@platforma-sdk/package-builder":`sdk:`}}}function Gn(){M(`type`,`module`),M(`files`,[`./dist/**/*`]),P(`build`,`pl-pkg build`),P(`prepublishOnly`,`pl-pkg prepublish`),P(`changeset`,`changeset`),P(`version-packages`,`changeset version`),R({"@platforma-open/milaboratories.runenv-python-3":`catalog:`,"@platforma-sdk/package-builder":`sdk:`}),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),H([...Y])}var Kn=`import sys
18
+ `)),x(`package.json`,T(()=>Hn(g())),()=>{Un()})})}function Gn(){return{entrypoints:{main:{binary:{artifact:{type:`python`,registry:`platforma-open`,environment:`@platforma-open/milaboratories.runenv-python-3:3.12.10`,dependencies:{toolset:`pip`,requirements:`requirements.txt`},root:`./src`},cmd:[`python`,`{pkg}/main.py`]}}}}}function Kn(e){return{name:`${e.blockVars.facadeName}.software`,version:`1.0.0`,type:`module`,description:`Block Software`,files:[`./dist/**/*`],scripts:{build:`pl-pkg build`,prepublishOnly:`pl-pkg prepublish`,changeset:`changeset`,"version-packages":`changeset version`},"block-software":Gn(),devDependencies:{"@platforma-open/milaboratories.runenv-python-3":`catalog:`,"@platforma-sdk/package-builder":`sdk:`}}}function qn(){P(`type`,`module`),P(`files`,[`./dist/**/*`]),F(`build`,`pl-pkg build`),F(`prepublishOnly`,`pl-pkg prepublish`),F(`changeset`,`changeset`),F(`version-packages`,`changeset version`),B({"@platforma-open/milaboratories.runenv-python-3":`catalog:`,"@platforma-sdk/package-builder":`sdk:`}),G(`dependencies`),G(`devDependencies`),G(`peerDependencies`),G(`optionalDependencies`),U([...Y])}var Jn=`import sys
19
19
 
20
20
  print("Hello from Python, " + sys.argv[1] + "!")
21
- `,qn=`# No dependencies specified for this script
22
- `;function Jn(){_(`software`,()=>{S(`src/main.py`,Pe(Kn)),S(`src/requirements.txt`,Pe(qn)),x(`package.json`,T(()=>Wn(g())),()=>{Gn()})})}function Yn(){_(`model`,()=>{C(`eslint.config.mjs`),C(`vite.config.mts`)}),_(`ui`,()=>{C(`eslint.config.mjs`),C(`vite.config.ts`),C(`tsconfig.app.json`),C(`tsconfig.node.json`)}),_(`test`,()=>{C(`eslint.config.mjs`)}),_(`root`,()=>{C(`.prettierrc`),x(`package.json`,T(()=>rn(g())),()=>{lt(`pretty`),ft(`@platforma-sdk/blocks-deps-updater`)})})}function Xn(){je(()=>{_(`root`,()=>{v(({ctx:e})=>!e.isSdkInternal,()=>{x(`pnpm-workspace.yaml`,T(()=>xn(g())),()=>{for(let e of X)vt(e);for(let[e,t]of Object.entries(vn))_t(e,t);g().modules.some(e=>e.scope===`software`)&&_t(yn,bn)})})})})}var Zn=Ee(()=>{Tn(),An(),Nn(),In(),zn(),Hn(),Jn(),Yn(),Xn()});async function Qn(){return gn(X.filter(hn))}async function $n(e){let t=n.default.resolve(e.blockPath),r=e.mode===`check`,i=new de(t),a=new fe(e.templatesRoot),o=zt(Zn,i,nn({fs:i,isSdkInternal:e.isSdkInternal,updateDepsOnly:e.updateDepsOnly,dryRun:r}),{templates:a,registryLookup:e.updateDepsOnly?await Qn():void 0,rediscover:()=>nn({fs:i,isSdkInternal:e.isSdkInternal,updateDepsOnly:!1,dryRun:!0})});return{blockPath:e.blockPath,changes:o.changes}}function er(e,t){if(t.length===0)return` ${e}: up to date (0 changes)`;let n=t.map(e=>` ${e.action.padEnd(6)} ${e.primitive.padEnd(8)} ${e.path} [${e.scope}]`);return` ${e}: ${t.length} change(s)\n${n.join(`
23
- `)}`}var tr=class e extends t.Command{static description=`Check block(s) against the canonical structure (read-only). Exits non-zero if any diff would land — used as the CI gate.`;static examples=[`<%= config.bin %> <%= command.id %> ./my-block`,`<%= config.bin %> <%= command.id %> --sdk-internal etc/blocks/*`];static strict=!1;static flags={"sdk-internal":t.Flags.boolean({description:`block(s) live inside the SDK monorepo; skip root-scope rules`})};async run(){let{argv:t,flags:r}=await this.parse(e),i=t.length>0?t:[`.`],a=n.default.join(this.config.root,`src`,`structure`,`templates`),o=!1;for(let e of i){let t=await $n({blockPath:e,isSdkInternal:r[`sdk-internal`],updateDepsOnly:!1,mode:`check`,templatesRoot:a,log:e=>this.log(e)});this.log(er(e,t.changes)),t.changes.length>0&&(o=!0)}o&&this.error("Structure check failed: one or more blocks are out of date. Run `structure refresh`.",{exit:1})}},Q=[`python`],nr=class extends Error{constructor(e){super(`Missing required flag --${e} in --non-interactive mode. Supply every BlockVars flag, or drop --non-interactive to be prompted.`),this.name=`InitFlagError`}};async function $(e,t,n,r){if(e!==void 0&&e!==``)return e;if(n)throw new nr(t);return r()}async function rr(e){let t=await $(e.npmOrg,`npm-org`,e.nonInteractive,()=>(0,c.input)({message:`npm org (e.g. @platforma-open):`,default:`@platforma-open`})),n=await $(e.orgScope,`org-scope`,e.nonInteractive,()=>(0,c.input)({message:`org scope (e.g. my-org):`})),r=await $(e.shortName,`short-name`,e.nonInteractive,()=>(0,c.input)({message:`block short name (e.g. mixcr-clonotyping):`})),i;i=e.withSoftware===void 0?e.nonInteractive?!1:await(0,c.confirm)({message:`Include a software module?`,default:!1}):e.withSoftware;let a;if(i){if(a=await $(e.platform,`platform`,e.nonInteractive,()=>(0,c.select)({message:`Software platform:`,choices:Q.map(e=>({name:e,value:e}))})),!Q.includes(a))throw Error(`Unsupported --platform '${a}'. Only ${Q.join(`, `)} ${Q.length===1?`is`:`are`} supported at v1.`)}else if(e.platform)throw Error(`--platform was given but software is disabled (--no-software).`);return{facadeName:`${t}/${n}.${r}`,baseName:`${n}.${r}`,npmOrg:t,orgScope:n,shortName:r,softwarePlatform:a}}async function ir(e){let t=e.vars,n=Jt(t),r=new de(e.blockPath),i=new fe(e.templatesRoot),a=Yt({blockVars:t,modules:n,isSdkInternal:!1,version:1,dryRun:!1}),o=X.filter(hn),s;try{s=await gn(o)}catch(e){throw Error(`init requires network access to resolve SDK catalog versions from npm, but the registry lookup failed: ${e instanceof Error?e.message:String(e)}`)}return zt(Zn,r,a,{templates:i,initMode:!0,registryLookup:s}),e.log(`Initialised block '${t.facadeName}'${t.softwarePlatform?` (software: ${t.softwarePlatform})`:` (no software)`} at ${e.blockPath}`),t}var ar={"build-meta":l,"build-model":d,"list-overview-snapshots":f,"mark-stable":ee,pack:te,publish:re,"refresh-registry":ie,"restore-overview-from-snapshot":ae,"update-deps":oe,"upload-package-v1":ue,"structure:check":tr,"structure:init":class e extends t.Command{static description=`Scaffold a fresh Platforma block from the canonical structure. Missing flags are prompted unless --non-interactive.`;static examples=[`<%= config.bin %> <%= command.id %> --npm-org @platforma-open --org-scope my-org --short-name demo --no-software --non-interactive`,`<%= config.bin %> <%= command.id %> ./demo --npm-org @platforma-open --org-scope my-org --short-name demo --with-software --platform python --non-interactive`];static args={path:t.Args.string({description:`target directory (default: <short-name> under the current directory)`})};static flags={"npm-org":t.Flags.string({description:`npm org, e.g. @platforma-open`}),"org-scope":t.Flags.string({description:`org scope, e.g. my-org`}),"short-name":t.Flags.string({description:`block short name, e.g. mixcr-clonotyping`}),"with-software":t.Flags.boolean({description:`include a software module`}),"no-software":t.Flags.boolean({description:`omit the software module`}),platform:t.Flags.string({description:`software platform (single-valued)`,options:[...Q]}),"non-interactive":t.Flags.boolean({description:`error on any missing flag instead of prompting`})};async run(){let{args:t,flags:r}=await this.parse(e);r[`with-software`]&&r[`no-software`]&&this.error(`--with-software and --no-software are mutually exclusive.`);let i=r[`with-software`]?!0:r[`no-software`]?!1:void 0,a=await rr({npmOrg:r[`npm-org`],orgScope:r[`org-scope`],shortName:r[`short-name`],withSoftware:i,platform:r.platform,nonInteractive:r[`non-interactive`]});await ir({vars:a,blockPath:t.path?n.default.resolve(t.path):n.default.resolve(process.cwd(),a.shortName),templatesRoot:n.default.join(this.config.root,`src`,`structure`,`templates`),log:e=>this.log(e)})}},"structure:refresh":class e extends t.Command{static description=`Bring block(s) up to date with the canonical structure. Applies rules, writes files, bumps .structure version. Default mode is offline; --update-deps-only fires only catalog-bump rules (network).`;static examples=[`<%= config.bin %> <%= command.id %> ./my-block`,`<%= config.bin %> <%= command.id %> --sdk-internal etc/blocks/*`,`<%= config.bin %> <%= command.id %> --update-deps-only`];static strict=!1;static flags={"sdk-internal":t.Flags.boolean({description:`block(s) live inside the SDK monorepo; skip root-scope rules`}),"update-deps-only":t.Flags.boolean({description:"fire ONLY catalog-bump rules (npm network). Follow with `pnpm install` then a plain refresh."})};async run(){let{argv:t,flags:r}=await this.parse(e),i=t.length>0?t:[`.`],a=n.default.join(this.config.root,`src`,`structure`,`templates`);for(let e of i){let t=await $n({blockPath:e,isSdkInternal:r[`sdk-internal`],updateDepsOnly:r[`update-deps-only`],mode:`refresh`,templatesRoot:a,log:e=>this.log(e)});this.log(er(e,t.changes))}}}};exports.COMMANDS=ar;
21
+ `,Yn=`# No dependencies specified for this script
22
+ `;function Xn(){_(`software`,()=>{S(`src/main.py`,Ie(Jn)),S(`src/requirements.txt`,Ie(Yn)),x(`package.json`,T(()=>Kn(g())),()=>{qn()})})}function Zn(){_(`model`,()=>{C(`eslint.config.mjs`),C(`vite.config.mts`)}),_(`ui`,()=>{C(`eslint.config.mjs`),C(`vite.config.ts`),C(`tsconfig.app.json`),C(`tsconfig.node.json`)}),_(`test`,()=>{C(`eslint.config.mjs`)}),_(`root`,()=>{C(`.prettierrc`),x(`package.json`,T(()=>on(g())),()=>{ut(`pretty`),z(`@platforma-sdk/blocks-deps-updater`)})})}function Qn(){Ne(()=>{_(`root`,()=>{v(({ctx:e})=>!e.isSdkInternal,()=>{x(`pnpm-workspace.yaml`,T(()=>Cn(g())),()=>{for(let e of X)yt(e);for(let[e,t]of Object.entries(bn))vt(e,t);g().modules.some(e=>e.scope===`software`)&&vt(xn,Sn)})})})})}var $n=Ee(()=>{Dn(),Mn(),Fn(),Rn(),Vn(),Wn(),Xn(),Zn(),Qn()});async function er(){return vn(X.filter(_n))}async function tr(e){let t=n.default.resolve(e.blockPath),r=e.mode===`check`,i=new de(t),a=new fe(e.templatesRoot),o=Bt($n,i,an({fs:i,isSdkInternal:e.isSdkInternal,updateDepsOnly:e.updateDepsOnly,dryRun:r}),{templates:a,registryLookup:e.updateDepsOnly?await er():void 0,rediscover:()=>an({fs:i,isSdkInternal:e.isSdkInternal,updateDepsOnly:!1,dryRun:!0})});return{blockPath:e.blockPath,changes:o.changes}}function nr(e,t){if(t.length===0)return` ${e}: up to date (0 changes)`;let n=t.map(e=>` ${e.action.padEnd(6)} ${e.primitive.padEnd(8)} ${e.path} [${e.scope}]`);return` ${e}: ${t.length} change(s)\n${n.join(`
23
+ `)}`}var rr=class e extends t.Command{static description=`Check block(s) against the canonical structure (read-only). Exits non-zero if any diff would land — used as the CI gate.`;static examples=[`<%= config.bin %> <%= command.id %> ./my-block`,`<%= config.bin %> <%= command.id %> --sdk-internal etc/blocks/*`];static strict=!1;static flags={"sdk-internal":t.Flags.boolean({description:`block(s) live inside the SDK monorepo; skip root-scope rules`})};async run(){let{argv:t,flags:r}=await this.parse(e),i=t.length>0?t:[`.`],a=n.default.join(this.config.root,`src`,`structure`,`templates`),o=!1;for(let e of i){let t=await tr({blockPath:e,isSdkInternal:r[`sdk-internal`],updateDepsOnly:!1,mode:`check`,templatesRoot:a,log:e=>this.log(e)});this.log(nr(e,t.changes)),t.changes.length>0&&(o=!0)}o&&this.error("Structure check failed: one or more blocks are out of date. Run `structure refresh`.",{exit:1})}},Q=[`python`],ir=class extends Error{constructor(e){super(`Missing required flag --${e} in --non-interactive mode. Supply every BlockVars flag, or drop --non-interactive to be prompted.`),this.name=`InitFlagError`}};async function $(e,t,n,r){if(e!==void 0&&e!==``)return e;if(n)throw new ir(t);return r()}async function ar(e){let t=await $(e.npmOrg,`npm-org`,e.nonInteractive,()=>(0,c.input)({message:`npm org (e.g. @platforma-open):`,default:`@platforma-open`})),n=await $(e.orgScope,`org-scope`,e.nonInteractive,()=>(0,c.input)({message:`org scope (e.g. my-org):`})),r=await $(e.shortName,`short-name`,e.nonInteractive,()=>(0,c.input)({message:`block short name (e.g. mixcr-clonotyping):`})),i;i=e.withSoftware===void 0?e.nonInteractive?!1:await(0,c.confirm)({message:`Include a software module?`,default:!1}):e.withSoftware;let a;if(i){if(a=await $(e.platform,`platform`,e.nonInteractive,()=>(0,c.select)({message:`Software platform:`,choices:Q.map(e=>({name:e,value:e}))})),!Q.includes(a))throw Error(`Unsupported --platform '${a}'. Only ${Q.join(`, `)} ${Q.length===1?`is`:`are`} supported at v1.`)}else if(e.platform)throw Error(`--platform was given but software is disabled (--no-software).`);return{facadeName:`${t}/${n}.${r}`,baseName:`${n}.${r}`,npmOrg:t,orgScope:n,shortName:r,softwarePlatform:a}}async function or(e){let t=e.vars,n=Yt(t),r=new de(e.blockPath),i=new fe(e.templatesRoot),a=Xt({blockVars:t,modules:n,isSdkInternal:!1,version:1,dryRun:!1}),o=X.filter(_n),s;try{s=await vn(o)}catch(e){throw Error(`init requires network access to resolve SDK catalog versions from npm, but the registry lookup failed: ${e instanceof Error?e.message:String(e)}`)}return Bt($n,r,a,{templates:i,initMode:!0,registryLookup:s}),e.log(`Initialised block '${t.facadeName}'${t.softwarePlatform?` (software: ${t.softwarePlatform})`:` (no software)`} at ${e.blockPath}`),t}var sr={"build-meta":l,"build-model":d,"list-overview-snapshots":f,"mark-stable":ee,pack:te,publish:re,"refresh-registry":ie,"restore-overview-from-snapshot":ae,"update-deps":oe,"upload-package-v1":ue,"structure:check":rr,"structure:init":class e extends t.Command{static description=`Scaffold a fresh Platforma block from the canonical structure. Missing flags are prompted unless --non-interactive.`;static examples=[`<%= config.bin %> <%= command.id %> --npm-org @platforma-open --org-scope my-org --short-name demo --no-software --non-interactive`,`<%= config.bin %> <%= command.id %> ./demo --npm-org @platforma-open --org-scope my-org --short-name demo --with-software --platform python --non-interactive`];static args={path:t.Args.string({description:`target directory (default: <short-name> under the current directory)`})};static flags={"npm-org":t.Flags.string({description:`npm org, e.g. @platforma-open`}),"org-scope":t.Flags.string({description:`org scope, e.g. my-org`}),"short-name":t.Flags.string({description:`block short name, e.g. mixcr-clonotyping`}),"with-software":t.Flags.boolean({description:`include a software module`}),"no-software":t.Flags.boolean({description:`omit the software module`}),platform:t.Flags.string({description:`software platform (single-valued)`,options:[...Q]}),"non-interactive":t.Flags.boolean({description:`error on any missing flag instead of prompting`})};async run(){let{args:t,flags:r}=await this.parse(e);r[`with-software`]&&r[`no-software`]&&this.error(`--with-software and --no-software are mutually exclusive.`);let i=r[`with-software`]?!0:r[`no-software`]?!1:void 0,a=await ar({npmOrg:r[`npm-org`],orgScope:r[`org-scope`],shortName:r[`short-name`],withSoftware:i,platform:r.platform,nonInteractive:r[`non-interactive`]});await or({vars:a,blockPath:t.path?n.default.resolve(t.path):n.default.resolve(process.cwd(),a.shortName),templatesRoot:n.default.join(this.config.root,`src`,`structure`,`templates`),log:e=>this.log(e)})}},"structure:refresh":class e extends t.Command{static description=`Bring block(s) up to date with the canonical structure. Applies rules, writes files, bumps .structure version. Default mode is offline; --update-deps-only fires only catalog-bump rules (network).`;static examples=[`<%= config.bin %> <%= command.id %> ./my-block`,`<%= config.bin %> <%= command.id %> --sdk-internal etc/blocks/*`,`<%= config.bin %> <%= command.id %> --update-deps-only`];static strict=!1;static flags={"sdk-internal":t.Flags.boolean({description:`block(s) live inside the SDK monorepo; skip root-scope rules`}),"update-deps-only":t.Flags.boolean({description:"fire ONLY catalog-bump rules (npm network). Follow with `pnpm install` then a plain refresh."})};async run(){let{argv:t,flags:r}=await this.parse(e),i=t.length>0?t:[`.`],a=n.default.join(this.config.root,`src`,`structure`,`templates`);for(let e of i){let t=await tr({blockPath:e,isSdkInternal:r[`sdk-internal`],updateDepsOnly:r[`update-deps-only`],mode:`refresh`,templatesRoot:a,log:e=>this.log(e)});this.log(nr(e,t.changes))}}}};exports.COMMANDS=sr;
24
24
  //# sourceMappingURL=cli.js.map