@pixpilot/scaffoldfy 0.34.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- const e=require(`./chunk-DjWAcSYV.cjs`);require(`./config-DlJs75hK.cjs`);const t=require(`./utils-Bz23aLK_.cjs`),n=require(`./run-tasks-CSR8df5O.cjs`);require(`./validate-scaffoldfy-json-Dkaz9ueq.cjs`),require(`./scaffoldfy-config-json-validator-CpEXHRsI.cjs`);const r=require(`./src-IYqxnNOO.cjs`);let i=require(`node:fs`);i=e.t(i);let a=require(`node:path`);a=e.t(a);let o=require(`node:process`);o=e.t(o);let s=require(`commander`);s=e.t(s);let c=require(`node:url`);c=e.t(c);let l=require(`ajv`);l=e.t(l);const u=1,d=(0,c.fileURLToPath)(require(`url`).pathToFileURL(__filename).href),f=a.default.dirname(d);function p(){return new l.default({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function m(){let e=a.default.join(f,`..`,`schema`,`scaffoldfy.schema.json`);try{let t=i.default.readFileSync(e,`utf-8`);return JSON.parse(t)}catch(t){throw Error(`Failed to load tasks schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function h(e){return e.filter(t=>{if(t.keyword===`oneOf`){let e=t.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}if(t.keyword===`required`){let n=e.find(e=>e.keyword===`oneOf`&&e.instancePath===t.instancePath);if(n){let e=n.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}}return!0}).map(e=>{let t=e.instancePath||`root`,n=e.message??`Unknown error`;switch(e.keyword){case`required`:return`${t}: Missing required property "${String(e.params.missingProperty??`unknown`)}"`;case`type`:return`${t}: Expected type "${String(e.params.type??`unknown`)}", received "${typeof e.data}"`;case`enum`:{let r=e.params.allowedValues;return`${t}: ${n}. Allowed values: ${Array.isArray(r)?r.join(`, `):String(r)}`}case`pattern`:{let{pattern:r}=e.params;return`${t}: ${n}. Value must match pattern: ${String(r)}`}case`oneOf`:return`${t}: ${n}. Configuration must match exactly one of the allowed schemas`;case`additionalProperties`:return`${t}: ${n}. Unknown property: "${String(e.params.additionalProperty??`unknown`)}"`;default:return`${t}: ${n}`}})}function g(e,n={}){try{let t=p(),r=m(),i=t.compile(r);if(!i(e)&&i.errors){let e=h(i.errors);return e.length===0?{valid:!0,errors:[]}:(n.silent||_(e),{valid:!1,errors:e})}return{valid:!0,errors:[]}}catch(e){let r=e instanceof Error?e.message:`Unknown error occurred during schema validation`;return n.silent||(t.a(`❌ Schema validation error:`,`error`),t.a(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function _(e){t.a(`❌ Schema validation failed:`,`error`),t.a(``,`error`),t.a(`The following validation errors were found:`,`error`),t.a(``,`error`);for(let n of e)t.a(` • ${n}`,`error`);t.a(``,`error`),t.a(`Please fix these errors in your template configuration file.`,`error`),t.a(``,`error`),t.a(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const v=new s.Command,y=a.default.join(__dirname,`..`,`package.json`);let b=`0.0.0`;try{b=JSON.parse(i.default.readFileSync(y,`utf-8`)).version??`0.0.0`}catch{}v.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(b),v.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--config <path>`,`Path to task configuration file (JSON or TypeScript)`,`./template-tasks.json`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).option(`--debug`,`Enable debug logging for verbose output`).action(async e=>{e.debug===!0&&t.p(!0);try{let s=[],c,l,u,d,f;if(e.config!=null&&e.config!==``){let r=a.default.resolve(o.default.cwd(),e.config);if(i.default.existsSync(r))if(f=r,r.endsWith(`.ts`)||r.endsWith(`.mts`)){t.a(`Loading tasks from TypeScript file: ${e.config}`,`info`);try{let e=await import(r);s=e.default??e.tasks??[],(!Array.isArray(s)||s.length===0)&&(t.a(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),t.a(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(n){t.a(`Failed to load TypeScript config file: ${e.config}`,`error`),n instanceof Error&&t.a(` Error: ${n.message}`,`error`),o.default.exit(1)}}else try{if(e.validate!==!1){t.d(`Validating task configuration against schema...`);let e=i.default.readFileSync(r,`utf-8`);g(JSON.parse(e),{silent:!1}).valid||(t.a(``,`error`),t.a(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),o.default.exit(1)),t.a(`Configuration validated`,`success`)}let a=await n.q(r,{sequential:!0});if(a.templates!=null&&a.templates.length>0){let{runTemplatesSequentially:t}=await Promise.resolve().then(()=>require(`./run-tasks-CcH22QWc.cjs`)),{createInitialConfig:n}=await Promise.resolve().then(()=>require(`./config-DmK0Erv2.cjs`));await t(a.templates,{dryRun:e.dryRun??!1,force:e.force??!1,tasksFilePath:r},n()),o.default.exit(0)}s=a.tasks,c=a.variables,l=a.prompts,u=a.enabled,d=a.transformers,Array.isArray(s)||(t.a(`❌ Invalid config file format`,`error`),t.a(`Expected JSON with { "tasks": [...] } structure`,`info`),o.default.exit(1))}catch(n){t.a(`Failed to load JSON config file: ${e.config}`,`error`),n instanceof Error&&t.a(` Error: ${n.message}`,`error`),o.default.exit(1)}else t.a(`Config file not found: ${e.config}`,`warn`)}let p=l!=null&&l.length>0||c!=null&&c.length>0;s.length===0&&!p&&(t.a(`❌ No tasks defined`,`error`),t.a(`Please provide tasks using one of these methods:`,`info`),t.a(` 1. Create a template-tasks.json file in the current directory`,`info`),t.a(` 2. Create a template-tasks.ts file in the current directory`,`info`),t.a(` 3. Use --config option to specify a different config file`,`info`),t.a(`Example JSON structure:`,`info`),console.log(JSON.stringify({tasks:[{id:`update-package`,name:`Update package.json`,description:`Update package.json with repository information`,required:!0,enabled:!0,type:`update-json`,prompts:[{id:`projectName`,type:`input`,message:`What is your project name?`,default:`my-project`,required:!0},{id:`includeTests`,type:`confirm`,message:`Include test files?`,default:!0}],config:{file:`package.json`,updates:{name:`{{projectName}}`,author:`{{author}}`}}}]},null,2)),o.default.exit(1)),s.length===0?t.a(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):t.a(`Loaded ${s.length} task(s)`,`success`),await r.n(s,{dryRun:e.dryRun,force:e.force,tasksFilePath:f,variables:c,prompts:l,templateEnabled:u,transformers:d})}catch(e){if(t.a(`❌ CLI execution failed`,`error`),e instanceof Error){t.a(`Error: ${e.message}`,`error`);let n=o.default.env.DEBUG;n!=null&&n!==``&&console.error(e.stack)}else console.error(e);o.default.exit(1)}}),v.parse(o.default.argv);
2
+ const e=require(`./chunk-DjWAcSYV.cjs`);require(`./config-DlJs75hK.cjs`);const t=require(`./utils-Bz23aLK_.cjs`),n=require(`./run-tasks-BnqvtWj4.cjs`);require(`./validate-scaffoldfy-json-Dkaz9ueq.cjs`),require(`./scaffoldfy-config-json-validator-CpEXHRsI.cjs`);const r=require(`./src-CboZxzVI.cjs`);let i=require(`node:fs`);i=e.t(i);let a=require(`node:path`);a=e.t(a);let o=require(`node:process`);o=e.t(o);let s=require(`commander`);s=e.t(s);let c=require(`node:url`);c=e.t(c);let l=require(`ajv`);l=e.t(l);const u=1,d=(0,c.fileURLToPath)(require(`url`).pathToFileURL(__filename).href),f=a.default.dirname(d);function p(){return new l.default({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function m(){let e=a.default.join(f,`..`,`schema`,`scaffoldfy.schema.json`);try{let t=i.default.readFileSync(e,`utf-8`);return JSON.parse(t)}catch(t){throw Error(`Failed to load tasks schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function h(e){return e.filter(t=>{if(t.keyword===`oneOf`){let e=t.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}if(t.keyword===`required`){let n=e.find(e=>e.keyword===`oneOf`&&e.instancePath===t.instancePath);if(n){let e=n.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}}return!0}).map(e=>{let t=e.instancePath||`root`,n=e.message??`Unknown error`;switch(e.keyword){case`required`:return`${t}: Missing required property "${String(e.params.missingProperty??`unknown`)}"`;case`type`:return`${t}: Expected type "${String(e.params.type??`unknown`)}", received "${typeof e.data}"`;case`enum`:{let r=e.params.allowedValues;return`${t}: ${n}. Allowed values: ${Array.isArray(r)?r.join(`, `):String(r)}`}case`pattern`:{let{pattern:r}=e.params;return`${t}: ${n}. Value must match pattern: ${String(r)}`}case`oneOf`:return`${t}: ${n}. Configuration must match exactly one of the allowed schemas`;case`additionalProperties`:return`${t}: ${n}. Unknown property: "${String(e.params.additionalProperty??`unknown`)}"`;default:return`${t}: ${n}`}})}function g(e,n={}){try{let t=p(),r=m(),i=t.compile(r);if(!i(e)&&i.errors){let e=h(i.errors);return e.length===0?{valid:!0,errors:[]}:(n.silent||_(e),{valid:!1,errors:e})}return{valid:!0,errors:[]}}catch(e){let r=e instanceof Error?e.message:`Unknown error occurred during schema validation`;return n.silent||(t.a(`❌ Schema validation error:`,`error`),t.a(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function _(e){t.a(`❌ Schema validation failed:`,`error`),t.a(``,`error`),t.a(`The following validation errors were found:`,`error`),t.a(``,`error`);for(let n of e)t.a(` • ${n}`,`error`);t.a(``,`error`),t.a(`Please fix these errors in your template configuration file.`,`error`),t.a(``,`error`),t.a(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const v=new s.Command,y=a.default.join(__dirname,`..`,`package.json`);let b=`0.0.0`;try{b=JSON.parse(i.default.readFileSync(y,`utf-8`)).version??`0.0.0`}catch{}v.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(b),v.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--config <path>`,`Path to task configuration file (JSON or TypeScript)`,`./template-tasks.json`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).option(`--debug`,`Enable debug logging for verbose output`).action(async e=>{e.debug===!0&&t.p(!0);try{let s=[],c,l,u,d,f;if(e.config!=null&&e.config!==``){let r=a.default.resolve(o.default.cwd(),e.config);if(i.default.existsSync(r))if(f=r,r.endsWith(`.ts`)||r.endsWith(`.mts`)){t.a(`Loading tasks from TypeScript file: ${e.config}`,`info`);try{let e=await import(r);s=e.default??e.tasks??[],(!Array.isArray(s)||s.length===0)&&(t.a(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),t.a(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(n){t.a(`Failed to load TypeScript config file: ${e.config}`,`error`),n instanceof Error&&t.a(` Error: ${n.message}`,`error`),o.default.exit(1)}}else try{if(e.validate!==!1){t.d(`Validating task configuration against schema...`);let e=i.default.readFileSync(r,`utf-8`);g(JSON.parse(e),{silent:!1}).valid||(t.a(``,`error`),t.a(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),o.default.exit(1)),t.a(`Configuration validated`,`success`)}let a=await n.q(r,{sequential:!0});if(a.templates!=null&&a.templates.length>0){let{runTemplatesSequentially:t}=await Promise.resolve().then(()=>require(`./run-tasks-Bjza7ZeL.cjs`)),{createInitialConfig:n}=await Promise.resolve().then(()=>require(`./config-DmK0Erv2.cjs`));await t(a.templates,{dryRun:e.dryRun??!1,force:e.force??!1,tasksFilePath:r},n()),o.default.exit(0)}s=a.tasks,c=a.variables,l=a.prompts,u=a.enabled,d=a.transformers,Array.isArray(s)||(t.a(`❌ Invalid config file format`,`error`),t.a(`Expected JSON with { "tasks": [...] } structure`,`info`),o.default.exit(1))}catch(n){t.a(`Failed to load JSON config file: ${e.config}`,`error`),n instanceof Error&&t.a(` Error: ${n.message}`,`error`),o.default.exit(1)}else t.a(`Config file not found: ${e.config}`,`warn`)}let p=l!=null&&l.length>0||c!=null&&c.length>0;s.length===0&&!p&&(t.a(`❌ No tasks defined`,`error`),t.a(`Please provide tasks using one of these methods:`,`info`),t.a(` 1. Create a template-tasks.json file in the current directory`,`info`),t.a(` 2. Create a template-tasks.ts file in the current directory`,`info`),t.a(` 3. Use --config option to specify a different config file`,`info`),t.a(`Example JSON structure:`,`info`),console.log(JSON.stringify({tasks:[{id:`update-package`,name:`Update package.json`,description:`Update package.json with repository information`,required:!0,enabled:!0,type:`update-json`,prompts:[{id:`projectName`,type:`input`,message:`What is your project name?`,default:`my-project`,required:!0},{id:`includeTests`,type:`confirm`,message:`Include test files?`,default:!0}],config:{file:`package.json`,updates:{name:`{{projectName}}`,author:`{{author}}`}}}]},null,2)),o.default.exit(1)),s.length===0?t.a(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):t.a(`Loaded ${s.length} task(s)`,`success`),await r.n(s,{dryRun:e.dryRun,force:e.force,tasksFilePath:f,variables:c,prompts:l,templateEnabled:u,transformers:d})}catch(e){if(t.a(`❌ CLI execution failed`,`error`),e instanceof Error){t.a(`Error: ${e.message}`,`error`);let n=o.default.env.DEBUG;n!=null&&n!==``&&console.error(e.stack)}else console.error(e);o.default.exit(1)}}),v.parse(o.default.argv);
package/dist/cli.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import"./config-DfRbCqsT.js";import{a as e,d as t,p as n}from"./utils-CrJkuEEG.js";import{q as r}from"./run-tasks-BsR0t7C5.js";import"./validate-scaffoldfy-json-Cfq-nQjy.js";import"./scaffoldfy-config-json-validator-DP8-e4Yy.js";import{n as i}from"./src-CaQ2gXYF.js";import a from"node:path";import{fileURLToPath as o}from"node:url";import s from"node:fs";import c from"node:process";import{Command as l}from"commander";import u from"ajv";const d=()=>o(import.meta.url),f=(()=>a.dirname(d()))(),p=o(import.meta.url),m=a.dirname(p);function h(){return new u({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function g(){let e=a.join(m,`..`,`schema`,`scaffoldfy.schema.json`);try{let t=s.readFileSync(e,`utf-8`);return JSON.parse(t)}catch(t){throw Error(`Failed to load tasks schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function _(e){return e.filter(t=>{if(t.keyword===`oneOf`){let e=t.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}if(t.keyword===`required`){let n=e.find(e=>e.keyword===`oneOf`&&e.instancePath===t.instancePath);if(n){let e=n.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}}return!0}).map(e=>{let t=e.instancePath||`root`,n=e.message??`Unknown error`;switch(e.keyword){case`required`:return`${t}: Missing required property "${String(e.params.missingProperty??`unknown`)}"`;case`type`:return`${t}: Expected type "${String(e.params.type??`unknown`)}", received "${typeof e.data}"`;case`enum`:{let r=e.params.allowedValues;return`${t}: ${n}. Allowed values: ${Array.isArray(r)?r.join(`, `):String(r)}`}case`pattern`:{let{pattern:r}=e.params;return`${t}: ${n}. Value must match pattern: ${String(r)}`}case`oneOf`:return`${t}: ${n}. Configuration must match exactly one of the allowed schemas`;case`additionalProperties`:return`${t}: ${n}. Unknown property: "${String(e.params.additionalProperty??`unknown`)}"`;default:return`${t}: ${n}`}})}function v(t,n={}){try{let e=h(),r=g(),i=e.compile(r);if(!i(t)&&i.errors){let e=_(i.errors);return e.length===0?{valid:!0,errors:[]}:(n.silent||y(e),{valid:!1,errors:e})}return{valid:!0,errors:[]}}catch(t){let r=t instanceof Error?t.message:`Unknown error occurred during schema validation`;return n.silent||(e(`❌ Schema validation error:`,`error`),e(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function y(t){e(`❌ Schema validation failed:`,`error`),e(``,`error`),e(`The following validation errors were found:`,`error`),e(``,`error`);for(let n of t)e(` • ${n}`,`error`);e(``,`error`),e(`Please fix these errors in your template configuration file.`,`error`),e(``,`error`),e(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const b=new l,x=a.join(f,`..`,`package.json`);let S=`0.0.0`;try{S=JSON.parse(s.readFileSync(x,`utf-8`)).version??`0.0.0`}catch{}b.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(S),b.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--config <path>`,`Path to task configuration file (JSON or TypeScript)`,`./template-tasks.json`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).option(`--debug`,`Enable debug logging for verbose output`).action(async o=>{o.debug===!0&&n(!0);try{let n=[],l,u,d,f,p;if(o.config!=null&&o.config!==``){let i=a.resolve(c.cwd(),o.config);if(s.existsSync(i))if(p=i,i.endsWith(`.ts`)||i.endsWith(`.mts`)){e(`Loading tasks from TypeScript file: ${o.config}`,`info`);try{let t=await import(i);n=t.default??t.tasks??[],(!Array.isArray(n)||n.length===0)&&(e(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),e(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(t){e(`Failed to load TypeScript config file: ${o.config}`,`error`),t instanceof Error&&e(` Error: ${t.message}`,`error`),c.exit(1)}}else try{if(o.validate!==!1){t(`Validating task configuration against schema...`);let n=s.readFileSync(i,`utf-8`);v(JSON.parse(n),{silent:!1}).valid||(e(``,`error`),e(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),c.exit(1)),e(`Configuration validated`,`success`)}let a=await r(i,{sequential:!0});if(a.templates!=null&&a.templates.length>0){let{runTemplatesSequentially:e}=await import(`./run-tasks-A6tQe8q1.js`),{createInitialConfig:t}=await import(`./config-C8hh88Lc.js`);await e(a.templates,{dryRun:o.dryRun??!1,force:o.force??!1,tasksFilePath:i},t()),c.exit(0)}n=a.tasks,l=a.variables,u=a.prompts,d=a.enabled,f=a.transformers,Array.isArray(n)||(e(`❌ Invalid config file format`,`error`),e(`Expected JSON with { "tasks": [...] } structure`,`info`),c.exit(1))}catch(t){e(`Failed to load JSON config file: ${o.config}`,`error`),t instanceof Error&&e(` Error: ${t.message}`,`error`),c.exit(1)}else e(`Config file not found: ${o.config}`,`warn`)}let m=u!=null&&u.length>0||l!=null&&l.length>0;n.length===0&&!m&&(e(`❌ No tasks defined`,`error`),e(`Please provide tasks using one of these methods:`,`info`),e(` 1. Create a template-tasks.json file in the current directory`,`info`),e(` 2. Create a template-tasks.ts file in the current directory`,`info`),e(` 3. Use --config option to specify a different config file`,`info`),e(`Example JSON structure:`,`info`),console.log(JSON.stringify({tasks:[{id:`update-package`,name:`Update package.json`,description:`Update package.json with repository information`,required:!0,enabled:!0,type:`update-json`,prompts:[{id:`projectName`,type:`input`,message:`What is your project name?`,default:`my-project`,required:!0},{id:`includeTests`,type:`confirm`,message:`Include test files?`,default:!0}],config:{file:`package.json`,updates:{name:`{{projectName}}`,author:`{{author}}`}}}]},null,2)),c.exit(1)),n.length===0?e(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):e(`Loaded ${n.length} task(s)`,`success`),await i(n,{dryRun:o.dryRun,force:o.force,tasksFilePath:p,variables:l,prompts:u,templateEnabled:d,transformers:f})}catch(t){if(e(`❌ CLI execution failed`,`error`),t instanceof Error){e(`Error: ${t.message}`,`error`);let n=c.env.DEBUG;n!=null&&n!==``&&console.error(t.stack)}else console.error(t);c.exit(1)}}),b.parse(c.argv);export{};
2
+ import"./config-DfRbCqsT.js";import{a as e,d as t,p as n}from"./utils-CrJkuEEG.js";import{q as r}from"./run-tasks-CEs2FBaf.js";import"./validate-scaffoldfy-json-Cfq-nQjy.js";import"./scaffoldfy-config-json-validator-DP8-e4Yy.js";import{n as i}from"./src-TOw75kLW.js";import a from"node:path";import{fileURLToPath as o}from"node:url";import s from"node:fs";import c from"node:process";import{Command as l}from"commander";import u from"ajv";const d=()=>o(import.meta.url),f=(()=>a.dirname(d()))(),p=o(import.meta.url),m=a.dirname(p);function h(){return new u({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function g(){let e=a.join(m,`..`,`schema`,`scaffoldfy.schema.json`);try{let t=s.readFileSync(e,`utf-8`);return JSON.parse(t)}catch(t){throw Error(`Failed to load tasks schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function _(e){return e.filter(t=>{if(t.keyword===`oneOf`){let e=t.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}if(t.keyword===`required`){let n=e.find(e=>e.keyword===`oneOf`&&e.instancePath===t.instancePath);if(n){let e=n.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}}return!0}).map(e=>{let t=e.instancePath||`root`,n=e.message??`Unknown error`;switch(e.keyword){case`required`:return`${t}: Missing required property "${String(e.params.missingProperty??`unknown`)}"`;case`type`:return`${t}: Expected type "${String(e.params.type??`unknown`)}", received "${typeof e.data}"`;case`enum`:{let r=e.params.allowedValues;return`${t}: ${n}. Allowed values: ${Array.isArray(r)?r.join(`, `):String(r)}`}case`pattern`:{let{pattern:r}=e.params;return`${t}: ${n}. Value must match pattern: ${String(r)}`}case`oneOf`:return`${t}: ${n}. Configuration must match exactly one of the allowed schemas`;case`additionalProperties`:return`${t}: ${n}. Unknown property: "${String(e.params.additionalProperty??`unknown`)}"`;default:return`${t}: ${n}`}})}function v(t,n={}){try{let e=h(),r=g(),i=e.compile(r);if(!i(t)&&i.errors){let e=_(i.errors);return e.length===0?{valid:!0,errors:[]}:(n.silent||y(e),{valid:!1,errors:e})}return{valid:!0,errors:[]}}catch(t){let r=t instanceof Error?t.message:`Unknown error occurred during schema validation`;return n.silent||(e(`❌ Schema validation error:`,`error`),e(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function y(t){e(`❌ Schema validation failed:`,`error`),e(``,`error`),e(`The following validation errors were found:`,`error`),e(``,`error`);for(let n of t)e(` • ${n}`,`error`);e(``,`error`),e(`Please fix these errors in your template configuration file.`,`error`),e(``,`error`),e(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const b=new l,x=a.join(f,`..`,`package.json`);let S=`0.0.0`;try{S=JSON.parse(s.readFileSync(x,`utf-8`)).version??`0.0.0`}catch{}b.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(S),b.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--config <path>`,`Path to task configuration file (JSON or TypeScript)`,`./template-tasks.json`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).option(`--debug`,`Enable debug logging for verbose output`).action(async o=>{o.debug===!0&&n(!0);try{let n=[],l,u,d,f,p;if(o.config!=null&&o.config!==``){let i=a.resolve(c.cwd(),o.config);if(s.existsSync(i))if(p=i,i.endsWith(`.ts`)||i.endsWith(`.mts`)){e(`Loading tasks from TypeScript file: ${o.config}`,`info`);try{let t=await import(i);n=t.default??t.tasks??[],(!Array.isArray(n)||n.length===0)&&(e(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),e(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(t){e(`Failed to load TypeScript config file: ${o.config}`,`error`),t instanceof Error&&e(` Error: ${t.message}`,`error`),c.exit(1)}}else try{if(o.validate!==!1){t(`Validating task configuration against schema...`);let n=s.readFileSync(i,`utf-8`);v(JSON.parse(n),{silent:!1}).valid||(e(``,`error`),e(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),c.exit(1)),e(`Configuration validated`,`success`)}let a=await r(i,{sequential:!0});if(a.templates!=null&&a.templates.length>0){let{runTemplatesSequentially:e}=await import(`./run-tasks-BqgVj4rO.js`),{createInitialConfig:t}=await import(`./config-C8hh88Lc.js`);await e(a.templates,{dryRun:o.dryRun??!1,force:o.force??!1,tasksFilePath:i},t()),c.exit(0)}n=a.tasks,l=a.variables,u=a.prompts,d=a.enabled,f=a.transformers,Array.isArray(n)||(e(`❌ Invalid config file format`,`error`),e(`Expected JSON with { "tasks": [...] } structure`,`info`),c.exit(1))}catch(t){e(`Failed to load JSON config file: ${o.config}`,`error`),t instanceof Error&&e(` Error: ${t.message}`,`error`),c.exit(1)}else e(`Config file not found: ${o.config}`,`warn`)}let m=u!=null&&u.length>0||l!=null&&l.length>0;n.length===0&&!m&&(e(`❌ No tasks defined`,`error`),e(`Please provide tasks using one of these methods:`,`info`),e(` 1. Create a template-tasks.json file in the current directory`,`info`),e(` 2. Create a template-tasks.ts file in the current directory`,`info`),e(` 3. Use --config option to specify a different config file`,`info`),e(`Example JSON structure:`,`info`),console.log(JSON.stringify({tasks:[{id:`update-package`,name:`Update package.json`,description:`Update package.json with repository information`,required:!0,enabled:!0,type:`update-json`,prompts:[{id:`projectName`,type:`input`,message:`What is your project name?`,default:`my-project`,required:!0},{id:`includeTests`,type:`confirm`,message:`Include test files?`,default:!0}],config:{file:`package.json`,updates:{name:`{{projectName}}`,author:`{{author}}`}}}]},null,2)),c.exit(1)),n.length===0?e(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):e(`Loaded ${n.length} task(s)`,`success`),await i(n,{dryRun:o.dryRun,force:o.force,tasksFilePath:p,variables:l,prompts:u,templateEnabled:d,transformers:f})}catch(t){if(e(`❌ CLI execution failed`,`error`),t instanceof Error){e(`Error: ${t.message}`,`error`);let n=c.env.DEBUG;n!=null&&n!==``&&console.error(t.stack)}else console.error(t);c.exit(1)}}),b.parse(c.argv);export{};
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- require(`./config-DlJs75hK.cjs`);const e=require(`./utils-Bz23aLK_.cjs`),t=require(`./run-tasks-CSR8df5O.cjs`),n=require(`./validate-scaffoldfy-json-Dkaz9ueq.cjs`);require(`./scaffoldfy-config-json-validator-CpEXHRsI.cjs`);const r=require(`./src-IYqxnNOO.cjs`);exports.callHook=t.h,exports.clearPlugins=t.g,exports.clearTemplateCache=t.G,exports.collectPrompts=t.p,exports.collectVariables=t.o,exports.createTaskPlugin=t._,exports.displayTasksDiff=t.O,exports.evaluateCondition=e.t,exports.executePluginTask=t.v,exports.executeTask=t.c,exports.getCreateDiff=t.k,exports.getDeleteDiff=t.A,exports.getExecDiff=t.j,exports.getGitInitDiff=t.M,exports.getGitRepoInfo=e.n,exports.getPlugin=t.y,exports.getPluginForTaskType=t.b,exports.getPluginTaskDiff=t.x,exports.getRegexReplaceDiff=t.N,exports.getRenameDiff=t.P,exports.getReplaceInFileDiff=t.F,exports.getTaskDiff=t.I,exports.getTemplateSourceDescription=t.z,exports.getUpdateJsonDiff=t.L,exports.getWriteDiff=t.R,exports.hasInlineTemplate=t.B,exports.hasTemplateFile=t.V,exports.interpolateTemplate=e.i,exports.isPluginTaskType=t.S,exports.listPlugins=t.C,exports.loadAndMergeTemplate=t.K,exports.loadTasksWithInheritance=t.q,exports.loadTemplate=t.J,exports.loadTemplatesInOrder=t.Y,exports.log=e.a,exports.main=r.t,exports.mergeTemplates=t.X,exports.processTemplate=t.H,exports.prompt=e.o,exports.promptYesNo=e.s,exports.registerBuiltInPlugins=t.l,exports.registerHooks=t.w,exports.registerPlugin=t.T,exports.resolveAllDefaultValues=t.f,exports.resolveAllVariableValues=t.i,exports.resolveDefaultValue=t.m,exports.resolveVariableValue=t.a,exports.runTask=t.u,exports.runTasks=t.t,exports.runTemplatesSequentially=t.n,exports.runWithTasks=r.n,exports.setNestedProperty=e.c,exports.shouldUseHandlebars=t.U,exports.topologicalSort=t.s,exports.unregisterPlugin=t.E,exports.validatePluginTask=t.D,exports.validatePrompts=t.d,exports.validateScaffoldfyJsonFile=n.t,exports.validateTemplateConfig=t.W,exports.validateVariables=t.r;
1
+ require(`./config-DlJs75hK.cjs`);const e=require(`./utils-Bz23aLK_.cjs`),t=require(`./run-tasks-BnqvtWj4.cjs`),n=require(`./validate-scaffoldfy-json-Dkaz9ueq.cjs`);require(`./scaffoldfy-config-json-validator-CpEXHRsI.cjs`);const r=require(`./src-CboZxzVI.cjs`);exports.callHook=t.h,exports.clearPlugins=t.g,exports.clearTemplateCache=t.G,exports.collectPrompts=t.p,exports.collectVariables=t.o,exports.createTaskPlugin=t._,exports.displayTasksDiff=t.O,exports.evaluateCondition=e.t,exports.executePluginTask=t.v,exports.executeTask=t.c,exports.getCreateDiff=t.k,exports.getDeleteDiff=t.A,exports.getExecDiff=t.j,exports.getGitInitDiff=t.M,exports.getGitRepoInfo=e.n,exports.getPlugin=t.y,exports.getPluginForTaskType=t.b,exports.getPluginTaskDiff=t.x,exports.getRegexReplaceDiff=t.N,exports.getRenameDiff=t.P,exports.getReplaceInFileDiff=t.F,exports.getTaskDiff=t.I,exports.getTemplateSourceDescription=t.z,exports.getUpdateJsonDiff=t.L,exports.getWriteDiff=t.R,exports.hasInlineTemplate=t.B,exports.hasTemplateFile=t.V,exports.interpolateTemplate=e.i,exports.isPluginTaskType=t.S,exports.listPlugins=t.C,exports.loadAndMergeTemplate=t.K,exports.loadTasksWithInheritance=t.q,exports.loadTemplate=t.J,exports.loadTemplatesInOrder=t.Y,exports.log=e.a,exports.main=r.t,exports.mergeTemplates=t.X,exports.processTemplate=t.H,exports.prompt=e.o,exports.promptYesNo=e.s,exports.registerBuiltInPlugins=t.l,exports.registerHooks=t.w,exports.registerPlugin=t.T,exports.resolveAllDefaultValues=t.f,exports.resolveAllVariableValues=t.i,exports.resolveDefaultValue=t.m,exports.resolveVariableValue=t.a,exports.runTask=t.u,exports.runTasks=t.t,exports.runTemplatesSequentially=t.n,exports.runWithTasks=r.n,exports.setNestedProperty=e.c,exports.shouldUseHandlebars=t.U,exports.topologicalSort=t.s,exports.unregisterPlugin=t.E,exports.validatePluginTask=t.D,exports.validatePrompts=t.d,exports.validateScaffoldfyJsonFile=n.t,exports.validateTemplateConfig=t.W,exports.validateVariables=t.r;
package/dist/index.d.cts CHANGED
@@ -185,8 +185,9 @@ type PromptType = 'input' | 'select' | 'confirm' | 'password' | 'number';
185
185
  * - 'exec': Execute a command to get the value dynamically
186
186
  * - 'conditional': Choose value based on a condition
187
187
  * - 'interpolate': Reference string with {{variable}} placeholders that will be interpolated with previously resolved prompts/variables
188
+ * - 'exec-file': Execute a script file to get the value dynamically
188
189
  */
189
- type DefaultValueType = 'static' | 'exec' | 'conditional' | 'interpolate';
190
+ type DefaultValueType = 'static' | 'exec' | 'conditional' | 'interpolate' | 'exec-file';
190
191
  /**
191
192
  * Conditional default value configuration
192
193
  * Evaluates a condition and returns different values based on the result
@@ -197,6 +198,22 @@ interface ConditionalDefaultConfig<T = string | number | boolean> {
197
198
  ifTrue: T | DefaultValueConfig<T>;
198
199
  ifFalse: T | DefaultValueConfig<T>;
199
200
  }
201
+ /**
202
+ * Runtime environment for executing script files
203
+ */
204
+ type ExecFileRuntime = 'node' | 'bash' | 'sh' | 'pwsh' | 'powershell';
205
+ /**
206
+ * Exec-file default value configuration
207
+ * Executes a script file to get the value dynamically
208
+ */
209
+ interface ExecFileValueConfig {
210
+ type: 'exec-file';
211
+ file: string;
212
+ runtime?: ExecFileRuntime;
213
+ args?: string[];
214
+ parameters?: Record<string, string>;
215
+ cwd?: string;
216
+ }
200
217
  /**
201
218
  * Default value configuration for prompts
202
219
  */
@@ -211,8 +228,9 @@ interface DefaultValueConfig<T = string | number | boolean> {
211
228
  * - For explicit static values, use { type: 'static', value: yourValue }
212
229
  * - For conditional defaults, use { type: 'conditional', condition: 'expression', ifTrue: value, ifFalse: value }
213
230
  * - For interpolate strings, use { type: 'interpolate', value: '{{variable}}' } (will be interpolated with previously resolved prompts/variables)
231
+ * - For exec-file, use { type: 'exec-file', file: 'path/to/script.js', args: [...], parameters: {...} }
214
232
  */
215
- type DefaultValue<T = string | number | boolean> = T | DefaultValueConfig<T> | ConditionalDefaultConfig<T>;
233
+ type DefaultValue<T = string | number | boolean> = T | DefaultValueConfig<T> | ConditionalDefaultConfig<T> | ExecFileValueConfig;
216
234
  /**
217
235
  * Conditional enabled/required configuration with new structure
218
236
  * Evaluates a JavaScript expression at runtime
@@ -299,7 +317,7 @@ interface VariableDefinition {
299
317
  * @example "packageManager === 'pnpm'"
300
318
  */
301
319
  type ConditionExpression = string;
302
- type TaskType = 'update-json' | 'write' | 'create' | 'regex-replace' | 'replace-in-file' | 'delete' | 'rename' | 'git-init' | 'exec' | 'move' | 'copy' | 'append' | 'mkdir';
320
+ type TaskType = 'update-json' | 'write' | 'create' | 'regex-replace' | 'replace-in-file' | 'delete' | 'rename' | 'git-init' | 'exec' | 'exec-file' | 'move' | 'copy' | 'append' | 'mkdir';
303
321
  interface RollbackConfig {
304
322
  type: TaskType;
305
323
  config: unknown;
@@ -832,4 +850,4 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
832
850
  transformers?: Transformer[] | undefined;
833
851
  }): Promise<void>;
834
852
  //#endregion
835
- export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalConfig, ConditionalDefaultConfig, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, DynamicBooleanValue, EnabledValue, type ExecConfig, ExecutableConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type UpdateJsonConfig, VariableDefinition, type WriteConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, collectVariables, createTaskPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getCreateDiff, getDeleteDiff, getExecDiff, getGitInitDiff, getGitRepoInfo, getPlugin, getPluginForTaskType, getPluginTaskDiff, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getTemplateSourceDescription, getUpdateJsonDiff, getWriteDiff, hasInlineTemplate, hasTemplateFile, interpolateTemplate, isPluginTaskType, listPlugins, loadAndMergeTemplate, loadTasksWithInheritance, loadTemplate, loadTemplatesInOrder, log, main, mergeTemplates, processTemplate, prompt, promptYesNo, registerBuiltInPlugins, registerHooks, registerPlugin, resolveAllDefaultValues, resolveAllVariableValues, resolveDefaultValue, resolveVariableValue, runTask, runTasks, runTemplatesSequentially, runWithTasks, setNestedProperty, shouldUseHandlebars, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts, validateScaffoldfyJsonFile, validateTemplateConfig, validateVariables };
853
+ export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalConfig, ConditionalDefaultConfig, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, DynamicBooleanValue, EnabledValue, type ExecConfig, ExecFileRuntime, ExecFileValueConfig, ExecutableConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type UpdateJsonConfig, VariableDefinition, type WriteConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, collectVariables, createTaskPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getCreateDiff, getDeleteDiff, getExecDiff, getGitInitDiff, getGitRepoInfo, getPlugin, getPluginForTaskType, getPluginTaskDiff, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getTemplateSourceDescription, getUpdateJsonDiff, getWriteDiff, hasInlineTemplate, hasTemplateFile, interpolateTemplate, isPluginTaskType, listPlugins, loadAndMergeTemplate, loadTasksWithInheritance, loadTemplate, loadTemplatesInOrder, log, main, mergeTemplates, processTemplate, prompt, promptYesNo, registerBuiltInPlugins, registerHooks, registerPlugin, resolveAllDefaultValues, resolveAllVariableValues, resolveDefaultValue, resolveVariableValue, runTask, runTasks, runTemplatesSequentially, runWithTasks, setNestedProperty, shouldUseHandlebars, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts, validateScaffoldfyJsonFile, validateTemplateConfig, validateVariables };
package/dist/index.d.ts CHANGED
@@ -185,8 +185,9 @@ type PromptType = 'input' | 'select' | 'confirm' | 'password' | 'number';
185
185
  * - 'exec': Execute a command to get the value dynamically
186
186
  * - 'conditional': Choose value based on a condition
187
187
  * - 'interpolate': Reference string with {{variable}} placeholders that will be interpolated with previously resolved prompts/variables
188
+ * - 'exec-file': Execute a script file to get the value dynamically
188
189
  */
189
- type DefaultValueType = 'static' | 'exec' | 'conditional' | 'interpolate';
190
+ type DefaultValueType = 'static' | 'exec' | 'conditional' | 'interpolate' | 'exec-file';
190
191
  /**
191
192
  * Conditional default value configuration
192
193
  * Evaluates a condition and returns different values based on the result
@@ -197,6 +198,22 @@ interface ConditionalDefaultConfig<T = string | number | boolean> {
197
198
  ifTrue: T | DefaultValueConfig<T>;
198
199
  ifFalse: T | DefaultValueConfig<T>;
199
200
  }
201
+ /**
202
+ * Runtime environment for executing script files
203
+ */
204
+ type ExecFileRuntime = 'node' | 'bash' | 'sh' | 'pwsh' | 'powershell';
205
+ /**
206
+ * Exec-file default value configuration
207
+ * Executes a script file to get the value dynamically
208
+ */
209
+ interface ExecFileValueConfig {
210
+ type: 'exec-file';
211
+ file: string;
212
+ runtime?: ExecFileRuntime;
213
+ args?: string[];
214
+ parameters?: Record<string, string>;
215
+ cwd?: string;
216
+ }
200
217
  /**
201
218
  * Default value configuration for prompts
202
219
  */
@@ -211,8 +228,9 @@ interface DefaultValueConfig<T = string | number | boolean> {
211
228
  * - For explicit static values, use { type: 'static', value: yourValue }
212
229
  * - For conditional defaults, use { type: 'conditional', condition: 'expression', ifTrue: value, ifFalse: value }
213
230
  * - For interpolate strings, use { type: 'interpolate', value: '{{variable}}' } (will be interpolated with previously resolved prompts/variables)
231
+ * - For exec-file, use { type: 'exec-file', file: 'path/to/script.js', args: [...], parameters: {...} }
214
232
  */
215
- type DefaultValue<T = string | number | boolean> = T | DefaultValueConfig<T> | ConditionalDefaultConfig<T>;
233
+ type DefaultValue<T = string | number | boolean> = T | DefaultValueConfig<T> | ConditionalDefaultConfig<T> | ExecFileValueConfig;
216
234
  /**
217
235
  * Conditional enabled/required configuration with new structure
218
236
  * Evaluates a JavaScript expression at runtime
@@ -299,7 +317,7 @@ interface VariableDefinition {
299
317
  * @example "packageManager === 'pnpm'"
300
318
  */
301
319
  type ConditionExpression = string;
302
- type TaskType = 'update-json' | 'write' | 'create' | 'regex-replace' | 'replace-in-file' | 'delete' | 'rename' | 'git-init' | 'exec' | 'move' | 'copy' | 'append' | 'mkdir';
320
+ type TaskType = 'update-json' | 'write' | 'create' | 'regex-replace' | 'replace-in-file' | 'delete' | 'rename' | 'git-init' | 'exec' | 'exec-file' | 'move' | 'copy' | 'append' | 'mkdir';
303
321
  interface RollbackConfig {
304
322
  type: TaskType;
305
323
  config: unknown;
@@ -832,4 +850,4 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
832
850
  transformers?: Transformer[] | undefined;
833
851
  }): Promise<void>;
834
852
  //#endregion
835
- export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalConfig, ConditionalDefaultConfig, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, DynamicBooleanValue, EnabledValue, type ExecConfig, ExecutableConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type UpdateJsonConfig, VariableDefinition, type WriteConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, collectVariables, createTaskPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getCreateDiff, getDeleteDiff, getExecDiff, getGitInitDiff, getGitRepoInfo, getPlugin, getPluginForTaskType, getPluginTaskDiff, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getTemplateSourceDescription, getUpdateJsonDiff, getWriteDiff, hasInlineTemplate, hasTemplateFile, interpolateTemplate, isPluginTaskType, listPlugins, loadAndMergeTemplate, loadTasksWithInheritance, loadTemplate, loadTemplatesInOrder, log, main, mergeTemplates, processTemplate, prompt, promptYesNo, registerBuiltInPlugins, registerHooks, registerPlugin, resolveAllDefaultValues, resolveAllVariableValues, resolveDefaultValue, resolveVariableValue, runTask, runTasks, runTemplatesSequentially, runWithTasks, setNestedProperty, shouldUseHandlebars, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts, validateScaffoldfyJsonFile, validateTemplateConfig, validateVariables };
853
+ export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalConfig, ConditionalDefaultConfig, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, DynamicBooleanValue, EnabledValue, type ExecConfig, ExecFileRuntime, ExecFileValueConfig, ExecutableConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type UpdateJsonConfig, VariableDefinition, type WriteConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, collectVariables, createTaskPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getCreateDiff, getDeleteDiff, getExecDiff, getGitInitDiff, getGitRepoInfo, getPlugin, getPluginForTaskType, getPluginTaskDiff, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getTemplateSourceDescription, getUpdateJsonDiff, getWriteDiff, hasInlineTemplate, hasTemplateFile, interpolateTemplate, isPluginTaskType, listPlugins, loadAndMergeTemplate, loadTasksWithInheritance, loadTemplate, loadTemplatesInOrder, log, main, mergeTemplates, processTemplate, prompt, promptYesNo, registerBuiltInPlugins, registerHooks, registerPlugin, resolveAllDefaultValues, resolveAllVariableValues, resolveDefaultValue, resolveVariableValue, runTask, runTasks, runTemplatesSequentially, runWithTasks, setNestedProperty, shouldUseHandlebars, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts, validateScaffoldfyJsonFile, validateTemplateConfig, validateVariables };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import"./config-DfRbCqsT.js";import{a as e,c as t,i as n,n as r,o as i,s as a,t as o}from"./utils-CrJkuEEG.js";import{A as s,B as c,C as l,D as u,E as d,F as f,G as p,H as m,I as h,J as g,K as _,L as v,M as y,N as b,O as x,P as S,R as C,S as w,T,U as E,V as D,W as O,X as k,Y as A,_ as j,a as M,b as N,c as P,d as F,f as I,g as L,h as R,i as z,j as B,k as V,l as H,m as U,n as W,o as G,p as K,q,r as J,s as Y,t as X,u as Z,v as Q,w as $,x as ee,y as te,z as ne}from"./run-tasks-BsR0t7C5.js";import{t as re}from"./validate-scaffoldfy-json-Cfq-nQjy.js";import"./scaffoldfy-config-json-validator-DP8-e4Yy.js";import{n as ie,t as ae}from"./src-CaQ2gXYF.js";export{R as callHook,L as clearPlugins,p as clearTemplateCache,K as collectPrompts,G as collectVariables,j as createTaskPlugin,x as displayTasksDiff,o as evaluateCondition,Q as executePluginTask,P as executeTask,V as getCreateDiff,s as getDeleteDiff,B as getExecDiff,y as getGitInitDiff,r as getGitRepoInfo,te as getPlugin,N as getPluginForTaskType,ee as getPluginTaskDiff,b as getRegexReplaceDiff,S as getRenameDiff,f as getReplaceInFileDiff,h as getTaskDiff,ne as getTemplateSourceDescription,v as getUpdateJsonDiff,C as getWriteDiff,c as hasInlineTemplate,D as hasTemplateFile,n as interpolateTemplate,w as isPluginTaskType,l as listPlugins,_ as loadAndMergeTemplate,q as loadTasksWithInheritance,g as loadTemplate,A as loadTemplatesInOrder,e as log,ae as main,k as mergeTemplates,m as processTemplate,i as prompt,a as promptYesNo,H as registerBuiltInPlugins,$ as registerHooks,T as registerPlugin,I as resolveAllDefaultValues,z as resolveAllVariableValues,U as resolveDefaultValue,M as resolveVariableValue,Z as runTask,X as runTasks,W as runTemplatesSequentially,ie as runWithTasks,t as setNestedProperty,E as shouldUseHandlebars,Y as topologicalSort,d as unregisterPlugin,u as validatePluginTask,F as validatePrompts,re as validateScaffoldfyJsonFile,O as validateTemplateConfig,J as validateVariables};
1
+ import"./config-DfRbCqsT.js";import{a as e,c as t,i as n,n as r,o as i,s as a,t as o}from"./utils-CrJkuEEG.js";import{A as s,B as c,C as l,D as u,E as d,F as f,G as p,H as m,I as h,J as g,K as _,L as v,M as y,N as b,O as x,P as S,R as C,S as w,T,U as E,V as D,W as O,X as k,Y as A,_ as j,a as M,b as N,c as P,d as F,f as I,g as L,h as R,i as z,j as B,k as V,l as H,m as U,n as W,o as G,p as K,q,r as J,s as Y,t as X,u as Z,v as Q,w as $,x as ee,y as te,z as ne}from"./run-tasks-CEs2FBaf.js";import{t as re}from"./validate-scaffoldfy-json-Cfq-nQjy.js";import"./scaffoldfy-config-json-validator-DP8-e4Yy.js";import{n as ie,t as ae}from"./src-TOw75kLW.js";export{R as callHook,L as clearPlugins,p as clearTemplateCache,K as collectPrompts,G as collectVariables,j as createTaskPlugin,x as displayTasksDiff,o as evaluateCondition,Q as executePluginTask,P as executeTask,V as getCreateDiff,s as getDeleteDiff,B as getExecDiff,y as getGitInitDiff,r as getGitRepoInfo,te as getPlugin,N as getPluginForTaskType,ee as getPluginTaskDiff,b as getRegexReplaceDiff,S as getRenameDiff,f as getReplaceInFileDiff,h as getTaskDiff,ne as getTemplateSourceDescription,v as getUpdateJsonDiff,C as getWriteDiff,c as hasInlineTemplate,D as hasTemplateFile,n as interpolateTemplate,w as isPluginTaskType,l as listPlugins,_ as loadAndMergeTemplate,q as loadTasksWithInheritance,g as loadTemplate,A as loadTemplatesInOrder,e as log,ae as main,k as mergeTemplates,m as processTemplate,i as prompt,a as promptYesNo,H as registerBuiltInPlugins,$ as registerHooks,T as registerPlugin,I as resolveAllDefaultValues,z as resolveAllVariableValues,U as resolveDefaultValue,M as resolveVariableValue,Z as runTask,X as runTasks,W as runTemplatesSequentially,ie as runWithTasks,t as setNestedProperty,E as shouldUseHandlebars,Y as topologicalSort,d as unregisterPlugin,u as validatePluginTask,F as validatePrompts,re as validateScaffoldfyJsonFile,O as validateTemplateConfig,J as validateVariables};
@@ -0,0 +1 @@
1
+ require(`./config-DlJs75hK.cjs`),require(`./utils-Bz23aLK_.cjs`);const e=require(`./run-tasks-BnqvtWj4.cjs`);exports.runTasks=e.t,exports.runTemplatesSequentially=e.n;
@@ -0,0 +1,26 @@
1
+ const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./config-DlJs75hK.cjs`),n=require(`./utils-Bz23aLK_.cjs`);let r=require(`node:fs`);r=e.t(r);let i=require(`node:path`);i=e.t(i);let a=require(`node:process`);a=e.t(a);let o=require(`node:util`);o=e.t(o);let s=require(`node:child_process`);s=e.t(s);let c=require(`@inquirer/prompts`);c=e.t(c);let l=require(`case-anything`);l=e.t(l);let u=require(`node:os`);u=e.t(u);var d=class e extends n.S{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},f=class e extends n.S{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}},p=class e extends n.S{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},m=class e extends n.S{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},h=class e extends n.S{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}},g=class e extends n.S{constructor(e,t,n){super(e,`TRANSFORMER_ERROR`),this.transformerId=t,this.reason=n,this.name=`TransformerError`}static notFound(t){return new e(`Transformer "${t}" not found`,t,`not_found`)}static executionFailed(t,n){return new e(`Transformer "${t}" execution failed: ${n}`,t,`execution_failed`)}static invalidType(t,n){return new e(`Invalid transformer type "${n}" for transformer "${t}"`,t,`invalid_type`)}};function ee(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let r=new Map,i=new Map,a=new Map;for(let t of e)if(r.set(t.name,t),a.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)a.get(t.name).add(e),i.has(e)||i.set(e,new Set),i.get(e).add(t.name);let o=new Set,s=new Map;for(let t=0;t<e.length;t++){let n=e[t],r=a.get(n.name).size>0,c=i.has(n.name)&&i.get(n.name).size>0;!r&&!c&&(o.add(n.name),s.set(n.name,t))}let c=e.filter(e=>!o.has(e.name)),l=[],u=new Set,d=new Set;function f(e){if(u.has(e))return;if(d.has(e))throw n.x.forTemplateDependencies(Array.from(d),e);d.add(e);let t=r.get(e);if(t!=null){let t=a.get(e);if(t!=null&&t.size>0)for(let e of t)f(e)}d.delete(e),u.add(e),t!=null&&!o.has(e)&&l.push(t)}for(let e of c)f(e.name);let p=[],m=0;for(let t=0;t<e.length;t++){let n=e[t];o.has(n.name)?p.push(n):m<l.length&&(p.push(l[m]),m++)}return p}const _=(0,o.promisify)(r.default.readFile),te={template:[[`template`,`templateFile`]]};function v(e){if(e==null||e===``)return`current template`;if(y(e))return e;let t=a.default.cwd();return e.startsWith(t)?i.default.relative(t,e):e}function y(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ne(e,t){if(y(e))return e;if(t==null||t===``)return i.default.isAbsolute(e)?e:i.default.resolve(a.default.cwd(),e);if(y(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw n.b.forRemoteTemplate(e,t)}let r=i.default.dirname(t);return i.default.isAbsolute(e)?e:i.default.resolve(r,e)}async function re(e){if(y(e))return ie(e);if(!r.default.existsSync(e))throw n.v.forPath(e);return _(e,`utf-8`)}async function ie(e){try{let t=await fetch(e);if(!t.ok)throw n._.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:n._.forUrl(e,t instanceof Error?t:void 0)}}const b=new Map;async function ae(e,t=new Set){let o=y(e),s;if(s=o||i.default.isAbsolute(e)?e:i.default.resolve(a.default.cwd(),e),b.has(s))return b.get(s);if(t.has(s))throw n.x.forTemplateInheritance(t,s);t.add(s);let c;if(o)c=await ie(s);else{if(!r.default.existsSync(s))throw n.v.forPath(s);c=await _(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(e){throw n.y.forFile(s,e instanceof Error?e:Error(String(e)))}if(l.name==null||l.name.trim()===``)throw n.g.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw n.g.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw n.g.tasksNotArray(s);l.tasks===void 0&&(l.tasks=[]);for(let e of l.tasks)e.$sourceUrl=s;return b.set(s,l),l}async function oe(e,t,r,o,s){let c=y(e),l;if(l=c||i.default.isAbsolute(e)?e:t==null?i.default.resolve(a.default.cwd(),e):y(t)?new URL(e,t).href:i.default.resolve(t,e),r.has(l))return;if(o.has(l))throw n.x.forTemplateInheritance(o,l);o.add(l);let u=await ae(l),d=y(l)?new URL(`.`,l).href:i.default.dirname(l);if(u.extends!=null&&u.extends!==``){let e=Array.isArray(u.extends)?u.extends:[u.extends];for(let t of e)await oe(t,d,r,o,s)}o.delete(l),r.add(l),s.push(u)}async function x(e,t,n=new Set){let r=[];return await oe(e,t,n,new Set,r),ee(r)}async function se(e,t,n=new Set){return de(await x(e,t,n))}function ce(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw d.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw d.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw d.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function le(e,t){if((t.override??`merge`)===`replace`){n.a(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...r}=t;return r}n.a(` → Variable "${t.id}" merged (value replaced)`,`info`);let r={...e,...t};return delete r.override,r}function ue(e,t){if((t.override??`merge`)===`replace`){n.a(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...r}=t;return r}n.a(` → Prompt "${t.id}" merged`,`info`);let r={...e,...t};return delete r.override,r}function de(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return ce(t.tasks??[],t.variables,t.prompts),t}let t=new Map,r=new Map,i=new Map,a={};for(let o of e){if(o.enabled!=null&&(a[o.name]=o.enabled),o.enabled===!1){n.a(`⊘ Skipping disabled template "${o.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(o.prompts!=null)for(let e of o.prompts)if(i.has(e.id)){if(e.override==null)throw f.forPrompt(e.id);let t=ue(i.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}if(o.variables!=null)for(let e of o.variables)if(r.has(e.id)){if(e.override==null)throw f.forVariable(e.id);let t=le(r.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}for(let e of o.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw f.forTask(e.id,v(n.$sourceUrl),v(e.$sourceUrl))}let n=me(t.get(e.id),e);o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}else{let n={...e};o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}}let o=Array.from(t.values()),s=i.size>0?Array.from(i.values()):void 0,c=r.size>0?Array.from(r.values()):void 0;ce(o,c,s);let l=e[e.length-1],u={name:l.name,tasks:o};return l.description!=null&&(u.description=l.description),l.dependencies!=null&&(u.dependencies=l.dependencies),l.enabled!=null&&(u.enabled=l.enabled),s!=null&&(u.prompts=s),c!=null&&(u.variables=c),u}function fe(e,t){let n=te[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function pe(e,t,n){let r={...e},i=te[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function me(e,t){if((t.override??`merge`)===`replace`){n.a(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),n.a(` Base: ${v(e.$sourceUrl)}`,`info`),n.a(` Override: ${v(t.$sourceUrl)}`,`info`);let{override:r,...i}=t;return i}n.a(` → Merging task "${t.id}"`,`info`),n.a(` Base: ${v(e.$sourceUrl)}`,`info`),n.a(` Override: ${v(t.$sourceUrl)}`,`info`);let r;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){r=pe(e.config,t.config,t.type);let i=fe(t.type,r);i!==null&&i.length>0&&(n.a(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),n.a(` Please use override: "replace" or specify only one of these fields`,`warn`))}else r=t.config??e.config;let i=[...e.dependencies??[],...t.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0,o=t.$sourceUrl??e.$sourceUrl,s={...e,...t,config:r,...a!=null&&{dependencies:a},...o!=null&&{$sourceUrl:o}};return delete s.override,s}function he(){b.clear()}async function ge(e,t){if(n.d(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await x(e);return n.d(`Loaded ${t.length} template(s) for processing`),{tasks:[],templates:t}}let r=await se(e);n.a(`Loaded ${r.tasks?.length??0} task(s)`,`info`),r.extends!=null&&r.extends!==``&&n.a(`Extended from: ${(Array.isArray(r.extends)?r.extends:[r.extends]).join(`, `)}`,`info`),r.prompts!=null&&r.prompts.length>0&&n.a(`Found ${r.prompts.length} top-level prompt(s)`,`info`),r.variables!=null&&r.variables.length>0&&n.a(`Found ${r.variables.length} top-level variable(s)`,`info`);let i={tasks:r.tasks??[]};return r.prompts!=null&&(i.prompts=r.prompts),r.variables!=null&&(i.variables=r.variables),r.enabled!=null&&(i.enabled=r.enabled),r.transformers!=null&&(i.transformers=r.transformers),i}function S(e){return e.template!=null&&e.template!==``}function C(e){return e.templateFile!=null&&e.templateFile!==``}function _e(e){return e.endsWith(`.hbs`)}function w(e){let t=S(e),n=C(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function T(e,t,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=S(e),c=C(e);if(s)return n.i(e.template,t);if(c){let r=e.templateFile,i=a&&_e(r),s=await re(ne(r,o));return i?(await import(`handlebars`)).default.compile(s)(t):n.i(s,t)}throw Error(`No template content available`)}function ve(e){return S(e)?`inline template`:C(e)?`template file: ${e.templateFile}`:`no template source`}const E=(0,o.promisify)(r.default.readFile),ye=2,be=10,xe=55,D={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function O(e,t){switch(t){case`add`:return`${D.green}+ ${e}${D.reset}`;case`remove`:return`${D.red}- ${e}${D.reset}`;case`context`:return`${D.gray} ${e}${D.reset}`;default:return e}}function k(e,t){let n=e.split(`
2
+ `),r=t.split(`
3
+ `),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(O(t,`context`)):(t!==void 0&&i.push(O(t,`remove`)),a!==void 0&&i.push(O(a,`add`)))}return i}async function Se(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${D.red}✗ File not found: ${e.file}${D.reset}`;try{let r=await E(o,`utf-8`),i=JSON.parse(r),a={...i};function s(e){if(typeof e==`string`)return n.i(e,t);if(Array.isArray(e))return e.map(e=>s(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=s(r);return t}return e}for(let[t,r]of Object.entries(e.updates)){let e=s(r);t.includes(`.`)?n.c(i,t,e):i[t]=e}let c=JSON.stringify(a,null,2),l=JSON.stringify(i,null,2);if(c===l)return`${D.cyan}→ No changes${D.reset}`;let u=k(c,l);return`${D.blue}File: ${e.file}${D.reset}\n${u.join(`
4
+ `)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function Ce(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;if(e.template==null||e.template===``)return`${D.red}✗ No template content provided for file: ${e.file}${D.reset}`;let o=i.default.join(a.default.cwd(),e.file),s=n.i(e.template,t);if(!r.default.existsSync(o)){let t=s.split(`
5
+ `).slice(0,10).join(`
6
+ `),n=s.split(`
7
+ `).length>10;return`${D.blue}File: ${e.file}${D.reset}\n${D.green}+ New file would be created${D.reset}\n${D.gray}Content preview:${D.reset}\n${t}${n?`
8
+ ...`:``}`}try{let t=await E(o,`utf-8`);if(t===s)return`${D.cyan}→ No changes${D.reset}`;let n=k(t,s);return`${D.blue}File: ${e.file}${D.reset}\n${n.join(`
9
+ `)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function we(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let s=i.default.join(a.default.cwd(),e.file);if(r.default.existsSync(s))return`${D.cyan}→ File already exists, would be skipped: ${e.file}${D.reset}`;try{if(S(e)){let n=await T(e,t,o),r=n.split(`
10
+ `).slice(0,10).join(`
11
+ `),i=n.split(`
12
+ `).length>10;return`${D.blue}File: ${e.file}${D.reset}\n${D.green}+ New file would be created${D.reset}\n${D.gray}Content preview:${D.reset}\n${r}${i?`
13
+ ...`:``}`}let n=ve(e);return`${D.blue}File: ${e.file}${D.reset}\n${D.green}+ New file would be created from ${n}${D.reset}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function Te(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${D.red}✗ File not found: ${e.file}${D.reset}`;try{let r=await E(o,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=n.i(e.replacement,t),s=r.replace(i,a);if(r===s)return`${D.cyan}→ No matches found${D.reset}`;let c=k(r,s);return`${D.blue}File: ${e.file}${D.reset}\n${c.join(`
14
+ `)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function Ee(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${D.red}✗ File not found: ${e.file}${D.reset}`;try{let r=await E(o,`utf-8`),i=r;for(let{find:i,replace:a}of e.replacements){let e=n.i(i,t),o=n.i(a,t);r=r.replace(e,o)}if(i===r)return`${D.cyan}→ No changes${D.reset}`;let a=k(i,r);return`${D.blue}File: ${e.file}${D.reset}\n${a.join(`
15
+ `)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}function De(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=e.paths.map(e=>n.i(e,t)).filter(e=>r.default.existsSync(i.default.join(a.default.cwd(),e)));return o.length===0?`${D.cyan}→ No files/directories to delete${D.reset}`:`${D.red}Would delete:${D.reset}\n${o.map(e=>`${D.red} - ${e}${D.reset}`).join(`
16
+ `)}`}function Oe(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=n.i(e.from,t),s=n.i(e.to,t),c=i.default.join(a.default.cwd(),o),l=i.default.join(a.default.cwd(),s);return r.default.existsSync(c)?r.default.existsSync(l)?`${D.yellow}⚠ Destination already exists: ${s}${D.reset}\n${D.cyan}Would rename: ${o} → ${s}${D.reset}`:`${D.cyan}Would rename: ${o} → ${s}${D.reset}`:`${D.red}✗ Source not found: ${o}${D.reset}`}function ke(e){if(e.condition!=null&&e.condition!==``)return`${D.yellow}⊘ Condition check skipped in dry-run${D.reset}`;let t=i.default.join(a.default.cwd(),`.git`),n=r.default.existsSync(t),o=[];if(e.removeExisting&&n&&o.push(`${D.red}Would remove existing .git directory${D.reset}`),o.push(`${D.green}Would initialize git repository${D.reset}`),e.initialCommit){let t=e.message??`Initial commit`;o.push(`${D.green}Would create initial commit: "${t}"${D.reset}`)}return o.join(`
17
+ `)}function A(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let r=n.i(e.command,t),i=e.cwd==null?a.default.cwd():n.i(e.cwd,t);return`${D.yellow}Would execute:${D.reset}\n${D.cyan} Command: ${r}${D.reset}\n${D.cyan} Working directory: ${i}${D.reset}`}function Ae(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=n.i(e.from,t),s=n.i(e.to,t),c=i.default.join(a.default.cwd(),o),l=i.default.join(a.default.cwd(),s);return r.default.existsSync(c)?r.default.existsSync(l)?`${D.yellow}⚠ Destination already exists: ${s}${D.reset}\n${D.cyan}Would move: ${o} → ${s}${D.reset}`:`${D.cyan}Would move: ${o} → ${s}${D.reset}`:`${D.red}✗ Source not found: ${o}${D.reset}`}function je(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=n.i(e.from,t),s=n.i(e.to,t),c=i.default.join(a.default.cwd(),o),l=i.default.join(a.default.cwd(),s);if(!r.default.existsSync(c))return`${D.red}✗ Source not found: ${o}${D.reset}`;let u=r.default.statSync(c).isDirectory()?`directory`:`file`;return r.default.existsSync(l)?`${D.yellow}⚠ Destination already exists: ${s}${D.reset}\n${D.cyan}Would copy ${u}: ${o} → ${s}${D.reset}`:`${D.cyan}Would copy ${u}: ${o} → ${s}${D.reset}`}async function Me(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let s=i.default.join(a.default.cwd(),e.file),c={};e.content==null?e.template!=null&&(c.template=e.template):c.template=e.content,e.templateFile!=null&&(c.templateFile=e.templateFile);try{let n=await T(c,t,o),i=n.split(`
18
+ `).slice(0,10).join(`
19
+ `),a=n.split(`
20
+ `).length>10;return r.default.existsSync(s)?`${D.blue}File: ${e.file}${D.reset}\n${D.green}+ Would append content${D.reset}\n${D.gray}Content preview:${D.reset}\n${i}${a?`
21
+ ...`:``}`:`${D.blue}File: ${e.file}${D.reset}\n${D.green}+ New file would be created with content${D.reset}\n${D.gray}Content preview:${D.reset}\n${i}${a?`
22
+ ...`:``}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}function Ne(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=n.i(e.path,t),s=i.default.join(a.default.cwd(),o);return r.default.existsSync(s)?`${D.cyan}→ Directory already exists: ${o}${D.reset}`:`${D.green}+ Would create directory: ${o}${D.reset}`}async function Pe(e,t){try{switch(e.type){case`update-json`:return await Se(e.config,t);case`write`:return await Ce(e.config,t);case`create`:return await we(e.config,t,e);case`regex-replace`:return await Te(e.config,t);case`replace-in-file`:return await Ee(e.config,t);case`delete`:return De(e.config,t);case`rename`:return Oe(e.config,t);case`move`:return Ae(e.config,t);case`copy`:return je(e.config,t);case`append`:return await Me(e.config,t,e);case`mkdir`:return Ne(e.config,t);case`git-init`:return ke(e.config);case`exec`:return A(e.config,t);case`exec-file`:return A(e.config,t);default:{let t=e.type;return`${D.yellow}⚠ Diff not available for task type: ${t}${D.reset}`}}}catch(e){return`${D.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function j(e,t){console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`),console.log(`${D.blue} DRY RUN - Preview of changes${D.reset}`),console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`);for(let n of e){console.log(`${D.cyan}▶ Task: ${n.name}${D.reset}`),n.description!=null&&n.description!==``&&console.log(`${D.gray} ${n.description}${D.reset}`);let e=await Pe(n,t);console.log(e),console.log(`${D.gray}${`─`.repeat(55)}${D.reset}`)}console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`),console.log(`${D.yellow} No changes were applied (dry-run mode)${D.reset}`),console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`)}const M=new Map,N={},P=new Map;function F(e){if(e.name==null||e.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(e.taskTypes)||e.taskTypes.length===0)throw TypeError(`Plugin ${e.name} must define at least one task type`);if(typeof e.execute!=`function`)throw TypeError(`Plugin ${e.name} must provide an execute function`);if(M.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(P.has(t)){let e=P.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}M.set(e.name,e);for(let t of e.taskTypes)P.set(t,e.name);n.d(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Fe(e){let t=M.get(e);if(t!=null){for(let e of t.taskTypes)P.delete(e);M.delete(e)}}function Ie(e){return M.get(e)}function I(e){let t=P.get(e);if(t!=null)return M.get(t)}function L(e){return P.has(e)}function Le(){return Array.from(M.keys())}function Re(){M.clear(),P.clear()}function ze(e){e.beforeAll!=null&&(N.beforeAll=e.beforeAll),e.afterAll!=null&&(N.afterAll=e.afterAll),e.beforeTask!=null&&(N.beforeTask=e.beforeTask),e.afterTask!=null&&(N.afterTask=e.afterTask),e.onError!=null&&(N.onError=e.onError)}async function R(e,...t){let r=N[e];if(r!=null)try{e===`beforeAll`||e===`afterAll`?await r(t[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await r(t[0],t[1])}catch(t){n.a(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Be(e,t,n){let r=I(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Ve(e,t){let n=I(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function He(e){let t=I(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Ue(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}var We=class{transformers=new Map;constructor(){this.registerBuiltInTransformers()}registerBuiltInTransformers(){for(let e of[{id:`lowercase`,type:`lowercase`},{id:`uppercase`,type:`uppercase`},{id:`trim`,type:`trim`},{id:`slugify`,type:`slugify`},{id:`capitalize`,type:`capitalize`},{id:`titlecase`,type:`titlecase`},{id:`camelcase`,type:`camelcase`},{id:`pascalcase`,type:`pascalcase`},{id:`snakecase`,type:`snakecase`},{id:`kebabcase`,type:`kebabcase`},{id:`constantcase`,type:`constantcase`},{id:`alphanumeric`,type:`alphanumeric`},{id:`collapse-spaces`,type:`collapse-spaces`},{id:`remove-spaces`,type:`remove-spaces`},{id:`urlencode`,type:`urlencode`},{id:`dasherize`,type:`dasherize`},{id:`underscore`,type:`underscore`}])this.transformers.set(e.id,e)}register(e){this.transformers.has(e.id)&&n.a(`Transformer with id "${e.id}" is already registered. Overwriting.`,`warn`),this.transformers.set(e.id,e)}registerAll(e){for(let t of e)this.register(t)}get(e){return this.transformers.get(e)}has(e){return this.transformers.has(e)}async execute(e,t,n={}){let r=this.transformers.get(e);if(!r)throw g.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof g?t:g.executionFailed(e,t instanceof Error?t.message:String(t))}}async executeChain(e,t,n={}){let r=t;for(let t of e)r=await this.execute(t,r,n);return r}async apply(e,t,n={}){return e===void 0?t:this.executeChain(e,t,n)}validate(e){if(e===void 0)return[];let t=e,n=[];for(let e of t)this.has(e)||n.push(`Transformer "${e}" not found`);return n}async executeTransformer(e,t,n){switch(e.type){case`regex`:return this.executeRegex(e,t);case`computed`:return this.executeComputed(e,t,n);case`lowercase`:return this.executeLowercase(t);case`uppercase`:return this.executeUppercase(t);case`trim`:return this.executeTrim(t);case`slugify`:return this.executeSlugify(t);case`capitalize`:return this.executeCapitalize(t);case`titlecase`:return this.executeTitlecase(t);case`camelcase`:return this.executeCamelcase(t);case`pascalcase`:return this.executePascalcase(t);case`snakecase`:return this.executeSnakecase(t);case`kebabcase`:return this.executeKebabcase(t);case`constantcase`:return this.executeConstantcase(t);case`alphanumeric`:return this.executeAlphanumeric(t);case`collapse-spaces`:return this.executeCollapseSpaces(t);case`remove-spaces`:return this.executeRemoveSpaces(t);case`urlencode`:return this.executeUrlencode(t);case`dasherize`:return this.executeDasherize(t);case`underscore`:return this.executeUnderscore(t);case`custom`:return this.executeCustom(e,t,n);case`chain`:return this.executeChainTransformer(e,t,n);default:{let t=e;throw g.invalidType(t.id,t.type)}}}executeRegex(e,t){let n=String(t),{pattern:r,flags:i,replacement:a}=e.config;try{let e=new RegExp(r,i);return n.replace(e,a)}catch(t){throw g.executionFailed(e.id,`Invalid regex pattern: ${t instanceof Error?t.message:String(t)}`)}}executeComputed(e,t,n){let{expression:r}=e.config;try{return Function(`value`,`context`,...Object.keys(n),`return ${r}`)(t,n,...Object.values(n))}catch(t){throw g.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return(0,l.lowerCase)(String(e))}executeUppercase(e){return(0,l.upperCase)(String(e))}executeTrim(e){return String(e).trim()}executeSlugify(e){return String(e).toLowerCase().trim().replace(/[\s_]+/gu,`-`).replace(/[^\w-]+/gu,``).replace(/-{2,}/gu,`-`).replace(/^-+/u,``).replace(/-+$/u,``)}async executeCustom(e,t,n){let{handler:r}=e.config;if(typeof r==`function`)return r(t,n);throw g.executionFailed(e.id,`String-based custom handlers are not yet supported. Please use function handlers.`)}async executeChainTransformer(e,t,n){let{transformers:r}=e.config;if(r.length===0)throw g.executionFailed(e.id,`Chain transformer must have at least one transformer`);return this.executeChain(r,t,n)}executeCapitalize(e){return(0,l.capitalCase)(String(e))}executeTitlecase(e){return(0,l.capitalCase)(String(e))}executeCamelcase(e){return(0,l.camelCase)(String(e))}executePascalcase(e){return(0,l.pascalCase)(String(e))}executeSnakecase(e){return(0,l.snakeCase)(String(e))}executeKebabcase(e){return(0,l.kebabCase)(String(e))}executeConstantcase(e){return(0,l.constantCase)(String(e))}executeAlphanumeric(e){return String(e).replace(/[^a-zA-Z0-9]/gu,``)}executeCollapseSpaces(e){return String(e).replace(/\s+/gu,` `)}executeRemoveSpaces(e){return String(e).replace(/\s/gu,``)}executeUrlencode(e){return encodeURIComponent(String(e))}executeDasherize(e){return(0,l.kebabCase)(String(e))}executeUnderscore(e){return(0,l.snakeCase)(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};const z=new We;function Ge(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function Ke(e){return e===void 0||typeof e==`boolean`?e:typeof e==`string`?{type:`condition`,value:e}:typeof e==`object`&&e&&`condition`in e&&!(`type`in e)?{type:`condition`,value:e.condition}:e}async function B(e,t){let n=Ke(e);if(n===void 0)return!0;if(typeof n==`boolean`)return n;if(typeof n==`object`&&n&&`type`in n){if(n.type===`exec`)try{let{execSync:e}=await import(`node:child_process`),{interpolateTemplate:r}=await Promise.resolve().then(()=>require(`./utils-B6BwGcug.cjs`));return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await Promise.resolve().then(()=>require(`./utils-B6BwGcug.cjs`));if(typeof e==`object`&&e&&`status`in e&&typeof e.status==`number`){let{status:r}=e;if(r>=1&&r<=255)return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}if(n.type===`condition`)return Ge(n.value,t)}return!0}async function V(e,t,r){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!r)return;if(typeof i.condition!=`string`){n.a(`Prompt "${t}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await Promise.resolve().then(()=>require(`./utils-B6BwGcug.cjs`)),n=e(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`object`&&n?await V(n,t,r):n}catch(e){n.a(`Prompt "${t}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){n.a(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=(0,s.execSync)(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){n.d(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){n.a(`Prompt "${t}": interpolate default value must be a string with {{variable}} placeholders`,`error`);return}if(!r)return n.a(`Prompt "${t}": interpolate default value requires context but none provided`,`warn`),e;try{return n.i(e,r)}catch(r){return n.a(`Prompt "${t}": failed to interpolate interpolate default value: ${r instanceof Error?r.message:`Unknown error`}`,`warn`),e}}else if(i.type!==void 0){n.a(`Prompt "${t}": unknown default value type "${i.type}". Expected "static", "exec", "conditional", or "interpolate".`,`error`);return}return e}async function H(e,t=new Map,r={}){let i={};if(e.length===0)return i;for(let a of e){if(a.$templateEnabled!=null&&!await n.u(a.$templateEnabled,{...r,...i}))continue;let e={...r,...i};if(await n.u(a.enabled,e))try{let r,o=t.get(a.id);switch(a.default!==void 0&&(o=await V(a.default,a.id,e)),a.type){case`input`:{let t={message:a.message};o!==void 0&&(t.default=String(o));let i=await B(a.required,e);if(i!==void 0&&(t.required=i),r=await(0,c.input)(t),i&&(r==null||typeof r==`string`&&r.trim()===``))throw n.a(`${a.message} is required`,`error`),m.required(a.id);break}case`password`:if(r=await(0,c.password)({message:a.message,mask:`*`}),await B(a.required,e)&&(r==null||typeof r==`string`&&r.trim()===``))throw n.a(`${a.message} is required`,`error`),m.required(a.id);break;case`number`:{let t={message:a.message};o!==void 0&&(t.default=Number(o));let i=await B(a.required,e);if(i!==void 0&&(t.required=i),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),r=await(0,c.number)(t),i&&r==null)throw n.a(`${a.message} is required`,`error`),m.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};o!==void 0&&(e.default=o),r=await(0,c.select)(e);break}case`confirm`:{let e=o===void 0?!1:!!o;r=await(0,c.confirm)({message:a.message,default:e});break}default:throw n.a(`Unknown prompt type: ${a.type}`,`error`),m.unknownType(a.type)}a.transformers!==void 0&&(r=await z.apply(a.transformers,r,{...e,...i})),i[a.id]=r}catch(e){throw e instanceof Error&&n.a(`Failed to collect prompt "${a.id}": ${e.message}`,`error`),e}}return i}async function U(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await V(e.default,e.id,t);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function W(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const qe=(0,o.promisify)(r.default.appendFile),Je=(0,o.promisify)(r.default.readFile),Ye=(0,o.promisify)(r.default.stat);async function Xe(e,t,r){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping append task`,`info`);return}let o=i.default.join(a.default.cwd(),e.file),s={};e.content==null?e.template!=null&&(s.template=e.template):s.template=e.content,e.templateFile!=null&&(s.templateFile=e.templateFile);let c=w(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?h.templateHasBothTemplateAndFile():h.templateMissingTemplateOrFile();let l=await T(s,t,r),u=!1,d=!1;try{await Ye(o),u=!0;let t=await Je(o,`utf-8`);t.length>0&&!t.endsWith(`
23
+ `)&&(d=e.newline!==!1)}catch{}u&&d?await qe(o,`\n${l}`):await qe(o,l),n.a(`Appended content to ${e.file}`,`success`)}const Ze={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Xe(e.config,t,e)}},Qe=(0,o.promisify)(r.default.copyFile),$e=(0,o.promisify)(r.default.stat),et=(0,o.promisify)(r.default.mkdir),tt=(0,o.promisify)(r.default.readdir);async function nt(e,t){await et(t,{recursive:!0});let n=await tt(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=i.default.join(e,n.name),a=i.default.join(t,n.name);n.isDirectory()?await nt(r,a):await Qe(r,a)}))}async function rt(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping copy task`,`info`);return}let r=i.default.join(a.default.cwd(),e.from),o=i.default.join(a.default.cwd(),e.to),s;try{s=await $e(r)}catch{n.a(`Source path does not exist: ${r}`,`warn`);return}await et(i.default.dirname(o),{recursive:!0}),s.isDirectory()?(await nt(r,o),n.a(`Copied directory ${e.from} to ${e.to}`,`success`)):(await Qe(r,o),n.a(`Copied file ${e.from} to ${e.to}`,`success`))}const it={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}},at=(0,o.promisify)(r.default.writeFile);async function ot(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping create task`,`info`);return}let s=i.default.join(a.default.cwd(),e.file);if(r.default.existsSync(s)){n.a(`File already exists, skipping: ${e.file}`,`info`);return}let c=w(e);if(!c.isValid)throw c.error?.includes(`cannot have both`)?h.createHasBothTemplateAndFile():h.createMissingTemplateOrFile();let l=await T(e,t,o),u=i.default.dirname(s);r.default.existsSync(u)||r.default.mkdirSync(u,{recursive:!0}),await at(s,l),n.a(`Created file: ${e.file}`,`success`)}const st={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t,e)}};async function ct(e,t){let{paths:o,condition:s}=e;if(s!=null&&s!==``){if(!t){n.a(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!n.t(s,t)){n.a(`Condition not met, skipping deletion`,`info`);return}}for(let e of o){let t=i.default.join(a.default.cwd(),e);r.default.existsSync(t)&&r.default.rmSync(t,{recursive:!0,force:!0})}}const lt={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}};function G(e){switch(i.default.extname(e).toLowerCase()){case`.js`:case`.cjs`:case`.mjs`:return`node`;case`.sh`:return`bash`;case`.bash`:return`bash`;case`.ps1`:return`pwsh`;default:return}}function ut(e,t){switch(e){case`node`:return`node "${t}"`;case`bash`:return`bash "${t}"`;case`sh`:return`sh "${t}"`;case`pwsh`:return`pwsh -File "${t}"`;case`powershell`:return`powershell -File "${t}"`;default:return`node "${t}"`}}function dt(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}function ft(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}async function pt(e,t){let o=n.i(e.file,t),c=e.args?.map(e=>n.i(e,t))??[],l={};if(e.parameters)for(let[r,i]of Object.entries(e.parameters))l[r]=n.i(i,t);let d=e.cwd!=null&&e.cwd!==``?i.default.join(a.default.cwd(),n.i(e.cwd,t)):a.default.cwd(),f,p,m=!1;if(ft(o)){n.a(`Fetching remote script: ${o}`,`info`),p=await re(o),m=!0;let t=e.runtime??G(o)??`node`;!e.runtime&&!G(o)&&n.a(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);let a=u.default.tmpdir(),s=`scaffoldfy-exec-${Date.now()}${dt(t)}`;f=i.default.join(a,s),r.default.writeFileSync(f,p,`utf-8`)}else{if(f=ne(o,e.sourceUrl),!r.default.existsSync(f))throw Error(`Script file not found: ${f}`);n.a(`Using local script: ${f}`,`info`)}let h=e.runtime??G(f)??`node`;!e.runtime&&!G(f)&&n.a(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let t=ut(h,f),r=c.join(` `),i=r?`${t} ${r}`:t;n.a(`Executing: ${i}`,`info`);let o=(0,s.execSync)(i,{cwd:d,stdio:e.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...a.default.env,...l},encoding:e.captureOutput?`utf-8`:void 0});if(e.captureOutput)return n.a(`Script executed successfully with output`,`info`),typeof o==`string`?o:void 0;n.a(`Script executed successfully`,`info`);return}finally{if(m&&r.default.existsSync(f))try{r.default.unlinkSync(f)}catch(e){n.a(`Warning: Failed to clean up temporary file: ${e instanceof Error?e.message:String(e)}`,`warn`)}}}async function mt(e,t,r){e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)||await pt({file:e.file,...e.runtime&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!=null&&e.cwd.trim()!==``&&{cwd:e.cwd},...r?.$sourceUrl!=null&&r.$sourceUrl.trim()!==``&&{sourceUrl:r.$sourceUrl},captureOutput:!1},t)}const ht={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await mt(e.config,t,e)}};async function gt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){n.a(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!n.t(e.condition,t)){n.a(`Condition not met, skipping exec task`,`info`);return}}let r=e.cwd==null?a.default.cwd():i.default.join(a.default.cwd(),e.cwd);(0,s.execSync)(e.command,{cwd:r,stdio:`inherit`})}const _t={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await gt(e.config,t)}};async function vt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){n.a(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!n.t(e.condition,t)){n.a(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=i.default.join(a.default.cwd(),`.git`);r.default.existsSync(e)&&r.default.rmSync(e,{recursive:!0,force:!0})}if((0,s.execSync)(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;(0,s.execSync)(`git add .`,{stdio:`inherit`}),(0,s.execSync)(`git commit -m "${t}"`,{stdio:`inherit`})}}const yt={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=(0,o.promisify)(r.default.mkdir);async function xt(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping mkdir task`,`info`);return}await bt(i.default.join(a.default.cwd(),e.path),{recursive:!0}),n.a(`Created directory: ${e.path}`,`success`)}const St={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await xt(e.config,t)}},Ct=(0,o.promisify)(r.default.rename),wt=(0,o.promisify)(r.default.stat),Tt=(0,o.promisify)(r.default.mkdir);async function Et(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping move task`,`info`);return}let r=i.default.join(a.default.cwd(),e.from),o=i.default.join(a.default.cwd(),e.to);try{await wt(r)}catch{n.a(`Source path does not exist: ${r}`,`warn`);return}await Tt(i.default.dirname(o),{recursive:!0}),await Ct(r,o),n.a(`Moved ${e.from} to ${e.to}`,`success`)}const Dt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Et(e.config,t)}},Ot=(0,o.promisify)(r.default.readFile),kt=(0,o.promisify)(r.default.writeFile);async function At(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping regex-replace task`,`info`);return}let r=i.default.join(a.default.cwd(),e.file),{pattern:o}=e,s=e.flags??``,c=e.replacement||``,l=await Ot(r,`utf-8`),u=new RegExp(o,s);l=l.replace(u,n.i(c,t)),await kt(r,l)}const jt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await At(e.config,t)}},Mt=(0,o.promisify)(r.default.rename);async function Nt(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping rename task`,`info`);return}let o=i.default.join(a.default.cwd(),n.i(e.from,t)),s=i.default.join(a.default.cwd(),n.i(e.to,t));if(!r.default.existsSync(o)){n.a(`Source path does not exist: ${o}`,`warn`);return}await Mt(o,s)}const Pt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Nt(e.config,t)}},Ft=(0,o.promisify)(r.default.readFile),It=(0,o.promisify)(r.default.writeFile);async function Lt(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping replace-in-file task`,`info`);return}let o=i.default.join(a.default.cwd(),e.file),{replacements:s}=e;if(!r.default.existsSync(o)){n.a(`File not found: ${o}, skipping`,`warn`);return}let c=await Ft(o,`utf-8`);for(let{find:e,replace:r}of s){let i=n.i(r,t);c=c.replace(new RegExp(e,`gu`),i)}await It(o,c)}const Rt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Lt(e.config,t)}},zt=(0,o.promisify)(r.default.readFile),Bt=(0,o.promisify)(r.default.writeFile),Vt=2;async function Ht(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping update-json task`,`info`);return}let r=i.default.join(a.default.cwd(),e.file),{updates:o}=e,s=await zt(r,`utf-8`),c=JSON.parse(s);function l(e){if(typeof e==`string`)return n.i(e,t);if(Array.isArray(e))return e.map(e=>l(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=l(r);return t}return e}for(let[e,t]of Object.entries(o)){let r=l(t);e.includes(`.`)?n.c(c,e,r):c[e]=r}await Bt(r,`${JSON.stringify(c,null,2)}\n`)}const Ut={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Ht(e.config,t)}},Wt=(0,o.promisify)(r.default.writeFile);async function Gt(e,t,o){let{allowCreate:s=!0}=e;if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping write task`,`info`);return}let c=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(c)){if(s===!1)throw Error(`Write task failed: file does not exist (${e.file})`);n.a(`File not found, creating new file: ${e.file}`,`info`)}let l=w(e);if(!l.isValid)throw l.error?.includes(`cannot have both`)?h.templateHasBothTemplateAndFile():h.templateMissingTemplateOrFile();let u=await T(e,t,o),d=i.default.dirname(c);r.default.existsSync(d)||r.default.mkdirSync(d,{recursive:!0}),await Wt(c,u)}const Kt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Gt(e.config,t,e)}};function K(){L(`update-json`)||(F(Ut),F(Kt),F(st),F(jt),F(Rt),F(lt),F(Pt),F(yt),F(_t),F(ht),F(Dt),F(it),F(Ze),F(St))}async function q(e,t,r=!1){if(K(),r){n.a(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(L(e.type)){await Be(e,t,{dryRun:r});return}throw TypeError(`Unknown task type: ${e.type}`)}async function J(e,t,r,i,o=!1){try{return n.a(`[${r}/${i}] Running: ${e.name}...`,`info`),await q(e,t,o),n.a(`[${r}/${i}] Completed: ${e.name}...`,`success`),!0}catch(t){return n.a(`Failed: ${e.name}`,`error`),t instanceof Error&&(n.a(` Reason: ${t.message}`,`error`),t.stack!=null&&a.default.env.DEBUG!=null&&console.error(t.stack)),!1}}function Y(e){let t=[],r=new Set,i=new Set,a=new Map(e.map(e=>[e.id,e]));function o(e){if(r.has(e))return;if(i.has(e))throw n.x.forTaskDependency(e);i.add(e);let s=a.get(e);if(!s)throw p.forId(e);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(e),r.add(e),t.push(s)}for(let t of e)r.has(t.id)||o(t.id);return t}function qt(e){let t=[];for(let n of e)if(!L(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Jt(n);t.push(...e)}return t}function Jt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=w({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function Yt(e){n.a(`❌ Template validation failed:`,`error`),n.a(``,`error`);for(let t of e)n.a(` • ${t}`,`error`);n.a(``,`error`),n.a(`Please fix these errors before continuing.`,`error`)}async function X(e,t=new Map,n={}){let r={};for(let i of e){let e=t.get(i.id);e!==void 0&&(i.transformers!==void 0&&(e=await z.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function Z(e,t,r){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!r){n.a(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof i.condition!=`string`){n.a(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await Promise.resolve().then(()=>require(`./utils-B6BwGcug.cjs`)),n=e(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`object`&&n?await Z(n,t,r):n}catch(e){n.a(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){n.a(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=(0,s.execSync)(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){n.a(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){n.a(`Variable "${t}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!r)return n.a(`Variable "${t}": interpolate value requires context but none provided`,`warn`),e;try{return n.i(e,r)}catch(r){return n.a(`Variable "${t}": failed to interpolate interpolate value: ${r instanceof Error?r.message:`Unknown error`}`,`warn`),e}}else if(i.type===`exec-file`){if(!r){n.a(`Variable "${t}": exec-file value requires context but none provided`,`warn`);return}let e=i;if(typeof e.file!=`string`){n.a(`Variable "${t}": exec-file value must have a file path`,`error`);return}try{let t=await pt({file:e.file,...e.runtime!=null&&e.runtime.trim()!==``&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!==void 0&&e.cwd.trim()!==``&&{cwd:e.cwd},captureOutput:!0},r);if(t===void 0)return;let n=t.trim();if(n.startsWith(`{`)||n.startsWith(`[`))try{return JSON.parse(n)}catch{return n}if(/^-?\d+(?:\.\d+)?$/u.test(n)){let e=Number.parseFloat(n);if(!Number.isNaN(e))return e}return n===`true`||n===`false`?n===`true`:n}catch(e){n.a(`Variable "${t}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type!==void 0){n.a(`Variable "${t}": unknown value type "${i.type}". Expected "static", "exec", "conditional", "interpolate", or "exec-file".`,`error`);return}return e}async function Q(e,t,r){let i=new Map;for(let a of e){if(r?.skipConditional===!0&&typeof a.value==`object`&&a.value!==null&&!Array.isArray(a.value)&&a.value.type===`conditional`)continue;if(a.$templateEnabled!=null){let e={...t};for(let[t,n]of i.entries())e[t]=n;if(!await n.u(a.$templateEnabled,e))continue}let e={...t};for(let[t,n]of i.entries())e[t]=n;let o=await Z(a.value,a.id,e);o!==void 0&&i.set(a.id,o)}return i}function $(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function Xt(e,r){let i=t.t();if(!await n.u(r.templateEnabled,i,{lazy:!0})){n.f(`⊘ Template is disabled - skipping all execution`);return}r.transformers!==void 0&&r.transformers.length>0&&(n.d(`Registering ${r.transformers.length} transformer(s)...`),z.registerAll(r.transformers)),n.d(`Registering built-in plugins...`),K(),n.d(`Validating task configurations...`);let o=qt(e);o.length>0&&(Yt(o),a.default.exit(1)),n.d(`All tasks validated successfully`);let s=e.filter(e=>n.l(e.enabled,t.t(),{lazy:!0}));n.d(`Resolving task dependencies...`);let c=Y(s);n.d(`Sorted ${c.length} task(s) by dependencies`),n.f(`Welcome! Let's execute your tasks.`),r.dryRun&&n.h(`🔍 DRY RUN MODE - No changes will be made`),n.f(`This will execute your project tasks based on the defined configuration.`);let l=i,u=[...r.variables??[]];if(u.length>0){let e=$(u);e.length>0&&(n.a(`❌ Variable validation errors:`,`error`),e.forEach(e=>n.a(` - ${e}`,`error`)),a.default.exit(1)),n.d(`Resolving variable values...`);let t=await X(u,await Q(u,l,{skipConditional:!0}),l);Object.assign(l,t),Object.keys(t).length>0&&(n.d(`Resolved ${Object.keys(t).length} variable(s)`),n.d(`Variable values: ${JSON.stringify(t)}`))}let d=r.prompts??[],f=[...d];if(f.length>0){let e=W(f);e.length>0&&(n.a(`❌ Prompt validation errors:`,`error`),e.forEach(e=>n.a(` - ${e}`,`error`)),a.default.exit(1)),n.d(`Resolving prompt default values...`);let t=await U(f,l);if(d.length>0){n.f(`📋 Collecting prompts (available to all tasks):`);let e=await H(d,t,l);Object.assign(l,e)}}if(u.length>0){let e=u.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){n.d(`Re-resolving conditional variables with prompt values...`);let t=await X(e,await Q(e,l),l);Object.assign(l,t),Object.keys(t).length>0&&n.d(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await n.u(r.templateEnabled,l)){n.f(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let p=[];for(let e of c)e.$templateEnabled!=null&&!await n.u(e.$templateEnabled,l)||await n.u(e.enabled,l)&&p.push(e);if(n.a(`${p.length} of ${c.length} task(s) enabled for execution`,`info`),r.dryRun){await j(p,l),n.f(`🔍 Dry run completed - no changes were made`),n.f(`Run without --dry-run to apply changes`);return}n.d(`Calling beforeAll hook...`),await R(`beforeAll`,l);let m=p.length,h=0,g=0,ee=[],_=[];for(let e=0;e<p.length;e++){let t=p[e];t!=null&&(n.d(`Calling beforeTask hook for task: ${t.name}`),await R(`beforeTask`,t,l),await J(t,l,e+1,m,r.dryRun)?(h++,ee.push(t.id),n.d(`Calling afterTask hook for task: ${t.name}`),await R(`afterTask`,t,l)):(await B(t.required,l)&&(g++,_.push(t.name)),n.d(`Calling onError hook for task: ${t.name}`),await R(`onError`,Error(`Task ${t.name} failed`),t),n.h(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}g>0&&(n.a(`\n❌ Task execution completed with ${g} error(s)`,`error`),n.a(`Completed: ${h}/${m} tasks`,`info`),n.a(`Failed tasks: ${_.join(`, `)}`,`error`),a.default.exit(1)),n.d(`Calling afterAll hook...`),await R(`afterAll`,l),n.m(`✅ All tasks completed successfully!`),n.m(` Completed: ${h}/${m} tasks`)}async function Zt(e,t,r={}){n.d(`Running templates with sequential variable/prompt resolution...`),n.d(`Total templates to process: ${e.length}`),n.d(`Registering built-in plugins...`),K();let i=[];console.log(``),n.f(`📋 Collecting input...`),console.log(``);for(let t=0;t<e.length;t++){let o=e[t];if(o==null)continue;let s=`=`.repeat(60);if(n.d(`\n${s}`),n.d(`Processing template ${t+1}/${e.length}: "${o.name}"`),n.d(s),n.d(`Current config keys: ${Object.keys(r).join(`, `)}`),!await n.u(o.enabled,r)){n.f(`⊘ Template "${o.name}" is disabled - skipping`),n.d(` Enabled condition: ${JSON.stringify(o.enabled)}`);continue}let c=o.variables??[];if(c.length>0){n.d(`Processing ${c.length} variable(s) for template "${o.name}"...`);let e=$(c);e.length>0&&(n.a(`❌ Variable validation errors:`,`error`),e.forEach(e=>n.a(` - ${e}`,`error`)),a.default.exit(1));let t=await X(c,await Q(c,r,{skipConditional:!0}),r);Object.assign(r,t);let i=c.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),s=0;if(i.length>0){let e=await X(i,await Q(i,r),r);if(s=Object.keys(e).length,Object.assign(r,e),s>0){n.d(`Resolved ${s} conditional variable(s)`);for(let[t,r]of Object.entries(e))n.d(` ${t} = ${JSON.stringify(r)}`)}}let l=Object.keys(t).length+s;if(l>0){n.d(`Total variables resolved for template: ${l}`);for(let[e,r]of Object.entries(t))n.d(` ${e} = ${JSON.stringify(r)}`)}}let l=o.prompts??[];if(l.length>0){n.d(`Processing ${l.length} prompt(s) for template "${o.name}"...`);let e=W(l);e.length>0&&(n.a(`❌ Prompt validation errors:`,`error`),e.forEach(e=>n.a(` - ${e}`,`error`)),a.default.exit(1));let t=await H(l,await U(l,r),r);Object.assign(r,t),n.d(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await n.u(o.enabled,r)){n.f(`⊘ Template "${o.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let u=o.tasks??[];u.length>0&&(n.d(`Found ${u.length} task(s) in template "${o.name}" (will execute later)`),i.push(...u))}if(n.d(`
24
+ 🔧 Validating and filtering all collected tasks...`),i.length===0){n.a(`No tasks found in any template`,`info`);return}let o=qt(i);o.length>0&&(Yt(o),a.default.exit(1)),console.log(``),n.a(`🛠️ Preparing tasks...`,`info`);let s=[];for(let e of i)await n.u(e.enabled,r)&&s.push(e);if(console.log(``),n.a(`Found ${i.length} tasks (${s.length} enabled)`,`info`),n.a(`All tasks validated successfully`,`success`),s.length===0){n.a(`No enabled tasks to execute`,`info`);return}let c=Y(s);if(t.dryRun){n.a(`
25
+ 🔍 Dry run - showing task changes...`,`info`),await j(c,r),n.a(`
26
+ 🔍 Dry run completed - no changes were made`,`info`),n.a(`Run without --dry-run to apply changes`,`info`);return}console.log(``),n.f(`⚙️ Executing tasks...`),console.log(``),await R(`beforeAll`,r);let l=0,u=0,d=[];for(let e=0;e<c.length;e++){let i=c[e];i!=null&&(await R(`beforeTask`,i,r),await J(i,r,e+1,c.length,t.dryRun)?(l++,await R(`afterTask`,i,r)):(await B(i.required,r)&&(u++,d.push(i.name)),await R(`onError`,Error(`Task ${i.name} failed`),i),n.h(`⚠️ Task "${i.name}" failed, continuing with remaining tasks...`)))}await R(`afterAll`,r),u>0&&(n.a(`\n❌ Task execution completed with ${u} error(s)`,`error`),n.a(`Completed: ${l}/${c.length} tasks`,`info`),n.a(`Failed tasks: ${d.join(`, `)}`,`error`),a.default.exit(1)),n.a(`Completed: ${l}/${c.length} tasks`,`success`)}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return Le}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return He}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return Fe}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,`G`,{enumerable:!0,get:function(){return he}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return Pe}}),Object.defineProperty(exports,`J`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`K`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return Oe}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return Ce}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return _e}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`X`,{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,`Y`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return Ue}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return Re}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return we}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Zt}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`q`,{enumerable:!0,get:function(){return ge}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Xt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return Be}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return ze}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return Ve}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return Ie}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return ve}});
@@ -0,0 +1 @@
1
+ import"./config-DfRbCqsT.js";import"./utils-CrJkuEEG.js";import{n as e,t}from"./run-tasks-CEs2FBaf.js";export{t as runTasks,e as runTemplatesSequentially};
@@ -0,0 +1,26 @@
1
+ import{t as e}from"./config-DfRbCqsT.js";import{S as t,_ as n,a as r,b as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,t as p,u as m,v as h,x as g,y as _}from"./utils-CrJkuEEG.js";import v from"node:path";import y from"node:fs";import b from"node:process";import{promisify as x}from"node:util";import{execSync as S}from"node:child_process";import{confirm as ee,input as te,number as ne,password as re,select as ie}from"@inquirer/prompts";import{camelCase as ae,capitalCase as oe,constantCase as se,kebabCase as ce,lowerCase as le,pascalCase as ue,snakeCase as de,upperCase as fe}from"case-anything";import pe from"node:os";var me=class e extends t{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},C=class e extends t{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}},he=class e extends t{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},w=class e extends t{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},T=class e extends t{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}},E=class e extends t{constructor(e,t,n){super(e,`TRANSFORMER_ERROR`),this.transformerId=t,this.reason=n,this.name=`TransformerError`}static notFound(t){return new e(`Transformer "${t}" not found`,t,`not_found`)}static executionFailed(t,n){return new e(`Transformer "${t}" execution failed: ${n}`,t,`execution_failed`)}static invalidType(t,n){return new e(`Invalid transformer type "${n}" for transformer "${t}"`,t,`invalid_type`)}};function ge(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let n=new Map,r=new Map,i=new Map;for(let t of e)if(n.set(t.name,t),i.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)i.get(t.name).add(e),r.has(e)||r.set(e,new Set),r.get(e).add(t.name);let a=new Set,o=new Map;for(let t=0;t<e.length;t++){let n=e[t],s=i.get(n.name).size>0,c=r.has(n.name)&&r.get(n.name).size>0;!s&&!c&&(a.add(n.name),o.set(n.name,t))}let s=e.filter(e=>!a.has(e.name)),c=[],l=new Set,u=new Set;function d(e){if(l.has(e))return;if(u.has(e))throw g.forTemplateDependencies(Array.from(u),e);u.add(e);let t=n.get(e);if(t!=null){let t=i.get(e);if(t!=null&&t.size>0)for(let e of t)d(e)}u.delete(e),l.add(e),t!=null&&!a.has(e)&&c.push(t)}for(let e of s)d(e.name);let f=[],p=0;for(let t=0;t<e.length;t++){let n=e[t];a.has(n.name)?f.push(n):p<c.length&&(f.push(c[p]),p++)}return f}const _e=x(y.readFile),ve={template:[[`template`,`templateFile`]]};function D(e){if(e==null||e===``)return`current template`;if(O(e))return e;let t=b.cwd();return e.startsWith(t)?v.relative(t,e):e}function O(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ye(e,t){if(O(e))return e;if(t==null||t===``)return v.isAbsolute(e)?e:v.resolve(b.cwd(),e);if(O(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw i.forRemoteTemplate(e,t)}let n=v.dirname(t);return v.isAbsolute(e)?e:v.resolve(n,e)}async function be(e){if(O(e))return xe(e);if(!y.existsSync(e))throw h.forPath(e);return _e(e,`utf-8`)}async function xe(e){try{let t=await fetch(e);if(!t.ok)throw n.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:n.forUrl(e,t instanceof Error?t:void 0)}}const k=new Map;async function Se(e,t=new Set){let n=O(e),r;if(r=n||v.isAbsolute(e)?e:v.resolve(b.cwd(),e),k.has(r))return k.get(r);if(t.has(r))throw g.forTemplateInheritance(t,r);t.add(r);let i;if(n)i=await xe(r);else{if(!y.existsSync(r))throw h.forPath(r);i=await _e(r,`utf-8`)}let a;try{a=JSON.parse(i)}catch(e){throw _.forFile(r,e instanceof Error?e:Error(String(e)))}if(a.name==null||a.name.trim()===``)throw c.missingName(r);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(a.name))throw c.invalidNameFormat(r,a.name);if(a.tasks!==void 0&&!Array.isArray(a.tasks))throw c.tasksNotArray(r);a.tasks===void 0&&(a.tasks=[]);for(let e of a.tasks)e.$sourceUrl=r;return k.set(r,a),a}async function Ce(e,t,n,r,i){let a=O(e),o;if(o=a||v.isAbsolute(e)?e:t==null?v.resolve(b.cwd(),e):O(t)?new URL(e,t).href:v.resolve(t,e),n.has(o))return;if(r.has(o))throw g.forTemplateInheritance(r,o);r.add(o);let s=await Se(o),c=O(o)?new URL(`.`,o).href:v.dirname(o);if(s.extends!=null&&s.extends!==``){let e=Array.isArray(s.extends)?s.extends:[s.extends];for(let t of e)await Ce(t,c,n,r,i)}r.delete(o),n.add(o),i.push(s)}async function A(e,t,n=new Set){let r=[];return await Ce(e,t,n,new Set,r),ge(r)}async function we(e,t,n=new Set){return Oe(await A(e,t,n))}function Te(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw me.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw me.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw me.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function Ee(e,t){if((t.override??`merge`)===`replace`){r(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}r(` → Variable "${t.id}" merged (value replaced)`,`info`);let n={...e,...t};return delete n.override,n}function De(e,t){if((t.override??`merge`)===`replace`){r(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}r(` → Prompt "${t.id}" merged`,`info`);let n={...e,...t};return delete n.override,n}function Oe(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return Te(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,i=new Map,a={};for(let o of e){if(o.enabled!=null&&(a[o.name]=o.enabled),o.enabled===!1){r(`⊘ Skipping disabled template "${o.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(o.prompts!=null)for(let e of o.prompts)if(i.has(e.id)){if(e.override==null)throw C.forPrompt(e.id);let t=De(i.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}if(o.variables!=null)for(let e of o.variables)if(n.has(e.id)){if(e.override==null)throw C.forVariable(e.id);let t=Ee(n.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),n.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),n.set(e.id,t)}for(let e of o.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw C.forTask(e.id,D(n.$sourceUrl),D(e.$sourceUrl))}let n=je(t.get(e.id),e);o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}else{let n={...e};o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}}let o=Array.from(t.values()),s=i.size>0?Array.from(i.values()):void 0,c=n.size>0?Array.from(n.values()):void 0;Te(o,c,s);let l=e[e.length-1],u={name:l.name,tasks:o};return l.description!=null&&(u.description=l.description),l.dependencies!=null&&(u.dependencies=l.dependencies),l.enabled!=null&&(u.enabled=l.enabled),s!=null&&(u.prompts=s),c!=null&&(u.variables=c),u}function ke(e,t){let n=ve[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function Ae(e,t,n){let r={...e},i=ve[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function je(e,t){if((t.override??`merge`)===`replace`){r(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),r(` Base: ${D(e.$sourceUrl)}`,`info`),r(` Override: ${D(t.$sourceUrl)}`,`info`);let{override:n,...i}=t;return i}r(` → Merging task "${t.id}"`,`info`),r(` Base: ${D(e.$sourceUrl)}`,`info`),r(` Override: ${D(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=Ae(e.config,t.config,t.type);let i=ke(t.type,n);i!==null&&i.length>0&&(r(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),r(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let i=[...e.dependencies??[],...t.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0,o=t.$sourceUrl??e.$sourceUrl,s={...e,...t,config:n,...a!=null&&{dependencies:a},...o!=null&&{$sourceUrl:o}};return delete s.override,s}function Me(){k.clear()}async function Ne(e,t){if(o(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await A(e);return o(`Loaded ${t.length} template(s) for processing`),{tasks:[],templates:t}}let n=await we(e);r(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&r(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&r(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&r(`Found ${n.variables.length} top-level variable(s)`,`info`);let i={tasks:n.tasks??[]};return n.prompts!=null&&(i.prompts=n.prompts),n.variables!=null&&(i.variables=n.variables),n.enabled!=null&&(i.enabled=n.enabled),n.transformers!=null&&(i.transformers=n.transformers),i}function j(e){return e.template!=null&&e.template!==``}function M(e){return e.templateFile!=null&&e.templateFile!==``}function Pe(e){return e.endsWith(`.hbs`)}function N(e){let t=j(e),n=M(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function P(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=j(e),s=M(e);if(o)return u(e.template,t);if(s){let n=e.templateFile,r=i&&Pe(n),o=await be(ye(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):u(o,t)}throw Error(`No template content available`)}function Fe(e){return j(e)?`inline template`:M(e)?`template file: ${e.templateFile}`:`no template source`}const F=x(y.readFile),I={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function Ie(e,t){switch(t){case`add`:return`${I.green}+ ${e}${I.reset}`;case`remove`:return`${I.red}- ${e}${I.reset}`;case`context`:return`${I.gray} ${e}${I.reset}`;default:return e}}function L(e,t){let n=e.split(`
2
+ `),r=t.split(`
3
+ `),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(Ie(t,`context`)):(t!==void 0&&i.push(Ie(t,`remove`)),a!==void 0&&i.push(Ie(a,`add`)))}return i}async function Le(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${I.red}✗ File not found: ${e.file}${I.reset}`;try{let r=await F(n,`utf-8`),i=JSON.parse(r),o={...i};function s(e){if(typeof e==`string`)return u(e,t);if(Array.isArray(e))return e.map(e=>s(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=s(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=s(n);t.includes(`.`)?a(i,t,e):i[t]=e}let c=JSON.stringify(o,null,2),l=JSON.stringify(i,null,2);if(c===l)return`${I.cyan}→ No changes${I.reset}`;let d=L(c,l);return`${I.blue}File: ${e.file}${I.reset}\n${d.join(`
4
+ `)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function Re(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;if(e.template==null||e.template===``)return`${I.red}✗ No template content provided for file: ${e.file}${I.reset}`;let n=v.join(b.cwd(),e.file),r=u(e.template,t);if(!y.existsSync(n)){let t=r.split(`
5
+ `).slice(0,10).join(`
6
+ `),n=r.split(`
7
+ `).length>10;return`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created${I.reset}\n${I.gray}Content preview:${I.reset}\n${t}${n?`
8
+ ...`:``}`}try{let t=await F(n,`utf-8`);if(t===r)return`${I.cyan}→ No changes${I.reset}`;let i=L(t,r);return`${I.blue}File: ${e.file}${I.reset}\n${i.join(`
9
+ `)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function ze(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let r=v.join(b.cwd(),e.file);if(y.existsSync(r))return`${I.cyan}→ File already exists, would be skipped: ${e.file}${I.reset}`;try{if(j(e)){let r=await P(e,t,n),i=r.split(`
10
+ `).slice(0,10).join(`
11
+ `),a=r.split(`
12
+ `).length>10;return`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created${I.reset}\n${I.gray}Content preview:${I.reset}\n${i}${a?`
13
+ ...`:``}`}let r=Fe(e);return`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created from ${r}${I.reset}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function Be(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${I.red}✗ File not found: ${e.file}${I.reset}`;try{let r=await F(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=u(e.replacement,t),o=r.replace(i,a);if(r===o)return`${I.cyan}→ No matches found${I.reset}`;let s=L(r,o);return`${I.blue}File: ${e.file}${I.reset}\n${s.join(`
14
+ `)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function Ve(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${I.red}✗ File not found: ${e.file}${I.reset}`;try{let r=await F(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=u(n,t),a=u(i,t);r=r.replace(e,a)}if(i===r)return`${I.cyan}→ No changes${I.reset}`;let a=L(i,r);return`${I.blue}File: ${e.file}${I.reset}\n${a.join(`
15
+ `)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}function He(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=e.paths.map(e=>u(e,t)).filter(e=>y.existsSync(v.join(b.cwd(),e)));return n.length===0?`${I.cyan}→ No files/directories to delete${I.reset}`:`${I.red}Would delete:${I.reset}\n${n.map(e=>`${I.red} - ${e}${I.reset}`).join(`
16
+ `)}`}function Ue(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=u(e.from,t),r=u(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);return y.existsSync(i)?y.existsSync(a)?`${I.yellow}⚠ Destination already exists: ${r}${I.reset}\n${I.cyan}Would rename: ${n} → ${r}${I.reset}`:`${I.cyan}Would rename: ${n} → ${r}${I.reset}`:`${I.red}✗ Source not found: ${n}${I.reset}`}function We(e){if(e.condition!=null&&e.condition!==``)return`${I.yellow}⊘ Condition check skipped in dry-run${I.reset}`;let t=v.join(b.cwd(),`.git`),n=y.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${I.red}Would remove existing .git directory${I.reset}`),r.push(`${I.green}Would initialize git repository${I.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${I.green}Would create initial commit: "${t}"${I.reset}`)}return r.join(`
17
+ `)}function R(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=u(e.command,t),r=e.cwd==null?b.cwd():u(e.cwd,t);return`${I.yellow}Would execute:${I.reset}\n${I.cyan} Command: ${n}${I.reset}\n${I.cyan} Working directory: ${r}${I.reset}`}function Ge(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=u(e.from,t),r=u(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);return y.existsSync(i)?y.existsSync(a)?`${I.yellow}⚠ Destination already exists: ${r}${I.reset}\n${I.cyan}Would move: ${n} → ${r}${I.reset}`:`${I.cyan}Would move: ${n} → ${r}${I.reset}`:`${I.red}✗ Source not found: ${n}${I.reset}`}function Ke(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=u(e.from,t),r=u(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);if(!y.existsSync(i))return`${I.red}✗ Source not found: ${n}${I.reset}`;let o=y.statSync(i).isDirectory()?`directory`:`file`;return y.existsSync(a)?`${I.yellow}⚠ Destination already exists: ${r}${I.reset}\n${I.cyan}Would copy ${o}: ${n} → ${r}${I.reset}`:`${I.cyan}Would copy ${o}: ${n} → ${r}${I.reset}`}async function qe(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let r=v.join(b.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);try{let a=await P(i,t,n),o=a.split(`
18
+ `).slice(0,10).join(`
19
+ `),s=a.split(`
20
+ `).length>10;return y.existsSync(r)?`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ Would append content${I.reset}\n${I.gray}Content preview:${I.reset}\n${o}${s?`
21
+ ...`:``}`:`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created with content${I.reset}\n${I.gray}Content preview:${I.reset}\n${o}${s?`
22
+ ...`:``}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}function Je(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=u(e.path,t),r=v.join(b.cwd(),n);return y.existsSync(r)?`${I.cyan}→ Directory already exists: ${n}${I.reset}`:`${I.green}+ Would create directory: ${n}${I.reset}`}async function Ye(e,t){try{switch(e.type){case`update-json`:return await Le(e.config,t);case`write`:return await Re(e.config,t);case`create`:return await ze(e.config,t,e);case`regex-replace`:return await Be(e.config,t);case`replace-in-file`:return await Ve(e.config,t);case`delete`:return He(e.config,t);case`rename`:return Ue(e.config,t);case`move`:return Ge(e.config,t);case`copy`:return Ke(e.config,t);case`append`:return await qe(e.config,t,e);case`mkdir`:return Je(e.config,t);case`git-init`:return We(e.config);case`exec`:return R(e.config,t);case`exec-file`:return R(e.config,t);default:{let t=e.type;return`${I.yellow}⚠ Diff not available for task type: ${t}${I.reset}`}}}catch(e){return`${I.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function z(e,t){console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`),console.log(`${I.blue} DRY RUN - Preview of changes${I.reset}`),console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`);for(let n of e){console.log(`${I.cyan}▶ Task: ${n.name}${I.reset}`),n.description!=null&&n.description!==``&&console.log(`${I.gray} ${n.description}${I.reset}`);let e=await Ye(n,t);console.log(e),console.log(`${I.gray}${`─`.repeat(55)}${I.reset}`)}console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`),console.log(`${I.yellow} No changes were applied (dry-run mode)${I.reset}`),console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`)}const B=new Map,V={},H=new Map;function U(e){if(e.name==null||e.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(e.taskTypes)||e.taskTypes.length===0)throw TypeError(`Plugin ${e.name} must define at least one task type`);if(typeof e.execute!=`function`)throw TypeError(`Plugin ${e.name} must provide an execute function`);if(B.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(H.has(t)){let e=H.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}B.set(e.name,e);for(let t of e.taskTypes)H.set(t,e.name);o(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Xe(e){let t=B.get(e);if(t!=null){for(let e of t.taskTypes)H.delete(e);B.delete(e)}}function Ze(e){return B.get(e)}function W(e){let t=H.get(e);if(t!=null)return B.get(t)}function G(e){return H.has(e)}function Qe(){return Array.from(B.keys())}function $e(){B.clear(),H.clear()}function et(e){e.beforeAll!=null&&(V.beforeAll=e.beforeAll),e.afterAll!=null&&(V.afterAll=e.afterAll),e.beforeTask!=null&&(V.beforeTask=e.beforeTask),e.afterTask!=null&&(V.afterTask=e.afterTask),e.onError!=null&&(V.onError=e.onError)}async function K(e,...t){let n=V[e];if(n!=null)try{e===`beforeAll`||e===`afterAll`?await n(t[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await n(t[0],t[1])}catch(t){r(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function tt(e,t,n){let r=W(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function nt(e,t){let n=W(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function rt(e){let t=W(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function it(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}const q=new class{transformers=new Map;constructor(){this.registerBuiltInTransformers()}registerBuiltInTransformers(){for(let e of[{id:`lowercase`,type:`lowercase`},{id:`uppercase`,type:`uppercase`},{id:`trim`,type:`trim`},{id:`slugify`,type:`slugify`},{id:`capitalize`,type:`capitalize`},{id:`titlecase`,type:`titlecase`},{id:`camelcase`,type:`camelcase`},{id:`pascalcase`,type:`pascalcase`},{id:`snakecase`,type:`snakecase`},{id:`kebabcase`,type:`kebabcase`},{id:`constantcase`,type:`constantcase`},{id:`alphanumeric`,type:`alphanumeric`},{id:`collapse-spaces`,type:`collapse-spaces`},{id:`remove-spaces`,type:`remove-spaces`},{id:`urlencode`,type:`urlencode`},{id:`dasherize`,type:`dasherize`},{id:`underscore`,type:`underscore`}])this.transformers.set(e.id,e)}register(e){this.transformers.has(e.id)&&r(`Transformer with id "${e.id}" is already registered. Overwriting.`,`warn`),this.transformers.set(e.id,e)}registerAll(e){for(let t of e)this.register(t)}get(e){return this.transformers.get(e)}has(e){return this.transformers.has(e)}async execute(e,t,n={}){let r=this.transformers.get(e);if(!r)throw E.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof E?t:E.executionFailed(e,t instanceof Error?t.message:String(t))}}async executeChain(e,t,n={}){let r=t;for(let t of e)r=await this.execute(t,r,n);return r}async apply(e,t,n={}){return e===void 0?t:this.executeChain(e,t,n)}validate(e){if(e===void 0)return[];let t=e,n=[];for(let e of t)this.has(e)||n.push(`Transformer "${e}" not found`);return n}async executeTransformer(e,t,n){switch(e.type){case`regex`:return this.executeRegex(e,t);case`computed`:return this.executeComputed(e,t,n);case`lowercase`:return this.executeLowercase(t);case`uppercase`:return this.executeUppercase(t);case`trim`:return this.executeTrim(t);case`slugify`:return this.executeSlugify(t);case`capitalize`:return this.executeCapitalize(t);case`titlecase`:return this.executeTitlecase(t);case`camelcase`:return this.executeCamelcase(t);case`pascalcase`:return this.executePascalcase(t);case`snakecase`:return this.executeSnakecase(t);case`kebabcase`:return this.executeKebabcase(t);case`constantcase`:return this.executeConstantcase(t);case`alphanumeric`:return this.executeAlphanumeric(t);case`collapse-spaces`:return this.executeCollapseSpaces(t);case`remove-spaces`:return this.executeRemoveSpaces(t);case`urlencode`:return this.executeUrlencode(t);case`dasherize`:return this.executeDasherize(t);case`underscore`:return this.executeUnderscore(t);case`custom`:return this.executeCustom(e,t,n);case`chain`:return this.executeChainTransformer(e,t,n);default:{let t=e;throw E.invalidType(t.id,t.type)}}}executeRegex(e,t){let n=String(t),{pattern:r,flags:i,replacement:a}=e.config;try{let e=new RegExp(r,i);return n.replace(e,a)}catch(t){throw E.executionFailed(e.id,`Invalid regex pattern: ${t instanceof Error?t.message:String(t)}`)}}executeComputed(e,t,n){let{expression:r}=e.config;try{return Function(`value`,`context`,...Object.keys(n),`return ${r}`)(t,n,...Object.values(n))}catch(t){throw E.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return le(String(e))}executeUppercase(e){return fe(String(e))}executeTrim(e){return String(e).trim()}executeSlugify(e){return String(e).toLowerCase().trim().replace(/[\s_]+/gu,`-`).replace(/[^\w-]+/gu,``).replace(/-{2,}/gu,`-`).replace(/^-+/u,``).replace(/-+$/u,``)}async executeCustom(e,t,n){let{handler:r}=e.config;if(typeof r==`function`)return r(t,n);throw E.executionFailed(e.id,`String-based custom handlers are not yet supported. Please use function handlers.`)}async executeChainTransformer(e,t,n){let{transformers:r}=e.config;if(r.length===0)throw E.executionFailed(e.id,`Chain transformer must have at least one transformer`);return this.executeChain(r,t,n)}executeCapitalize(e){return oe(String(e))}executeTitlecase(e){return oe(String(e))}executeCamelcase(e){return ae(String(e))}executePascalcase(e){return ue(String(e))}executeSnakecase(e){return de(String(e))}executeKebabcase(e){return ce(String(e))}executeConstantcase(e){return se(String(e))}executeAlphanumeric(e){return String(e).replace(/[^a-zA-Z0-9]/gu,``)}executeCollapseSpaces(e){return String(e).replace(/\s+/gu,` `)}executeRemoveSpaces(e){return String(e).replace(/\s/gu,``)}executeUrlencode(e){return encodeURIComponent(String(e))}executeDasherize(e){return ce(String(e))}executeUnderscore(e){return de(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};function at(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function ot(e){return e===void 0||typeof e==`boolean`?e:typeof e==`string`?{type:`condition`,value:e}:typeof e==`object`&&e&&`condition`in e&&!(`type`in e)?{type:`condition`,value:e.condition}:e}async function J(e,t){let n=ot(e);if(n===void 0)return!0;if(typeof n==`boolean`)return n;if(typeof n==`object`&&n&&`type`in n){if(n.type===`exec`)try{let{execSync:e}=await import(`node:child_process`),{interpolateTemplate:r}=await import(`./utils-B6WSsvMT.js`);return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await import(`./utils-B6WSsvMT.js`);if(typeof e==`object`&&e&&`status`in e&&typeof e.status==`number`){let{status:r}=e;if(r>=1&&r<=255)return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}if(n.type===`condition`)return at(n.value,t)}return!0}async function Y(e,t,n){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!n)return;if(typeof i.condition!=`string`){r(`Prompt "${t}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-B6WSsvMT.js`),r=e(i.condition,n)?i.ifTrue:i.ifFalse;return typeof r==`object`&&r?await Y(r,t,n):r}catch(e){r(`Prompt "${t}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){r(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=S(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){o(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){r(`Prompt "${t}": interpolate default value must be a string with {{variable}} placeholders`,`error`);return}if(!n)return r(`Prompt "${t}": interpolate default value requires context but none provided`,`warn`),e;try{return u(e,n)}catch(n){return r(`Prompt "${t}": failed to interpolate interpolate default value: ${n instanceof Error?n.message:`Unknown error`}`,`warn`),e}}else if(i.type!==void 0){r(`Prompt "${t}": unknown default value type "${i.type}". Expected "static", "exec", "conditional", or "interpolate".`,`error`);return}return e}async function st(e,t=new Map,n={}){let i={};if(e.length===0)return i;for(let a of e){if(a.$templateEnabled!=null&&!await m(a.$templateEnabled,{...n,...i}))continue;let e={...n,...i};if(await m(a.enabled,e))try{let n,o=t.get(a.id);switch(a.default!==void 0&&(o=await Y(a.default,a.id,e)),a.type){case`input`:{let t={message:a.message};o!==void 0&&(t.default=String(o));let i=await J(a.required,e);if(i!==void 0&&(t.required=i),n=await te(t),i&&(n==null||typeof n==`string`&&n.trim()===``))throw r(`${a.message} is required`,`error`),w.required(a.id);break}case`password`:if(n=await re({message:a.message,mask:`*`}),await J(a.required,e)&&(n==null||typeof n==`string`&&n.trim()===``))throw r(`${a.message} is required`,`error`),w.required(a.id);break;case`number`:{let t={message:a.message};o!==void 0&&(t.default=Number(o));let i=await J(a.required,e);if(i!==void 0&&(t.required=i),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),n=await ne(t),i&&n==null)throw r(`${a.message} is required`,`error`),w.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};o!==void 0&&(e.default=o),n=await ie(e);break}case`confirm`:{let e=o===void 0?!1:!!o;n=await ee({message:a.message,default:e});break}default:throw r(`Unknown prompt type: ${a.type}`,`error`),w.unknownType(a.type)}a.transformers!==void 0&&(n=await q.apply(a.transformers,n,{...e,...i})),i[a.id]=n}catch(e){throw e instanceof Error&&r(`Failed to collect prompt "${a.id}": ${e.message}`,`error`),e}}return i}async function ct(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await Y(e.default,e.id,t);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function lt(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const ut=x(y.appendFile),dt=x(y.readFile),ft=x(y.stat);async function pt(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping append task`,`info`);return}let i=v.join(b.cwd(),e.file),a={};e.content==null?e.template!=null&&(a.template=e.template):a.template=e.content,e.templateFile!=null&&(a.templateFile=e.templateFile);let o=N(a);if(!o.isValid)throw o.error?.includes(`cannot have both`)?T.templateHasBothTemplateAndFile():T.templateMissingTemplateOrFile();let s=await P(a,t,n),c=!1,l=!1;try{await ft(i),c=!0;let t=await dt(i,`utf-8`);t.length>0&&!t.endsWith(`
23
+ `)&&(l=e.newline!==!1)}catch{}c&&l?await ut(i,`\n${s}`):await ut(i,s),r(`Appended content to ${e.file}`,`success`)}const mt={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await pt(e.config,t,e)}},ht=x(y.copyFile),gt=x(y.stat),_t=x(y.mkdir),vt=x(y.readdir);async function yt(e,t){await _t(t,{recursive:!0});let n=await vt(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=v.join(e,n.name),i=v.join(t,n.name);n.isDirectory()?await yt(r,i):await ht(r,i)}))}async function bt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping copy task`,`info`);return}let n=v.join(b.cwd(),e.from),i=v.join(b.cwd(),e.to),a;try{a=await gt(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await _t(v.dirname(i),{recursive:!0}),a.isDirectory()?(await yt(n,i),r(`Copied directory ${e.from} to ${e.to}`,`success`)):(await ht(n,i),r(`Copied file ${e.from} to ${e.to}`,`success`))}const xt={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await bt(e.config,t)}},St=x(y.writeFile);async function Ct(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping create task`,`info`);return}let i=v.join(b.cwd(),e.file);if(y.existsSync(i)){r(`File already exists, skipping: ${e.file}`,`info`);return}let a=N(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?T.createHasBothTemplateAndFile():T.createMissingTemplateOrFile();let o=await P(e,t,n),s=v.dirname(i);y.existsSync(s)||y.mkdirSync(s,{recursive:!0}),await St(i,o),r(`Created file: ${e.file}`,`success`)}const wt={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ct(e.config,t,e)}};async function Tt(e,t){let{paths:n,condition:i}=e;if(i!=null&&i!==``){if(!t){r(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!p(i,t)){r(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=v.join(b.cwd(),e);y.existsSync(t)&&y.rmSync(t,{recursive:!0,force:!0})}}const Et={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Tt(e.config,t)}};function X(e){switch(v.extname(e).toLowerCase()){case`.js`:case`.cjs`:case`.mjs`:return`node`;case`.sh`:return`bash`;case`.bash`:return`bash`;case`.ps1`:return`pwsh`;default:return}}function Dt(e,t){switch(e){case`node`:return`node "${t}"`;case`bash`:return`bash "${t}"`;case`sh`:return`sh "${t}"`;case`pwsh`:return`pwsh -File "${t}"`;case`powershell`:return`powershell -File "${t}"`;default:return`node "${t}"`}}function Ot(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}function kt(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}async function At(e,t){let n=u(e.file,t),i=e.args?.map(e=>u(e,t))??[],a={};if(e.parameters)for(let[n,r]of Object.entries(e.parameters))a[n]=u(r,t);let o=e.cwd!=null&&e.cwd!==``?v.join(b.cwd(),u(e.cwd,t)):b.cwd(),s,c,l=!1;if(kt(n)){r(`Fetching remote script: ${n}`,`info`),c=await be(n),l=!0;let t=e.runtime??X(n)??`node`;!e.runtime&&!X(n)&&r(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);let i=pe.tmpdir(),a=`scaffoldfy-exec-${Date.now()}${Ot(t)}`;s=v.join(i,a),y.writeFileSync(s,c,`utf-8`)}else{if(s=ye(n,e.sourceUrl),!y.existsSync(s))throw Error(`Script file not found: ${s}`);r(`Using local script: ${s}`,`info`)}let d=e.runtime??X(s)??`node`;!e.runtime&&!X(s)&&r(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let t=Dt(d,s),n=i.join(` `),c=n?`${t} ${n}`:t;r(`Executing: ${c}`,`info`);let l=S(c,{cwd:o,stdio:e.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...b.env,...a},encoding:e.captureOutput?`utf-8`:void 0});if(e.captureOutput)return r(`Script executed successfully with output`,`info`),typeof l==`string`?l:void 0;r(`Script executed successfully`,`info`);return}finally{if(l&&y.existsSync(s))try{y.unlinkSync(s)}catch(e){r(`Warning: Failed to clean up temporary file: ${e instanceof Error?e.message:String(e)}`,`warn`)}}}async function jt(e,t,n){e.condition!=null&&e.condition!==``&&!p(e.condition,t)||await At({file:e.file,...e.runtime&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!=null&&e.cwd.trim()!==``&&{cwd:e.cwd},...n?.$sourceUrl!=null&&n.$sourceUrl.trim()!==``&&{sourceUrl:n.$sourceUrl},captureOutput:!1},t)}const Mt={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await jt(e.config,t,e)}};async function Nt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!p(e.condition,t)){r(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?b.cwd():v.join(b.cwd(),e.cwd);S(e.command,{cwd:n,stdio:`inherit`})}const Pt={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Nt(e.config,t)}};async function Ft(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!p(e.condition,t)){r(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=v.join(b.cwd(),`.git`);y.existsSync(e)&&y.rmSync(e,{recursive:!0,force:!0})}if(S(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;S(`git add .`,{stdio:`inherit`}),S(`git commit -m "${t}"`,{stdio:`inherit`})}}const It={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Ft(e.config,t)}},Lt=x(y.mkdir);async function Rt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping mkdir task`,`info`);return}await Lt(v.join(b.cwd(),e.path),{recursive:!0}),r(`Created directory: ${e.path}`,`success`)}const zt={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Rt(e.config,t)}},Bt=x(y.rename),Vt=x(y.stat),Ht=x(y.mkdir);async function Ut(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping move task`,`info`);return}let n=v.join(b.cwd(),e.from),i=v.join(b.cwd(),e.to);try{await Vt(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await Ht(v.dirname(i),{recursive:!0}),await Bt(n,i),r(`Moved ${e.from} to ${e.to}`,`success`)}const Wt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Ut(e.config,t)}},Gt=x(y.readFile),Kt=x(y.writeFile);async function qt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping regex-replace task`,`info`);return}let n=v.join(b.cwd(),e.file),{pattern:i}=e,a=e.flags??``,o=e.replacement||``,s=await Gt(n,`utf-8`),c=new RegExp(i,a);s=s.replace(c,u(o,t)),await Kt(n,s)}const Jt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await qt(e.config,t)}},Yt=x(y.rename);async function Xt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping rename task`,`info`);return}let n=v.join(b.cwd(),u(e.from,t)),i=v.join(b.cwd(),u(e.to,t));if(!y.existsSync(n)){r(`Source path does not exist: ${n}`,`warn`);return}await Yt(n,i)}const Zt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Xt(e.config,t)}},Qt=x(y.readFile),$t=x(y.writeFile);async function en(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping replace-in-file task`,`info`);return}let n=v.join(b.cwd(),e.file),{replacements:i}=e;if(!y.existsSync(n)){r(`File not found: ${n}, skipping`,`warn`);return}let a=await Qt(n,`utf-8`);for(let{find:e,replace:n}of i){let r=u(n,t);a=a.replace(new RegExp(e,`gu`),r)}await $t(n,a)}const tn={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await en(e.config,t)}},nn=x(y.readFile),rn=x(y.writeFile);async function an(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping update-json task`,`info`);return}let n=v.join(b.cwd(),e.file),{updates:i}=e,o=await nn(n,`utf-8`),s=JSON.parse(o);function c(e){if(typeof e==`string`)return u(e,t);if(Array.isArray(e))return e.map(e=>c(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=c(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=c(t);e.includes(`.`)?a(s,e,n):s[e]=n}await rn(n,`${JSON.stringify(s,null,2)}\n`)}const on={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await an(e.config,t)}},sn=x(y.writeFile);async function cn(e,t,n){let{allowCreate:i=!0}=e;if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping write task`,`info`);return}let a=v.join(b.cwd(),e.file);if(!y.existsSync(a)){if(i===!1)throw Error(`Write task failed: file does not exist (${e.file})`);r(`File not found, creating new file: ${e.file}`,`info`)}let o=N(e);if(!o.isValid)throw o.error?.includes(`cannot have both`)?T.templateHasBothTemplateAndFile():T.templateMissingTemplateOrFile();let s=await P(e,t,n),c=v.dirname(a);y.existsSync(c)||y.mkdirSync(c,{recursive:!0}),await sn(a,s)}const ln={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await cn(e.config,t,e)}};function Z(){G(`update-json`)||(U(on),U(ln),U(wt),U(Jt),U(tn),U(Et),U(Zt),U(It),U(Pt),U(Mt),U(Wt),U(xt),U(mt),U(zt))}async function un(e,t,n=!1){if(Z(),n){r(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(G(e.type)){await tt(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function dn(e,t,n,i,a=!1){try{return r(`[${n}/${i}] Running: ${e.name}...`,`info`),await un(e,t,a),r(`[${n}/${i}] Completed: ${e.name}...`,`success`),!0}catch(t){return r(`Failed: ${e.name}`,`error`),t instanceof Error&&(r(` Reason: ${t.message}`,`error`),t.stack!=null&&b.env.DEBUG!=null&&console.error(t.stack)),!1}}function fn(e){let t=[],n=new Set,r=new Set,i=new Map(e.map(e=>[e.id,e]));function a(e){if(n.has(e))return;if(r.has(e))throw g.forTaskDependency(e);r.add(e);let o=i.get(e);if(!o)throw he.forId(e);if(o.dependencies)for(let e of o.dependencies)a(e);r.delete(e),n.add(e),t.push(o)}for(let t of e)n.has(t.id)||a(t.id);return t}function pn(e){let t=[];for(let n of e)if(!G(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=mn(n);t.push(...e)}return t}function mn(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=N({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function hn(e){r(`❌ Template validation failed:`,`error`),r(``,`error`);for(let t of e)r(` • ${t}`,`error`);r(``,`error`),r(`Please fix these errors before continuing.`,`error`)}async function Q(e,t=new Map,n={}){let r={};for(let i of e){let e=t.get(i.id);e!==void 0&&(i.transformers!==void 0&&(e=await q.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function gn(e,t,n){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!n){r(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof i.condition!=`string`){r(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-B6WSsvMT.js`),r=e(i.condition,n)?i.ifTrue:i.ifFalse;return typeof r==`object`&&r?await gn(r,t,n):r}catch(e){r(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){r(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=S(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){r(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){r(`Variable "${t}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!n)return r(`Variable "${t}": interpolate value requires context but none provided`,`warn`),e;try{return u(e,n)}catch(n){return r(`Variable "${t}": failed to interpolate interpolate value: ${n instanceof Error?n.message:`Unknown error`}`,`warn`),e}}else if(i.type===`exec-file`){if(!n){r(`Variable "${t}": exec-file value requires context but none provided`,`warn`);return}let e=i;if(typeof e.file!=`string`){r(`Variable "${t}": exec-file value must have a file path`,`error`);return}try{let t=await At({file:e.file,...e.runtime!=null&&e.runtime.trim()!==``&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!==void 0&&e.cwd.trim()!==``&&{cwd:e.cwd},captureOutput:!0},n);if(t===void 0)return;let r=t.trim();if(r.startsWith(`{`)||r.startsWith(`[`))try{return JSON.parse(r)}catch{return r}if(/^-?\d+(?:\.\d+)?$/u.test(r)){let e=Number.parseFloat(r);if(!Number.isNaN(e))return e}return r===`true`||r===`false`?r===`true`:r}catch(e){r(`Variable "${t}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type!==void 0){r(`Variable "${t}": unknown value type "${i.type}". Expected "static", "exec", "conditional", "interpolate", or "exec-file".`,`error`);return}return e}async function $(e,t,n){let r=new Map;for(let i of e){if(n?.skipConditional===!0&&typeof i.value==`object`&&i.value!==null&&!Array.isArray(i.value)&&i.value.type===`conditional`)continue;if(i.$templateEnabled!=null){let e={...t};for(let[t,n]of r.entries())e[t]=n;if(!await m(i.$templateEnabled,e))continue}let e={...t};for(let[t,n]of r.entries())e[t]=n;let a=await gn(i.value,i.id,e);a!==void 0&&r.set(i.id,a)}return r}function _n(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function vn(t,n){let i=e();if(!await m(n.templateEnabled,i,{lazy:!0})){s(`⊘ Template is disabled - skipping all execution`);return}n.transformers!==void 0&&n.transformers.length>0&&(o(`Registering ${n.transformers.length} transformer(s)...`),q.registerAll(n.transformers)),o(`Registering built-in plugins...`),Z(),o(`Validating task configurations...`);let a=pn(t);a.length>0&&(hn(a),b.exit(1)),o(`All tasks validated successfully`);let c=t.filter(t=>d(t.enabled,e(),{lazy:!0}));o(`Resolving task dependencies...`);let u=fn(c);o(`Sorted ${u.length} task(s) by dependencies`),s(`Welcome! Let's execute your tasks.`),n.dryRun&&l(`🔍 DRY RUN MODE - No changes will be made`),s(`This will execute your project tasks based on the defined configuration.`);let p=i,h=[...n.variables??[]];if(h.length>0){let e=_n(h);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1)),o(`Resolving variable values...`);let t=await Q(h,await $(h,p,{skipConditional:!0}),p);Object.assign(p,t),Object.keys(t).length>0&&(o(`Resolved ${Object.keys(t).length} variable(s)`),o(`Variable values: ${JSON.stringify(t)}`))}let g=n.prompts??[],_=[...g];if(_.length>0){let e=lt(_);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1)),o(`Resolving prompt default values...`);let t=await ct(_,p);if(g.length>0){s(`📋 Collecting prompts (available to all tasks):`);let e=await st(g,t,p);Object.assign(p,e)}}if(h.length>0){let e=h.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){o(`Re-resolving conditional variables with prompt values...`);let t=await Q(e,await $(e,p),p);Object.assign(p,t),Object.keys(t).length>0&&o(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await m(n.templateEnabled,p)){s(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let v=[];for(let e of u)e.$templateEnabled!=null&&!await m(e.$templateEnabled,p)||await m(e.enabled,p)&&v.push(e);if(r(`${v.length} of ${u.length} task(s) enabled for execution`,`info`),n.dryRun){await z(v,p),s(`🔍 Dry run completed - no changes were made`),s(`Run without --dry-run to apply changes`);return}o(`Calling beforeAll hook...`),await K(`beforeAll`,p);let y=v.length,x=0,S=0,ee=[],te=[];for(let e=0;e<v.length;e++){let t=v[e];t!=null&&(o(`Calling beforeTask hook for task: ${t.name}`),await K(`beforeTask`,t,p),await dn(t,p,e+1,y,n.dryRun)?(x++,ee.push(t.id),o(`Calling afterTask hook for task: ${t.name}`),await K(`afterTask`,t,p)):(await J(t.required,p)&&(S++,te.push(t.name)),o(`Calling onError hook for task: ${t.name}`),await K(`onError`,Error(`Task ${t.name} failed`),t),l(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}S>0&&(r(`\n❌ Task execution completed with ${S} error(s)`,`error`),r(`Completed: ${x}/${y} tasks`,`info`),r(`Failed tasks: ${te.join(`, `)}`,`error`),b.exit(1)),o(`Calling afterAll hook...`),await K(`afterAll`,p),f(`✅ All tasks completed successfully!`),f(` Completed: ${x}/${y} tasks`)}async function yn(e,t,n={}){o(`Running templates with sequential variable/prompt resolution...`),o(`Total templates to process: ${e.length}`),o(`Registering built-in plugins...`),Z();let i=[];console.log(``),s(`📋 Collecting input...`),console.log(``);for(let t=0;t<e.length;t++){let a=e[t];if(a==null)continue;let c=`=`.repeat(60);if(o(`\n${c}`),o(`Processing template ${t+1}/${e.length}: "${a.name}"`),o(c),o(`Current config keys: ${Object.keys(n).join(`, `)}`),!await m(a.enabled,n)){s(`⊘ Template "${a.name}" is disabled - skipping`),o(` Enabled condition: ${JSON.stringify(a.enabled)}`);continue}let l=a.variables??[];if(l.length>0){o(`Processing ${l.length} variable(s) for template "${a.name}"...`);let e=_n(l);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1));let t=await Q(l,await $(l,n,{skipConditional:!0}),n);Object.assign(n,t);let i=l.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),s=0;if(i.length>0){let e=await Q(i,await $(i,n),n);if(s=Object.keys(e).length,Object.assign(n,e),s>0){o(`Resolved ${s} conditional variable(s)`);for(let[t,n]of Object.entries(e))o(` ${t} = ${JSON.stringify(n)}`)}}let c=Object.keys(t).length+s;if(c>0){o(`Total variables resolved for template: ${c}`);for(let[e,n]of Object.entries(t))o(` ${e} = ${JSON.stringify(n)}`)}}let u=a.prompts??[];if(u.length>0){o(`Processing ${u.length} prompt(s) for template "${a.name}"...`);let e=lt(u);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1));let t=await st(u,await ct(u,n),n);Object.assign(n,t),o(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await m(a.enabled,n)){s(`⊘ Template "${a.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let d=a.tasks??[];d.length>0&&(o(`Found ${d.length} task(s) in template "${a.name}" (will execute later)`),i.push(...d))}if(o(`
24
+ 🔧 Validating and filtering all collected tasks...`),i.length===0){r(`No tasks found in any template`,`info`);return}let a=pn(i);a.length>0&&(hn(a),b.exit(1)),console.log(``),r(`🛠️ Preparing tasks...`,`info`);let c=[];for(let e of i)await m(e.enabled,n)&&c.push(e);if(console.log(``),r(`Found ${i.length} tasks (${c.length} enabled)`,`info`),r(`All tasks validated successfully`,`success`),c.length===0){r(`No enabled tasks to execute`,`info`);return}let u=fn(c);if(t.dryRun){r(`
25
+ 🔍 Dry run - showing task changes...`,`info`),await z(u,n),r(`
26
+ 🔍 Dry run completed - no changes were made`,`info`),r(`Run without --dry-run to apply changes`,`info`);return}console.log(``),s(`⚙️ Executing tasks...`),console.log(``),await K(`beforeAll`,n);let d=0,f=0,p=[];for(let e=0;e<u.length;e++){let r=u[e];r!=null&&(await K(`beforeTask`,r,n),await dn(r,n,e+1,u.length,t.dryRun)?(d++,await K(`afterTask`,r,n)):(await J(r.required,n)&&(f++,p.push(r.name)),await K(`onError`,Error(`Task ${r.name} failed`),r),l(`⚠️ Task "${r.name}" failed, continuing with remaining tasks...`)))}await K(`afterAll`,n),f>0&&(r(`\n❌ Task execution completed with ${f} error(s)`,`error`),r(`Completed: ${d}/${u.length} tasks`,`info`),r(`Failed tasks: ${p.join(`, `)}`,`error`),b.exit(1)),r(`Completed: ${d}/${u.length} tasks`,`success`)}export{He as A,j as B,Qe as C,rt as D,Xe as E,Ve as F,Me as G,P as H,Ye as I,Se as J,we as K,Le as L,We as M,Be as N,z as O,Ue as P,Re as R,G as S,U as T,Pe as U,M as V,N as W,Oe as X,A as Y,it as _,gn as a,W as b,un as c,lt as d,ct as f,$e as g,K as h,$ as i,R as j,ze as k,Z as l,Y as m,yn as n,Q as o,st as p,Ne as q,_n as r,fn as s,vn as t,dn as u,tt as v,et as w,nt as x,Ze as y,Fe as z};
@@ -1 +1 @@
1
- const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./utils-Bz23aLK_.cjs`),n=require(`./run-tasks-CSR8df5O.cjs`);let r=require(`node:process`);r=e.t(r);const i=r.default.argv.includes(`--dry-run`),a=r.default.argv.includes(`--force`);async function o(e){try{let o=e||[];o.length===0&&(t.a(`⚠️ No tasks defined. Use --config to specify tasks or call runWithTasks() programmatically.`,`warn`),t.a(`Example: scaffoldfy --config ./tasks.json`,`info`),r.default.exit(1)),await n.t(o,{dryRun:i,force:a,tasksFilePath:void 0})}catch(e){t.a(`❌ Task execution failed`,`error`),e instanceof Error?(t.a(`Error: ${e.message}`,`error`),r.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),r.default.exit(1)}}async function s(e,o){try{await n.t(e,{dryRun:o?.dryRun??i,force:o?.force??a,tasksFilePath:o?.tasksFilePath??void 0,...o?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled},...o?.transformers!=null&&{transformers:o.transformers}})}catch(e){t.a(`❌ Task execution failed`,`error`),e instanceof Error?(t.a(`Error: ${e.message}`,`error`),r.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),r.default.exit(1)}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
1
+ const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./utils-Bz23aLK_.cjs`),n=require(`./run-tasks-BnqvtWj4.cjs`);let r=require(`node:process`);r=e.t(r);const i=r.default.argv.includes(`--dry-run`),a=r.default.argv.includes(`--force`);async function o(e){try{let o=e||[];o.length===0&&(t.a(`⚠️ No tasks defined. Use --config to specify tasks or call runWithTasks() programmatically.`,`warn`),t.a(`Example: scaffoldfy --config ./tasks.json`,`info`),r.default.exit(1)),await n.t(o,{dryRun:i,force:a,tasksFilePath:void 0})}catch(e){t.a(`❌ Task execution failed`,`error`),e instanceof Error?(t.a(`Error: ${e.message}`,`error`),r.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),r.default.exit(1)}}async function s(e,o){try{await n.t(e,{dryRun:o?.dryRun??i,force:o?.force??a,tasksFilePath:o?.tasksFilePath??void 0,...o?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled},...o?.transformers!=null&&{transformers:o.transformers}})}catch(e){t.a(`❌ Task execution failed`,`error`),e instanceof Error?(t.a(`Error: ${e.message}`,`error`),r.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),r.default.exit(1)}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
@@ -1 +1 @@
1
- import{a as e}from"./utils-CrJkuEEG.js";import{t}from"./run-tasks-BsR0t7C5.js";import n from"node:process";const r=n.argv.includes(`--dry-run`),i=n.argv.includes(`--force`);async function a(a){try{let o=a||[];o.length===0&&(e(`⚠️ No tasks defined. Use --config to specify tasks or call runWithTasks() programmatically.`,`warn`),e(`Example: scaffoldfy --config ./tasks.json`,`info`),n.exit(1)),await t(o,{dryRun:r,force:i,tasksFilePath:void 0})}catch(t){e(`❌ Task execution failed`,`error`),t instanceof Error?(e(`Error: ${t.message}`,`error`),n.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.exit(1)}}async function o(a,o){try{await t(a,{dryRun:o?.dryRun??r,force:o?.force??i,tasksFilePath:o?.tasksFilePath??void 0,...o?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled},...o?.transformers!=null&&{transformers:o.transformers}})}catch(t){e(`❌ Task execution failed`,`error`),t instanceof Error?(e(`Error: ${t.message}`,`error`),n.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.exit(1)}}export{o as n,a as t};
1
+ import{a as e}from"./utils-CrJkuEEG.js";import{t}from"./run-tasks-CEs2FBaf.js";import n from"node:process";const r=n.argv.includes(`--dry-run`),i=n.argv.includes(`--force`);async function a(a){try{let o=a||[];o.length===0&&(e(`⚠️ No tasks defined. Use --config to specify tasks or call runWithTasks() programmatically.`,`warn`),e(`Example: scaffoldfy --config ./tasks.json`,`info`),n.exit(1)),await t(o,{dryRun:r,force:i,tasksFilePath:void 0})}catch(t){e(`❌ Task execution failed`,`error`),t instanceof Error?(e(`Error: ${t.message}`,`error`),n.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.exit(1)}}async function o(a,o){try{await t(a,{dryRun:o?.dryRun??r,force:o?.force??i,tasksFilePath:o?.tasksFilePath??void 0,...o?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled},...o?.transformers!=null&&{transformers:o.transformers}})}catch(t){e(`❌ Task execution failed`,`error`),t instanceof Error?(e(`Error: ${t.message}`,`error`),n.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.exit(1)}}export{o as n,a as t};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pixpilot/scaffoldfy",
3
3
  "type": "module",
4
- "version": "0.34.0",
4
+ "version": "0.35.0",
5
5
  "author": "PixPilot <m.doaie@hotmail.com>",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -49,9 +49,9 @@
49
49
  "tsdown": "^0.15.10",
50
50
  "typescript": "^5.9.3",
51
51
  "@internal/eslint-config": "0.3.0",
52
- "@internal/tsconfig": "0.1.0",
53
52
  "@internal/prettier-config": "0.0.1",
54
53
  "@internal/vitest-config": "0.1.0",
54
+ "@internal/tsconfig": "0.1.0",
55
55
  "@internal/tsdown-config": "0.1.0"
56
56
  },
57
57
  "prettier": "@internal/prettier-config",
@@ -98,6 +98,7 @@
98
98
  "rename",
99
99
  "git-init",
100
100
  "exec",
101
+ "exec-file",
101
102
  "move",
102
103
  "copy",
103
104
  "append",
@@ -165,6 +166,12 @@
165
166
  "config": { "$ref": "#/$defs/config-exec" }
166
167
  }
167
168
  },
169
+ {
170
+ "properties": {
171
+ "type": { "const": "exec-file" },
172
+ "config": { "$ref": "#/$defs/config-exec-file" }
173
+ }
174
+ },
168
175
  {
169
176
  "properties": {
170
177
  "type": { "const": "move" },
@@ -218,7 +225,7 @@
218
225
  "description": "Built-in transformer ID"
219
226
  },
220
227
  "valueConfig": {
221
- "description": "Configuration for a value that can be static, dynamic, or conditional. Supports static primitives, command execution, interpolation with {{variable}} placeholders, or conditional evaluation.",
228
+ "description": "Configuration for a value that can be static, dynamic, or conditional. Supports static primitives, command execution, script file execution, interpolation with {{variable}} placeholders, or conditional evaluation.",
222
229
  "oneOf": [
223
230
  {
224
231
  "type": ["string", "number", "boolean"],
@@ -267,6 +274,42 @@
267
274
  }
268
275
  ]
269
276
  },
277
+ {
278
+ "type": "object",
279
+ "description": "Exec-file value configuration - execute a script file and return its output",
280
+ "required": ["type", "file"],
281
+ "additionalProperties": false,
282
+ "properties": {
283
+ "type": {
284
+ "type": "string",
285
+ "enum": ["exec-file"],
286
+ "description": "Type of value configuration. 'exec-file' for script file execution."
287
+ },
288
+ "file": {
289
+ "type": "string",
290
+ "description": "Path to script file (local or remote URL). Supports {{variable}} interpolation. Runtime will be auto-detected from file extension (.js/.cjs/.mjs -> node, .sh/.bash -> bash, .ps1 -> pwsh)."
291
+ },
292
+ "runtime": {
293
+ "type": "string",
294
+ "enum": ["node", "bash", "sh", "pwsh", "powershell"],
295
+ "description": "Runtime to execute the file with. If not specified, will be auto-detected from file extension."
296
+ },
297
+ "args": {
298
+ "type": "array",
299
+ "items": { "type": "string" },
300
+ "description": "Arguments to pass to the script. Each supports {{variable}} interpolation."
301
+ },
302
+ "parameters": {
303
+ "type": "object",
304
+ "additionalProperties": { "type": "string" },
305
+ "description": "Environment variables to pass to the script. Values support {{variable}} interpolation."
306
+ },
307
+ "cwd": {
308
+ "type": "string",
309
+ "description": "Working directory for script execution. Supports {{variable}} interpolation."
310
+ }
311
+ }
312
+ },
270
313
  {
271
314
  "type": "object",
272
315
  "description": "Conditional value configuration",
@@ -821,6 +864,38 @@
821
864
  },
822
865
  "required": ["command"]
823
866
  },
867
+ "config-exec-file": {
868
+ "title": "Exec File Config",
869
+ "additionalProperties": false,
870
+ "type": "object",
871
+ "properties": {
872
+ "file": {
873
+ "type": "string",
874
+ "description": "Path to the file to execute (local or remote URL). Supports {{variable}} interpolation. Runtime will be auto-detected from file extension if not specified."
875
+ },
876
+ "runtime": {
877
+ "type": "string",
878
+ "enum": ["node", "bash", "sh", "pwsh", "powershell"],
879
+ "description": "Runtime environment to execute the file with. If not specified, will be auto-detected from file extension (.js/.cjs/.mjs -> node, .sh/.bash -> bash, .ps1 -> pwsh)."
880
+ },
881
+ "args": {
882
+ "type": "array",
883
+ "items": { "type": "string" },
884
+ "description": "Arguments to pass to the script. Each argument supports {{variable}} interpolation."
885
+ },
886
+ "parameters": {
887
+ "type": "object",
888
+ "additionalProperties": { "type": "string" },
889
+ "description": "Environment variables to pass to the script. Values support {{variable}} interpolation."
890
+ },
891
+ "cwd": {
892
+ "type": "string",
893
+ "description": "Working directory for script execution. Supports {{variable}} interpolation."
894
+ },
895
+ "condition": { "$ref": "#/$defs/condition" }
896
+ },
897
+ "required": ["file"]
898
+ },
824
899
  "config-move": {
825
900
  "title": "Move Config",
826
901
  "type": "object",
@@ -1 +0,0 @@
1
- import"./config-DfRbCqsT.js";import"./utils-CrJkuEEG.js";import{n as e,t}from"./run-tasks-BsR0t7C5.js";export{t as runTasks,e as runTemplatesSequentially};
@@ -1,26 +0,0 @@
1
- import{t as e}from"./config-DfRbCqsT.js";import{S as t,_ as n,a as r,b as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,t as p,u as m,v as h,x as g,y as _}from"./utils-CrJkuEEG.js";import v from"node:path";import y from"node:fs";import b from"node:process";import{promisify as x}from"node:util";import{execSync as S}from"node:child_process";import{confirm as ee,input as C,number as te,password as ne,select as re}from"@inquirer/prompts";import{camelCase as ie,capitalCase as ae,constantCase as oe,kebabCase as se,lowerCase as ce,pascalCase as le,snakeCase as ue,upperCase as de}from"case-anything";var w=class e extends t{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},T=class e extends t{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}},fe=class e extends t{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},E=class e extends t{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},D=class e extends t{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}},O=class e extends t{constructor(e,t,n){super(e,`TRANSFORMER_ERROR`),this.transformerId=t,this.reason=n,this.name=`TransformerError`}static notFound(t){return new e(`Transformer "${t}" not found`,t,`not_found`)}static executionFailed(t,n){return new e(`Transformer "${t}" execution failed: ${n}`,t,`execution_failed`)}static invalidType(t,n){return new e(`Invalid transformer type "${n}" for transformer "${t}"`,t,`invalid_type`)}};function pe(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let n=new Map,r=new Map,i=new Map;for(let t of e)if(n.set(t.name,t),i.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)i.get(t.name).add(e),r.has(e)||r.set(e,new Set),r.get(e).add(t.name);let a=new Set,o=new Map;for(let t=0;t<e.length;t++){let n=e[t],s=i.get(n.name).size>0,c=r.has(n.name)&&r.get(n.name).size>0;!s&&!c&&(a.add(n.name),o.set(n.name,t))}let s=e.filter(e=>!a.has(e.name)),c=[],l=new Set,u=new Set;function d(e){if(l.has(e))return;if(u.has(e))throw g.forTemplateDependencies(Array.from(u),e);u.add(e);let t=n.get(e);if(t!=null){let t=i.get(e);if(t!=null&&t.size>0)for(let e of t)d(e)}u.delete(e),l.add(e),t!=null&&!a.has(e)&&c.push(t)}for(let e of s)d(e.name);let f=[],p=0;for(let t=0;t<e.length;t++){let n=e[t];a.has(n.name)?f.push(n):p<c.length&&(f.push(c[p]),p++)}return f}const me=x(y.readFile),he={template:[[`template`,`templateFile`]]};function k(e){if(e==null||e===``)return`current template`;if(A(e))return e;let t=b.cwd();return e.startsWith(t)?v.relative(t,e):e}function A(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ge(e,t){if(A(e))return e;if(t==null||t===``)return v.isAbsolute(e)?e:v.resolve(b.cwd(),e);if(A(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw i.forRemoteTemplate(e,t)}let n=v.dirname(t);return v.isAbsolute(e)?e:v.resolve(n,e)}async function _e(e){if(A(e))return ve(e);if(!y.existsSync(e))throw h.forPath(e);return me(e,`utf-8`)}async function ve(e){try{let t=await fetch(e);if(!t.ok)throw n.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:n.forUrl(e,t instanceof Error?t:void 0)}}const j=new Map;async function ye(e,t=new Set){let n=A(e),r;if(r=n||v.isAbsolute(e)?e:v.resolve(b.cwd(),e),j.has(r))return j.get(r);if(t.has(r))throw g.forTemplateInheritance(t,r);t.add(r);let i;if(n)i=await ve(r);else{if(!y.existsSync(r))throw h.forPath(r);i=await me(r,`utf-8`)}let a;try{a=JSON.parse(i)}catch(e){throw _.forFile(r,e instanceof Error?e:Error(String(e)))}if(a.name==null||a.name.trim()===``)throw c.missingName(r);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(a.name))throw c.invalidNameFormat(r,a.name);if(a.tasks!==void 0&&!Array.isArray(a.tasks))throw c.tasksNotArray(r);a.tasks===void 0&&(a.tasks=[]);for(let e of a.tasks)e.$sourceUrl=r;return j.set(r,a),a}async function be(e,t,n,r,i){let a=A(e),o;if(o=a||v.isAbsolute(e)?e:t==null?v.resolve(b.cwd(),e):A(t)?new URL(e,t).href:v.resolve(t,e),n.has(o))return;if(r.has(o))throw g.forTemplateInheritance(r,o);r.add(o);let s=await ye(o),c=A(o)?new URL(`.`,o).href:v.dirname(o);if(s.extends!=null&&s.extends!==``){let e=Array.isArray(s.extends)?s.extends:[s.extends];for(let t of e)await be(t,c,n,r,i)}r.delete(o),n.add(o),i.push(s)}async function M(e,t,n=new Set){let r=[];return await be(e,t,n,new Set,r),pe(r)}async function xe(e,t,n=new Set){return Te(await M(e,t,n))}function Se(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw w.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw w.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw w.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function Ce(e,t){if((t.override??`merge`)===`replace`){r(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}r(` → Variable "${t.id}" merged (value replaced)`,`info`);let n={...e,...t};return delete n.override,n}function we(e,t){if((t.override??`merge`)===`replace`){r(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}r(` → Prompt "${t.id}" merged`,`info`);let n={...e,...t};return delete n.override,n}function Te(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return Se(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,i=new Map,a={};for(let o of e){if(o.enabled!=null&&(a[o.name]=o.enabled),o.enabled===!1){r(`⊘ Skipping disabled template "${o.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(o.prompts!=null)for(let e of o.prompts)if(i.has(e.id)){if(e.override==null)throw T.forPrompt(e.id);let t=we(i.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}if(o.variables!=null)for(let e of o.variables)if(n.has(e.id)){if(e.override==null)throw T.forVariable(e.id);let t=Ce(n.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),n.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),n.set(e.id,t)}for(let e of o.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw T.forTask(e.id,k(n.$sourceUrl),k(e.$sourceUrl))}let n=Oe(t.get(e.id),e);o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}else{let n={...e};o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}}let o=Array.from(t.values()),s=i.size>0?Array.from(i.values()):void 0,c=n.size>0?Array.from(n.values()):void 0;Se(o,c,s);let l=e[e.length-1],u={name:l.name,tasks:o};return l.description!=null&&(u.description=l.description),l.dependencies!=null&&(u.dependencies=l.dependencies),l.enabled!=null&&(u.enabled=l.enabled),s!=null&&(u.prompts=s),c!=null&&(u.variables=c),u}function Ee(e,t){let n=he[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function De(e,t,n){let r={...e},i=he[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function Oe(e,t){if((t.override??`merge`)===`replace`){r(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),r(` Base: ${k(e.$sourceUrl)}`,`info`),r(` Override: ${k(t.$sourceUrl)}`,`info`);let{override:n,...i}=t;return i}r(` → Merging task "${t.id}"`,`info`),r(` Base: ${k(e.$sourceUrl)}`,`info`),r(` Override: ${k(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=De(e.config,t.config,t.type);let i=Ee(t.type,n);i!==null&&i.length>0&&(r(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),r(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let i=[...e.dependencies??[],...t.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0,o=t.$sourceUrl??e.$sourceUrl,s={...e,...t,config:n,...a!=null&&{dependencies:a},...o!=null&&{$sourceUrl:o}};return delete s.override,s}function ke(){j.clear()}async function Ae(e,t){if(o(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await M(e);return o(`Loaded ${t.length} template(s) for processing`),{tasks:[],templates:t}}let n=await xe(e);r(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&r(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&r(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&r(`Found ${n.variables.length} top-level variable(s)`,`info`);let i={tasks:n.tasks??[]};return n.prompts!=null&&(i.prompts=n.prompts),n.variables!=null&&(i.variables=n.variables),n.enabled!=null&&(i.enabled=n.enabled),n.transformers!=null&&(i.transformers=n.transformers),i}function N(e){return e.template!=null&&e.template!==``}function P(e){return e.templateFile!=null&&e.templateFile!==``}function je(e){return e.endsWith(`.hbs`)}function F(e){let t=N(e),n=P(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function I(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=N(e),s=P(e);if(o)return u(e.template,t);if(s){let n=e.templateFile,r=i&&je(n),o=await _e(ge(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):u(o,t)}throw Error(`No template content available`)}function Me(e){return N(e)?`inline template`:P(e)?`template file: ${e.templateFile}`:`no template source`}const L=x(y.readFile),R={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function z(e,t){switch(t){case`add`:return`${R.green}+ ${e}${R.reset}`;case`remove`:return`${R.red}- ${e}${R.reset}`;case`context`:return`${R.gray} ${e}${R.reset}`;default:return e}}function B(e,t){let n=e.split(`
2
- `),r=t.split(`
3
- `),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(z(t,`context`)):(t!==void 0&&i.push(z(t,`remove`)),a!==void 0&&i.push(z(a,`add`)))}return i}async function Ne(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${R.red}✗ File not found: ${e.file}${R.reset}`;try{let r=await L(n,`utf-8`),i=JSON.parse(r),o={...i};function s(e){if(typeof e==`string`)return u(e,t);if(Array.isArray(e))return e.map(e=>s(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=s(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=s(n);t.includes(`.`)?a(i,t,e):i[t]=e}let c=JSON.stringify(o,null,2),l=JSON.stringify(i,null,2);if(c===l)return`${R.cyan}→ No changes${R.reset}`;let d=B(c,l);return`${R.blue}File: ${e.file}${R.reset}\n${d.join(`
4
- `)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function Pe(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;if(e.template==null||e.template===``)return`${R.red}✗ No template content provided for file: ${e.file}${R.reset}`;let n=v.join(b.cwd(),e.file),r=u(e.template,t);if(!y.existsSync(n)){let t=r.split(`
5
- `).slice(0,10).join(`
6
- `),n=r.split(`
7
- `).length>10;return`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created${R.reset}\n${R.gray}Content preview:${R.reset}\n${t}${n?`
8
- ...`:``}`}try{let t=await L(n,`utf-8`);if(t===r)return`${R.cyan}→ No changes${R.reset}`;let i=B(t,r);return`${R.blue}File: ${e.file}${R.reset}\n${i.join(`
9
- `)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function Fe(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let r=v.join(b.cwd(),e.file);if(y.existsSync(r))return`${R.cyan}→ File already exists, would be skipped: ${e.file}${R.reset}`;try{if(N(e)){let r=await I(e,t,n),i=r.split(`
10
- `).slice(0,10).join(`
11
- `),a=r.split(`
12
- `).length>10;return`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created${R.reset}\n${R.gray}Content preview:${R.reset}\n${i}${a?`
13
- ...`:``}`}let r=Me(e);return`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created from ${r}${R.reset}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function Ie(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${R.red}✗ File not found: ${e.file}${R.reset}`;try{let r=await L(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=u(e.replacement,t),o=r.replace(i,a);if(r===o)return`${R.cyan}→ No matches found${R.reset}`;let s=B(r,o);return`${R.blue}File: ${e.file}${R.reset}\n${s.join(`
14
- `)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function Le(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${R.red}✗ File not found: ${e.file}${R.reset}`;try{let r=await L(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=u(n,t),a=u(i,t);r=r.replace(e,a)}if(i===r)return`${R.cyan}→ No changes${R.reset}`;let a=B(i,r);return`${R.blue}File: ${e.file}${R.reset}\n${a.join(`
15
- `)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}function Re(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=e.paths.map(e=>u(e,t)).filter(e=>y.existsSync(v.join(b.cwd(),e)));return n.length===0?`${R.cyan}→ No files/directories to delete${R.reset}`:`${R.red}Would delete:${R.reset}\n${n.map(e=>`${R.red} - ${e}${R.reset}`).join(`
16
- `)}`}function ze(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=u(e.from,t),r=u(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);return y.existsSync(i)?y.existsSync(a)?`${R.yellow}⚠ Destination already exists: ${r}${R.reset}\n${R.cyan}Would rename: ${n} → ${r}${R.reset}`:`${R.cyan}Would rename: ${n} → ${r}${R.reset}`:`${R.red}✗ Source not found: ${n}${R.reset}`}function Be(e){if(e.condition!=null&&e.condition!==``)return`${R.yellow}⊘ Condition check skipped in dry-run${R.reset}`;let t=v.join(b.cwd(),`.git`),n=y.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${R.red}Would remove existing .git directory${R.reset}`),r.push(`${R.green}Would initialize git repository${R.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${R.green}Would create initial commit: "${t}"${R.reset}`)}return r.join(`
17
- `)}function Ve(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=u(e.command,t),r=e.cwd==null?b.cwd():u(e.cwd,t);return`${R.yellow}Would execute:${R.reset}\n${R.cyan} Command: ${n}${R.reset}\n${R.cyan} Working directory: ${r}${R.reset}`}function He(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=u(e.from,t),r=u(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);return y.existsSync(i)?y.existsSync(a)?`${R.yellow}⚠ Destination already exists: ${r}${R.reset}\n${R.cyan}Would move: ${n} → ${r}${R.reset}`:`${R.cyan}Would move: ${n} → ${r}${R.reset}`:`${R.red}✗ Source not found: ${n}${R.reset}`}function Ue(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=u(e.from,t),r=u(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);if(!y.existsSync(i))return`${R.red}✗ Source not found: ${n}${R.reset}`;let o=y.statSync(i).isDirectory()?`directory`:`file`;return y.existsSync(a)?`${R.yellow}⚠ Destination already exists: ${r}${R.reset}\n${R.cyan}Would copy ${o}: ${n} → ${r}${R.reset}`:`${R.cyan}Would copy ${o}: ${n} → ${r}${R.reset}`}async function We(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let r=v.join(b.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);try{let a=await I(i,t,n),o=a.split(`
18
- `).slice(0,10).join(`
19
- `),s=a.split(`
20
- `).length>10;return y.existsSync(r)?`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ Would append content${R.reset}\n${R.gray}Content preview:${R.reset}\n${o}${s?`
21
- ...`:``}`:`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created with content${R.reset}\n${R.gray}Content preview:${R.reset}\n${o}${s?`
22
- ...`:``}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}function Ge(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=u(e.path,t),r=v.join(b.cwd(),n);return y.existsSync(r)?`${R.cyan}→ Directory already exists: ${n}${R.reset}`:`${R.green}+ Would create directory: ${n}${R.reset}`}async function Ke(e,t){try{switch(e.type){case`update-json`:return await Ne(e.config,t);case`write`:return await Pe(e.config,t);case`create`:return await Fe(e.config,t,e);case`regex-replace`:return await Ie(e.config,t);case`replace-in-file`:return await Le(e.config,t);case`delete`:return Re(e.config,t);case`rename`:return ze(e.config,t);case`move`:return He(e.config,t);case`copy`:return Ue(e.config,t);case`append`:return await We(e.config,t,e);case`mkdir`:return Ge(e.config,t);case`git-init`:return Be(e.config);case`exec`:return Ve(e.config,t);default:{let t=e.type;return`${R.yellow}⚠ Diff not available for task type: ${t}${R.reset}`}}}catch(e){return`${R.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function V(e,t){console.log(`${R.blue}═══════════════════════════════════════════════════════${R.reset}`),console.log(`${R.blue} DRY RUN - Preview of changes${R.reset}`),console.log(`${R.blue}═══════════════════════════════════════════════════════${R.reset}`);for(let n of e){console.log(`${R.cyan}▶ Task: ${n.name}${R.reset}`),n.description!=null&&n.description!==``&&console.log(`${R.gray} ${n.description}${R.reset}`);let e=await Ke(n,t);console.log(e),console.log(`${R.gray}${`─`.repeat(55)}${R.reset}`)}console.log(`${R.blue}═══════════════════════════════════════════════════════${R.reset}`),console.log(`${R.yellow} No changes were applied (dry-run mode)${R.reset}`),console.log(`${R.blue}═══════════════════════════════════════════════════════${R.reset}`)}const H=new Map,U={},W=new Map;function G(e){if(e.name==null||e.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(e.taskTypes)||e.taskTypes.length===0)throw TypeError(`Plugin ${e.name} must define at least one task type`);if(typeof e.execute!=`function`)throw TypeError(`Plugin ${e.name} must provide an execute function`);if(H.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(W.has(t)){let e=W.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}H.set(e.name,e);for(let t of e.taskTypes)W.set(t,e.name);o(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function qe(e){let t=H.get(e);if(t!=null){for(let e of t.taskTypes)W.delete(e);H.delete(e)}}function Je(e){return H.get(e)}function K(e){let t=W.get(e);if(t!=null)return H.get(t)}function q(e){return W.has(e)}function Ye(){return Array.from(H.keys())}function Xe(){H.clear(),W.clear()}function Ze(e){e.beforeAll!=null&&(U.beforeAll=e.beforeAll),e.afterAll!=null&&(U.afterAll=e.afterAll),e.beforeTask!=null&&(U.beforeTask=e.beforeTask),e.afterTask!=null&&(U.afterTask=e.afterTask),e.onError!=null&&(U.onError=e.onError)}async function J(e,...t){let n=U[e];if(n!=null)try{e===`beforeAll`||e===`afterAll`?await n(t[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await n(t[0],t[1])}catch(t){r(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Qe(e,t,n){let r=K(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function $e(e,t){let n=K(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function et(e){let t=K(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function tt(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}const nt=new class{transformers=new Map;constructor(){this.registerBuiltInTransformers()}registerBuiltInTransformers(){for(let e of[{id:`lowercase`,type:`lowercase`},{id:`uppercase`,type:`uppercase`},{id:`trim`,type:`trim`},{id:`slugify`,type:`slugify`},{id:`capitalize`,type:`capitalize`},{id:`titlecase`,type:`titlecase`},{id:`camelcase`,type:`camelcase`},{id:`pascalcase`,type:`pascalcase`},{id:`snakecase`,type:`snakecase`},{id:`kebabcase`,type:`kebabcase`},{id:`constantcase`,type:`constantcase`},{id:`alphanumeric`,type:`alphanumeric`},{id:`collapse-spaces`,type:`collapse-spaces`},{id:`remove-spaces`,type:`remove-spaces`},{id:`urlencode`,type:`urlencode`},{id:`dasherize`,type:`dasherize`},{id:`underscore`,type:`underscore`}])this.transformers.set(e.id,e)}register(e){this.transformers.has(e.id)&&r(`Transformer with id "${e.id}" is already registered. Overwriting.`,`warn`),this.transformers.set(e.id,e)}registerAll(e){for(let t of e)this.register(t)}get(e){return this.transformers.get(e)}has(e){return this.transformers.has(e)}async execute(e,t,n={}){let r=this.transformers.get(e);if(!r)throw O.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof O?t:O.executionFailed(e,t instanceof Error?t.message:String(t))}}async executeChain(e,t,n={}){let r=t;for(let t of e)r=await this.execute(t,r,n);return r}async apply(e,t,n={}){return e===void 0?t:this.executeChain(e,t,n)}validate(e){if(e===void 0)return[];let t=e,n=[];for(let e of t)this.has(e)||n.push(`Transformer "${e}" not found`);return n}async executeTransformer(e,t,n){switch(e.type){case`regex`:return this.executeRegex(e,t);case`computed`:return this.executeComputed(e,t,n);case`lowercase`:return this.executeLowercase(t);case`uppercase`:return this.executeUppercase(t);case`trim`:return this.executeTrim(t);case`slugify`:return this.executeSlugify(t);case`capitalize`:return this.executeCapitalize(t);case`titlecase`:return this.executeTitlecase(t);case`camelcase`:return this.executeCamelcase(t);case`pascalcase`:return this.executePascalcase(t);case`snakecase`:return this.executeSnakecase(t);case`kebabcase`:return this.executeKebabcase(t);case`constantcase`:return this.executeConstantcase(t);case`alphanumeric`:return this.executeAlphanumeric(t);case`collapse-spaces`:return this.executeCollapseSpaces(t);case`remove-spaces`:return this.executeRemoveSpaces(t);case`urlencode`:return this.executeUrlencode(t);case`dasherize`:return this.executeDasherize(t);case`underscore`:return this.executeUnderscore(t);case`custom`:return this.executeCustom(e,t,n);case`chain`:return this.executeChainTransformer(e,t,n);default:{let t=e;throw O.invalidType(t.id,t.type)}}}executeRegex(e,t){let n=String(t),{pattern:r,flags:i,replacement:a}=e.config;try{let e=new RegExp(r,i);return n.replace(e,a)}catch(t){throw O.executionFailed(e.id,`Invalid regex pattern: ${t instanceof Error?t.message:String(t)}`)}}executeComputed(e,t,n){let{expression:r}=e.config;try{return Function(`value`,`context`,...Object.keys(n),`return ${r}`)(t,n,...Object.values(n))}catch(t){throw O.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return ce(String(e))}executeUppercase(e){return de(String(e))}executeTrim(e){return String(e).trim()}executeSlugify(e){return String(e).toLowerCase().trim().replace(/[\s_]+/gu,`-`).replace(/[^\w-]+/gu,``).replace(/-{2,}/gu,`-`).replace(/^-+/u,``).replace(/-+$/u,``)}async executeCustom(e,t,n){let{handler:r}=e.config;if(typeof r==`function`)return r(t,n);throw O.executionFailed(e.id,`String-based custom handlers are not yet supported. Please use function handlers.`)}async executeChainTransformer(e,t,n){let{transformers:r}=e.config;if(r.length===0)throw O.executionFailed(e.id,`Chain transformer must have at least one transformer`);return this.executeChain(r,t,n)}executeCapitalize(e){return ae(String(e))}executeTitlecase(e){return ae(String(e))}executeCamelcase(e){return ie(String(e))}executePascalcase(e){return le(String(e))}executeSnakecase(e){return ue(String(e))}executeKebabcase(e){return se(String(e))}executeConstantcase(e){return oe(String(e))}executeAlphanumeric(e){return String(e).replace(/[^a-zA-Z0-9]/gu,``)}executeCollapseSpaces(e){return String(e).replace(/\s+/gu,` `)}executeRemoveSpaces(e){return String(e).replace(/\s/gu,``)}executeUrlencode(e){return encodeURIComponent(String(e))}executeDasherize(e){return se(String(e))}executeUnderscore(e){return ue(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};function rt(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function it(e){return e===void 0||typeof e==`boolean`?e:typeof e==`string`?{type:`condition`,value:e}:typeof e==`object`&&e&&`condition`in e&&!(`type`in e)?{type:`condition`,value:e.condition}:e}async function Y(e,t){let n=it(e);if(n===void 0)return!0;if(typeof n==`boolean`)return n;if(typeof n==`object`&&n&&`type`in n){if(n.type===`exec`)try{let{execSync:e}=await import(`node:child_process`),{interpolateTemplate:r}=await import(`./utils-B6WSsvMT.js`);return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await import(`./utils-B6WSsvMT.js`);if(typeof e==`object`&&e&&`status`in e&&typeof e.status==`number`){let{status:r}=e;if(r>=1&&r<=255)return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}if(n.type===`condition`)return rt(n.value,t)}return!0}async function X(e,t,n){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!n)return;if(typeof i.condition!=`string`){r(`Prompt "${t}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-B6WSsvMT.js`),r=e(i.condition,n)?i.ifTrue:i.ifFalse;return typeof r==`object`&&r?await X(r,t,n):r}catch(e){r(`Prompt "${t}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){r(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=S(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){o(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){r(`Prompt "${t}": interpolate default value must be a string with {{variable}} placeholders`,`error`);return}if(!n)return r(`Prompt "${t}": interpolate default value requires context but none provided`,`warn`),e;try{return u(e,n)}catch(n){return r(`Prompt "${t}": failed to interpolate interpolate default value: ${n instanceof Error?n.message:`Unknown error`}`,`warn`),e}}else if(i.type!==void 0){r(`Prompt "${t}": unknown default value type "${i.type}". Expected "static", "exec", "conditional", or "interpolate".`,`error`);return}return e}async function at(e,t=new Map,n={}){let i={};if(e.length===0)return i;for(let a of e){if(a.$templateEnabled!=null&&!await m(a.$templateEnabled,{...n,...i}))continue;let e={...n,...i};if(await m(a.enabled,e))try{let n,o=t.get(a.id);switch(a.default!==void 0&&(o=await X(a.default,a.id,e)),a.type){case`input`:{let t={message:a.message};o!==void 0&&(t.default=String(o));let i=await Y(a.required,e);if(i!==void 0&&(t.required=i),n=await C(t),i&&(n==null||typeof n==`string`&&n.trim()===``))throw r(`${a.message} is required`,`error`),E.required(a.id);break}case`password`:if(n=await ne({message:a.message,mask:`*`}),await Y(a.required,e)&&(n==null||typeof n==`string`&&n.trim()===``))throw r(`${a.message} is required`,`error`),E.required(a.id);break;case`number`:{let t={message:a.message};o!==void 0&&(t.default=Number(o));let i=await Y(a.required,e);if(i!==void 0&&(t.required=i),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),n=await te(t),i&&n==null)throw r(`${a.message} is required`,`error`),E.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};o!==void 0&&(e.default=o),n=await re(e);break}case`confirm`:{let e=o===void 0?!1:!!o;n=await ee({message:a.message,default:e});break}default:throw r(`Unknown prompt type: ${a.type}`,`error`),E.unknownType(a.type)}a.transformers!==void 0&&(n=await nt.apply(a.transformers,n,{...e,...i})),i[a.id]=n}catch(e){throw e instanceof Error&&r(`Failed to collect prompt "${a.id}": ${e.message}`,`error`),e}}return i}async function ot(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await X(e.default,e.id,t);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function st(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const ct=x(y.appendFile),lt=x(y.readFile),ut=x(y.stat);async function dt(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping append task`,`info`);return}let i=v.join(b.cwd(),e.file),a={};e.content==null?e.template!=null&&(a.template=e.template):a.template=e.content,e.templateFile!=null&&(a.templateFile=e.templateFile);let o=F(a);if(!o.isValid)throw o.error?.includes(`cannot have both`)?D.templateHasBothTemplateAndFile():D.templateMissingTemplateOrFile();let s=await I(a,t,n),c=!1,l=!1;try{await ut(i),c=!0;let t=await lt(i,`utf-8`);t.length>0&&!t.endsWith(`
23
- `)&&(l=e.newline!==!1)}catch{}c&&l?await ct(i,`\n${s}`):await ct(i,s),r(`Appended content to ${e.file}`,`success`)}const ft={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await dt(e.config,t,e)}},pt=x(y.copyFile),mt=x(y.stat),ht=x(y.mkdir),gt=x(y.readdir);async function _t(e,t){await ht(t,{recursive:!0});let n=await gt(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=v.join(e,n.name),i=v.join(t,n.name);n.isDirectory()?await _t(r,i):await pt(r,i)}))}async function vt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping copy task`,`info`);return}let n=v.join(b.cwd(),e.from),i=v.join(b.cwd(),e.to),a;try{a=await mt(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await ht(v.dirname(i),{recursive:!0}),a.isDirectory()?(await _t(n,i),r(`Copied directory ${e.from} to ${e.to}`,`success`)):(await pt(n,i),r(`Copied file ${e.from} to ${e.to}`,`success`))}const yt={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=x(y.writeFile);async function xt(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping create task`,`info`);return}let i=v.join(b.cwd(),e.file);if(y.existsSync(i)){r(`File already exists, skipping: ${e.file}`,`info`);return}let a=F(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?D.createHasBothTemplateAndFile():D.createMissingTemplateOrFile();let o=await I(e,t,n),s=v.dirname(i);y.existsSync(s)||y.mkdirSync(s,{recursive:!0}),await bt(i,o),r(`Created file: ${e.file}`,`success`)}const St={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await xt(e.config,t,e)}};async function Ct(e,t){let{paths:n,condition:i}=e;if(i!=null&&i!==``){if(!t){r(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!p(i,t)){r(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=v.join(b.cwd(),e);y.existsSync(t)&&y.rmSync(t,{recursive:!0,force:!0})}}const wt={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Ct(e.config,t)}};async function Tt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!p(e.condition,t)){r(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?b.cwd():v.join(b.cwd(),e.cwd);S(e.command,{cwd:n,stdio:`inherit`})}const Et={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Tt(e.config,t)}};async function Dt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!p(e.condition,t)){r(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=v.join(b.cwd(),`.git`);y.existsSync(e)&&y.rmSync(e,{recursive:!0,force:!0})}if(S(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;S(`git add .`,{stdio:`inherit`}),S(`git commit -m "${t}"`,{stdio:`inherit`})}}const Ot={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Dt(e.config,t)}},kt=x(y.mkdir);async function At(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping mkdir task`,`info`);return}await kt(v.join(b.cwd(),e.path),{recursive:!0}),r(`Created directory: ${e.path}`,`success`)}const jt={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await At(e.config,t)}},Mt=x(y.rename),Nt=x(y.stat),Pt=x(y.mkdir);async function Ft(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping move task`,`info`);return}let n=v.join(b.cwd(),e.from),i=v.join(b.cwd(),e.to);try{await Nt(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await Pt(v.dirname(i),{recursive:!0}),await Mt(n,i),r(`Moved ${e.from} to ${e.to}`,`success`)}const It={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Ft(e.config,t)}},Lt=x(y.readFile),Rt=x(y.writeFile);async function zt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping regex-replace task`,`info`);return}let n=v.join(b.cwd(),e.file),{pattern:i}=e,a=e.flags??``,o=e.replacement||``,s=await Lt(n,`utf-8`),c=new RegExp(i,a);s=s.replace(c,u(o,t)),await Rt(n,s)}const Bt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await zt(e.config,t)}},Vt=x(y.rename);async function Ht(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping rename task`,`info`);return}let n=v.join(b.cwd(),u(e.from,t)),i=v.join(b.cwd(),u(e.to,t));if(!y.existsSync(n)){r(`Source path does not exist: ${n}`,`warn`);return}await Vt(n,i)}const Ut={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Ht(e.config,t)}},Wt=x(y.readFile),Gt=x(y.writeFile);async function Kt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping replace-in-file task`,`info`);return}let n=v.join(b.cwd(),e.file),{replacements:i}=e;if(!y.existsSync(n)){r(`File not found: ${n}, skipping`,`warn`);return}let a=await Wt(n,`utf-8`);for(let{find:e,replace:n}of i){let r=u(n,t);a=a.replace(new RegExp(e,`gu`),r)}await Gt(n,a)}const qt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Kt(e.config,t)}},Jt=x(y.readFile),Yt=x(y.writeFile);async function Xt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping update-json task`,`info`);return}let n=v.join(b.cwd(),e.file),{updates:i}=e,o=await Jt(n,`utf-8`),s=JSON.parse(o);function c(e){if(typeof e==`string`)return u(e,t);if(Array.isArray(e))return e.map(e=>c(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=c(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=c(t);e.includes(`.`)?a(s,e,n):s[e]=n}await Yt(n,`${JSON.stringify(s,null,2)}\n`)}const Zt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Xt(e.config,t)}},Qt=x(y.writeFile);async function $t(e,t,n){let{allowCreate:i=!0}=e;if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping write task`,`info`);return}let a=v.join(b.cwd(),e.file);if(!y.existsSync(a)){if(i===!1)throw Error(`Write task failed: file does not exist (${e.file})`);r(`File not found, creating new file: ${e.file}`,`info`)}let o=F(e);if(!o.isValid)throw o.error?.includes(`cannot have both`)?D.templateHasBothTemplateAndFile():D.templateMissingTemplateOrFile();let s=await I(e,t,n),c=v.dirname(a);y.existsSync(c)||y.mkdirSync(c,{recursive:!0}),await Qt(a,s)}const en={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await $t(e.config,t,e)}};function Z(){q(`update-json`)||(G(Zt),G(en),G(St),G(Bt),G(qt),G(wt),G(Ut),G(Ot),G(Et),G(It),G(yt),G(ft),G(jt))}async function tn(e,t,n=!1){if(Z(),n){r(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(q(e.type)){await Qe(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function nn(e,t,n,i,a=!1){try{return r(`[${n}/${i}] Running: ${e.name}...`,`info`),await tn(e,t,a),r(`[${n}/${i}] Completed: ${e.name}...`,`success`),!0}catch(t){return r(`Failed: ${e.name}`,`error`),t instanceof Error&&(r(` Reason: ${t.message}`,`error`),t.stack!=null&&b.env.DEBUG!=null&&console.error(t.stack)),!1}}function rn(e){let t=[],n=new Set,r=new Set,i=new Map(e.map(e=>[e.id,e]));function a(e){if(n.has(e))return;if(r.has(e))throw g.forTaskDependency(e);r.add(e);let o=i.get(e);if(!o)throw fe.forId(e);if(o.dependencies)for(let e of o.dependencies)a(e);r.delete(e),n.add(e),t.push(o)}for(let t of e)n.has(t.id)||a(t.id);return t}function an(e){let t=[];for(let n of e)if(!q(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=on(n);t.push(...e)}return t}function on(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=F({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function sn(e){r(`❌ Template validation failed:`,`error`),r(``,`error`);for(let t of e)r(` • ${t}`,`error`);r(``,`error`),r(`Please fix these errors before continuing.`,`error`)}async function Q(e,t=new Map,n={}){let r={};for(let i of e){let e=t.get(i.id);e!==void 0&&(i.transformers!==void 0&&(e=await nt.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function cn(e,t,n){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!n){r(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof i.condition!=`string`){r(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-B6WSsvMT.js`),r=e(i.condition,n)?i.ifTrue:i.ifFalse;return typeof r==`object`&&r?await cn(r,t,n):r}catch(e){r(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){r(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=S(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){r(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){r(`Variable "${t}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!n)return r(`Variable "${t}": interpolate value requires context but none provided`,`warn`),e;try{return u(e,n)}catch(n){return r(`Variable "${t}": failed to interpolate interpolate value: ${n instanceof Error?n.message:`Unknown error`}`,`warn`),e}}else if(i.type!==void 0){r(`Variable "${t}": unknown value type "${i.type}". Expected "static", "exec", "conditional", or "interpolate".`,`error`);return}return e}async function $(e,t,n){let r=new Map;for(let i of e){if(n?.skipConditional===!0&&typeof i.value==`object`&&i.value!==null&&!Array.isArray(i.value)&&i.value.type===`conditional`)continue;if(i.$templateEnabled!=null){let e={...t};for(let[t,n]of r.entries())e[t]=n;if(!await m(i.$templateEnabled,e))continue}let e={...t};for(let[t,n]of r.entries())e[t]=n;let a=await cn(i.value,i.id,e);a!==void 0&&r.set(i.id,a)}return r}function ln(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function un(t,n){let i=e();if(!await m(n.templateEnabled,i,{lazy:!0})){s(`⊘ Template is disabled - skipping all execution`);return}n.transformers!==void 0&&n.transformers.length>0&&(o(`Registering ${n.transformers.length} transformer(s)...`),nt.registerAll(n.transformers)),o(`Registering built-in plugins...`),Z(),o(`Validating task configurations...`);let a=an(t);a.length>0&&(sn(a),b.exit(1)),o(`All tasks validated successfully`);let c=t.filter(t=>d(t.enabled,e(),{lazy:!0}));o(`Resolving task dependencies...`);let u=rn(c);o(`Sorted ${u.length} task(s) by dependencies`),s(`Welcome! Let's execute your tasks.`),n.dryRun&&l(`🔍 DRY RUN MODE - No changes will be made`),s(`This will execute your project tasks based on the defined configuration.`);let p=i,h=[...n.variables??[]];if(h.length>0){let e=ln(h);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1)),o(`Resolving variable values...`);let t=await Q(h,await $(h,p,{skipConditional:!0}),p);Object.assign(p,t),Object.keys(t).length>0&&(o(`Resolved ${Object.keys(t).length} variable(s)`),o(`Variable values: ${JSON.stringify(t)}`))}let g=n.prompts??[],_=[...g];if(_.length>0){let e=st(_);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1)),o(`Resolving prompt default values...`);let t=await ot(_,p);if(g.length>0){s(`📋 Collecting prompts (available to all tasks):`);let e=await at(g,t,p);Object.assign(p,e)}}if(h.length>0){let e=h.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){o(`Re-resolving conditional variables with prompt values...`);let t=await Q(e,await $(e,p),p);Object.assign(p,t),Object.keys(t).length>0&&o(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await m(n.templateEnabled,p)){s(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let v=[];for(let e of u)e.$templateEnabled!=null&&!await m(e.$templateEnabled,p)||await m(e.enabled,p)&&v.push(e);if(r(`${v.length} of ${u.length} task(s) enabled for execution`,`info`),n.dryRun){await V(v,p),s(`🔍 Dry run completed - no changes were made`),s(`Run without --dry-run to apply changes`);return}o(`Calling beforeAll hook...`),await J(`beforeAll`,p);let y=v.length,x=0,S=0,ee=[],C=[];for(let e=0;e<v.length;e++){let t=v[e];t!=null&&(o(`Calling beforeTask hook for task: ${t.name}`),await J(`beforeTask`,t,p),await nn(t,p,e+1,y,n.dryRun)?(x++,ee.push(t.id),o(`Calling afterTask hook for task: ${t.name}`),await J(`afterTask`,t,p)):(await Y(t.required,p)&&(S++,C.push(t.name)),o(`Calling onError hook for task: ${t.name}`),await J(`onError`,Error(`Task ${t.name} failed`),t),l(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}S>0&&(r(`\n❌ Task execution completed with ${S} error(s)`,`error`),r(`Completed: ${x}/${y} tasks`,`info`),r(`Failed tasks: ${C.join(`, `)}`,`error`),b.exit(1)),o(`Calling afterAll hook...`),await J(`afterAll`,p),f(`✅ All tasks completed successfully!`),f(` Completed: ${x}/${y} tasks`)}async function dn(e,t,n={}){o(`Running templates with sequential variable/prompt resolution...`),o(`Total templates to process: ${e.length}`),o(`Registering built-in plugins...`),Z();let i=[];console.log(``),s(`📋 Collecting input...`),console.log(``);for(let t=0;t<e.length;t++){let a=e[t];if(a==null)continue;let c=`=`.repeat(60);if(o(`\n${c}`),o(`Processing template ${t+1}/${e.length}: "${a.name}"`),o(c),o(`Current config keys: ${Object.keys(n).join(`, `)}`),!await m(a.enabled,n)){s(`⊘ Template "${a.name}" is disabled - skipping`),o(` Enabled condition: ${JSON.stringify(a.enabled)}`);continue}let l=a.variables??[];if(l.length>0){o(`Processing ${l.length} variable(s) for template "${a.name}"...`);let e=ln(l);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1));let t=await Q(l,await $(l,n,{skipConditional:!0}),n);Object.assign(n,t);let i=l.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),s=0;if(i.length>0){let e=await Q(i,await $(i,n),n);if(s=Object.keys(e).length,Object.assign(n,e),s>0){o(`Resolved ${s} conditional variable(s)`);for(let[t,n]of Object.entries(e))o(` ${t} = ${JSON.stringify(n)}`)}}let c=Object.keys(t).length+s;if(c>0){o(`Total variables resolved for template: ${c}`);for(let[e,n]of Object.entries(t))o(` ${e} = ${JSON.stringify(n)}`)}}let u=a.prompts??[];if(u.length>0){o(`Processing ${u.length} prompt(s) for template "${a.name}"...`);let e=st(u);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1));let t=await at(u,await ot(u,n),n);Object.assign(n,t),o(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await m(a.enabled,n)){s(`⊘ Template "${a.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let d=a.tasks??[];d.length>0&&(o(`Found ${d.length} task(s) in template "${a.name}" (will execute later)`),i.push(...d))}if(o(`
24
- 🔧 Validating and filtering all collected tasks...`),i.length===0){r(`No tasks found in any template`,`info`);return}let a=an(i);a.length>0&&(sn(a),b.exit(1)),console.log(``),r(`🛠️ Preparing tasks...`,`info`);let c=[];for(let e of i)await m(e.enabled,n)&&c.push(e);if(console.log(``),r(`Found ${i.length} tasks (${c.length} enabled)`,`info`),r(`All tasks validated successfully`,`success`),c.length===0){r(`No enabled tasks to execute`,`info`);return}let u=rn(c);if(t.dryRun){r(`
25
- 🔍 Dry run - showing task changes...`,`info`),await V(u,n),r(`
26
- 🔍 Dry run completed - no changes were made`,`info`),r(`Run without --dry-run to apply changes`,`info`);return}console.log(``),s(`⚙️ Executing tasks...`),console.log(``),await J(`beforeAll`,n);let d=0,f=0,p=[];for(let e=0;e<u.length;e++){let r=u[e];r!=null&&(await J(`beforeTask`,r,n),await nn(r,n,e+1,u.length,t.dryRun)?(d++,await J(`afterTask`,r,n)):(await Y(r.required,n)&&(f++,p.push(r.name)),await J(`onError`,Error(`Task ${r.name} failed`),r),l(`⚠️ Task "${r.name}" failed, continuing with remaining tasks...`)))}await J(`afterAll`,n),f>0&&(r(`\n❌ Task execution completed with ${f} error(s)`,`error`),r(`Completed: ${d}/${u.length} tasks`,`info`),r(`Failed tasks: ${p.join(`, `)}`,`error`),b.exit(1)),r(`Completed: ${d}/${u.length} tasks`,`success`)}export{Re as A,N as B,Ye as C,et as D,qe as E,Le as F,ke as G,I as H,Ke as I,ye as J,xe as K,Ne as L,Be as M,Ie as N,V as O,ze as P,Pe as R,q as S,G as T,je as U,P as V,F as W,Te as X,M as Y,tt as _,cn as a,K as b,tn as c,st as d,ot as f,Xe as g,J as h,$ as i,Ve as j,Fe as k,Z as l,X as m,dn as n,Q as o,at as p,Ae as q,ln as r,rn as s,un as t,nn as u,Qe as v,Ze as w,$e as x,Je as y,Me as z};
@@ -1,26 +0,0 @@
1
- const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./config-DlJs75hK.cjs`),n=require(`./utils-Bz23aLK_.cjs`);let r=require(`node:fs`);r=e.t(r);let i=require(`node:path`);i=e.t(i);let a=require(`node:process`);a=e.t(a);let o=require(`node:util`);o=e.t(o);let s=require(`node:child_process`);s=e.t(s);let c=require(`@inquirer/prompts`);c=e.t(c);let l=require(`case-anything`);l=e.t(l);var u=class e extends n.S{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},d=class e extends n.S{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}},f=class e extends n.S{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},p=class e extends n.S{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},m=class e extends n.S{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}},h=class e extends n.S{constructor(e,t,n){super(e,`TRANSFORMER_ERROR`),this.transformerId=t,this.reason=n,this.name=`TransformerError`}static notFound(t){return new e(`Transformer "${t}" not found`,t,`not_found`)}static executionFailed(t,n){return new e(`Transformer "${t}" execution failed: ${n}`,t,`execution_failed`)}static invalidType(t,n){return new e(`Invalid transformer type "${n}" for transformer "${t}"`,t,`invalid_type`)}};function g(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let r=new Map,i=new Map,a=new Map;for(let t of e)if(r.set(t.name,t),a.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)a.get(t.name).add(e),i.has(e)||i.set(e,new Set),i.get(e).add(t.name);let o=new Set,s=new Map;for(let t=0;t<e.length;t++){let n=e[t],r=a.get(n.name).size>0,c=i.has(n.name)&&i.get(n.name).size>0;!r&&!c&&(o.add(n.name),s.set(n.name,t))}let c=e.filter(e=>!o.has(e.name)),l=[],u=new Set,d=new Set;function f(e){if(u.has(e))return;if(d.has(e))throw n.x.forTemplateDependencies(Array.from(d),e);d.add(e);let t=r.get(e);if(t!=null){let t=a.get(e);if(t!=null&&t.size>0)for(let e of t)f(e)}d.delete(e),u.add(e),t!=null&&!o.has(e)&&l.push(t)}for(let e of c)f(e.name);let p=[],m=0;for(let t=0;t<e.length;t++){let n=e[t];o.has(n.name)?p.push(n):m<l.length&&(p.push(l[m]),m++)}return p}const _=(0,o.promisify)(r.default.readFile),v={template:[[`template`,`templateFile`]]};function y(e){if(e==null||e===``)return`current template`;if(b(e))return e;let t=a.default.cwd();return e.startsWith(t)?i.default.relative(t,e):e}function b(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ee(e,t){if(b(e))return e;if(t==null||t===``)return i.default.isAbsolute(e)?e:i.default.resolve(a.default.cwd(),e);if(b(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw n.b.forRemoteTemplate(e,t)}let r=i.default.dirname(t);return i.default.isAbsolute(e)?e:i.default.resolve(r,e)}async function te(e){if(b(e))return ne(e);if(!r.default.existsSync(e))throw n.v.forPath(e);return _(e,`utf-8`)}async function ne(e){try{let t=await fetch(e);if(!t.ok)throw n._.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:n._.forUrl(e,t instanceof Error?t:void 0)}}const x=new Map;async function re(e,t=new Set){let o=b(e),s;if(s=o||i.default.isAbsolute(e)?e:i.default.resolve(a.default.cwd(),e),x.has(s))return x.get(s);if(t.has(s))throw n.x.forTemplateInheritance(t,s);t.add(s);let c;if(o)c=await ne(s);else{if(!r.default.existsSync(s))throw n.v.forPath(s);c=await _(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(e){throw n.y.forFile(s,e instanceof Error?e:Error(String(e)))}if(l.name==null||l.name.trim()===``)throw n.g.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw n.g.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw n.g.tasksNotArray(s);l.tasks===void 0&&(l.tasks=[]);for(let e of l.tasks)e.$sourceUrl=s;return x.set(s,l),l}async function ie(e,t,r,o,s){let c=b(e),l;if(l=c||i.default.isAbsolute(e)?e:t==null?i.default.resolve(a.default.cwd(),e):b(t)?new URL(e,t).href:i.default.resolve(t,e),r.has(l))return;if(o.has(l))throw n.x.forTemplateInheritance(o,l);o.add(l);let u=await re(l),d=b(l)?new URL(`.`,l).href:i.default.dirname(l);if(u.extends!=null&&u.extends!==``){let e=Array.isArray(u.extends)?u.extends:[u.extends];for(let t of e)await ie(t,d,r,o,s)}o.delete(l),r.add(l),s.push(u)}async function S(e,t,n=new Set){let r=[];return await ie(e,t,n,new Set,r),g(r)}async function ae(e,t,n=new Set){return le(await S(e,t,n))}function oe(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw u.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw u.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw u.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function se(e,t){if((t.override??`merge`)===`replace`){n.a(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...r}=t;return r}n.a(` → Variable "${t.id}" merged (value replaced)`,`info`);let r={...e,...t};return delete r.override,r}function ce(e,t){if((t.override??`merge`)===`replace`){n.a(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...r}=t;return r}n.a(` → Prompt "${t.id}" merged`,`info`);let r={...e,...t};return delete r.override,r}function le(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return oe(t.tasks??[],t.variables,t.prompts),t}let t=new Map,r=new Map,i=new Map,a={};for(let o of e){if(o.enabled!=null&&(a[o.name]=o.enabled),o.enabled===!1){n.a(`⊘ Skipping disabled template "${o.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(o.prompts!=null)for(let e of o.prompts)if(i.has(e.id)){if(e.override==null)throw d.forPrompt(e.id);let t=ce(i.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}if(o.variables!=null)for(let e of o.variables)if(r.has(e.id)){if(e.override==null)throw d.forVariable(e.id);let t=se(r.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}for(let e of o.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw d.forTask(e.id,y(n.$sourceUrl),y(e.$sourceUrl))}let n=fe(t.get(e.id),e);o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}else{let n={...e};o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}}let o=Array.from(t.values()),s=i.size>0?Array.from(i.values()):void 0,c=r.size>0?Array.from(r.values()):void 0;oe(o,c,s);let l=e[e.length-1],u={name:l.name,tasks:o};return l.description!=null&&(u.description=l.description),l.dependencies!=null&&(u.dependencies=l.dependencies),l.enabled!=null&&(u.enabled=l.enabled),s!=null&&(u.prompts=s),c!=null&&(u.variables=c),u}function ue(e,t){let n=v[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function de(e,t,n){let r={...e},i=v[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function fe(e,t){if((t.override??`merge`)===`replace`){n.a(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),n.a(` Base: ${y(e.$sourceUrl)}`,`info`),n.a(` Override: ${y(t.$sourceUrl)}`,`info`);let{override:r,...i}=t;return i}n.a(` → Merging task "${t.id}"`,`info`),n.a(` Base: ${y(e.$sourceUrl)}`,`info`),n.a(` Override: ${y(t.$sourceUrl)}`,`info`);let r;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){r=de(e.config,t.config,t.type);let i=ue(t.type,r);i!==null&&i.length>0&&(n.a(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),n.a(` Please use override: "replace" or specify only one of these fields`,`warn`))}else r=t.config??e.config;let i=[...e.dependencies??[],...t.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0,o=t.$sourceUrl??e.$sourceUrl,s={...e,...t,config:r,...a!=null&&{dependencies:a},...o!=null&&{$sourceUrl:o}};return delete s.override,s}function pe(){x.clear()}async function me(e,t){if(n.d(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await S(e);return n.d(`Loaded ${t.length} template(s) for processing`),{tasks:[],templates:t}}let r=await ae(e);n.a(`Loaded ${r.tasks?.length??0} task(s)`,`info`),r.extends!=null&&r.extends!==``&&n.a(`Extended from: ${(Array.isArray(r.extends)?r.extends:[r.extends]).join(`, `)}`,`info`),r.prompts!=null&&r.prompts.length>0&&n.a(`Found ${r.prompts.length} top-level prompt(s)`,`info`),r.variables!=null&&r.variables.length>0&&n.a(`Found ${r.variables.length} top-level variable(s)`,`info`);let i={tasks:r.tasks??[]};return r.prompts!=null&&(i.prompts=r.prompts),r.variables!=null&&(i.variables=r.variables),r.enabled!=null&&(i.enabled=r.enabled),r.transformers!=null&&(i.transformers=r.transformers),i}function C(e){return e.template!=null&&e.template!==``}function w(e){return e.templateFile!=null&&e.templateFile!==``}function he(e){return e.endsWith(`.hbs`)}function T(e){let t=C(e),n=w(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function E(e,t,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=C(e),c=w(e);if(s)return n.i(e.template,t);if(c){let r=e.templateFile,i=a&&he(r),s=await te(ee(r,o));return i?(await import(`handlebars`)).default.compile(s)(t):n.i(s,t)}throw Error(`No template content available`)}function D(e){return C(e)?`inline template`:w(e)?`template file: ${e.templateFile}`:`no template source`}const O=(0,o.promisify)(r.default.readFile),ge=2,_e=10,ve=55,k={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function A(e,t){switch(t){case`add`:return`${k.green}+ ${e}${k.reset}`;case`remove`:return`${k.red}- ${e}${k.reset}`;case`context`:return`${k.gray} ${e}${k.reset}`;default:return e}}function j(e,t){let n=e.split(`
2
- `),r=t.split(`
3
- `),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(A(t,`context`)):(t!==void 0&&i.push(A(t,`remove`)),a!==void 0&&i.push(A(a,`add`)))}return i}async function ye(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${k.yellow}⊘ Condition not met - task would be skipped${k.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${k.red}✗ File not found: ${e.file}${k.reset}`;try{let r=await O(o,`utf-8`),i=JSON.parse(r),a={...i};function s(e){if(typeof e==`string`)return n.i(e,t);if(Array.isArray(e))return e.map(e=>s(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=s(r);return t}return e}for(let[t,r]of Object.entries(e.updates)){let e=s(r);t.includes(`.`)?n.c(i,t,e):i[t]=e}let c=JSON.stringify(a,null,2),l=JSON.stringify(i,null,2);if(c===l)return`${k.cyan}→ No changes${k.reset}`;let u=j(c,l);return`${k.blue}File: ${e.file}${k.reset}\n${u.join(`
4
- `)}`}catch(e){return`${k.red}✗ Error: ${e instanceof Error?e.message:String(e)}${k.reset}`}}async function be(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${k.yellow}⊘ Condition not met - task would be skipped${k.reset}`;if(e.template==null||e.template===``)return`${k.red}✗ No template content provided for file: ${e.file}${k.reset}`;let o=i.default.join(a.default.cwd(),e.file),s=n.i(e.template,t);if(!r.default.existsSync(o)){let t=s.split(`
5
- `).slice(0,10).join(`
6
- `),n=s.split(`
7
- `).length>10;return`${k.blue}File: ${e.file}${k.reset}\n${k.green}+ New file would be created${k.reset}\n${k.gray}Content preview:${k.reset}\n${t}${n?`
8
- ...`:``}`}try{let t=await O(o,`utf-8`);if(t===s)return`${k.cyan}→ No changes${k.reset}`;let n=j(t,s);return`${k.blue}File: ${e.file}${k.reset}\n${n.join(`
9
- `)}`}catch(e){return`${k.red}✗ Error: ${e instanceof Error?e.message:String(e)}${k.reset}`}}async function xe(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${k.yellow}⊘ Condition not met - task would be skipped${k.reset}`;let s=i.default.join(a.default.cwd(),e.file);if(r.default.existsSync(s))return`${k.cyan}→ File already exists, would be skipped: ${e.file}${k.reset}`;try{if(C(e)){let n=await E(e,t,o),r=n.split(`
10
- `).slice(0,10).join(`
11
- `),i=n.split(`
12
- `).length>10;return`${k.blue}File: ${e.file}${k.reset}\n${k.green}+ New file would be created${k.reset}\n${k.gray}Content preview:${k.reset}\n${r}${i?`
13
- ...`:``}`}let n=D(e);return`${k.blue}File: ${e.file}${k.reset}\n${k.green}+ New file would be created from ${n}${k.reset}`}catch(e){return`${k.red}✗ Error: ${e instanceof Error?e.message:String(e)}${k.reset}`}}async function Se(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${k.yellow}⊘ Condition not met - task would be skipped${k.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${k.red}✗ File not found: ${e.file}${k.reset}`;try{let r=await O(o,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=n.i(e.replacement,t),s=r.replace(i,a);if(r===s)return`${k.cyan}→ No matches found${k.reset}`;let c=j(r,s);return`${k.blue}File: ${e.file}${k.reset}\n${c.join(`
14
- `)}`}catch(e){return`${k.red}✗ Error: ${e instanceof Error?e.message:String(e)}${k.reset}`}}async function Ce(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${k.yellow}⊘ Condition not met - task would be skipped${k.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${k.red}✗ File not found: ${e.file}${k.reset}`;try{let r=await O(o,`utf-8`),i=r;for(let{find:i,replace:a}of e.replacements){let e=n.i(i,t),o=n.i(a,t);r=r.replace(e,o)}if(i===r)return`${k.cyan}→ No changes${k.reset}`;let a=j(i,r);return`${k.blue}File: ${e.file}${k.reset}\n${a.join(`
15
- `)}`}catch(e){return`${k.red}✗ Error: ${e instanceof Error?e.message:String(e)}${k.reset}`}}function we(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${k.yellow}⊘ Condition not met - task would be skipped${k.reset}`;let o=e.paths.map(e=>n.i(e,t)).filter(e=>r.default.existsSync(i.default.join(a.default.cwd(),e)));return o.length===0?`${k.cyan}→ No files/directories to delete${k.reset}`:`${k.red}Would delete:${k.reset}\n${o.map(e=>`${k.red} - ${e}${k.reset}`).join(`
16
- `)}`}function M(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${k.yellow}⊘ Condition not met - task would be skipped${k.reset}`;let o=n.i(e.from,t),s=n.i(e.to,t),c=i.default.join(a.default.cwd(),o),l=i.default.join(a.default.cwd(),s);return r.default.existsSync(c)?r.default.existsSync(l)?`${k.yellow}⚠ Destination already exists: ${s}${k.reset}\n${k.cyan}Would rename: ${o} → ${s}${k.reset}`:`${k.cyan}Would rename: ${o} → ${s}${k.reset}`:`${k.red}✗ Source not found: ${o}${k.reset}`}function Te(e){if(e.condition!=null&&e.condition!==``)return`${k.yellow}⊘ Condition check skipped in dry-run${k.reset}`;let t=i.default.join(a.default.cwd(),`.git`),n=r.default.existsSync(t),o=[];if(e.removeExisting&&n&&o.push(`${k.red}Would remove existing .git directory${k.reset}`),o.push(`${k.green}Would initialize git repository${k.reset}`),e.initialCommit){let t=e.message??`Initial commit`;o.push(`${k.green}Would create initial commit: "${t}"${k.reset}`)}return o.join(`
17
- `)}function Ee(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${k.yellow}⊘ Condition not met - task would be skipped${k.reset}`;let r=n.i(e.command,t),i=e.cwd==null?a.default.cwd():n.i(e.cwd,t);return`${k.yellow}Would execute:${k.reset}\n${k.cyan} Command: ${r}${k.reset}\n${k.cyan} Working directory: ${i}${k.reset}`}function De(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${k.yellow}⊘ Condition not met - task would be skipped${k.reset}`;let o=n.i(e.from,t),s=n.i(e.to,t),c=i.default.join(a.default.cwd(),o),l=i.default.join(a.default.cwd(),s);return r.default.existsSync(c)?r.default.existsSync(l)?`${k.yellow}⚠ Destination already exists: ${s}${k.reset}\n${k.cyan}Would move: ${o} → ${s}${k.reset}`:`${k.cyan}Would move: ${o} → ${s}${k.reset}`:`${k.red}✗ Source not found: ${o}${k.reset}`}function Oe(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${k.yellow}⊘ Condition not met - task would be skipped${k.reset}`;let o=n.i(e.from,t),s=n.i(e.to,t),c=i.default.join(a.default.cwd(),o),l=i.default.join(a.default.cwd(),s);if(!r.default.existsSync(c))return`${k.red}✗ Source not found: ${o}${k.reset}`;let u=r.default.statSync(c).isDirectory()?`directory`:`file`;return r.default.existsSync(l)?`${k.yellow}⚠ Destination already exists: ${s}${k.reset}\n${k.cyan}Would copy ${u}: ${o} → ${s}${k.reset}`:`${k.cyan}Would copy ${u}: ${o} → ${s}${k.reset}`}async function ke(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${k.yellow}⊘ Condition not met - task would be skipped${k.reset}`;let s=i.default.join(a.default.cwd(),e.file),c={};e.content==null?e.template!=null&&(c.template=e.template):c.template=e.content,e.templateFile!=null&&(c.templateFile=e.templateFile);try{let n=await E(c,t,o),i=n.split(`
18
- `).slice(0,10).join(`
19
- `),a=n.split(`
20
- `).length>10;return r.default.existsSync(s)?`${k.blue}File: ${e.file}${k.reset}\n${k.green}+ Would append content${k.reset}\n${k.gray}Content preview:${k.reset}\n${i}${a?`
21
- ...`:``}`:`${k.blue}File: ${e.file}${k.reset}\n${k.green}+ New file would be created with content${k.reset}\n${k.gray}Content preview:${k.reset}\n${i}${a?`
22
- ...`:``}`}catch(e){return`${k.red}✗ Error: ${e instanceof Error?e.message:String(e)}${k.reset}`}}function Ae(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${k.yellow}⊘ Condition not met - task would be skipped${k.reset}`;let o=n.i(e.path,t),s=i.default.join(a.default.cwd(),o);return r.default.existsSync(s)?`${k.cyan}→ Directory already exists: ${o}${k.reset}`:`${k.green}+ Would create directory: ${o}${k.reset}`}async function je(e,t){try{switch(e.type){case`update-json`:return await ye(e.config,t);case`write`:return await be(e.config,t);case`create`:return await xe(e.config,t,e);case`regex-replace`:return await Se(e.config,t);case`replace-in-file`:return await Ce(e.config,t);case`delete`:return we(e.config,t);case`rename`:return M(e.config,t);case`move`:return De(e.config,t);case`copy`:return Oe(e.config,t);case`append`:return await ke(e.config,t,e);case`mkdir`:return Ae(e.config,t);case`git-init`:return Te(e.config);case`exec`:return Ee(e.config,t);default:{let t=e.type;return`${k.yellow}⚠ Diff not available for task type: ${t}${k.reset}`}}}catch(e){return`${k.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${k.reset}`}}async function N(e,t){console.log(`${k.blue}═══════════════════════════════════════════════════════${k.reset}`),console.log(`${k.blue} DRY RUN - Preview of changes${k.reset}`),console.log(`${k.blue}═══════════════════════════════════════════════════════${k.reset}`);for(let n of e){console.log(`${k.cyan}▶ Task: ${n.name}${k.reset}`),n.description!=null&&n.description!==``&&console.log(`${k.gray} ${n.description}${k.reset}`);let e=await je(n,t);console.log(e),console.log(`${k.gray}${`─`.repeat(55)}${k.reset}`)}console.log(`${k.blue}═══════════════════════════════════════════════════════${k.reset}`),console.log(`${k.yellow} No changes were applied (dry-run mode)${k.reset}`),console.log(`${k.blue}═══════════════════════════════════════════════════════${k.reset}`)}const P=new Map,F={},I=new Map;function L(e){if(e.name==null||e.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(e.taskTypes)||e.taskTypes.length===0)throw TypeError(`Plugin ${e.name} must define at least one task type`);if(typeof e.execute!=`function`)throw TypeError(`Plugin ${e.name} must provide an execute function`);if(P.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(I.has(t)){let e=I.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}P.set(e.name,e);for(let t of e.taskTypes)I.set(t,e.name);n.d(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Me(e){let t=P.get(e);if(t!=null){for(let e of t.taskTypes)I.delete(e);P.delete(e)}}function Ne(e){return P.get(e)}function R(e){let t=I.get(e);if(t!=null)return P.get(t)}function z(e){return I.has(e)}function Pe(){return Array.from(P.keys())}function Fe(){P.clear(),I.clear()}function Ie(e){e.beforeAll!=null&&(F.beforeAll=e.beforeAll),e.afterAll!=null&&(F.afterAll=e.afterAll),e.beforeTask!=null&&(F.beforeTask=e.beforeTask),e.afterTask!=null&&(F.afterTask=e.afterTask),e.onError!=null&&(F.onError=e.onError)}async function B(e,...t){let r=F[e];if(r!=null)try{e===`beforeAll`||e===`afterAll`?await r(t[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await r(t[0],t[1])}catch(t){n.a(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Le(e,t,n){let r=R(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Re(e,t){let n=R(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function ze(e){let t=R(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Be(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}var Ve=class{transformers=new Map;constructor(){this.registerBuiltInTransformers()}registerBuiltInTransformers(){for(let e of[{id:`lowercase`,type:`lowercase`},{id:`uppercase`,type:`uppercase`},{id:`trim`,type:`trim`},{id:`slugify`,type:`slugify`},{id:`capitalize`,type:`capitalize`},{id:`titlecase`,type:`titlecase`},{id:`camelcase`,type:`camelcase`},{id:`pascalcase`,type:`pascalcase`},{id:`snakecase`,type:`snakecase`},{id:`kebabcase`,type:`kebabcase`},{id:`constantcase`,type:`constantcase`},{id:`alphanumeric`,type:`alphanumeric`},{id:`collapse-spaces`,type:`collapse-spaces`},{id:`remove-spaces`,type:`remove-spaces`},{id:`urlencode`,type:`urlencode`},{id:`dasherize`,type:`dasherize`},{id:`underscore`,type:`underscore`}])this.transformers.set(e.id,e)}register(e){this.transformers.has(e.id)&&n.a(`Transformer with id "${e.id}" is already registered. Overwriting.`,`warn`),this.transformers.set(e.id,e)}registerAll(e){for(let t of e)this.register(t)}get(e){return this.transformers.get(e)}has(e){return this.transformers.has(e)}async execute(e,t,n={}){let r=this.transformers.get(e);if(!r)throw h.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof h?t:h.executionFailed(e,t instanceof Error?t.message:String(t))}}async executeChain(e,t,n={}){let r=t;for(let t of e)r=await this.execute(t,r,n);return r}async apply(e,t,n={}){return e===void 0?t:this.executeChain(e,t,n)}validate(e){if(e===void 0)return[];let t=e,n=[];for(let e of t)this.has(e)||n.push(`Transformer "${e}" not found`);return n}async executeTransformer(e,t,n){switch(e.type){case`regex`:return this.executeRegex(e,t);case`computed`:return this.executeComputed(e,t,n);case`lowercase`:return this.executeLowercase(t);case`uppercase`:return this.executeUppercase(t);case`trim`:return this.executeTrim(t);case`slugify`:return this.executeSlugify(t);case`capitalize`:return this.executeCapitalize(t);case`titlecase`:return this.executeTitlecase(t);case`camelcase`:return this.executeCamelcase(t);case`pascalcase`:return this.executePascalcase(t);case`snakecase`:return this.executeSnakecase(t);case`kebabcase`:return this.executeKebabcase(t);case`constantcase`:return this.executeConstantcase(t);case`alphanumeric`:return this.executeAlphanumeric(t);case`collapse-spaces`:return this.executeCollapseSpaces(t);case`remove-spaces`:return this.executeRemoveSpaces(t);case`urlencode`:return this.executeUrlencode(t);case`dasherize`:return this.executeDasherize(t);case`underscore`:return this.executeUnderscore(t);case`custom`:return this.executeCustom(e,t,n);case`chain`:return this.executeChainTransformer(e,t,n);default:{let t=e;throw h.invalidType(t.id,t.type)}}}executeRegex(e,t){let n=String(t),{pattern:r,flags:i,replacement:a}=e.config;try{let e=new RegExp(r,i);return n.replace(e,a)}catch(t){throw h.executionFailed(e.id,`Invalid regex pattern: ${t instanceof Error?t.message:String(t)}`)}}executeComputed(e,t,n){let{expression:r}=e.config;try{return Function(`value`,`context`,...Object.keys(n),`return ${r}`)(t,n,...Object.values(n))}catch(t){throw h.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return(0,l.lowerCase)(String(e))}executeUppercase(e){return(0,l.upperCase)(String(e))}executeTrim(e){return String(e).trim()}executeSlugify(e){return String(e).toLowerCase().trim().replace(/[\s_]+/gu,`-`).replace(/[^\w-]+/gu,``).replace(/-{2,}/gu,`-`).replace(/^-+/u,``).replace(/-+$/u,``)}async executeCustom(e,t,n){let{handler:r}=e.config;if(typeof r==`function`)return r(t,n);throw h.executionFailed(e.id,`String-based custom handlers are not yet supported. Please use function handlers.`)}async executeChainTransformer(e,t,n){let{transformers:r}=e.config;if(r.length===0)throw h.executionFailed(e.id,`Chain transformer must have at least one transformer`);return this.executeChain(r,t,n)}executeCapitalize(e){return(0,l.capitalCase)(String(e))}executeTitlecase(e){return(0,l.capitalCase)(String(e))}executeCamelcase(e){return(0,l.camelCase)(String(e))}executePascalcase(e){return(0,l.pascalCase)(String(e))}executeSnakecase(e){return(0,l.snakeCase)(String(e))}executeKebabcase(e){return(0,l.kebabCase)(String(e))}executeConstantcase(e){return(0,l.constantCase)(String(e))}executeAlphanumeric(e){return String(e).replace(/[^a-zA-Z0-9]/gu,``)}executeCollapseSpaces(e){return String(e).replace(/\s+/gu,` `)}executeRemoveSpaces(e){return String(e).replace(/\s/gu,``)}executeUrlencode(e){return encodeURIComponent(String(e))}executeDasherize(e){return(0,l.kebabCase)(String(e))}executeUnderscore(e){return(0,l.snakeCase)(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};const V=new Ve;function He(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function Ue(e){return e===void 0||typeof e==`boolean`?e:typeof e==`string`?{type:`condition`,value:e}:typeof e==`object`&&e&&`condition`in e&&!(`type`in e)?{type:`condition`,value:e.condition}:e}async function H(e,t){let n=Ue(e);if(n===void 0)return!0;if(typeof n==`boolean`)return n;if(typeof n==`object`&&n&&`type`in n){if(n.type===`exec`)try{let{execSync:e}=await import(`node:child_process`),{interpolateTemplate:r}=await Promise.resolve().then(()=>require(`./utils-B6BwGcug.cjs`));return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await Promise.resolve().then(()=>require(`./utils-B6BwGcug.cjs`));if(typeof e==`object`&&e&&`status`in e&&typeof e.status==`number`){let{status:r}=e;if(r>=1&&r<=255)return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}if(n.type===`condition`)return He(n.value,t)}return!0}async function U(e,t,r){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!r)return;if(typeof i.condition!=`string`){n.a(`Prompt "${t}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await Promise.resolve().then(()=>require(`./utils-B6BwGcug.cjs`)),n=e(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`object`&&n?await U(n,t,r):n}catch(e){n.a(`Prompt "${t}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){n.a(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=(0,s.execSync)(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){n.d(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){n.a(`Prompt "${t}": interpolate default value must be a string with {{variable}} placeholders`,`error`);return}if(!r)return n.a(`Prompt "${t}": interpolate default value requires context but none provided`,`warn`),e;try{return n.i(e,r)}catch(r){return n.a(`Prompt "${t}": failed to interpolate interpolate default value: ${r instanceof Error?r.message:`Unknown error`}`,`warn`),e}}else if(i.type!==void 0){n.a(`Prompt "${t}": unknown default value type "${i.type}". Expected "static", "exec", "conditional", or "interpolate".`,`error`);return}return e}async function W(e,t=new Map,r={}){let i={};if(e.length===0)return i;for(let a of e){if(a.$templateEnabled!=null&&!await n.u(a.$templateEnabled,{...r,...i}))continue;let e={...r,...i};if(await n.u(a.enabled,e))try{let r,o=t.get(a.id);switch(a.default!==void 0&&(o=await U(a.default,a.id,e)),a.type){case`input`:{let t={message:a.message};o!==void 0&&(t.default=String(o));let i=await H(a.required,e);if(i!==void 0&&(t.required=i),r=await(0,c.input)(t),i&&(r==null||typeof r==`string`&&r.trim()===``))throw n.a(`${a.message} is required`,`error`),p.required(a.id);break}case`password`:if(r=await(0,c.password)({message:a.message,mask:`*`}),await H(a.required,e)&&(r==null||typeof r==`string`&&r.trim()===``))throw n.a(`${a.message} is required`,`error`),p.required(a.id);break;case`number`:{let t={message:a.message};o!==void 0&&(t.default=Number(o));let i=await H(a.required,e);if(i!==void 0&&(t.required=i),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),r=await(0,c.number)(t),i&&r==null)throw n.a(`${a.message} is required`,`error`),p.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};o!==void 0&&(e.default=o),r=await(0,c.select)(e);break}case`confirm`:{let e=o===void 0?!1:!!o;r=await(0,c.confirm)({message:a.message,default:e});break}default:throw n.a(`Unknown prompt type: ${a.type}`,`error`),p.unknownType(a.type)}a.transformers!==void 0&&(r=await V.apply(a.transformers,r,{...e,...i})),i[a.id]=r}catch(e){throw e instanceof Error&&n.a(`Failed to collect prompt "${a.id}": ${e.message}`,`error`),e}}return i}async function G(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await U(e.default,e.id,t);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function K(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const We=(0,o.promisify)(r.default.appendFile),Ge=(0,o.promisify)(r.default.readFile),Ke=(0,o.promisify)(r.default.stat);async function qe(e,t,r){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping append task`,`info`);return}let o=i.default.join(a.default.cwd(),e.file),s={};e.content==null?e.template!=null&&(s.template=e.template):s.template=e.content,e.templateFile!=null&&(s.templateFile=e.templateFile);let c=T(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?m.templateHasBothTemplateAndFile():m.templateMissingTemplateOrFile();let l=await E(s,t,r),u=!1,d=!1;try{await Ke(o),u=!0;let t=await Ge(o,`utf-8`);t.length>0&&!t.endsWith(`
23
- `)&&(d=e.newline!==!1)}catch{}u&&d?await We(o,`\n${l}`):await We(o,l),n.a(`Appended content to ${e.file}`,`success`)}const Je={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await qe(e.config,t,e)}},Ye=(0,o.promisify)(r.default.copyFile),Xe=(0,o.promisify)(r.default.stat),Ze=(0,o.promisify)(r.default.mkdir),Qe=(0,o.promisify)(r.default.readdir);async function $e(e,t){await Ze(t,{recursive:!0});let n=await Qe(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=i.default.join(e,n.name),a=i.default.join(t,n.name);n.isDirectory()?await $e(r,a):await Ye(r,a)}))}async function et(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping copy task`,`info`);return}let r=i.default.join(a.default.cwd(),e.from),o=i.default.join(a.default.cwd(),e.to),s;try{s=await Xe(r)}catch{n.a(`Source path does not exist: ${r}`,`warn`);return}await Ze(i.default.dirname(o),{recursive:!0}),s.isDirectory()?(await $e(r,o),n.a(`Copied directory ${e.from} to ${e.to}`,`success`)):(await Ye(r,o),n.a(`Copied file ${e.from} to ${e.to}`,`success`))}const tt={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await et(e.config,t)}},nt=(0,o.promisify)(r.default.writeFile);async function rt(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping create task`,`info`);return}let s=i.default.join(a.default.cwd(),e.file);if(r.default.existsSync(s)){n.a(`File already exists, skipping: ${e.file}`,`info`);return}let c=T(e);if(!c.isValid)throw c.error?.includes(`cannot have both`)?m.createHasBothTemplateAndFile():m.createMissingTemplateOrFile();let l=await E(e,t,o),u=i.default.dirname(s);r.default.existsSync(u)||r.default.mkdirSync(u,{recursive:!0}),await nt(s,l),n.a(`Created file: ${e.file}`,`success`)}const it={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t,e)}};async function at(e,t){let{paths:o,condition:s}=e;if(s!=null&&s!==``){if(!t){n.a(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!n.t(s,t)){n.a(`Condition not met, skipping deletion`,`info`);return}}for(let e of o){let t=i.default.join(a.default.cwd(),e);r.default.existsSync(t)&&r.default.rmSync(t,{recursive:!0,force:!0})}}const ot={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await at(e.config,t)}};async function st(e,t){if(e.condition!=null&&e.condition!==``){if(!t){n.a(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!n.t(e.condition,t)){n.a(`Condition not met, skipping exec task`,`info`);return}}let r=e.cwd==null?a.default.cwd():i.default.join(a.default.cwd(),e.cwd);(0,s.execSync)(e.command,{cwd:r,stdio:`inherit`})}const ct={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await st(e.config,t)}};async function lt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){n.a(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!n.t(e.condition,t)){n.a(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=i.default.join(a.default.cwd(),`.git`);r.default.existsSync(e)&&r.default.rmSync(e,{recursive:!0,force:!0})}if((0,s.execSync)(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;(0,s.execSync)(`git add .`,{stdio:`inherit`}),(0,s.execSync)(`git commit -m "${t}"`,{stdio:`inherit`})}}const ut={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await lt(e.config,t)}},dt=(0,o.promisify)(r.default.mkdir);async function ft(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping mkdir task`,`info`);return}await dt(i.default.join(a.default.cwd(),e.path),{recursive:!0}),n.a(`Created directory: ${e.path}`,`success`)}const pt={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await ft(e.config,t)}},mt=(0,o.promisify)(r.default.rename),ht=(0,o.promisify)(r.default.stat),gt=(0,o.promisify)(r.default.mkdir);async function _t(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping move task`,`info`);return}let r=i.default.join(a.default.cwd(),e.from),o=i.default.join(a.default.cwd(),e.to);try{await ht(r)}catch{n.a(`Source path does not exist: ${r}`,`warn`);return}await gt(i.default.dirname(o),{recursive:!0}),await mt(r,o),n.a(`Moved ${e.from} to ${e.to}`,`success`)}const vt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await _t(e.config,t)}},yt=(0,o.promisify)(r.default.readFile),bt=(0,o.promisify)(r.default.writeFile);async function xt(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping regex-replace task`,`info`);return}let r=i.default.join(a.default.cwd(),e.file),{pattern:o}=e,s=e.flags??``,c=e.replacement||``,l=await yt(r,`utf-8`),u=new RegExp(o,s);l=l.replace(u,n.i(c,t)),await bt(r,l)}const St={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await xt(e.config,t)}},Ct=(0,o.promisify)(r.default.rename);async function wt(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping rename task`,`info`);return}let o=i.default.join(a.default.cwd(),n.i(e.from,t)),s=i.default.join(a.default.cwd(),n.i(e.to,t));if(!r.default.existsSync(o)){n.a(`Source path does not exist: ${o}`,`warn`);return}await Ct(o,s)}const Tt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await wt(e.config,t)}},Et=(0,o.promisify)(r.default.readFile),Dt=(0,o.promisify)(r.default.writeFile);async function Ot(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping replace-in-file task`,`info`);return}let o=i.default.join(a.default.cwd(),e.file),{replacements:s}=e;if(!r.default.existsSync(o)){n.a(`File not found: ${o}, skipping`,`warn`);return}let c=await Et(o,`utf-8`);for(let{find:e,replace:r}of s){let i=n.i(r,t);c=c.replace(new RegExp(e,`gu`),i)}await Dt(o,c)}const kt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Ot(e.config,t)}},At=(0,o.promisify)(r.default.readFile),jt=(0,o.promisify)(r.default.writeFile),Mt=2;async function Nt(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping update-json task`,`info`);return}let r=i.default.join(a.default.cwd(),e.file),{updates:o}=e,s=await At(r,`utf-8`),c=JSON.parse(s);function l(e){if(typeof e==`string`)return n.i(e,t);if(Array.isArray(e))return e.map(e=>l(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=l(r);return t}return e}for(let[e,t]of Object.entries(o)){let r=l(t);e.includes(`.`)?n.c(c,e,r):c[e]=r}await jt(r,`${JSON.stringify(c,null,2)}\n`)}const Pt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Nt(e.config,t)}},Ft=(0,o.promisify)(r.default.writeFile);async function It(e,t,o){let{allowCreate:s=!0}=e;if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping write task`,`info`);return}let c=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(c)){if(s===!1)throw Error(`Write task failed: file does not exist (${e.file})`);n.a(`File not found, creating new file: ${e.file}`,`info`)}let l=T(e);if(!l.isValid)throw l.error?.includes(`cannot have both`)?m.templateHasBothTemplateAndFile():m.templateMissingTemplateOrFile();let u=await E(e,t,o),d=i.default.dirname(c);r.default.existsSync(d)||r.default.mkdirSync(d,{recursive:!0}),await Ft(c,u)}const Lt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await It(e.config,t,e)}};function q(){z(`update-json`)||(L(Pt),L(Lt),L(it),L(St),L(kt),L(ot),L(Tt),L(ut),L(ct),L(vt),L(tt),L(Je),L(pt))}async function Rt(e,t,r=!1){if(q(),r){n.a(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(z(e.type)){await Le(e,t,{dryRun:r});return}throw TypeError(`Unknown task type: ${e.type}`)}async function J(e,t,r,i,o=!1){try{return n.a(`[${r}/${i}] Running: ${e.name}...`,`info`),await Rt(e,t,o),n.a(`[${r}/${i}] Completed: ${e.name}...`,`success`),!0}catch(t){return n.a(`Failed: ${e.name}`,`error`),t instanceof Error&&(n.a(` Reason: ${t.message}`,`error`),t.stack!=null&&a.default.env.DEBUG!=null&&console.error(t.stack)),!1}}function Y(e){let t=[],r=new Set,i=new Set,a=new Map(e.map(e=>[e.id,e]));function o(e){if(r.has(e))return;if(i.has(e))throw n.x.forTaskDependency(e);i.add(e);let s=a.get(e);if(!s)throw f.forId(e);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(e),r.add(e),t.push(s)}for(let t of e)r.has(t.id)||o(t.id);return t}function zt(e){let t=[];for(let n of e)if(!z(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Bt(n);t.push(...e)}return t}function Bt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=T({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function Vt(e){n.a(`❌ Template validation failed:`,`error`),n.a(``,`error`);for(let t of e)n.a(` • ${t}`,`error`);n.a(``,`error`),n.a(`Please fix these errors before continuing.`,`error`)}async function X(e,t=new Map,n={}){let r={};for(let i of e){let e=t.get(i.id);e!==void 0&&(i.transformers!==void 0&&(e=await V.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function Z(e,t,r){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!r){n.a(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof i.condition!=`string`){n.a(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await Promise.resolve().then(()=>require(`./utils-B6BwGcug.cjs`)),n=e(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`object`&&n?await Z(n,t,r):n}catch(e){n.a(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){n.a(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=(0,s.execSync)(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){n.a(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){n.a(`Variable "${t}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!r)return n.a(`Variable "${t}": interpolate value requires context but none provided`,`warn`),e;try{return n.i(e,r)}catch(r){return n.a(`Variable "${t}": failed to interpolate interpolate value: ${r instanceof Error?r.message:`Unknown error`}`,`warn`),e}}else if(i.type!==void 0){n.a(`Variable "${t}": unknown value type "${i.type}". Expected "static", "exec", "conditional", or "interpolate".`,`error`);return}return e}async function Q(e,t,r){let i=new Map;for(let a of e){if(r?.skipConditional===!0&&typeof a.value==`object`&&a.value!==null&&!Array.isArray(a.value)&&a.value.type===`conditional`)continue;if(a.$templateEnabled!=null){let e={...t};for(let[t,n]of i.entries())e[t]=n;if(!await n.u(a.$templateEnabled,e))continue}let e={...t};for(let[t,n]of i.entries())e[t]=n;let o=await Z(a.value,a.id,e);o!==void 0&&i.set(a.id,o)}return i}function $(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function Ht(e,r){let i=t.t();if(!await n.u(r.templateEnabled,i,{lazy:!0})){n.f(`⊘ Template is disabled - skipping all execution`);return}r.transformers!==void 0&&r.transformers.length>0&&(n.d(`Registering ${r.transformers.length} transformer(s)...`),V.registerAll(r.transformers)),n.d(`Registering built-in plugins...`),q(),n.d(`Validating task configurations...`);let o=zt(e);o.length>0&&(Vt(o),a.default.exit(1)),n.d(`All tasks validated successfully`);let s=e.filter(e=>n.l(e.enabled,t.t(),{lazy:!0}));n.d(`Resolving task dependencies...`);let c=Y(s);n.d(`Sorted ${c.length} task(s) by dependencies`),n.f(`Welcome! Let's execute your tasks.`),r.dryRun&&n.h(`🔍 DRY RUN MODE - No changes will be made`),n.f(`This will execute your project tasks based on the defined configuration.`);let l=i,u=[...r.variables??[]];if(u.length>0){let e=$(u);e.length>0&&(n.a(`❌ Variable validation errors:`,`error`),e.forEach(e=>n.a(` - ${e}`,`error`)),a.default.exit(1)),n.d(`Resolving variable values...`);let t=await X(u,await Q(u,l,{skipConditional:!0}),l);Object.assign(l,t),Object.keys(t).length>0&&(n.d(`Resolved ${Object.keys(t).length} variable(s)`),n.d(`Variable values: ${JSON.stringify(t)}`))}let d=r.prompts??[],f=[...d];if(f.length>0){let e=K(f);e.length>0&&(n.a(`❌ Prompt validation errors:`,`error`),e.forEach(e=>n.a(` - ${e}`,`error`)),a.default.exit(1)),n.d(`Resolving prompt default values...`);let t=await G(f,l);if(d.length>0){n.f(`📋 Collecting prompts (available to all tasks):`);let e=await W(d,t,l);Object.assign(l,e)}}if(u.length>0){let e=u.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){n.d(`Re-resolving conditional variables with prompt values...`);let t=await X(e,await Q(e,l),l);Object.assign(l,t),Object.keys(t).length>0&&n.d(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await n.u(r.templateEnabled,l)){n.f(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let p=[];for(let e of c)e.$templateEnabled!=null&&!await n.u(e.$templateEnabled,l)||await n.u(e.enabled,l)&&p.push(e);if(n.a(`${p.length} of ${c.length} task(s) enabled for execution`,`info`),r.dryRun){await N(p,l),n.f(`🔍 Dry run completed - no changes were made`),n.f(`Run without --dry-run to apply changes`);return}n.d(`Calling beforeAll hook...`),await B(`beforeAll`,l);let m=p.length,h=0,g=0,_=[],v=[];for(let e=0;e<p.length;e++){let t=p[e];t!=null&&(n.d(`Calling beforeTask hook for task: ${t.name}`),await B(`beforeTask`,t,l),await J(t,l,e+1,m,r.dryRun)?(h++,_.push(t.id),n.d(`Calling afterTask hook for task: ${t.name}`),await B(`afterTask`,t,l)):(await H(t.required,l)&&(g++,v.push(t.name)),n.d(`Calling onError hook for task: ${t.name}`),await B(`onError`,Error(`Task ${t.name} failed`),t),n.h(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}g>0&&(n.a(`\n❌ Task execution completed with ${g} error(s)`,`error`),n.a(`Completed: ${h}/${m} tasks`,`info`),n.a(`Failed tasks: ${v.join(`, `)}`,`error`),a.default.exit(1)),n.d(`Calling afterAll hook...`),await B(`afterAll`,l),n.m(`✅ All tasks completed successfully!`),n.m(` Completed: ${h}/${m} tasks`)}async function Ut(e,t,r={}){n.d(`Running templates with sequential variable/prompt resolution...`),n.d(`Total templates to process: ${e.length}`),n.d(`Registering built-in plugins...`),q();let i=[];console.log(``),n.f(`📋 Collecting input...`),console.log(``);for(let t=0;t<e.length;t++){let o=e[t];if(o==null)continue;let s=`=`.repeat(60);if(n.d(`\n${s}`),n.d(`Processing template ${t+1}/${e.length}: "${o.name}"`),n.d(s),n.d(`Current config keys: ${Object.keys(r).join(`, `)}`),!await n.u(o.enabled,r)){n.f(`⊘ Template "${o.name}" is disabled - skipping`),n.d(` Enabled condition: ${JSON.stringify(o.enabled)}`);continue}let c=o.variables??[];if(c.length>0){n.d(`Processing ${c.length} variable(s) for template "${o.name}"...`);let e=$(c);e.length>0&&(n.a(`❌ Variable validation errors:`,`error`),e.forEach(e=>n.a(` - ${e}`,`error`)),a.default.exit(1));let t=await X(c,await Q(c,r,{skipConditional:!0}),r);Object.assign(r,t);let i=c.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),s=0;if(i.length>0){let e=await X(i,await Q(i,r),r);if(s=Object.keys(e).length,Object.assign(r,e),s>0){n.d(`Resolved ${s} conditional variable(s)`);for(let[t,r]of Object.entries(e))n.d(` ${t} = ${JSON.stringify(r)}`)}}let l=Object.keys(t).length+s;if(l>0){n.d(`Total variables resolved for template: ${l}`);for(let[e,r]of Object.entries(t))n.d(` ${e} = ${JSON.stringify(r)}`)}}let l=o.prompts??[];if(l.length>0){n.d(`Processing ${l.length} prompt(s) for template "${o.name}"...`);let e=K(l);e.length>0&&(n.a(`❌ Prompt validation errors:`,`error`),e.forEach(e=>n.a(` - ${e}`,`error`)),a.default.exit(1));let t=await W(l,await G(l,r),r);Object.assign(r,t),n.d(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await n.u(o.enabled,r)){n.f(`⊘ Template "${o.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let u=o.tasks??[];u.length>0&&(n.d(`Found ${u.length} task(s) in template "${o.name}" (will execute later)`),i.push(...u))}if(n.d(`
24
- 🔧 Validating and filtering all collected tasks...`),i.length===0){n.a(`No tasks found in any template`,`info`);return}let o=zt(i);o.length>0&&(Vt(o),a.default.exit(1)),console.log(``),n.a(`🛠️ Preparing tasks...`,`info`);let s=[];for(let e of i)await n.u(e.enabled,r)&&s.push(e);if(console.log(``),n.a(`Found ${i.length} tasks (${s.length} enabled)`,`info`),n.a(`All tasks validated successfully`,`success`),s.length===0){n.a(`No enabled tasks to execute`,`info`);return}let c=Y(s);if(t.dryRun){n.a(`
25
- 🔍 Dry run - showing task changes...`,`info`),await N(c,r),n.a(`
26
- 🔍 Dry run completed - no changes were made`,`info`),n.a(`Run without --dry-run to apply changes`,`info`);return}console.log(``),n.f(`⚙️ Executing tasks...`),console.log(``),await B(`beforeAll`,r);let l=0,u=0,d=[];for(let e=0;e<c.length;e++){let i=c[e];i!=null&&(await B(`beforeTask`,i,r),await J(i,r,e+1,c.length,t.dryRun)?(l++,await B(`afterTask`,i,r)):(await H(i.required,r)&&(u++,d.push(i.name)),await B(`onError`,Error(`Task ${i.name} failed`),i),n.h(`⚠️ Task "${i.name}" failed, continuing with remaining tasks...`)))}await B(`afterAll`,r),u>0&&(n.a(`\n❌ Task execution completed with ${u} error(s)`,`error`),n.a(`Completed: ${l}/${c.length} tasks`,`info`),n.a(`Failed tasks: ${d.join(`, `)}`,`error`),a.default.exit(1)),n.a(`Completed: ${l}/${c.length} tasks`,`success`)}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return we}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return Pe}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return ze}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return Me}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return Ce}}),Object.defineProperty(exports,`G`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return je}}),Object.defineProperty(exports,`J`,{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,`K`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return be}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return he}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`X`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`Y`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return Be}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return Rt}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return Fe}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return xe}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Ut}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`q`,{enumerable:!0,get:function(){return me}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Ht}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return Le}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return Ie}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return Re}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return D}});
@@ -1 +0,0 @@
1
- require(`./config-DlJs75hK.cjs`),require(`./utils-Bz23aLK_.cjs`);const e=require(`./run-tasks-CSR8df5O.cjs`);exports.runTasks=e.t,exports.runTemplatesSequentially=e.n;