@pixpilot/scaffoldfy 0.30.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/cli.cjs +1 -1
  2. package/dist/cli.js +1 -1
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.cts +33 -24
  5. package/dist/index.d.ts +33 -24
  6. package/dist/index.js +1 -1
  7. package/dist/run-tasks-A6tQe8q1.js +1 -0
  8. package/dist/{run-tasks-D5KLV8Tk.js → run-tasks-BsR0t7C5.js} +5 -5
  9. package/dist/run-tasks-CSR8df5O.cjs +26 -0
  10. package/dist/run-tasks-CcH22QWc.cjs +1 -0
  11. package/dist/scaffoldfy-config-json-validator/cli.cjs +3 -0
  12. package/dist/scaffoldfy-config-json-validator/cli.d.cts +1 -0
  13. package/dist/scaffoldfy-config-json-validator/cli.d.ts +1 -0
  14. package/dist/scaffoldfy-config-json-validator/cli.js +3 -0
  15. package/dist/scaffoldfy-config-json-validator/index.cjs +1 -0
  16. package/dist/scaffoldfy-config-json-validator/index.d.cts +3 -0
  17. package/dist/scaffoldfy-config-json-validator/index.d.ts +3 -0
  18. package/dist/scaffoldfy-config-json-validator/index.js +1 -0
  19. package/dist/scaffoldfy-config-json-validator/validate-scaffoldfy-json.cjs +1 -0
  20. package/dist/scaffoldfy-config-json-validator/validate-scaffoldfy-json.d.cts +2 -0
  21. package/dist/scaffoldfy-config-json-validator/validate-scaffoldfy-json.d.ts +2 -0
  22. package/dist/scaffoldfy-config-json-validator/validate-scaffoldfy-json.js +1 -0
  23. package/dist/scaffoldfy-config-json-validator-CpEXHRsI.cjs +0 -0
  24. package/dist/scaffoldfy-config-json-validator-DP8-e4Yy.js +1 -0
  25. package/dist/{src-DbtBS6he.js → src-CaQ2gXYF.js} +1 -1
  26. package/dist/{src-CmBriDDR.cjs → src-IYqxnNOO.cjs} +1 -1
  27. package/dist/{utils-Bn-L1Fmr.cjs → utils-B6BwGcug.cjs} +1 -1
  28. package/dist/{utils-Dsr6AHpq.js → utils-B6WSsvMT.js} +1 -1
  29. package/dist/utils-Bz23aLK_.cjs +1 -0
  30. package/dist/{utils-CmYva5oB.js → utils-CrJkuEEG.js} +1 -1
  31. package/dist/validate-scaffoldfy-json-Cfq-nQjy.js +1 -0
  32. package/dist/validate-scaffoldfy-json-Dkaz9ueq.cjs +1 -0
  33. package/dist/validate-scaffoldfy-json-bRhG4eG3.d.cts +10 -0
  34. package/dist/validate-scaffoldfy-json-vYYlnkxk.d.ts +10 -0
  35. package/package.json +4 -4
  36. package/schema/scaffoldfy.schema.json +157 -222
  37. package/dist/run-tasks-BZwbB2B0.cjs +0 -1
  38. package/dist/run-tasks-C6Bkzhq7.cjs +0 -26
  39. package/dist/run-tasks-DhVlAr4C.js +0 -1
  40. package/dist/utils-DjBGLPnu.cjs +0 -1
  41. package/dist/validate-scaffoldfy-json.cjs +0 -3
  42. package/dist/validate-scaffoldfy-json.js +0 -3
  43. /package/dist/{validate-scaffoldfy-json.d.cts → index-BoGG5KAY.d.ts} +0 -0
  44. /package/dist/{validate-scaffoldfy-json.d.ts → index-BtBZHVmz.d.cts} +0 -0
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-DjBGLPnu.cjs`),n=require(`./run-tasks-C6Bkzhq7.cjs`),r=require(`./src-CmBriDDR.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-BZwbB2B0.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-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);
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-CmYva5oB.js";import{q as r}from"./run-tasks-D5KLV8Tk.js";import{n as i}from"./src-DbtBS6he.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-DhVlAr4C.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-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{};
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- require(`./config-DlJs75hK.cjs`);const e=require(`./utils-DjBGLPnu.cjs`),t=require(`./run-tasks-C6Bkzhq7.cjs`),n=require(`./src-CmBriDDR.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=n.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=n.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.validateTemplateConfig=t.W,exports.validateVariables=t.r;
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;
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
+ import { t as validateScaffoldfyJsonFile } from "./validate-scaffoldfy-json-bRhG4eG3.cjs";
2
+ import "./index-BtBZHVmz.cjs";
3
+
1
4
  //#region src/transformers/types.d.ts
2
- /**
3
- * Transformer types for value transformation
4
- */
5
5
  type BuiltInTransformerType = 'lowercase' | 'uppercase' | 'trim' | 'slugify' | 'capitalize' | 'titlecase' | 'camelcase' | 'pascalcase' | 'snakecase' | 'kebabcase' | 'constantcase' | 'alphanumeric' | 'collapse-spaces' | 'remove-spaces' | 'urlencode' | 'dasherize' | 'underscore';
6
6
  /**
7
7
  * Available transformer types
@@ -14,6 +14,7 @@ interface BaseTransformer {
14
14
  id: string;
15
15
  name?: string;
16
16
  description?: string;
17
+ enabled?: DynamicBooleanValue;
17
18
  }
18
19
  /**
19
20
  * Regex transformer - applies regex pattern replacement
@@ -213,36 +214,42 @@ interface DefaultValueConfig<T = string | number | boolean> {
213
214
  */
214
215
  type DefaultValue<T = string | number | boolean> = T | DefaultValueConfig<T> | ConditionalDefaultConfig<T>;
215
216
  /**
216
- * Conditional enabled configuration for prompts and tasks
217
- * Allows dynamic enabling/disabling based on runtime conditions
217
+ * Conditional enabled/required configuration with new structure
218
+ * Evaluates a JavaScript expression at runtime
218
219
  */
219
- interface ConditionalEnabled {
220
- condition: ConditionExpression;
220
+ interface ConditionalConfig {
221
+ type: 'condition';
222
+ value: string;
221
223
  }
222
224
  /**
223
- * Executable enabled configuration
224
- * Determines enabled state by executing a shell command
225
+ * Executable enabled/required configuration with new structure
226
+ * Determines state by executing a shell command
225
227
  */
226
- interface ExecutableEnabled {
228
+ interface ExecutableConfig {
227
229
  type: 'exec';
228
230
  value: string;
229
231
  }
230
232
  /**
231
- * Type for enabled field that can be boolean, string condition, conditional object, or executable
233
+ * Type for enabled/required field with consistent object structure
234
+ *
235
+ * Supports:
232
236
  * - boolean: Simple true/false
233
- * - string: JavaScript expression to evaluate (shorthand for { condition: "..." })
234
- * - ConditionalEnabled: Object with condition property
235
- * - ExecutableEnabled: Object with type='exec' and value=command
237
+ * - ConditionalConfig: Object with type='condition' and value=expression
238
+ * - ExecutableConfig: Object with type='exec' and value=command
236
239
  */
237
- type EnabledValue = boolean | string | ConditionalEnabled | ExecutableEnabled;
240
+ type DynamicBooleanValue = boolean | ConditionalConfig | ExecutableConfig;
241
+ /**
242
+ * @deprecated Use DynamicBooleanValue instead. Kept for backwards compatibility.
243
+ */
244
+ type EnabledValue = DynamicBooleanValue;
238
245
  interface BasePrompt {
239
246
  id: string;
240
247
  type: PromptType;
241
248
  message: string;
242
- required?: boolean;
243
- enabled?: EnabledValue;
249
+ required?: DynamicBooleanValue;
250
+ enabled?: DynamicBooleanValue;
244
251
  override?: MergeStrategy;
245
- $templateEnabled?: EnabledValue;
252
+ $templateEnabled?: DynamicBooleanValue;
246
253
  transformers?: string[];
247
254
  }
248
255
  interface InputPrompt extends BasePrompt {
@@ -278,8 +285,10 @@ type PromptDefinition = InputPrompt | NumberPrompt | SelectPrompt | ConfirmPromp
278
285
  interface VariableDefinition {
279
286
  id: string;
280
287
  value: DefaultValue;
288
+ enabled?: DynamicBooleanValue;
289
+ required?: DynamicBooleanValue;
281
290
  override?: MergeStrategy;
282
- $templateEnabled?: EnabledValue;
291
+ $templateEnabled?: DynamicBooleanValue;
283
292
  transformers?: string[];
284
293
  }
285
294
  /**
@@ -305,15 +314,15 @@ interface TaskDefinition {
305
314
  id: string;
306
315
  name: string;
307
316
  description?: string;
308
- required?: boolean;
309
- enabled?: EnabledValue;
317
+ required?: DynamicBooleanValue;
318
+ enabled?: DynamicBooleanValue;
310
319
  type: TaskType;
311
320
  config: UpdateJsonConfig | WriteConfig | CreateConfig | RegexReplaceConfig | ReplaceInFileConfig | DeleteConfig | RenameConfig | GitInitConfig | ExecConfig | MoveConfig | CopyConfig | AppendConfig | MkdirConfig | Record<string, unknown>;
312
321
  dependencies?: string[];
313
322
  rollback?: RollbackConfig;
314
323
  override?: MergeStrategy;
315
324
  $sourceUrl?: string;
316
- $templateEnabled?: EnabledValue;
325
+ $templateEnabled?: DynamicBooleanValue;
317
326
  }
318
327
  /**
319
328
  * Configuration file structure for template tasks
@@ -321,7 +330,7 @@ interface TaskDefinition {
321
330
  interface TasksConfiguration {
322
331
  name: string;
323
332
  description?: string;
324
- enabled?: EnabledValue;
333
+ enabled?: DynamicBooleanValue;
325
334
  dependencies?: string[];
326
335
  extends?: string | string[];
327
336
  transformers?: Transformer[];
@@ -823,4 +832,4 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
823
832
  transformers?: Transformer[] | undefined;
824
833
  }): Promise<void>;
825
834
  //#endregion
826
- export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalDefaultConfig, ConditionalEnabled, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, EnabledValue, type ExecConfig, ExecutableEnabled, 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, validateTemplateConfig, validateVariables };
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 };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
+ import { t as validateScaffoldfyJsonFile } from "./validate-scaffoldfy-json-vYYlnkxk.js";
2
+ import "./index-BoGG5KAY.js";
3
+
1
4
  //#region src/transformers/types.d.ts
2
- /**
3
- * Transformer types for value transformation
4
- */
5
5
  type BuiltInTransformerType = 'lowercase' | 'uppercase' | 'trim' | 'slugify' | 'capitalize' | 'titlecase' | 'camelcase' | 'pascalcase' | 'snakecase' | 'kebabcase' | 'constantcase' | 'alphanumeric' | 'collapse-spaces' | 'remove-spaces' | 'urlencode' | 'dasherize' | 'underscore';
6
6
  /**
7
7
  * Available transformer types
@@ -14,6 +14,7 @@ interface BaseTransformer {
14
14
  id: string;
15
15
  name?: string;
16
16
  description?: string;
17
+ enabled?: DynamicBooleanValue;
17
18
  }
18
19
  /**
19
20
  * Regex transformer - applies regex pattern replacement
@@ -213,36 +214,42 @@ interface DefaultValueConfig<T = string | number | boolean> {
213
214
  */
214
215
  type DefaultValue<T = string | number | boolean> = T | DefaultValueConfig<T> | ConditionalDefaultConfig<T>;
215
216
  /**
216
- * Conditional enabled configuration for prompts and tasks
217
- * Allows dynamic enabling/disabling based on runtime conditions
217
+ * Conditional enabled/required configuration with new structure
218
+ * Evaluates a JavaScript expression at runtime
218
219
  */
219
- interface ConditionalEnabled {
220
- condition: ConditionExpression;
220
+ interface ConditionalConfig {
221
+ type: 'condition';
222
+ value: string;
221
223
  }
222
224
  /**
223
- * Executable enabled configuration
224
- * Determines enabled state by executing a shell command
225
+ * Executable enabled/required configuration with new structure
226
+ * Determines state by executing a shell command
225
227
  */
226
- interface ExecutableEnabled {
228
+ interface ExecutableConfig {
227
229
  type: 'exec';
228
230
  value: string;
229
231
  }
230
232
  /**
231
- * Type for enabled field that can be boolean, string condition, conditional object, or executable
233
+ * Type for enabled/required field with consistent object structure
234
+ *
235
+ * Supports:
232
236
  * - boolean: Simple true/false
233
- * - string: JavaScript expression to evaluate (shorthand for { condition: "..." })
234
- * - ConditionalEnabled: Object with condition property
235
- * - ExecutableEnabled: Object with type='exec' and value=command
237
+ * - ConditionalConfig: Object with type='condition' and value=expression
238
+ * - ExecutableConfig: Object with type='exec' and value=command
236
239
  */
237
- type EnabledValue = boolean | string | ConditionalEnabled | ExecutableEnabled;
240
+ type DynamicBooleanValue = boolean | ConditionalConfig | ExecutableConfig;
241
+ /**
242
+ * @deprecated Use DynamicBooleanValue instead. Kept for backwards compatibility.
243
+ */
244
+ type EnabledValue = DynamicBooleanValue;
238
245
  interface BasePrompt {
239
246
  id: string;
240
247
  type: PromptType;
241
248
  message: string;
242
- required?: boolean;
243
- enabled?: EnabledValue;
249
+ required?: DynamicBooleanValue;
250
+ enabled?: DynamicBooleanValue;
244
251
  override?: MergeStrategy;
245
- $templateEnabled?: EnabledValue;
252
+ $templateEnabled?: DynamicBooleanValue;
246
253
  transformers?: string[];
247
254
  }
248
255
  interface InputPrompt extends BasePrompt {
@@ -278,8 +285,10 @@ type PromptDefinition = InputPrompt | NumberPrompt | SelectPrompt | ConfirmPromp
278
285
  interface VariableDefinition {
279
286
  id: string;
280
287
  value: DefaultValue;
288
+ enabled?: DynamicBooleanValue;
289
+ required?: DynamicBooleanValue;
281
290
  override?: MergeStrategy;
282
- $templateEnabled?: EnabledValue;
291
+ $templateEnabled?: DynamicBooleanValue;
283
292
  transformers?: string[];
284
293
  }
285
294
  /**
@@ -305,15 +314,15 @@ interface TaskDefinition {
305
314
  id: string;
306
315
  name: string;
307
316
  description?: string;
308
- required?: boolean;
309
- enabled?: EnabledValue;
317
+ required?: DynamicBooleanValue;
318
+ enabled?: DynamicBooleanValue;
310
319
  type: TaskType;
311
320
  config: UpdateJsonConfig | WriteConfig | CreateConfig | RegexReplaceConfig | ReplaceInFileConfig | DeleteConfig | RenameConfig | GitInitConfig | ExecConfig | MoveConfig | CopyConfig | AppendConfig | MkdirConfig | Record<string, unknown>;
312
321
  dependencies?: string[];
313
322
  rollback?: RollbackConfig;
314
323
  override?: MergeStrategy;
315
324
  $sourceUrl?: string;
316
- $templateEnabled?: EnabledValue;
325
+ $templateEnabled?: DynamicBooleanValue;
317
326
  }
318
327
  /**
319
328
  * Configuration file structure for template tasks
@@ -321,7 +330,7 @@ interface TaskDefinition {
321
330
  interface TasksConfiguration {
322
331
  name: string;
323
332
  description?: string;
324
- enabled?: EnabledValue;
333
+ enabled?: DynamicBooleanValue;
325
334
  dependencies?: string[];
326
335
  extends?: string | string[];
327
336
  transformers?: Transformer[];
@@ -823,4 +832,4 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
823
832
  transformers?: Transformer[] | undefined;
824
833
  }): Promise<void>;
825
834
  //#endregion
826
- export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalDefaultConfig, ConditionalEnabled, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, EnabledValue, type ExecConfig, ExecutableEnabled, 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, validateTemplateConfig, validateVariables };
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 };
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-CmYva5oB.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-D5KLV8Tk.js";import{n as re,t as ie}from"./src-DbtBS6he.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,ie 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,re as runWithTasks,t as setNestedProperty,E as shouldUseHandlebars,Y as topologicalSort,d as unregisterPlugin,u as validatePluginTask,F as validatePrompts,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-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};
@@ -0,0 +1 @@
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,4 +1,4 @@
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-CmYva5oB.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(`
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
2
  `),r=t.split(`
3
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
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(`
@@ -19,8 +19,8 @@ import{t as e}from"./config-DfRbCqsT.js";import{S as t,_ as n,a as r,b as i,c as
19
19
  `),s=a.split(`
20
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
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 Y=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())}};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-Dsr6AHpq.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 nt(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 e={message:a.message};if(o!==void 0&&(e.default=String(o)),a.required!==void 0&&(e.required=a.required),n=await C(e),a.required&&(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:`*`}),a.required&&(n==null||typeof n==`string`&&n.trim()===``))throw r(`${a.message} is required`,`error`),E.required(a.id);break;case`number`:{let e={message:a.message};if(o!==void 0&&(e.default=Number(o)),a.required!==void 0&&(e.required=a.required),a.min!==void 0&&(e.min=a.min),a.max!==void 0&&(e.max=a.max),n=await te(e),a.required&&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 Y.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 rt(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 it(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 at=x(y.appendFile),ot=x(y.readFile),st=x(y.stat);async function ct(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 st(i),c=!0;let t=await ot(i,`utf-8`);t.length>0&&!t.endsWith(`
23
- `)&&(l=e.newline!==!1)}catch{}c&&l?await at(i,`\n${s}`):await at(i,s),r(`Appended content to ${e.file}`,`success`)}const lt={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t,e)}},ut=x(y.copyFile),dt=x(y.stat),ft=x(y.mkdir),pt=x(y.readdir);async function mt(e,t){await ft(t,{recursive:!0});let n=await pt(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 mt(r,i):await ut(r,i)}))}async function ht(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 dt(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await ft(v.dirname(i),{recursive:!0}),a.isDirectory()?(await mt(n,i),r(`Copied directory ${e.from} to ${e.to}`,`success`)):(await ut(n,i),r(`Copied file ${e.from} to ${e.to}`,`success`))}const gt={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await ht(e.config,t)}},_t=x(y.writeFile);async function vt(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 _t(i,o),r(`Created file: ${e.file}`,`success`)}const yt={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t,e)}};async function bt(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 xt={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await bt(e.config,t)}};async function St(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 Ct={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await St(e.config,t)}};async function wt(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 Tt={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await wt(e.config,t)}},Et=x(y.mkdir);async function Dt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping mkdir task`,`info`);return}await Et(v.join(b.cwd(),e.path),{recursive:!0}),r(`Created directory: ${e.path}`,`success`)}const Ot={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Dt(e.config,t)}},kt=x(y.rename),At=x(y.stat),jt=x(y.mkdir);async function Mt(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 At(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await jt(v.dirname(i),{recursive:!0}),await kt(n,i),r(`Moved ${e.from} to ${e.to}`,`success`)}const Nt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Mt(e.config,t)}},Pt=x(y.readFile),Ft=x(y.writeFile);async function It(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 Pt(n,`utf-8`),c=new RegExp(i,a);s=s.replace(c,u(o,t)),await Ft(n,s)}const Lt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await It(e.config,t)}},Rt=x(y.rename);async function zt(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 Rt(n,i)}const Bt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await zt(e.config,t)}},Vt=x(y.readFile),Ht=x(y.writeFile);async function Ut(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 Vt(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 Ht(n,a)}const Wt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],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 update-json task`,`info`);return}let n=v.join(b.cwd(),e.file),{updates:i}=e,o=await Gt(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 Kt(n,`${JSON.stringify(s,null,2)}\n`)}const Jt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await qt(e.config,t)}},Yt=x(y.writeFile);async function Xt(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 Yt(a,s)}const Zt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Xt(e.config,t,e)}};function Z(){q(`update-json`)||(G(Jt),G(Zt),G(yt),G(Lt),G(Wt),G(xt),G(Bt),G(Tt),G(Ct),G(Nt),G(gt),G(lt),G(Ot))}async function Qt(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 $t(e,t,n,i,a=!1){try{return r(`[${n}/${i}] Running: ${e.name}...`,`info`),await Qt(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 en(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 tn(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=nn(n);t.push(...e)}return t}function nn(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 rn(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 Y.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function an(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-Dsr6AHpq.js`),r=e(i.condition,n)?i.ifTrue:i.ifFalse;return typeof r==`object`&&r?await an(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 an(i.value,i.id,e);a!==void 0&&r.set(i.id,a)}return r}function on(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 sn(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)...`),Y.registerAll(n.transformers)),o(`Registering built-in plugins...`),Z(),o(`Validating task configurations...`);let a=tn(t);a.length>0&&(rn(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=en(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=on(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=it(_);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 rt(_,p);if(g.length>0){s(`📋 Collecting prompts (available to all tasks):`);let e=await nt(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 $t(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)):(t.required!==!1&&(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 cn(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=on(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=it(u);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1));let t=await nt(u,await rt(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=tn(i);a.length>0&&(rn(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=en(c);if(t.dryRun){r(`
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
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 $t(r,n,e+1,u.length,t.dryRun)?(d++,await J(`afterTask`,r,n)):(r.required!==!1&&(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 _,an as a,K as b,Qt as c,it as d,rt as f,Xe as g,J as h,$ as i,Ve as j,Fe as k,Z as l,X as m,cn as n,Q as o,nt as p,Ae as q,on as r,en as s,sn as t,$t as u,Qe as v,Ze as w,$e as x,Je as y,Me as z};
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};