@platforma-sdk/block-tools 2.11.2 → 2.11.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/bin/run.js +9 -5
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.js +13 -13
  4. package/dist/cli.js.map +1 -1
  5. package/dist/cli.mjs +845 -981
  6. package/dist/cli.mjs.map +1 -1
  7. package/dist/cmd/build-meta.d.ts +2 -9
  8. package/dist/cmd/build-model.d.ts +2 -10
  9. package/dist/cmd/list-overview-snapshots.d.ts +2 -9
  10. package/dist/cmd/mark-stable.d.ts +2 -13
  11. package/dist/cmd/pack.d.ts +2 -9
  12. package/dist/cmd/publish.d.ts +2 -12
  13. package/dist/cmd/refresh-registry.d.ts +2 -9
  14. package/dist/cmd/restore-overview-from-snapshot.d.ts +2 -10
  15. package/dist/cmd/structure/check.d.ts +2 -10
  16. package/dist/cmd/structure/init.d.ts +2 -18
  17. package/dist/cmd/structure/refresh.d.ts +10 -11
  18. package/dist/cmd/update-deps.d.ts +2 -6
  19. package/dist/cmd/upload-package-v1.d.ts +2 -14
  20. package/dist/config-BmJWc8sR.js +3 -0
  21. package/dist/config-BmJWc8sR.js.map +1 -0
  22. package/dist/{config-DpfTzcgG.mjs → config-CiC347sB.mjs} +453 -398
  23. package/dist/config-CiC347sB.mjs.map +1 -0
  24. package/dist/index.js +1 -1
  25. package/dist/index.mjs +15 -15
  26. package/dist/registry_v1/config_schema.d.ts +7 -7
  27. package/dist/registry_v1/flags.d.ts +2 -4
  28. package/dist/structure/cli/run-structure.d.ts +1 -1
  29. package/dist/structure/engine/discovery.d.ts +2 -3
  30. package/dist/structure/rules/block-package-json.d.ts +3 -3
  31. package/dist/structure/rules/shared/pascal-case.d.ts +1 -0
  32. package/dist/v2/index.d.ts +1 -0
  33. package/dist/v2/model/block_components.d.ts +11 -0
  34. package/dist/v2/model/block_meta.d.ts +7 -0
  35. package/dist/v2/resolve_to_registry.d.ts +37 -0
  36. package/dist/v2/source_package.d.ts +12 -0
  37. package/package.json +9 -24
  38. package/src/cli.test.ts +56 -0
  39. package/src/cli.ts +50 -0
  40. package/src/cmd/build-meta.ts +11 -22
  41. package/src/cmd/build-model.ts +16 -33
  42. package/src/cmd/list-overview-snapshots.ts +24 -28
  43. package/src/cmd/mark-stable.ts +35 -55
  44. package/src/cmd/pack.ts +11 -22
  45. package/src/cmd/publish.test.ts +35 -0
  46. package/src/cmd/publish.ts +55 -49
  47. package/src/cmd/refresh-registry.ts +22 -26
  48. package/src/cmd/restore-overview-from-snapshot.ts +24 -34
  49. package/src/cmd/structure/check.ts +19 -28
  50. package/src/cmd/structure/init.ts +40 -47
  51. package/src/cmd/structure/refresh.ts +45 -36
  52. package/src/cmd/update-deps.ts +22 -12
  53. package/src/cmd/upload-package-v1.ts +42 -60
  54. package/src/registry_v1/flags.ts +7 -7
  55. package/src/structure/__tests__/discovery-shortname.test.ts +3 -0
  56. package/src/structure/__tests__/facade-end-state.test.ts +195 -0
  57. package/src/structure/__tests__/model-package-json.snapshot.test.ts +1 -1
  58. package/src/structure/cli/run-structure.ts +2 -2
  59. package/src/structure/engine/__tests__/discovery.test.ts +22 -26
  60. package/src/structure/engine/discovery.ts +12 -30
  61. package/src/structure/rules/block-package-json.ts +146 -64
  62. package/src/structure/rules/block.ts +40 -5
  63. package/src/structure/rules/model-package-json.ts +6 -1
  64. package/src/structure/rules/shared/pascal-case.ts +16 -0
  65. package/src/structure/rules/software-package-json.ts +6 -1
  66. package/src/structure/rules/test-package-json.ts +5 -1
  67. package/src/structure/rules/ui-package-json.ts +5 -1
  68. package/src/structure/rules/workflow-package-json.ts +5 -1
  69. package/src/structure/templates/static/block/src/AGENTS.ts +5 -0
  70. package/src/structure/templates/static/block/src/agents-extra.ts +8 -0
  71. package/src/structure/templates/static/block/src/block-extra.ts +9 -0
  72. package/src/structure/templates/static/block/tsconfig.json +4 -0
  73. package/src/structure/templates/text/block/src/index.tpl.ts +55 -0
  74. package/src/v2/from_pack_v2.test.ts +142 -0
  75. package/src/v2/index.ts +1 -0
  76. package/src/v2/model/block_components.ts +33 -0
  77. package/src/v2/model/block_meta.ts +18 -0
  78. package/src/v2/model/content_conversion.ts +0 -1
  79. package/src/v2/resolve_to_registry.ts +84 -0
  80. package/src/v2/source_package.ts +34 -1
  81. package/bin/dev.cmd +0 -3
  82. package/bin/dev.js +0 -6
  83. package/dist/cmd/index.d.ts +0 -28
  84. package/dist/config-DpfTzcgG.mjs.map +0 -1
  85. package/dist/config-xxVy3IQR.js +0 -3
  86. package/dist/config-xxVy3IQR.js.map +0 -1
  87. package/src/cmd/index.ts +0 -31
  88. package/src/structure/templates/static/block/index.d.ts +0 -6
  89. package/src/structure/templates/static/block/index.js +0 -8
package/bin/run.js CHANGED
@@ -1,7 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // eslint-disable-next-line unicorn/prefer-top-level-await
4
- (async () => {
5
- const oclif = await import("@oclif/core");
6
- await oclif.execute({ dir: __dirname });
7
- })();
3
+ const path = require("node:path");
4
+ const { run } = require("../dist/cli.js");
5
+
6
+ const packageRoot = path.resolve(__dirname, "..");
7
+
8
+ run(process.argv, packageRoot).catch((error) => {
9
+ console.error(`error: ${error?.message ?? error}`);
10
+ process.exitCode = 1;
11
+ });
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function buildProgram(packageRoot?: string): Command;
3
+ export declare function run(argv: string[], packageRoot: string): Promise<void>;
package/dist/cli.js CHANGED
@@ -1,24 +1,24 @@
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))}},ee=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(``)}}},f=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 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 g(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 _(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 v(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 y(e,t){h(`fixed`,{kind:`fixed`,path:e,content:t})}function b(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 x(e,t){h(`seed`,{kind:`seed`,path:e,initial:t})}function S(e){h(`remove`,{kind:`remove`,path:e})}function C(e){return{kind:`file`,path:e}}function Fe(e){return{kind:`binary`,path:e}}function Ie(e){return{kind:`text`,value:e}}function w(e,t){return{kind:`tpl`,path:e,vars:t}}function T(e){return{kind:`generate`,fn:e}}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(`,
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./config-BmJWc8sR.js`);let t=require(`commander`),n=require(`node:path`);n=e.Tt(n);let r=require(`node:fs`);r=e.Tt(r);let i=require(`@milaboratories/pl-model-middle-layer`),a=require(`@milaboratories/ts-helpers`),o=require(`yaml`);o=e.Tt(o);let s=require(`node:timers/promises`),c=require(`@inquirer/prompts`);function l(){let i=new t.Command(`build-meta`).description(`Extracts meta information from blocks package.json and outputs meta.json with embedded binary and textual information linked from the meta section.`);return i.option(`-i, --modulePath <path>`,`input module path`,`.`),i.requiredOption(`-o, --destination <path>`,`output meta.json file`),i.action(async t=>{let i=n.default.resolve(t.modulePath),a=await e.st(await e.ut((await e.Y(i)).meta,i));await r.default.promises.writeFile(n.default.resolve(t.destination),JSON.stringify(a))}),i}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}}function d(){let e=new t.Command(`build-model`).description(`Extracts and outputs block model JSON from pre-built block model module`);return e.option(`-i, --modulePath <path>`,`input module path`,`.`),e.option(`-b, --sourceBundle <path>`,`bundled model code to embed into the model for callback-based rendering to work`,`./dist/bundle.js`),e.option(`-o, --destination <path>`,`output model file`,`./dist/model.json`),e.action(async e=>{let t=n.default.resolve(e.modulePath),{model:i,platforma:a}=require(t);if(i||=a,!i)throw Error(`"model" export not found`);let{config:o}=i;if(!o)throw Error(`Malformed "model" object, check it is created with "BlockModel" and ".done()" is executed as the call in the chain.`);if(!(`outputs`in o)||!(`sections`in o))throw Error(`"config" has unexpected structure`);let s=await u(e.sourceBundle);s!==void 0&&(o.code={type:`plain`,content:s}),await r.default.promises.writeFile(n.default.resolve(e.destination),JSON.stringify(o))}),e}function ee(){let r=new t.Command(`pack`).description(`Builds block pack and outputs a block pack manifest consolidating all references assets into a single folder`);return r.option(`-i, --modulePath <path>`,`input module path`,`.`),r.option(`-o, --destinationPath <path>`,`output folder`,`./block-pack`),r.action(async t=>{await e.Q(await e.q(n.default.resolve(t.modulePath)),n.default.resolve(t.destinationPath))}),r}function f(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]=f(n[e],t[e]):n[e]=t[e];return n}function te(){let o=new t.Command(`publish`).description(`Publishes the block package and refreshes the registry (for v2 block-pack schema)`);return o.addOption(new t.Option(`-r, --registry <address>`,`full address of the registry`).env(`PL_REGISTRY`).makeOptionMandatory()),o.addOption(new t.Option(`--registry-serve-url <url>`,`CDN serve URL written into block-pack/published.json (npm-consumed blocks)`).env(`PL_REGISTRY_SERVE_URL`).makeOptionMandatory()),o.option(`-m, --manifest <path>`,`manifest file path`,`./block-pack/${e.O}`),o.option(`-v, --version-override <path>`,`override package version`),o.addOption(new t.Option(`--refresh`,`refresh repository after adding the package`).default(!0).env(`PL_REGISTRY_REFRESH`)),o.option(`--no-refresh`,`do not refresh repository after adding the package`),o.addOption(new t.Option(`--unstable`,`do not add the published package to stable channel`).default(!1).env(`PL_PUBLISH_UNSTABLE`)),o.action(async t=>{let o=new a.ConsoleLoggerAdapter,s=n.default.resolve(t.manifest),c=JSON.parse(await r.default.promises.readFile(s,{encoding:`utf-8`})),l=i.BlockPackManifest.parse(c);l=f(c,l);let u=n.default.dirname(s);o.info(`Manifest root = ${u}`),t.versionOverride&&(l=(0,i.overrideManifestVersion)(l,t.versionOverride));let d=new e.b(e._(t.registry),o);await d.publishPackage(l,async e=>Buffer.from(await r.default.promises.readFile(n.default.resolve(u,e)))),t.unstable||(o.info(`Adding package to ${i.StableChannel} channel...`),await d.addPackageToChannel(l.description.id,i.StableChannel)),await e.W(u,e.H({registryUrl:t.registryServeUrl,id:l.description.id})),o.info(`Wrote published coordinates to ${n.default.resolve(u,`published.json`)}`),t.refresh&&await d.updateIfNeeded()}),o}function ne(){let n=new t.Command(`refresh-registry`).description(`Refresh overview files based on published but not proecessed artefacts`);return n.addOption(new t.Option(`-r, --registry <address>`,`full address of the registry`).env(`PL_REGISTRY`).makeOptionMandatory()),n.addOption(new t.Option(`-m, --mode <mode>`,`refresh mode (allowed valiues: "force", "normal", "dry-run")`).choices([`force`,`normal`,`dry-run`]).env(`PL_REGISTRY_REFRESH_DRY_RUN`).default(`normal`)),n.action(async t=>{await new e.b(e._(t.registry),new a.ConsoleLoggerAdapter).updateIfNeeded(t.mode)}),n}function re(){let r=new t.Command(`mark-stable`).description(`Mark target block stable`);return r.option(`-i, --modulePath <path>`,`input module path`,`.`),r.addOption(new t.Option(`-c, --channel <channel name>`,`custom channel`).default(i.StableChannel).hideHelp()),r.option(`-v, --version-override <path>`,`override package version`),r.addOption(new t.Option(`-r, --registry <address>`,`full address of the registry`).env(`PL_REGISTRY`).makeOptionMandatory()),r.addOption(new t.Option(`--refresh`,`refresh repository after adding the package`).default(!0).env(`PL_REGISTRY_REFRESH`)),r.option(`--no-refresh`,`do not refresh repository after adding the package`),r.option(`--unmark`,`reverses meaning of this command, flag can be used to remove "stable" flag from the package`,!1),r.action(async t=>{let r=await e.Y(n.default.resolve(t.modulePath));t.versionOverride&&(r=(0,i.overrideDescriptionVersion)(r,t.versionOverride));let o=new e.b(e._(t.registry),new a.ConsoleLoggerAdapter);t.unmark?await o.removePackageFromChannel(r.id,t.channel):await o.addPackageToChannel(r.id,t.channel),t.refresh&&await o.updateIfNeeded()}),r}var ie=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})}},ae=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 oe(e,t){return e.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g,(e,n)=>t[n]??`\${${n}}`)}var se=[`default`,`init`];function ce(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 le(e,t){return e.filter(e=>e.scope===t).slice().sort((e,t)=>e.path.localeCompare(t.path))}function ue(e,t){let n=[];function r(e,i,a,o,s){if(e.kind===`scope`){let n=le(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 '${fe(e)}' is not inside a scope() frame`);if(e.kind===`rename`){n.push({leaf:e,scope:i,modulePath:a,resolvedPath:ce(a,e.from),resolvedTo:ce(a,e.to),triggers:o,modes:s});return}n.push({leaf:e,scope:i,modulePath:a,resolvedPath:ce(a,de(e)),triggers:o,modes:s})}for(let t of e.children)r(t,void 0,void 0,[],se);return n}function de(e){switch(e.kind){case`fixed`:case`managed`:case`scaffold`:case`seed`:case`remove`:return e.path;case`rename`:return e.from}}function fe(e){return e.kind===`rename`?`rename ${e.from} -> ${e.to}`:`${e.kind} ${e.path}`}var pe=/[.+^${}()|[\]\\]/g;function me(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(pe,`\\$&`)}return RegExp(`^${t}$`)}function he(e,t){return me(e).test(t)}var p,m;function h(e){if(!p)throw Error(`${e}() called outside defineStructure(). Builders must run inside the lambda passed to defineStructure(...).`);return p}function g(e,t){let n=h(e);n.stack[n.stack.length-1].push(t)}function ge(e,t){let n=m;m=e;try{return t()}finally{m=n}}function _e(){return m}function ve(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 ye(r),r}finally{p=void 0}}function ye(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=h(`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 be;function xe(e){be=e}function v(e,t,n){Se(e,t),n&&Se(t=>!e(t),n)}function Se(e,t){if(p){Ce(e,t);return}if(!(be?.(e,t)??!1))throw Error(`when() called outside defineStructure() and outside any managed(...) body. Place this call inside one of the two.`)}function Ce(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 we(e,t,n){let r=h(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 Te(e){we(`onInitOrUpdate`,[`init`,`updateDeps`],e)}function b(e,t){g(`fixed`,{kind:`fixed`,path:e,content:t})}function x(e,t,n){g(`managed`,{kind:`managed`,path:e,initial:t,body:n})}function S(e,t){g(`scaffold`,{kind:`scaffold`,path:e,initial:t})}function C(e,t){g(`seed`,{kind:`seed`,path:e,initial:t})}function w(e){g(`remove`,{kind:`remove`,path:e})}function T(e){return{kind:`file`,path:e}}function Ee(e){return{kind:`binary`,path:e}}function De(e){return{kind:`text`,value:e}}function E(e,t){return{kind:`tpl`,path:e,vars:t}}function D(e){return{kind:`generate`,fn:e}}function Oe(e){return JSON.parse(e)}var ke=100,Ae=2;function je(e){return e.length===0?`[]`:`[`+e.map(Me).join(`, `)+`]`}function Me(e){if(Array.isArray(e))return je(e);if(k(e)){let t=Object.entries(e);return t.length===0?`{}`:`{ `+t.map(([e,t])=>`${JSON.stringify(e)}: ${Me(t)}`).join(`, `)+` }`}return JSON.stringify(e)}function Ne(e,t,n,r){let i=t+Ae,a=` `.repeat(i);if(Array.isArray(e)){let o=je(e);if(n+o.length+r<=ke)return o;let s=e.length-1;return`[
2
+ `+e.map((e,t)=>a+Ne(e,i,i,t===s?0:1)).join(`,
4
3
  `)+`
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(`,
4
+ `+` `.repeat(t)+`]`}if(k(e)){let n=Object.entries(e);if(n.length===0)return`{}`;let r=n.length-1;return`{
5
+ `+n.map(([e,t],n)=>{let o=`${a}${JSON.stringify(e)}: `;return o+Ne(t,i,o.length,n===r?0:1)}).join(`,
7
6
  `)+`
8
- `+` `.repeat(t)+`}`}return JSON.stringify(e)}function Ue(e,t){return t?.collapse?He(JSON.parse(JSON.stringify(e??null)),0,0,0)+`
7
+ `+` `.repeat(t)+`}`}return JSON.stringify(e)}function Pe(e,t){return t?.collapse?Ne(JSON.parse(JSON.stringify(e??null)),0,0,0)+`
9
8
  `: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(`
11
- `);return t.length>0&&t[t.length-1]===``&&t.pop(),t}function Xe(e){return e.join(`
9
+ `}function O(e){return e===``||e===void 0?[]:e.split(`.`)}function k(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Fe(e,t){let n=O(t),r=e;for(let e of n){if(!k(r))return;r=r[e]}return r}function Ie(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 Le(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 Re(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 ze(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 Be(e){let t=e.split(`
10
+ `);return t.length>0&&t[t.length-1]===``&&t.pop(),t}function Ve(e){return e.join(`
12
11
  `)+`
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(M(e))for(let n of tt){let r=e[n];if(M(r))for(let e of Object.keys(r))r[e]===`sdk:`&&(r[e]=t?`workspace:*`:`catalog:`)}}var O;function k(e){if(!O)throw Error(`${e}() only valid inside a managed(...) body. Move this call inside managed(path, initial, () => {...}).`);return O}function A(e){let t=k(e);if(t.kind!==`json`)throw Error(`${e}() requires a JSON-managed body; got '${t.kind}'.`);return t}function j(e){let t=k(e);if(t.kind!==`yaml`)throw Error(`${e}() requires a YAML-managed body; got '${t.kind}'.`);return t}function rt(e){let t=k(e);if(t.kind!==`lines`)throw Error(`${e}() requires a lines-managed body; got '${t.kind}'.`);return t}function it(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 M(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function at(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(n.ctx??n.triggerContext?.ctx),e}finally{O=void 0}}function ot(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,getDerivedDependencyPin:n.getDerivedDependencyPin};try{return t(n.ctx??n.triggerContext?.ctx),e}finally{O=void 0}}function st(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(n.ctx??n.triggerContext?.ctx),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 N(e,t){Ke(A(`ensureField`).obj,e,t)}function ct(e,t){let n=A(`removeField`).obj;Ge(n,e)&&(t&&!t(We(n,e))||qe(n,e))}function P(e,t){N(`scripts.${e}`,t)}function F(e){ct(`scripts.${e}`)}var lt=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`];function I(e,t,n,r){let i=A(e),a=i.obj,o=n===`sdk:`?et(n,it(i,e).isSdkInternal):n;for(let e of lt){if(e===r)continue;let n=a[e];M(n)&&t in n&&delete n[t]}let s=a[r],c=M(s)?s:{};c[t]=o,M(s)||(a[r]=c)}function L(e,t){I(`ensureDep`,e,t,`dependencies`)}function R(e,t){I(`ensureDevDep`,e,t,`devDependencies`)}function ut(e,t){I(`ensurePeerDep`,e,t,`peerDependencies`)}function z(e){let t=A(`removeDep`).obj;for(let n of lt){let r=t[n];M(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))ut(t,n)}function dt(e,t,n){let r=it(A(e),e);for(let i of r.modules)i.scope===t&&I(e,i.name,`workspace:*`,n)}function H(e){dt(`ensureWorkspaceScopeDeps`,e,`dependencies`)}function ft(e){let t=A(`pruneKeysMatching`).obj;for(let n of Object.keys(t))e(n,t[n])&&delete t[n]}function pt(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){pt(A(`enforceFieldOrder`).obj,e)}function mt(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&&M(e[i])&&mt(e[i],!0)}function W(e=``,t={}){let n=t.recursive??!1;if(e===``&&!n)return;let r=A(`enforceAlphabeticalOrder`).obj;if(e===``){mt(r,!0);return}let i=We(r,e);M(i)&&mt(i,n)}function ht(){let e=j(`ensureWorkspaceModulePaths`),t=it(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=j(`ensureCatalogVersion`);gt(n,e)===void 0&&n.doc.setIn([`catalog`,e],t)}function vt(e){let t=j(`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,t){let n=j(`pinCatalogToDependencyOf`);if(!n.getDerivedDependencyPin)return;let r=n.getDerivedDependencyPin(e);r!==void 0&&gt(n,e)!==r&&n.doc.setIn([`catalog`,e],r)}function bt(e){let t=j(`ensureCatalogAbsent`);t.doc.hasIn([`catalog`,e])&&t.doc.deleteIn([`catalog`,e])}function xt(e){let t=rt(`ensureGitignoreEntries`);for(let n of e)$e(t.lines,n)||t.lines.push(n)}function St(e){return(0,o.parseDocument)(e)}function Ct(e){return e.toString()}var wt=`.structure`;function Tt(e,t=0){if(e<t)throw new Et(e,t)}var Et=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 Dt(e,t=1){let n={version:t};e.write(wt,JSON.stringify(n))}var Ot=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 kt(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(r):e.vars);case`generate`:{let n=e.fn(r);if(t.endsWith(`.json`))return nt(n,r.isSdkInternal),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 At(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,kt(n,t,r,i))}function jt(e,t,n,r,i,a){let o=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 at(i,n,{triggerContext:r}),Ue(i,{collapse:o!==`package.json`})}if(e.endsWith(`.yaml`)||e.endsWith(`.yml`)){let e=St(t);return ot(e,n,{triggerContext:r,getLatestVersion:i,getDerivedDependencyPin:a}),Ct(e)}if(o===`.gitignore`||o.endsWith(`.gitignore`)){let e=Ye(t);return st(e,n,{triggerContext:r}),Xe(e)}throw Error(`managed('${e}'): unsupported file kind. Only .json, .yaml, .yml, .gitignore are dispatched.`)}function Mt(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 Nt(e,t){let n=t===``?t:t.endsWith(`/`)?t.slice(0,-1):t;return e.has(n)}function Pt(e,t,n){return{ctx:t,version:t.version,pathExists:t=>Nt(e,t),pathMissing:t=>!Nt(e,t),filesMatch:t=>{let r=n?`${n}/${t}`:t;for(let t of e)if(Se(r,t))return!0;return!1}}}function Ft(e,t){for(let n of e.triggers)if(!n(t))return!1;return!0}function It(e,t){return t?`init`:e.updateDepsOnly?`updateDeps`:`default`}function Lt(e,t){return e.filter(e=>e.modes.includes(t))}function Rt(e,t,n,r,i,a){let o=e.leaf;if(o.kind===`fixed`){let i=kt(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||At(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||At(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 zt(e,t,n,r,i,a,o,s){if(e.leaf.kind!==`managed`)return;let c=e.leaf,l=e.resolvedPath,u=t.exists(l),d,ee=!1;u?d=t.read(l):(d=kt(c.initial,l,i,s),ee=!0);let f=jt(l,d,c.body,r,a,o);if(ee)return n||t.write(l,f),{scope:e.scope,path:l,primitive:`managed`,action:`create`};if(f!==d)return n||t.write(l,f),{scope:e.scope,path:l,primitive:`managed`,action:`update`}}function Bt(e,t,n,r,i,a,o,s){let c=Lt(e,It(n,a)),l=[],u=Mt(t);for(let e of c){if(e.leaf.kind===`managed`||!Ft(e,Pt(u,n,e.modulePath)))continue;let o=Rt(e,t,r,i,a,n);o&&l.push(o)}let d=Mt(t);for(let e of c){if(e.leaf.kind!==`managed`)continue;let a=Pt(d,n,e.modulePath);if(!Ft(e,a))continue;let c=zt(e,t,r,a,i,o,s,n);c&&l.push(c)}return l}function Vt(e,t,n,r={}){return we(n,()=>{let i=_e(e,n),a=!!r.initMode,o=Bt(i,t,n,n.dryRun,r.templates,a,r.registryLookup,r.derivedPinLookup);if(!n.dryRun&&!n.updateDepsOnly&&!a){Dt(t);let i={...r.rediscover?r.rediscover(t):n,dryRun:!0},a=Bt(_e(e,i),t,i,!0,r.templates,!1,r.registryLookup,r.derivedPinLookup).filter(e=>e.path!==wt);if(a.length>0)throw new Ot(a[0])}return a&&!n.dryRun&&Dt(t),{changes:o}})}var Ht=[`root`,`block`,`model`,`ui`,`workflow`,`test`,`software`],Ut=class extends Error{constructor(e,t){super(e),this.path=t,this.name=`DiscoveryError`}};function Wt(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 Gt(e){return e===``||e===`.`}function Kt(e,t){let n=e.pkg[`block-scope`];if(typeof n==`string`){if(!Ht.includes(n))throw new Ut(`package.json "block-scope" must be one of ${Ht.join(`, `)}, got '${n}'`,e.path);return n}if(Gt(e.path))return`root`;let r=Wt(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 qt(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=Kt(r,t);if(!e)throw new Ut(`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:Gt(r.path)?``:r.path})}return n}function G(e,t){return e.modules.filter(e=>e.scope===t)}function Jt(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{[Jt(e,t).name]:`workspace:*`}}function Yt(e,t){let n={};for(let r of G(e,t))n[r.name]=`workspace:*`;return n}function Xt(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 Zt(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 Qt(e,t){return e===``?t:`${e}/${t}`}function $t(e,t){try{return JSON.parse(e.read(t))}catch{return}}function en(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 tn(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=en(t);(n===``||e.exists(n))&&i.add(n)}let a=[];for(let t of i){let n=$t(e,Qt(t,`package.json`));n&&a.push({path:t,pkg:n})}return a}function nn(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=Qt(i,s.name),c=$t(e,Qt(o,`package.json`));c&&t.push({path:o,pkg:c}),a<2&&r(o,a+1)}}return r(``,1),t}function rn(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 an(e){try{let t=JSON.parse(e.read(wt));return typeof t.version==`number`?t.version:0}catch{return 0}}function on(e){let{fs:t,isSdkInternal:n}=e,r=n?nn(t):tn(t);if(r.length===0)throw new q(`No workspace packages found. Run 'block-tools structure init' to scaffold a block.`);let i=qt(r),a=an(t);Tt(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=rn(o.name.replace(/\.block$/,``));return Zt({isSdkInternal:n,updateDepsOnly:e.updateDepsOnly??!1,modules:i,blockVars:s,version:a,dryRun:e.dryRun??!1})}var J=[`name`,`version`,`private`,`description`,`keywords`,`files`,`type`,`main`,`module`,`types`,`exports`,`scripts`,`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`,`packageManager`,`pnpm`,`block`,`block-software`];function sn(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`,"upgrade-sdk":`block-tools structure refresh --update-deps-only && pnpm i && block-tools structure refresh && pnpm i && 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 cn(){N(`packageManager`,`pnpm@9.12.0`),ct(`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`),F(`update`),P(`upgrade-sdk`,`block-tools structure refresh --update-deps-only && pnpm i && block-tools structure refresh && pnpm i && pnpm fmt`),B({"@changesets/cli":`catalog:`,"@milaboratories/ts-builder":`sdk:`,"@platforma-sdk/block-tools":`sdk:`,shx:`catalog:`,turbo:`catalog:`}),V({oxlint:`*`,oxfmt:`*`}),ft((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`),U([...J])}var ln=2,un=500,dn=3e4;function fn(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 pn(e){for(let t=1;;t++){let n;try{n=await fetch(e,{signal:AbortSignal.timeout(dn)})}catch(e){if(t>ln)throw e;await(0,s.setTimeout)(un*2**(t-1)*(.8+.4*Math.random()));continue}if(n.ok)return n;if(!(n.status===429||n.status>=500)||t>ln)throw Error(`registry returned HTTP ${n.status}`);let r=fn(n.headers.get(`retry-after`));if(r!=null){await(0,s.setTimeout)(r);continue}await(0,s.setTimeout)(un*2**(t-1)*(.8+.4*Math.random()))}}function mn(){return{async getLatestVersion(e){let t=(await(await pn(`https://registry.npmjs.org/-/package/${e}/dist-tags`)).json()).latest;if(!t)throw Error(`no 'latest' dist-tag in registry response`);return t},async getDeclaredDependency(e,t,n){let r=await(await pn(`https://registry.npmjs.org/${e}/${t}`)).json();return r.dependencies?.[n]??r.peerDependencies?.[n]}}}async function hn(e,t){let n=await Promise.all(t.map(async t=>[t,await e.getLatestVersion(t)]));return new Map(n)}function gn(e){return t=>e.get(t)}var _n=[/^@platforma-sdk\//,/^@milaboratories\//];function vn(e){return _n.some(t=>t.test(e))}async function yn(e,t=mn()){return e.length===0?()=>void 0:gn(await hn(t,e))}function bn(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(e)}async function xn(e,t=mn()){if(e.length===0)return()=>void 0;let n=await Promise.all(e.map(async e=>{let n=await t.getDeclaredDependency(e.of,e.ofVersion??`latest`,e.entry);if(n===void 0)throw Error(`derived catalog pin '${e.entry}': package '${e.of}'${e.ofVersion?`@${e.ofVersion}`:` (latest)`} declares no dependency '${e.entry}'. A derived pin requires the source to declare the dep as an exact version.`);if(!bn(n))throw Error(`derived catalog pin '${e.entry}': package '${e.of}'${e.ofVersion?`@${e.ofVersion}`:` (latest)`} declares '${e.entry}: ${n}', which is not an exact version. A derived pin requires an exact ('x.y.z') source dependency so the catalog can pin to it precisely.`);return[e.entry,n]})),r=new Map(n);return e=>r.get(e)}var Sn=[`vite`,`tsup`,`vue-tsc`,`@vitejs/plugin-vue`,`vite-plugin-dts`,`@platforma-sdk/eslint-config`];function Y(){for(let e of Sn)z(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`],Cn=`0.0.0-init-must-fetch`;for(let e of X)if(!vn(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 wn={turbo:`~2.8.11`,shx:`~0.4.0`,"@changesets/cli":`~2.29.8`,vitest:`~4.0.18`},Tn=[{entry:`vue`,of:`@platforma-sdk/ui-vue`}],En=`@platforma-open/milaboratories.runenv-python-3`,Dn=`1.8.2`;function On(e){let t=e.modules.filter(e=>e.path!==``).map(e=>e.path).sort(),n={};for(let e of X)n[e]=Cn;return Object.assign(n,wn),e.modules.some(e=>e.scope===`software`)&&(n[En]=Dn),{packages:t,catalog:n}}function kn(){ht();for(let e of Sn)bt(e)}var An=[`.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 jn(){xt(An)}function Mn(){g(`root`,()=>{_(({ctx:e})=>!e.isSdkInternal,()=>{y(`turbo.json`,C(`root/turbo.json`)),y(`.vscode/settings.json`,C(`root/.vscode/settings.json`)),b(`package.json`,T(e=>sn(e)),()=>{cn()}),b(`pnpm-workspace.yaml`,T(e=>On(e)),()=>{kn()}),b(`.gitignore`,C(`root/.gitignore`),()=>{jn()})})})}function Nn(e){return e.split(/[-_]+/).filter(e=>e.length>0).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}function Pn(){g(`root`,()=>{_(({ctx:e})=>!e.isSdkInternal,()=>{y(`.github/workflows/build.yaml`,w(`workflows/build.tpl.yaml`,e=>{let t=e.blockVars.shortName;return{appName:`Block: ${Nn(t)}`,appNameSlug:`block-${t}`}})),y(`.github/workflows/mark-stable.yaml`,w(`workflows/mark-stable.tpl.yaml`,e=>({appName:`Block: ${Nn(e.blockVars.shortName)} - Mark Stable`})))})})}function Fn(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 In(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 Ln(e){let t=e.blockVars,n={...K(e,`model`),...K(e,`ui`),...K(e,`workflow`)},r={components:Fn(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 In(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 Rn(e){N(`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`),H(`model`),H(`ui`),H(`workflow`),R(`@platforma-sdk/block-tools`,`sdk:`),R(`shx`,`catalog:`),N(`block.components`,Fn(e)),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),U([...J])}function zn(){g(`block`,()=>{y(`index.js`,C(`block/index.js`)),y(`index.d.ts`,C(`block/index.d.ts`)),x(`logos/block-logo.png`,Fe(`block/logos/block-logo.png`)),x(`logos/organization-logo.png`,Fe(`block/logos/organization-logo.png`)),b(`package.json`,T(e=>Ln(e)),e=>{Rn(e)})})}var Z=`src/**/*.test.ts`;function Bn(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:`},peerDependencies:{"@types/node":`*`,typescript:`*`}}}function Vn(){N(`type`,`module`),N(`main`,`dist/index.cjs`),N(`module`,`dist/index.js`),N(`types`,`dist/index.d.ts`),N(`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`),L(`@platforma-sdk/model`,`sdk:`),B({"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,"@platforma-sdk/block-tools":`sdk:`}),V({"@types/node":`*`,typescript:`*`}),_(({ctx:e})=>!e.isSdkInternal,()=>_(v(Z),()=>{P(`test`,`vitest run --passWithNoTests`),R(`vitest`,`catalog:`),R(`@types/node`,`*`)},()=>z(`vitest`))),Y(),ct(`tsup`),F(`lint`),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),U([...J])}function Hn(){g(`model`,()=>{_(v(Z),()=>y(`tsconfig.json`,C(`model/tsconfig.node.json`)),()=>y(`tsconfig.json`,C(`model/tsconfig.json`))),y(`.oxlintrc.json`,C(`model/.oxlintrc.json`)),y(`.oxfmtrc.json`,C(`model/.oxfmtrc.json`)),x(`src/index.ts`,C(`model/src/index.ts`)),b(`package.json`,T(e=>Bn(e)),()=>{Vn()})})}function Un(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:`},peerDependencies:{"@types/node":`*`,typescript:`*`}}}function Wn(){N(`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`),L(`@platforma-sdk/ui-vue`,`sdk:`),L(`vue`,`catalog:`),H(`model`),B({"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`}),Y(),F(`preview`),F(`lint`),V({"@types/node":`*`,typescript:`*`}),_(({ctx:e})=>!e.isSdkInternal,()=>_(v(Z),()=>{P(`test`,`vitest run --passWithNoTests`),R(`vitest`,`catalog:`),R(`@types/node`,`*`)},()=>z(`vitest`))),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),U([...J])}function Gn(){g(`ui`,()=>{_(v(Z),()=>y(`tsconfig.json`,C(`ui/tsconfig.node.json`)),()=>y(`tsconfig.json`,C(`ui/tsconfig.json`))),y(`.oxlintrc.json`,C(`ui/.oxlintrc.json`)),y(`.oxfmtrc.json`,C(`ui/.oxfmtrc.json`)),Pe(`index.html`,C(`ui/index.html`)),x(`src/main.ts`,C(`ui/src/main.ts`)),x(`src/app.ts`,w(`ui/src/app.tpl.ts`,e=>({modelPkg:`${e.blockVars.facadeName}.model`}))),x(`src/MainPage.vue`,w(`ui/src/MainPage.tpl.vue`,e=>({shortName:e.blockVars.shortName}))),b(`package.json`,T(e=>Un(e)),()=>{Wn()})})}function Kn(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:`,...Yt(e,`software`)},devDependencies:{"@platforma-sdk/tengo-builder":`sdk:`,"@platforma-sdk/test":`sdk:`,shx:`catalog:`}}}function qn(){N(`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.'`),_(({ctx:e})=>!e.isSdkInternal,()=>_(v(Z),()=>{P(`test`,`vitest run --passWithNoTests`),B({vitest:`catalog:`})},()=>z(`vitest`))),L(`@platforma-sdk/workflow-tengo`,`sdk:`),H(`software`),B({"@platforma-sdk/tengo-builder":`sdk:`,"@platforma-sdk/test":`sdk:`,shx:`catalog:`}),Y(),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),U([...J])}function Jn(){g(`workflow`,()=>{y(`format.el`,C(`workflow/format.el`)),_(({ctx:e})=>!e.isSdkInternal,()=>_(v(Z),()=>{y(`tsconfig.json`,C(`workflow/tsconfig.json`)),Pe(`vitest.config.mts`,C(`workflow/vitest.config.mts`))},()=>{S(`tsconfig.json`),S(`vitest.config.mts`)})),S(`index.js`),S(`index.d.ts`),x(`src/main.tpl.tengo`,w(`workflow/src/main.tpl.tengo`,e=>({shortName:e.blockVars.shortName}))),b(`package.json`,T(e=>Kn(e)),()=>{qn()})})}function Yn(e){return{name:`${e.blockVars.facadeName}.test`,version:`1.0.0`,private:!0,type:`module`,scripts:{fmt:`ts-builder format`,check:`ts-builder 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 Xn(){N(`type`,`module`),P(`fmt`,`ts-builder format`),P(`check`,`ts-builder check --target block-test`),P(`test`,`vitest run --passWithNoTests`),F(`lint`),B({"@platforma-sdk/test":`sdk:`,"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,vitest:`catalog:`}),V({typescript:`*`}),z(`@types/node`),Y(),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),U([...J])}function Zn(){g(`test`,()=>{y(`tsconfig.json`,C(`test/tsconfig.json`)),y(`.oxlintrc.json`,C(`test/.oxlintrc.json`)),y(`.oxfmtrc.json`,C(`test/.oxfmtrc.json`)),Pe(`vitest.config.mts`,C(`test/vitest.config.mts`)),x(`src/demo.test.ts`,Ie(`import { expect, test } from "vitest";
12
+ `}function He(e){return e.replace(/(^|\s)#.*$/,`$1`).trim()}function Ue(e,t){let n=He(e);return n===``?!1:n===t.trim()}function We(e,t){for(let n of e)if(Ue(n,t))return!0;return!1}function Ge(e,t){return e===`sdk:`?t?`workspace:*`:`catalog:`:e}var Ke=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`];function qe(e,t){if(N(e))for(let n of Ke){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 Je(e){if(!A)throw Error(`${e}() only valid inside a managed(...) body. Move this call inside managed(path, initial, () => {...}).`);return A}function j(e){let t=Je(e);if(t.kind!==`json`)throw Error(`${e}() requires a JSON-managed body; got '${t.kind}'.`);return t}function M(e){let t=Je(e);if(t.kind!==`yaml`)throw Error(`${e}() requires a YAML-managed body; got '${t.kind}'.`);return t}function Ye(e){let t=Je(e);if(t.kind!==`lines`)throw Error(`${e}() requires a lines-managed body; got '${t.kind}'.`);return t}function Xe(e,t){let n=e.ctx??_e();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 Ze(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(n.ctx??n.triggerContext?.ctx),e}finally{A=void 0}}function Qe(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,getDerivedDependencyPin:n.getDerivedDependencyPin};try{return t(n.ctx??n.triggerContext?.ctx),e}finally{A=void 0}}function $e(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(n.ctx??n.triggerContext?.ctx),e}finally{A=void 0}}xe((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){Le(j(`ensureField`).obj,e,t)}function et(e,t){let n=j(`removeField`).obj;Ie(n,e)&&(t&&!t(Fe(n,e))||Re(n,e))}function tt(e,t){let n=j(`requireField`).obj;if(!Ie(n,e))throw Error(t??`requireField: missing field '${e}'`)}function F(e,t){P(`scripts.${e}`,t)}function I(e){et(`scripts.${e}`)}var nt=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`];function L(e,t,n,r){let i=j(e),a=i.obj,o=n===`sdk:`?Ge(n,Xe(i,e).isSdkInternal):n;for(let e of nt){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 R(e,t){L(`ensureDep`,e,t,`dependencies`)}function z(e,t){L(`ensureDevDep`,e,t,`devDependencies`)}function rt(e,t){L(`ensurePeerDep`,e,t,`peerDependencies`)}function B(e){let t=j(`removeDep`).obj;for(let n of nt){let r=t[n];N(r)&&e in r&&delete r[e]}}function V(e){for(let[t,n]of Object.entries(e))z(t,n)}function H(e){for(let[t,n]of Object.entries(e))rt(t,n)}function it(e,t,n){let r=Xe(j(e),e);for(let i of r.modules)i.scope===t&&L(e,i.name,`workspace:*`,n)}function at(e){it(`ensureWorkspaceScopeDeps`,e,`dependencies`)}function ot(e){it(`ensureWorkspaceScopeDevDeps`,e,`devDependencies`)}function st(e){let t=j(`pruneKeysMatching`).obj;for(let n of Object.keys(t))e(n,t[n])&&delete t[n]}function ct(e,t){let n=ze(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){ct(j(`enforceFieldOrder`).obj,e)}function lt(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])&&lt(e[i],!0)}function W(e=``,t={}){let n=t.recursive??!1;if(e===``&&!n)return;let r=j(`enforceAlphabeticalOrder`).obj;if(e===``){lt(r,!0);return}let i=Fe(r,e);N(i)&&lt(i,n)}function ut(){let e=M(`ensureWorkspaceModulePaths`),t=Xe(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 dt(e,t){let n=e.doc.getIn([`catalog`,t]);return typeof n==`string`?n:void 0}function ft(e,t){let n=M(`ensureCatalogVersion`);dt(n,e)===void 0&&n.doc.setIn([`catalog`,e],t)}function pt(e){let t=M(`ensureCatalogLatest`);if(!t.getLatestVersion)return;let n=t.getLatestVersion(e);n!==void 0&&dt(t,e)!==n&&t.doc.setIn([`catalog`,e],n)}function mt(e,t){let n=M(`pinCatalogToDependencyOf`);if(!n.getDerivedDependencyPin)return;let r=n.getDerivedDependencyPin(e);r!==void 0&&dt(n,e)!==r&&n.doc.setIn([`catalog`,e],r)}function ht(e){let t=M(`ensureCatalogAbsent`);t.doc.hasIn([`catalog`,e])&&t.doc.deleteIn([`catalog`,e])}function gt(e){let t=Ye(`ensureGitignoreEntries`);for(let n of e)We(t.lines,n)||t.lines.push(n)}function _t(e){return(0,o.parseDocument)(e)}function vt(e){return e.toString()}var yt=`.structure`;function bt(e,t=0){if(e<t)throw new xt(e,t)}var xt=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 St(e,t=1){let n={version:t};e.write(yt,JSON.stringify(n))}var Ct=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 wt(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 oe(n.textRead(e.path),typeof e.vars==`function`?e.vars(r):e.vars);case`generate`:{let n=e.fn(r);if(t.endsWith(`.json`))return qe(n,r.isSdkInternal),Pe(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 Tt(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,wt(n,t,r,i))}function Et(e,t,n,r,i,a){let o=e.split(`/`).pop()??e;if(e.endsWith(`.json`)){let i=Oe(t);if(typeof i!=`object`||!i||Array.isArray(i))throw Error(`managed: parsed value at '${e}' is not a JSON object`);return Ze(i,n,{triggerContext:r}),Pe(i,{collapse:o!==`package.json`})}if(e.endsWith(`.yaml`)||e.endsWith(`.yml`)){let e=_t(t);return Qe(e,n,{triggerContext:r,getLatestVersion:i,getDerivedDependencyPin:a}),vt(e)}if(o===`.gitignore`||o.endsWith(`.gitignore`)){let e=Be(t);return $e(e,n,{triggerContext:r}),Ve(e)}throw Error(`managed('${e}'): unsupported file kind. Only .json, .yaml, .yml, .gitignore are dispatched.`)}function Dt(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 Ot(e,t){let n=t===``?t:t.endsWith(`/`)?t.slice(0,-1):t;return e.has(n)}function kt(e,t,n){return{ctx:t,version:t.version,pathExists:t=>Ot(e,t),pathMissing:t=>!Ot(e,t),filesMatch:t=>{let r=n?`${n}/${t}`:t;for(let t of e)if(he(r,t))return!0;return!1}}}function At(e,t){for(let n of e.triggers)if(!n(t))return!1;return!0}function jt(e,t){return t?`init`:e.updateDepsOnly?`updateDeps`:`default`}function Mt(e,t){return e.filter(e=>e.modes.includes(t))}function Nt(e,t,n,r,i,a){let o=e.leaf;if(o.kind===`fixed`){let i=wt(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||Tt(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||Tt(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 Pt(e,t,n,r,i,a,o,s){if(e.leaf.kind!==`managed`)return;let c=e.leaf,l=e.resolvedPath,u=t.exists(l),d,ee=!1;u?d=t.read(l):(d=wt(c.initial,l,i,s),ee=!0);let f=Et(l,d,c.body,r,a,o);if(ee)return n||t.write(l,f),{scope:e.scope,path:l,primitive:`managed`,action:`create`};if(f!==d)return n||t.write(l,f),{scope:e.scope,path:l,primitive:`managed`,action:`update`}}function Ft(e,t,n,r,i,a,o,s){let c=Mt(e,jt(n,a)),l=[],u=Dt(t);for(let e of c){if(e.leaf.kind===`managed`||!At(e,kt(u,n,e.modulePath)))continue;let o=Nt(e,t,r,i,a,n);o&&l.push(o)}let d=Dt(t);for(let e of c){if(e.leaf.kind!==`managed`)continue;let a=kt(d,n,e.modulePath);if(!At(e,a))continue;let c=Pt(e,t,r,a,i,o,s,n);c&&l.push(c)}return l}function It(e,t,n,r={}){return ge(n,()=>{let i=ue(e,n),a=!!r.initMode,o=Ft(i,t,n,n.dryRun,r.templates,a,r.registryLookup,r.derivedPinLookup);if(!n.dryRun&&!n.updateDepsOnly&&!a){St(t);let i={...r.rediscover?r.rediscover(t):n,dryRun:!0},a=Ft(ue(e,i),t,i,!0,r.templates,!1,r.registryLookup,r.derivedPinLookup).filter(e=>e.path!==yt);if(a.length>0)throw new Ct(a[0])}return a&&!n.dryRun&&St(t),{changes:o}})}var Lt=[`root`,`block`,`model`,`ui`,`workflow`,`test`,`software`],Rt=class extends Error{constructor(e,t){super(e),this.path=t,this.name=`DiscoveryError`}};function zt(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 Bt(e){return e===``||e===`.`}function Vt(e){let t=e.pkg[`block-scope`];if(typeof t==`string`){if(!Lt.includes(t))throw new Rt(`package.json "block-scope" must be one of ${Lt.join(`, `)}, got '${t}'`,e.path);return t}if(Bt(e.path))return`root`;if(e.pkg.block!==void 0)return`block`;let n=zt(e.pkg);if(e.pkg[`block-software`]!==void 0)return`software`;if(n.has(`@platforma-sdk/package-builder`)){for(let e of n)if(/^@platforma-open\/.*runenv/.test(e))return`software`}if(n.has(`@platforma-sdk/workflow-tengo`))return`workflow`;if((n.has(`@platforma-sdk/ui-vue`)||n.has(`vue`))&&!e.pkg.main)return`ui`;if(n.has(`@platforma-sdk/model`)&&e.pkg.main)return`model`;if(n.has(`@platforma-sdk/test`))return`test`}function Ht(e){let t=[];for(let n of e){let e=Vt(n);if(!e)throw new Rt(`Unclassified workspace package at '${n.path}'. Add a top-level "block-scope" string to its package.json.`,n.path);t.push({scope:e,name:n.pkg.name??n.path,path:Bt(n.path)?``:n.path})}return t}function G(e,t){return e.modules.filter(e=>e.scope===t)}function Ut(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 Wt(e,t){return{[Ut(e,t).name]:`workspace:*`}}function K(e,t){let n={};for(let r of G(e,t))n[r.name]=`workspace:*`;return n}function Gt(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 Kt(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 qt(e,t){return e===``?t:`${e}/${t}`}function Jt(e,t){try{return JSON.parse(e.read(t))}catch{return}}function Yt(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 Xt(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=Yt(t);(n===``||e.exists(n))&&i.add(n)}let a=[];for(let t of i){let n=Jt(e,qt(t,`package.json`));n&&a.push({path:t,pkg:n})}return a}function Zt(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=qt(i,s.name),c=Jt(e,qt(o,`package.json`));c&&t.push({path:o,pkg:c}),a<2&&r(o,a+1)}}return r(``,1),t}function Qt(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 $t(e){try{let t=JSON.parse(e.read(yt));return typeof t.version==`number`?t.version:0}catch{return 0}}function en(e){let{fs:t,isSdkInternal:n}=e,r=n?Zt(t):Xt(t);if(r.length===0)throw new q(`No workspace packages found. Run 'block-tools structure init' to scaffold a block.`);let i=Ht(r),a=$t(t);bt(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=Qt(o.name.replace(/\.block$/,``));return Kt({isSdkInternal:n,updateDepsOnly:e.updateDepsOnly??!1,modules:i,blockVars:s,version:a,dryRun:e.dryRun??!1})}var J=[`name`,`version`,`private`,`description`,`keywords`,`files`,`type`,`main`,`module`,`types`,`exports`,`scripts`,`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`,`packageManager`,`pnpm`,`block`,`block-software`];function tn(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`,"upgrade-sdk":`block-tools structure refresh --update-deps-only && pnpm i && block-tools structure refresh && pnpm i && 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 nn(){P(`packageManager`,`pnpm@9.12.0`),et(`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`),I(`update`),F(`upgrade-sdk`,`block-tools structure refresh --update-deps-only && pnpm i && block-tools structure refresh && pnpm i && pnpm fmt`),V({"@changesets/cli":`catalog:`,"@milaboratories/ts-builder":`sdk:`,"@platforma-sdk/block-tools":`sdk:`,shx:`catalog:`,turbo:`catalog:`}),H({oxlint:`*`,oxfmt:`*`}),st((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`),U([...J])}var rn=2,an=500,on=3e4;function sn(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 cn(e){for(let t=1;;t++){let n;try{n=await fetch(e,{signal:AbortSignal.timeout(on)})}catch(e){if(t>rn)throw e;await(0,s.setTimeout)(an*2**(t-1)*(.8+.4*Math.random()));continue}if(n.ok)return n;if(!(n.status===429||n.status>=500)||t>rn)throw Error(`registry returned HTTP ${n.status}`);let r=sn(n.headers.get(`retry-after`));if(r!=null){await(0,s.setTimeout)(r);continue}await(0,s.setTimeout)(an*2**(t-1)*(.8+.4*Math.random()))}}function ln(){return{async getLatestVersion(e){let t=(await(await cn(`https://registry.npmjs.org/-/package/${e}/dist-tags`)).json()).latest;if(!t)throw Error(`no 'latest' dist-tag in registry response`);return t},async getDeclaredDependency(e,t,n){let r=await(await cn(`https://registry.npmjs.org/${e}/${t}`)).json();return r.dependencies?.[n]??r.peerDependencies?.[n]}}}async function un(e,t){let n=await Promise.all(t.map(async t=>[t,await e.getLatestVersion(t)]));return new Map(n)}function dn(e){return t=>e.get(t)}var fn=[/^@platforma-sdk\//,/^@milaboratories\//];function pn(e){return fn.some(t=>t.test(e))}async function mn(e,t=ln()){return e.length===0?()=>void 0:dn(await un(t,e))}function hn(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(e)}async function gn(e,t=ln()){if(e.length===0)return()=>void 0;let n=await Promise.all(e.map(async e=>{let n=await t.getDeclaredDependency(e.of,e.ofVersion??`latest`,e.entry);if(n===void 0)throw Error(`derived catalog pin '${e.entry}': package '${e.of}'${e.ofVersion?`@${e.ofVersion}`:` (latest)`} declares no dependency '${e.entry}'. A derived pin requires the source to declare the dep as an exact version.`);if(!hn(n))throw Error(`derived catalog pin '${e.entry}': package '${e.of}'${e.ofVersion?`@${e.ofVersion}`:` (latest)`} declares '${e.entry}: ${n}', which is not an exact version. A derived pin requires an exact ('x.y.z') source dependency so the catalog can pin to it precisely.`);return[e.entry,n]})),r=new Map(n);return e=>r.get(e)}var _n=[`vite`,`tsup`,`vue-tsc`,`@vitejs/plugin-vue`,`vite-plugin-dts`,`@platforma-sdk/eslint-config`];function Y(){for(let e of _n)B(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`],vn=`0.0.0-init-must-fetch`;for(let e of X)if(!pn(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 yn={turbo:`~2.8.11`,shx:`~0.4.0`,"@changesets/cli":`~2.29.8`,vitest:`~4.0.18`},bn=[{entry:`vue`,of:`@platforma-sdk/ui-vue`}],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]=vn;return Object.assign(n,yn),e.modules.some(e=>e.scope===`software`)&&(n[xn]=Sn),{packages:t,catalog:n}}function wn(){ut();for(let e of _n)ht(e)}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(){gt(Tn)}function Dn(){_(`root`,()=>{v(({ctx:e})=>!e.isSdkInternal,()=>{b(`turbo.json`,T(`root/turbo.json`)),b(`.vscode/settings.json`,T(`root/.vscode/settings.json`)),x(`package.json`,D(e=>tn(e)),()=>{nn()}),x(`pnpm-workspace.yaml`,D(e=>Cn(e)),()=>{wn()}),x(`.gitignore`,T(`root/.gitignore`),()=>{En()})})})}function On(e){return e.split(/[-_]+/).filter(e=>e.length>0).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}function kn(){_(`root`,()=>{v(({ctx:e})=>!e.isSdkInternal,()=>{b(`.github/workflows/build.yaml`,E(`workflows/build.tpl.yaml`,e=>{let t=e.blockVars.shortName;return{appName:`Block: ${On(t)}`,appNameSlug:`block-${t}`}})),b(`.github/workflows/mark-stable.yaml`,E(`workflows/mark-stable.tpl.yaml`,e=>({appName:`Block: ${On(e.blockVars.shortName)} - Mark Stable`})))})})}var An={"@platforma-open":{s3:`s3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1`,serveUrl:`https://blocks.pl-open.science`},"@milaboratories":{s3:`s3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1`,serveUrl:`https://block.registry.platforma.bio/releases`}},jn={s3:`s3://milab-euce1-prod-pkgs-s3-block-registry/pub/releases/?region=eu-central-1`,serveUrl:`https://blocks.pl-open.science`},Mn={s3:`s3://milab-euce1-prod-pkgs-s3-block-registry/aux/dev/?region=eu-central-1`,serveUrl:`https://aux-blocks.pl-open.science`};function Nn(e,t){let n=t?Mn:An[e]??jn;return`block-tools publish -r ${n.s3} --registry-serve-url ${n.serveUrl}`}function Pn(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 Fn(e,t){return{build:`ts-builder build --target block-facade && block-tools pack`,check:`ts-builder type-check --target block-facade`,prepublishOnly:Nn(e,t),"do-pack":`pnpm pack && shx mv *.tgz package.tgz`}}var In={"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,"@platforma-sdk/block-tools":`sdk:`,"@platforma-sdk/model":`sdk:`,shx:`catalog:`,typescript:`catalog:`},Ln={".":{sources:`./src/index.ts`,types:`./dist/index.d.ts`,default:`./dist/index.js`}};function Rn(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 zn(e){let t=e.blockVars,n={...In,...K(e,`model`),...K(e,`ui`),...K(e,`workflow`)},r={components:Pn(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 Rn(r),{name:`${t.facadeName}.block`,version:`1.0.0`,type:`module`,files:[`dist`,`block-pack`],main:`./dist/index.js`,module:`./dist/index.js`,types:`./dist/index.d.ts`,exports:Ln,scripts:Fn(t.npmOrg,e.isSdkInternal),dependencies:{},devDependencies:n,block:r}}function Bn(e){let t=e.blockVars;P(`type`,`module`),P(`files`,[`dist`,`block-pack`]),P(`main`,`./dist/index.js`),P(`module`,`./dist/index.js`),P(`types`,`./dist/index.d.ts`),P(`exports`,Ln);let n=Fn(t.npmOrg,e.isSdkInternal);for(let[e,t]of Object.entries(n))F(e,t);I(`mark-stable`),ot(`model`),ot(`ui`),ot(`workflow`),z(`@milaboratories/ts-builder`,`sdk:`),z(`@milaboratories/ts-configs`,`sdk:`),z(`@platforma-sdk/block-tools`,`sdk:`),z(`@platforma-sdk/model`,`sdk:`),z(`shx`,`catalog:`),z(`typescript`,`catalog:`),P(`block.components`,Pn(e)),tt(`version`,`facade package.json must carry a 'version' (the facade publishes)`),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),U([...J])}function Vn(e){let t=e.split(/[^A-Za-z0-9]+/).filter(e=>e.length>0).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``);return/^[0-9]/.test(t)?`_${t}`:t}function Hn(){_(`block`,()=>{w(`index.js`),w(`index.d.ts`),b(`src/index.ts`,E(`block/src/index.tpl.ts`,e=>({facadeName:e.blockVars.facadeName,pascalName:Vn(e.blockVars.shortName)}))),b(`src/AGENTS.ts`,T(`block/src/AGENTS.ts`)),S(`src/block-extra.ts`,T(`block/src/block-extra.ts`)),S(`src/agents-extra.ts`,T(`block/src/agents-extra.ts`)),b(`tsconfig.json`,T(`block/tsconfig.json`)),C(`logos/block-logo.png`,Ee(`block/logos/block-logo.png`)),C(`logos/organization-logo.png`,Ee(`block/logos/organization-logo.png`)),x(`package.json`,D(e=>zn(e)),e=>{Bn(e)})})}var Z=`src/**/*.test.ts`;function Un(e){return{name:`${e.blockVars.facadeName}.model`,private:!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:`},peerDependencies:{"@types/node":`*`,typescript:`*`}}}function Wn(){P(`private`,!0),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`),R(`@platforma-sdk/model`,`sdk:`),V({"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,"@platforma-sdk/block-tools":`sdk:`}),H({"@types/node":`*`,typescript:`*`}),v(({ctx:e})=>!e.isSdkInternal,()=>v(y(Z),()=>{F(`test`,`vitest run --passWithNoTests`),z(`vitest`,`catalog:`),z(`@types/node`,`*`)},()=>B(`vitest`))),Y(),et(`tsup`),I(`lint`),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),U([...J])}function Gn(){_(`model`,()=>{v(y(Z),()=>b(`tsconfig.json`,T(`model/tsconfig.node.json`)),()=>b(`tsconfig.json`,T(`model/tsconfig.json`))),b(`.oxlintrc.json`,T(`model/.oxlintrc.json`)),b(`.oxfmtrc.json`,T(`model/.oxfmtrc.json`)),C(`src/index.ts`,T(`model/src/index.ts`)),x(`package.json`,D(e=>Un(e)),()=>{Wn()})})}function Kn(e){return{name:`${e.blockVars.facadeName}.ui`,private:!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:`,...Wt(e,`model`)},devDependencies:{"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`},peerDependencies:{"@types/node":`*`,typescript:`*`}}}function qn(){P(`private`,!0),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`),R(`@platforma-sdk/ui-vue`,`sdk:`),R(`vue`,`catalog:`),at(`model`),V({"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`}),Y(),I(`preview`),I(`lint`),H({"@types/node":`*`,typescript:`*`}),v(({ctx:e})=>!e.isSdkInternal,()=>v(y(Z),()=>{F(`test`,`vitest run --passWithNoTests`),z(`vitest`,`catalog:`),z(`@types/node`,`*`)},()=>B(`vitest`))),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),U([...J])}function Jn(){_(`ui`,()=>{v(y(Z),()=>b(`tsconfig.json`,T(`ui/tsconfig.node.json`)),()=>b(`tsconfig.json`,T(`ui/tsconfig.json`))),b(`.oxlintrc.json`,T(`ui/.oxlintrc.json`)),b(`.oxfmtrc.json`,T(`ui/.oxfmtrc.json`)),S(`index.html`,T(`ui/index.html`)),C(`src/main.ts`,T(`ui/src/main.ts`)),C(`src/app.ts`,E(`ui/src/app.tpl.ts`,e=>({modelPkg:`${e.blockVars.facadeName}.model`}))),C(`src/MainPage.vue`,E(`ui/src/MainPage.tpl.vue`,e=>({shortName:e.blockVars.shortName}))),x(`package.json`,D(e=>Kn(e)),()=>{qn()})})}function Yn(e){return{name:`${e.blockVars.facadeName}.workflow`,private:!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:`,...K(e,`software`)},devDependencies:{"@platforma-sdk/tengo-builder":`sdk:`,"@platforma-sdk/test":`sdk:`,shx:`catalog:`}}}function Xn(){P(`private`,!0),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(({ctx:e})=>!e.isSdkInternal,()=>v(y(Z),()=>{F(`test`,`vitest run --passWithNoTests`),V({vitest:`catalog:`})},()=>B(`vitest`))),R(`@platforma-sdk/workflow-tengo`,`sdk:`),at(`software`),V({"@platforma-sdk/tengo-builder":`sdk:`,"@platforma-sdk/test":`sdk:`,shx:`catalog:`}),Y(),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),U([...J])}function Zn(){_(`workflow`,()=>{b(`format.el`,T(`workflow/format.el`)),v(({ctx:e})=>!e.isSdkInternal,()=>v(y(Z),()=>{b(`tsconfig.json`,T(`workflow/tsconfig.json`)),S(`vitest.config.mts`,T(`workflow/vitest.config.mts`))},()=>{w(`tsconfig.json`),w(`vitest.config.mts`)})),w(`index.js`),w(`index.d.ts`),C(`src/main.tpl.tengo`,E(`workflow/src/main.tpl.tengo`,e=>({shortName:e.blockVars.shortName}))),x(`package.json`,D(e=>Yn(e)),()=>{Xn()})})}function Qn(e){return{name:`${e.blockVars.facadeName}.test`,private:!0,type:`module`,scripts:{fmt:`ts-builder format`,check:`ts-builder 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 $n(){P(`private`,!0),P(`type`,`module`),F(`fmt`,`ts-builder format`),F(`check`,`ts-builder check --target block-test`),F(`test`,`vitest run --passWithNoTests`),I(`lint`),V({"@platforma-sdk/test":`sdk:`,"@milaboratories/ts-builder":`sdk:`,"@milaboratories/ts-configs":`sdk:`,vitest:`catalog:`}),H({typescript:`*`}),B(`@types/node`),Y(),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),U([...J])}function er(){_(`test`,()=>{b(`tsconfig.json`,T(`test/tsconfig.json`)),b(`.oxlintrc.json`,T(`test/.oxlintrc.json`)),b(`.oxfmtrc.json`,T(`test/.oxfmtrc.json`)),S(`vitest.config.mts`,T(`test/vitest.config.mts`)),C(`src/demo.test.ts`,De(`import { expect, test } from "vitest";
14
13
 
15
14
  test("scaffolded block sanity check", () => {
16
15
  expect(true).toBe(true);
17
16
  });
18
- `)),b(`package.json`,T(e=>Yn(e)),()=>{Xn()})})}function Qn(){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 $n(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":Qn(),devDependencies:{"@platforma-open/milaboratories.runenv-python-3":`catalog:`,"@platforma-sdk/package-builder":`sdk:`}}}function er(){N(`type`,`module`),N(`files`,[`./dist/**/*`]),P(`build`,`pl-pkg build`),P(`prepublishOnly`,`pl-pkg prepublish`),P(`changeset`,`changeset`),P(`version-packages`,`changeset version`),B({"@platforma-open/milaboratories.runenv-python-3":`catalog:`,"@platforma-sdk/package-builder":`sdk:`}),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),U([...J])}var tr=`import sys
17
+ `)),x(`package.json`,D(e=>Qn(e)),()=>{$n()})})}function tr(){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 nr(e){return{name:`${e.blockVars.facadeName}.software`,private:!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":tr(),devDependencies:{"@platforma-open/milaboratories.runenv-python-3":`catalog:`,"@platforma-sdk/package-builder":`sdk:`}}}function rr(){P(`private`,!0),P(`type`,`module`),P(`files`,[`./dist/**/*`]),F(`build`,`pl-pkg build`),F(`prepublishOnly`,`pl-pkg prepublish`),F(`changeset`,`changeset`),F(`version-packages`,`changeset version`),V({"@platforma-open/milaboratories.runenv-python-3":`catalog:`,"@platforma-sdk/package-builder":`sdk:`}),W(`dependencies`),W(`devDependencies`),W(`peerDependencies`),W(`optionalDependencies`),U([...J])}var ir=`import sys
19
18
 
20
19
  print("Hello from Python, " + sys.argv[1] + "!")
21
- `,nr=`# No dependencies specified for this script
22
- `;function rr(){g(`software`,()=>{x(`src/main.py`,Ie(tr)),x(`src/requirements.txt`,Ie(nr)),b(`package.json`,T(e=>$n(e)),()=>{er()})})}function ir(){g(`model`,()=>{S(`eslint.config.mjs`),S(`vite.config.mts`)}),g(`ui`,()=>{S(`eslint.config.mjs`),S(`vite.config.ts`),S(`tsconfig.app.json`),S(`tsconfig.node.json`)}),g(`test`,()=>{S(`eslint.config.mjs`)}),g(`root`,()=>{S(`.prettierrc`),b(`package.json`,T(e=>sn(e)),()=>{F(`pretty`),z(`@platforma-sdk/blocks-deps-updater`)})})}function ar(){Ne(()=>{g(`root`,()=>{_(({ctx:e})=>!e.isSdkInternal,()=>{b(`pnpm-workspace.yaml`,T(e=>On(e)),e=>{for(let e of X)vt(e);for(let e of Tn)yt(e.entry,{of:e.of,ofVersion:e.ofVersion});for(let[e,t]of Object.entries(wn))_t(e,t);e.modules.some(e=>e.scope===`software`)&&_t(En,Dn)})})})})}var or=Ee(()=>{Mn(),Pn(),zn(),Hn(),Gn(),Jn(),Zn(),rr(),ir(),ar()});async function sr(){return yn(X.filter(vn))}async function cr(e){let t=n.default.resolve(e.blockPath),r=e.mode===`check`,i=new de(t),a=new fe(e.templatesRoot),o=Vt(or,i,on({fs:i,isSdkInternal:e.isSdkInternal,updateDepsOnly:e.updateDepsOnly,dryRun:r}),{templates:a,registryLookup:e.updateDepsOnly?await sr():void 0,derivedPinLookup:e.updateDepsOnly?await xn(Tn):void 0,rediscover:()=>on({fs:i,isSdkInternal:e.isSdkInternal,updateDepsOnly:!1,dryRun:!0})});return{blockPath:e.blockPath,changes:o.changes}}function lr(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 ur=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 cr({blockPath:e,isSdkInternal:r[`sdk-internal`],updateDepsOnly:!1,mode:`check`,templatesRoot:a,log:e=>this.log(e)});this.log(lr(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`],dr=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 dr(t);return r()}async function fr(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 pr(e){let t=e.vars,n=Xt(t),r=new de(e.blockPath),i=new fe(e.templatesRoot),a=Zt({blockVars:t,modules:n,isSdkInternal:!1,version:1,dryRun:!1}),o=X.filter(vn),s,c;try{s=await yn(o),c=await xn(Tn)}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 Vt(or,r,a,{templates:i,initMode:!0,registryLookup:s,derivedPinLookup:c}),e.log(`Initialised block '${t.facadeName}'${t.softwarePlatform?` (software: ${t.softwarePlatform})`:` (no software)`} at ${e.blockPath}`),t}var mr={"build-meta":l,"build-model":d,"list-overview-snapshots":ee,"mark-stable":f,pack:te,publish:re,"refresh-registry":ie,"restore-overview-from-snapshot":ae,"update-deps":oe,"upload-package-v1":ue,"structure:check":ur,"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 fr({npmOrg:r[`npm-org`],orgScope:r[`org-scope`],shortName:r[`short-name`],withSoftware:i,platform:r.platform,nonInteractive:r[`non-interactive`]});await pr({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 cr({blockPath:e,isSdkInternal:r[`sdk-internal`],updateDepsOnly:r[`update-deps-only`],mode:`refresh`,templatesRoot:a,log:e=>this.log(e)});this.log(lr(e,t.changes))}}}};exports.COMMANDS=mr;
20
+ `,ar=`# No dependencies specified for this script
21
+ `;function or(){_(`software`,()=>{C(`src/main.py`,De(ir)),C(`src/requirements.txt`,De(ar)),x(`package.json`,D(e=>nr(e)),()=>{rr()})})}function sr(){_(`model`,()=>{w(`eslint.config.mjs`),w(`vite.config.mts`)}),_(`ui`,()=>{w(`eslint.config.mjs`),w(`vite.config.ts`),w(`tsconfig.app.json`),w(`tsconfig.node.json`)}),_(`test`,()=>{w(`eslint.config.mjs`)}),_(`root`,()=>{w(`.prettierrc`),x(`package.json`,D(e=>tn(e)),()=>{I(`pretty`),B(`@platforma-sdk/blocks-deps-updater`)})})}function cr(){Te(()=>{_(`root`,()=>{v(({ctx:e})=>!e.isSdkInternal,()=>{x(`pnpm-workspace.yaml`,D(e=>Cn(e)),e=>{for(let e of X)pt(e);for(let e of bn)mt(e.entry,{of:e.of,ofVersion:e.ofVersion});for(let[e,t]of Object.entries(yn))ft(e,t);e.modules.some(e=>e.scope===`software`)&&ft(xn,Sn)})})})})}var lr=ve(()=>{Dn(),kn(),Hn(),Gn(),Jn(),Zn(),er(),or(),sr(),cr()});async function ur(){return mn(X.filter(pn))}async function dr(e){let t=n.default.resolve(e.blockPath),r=e.mode===`check`,i=new ie(t),a=new ae(e.templatesRoot),o=It(lr,i,en({fs:i,isSdkInternal:e.isSdkInternal,updateDepsOnly:e.updateDepsOnly,dryRun:r}),{templates:a,registryLookup:e.updateDepsOnly?await ur():void 0,derivedPinLookup:e.updateDepsOnly?await gn(bn):void 0,rediscover:()=>en({fs:i,isSdkInternal:e.isSdkInternal,updateDepsOnly:!1,dryRun:!0})});return{blockPath:e.blockPath,changes:o.changes}}function fr(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(`
22
+ `)}`}async function pr(e){for(let t of e.paths){let n=await dr({blockPath:t,isSdkInternal:e.isSdkInternal,updateDepsOnly:e.updateDepsOnly,mode:`refresh`,templatesRoot:e.templatesRoot,log:t=>e.logger.info(t)});e.logger.info(fr(t,n.changes))}}function mr(e){let r=new t.Command(`refresh`).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).`);return r.argument(`[paths...]`,`block path(s); defaults to the current directory`),r.option(`--sdk-internal`,`block(s) live inside the SDK monorepo; skip root-scope rules`),r.option(`--update-deps-only`,"fire ONLY catalog-bump rules (npm network). Follow with `pnpm install` then a plain refresh."),r.action(async(t,r)=>{let i=t.length>0?t:[`.`],o=n.default.join(e,`src`,`structure`,`templates`);await pr({paths:i,isSdkInternal:!!r.sdkInternal,updateDepsOnly:!!r.updateDepsOnly,templatesRoot:o,logger:new a.ConsoleLoggerAdapter})}),r}function hr(e){let r=new t.Command(`update-deps`).description("[DEPRECATED] Use `block-tools structure refresh --update-deps-only`. This alias delegates to it.");return r.action(async()=>{let t=new a.ConsoleLoggerAdapter;t.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 pr({paths:[`.`],isSdkInternal:!1,updateDepsOnly:!0,templatesRoot:n.default.join(e,`src`,`structure`,`templates`),logger:t})}),r}function gr(){let n=new t.Command(`list-overview-snapshots`).description(`List all available global overview snapshots in the registry`);return n.addOption(new t.Option(`-r, --registry <address>`,`full address of the registry`).env(`PL_REGISTRY`).makeOptionMandatory()),n.option(`--json`,`output in JSON format`,!1),n.action(async t=>{let n=new a.ConsoleLoggerAdapter,r=await new e.b(e._(t.registry),n).listGlobalOverviewSnapshots();if(t.json)n.info(JSON.stringify(r,null,2));else if(r.length===0)n.info(`No snapshots found.`);else{n.info(`Found ${r.length} snapshot(s):\n`);for(let e of r)n.info(` ${e.timestamp}`),n.info(` Path: ${e.path}`),n.info(``)}}),n}function _r(){let n=new t.Command(`restore-overview-from-snapshot`).description(`Restore global overview from a snapshot`);return n.addOption(new t.Option(`-r, --registry <address>`,`full address of the registry`).env(`PL_REGISTRY`).makeOptionMandatory()),n.requiredOption(`-s, --snapshot <timestamp>`,`snapshot timestamp ID to restore from`),n.option(`--skip-confirmation`,`skip confirmation prompt (use with caution)`,!1),n.action(async t=>{let n=new a.ConsoleLoggerAdapter,r=new e.b(e._(t.registry),n),i=await r.listGlobalOverviewSnapshots();if(!i.find(e=>e.timestamp===t.snapshot))throw Error(`Snapshot '${t.snapshot}' not found. Available snapshots:\n${i.map(e=>` - ${e.timestamp}`).join(`
23
+ `)||` (none)`}`);if(!t.skipConfirmation){let e=(await import(`node:readline`)).createInterface({input:process.stdin,output:process.stdout}),r=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(),r.toLowerCase()!==`y`&&r.toLowerCase()!==`yes`){n.info(`Restore cancelled.`);return}}try{await r.restoreGlobalOverviewFromSnapshot(t.snapshot),n.info(`✅ Successfully restored global overview from snapshot '${t.snapshot}'`)}catch(e){throw Error(`Failed to restore from snapshot: ${String(e)}`)}}),n}function vr(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)}}function yr(e,n){return new t.Option(e,n).argParser((e,t)=>[...t??[],vr(e)]).default([])}var br=[`registry`,`organization`,`package`,`version`];function xr(){let n=new t.Command(`upload-package-v1`).description(`Uploads V1 package and refreshes the registry`);return n.addOption(new t.Option(`-r, --registry <address|alias>`,`full address of the registry or alias from .pl.reg`).env(`PL_REGISTRY`)),n.addOption(new t.Option(`-o, --organization <organization>`,`target organisation`).env(`PL_PACKAGE_ORGANIZATION`)),n.addOption(new t.Option(`-p, --package <package>`,`target package`).env(`PL_PACKAGE_NAME`)),n.addOption(new t.Option(`-v, --version <version>`,`target version`).env(`PL_PACKAGE_VERSION`)),n.option(`-m, --meta <path>`,`json file containing meta information to associate with tha package`),n.addOption(yr(`-f, --file <file>`,`package files`)),n.addOption(new t.Option(`--refresh`,`refresh repository after adding the package`).default(!0).env(`PL_REGISTRY_REFRESH`)),n.option(`--no-refresh`,`do not refresh repository after adding the package`),n.action(async t=>{let n=new a.ConsoleLoggerAdapter,i=e.p.parse({});for(let e of br)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);n.info(o.default.stringify(s.conf));let c=s.createRegistry(n),l=s.fullPackageName,u=c.constructNewPackage(l);for(let[e,t]of Object.entries(s.conf.files)){n.info(`Uploading ${t} -> ${e} ...`);let i=await r.default.promises.readFile(t);await u.addFile(e,i)}n.info(`Uploading meta information...`),await u.writeMeta(s.conf.meta),await u.finish(),t.refresh&&await c.updateIfNeeded()}),n}function Sr(e){let r=new t.Command(`check`).description(`Check block(s) against the canonical structure (read-only). Exits non-zero if any diff would land — used as the CI gate.`);return r.argument(`[paths...]`,`block path(s); defaults to the current directory`),r.option(`--sdk-internal`,`block(s) live inside the SDK monorepo; skip root-scope rules`),r.action(async(t,r)=>{let i=new a.ConsoleLoggerAdapter,o=t.length>0?t:[`.`],s=n.default.join(e,`src`,`structure`,`templates`),c=!1;for(let e of o){let t=await dr({blockPath:e,isSdkInternal:!!r.sdkInternal,updateDepsOnly:!1,mode:`check`,templatesRoot:s,log:e=>i.info(e)});i.info(fr(e,t.changes)),t.changes.length>0&&(c=!0)}if(c)throw Error("Structure check failed: one or more blocks are out of date. Run `structure refresh`.")}),r}var Q=[`python`],Cr=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 Cr(t);return r()}async function wr(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 Tr(e){let t=e.vars,n=Gt(t),r=new ie(e.blockPath),i=new ae(e.templatesRoot),a=Kt({blockVars:t,modules:n,isSdkInternal:!1,version:1,dryRun:!1}),o=X.filter(pn),s,c;try{s=await mn(o),c=await gn(bn)}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 It(lr,r,a,{templates:i,initMode:!0,registryLookup:s,derivedPinLookup:c}),e.log(`Initialised block '${t.facadeName}'${t.softwarePlatform?` (software: ${t.softwarePlatform})`:` (no software)`} at ${e.blockPath}`),t}function Er(e){let r=new t.Command(`init`).description(`Scaffold a fresh Platforma block from the canonical structure. Missing flags are prompted unless --non-interactive.`);return r.argument(`[path]`,`target directory (default: <short-name> under the current directory)`),r.option(`--npm-org <org>`,`npm org, e.g. @platforma-open`),r.option(`--org-scope <scope>`,`org scope, e.g. my-org`),r.option(`--short-name <name>`,`block short name, e.g. mixcr-clonotyping`),r.option(`--with-software`,`include a software module`),r.option(`--no-software`,`omit the software module`),r.addOption(new t.Option(`--platform <platform>`,`software platform (single-valued)`).choices([...Q])),r.option(`--non-interactive`,`error on any missing flag instead of prompting`),r.action(async(t,r)=>{let i=new a.ConsoleLoggerAdapter,o=r.withSoftware===!0,s=r.software===!1;if(o&&s)throw Error(`--with-software and --no-software are mutually exclusive.`);let c=o?!0:s?!1:void 0,l=await wr({npmOrg:r.npmOrg,orgScope:r.orgScope,shortName:r.shortName,withSoftware:c,platform:r.platform,nonInteractive:r.nonInteractive});await Tr({vars:l,blockPath:t?n.default.resolve(t):n.default.resolve(process.cwd(),l.shortName),templatesRoot:n.default.join(e,`src`,`structure`,`templates`),log:e=>i.info(e)})}),r}function Dr(e=process.cwd()){let n=new t.Command;n.name(`block-tools`).description(`Utility to manipulate Platforma Blocks and Block Registry`),n.addCommand(l()),n.addCommand(d()),n.addCommand(ee()),n.addCommand(te()),n.addCommand(ne()),n.addCommand(re()),n.addCommand(hr(e)),n.addCommand(gr()),n.addCommand(_r()),n.addCommand(xr());let r=new t.Command(`structure`).description(`Manage block scaffolding against the canonical structure (check / init / refresh)`);return r.addCommand(Sr(e)),r.addCommand(Er(e)),r.addCommand(mr(e)),n.addCommand(r),n}async function Or(e,t){await Dr(t).parseAsync(e)}exports.buildProgram=Dr,exports.run=Or;
24
24
  //# sourceMappingURL=cli.js.map